koin.js 1.0.10 → 1.0.11

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/PlayerControls/ControlButton.tsx","../src/components/UI/SpeedMenu.tsx","../src/components/UI/VolumeControl.tsx","../src/components/UI/HardcoreTooltip.tsx","../src/locales/en.ts","../src/hooks/useKoinTranslation.tsx","../src/components/PlayerControls/PlaybackControls.tsx","../src/components/UI/AutoSaveIndicator.tsx","../src/components/PlayerControls/SaveLoadControls.tsx","../src/components/PlayerControls/ShaderDropdown.tsx","../src/components/RASidebar/RAButton.tsx","../src/components/PlayerControls/SettingsControls.tsx","../src/components/PlayerControls/MobileControlDrawer.tsx","../src/components/PlayerControls.tsx","../src/components/Overlays/ToastContainer.tsx","../src/components/Overlays/PerformanceOverlay.tsx","../src/components/Overlays/InputDisplay.tsx","../src/components/Overlays/RecordingIndicator.tsx","../src/components/Modals/ShortcutsModal.tsx","../src/components/VirtualController/utils/viewport.ts","../src/hooks/useMobile.ts","../src/components/VirtualController/layouts.ts","../src/components/VirtualController/hooks/useTouchHandlers.ts","../src/components/VirtualController/utils/buttonStyles.ts","../src/components/VirtualController/VirtualButton.tsx","../src/lib/controls/types.ts","../src/lib/controls/defaults.ts","../src/lib/controls/labels.ts","../src/lib/controls/presets.ts","../src/lib/controls/storage.ts","../src/lib/controls/retroarch.ts","../src/components/types.ts","../src/components/VirtualController/utils/keyboardEvents.ts","../src/components/VirtualController/Dpad.tsx","../src/components/VirtualController/positioning.ts","../src/components/VirtualController/useButtonPositions.ts","../src/components/VirtualController/ControlsHint.tsx","../src/components/VirtualController/VirtualController.tsx","../src/components/UI/FloatingExitButton.tsx","../src/components/UI/FloatingFullscreenButton.tsx","../src/components/Overlays/GameOverlay.tsx","../src/lib/game-player-utils.ts","../src/components/GameCanvas.tsx","../src/components/Modals/ControlMapper.tsx","../src/hooks/useGamepad.ts","../src/components/Modals/GamepadMapper.tsx","../src/components/Modals/CheatModal.tsx","../src/components/Modals/SaveSlotModal.tsx","../src/components/Modals/BiosSelectionModal.tsx","../src/components/Modals/SettingsModal.tsx","../src/components/GameModals.tsx","../src/components/RASidebar/LoginForm.tsx","../src/lib/retroachievements.ts","../src/components/RASidebar/SettingsTab.tsx","../src/components/RASidebar/AchievementsTab.tsx","../src/components/RASidebar/index.tsx","../src/hooks/useToast.ts","../src/hooks/useGameUI.ts","../src/data/systems-data.ts","../src/lib/systems.ts","../src/lib/emulator-cores.ts","../src/lib/rom-cache.ts","../src/hooks/emulator/useEmulatorCore.ts","../src/hooks/emulator/useEmulatorAudio.ts","../src/hooks/emulator/useEmulatorInput.ts","../src/hooks/useSaveScheduler.ts","../src/hooks/emulator/useEmulatorSaves.ts","../src/hooks/emulator/useEmulatorCheats.ts","../src/hooks/useNostalgist.ts","../src/hooks/useVolume.ts","../src/hooks/useControls.ts","../src/hooks/useGameSession.ts","../src/lib/save-queue.ts","../src/hooks/useAutoSave.ts","../src/hooks/useGameSaves.ts","../src/hooks/useGameCheats.ts","../src/hooks/useGameRecording.ts","../src/hooks/useGamePlayer.ts","../src/hooks/usePlayerPersistence.ts","../src/lib/telemetry.ts","../src/locales/es.ts","../src/locales/fr.ts","../src/lib/common-utils.ts","../src/components/GamePlayer.tsx","../src/components/Overlays/AchievementPopup.tsx","../src/components/UI/ShaderSelector.tsx","../src/components/UI/ShortcutsReference.tsx"],"names":["memo","ControlButton","jsxs","jsx","useState","React","Gauge","Fragment","VolumeX","Volume1","Volume2","createContext","useMemo","useContext","PlaybackControls","Play","Pause","RotateCcw","Rewind","useRef","useEffect","PauseCircle","Loader2","Check","Clock","SaveLoadControls","Save","Download","Camera","Video","Circle","ShaderDropdown","Monitor","ChevronDown","RefreshCw","Trophy","SettingsControls","HelpCircle","Maximize","Gamepad2","Joystick","Code","Settings","Power","MobileControlDrawer","PlayerControls","CheckCircle","XCircle","Info","AlertTriangle","X","PerformanceOverlay","InputDisplay","DpadButton","ActionButton","RecordingIndicator","Square","ShortcutsModal","Keyboard","useCallback","VirtualButton","console","DPAD_BUTTONS","DRAG_HOLD_DELAY","Dpad","STORAGE_KEY","Move","SYSTEM_BUTTONS","Minimize2","GameCanvas","User","Copy","Lock","Zap","HardDrive","Trash2","Cpu","AlertCircle","FileCode","Globe","ExternalLink","EyeOff","Eye","Shield","LogOut","List","isFullscreen","getCore","nostalgist","Nostalgist","deepMerge","GamePlayerInner","GamePlayer","ShaderSelector","Palette","ShortcutsReference","ChevronUp"],"mappings":"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","file":"index.js","sourcesContent":["import React, { memo } from 'react';\n\nexport interface ControlButtonProps {\n onClick?: () => void;\n onMouseDown?: () => void;\n onMouseUp?: () => void;\n onMouseLeave?: () => void;\n onTouchStart?: () => void;\n onTouchEnd?: () => void;\n icon: React.ElementType;\n label: string;\n active?: boolean;\n danger?: boolean;\n disabled?: boolean;\n className?: string;\n systemColor?: string; // Console-specific color for theming\n}\n\nexport const ControlButton = memo(function ControlButton({\n onClick,\n onMouseDown,\n onMouseUp,\n onMouseLeave,\n onTouchStart,\n onTouchEnd,\n icon: Icon,\n label,\n active = false,\n danger = false,\n disabled = false,\n className = '',\n systemColor = '#00FF41',\n iconSize = 20,\n}: ControlButtonProps & { iconSize?: number }) {\n return (\n <button\n onClick={onClick}\n onMouseDown={onMouseDown}\n onMouseUp={onMouseUp}\n onMouseLeave={onMouseLeave}\n onTouchStart={onTouchStart}\n onTouchEnd={onTouchEnd}\n disabled={disabled}\n className={`\n flex flex-col items-center justify-center gap-1.5\n px-3 py-2 rounded-lg\n transition-all duration-200\n disabled:opacity-50 disabled:cursor-not-allowed\n hover:bg-white/10 active:bg-white/20\n ${active ? 'bg-white/10 ring-1 ring-inset' : ''}\n ${danger ? 'hover:bg-red-500/20 text-red-400' : 'text-gray-400 hover:text-white'}\n ${className}\n `}\n style={active ? {\n backgroundColor: `${systemColor}20`,\n color: systemColor,\n } : {}}\n title={label}\n >\n <Icon size={iconSize} className={`transition-transform duration-200 ${active ? 'scale-110' : 'group-hover:scale-110'}`} style={active ? { color: systemColor } : undefined} />\n <span className=\"text-[9px] font-bold uppercase tracking-wider whitespace-nowrap\" style={{ color: active ? systemColor : undefined }}>\n {label}\n </span>\n </button>\n );\n});\n","import React, { useState } from 'react';\nimport { Gauge } from 'lucide-react';\nimport { SpeedMultiplier } from '../../hooks/emulator/types';\n\nconst SPEED_OPTIONS: SpeedMultiplier[] = [1, 2]; // Normal, Fast (browser limitations)\n\ninterface SpeedMenuProps {\n speed: SpeedMultiplier;\n onSpeedChange: (speed: SpeedMultiplier) => void;\n disabled?: boolean;\n}\n\nexport default function SpeedMenu({ speed, onSpeedChange, disabled = false }: SpeedMenuProps) {\n const [showMenu, setShowMenu] = useState(false);\n const buttonRef = React.useRef<HTMLButtonElement>(null);\n\n const getMenuPosition = () => {\n if (!buttonRef.current) return {};\n const rect = buttonRef.current.getBoundingClientRect();\n return {\n bottom: `${window.innerHeight - rect.top + 8}px`,\n left: `${rect.left + rect.width / 2}px`,\n transform: 'translateX(-50%)'\n };\n };\n\n return (\n <div className=\"relative\">\n <button\n ref={buttonRef}\n onClick={() => setShowMenu(!showMenu)}\n disabled={disabled}\n className={`\n group relative flex flex-col items-center gap-1 px-3 py-2 rounded-lg select-none\n transition-all duration-200 disabled:opacity-40 disabled:cursor-not-allowed\n ${speed !== 1\n ? 'text-white'\n : 'hover:bg-white/10 text-gray-400 hover:text-white'\n }\n `}\n title=\"Speed Control\"\n style={speed !== 1 ? {\n backgroundColor: `rgba(217, 119, 6, 0.2)`, // amber-500/20\n color: '#fbbf24', // amber-400\n borderColor: 'rgba(245, 158, 11, 0.4)' // amber-500/40\n } : {}}\n >\n <Gauge size={20} className={`transition-transform ${showMenu || speed !== 1 ? 'scale-110' : 'group-hover:scale-110'}`} />\n <span className=\"text-[9px] font-bold uppercase tracking-wider opacity-70\">\n {speed}x\n </span>\n </button>\n\n {showMenu && (\n <>\n <div className=\"fixed inset-0 z-[9998]\" onClick={() => setShowMenu(false)} />\n <div\n className=\"fixed z-[9999] bg-black/90 backdrop-blur-md border border-white/20 rounded-lg p-1.5 shadow-xl flex flex-col gap-1 min-w-[80px]\"\n style={getMenuPosition()}\n >\n {SPEED_OPTIONS.map((s) => (\n <button\n key={s}\n onClick={() => {\n onSpeedChange(s);\n setShowMenu(false);\n }}\n className={`\n px-3 py-2 rounded text-xs font-mono font-bold text-center transition-colors\n ${speed === s\n ? 'bg-white/20 text-white'\n : 'hover:bg-white/10 text-gray-400 hover:text-white'\n }\n `}\n >\n {s}x\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n );\n}\n","import { Volume2, VolumeX, Volume1 } from 'lucide-react';\n\ninterface VolumeControlProps {\n volume: number; // 0-100\n isMuted: boolean;\n onVolumeChange: (volume: number) => void;\n onToggleMute: () => void;\n disabled?: boolean;\n systemColor?: string;\n}\n\nexport default function VolumeControl({\n volume,\n isMuted,\n onVolumeChange,\n onToggleMute,\n disabled = false,\n systemColor = '#00FF41',\n}: VolumeControlProps) {\n // Choose icon based on volume level\n const VolumeIcon = isMuted || volume === 0\n ? VolumeX\n : volume < 50\n ? Volume1\n : Volume2;\n\n const displayVolume = isMuted ? 0 : volume;\n\n return (\n <div className=\"flex items-center gap-2\">\n {/* Mute button */}\n <button\n onClick={onToggleMute}\n disabled={disabled}\n className={`\n flex items-center justify-center w-8 h-8 transition-all duration-200\n disabled:opacity-40 disabled:cursor-not-allowed\n ${isMuted || volume === 0\n ? 'text-red-400 hover:text-red-300'\n : 'text-gray-400 hover:text-white'\n }\n `}\n title={isMuted ? 'Unmute' : 'Mute'}\n >\n <VolumeIcon size={18} />\n </button>\n\n {/* Slider - always visible */}\n <div className=\"relative flex items-center w-20\">\n {/* Track background */}\n <div className=\"absolute inset-y-0 left-0 right-0 h-1 my-auto bg-white/20\" />\n {/* Track fill */}\n <div\n className=\"absolute inset-y-0 left-0 h-1 my-auto transition-all\"\n style={{\n width: `${displayVolume}%`,\n backgroundColor: isMuted ? '#6b7280' : systemColor,\n }}\n />\n {/* Input */}\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={displayVolume}\n onChange={(e) => {\n const newVolume = parseInt(e.target.value);\n onVolumeChange(newVolume);\n // If volume was muted and user moves slider, unmute\n if (isMuted && newVolume > 0) {\n onToggleMute();\n }\n }}\n disabled={disabled}\n className=\"\n relative w-full h-4 appearance-none cursor-pointer bg-transparent z-10\n disabled:opacity-40 disabled:cursor-not-allowed\n [&::-webkit-slider-thumb]:appearance-none \n [&::-webkit-slider-thumb]:w-3 \n [&::-webkit-slider-thumb]:h-3 \n [&::-webkit-slider-thumb]:rounded-full\n [&::-webkit-slider-thumb]:bg-white\n [&::-webkit-slider-thumb]:cursor-pointer\n [&::-webkit-slider-thumb]:transition-transform\n [&::-webkit-slider-thumb]:hover:scale-125\n [&::-webkit-slider-thumb]:shadow-lg\n [&::-moz-range-thumb]:w-3 \n [&::-moz-range-thumb]:h-3 \n [&::-moz-range-thumb]:rounded-full\n [&::-moz-range-thumb]:bg-white\n [&::-moz-range-thumb]:border-0\n [&::-moz-range-thumb]:cursor-pointer\n [&::-moz-range-thumb]:shadow-lg\n \"\n />\n </div>\n </div>\n );\n}\n","import React from 'react';\n\ninterface HardcoreTooltipProps {\n show: boolean;\n message?: string;\n children?: React.ReactNode;\n}\n\n/**\n * Tooltip shown when a feature is disabled in Hardcore mode.\n * Wrap around a control button's parent div (which should have `group` class).\n */\nexport default function HardcoreTooltip({ show, message = \"Disabled in Hardcore mode\", children }: HardcoreTooltipProps) {\n if (!show) return children ? <>{children}</> : null;\n\n return (\n <>\n {children}\n <div className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-amber-500/90 text-black text-xs rounded whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none z-50\">\n {message}\n </div>\n </>\n );\n}\n","import { KoinTranslations } from './types';\n\nexport const en: KoinTranslations = {\n controls: {\n play: 'Play',\n pause: 'Pause',\n reset: 'Reset',\n rewind: 'Rewind',\n save: 'Save',\n load: 'Load',\n snap: 'Snap',\n rec: 'Rec',\n stopRec: 'Stop',\n startRecord: 'Start recording',\n stopRecord: 'Stop recording',\n mute: 'Mute',\n unmute: 'Unmute',\n help: 'Help',\n full: 'Full',\n keys: 'Keys',\n menuOpen: 'Open menu',\n menuClose: 'Close menu',\n gamepadConnected: '{{count}} controller{{plural}} connected - click to configure',\n noGamepad: 'No controller detected - press any button on your gamepad to connect',\n press: 'Press',\n startBtn: 'START',\n selectBtn: 'SEL',\n },\n common: {\n disabledInHardcore: 'Disabled in Hardcore mode',\n notSupported: 'Not supported on this console',\n playToEnableRewind: 'Play for a few seconds to enable rewind',\n },\n settings: {\n title: 'Settings',\n general: 'General',\n audio: 'Audio',\n video: 'Video',\n input: 'Input',\n advanced: 'Advanced',\n fullscreen: 'Fullscreen',\n controls: 'Controls',\n gamepad: 'Gamepad',\n cheats: 'Cheats',\n retroAchievements: 'RetroAchievements',\n shortcuts: 'Shortcuts',\n exit: 'Exit',\n language: 'Language',\n selectLanguage: 'Select Language',\n },\n overlay: {\n play: 'PLAY',\n systemFirmware: 'SYSTEM FIRMWARE',\n loading: 'Loading {{system}}',\n initializing: 'Initializing emulator',\n loadingSave: 'Loading Save',\n preparingSlot: 'Preparing slot {{num}}',\n systemError: 'System Error',\n failedInit: 'Failed to initialize emulator',\n retry: 'Retry',\n slotReady: 'Slot {{num}} ready',\n paused: 'Paused',\n },\n notifications: {\n saved: 'State saved',\n loaded: 'State loaded',\n error: 'Error',\n recordingStarted: 'Recording started',\n recordingSaved: 'Recording saved',\n downloaded: 'State downloaded',\n loadedFile: 'State loaded from file',\n savedSlot: 'Saved to slot {{num}}',\n loadedSlot: 'Loaded from slot {{num}}',\n deletedSlot: 'Deleted slot {{num}}',\n emptySlot: 'Empty slot',\n noSaveFound: 'No save found',\n failedSave: 'Failed to save',\n failedLoad: 'Failed to load',\n failedDelete: 'Failed to delete',\n failedFetch: 'Failed to load save slots',\n controllerConnected: 'Controller Connected',\n controllerDisconnected: 'Controller Lost',\n controllerReady: 'Controller ready to use',\n insertCoin: 'Press SHIFT to insert coin',\n insertCoinTitle: '🪙 Insert Coin',\n controlsSaved: 'Controls saved',\n controlsReset: 'Controls reset to defaults',\n },\n modals: {\n shortcuts: {\n title: 'Keyboard Shortcuts',\n playerShortcuts: 'Player Shortcuts',\n overlays: 'Overlays',\n recording: 'Recording',\n showHelp: 'Show Help',\n perfOverlay: 'Performance Overlay',\n inputDisplay: 'Input Display',\n toggleRec: 'Toggle Recording',\n toggleMute: 'Toggle Mute',\n pressEsc: 'Press ESC to close',\n },\n controls: {\n title: 'Controls',\n keyboard: 'Keyboard Mapping',\n description: 'Click a button and press a key to remap',\n pressKey: 'Press...',\n reset: 'Reset to Default',\n save: 'Save Controls',\n },\n gamepad: {\n title: 'Gamepad Settings',\n noGamepad: 'No gamepad detected',\n connected: '{{count}} controller{{s}} connected',\n none: 'No controllers detected',\n player: 'Player:',\n noController: 'No controller detected',\n pressAny: 'Press any button on your gamepad to connect',\n waiting: 'Waiting for input...',\n pressButton: 'Press a button on your controller for {{button}}',\n pressEsc: 'Press Escape to cancel',\n reset: 'Reset to Default',\n save: 'Save Settings',\n },\n cheats: {\n title: 'Cheats',\n addCheat: 'Add Cheat',\n available: '{{count}} cheat{{s}} available',\n emptyTitle: 'No cheats available',\n emptyDesc: 'No cheat codes found for this game',\n copy: 'Copy code',\n active: '{{count}} cheat{{s}} active',\n toggleHint: 'Click a cheat to toggle it on/off',\n },\n saveSlots: {\n title: 'Save States',\n saveTitle: 'Save Game',\n loadTitle: 'Load Game',\n emptySlot: 'Empty Slot',\n subtitleSave: 'Choose a slot to save your progress',\n subtitleLoad: 'Select a save to restore',\n loading: 'Loading saves...',\n locked: 'Slot {{num}} Locked',\n upgrade: 'Upgrade to unlock more save slots',\n autoSave: 'Auto-Save Slot',\n autoSaveDesc: 'Reserved for automatic saves',\n noData: 'No save data',\n slot: 'Slot {{num}}',\n footerSave: 'Saves are stored in the cloud and sync across devices',\n footerLoad: 'Your progress will be restored to the selected save point',\n },\n bios: {\n title: 'BIOS Selection',\n description: 'Select a BIOS file to use for this game',\n warningTitle: 'Note:',\n warning: 'Changing BIOS requires the emulator to restart. Your unsaved progress will be lost.',\n systemDefault: 'System Default',\n active: 'Active',\n defaultDesc: \"Use the emulator's built-in or default BIOS\",\n emptyTitle: 'No BIOS files found for this console.',\n emptyDesc: 'Upload BIOS files in your Dashboard Library.',\n footer: 'System Firmware Settings',\n },\n },\n retroAchievements: {\n title: 'RetroAchievements',\n login: 'Login',\n logout: 'Logout',\n username: 'Username',\n password: 'Password',\n hardcore: 'Hardcore Mode',\n achievements: 'Achievements',\n locked: 'Locked',\n unlocked: 'Unlocked',\n mastered: 'Mastered',\n identifying: 'Identifying game...',\n achievementsAvailable: '{{count}} achievements available',\n gameNotSupported: 'Connected - Game not in RA database',\n connect: 'Connect RetroAchievements',\n connected: 'RetroAchievements (connected)',\n createAccount: 'Create an account',\n privacy: 'Privacy:',\n privacyText: 'Your password is only used to authenticate with RetroAchievements. It is never stored.',\n connecting: 'Connecting...',\n connectAccount: 'Connect your account to track achievements',\n poweredBy: 'Powered by',\n connectedStatus: 'Connected',\n yourUsername: 'Your RA username',\n yourPassword: 'Your RA password',\n usernameRequired: 'Username and Password are required',\n noGame: 'No game loaded',\n loadGame: 'Load a game to see achievements',\n noAchievements: 'No achievements found',\n notSupported: 'This game may not be supported',\n ptsRemaining: '{{count}} pts remaining',\n filters: {\n all: 'All',\n locked: 'Locked',\n unlocked: 'Unlocked',\n },\n },\n overlays: {\n performance: {\n title: 'Stats',\n fps: 'FPS',\n frameTime: 'FT',\n memory: 'MEM',\n core: 'Core',\n input: 'INPUT',\n active: 'ACTIVE',\n },\n toast: {\n saved: 'Game Saved',\n loaded: 'Game Loaded',\n error: 'Error',\n },\n recording: {\n started: 'Recording Started',\n stopped: 'Recording Stopped',\n saved: 'Recording Saved',\n paused: 'PAUSED',\n recording: 'RECORDING',\n resume: 'Resume recording',\n pause: 'Pause recording',\n stop: 'Stop and save recording',\n hover: 'Hover for controls',\n },\n },\n};\n","import React, { createContext, useContext, useMemo } from 'react';\nimport { KoinTranslations, RecursivePartial } from '../locales/types';\nimport { en } from '../locales/en';\n\n// -- Context --\nconst KoinI18nContext = createContext<KoinTranslations>(en);\n\n// -- Helper: Simple Deep Merge --\nfunction deepMerge<T extends object>(target: T, source: RecursivePartial<T>): T {\n const result: any = { ...target };\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const targetValue = result[key];\n\n if (\n sourceValue &&\n typeof sourceValue === 'object' &&\n targetValue &&\n typeof targetValue === 'object' &&\n !Array.isArray(sourceValue)\n ) {\n result[key] = deepMerge(targetValue, sourceValue as any);\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue;\n }\n }\n }\n return result as T;\n}\n\n// -- Provider --\ninterface KoinI18nProviderProps {\n children: React.ReactNode;\n translations?: RecursivePartial<KoinTranslations>;\n}\n\nexport const KoinI18nProvider: React.FC<KoinI18nProviderProps> = ({ children, translations }) => {\n const value = useMemo(() => {\n if (!translations) return en;\n return deepMerge(en, translations);\n }, [translations]);\n\n return (\n <KoinI18nContext.Provider value={value}>\n {children}\n </KoinI18nContext.Provider>\n );\n};\n\n// -- Hook --\nexport function useKoinTranslation() {\n return useContext(KoinI18nContext);\n}\n","import { memo } from 'react';\nimport { Play, Pause, RotateCcw, Rewind } from 'lucide-react';\nimport { ControlButton } from './ControlButton';\nimport SpeedMenu from '../UI/SpeedMenu';\nimport VolumeControl from '../UI/VolumeControl';\nimport HardcoreTooltip from '../UI/HardcoreTooltip';\nimport { SpeedMultiplier } from '../../hooks/emulator/types';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ninterface PlaybackControlsProps {\n isPaused: boolean;\n isRunning: boolean;\n speed: SpeedMultiplier;\n isRewinding: boolean;\n rewindBufferSize: number;\n onPauseToggle: () => void;\n onRestart: () => void;\n onSpeedChange: (speed: SpeedMultiplier) => void;\n onRewindStart: () => void;\n onRewindStop: () => void;\n volume: number;\n isMuted: boolean;\n onVolumeChange?: (volume: number) => void;\n onToggleMute?: () => void;\n disabled?: boolean;\n systemColor?: string;\n hardcoreRestrictions?: {\n canUseRewind?: boolean;\n isHardcore?: boolean;\n };\n}\n\nexport const PlaybackControls = memo(function PlaybackControls({\n isPaused,\n isRunning,\n speed,\n isRewinding,\n rewindBufferSize,\n onPauseToggle,\n onRestart,\n onSpeedChange,\n onRewindStart,\n onRewindStop,\n volume,\n isMuted,\n onVolumeChange,\n onToggleMute,\n disabled = false,\n systemColor = '#00FF41',\n hardcoreRestrictions,\n}: PlaybackControlsProps) {\n const t = useKoinTranslation();\n const hasRewindHistory = rewindBufferSize > 0;\n\n return (\n <div className=\"flex flex-wrap items-center justify-center gap-4 w-full sm:w-auto sm:flex-nowrap sm:gap-3 flex-shrink-0\">\n <ControlButton\n onClick={onPauseToggle}\n icon={(!isRunning || isPaused) ? Play : Pause}\n label={(!isRunning || isPaused) ? t.controls.play : t.controls.pause}\n active={isPaused}\n disabled={disabled}\n systemColor={systemColor}\n />\n <ControlButton\n onClick={onRestart}\n icon={RotateCcw}\n label={t.controls.reset}\n disabled={disabled}\n systemColor={systemColor}\n />\n\n {/* Speed Control */}\n <SpeedMenu speed={speed} onSpeedChange={onSpeedChange} disabled={disabled} />\n\n <div className=\"relative group\">\n <ControlButton\n onMouseDown={hasRewindHistory && hardcoreRestrictions?.canUseRewind !== false ? onRewindStart : undefined}\n onMouseUp={hasRewindHistory && hardcoreRestrictions?.canUseRewind !== false ? onRewindStop : undefined}\n onMouseLeave={hasRewindHistory && hardcoreRestrictions?.canUseRewind !== false ? onRewindStop : undefined}\n onTouchStart={hasRewindHistory && hardcoreRestrictions?.canUseRewind !== false ? onRewindStart : undefined}\n onTouchEnd={hasRewindHistory && hardcoreRestrictions?.canUseRewind !== false ? onRewindStop : undefined}\n icon={Rewind}\n label={t.controls.rewind}\n active={isRewinding}\n disabled={disabled || !hasRewindHistory || hardcoreRestrictions?.canUseRewind === false}\n systemColor={systemColor}\n />\n {/* Subtle pulse animation when available */}\n {hasRewindHistory && !isRewinding && hardcoreRestrictions?.canUseRewind !== false && (\n <div className=\"absolute inset-0 rounded-lg animate-pulse pointer-events-none\" style={{ backgroundColor: `${systemColor}20` }} />\n )}\n {/* Tooltips */}\n <HardcoreTooltip\n show={hardcoreRestrictions?.canUseRewind === false}\n message={hardcoreRestrictions?.isHardcore ? t.common.disabledInHardcore : t.common.notSupported}\n />\n {hardcoreRestrictions?.canUseRewind !== false && !hasRewindHistory && (\n <div className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-black/90 text-white text-xs rounded whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none z-50\">\n {t.common.playToEnableRewind}\n </div>\n )}\n </div>\n\n {/* Volume Controls */}\n <div className=\"w-px h-8 bg-white/10 mx-1\" />\n <VolumeControl\n volume={volume}\n isMuted={isMuted}\n onVolumeChange={onVolumeChange || (() => { })}\n onToggleMute={onToggleMute || (() => { })}\n disabled={disabled}\n systemColor={systemColor}\n />\n </div>\n );\n});\n","import { useState, useEffect, useRef } from 'react';\nimport { Clock, Loader2, Check, PauseCircle } from 'lucide-react';\n\nexport type AutoSaveState = 'idle' | 'counting' | 'saving' | 'done';\n\nexport interface AutoSaveIndicatorProps {\n progress: number;\n state: AutoSaveState;\n intervalSeconds: number;\n isPaused?: boolean; // User manually paused auto-save\n onClick?: () => void; // Toggle pause\n}\n\n/**\n * Circular progress indicator for auto-save feature.\n * Shows different states: counting down, saving, done, or paused.\n */\nexport default function AutoSaveIndicator({\n progress,\n state,\n intervalSeconds,\n isPaused = false,\n onClick,\n}: AutoSaveIndicatorProps) {\n // Track previous state for smooth transitions\n\n // Track previous state for smooth transitions\n const prevStateRef = useRef<AutoSaveState>(state);\n const [displayProgress, setDisplayProgress] = useState(progress);\n const [iconOpacity, setIconOpacity] = useState(1);\n\n // Smooth progress animation when transitioning between states\n useEffect(() => {\n const prevState = prevStateRef.current;\n\n if (state === 'done' && prevState === 'saving') {\n // Animate progress to 100% smoothly when saving completes\n const startProgress = displayProgress;\n const targetProgress = 100;\n const duration = 300; // ms\n const startTime = Date.now();\n\n const animate = () => {\n const elapsed = Date.now() - startTime;\n const progressRatio = Math.min(1, elapsed / duration);\n const eased = 1 - Math.pow(1 - progressRatio, 3); // ease-out cubic\n const currentProgress = startProgress + (targetProgress - startProgress) * eased;\n\n setDisplayProgress(currentProgress);\n\n if (progressRatio < 1) {\n requestAnimationFrame(animate);\n } else {\n setDisplayProgress(targetProgress);\n }\n };\n\n requestAnimationFrame(animate);\n } else if (state === 'counting' && prevState === 'done') {\n // Smoothly reset progress from 100% to 0% when restarting\n const startProgress = displayProgress;\n const targetProgress = 0;\n const duration = 200; // ms - faster reset\n const startTime = Date.now();\n\n const animate = () => {\n const elapsed = Date.now() - startTime;\n const progressRatio = Math.min(1, elapsed / duration);\n const eased = progressRatio; // linear for reset\n const currentProgress = startProgress + (targetProgress - startProgress) * eased;\n\n setDisplayProgress(currentProgress);\n\n if (progressRatio < 1) {\n requestAnimationFrame(animate);\n } else {\n setDisplayProgress(targetProgress);\n }\n };\n\n requestAnimationFrame(animate);\n } else if (state !== 'done') {\n // For other state changes, update progress immediately but smoothly\n setDisplayProgress(progress);\n }\n\n prevStateRef.current = state;\n }, [state, progress]); // Removed displayProgress from deps to avoid loops\n\n // Smooth icon transitions with fade\n useEffect(() => {\n if (state !== prevStateRef.current) {\n // Fade out\n setIconOpacity(0);\n // Fade in after brief delay\n const timer = setTimeout(() => {\n setIconOpacity(1);\n }, 100);\n return () => clearTimeout(timer);\n }\n }, [state]);\n\n // Calculate remaining seconds\n const remainingSeconds = Math.ceil((100 - progress) * (intervalSeconds / 100));\n\n // Determine colors based on state\n const getStateColors = () => {\n if (isPaused) {\n return {\n stroke: 'text-gray-500',\n icon: 'text-gray-500',\n label: 'text-gray-500',\n };\n }\n switch (state) {\n case 'saving':\n return {\n stroke: 'text-amber-400',\n icon: 'text-amber-400',\n label: 'text-amber-400/70',\n };\n case 'done':\n return {\n stroke: 'text-emerald-400',\n icon: 'text-emerald-400',\n label: 'text-emerald-400/70',\n };\n default:\n return {\n stroke: 'text-emerald-400/70',\n icon: 'text-emerald-400/70',\n label: 'text-emerald-400/50',\n };\n }\n };\n\n const colors = getStateColors();\n\n // Generate tooltip text\n const getTooltip = () => {\n if (isPaused) return 'Auto-save paused (click to resume)';\n switch (state) {\n case 'saving':\n return 'Saving...';\n case 'done':\n return 'Saved!';\n default:\n return `Auto - save in ${remainingSeconds} s(click to pause)`;\n }\n };\n\n // Get the appropriate icon based on state\n const renderIcon = () => {\n if (isPaused) {\n return <PauseCircle size={14} className={`${colors.icon} transition-colors duration-300`} />;\n }\n if (state === 'saving') {\n return <Loader2 size={14} className={`${colors.icon} animate-spin transition-colors duration-300`} />;\n }\n if (state === 'done') {\n return <Check size={14} className={`${colors.icon} transition-colors duration-300`} />;\n }\n return <Clock size={12} className={`${colors.icon} transition-colors duration-300`} />;\n };\n\n return (\n <button\n onClick={onClick}\n className=\"relative flex flex-col items-center justify-center gap-0.5 min-w-[3rem] py-1 rounded hover:bg-white/5 transition-colors cursor-pointer group\"\n title={getTooltip()}\n type=\"button\"\n >\n <div className=\"relative w-8 h-8 flex items-center justify-center mb-0.5\">\n {/* Progress Ring */}\n {!isPaused && state !== 'saving' && state !== 'done' && (\n <svg className=\"absolute inset-0 w-full h-full -rotate-90 pointer-events-none\">\n <circle\n cx=\"16\"\n cy=\"16\"\n r=\"12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className=\"text-white/10\"\n />\n <circle\n cx=\"16\"\n cy=\"16\"\n r=\"12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray={2 * Math.PI * 12}\n strokeDashoffset={2 * Math.PI * 12 * (1 - progress / 100)}\n className=\"text-emerald-400/50 transition-all duration-1000 linear\"\n />\n </svg>\n )}\n\n {/* Icon Container */}\n <div\n className=\"flex items-center justify-center transition-opacity duration-200\"\n style={{ opacity: iconOpacity }}\n >\n {renderIcon()}\n </div>\n </div>\n\n <span className={`text-[9px] font-bold uppercase tracking-wider ${colors.label} group-hover:text-gray-300 transition-colors`}>\n {isPaused ? 'Paused' : state === 'saving' ? 'Saving' : state === 'done' ? 'Saved' : 'Auto'}\n </span>\n </button>\n );\n}\n","import { memo } from 'react';\nimport { Save, Download, Camera, Video, Circle } from 'lucide-react';\nimport { ControlButton } from './ControlButton';\nimport AutoSaveIndicator, { AutoSaveState } from '../UI/AutoSaveIndicator';\nimport HardcoreTooltip from '../UI/HardcoreTooltip';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ninterface SaveLoadControlsProps {\n onSave: () => void;\n onLoad: () => void;\n onScreenshot: () => void;\n onRecordToggle?: () => void;\n isRecording?: boolean;\n disabled?: boolean;\n loadDisabled?: boolean;\n saveDisabled?: boolean;\n systemColor?: string;\n hardcoreRestrictions?: {\n canUseSaveStates?: boolean;\n isHardcore?: boolean;\n };\n autoSaveEnabled?: boolean;\n autoSaveProgress?: number;\n autoSaveState?: string;\n autoSavePaused?: boolean;\n onAutoSaveToggle?: () => void;\n}\n\nexport const SaveLoadControls = memo(function SaveLoadControls({\n onSave,\n onLoad,\n onScreenshot,\n onRecordToggle,\n isRecording = false,\n disabled = false,\n loadDisabled = false,\n saveDisabled = false,\n systemColor = '#00FF41',\n hardcoreRestrictions,\n autoSaveEnabled = false,\n autoSaveProgress = 0,\n autoSaveState = 'idle',\n autoSavePaused = false,\n onAutoSaveToggle,\n}: SaveLoadControlsProps) {\n const t = useKoinTranslation();\n\n return (\n <div className=\"flex flex-wrap items-center justify-center gap-4 w-full sm:w-auto sm:flex-nowrap sm:gap-3 px-3 sm:px-4 sm:border-x sm:border-white/10 flex-shrink-0\">\n {/* Auto-save indicator - clickable to toggle, always visible when enabled */}\n {autoSaveEnabled && (\n <div className=\"flex-shrink-0\">\n <AutoSaveIndicator\n progress={autoSaveProgress}\n state={autoSavePaused ? 'idle' : autoSaveState as AutoSaveState}\n intervalSeconds={20}\n isPaused={autoSavePaused}\n onClick={onAutoSaveToggle}\n />\n </div>\n )}\n <div className=\"relative group flex-shrink-0\">\n <ControlButton\n onClick={hardcoreRestrictions?.canUseSaveStates === false ? undefined : onSave}\n icon={Save}\n label={t.controls.save}\n disabled={disabled || saveDisabled || hardcoreRestrictions?.canUseSaveStates === false}\n systemColor={systemColor}\n />\n <HardcoreTooltip\n show={hardcoreRestrictions?.canUseSaveStates === false}\n message={hardcoreRestrictions?.isHardcore ? t.common.disabledInHardcore : t.common.notSupported}\n />\n </div>\n <div className=\"relative group flex-shrink-0\">\n <ControlButton\n onClick={hardcoreRestrictions?.canUseSaveStates === false ? undefined : onLoad}\n icon={Download}\n label={t.controls.load}\n disabled={disabled || loadDisabled || hardcoreRestrictions?.canUseSaveStates === false}\n systemColor={systemColor}\n />\n <HardcoreTooltip\n show={hardcoreRestrictions?.canUseSaveStates === false}\n message={hardcoreRestrictions?.isHardcore ? t.common.disabledInHardcore : t.common.notSupported}\n />\n </div>\n <div className=\"flex-shrink-0\">\n <ControlButton\n onClick={onScreenshot}\n icon={Camera}\n label={t.controls.snap}\n disabled={disabled || saveDisabled}\n systemColor={systemColor}\n />\n </div>\n\n {/* Recording button */}\n {onRecordToggle && (\n <div className=\"flex-shrink-0\">\n <button\n onClick={onRecordToggle}\n disabled={disabled}\n className={`flex flex-col items-center gap-1 px-2 sm:px-3 py-2 rounded-lg transition-all duration-200 hover:bg-white/10 ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}\n title={isRecording ? t.controls.stopRecord : t.controls.startRecord}\n >\n <div className=\"relative\">\n {isRecording ? (\n <>\n <Video size={20} className=\"text-red-500\" />\n <Circle size={8} fill=\"#FF3333\" className=\"absolute -top-0.5 -right-0.5 animate-pulse text-red-500\" />\n </>\n ) : (\n <Video size={20} style={{ color: systemColor }} />\n )}\n </div>\n <span\n className=\"text-[10px] font-bold uppercase tracking-wider\"\n style={{ color: isRecording ? '#FF3333' : undefined }}\n >\n {t.controls.rec}\n </span>\n </button>\n </div>\n )}\n </div>\n );\n});\n","'use client';\n\nimport { memo, useState, useRef, useEffect } from 'react';\nimport { Monitor, ChevronDown, RefreshCw } from 'lucide-react';\nimport { ShaderPresetId } from '../UI/ShaderSelector';\n\ninterface ShaderDropdownProps {\n currentShader?: ShaderPresetId;\n onShaderChange?: (shader: ShaderPresetId, requiresRestart: boolean) => void;\n isRunning?: boolean; // If true, shader change requires restart\n systemColor?: string;\n disabled?: boolean;\n}\n\n// Quick shader presets for the dropdown (subset of all presets) - must match ShaderPresetId\nconst QUICK_PRESETS: { id: ShaderPresetId; label: string }[] = [\n { id: '', label: 'None' },\n { id: 'crt/crt-lottes', label: 'CRT Lottes' },\n { id: 'crt/crt-easymode', label: 'CRT Easy' },\n { id: 'crt/crt-geom', label: 'CRT Geom' },\n { id: 'handheld/lcd-grid-v2', label: 'LCD Grid' },\n];\n\n/**\n * Shader Dropdown\n * ---------------\n * Compact dropdown for quick shader selection in the controls bar.\n * When isRunning=true, shows restart warning for mid-game changes.\n */\nconst ShaderDropdown = memo(function ShaderDropdown({\n currentShader = '',\n onShaderChange,\n isRunning = false,\n systemColor = '#00FF41',\n disabled = false,\n}: ShaderDropdownProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [pendingShader, setPendingShader] = useState<ShaderPresetId | null>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n setPendingShader(null);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const currentLabel = QUICK_PRESETS.find(p => p.id === currentShader)?.label || 'Custom';\n\n if (!onShaderChange) return null;\n\n const handleSelect = (id: ShaderPresetId) => {\n if (id === currentShader) {\n setIsOpen(false);\n return;\n }\n\n if (isRunning) {\n // Show restart confirmation\n setPendingShader(id);\n } else {\n // Apply immediately if not running\n onShaderChange(id, false);\n setIsOpen(false);\n }\n };\n\n const confirmRestart = () => {\n if (pendingShader !== null) {\n onShaderChange(pendingShader, true);\n setPendingShader(null);\n setIsOpen(false);\n }\n };\n\n const cancelRestart = () => {\n setPendingShader(null);\n };\n\n return (\n <div ref={dropdownRef} className=\"relative hidden sm:block\">\n <button\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n className={`flex items-center gap-1.5 px-2 py-1.5 rounded-lg transition-all duration-200 hover:bg-white/10 ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}\n title=\"Video Shader\"\n >\n <Monitor size={16} style={{ color: currentShader ? systemColor : 'white' }} />\n <span className=\"text-[10px] font-bold uppercase text-white/80\">{currentLabel}</span>\n <ChevronDown size={12} className={`text-white/60 transition-transform ${isOpen ? 'rotate-180' : ''}`} />\n </button>\n\n {/* Dropdown */}\n {isOpen && (\n <div\n className=\"absolute bottom-full left-0 mb-2 py-1 rounded-lg shadow-xl z-50 min-w-[160px]\"\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.95)',\n border: `1px solid ${systemColor}40`,\n }}\n >\n {/* Restart confirmation */}\n {pendingShader !== null ? (\n <div className=\"p-3 space-y-2\">\n <div className=\"flex items-center gap-2 text-xs text-orange-400\">\n <RefreshCw size={14} />\n <span className=\"font-bold\">Restart Required</span>\n </div>\n <p className=\"text-[10px] text-white/60\">\n Shader change requires game restart. Your progress since last save will be lost.\n </p>\n <div className=\"flex gap-2 pt-1\">\n <button\n onClick={confirmRestart}\n className=\"flex-1 px-2 py-1 text-xs font-bold rounded bg-orange-500/20 text-orange-400 hover:bg-orange-500/30\"\n >\n Restart\n </button>\n <button\n onClick={cancelRestart}\n className=\"flex-1 px-2 py-1 text-xs font-bold rounded bg-white/10 text-white/60 hover:bg-white/20\"\n >\n Cancel\n </button>\n </div>\n </div>\n ) : (\n // Shader list\n QUICK_PRESETS.map(({ id, label }) => (\n <button\n key={id}\n onClick={() => handleSelect(id)}\n className={`w-full px-3 py-1.5 text-left text-xs font-medium transition-colors ${currentShader === id\n ? 'text-white'\n : 'text-white/70 hover:bg-white/10'\n }`}\n style={currentShader === id ? { backgroundColor: `${systemColor}30`, color: systemColor } : undefined}\n >\n {label}\n </button>\n ))\n )}\n </div>\n )}\n </div>\n );\n});\n\nexport default ShaderDropdown;\n","'use client';\n\nimport { Loader2, Trophy } from 'lucide-react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ninterface RAButtonProps {\n onClick: () => void;\n disabled?: boolean;\n isConnected: boolean;\n isGameFound: boolean;\n isIdentifying: boolean;\n achievementCount: number;\n className?: string;\n}\n\n/**\n * RetroAchievements button with status indicators and tooltips.\n */\nexport default function RAButton({\n onClick,\n disabled = false,\n isConnected,\n isGameFound,\n isIdentifying,\n achievementCount,\n className = '',\n}: RAButtonProps) {\n const t = useKoinTranslation();\n\n const title = isGameFound\n ? `${t.retroAchievements.title} (${achievementCount} achievements)`\n : isConnected\n ? t.retroAchievements.connected\n : t.retroAchievements.title;\n\n const tooltip = isIdentifying\n ? t.retroAchievements.identifying\n : isGameFound\n ? t.retroAchievements.achievementsAvailable.replace('{{count}}', achievementCount.toString())\n : isConnected\n ? t.retroAchievements.gameNotSupported\n : t.retroAchievements.connect;\n\n return (\n <div className={`relative group ${className}`}>\n <button\n onClick={onClick}\n disabled={disabled}\n className={`\n group relative flex flex-col items-center gap-1 px-3 py-2 rounded-lg\n transition-all duration-200 disabled:opacity-40 disabled:cursor-not-allowed\n select-none\n ${isGameFound\n ? 'bg-gradient-to-b from-yellow-500/30 to-orange-500/20 text-yellow-400 ring-1 ring-yellow-500/50 shadow-[0_0_12px_rgba(234,179,8,0.3)]'\n : isConnected\n ? 'bg-yellow-500/10 text-yellow-400/70 ring-1 ring-yellow-500/30'\n : 'hover:bg-white/10 text-gray-400 hover:text-white'\n }\n `}\n title={title}\n >\n {isIdentifying ? (\n <Loader2 size={20} className=\"animate-spin text-yellow-400\" />\n ) : (\n <Trophy\n size={20}\n className={`\n transition-all group-hover:scale-110 \n ${isGameFound ? 'drop-shadow-[0_0_8px_rgba(234,179,8,0.7)] text-yellow-400' : ''}\n ${isConnected && !isGameFound ? 'opacity-70' : ''}\n `}\n />\n )}\n <span className=\"text-[9px] font-bold uppercase tracking-wider opacity-70\">\n {isIdentifying ? '...' : isGameFound ? achievementCount : 'RA'}\n </span>\n </button>\n\n {/* Status indicator dot */}\n {isConnected && (\n <div className={`\n absolute -top-1 -right-1 w-3 h-3 rounded-full border-2 border-black\n ${isGameFound\n ? 'bg-green-500 shadow-[0_0_8px_rgba(34,197,94,0.8)]'\n : 'bg-yellow-500 shadow-[0_0_6px_rgba(234,179,8,0.6)]'\n }\n `}>\n {isGameFound && (\n <div className=\"absolute inset-0 bg-green-400 rounded-full animate-ping opacity-50\" />\n )}\n </div>\n )}\n\n {/* Tooltip */}\n <div className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-gray-900/95 text-white text-xs rounded whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none z-50 border border-white/10\">\n {tooltip}\n </div>\n </div>\n );\n}\n\n","import { memo } from 'react';\nimport { Maximize, Gamepad2, Joystick, Code, Power, HelpCircle, Settings } from 'lucide-react';\nimport { ControlButton } from './ControlButton';\nimport ShaderDropdown from './ShaderDropdown';\nimport RAButton from '../RASidebar/RAButton';\nimport HardcoreTooltip from '../UI/HardcoreTooltip';\nimport { ShaderPresetId } from '../UI/ShaderSelector';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\nimport { RAHardcodeRestrictions } from '../types';\n\ninterface SettingsControlsProps {\n onFullscreen: () => void;\n onControls: () => void;\n onGamepadSettings?: () => void;\n onSettings?: () => void;\n onCheats: () => void;\n onRetroAchievements: () => void;\n onShowShortcuts?: () => void;\n onExit: () => void;\n // Shader controls\n currentShader?: ShaderPresetId;\n onShaderChange?: (shader: ShaderPresetId, requiresRestart: boolean) => void;\n isRunning?: boolean; // Passed to ShaderDropdown for restart warning\n disabled?: boolean;\n systemColor?: string;\n gamepadCount?: number;\n hardcoreRestrictions?: RAHardcodeRestrictions;\n raConnected?: boolean;\n raGameFound?: boolean;\n raAchievementCount?: number;\n raIsIdentifying?: boolean;\n}\n\nexport const SettingsControls = memo(function SettingsControls({\n onFullscreen,\n onControls,\n onGamepadSettings,\n onSettings,\n onCheats,\n onRetroAchievements,\n onShowShortcuts,\n onExit,\n currentShader,\n onShaderChange,\n isRunning = false,\n disabled = false,\n systemColor = '#00FF41',\n gamepadCount = 0,\n hardcoreRestrictions,\n raConnected = false,\n raGameFound = false,\n raAchievementCount = 0,\n raIsIdentifying = false,\n}: SettingsControlsProps) {\n const t = useKoinTranslation();\n\n // Build gamepad indicator text - simple replacement\n const gamepadIndicatorText = gamepadCount > 0\n ? Array.from({ length: gamepadCount }, (_, i) => `P${i + 1}`).join(' ')\n : '';\n\n const gamepadConnectedTitle = t.controls.gamepadConnected\n .replace('{{count}}', gamepadCount.toString())\n .replace('{{plural}}', gamepadCount > 1 ? 's' : '');\n\n return (\n <div className=\"flex flex-wrap items-center justify-center gap-4 w-full sm:w-auto sm:flex-nowrap sm:gap-3 flex-shrink-0\">\n {/* Shader Selector */}\n <ShaderDropdown\n currentShader={currentShader}\n onShaderChange={onShaderChange}\n isRunning={isRunning}\n systemColor={systemColor}\n disabled={disabled}\n />\n\n {/* Help / Shortcuts button */}\n {onShowShortcuts && (\n <ControlButton onClick={onShowShortcuts} icon={HelpCircle} label={t.controls.help} disabled={disabled} className=\"hidden sm:flex\" systemColor={systemColor} />\n )}\n\n {/* Fullscreen button - hidden on mobile (we have floating button) */}\n <ControlButton onClick={onFullscreen} icon={Maximize} label={t.controls.full} disabled={disabled} className=\"hidden sm:flex\" systemColor={systemColor} />\n {/* Hide some buttons on mobile to save space */}\n <ControlButton onClick={onControls} icon={Gamepad2} label={t.controls.keys} disabled={disabled} className=\"hidden sm:flex\" systemColor={systemColor} />\n\n {/* Gamepad indicator - shows connected controllers OR hint to press button */}\n {gamepadCount > 0 ? (\n <button\n onClick={onGamepadSettings}\n className=\"relative group flex flex-col items-center gap-1 px-2 sm:px-3 py-2 rounded-lg transition-all duration-200 hover:bg-white/10 flex-shrink-0 hidden sm:flex\"\n title={gamepadConnectedTitle}\n >\n <div className=\"relative\">\n <Joystick size={20} style={{ color: systemColor }} className=\"transition-transform group-hover:scale-110\" />\n {/* Connection indicator dot */}\n <div\n className=\"absolute -top-0.5 -right-0.5 w-2 h-2 rounded-full animate-pulse\"\n style={{ backgroundColor: systemColor }}\n />\n </div>\n <span className=\"text-[9px] font-bold uppercase tracking-wider opacity-70\" style={{ color: systemColor }}>\n {gamepadIndicatorText}\n </span>\n </button>\n ) : (\n /* Neo-brutalist hint for users with no detected gamepad */\n <button\n onClick={onGamepadSettings}\n className=\"relative group flex-col items-center gap-1 px-3 py-2 transition-all duration-200 flex-shrink-0\"\n title={t.controls.noGamepad}\n style={{\n border: '2px dashed #6b7280',\n backgroundColor: 'transparent',\n }}\n >\n <div className=\"relative flex items-center gap-2\">\n <Gamepad2 size={18} className=\"text-gray-400 transition-transform group-hover:scale-110 group-hover:text-white\" />\n <span className=\"text-[10px] font-bold uppercase tracking-wider text-gray-400 group-hover:text-white whitespace-nowrap\">\n {t.controls.press}\n </span>\n {/* Circle representing a button */}\n <div className=\"w-5 h-5 rounded-full border-2 border-gray-400 group-hover:border-white flex items-center justify-center animate-pulse\">\n <div className=\"w-2 h-2 rounded-full bg-gray-400 group-hover:bg-white\" />\n </div>\n </div>\n </button>\n )}\n\n <div className=\"relative group hidden sm:block\">\n <ControlButton\n onClick={hardcoreRestrictions?.canUseCheats === false ? undefined : onCheats}\n icon={Code}\n label={t.settings.cheats}\n disabled={disabled || hardcoreRestrictions?.canUseCheats === false}\n systemColor={systemColor}\n />\n <HardcoreTooltip\n show={hardcoreRestrictions?.canUseCheats === false}\n message={hardcoreRestrictions?.isHardcore ? t.common.disabledInHardcore : t.common.notSupported}\n />\n </div>\n <RAButton\n onClick={onRetroAchievements}\n disabled={disabled}\n isConnected={raConnected}\n isGameFound={raGameFound}\n isIdentifying={raIsIdentifying}\n achievementCount={raAchievementCount}\n className=\"hidden sm:flex\"\n />\n {onSettings && (\n <ControlButton\n onClick={onSettings}\n icon={Settings}\n label={t.settings.title}\n disabled={disabled}\n systemColor={systemColor}\n className=\"hidden sm:flex\"\n />\n )}\n <div className=\"w-px h-8 bg-white/10 mx-2 hidden sm:block\" />\n <ControlButton onClick={onExit} icon={Power} label={t.settings.exit} danger disabled={disabled} systemColor={systemColor} />\n </div>\n );\n});\n","'use client';\n\nimport { memo, useState, useEffect, ReactNode } from 'react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ninterface MobileControlDrawerProps {\n children: ReactNode;\n systemColor?: string;\n}\n\n/**\n * Mobile Control Drawer\n * FAB button at bottom-center that opens a slide-up drawer with controls\n * Only visible on mobile (hidden on sm+ screens)\n */\nconst MobileControlDrawer = memo(function MobileControlDrawer({\n children,\n systemColor = '#00FF41',\n}: MobileControlDrawerProps) {\n const t = useKoinTranslation();\n const [isExpanded, setIsExpanded] = useState(false);\n\n // Close drawer when clicking outside\n useEffect(() => {\n if (isExpanded) {\n const handleInteract = (e: MouseEvent | TouchEvent) => {\n const target = e.target as HTMLElement;\n const isInside = target.closest('.player-controls-drawer') || target.closest('.player-controls-fab');\n if (!isInside) {\n setIsExpanded(false);\n }\n };\n window.addEventListener('mousedown', handleInteract);\n window.addEventListener('touchstart', handleInteract);\n return () => {\n window.removeEventListener('mousedown', handleInteract);\n window.removeEventListener('touchstart', handleInteract);\n };\n }\n }, [isExpanded]);\n\n return (\n <>\n {/* FAB (Floating Action Button) */}\n <div className=\"fixed bottom-6 left-1/2 -translate-x-1/2 z-[60] sm:hidden player-controls-fab\">\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n className={`\n w-14 h-14 rounded-full shadow-lg\n flex items-center justify-center\n transition-all duration-300 ease-out\n active:scale-90\n ${isExpanded\n ? 'bg-white text-black rotate-45'\n : 'bg-black/70 backdrop-blur-md text-white border border-white/20'\n }\n `}\n style={{\n boxShadow: isExpanded\n ? `0 0 20px ${systemColor}60, 0 4px 20px rgba(0,0,0,0.5)`\n : '0 4px 20px rgba(0,0,0,0.5)',\n borderColor: isExpanded ? systemColor : undefined\n }}\n aria-label={isExpanded ? t.controls.menuClose : t.controls.menuOpen}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n </button>\n </div>\n\n {/* Slide-up Drawer */}\n <div\n className={`\n fixed inset-x-0 bottom-0 z-50 sm:hidden\n transform transition-all duration-300 ease-out\n player-controls-drawer\n ${isExpanded\n ? 'translate-y-0 opacity-100'\n : 'translate-y-full opacity-0 pointer-events-none'\n }\n `}\n >\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-gradient-to-t from-black/95 to-black/70 backdrop-blur-xl\"\n style={{ paddingBottom: 'env(safe-area-inset-bottom, 20px)' }}\n />\n\n {/* Content */}\n <div\n className=\"relative flex flex-col items-center px-4 py-6 pb-20\"\n style={{ paddingBottom: 'calc(env(safe-area-inset-bottom, 20px) + 80px)' }}\n >\n {children}\n </div>\n\n {/* Drag handle */}\n <div className=\"absolute top-2 left-1/2 -translate-x-1/2 w-10 h-1 bg-white/30 rounded-full\" />\n </div>\n </>\n );\n});\n\nexport default MobileControlDrawer;\n","'use client';\n\nimport { memo } from 'react';\nimport { PlayerControlsProps } from './types';\nimport { PlaybackControls } from './PlayerControls/PlaybackControls';\nimport { SaveLoadControls } from './PlayerControls/SaveLoadControls';\nimport { SettingsControls } from './PlayerControls/SettingsControls';\nimport MobileControlDrawer from './PlayerControls/MobileControlDrawer';\n\nconst PlayerControls = memo(function PlayerControls({\n isPaused,\n isRunning,\n speed,\n isRewinding,\n rewindBufferSize,\n onPauseToggle,\n onRestart,\n onSave,\n onLoad,\n onSpeedChange,\n onRewindStart,\n onRewindStop,\n onScreenshot,\n onFullscreen,\n onControls,\n onCheats,\n onRetroAchievements,\n onShowShortcuts,\n onExit,\n disabled = false,\n loadDisabled = false,\n saveDisabled = false,\n hardcoreRestrictions,\n raConnected = false,\n raGameFound = false,\n raAchievementCount = 0,\n raIsIdentifying = false,\n autoSaveEnabled = false,\n autoSaveProgress = 0,\n autoSaveState = 'idle',\n autoSavePaused = false,\n onAutoSaveToggle,\n systemColor = '#00FF41',\n gamepadCount = 0,\n onGamepadSettings,\n onSettings,\n volume = 100,\n isMuted = false,\n onVolumeChange,\n onToggleMute,\n onRecordToggle,\n isRecording = false,\n currentShader,\n onShaderChange,\n}: PlayerControlsProps & { loadDisabled?: boolean; saveDisabled?: boolean }) {\n\n // Shared controls content\n const controlsContent = (\n <>\n <PlaybackControls\n isPaused={isPaused}\n isRunning={isRunning}\n speed={speed}\n isRewinding={isRewinding}\n rewindBufferSize={rewindBufferSize}\n onPauseToggle={onPauseToggle}\n onRestart={onRestart}\n onSpeedChange={onSpeedChange}\n onRewindStart={onRewindStart}\n onRewindStop={onRewindStop}\n volume={volume}\n isMuted={isMuted}\n onVolumeChange={onVolumeChange}\n onToggleMute={onToggleMute}\n disabled={disabled}\n systemColor={systemColor}\n hardcoreRestrictions={hardcoreRestrictions}\n />\n\n <div className=\"w-full h-px bg-white/10 sm:hidden my-4\" />\n\n <SaveLoadControls\n onSave={onSave}\n onLoad={onLoad}\n onScreenshot={onScreenshot}\n onRecordToggle={onRecordToggle}\n isRecording={isRecording}\n disabled={disabled}\n loadDisabled={loadDisabled}\n saveDisabled={saveDisabled}\n systemColor={systemColor}\n hardcoreRestrictions={hardcoreRestrictions}\n autoSaveEnabled={autoSaveEnabled}\n autoSaveProgress={autoSaveProgress}\n autoSaveState={autoSaveState}\n autoSavePaused={autoSavePaused}\n onAutoSaveToggle={onAutoSaveToggle}\n />\n\n <div className=\"w-full h-px bg-white/10 sm:hidden my-4\" />\n\n <SettingsControls\n onFullscreen={onFullscreen}\n onControls={onControls}\n onGamepadSettings={onGamepadSettings}\n onSettings={onSettings}\n onCheats={onCheats}\n onRetroAchievements={onRetroAchievements}\n onShowShortcuts={onShowShortcuts}\n onExit={onExit}\n currentShader={currentShader}\n onShaderChange={onShaderChange}\n isRunning={isRunning}\n disabled={disabled}\n systemColor={systemColor}\n gamepadCount={gamepadCount}\n hardcoreRestrictions={hardcoreRestrictions}\n raConnected={raConnected}\n raGameFound={raGameFound}\n raAchievementCount={raAchievementCount}\n raIsIdentifying={raIsIdentifying}\n />\n </>\n );\n\n return (\n <>\n {/* Mobile: FAB + Drawer */}\n <MobileControlDrawer systemColor={systemColor}>\n {controlsContent}\n </MobileControlDrawer>\n\n {/* Desktop: Static bar with safe centering and auto-scroll */}\n <div className=\"hidden sm:flex w-full bg-black/90 backdrop-blur-md border-t border-white/10 shrink-0 z-50 overflow-x-auto no-scrollbar\">\n <div className=\"flex items-center min-w-max mx-auto gap-4 px-8 py-4\">\n {controlsContent}\n </div>\n </div>\n </>\n );\n});\n\nexport default PlayerControls;\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport {\n CheckCircle,\n XCircle,\n Info,\n AlertTriangle,\n Gamepad2,\n X\n} from 'lucide-react';\nimport { Toast, ToastType } from '../../hooks/useToast';\n\ninterface ToastItemProps {\n toast: Toast;\n onDismiss?: (id: string) => void;\n}\n\n// Neo-brutalist color schemes - flat colors, no gradients\nconst TOAST_CONFIGS: Record<ToastType, {\n icon: any; // LucideIcon type causes issues with React.ComponentType\n bgColor: string;\n borderColor: string;\n accentColor: string;\n iconClass: string;\n shadowColor: string;\n}> = {\n success: {\n icon: CheckCircle,\n bgColor: '#0a0a0a',\n borderColor: '#eab308', // Golden yellow like RA badge\n accentColor: '#eab308',\n iconClass: 'text-yellow-500',\n shadowColor: '#ca8a04',\n },\n error: {\n icon: XCircle,\n bgColor: '#0a0a0a',\n borderColor: '#ef4444',\n accentColor: '#ef4444',\n iconClass: 'text-red-400',\n shadowColor: '#dc2626',\n },\n info: {\n icon: Info,\n bgColor: '#0a0a0a',\n borderColor: '#3b82f6',\n accentColor: '#3b82f6',\n iconClass: 'text-blue-400',\n shadowColor: '#2563eb',\n },\n warning: {\n icon: AlertTriangle,\n bgColor: '#0a0a0a',\n borderColor: '#f59e0b',\n accentColor: '#f59e0b',\n iconClass: 'text-amber-400',\n shadowColor: '#d97706',\n },\n gamepad: {\n icon: Gamepad2,\n bgColor: '#0a0a0a',\n borderColor: '#a855f7',\n accentColor: '#a855f7',\n iconClass: 'text-purple-400',\n shadowColor: '#9333ea',\n },\n};\n\nfunction ToastItem({ toast, onDismiss }: ToastItemProps) {\n const [isVisible, setIsVisible] = useState(false);\n const [isExiting, setIsExiting] = useState(false);\n\n const config = TOAST_CONFIGS[toast.type];\n const IconComponent = config.icon;\n\n useEffect(() => {\n requestAnimationFrame(() => {\n setIsVisible(true);\n });\n }, []);\n\n const handleDismiss = () => {\n setIsExiting(true);\n setTimeout(() => {\n onDismiss?.(toast.id);\n }, 200);\n };\n\n return (\n <div\n className={`\n relative transition-all duration-300 ease-out\n ${isVisible && !isExiting\n ? 'translate-x-0 opacity-100'\n : 'translate-x-full opacity-0'\n }\n `}\n >\n {/* Neo-brutalist card - flat color, hard shadow, bold border */}\n <div\n className=\"relative w-[320px]\"\n style={{\n backgroundColor: config.bgColor,\n border: `2px solid ${config.borderColor}`,\n boxShadow: `3px 3px 0px ${config.shadowColor}`,\n }}\n >\n <div className=\"px-3 py-2.5 flex items-center gap-2.5\">\n {/* Icon - compact */}\n <div\n className=\"flex-shrink-0 w-8 h-8 flex items-center justify-center\"\n style={{\n backgroundColor: `${config.accentColor}20`,\n border: `2px solid ${config.borderColor}`,\n }}\n >\n {toast.icon ? (\n <span className=\"text-base\">{toast.icon}</span>\n ) : (\n <IconComponent size={16} className={config.iconClass} />\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n {toast.title && (\n <p\n className=\"text-[10px] font-black uppercase tracking-wider leading-none mb-1\"\n style={{ color: config.accentColor }}\n >\n {toast.title}\n </p>\n )}\n <p className=\"text-xs text-gray-200 font-medium leading-snug\">\n {toast.message}\n </p>\n </div>\n\n {/* Action button - inline right side */}\n {toast.action && (\n <button\n onClick={() => {\n toast.action?.onClick();\n handleDismiss();\n }}\n className=\"flex-shrink-0 text-[9px] font-black uppercase tracking-wider px-2 py-1 transition-all hover:-translate-y-0.5 active:translate-y-0\"\n style={{\n color: config.bgColor,\n backgroundColor: config.accentColor,\n border: `2px solid ${config.borderColor}`,\n }}\n >\n {toast.action.label}\n </button>\n )}\n\n {/* Close button */}\n <button\n onClick={handleDismiss}\n className=\"flex-shrink-0 p-0.5 text-gray-500 hover:text-white transition-colors\"\n >\n <X size={14} />\n </button>\n </div>\n\n {/* Progress bar - solid color */}\n {toast.duration && toast.duration > 0 && (\n <div className=\"h-0.5 bg-white/10\">\n <div\n className=\"h-full\"\n style={{\n backgroundColor: config.accentColor,\n animation: `shrink ${toast.duration}ms linear forwards`,\n }}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n\ninterface ToastContainerProps {\n toasts: Toast[];\n onDismiss?: (id: string) => void;\n}\n\nexport default function ToastContainer({ toasts, onDismiss }: ToastContainerProps) {\n if (toasts.length === 0) {\n return null;\n }\n\n return (\n <>\n <style>{`\n @keyframes shrink {\n from { width: 100%; }\n to { width: 0%; }\n }\n `}</style>\n <div className=\"fixed top-4 right-4 z-[9999] flex flex-col gap-2 pointer-events-none\">\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onDismiss={onDismiss} />\n ))}\n </div>\n </>\n );\n}\n","'use client';\n\nimport { memo, useState, useEffect, useRef } from 'react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ninterface PerformanceOverlayProps {\n isVisible: boolean;\n coreName?: string;\n systemColor?: string;\n}\n\n/**\n * Performance Overlay\n * -------------------\n * A subtle HUD displaying real-time performance metrics.\n * Useful for debugging, power users, and streamers.\n * \n * Metrics displayed:\n * - FPS (frames per second)\n * - Frame time (ms per frame)\n * - Core name\n */\nconst PerformanceOverlay = memo(function PerformanceOverlay({\n isVisible,\n coreName = 'Unknown',\n systemColor = '#00FF41',\n}: PerformanceOverlayProps) {\n const t = useKoinTranslation();\n const [fps, setFps] = useState(0);\n const [frameTime, setFrameTime] = useState(0);\n\n const frameTimesRef = useRef<number[]>([]);\n const lastTimeRef = useRef<number>(performance.now());\n const rafIdRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (!isVisible) {\n if (rafIdRef.current) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n return;\n }\n\n const measureFrame = () => {\n const now = performance.now();\n const delta = now - lastTimeRef.current;\n lastTimeRef.current = now;\n\n // Keep last 60 frame times for smoothing\n frameTimesRef.current.push(delta);\n if (frameTimesRef.current.length > 60) {\n frameTimesRef.current.shift();\n }\n\n // Calculate average\n const avgFrameTime = frameTimesRef.current.reduce((a, b) => a + b, 0) / frameTimesRef.current.length;\n const currentFps = 1000 / avgFrameTime;\n\n setFps(Math.round(currentFps));\n setFrameTime(Number(avgFrameTime.toFixed(1)));\n\n rafIdRef.current = requestAnimationFrame(measureFrame);\n };\n\n rafIdRef.current = requestAnimationFrame(measureFrame);\n\n return () => {\n if (rafIdRef.current) {\n cancelAnimationFrame(rafIdRef.current);\n }\n };\n }, [isVisible]);\n\n if (!isVisible) return null;\n\n return (\n <div\n className=\"z-40 pointer-events-none select-none\"\n style={{ fontFamily: 'monospace' }}\n >\n <div\n className=\"flex items-center gap-3 px-2 py-1 rounded text-xs\"\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.75)',\n color: systemColor,\n border: `1px solid ${systemColor}40`,\n }}\n >\n {/* FPS */}\n <div className=\"flex items-center gap-1\">\n <span className=\"opacity-60 text-[10px] uppercase\">{t.overlays.performance.fps}</span>\n <span className=\"font-bold\">{fps}</span>\n </div>\n\n <div className=\"w-px h-3 bg-white/20\" />\n\n {/* Frame Time */}\n <div className=\"flex items-center gap-1\">\n <span className=\"opacity-60 text-[10px] uppercase\">{t.overlays.performance.frameTime}</span>\n <span className=\"font-bold\">{frameTime}ms</span>\n </div>\n\n <div className=\"w-px h-3 bg-white/20\" />\n\n {/* Core */}\n <div className=\"flex items-center gap-1\">\n <span className=\"opacity-60 text-[10px] uppercase\">{t.overlays.performance.core}</span>\n <span className=\"font-bold text-white/80\">{coreName}</span>\n </div>\n </div>\n </div>\n );\n});\n\nexport default PerformanceOverlay;\n","'use client';\n\nimport React, { memo, useState, useEffect } from 'react';\n\ninterface InputDisplayProps {\n isVisible: boolean;\n system: string;\n systemColor?: string;\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'inline';\n}\n\n// Button layout configurations for different systems\nconst BUTTON_LAYOUTS: Record<string, { dpad: boolean; buttons: string[] }> = {\n // Nintendo\n nes: { dpad: true, buttons: ['B', 'A', 'SELECT', 'START'] },\n snes: { dpad: true, buttons: ['Y', 'B', 'X', 'A', 'L', 'R', 'SELECT', 'START'] },\n n64: { dpad: true, buttons: ['A', 'B', 'Z', 'L', 'R', 'C↑', 'C↓', 'C←', 'C→', 'START'] },\n gb: { dpad: true, buttons: ['B', 'A', 'SELECT', 'START'] },\n gbc: { dpad: true, buttons: ['B', 'A', 'SELECT', 'START'] },\n gba: { dpad: true, buttons: ['B', 'A', 'L', 'R', 'SELECT', 'START'] },\n nds: { dpad: true, buttons: ['Y', 'B', 'X', 'A', 'L', 'R', 'SELECT', 'START'] },\n\n // Sega\n genesis: { dpad: true, buttons: ['A', 'B', 'C', 'X', 'Y', 'Z', 'MODE', 'START'] },\n mastersystem: { dpad: true, buttons: ['1', '2', 'PAUSE'] },\n gamegear: { dpad: true, buttons: ['1', '2', 'START'] },\n\n // Sony\n ps1: { dpad: true, buttons: ['□', '×', '○', '△', 'L1', 'R1', 'L2', 'R2', 'SELECT', 'START'] },\n psp: { dpad: true, buttons: ['□', '×', '○', '△', 'L', 'R', 'SELECT', 'START'] },\n\n // Arcade\n arcade: { dpad: true, buttons: ['1', '2', '3', '4', '5', '6', 'COIN', 'START'] },\n neogeo: { dpad: true, buttons: ['A', 'B', 'C', 'D', 'COIN', 'START'] },\n\n // Default\n default: { dpad: true, buttons: ['A', 'B', 'START'] },\n};\n\n// Keyboard to button mapping (simplified - real mapping comes from controls)\nconst KEY_TO_BUTTON: Record<string, string> = {\n 'ArrowUp': '↑',\n 'ArrowDown': '↓',\n 'ArrowLeft': '←',\n 'ArrowRight': '→',\n 'KeyZ': 'A',\n 'KeyX': 'B',\n 'KeyA': 'X',\n 'KeyS': 'Y',\n 'KeyQ': 'L',\n 'KeyW': 'R',\n 'Enter': 'START',\n 'ShiftRight': 'SELECT',\n 'Space': 'COIN',\n};\n\n/**\n * Input Display Overlay\n * ---------------------\n * Shows real-time button presses for streaming and speedruns.\n * Displays a visual representation of the controller with\n * active buttons highlighted.\n */\nconst InputDisplay = memo(function InputDisplay({\n isVisible,\n system,\n systemColor = '#00FF41',\n position = 'bottom-right',\n}: InputDisplayProps) {\n const [activeKeys, setActiveKeys] = useState<Set<string>>(new Set());\n\n // Track keyboard state\n useEffect(() => {\n if (!isVisible) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const button = KEY_TO_BUTTON[e.code];\n if (button) {\n setActiveKeys(prev => new Set(prev).add(button));\n }\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n const button = KEY_TO_BUTTON[e.code];\n if (button) {\n setActiveKeys(prev => {\n const next = new Set(prev);\n next.delete(button);\n return next;\n });\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n };\n }, [isVisible]);\n\n if (!isVisible) return null;\n\n const layout = BUTTON_LAYOUTS[system.toLowerCase()] || BUTTON_LAYOUTS.default;\n\n // Position classes - 'inline' means no absolute positioning (used in HUD container)\n const positionClasses: Record<string, string> = {\n 'top-left': 'absolute top-2 left-2',\n 'top-right': 'absolute top-2 right-2',\n 'bottom-left': 'absolute bottom-2 left-2',\n 'bottom-right': 'absolute bottom-2 right-2',\n 'inline': '', // No positioning - parent controls placement\n };\n\n const isActive = (btn: string) => activeKeys.has(btn);\n const isDpadActive = (dir: string) => activeKeys.has(dir);\n\n return (\n <div\n className={`z-40 pointer-events-none select-none ${positionClasses[position]}`}\n style={{ fontFamily: 'monospace' }}\n >\n <div\n className=\"flex items-center gap-4 px-3 py-2 rounded\"\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.75)',\n border: `1px solid ${systemColor}40`,\n }}\n >\n {/* D-Pad */}\n {layout.dpad && (\n <div className=\"grid grid-cols-3 gap-0.5\" style={{ width: '48px', height: '48px' }}>\n <div /> {/* Empty top-left */}\n <DpadButton active={isDpadActive('↑')} color={systemColor}>↑</DpadButton>\n <div /> {/* Empty top-right */}\n <DpadButton active={isDpadActive('←')} color={systemColor}>←</DpadButton>\n <div className=\"w-3 h-3 bg-gray-700 rounded-sm\" /> {/* Center */}\n <DpadButton active={isDpadActive('→')} color={systemColor}>→</DpadButton>\n <div /> {/* Empty bottom-left */}\n <DpadButton active={isDpadActive('↓')} color={systemColor}>↓</DpadButton>\n <div /> {/* Empty bottom-right */}\n </div>\n )}\n\n {/* Face Buttons */}\n <div className=\"flex flex-wrap gap-1 max-w-[120px]\">\n {layout.buttons.slice(0, 6).map(btn => (\n <ActionButton key={btn} active={isActive(btn)} color={systemColor}>\n {btn}\n </ActionButton>\n ))}\n </div>\n </div>\n </div>\n );\n});\n\n// D-Pad button component\nconst DpadButton = memo(function DpadButton({\n active,\n color,\n children\n}: {\n active: boolean;\n color: string;\n children: React.ReactNode;\n}) {\n return (\n <div\n className=\"w-3 h-3 flex items-center justify-center text-[8px] font-bold rounded-sm transition-all duration-75\"\n style={{\n backgroundColor: active ? color : 'rgba(255,255,255,0.1)',\n color: active ? '#000' : 'rgba(255,255,255,0.5)',\n boxShadow: active ? `0 0 8px ${color}` : 'none',\n }}\n >\n {children}\n </div>\n );\n});\n\n// Action button component\nconst ActionButton = memo(function ActionButton({\n active,\n color,\n children\n}: {\n active: boolean;\n color: string;\n children: React.ReactNode;\n}) {\n return (\n <div\n className=\"min-w-[20px] h-5 px-1 flex items-center justify-center text-[9px] font-bold rounded transition-all duration-75\"\n style={{\n backgroundColor: active ? color : 'rgba(255,255,255,0.1)',\n color: active ? '#000' : 'rgba(255,255,255,0.6)',\n boxShadow: active ? `0 0 8px ${color}` : 'none',\n }}\n >\n {children}\n </div>\n );\n});\n\nexport default InputDisplay;\n","'use client';\n\nimport { memo, useState } from 'react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\nimport { Circle, Pause, Play, Square, Download } from 'lucide-react';\n\ninterface RecordingIndicatorProps {\n isRecording: boolean;\n isPaused: boolean;\n duration: number; // in seconds\n onPause?: () => void;\n onResume?: () => void;\n onStop?: () => void;\n systemColor?: string;\n}\n\n/**\n * Recording Indicator\n * -------------------\n * Shows recording status with interactive controls on hover.\n * Position: Top-left (since performance overlay is top-right)\n */\nconst RecordingIndicator = memo(function RecordingIndicator({\n isRecording,\n isPaused,\n duration,\n onPause,\n onResume,\n onStop,\n systemColor = '#FF3333',\n}: RecordingIndicatorProps) {\n const t = useKoinTranslation();\n const [isHovered, setIsHovered] = useState(false);\n\n if (!isRecording) return null;\n\n // Format duration as MM:SS\n const minutes = Math.floor(duration / 60);\n const seconds = duration % 60;\n const timeString = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n\n return (\n <div\n className=\"z-40 select-none\"\n style={{ fontFamily: 'monospace' }}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div\n className=\"flex items-center gap-2 px-3 py-2 rounded transition-all duration-200\"\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.9)',\n border: `2px solid ${isPaused ? '#FFA500' : '#FF3333'}`,\n boxShadow: isPaused ? '0 0 12px rgba(255, 165, 0, 0.3)' : '0 0 12px rgba(255, 51, 51, 0.3)',\n }}\n >\n {/* Recording dot / status */}\n <div className=\"relative flex items-center\">\n {isPaused ? (\n <Pause size={14} className=\"text-orange-400\" />\n ) : (\n <>\n <Circle\n size={14}\n fill=\"#FF3333\"\n className=\"text-red-500\"\n />\n {/* Pulsing animation */}\n <Circle\n size={14}\n fill=\"#FF3333\"\n className=\"text-red-500 absolute inset-0 animate-ping opacity-75\"\n />\n </>\n )}\n </div>\n\n {/* Status + Duration */}\n <div className=\"flex flex-col\">\n <span\n className=\"text-xs font-bold\"\n style={{ color: isPaused ? '#FFA500' : '#FF3333' }}\n >\n {isPaused ? t.overlays.recording.paused : t.overlays.recording.recording}\n </span>\n <span className=\"text-[10px] text-white/60\">{timeString}</span>\n </div>\n\n {/* Controls - show on hover */}\n {isHovered && (\n <div className=\"flex items-center gap-1 ml-2 pl-2 border-l border-white/20\">\n {/* Pause/Resume */}\n {isPaused ? (\n <button\n onClick={onResume}\n className=\"p-1.5 rounded hover:bg-white/20 transition-colors\"\n title={t.overlays.recording.resume}\n >\n <Play size={14} className=\"text-orange-400\" fill=\"#FFA500\" />\n </button>\n ) : (\n <button\n onClick={onPause}\n className=\"p-1.5 rounded hover:bg-white/20 transition-colors\"\n title={t.overlays.recording.pause}\n >\n <Pause size={14} className=\"text-white/80\" />\n </button>\n )}\n\n {/* Stop & Save */}\n <button\n onClick={onStop}\n className=\"p-1.5 rounded hover:bg-red-500/30 transition-colors flex items-center gap-1\"\n title={t.overlays.recording.stop}\n >\n <Square size={12} fill=\"#FF3333\" className=\"text-red-500\" />\n <Download size={12} className=\"text-white/60\" />\n </button>\n </div>\n )}\n </div>\n\n {/* Hint when not hovered */}\n {!isHovered && (\n <div className=\"text-[9px] text-white/40 text-center mt-1\">\n {t.overlays.recording.hover}\n </div>\n )}\n </div>\n );\n});\n\nexport default RecordingIndicator;\n","'use client';\n\nimport { memo, useMemo } from 'react';\nimport { X, Keyboard } from 'lucide-react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ninterface ShortcutsModalProps {\n isOpen: boolean;\n onClose: () => void;\n systemColor?: string;\n}\n\n/**\n * Shortcuts Modal\n * ---------------\n * Shows PLAYER shortcuts (F-keys only).\n * Game controls are configured separately in the Controls modal.\n */\nconst ShortcutsModal = memo(function ShortcutsModal({\n isOpen,\n onClose,\n systemColor = '#00FF41',\n}: ShortcutsModalProps) {\n const t = useKoinTranslation();\n\n // F-key shortcuts - these are PLAYER features, not game controls\n const shortcuts = useMemo(() => [\n {\n section: t.modals.shortcuts.overlays, items: [\n { key: 'F1', description: t.modals.shortcuts.showHelp },\n { key: 'F3', description: t.modals.shortcuts.perfOverlay },\n { key: 'F4', description: t.modals.shortcuts.inputDisplay },\n ]\n },\n {\n section: t.modals.shortcuts.recording, items: [\n { key: 'F5', description: t.modals.shortcuts.toggleRec },\n ]\n },\n {\n section: t.settings.audio, items: [\n { key: 'F9', description: t.modals.shortcuts.toggleMute },\n ]\n },\n ], [t]);\n\n if (!isOpen) return null;\n\n return (\n <div\n className=\"absolute inset-0 z-50 flex items-center justify-center bg-black/80 backdrop-blur-sm\"\n onClick={onClose}\n >\n <div\n className=\"max-w-sm w-full mx-4 bg-black/95 border rounded-lg overflow-hidden\"\n style={{ borderColor: `${systemColor}40` }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n className=\"flex items-center justify-between px-4 py-3 border-b\"\n style={{ borderColor: `${systemColor}20`, backgroundColor: `${systemColor}10` }}\n >\n <div className=\"flex items-center gap-2\">\n <Keyboard size={18} style={{ color: systemColor }} />\n <span className=\"font-bold text-white\">{t.modals.shortcuts.playerShortcuts}</span>\n </div>\n <button\n onClick={onClose}\n className=\"p-1 rounded hover:bg-white/10 transition-colors\"\n >\n <X size={18} className=\"text-white/60 hover:text-white\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-4 space-y-3\">\n {shortcuts.map(({ section, items }) => (\n <div key={section}>\n <h3\n className=\"text-[10px] font-bold uppercase tracking-wider mb-1.5 opacity-60\"\n style={{ color: systemColor }}\n >\n {section}\n </h3>\n <div className=\"space-y-1\">\n {items.map(({ key, description }) => (\n <div\n key={key}\n className=\"flex items-center justify-between text-sm\"\n >\n <span className=\"text-white/70\">{description}</span>\n <kbd\n className=\"px-2 py-0.5 rounded text-xs font-mono font-bold\"\n style={{\n backgroundColor: `${systemColor}20`,\n color: systemColor,\n border: `1px solid ${systemColor}40`,\n }}\n >\n {key}\n </kbd>\n </div>\n ))}\n </div>\n </div>\n ))}\n\n {/* Note about game controls */}\n <div className=\"pt-2 border-t border-white/10 text-xs text-white/40\">\n Game controls can be configured in <strong className=\"text-white/60\">{t.controls.keys}</strong> settings.\n </div>\n </div>\n\n {/* Footer */}\n <div\n className=\"px-4 py-2 text-center text-xs text-white/40 border-t\"\n style={{ borderColor: `${systemColor}20` }}\n >\n {t.modals.shortcuts.pressEsc}\n </div>\n </div>\n </div>\n );\n});\n\nexport default ShortcutsModal;\n","/**\n * Utilities for viewport and fullscreen detection\n */\n\n/**\n * Check if document is in fullscreen mode (all vendor prefixes)\n */\nexport function isFullscreen(): boolean {\n const doc = document as any;\n return !!(\n doc.fullscreenElement ||\n doc.webkitFullscreenElement ||\n doc.mozFullScreenElement ||\n doc.msFullscreenElement\n );\n}\n\n/**\n * Get all fullscreen change event names (for all vendor prefixes)\n */\nexport function getFullscreenEventNames(): string[] {\n return [\n 'fullscreenchange',\n 'webkitfullscreenchange',\n 'mozfullscreenchange',\n 'MSFullscreenChange',\n ];\n}\n\n/**\n * Setup fullscreen change listener with all vendor prefixes\n * Returns cleanup function\n */\nexport function setupFullscreenListener(\n callback: () => void\n): () => void {\n const eventNames = getFullscreenEventNames();\n eventNames.forEach((eventName) => {\n document.addEventListener(eventName, callback);\n });\n\n return () => {\n eventNames.forEach((eventName) => {\n document.removeEventListener(eventName, callback);\n });\n };\n}\n\n/**\n * Request fullscreen on an element (with vendor prefixes)\n * Falls back gracefully if not supported\n */\nexport async function enterFullscreen(element: HTMLElement): Promise<boolean> {\n try {\n if (element.requestFullscreen) {\n await element.requestFullscreen();\n return true;\n } else if ((element as any).webkitRequestFullscreen) {\n await (element as any).webkitRequestFullscreen();\n return true;\n }\n return false;\n } catch (err) {\n console.warn('Fullscreen request failed:', err);\n return false;\n }\n}\n\n/**\n * Exit fullscreen mode (with vendor prefixes)\n */\nexport async function exitFullscreenMode(): Promise<boolean> {\n try {\n if (document.exitFullscreen) {\n await document.exitFullscreen();\n return true;\n } else if ((document as any).webkitExitFullscreen) {\n await (document as any).webkitExitFullscreen();\n return true;\n }\n return false;\n } catch (err) {\n console.warn('Exit fullscreen failed:', err);\n return false;\n }\n}\n\n/**\n * Toggle fullscreen mode on an element\n * Returns whether fullscreen is now active (or should be visually simulated)\n */\nexport async function toggleFullscreen(element: HTMLElement): Promise<boolean> {\n if (isFullscreen()) {\n const exited = await exitFullscreenMode();\n return exited ? false : isFullscreen();\n } else {\n const entered = await enterFullscreen(element);\n // If native fullscreen worked, return true; otherwise caller should use visual fallback\n return entered;\n }\n}\n\n/**\n * Detect if device is mobile\n * Uses multiple heuristics for reliable detection\n */\nexport function isMobileDevice(): boolean {\n // Check for touch capability\n const hasTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n\n // Use matchMedia for pointer type (most reliable)\n const hasCoarsePointer = window.matchMedia('(pointer: coarse)').matches;\n\n // Use visual viewport if available (more accurate on mobile)\n const width = window.visualViewport?.width || window.innerWidth;\n const isSmallScreen = width < 768;\n\n // Check user agent for mobile devices\n const isMobileUA = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n );\n\n // Mobile if has touch AND (coarse pointer OR small screen OR mobile UA)\n return hasTouch && (hasCoarsePointer || isSmallScreen || isMobileUA);\n}\n\n/**\n * Get current viewport dimensions\n * Uses visual viewport API if available (better for mobile with keyboard/address bar)\n */\nexport function getViewportSize(): { width: number; height: number } {\n return {\n width: window.visualViewport?.width || window.innerWidth,\n height: window.visualViewport?.height || window.innerHeight,\n };\n}\n\n/**\n * Get current screen orientation\n * Uses viewport dimensions to determine orientation\n */\nexport function getCurrentOrientation(): 'portrait' | 'landscape' {\n const { width, height } = getViewportSize();\n return width > height ? 'landscape' : 'portrait';\n}\n\n/**\n * Get current screen orientation from container dimensions\n * More reliable than window dimensions during transitions\n */\nexport function getOrientationFromContainer(container: HTMLElement): 'portrait' | 'landscape' {\n const rect = container.getBoundingClientRect();\n return rect.width > rect.height ? 'landscape' : 'portrait';\n}\n\n/**\n * Create an orientation change handler with iOS-specific timing\n * Handles duplicate events and waits for layout updates\n * \n * @param callback - Function to call when orientation changes\n * @param checkReady - Optional function to check if layout is ready (returns true when ready)\n * @param maxRafs - Maximum number of RAF attempts (default: 3)\n * @returns Handler function to attach to orientationchange event\n */\nexport function createOrientationChangeHandler(\n callback: () => void,\n checkReady?: () => boolean,\n maxRafs: number = 3\n): () => void {\n let lastOrientation: 'portrait' | 'landscape' | null = null;\n\n return () => {\n const currentOrientation = getCurrentOrientation();\n\n // Only process if orientation actually changed (iOS can fire multiple times)\n if (lastOrientation === currentOrientation) {\n return;\n }\n\n lastOrientation = currentOrientation;\n\n // iOS Safari: orientationchange fires before layout is updated\n // Use multiple RAFs to wait for layout, with a fallback timeout\n let rafCount = 0;\n\n const tryCallback = () => {\n rafCount++;\n\n // If checkReady is provided, use it to verify layout is ready\n if (checkReady && !checkReady()) {\n // If layout not ready and we haven't tried too many times, try again\n if (rafCount < maxRafs) {\n requestAnimationFrame(tryCallback);\n } else {\n // Fallback: force callback after a short delay (iOS edge case)\n setTimeout(callback, 100);\n }\n return;\n }\n\n // Layout is ready (or no check provided), execute callback\n callback();\n };\n\n // Start with a small delay to let iOS start the transition\n setTimeout(() => {\n requestAnimationFrame(tryCallback);\n }, 50);\n };\n}\n\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport {\n isMobileDevice,\n getCurrentOrientation,\n createOrientationChangeHandler,\n} from '../components/VirtualController/utils/viewport';\n\nexport interface UseMobileReturn {\n isMobile: boolean;\n isLandscape: boolean;\n isPortrait: boolean;\n}\n\n/**\n * Hook to detect mobile devices and screen orientation\n * Uses touch capability and screen size to determine if device is mobile\n */\nexport function useMobile(): UseMobileReturn {\n const [isMobile, setIsMobile] = useState(false);\n const [isLandscape, setIsLandscape] = useState(false);\n const [isPortrait, setIsPortrait] = useState(true);\n\n useEffect(() => {\n let lastOrientation: 'portrait' | 'landscape' | null = null;\n\n // Check orientation with debouncing to avoid rapid updates\n let orientationTimeout: ReturnType<typeof setTimeout> | null = null;\n const checkOrientation = () => {\n if (orientationTimeout) clearTimeout(orientationTimeout);\n\n orientationTimeout = setTimeout(() => {\n const currentOrientation = getCurrentOrientation();\n\n // Only update if orientation actually changed\n if (lastOrientation !== currentOrientation) {\n lastOrientation = currentOrientation;\n const landscape = currentOrientation === 'landscape';\n setIsLandscape(landscape);\n setIsPortrait(!landscape);\n }\n }, 100); // Small debounce to avoid rapid updates during transition\n };\n\n // Initial check\n setIsMobile(isMobileDevice());\n const initialOrientation = getCurrentOrientation();\n lastOrientation = initialOrientation;\n const initialLandscape = initialOrientation === 'landscape';\n setIsLandscape(initialLandscape);\n setIsPortrait(!initialLandscape);\n\n // Listen for resize/orientation changes\n const handleResize = () => {\n setIsMobile(isMobileDevice());\n checkOrientation();\n };\n\n // Handle orientation change with iOS-specific timing\n const handleOrientationChange = createOrientationChangeHandler(() => {\n handleResize();\n });\n\n window.addEventListener('resize', handleResize, { passive: true });\n window.addEventListener('orientationchange', handleOrientationChange);\n\n // Visual viewport changes (iOS Safari address bar)\n if (window.visualViewport) {\n window.visualViewport.addEventListener('resize', handleResize);\n }\n\n return () => {\n if (orientationTimeout) clearTimeout(orientationTimeout);\n window.removeEventListener('resize', handleResize);\n window.removeEventListener('orientationchange', handleOrientationChange);\n if (window.visualViewport) {\n window.visualViewport.removeEventListener('resize', handleResize);\n }\n };\n }, []);\n\n return {\n isMobile,\n isLandscape,\n isPortrait,\n };\n}\n","/**\n * Console-specific virtual controller layouts\n * \n * IMPORTANT: Button `type` maps to RetroPad standard buttons.\n * Button `label` is what the user sees on screen.\n * \n * POSITIONING (percentage of screen):\n * - D-pad: Bottom-left (~14%, ~62%)\n * - Action buttons: Bottom-right (~75-95%, ~45-70%)\n * - System buttons: Top center (~38-62%, ~8%)\n * - Shoulders: Top corners (~8%, ~92%, ~20%)\n */\n\nimport { ButtonId } from '../../lib/controls/types';\n\nexport type ButtonType = ButtonId | 'menu';\n\nexport interface ButtonConfig {\n type: ButtonType;\n label: string;\n x: number;\n y: number;\n size: number;\n showInPortrait: boolean;\n showInLandscape: boolean;\n shape?: 'circle' | 'square' | 'rect' | 'pill';\n}\n\nexport interface ControllerLayout {\n console: string;\n buttons: ButtonConfig[];\n}\n\n// --- SIZE CONSTANTS ---\nconst BUTTON_SMALL = 44;\nconst BUTTON_MEDIUM = 56;\nconst BUTTON_LARGE = 68;\n\n// --- POSITION CONSTANTS ---\nconst START_SELECT_Y = 8;\nconst SELECT_X = 38;\nconst START_X = 62;\n\n// --- SHARED D-PAD BUTTONS (filtered out, handled by Dpad component) ---\nconst DPAD_BUTTONS: ButtonConfig[] = [\n { type: 'up', label: '↑', x: 14, y: 55, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'down', label: '↓', x: 14, y: 70, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'left', label: '←', x: 6, y: 62.5, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'right', label: '→', x: 22, y: 62.5, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n];\n\n// --- LAYOUTS ---\n\n/**\n * 2-Button Layout (NES, GB, GBC, Master System, Game Gear, TG-16, Atari)\n */\nexport const TWO_BUTTON_LAYOUT: ControllerLayout = {\n console: '2BUTTON',\n buttons: [\n ...DPAD_BUTTONS,\n { type: 'b', label: 'B', x: 78, y: 66, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: 'A', x: 90, y: 56, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'select', label: 'SELECT', x: SELECT_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n { type: 'start', label: 'START', x: START_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * SNES Layout (4 Face + L/R)\n */\nexport const SNES_LAYOUT: ControllerLayout = {\n console: 'SNES',\n buttons: [\n ...DPAD_BUTTONS,\n // Diamond: Y-X-B-A (left-top-bottom-right)\n { type: 'y', label: 'Y', x: 74, y: 58, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'x', label: 'X', x: 84, y: 46, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'b', label: 'B', x: 84, y: 70, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: 'A', x: 94, y: 58, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n // Shoulders\n { type: 'l', label: 'L', x: 8, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'r', label: 'R', x: 92, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'select', label: 'SELECT', x: SELECT_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n { type: 'start', label: 'START', x: START_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * GBA Layout (A/B + L/R)\n */\nexport const GBA_LAYOUT: ControllerLayout = {\n console: 'GBA',\n buttons: [\n ...DPAD_BUTTONS,\n { type: 'b', label: 'B', x: 80, y: 62, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: 'A', x: 92, y: 52, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'l', label: 'L', x: 8, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'r', label: 'R', x: 92, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'select', label: 'SELECT', x: SELECT_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n { type: 'start', label: 'START', x: START_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * Genesis 6-Button Layout\n * RetroPad mapping: A=Y, B=B, C=A, X=L, Y=X, Z=R\n */\nexport const SIX_BUTTON_LAYOUT: ControllerLayout = {\n console: '6BUTTON',\n buttons: [\n ...DPAD_BUTTONS,\n // Top row (X, Y, Z) → mapped to L, X, R\n { type: 'l', label: 'X', x: 74, y: 48, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'x', label: 'Y', x: 84, y: 44, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'r', label: 'Z', x: 94, y: 40, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n // Bottom row (A, B, C) → mapped to Y, B, A\n { type: 'y', label: 'A', x: 72, y: 64, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'b', label: 'B', x: 82, y: 60, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: 'C', x: 92, y: 56, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'start', label: 'START', x: 50, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * Saturn Layout (6-Button + L/R triggers)\n * Same face buttons as Genesis, plus dedicated L/R shoulders\n */\nexport const SATURN_LAYOUT: ControllerLayout = {\n console: 'SATURN',\n buttons: [\n ...DPAD_BUTTONS,\n // Face buttons (same as 6-button but uses standard buttons)\n // X/Y/Z on top\n { type: 'x', label: 'X', x: 74, y: 48, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'y', label: 'Y', x: 84, y: 44, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'l', label: 'Z', x: 94, y: 40, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n // A/B/C on bottom\n { type: 'b', label: 'A', x: 72, y: 64, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: 'B', x: 82, y: 60, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'r', label: 'C', x: 92, y: 56, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n // Triggers (L2/R2 for Saturn L/R)\n { type: 'l2', label: 'L', x: 8, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'r2', label: 'R', x: 92, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'start', label: 'START', x: 50, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * Neo Geo 4-Button Curved Layout\n * RetroPad mapping: A→B, B→A, C→Y, D→X\n */\nexport const NEOGEO_LAYOUT: ControllerLayout = {\n console: 'NEOGEO',\n buttons: [\n ...DPAD_BUTTONS,\n // Curved A-B-C-D layout (maps to b-a-y-x for RetroPad)\n { type: 'b', label: 'A', x: 68, y: 68, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: 'B', x: 78, y: 62, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'y', label: 'C', x: 88, y: 56, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'x', label: 'D', x: 96, y: 48, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'select', label: 'COIN', x: SELECT_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n { type: 'start', label: 'START', x: START_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * PlayStation Layout (4 Face + L1/R1 + L2/R2)\n */\nexport const PSX_LAYOUT: ControllerLayout = {\n console: 'PSX',\n buttons: [\n ...DPAD_BUTTONS,\n // PS symbols: △◯✕□ → y, b, a, x (triangle-circle-cross-square)\n { type: 'y', label: '△', x: 84, y: 46, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'b', label: '○', x: 94, y: 58, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: '✕', x: 84, y: 70, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'x', label: '□', x: 74, y: 58, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n // Shoulders\n { type: 'l', label: 'L1', x: 8, y: 25, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'r', label: 'R1', x: 92, y: 25, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'l2', label: 'L2', x: 8, y: 15, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'r2', label: 'R2', x: 92, y: 15, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'select', label: 'SELECT', x: SELECT_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n { type: 'start', label: 'START', x: START_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * N64 Layout (A/B + C-buttons + L/R/Z)\n */\nexport const N64_LAYOUT: ControllerLayout = {\n console: 'N64',\n buttons: [\n ...DPAD_BUTTONS,\n // A/B\n { type: 'a', label: 'A', x: 80, y: 68, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'b', label: 'B', x: 72, y: 76, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n // C-buttons (use x/y as C-left/C-up, l2/r2 as C-down/C-right)\n { type: 'y', label: 'C↑', x: 92, y: 50, size: 36, showInPortrait: true, showInLandscape: true },\n { type: 'x', label: 'C←', x: 86, y: 56, size: 36, showInPortrait: true, showInLandscape: true },\n { type: 'l2', label: 'C↓', x: 92, y: 62, size: 36, showInPortrait: true, showInLandscape: true },\n { type: 'r2', label: 'C→', x: 98, y: 56, size: 36, showInPortrait: true, showInLandscape: true },\n // Shoulders\n { type: 'l', label: 'L', x: 8, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'r', label: 'R', x: 92, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n // Z trigger (use select as workaround since it's a unique button)\n { type: 'select', label: 'Z', x: 8, y: 35, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'start', label: 'START', x: 50, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * Dreamcast Layout (A/B/X/Y + L/R)\n */\nexport const DREAMCAST_LAYOUT: ControllerLayout = {\n console: 'DREAMCAST',\n buttons: [\n ...DPAD_BUTTONS,\n // Standard diamond\n { type: 'y', label: 'Y', x: 74, y: 58, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'x', label: 'X', x: 84, y: 46, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'b', label: 'B', x: 84, y: 70, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: 'A', x: 94, y: 58, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n // Triggers\n { type: 'l', label: 'L', x: 8, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'r', label: 'R', x: 92, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'start', label: 'START', x: 50, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n// --- SYSTEM LOOKUP ---\n\nexport function getLayoutForSystem(system: string): ControllerLayout {\n const s = system.toUpperCase();\n\n // Sony\n if (s === 'PS1' || s === 'PSX' || s === 'PSP') return PSX_LAYOUT;\n\n // Nintendo\n if (s === 'N64') return N64_LAYOUT;\n if (s === 'SNES' || s === 'NDS') return SNES_LAYOUT;\n if (s === 'GBA') return GBA_LAYOUT;\n if (s === 'NES' || s === 'GB' || s === 'GBC' || s === 'VIRTUAL_BOY') return TWO_BUTTON_LAYOUT;\n\n // Sega\n if (s === 'DREAMCAST') return DREAMCAST_LAYOUT;\n if (s === 'SATURN') return SATURN_LAYOUT;\n if (s === 'GENESIS') return SIX_BUTTON_LAYOUT;\n if (s === 'MASTER_SYSTEM' || s === 'GAME_GEAR') return TWO_BUTTON_LAYOUT;\n\n // SNK\n if (s === 'NEOGEO') return NEOGEO_LAYOUT;\n if (s.includes('NEOGEO_POCKET')) return TWO_BUTTON_LAYOUT;\n\n // Others\n if (s === 'ARCADE') return SIX_BUTTON_LAYOUT;\n if (s === 'PC_ENGINE' || s === 'TURBOGRAFX') return TWO_BUTTON_LAYOUT;\n if (s.includes('WONDERSWAN')) return TWO_BUTTON_LAYOUT;\n if (s.includes('ATARI')) return TWO_BUTTON_LAYOUT;\n\n return TWO_BUTTON_LAYOUT;\n}\n","/**\n * Hook for handling touch events on virtual buttons\n * Handles both button presses and drag functionality\n */\n\nimport { useRef, useCallback } from 'react';\nimport { ButtonType } from '../layouts';\n\nexport interface UseTouchHandlersProps {\n buttonType: ButtonType;\n isSystemButton: boolean;\n buttonSize: number;\n displayX: number;\n displayY: number;\n containerWidth: number;\n containerHeight: number;\n onPress: (buttonType: string) => void;\n onPressDown?: (buttonType: string) => void;\n onRelease: (buttonType: string) => void;\n onPositionChange?: (x: number, y: number) => void;\n}\n\nexport interface TouchHandlers {\n handleTouchStart: (e: TouchEvent) => void;\n handleTouchMove: (e: TouchEvent) => void;\n handleTouchEnd: (e: TouchEvent) => void;\n handleTouchCancel: (e: TouchEvent) => void;\n cleanup: () => void;\n}\n\nconst DRAG_HOLD_DELAY = 350; // ms - aligned with Dpad\nconst DRAG_MOVE_THRESHOLD = 10; // pixels\nconst DRAG_CENTER_THRESHOLD = 0.4; // 40% of button size\n\nexport function useTouchHandlers({\n buttonType,\n isSystemButton,\n buttonSize,\n displayX,\n displayY,\n containerWidth,\n containerHeight,\n onPress,\n onPressDown,\n onRelease,\n onPositionChange,\n}: UseTouchHandlersProps): TouchHandlers {\n const isDraggingRef = useRef(false);\n const dragStartRef = useRef({ x: 0, y: 0 });\n const dragTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const touchStartPosRef = useRef({ x: 0, y: 0 });\n\n const clearDragTimer = useCallback(() => {\n if (dragTimerRef.current) {\n clearTimeout(dragTimerRef.current);\n dragTimerRef.current = null;\n }\n }, []);\n\n const startDragging = useCallback(\n (touchX: number, touchY: number) => {\n isDraggingRef.current = true;\n dragStartRef.current = {\n x: touchX - (displayX / 100) * containerWidth,\n y: touchY - (displayY / 100) * containerHeight,\n };\n // Haptic feedback for drag activation (matches D-pad)\n if (navigator.vibrate) {\n navigator.vibrate([10, 30, 10]);\n }\n // Release button press when drag starts\n if (!isSystemButton) {\n onRelease(buttonType);\n }\n },\n [displayX, displayY, containerWidth, containerHeight, isSystemButton, buttonType, onRelease]\n );\n\n const handleTouchStart = useCallback(\n (e: TouchEvent) => {\n const touch = e.touches[0];\n touchStartPosRef.current = { x: touch.clientX, y: touch.clientY };\n\n // Always prevent default to avoid delays and context menus\n e.preventDefault();\n e.stopPropagation();\n\n // Haptic feedback for tactile response\n if (navigator.vibrate) {\n navigator.vibrate(8); // Very short 8ms pulse\n }\n\n if (isSystemButton) {\n onPress(buttonType);\n } else if (onPressDown) {\n onPressDown(buttonType);\n }\n\n // Setup drag detection if enabled\n if (onPositionChange) {\n const target = e.currentTarget as HTMLElement;\n if (!target) return;\n const rect = target.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const distance = Math.sqrt(\n Math.pow(touch.clientX - centerX, 2) + Math.pow(touch.clientY - centerY, 2)\n );\n const dragThreshold = buttonSize * DRAG_CENTER_THRESHOLD;\n\n // Only enable drag if touch is near center\n if (distance < dragThreshold) {\n // Start drag timer - if user holds for delay, enable dragging\n dragTimerRef.current = setTimeout(() => {\n if (!isDraggingRef.current) {\n startDragging(touch.clientX, touch.clientY);\n }\n }, DRAG_HOLD_DELAY);\n }\n }\n },\n [isSystemButton, buttonType, onPress, onPressDown, onPositionChange, buttonSize, startDragging]\n );\n\n const handleTouchMove = useCallback(\n (e: TouchEvent) => {\n const touch = e.touches[0];\n\n // Check if user moved significantly (start drag immediately if moved)\n if (onPositionChange && !isDraggingRef.current) {\n const moveDistance = Math.sqrt(\n Math.pow(touch.clientX - touchStartPosRef.current.x, 2) +\n Math.pow(touch.clientY - touchStartPosRef.current.y, 2)\n );\n\n // If moved more than threshold, start dragging immediately\n if (moveDistance > DRAG_MOVE_THRESHOLD) {\n clearDragTimer();\n startDragging(touch.clientX, touch.clientY);\n }\n }\n\n // Handle drag movement\n if (isDraggingRef.current && onPositionChange) {\n e.preventDefault();\n e.stopPropagation();\n\n const newX = touch.clientX - dragStartRef.current.x;\n const newY = touch.clientY - dragStartRef.current.y;\n\n // Convert to percentage\n const newXPercent = (newX / containerWidth) * 100;\n const newYPercent = (newY / containerHeight) * 100;\n\n // Constrain to screen bounds (with margin for button size)\n const margin = (buttonSize / 2 / Math.min(containerWidth, containerHeight)) * 100;\n const constrainedX = Math.max(margin, Math.min(100 - margin, newXPercent));\n const constrainedY = Math.max(margin, Math.min(100 - margin, newYPercent));\n\n onPositionChange(constrainedX, constrainedY);\n }\n },\n [onPositionChange, clearDragTimer, startDragging, containerWidth, containerHeight, buttonSize]\n );\n\n const handleTouchEnd = useCallback(\n (e: TouchEvent) => {\n clearDragTimer();\n\n if (isDraggingRef.current) {\n e.preventDefault();\n e.stopPropagation();\n isDraggingRef.current = false;\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n // Only release if not a system button (system buttons use press() which auto-releases)\n if (!isSystemButton) {\n onRelease(buttonType);\n }\n },\n [clearDragTimer, isSystemButton, buttonType, onRelease]\n );\n\n const handleTouchCancel = useCallback(\n (e: TouchEvent) => {\n clearDragTimer();\n\n if (isDraggingRef.current) {\n e.preventDefault();\n e.stopPropagation();\n isDraggingRef.current = false;\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n // Only release if not a system button\n if (!isSystemButton) {\n onRelease(buttonType);\n }\n },\n [clearDragTimer, isSystemButton, buttonType, onRelease]\n );\n\n const cleanup = useCallback(() => {\n clearDragTimer();\n }, [clearDragTimer]);\n\n return {\n handleTouchStart,\n handleTouchMove,\n handleTouchEnd,\n handleTouchCancel,\n cleanup,\n };\n}\n\n","/**\n * Button styling utilities for virtual controller buttons\n * \n * Provides console-specific color schemes and pressed state styling.\n */\n\nimport { ButtonType } from '../layouts';\n\nexport interface ButtonStyle {\n bg: string;\n text: string;\n border: string;\n shadow: string;\n transform: string;\n}\n\n// --- DEFAULT STYLES ---\n\nconst DEFAULT_FACE: ButtonStyle = {\n bg: 'bg-white/10 backdrop-blur-md',\n text: 'text-white',\n border: 'border-white/30',\n shadow: 'shadow-lg',\n transform: '',\n};\n\nconst DEFAULT_SHOULDER: ButtonStyle = {\n bg: 'bg-white/20 backdrop-blur-md',\n text: 'text-white',\n border: 'border-white/30',\n shadow: 'shadow-sm',\n transform: '',\n};\n\nconst DEFAULT_SYSTEM: ButtonStyle = {\n bg: 'bg-black/60 backdrop-blur-md',\n text: 'text-white/80',\n border: 'border-white/20',\n shadow: 'shadow-sm',\n transform: '',\n};\n\nconst PRESSED_STYLE: ButtonStyle = {\n bg: 'bg-white/90',\n text: 'text-black',\n border: 'border-white',\n shadow: 'shadow-none',\n transform: 'scale(0.95)',\n};\n\n// --- HELPER FUNCTIONS ---\n\nfunction coloredButton(bgColor: string, textColor: string = 'text-white'): ButtonStyle {\n return {\n bg: bgColor,\n text: textColor,\n border: 'border-white/20',\n shadow: 'shadow-lg',\n transform: '',\n };\n}\n\nfunction psButton(symbolColor: string): ButtonStyle {\n return {\n bg: 'bg-black/80 backdrop-blur-md',\n text: symbolColor,\n border: 'border-white/30',\n shadow: 'shadow-lg',\n transform: '',\n };\n}\n\n// --- MAIN FUNCTION ---\n\n/**\n * Get button styles based on type, pressed state, and console\n */\nexport function getButtonStyles(\n buttonType: ButtonType,\n isPressed: boolean,\n consoleName: string = ''\n): ButtonStyle {\n if (isPressed) {\n return PRESSED_STYLE;\n }\n\n const c = consoleName.toUpperCase();\n\n // Neo Geo: A(red)/B(yellow)/C(green)/D(blue) → mapped to b/a/y/x\n if (c === 'NEOGEO') {\n switch (buttonType) {\n case 'b': return coloredButton('bg-[#E60012]'); // A = Red\n case 'a': return coloredButton('bg-[#FFD600]', 'text-black'); // B = Yellow\n case 'y': return coloredButton('bg-[#009944]'); // C = Green\n case 'x': return coloredButton('bg-[#0068B7]'); // D = Blue\n }\n }\n\n // PlayStation: Symbol colors\n if (c === 'PSX' || c === 'PS1' || c === 'PSP') {\n switch (buttonType) {\n case 'y': return psButton('text-[#25D998]'); // △ = Green\n case 'b': return psButton('text-[#FF5555]'); // ○ = Red\n case 'a': return psButton('text-[#5599FF]'); // ✕ = Blue\n case 'x': return psButton('text-[#E889DD]'); // □ = Pink\n }\n }\n\n // SNES: Colored face buttons\n if (c === 'SNES' || c === 'NDS') {\n switch (buttonType) {\n case 'a': return coloredButton('bg-[#CC0000]'); // A = Red\n case 'b': return coloredButton('bg-[#CCCC00]', 'text-black'); // B = Yellow\n case 'x': return coloredButton('bg-[#0033CC]'); // X = Blue\n case 'y': return coloredButton('bg-[#006600]'); // Y = Green\n }\n }\n\n // Default by button type\n switch (buttonType) {\n case 'a':\n case 'b':\n case 'x':\n case 'y':\n return DEFAULT_FACE;\n\n case 'l':\n case 'r':\n case 'l2':\n case 'r2':\n return DEFAULT_SHOULDER;\n\n case 'start':\n case 'select':\n case 'menu':\n return DEFAULT_SYSTEM;\n\n default:\n return DEFAULT_FACE;\n }\n}\n","'use client';\n\nimport React, { useRef, useEffect } from 'react';\nimport { ButtonConfig } from './layouts';\nimport { useTouchHandlers } from './hooks/useTouchHandlers';\nimport { getButtonStyles } from './utils/buttonStyles';\n\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\nexport interface VirtualButtonProps {\n config: ButtonConfig;\n isPressed: boolean;\n onPress: (buttonType: string) => void;\n onPressDown?: (buttonType: string) => void;\n onRelease: (buttonType: string) => void;\n containerWidth: number;\n containerHeight: number;\n customPosition?: { x: number; y: number } | null; // Custom position from drag\n onPositionChange?: (x: number, y: number) => void; // Callback when position changes\n isLandscape?: boolean; // For semi-transparency in landscape\n console?: string; // The specific console identifier (e.g. 'PSX', 'SNES')\n}\n\n/**\n * Individual virtual button component\n * Handles touch events and provides visual feedback\n */\n// Memoize to prevent re-renders when other buttons are pressed\nconst VirtualButton = React.memo(function VirtualButton({\n config,\n isPressed,\n onPress,\n onPressDown,\n onRelease,\n containerWidth,\n containerHeight,\n customPosition,\n onPositionChange,\n isLandscape = false,\n console = '',\n}: VirtualButtonProps) {\n const t = useKoinTranslation();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const isSystemButton = config.type === 'start' || config.type === 'select' || config.type === 'menu';\n const displayX = customPosition ? customPosition.x : config.x;\n const displayY = customPosition ? customPosition.y : config.y;\n\n let label = config.label;\n if (config.type === 'start') label = t.controls.startBtn;\n if (config.type === 'select') label = t.controls.selectBtn;\n\n // Setup touch handlers\n const {\n handleTouchStart,\n handleTouchMove,\n handleTouchEnd,\n handleTouchCancel,\n cleanup,\n } = useTouchHandlers({\n buttonType: config.type,\n isSystemButton,\n buttonSize: config.size,\n displayX,\n displayY,\n containerWidth,\n containerHeight,\n onPress,\n onPressDown,\n onRelease,\n onPositionChange,\n });\n\n // Setup event listeners\n useEffect(() => {\n const button = buttonRef.current;\n if (!button) return;\n\n button.addEventListener('touchstart', handleTouchStart, { passive: false });\n button.addEventListener('touchmove', handleTouchMove, { passive: false });\n button.addEventListener('touchend', handleTouchEnd, { passive: false });\n button.addEventListener('touchcancel', handleTouchCancel, { passive: false });\n\n return () => {\n button.removeEventListener('touchstart', handleTouchStart);\n button.removeEventListener('touchmove', handleTouchMove);\n button.removeEventListener('touchend', handleTouchEnd);\n button.removeEventListener('touchcancel', handleTouchCancel);\n cleanup();\n };\n }, [handleTouchStart, handleTouchMove, handleTouchEnd, handleTouchCancel, cleanup]);\n\n // Calculate position (percentage based)\n const leftPercent = (displayX / 100) * containerWidth - config.size / 2;\n const topPercent = (displayY / 100) * containerHeight - config.size / 2;\n\n // Use transform for hardware acceleration\n const transform = `translate3d(${leftPercent.toFixed(1)}px, ${topPercent.toFixed(1)}px, 0)`;\n\n // Get button styles\n const styles = getButtonStyles(config.type, isPressed, console);\n\n // Shape handling\n let borderRadius = '50%'; // Default circle\n let width = `${config.size}px`;\n // Aspect ratio adjustments for non-circle shapes\n if (config.shape === 'pill') {\n borderRadius = '20px';\n width = `${config.size * 1.8}px`; // Wider\n } else if (config.shape === 'rect') {\n borderRadius = '8px';\n width = `${config.size * 2.5}px`; // Much wider (shoulders)\n } else if (config.shape === 'square') {\n borderRadius = '12px';\n } else {\n // Default to circle, but check type if shape not explicitly set\n // A/B/X/Y/C/D/Z are typically circles\n // L/R are typically rects or specialized shapes\n if (['l', 'r', 'l2', 'r2'].includes(config.type)) {\n borderRadius = '10px';\n width = `${config.size * 2}px`;\n }\n }\n\n\n\n return (\n <button\n ref={buttonRef}\n className={`\n absolute flex items-center justify-center\n font-heading font-bold uppercase tracking-wider\n transition-all duration-75 select-none\n pointer-events-auto touch-manipulation\n backdrop-blur-sm\n ${isPressed ? '' : `${styles.bg} ${styles.border} ${styles.shadow}`} \n ${styles.text}\n active:shadow-none\n `}\n style={{\n top: 0,\n left: 0,\n transform: transform + (isPressed ? ' scale(0.95)' : ''),\n willChange: 'transform',\n width: width,\n height: `${config.size}px`, // Height stays consistent\n minWidth: `${config.size}px`,\n fontSize: config.size < 50 ? '11px' : '16px',\n borderRadius,\n borderWidth: isPressed ? '0px' : '1.5px', // slightly thicker border\n lineHeight: '1',\n // Semi-transparent in landscape mode\n opacity: isLandscape ? 0.85 : 1,\n WebkitTouchCallout: 'none',\n WebkitUserSelect: 'none',\n userSelect: 'none',\n // Direct style overrides if needed from getButtonStyles (for exact hex colors)\n backgroundColor: isPressed ? styles.bg.startsWith('bg-') ? undefined : styles.bg : styles.bg.startsWith('bg-') ? undefined : styles.bg,\n borderColor: isPressed ? undefined : styles.border.startsWith('border-') ? undefined : styles.border,\n color: styles.text.startsWith('text-') ? undefined : styles.text,\n }}\n aria-label={label}\n onContextMenu={(e) => e.preventDefault()}\n >\n {/* Icon rendering logic could go here, for now using label */}\n <span className=\"drop-shadow-md\">{label}</span>\n </button>\n );\n});\n\nexport default VirtualButton;\n","/**\n * Unified Control System Types\n * \n * Single source of truth for all control-related type definitions.\n */\n\n/**\n * All possible button identifiers (superset of all consoles)\n */\nexport type ButtonId =\n | 'up' | 'down' | 'left' | 'right' // D-pad\n | 'a' | 'b' | 'x' | 'y' // Face buttons (standard RetroPad)\n | 'l' | 'r' // Shoulder buttons\n | 'l2' | 'r2' // Triggers (PS1, Saturn, etc.)\n | 'l3' | 'r3' // Stick clicks (PS1 analog)\n | 'start' | 'select'; // System buttons\n\n/**\n * D-pad buttons\n */\nexport const DPAD_BUTTONS: ButtonId[] = ['up', 'down', 'left', 'right'];\n\n/**\n * Face buttons\n */\nexport const FACE_BUTTONS: ButtonId[] = ['a', 'b', 'x', 'y'];\n\n/**\n * Shoulder buttons (L/R only)\n */\nexport const SHOULDER_BUTTONS: ButtonId[] = ['l', 'r'];\n\n/**\n * Trigger buttons (L2/R2)\n */\nexport const TRIGGER_BUTTONS: ButtonId[] = ['l2', 'r2'];\n\n/**\n * Stick click buttons\n */\nexport const STICK_BUTTONS: ButtonId[] = ['l3', 'r3'];\n\n/**\n * System buttons\n */\nexport const SYSTEM_BUTTONS: ButtonId[] = ['start', 'select'];\n\n/**\n * All buttons in display order\n */\nexport const ALL_BUTTONS: ButtonId[] = [\n ...DPAD_BUTTONS,\n ...FACE_BUTTONS,\n ...SHOULDER_BUTTONS,\n ...TRIGGER_BUTTONS,\n ...STICK_BUTTONS,\n ...SYSTEM_BUTTONS,\n];\n\n/**\n * Keyboard mapping: button → JavaScript KeyboardEvent.code\n * Partial because not all consoles have all buttons\n */\nexport type KeyboardMapping = Partial<Record<ButtonId, string>>;\n\nexport type ControlMapping = KeyboardMapping;\n\n/**\n * Gamepad mapping: button → physical button index (W3C Gamepad API)\n * Partial because users may not map all buttons\n */\nexport type GamepadMapping = Partial<Record<ButtonId, number>>;\n\n/**\n * Which buttons a console actually has\n */\nexport interface ConsoleCapabilities {\n /** Console key (e.g., 'NES', 'SNES') */\n console: string;\n /** List of buttons this console supports */\n buttons: ButtonId[];\n}\n\n/**\n * Information about a connected gamepad\n */\nexport interface GamepadInfo {\n /** Gamepad index (0-3) */\n index: number;\n /** Raw gamepad identifier string */\n id: string;\n /** Cleaned up display name */\n name: string;\n /** Whether currently connected */\n connected: boolean;\n /** Number of buttons */\n buttons: number;\n /** Number of axes */\n axes: number;\n /** Mapping type from Gamepad API */\n mapping: GamepadMappingType;\n}\n\n/**\n * Detected controller brand for UI theming\n */\nexport type ControllerBrand = 'xbox' | 'playstation' | 'nintendo' | 'generic';\n\n/**\n * Player index (1-4)\n */\nexport type PlayerIndex = 1 | 2 | 3 | 4;\n\n/**\n * Full control configuration for the emulator\n */\nexport interface ControlConfig {\n /** Keyboard controls (usually player 1 only) */\n keyboard?: KeyboardMapping;\n /** Gamepad controls per player */\n gamepads?: GamepadMapping[];\n}\n","/**\n * Default Control Mappings\n * \n * Single source of truth for all default button mappings.\n */\n\nimport { ButtonId, KeyboardMapping, GamepadMapping } from './types';\n\n/**\n * Standard W3C Gamepad API button indices\n * https://w3c.github.io/gamepad/#remapping\n */\nexport const STANDARD_GAMEPAD_BUTTONS: Record<ButtonId, number> = {\n // Face buttons (Xbox/PlayStation layout)\n a: 0, // A / Cross (bottom)\n b: 1, // B / Circle (right)\n x: 2, // X / Square (left)\n y: 3, // Y / Triangle (top)\n\n // Shoulders\n l: 4, // LB / L1\n r: 5, // RB / R1\n\n // Triggers\n l2: 6, // LT / L2\n r2: 7, // RT / R2\n\n // System\n select: 8, // Back / Select / Share\n start: 9, // Start / Options\n\n // Stick clicks\n l3: 10, // Left stick click\n r3: 11, // Right stick click\n\n // D-pad\n up: 12,\n down: 13,\n left: 14,\n right: 15,\n};\n\n/**\n * Default keyboard mapping (SNES-like, works for most consoles)\n */\nexport const DEFAULT_KEYBOARD: KeyboardMapping = {\n // D-pad → Arrow keys\n up: 'ArrowUp',\n down: 'ArrowDown',\n left: 'ArrowLeft',\n right: 'ArrowRight',\n\n // Face buttons → ZXAS cluster (natural hand position)\n a: 'KeyX', // Primary action (right side)\n b: 'KeyZ', // Secondary action (left side)\n x: 'KeyS', // Top right\n y: 'KeyA', // Top left\n\n // Shoulders → Q/W\n l: 'KeyQ',\n r: 'KeyW',\n\n // Triggers → E/R (for PS1/Saturn)\n l2: 'KeyE',\n r2: 'KeyR',\n\n // Stick clicks → 1/2 (rarely used)\n l3: 'Digit1',\n r3: 'Digit2',\n\n // System\n start: 'Enter',\n select: 'ShiftRight',\n};\n\n/**\n * Default gamepad mapping (uses standard W3C indices)\n */\nexport const DEFAULT_GAMEPAD: GamepadMapping = { ...STANDARD_GAMEPAD_BUTTONS };\n\n/**\n * Get a complete keyboard mapping with all buttons filled in\n * Uses defaults for any missing buttons\n */\nexport function getFullKeyboardMapping(partial?: Partial<KeyboardMapping>): KeyboardMapping {\n return { ...DEFAULT_KEYBOARD, ...partial };\n}\n\n/**\n * Get a complete gamepad mapping with all buttons filled in\n * Uses defaults for any missing buttons\n */\nexport function getFullGamepadMapping(partial?: Partial<GamepadMapping>): GamepadMapping {\n return { ...DEFAULT_GAMEPAD, ...partial };\n}\n","/**\n * Button Labels for UI Display\n * \n * Single source of truth for button display names.\n */\n\nimport { ButtonId } from './types';\n\n/**\n * Human-readable labels for each button\n */\nexport const BUTTON_LABELS: Record<ButtonId, string> = {\n // D-pad\n up: 'D-Pad Up',\n down: 'D-Pad Down',\n left: 'D-Pad Left',\n right: 'D-Pad Right',\n\n // Face buttons\n a: 'A Button',\n b: 'B Button',\n x: 'X Button',\n y: 'Y Button',\n\n // Shoulders\n l: 'L Shoulder',\n r: 'R Shoulder',\n\n // Triggers\n l2: 'L Trigger',\n r2: 'R Trigger',\n\n // Stick clicks\n l3: 'L Stick Click',\n r3: 'R Stick Click',\n\n // System\n start: 'Start',\n select: 'Select',\n};\n\n/**\n * Button groups for organized UI display\n */\nexport const BUTTON_GROUPS = [\n { label: 'Movement', buttons: ['up', 'down', 'left', 'right'] as ButtonId[] },\n { label: 'Face Buttons', buttons: ['a', 'b', 'x', 'y'] as ButtonId[] },\n { label: 'Shoulders', buttons: ['l', 'r'] as ButtonId[] },\n { label: 'Triggers', buttons: ['l2', 'r2'] as ButtonId[] },\n { label: 'System', buttons: ['start', 'select'] as ButtonId[] },\n];\n\n/**\n * Format a JavaScript key code for display\n */\nexport function formatKeyCode(code: string): string {\n if (code.startsWith('Key')) return code.slice(3);\n if (code.startsWith('Digit')) return code.slice(5);\n if (code === 'ArrowUp') return '↑';\n if (code === 'ArrowDown') return '↓';\n if (code === 'ArrowLeft') return '←';\n if (code === 'ArrowRight') return '→';\n if (code === 'Space') return 'Space';\n if (code === 'ShiftLeft' || code === 'ShiftRight') return 'Shift';\n if (code === 'ControlLeft' || code === 'ControlRight') return 'Ctrl';\n if (code === 'AltLeft' || code === 'AltRight') return 'Alt';\n if (code === 'Enter') return 'Enter';\n if (code === 'Tab') return 'Tab';\n if (code === 'Escape') return 'Esc';\n return code;\n}\n\n/**\n * Get human-readable name for a gamepad button index\n */\nexport function formatGamepadButton(index: number | undefined): string {\n if (index === undefined) return '—';\n\n const names: Record<number, string> = {\n 0: 'A / ✕',\n 1: 'B / ○',\n 2: 'X / □',\n 3: 'Y / △',\n 4: 'LB / L1',\n 5: 'RB / R1',\n 6: 'LT / L2',\n 7: 'RT / R2',\n 8: 'Back / Share',\n 9: 'Start / Options',\n 10: 'L3',\n 11: 'R3',\n 12: 'D-Up',\n 13: 'D-Down',\n 14: 'D-Left',\n 15: 'D-Right',\n 16: 'Home',\n };\n\n return names[index] ?? `Btn ${index}`;\n}\n","/**\n * Per-Console Control Presets\n * \n * Defines which buttons each console supports and\n * console-specific default keyboard layouts.\n */\n\nimport { ButtonId, KeyboardMapping, ConsoleCapabilities, DPAD_BUTTONS } from './types';\nimport { DEFAULT_KEYBOARD } from './defaults';\n\n/**\n * Console capabilities - which buttons each system has\n */\nexport const CONSOLE_CAPABILITIES: Record<string, ConsoleCapabilities> = {\n // ============ Nintendo ============\n NES: {\n console: 'NES',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start', 'select'],\n },\n SNES: {\n console: 'SNES',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'x', 'y', 'l', 'r', 'start', 'select'],\n },\n N64: {\n console: 'N64',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'l', 'r', 'start'], // No select, has Z trigger (mapped to l2)\n },\n GB: {\n console: 'GB',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start', 'select'],\n },\n GBC: {\n console: 'GBC',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start', 'select'],\n },\n GBA: {\n console: 'GBA',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'l', 'r', 'start', 'select'],\n },\n\n // ============ Sega ============\n SMS: {\n console: 'SMS',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start'], // 1, 2, Pause\n },\n GENESIS: {\n console: 'GENESIS',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'x', 'y', 'l', 'r', 'start'], // 6-button: A/B/C + X/Y/Z\n },\n GG: {\n console: 'GG',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start'],\n },\n SATURN: {\n console: 'SATURN',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'x', 'y', 'l', 'r', 'l2', 'r2', 'start'], // Full 8-button\n },\n\n // ============ Sony ============\n PS1: {\n console: 'PS1',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'x', 'y', 'l', 'r', 'l2', 'r2', 'l3', 'r3', 'start', 'select'],\n },\n\n // ============ NEC ============\n PCE: {\n console: 'PCE', // TurboGrafx-16\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start', 'select'], // I, II, Run, Select\n },\n\n // ============ Atari ============\n ATARI2600: {\n console: 'ATARI2600',\n buttons: [...DPAD_BUTTONS, 'a', 'select'], // Fire, Select/Reset\n },\n ATARI7800: {\n console: 'ATARI7800',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'select'],\n },\n LYNX: {\n console: 'LYNX',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start', 'select'], // A, B, Option 1, Option 2\n },\n\n // ============ SNK ============\n NGPC: {\n console: 'NGPC', // Neo Geo Pocket\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start', 'select'],\n },\n\n // ============ Other ============\n WSC: {\n console: 'WSC', // WonderSwan\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'x', 'y', 'start'],\n },\n ARCADE: {\n console: 'ARCADE',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'x', 'y', 'l', 'r', 'start', 'select'], // Generic 6-button\n },\n};\n\n/**\n * Console-specific keyboard overrides\n * Only specify keys that differ from DEFAULT_KEYBOARD\n */\nexport const CONSOLE_KEYBOARD_OVERRIDES: Partial<Record<string, Partial<KeyboardMapping>>> = {\n // N64: Remap select since N64 has no select button\n N64: {\n select: 'KeyC', // Free up ShiftRight\n l2: 'KeyQ', // Z trigger\n },\n\n // Genesis: Different layout for 6-button pad\n GENESIS: {\n // Genesis A/B/C maps to our a/b/x (C is like a third action button)\n // Genesis X/Y/Z maps to our y/l/r\n x: 'KeyC', // C button\n y: 'KeyA', // X button\n l: 'KeyS', // Y button\n r: 'KeyD', // Z button\n },\n\n // Atari: Simple fire button\n ATARI2600: {\n select: 'Tab', // Select/Reset\n start: 'KeyR', // Reset\n },\n ATARI7800: {\n select: 'Tab',\n start: 'KeyR',\n },\n};\n\n/**\n * Get capabilities for a console\n * Falls back to SNES-like if unknown\n */\nexport function getConsoleCapabilities(system: string): ConsoleCapabilities {\n const normalized = system.toUpperCase();\n return CONSOLE_CAPABILITIES[normalized] ?? {\n console: normalized,\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'x', 'y', 'l', 'r', 'start', 'select'],\n };\n}\n\n/**\n * Get the list of buttons for a console\n */\nexport function getConsoleButtons(system: string): ButtonId[] {\n return getConsoleCapabilities(system).buttons;\n}\n\n/**\n * Get default keyboard mapping for a console\n * Merges console-specific overrides with defaults\n */\nexport function getConsoleKeyboardDefaults(system: string): KeyboardMapping {\n const normalized = system.toUpperCase();\n const overrides = CONSOLE_KEYBOARD_OVERRIDES[normalized] ?? {};\n const capabilities = getConsoleCapabilities(system);\n\n // Start with defaults, apply overrides, filter to only supported buttons\n const full = { ...DEFAULT_KEYBOARD, ...overrides };\n\n // Only include buttons this console actually has\n const filtered: KeyboardMapping = {};\n for (const button of capabilities.buttons) {\n if (full[button]) {\n filtered[button] = full[button];\n }\n }\n\n return filtered;\n}\n\n/**\n * Check if a console supports a specific button\n */\nexport function consoleHasButton(system: string, button: ButtonId): boolean {\n return getConsoleButtons(system).includes(button);\n}\n","/**\n * Control Storage Utilities\n * \n * Load and save keyboard/gamepad mappings from localStorage.\n */\n\nimport { KeyboardMapping, GamepadMapping, PlayerIndex } from './types';\nimport { DEFAULT_KEYBOARD, DEFAULT_GAMEPAD } from './defaults';\nimport { getConsoleKeyboardDefaults } from './presets';\n\n// Storage key prefixes\nconst KEYBOARD_KEY_PREFIX = 'retrosaga-controls';\nconst GAMEPAD_KEY_PREFIX = 'retrosaga-gamepad';\n\n/**\n * Get localStorage key for keyboard controls\n * Per-system storage: retrosaga-controls-NES, retrosaga-controls-SNES, etc.\n */\nfunction getKeyboardStorageKey(system?: string): string {\n if (system) {\n return `${KEYBOARD_KEY_PREFIX}-${system.toUpperCase()}`;\n }\n return KEYBOARD_KEY_PREFIX; // Legacy global key\n}\n\n/**\n * Get localStorage key for gamepad bindings\n * Per-player storage: retrosaga-gamepad-p1, retrosaga-gamepad-p2, etc.\n */\nfunction getGamepadStorageKey(playerIndex: PlayerIndex): string {\n return `${GAMEPAD_KEY_PREFIX}-p${playerIndex}`;\n}\n\n/**\n * Load keyboard mapping from localStorage\n * Falls back to console-specific defaults if not found\n */\nexport function loadKeyboardMapping(system?: string): KeyboardMapping {\n if (typeof window === 'undefined' || !window.localStorage) {\n return system ? getConsoleKeyboardDefaults(system) : DEFAULT_KEYBOARD;\n }\n\n const storageKey = getKeyboardStorageKey(system);\n\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n return JSON.parse(stored) as KeyboardMapping;\n }\n\n // Fallback: check legacy global key\n if (system) {\n const legacyStored = localStorage.getItem(KEYBOARD_KEY_PREFIX);\n if (legacyStored) {\n return JSON.parse(legacyStored) as KeyboardMapping;\n }\n }\n } catch (e) {\n console.error('[Controls] Failed to load keyboard mapping:', e);\n }\n\n // Return console-specific defaults\n return system ? getConsoleKeyboardDefaults(system) : DEFAULT_KEYBOARD;\n}\n\n/**\n * Save keyboard mapping to localStorage\n */\nexport function saveKeyboardMapping(mapping: KeyboardMapping, system?: string): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n console.warn('[Controls] localStorage not available');\n return;\n }\n\n const storageKey = getKeyboardStorageKey(system);\n\n try {\n localStorage.setItem(storageKey, JSON.stringify(mapping));\n } catch (e) {\n console.error('[Controls] Failed to save keyboard mapping:', e);\n }\n}\n\n/**\n * Load gamepad mapping from localStorage\n * Falls back to standard defaults if not found\n */\nexport function loadGamepadMapping(playerIndex: PlayerIndex = 1): GamepadMapping {\n if (typeof window === 'undefined' || !window.localStorage) {\n return { ...DEFAULT_GAMEPAD };\n }\n\n const storageKey = getGamepadStorageKey(playerIndex);\n\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n return JSON.parse(stored) as GamepadMapping;\n }\n } catch (e) {\n console.error('[Controls] Failed to load gamepad mapping:', e);\n }\n\n return { ...DEFAULT_GAMEPAD };\n}\n\n/**\n * Save gamepad mapping to localStorage\n */\nexport function saveGamepadMapping(mapping: GamepadMapping, playerIndex: PlayerIndex = 1): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n console.warn('[Controls] localStorage not available');\n return;\n }\n\n const storageKey = getGamepadStorageKey(playerIndex);\n\n try {\n localStorage.setItem(storageKey, JSON.stringify(mapping));\n } catch (e) {\n console.error('[Controls] Failed to save gamepad mapping:', e);\n }\n}\n\n/**\n * Load all gamepad mappings for connected players\n */\nexport function loadAllGamepadMappings(playerCount: number): GamepadMapping[] {\n const mappings: GamepadMapping[] = [];\n for (let i = 1; i <= Math.min(playerCount, 4); i++) {\n mappings.push(loadGamepadMapping(i as PlayerIndex));\n }\n return mappings;\n}\n\n/**\n * Clear all saved controls (keyboard and gamepad)\n */\nexport function clearAllControls(): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n\n // Clear keyboard\n const keysToRemove: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(KEYBOARD_KEY_PREFIX) || key?.startsWith(GAMEPAD_KEY_PREFIX)) {\n keysToRemove.push(key);\n }\n }\n keysToRemove.forEach(key => localStorage.removeItem(key));\n}\n","/**\n * RetroArch Input Configuration\n * \n * Converts our control mappings to RetroArch config format.\n */\n\nimport { ButtonId, KeyboardMapping, GamepadMapping, ControlConfig } from './types';\n\n/**\n * Map JavaScript KeyboardEvent.code to RetroArch key names\n * RetroArch uses lowercase key names without prefixes\n */\nconst JS_TO_RETROARCH_KEY: Record<string, string> = {\n // Letters\n KeyA: 'a', KeyB: 'b', KeyC: 'c', KeyD: 'd', KeyE: 'e', KeyF: 'f',\n KeyG: 'g', KeyH: 'h', KeyI: 'i', KeyJ: 'j', KeyK: 'k', KeyL: 'l',\n KeyM: 'm', KeyN: 'n', KeyO: 'o', KeyP: 'p', KeyQ: 'q', KeyR: 'r',\n KeyS: 's', KeyT: 't', KeyU: 'u', KeyV: 'v', KeyW: 'w', KeyX: 'x',\n KeyY: 'y', KeyZ: 'z',\n\n // Numbers\n Digit0: 'num0', Digit1: 'num1', Digit2: 'num2', Digit3: 'num3',\n Digit4: 'num4', Digit5: 'num5', Digit6: 'num6', Digit7: 'num7',\n Digit8: 'num8', Digit9: 'num9',\n\n // Numpad\n Numpad0: 'kp0', Numpad1: 'kp1', Numpad2: 'kp2', Numpad3: 'kp3',\n Numpad4: 'kp4', Numpad5: 'kp5', Numpad6: 'kp6', Numpad7: 'kp7',\n Numpad8: 'kp8', Numpad9: 'kp9',\n NumpadEnter: 'kp_enter', NumpadAdd: 'kp_plus', NumpadSubtract: 'kp_minus',\n NumpadMultiply: 'kp_multiply', NumpadDivide: 'kp_divide', NumpadDecimal: 'kp_period',\n\n // Arrow keys\n ArrowUp: 'up', ArrowDown: 'down', ArrowLeft: 'left', ArrowRight: 'right',\n\n // Modifiers\n ShiftLeft: 'shift', ShiftRight: 'rshift',\n ControlLeft: 'ctrl', ControlRight: 'rctrl',\n AltLeft: 'alt', AltRight: 'ralt',\n\n // Special keys\n Enter: 'enter', Space: 'space', Tab: 'tab', Escape: 'escape',\n Backspace: 'backspace', Delete: 'del', Insert: 'insert',\n Home: 'home', End: 'end', PageUp: 'pageup', PageDown: 'pagedown',\n\n // Function keys\n F1: 'f1', F2: 'f2', F3: 'f3', F4: 'f4', F5: 'f5', F6: 'f6',\n F7: 'f7', F8: 'f8', F9: 'f9', F10: 'f10', F11: 'f11', F12: 'f12',\n\n // Punctuation\n Comma: 'comma', Period: 'period', Slash: 'slash', Backslash: 'backslash',\n BracketLeft: 'leftbracket', BracketRight: 'rightbracket',\n Semicolon: 'semicolon', Quote: 'apostrophe', Backquote: 'backquote',\n Minus: 'minus', Equal: 'equals',\n};\n\n/**\n * Map our button IDs to RetroArch input names\n */\nconst BUTTON_TO_RETROARCH: Record<ButtonId, string> = {\n up: 'up',\n down: 'down',\n left: 'left',\n right: 'right',\n a: 'a',\n b: 'b',\n x: 'x',\n y: 'y',\n l: 'l',\n r: 'r',\n l2: 'l2',\n r2: 'r2',\n l3: 'l3',\n r3: 'r3',\n start: 'start',\n select: 'select',\n};\n\n/**\n * Convert a JS key code to RetroArch key name\n */\nfunction toRetroArchKey(jsKeyCode: string): string {\n return JS_TO_RETROARCH_KEY[jsKeyCode] || jsKeyCode.toLowerCase();\n}\n\n/**\n * Convert keyboard mapping to RetroArch config for a player\n */\nexport function keyboardToRetroArchConfig(\n mapping: KeyboardMapping,\n playerIndex: number = 1\n): Record<string, string> {\n const config: Record<string, string> = {};\n\n for (const [button, jsKeyCode] of Object.entries(mapping)) {\n const raButton = BUTTON_TO_RETROARCH[button as ButtonId];\n if (raButton && jsKeyCode) {\n const raKey = toRetroArchKey(jsKeyCode);\n config[`input_player${playerIndex}_${raButton}`] = raKey;\n }\n }\n\n return config;\n}\n\n/**\n * Convert gamepad mapping to RetroArch config for a player\n * Uses _btn suffix for button indices\n */\nexport function gamepadToRetroArchConfig(\n mapping: GamepadMapping,\n playerIndex: number = 1\n): Record<string, number | string> {\n const config: Record<string, number | string> = {};\n\n for (const [button, buttonIndex] of Object.entries(mapping)) {\n if (buttonIndex === undefined) continue;\n\n const raButton = BUTTON_TO_RETROARCH[button as ButtonId];\n if (raButton) {\n config[`input_player${playerIndex}_${raButton}_btn`] = buttonIndex;\n }\n }\n\n return config;\n}\n\n/**\n * Build complete RetroArch input config from control configuration\n */\nexport function buildRetroArchConfig(config: ControlConfig): Record<string, unknown> {\n const raConfig: Record<string, unknown> = {};\n\n // Keyboard controls (player 1 only)\n if (config.keyboard) {\n Object.assign(raConfig, keyboardToRetroArchConfig(config.keyboard, 1));\n }\n\n // Gamepad controls for each player\n if (config.gamepads) {\n config.gamepads.forEach((mapping, index) => {\n if (mapping) {\n Object.assign(raConfig, gamepadToRetroArchConfig(mapping, index + 1));\n }\n });\n }\n\n // Enable analog stick → D-pad for all players\n raConfig.input_player1_analog_dpad_mode = 1;\n raConfig.input_player2_analog_dpad_mode = 1;\n raConfig.input_player3_analog_dpad_mode = 1;\n raConfig.input_player4_analog_dpad_mode = 1;\n\n return raConfig;\n}\n","import { SpeedMultiplier } from '../hooks/useNostalgist';\nimport { ShaderPresetId } from './UI/ShaderSelector';\n// Re-export from unified controls module for backwards compatibility\nimport { KeyboardMapping, DEFAULT_KEYBOARD } from '../lib/controls';\nimport { RACredentials, RAGameExtended, RAAchievement } from '../lib/retroachievements';\nimport { KoinTranslations, RecursivePartial } from '../locales/types';\n\nexport interface SaveSlot {\n slot: number;\n timestamp: string;\n size: number;\n screenshot?: string | null;\n}\n\n/**\n * @deprecated Use `KeyboardMapping` from `@/lib/controls` instead\n */\nexport type ControlMapping = KeyboardMapping;\n\n/**\n * @deprecated Use `DEFAULT_KEYBOARD` from `@/lib/controls` instead\n */\nexport const DEFAULT_CONTROLS = DEFAULT_KEYBOARD;\n\nexport interface GamePlayerProps {\n className?: string;\n style?: React.CSSProperties;\n romId: string;\n romUrl: string;\n romFileName?: string;\n system: string;\n title: string;\n core?: string;\n biosUrl?: string | { url: string; name: string; location?: 'system' | 'rom_folder' };\n\n // Manual BIOS Selection\n availableBios?: { id: string; name: string; description?: string }[];\n currentBiosId?: string;\n onSelectBios?: (biosId: string) => void;\n\n onReady?: () => void;\n onError?: (error: Error) => void;\n onExit?: () => void;\n systemColor?: string; // Console-specific color for theming\n shader?: string; // CRT shader preset (e.g., 'crt/crt-lottes')\n onShaderChange?: (shader: string, requiresRestart: boolean) => void; // Called when user changes shader mid-game\n initialSlot?: number; // Auto-load save from this slot on start\n\n // Save/Load Handlers\n onSaveState?: (slot: number, blob: Blob, screenshot?: string) => Promise<void>;\n onLoadState?: (slot: number) => Promise<Blob | null>;\n onAutoSave?: (blob: Blob, screenshot?: string) => Promise<void>;\n onGetSaveSlots?: () => Promise<SaveSlot[]>;\n onDeleteSaveState?: (slot: number) => Promise<void>;\n initialSaveState?: Blob;\n onScreenshotCaptured?: (image: string | Blob) => void;\n autoSaveInterval?: number; // Time in ms for auto-save (default: 60000)\n\n // Tier Limits\n maxSlots?: number;\n currentTier?: string;\n onUpgrade?: () => void;\n\n // RetroAchievements\n retroAchievementsConfig?: {\n username: string;\n token: string; // User token, not password\n hardcore?: boolean;\n };\n\n // Cheats\n cheats?: Cheat[];\n onToggleCheat?: (cheatId: number, active: boolean) => void;\n\n // Session Management\n onSessionStart?: () => void;\n onSessionEnd?: () => void;\n\n // RetroAchievements UI\n raUser?: RACredentials | null;\n raGame?: RAGameExtended | null;\n raAchievements?: RAAchievement[];\n raUnlockedAchievements?: Set<number>;\n raIsLoading?: boolean;\n raError?: string | null;\n onRALogin?: (username: string, password: string) => Promise<boolean>;\n onRALogout?: () => void;\n onRAHardcoreChange?: (enabled: boolean) => void;\n\n // Internationalization\n translations?: RecursivePartial<KoinTranslations>;\n}\n\nexport interface PlayerControlsProps {\n isPaused: boolean;\n isRunning: boolean; // Whether the game is actually running (vs ready/loading)\n speed: SpeedMultiplier;\n isRewinding: boolean;\n rewindBufferSize: number; // Number of states in rewind buffer\n onPauseToggle: () => void;\n onRestart: () => void;\n onSave: () => void;\n onLoad: () => void;\n onSpeedChange: (speed: SpeedMultiplier) => void;\n onRewindStart: () => void;\n onRewindStop: () => void;\n onScreenshot: () => void;\n onFullscreen: () => void;\n onControls: () => void;\n onCheats: () => void;\n onRetroAchievements: () => void;\n onExit: () => void;\n disabled?: boolean;\n // Hardcore mode restrictions\n hardcoreRestrictions?: RAHardcodeRestrictions;\n raConnected?: boolean;\n raGameFound?: boolean;\n raAchievementCount?: number;\n raIsIdentifying?: boolean;\n // Auto-save indicator\n autoSaveEnabled?: boolean;\n autoSaveProgress?: number; // 0-100, percentage until next auto-save\n autoSaveState?: 'idle' | 'counting' | 'saving' | 'done';\n autoSavePaused?: boolean; // User manually paused auto-save\n onAutoSaveToggle?: () => void; // Toggle auto-save pause\n systemColor?: string; // Console-specific color for theming\n // Gamepad indicator\n gamepadCount?: number; // Number of connected gamepads\n onGamepadSettings?: () => void; // Open gamepad settings modal\n onSettings?: () => void;\n // Volume controls\n volume?: number; // 0-100\n isMuted?: boolean;\n onVolumeChange?: (volume: number) => void;\n onToggleMute?: () => void;\n onShowShortcuts?: () => void; // Toggle shortcuts panel\n // Recording\n onRecordToggle?: () => void;\n isRecording?: boolean;\n // Shader controls\n currentShader?: ShaderPresetId;\n onShaderChange?: (shader: ShaderPresetId, requiresRestart: boolean) => void;\n}\n\nexport interface SaveSlotModalProps {\n isOpen: boolean;\n mode: 'save' | 'load';\n slots: SaveSlot[];\n isLoading: boolean;\n actioningSlot?: number | null;\n onSelect: (slot: number) => void;\n onDelete: (slot: number) => void;\n onClose: () => void;\n // Tier limits for save slots\n maxSlots?: number; // -1 for unlimited\n currentTier?: string;\n onUpgrade?: () => void;\n}\n\nexport interface ControlMapperProps {\n isOpen: boolean;\n controls: ControlMapping;\n onSave: (controls: ControlMapping) => void;\n onClose: () => void;\n system?: string; // Console type for showing only relevant buttons\n}\n\nexport interface CheatModalProps {\n isOpen: boolean;\n cheats: Cheat[];\n activeCheats: Set<number>;\n onToggle: (cheatId: number) => void;\n onClose: () => void;\n}\n\nexport interface Cheat {\n id: number;\n code: string;\n description: string;\n}\n\n// Toast interface removed to avoid duplication with useToast hook\n\n// RetroAchievements types\nexport interface RAHardcodeRestrictions {\n isHardcore?: boolean;\n canUseSaveStates: boolean;\n canUseRewind: boolean;\n canUseCheats: boolean;\n canUseSlowMotion: boolean;\n}\n","/**\n * Utilities for dispatching keyboard events to the emulator canvas\n */\n\nimport { ControlMapping, DEFAULT_CONTROLS } from '../../types';\n\n/**\n * Get keyboard code for a button type from controls mapping\n */\nexport function getKeyboardCode(\n buttonType: string,\n controls?: ControlMapping\n): string | null {\n const key = buttonType as keyof ControlMapping;\n\n if (controls && key in controls && controls[key]) {\n return controls[key]!;\n }\n\n return DEFAULT_CONTROLS[key] ?? null;\n}\n\n/**\n * Derive key name from keyboard code\n */\nexport function getKeyName(code: string): string {\n if (code.startsWith('Key')) return code.slice(3).toLowerCase();\n if (code.startsWith('Arrow')) return code.slice(5);\n if (code === 'Enter') return 'Enter';\n if (code === 'ShiftRight' || code === 'ShiftLeft') return 'Shift';\n return code;\n}\n\n/**\n * Find the emulator canvas element\n */\nexport function getCanvas(): HTMLCanvasElement | null {\n return document.querySelector('.game-canvas-container canvas') as HTMLCanvasElement ||\n document.querySelector('canvas') as HTMLCanvasElement;\n}\n\n/**\n * Dispatch a keyboard event to the emulator canvas\n */\nexport function dispatchKeyboardEvent(\n type: 'keydown' | 'keyup',\n code: string\n): boolean {\n const canvas = getCanvas();\n if (!canvas) {\n return false;\n }\n\n const event = new KeyboardEvent(type, {\n code,\n key: getKeyName(code),\n bubbles: true,\n cancelable: true,\n });\n canvas.dispatchEvent(event);\n return true;\n}\n\n","'use client';\n\nimport React, { useRef, useCallback, useEffect, useState } from 'react';\nimport { dispatchKeyboardEvent } from './utils/keyboardEvents';\nimport { ControlMapping } from '../../lib/controls/types';\n\ninterface DpadProps {\n size?: number;\n x: number;\n y: number;\n containerWidth: number;\n containerHeight: number;\n controls?: ControlMapping;\n systemColor?: string;\n isLandscape?: boolean;\n customPosition?: { x: number; y: number } | null;\n onPositionChange?: (x: number, y: number) => void;\n}\n\ntype Direction = 'up' | 'down' | 'left' | 'right';\n\nconst DRAG_HOLD_DELAY = 350; // ms to hold before drag mode\nconst CENTER_TOUCH_RADIUS = 0.25; // 25% of size - touch area for drag activation\n\n/**\n * Premium D-pad component with drag repositioning\n * - Long-press center to drag\n * - Glassmorphism aesthetics\n * - Individual direction highlighting with glow\n */\nconst Dpad = React.memo(function Dpad({\n size = 180,\n x,\n y,\n containerWidth,\n containerHeight,\n controls,\n systemColor = '#00FF41',\n isLandscape = false,\n customPosition,\n onPositionChange,\n}: DpadProps) {\n const dpadRef = useRef<HTMLDivElement>(null);\n const activeTouchRef = useRef<number | null>(null);\n const activeDirectionsRef = useRef<Set<Direction>>(new Set());\n\n // Drag state\n const [isDragging, setIsDragging] = useState(false);\n const dragTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const dragStartRef = useRef({ x: 0, y: 0, touchX: 0, touchY: 0 });\n const touchStartPosRef = useRef({ x: 0, y: 0, time: 0 });\n\n // Refs for visual elements\n const upPathRef = useRef<SVGPathElement>(null);\n const downPathRef = useRef<SVGPathElement>(null);\n const leftPathRef = useRef<SVGPathElement>(null);\n const rightPathRef = useRef<SVGPathElement>(null);\n const centerCircleRef = useRef<SVGCircleElement>(null);\n\n // Use custom position if provided, otherwise defaults\n const displayX = customPosition ? customPosition.x : x;\n const displayY = customPosition ? customPosition.y : y;\n\n const getKeyCode = useCallback((direction: Direction): string => {\n if (!controls) {\n const defaults: Record<Direction, string> = {\n up: 'ArrowUp',\n down: 'ArrowDown',\n left: 'ArrowLeft',\n right: 'ArrowRight',\n };\n return defaults[direction];\n }\n return controls[direction] || '';\n }, [controls]);\n\n const getDirectionsFromTouch = useCallback((touchX: number, touchY: number, rect: DOMRect): Set<Direction> => {\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const dx = touchX - centerX;\n const dy = touchY - centerY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const deadZone = (rect.width / 2) * 0.15;\n\n if (distance < deadZone) return new Set();\n\n const directions = new Set<Direction>();\n const angle = Math.atan2(dy, dx) * (180 / Math.PI);\n\n if (angle >= -150 && angle <= -30) directions.add('up');\n if (angle >= 30 && angle <= 150) directions.add('down');\n if (angle >= 120 || angle <= -120) directions.add('left');\n if (angle >= -60 && angle <= 60) directions.add('right');\n\n return directions;\n }, []);\n\n const updateVisuals = useCallback((directions: Set<Direction>) => {\n const activeFill = `${systemColor}80`;\n const inactiveFill = 'rgba(255, 255, 255, 0.05)';\n const activeStroke = systemColor;\n const inactiveStroke = 'rgba(255, 255, 255, 0.2)';\n const glow = `0 0 15px ${systemColor}`;\n\n const updatePart = (ref: React.RefObject<SVGPathElement>, isActive: boolean) => {\n if (ref.current) {\n ref.current.style.fill = isActive ? activeFill : inactiveFill;\n ref.current.style.stroke = isActive ? activeStroke : inactiveStroke;\n ref.current.style.filter = isActive ? `drop-shadow(${glow})` : 'none';\n ref.current.style.transform = isActive ? 'scale(0.98)' : 'scale(1)';\n ref.current.style.transformOrigin = 'center';\n }\n };\n\n updatePart(upPathRef, directions.has('up'));\n updatePart(downPathRef, directions.has('down'));\n updatePart(leftPathRef, directions.has('left'));\n updatePart(rightPathRef, directions.has('right'));\n\n if (centerCircleRef.current) {\n const isAny = directions.size > 0;\n centerCircleRef.current.style.fill = isAny ? systemColor : 'rgba(0,0,0,0.5)';\n centerCircleRef.current.style.stroke = isAny ? '#fff' : 'rgba(255,255,255,0.3)';\n }\n }, [systemColor]);\n\n const updateDirections = useCallback((newDirections: Set<Direction>) => {\n const prev = activeDirectionsRef.current;\n\n prev.forEach(dir => {\n if (!newDirections.has(dir)) {\n const keyCode = getKeyCode(dir);\n if (keyCode) dispatchKeyboardEvent('keyup', keyCode);\n }\n });\n\n newDirections.forEach(dir => {\n if (!prev.has(dir)) {\n const keyCode = getKeyCode(dir);\n if (keyCode) {\n if (navigator.vibrate) navigator.vibrate(5);\n dispatchKeyboardEvent('keydown', keyCode);\n }\n }\n });\n\n activeDirectionsRef.current = newDirections;\n updateVisuals(newDirections);\n }, [getKeyCode, updateVisuals]);\n\n const clearDragTimer = useCallback(() => {\n if (dragTimerRef.current) {\n clearTimeout(dragTimerRef.current);\n dragTimerRef.current = null;\n }\n }, []);\n\n const startDragging = useCallback((touchX: number, touchY: number) => {\n setIsDragging(true);\n dragStartRef.current = {\n x: displayX,\n y: displayY,\n touchX,\n touchY,\n };\n // Release all directions when entering drag mode\n activeDirectionsRef.current.forEach(dir => {\n const keyCode = getKeyCode(dir);\n if (keyCode) dispatchKeyboardEvent('keyup', keyCode);\n });\n activeDirectionsRef.current = new Set();\n updateVisuals(new Set());\n\n if (navigator.vibrate) navigator.vibrate([10, 30, 10]); // Distinct drag feedback\n }, [displayX, displayY, getKeyCode, updateVisuals]);\n\n const handleTouchStart = useCallback((e: TouchEvent) => {\n e.preventDefault();\n if (activeTouchRef.current !== null) return;\n\n const touch = e.changedTouches[0];\n activeTouchRef.current = touch.identifier;\n touchStartPosRef.current = { x: touch.clientX, y: touch.clientY, time: Date.now() };\n\n const rect = dpadRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n // Check if touch is on center (for drag)\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const distFromCenter = Math.sqrt(\n Math.pow(touch.clientX - centerX, 2) +\n Math.pow(touch.clientY - centerY, 2)\n );\n const centerRadius = size * CENTER_TOUCH_RADIUS;\n\n if (distFromCenter < centerRadius && onPositionChange) {\n // Start drag timer for center touch\n dragTimerRef.current = setTimeout(() => {\n startDragging(touch.clientX, touch.clientY);\n }, DRAG_HOLD_DELAY);\n }\n\n // Normal direction detection\n if (!isDragging) {\n updateDirections(getDirectionsFromTouch(touch.clientX, touch.clientY, rect));\n }\n }, [getDirectionsFromTouch, updateDirections, isDragging, size, onPositionChange, startDragging]);\n\n const handleTouchMove = useCallback((e: TouchEvent) => {\n e.preventDefault();\n\n let touch: Touch | null = null;\n for (let i = 0; i < e.changedTouches.length; i++) {\n if (e.changedTouches[i].identifier === activeTouchRef.current) {\n touch = e.changedTouches[i];\n break;\n }\n }\n if (!touch) return;\n\n if (isDragging && onPositionChange) {\n // Handle drag movement\n const deltaX = touch.clientX - dragStartRef.current.touchX;\n const deltaY = touch.clientY - dragStartRef.current.touchY;\n\n const newXPercent = dragStartRef.current.x + (deltaX / containerWidth) * 100;\n const newYPercent = dragStartRef.current.y + (deltaY / containerHeight) * 100;\n\n // Constrain to screen bounds\n const margin = (size / 2 / Math.min(containerWidth, containerHeight)) * 100;\n const constrainedX = Math.max(margin, Math.min(100 - margin, newXPercent));\n const constrainedY = Math.max(margin, Math.min(100 - margin, newYPercent));\n\n onPositionChange(constrainedX, constrainedY);\n } else {\n // Check if moved significantly - cancel drag timer\n const moveDistance = Math.sqrt(\n Math.pow(touch.clientX - touchStartPosRef.current.x, 2) +\n Math.pow(touch.clientY - touchStartPosRef.current.y, 2)\n );\n if (moveDistance > 15) {\n clearDragTimer();\n }\n\n // Normal direction detection\n const rect = dpadRef.current?.getBoundingClientRect();\n if (rect) {\n updateDirections(getDirectionsFromTouch(touch.clientX, touch.clientY, rect));\n }\n }\n }, [isDragging, onPositionChange, containerWidth, containerHeight, size, getDirectionsFromTouch, updateDirections, clearDragTimer]);\n\n const handleTouchEnd = useCallback((e: TouchEvent) => {\n e.preventDefault();\n clearDragTimer();\n\n let touchEnded = false;\n for (let i = 0; i < e.changedTouches.length; i++) {\n if (e.changedTouches[i].identifier === activeTouchRef.current) {\n touchEnded = true;\n break;\n }\n }\n\n if (touchEnded) {\n activeTouchRef.current = null;\n\n if (isDragging) {\n setIsDragging(false);\n } else {\n // Release all directions\n activeDirectionsRef.current.forEach(dir => {\n const keyCode = getKeyCode(dir);\n if (keyCode) dispatchKeyboardEvent('keyup', keyCode);\n });\n activeDirectionsRef.current = new Set();\n updateVisuals(new Set());\n }\n }\n }, [getKeyCode, updateVisuals, isDragging, clearDragTimer]);\n\n useEffect(() => {\n const dpad = dpadRef.current;\n if (!dpad) return;\n\n dpad.addEventListener('touchstart', handleTouchStart, { passive: false });\n dpad.addEventListener('touchmove', handleTouchMove, { passive: false });\n dpad.addEventListener('touchend', handleTouchEnd, { passive: false });\n dpad.addEventListener('touchcancel', handleTouchEnd, { passive: false });\n\n return () => {\n dpad.removeEventListener('touchstart', handleTouchStart);\n dpad.removeEventListener('touchmove', handleTouchMove);\n dpad.removeEventListener('touchend', handleTouchEnd);\n dpad.removeEventListener('touchcancel', handleTouchEnd);\n clearDragTimer();\n };\n }, [handleTouchStart, handleTouchMove, handleTouchEnd, clearDragTimer]);\n\n const leftPx = (displayX / 100) * containerWidth - size / 2;\n const topPx = (displayY / 100) * containerHeight - size / 2;\n\n const dUp = \"M 35,5 L 65,5 L 65,35 L 50,50 L 35,35 Z\";\n const dRight = \"M 65,35 L 95,35 L 95,65 L 65,65 L 50,50 Z\";\n const dDown = \"M 65,65 L 65,95 L 35,95 L 35,65 L 50,50 Z\";\n const dLeft = \"M 35,65 L 5,65 L 5,35 L 35,35 L 50,50 Z\";\n\n return (\n <div\n ref={dpadRef}\n className={`absolute pointer-events-auto touch-manipulation select-none ${isDragging ? 'opacity-60' : ''}`}\n style={{\n top: 0,\n left: 0,\n transform: `translate3d(${leftPx}px, ${topPx}px, 0)${isDragging ? ' scale(1.05)' : ''}`,\n width: size,\n height: size,\n opacity: isLandscape ? 0.75 : 0.9,\n WebkitTouchCallout: 'none',\n WebkitUserSelect: 'none',\n touchAction: 'none',\n transition: isDragging ? 'none' : 'transform 0.1s ease-out',\n }}\n >\n {/* Base layer */}\n <div className={`absolute inset-0 rounded-full bg-black/40 backdrop-blur-md border shadow-lg ${isDragging ? 'border-white/50 ring-2 ring-white/30' : 'border-white/10'}`} />\n\n <svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" className=\"drop-shadow-xl relative z-10\">\n <path ref={upPathRef} d={dUp} fill=\"rgba(255,255,255,0.05)\" stroke=\"rgba(255,255,255,0.2)\" strokeWidth=\"1\" className=\"transition-all duration-75\" />\n <path ref={rightPathRef} d={dRight} fill=\"rgba(255,255,255,0.05)\" stroke=\"rgba(255,255,255,0.2)\" strokeWidth=\"1\" className=\"transition-all duration-75\" />\n <path ref={downPathRef} d={dDown} fill=\"rgba(255,255,255,0.05)\" stroke=\"rgba(255,255,255,0.2)\" strokeWidth=\"1\" className=\"transition-all duration-75\" />\n <path ref={leftPathRef} d={dLeft} fill=\"rgba(255,255,255,0.05)\" stroke=\"rgba(255,255,255,0.2)\" strokeWidth=\"1\" className=\"transition-all duration-75\" />\n\n {/* Center Pivot - drag handle */}\n <circle\n ref={centerCircleRef}\n cx=\"50\" cy=\"50\" r=\"12\"\n fill={isDragging ? systemColor : 'rgba(0,0,0,0.5)'}\n stroke={isDragging ? '#fff' : 'rgba(255,255,255,0.3)'}\n strokeWidth={isDragging ? 2 : 1}\n />\n\n {/* Arrow icons */}\n <path d=\"M 50,15 L 50,25 M 45,20 L 50,15 L 55,20\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\" opacity=\"0.8\" pointerEvents=\"none\" />\n <path d=\"M 50,85 L 50,75 M 45,80 L 50,85 L 55,80\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\" opacity=\"0.8\" pointerEvents=\"none\" />\n <path d=\"M 15,50 L 25,50 M 20,45 L 15,50 L 20,55\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\" opacity=\"0.8\" pointerEvents=\"none\" />\n <path d=\"M 85,50 L 75,50 M 80,45 L 85,50 L 80,55\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\" opacity=\"0.8\" pointerEvents=\"none\" />\n </svg>\n </div>\n );\n});\n\nexport default Dpad;\n","/**\n * Positioning adjustments for virtual controller buttons\n * Layouts define base positions; this module applies minor runtime adjustments.\n */\n\nimport { ButtonConfig } from './layouts';\n\nexport interface PositioningContext {\n isFullscreen: boolean;\n}\n\n/**\n * Apply minor adjustments to button config\n * Currently: enlarge buttons slightly in fullscreen mode\n */\nexport function adjustButtonPosition(\n config: ButtonConfig,\n context: PositioningContext\n): ButtonConfig {\n const sizeMultiplier = context.isFullscreen ? 1.1 : 1.0;\n\n return {\n ...config,\n size: Math.floor(config.size * sizeMultiplier),\n };\n}\n","/**\n * Hook to manage custom button positions (for draggable buttons)\n * Persists to localStorage with separate storage for landscape and portrait\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { ButtonType } from './layouts';\n\nexport type ButtonPositions = Partial<Record<ButtonType, { x: number; y: number }>>;\n\ninterface StoredPositions {\n landscape: ButtonPositions;\n portrait: ButtonPositions;\n}\n\nconst STORAGE_KEY = 'virtual-button-positions';\n\nexport function useButtonPositions() {\n const [landscapePositions, setLandscapePositions] = useState<ButtonPositions>({});\n const [portraitPositions, setPortraitPositions] = useState<ButtonPositions>({});\n\n // Load positions from localStorage\n useEffect(() => {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const parsed: StoredPositions = JSON.parse(stored);\n // Handle migration from old format (single positions object)\n if (parsed.landscape && parsed.portrait) {\n setLandscapePositions(parsed.landscape);\n setPortraitPositions(parsed.portrait);\n } else {\n // Old format - treat as landscape positions\n setLandscapePositions(parsed as any);\n }\n }\n } catch (e) {\n console.error('Failed to load button positions:', e);\n }\n }, []);\n\n // Save position for a button (orientation-specific)\n const savePosition = useCallback((\n buttonType: ButtonType,\n x: number,\n y: number,\n isLandscape: boolean\n ) => {\n if (isLandscape) {\n setLandscapePositions((prev) => {\n const updated = { ...prev, [buttonType]: { x, y } };\n try {\n const stored: StoredPositions = {\n landscape: updated,\n portrait: portraitPositions,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(stored));\n } catch (e) {\n console.error('Failed to save button position:', e);\n }\n return updated;\n });\n } else {\n setPortraitPositions((prev) => {\n const updated = { ...prev, [buttonType]: { x, y } };\n try {\n const stored: StoredPositions = {\n landscape: landscapePositions,\n portrait: updated,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(stored));\n } catch (e) {\n console.error('Failed to save button position:', e);\n }\n return updated;\n });\n }\n }, [landscapePositions, portraitPositions]);\n\n // Get position for a button (orientation-specific)\n const getPosition = useCallback((\n buttonType: ButtonType,\n isLandscape: boolean\n ): { x: number; y: number } | null => {\n const positions = isLandscape ? landscapePositions : portraitPositions;\n return positions[buttonType] || null;\n }, [landscapePositions, portraitPositions]);\n\n // Reset all positions\n const resetPositions = useCallback(() => {\n setLandscapePositions({});\n setPortraitPositions({});\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch (e) {\n console.error('Failed to reset button positions:', e);\n }\n }, []);\n\n return {\n landscapePositions,\n portraitPositions,\n savePosition,\n getPosition,\n resetPositions,\n };\n}\n\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport { Move } from 'lucide-react';\n\nconst STORAGE_KEY = 'koin-controls-hint-shown';\n\ninterface ControlsHintProps {\n isVisible: boolean;\n}\n\n/**\n * First-time hint overlay that teaches users about control repositioning\n * Only shows once, stores flag in sessionStorage\n */\nexport default function ControlsHint({ isVisible }: ControlsHintProps) {\n const [show, setShow] = useState(false);\n\n useEffect(() => {\n if (!isVisible) return;\n\n // Check if hint was already shown\n try {\n const wasShown = sessionStorage.getItem(STORAGE_KEY);\n if (!wasShown) {\n // Delay showing to let user see the controls first\n const timer = setTimeout(() => setShow(true), 1500);\n return () => clearTimeout(timer);\n }\n } catch {\n // sessionStorage not available\n }\n }, [isVisible]);\n\n const handleDismiss = () => {\n setShow(false);\n try {\n sessionStorage.setItem(STORAGE_KEY, 'true');\n } catch {\n // sessionStorage not available\n }\n };\n\n if (!show) return null;\n\n return (\n <div\n className=\"fixed inset-0 z-[100] flex items-center justify-center bg-black/60 backdrop-blur-sm\"\n onClick={handleDismiss}\n onTouchEnd={handleDismiss}\n >\n <div\n className=\"bg-black/90 border border-white/30 rounded-2xl p-6 mx-4 max-w-sm text-center shadow-2xl pointer-events-auto\"\n onClick={(e) => e.stopPropagation()}\n onTouchEnd={(e) => e.stopPropagation()}\n >\n <div className=\"flex justify-center mb-4\">\n <div className=\"w-16 h-16 rounded-full bg-green-500/20 border-2 border-green-400 flex items-center justify-center\">\n <Move size={32} className=\"text-green-400\" />\n </div>\n </div>\n\n <h3 className=\"text-white text-lg font-bold mb-2\">\n Customize Your Controls\n </h3>\n\n <p className=\"text-white/70 text-sm mb-4\">\n <strong className=\"text-white\">Long-press</strong> any button or the <strong className=\"text-white\">D-pad center</strong> to drag and reposition it.\n </p>\n\n <p className=\"text-white/50 text-xs mb-4\">\n Your layout is saved separately for portrait and landscape modes.\n </p>\n\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleDismiss();\n }}\n onTouchEnd={(e) => {\n e.stopPropagation();\n handleDismiss();\n }}\n className=\"w-full py-3 px-4 bg-green-500 hover:bg-green-400 active:bg-green-600 text-black font-bold rounded-xl transition-colors flex items-center justify-center gap-2 cursor-pointer touch-manipulation\"\n >\n Got it!\n </button>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport { useMobile } from '../../hooks/useMobile';\nimport { getLayoutForSystem } from './layouts';\nimport VirtualButton from './VirtualButton';\nimport Dpad from './Dpad';\nimport { ControlMapping } from '../../lib/controls/types';\nimport { adjustButtonPosition, PositioningContext } from './positioning';\nimport { useButtonPositions } from './useButtonPositions';\nimport { getKeyboardCode, dispatchKeyboardEvent } from './utils/keyboardEvents';\nimport {\n isFullscreen,\n setupFullscreenListener,\n getViewportSize,\n createOrientationChangeHandler,\n} from './utils/viewport';\nimport ControlsHint from './ControlsHint';\n\nexport interface VirtualControllerProps {\n system: string;\n isRunning: boolean;\n controls?: ControlMapping;\n systemColor?: string; // Console-specific color for theming\n}\n\n/**\n * Virtual gamepad controller for mobile devices\n * Renders console-specific button layouts and handles touch input\n */\nexport default function VirtualController({\n system,\n isRunning,\n controls,\n systemColor = '#00FF41', // Default retro green\n}: VirtualControllerProps) {\n const { isMobile, isLandscape, isPortrait } = useMobile();\n const [pressedButtons, setPressedButtons] = useState<Set<string>>(new Set());\n const [containerSize, setContainerSize] = useState({ width: 0, height: 0 });\n const [isFullscreenState, setIsFullscreenState] = useState(false);\n const { getPosition, savePosition } = useButtonPositions();\n\n // Get layout for current system\n const layout = getLayoutForSystem(system);\n\n // Filter buttons based on orientation\n const visibleButtons = layout.buttons.filter((btn) => {\n if (isPortrait) {\n return btn.showInPortrait;\n }\n return btn.showInLandscape;\n });\n\n // Separate D-pad buttons from other buttons (though we rely on the Dpad component for directions)\n // We keep them in the layout definition for completeness or future fallback\n const DPAD_TYPES = ['up', 'down', 'left', 'right'];\n\n // NOTE: Unlike before, we don't render individual d-pad buttons from the layout array.\n // The Dpad component handles all directional input.\n\n // Update container size and fullscreen state\n useEffect(() => {\n const updateSize = () => {\n const { width, height } = getViewportSize();\n setContainerSize({ width, height });\n setIsFullscreenState(isFullscreen());\n };\n\n // Initial size\n updateSize();\n\n // Handle resize\n const handleResize = () => updateSize();\n\n // Check if viewport is ready (has valid dimensions)\n const checkViewportReady = (): boolean => {\n const { width, height } = getViewportSize();\n return width > 0 && height > 0;\n };\n\n // Handle orientation change with iOS-specific timing\n const handleOrientationChange = createOrientationChangeHandler(\n updateSize,\n checkViewportReady,\n 3 // maxRafs\n );\n\n // Handle fullscreen changes\n const handleFullscreenChange = () => updateSize();\n\n // Listen to visual viewport changes (iOS Safari address bar show/hide)\n const handleVisualViewportResize = () => {\n // Only update if it's a significant change (not just address bar)\n const { height } = getViewportSize();\n const heightDiff = Math.abs(height - containerSize.height);\n if (heightDiff > 50) { // Threshold to ignore small address bar changes\n updateSize();\n }\n };\n\n window.addEventListener('resize', handleResize);\n window.addEventListener('orientationchange', handleOrientationChange);\n\n // Visual viewport API (iOS Safari address bar handling)\n if (window.visualViewport) {\n window.visualViewport.addEventListener('resize', handleVisualViewportResize);\n window.visualViewport.addEventListener('scroll', handleVisualViewportResize);\n }\n\n // Use centralized fullscreen listener utility\n const cleanupFullscreen = setupFullscreenListener(handleFullscreenChange);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n window.removeEventListener('orientationchange', handleOrientationChange);\n if (window.visualViewport) {\n window.visualViewport.removeEventListener('resize', handleVisualViewportResize);\n window.visualViewport.removeEventListener('scroll', handleVisualViewportResize);\n }\n cleanupFullscreen();\n };\n }, [containerSize.height]); // Include containerSize.height to check for significant changes\n\n // Get keyboard code for button type\n const getButtonKeyboardCode = useCallback(\n (buttonType: string): string | null => {\n return getKeyboardCode(buttonType, controls);\n },\n [controls]\n );\n\n // System buttons that work with tap (press + release)\n const SYSTEM_BUTTONS = ['start', 'select', 'menu'];\n\n // Handle system buttons (start/select) - tap to press and release\n const handlePress = useCallback(\n (buttonType: string) => {\n // System buttons work as long as emulator exists\n // Game buttons only work when game is running\n const isSystemButton = SYSTEM_BUTTONS.includes(buttonType);\n if (!isSystemButton && !isRunning) {\n return;\n }\n\n const keyboardCode = getButtonKeyboardCode(buttonType);\n if (!keyboardCode) {\n return;\n }\n\n // Add to pressed set for visual feedback\n setPressedButtons((prev) => new Set(prev).add(buttonType));\n\n // Dispatch keydown\n dispatchKeyboardEvent('keydown', keyboardCode);\n\n // Dispatch keyup after a delay (simulates a tap)\n setTimeout(() => {\n dispatchKeyboardEvent('keyup', keyboardCode);\n setPressedButtons((prev) => {\n const next = new Set(prev);\n next.delete(buttonType);\n return next;\n });\n }, 100);\n },\n [isRunning, getButtonKeyboardCode]\n );\n\n // Handle game buttons (D-pad, A, B, etc.) - hold for continuous input\n const handlePressDown = useCallback(\n (buttonType: string) => {\n if (!isRunning) return;\n\n // System buttons use handlePress() instead\n const isSystemButton = SYSTEM_BUTTONS.includes(buttonType);\n if (isSystemButton) return;\n\n const keyboardCode = getButtonKeyboardCode(buttonType);\n if (!keyboardCode) return;\n\n // Optimization: Only update state if not already pressed to avoid re-renders\n setPressedButtons((prev) => {\n if (prev.has(buttonType)) return prev;\n const next = new Set(prev);\n next.add(buttonType);\n return next;\n });\n dispatchKeyboardEvent('keydown', keyboardCode);\n },\n [isRunning, getButtonKeyboardCode]\n );\n\n const handleRelease = useCallback(\n (buttonType: string) => {\n // System buttons use handlePress() instead\n const isSystemButton = SYSTEM_BUTTONS.includes(buttonType);\n if (isSystemButton) return;\n\n const keyboardCode = getButtonKeyboardCode(buttonType);\n if (!keyboardCode) return;\n\n // Optimization: Only update state if actually pressed\n setPressedButtons((prev) => {\n if (!prev.has(buttonType)) return prev;\n const next = new Set(prev);\n next.delete(buttonType);\n return next;\n });\n dispatchKeyboardEvent('keyup', keyboardCode);\n },\n [getButtonKeyboardCode]\n );\n\n // Release all buttons when game stops (only non-system buttons)\n useEffect(() => {\n if (!isRunning && pressedButtons.size > 0) {\n pressedButtons.forEach((buttonType) => {\n if (!SYSTEM_BUTTONS.includes(buttonType)) {\n handleRelease(buttonType);\n }\n });\n setPressedButtons(new Set());\n }\n }, [isRunning, pressedButtons, handleRelease]);\n\n // Optimize: Memoize button configurations to prevent creating new objects on every render\n const memoizedButtonElements = useMemo(() => {\n // Use window dimensions if container size not yet calculated\n const width = containerSize.width || (typeof window !== 'undefined' ? window.innerWidth : 0);\n const height = containerSize.height || (typeof window !== 'undefined' ? window.innerHeight : 0);\n\n const context: PositioningContext = {\n isFullscreen: isFullscreenState,\n };\n\n return visibleButtons.map((buttonConfig) => {\n const adjustedConfig = adjustButtonPosition(buttonConfig, context);\n const customPosition = getPosition(buttonConfig.type, isLandscape);\n\n return {\n buttonConfig,\n adjustedConfig,\n customPosition,\n width,\n height\n };\n });\n }, [visibleButtons, containerSize, isLandscape, isFullscreenState, getPosition]); // Dependencies that actually change layout\n\n // Don't render on desktop\n if (!isMobile) {\n return null;\n }\n\n // Responsive sizing for D-pad\n const dpadSize = containerSize.width > containerSize.height ? 160 : 180;\n const dpadY = containerSize.width > containerSize.height ? 55 : 62;\n\n // For Neo Geo, D-pad might need to be slightly higher to avoid overlap if 4 buttons are curved\n const finalDpadY = system.toUpperCase() === 'NEOGEO' ? dpadY - 5 : dpadY;\n\n return (\n <div\n className=\"fixed inset-0 z-30 pointer-events-none\"\n style={{ touchAction: 'none' }}\n >\n {/* Unified D-pad */}\n <Dpad\n size={dpadSize}\n x={14}\n y={finalDpadY}\n containerWidth={containerSize.width || window.innerWidth}\n containerHeight={containerSize.height || window.innerHeight}\n controls={controls}\n systemColor={systemColor}\n isLandscape={isLandscape}\n customPosition={getPosition('up', isLandscape)} // 'up' acts as dpad position key\n onPositionChange={(x, y) => savePosition('up', x, y, isLandscape)}\n />\n\n {/* Other buttons (A, B, Start, Select, etc.) */}\n {memoizedButtonElements\n .filter(({ buttonConfig }) => !DPAD_TYPES.includes(buttonConfig.type))\n .map(({ buttonConfig, adjustedConfig, customPosition, width, height }) => (\n <VirtualButton\n key={buttonConfig.type}\n config={adjustedConfig}\n isPressed={pressedButtons.has(buttonConfig.type)}\n onPress={handlePress}\n onPressDown={handlePressDown}\n onRelease={handleRelease}\n containerWidth={width}\n containerHeight={height}\n customPosition={customPosition}\n onPositionChange={(x, y) => savePosition(buttonConfig.type, x, y, isLandscape)}\n isLandscape={isLandscape}\n console={layout.console} // Important: pass the specific console for styling\n />))}\n\n {/* First-time hint */}\n <ControlsHint isVisible={isRunning} />\n </div>\n );\n}\n","'use client';\n\nimport { Minimize2, X } from 'lucide-react';\n\ninterface FloatingExitButtonProps {\n onClick: () => void;\n disabled?: boolean;\n}\n\n/**\n * Floating exit button that appears in fullscreen mode\n * Styled to match FloatingFullscreenButton for consistency\n */\nexport default function FloatingExitButton({ onClick, disabled = false }: FloatingExitButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`\n fixed top-3 right-3 z-50\n px-3 py-2 rounded-xl\n bg-black/80 backdrop-blur-md\n border-2 border-red-400/60\n shadow-xl\n flex items-center gap-2\n transition-all duration-300\n hover:bg-red-600/30 hover:border-red-400 hover:scale-105\n active:scale-95\n disabled:opacity-40 disabled:cursor-not-allowed\n touch-manipulation\n `}\n style={{\n paddingTop: 'max(env(safe-area-inset-top, 0px), 8px)'\n }}\n aria-label=\"Exit fullscreen\"\n >\n <X size={16} className=\"text-red-400\" />\n <span className=\"text-white text-xs font-bold uppercase tracking-wider\">\n Exit\n </span>\n <Minimize2 size={14} className=\"text-white/60\" />\n </button>\n );\n}\n","'use client';\n\nimport { Maximize, Gamepad2 } from 'lucide-react';\nimport { useState, useEffect } from 'react';\n\ninterface FloatingFullscreenButtonProps {\n onClick: () => void;\n disabled?: boolean;\n}\n\n/**\n * Floating fullscreen prompt for mobile devices\n * Shows prominently with clear messaging that controls appear in fullscreen\n */\nexport default function FloatingFullscreenButton({ onClick, disabled = false }: FloatingFullscreenButtonProps) {\n const [pulse, setPulse] = useState(true);\n\n // Stop pulsing after 5 seconds\n useEffect(() => {\n const timer = setTimeout(() => setPulse(false), 5000);\n return () => clearTimeout(timer);\n }, []);\n\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`\n absolute top-3 left-3 z-50\n px-3 py-2 rounded-xl\n bg-black/80 backdrop-blur-md\n border-2 border-white/60\n shadow-xl\n flex items-center gap-2\n transition-all duration-300\n hover:bg-white/20 hover:border-white hover:scale-105\n active:scale-95\n disabled:opacity-40 disabled:cursor-not-allowed\n touch-manipulation\n ${pulse ? 'animate-pulse border-green-400/80' : ''}\n `}\n aria-label=\"Tap for fullscreen controls\"\n >\n <Gamepad2 size={18} className=\"text-green-400\" />\n <span className=\"text-white text-xs font-bold uppercase tracking-wider whitespace-nowrap\">\n Tap for Controls\n </span>\n <Maximize size={14} className=\"text-white/60\" />\n </button>\n );\n}\n","import { AlertTriangle, Loader2, Save, Play } from 'lucide-react';\nimport { EmulatorStatus } from '../../hooks/useNostalgist';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ninterface GameOverlayProps {\n status: EmulatorStatus;\n system?: string;\n error?: string | null;\n isPaused: boolean;\n onStart: () => void;\n systemColor?: string;\n pendingSlot?: number; // If set, indicates a save will be loaded on start\n isLoadingSave?: boolean; // If true, shows loading indicator for save\n onSelectBios?: () => void;\n}\n\n// Unified loading spinner component\nfunction LoadingSpinner({ color, size = 'lg' }: { color: string; size?: 'sm' | 'lg' }) {\n const sizeClass = size === 'lg' ? 'w-12 h-12' : 'w-8 h-8';\n return <Loader2 className={`${sizeClass} animate-spin`} style={{ color }} />;\n}\n\nexport default function GameOverlay({\n status,\n system,\n error,\n isPaused,\n onStart,\n systemColor = '#00FF41',\n pendingSlot,\n isLoadingSave,\n onSelectBios,\n}: GameOverlayProps) {\n const t = useKoinTranslation();\n\n // Unified Loading Overlay - covers both emulator init and save fetching\n const isLoading = status === 'loading' || (status === 'ready' && isLoadingSave);\n\n if (isLoading) {\n const message = status === 'loading'\n ? { title: t.overlay.loading.replace('{{system}}', system || ''), subtitle: t.overlay.initializing }\n : { title: t.overlay.loadingSave, subtitle: t.overlay.preparingSlot.replace('{{num}}', String(pendingSlot || '')) };\n\n return (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black z-20\">\n <div className=\"flex flex-col items-center gap-4\">\n <LoadingSpinner color={systemColor} size=\"lg\" />\n <div className=\"text-center\">\n <p className=\"font-mono uppercase tracking-widest text-sm\" style={{ color: systemColor }}>\n {message.title}\n </p>\n <p className=\"text-xs mt-1 text-gray-500\">{message.subtitle}</p>\n </div>\n </div>\n </div>\n );\n }\n\n // Ready - Press to Start Overlay\n if (status === 'ready') {\n const hasPendingSave = Boolean(pendingSlot);\n\n return (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/95 z-20\">\n <button\n onClick={onStart}\n className=\"group flex flex-col items-center gap-3 p-6 rounded-xl border-2 transition-all cursor-pointer hover:scale-105\"\n style={{\n backgroundColor: `${systemColor}10`,\n borderColor: `${systemColor}40`,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = systemColor;\n e.currentTarget.style.backgroundColor = `${systemColor}20`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = `${systemColor}40`;\n e.currentTarget.style.backgroundColor = `${systemColor}10`;\n }}\n >\n <div\n className=\"w-16 h-16 rounded-full flex items-center justify-center\"\n style={{ backgroundColor: `${systemColor}20` }}\n >\n <Play className=\"w-8 h-8 ml-1\" style={{ color: systemColor }} fill={systemColor} />\n </div>\n <span className=\"font-mono text-lg uppercase tracking-wider\" style={{ color: systemColor }}>\n {t.overlay.play}\n </span>\n {hasPendingSave && (\n <span className=\"text-gray-400 text-xs flex items-center gap-1\">\n <Save size={12} /> {t.overlay.slotReady.replace('{{num}}', String(pendingSlot))}\n </span>\n )}\n </button>\n\n {onSelectBios && (\n <button\n onClick={onSelectBios}\n className=\"mt-6 flex items-center gap-2 px-4 py-2 rounded-lg text-sm text-gray-400 hover:text-white hover:bg-white/10 transition-colors\"\n >\n <div className=\"w-2 h-2 rounded-full\" style={{ backgroundColor: systemColor }} />\n <span className=\"font-mono uppercase tracking-wider text-xs\">\n {t.overlay.systemFirmware}\n </span>\n </button>\n )}\n </div>\n );\n }\n\n // Error Overlay\n if (status === 'error') {\n return (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/90 z-20\">\n <div className=\"flex flex-col items-center gap-4\">\n <AlertTriangle className=\"w-12 h-12 text-red-500\" />\n <div className=\"text-center\">\n <p className=\"text-red-400 font-mono uppercase tracking-widest text-sm\">\n {t.overlay.systemError}\n </p>\n <p className=\"text-gray-500 text-xs mt-1 max-w-xs\">\n {error || t.overlay.failedInit}\n </p>\n </div>\n <button\n onClick={onStart}\n className=\"mt-2 px-4 py-2 text-sm font-bold rounded-lg transition-colors\"\n style={{ backgroundColor: systemColor, color: '#000' }}\n >\n {t.overlay.retry}\n </button>\n </div>\n </div>\n );\n }\n\n // Paused Overlay\n if (isPaused && status === 'paused') {\n return (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50 z-20\">\n <div className=\"flex flex-col items-center gap-3\">\n <div\n className=\"w-16 h-16 rounded-full border-3 flex items-center justify-center\"\n style={{ borderColor: systemColor }}\n >\n <div className=\"flex gap-1.5\">\n <div className=\"w-2.5 h-8 rounded-sm\" style={{ backgroundColor: systemColor }} />\n <div className=\"w-2.5 h-8 rounded-sm\" style={{ backgroundColor: systemColor }} />\n </div>\n </div>\n <p className=\"font-mono uppercase tracking-wider text-sm\" style={{ color: systemColor }}>\n {t.overlay.paused}\n </p>\n </div>\n </div>\n );\n }\n\n return null;\n}\n\n","import { RefObject } from 'react';\n\nexport function suppressEmulatorWarnings() {\n // Suppress harmless warnings from Emscripten/RetroArch\n const originalWarn = console.warn;\n const originalError = console.error;\n\n const shouldSuppress = (arg: any) => {\n if (typeof arg !== 'string') return false;\n return (\n arg.includes('FS.syncfs') ||\n arg.includes('AL_INVALID_VALUE') ||\n arg.includes('GL_INVALID_VALUE') ||\n arg.includes('Canvas size should be set using CSS properties!')\n );\n };\n\n console.warn = (...args) => {\n if (shouldSuppress(args[0])) return;\n originalWarn.apply(console, args);\n };\n\n console.error = (...args) => {\n if (shouldSuppress(args[0])) return;\n originalError.apply(console, args);\n };\n}\n\nexport function setupCanvasResize(\n containerRef: RefObject<HTMLDivElement>\n) {\n if (!containerRef.current) return;\n\n // Nostalgist handles canvas resolution internally based on CSS size\n // We just need to ensure the container is properly sized\n // Emscripten/RetroArch will fill the canvas based on CSS width/height: 100%\n}\n\n// Volume persistence\nconst VOLUME_KEY = 'retro-player-volume';\nconst MUTE_KEY = 'retro-player-muted';\n\nexport function loadVolume(): number {\n if (typeof window === 'undefined') return 100;\n const saved = localStorage.getItem(VOLUME_KEY);\n return saved ? parseInt(saved, 10) : 100;\n}\n\nexport function saveVolume(volume: number) {\n if (typeof window === 'undefined') return;\n localStorage.setItem(VOLUME_KEY, volume.toString());\n}\n\nexport function loadMuteState(): boolean {\n if (typeof window === 'undefined') return false;\n return localStorage.getItem(MUTE_KEY) === 'true';\n}\n\nexport function saveMuteState(muted: boolean) {\n if (typeof window === 'undefined') return;\n localStorage.setItem(MUTE_KEY, muted.toString());\n}\n","import { useEffect, useRef, memo } from 'react';\nimport GameOverlay from './Overlays/GameOverlay';\nimport { EmulatorStatus } from '../hooks/emulator/types';\nimport { setupCanvasResize } from '../lib/game-player-utils';\n\ninterface GameCanvasProps {\n status: EmulatorStatus;\n system: string;\n error: string | null;\n isPaused: boolean;\n onStart: () => Promise<void>;\n systemColor: string;\n isFullscreen: boolean;\n canvasRef: React.MutableRefObject<HTMLCanvasElement | null>;\n onSelectBios?: () => void;\n}\n\nconst GameCanvas = memo(function GameCanvas({\n status,\n system,\n error,\n isPaused,\n onStart,\n systemColor,\n // isFullscreen, // Unused\n canvasRef,\n onSelectBios\n}: GameCanvasProps) {\n const canvasContainerRef = useRef<HTMLDivElement>(null);\n\n // Create canvas\n useEffect(() => {\n const container = canvasContainerRef.current;\n if (!container || canvasRef.current) return;\n\n const canvas = document.createElement('canvas');\n canvas.id = 'canvas';\n // Use CSS to size the canvas display, not width/height attributes\n canvas.style.width = '100%';\n canvas.style.height = '100%';\n canvas.style.objectFit = 'contain';\n canvas.style.imageRendering = 'pixelated'; // Crisp pixel art\n\n // Emscripten may try to set style on the canvas, so we use important if needed\n // but typically just setting it here works. Explicitly NOT setting width/height attributes\n // lets emscripten manage internal resolution vs display size.\n\n container.appendChild(canvas);\n canvasRef.current = canvas;\n\n return () => {\n if (canvasRef.current && canvasRef.current.parentNode) {\n canvasRef.current.parentNode.removeChild(canvasRef.current);\n }\n canvasRef.current = null;\n };\n }, [canvasRef]);\n\n // Canvas resize\n useEffect(() => {\n if (status !== 'ready' && status !== 'running' && status !== 'paused') return;\n return setupCanvasResize(canvasContainerRef);\n }, [status]);\n\n return (\n <div className=\"absolute inset-0 bg-black overflow-hidden flex items-center justify-center\">\n <div ref={canvasContainerRef} className=\"game-canvas-container w-full h-full flex items-center justify-center\"></div>\n\n <GameOverlay\n status={status}\n system={system}\n error={error}\n isPaused={isPaused}\n onStart={onStart}\n systemColor={systemColor}\n onSelectBios={onSelectBios}\n />\n </div>\n );\n});\n\nexport default GameCanvas;\n","'use client';\n\nimport React, { useState, useEffect, useMemo } from 'react';\nimport { X, Gamepad2, RotateCcw, Check } from 'lucide-react';\nimport { ControlMapperProps } from '../types';\nimport {\n KeyboardMapping,\n ButtonId,\n BUTTON_LABELS,\n BUTTON_GROUPS,\n formatKeyCode,\n getConsoleButtons,\n getConsoleKeyboardDefaults,\n} from '../../lib/controls';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\n// Filter control groups to only show buttons available for this system\nfunction getFilteredGroups(activeButtons: ButtonId[]) {\n return BUTTON_GROUPS.map(group => ({\n ...group,\n buttons: group.buttons.filter(btn => activeButtons.includes(btn))\n })).filter(group => group.buttons.length > 0);\n}\n\nexport default function ControlMapper({\n isOpen,\n controls,\n onSave,\n onClose,\n system,\n}: ControlMapperProps) {\n const t = useKoinTranslation();\n const [localControls, setLocalControls] = useState<KeyboardMapping>(controls);\n const [listeningFor, setListeningFor] = useState<ButtonId | null>(null);\n\n // Get active buttons for this system\n const activeButtons = useMemo(() => {\n return getConsoleButtons(system || 'SNES');\n }, [system]);\n\n // Filter control groups to only show buttons available for this system\n const controlGroups = useMemo(() => {\n return getFilteredGroups(activeButtons);\n }, [activeButtons]);\n\n // Get default controls for this system\n const defaultControls = useMemo(() => {\n return getConsoleKeyboardDefaults(system || 'SNES');\n }, [system]);\n\n // Sync localControls with controls prop when modal opens or controls change\n useEffect(() => {\n if (isOpen) {\n setLocalControls(controls);\n }\n }, [isOpen, controls]);\n\n useEffect(() => {\n if (!isOpen) {\n setListeningFor(null);\n return;\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!listeningFor) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n // Don't allow Escape as a control\n if (e.code === 'Escape') {\n setListeningFor(null);\n return;\n }\n\n setLocalControls((prev) => ({\n ...prev,\n [listeningFor]: e.code,\n }));\n setListeningFor(null);\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, listeningFor]);\n\n const handleReset = () => {\n setLocalControls(defaultControls);\n };\n\n const handleSave = () => {\n onSave(localControls);\n onClose();\n };\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/80 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <div className=\"relative bg-gray-900 border border-retro-primary/30 rounded-xl shadow-2xl w-full max-w-lg mx-4 overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-white/10 bg-black/50\">\n <div className=\"flex items-center gap-3\">\n <Gamepad2 className=\"text-retro-primary\" size={24} />\n <div>\n <h2 className=\"text-lg font-bold text-white\">{t.modals.controls.title}</h2>\n <p className=\"text-xs text-gray-400\">\n {t.modals.controls.description}\n </p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-white/10 text-gray-400 hover:text-white transition-colors\"\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Controls Grid */}\n <div className=\"p-4 space-y-6 max-h-[400px] overflow-y-auto\">\n {controlGroups.map((group) => (\n <div key={group.label}>\n <h3 className=\"text-xs font-bold text-gray-500 uppercase tracking-wider mb-2\">\n {group.label}\n </h3>\n <div className=\"grid grid-cols-2 gap-2\">\n {group.buttons.map((btn) => (\n <button\n key={btn}\n onClick={() => setListeningFor(btn)}\n className={`\n flex items-center justify-between px-4 py-3 rounded-lg border transition-all\n ${listeningFor === btn\n ? 'border-retro-primary bg-retro-primary/20 ring-2 ring-retro-primary/50'\n : 'border-white/10 bg-white/5 hover:border-white/20 hover:bg-white/10'\n }\n `}\n >\n <span className=\"text-sm text-gray-300\">\n {BUTTON_LABELS[btn]}\n </span>\n <span\n className={`\n px-2 py-1 rounded text-xs font-mono\n ${listeningFor === btn\n ? 'bg-retro-primary/30 text-retro-primary animate-pulse'\n : 'bg-black/50 text-white'\n }\n `}\n >\n {listeningFor === btn ? t.modals.controls.pressKey : formatKeyCode(localControls[btn] || '')}\n </span>\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div className=\"flex items-center justify-between px-6 py-4 bg-black/30 border-t border-white/10\">\n <button\n onClick={handleReset}\n className=\"flex items-center gap-2 px-4 py-2 rounded-lg text-sm text-gray-400 hover:text-white hover:bg-white/10 transition-colors\"\n >\n <RotateCcw size={16} />\n {t.modals.controls.reset}\n </button>\n <button\n onClick={handleSave}\n className=\"flex items-center gap-2 px-6 py-2 rounded-lg bg-retro-primary text-black font-bold text-sm hover:bg-retro-primary/90 transition-colors\"\n >\n <Check size={16} />\n {t.modals.controls.save}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { GamepadInfo, ControllerBrand, STANDARD_GAMEPAD_BUTTONS } from '../lib/controls';\n\n// Re-export types for convenience\nexport type { GamepadInfo, ControllerBrand };\nexport { STANDARD_GAMEPAD_BUTTONS };\n\n/**\n * Get a clean display name from gamepad id\n */\nfunction getDisplayName(id: string): string {\n // Common patterns to clean up\n // e.g., \"Xbox 360 Controller (XInput STANDARD GAMEPAD)\" -> \"Xbox 360 Controller\"\n // e.g., \"054c-0ce6-Sony Interactive Entertainment DualSense\" -> \"DualSense\"\n\n let name = id;\n\n // Remove vendor/product ID prefix (e.g., \"054c-0ce6-\")\n name = name.replace(/^[0-9a-f]{4}-[0-9a-f]{4}-/i, '');\n\n // Remove common suffixes\n name = name.replace(/\\s*\\(.*\\)\\s*$/i, '');\n name = name.replace(/\\s*STANDARD GAMEPAD\\s*/i, '');\n\n // Clean up specific controller names\n if (/xbox/i.test(name)) {\n if (/series/i.test(name)) return 'Xbox Series Controller';\n if (/one/i.test(name)) return 'Xbox One Controller';\n if (/360/i.test(name)) return 'Xbox 360 Controller';\n return 'Xbox Controller';\n }\n\n if (/dualsense/i.test(name)) return 'DualSense';\n if (/dualshock\\s*4/i.test(name)) return 'DualShock 4';\n if (/dualshock/i.test(name)) return 'DualShock';\n if (/playstation/i.test(name) || /sony/i.test(name)) return 'PlayStation Controller';\n\n if (/pro\\s*controller/i.test(name)) return 'Switch Pro Controller';\n if (/joy-?con/i.test(name)) return 'Joy-Con';\n if (/nintendo/i.test(name)) return 'Nintendo Controller';\n\n // Fallback: return cleaned name or generic\n return name.trim() || 'Gamepad';\n}\n\n/**\n * Detect controller brand from gamepad id for UI theming\n */\nexport function detectControllerBrand(id: string): ControllerBrand {\n const lowerId = id.toLowerCase();\n\n if (/xbox|xinput|microsoft/i.test(lowerId)) return 'xbox';\n if (/playstation|sony|dualshock|dualsense/i.test(lowerId)) return 'playstation';\n if (/nintendo|switch|joy-?con|pro controller/i.test(lowerId)) return 'nintendo';\n\n return 'generic';\n}\n\n/**\n * Convert raw Gamepad to GamepadInfo\n */\nfunction toGamepadInfo(gamepad: Gamepad): GamepadInfo {\n return {\n index: gamepad.index,\n id: gamepad.id,\n name: getDisplayName(gamepad.id),\n connected: gamepad.connected,\n buttons: gamepad.buttons.length,\n axes: gamepad.axes.length,\n mapping: gamepad.mapping,\n };\n}\n\nexport interface UseGamepadOptions {\n /** Callback when a gamepad connects */\n onConnect?: (gamepad: GamepadInfo) => void;\n /** Callback when a gamepad disconnects */\n onDisconnect?: () => void;\n}\n\nexport interface UseGamepadReturn {\n /** Array of connected gamepads (up to 4) */\n gamepads: GamepadInfo[];\n /** Whether any gamepad is connected */\n isAnyConnected: boolean;\n /** Number of connected gamepads */\n connectedCount: number;\n /** Get raw gamepad by index for reading button states */\n getRawGamepad: (index: number) => Gamepad | null;\n /** Force refresh gamepad list */\n refresh: () => void;\n}\n\n/**\n * Hook to track connected gamepads\n * Uses requestAnimationFrame polling since Gamepad API requires active polling\n * \n * NOTE: Browsers require a button press before reporting gamepads (security feature)\n */\nexport function useGamepad(options?: UseGamepadOptions): UseGamepadReturn {\n const { onConnect, onDisconnect } = options || {};\n const [gamepads, setGamepads] = useState<GamepadInfo[]>([]);\n const rafRef = useRef<number | null>(null);\n const lastStateRef = useRef<string>(''); // Kept for logic compatibility or debug\n const prevCountRef = useRef<number>(0);\n\n // Store callbacks in refs to avoid re-running effect when they change\n const onConnectRef = useRef(onConnect);\n const onDisconnectRef = useRef(onDisconnect);\n\n // Update refs when callbacks change\n useEffect(() => {\n onConnectRef.current = onConnect;\n onDisconnectRef.current = onDisconnect;\n }, [onConnect, onDisconnect]);\n\n // Get current gamepad state\n const getGamepads = useCallback((): GamepadInfo[] => {\n if (typeof navigator === 'undefined' || typeof navigator.getGamepads !== 'function') {\n return [];\n }\n\n const rawGamepads = navigator.getGamepads() ?? [];\n const connected: GamepadInfo[] = [];\n\n for (let i = 0; i < rawGamepads.length; i++) {\n const gp = rawGamepads[i];\n if (gp && gp.connected) {\n connected.push(toGamepadInfo(gp));\n }\n }\n\n return connected;\n }, []);\n\n // Get raw gamepad for button state reading\n const getRawGamepad = useCallback((index: number): Gamepad | null => {\n const rawGamepads = navigator.getGamepads?.() ?? [];\n return rawGamepads[index] ?? null;\n }, []);\n\n // Refresh function\n const refresh = useCallback(() => {\n // Force refresh\n setGamepads(getGamepads());\n }, [getGamepads]);\n\n // Polling loop - only update state when connections change\n useEffect(() => {\n // Check if we're in browser and Gamepad API is supported\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return;\n }\n\n if (typeof navigator.getGamepads !== 'function') {\n console.warn('[useGamepad] Gamepad API not supported in this browser');\n return;\n }\n\n let isActive = true;\n\n const poll = () => {\n if (!isActive) return;\n\n const current = getGamepads();\n // Create a simple state signature to compare\n // Optimized comparison: check length first, then IDs\n // Allocating strings every frame is expensive\n let hasChanged = current.length !== prevCountRef.current;\n\n if (!hasChanged) {\n // Deep check only if counts match\n // We can just check connections and IDs without creating full signature strings\n for (let i = 0; i < current.length; i++) {\n const saved = gamepads[i];\n if (!saved || saved.id !== current[i].id || saved.connected !== current[i].connected) {\n hasChanged = true;\n break;\n }\n }\n }\n\n if (hasChanged) {\n const prevCount = prevCountRef.current;\n const currentCount = current.length;\n\n // Detect connection/disconnection logic remains same\n if (currentCount > prevCount && prevCount >= 0 && onConnectRef.current) {\n const newGamepad = current[current.length - 1];\n onConnectRef.current(newGamepad);\n } else if (currentCount < prevCount && prevCount > 0 && onDisconnectRef.current) {\n onDisconnectRef.current();\n }\n\n prevCountRef.current = currentCount;\n // lastStateRef no longer needed for primary comparison but we keep it if we want to debug\n // lastStateRef.current = stateSignature;\n setGamepads(current);\n }\n\n rafRef.current = requestAnimationFrame(poll);\n };\n\n // Handle connect/disconnect events\n const handleConnect = (e: GamepadEvent) => {\n console.log('[useGamepad] 🎮 Gamepad connected:', e.gamepad.id);\n // Force immediate update\n const current = getGamepads();\n const prevCount = prevCountRef.current;\n prevCountRef.current = current.length;\n lastStateRef.current = current.map(g => `${g.index}:${g.id}`).join('|');\n setGamepads(current);\n\n // Trigger callback if provided\n if (onConnectRef.current && current.length > prevCount) {\n const newGamepad = current[current.length - 1];\n onConnectRef.current(newGamepad);\n }\n };\n\n const handleDisconnect = (e: GamepadEvent) => {\n console.log('[useGamepad] 🎮 Gamepad disconnected:', e.gamepad.id);\n // Force immediate update\n const current = getGamepads();\n const prevCount = prevCountRef.current;\n prevCountRef.current = current.length;\n lastStateRef.current = current.map(g => `${g.index}:${g.id}`).join('|');\n setGamepads(current);\n\n // Trigger callback if provided\n if (onDisconnectRef.current && current.length < prevCount) {\n onDisconnectRef.current();\n }\n };\n\n window.addEventListener('gamepadconnected', handleConnect);\n window.addEventListener('gamepaddisconnected', handleDisconnect);\n\n // Start polling\n rafRef.current = requestAnimationFrame(poll);\n\n // Initial check - gamepads may already be connected\n const initial = getGamepads();\n if (initial.length > 0) {\n console.log('[useGamepad] Initial gamepads found:', initial.map(g => g.name).join(', '));\n prevCountRef.current = initial.length;\n setGamepads(initial);\n lastStateRef.current = initial.map(g => `${g.index}:${g.id}`).join('|');\n } else {\n prevCountRef.current = 0;\n }\n\n return () => {\n isActive = false;\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n window.removeEventListener('gamepadconnected', handleConnect);\n window.removeEventListener('gamepaddisconnected', handleDisconnect);\n };\n }, [getGamepads]); // Callbacks are stored in refs, so they don't need to be in deps\n\n return {\n gamepads,\n isAnyConnected: gamepads.length > 0,\n connectedCount: gamepads.length,\n getRawGamepad,\n refresh,\n };\n}\n\n/**\n * Standard gamepad axis indices\n */\nexport const STANDARD_AXIS_MAP = {\n leftStickX: 0,\n leftStickY: 1,\n rightStickX: 2,\n rightStickY: 3,\n} as const;\n\nexport type StandardAxis = keyof typeof STANDARD_AXIS_MAP;\n","'use client';\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { X, Joystick, RotateCcw, Check, User } from 'lucide-react';\nimport { GamepadInfo, detectControllerBrand, STANDARD_GAMEPAD_BUTTONS } from '../../hooks/useGamepad';\nimport {\n GamepadMapping,\n ButtonId,\n PlayerIndex,\n BUTTON_LABELS,\n BUTTON_GROUPS,\n DEFAULT_GAMEPAD,\n loadGamepadMapping,\n saveGamepadMapping,\n formatGamepadButton,\n} from '../../lib/controls';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\nexport interface GamepadMapperProps {\n isOpen: boolean;\n gamepads: GamepadInfo[];\n onClose: () => void;\n onSave?: (bindings: GamepadMapping, playerIndex: number) => void;\n systemColor?: string;\n}\n\nexport default function GamepadMapper({\n isOpen,\n gamepads,\n onClose,\n onSave,\n systemColor = '#00FF41',\n}: GamepadMapperProps) {\n const t = useKoinTranslation();\n // Selected player for remapping (1-indexed)\n const [selectedPlayer, setSelectedPlayer] = useState(1);\n\n // Local bindings state (per-player)\n const [bindings, setBindings] = useState<Record<number, GamepadMapping>>({});\n\n // Which button we're listening for\n const [listeningFor, setListeningFor] = useState<ButtonId | null>(null);\n\n // Animation frame ref for gamepad polling\n const rafRef = useRef<number | null>(null);\n\n // Load bindings for all connected players when modal opens\n useEffect(() => {\n if (isOpen) {\n const loadedBindings: Record<number, GamepadMapping> = {};\n for (let i = 1; i <= 4; i++) {\n loadedBindings[i] = loadGamepadMapping(i as PlayerIndex);\n }\n setBindings(loadedBindings);\n\n // Select first connected gamepad's player\n if (gamepads.length > 0) {\n setSelectedPlayer(gamepads[0].index + 1);\n }\n }\n }, [isOpen, gamepads]);\n\n // Poll gamepad for button presses when listening\n useEffect(() => {\n if (!isOpen || !listeningFor) {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n return;\n }\n\n const poll = () => {\n const rawGamepads = navigator.getGamepads?.() ?? [];\n const gamepad = rawGamepads[selectedPlayer - 1];\n\n if (gamepad) {\n // Check for any button press\n for (let i = 0; i < gamepad.buttons.length; i++) {\n if (gamepad.buttons[i].pressed) {\n // Found a pressed button - map it\n setBindings(prev => ({\n ...prev,\n [selectedPlayer]: {\n ...prev[selectedPlayer],\n [listeningFor]: i,\n }\n }));\n setListeningFor(null);\n return; // Stop polling\n }\n }\n }\n\n rafRef.current = requestAnimationFrame(poll);\n };\n\n rafRef.current = requestAnimationFrame(poll);\n\n return () => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, [isOpen, listeningFor, selectedPlayer]);\n\n // Handle keyboard escape to cancel listening\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.code === 'Escape') {\n if (listeningFor) {\n setListeningFor(null);\n } else {\n onClose();\n }\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, listeningFor, onClose]);\n\n const handleReset = () => {\n setBindings(prev => ({\n ...prev,\n [selectedPlayer]: { ...DEFAULT_GAMEPAD },\n }));\n };\n\n const handleSave = () => {\n // Save bindings for all players\n Object.entries(bindings).forEach(([player, playerBindings]) => {\n const playerIdx = parseInt(player) as PlayerIndex;\n saveGamepadMapping(playerBindings, playerIdx);\n });\n onSave?.(bindings[selectedPlayer], selectedPlayer);\n onClose();\n };\n\n if (!isOpen) return null;\n\n const currentBindings = bindings[selectedPlayer] ?? DEFAULT_GAMEPAD;\n const currentGamepad = gamepads.find(g => g.index === selectedPlayer - 1);\n const brand = currentGamepad ? detectControllerBrand(currentGamepad.id) : 'generic';\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/80 backdrop-blur-sm\"\n onClick={() => !listeningFor && onClose()}\n />\n\n {/* Modal */}\n <div className=\"relative bg-gray-900 border border-retro-primary/30 rounded-xl shadow-2xl w-full max-w-lg mx-4 overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-white/10 bg-black/50\">\n <div className=\"flex items-center gap-3\">\n <Joystick className=\"text-retro-primary\" size={24} style={{ color: systemColor }} />\n <div>\n <h2 className=\"text-lg font-bold text-white\">{t.modals.gamepad.title}</h2>\n <p className=\"text-xs text-gray-400\">\n {gamepads.length > 0\n ? t.modals.gamepad.connected.replace('{{count}}', gamepads.length.toString())\n : t.modals.gamepad.none}\n </p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-white/10 text-gray-400 hover:text-white transition-colors\"\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Player selector (if multiple gamepads) */}\n {gamepads.length > 1 && (\n <div className=\"px-6 py-3 border-b border-white/10 bg-black/30\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-gray-400 font-medium\">{t.modals.gamepad.player}</span>\n <div className=\"flex gap-1\">\n {gamepads.map((gp) => (\n <button\n key={gp.index}\n onClick={() => setSelectedPlayer(gp.index + 1)}\n className={`\n flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-sm font-medium transition-all\n ${selectedPlayer === gp.index + 1\n ? 'bg-retro-primary/20 text-retro-primary'\n : 'bg-white/5 text-gray-400 hover:bg-white/10 hover:text-white'\n }\n `}\n style={selectedPlayer === gp.index + 1 ? {\n backgroundColor: `${systemColor}20`,\n color: systemColor\n } : {}}\n >\n <User size={14} />\n P{gp.index + 1}\n </button>\n ))}\n </div>\n </div>\n {currentGamepad && (\n <p className=\"text-xs text-gray-500 mt-1\">\n {currentGamepad.name}\n </p>\n )}\n </div>\n )}\n\n {/* Single gamepad info */}\n {gamepads.length === 1 && currentGamepad && (\n <div className=\"px-6 py-2 border-b border-white/10 bg-black/30\">\n <p className=\"text-xs text-gray-400\">\n {currentGamepad.name} • Player 1\n </p>\n </div>\n )}\n\n {/* No gamepads warning */}\n {gamepads.length === 0 && (\n <div className=\"px-6 py-10 text-center\">\n <div className=\"relative inline-block mb-4\">\n <Joystick size={56} className=\"text-gray-600 animate-pulse\" />\n {/* Animated ring */}\n <div className=\"absolute inset-0 -m-2 rounded-full border-2 border-dashed border-gray-600 animate-spin\" style={{ animationDuration: '8s' }} />\n </div>\n <p className=\"text-gray-300 font-medium mb-2\">{t.modals.gamepad.noController}</p>\n <p className=\"text-sm text-gray-500 mb-4\">\n {t.modals.gamepad.pressAny}\n </p>\n <div className=\"inline-flex items-center gap-2 px-4 py-2 rounded-lg bg-white/5 border border-white/10\">\n <span className=\"text-xs text-gray-400\">{t.modals.gamepad.waiting}</span>\n <div className=\"flex gap-1\">\n <div className=\"w-1.5 h-1.5 rounded-full bg-gray-500 animate-bounce\" style={{ animationDelay: '0ms' }} />\n <div className=\"w-1.5 h-1.5 rounded-full bg-gray-500 animate-bounce\" style={{ animationDelay: '150ms' }} />\n <div className=\"w-1.5 h-1.5 rounded-full bg-gray-500 animate-bounce\" style={{ animationDelay: '300ms' }} />\n </div>\n </div>\n </div>\n )}\n\n {/* Button mapping grid */}\n {gamepads.length > 0 && (\n <div className=\"p-4 space-y-6 max-h-[400px] overflow-y-auto\">\n {listeningFor && (\n <div className=\"p-4 rounded-lg bg-black/50 border border-retro-primary/50 text-center animate-pulse\" style={{ borderColor: `${systemColor}50` }}>\n <p className=\"text-sm text-white mb-1\">\n {t.modals.gamepad.pressButton.replace('{{button}}', BUTTON_LABELS[listeningFor])}\n </p>\n <p className=\"text-xs text-gray-400\">\n {t.modals.gamepad.pressEsc}\n </p>\n </div>\n )}\n\n {BUTTON_GROUPS.map((group) => (\n <div key={group.label}>\n <h3 className=\"text-xs font-bold text-gray-500 uppercase tracking-wider mb-2\">\n {group.label}\n </h3>\n <div className=\"grid grid-cols-2 gap-2\">\n {group.buttons.map((btn) => (\n <button\n key={btn}\n onClick={() => setListeningFor(btn)}\n disabled={!!listeningFor && listeningFor !== btn}\n className={`\n flex items-center justify-between px-4 py-3 rounded-lg border transition-all\n disabled:opacity-50\n ${listeningFor === btn\n ? 'border-retro-primary bg-retro-primary/20 ring-2 ring-retro-primary/50'\n : 'border-white/10 bg-white/5 hover:border-white/20 hover:bg-white/10'\n }\n `}\n style={listeningFor === btn ? {\n borderColor: systemColor,\n backgroundColor: `${systemColor}20`,\n boxShadow: `0 0 0 2px ${systemColor}50`,\n } : {}}\n >\n <span className=\"text-sm text-gray-300\">\n {BUTTON_LABELS[btn]}\n </span>\n <span\n className={`\n px-2 py-1 rounded text-xs font-mono\n ${listeningFor === btn\n ? 'bg-retro-primary/30 text-retro-primary animate-pulse'\n : 'bg-black/50 text-white'\n }\n `}\n style={listeningFor === btn ? {\n backgroundColor: `${systemColor}30`,\n color: systemColor,\n } : {}}\n >\n {listeningFor === btn ? t.controls.press : formatGamepadButton(currentBindings[btn])}\n </span>\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* Footer */}\n {gamepads.length > 0 && (\n <div className=\"flex items-center justify-between px-6 py-4 bg-black/30 border-t border-white/10\">\n <button\n onClick={handleReset}\n disabled={!!listeningFor}\n className=\"flex items-center gap-2 px-4 py-2 rounded-lg text-sm text-gray-400 hover:text-white hover:bg-white/10 transition-colors disabled:opacity-50\"\n >\n <RotateCcw size={16} />\n {t.modals.gamepad.reset}\n </button>\n <button\n onClick={handleSave}\n disabled={!!listeningFor}\n className=\"flex items-center gap-2 px-6 py-2 rounded-lg bg-retro-primary text-black font-bold text-sm hover:bg-retro-primary/90 transition-colors disabled:opacity-50\"\n style={{ backgroundColor: systemColor }}\n >\n <Check size={16} />\n {t.modals.gamepad.save}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { X, Code, Check, Copy } from 'lucide-react';\nimport { CheatModalProps, Cheat } from '../types';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\nexport default function CheatModal({\n isOpen,\n cheats,\n activeCheats,\n onToggle,\n onClose,\n}: CheatModalProps) {\n const t = useKoinTranslation();\n const [copiedId, setCopiedId] = React.useState<number | null>(null);\n\n if (!isOpen) return null;\n\n const handleCopy = async (code: string, id: number) => {\n await navigator.clipboard.writeText(code);\n setCopiedId(id);\n setTimeout(() => setCopiedId(null), 2000);\n };\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/80 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <div className=\"relative bg-gray-900 border border-retro-primary/30 rounded-xl shadow-2xl w-full max-w-lg mx-4 overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-white/10 bg-black/50\">\n <div className=\"flex items-center gap-3\">\n <Code className=\"text-purple-400\" size={24} />\n <div>\n <h2 className=\"text-lg font-bold text-white\">{t.modals.cheats.title}</h2>\n <p className=\"text-xs text-gray-400\">\n {t.modals.cheats.available.replace('{{count}}', cheats.length.toString())}\n </p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-white/10 text-gray-400 hover:text-white transition-colors\"\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Cheats List */}\n <div className=\"p-4 space-y-2 max-h-[400px] overflow-y-auto\">\n {cheats.length === 0 ? (\n <div className=\"text-center py-12 text-gray-500\">\n <Code size={48} className=\"mx-auto mb-3 opacity-50\" />\n <p className=\"font-medium\">{t.modals.cheats.emptyTitle}</p>\n <p className=\"text-sm mt-1\">{t.modals.cheats.emptyDesc}</p>\n </div>\n ) : (\n cheats.map((cheat) => {\n const isActive = activeCheats.has(cheat.id);\n\n return (\n <div\n key={cheat.id}\n className={`\n group flex items-start gap-4 p-4 rounded-lg border transition-all cursor-pointer\n ${isActive\n ? 'border-purple-500/50 bg-purple-500/10'\n : 'border-white/10 bg-white/5 hover:border-white/20 hover:bg-white/10'\n }\n `}\n onClick={() => onToggle(cheat.id)}\n >\n {/* Toggle */}\n <div\n className={`\n flex-shrink-0 w-6 h-6 rounded border-2 flex items-center justify-center transition-all\n ${isActive\n ? 'border-purple-500 bg-purple-500'\n : 'border-gray-600 group-hover:border-gray-400'\n }\n `}\n >\n {isActive && <Check size={14} className=\"text-white\" />}\n </div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <p className={`font-medium ${isActive ? 'text-purple-300' : 'text-white'}`}>\n {cheat.description}\n </p>\n <div className=\"flex items-center gap-2 mt-2\">\n <code className=\"px-2 py-1 bg-black/50 rounded text-xs font-mono text-gray-400 truncate max-w-[200px]\">\n {cheat.code}\n </code>\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleCopy(cheat.code, cheat.id);\n }}\n className=\"p-1.5 rounded hover:bg-white/10 text-gray-500 hover:text-white transition-colors\"\n title={t.modals.cheats.copy}\n >\n {copiedId === cheat.id ? (\n <Check size={14} className=\"text-green-400\" />\n ) : (\n <Copy size={14} />\n )}\n </button>\n </div>\n </div>\n </div>\n );\n })\n )}\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-3 bg-black/30 border-t border-white/10\">\n <p className=\"text-xs text-gray-500 text-center\">\n {activeCheats.size > 0\n ? t.modals.cheats.active.replace('{{count}}', activeCheats.size.toString())\n : t.modals.cheats.toggleHint\n }\n </p>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { X, Save, Download, Trash2, Clock, HardDrive, Loader2, RefreshCw, Lock, Zap } from 'lucide-react';\nimport { SaveSlotModalProps, SaveSlot } from '../types';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\n// Slot 5 is reserved for auto-save\nconst AUTO_SAVE_SLOT = 5;\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;\n}\n\nfunction formatTimestamp(timestamp: string): string {\n try {\n const date = new Date(timestamp);\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n\n // Less than 1 minute\n if (diff < 60000) return 'Just now';\n // Less than 1 hour\n if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`;\n // Less than 24 hours\n if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`;\n // Otherwise show date\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n } catch {\n return 'Unknown';\n }\n}\n\nexport default function SaveSlotModal({\n isOpen,\n mode,\n slots,\n isLoading,\n actioningSlot,\n onSelect,\n onDelete,\n onClose,\n maxSlots = 5,\n onUpgrade,\n}: SaveSlotModalProps) {\n const t = useKoinTranslation();\n\n if (!isOpen) return null;\n\n const isSaveMode = mode === 'save';\n const allSlots = [1, 2, 3, 4, 5];\n const isUnlimited = maxSlots === -1 || maxSlots >= 5;\n\n // For load mode, sort slots to show most recently saved first\n // For save mode, keep original order (1-5) so users know which slot is which\n const displaySlots = isSaveMode\n ? allSlots\n : [...allSlots].sort((a, b) => {\n const slotA = slots.find(s => s.slot === a);\n const slotB = slots.find(s => s.slot === b);\n // Empty slots go to the end\n if (!slotA && !slotB) return a - b;\n if (!slotA) return 1;\n if (!slotB) return -1;\n // Sort by timestamp descending (most recent first)\n return new Date(slotB.timestamp).getTime() - new Date(slotA.timestamp).getTime();\n });\n\n const getSlotData = (slotNum: number): SaveSlot | undefined => {\n return slots.find((s) => s.slot === slotNum);\n };\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/80 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <div className=\"relative bg-gray-900 border border-retro-primary/30 rounded-xl shadow-2xl w-full max-w-md mx-4 overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-white/10 bg-black/50\">\n <div className=\"flex items-center gap-3\">\n {isSaveMode ? (\n <Save className=\"text-retro-primary\" size={24} />\n ) : (\n <Download className=\"text-retro-primary\" size={24} />\n )}\n <div>\n <h2 className=\"text-lg font-bold text-white\">\n {isSaveMode ? t.modals.saveSlots.saveTitle : t.modals.saveSlots.loadTitle}\n </h2>\n <p className=\"text-xs text-gray-400\">\n {isSaveMode ? t.modals.saveSlots.subtitleSave : t.modals.saveSlots.subtitleLoad}\n </p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-white/10 text-gray-400 hover:text-white transition-colors\"\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Slots List */}\n <div className=\"p-4 space-y-2 max-h-[400px] overflow-y-auto\">\n {isLoading ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-gray-400\">\n <Loader2 className=\"w-8 h-8 animate-spin mb-3\" />\n <span className=\"text-sm\">{t.modals.saveSlots.loading}</span>\n </div>\n ) : (\n displaySlots.map((slotNum) => {\n const slotData = getSlotData(slotNum);\n const isEmpty = !slotData;\n const isAutoSaveSlot = slotNum === AUTO_SAVE_SLOT;\n // Check if slot is locked by tier (only for manual slots 1-4)\n const isLockedByTier = !isUnlimited && !isAutoSaveSlot && slotNum > maxSlots && isEmpty;\n const isDisabled = (!isSaveMode && isEmpty) || (isSaveMode && isAutoSaveSlot) || (isSaveMode && isLockedByTier);\n const isActioning = actioningSlot === slotNum;\n\n // Locked slot - show upgrade prompt\n if (isLockedByTier && isSaveMode) {\n return (\n <div\n key={slotNum}\n onClick={() => onUpgrade?.()}\n className={`group relative flex items-center gap-4 p-4 rounded-lg border border-gray-700 bg-gray-800/50 transition-all ${onUpgrade ? 'cursor-pointer hover:border-retro-primary/30' : 'cursor-default'}`}\n >\n <div className=\"flex-shrink-0 w-12 h-12 rounded-lg flex items-center justify-center font-bold text-xl bg-gray-700 text-gray-500\">\n <Lock size={20} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-gray-400 group-hover:text-white transition-colors\">\n {t.modals.saveSlots.locked.replace('{{num}}', slotNum.toString())}\n </p>\n <p className=\"text-xs text-gray-500 group-hover:text-retro-primary transition-colors flex items-center gap-1\">\n <Zap size={10} />\n {t.modals.saveSlots.upgrade}\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div\n key={slotNum}\n className={`\n group relative flex items-center gap-4 p-4 rounded-lg border transition-all\n ${isAutoSaveSlot && isSaveMode\n ? 'border-retro-primary/20 bg-retro-primary/5 cursor-not-allowed'\n : isDisabled\n ? 'border-white/5 bg-white/5 opacity-50 cursor-not-allowed'\n : isActioning\n ? 'border-retro-primary bg-retro-primary/10 cursor-wait'\n : 'border-white/10 bg-white/5 hover:border-retro-primary/50 hover:border-retro-primary/10 cursor-pointer'\n }\n `}\n onClick={() => !isDisabled && !isActioning && onSelect(slotNum)}\n >\n {/* Slot Number / Auto-save badge */}\n <div className={`\n flex-shrink-0 w-12 h-12 rounded-lg flex items-center justify-center font-bold text-xl\n ${isAutoSaveSlot\n ? 'bg-retro-primary/20 text-retro-primary'\n : isEmpty\n ? 'bg-gray-800 text-gray-600'\n : 'bg-retro-primary/20 text-retro-primary'\n }\n `}>\n {isActioning ? (\n <Loader2 className=\"animate-spin\" size={24} />\n ) : isAutoSaveSlot ? (\n <RefreshCw size={20} />\n ) : (\n slotNum\n )}\n </div>\n\n {/* Slot Info */}\n <div className=\"flex-1 min-w-0\">\n {isAutoSaveSlot ? (\n // Auto-save slot - special display\n isEmpty ? (\n <div className=\"text-retro-primary/70\">\n <p className=\"font-medium\">{t.modals.saveSlots.autoSave}</p>\n <p className=\"text-xs text-retro-primary/50\">{t.modals.saveSlots.autoSaveDesc}</p>\n </div>\n ) : (\n <div className=\"flex items-center gap-3\">\n {slotData.screenshot && (\n <div className=\"flex-shrink-0 w-16 h-12 rounded border border-retro-primary/30 overflow-hidden bg-black\">\n <img\n src={slotData.screenshot}\n alt=\"Auto-save\"\n className=\"w-full h-full object-cover\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-retro-primary truncate\">\n {t.modals.saveSlots.autoSave}\n </p>\n <div className=\"flex items-center gap-3 text-xs text-retro-primary/60 mt-1\">\n <span className=\"flex items-center gap-1\">\n <Clock size={12} />\n {formatTimestamp(slotData.timestamp)}\n </span>\n <span className=\"flex items-center gap-1\">\n <HardDrive size={12} />\n {formatBytes(slotData.size)}\n </span>\n </div>\n </div>\n </div>\n )\n ) : isEmpty ? (\n <div className=\"text-gray-500\">\n <p className=\"font-medium\">{t.modals.saveSlots.emptySlot}</p>\n <p className=\"text-xs\">{t.modals.saveSlots.noData}</p>\n </div>\n ) : (\n <div className=\"flex items-center gap-3\">\n {/* Screenshot */}\n {slotData.screenshot && (\n <div className=\"flex-shrink-0 w-16 h-12 rounded border border-white/10 overflow-hidden bg-black\">\n <img\n src={slotData.screenshot}\n alt={`Save slot ${slotNum}`}\n className=\"w-full h-full object-cover\"\n onError={(e) => {\n // Hide image if it fails to load\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-white truncate\">\n {t.modals.saveSlots.slot.replace('{{num}}', slotNum.toString())}\n </p>\n <div className=\"flex items-center gap-3 text-xs text-gray-400 mt-1\">\n <span className=\"flex items-center gap-1\">\n <Clock size={12} />\n {formatTimestamp(slotData.timestamp)}\n </span>\n <span className=\"flex items-center gap-1\">\n <HardDrive size={12} />\n {formatBytes(slotData.size)}\n </span>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Delete button - only for non-empty slots, hide for auto-save in save mode */}\n {!isEmpty && !(isAutoSaveSlot && isSaveMode) && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDelete(slotNum);\n }}\n className=\"flex-shrink-0 p-2.5 rounded-lg bg-retro-tertiary/10 hover:bg-retro-tertiary/20 text-retro-tertiary hover:text-retro-tertiary transition-all border border-retro-tertiary/20\"\n title=\"Delete save\"\n >\n <Trash2 size={16} />\n </button>\n )}\n </div>\n );\n })\n )}\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-3 bg-black/30 border-t border-white/10\">\n <p className=\"text-xs text-gray-500 text-center\">\n {isSaveMode\n ? t.modals.saveSlots.footerSave\n : t.modals.saveSlots.footerLoad\n }\n </p>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\n\nimport { X, Cpu, Check, FileCode, AlertCircle, Code } from 'lucide-react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\nexport interface BiosOption {\n id: string;\n name: string;\n description?: string;\n}\n\ninterface BiosSelectionModalProps {\n isOpen: boolean;\n onClose: () => void;\n biosOptions: BiosOption[];\n currentBiosId?: string;\n onSelectBios: (id: string) => void;\n systemColor?: string;\n}\n\nexport default function BiosSelectionModal({\n isOpen,\n onClose,\n biosOptions,\n currentBiosId,\n onSelectBios,\n systemColor = '#00FF41',\n}: BiosSelectionModalProps) {\n const t = useKoinTranslation();\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/80 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <div\n className=\"relative bg-gray-900 border rounded-xl shadow-2xl w-full max-w-lg mx-4 overflow-hidden flex flex-col max-h-[80vh]\"\n style={{ borderColor: `${systemColor}40` }}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-white/10 bg-black/50 bg-noise\">\n <div className=\"flex items-center gap-3\">\n <Cpu size={24} style={{ color: systemColor }} />\n <div>\n <h2 className=\"text-lg font-bold text-white uppercase tracking-wide\">{t.modals.bios.title}</h2>\n <p className=\"text-xs text-gray-400\">\n {t.modals.bios.description}\n </p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-white/10 text-gray-400 hover:text-white transition-colors\"\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-4 overflow-y-auto space-y-2\">\n {/* Warning Notice */}\n <div className=\"mb-4 p-3 rounded bg-yellow-500/10 border border-yellow-500/20 flex items-start gap-3\">\n <AlertCircle className=\"shrink-0 text-yellow-500 mt-0.5\" size={16} />\n <div className=\"text-xs text-yellow-200/80\">\n <strong>{t.modals.bios.warningTitle}</strong> {t.modals.bios.warning}\n </div>\n </div>\n\n {/* System Default Option (Clear Selection) */}\n <button\n onClick={() => onSelectBios('')}\n className={`\n w-full group flex items-center gap-4 p-4 rounded-lg border transition-all text-left mb-2\n ${!currentBiosId\n ? 'bg-white/10'\n : 'bg-black/20 hover:bg-white/5 border-white/5 hover:border-white/20'\n }\n `}\n style={{\n borderColor: !currentBiosId ? systemColor : undefined\n }}\n >\n <div\n className={`shrink-0 w-10 h-10 rounded-lg flex items-center justify-center border transition-colors\n ${!currentBiosId ? '' : 'border-white/10 bg-black/30 group-hover:border-white/20'}\n `}\n style={{\n backgroundColor: !currentBiosId ? `${systemColor}20` : undefined,\n borderColor: !currentBiosId ? systemColor : undefined\n }}\n >\n <Cpu size={20} style={{ color: !currentBiosId ? systemColor : '#6b7280' }} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className={`font-mono font-bold truncate ${!currentBiosId ? 'text-white' : 'text-gray-300'}`}>\n {t.modals.bios.systemDefault}\n </span>\n {!currentBiosId && (\n <span className=\"px-1.5 py-0.5 rounded text-[10px] font-bold bg-white/20 text-white uppercase tracking-wider\">\n {t.modals.bios.active}\n </span>\n )}\n </div>\n <p className=\"text-xs text-gray-500 truncate mt-0.5\">\n {t.modals.bios.defaultDesc}\n </p>\n </div>\n {!currentBiosId && (\n <Check size={20} style={{ color: systemColor }} />\n )}\n </button>\n\n {biosOptions.length === 0 ? (\n <div className=\"text-center py-8 text-gray-500\">\n <FileCode size={48} className=\"mx-auto mb-3 opacity-30\" />\n <p className=\"text-sm\">{t.modals.bios.emptyTitle}</p>\n <p className=\"text-[10px] mt-1 text-gray-600\">{t.modals.bios.emptyDesc}</p>\n </div>\n ) : (\n biosOptions.map((bios) => {\n const isSelected = bios.id === currentBiosId;\n\n return (\n <button\n key={bios.id}\n onClick={() => onSelectBios(bios.id)}\n className={`\n w-full group flex items-center gap-4 p-4 rounded-lg border transition-all text-left\n ${isSelected\n ? 'bg-white/10'\n : 'bg-black/20 hover:bg-white/5 border-white/5 hover:border-white/20'\n }\n `}\n style={{\n borderColor: isSelected ? systemColor : undefined\n }}\n >\n {/* Icon */}\n <div\n className={`shrink-0 w-10 h-10 rounded-lg flex items-center justify-center border transition-colors\n ${isSelected ? '' : 'border-white/10 bg-black/30 group-hover:border-white/20'}\n `}\n style={{\n backgroundColor: isSelected ? `${systemColor}20` : undefined,\n borderColor: isSelected ? systemColor : undefined\n }}\n >\n <Code size={20} style={{ color: isSelected ? systemColor : '#6b7280' }} />\n </div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className={`font-mono font-bold truncate ${isSelected ? 'text-white' : 'text-gray-300'}`}>\n {bios.name}\n </span>\n {isSelected && (\n <span className=\"px-1.5 py-0.5 rounded text-[10px] font-bold bg-white/20 text-white uppercase tracking-wider\">\n {t.modals.bios.active}\n </span>\n )}\n </div>\n {bios.description && (\n <p className=\"text-xs text-gray-500 truncate mt-0.5\">\n {bios.description}\n </p>\n )}\n </div>\n\n {/* Checkmark */}\n {isSelected && (\n <Check size={20} style={{ color: systemColor }} />\n )}\n </button>\n );\n })\n )}\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-3 bg-black/30 border-t border-white/10 text-center\">\n <p className=\"text-[10px] text-gray-500 uppercase tracking-widest\">\n {t.modals.bios.footer}\n </p>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { X, Globe, Check, Settings } from 'lucide-react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ninterface SettingsModalProps {\n isOpen: boolean;\n onClose: () => void;\n currentLanguage: string;\n onLanguageChange: (lang: 'en' | 'es' | 'fr') => void;\n systemColor?: string;\n}\n\nexport default function SettingsModal({\n isOpen,\n onClose,\n currentLanguage,\n onLanguageChange,\n systemColor = '#00FF41',\n}: SettingsModalProps) {\n const t = useKoinTranslation();\n\n if (!isOpen) return null;\n\n const languages = [\n { code: 'en', name: 'English' },\n { code: 'es', name: 'Español' },\n { code: 'fr', name: 'Français' },\n ] as const;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/80 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <div className=\"relative bg-gray-900 border border-white/10 rounded-xl shadow-2xl w-full max-w-sm mx-4 overflow-hidden animate-in fade-in zoom-in-95 duration-200\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-white/10 bg-black/50\">\n <div className=\"flex items-center gap-3\">\n <Settings className=\"text-white\" size={20} />\n <h2 className=\"text-lg font-bold text-white\">\n {t.settings.title}\n </h2>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-white/10 text-gray-400 hover:text-white transition-colors\"\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-6 space-y-6\">\n {/* Language Section */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-gray-400\">\n <Globe size={16} />\n <span>{t.settings.language}</span>\n </div>\n\n <div className=\"grid gap-2\">\n {languages.map((lang) => {\n const isActive = currentLanguage === lang.code;\n return (\n <button\n key={lang.code}\n onClick={() => onLanguageChange(lang.code)}\n className={`\n flex items-center justify-between px-4 py-3 rounded-lg border transition-all\n ${isActive\n ? 'bg-white/10 border-white/20 text-white'\n : 'bg-black/20 border-transparent text-gray-400 hover:bg-white/5 hover:text-white'\n }\n `}\n >\n <span>{lang.name}</span>\n {isActive && (\n <Check size={16} style={{ color: systemColor }} />\n )}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-4 bg-black/30 border-t border-white/10 text-center\">\n <button\n onClick={onClose}\n className=\"text-sm text-gray-500 hover:text-white transition-colors\"\n >\n {t.modals.shortcuts.pressEsc}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import ControlMapper from './Modals/ControlMapper';\nimport GamepadMapper from './Modals/GamepadMapper';\nimport CheatModal from './Modals/CheatModal';\nimport SavedSlotModal from './Modals/SaveSlotModal';\nimport BiosSelectionModal from './Modals/BiosSelectionModal';\nimport SettingsModal from './Modals/SettingsModal';\nimport { KeyboardMapping } from '../lib/controls';\nimport { SaveSlot } from './types';\n\ninterface GameModalsProps {\n controlsModalOpen: boolean;\n setControlsModalOpen: (open: boolean) => void;\n controls: KeyboardMapping;\n saveControls: (newControls: KeyboardMapping) => void;\n system: string;\n onResume: () => void;\n\n gamepadModalOpen: boolean;\n setGamepadModalOpen: (open: boolean) => void;\n gamepads: any[]; // Using any[] for now as Gamepad type might be complex or standard\n systemColor: string;\n\n cheatsModalOpen: boolean;\n setCheatsModalOpen: (open: boolean) => void;\n cheats: any[]; // Using any[] for Cheat type\n activeCheats: Set<number>;\n onToggleCheat: (cheatId: number) => void;\n\n // Save Slot Modal\n saveModalOpen: boolean;\n setSaveModalOpen: (open: boolean) => void;\n saveModalMode: 'save' | 'load';\n saveSlots: SaveSlot[];\n isSlotLoading: boolean;\n actioningSlot: number | null;\n onSlotSelect: (slot: number) => void;\n onSlotDelete: (slot: number) => void;\n maxSlots?: number;\n currentTier?: string;\n onUpgrade?: () => void;\n\n // Bios Modal\n biosModalOpen: boolean;\n setBiosModalOpen: (open: boolean) => void;\n availableBios?: { id: string; name: string; description?: string }[];\n currentBiosId?: string;\n onSelectBios?: (biosId: string) => void;\n\n // Settings Modal\n settingsModalOpen: boolean;\n setSettingsModalOpen: (open: boolean) => void;\n currentLanguage: string;\n onLanguageChange: (lang: 'en' | 'es' | 'fr') => void;\n}\n\nexport default function GameModals({\n controlsModalOpen,\n setControlsModalOpen,\n controls,\n saveControls,\n system,\n onResume,\n\n gamepadModalOpen,\n setGamepadModalOpen,\n gamepads,\n systemColor,\n\n cheatsModalOpen,\n setCheatsModalOpen,\n cheats,\n activeCheats,\n onToggleCheat,\n\n saveModalOpen,\n setSaveModalOpen,\n saveModalMode,\n saveSlots,\n isSlotLoading,\n actioningSlot,\n onSlotSelect,\n onSlotDelete,\n maxSlots,\n currentTier,\n onUpgrade,\n\n biosModalOpen,\n setBiosModalOpen,\n availableBios,\n currentBiosId,\n onSelectBios,\n\n settingsModalOpen,\n setSettingsModalOpen,\n currentLanguage,\n onLanguageChange,\n}: GameModalsProps) {\n return (\n <>\n <ControlMapper\n isOpen={controlsModalOpen}\n controls={controls}\n onSave={saveControls}\n onClose={() => {\n setControlsModalOpen(false);\n onResume();\n }}\n system={system}\n />\n\n <GamepadMapper\n isOpen={gamepadModalOpen}\n gamepads={gamepads}\n onClose={() => {\n setGamepadModalOpen(false);\n onResume();\n }}\n systemColor={systemColor}\n />\n\n <CheatModal\n isOpen={cheatsModalOpen}\n cheats={cheats}\n activeCheats={activeCheats}\n onToggle={onToggleCheat}\n onClose={() => {\n setCheatsModalOpen(false);\n onResume();\n }}\n />\n\n <SavedSlotModal\n isOpen={saveModalOpen}\n mode={saveModalMode}\n slots={saveSlots}\n isLoading={isSlotLoading}\n actioningSlot={actioningSlot}\n onSelect={onSlotSelect}\n onDelete={onSlotDelete}\n onClose={() => {\n setSaveModalOpen(false);\n onResume();\n }}\n maxSlots={maxSlots}\n currentTier={currentTier}\n onUpgrade={onUpgrade}\n />\n\n <BiosSelectionModal\n isOpen={biosModalOpen}\n biosOptions={availableBios || []}\n currentBiosId={currentBiosId}\n onSelectBios={(id) => {\n setBiosModalOpen(false);\n onSelectBios?.(id);\n }}\n onClose={() => {\n setBiosModalOpen(false);\n onResume();\n }}\n systemColor={systemColor}\n />\n\n <SettingsModal\n isOpen={settingsModalOpen}\n onClose={() => {\n setSettingsModalOpen(false);\n onResume();\n }}\n currentLanguage={currentLanguage}\n onLanguageChange={onLanguageChange}\n systemColor={systemColor}\n />\n </>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport {\n Trophy,\n User,\n Lock,\n ExternalLink,\n AlertCircle,\n Loader2,\n Eye,\n EyeOff,\n} from 'lucide-react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\nexport interface LoginFormProps {\n username: string;\n setUsername: (v: string) => void;\n password: string;\n setPassword: (v: string) => void;\n showPassword: boolean;\n setShowPassword: (v: boolean) => void;\n isLoading: boolean;\n error: string | null;\n onSubmit: (e: React.FormEvent) => void;\n}\n\nexport default function LoginForm({\n username,\n setUsername,\n password,\n setPassword,\n showPassword,\n setShowPassword,\n isLoading,\n error,\n onSubmit,\n}: LoginFormProps) {\n const t = useKoinTranslation();\n\n return (\n <form onSubmit={onSubmit} className=\"p-4 space-y-3\">\n <div className=\"text-center mb-4\">\n <div className=\"w-16 h-16 mx-auto mb-3 rounded-full bg-gradient-to-br from-yellow-500/20 to-orange-500/20 border border-yellow-500/30 flex items-center justify-center\">\n <Trophy className=\"text-yellow-400\" size={32} />\n </div>\n <p className=\"text-gray-400 text-xs\">\n {t.retroAchievements.connectAccount}\n </p>\n <a\n href=\"https://retroachievements.org/createaccount.php\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-yellow-400 hover:text-yellow-300 text-xs inline-flex items-center gap-1 mt-1\"\n >\n {t.retroAchievements.createAccount}\n <ExternalLink size={10} />\n </a>\n </div>\n\n {/* Username */}\n <div>\n <label className=\"block text-[10px] text-gray-500 mb-1 uppercase tracking-wider\">{t.retroAchievements.username}</label>\n <div className=\"relative\">\n <User className=\"absolute left-2.5 top-1/2 -translate-y-1/2 text-gray-500\" size={14} />\n <input\n type=\"text\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n placeholder={t.retroAchievements.yourUsername}\n className=\"w-full pl-8 pr-3 py-2 text-sm bg-black/50 border border-white/20 rounded-lg text-white placeholder-gray-500 focus:border-yellow-500/50 focus:outline-none transition-colors\"\n disabled={isLoading}\n />\n </div>\n </div>\n\n {/* Password */}\n <div>\n <label className=\"block text-[10px] text-gray-500 mb-1 uppercase tracking-wider\">\n {t.retroAchievements.password}\n </label>\n <div className=\"relative\">\n <Lock className=\"absolute left-2.5 top-1/2 -translate-y-1/2 text-gray-500\" size={14} />\n <input\n type={showPassword ? 'text' : 'password'}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder={t.retroAchievements.yourPassword}\n className=\"w-full pl-8 pr-9 py-2 text-sm bg-black/50 border border-white/20 rounded-lg text-white placeholder-gray-500 focus:border-yellow-500/50 focus:outline-none transition-colors\"\n disabled={isLoading}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-2.5 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-300\"\n >\n {showPassword ? <EyeOff size={14} /> : <Eye size={14} />}\n </button>\n </div>\n </div>\n\n {/* Error */}\n {error && (\n <div className=\"flex items-center gap-2 p-2 bg-red-500/10 border border-red-500/30 rounded-lg\">\n <AlertCircle className=\"text-red-400 flex-shrink-0\" size={12} />\n <p className=\"text-xs text-red-300\">{error}</p>\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full flex items-center justify-center gap-2 px-3 py-2.5 bg-gradient-to-r from-yellow-500 to-orange-500 hover:from-yellow-400 hover:to-orange-400 text-black text-sm font-bold rounded-lg transition-all disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {isLoading ? (\n <>\n <Loader2 className=\"animate-spin\" size={14} />\n <span>{t.retroAchievements.connecting}</span>\n </>\n ) : (\n <>\n <Trophy size={14} />\n <span>{t.retroAchievements.login}</span>\n </>\n )}\n </button>\n\n {/* Privacy notice */}\n <div className=\"p-2 bg-blue-500/10 border border-blue-500/20 rounded-lg\">\n <p className=\"text-[10px] text-blue-300 leading-relaxed\">\n <strong>🔒 {t.retroAchievements.privacy}</strong> {t.retroAchievements.privacyText}\n </p>\n </div>\n </form>\n );\n}\n","// RetroAchievements Types & Helpers\n// Extracted from main app for package use\n\nexport const RA_MEDIA_BASE = 'https://media.retroachievements.org';\n\n// ==================== Types ====================\n\nexport interface RACredentials {\n username: string;\n connectToken: string; // Token from password login (for dorequest.php/Connect API)\n apiKey?: string; // Web API Key (optional, for legacy public API calls)\n score?: number;\n softcoreScore?: number;\n avatarUrl?: string;\n}\n\nexport interface RAUser {\n User: string;\n Token: string;\n Score: number;\n SoftcoreScore: number;\n Messages: number;\n Permissions: number;\n AccountType: string;\n}\n\nexport interface RAAchievement {\n ID: number;\n NumAwarded: number;\n NumAwardedHardcore: number;\n Title: string;\n Description: string;\n Points: number;\n TrueRatio: number;\n Author: string;\n DateModified: string;\n DateCreated: string;\n BadgeName: string;\n DisplayOrder: number;\n MemAddr: string; // Achievement trigger conditions\n type: string | null;\n // User progress\n DateEarned?: string;\n DateEarnedHardcore?: string;\n}\n\nexport interface RAGame {\n ID: number;\n Title: string;\n ConsoleID: number;\n ConsoleName: string;\n ForumTopicID: number;\n Flags: number;\n ImageIcon: string;\n ImageTitle: string;\n ImageIngame: string;\n ImageBoxArt: string;\n Publisher: string;\n Developer: string;\n Genre: string;\n Released: string;\n IsFinal: boolean;\n RichPresencePatch?: string;\n NumAchievements?: number;\n NumDistinctPlayersCasual?: number;\n NumDistinctPlayersHardcore?: number;\n}\n\nexport interface RAGameExtended extends RAGame {\n Achievements: Record<string, RAAchievement>;\n NumAwardedToUser?: number;\n NumAwardedToUserHardcore?: number;\n UserCompletion?: string;\n UserCompletionHardcore?: string;\n}\n\n// ==================== Helpers ====================\n\n/**\n * Get achievement badge URL\n */\nexport function getAchievementBadgeUrl(badgeName: string, locked = false): string {\n const suffix = locked ? '_lock' : '';\n return `${RA_MEDIA_BASE}/Badge/${badgeName}${suffix}.png`;\n}\n\n/**\n * Get user avatar URL\n */\nexport function getUserAvatarUrl(userPic: string): string {\n return `${RA_MEDIA_BASE}/UserPic/${userPic}.png`;\n}\n","'use client';\n\nimport {\n Trophy,\n User,\n LogOut,\n ExternalLink,\n Shield,\n CheckCircle,\n} from 'lucide-react';\nimport { RACredentials, RAGameExtended, getUserAvatarUrl } from '../../lib/retroachievements';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\nexport interface SettingsTabProps {\n credentials: RACredentials;\n hardcoreEnabled: boolean;\n onHardcoreChange: (enabled: boolean) => void;\n currentGame: RAGameExtended | null;\n achievementCount: number;\n unlockedCount: number;\n progress: number;\n onLogout: () => void;\n}\n\nexport default function SettingsTab({\n credentials,\n hardcoreEnabled,\n onHardcoreChange,\n currentGame,\n achievementCount,\n unlockedCount,\n progress,\n onLogout,\n}: SettingsTabProps) {\n const t = useKoinTranslation();\n\n return (\n <div className=\"p-3 space-y-3\">\n {/* User Card */}\n <div className=\"flex items-center gap-3 p-3 bg-black/30 rounded-lg border border-yellow-500/20\">\n <div className=\"w-12 h-12 rounded-lg bg-gray-800 overflow-hidden border-2 border-yellow-500/50 flex-shrink-0\">\n {credentials.avatarUrl ? (\n <img\n src={getUserAvatarUrl(credentials.avatarUrl)}\n alt={credentials.username}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <User className=\"text-gray-600\" size={24} />\n </div>\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-heading text-sm text-white truncate\">{credentials.username}</p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <Trophy className=\"text-yellow-400\" size={12} />\n <span className=\"text-xs text-yellow-400\">{credentials.score?.toLocaleString() || 0}</span>\n </div>\n </div>\n <a\n href={`https://retroachievements.org/user/${credentials.username}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-gray-400 hover:text-yellow-400 transition-colors p-1\"\n >\n <ExternalLink size={14} />\n </a>\n </div>\n\n {/* Current Game */}\n {currentGame && (\n <div className=\"p-3 bg-black/30 rounded-lg border border-green-500/20\">\n <div className=\"flex items-center gap-2\">\n {currentGame.ImageIcon && (\n <img\n src={`https://media.retroachievements.org${currentGame.ImageIcon}`}\n alt={currentGame.Title}\n className=\"w-10 h-10 rounded object-cover flex-shrink-0\"\n />\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs font-medium text-white truncate\">{currentGame.Title}</p>\n <p className=\"text-[10px] text-gray-500\">{currentGame.ConsoleName}</p>\n </div>\n </div>\n {achievementCount > 0 && (\n <div className=\"mt-2 pt-2 border-t border-white/10\">\n <div className=\"flex items-center justify-between text-xs mb-1\">\n <span className=\"text-gray-400\">{progress}%</span>\n <span className=\"text-yellow-400\">{unlockedCount}/{achievementCount}</span>\n </div>\n <div className=\"h-1.5 bg-gray-800 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-gradient-to-r from-yellow-500 to-orange-500 transition-all\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Hardcore Mode */}\n <div className=\"p-3 bg-black/30 rounded-lg border border-white/10\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Shield className={hardcoreEnabled ? 'text-red-500' : 'text-gray-500'} size={16} />\n <div>\n <p className=\"text-xs font-medium text-white\">{t.retroAchievements.hardcore}</p>\n <p className=\"text-[10px] text-gray-500\">2x points, no savestates</p>\n </div>\n </div>\n <button\n onClick={() => onHardcoreChange(!hardcoreEnabled)}\n className={`relative w-10 h-5 rounded-full transition-colors ${hardcoreEnabled ? 'bg-red-500' : 'bg-gray-600'\n }`}\n >\n <div\n className={`absolute top-0.5 w-4 h-4 rounded-full bg-white transition-transform ${hardcoreEnabled ? 'translate-x-5' : 'translate-x-0.5'\n }`}\n />\n </button>\n </div>\n\n {hardcoreEnabled && (\n <div className=\"mt-2 p-2 bg-red-500/10 border border-red-500/20 rounded text-[10px] text-red-300\">\n {t.common.disabledInHardcore}\n </div>\n )}\n </div>\n\n {/* Status */}\n <div className=\"flex items-center gap-1.5 text-xs px-1\">\n <CheckCircle className=\"text-green-500\" size={12} />\n <span className=\"text-green-400\">{t.retroAchievements.connectedStatus}</span>\n </div>\n\n {/* Logout */}\n <button\n onClick={onLogout}\n className=\"w-full flex items-center justify-center gap-2 px-3 py-2 bg-gray-800 hover:bg-gray-700 text-white text-xs rounded-lg transition-colors border border-white/10\"\n >\n <LogOut size={14} />\n <span>{t.retroAchievements.logout}</span>\n </button>\n </div>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { Trophy, ExternalLink, CheckCircle } from 'lucide-react';\nimport { RAGameExtended, RAAchievement, getAchievementBadgeUrl } from '../../lib/retroachievements';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\nexport interface AchievementsTabProps {\n currentGame: RAGameExtended | null;\n achievements: RAAchievement[];\n unlockedIds: Set<number>;\n filter: 'all' | 'locked' | 'unlocked';\n setFilter: (f: 'all' | 'locked' | 'unlocked') => void;\n totalCount: number;\n progress: number;\n earnedPoints: number;\n totalPoints: number;\n isHardcoreMode: boolean;\n}\n\nexport default function AchievementsTab({\n currentGame,\n achievements,\n unlockedIds,\n filter,\n setFilter,\n totalCount,\n progress,\n earnedPoints,\n totalPoints,\n}: AchievementsTabProps) {\n const t = useKoinTranslation();\n\n if (!currentGame) {\n return (\n <div className=\"p-6 text-center\">\n <div className=\"w-12 h-12 mx-auto mb-3 rounded-full bg-gray-800 flex items-center justify-center\">\n <Trophy className=\"text-gray-600\" size={24} />\n </div>\n <p className=\"text-sm text-gray-400\">{t.retroAchievements.noGame}</p>\n <p className=\"text-xs text-gray-500 mt-1\">{t.retroAchievements.loadGame}</p>\n </div>\n );\n }\n\n if (achievements.length === 0) {\n return (\n <div className=\"p-6 text-center\">\n <div className=\"w-12 h-12 mx-auto mb-3 rounded-full bg-gray-800 flex items-center justify-center\">\n <Trophy className=\"text-gray-600\" size={24} />\n </div>\n <p className=\"text-sm text-gray-400\">{t.retroAchievements.noAchievements}</p>\n <p className=\"text-xs text-gray-500 mt-1\">{t.retroAchievements.notSupported}</p>\n </div>\n );\n }\n\n return (\n <div>\n {/* Game Header + Progress */}\n <div className=\"p-3 border-b border-gray-800/50 bg-black/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n {currentGame.ImageIcon && (\n <img\n src={`https://media.retroachievements.org${currentGame.ImageIcon}`}\n alt={currentGame.Title}\n className=\"w-8 h-8 rounded object-cover flex-shrink-0\"\n />\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs font-medium text-white truncate\">{currentGame.Title}</p>\n <p className=\"text-[10px] text-gray-500\">{currentGame.ConsoleName}</p>\n </div>\n <a\n href={`https://retroachievements.org/game/${currentGame.ID}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-gray-400 hover:text-yellow-400 transition-colors p-1\"\n >\n <ExternalLink size={12} />\n </a>\n </div>\n\n {/* Progress */}\n <div className=\"flex items-center gap-2 text-xs\">\n <div className=\"flex-1 h-1.5 bg-gray-800 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-gradient-to-r from-yellow-500 to-orange-500 transition-all\"\n style={{ width: `${progress}%` }}\n />\n </div>\n <span className=\"text-yellow-400 font-medium whitespace-nowrap\">\n {unlockedIds.size}/{totalCount}\n </span>\n <span className=\"text-gray-500\">•</span>\n <span className=\"text-gray-400 whitespace-nowrap\">{earnedPoints} pts</span>\n </div>\n\n {/* Filters */}\n <div className=\"flex gap-1 mt-2\">\n {(['all', 'locked', 'unlocked'] as const).map(f => (\n <button\n key={f}\n onClick={() => setFilter(f)}\n className={`px-2 py-0.5 text-[10px] rounded-full border transition-colors ${filter === f\n ? 'bg-yellow-500/20 border-yellow-500/50 text-yellow-400'\n : 'border-gray-700 text-gray-500 hover:text-gray-300'\n }`}\n >\n {t.retroAchievements.filters[f]}\n </button>\n ))}\n </div>\n </div>\n\n {/* Achievement List */}\n <div className=\"divide-y divide-gray-800/50\">\n {achievements.map((achievement) => {\n const unlocked = unlockedIds.has(achievement.ID);\n\n return (\n <div\n key={achievement.ID}\n className={`flex items-center gap-2 p-2 transition-colors ${unlocked ? 'bg-yellow-500/5' : 'hover:bg-gray-800/30'\n }`}\n >\n {/* Badge */}\n <div className=\"relative flex-shrink-0\">\n <img\n src={getAchievementBadgeUrl(achievement.BadgeName, !unlocked)}\n alt=\"\"\n className={`w-8 h-8 rounded border ${unlocked\n ? 'border-yellow-500/50'\n : 'border-gray-700 opacity-40 grayscale'\n }`}\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n {unlocked && (\n <div className=\"absolute -top-0.5 -right-0.5\">\n <CheckCircle className=\"text-green-500 bg-gray-900 rounded-full\" size={10} />\n </div>\n )}\n </div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <p className={`text-xs font-medium truncate ${unlocked ? 'text-white' : 'text-gray-400'}`}>\n {achievement.Title}\n </p>\n <p className={`text-[10px] truncate ${unlocked ? 'text-gray-500' : 'text-gray-600'}`}>\n {achievement.Description}\n </p>\n </div>\n\n {/* Points */}\n <div className={`flex-shrink-0 px-1.5 py-0.5 rounded text-[10px] font-bold ${unlocked\n ? 'bg-yellow-500/20 text-yellow-400'\n : 'bg-gray-800 text-gray-500'\n }`}>\n {achievement.Points}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Footer */}\n <div className=\"p-2 text-[10px] text-gray-500 text-center border-t border-gray-800/50\">\n {progress}% complete • {t.retroAchievements.ptsRemaining.replace('{{count}}', (totalPoints - earnedPoints).toString())}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { X, Trophy, Settings, List } from 'lucide-react';\nimport { RACredentials, RAGameExtended, RAAchievement } from '../../lib/retroachievements';\nimport LoginForm from './LoginForm';\nimport SettingsTab from './SettingsTab';\nimport AchievementsTab from './AchievementsTab';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ntype TabType = 'achievements' | 'settings';\n\nexport interface RASidebarProps {\n isOpen: boolean;\n onClose: () => void;\n // Auth\n isLoggedIn: boolean;\n credentials: RACredentials | null;\n isLoading: boolean;\n error?: string | null;\n onLogin: (username: string, password: string) => Promise<boolean>;\n onLogout: () => void;\n // Hardcore\n hardcoreEnabled: boolean;\n onHardcoreChange: (enabled: boolean) => void;\n // Game & Achievements\n currentGame: RAGameExtended | null;\n achievements: RAAchievement[];\n unlockedIds: Set<number>;\n}\n\nexport default function RASidebar({\n isOpen,\n onClose,\n isLoggedIn,\n credentials,\n isLoading,\n error,\n onLogin,\n onLogout,\n hardcoreEnabled,\n onHardcoreChange,\n currentGame,\n achievements,\n unlockedIds,\n}: RASidebarProps) {\n const t = useKoinTranslation();\n // If logged in and has game, show achievements tab by default\n const defaultTab: TabType = (isLoggedIn && currentGame && achievements.length > 0) ? 'achievements' : 'settings';\n const [activeTab, setActiveTab] = useState<TabType>(defaultTab);\n const [filter, setFilter] = useState<'all' | 'locked' | 'unlocked'>('all');\n\n // Login form state\n const [username, setUsername] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [localError, setLocalError] = useState<string | null>(null);\n\n // Reset form and tab when sidebar opens/closes\n useEffect(() => {\n if (!isOpen) {\n setUsername('');\n setPassword('');\n setShowPassword(false);\n setLocalError(null);\n } else {\n // Set default tab based on state\n if (isLoggedIn && currentGame && achievements.length > 0) {\n setActiveTab('achievements');\n } else {\n setActiveTab('settings');\n }\n }\n }, [isOpen, isLoggedIn, currentGame, achievements.length]);\n\n const handleLogin = async (e: React.FormEvent) => {\n e.preventDefault();\n setLocalError(null);\n\n if (!username.trim() || !password.trim()) {\n setLocalError(t.retroAchievements.usernameRequired);\n return;\n }\n\n const success = await onLogin(username.trim(), password.trim());\n if (success) {\n setPassword('');\n }\n };\n\n const handleLogout = () => {\n onLogout();\n setUsername('');\n setPassword('');\n };\n\n if (!isOpen) return null;\n\n // Achievement stats\n const totalPoints = achievements.reduce((sum, a) => sum + (a.Points || 0), 0);\n const earnedPoints = achievements\n .filter(a => unlockedIds.has(a.ID))\n .reduce((sum, a) => sum + (a.Points || 0), 0);\n const progress = achievements.length > 0\n ? Math.round((unlockedIds.size / achievements.length) * 100)\n : 0;\n\n // Sort and filter achievements\n const sortedAchievements = [...achievements].sort((a, b) => {\n const aUnlocked = unlockedIds.has(a.ID);\n const bUnlocked = unlockedIds.has(b.ID);\n if (aUnlocked && !bUnlocked) return 1;\n if (!aUnlocked && bUnlocked) return -1;\n return (a.DisplayOrder || 0) - (b.DisplayOrder || 0);\n });\n\n const filteredAchievements = sortedAchievements.filter(a => {\n const unlocked = unlockedIds.has(a.ID);\n if (filter === 'locked') return !unlocked;\n if (filter === 'unlocked') return unlocked;\n return true;\n });\n\n return (\n <div className=\"koin-scope\" style={{ display: 'contents' }}>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 bg-black/50 z-40 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n {/* Sidebar Panel */}\n <div className=\"fixed right-0 top-0 bottom-0 w-80 max-w-[90vw] bg-gray-900 border-l border-yellow-500/20 z-50 flex flex-col shadow-2xl animate-slide-in-right\">\n\n {/* Header */}\n <div className=\"p-3 bg-gradient-to-r from-yellow-500/10 to-orange-500/10 border-b border-yellow-500/20 flex-shrink-0\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Trophy className=\"text-yellow-400\" size={18} />\n <span className=\"font-heading text-sm text-white\">{t.retroAchievements.title}</span>\n </div>\n <button\n onClick={onClose}\n className=\"text-gray-400 hover:text-white transition-colors p-1\"\n >\n <X size={16} />\n </button>\n </div>\n\n {/* Tabs - only show if logged in */}\n {isLoggedIn && (\n <div className=\"flex gap-1 mt-2 bg-black/30 rounded-lg p-0.5\">\n <button\n onClick={() => setActiveTab('achievements')}\n className={`flex-1 flex items-center justify-center gap-1.5 px-2 py-1.5 text-xs rounded-md transition-colors ${activeTab === 'achievements'\n ? 'bg-yellow-500/20 text-yellow-400'\n : 'text-gray-400 hover:text-white'\n }`}\n >\n <List size={12} />\n {t.retroAchievements.achievements}\n </button>\n <button\n onClick={() => setActiveTab('settings')}\n className={`flex-1 flex items-center justify-center gap-1.5 px-2 py-1.5 text-xs rounded-md transition-colors ${activeTab === 'settings'\n ? 'bg-yellow-500/20 text-yellow-400'\n : 'text-gray-400 hover:text-white'\n }`}\n >\n <Settings size={12} />\n {t.settings.title}\n </button>\n </div>\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto overscroll-contain\">\n {!isLoggedIn ? (\n <LoginForm\n username={username}\n setUsername={setUsername}\n password={password}\n setPassword={setPassword}\n showPassword={showPassword}\n setShowPassword={setShowPassword}\n isLoading={isLoading}\n error={error || localError}\n onSubmit={handleLogin}\n />\n ) : activeTab === 'settings' ? (\n <SettingsTab\n credentials={credentials!}\n hardcoreEnabled={hardcoreEnabled}\n onHardcoreChange={onHardcoreChange}\n currentGame={currentGame}\n achievementCount={achievements.length}\n unlockedCount={unlockedIds.size}\n progress={progress}\n onLogout={handleLogout}\n />\n ) : (\n <AchievementsTab\n currentGame={currentGame}\n achievements={filteredAchievements}\n unlockedIds={unlockedIds}\n filter={filter}\n setFilter={setFilter}\n totalCount={achievements.length}\n progress={progress}\n earnedPoints={earnedPoints}\n totalPoints={totalPoints}\n isHardcoreMode={hardcoreEnabled}\n />\n )}\n </div>\n\n {/* Footer */}\n <div className=\"p-2 border-t border-gray-800 bg-gray-900/80 text-[10px] text-gray-500 text-center flex-shrink-0\">\n {t.retroAchievements.poweredBy}{' '}\n <a\n href=\"https://retroachievements.org\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-yellow-500 hover:text-yellow-400\"\n >\n RetroAchievements.org\n </a>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\n\nexport type ToastType = 'success' | 'error' | 'info' | 'warning' | 'gamepad';\n\nexport interface Toast {\n id: string;\n message: string;\n type: ToastType;\n title?: string;\n icon?: string; // Emoji or icon name\n duration?: number;\n action?: {\n label: string;\n onClick: () => void;\n };\n}\n\nexport interface ShowToastOptions {\n title?: string;\n icon?: string;\n duration?: number;\n action?: Toast['action'];\n}\n\nexport interface UseToastReturn {\n toasts: Toast[];\n showToast: (message: string, type?: ToastType, options?: ShowToastOptions) => void;\n dismissToast: (id: string) => void;\n clearToasts: () => void;\n}\n\n/**\n * Hook for managing toast notifications\n * @param defaultDuration - Default duration for toasts (default 3000ms)\n */\nexport function useToast(defaultDuration: number = 3000): UseToastReturn {\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const showToast = useCallback((\n message: string,\n type: ToastType = 'info',\n options?: ShowToastOptions\n ) => {\n const id = crypto.randomUUID();\n const duration = options?.duration ?? defaultDuration;\n\n const newToast: Toast = {\n id,\n message,\n type,\n title: options?.title,\n icon: options?.icon,\n duration,\n action: options?.action,\n };\n\n setToasts((prev) => [...prev, newToast]);\n\n // Auto-dismiss after duration\n if (duration > 0) {\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, duration);\n }\n }, [defaultDuration]);\n\n const dismissToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n const clearToasts = useCallback(() => {\n setToasts([]);\n }, []);\n\n return {\n toasts,\n showToast,\n dismissToast,\n clearToasts,\n };\n}\n","import { useState, useRef, useCallback, useEffect } from 'react';\nimport { useToast } from './useToast';\nimport { useMobile } from './useMobile';\nimport {\n isFullscreen as checkIsFullscreen,\n setupFullscreenListener,\n toggleFullscreen,\n} from '../components/VirtualController/utils/viewport';\n\nexport function useGameUI() {\n const { isMobile } = useMobile();\n const containerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n // Toast notifications\n const { toasts, showToast, dismissToast } = useToast(3500);\n\n // Fullscreen handling\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [raSidebarOpen, setRaSidebarOpen] = useState(false);\n\n const checkFullscreen = useCallback(() => {\n const fullscreen = checkIsFullscreen();\n setIsFullscreen(fullscreen);\n return fullscreen;\n }, []);\n\n useEffect(() => {\n checkFullscreen();\n return setupFullscreenListener(checkFullscreen);\n }, [checkFullscreen]);\n\n const handleFullscreen = useCallback(async () => {\n if (!containerRef.current) return;\n\n try {\n const nativeWorked = await toggleFullscreen(containerRef.current);\n // If native fullscreen didn't work (e.g. iOS Safari), toggle visual fullscreen\n if (!nativeWorked && !checkIsFullscreen()) {\n setIsFullscreen(prev => !prev);\n }\n } catch (err) {\n console.warn('Fullscreen toggle failed, using visual fallback:', err);\n setIsFullscreen(prev => !prev);\n }\n }, []);\n\n return {\n containerRef,\n canvasRef,\n isMobile,\n isFullscreen,\n toasts,\n showToast,\n dismissToast,\n handleFullscreen,\n raSidebarOpen,\n setRaSidebarOpen,\n };\n}\n","export interface SystemConfig {\n // Canonical key - the internal identifier (e.g., 'NES', 'GB', 'GBA')\n key: string;\n\n // Display info\n label: string; // User-friendly name (e.g., 'Nintendo (NES)')\n fullName: string; // Full name (e.g., 'Nintendo Entertainment System')\n slug: string; // URL-friendly (e.g., 'nes')\n\n // File detection\n extensions: string[]; // File extensions (e.g., ['.nes'])\n\n // Emulation\n core: string; // RetroArch core (e.g., 'fceumm')\n\n // Database matching (LaunchBox)\n dbNames: string[]; // Possible DB names to search for\n\n // UI\n iconName: string; // ConsoleIcon component name\n color: string; // Tailwind hover color class\n accentHex: string; // Hex color for accents\n\n // Aliases - other names that should map to this system\n aliases: string[];\n\n // Metadata\n biosNeeded?: boolean;\n biosFileNames?: string[]; // Expected filenames for BIOS matching\n biosLocation?: 'system' | 'rom_folder'; // Where to mount the BIOS ('system' dir or alongside 'rom_folder')\n}\n\n/**\n * The master system configuration\n * Order matters for display in dropdowns\n */\nexport const SYSTEMS: SystemConfig[] = [\n // ============ Nintendo ============\n {\n key: 'NES',\n label: 'Nintendo (NES)',\n fullName: 'Nintendo Entertainment System',\n slug: 'nes',\n extensions: ['.nes'],\n core: 'fceumm',\n dbNames: ['NES', 'Nintendo Entertainment System'],\n iconName: 'NES',\n color: 'group-hover:text-[#FF3333]',\n accentHex: '#FF3333',\n aliases: ['NINTENDO ENTERTAINMENT SYSTEM', 'FAMICOM'],\n },\n {\n key: 'SNES',\n label: 'Super Nintendo (SNES)',\n fullName: 'Super Nintendo Entertainment System',\n slug: 'snes',\n extensions: ['.snes', '.smc', '.sfc'],\n core: 'snes9x',\n dbNames: ['SNES', 'Super Nintendo Entertainment System'],\n iconName: 'SNES',\n color: 'group-hover:text-[#AA00FF]',\n accentHex: '#AA00FF',\n aliases: ['SUPER NINTENDO', 'SUPER NINTENDO ENTERTAINMENT SYSTEM', 'SUPER FAMICOM'],\n },\n {\n key: 'N64',\n label: 'Nintendo 64',\n fullName: 'Nintendo 64',\n slug: 'n64',\n extensions: ['.n64', '.z64', '.v64'],\n core: 'mupen64plus_next',\n dbNames: ['N64', 'Nintendo 64'],\n iconName: 'N64',\n color: 'group-hover:text-[#FFD600]',\n accentHex: '#FFD600',\n aliases: ['NINTENDO 64'],\n },\n {\n key: 'GB',\n label: 'Game Boy',\n fullName: 'Game Boy',\n slug: 'gb',\n extensions: ['.gb'],\n core: 'gambatte',\n dbNames: ['Nintendo Game Boy'],\n iconName: 'GB',\n color: 'group-hover:text-[#76FF03]',\n accentHex: '#76FF03',\n aliases: ['GAME BOY', 'GAMEBOY', 'NINTENDO GAME BOY'],\n },\n {\n key: 'GBC',\n label: 'Game Boy Color',\n fullName: 'Game Boy Color',\n slug: 'gbc',\n extensions: ['.gbc'],\n core: 'gambatte',\n dbNames: ['Nintendo Game Boy Color'],\n iconName: 'GBC',\n color: 'group-hover:text-[#F50057]',\n accentHex: '#F50057',\n aliases: ['GAME BOY COLOR', 'GAMEBOY COLOR', 'NINTENDO GAME BOY COLOR'],\n },\n {\n key: 'GBA',\n label: 'Game Boy Advance',\n fullName: 'Game Boy Advance',\n slug: 'gba',\n extensions: ['.gba'],\n core: 'mgba',\n dbNames: ['Nintendo Game Boy Advance'],\n iconName: 'GBA',\n color: 'group-hover:text-[#304FFE]',\n accentHex: '#304FFE',\n aliases: ['GAME BOY ADVANCE', 'GAMEBOY ADVANCE', 'NINTENDO GAME BOY ADVANCE'],\n },\n {\n key: 'NDS',\n label: 'Nintendo DS',\n fullName: 'Nintendo DS',\n slug: 'nds',\n extensions: ['.nds'],\n core: 'desmume',\n dbNames: ['Nintendo DS'],\n iconName: 'NDS',\n color: 'group-hover:text-[#C51162]',\n accentHex: '#C51162',\n aliases: ['NDS', 'NINTENDO DS'],\n },\n {\n key: 'VIRTUAL_BOY',\n label: 'Virtual Boy',\n fullName: 'Virtual Boy',\n slug: 'virtualboy',\n extensions: ['.vb'],\n core: 'mednafen_vb',\n dbNames: ['Nintendo Virtual Boy'],\n iconName: 'VIRTUAL_BOY',\n color: 'group-hover:text-[#D50000]',\n accentHex: '#D50000',\n aliases: ['VIRTUAL BOY', 'NINTENDO VIRTUAL BOY'],\n },\n\n {\n key: 'DREAMCAST',\n label: 'Sega Dreamcast',\n fullName: 'Sega Dreamcast',\n slug: 'dreamcast',\n extensions: ['.cdi', '.gdi', '.chd'],\n core: 'flycast',\n dbNames: ['Sega Dreamcast'],\n iconName: 'DREAMCAST', // Use existing icon or fallback\n color: 'group-hover:text-[#FF6D00]',\n accentHex: '#FF6D00',\n aliases: ['DREAMCAST', 'SEGA DREAMCAST'],\n biosNeeded: true,\n biosFileNames: ['dc_boot.bin', 'dc_flash.bin'],\n },\n {\n key: 'SATURN',\n label: 'Sega Saturn',\n fullName: 'Sega Saturn',\n slug: 'saturn',\n extensions: ['.cue', '.chd', '.iso'],\n core: 'yabasanshiro',\n dbNames: ['Sega Saturn'],\n iconName: 'SATURN',\n color: 'group-hover:text-[#6200EA]',\n accentHex: '#6200EA',\n aliases: ['SATURN', 'SEGA SATURN'],\n biosNeeded: true,\n biosFileNames: ['sega_101.bin', 'mpr-17933.bin'],\n },\n {\n key: 'GENESIS',\n label: 'Sega Genesis',\n fullName: 'Sega Genesis / Mega Drive',\n slug: 'genesis',\n extensions: ['.gen', '.md', '.smd', '.bin'],\n core: 'genesis_plus_gx',\n dbNames: ['GENESIS', 'Sega Genesis', 'Sega Mega Drive'],\n iconName: 'GENESIS',\n color: 'group-hover:text-[#2979FF]',\n accentHex: '#2979FF',\n aliases: ['SEGA GENESIS', 'MEGA DRIVE', 'SEGA MEGA DRIVE', 'MEGADRIVE'],\n biosNeeded: true, // For Sega CD\n biosFileNames: ['bios_CD_U.bin', 'bios_CD_E.bin', 'bios_CD_J.bin'],\n },\n {\n key: 'MASTER_SYSTEM',\n label: 'Sega Master System',\n fullName: 'Sega Master System',\n slug: 'mastersystem',\n extensions: ['.sms'],\n core: 'gearsystem',\n dbNames: ['Sega Master System'],\n iconName: 'MASTER_SYSTEM',\n color: 'group-hover:text-[#FF3D00]',\n accentHex: '#FF3D00',\n aliases: ['MASTER SYSTEM', 'SEGA MASTER SYSTEM', 'SMS'],\n },\n {\n key: 'GAME_GEAR',\n label: 'Sega Game Gear',\n fullName: 'Sega Game Gear',\n slug: 'gamegear',\n extensions: ['.gg'],\n core: 'gearsystem',\n dbNames: ['Sega Game Gear'],\n iconName: 'GAME_GEAR',\n color: 'group-hover:text-[#1DE9B6]',\n accentHex: '#1DE9B6',\n aliases: ['GAME GEAR', 'SEGA GAME GEAR', 'GG'],\n },\n\n // ============ Sony ============\n {\n key: 'PS1',\n label: 'PlayStation',\n fullName: 'Sony PlayStation',\n slug: 'ps1',\n extensions: ['.iso', '.cue', '.pbp'],\n core: 'pcsx_rearmed',\n dbNames: ['PLAYSTATION', 'Sony Playstation', 'Sony PlayStation'],\n iconName: 'PS1',\n color: 'group-hover:text-[#448AFF]',\n accentHex: '#448AFF',\n aliases: ['PLAYSTATION', 'PSX', 'PS', 'SONY PLAYSTATION'],\n biosNeeded: true,\n biosFileNames: ['scph5500.bin', 'scph5501.bin', 'scph5502.bin', 'scph1001.bin'],\n },\n {\n key: 'PSP',\n label: 'PlayStation Portable',\n fullName: 'Sony PlayStation Portable',\n slug: 'psp',\n extensions: ['.iso', '.cso'],\n core: 'ppsspp',\n dbNames: ['Sony PSP', 'PSP'],\n iconName: 'PSP',\n color: 'group-hover:text-[#00B0FF]',\n accentHex: '#00B0FF',\n aliases: ['PSP', 'PLAYSTATION PORTABLE'],\n },\n\n // ============ NEC ============\n {\n key: 'PC_ENGINE',\n label: 'PC Engine / TurboGrafx-16',\n fullName: 'PC Engine / TurboGrafx-16',\n slug: 'pcengine',\n extensions: ['.pce'],\n core: 'mednafen_pce_fast',\n dbNames: ['PC Engine', 'TurboGrafx-16', 'NEC PC Engine', 'NEC TurboGrafx-16'],\n iconName: 'PC_ENGINE',\n color: 'group-hover:text-[#FF9100]',\n accentHex: '#FF9100',\n aliases: ['PC ENGINE', 'TURBOGRAFX-16', 'TURBOGRAFX', 'PCE', 'TG16'],\n biosNeeded: true, // For CD games\n biosFileNames: ['syscard3.pce'],\n },\n\n // ============ SNK ============\n {\n key: 'NEOGEO',\n label: 'Neo Geo',\n fullName: 'SNK Neo Geo',\n slug: 'neogeo',\n extensions: ['.neo'],\n core: 'fbalpha2012_neogeo',\n dbNames: ['SNK Neo Geo MVS', 'SNK Neo Geo AES', 'SNK Neo Geo CD', 'Neo Geo'],\n iconName: 'NEOGEO',\n color: 'group-hover:text-[#C62828]',\n accentHex: '#C62828',\n aliases: ['NEO GEO', 'NEO-GEO', 'SNK NEO GEO'],\n biosNeeded: true,\n biosFileNames: ['neogeo.zip'],\n biosLocation: 'rom_folder',\n },\n {\n key: 'NEOGEO_POCKET',\n label: 'Neo Geo Pocket',\n fullName: 'SNK Neo Geo Pocket',\n slug: 'neogeopocket',\n extensions: ['.ngp'],\n core: 'mednafen_ngp',\n dbNames: ['SNK Neo Geo Pocket'],\n iconName: 'NEOGEO_POCKET',\n color: 'group-hover:text-[#00B0FF]',\n accentHex: '#00B0FF',\n aliases: ['NEO GEO POCKET', 'NGP'],\n },\n {\n key: 'NEOGEO_POCKET_COLOR',\n label: 'Neo Geo Pocket Color',\n fullName: 'SNK Neo Geo Pocket Color',\n slug: 'neogeopocketcolor',\n extensions: ['.ngc'],\n core: 'mednafen_ngp',\n dbNames: ['SNK Neo Geo Pocket Color'],\n iconName: 'NEOGEO_POCKET',\n color: 'group-hover:text-[#FF4081]',\n accentHex: '#FF4081',\n aliases: ['NEO GEO POCKET COLOR', 'NGPC'],\n },\n\n // ============ Atari ============\n {\n key: 'LYNX',\n label: 'Atari Lynx',\n fullName: 'Atari Lynx',\n slug: 'lynx',\n extensions: ['.lnx'],\n core: 'handy',\n dbNames: ['Atari Lynx'],\n iconName: 'LYNX',\n color: 'group-hover:text-[#FFC400]',\n accentHex: '#FFC400',\n aliases: ['ATARI LYNX'],\n biosNeeded: true,\n biosFileNames: ['lynxboot.img'],\n },\n {\n key: 'ATARI_2600',\n label: 'Atari 2600',\n fullName: 'Atari 2600',\n slug: 'atari2600',\n extensions: ['.a26'],\n core: 'stella',\n dbNames: ['Atari 2600'],\n iconName: 'ATARI_2600',\n color: 'group-hover:text-[#E64A19]',\n accentHex: '#E64A19',\n aliases: ['ATARI 2600', 'ATARI2600'],\n },\n {\n key: 'ATARI_7800',\n label: 'Atari 7800',\n fullName: 'Atari 7800',\n slug: 'atari7800',\n extensions: ['.a78'],\n core: 'prosystem',\n dbNames: ['Atari 7800'],\n iconName: 'ATARI_7800',\n color: 'group-hover:text-[#BF360C]',\n accentHex: '#BF360C',\n aliases: ['ATARI 7800', 'ATARI7800'],\n },\n\n // ============ Other ============\n {\n key: 'WONDERSWAN',\n label: 'WonderSwan',\n fullName: 'Bandai WonderSwan',\n slug: 'wonderswan',\n extensions: ['.ws'],\n core: 'mednafen_wswan',\n dbNames: ['Bandai WonderSwan'],\n iconName: 'WONDERSWAN',\n color: 'group-hover:text-[#00E5FF]',\n accentHex: '#00E5FF',\n aliases: ['WONDERSWAN', 'WONDER SWAN', 'BANDAI WONDERSWAN'],\n },\n {\n key: 'WONDERSWAN_COLOR',\n label: 'WonderSwan Color',\n fullName: 'Bandai WonderSwan Color',\n slug: 'wonderswancolor',\n extensions: ['.wsc'],\n core: 'mednafen_wswan',\n dbNames: ['Bandai WonderSwan Color'],\n iconName: 'WONDERSWAN',\n color: 'group-hover:text-[#00BCD4]',\n accentHex: '#00BCD4',\n aliases: ['WONDERSWAN COLOR', 'WONDER SWAN COLOR', 'BANDAI WONDERSWAN COLOR', 'WSC'],\n },\n {\n key: 'ARCADE',\n label: 'Arcade (FBNeo)',\n fullName: 'Arcade',\n slug: 'arcade',\n extensions: ['.zip'],\n core: 'fbneo',\n dbNames: ['Arcade', 'MAME', 'FBNeo', 'FinalBurn Neo'],\n iconName: 'ARCADE',\n color: 'group-hover:text-[#D500F9]',\n accentHex: '#D500F9',\n aliases: ['MAME', 'CPS1', 'CPS2', 'CPS3', 'FBNEO', 'FINALBURN', 'SYSTEM16', 'SEGA SYSTEM 16'],\n biosNeeded: true,\n },\n {\n key: 'C64',\n label: 'Commodore 64',\n fullName: 'Commodore 64',\n slug: 'c64',\n extensions: ['.d64', '.t64', '.tap', '.prg'],\n core: 'vice_x64',\n dbNames: ['Commodore 64'],\n iconName: 'C64',\n color: 'group-hover:text-[#795548]',\n accentHex: '#795548',\n aliases: ['C64', 'COMMODORE 64'],\n },\n {\n key: 'DOS',\n label: 'MS-DOS',\n fullName: 'MS-DOS',\n slug: 'dos',\n extensions: ['.zip', '.exe', '.com', '.bat'],\n core: 'dosbox_pure',\n dbNames: ['MS-DOS', 'F-DOS', 'DOS'],\n iconName: 'DOS',\n color: 'group-hover:text-[#607D8B]',\n accentHex: '#607D8B',\n aliases: ['DOS', 'MSDOS', 'MS-DOS'],\n },\n];\n","/**\n * Unified System Configuration\n * \n * SINGLE SOURCE OF TRUTH for all system-related data:\n * - Canonical system keys (used internally)\n * - File extensions → system detection\n * - System → RetroArch emulator core\n * - System → Database names (for LaunchBox matching)\n * - System → Display metadata (UI labels, colors, icons)\n * \n * All other files should import from here instead of maintaining their own mappings.\n */\n\nimport { SYSTEMS, SystemConfig } from '../data/systems-data';\n\nexport type { SystemConfig };\nexport { SYSTEMS };\n\n// ============ Lookup Maps (built from SYSTEMS) ============\n\n// Key → System config\nconst systemByKey = new Map<string, SystemConfig>();\n\n// Alias (uppercase) → System config\nconst systemByAlias = new Map<string, SystemConfig>();\n\n// Extension (lowercase) → System config\nconst systemByExtension = new Map<string, SystemConfig>();\n\n// DB name (lowercase) → System config\nconst systemByDbName = new Map<string, SystemConfig>();\n\n// Build all lookup maps\nfor (const sys of SYSTEMS) {\n // By key\n systemByKey.set(sys.key, sys);\n\n // By aliases (include key itself)\n systemByAlias.set(sys.key.toUpperCase(), sys);\n for (const alias of sys.aliases) {\n systemByAlias.set(alias.toUpperCase(), sys);\n }\n\n // By extension\n for (const ext of sys.extensions) {\n systemByExtension.set(ext.toLowerCase(), sys);\n }\n\n // By DB name\n for (const dbName of sys.dbNames) {\n systemByDbName.set(dbName.toLowerCase(), sys);\n }\n}\n\n// ============ Public API ============\n\n/**\n * Get system by canonical key (e.g., 'NES', 'GBA')\n */\nexport function getSystemByKey(key: string): SystemConfig | undefined {\n return systemByKey.get(key);\n}\n\n/**\n * Get system by any name/alias (case-insensitive)\n * Tries: exact key match, then alias match\n */\nexport function getSystem(name: string): SystemConfig | undefined {\n const upper = name.toUpperCase().trim();\n return systemByAlias.get(upper);\n}\n\n/**\n * Get system from file extension (e.g., '.nes', '.gba')\n */\nexport function getSystemFromExtension(filename: string): SystemConfig | undefined {\n const match = filename.match(/\\.[^.]+$/);\n if (!match) return undefined;\n return systemByExtension.get(match[0].toLowerCase());\n}\n\n/**\n * Get system by database name (for LaunchBox matching)\n */\nexport function getSystemByDbName(dbName: string): SystemConfig | undefined {\n return systemByDbName.get(dbName.toLowerCase());\n}\n\n/**\n * Get RetroArch core for a system name (case-insensitive)\n * Falls back to 'fceumm' (NES) if not found\n */\nexport function getCore(systemName: string): string {\n const sys = getSystem(systemName);\n return sys?.core ?? 'fceumm';\n}\n\n/**\n * Get DB names for matching (used in game search)\n */\nexport function getDBSystemNames(systemKey: string): string[] {\n const sys = getSystem(systemKey);\n return sys?.dbNames ?? [systemKey];\n}\n\n/**\n * Check if a system is supported\n */\nexport function isSystemSupported(name: string): boolean {\n return getSystem(name) !== undefined;\n}\n\n/**\n * Get all supported extensions\n */\nexport function getSupportedExtensions(): string[] {\n const exts = new Set<string>();\n for (const sys of SYSTEMS) {\n for (const ext of sys.extensions) {\n exts.add(ext);\n }\n }\n // Add .zip as special case (handled separately)\n exts.add('.zip');\n return Array.from(exts);\n}\n\n/**\n * Get all systems for UI dropdown\n */\nexport function getSystemsList(): Array<{ value: string; label: string; iconName: string; color: string }> {\n return SYSTEMS.map(sys => ({\n value: sys.key,\n label: sys.label,\n iconName: sys.iconName,\n color: sys.color,\n }));\n}\n\n/**\n * Detect system from filename\n * Returns null for ZIP files (user must select)\n */\nexport function detectSystem(filename: string): SystemConfig | undefined {\n const ext = filename.match(/\\.[^.]+$/)?.[0]?.toLowerCase();\n if (ext === '.zip') return undefined;\n return getSystemFromExtension(filename);\n}\n\n/**\n * Check if two system names refer to the same platform\n */\nexport function systemsMatch(name1: string, name2: string): boolean {\n const sys1 = getSystem(name1);\n const sys2 = getSystem(name2);\n if (!sys1 || !sys2) return false;\n return sys1.key === sys2.key;\n}\n\n/**\n * Normalize a system name to its canonical key\n */\nexport function normalizeSystemKey(name: string): string {\n const sys = getSystem(name);\n return sys?.key ?? name;\n}\n\n// Legacy export names for backward compatibility\nexport const SUPPORTED_EXTENSIONS = getSupportedExtensions();\n\n// Performance Optimization Tiers\n// ===============================\n// Systems are grouped by CPU complexity to apply optimal RetroArch settings.\n// See useEmulatorCore.ts getOptimizedConfig() for the actual settings applied.\n\n/**\n * TIER 1: \"Zero Lag\" - Lightweight Systems\n * ----------------------------------------\n * These 8-bit and 16-bit systems have low CPU requirements in WASM,\n * allowing us to enable Run-Ahead (frame prediction) for near-zero input latency.\n * \n * Run-Ahead works by running the emulator ahead by 1 frame and using that\n * result for display, effectively cutting 1 frame (~16ms) of input lag.\n */\nexport const PERFORMANCE_TIER_1_SYSTEMS = new Set([\n 'NES', 'SNES', 'GENESIS', 'GB', 'GBC',\n 'MASTER_SYSTEM', 'GAME_GEAR', 'PC_ENGINE',\n 'ATARI_2600', 'ATARI_7800', 'LYNX',\n 'NEOGEO_POCKET', 'NEOGEO_POCKET_COLOR',\n 'WONDERSWAN', 'WONDERSWAN_COLOR'\n]);\n\n/**\n * TIER 2: \"Max Smoothness\" - Heavy Systems\n * ----------------------------------------\n * These 32-bit+ systems push WASM hard. Run-Ahead would cause stuttering.\n * Instead, we optimize for smooth, consistent frame delivery:\n * - Threaded video rendering to prevent UI freezes\n * - Larger audio buffers to prevent crackling\n * - Disabled manual rewind capture (saves RAM and CPU cycles)\n */\nexport const PERFORMANCE_TIER_2_SYSTEMS = new Set([\n 'PS1', 'N64', 'GBA', 'SATURN', 'DREAMCAST',\n 'NDS', 'PSP', 'ARCADE', 'DOS', 'NEOGEO'\n]);\n\n","/**\n * Platform to RetroArch core mapping\n * \n * NOTE: This file is maintained for backward compatibility.\n * The canonical system configuration is now in lib/systems.ts\n * \n * Consider using imports from lib/systems.ts directly for new code.\n */\n\nimport {\n SYSTEMS,\n getCore as getCoreFromSystems,\n getSystem,\n getSystemsList,\n} from './systems';\n\n// Build PLATFORM_CORES map from unified config for backward compatibility\nexport const PLATFORM_CORES: Record<string, string> = {};\nfor (const sys of SYSTEMS) {\n // Add canonical key\n PLATFORM_CORES[sys.key] = sys.core;\n // Add all aliases\n for (const alias of sys.aliases) {\n PLATFORM_CORES[alias] = sys.core;\n }\n}\n\n/**\n * Get the RetroArch core for a given system name\n * @param system - System name (case-insensitive)\n * @returns Core identifier, defaults to 'fceumm' (NES) if not found\n */\nexport function getCore(system: string): string {\n return getCoreFromSystems(system);\n}\n\n/**\n * Check if a system is supported\n */\nexport function isSystemSupported(system: string): boolean {\n return getSystem(system) !== undefined;\n}\n\n/**\n * Get all supported system names\n */\nexport function getSupportedSystems(): string[] {\n return Object.keys(PLATFORM_CORES);\n}\n\n/**\n * System metadata for UI display\n */\nexport interface SystemInfo {\n value: string; // System key (e.g., 'NES', 'SNES')\n label: string; // User-friendly name (e.g., 'Nintendo (NES)')\n name: string; // ConsoleIcon system name (e.g., 'NES', 'MASTER_SYSTEM')\n id: string; // URL-friendly ID (e.g., 'nes', 'mastersystem')\n color?: string; // Optional hover color class\n}\n\n/**\n * Get all supported systems with metadata for UI display\n * Returns systems from unified config\n */\nexport function getSupportedSystemsList(): SystemInfo[] {\n return getSystemsList().map(sys => ({\n value: sys.value,\n label: sys.label,\n name: sys.iconName,\n id: sys.value.toLowerCase().replace(/_/g, ''),\n color: sys.color,\n }));\n}\n\nexport default PLATFORM_CORES;\n","const CACHE_NAME = 'koin-rom-cache-v1';\n\n/**\n * Get a ROM blob from the browser cache\n */\nexport async function getCachedRom(romId: string): Promise<Blob | null> {\n if (typeof caches === 'undefined') return null;\n\n try {\n const cache = await caches.open(CACHE_NAME);\n const response = await cache.match(romId);\n if (response) {\n console.log(`[Cache] Hit for ROM ${romId}`);\n return await response.blob();\n }\n } catch (e) {\n console.warn('[Cache] Read failed:', e);\n }\n return null;\n}\n\n/**\n * Fetch a ROM from a URL and cache it\n */\n// In-memory map to store in-flight fetch promises to prevent duplicate requests\nconst pendingFetches = new Map<string, Promise<Blob>>();\n\nexport async function fetchAndCacheRom(romId: string, url: string): Promise<Blob> {\n // 1. Return existing promise if already fetching this ROM\n if (pendingFetches.has(romId)) {\n console.log(`[Cache] Joining in-flight fetch for ${romId}`);\n return pendingFetches.get(romId)!;\n }\n\n // 2. Create new fetch promise\n const fetchPromise = (async () => {\n try {\n // Check cache first (in case another tab/session just cached it)\n const cached = await getCachedRom(romId);\n if (cached) return cached;\n\n console.log(`[Cache] Fetching ROM ${romId}...`);\n const response = await fetch(url);\n if (!response.ok) throw new Error(`Failed to fetch ROM: ${response.statusText}`);\n\n const blob = await response.blob();\n\n // Cache it\n if (typeof caches !== 'undefined') {\n try {\n const cache = await caches.open(CACHE_NAME);\n await cache.put(romId, new Response(blob));\n console.log(`[Cache] Cached ROM ${romId}`);\n } catch (e) {\n console.warn('[Cache] Write failed:', e);\n }\n }\n return blob;\n } finally {\n // Cleanup pending promise\n pendingFetches.delete(romId);\n }\n })();\n\n pendingFetches.set(romId, fetchPromise);\n return fetchPromise;\n}\n","import { useState, useRef, useCallback, MutableRefObject, useEffect } from 'react';\nimport { Nostalgist } from 'nostalgist';\nimport { getCore } from '../../lib/emulator-cores';\nimport { PERFORMANCE_TIER_1_SYSTEMS, PERFORMANCE_TIER_2_SYSTEMS } from '../../lib/systems';\nimport {\n KeyboardMapping,\n GamepadMapping,\n buildRetroArchConfig\n} from '../../lib/controls';\nimport { EmulatorStatus, SpeedMultiplier, RetroAchievementsConfig } from './types';\nimport { getCachedRom, fetchAndCacheRom } from '../../lib/rom-cache';\n\n\ninterface UseEmulatorCoreProps {\n system: string;\n romUrl: string;\n romId?: string;\n core?: string;\n biosUrl?: string | { url: string; name: string; location?: 'system' | 'rom_folder' };\n initialState?: Blob | Uint8Array;\n getCanvasElement?: () => HTMLCanvasElement | null;\n keyboardControls?: KeyboardMapping;\n gamepadBindings?: GamepadMapping[];\n retroAchievements?: RetroAchievementsConfig;\n initialVolume?: number;\n romFileName?: string;\n shader?: string; // CRT shader preset name (e.g., 'crt/crt-lottes')\n onReady?: () => void;\n onError?: (error: Error) => void;\n}\n\ninterface UseEmulatorCoreReturn {\n status: EmulatorStatus;\n setStatus: (status: EmulatorStatus) => void;\n error: string | null;\n isPaused: boolean;\n setIsPaused: (paused: boolean) => void;\n speed: SpeedMultiplier;\n nostalgistRef: MutableRefObject<Nostalgist | null>;\n\n prepare: () => Promise<void>;\n start: () => Promise<void>;\n stop: () => void;\n restart: () => Promise<void>;\n pause: () => void;\n resume: () => void;\n togglePause: () => void;\n setSpeed: (multiplier: SpeedMultiplier) => void;\n screenshot: () => Promise<string | null>;\n resize: (size: { width: number; height: number }) => void;\n getNostalgistInstance: () => Nostalgist | null;\n isPerformanceMode: boolean;\n}\n\nexport function useEmulatorCore({\n system,\n romUrl,\n romId,\n core: coreOverride,\n biosUrl,\n initialState,\n getCanvasElement,\n keyboardControls,\n gamepadBindings,\n retroAchievements,\n initialVolume = 100,\n romFileName,\n shader,\n onReady,\n onError,\n}: UseEmulatorCoreProps): UseEmulatorCoreReturn {\n const [status, setStatus] = useState<EmulatorStatus>('idle');\n const [error, setError] = useState<string | null>(null);\n const [isPaused, setIsPaused] = useState(false);\n const [speed, setSpeedState] = useState<SpeedMultiplier>(1);\n const [isFastForwardOn, setIsFastForwardOn] = useState(false);\n const [isPerformanceMode, setIsPerformanceMode] = useState(false);\n\n const nostalgistRef = useRef<Nostalgist | null>(null);\n const isStartingRef = useRef(false); // Prevent double start\n\n // Prepare the emulator (load files without starting)\n const prepare = useCallback(async () => {\n if (!romUrl || !system) {\n console.warn('[Nostalgist] Missing romUrl or system');\n return;\n }\n\n // Already prepared\n if (nostalgistRef.current) {\n return;\n }\n\n /**\n * Performance Optimization Strategy\n * ==================================\n * RetroArch settings are tuned based on system complexity to balance\n * input latency vs stability. Two tiers:\n *\n * TIER 1 (\"Zero Lag\") - Lightweight 8-bit/16-bit systems\n * - Run-Ahead: Predicts next frame to eliminate ~1 frame of input lag\n * - Single thread video: Keeps everything synchronized for tighter feel\n * - Small audio buffer: Minimizes audio latency\n * - Rewind: Enabled (low memory overhead)\n *\n * TIER 2 (\"Max Smoothness\") - Heavy 32-bit+ and arcade systems\n * - No Run-Ahead: Too CPU-intensive for complex emulation\n * - Threaded video: Prevents UI freezes during heavy rendering\n * - Larger audio buffer: Prevents crackling on demanding games\n * - Rewind: Disabled (saves significant RAM/CPU)\n *\n * @param sysKey - System identifier (e.g., 'NES', 'PS1')\n * @returns RetroArch config overrides for optimal performance\n */\n const getOptimizedConfig = (sysKey: string): Record<string, unknown> => {\n const sys = sysKey.toUpperCase();\n\n // TIER 1: Lightweight systems - optimize for minimal input lag\n // These systems have low CPU requirements, so we can afford Run-Ahead\n if (PERFORMANCE_TIER_1_SYSTEMS.has(sys)) {\n return {\n run_ahead_enabled: true, // Predict next frame to cut 1 frame of lag\n run_ahead_frames: 1, // Only 1 frame - more would increase CPU load\n run_ahead_secondary_instance: false, // Single instance for WASM (dual is too heavy)\n video_threaded: false, // Keep on main thread for tightest sync\n audio_latency: 64, // 64ms buffer - good balance of latency vs stability\n };\n }\n\n // TIER 2: Heavy systems - optimize for smooth, stutter-free gameplay\n // These systems push the CPU hard, so we prioritize stability over latency\n if (PERFORMANCE_TIER_2_SYSTEMS.has(sys)) {\n // Check if environment supports SharedArrayBuffer (required for threading)\n const supportsThreading = typeof window !== 'undefined' && window.crossOriginIsolated;\n\n if (supportsThreading) {\n return {\n run_ahead_enabled: false, // Too expensive for N64/PS1 in WASM\n video_threaded: true, // Offload to prevent UI blocking\n audio_latency: 96, // Larger buffer prevents audio crackle\n rewind_enable: false, // Save RAM - savestate buffer is expensive\n };\n } else {\n console.warn('[Nostalgist] SharedArrayBuffer not available. Falling back to main-thread rendering for heavy system.');\n return {\n run_ahead_enabled: false,\n video_threaded: false, // Fallback: Main thread (might stutter)\n audio_latency: 128, // Increase latency further to handle main thread blocking\n rewind_enable: false,\n };\n }\n }\n\n // DEFAULT: Unknown systems get balanced settings\n return {\n run_ahead_enabled: false,\n video_threaded: true,\n audio_latency: 64,\n };\n };\n\n try {\n setStatus('loading');\n setError(null);\n\n const core = coreOverride || getCore(system);\n\n let romOption: any = romUrl;\n\n // Attempt to load from cache if romId is provided\n if (romId) {\n try {\n let blob = await getCachedRom(romId);\n\n if (!blob) {\n console.log(`[Nostalgist] Fetching and caching ROM ${romId}`);\n blob = await fetchAndCacheRom(romId, romUrl);\n } else {\n console.log(`[Nostalgist] Loaded ROM ${romId} from cache`);\n }\n\n if (blob) {\n romOption = {\n fileName: romFileName || 'rom.bin',\n fileContent: blob\n };\n }\n } catch (err) {\n console.error('[Nostalgist] Cache/Fetch error, falling back to direct URL:', err);\n // Fallback to URL is implicit (romOption = romUrl)\n }\n } else if (romFileName) {\n romOption = { fileName: romFileName, fileContent: romUrl };\n }\n\n // Build input configuration from custom controls\n const inputConfig = buildRetroArchConfig({\n keyboard: keyboardControls,\n gamepads: gamepadBindings,\n });\n\n // 2. Get optimized config based on system tier\n const currentSystem = system;\n const specificConfig = getOptimizedConfig(currentSystem);\n\n // Check if performance mode (threading) is active\n if (specificConfig.video_threaded) {\n setIsPerformanceMode(true);\n } else {\n setIsPerformanceMode(false);\n }\n\n // Convert volume percentage (0-100) to RetroArch dB format\n // RetroArch audio_volume: 0.0 dB = 100%, -20 dB ≈ 10%, -40 dB ≈ 1%\n // Formula: dB = 20 * Math.log10(volume / 100)\n const volumeDb = initialVolume === 0 ? -80 : 20 * Math.log10(initialVolume / 100);\n\n // Get canvas element at prepare time (not hook initialization time)\n const canvasElement = getCanvasElement?.() || '';\n\n const prepareOptions: any = {\n core,\n rom: romOption,\n element: canvasElement,\n retroarchConfig: {\n menu_driver: 'null',\n rgui_show_start_screen: false,\n video_font_enable: false,\n input_menu_toggle_gamepad_combo: 0,\n rewind_enable: true, // Default, can be overridden by optimizedConfig\n rewind_granularity: 1,\n rewind_buffer_size: 100,\n fast_forward_ratio: 2.0,\n fast_forward_frameskip: 0,\n audio_volume: volumeDb.toFixed(2),\n input_volume_up: 'add',\n input_volume_down: 'subtract',\n input_audio_mute: 'f9',\n ...inputConfig,\n ...specificConfig, // Apply system-specific optimizations\n ...(retroAchievements ? {\n cheevos_enable: true,\n cheevos_username: retroAchievements.username,\n cheevos_token: retroAchievements.token,\n cheevos_hardcore_mode_enable: retroAchievements.hardcore ?? false,\n cheevos_verbose_enable: true,\n } : {}),\n } as Record<string, unknown>,\n };\n\n // Handle BIOS\n if (biosUrl) {\n // Pass BIOS URL or object directly to Nostalgist\n prepareOptions.bios = biosUrl;\n }\n\n // Handle initial state\n if (initialState) {\n if (initialState instanceof Blob) {\n prepareOptions.state = initialState;\n } else {\n // Convert Uint8Array to Blob if needed, or pass as is if Nostalgist supports it\n // Nostalgist supports Blob for state\n prepareOptions.state = new Blob([initialState as any]);\n }\n }\n\n // Handle shader (CRT effects)\n if (shader) {\n prepareOptions.shader = shader;\n }\n\n const nostalgist = await Nostalgist.prepare(prepareOptions);\n\n nostalgistRef.current = nostalgist;\n setStatus('ready');\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to prepare emulator';\n console.error('[Nostalgist] Prepare error:', err);\n setError(errorMessage);\n setStatus('error');\n onError?.(err instanceof Error ? err : new Error(errorMessage));\n }\n }, [system, romUrl, coreOverride, biosUrl, initialState, getCanvasElement, keyboardControls, gamepadBindings, initialVolume, onError, retroAchievements]);\n\n // Start the emulator (must be called after prepare, ideally from user click)\n const start = useCallback(async () => {\n // Prevent double start\n if (isStartingRef.current) {\n console.log('[Nostalgist] Already starting');\n return;\n }\n\n // Wait for prepare if needed\n if (!nostalgistRef.current) {\n await prepare();\n }\n\n // Still no instance? Prepare failed or was cleaned up\n if (!nostalgistRef.current) {\n console.warn('[Nostalgist] No emulator instance available');\n return;\n }\n\n isStartingRef.current = true;\n\n try {\n setStatus('loading');\n\n await nostalgistRef.current.start();\n\n // Verify instance still exists after await\n if (!nostalgistRef.current) {\n isStartingRef.current = false;\n return;\n }\n\n setStatus('running');\n setIsPaused(false);\n\n onReady?.();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to start emulator';\n console.error('[Nostalgist] Start error:', err);\n setError(errorMessage);\n setStatus('error');\n onError?.(err instanceof Error ? err : new Error(errorMessage));\n } finally {\n isStartingRef.current = false;\n }\n }, [prepare, onReady, onError]);\n\n // Stop the emulator\n const stop = useCallback(() => {\n if (nostalgistRef.current) {\n try {\n nostalgistRef.current.exit();\n } catch (err) {\n console.error('[Nostalgist] Exit error:', err);\n }\n nostalgistRef.current = null;\n isStartingRef.current = false;\n setStatus('idle');\n setIsPaused(false);\n }\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (nostalgistRef.current) {\n console.log('[Nostalgist] Cleaning up emulator on unmount');\n stop();\n }\n };\n }, [stop]);\n\n // Restart the emulator (soft reset)\n const restart = useCallback(async () => {\n if (nostalgistRef.current) {\n try {\n // Restart is synchronous but emulator needs time to process\n nostalgistRef.current.restart();\n\n // Small delay to let the emulator process the restart\n await new Promise(resolve => setTimeout(resolve, 100));\n\n // Ensure emulator is running after restart\n nostalgistRef.current.resume();\n setIsPaused(false);\n setStatus('running');\n } catch (err) {\n console.error('[Nostalgist] Restart error:', err);\n // If restart fails, try full stop and start\n stop();\n await start();\n }\n }\n }, [stop, start]);\n\n // Pause\n const pause = useCallback(() => {\n if (nostalgistRef.current && !isPaused && status === 'running') {\n try {\n nostalgistRef.current.pause();\n setIsPaused(true);\n setStatus('paused');\n } catch (err) {\n console.error('[Nostalgist] Pause error:', err);\n }\n }\n }, [isPaused, status]);\n\n // Resume - always attempt to resume, let the emulator handle if already running\n const resume = useCallback(() => {\n if (nostalgistRef.current) {\n try {\n nostalgistRef.current.resume();\n setIsPaused(false);\n // Only transition to running if we were paused\n // This prevents 'ready' state from being overwritten if called prematurely\n if (status === 'paused') {\n setStatus('running');\n }\n } catch (err) {\n console.error('[Nostalgist] Resume error:', err);\n }\n }\n }, [status]);\n\n // Toggle pause\n const togglePause = useCallback(() => {\n if (isPaused) {\n resume();\n } else {\n pause();\n }\n }, [isPaused, pause, resume]);\n\n // Set speed\n const setSpeed = useCallback((multiplier: SpeedMultiplier) => {\n if (!nostalgistRef.current) return;\n\n try {\n const nostalgist = nostalgistRef.current;\n\n if (typeof nostalgist.sendCommand === 'function') {\n // Simple toggle logic: only 1x and 2x supported\n if (multiplier === 2 && !isFastForwardOn) {\n // Enable fast forward\n nostalgist.sendCommand('FAST_FORWARD');\n setIsFastForwardOn(true);\n } else if (multiplier === 1 && isFastForwardOn) {\n // Disable fast forward\n nostalgist.sendCommand('FAST_FORWARD');\n setIsFastForwardOn(false);\n }\n\n setSpeedState(multiplier);\n } else {\n console.warn('[Nostalgist] sendCommand not available');\n }\n } catch (err) {\n console.error('[Nostalgist] Set speed error:', err);\n }\n }, [isFastForwardOn]);\n\n // Screenshot - use Nostalgist's official screenshot() method\n const screenshot = useCallback(async (): Promise<string | null> => {\n if (!nostalgistRef.current) {\n return null;\n }\n\n try {\n // Primary method: Use Nostalgist's official screenshot() API\n const screenshotBlob = await nostalgistRef.current.screenshot();\n\n if (screenshotBlob instanceof Blob) {\n // Convert Blob to data URL\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n if (reader.result) {\n resolve(reader.result as string);\n } else {\n reject(new Error('FileReader result is null'));\n }\n };\n reader.onerror = () => reject(new Error('FileReader error'));\n reader.readAsDataURL(screenshotBlob);\n });\n }\n\n // Fallback: Try to get canvas directly\n const canvas =\n nostalgistRef.current.getCanvas?.() ||\n getCanvasElement?.() ||\n document.querySelector('.game-canvas-container canvas') as HTMLCanvasElement ||\n document.querySelector('canvas') as HTMLCanvasElement;\n\n if (canvas) {\n return canvas.toDataURL('image/png');\n }\n\n return null;\n } catch (err) {\n console.error('[Nostalgist] Screenshot error:', err);\n return null;\n }\n }, []);\n\n // Resize canvas using Nostalgist's resize API\n const resize = useCallback((size: { width: number; height: number }) => {\n if (!nostalgistRef.current) {\n console.warn('[Nostalgist] Cannot resize: emulator not ready');\n return;\n }\n try {\n nostalgistRef.current.resize(size);\n } catch (err) {\n console.error('[Nostalgist] Resize error:', err);\n }\n }, []);\n\n // Get raw Nostalgist instance (for advanced usage)\n const getNostalgistInstance = useCallback((): Nostalgist | null => {\n return nostalgistRef.current;\n }, []);\n\n return {\n status,\n setStatus,\n error,\n isPaused,\n setIsPaused,\n speed,\n nostalgistRef,\n prepare,\n start,\n stop,\n restart,\n pause,\n resume,\n togglePause,\n setSpeed,\n screenshot,\n resize,\n getNostalgistInstance: () => nostalgistRef.current,\n isPerformanceMode,\n };\n}\n","import { useState, useRef, useCallback, useEffect, MutableRefObject } from 'react';\nimport { Nostalgist } from 'nostalgist';\n\ninterface UseEmulatorAudioProps {\n nostalgistRef: MutableRefObject<Nostalgist | null>;\n initialVolume?: number;\n}\n\ninterface UseEmulatorAudioReturn {\n volume: number;\n isMuted: boolean;\n setVolume: (volume: number) => void;\n toggleMute: () => void;\n}\n\nexport function useEmulatorAudio({ nostalgistRef, initialVolume = 100 }: UseEmulatorAudioProps): UseEmulatorAudioReturn {\n const [volume, setVolume] = useState(initialVolume);\n const [isMuted, setIsMuted] = useState(false);\n\n // Volume control - Intercept Web Audio API\n // We monkey-patch AudioNode.connect to inject a GainNode before the destination\n const gainNodeRef = useRef<GainNode | null>(null);\n const lastVolumeRef = useRef(initialVolume);\n\n useEffect(() => {\n // Store original connect method\n const originalConnect = AudioNode.prototype.connect;\n\n // WeakMap to store GainNodes for each AudioContext to avoid creating duplicates\n const contextGainMap = new WeakMap<BaseAudioContext, GainNode>();\n\n // Patch connect\n (AudioNode.prototype as any).connect = function (destination: AudioNode | AudioParam, output?: number, input?: number) {\n // Check if we are connecting to the destination (speakers)\n if (destination instanceof AudioNode && destination === this.context.destination) {\n try {\n // Get or create GainNode for this context\n let gainNode = contextGainMap.get(this.context);\n if (!gainNode) {\n const newGainNode = this.context.createGain();\n // Initialize volume\n newGainNode.gain.value = lastVolumeRef.current / 100;\n // Connect GainNode to destination\n // Use apply to handle variable arguments correctly\n (originalConnect as Function).apply(newGainNode, [destination]);\n contextGainMap.set(this.context, newGainNode);\n\n // Store in ref if this is likely our context (heuristic)\n gainNodeRef.current = newGainNode;\n gainNode = newGainNode;\n console.log('[Nostalgist] AudioContext intercepted and GainNode injected');\n }\n\n // Connect this node to the GainNode instead of destination\n // We cast gainNode to any to avoid strict type checks on the overloaded connect method\n return (originalConnect as Function).call(this, gainNode!, output, input);\n } catch (err) {\n console.error('[Nostalgist] Audio interception error:', err);\n return (originalConnect as Function).apply(this, [destination, output, input]);\n }\n }\n\n // Default behavior for other connections\n return (originalConnect as Function).apply(this, [destination, output, input]);\n };\n\n return () => {\n // Restore original connect on cleanup\n AudioNode.prototype.connect = originalConnect;\n };\n }, []);\n\n const setVolumeLevel = useCallback((newVolume: number) => {\n // Clamp to 0-100 range\n const clampedVolume = Math.max(0, Math.min(100, newVolume));\n const volumeValue = clampedVolume / 100; // Convert to 0.0-1.0\n\n try {\n // Update the GainNode if we have one\n if (gainNodeRef.current) {\n // Smooth transition to avoid clicks\n const currentTime = gainNodeRef.current.context.currentTime;\n gainNodeRef.current.gain.setValueAtTime(volumeValue, currentTime);\n } else {\n // Fallback: Try to find audio elements (for some cores that might use them)\n const audioElements = document.querySelectorAll('audio, video');\n audioElements.forEach((element) => {\n if (element instanceof HTMLMediaElement) {\n element.volume = volumeValue;\n }\n });\n }\n\n // Update state\n setVolume(clampedVolume);\n lastVolumeRef.current = clampedVolume;\n } catch (err) {\n console.error('[Nostalgist] Volume change error:', err);\n }\n }, []);\n\n // Simple mute toggle using keyboard simulation (F9 key)\n const toggleMute = useCallback(() => {\n if (!nostalgistRef.current) return;\n\n try {\n // Fire keyboard event directly to Emscripten's event handlers\n const emscripten = nostalgistRef.current.getEmscripten();\n if (emscripten?.JSEvents) {\n const canvas = nostalgistRef.current.getCanvas?.();\n // Create fake events with required methods\n const createFakeEvent = (code: string) => ({\n code,\n target: canvas,\n preventDefault: () => { },\n stopPropagation: () => { },\n stopImmediatePropagation: () => { },\n });\n\n for (const handler of emscripten.JSEvents.eventHandlers) {\n if (handler.eventTypeString === 'keydown') {\n handler.eventListenerFunc(createFakeEvent('F9'));\n }\n }\n setTimeout(() => {\n for (const handler of emscripten.JSEvents.eventHandlers) {\n if (handler.eventTypeString === 'keyup') {\n handler.eventListenerFunc(createFakeEvent('F9'));\n }\n }\n }, 50);\n }\n setIsMuted(prev => !prev);\n } catch (err) {\n console.error('[Nostalgist] Mute error:', err);\n }\n }, [nostalgistRef]);\n\n return {\n volume,\n isMuted,\n setVolume: setVolumeLevel,\n toggleMute\n };\n}\n","import { useCallback, MutableRefObject } from 'react';\nimport { Nostalgist } from 'nostalgist';\n\ninterface UseEmulatorInputProps {\n nostalgistRef: MutableRefObject<Nostalgist | null>;\n}\n\ninterface UseEmulatorInputReturn {\n pressKey: (key: string) => void;\n}\n\nexport function useEmulatorInput({ nostalgistRef }: UseEmulatorInputProps): UseEmulatorInputReturn {\n // Press key programmatically\n const pressKey = useCallback((key: string) => {\n if (!nostalgistRef.current) return;\n\n try {\n nostalgistRef.current.press(key);\n } catch (err) {\n console.error('[Nostalgist] Press key error:', err);\n }\n }, [nostalgistRef]);\n\n return {\n pressKey\n };\n}\n","import { useRef, useCallback } from 'react';\n\nexport type SavePriority = 'low' | 'high';\n\nexport interface SaveResult {\n data: Uint8Array;\n blob: Blob;\n}\n\ninterface QueuedSave {\n priority: SavePriority;\n resolve: (result: SaveResult | null) => void;\n timestamp: number;\n}\n\n// Minimum delay between saves to let FS settle (ms)\nconst MIN_SAVE_INTERVAL = 100;\n\n// How long to wait for a queued save before timing out (ms)\nconst SAVE_TIMEOUT = 5000;\n\nexport function useSaveScheduler(nostalgistRef: React.MutableRefObject<any>) {\n // Queue of pending save requests\n const queueRef = useRef<QueuedSave[]>([]);\n\n // Is a save currently in progress?\n const savingRef = useRef(false);\n\n // Timestamp of last successful save\n const lastSaveTimeRef = useRef(0);\n\n // Process the next item in the queue\n const processQueue = useCallback(async () => {\n // Already processing or empty queue\n if (savingRef.current || queueRef.current.length === 0) {\n return;\n }\n\n // Sort by priority (high first) then by timestamp (oldest first)\n queueRef.current.sort((a, b) => {\n if (a.priority !== b.priority) {\n return a.priority === 'high' ? -1 : 1;\n }\n return a.timestamp - b.timestamp;\n });\n\n // Get next item\n const item = queueRef.current.shift();\n if (!item) return;\n\n // Check if timed out\n if (Date.now() - item.timestamp > SAVE_TIMEOUT) {\n item.resolve(null);\n // Continue processing\n setTimeout(() => processQueue(), 0);\n return;\n }\n\n savingRef.current = true;\n\n try {\n // Ensure minimum interval between saves\n const timeSinceLastSave = Date.now() - lastSaveTimeRef.current;\n if (timeSinceLastSave < MIN_SAVE_INTERVAL) {\n await new Promise(resolve => setTimeout(resolve, MIN_SAVE_INTERVAL - timeSinceLastSave));\n }\n\n // Perform the save\n if (!nostalgistRef.current) {\n console.warn('[SaveScheduler] Nostalgist instance not available');\n item.resolve(null);\n return;\n }\n\n // Only log for high-priority saves (manual/auto/emergency), not rewind captures\n const isHighPriority = item.priority === 'high';\n if (isHighPriority) {\n console.log('[SaveScheduler] Processing high-priority save...');\n }\n\n const result = await nostalgistRef.current.saveState();\n const stateBlob = result?.state;\n\n if (!stateBlob) {\n console.warn('[SaveScheduler] saveState() returned null or no state blob', { result, priority: item.priority });\n item.resolve(null);\n return;\n }\n\n // Convert Blob to Uint8Array\n const arrayBuffer = await stateBlob.arrayBuffer();\n const stateData = new Uint8Array(arrayBuffer);\n\n // Only log success for high-priority saves to reduce console noise\n if (isHighPriority) {\n console.log('[SaveScheduler] Save successful', { size: stateData.length, priority: item.priority });\n }\n\n lastSaveTimeRef.current = Date.now();\n item.resolve({ data: stateData, blob: stateBlob });\n } catch (err) {\n console.error('[SaveScheduler] Save failed with error:', err);\n item.resolve(null);\n } finally {\n savingRef.current = false;\n\n // Process next item after a brief delay\n setTimeout(() => processQueue(), MIN_SAVE_INTERVAL);\n }\n }, [nostalgistRef]);\n\n // Queue a high-priority save (auto-save, manual save)\n const save = useCallback((): Promise<SaveResult | null> => {\n return new Promise((resolve) => {\n queueRef.current.push({\n priority: 'high',\n resolve,\n timestamp: Date.now(),\n });\n processQueue();\n });\n }, [processQueue]);\n\n // Queue a low-priority save (rewind buffer)\n const queueRewindCapture = useCallback((): Promise<SaveResult | null> => {\n // Drop if queue has too many low-priority items (backpressure)\n const lowPriorityCount = queueRef.current.filter(q => q.priority === 'low').length;\n if (lowPriorityCount >= 3) {\n return Promise.resolve(null);\n }\n\n return new Promise((resolve) => {\n queueRef.current.push({\n priority: 'low',\n resolve,\n timestamp: Date.now(),\n });\n processQueue();\n });\n }, [processQueue]);\n\n // Check if a save is currently in progress\n const isSaving = useCallback(() => savingRef.current, []);\n\n // Get queue length (for debugging)\n const getQueueLength = useCallback(() => queueRef.current.length, []);\n\n // Clear queue (on unmount or stop)\n const clearQueue = useCallback(() => {\n queueRef.current.forEach(item => item.resolve(null));\n queueRef.current = [];\n }, []);\n\n const resultRef = useRef({\n save,\n queueRewindCapture,\n isSaving,\n getQueueLength,\n clearQueue,\n });\n\n resultRef.current.save = save;\n resultRef.current.queueRewindCapture = queueRewindCapture;\n resultRef.current.isSaving = isSaving;\n resultRef.current.getQueueLength = getQueueLength;\n resultRef.current.clearQueue = clearQueue;\n\n return resultRef.current;\n}\n","import { useState, useRef, useCallback, useEffect, MutableRefObject } from 'react';\nimport { Nostalgist } from 'nostalgist';\nimport { useSaveScheduler } from '../useSaveScheduler';\n\ninterface UseEmulatorSavesProps {\n nostalgistRef: MutableRefObject<Nostalgist | null>;\n isPaused: boolean;\n setIsPaused: (paused: boolean) => void;\n setStatus: (status: any) => void;\n rewindEnabled?: boolean;\n}\n\ninterface UseEmulatorSavesReturn {\n isRewinding: boolean;\n rewindBufferSize: number;\n saveState: () => Promise<Uint8Array | null>;\n saveStateWithBlob: () => Promise<{ data: Uint8Array; blob: Blob } | null>;\n loadState: (state: Uint8Array) => Promise<boolean>;\n startRewind: () => void;\n stopRewind: () => void;\n startRewindCapture: () => void;\n stopRewindCapture: () => void;\n}\n\nexport function useEmulatorSaves({ nostalgistRef, isPaused, setIsPaused, setStatus, rewindEnabled = true }: UseEmulatorSavesProps): UseEmulatorSavesReturn {\n const [isRewinding, setIsRewinding] = useState(false);\n const [rewindBufferSize, setRewindBufferSize] = useState(0); // Track buffer size for UI\n\n const rewindIntervalRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const rewindBufferRef = useRef<Uint8Array[]>([]); // Manual rewind buffer using savestates\n const rewindCaptureIntervalRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Centralized save scheduler - all FS operations go through here\n const saveScheduler = useSaveScheduler(nostalgistRef);\n\n // Save state - uses scheduler for serialized FS access (used by rewind buffer)\n const saveState = useCallback(async (): Promise<Uint8Array | null> => {\n if (!nostalgistRef.current) return null;\n const result = await saveScheduler.queueRewindCapture();\n return result?.data ?? null;\n }, [saveScheduler, nostalgistRef]);\n\n // Save state with blob - high priority, returns both data and blob\n // Used by auto-save and manual save\n const saveStateWithBlob = useCallback(async (): Promise<{ data: Uint8Array; blob: Blob } | null> => {\n if (!nostalgistRef.current) return null;\n return saveScheduler.save();\n }, [saveScheduler, nostalgistRef]);\n\n // Load state - also resumes the emulator after loading\n const loadState = useCallback(async (state: Uint8Array): Promise<boolean> => {\n if (!nostalgistRef.current) {\n console.warn('[Nostalgist] Cannot load state: emulator not running');\n return false;\n }\n\n try {\n // loadState expects a Blob, convert Uint8Array to Blob\n const buffer = new ArrayBuffer(state.length);\n const view = new Uint8Array(buffer);\n view.set(state);\n const stateBlob = new Blob([buffer], { type: 'application/octet-stream' });\n\n await nostalgistRef.current.loadState(stateBlob);\n\n // Small delay to let the emulator process the state load before resuming\n await new Promise(resolve => setTimeout(resolve, 50));\n\n // After loading state, ensure emulator is running and state is synced\n nostalgistRef.current.resume();\n setIsPaused(false);\n setStatus('running');\n\n return true;\n } catch (err) {\n console.error('[Nostalgist] Load state error:', err);\n return false;\n }\n }, [nostalgistRef, setIsPaused, setStatus]);\n\n // Start capturing rewind buffer (Afterplay.io style)\n const startRewindCapture = useCallback(() => {\n if (!rewindEnabled) {\n return;\n }\n\n if (rewindCaptureIntervalRef.current) {\n return;\n }\n\n if (!nostalgistRef.current) {\n return;\n }\n\n const MAX_BUFFER_SIZE = 60; // Keep last 30 seconds at 2 saves/sec\n let captureAttempts = 0;\n let successfulCaptures = 0;\n\n rewindCaptureIntervalRef.current = setInterval(async () => {\n if (!nostalgistRef.current || isPaused) return;\n\n captureAttempts++;\n // Scheduler handles all FS serialization - no try/catch needed for FS errors\n const state = await saveState();\n if (state) {\n rewindBufferRef.current.push(state);\n successfulCaptures++;\n\n // Keep buffer size manageable\n if (rewindBufferRef.current.length > MAX_BUFFER_SIZE) {\n rewindBufferRef.current.shift(); // Remove oldest\n }\n\n // Update buffer size for UI\n setRewindBufferSize(rewindBufferRef.current.length);\n\n // Log progress every 50 captures (less verbose)\n if (successfulCaptures % 50 === 0) {\n console.log(`[Nostalgist] 📹 Rewind buffer: ${rewindBufferRef.current.length} states`);\n }\n }\n // If state is null, scheduler either dropped it (backpressure) or failed - that's fine\n }, 500); // Capture every 500ms\n }, [isPaused, saveState, nostalgistRef]);\n\n // Stop capturing rewind buffer\n const stopRewindCapture = useCallback(() => {\n if (rewindCaptureIntervalRef.current) {\n clearInterval(rewindCaptureIntervalRef.current);\n rewindCaptureIntervalRef.current = null;\n }\n }, []);\n\n // Stop rewind (release) - defined before startRewind to avoid closure issues\n const stopRewind = useCallback(() => {\n if (!isRewinding) {\n return;\n }\n\n try {\n setIsRewinding(false);\n\n // Clear the rewind interval\n if (rewindIntervalRef.current) {\n clearInterval(rewindIntervalRef.current);\n rewindIntervalRef.current = null;\n }\n\n // Clear old buffer\n rewindBufferRef.current = [];\n setRewindBufferSize(0);\n\n // Wait a bit before restarting capture - FS needs time to settle after rapid state loads\n setTimeout(() => {\n // Check if emulator is still available (don't check status - it might be stale in closure)\n if (nostalgistRef.current) {\n startRewindCapture();\n }\n }, 1000); // Wait 1 second for FS to settle\n } catch (err) {\n console.error('[Nostalgist] Stop rewind error:', err);\n }\n }, [isRewinding, startRewindCapture, nostalgistRef]);\n\n // Start rewind (hold) - Manual implementation like Afterplay.io\n const startRewind = useCallback(() => {\n if (!nostalgistRef.current || isRewinding) {\n return;\n }\n\n if (rewindBufferRef.current.length === 0) {\n return;\n }\n\n try {\n setIsRewinding(true);\n // Stop capturing while rewinding\n stopRewindCapture();\n\n // Load states backwards from buffer\n let rewindIndex = rewindBufferRef.current.length - 1;\n let isLoadingState = false; // Prevent overlapping loads\n\n rewindIntervalRef.current = setInterval(async () => {\n // Skip if already loading or no more states\n if (isLoadingState || rewindIndex < 0 || !nostalgistRef.current) {\n if (rewindIndex < 0) {\n // Reached beginning of buffer, auto-stop\n stopRewind();\n }\n return;\n }\n\n try {\n const state = rewindBufferRef.current[rewindIndex];\n if (state) {\n isLoadingState = true;\n await loadState(state);\n rewindIndex--;\n isLoadingState = false;\n } else {\n // Invalid state, stop rewinding\n stopRewind();\n }\n } catch (err) {\n isLoadingState = false;\n // Silently handle errors (likely FS issues when switching states fast)\n }\n }, 200); // Load state every 200ms for smoother rewind\n } catch (err) {\n console.error('[Nostalgist] Start rewind error:', err);\n setIsRewinding(false);\n startRewindCapture(); // Resume capturing\n }\n }, [isRewinding, loadState, stopRewindCapture, startRewindCapture, stopRewind, nostalgistRef]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n // Clear save queue\n saveScheduler.clearQueue();\n\n // Clean up rewind intervals\n if (rewindIntervalRef.current) {\n clearInterval(rewindIntervalRef.current);\n rewindIntervalRef.current = null;\n }\n if (rewindCaptureIntervalRef.current) {\n clearInterval(rewindCaptureIntervalRef.current);\n rewindCaptureIntervalRef.current = null;\n }\n\n // Clear rewind buffer\n rewindBufferRef.current = [];\n };\n }, [saveScheduler]);\n\n // Expose startRewindCapture to be called when emulator starts\n // We can't export it directly because it's used internally, but we can trigger it via effect if needed\n // Or we can export it and let useEmulatorCore call it.\n // For now, let's export it as a ref or just expose it.\n // Actually, `useNostalgist` called `startRewindCapture` in `start`.\n // So we should expose it.\n\n return {\n isRewinding,\n rewindBufferSize,\n saveState,\n saveStateWithBlob,\n loadState,\n startRewind,\n stopRewind,\n // Internal but needed by core\n startRewindCapture,\n stopRewindCapture\n };\n}\n","import { useCallback, MutableRefObject } from 'react';\nimport { Nostalgist } from 'nostalgist';\n\ninterface UseEmulatorCheatsProps {\n nostalgistRef: MutableRefObject<Nostalgist | null>;\n}\n\ninterface UseEmulatorCheatsReturn {\n applyCheat: (code: string) => void;\n resetCheats: () => void;\n}\n\nexport function useEmulatorCheats({ nostalgistRef }: UseEmulatorCheatsProps): UseEmulatorCheatsReturn {\n // Apply cheat code\n const applyCheat = useCallback((code: string) => {\n if (!nostalgistRef.current) return;\n try {\n (nostalgistRef.current as any).addCheat(code);\n } catch (err) {\n console.error('[Nostalgist] Apply cheat error:', err);\n }\n }, [nostalgistRef]);\n\n // Reset cheats\n const resetCheats = useCallback(() => {\n if (!nostalgistRef.current) return;\n try {\n (nostalgistRef.current as any).resetCheats();\n } catch (err) {\n console.error('[Nostalgist] Reset cheats error:', err);\n }\n }, [nostalgistRef]);\n\n return {\n applyCheat,\n resetCheats\n };\n}\n","import { useCallback, useMemo } from 'react';\nimport { Nostalgist } from 'nostalgist';\nimport {\n KeyboardMapping,\n GamepadMapping,\n} from '../lib/controls';\nimport { PERFORMANCE_TIER_2_SYSTEMS } from '../lib/systems';\nimport { useEmulatorCore } from './emulator/useEmulatorCore';\nimport { useEmulatorAudio } from './emulator/useEmulatorAudio';\nimport { useEmulatorInput } from './emulator/useEmulatorInput';\nimport { useEmulatorSaves } from './emulator/useEmulatorSaves';\nimport { useEmulatorCheats } from './emulator/useEmulatorCheats';\nimport { EmulatorStatus, SpeedMultiplier, RetroAchievementsConfig } from './emulator/types';\n\n// Re-export types\nexport type { EmulatorStatus, SpeedMultiplier, RetroAchievementsConfig };\n\ninterface UseNostalgistOptions {\n system: string;\n romUrl: string;\n\n core?: string; // Core override\n biosUrl?: string | { url: string; name: string; location?: 'system' | 'rom_folder' }; // Custom BIOS URL\n initialState?: Blob | Uint8Array; // Initial save state\n getCanvasElement?: () => HTMLCanvasElement | null; // Function to get canvas element (must be in DOM before prepare)\n keyboardControls?: KeyboardMapping; // Custom keyboard mappings\n gamepadBindings?: GamepadMapping[]; // Custom gamepad mappings per player\n retroAchievements?: RetroAchievementsConfig;\n onReady?: () => void;\n onError?: (error: Error) => void;\n initialVolume?: number;\n romFileName?: string;\n shader?: string; // CRT shader preset (e.g., 'crt/crt-lottes')\n romId?: string;\n}\n\nexport interface UseNostalgistReturn {\n status: EmulatorStatus;\n error: string | null;\n isPaused: boolean;\n speed: SpeedMultiplier;\n isRewinding: boolean;\n rewindBufferSize: number;\n volume: number; // 0-100\n isMuted: boolean;\n\n // Lifecycle\n prepare: () => Promise<void>;\n start: () => Promise<void>;\n stop: () => void;\n restart: () => Promise<void>;\n\n // Playback\n pause: () => void;\n resume: () => void;\n togglePause: () => void;\n\n // Save/Load\n saveState: () => Promise<Uint8Array | null>;\n saveStateWithBlob: () => Promise<{ data: Uint8Array; blob: Blob } | null>;\n loadState: (state: Uint8Array) => Promise<boolean>;\n\n // Speed & Rewind\n setSpeed: (multiplier: SpeedMultiplier) => void;\n startRewind: () => void;\n stopRewind: () => void;\n rewindEnabled: boolean;\n\n // Volume\n setVolume: (volume: number) => void;\n toggleMute: () => void;\n\n // Utils\n screenshot: () => Promise<string | null>;\n pressKey: (key: string) => void;\n resize: (size: { width: number; height: number }) => void;\n\n // Cheats\n applyCheat: (code: string) => void;\n resetCheats: () => void;\n\n // RetroAchievements integration - get access to emulator internals\n getNostalgistInstance: () => Nostalgist | null;\n isPerformanceMode: boolean;\n}\n\nexport const useNostalgist = ({\n system,\n romUrl,\n core,\n biosUrl,\n initialState,\n getCanvasElement,\n keyboardControls,\n gamepadBindings,\n retroAchievements,\n onReady,\n onError,\n initialVolume = 100,\n romFileName,\n shader,\n romId,\n}: UseNostalgistOptions): UseNostalgistReturn => {\n // 0. System Analysis\n // Check if system is heavy (Tier 2) to disable expensive features like manual rewind capture\n const isHeavySystem = useMemo(() => {\n return PERFORMANCE_TIER_2_SYSTEMS.has(system.toUpperCase());\n }, [system]);\n\n // 1. Core Emulator Logic (Lifecycle, Status, Canvas)\n const {\n status,\n setStatus,\n error,\n isPaused,\n setIsPaused,\n speed,\n nostalgistRef,\n prepare,\n start: coreStart,\n stop: coreStop,\n restart,\n pause,\n resume,\n togglePause,\n setSpeed,\n screenshot,\n resize,\n getNostalgistInstance,\n isPerformanceMode,\n } = useEmulatorCore({\n system,\n romUrl,\n romId,\n core,\n biosUrl,\n initialState,\n getCanvasElement,\n keyboardControls,\n gamepadBindings,\n retroAchievements,\n initialVolume,\n romFileName,\n shader,\n onReady,\n onError,\n });\n\n // 2. Audio Logic (Volume, Mute)\n const {\n volume,\n isMuted,\n setVolume,\n toggleMute,\n } = useEmulatorAudio({\n nostalgistRef,\n initialVolume,\n });\n\n // 3. Input Logic (Press Key)\n const {\n pressKey,\n } = useEmulatorInput({\n nostalgistRef,\n });\n\n // 4. Saves Logic (Save/Load, Rewind)\n const {\n isRewinding,\n rewindBufferSize,\n saveState,\n saveStateWithBlob,\n loadState,\n startRewind,\n stopRewind,\n startRewindCapture,\n stopRewindCapture,\n } = useEmulatorSaves({\n nostalgistRef,\n isPaused,\n setIsPaused,\n setStatus,\n rewindEnabled: !isHeavySystem, // Disable manual rewind loop for heavy systems\n });\n\n // 5. Cheats Logic\n const {\n applyCheat,\n resetCheats,\n } = useEmulatorCheats({\n nostalgistRef,\n });\n\n // Wrapped Start - coordinates core start with rewind capture\n const start = useCallback(async () => {\n await coreStart();\n\n // Start rewind capture after a delay if start was successful\n // We check nostalgistRef.current to ensure it's running\n setTimeout(() => {\n if (nostalgistRef.current) {\n startRewindCapture();\n }\n }, 2000);\n }, [coreStart, startRewindCapture, nostalgistRef]);\n\n // Wrapped Stop - coordinates core stop with rewind cleanup\n const stop = useCallback(() => {\n stopRewindCapture();\n coreStop();\n }, [stopRewindCapture, coreStop]);\n\n // Memoize the return object to prevent unnecessary re-renders in parents\n const hookReturn = useMemo((): UseNostalgistReturn => ({\n status,\n error,\n isPaused,\n speed,\n isRewinding,\n rewindBufferSize,\n volume,\n isMuted,\n\n prepare,\n start,\n stop,\n restart,\n\n pause,\n resume,\n togglePause,\n\n saveState,\n saveStateWithBlob,\n loadState,\n\n setSpeed,\n startRewind,\n stopRewind,\n rewindEnabled: !isHeavySystem,\n\n setVolume,\n toggleMute,\n\n screenshot,\n pressKey,\n resize,\n\n applyCheat,\n resetCheats,\n\n getNostalgistInstance,\n isPerformanceMode,\n }), [\n status, error, isPaused, speed, isRewinding, rewindBufferSize, volume, isMuted,\n prepare, start, stop, restart,\n pause, resume, togglePause,\n saveState, saveStateWithBlob, loadState,\n setSpeed, startRewind, stopRewind,\n isHeavySystem,\n setVolume, toggleMute,\n screenshot, pressKey, resize,\n applyCheat, resetCheats,\n getNostalgistInstance,\n isPerformanceMode\n ]);\n\n return hookReturn;\n};\n","'use client';\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { loadVolume, saveVolume, loadMuteState, saveMuteState } from '../lib/game-player-utils';\n\nexport interface UseVolumeOptions {\n setVolume: (volume: number) => void;\n toggleMute: () => void;\n}\n\nexport interface UseVolumeReturn {\n volume: number; // 0-100\n isMuted: boolean;\n setVolume: (volume: number) => void;\n toggleMute: () => void;\n}\n\n/**\n * Hook to manage volume and mute state with localStorage persistence\n */\nexport function useVolume({\n setVolume: setVolumeInHook,\n toggleMute: toggleMuteInHook,\n}: UseVolumeOptions): UseVolumeReturn {\n const [volume, setVolumeState] = useState(() => loadVolume());\n const [isMuted, setIsMutedState] = useState(() => loadMuteState());\n\n // Sync hook's internal volume state with our state on mount and when volume changes\n useEffect(() => {\n // Initialize hook's volume to match our loaded volume\n setVolumeInHook(volume);\n }, [setVolumeInHook]); // Sync when hook function is available\n\n const setVolume = useCallback((newVolume: number) => {\n const clampedVolume = Math.max(0, Math.min(100, newVolume));\n setVolumeState(clampedVolume);\n saveVolume(clampedVolume);\n setVolumeInHook(clampedVolume);\n }, [setVolumeInHook]);\n\n const toggleMute = useCallback(() => {\n setIsMutedState(prev => {\n const newMuted = !prev;\n saveMuteState(newMuted);\n toggleMuteInHook();\n return newMuted;\n });\n }, [toggleMuteInHook]);\n\n return {\n volume,\n isMuted,\n setVolume,\n toggleMute,\n };\n}\n","'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n KeyboardMapping,\n loadKeyboardMapping,\n saveKeyboardMapping,\n getConsoleKeyboardDefaults,\n} from '../lib/controls';\nimport { ToastType } from './useToast';\nimport { useKoinTranslation } from './useKoinTranslation';\n\nexport interface UseControlsReturn {\n controls: KeyboardMapping;\n saveControls: (newControls: KeyboardMapping) => void;\n resetToDefaults: () => void;\n}\n\n/**\n * Hook for managing keyboard controls\n * Loads/saves per-system mappings from localStorage\n */\nexport function useControls(\n system?: string,\n onNotify?: (message: string, type?: ToastType) => void\n): UseControlsReturn {\n const t = useKoinTranslation();\n // Get default controls for this system\n const defaultControls = getConsoleKeyboardDefaults(system || 'SNES');\n\n // Initialize with loaded controls\n const [controls, setControls] = useState<KeyboardMapping>(() => {\n if (typeof window !== 'undefined') {\n return loadKeyboardMapping(system);\n }\n return defaultControls;\n });\n\n // Reload when system changes\n useEffect(() => {\n const loaded = loadKeyboardMapping(system);\n setControls(loaded);\n }, [system]);\n\n const saveControls = useCallback((newControls: KeyboardMapping) => {\n setControls(newControls);\n saveKeyboardMapping(newControls, system);\n onNotify?.(t.notifications.controlsSaved, 'success');\n }, [system, onNotify, t]);\n\n const resetToDefaults = useCallback(() => {\n setControls(defaultControls);\n saveKeyboardMapping(defaultControls, system);\n onNotify?.(t.notifications.controlsReset, 'info');\n }, [defaultControls, system, onNotify, t]);\n\n return {\n controls,\n saveControls,\n resetToDefaults,\n };\n}\n","import { useState, useMemo, useEffect, RefObject } from 'react';\nimport { useNostalgist } from './useNostalgist';\nimport { useKoinTranslation } from './useKoinTranslation';\nimport { useGamepad } from './useGamepad';\nimport { useVolume } from './useVolume';\nimport { useControls } from './useControls';\nimport { suppressEmulatorWarnings } from '../lib/game-player-utils';\nimport { GamePlayerProps } from '../components/types';\n\ninterface UseGameSessionProps extends GamePlayerProps {\n canvasRef: RefObject<HTMLCanvasElement>;\n showToast: (message: string, type?: 'success' | 'error' | 'info' | 'warning' | 'gamepad', options?: any) => void;\n}\n\nexport function useGameSession(props: UseGameSessionProps) {\n const {\n romUrl,\n romId,\n romFileName,\n system,\n core,\n biosUrl,\n initialSaveState,\n retroAchievementsConfig,\n onSessionStart,\n onSessionEnd,\n onReady,\n onError,\n canvasRef,\n showToast,\n } = props;\n\n const t = useKoinTranslation();\n\n // Controls management\n const { controls, saveControls } = useControls(system, showToast);\n\n // Modals state\n const [gamepadModalOpen, setGamepadModalOpen] = useState(false);\n const [controlsModalOpen, setControlsModalOpen] = useState(false);\n\n // Gamepad detection\n const { gamepads, connectedCount } = useGamepad({\n onConnect: (gamepad) => {\n showToast(\n gamepad.name || t.notifications.controllerReady,\n 'gamepad',\n {\n title: t.notifications.controllerConnected,\n duration: 4000,\n action: {\n label: 'Configure',\n onClick: () => setGamepadModalOpen(true),\n },\n }\n );\n },\n onDisconnect: () => {\n showToast(\n t.notifications.controllerDisconnected,\n 'warning',\n {\n title: t.notifications.controllerDisconnected, // Title repeats or generic? Using same for now\n duration: 3000,\n }\n );\n },\n });\n\n // Load gamepad bindings\n const gamepadBindings = useMemo(() => {\n // We need to implement loadGamepadMapping in useControls or similar\n // For now, passing empty array or implementing a simple loader\n return [];\n }, [gamepads.length]);\n\n // Emulator state\n const nostalgist = useNostalgist({\n system,\n romUrl,\n romId,\n romFileName,\n core,\n biosUrl,\n initialState: initialSaveState,\n getCanvasElement: () => canvasRef.current,\n keyboardControls: controls,\n gamepadBindings: gamepadBindings.length > 0 ? gamepadBindings : undefined,\n retroAchievements: retroAchievementsConfig,\n shader: props.shader,\n onReady: () => {\n console.log('[GamePlayer] Emulator started');\n onSessionStart?.();\n onReady?.();\n\n // Show coin hint for arcade systems\n const arcadeSystems = ['arcade', 'neogeo', 'fba', 'mame'];\n if (arcadeSystems.includes(system.toLowerCase())) {\n setTimeout(() => {\n showToast(\n t.notifications.insertCoin,\n 'info',\n {\n title: t.notifications.insertCoinTitle,\n duration: 5000,\n }\n );\n }, 1500); // Delay to let the game load first\n }\n },\n onError: (err) => {\n console.error('[GamePlayer] Emulator error:', err);\n onError?.(err);\n },\n });\n\n const {\n status,\n setVolume: setVolumeInHook,\n toggleMute: toggleMuteInHook,\n prepare,\n } = nostalgist;\n\n // Session End tracking\n useEffect(() => {\n return () => {\n if (status === 'running' || status === 'paused') {\n onSessionEnd?.();\n }\n };\n }, [status, onSessionEnd]);\n\n // Volume management\n const volumeState = useVolume({\n setVolume: setVolumeInHook,\n toggleMute: toggleMuteInHook,\n });\n\n // Suppress warnings\n useEffect(() => suppressEmulatorWarnings(), []);\n\n // Prepare emulator loop\n useEffect(() => {\n if (!romUrl || !system || status !== 'idle') return;\n\n const checkAndPrepare = async () => {\n if (canvasRef.current && canvasRef.current.isConnected) {\n prepare();\n } else {\n requestAnimationFrame(checkAndPrepare);\n }\n };\n\n const rafId = requestAnimationFrame(checkAndPrepare);\n return () => cancelAnimationFrame(rafId);\n }, [romUrl, system, status, prepare]);\n\n // Hardcore Restrictions\n const hardcoreRestrictions = useMemo(() => {\n const isHardcore = !!retroAchievementsConfig?.hardcore;\n return {\n isHardcore,\n canUseSaveStates: !isHardcore,\n canUseRewind: !isHardcore && (nostalgist.rewindEnabled ?? true),\n canUseCheats: !isHardcore,\n canUseSlowMotion: !isHardcore,\n };\n }, [retroAchievementsConfig?.hardcore, nostalgist.rewindEnabled]);\n\n return {\n nostalgist,\n volumeState,\n controls,\n saveControls,\n gamepads,\n connectedCount,\n gamepadModalOpen,\n setGamepadModalOpen,\n controlsModalOpen,\n setControlsModalOpen,\n hardcoreRestrictions,\n };\n}\n","/**\n * A simple async queue to serialize operations (like saving)\n * ensuring they run one after another.\n */\nexport class SaveQueue {\n private queue: { task: () => Promise<any>; resolve: (val: any) => void; reject: (err: any) => void }[] = [];\n private isProcessing = false;\n\n /**\n * Add a task to the queue.\n * @param task A function that returns a promise.\n * @returns A promise that resolves with the task's result.\n */\n add<T>(task: () => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n this.queue.push({ task, resolve, reject });\n this.process();\n });\n }\n\n /**\n * Check if the queue is currently processing or has pending items.\n */\n get isBusy(): boolean {\n return this.isProcessing || this.queue.length > 0;\n }\n\n private async process() {\n if (this.isProcessing) return;\n this.isProcessing = true;\n\n while (this.queue.length > 0) {\n const item = this.queue.shift();\n if (item) {\n try {\n const result = await item.task();\n item.resolve(result);\n } catch (err) {\n item.reject(err);\n }\n }\n }\n\n this.isProcessing = false;\n }\n}\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport { UseNostalgistReturn } from './useNostalgist';\nimport { SaveQueue } from '../lib/save-queue';\n\ninterface UseAutoSaveProps {\n nostalgist: UseNostalgistReturn | null;\n onAutoSave?: (blob: Blob, screenshot?: string) => Promise<void>;\n queueRef: React.MutableRefObject<SaveQueue>;\n autoSaveInterval?: number; // Defaults to 60000ms\n}\n\nexport function useAutoSave({\n nostalgist,\n onAutoSave,\n queueRef,\n autoSaveInterval = 60000,\n}: UseAutoSaveProps) {\n const [autoSavePaused, setAutoSavePaused] = useState(false);\n const [autoSaveState, setAutoSaveState] = useState<'idle' | 'counting' | 'saving' | 'done'>('idle');\n const [autoSaveProgress, setAutoSaveProgress] = useState(0);\n\n // Keep latest callbacks in refs to avoid restarting the timer\n const onAutoSaveRef = useRef(onAutoSave);\n const nostalgistRef = useRef(nostalgist);\n\n useEffect(() => {\n onAutoSaveRef.current = onAutoSave;\n nostalgistRef.current = nostalgist;\n }, [onAutoSave, nostalgist]);\n\n // Trigger to restart the auto-save loop\n const [loopTrigger, setLoopTrigger] = useState(0);\n\n useEffect(() => {\n const currentNostalgist = nostalgist;\n\n if (!onAutoSave || !currentNostalgist || currentNostalgist.status !== 'running' || autoSavePaused) {\n setAutoSaveState('idle');\n setAutoSaveProgress(0);\n return;\n }\n\n setAutoSaveState('counting');\n setAutoSaveProgress(0);\n\n const progressInterval = 1000;\n const startTime = Date.now();\n\n // Progress updater\n const progressId = setInterval(() => {\n const elapsed = Date.now() - startTime;\n const progress = Math.min(100, (elapsed / autoSaveInterval) * 100);\n setAutoSaveProgress(progress);\n }, progressInterval);\n\n // Auto-save trigger\n const saveTimeoutId = setTimeout(async () => {\n if (queueRef.current.isBusy) {\n console.log('[GamePlayer] Skipping auto-save (queue busy)');\n // Retry in 5 seconds if busy, don't full reset\n setTimeout(() => setLoopTrigger(prev => prev + 1), 5000);\n return;\n }\n\n const activeNostalgist = nostalgistRef.current;\n const activeOnAutoSave = onAutoSaveRef.current;\n\n if (!activeNostalgist || !activeOnAutoSave) return;\n\n setAutoSaveState('saving');\n setAutoSaveProgress(100);\n\n await queueRef.current.add(async () => {\n const result = await activeNostalgist.saveStateWithBlob();\n if (result) {\n let screen: string | undefined;\n try {\n const screenshotData = await activeNostalgist.screenshot();\n if (screenshotData) screen = screenshotData;\n } catch (e) {\n console.warn('Failed to take screenshot for auto-save', e);\n }\n\n await activeOnAutoSave(result.blob, screen);\n // console.log('[GamePlayer] Auto-saved');\n setAutoSaveState('done');\n\n // Restart loop after 2 seconds\n setTimeout(() => {\n setLoopTrigger(prev => prev + 1);\n }, 2000);\n }\n });\n }, autoSaveInterval);\n\n return () => {\n clearInterval(progressId);\n clearTimeout(saveTimeoutId);\n };\n }, [nostalgist?.status, autoSavePaused, !!onAutoSave, loopTrigger, autoSaveInterval]);\n\n const handleAutoSaveToggle = useCallback(() => {\n setAutoSavePaused(prev => !prev);\n }, []);\n\n // Emergency Save Logic (Visibility Change & Unload)\n useEffect(() => {\n if (!onAutoSave || !nostalgist || nostalgist.status !== 'running') return;\n\n const performEmergencySave = async () => {\n try {\n await queueRef.current.add(async () => {\n const result = await nostalgist.saveStateWithBlob();\n if (result) {\n let screen: string | undefined;\n try {\n const screenshotData = await nostalgist.screenshot();\n if (screenshotData) screen = screenshotData;\n } catch (e) {\n console.warn('Failed to take screenshot for emergency save', e);\n }\n\n await onAutoSave(result.blob, screen);\n console.log('[GamePlayer] Emergency saved');\n }\n });\n } catch (err) {\n console.error('[GamePlayer] Emergency save failed', err);\n }\n };\n\n const handleVisibilityChange = () => {\n if (document.hidden) {\n performEmergencySave();\n }\n };\n\n const handleBeforeUnload = (_e: BeforeUnloadEvent) => {\n if (!document.hidden) {\n performEmergencySave();\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n window.addEventListener('beforeunload', handleBeforeUnload);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n window.removeEventListener('beforeunload', handleBeforeUnload);\n };\n }, [nostalgist?.status, onAutoSave, nostalgist]);\n\n return {\n autoSaveEnabled: !!onAutoSave,\n autoSavePaused,\n autoSaveState,\n autoSaveProgress,\n handleAutoSaveToggle,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { UseNostalgistReturn } from './useNostalgist';\nimport { useKoinTranslation } from './useKoinTranslation';\nimport { GamePlayerProps, SaveSlot } from '../components/types';\nimport { SaveQueue } from '../lib/save-queue';\nimport { useAutoSave } from './useAutoSave';\n\ninterface UseGameSavesProps extends Partial<GamePlayerProps> {\n nostalgist: UseNostalgistReturn | null;\n showToast: (message: string, type?: 'success' | 'error' | 'info' | 'warning', options?: any) => void;\n pause: () => void;\n resume: () => void;\n}\n\nexport function useGameSaves({\n nostalgist,\n showToast,\n pause,\n resume,\n title,\n onSaveState,\n onLoadState,\n onAutoSave,\n onGetSaveSlots,\n onDeleteSaveState,\n autoSaveInterval,\n}: UseGameSavesProps) {\n const t = useKoinTranslation();\n // Save Slot Modal state\n const [saveModalOpen, setSaveModalOpen] = useState(false);\n const [saveModalMode, setSaveModalMode] = useState<'save' | 'load'>('save');\n const [saveSlots, setSaveSlots] = useState<SaveSlot[]>([]);\n const [isSlotLoading, setIsSlotLoading] = useState(false);\n const [actioningSlot, setActioningSlot] = useState<number | null>(null);\n\n // Save Queue to prevent race conditions\n const queueRef = useRef(new SaveQueue());\n\n // Auto-save hook\n const {\n autoSaveEnabled,\n autoSavePaused,\n autoSaveState,\n autoSaveProgress,\n handleAutoSaveToggle,\n } = useAutoSave({\n nostalgist,\n onAutoSave,\n queueRef,\n autoSaveInterval,\n });\n\n // Fetch slots helper\n const refreshSlots = useCallback(async () => {\n if (!onGetSaveSlots) return;\n setIsSlotLoading(true);\n try {\n const slots = await onGetSaveSlots();\n setSaveSlots(slots);\n } catch (err) {\n console.error('Failed to fetch save slots:', err);\n showToast(t.notifications.failedFetch, 'error', { title: t.overlays.toast.error });\n } finally {\n setIsSlotLoading(false);\n }\n }, [onGetSaveSlots, showToast]);\n\n // Handlers\n const handleSave = async () => {\n if (!nostalgist) return;\n\n if (onGetSaveSlots && onSaveState) {\n // Open modal for slot selection\n setSaveModalMode('save');\n setSaveModalOpen(true);\n pause(); // Pause game while in modal\n refreshSlots();\n } else if (onSaveState) {\n // Direct save to slot 0 if no slot system\n await queueRef.current.add(async () => {\n const result = await nostalgist.saveStateWithBlob();\n if (result) {\n await onSaveState(0, result.blob, undefined);\n showToast(t.notifications.saved, 'success', { title: t.overlays.toast.saved });\n }\n });\n } else {\n // Default: Download blob\n await queueRef.current.add(async () => {\n const result = await nostalgist.saveStateWithBlob();\n if (result) {\n const url = URL.createObjectURL(result.blob);\n const a = document.createElement('a');\n a.href = url;\n const fileName = title || 'game';\n a.download = `${fileName}.state`;\n a.click();\n URL.revokeObjectURL(url);\n showToast(t.notifications.downloaded, 'success', { title: t.overlays.toast.saved });\n }\n });\n }\n };\n\n const handleLoad = async () => {\n if (!nostalgist) return;\n\n if (onGetSaveSlots && onLoadState) {\n // Open modal for slot selection\n setSaveModalMode('load');\n setSaveModalOpen(true);\n pause();\n refreshSlots();\n } else if (onLoadState) {\n // Direct load from slot 0\n const blob = await onLoadState(0);\n if (blob) {\n const buffer = await blob.arrayBuffer();\n await queueRef.current.add(async () => {\n await nostalgist.loadState(new Uint8Array(buffer));\n });\n showToast(t.notifications.loaded, 'success', { title: t.overlays.toast.loaded });\n } else {\n showToast(t.notifications.noSaveFound, 'error', { title: t.overlays.toast.error });\n }\n } else {\n // Default: Open file picker\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.state';\n input.onchange = async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file) {\n const buffer = await file.arrayBuffer();\n await queueRef.current.add(async () => {\n await nostalgist.loadState(new Uint8Array(buffer));\n });\n showToast(t.notifications.loadedFile, 'success', { title: t.overlays.toast.loaded });\n }\n };\n input.click();\n }\n };\n\n const handleSlotSelect = async (slot: number) => {\n if (!nostalgist) return;\n\n if (saveModalMode === 'save') {\n if (!onSaveState) return;\n setActioningSlot(slot);\n try {\n await queueRef.current.add(async () => {\n const result = await nostalgist.saveStateWithBlob();\n if (result) {\n // Take screenshot\n let screen: string | undefined;\n try {\n const screenshotData = await nostalgist.screenshot();\n if (screenshotData) {\n screen = screenshotData;\n }\n } catch (e) {\n console.warn('Screenshot failed', e);\n }\n\n await onSaveState(slot, result.blob, screen);\n showToast(t.notifications.savedSlot.replace('{{num}}', slot.toString()), 'success', { title: t.overlays.toast.saved });\n setSaveModalOpen(false);\n resume();\n }\n });\n } catch (err) {\n console.error('Save failed:', err);\n showToast(t.notifications.failedSave, 'error', { title: t.overlays.toast.error });\n } finally {\n setActioningSlot(null);\n }\n } else {\n if (!onLoadState) return;\n setActioningSlot(slot);\n try {\n const blob = await onLoadState(slot);\n if (blob) {\n const buffer = await blob.arrayBuffer();\n await queueRef.current.add(async () => {\n await nostalgist.loadState(new Uint8Array(buffer));\n });\n showToast(t.notifications.loadedSlot.replace('{{num}}', slot.toString()), 'success', { title: t.overlays.toast.loaded });\n setSaveModalOpen(false);\n resume();\n } else {\n showToast(t.notifications.emptySlot, 'error', { title: t.overlays.toast.error });\n }\n } catch (err) {\n console.error('Load failed:', err);\n showToast(t.notifications.failedLoad, 'error', { title: t.overlays.toast.error });\n } finally {\n setActioningSlot(null);\n }\n }\n };\n\n const handleSlotDelete = async (slot: number) => {\n if (!onDeleteSaveState) return;\n if (!confirm('Are you sure you want to delete this save?')) return;\n\n setActioningSlot(slot);\n try {\n await onDeleteSaveState(slot);\n showToast(t.notifications.deletedSlot.replace('{{num}}', slot.toString()), 'success', { title: t.overlays.toast.saved });\n refreshSlots(); // Refresh list\n } catch (err) {\n console.error('Delete failed:', err);\n showToast(t.notifications.failedDelete, 'error', { title: t.overlays.toast.error });\n } finally {\n setActioningSlot(null);\n }\n };\n\n return {\n saveModalOpen,\n setSaveModalOpen,\n saveModalMode,\n saveSlots,\n isSlotLoading,\n actioningSlot,\n handleSave,\n handleLoad,\n handleSlotSelect,\n handleSlotDelete,\n // Auto-save exports\n autoSaveEnabled,\n autoSavePaused,\n autoSaveState,\n autoSaveProgress,\n handleAutoSaveToggle,\n };\n}\n","import { useState } from 'react';\nimport { UseNostalgistReturn } from './useNostalgist';\nimport { GamePlayerProps } from '../components/types';\n\ninterface UseGameCheatsProps extends Partial<GamePlayerProps> {\n nostalgist: UseNostalgistReturn | null;\n}\n\nexport function useGameCheats({\n nostalgist,\n cheats = [],\n onToggleCheat,\n}: UseGameCheatsProps) {\n const [cheatsModalOpen, setCheatsModalOpen] = useState(false);\n const [activeCheats, setActiveCheats] = useState<Set<number>>(new Set());\n\n const handleToggleCheat = (cheatId: number) => {\n if (!nostalgist) return;\n\n const newActiveCheats = new Set(activeCheats);\n const isActive = newActiveCheats.has(cheatId);\n\n if (isActive) {\n newActiveCheats.delete(cheatId);\n } else {\n newActiveCheats.add(cheatId);\n }\n setActiveCheats(newActiveCheats);\n\n // Notify external handler\n onToggleCheat?.(cheatId, !isActive);\n\n // Re-apply all active cheats\n nostalgist.resetCheats();\n\n // Small delay to ensure reset is processed\n setTimeout(() => {\n newActiveCheats.forEach((id) => {\n const cheat = cheats.find((c) => c.id === id);\n if (cheat) {\n nostalgist.applyCheat(cheat.code);\n }\n });\n }, 50);\n };\n\n return {\n cheatsModalOpen,\n setCheatsModalOpen,\n activeCheats,\n handleToggleCheat,\n };\n}\n","'use client';\n\nimport { useState, useRef, useCallback, useEffect } from 'react';\n\ninterface UseGameRecordingProps {\n getCanvasElement: () => HTMLCanvasElement | null;\n}\n\ninterface UseGameRecordingReturn {\n isRecording: boolean;\n isPaused: boolean;\n recordingDuration: number; // in seconds\n startRecording: () => void;\n stopRecording: () => Promise<Blob | null>;\n pauseRecording: () => void;\n resumeRecording: () => void;\n isSupported: boolean;\n}\n\n/**\n * Gameplay Recording Hook\n * -----------------------\n * Uses MediaRecorder API to capture canvas gameplay as WebM video.\n * \n * Features:\n * - Start/stop recording\n * - Pause/resume\n * - Duration tracking\n * - Returns Blob for download\n */\nexport function useGameRecording({\n getCanvasElement,\n}: UseGameRecordingProps): UseGameRecordingReturn {\n const [isRecording, setIsRecording] = useState(false);\n const [isPaused, setIsPaused] = useState(false);\n const [recordingDuration, setRecordingDuration] = useState(0);\n\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n const startTimeRef = useRef<number>(0);\n const pausedTimeRef = useRef<number>(0);\n const durationIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // Check browser support\n const isSupported = typeof MediaRecorder !== 'undefined' && MediaRecorder.isTypeSupported('video/webm');\n\n // Start recording\n const startRecording = useCallback(() => {\n const canvas = getCanvasElement();\n if (!canvas || !isSupported) {\n console.warn('[Recording] Canvas not found or MediaRecorder not supported');\n return;\n }\n\n try {\n // Capture canvas stream at 30fps\n const stream = canvas.captureStream(30);\n\n // Try to use VP9 for better quality, fallback to VP8\n const mimeType = MediaRecorder.isTypeSupported('video/webm;codecs=vp9')\n ? 'video/webm;codecs=vp9'\n : 'video/webm;codecs=vp8';\n\n const mediaRecorder = new MediaRecorder(stream, {\n mimeType,\n videoBitsPerSecond: 5000000, // 5 Mbps for good quality\n });\n\n chunksRef.current = [];\n\n mediaRecorder.ondataavailable = (e) => {\n if (e.data.size > 0) {\n chunksRef.current.push(e.data);\n }\n };\n\n mediaRecorder.start(1000); // Capture every second\n mediaRecorderRef.current = mediaRecorder;\n\n startTimeRef.current = Date.now();\n pausedTimeRef.current = 0;\n setIsRecording(true);\n setIsPaused(false);\n setRecordingDuration(0);\n\n // Update duration every second\n durationIntervalRef.current = setInterval(() => {\n if (!isPaused) {\n const elapsed = (Date.now() - startTimeRef.current - pausedTimeRef.current) / 1000;\n setRecordingDuration(Math.floor(elapsed));\n }\n }, 1000);\n\n console.log('[Recording] Started');\n } catch (err) {\n console.error('[Recording] Failed to start:', err);\n }\n }, [getCanvasElement, isSupported, isPaused]);\n\n // Stop recording and return blob\n const stopRecording = useCallback(async (): Promise<Blob | null> => {\n return new Promise((resolve) => {\n const mediaRecorder = mediaRecorderRef.current;\n if (!mediaRecorder || mediaRecorder.state === 'inactive') {\n resolve(null);\n return;\n }\n\n mediaRecorder.onstop = () => {\n const blob = new Blob(chunksRef.current, { type: 'video/webm' });\n chunksRef.current = [];\n\n setIsRecording(false);\n setIsPaused(false);\n setRecordingDuration(0);\n\n if (durationIntervalRef.current) {\n clearInterval(durationIntervalRef.current);\n }\n\n console.log('[Recording] Stopped, size:', (blob.size / 1024 / 1024).toFixed(2), 'MB');\n resolve(blob);\n };\n\n mediaRecorder.stop();\n });\n }, []);\n\n // Pause recording\n const pauseRecording = useCallback(() => {\n const mediaRecorder = mediaRecorderRef.current;\n if (mediaRecorder && mediaRecorder.state === 'recording') {\n mediaRecorder.pause();\n setIsPaused(true);\n pausedTimeRef.current = Date.now();\n console.log('[Recording] Paused');\n }\n }, []);\n\n // Resume recording\n const resumeRecording = useCallback(() => {\n const mediaRecorder = mediaRecorderRef.current;\n if (mediaRecorder && mediaRecorder.state === 'paused') {\n // Account for paused time\n pausedTimeRef.current = Date.now() - pausedTimeRef.current;\n mediaRecorder.resume();\n setIsPaused(false);\n console.log('[Recording] Resumed');\n }\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {\n mediaRecorderRef.current.stop();\n }\n if (durationIntervalRef.current) {\n clearInterval(durationIntervalRef.current);\n }\n };\n }, []);\n\n return {\n isRecording,\n isPaused,\n recordingDuration,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n isSupported,\n };\n}\n","import { GamePlayerProps } from '../components/types';\nimport { useGameUI } from './useGameUI';\nimport { useGameSession } from './useGameSession';\nimport { useGameSaves } from './useGameSaves';\nimport { useGameCheats } from './useGameCheats';\nimport { useGameRecording } from './useGameRecording';\n\nexport function useGamePlayer(props: GamePlayerProps) {\n // 1. UI State (Toasts, Fullscreen, Refs)\n const {\n containerRef,\n canvasRef,\n isMobile,\n isFullscreen,\n toasts,\n showToast,\n dismissToast,\n handleFullscreen,\n raSidebarOpen,\n setRaSidebarOpen,\n } = useGameUI();\n\n // 2. Session State (Emulator, Controls, Gamepads, Volume)\n const {\n nostalgist,\n volumeState,\n controls,\n saveControls,\n gamepads,\n connectedCount,\n gamepadModalOpen,\n setGamepadModalOpen,\n controlsModalOpen,\n setControlsModalOpen,\n hardcoreRestrictions,\n } = useGameSession({\n ...props,\n canvasRef,\n showToast,\n });\n\n const {\n pause,\n resume,\n } = nostalgist;\n\n // 3. Saves State (Save/Load, Slots, Auto-save)\n const {\n saveModalOpen,\n setSaveModalOpen,\n saveModalMode,\n saveSlots,\n isSlotLoading,\n actioningSlot,\n handleSave,\n handleLoad,\n handleSlotSelect,\n handleSlotDelete,\n autoSaveEnabled,\n autoSavePaused,\n autoSaveState,\n autoSaveProgress,\n handleAutoSaveToggle,\n } = useGameSaves({\n ...props,\n nostalgist,\n showToast,\n pause,\n resume,\n });\n\n // 4. Cheats State (Modal, Toggling)\n const {\n cheatsModalOpen,\n setCheatsModalOpen,\n activeCheats,\n handleToggleCheat,\n } = useGameCheats({\n ...props,\n nostalgist,\n });\n\n // 5. Recording State (Capture gameplay as video)\n const {\n isRecording,\n isPaused: isRecordingPaused,\n recordingDuration,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n isSupported: recordingSupported,\n } = useGameRecording({\n getCanvasElement: () => canvasRef.current,\n });\n\n return {\n // Refs\n containerRef,\n canvasRef,\n\n // State\n isMobile,\n isFullscreen,\n toasts,\n dismissToast,\n raSidebarOpen,\n setRaSidebarOpen,\n\n // Controls\n controls,\n saveControls,\n\n // Gamepads\n gamepads,\n connectedCount,\n\n // Modals\n gamepadModalOpen,\n setGamepadModalOpen,\n controlsModalOpen,\n setControlsModalOpen,\n cheatsModalOpen,\n setCheatsModalOpen,\n\n // Save Modal\n saveModalOpen,\n setSaveModalOpen,\n saveModalMode,\n saveSlots,\n isSlotLoading,\n actioningSlot,\n handleSlotSelect,\n handleSlotDelete,\n autoSaveEnabled,\n autoSavePaused,\n autoSaveState,\n autoSaveProgress,\n handleAutoSaveToggle,\n\n // Restrictions\n hardcoreRestrictions,\n\n // Cheats\n activeCheats,\n handleToggleCheat,\n\n // Emulator\n nostalgist,\n volumeState,\n\n // Handlers\n handleFullscreen,\n handleSave,\n handleLoad,\n\n // Actions\n pause,\n resume,\n\n // Recording\n isRecording,\n isRecordingPaused,\n recordingDuration,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n recordingSupported,\n };\n}\n","'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { ShaderPresetId } from '../components/UI/ShaderSelector';\n\nconst STORAGE_KEY = 'koin-player-settings';\n\nexport interface PlayerSettings {\n volume: number;\n muted: boolean;\n shader: ShaderPresetId;\n showPerformanceOverlay: boolean;\n showInputDisplay: boolean;\n}\n\nconst DEFAULT_SETTINGS: PlayerSettings = {\n volume: 1,\n muted: false,\n shader: '',\n showPerformanceOverlay: false,\n showInputDisplay: false,\n};\n\n/**\n * Hook to manage persistent player settings (Volume, Shader, Overlays)\n * Synchronizes with localStorage and optional external callback.\n */\nexport function usePlayerPersistence(\n onSettingsChange?: (settings: PlayerSettings) => void\n) {\n // Initialize state function to avoid hydration mismatch if possible, \n // but for localStorage we usually need useEffect or a specific strategy.\n // For simplicity, we start with defaults and load in effect.\n const [settings, setSettings] = useState<PlayerSettings>(DEFAULT_SETTINGS);\n const [isLoaded, setIsLoaded] = useState(false);\n\n // Load from storage on mount\n useEffect(() => {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored);\n setSettings(prev => ({ ...prev, ...parsed }));\n }\n } catch (e) {\n console.error('Failed to load player settings', e);\n }\n setIsLoaded(true);\n }, []);\n\n // Save to storage whenever settings change\n const updateSettings = useCallback((updates: Partial<PlayerSettings>) => {\n setSettings(prev => {\n const next = { ...prev, ...updates };\n\n // Persist\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(next));\n } catch (e) {\n console.error('Failed to save player settings', e);\n }\n\n // Notify\n if (onSettingsChange) {\n onSettingsChange(next);\n }\n\n return next;\n });\n }, [onSettingsChange]);\n\n return {\n settings,\n isLoaded,\n updateSettings,\n };\n}\n","export const sendTelemetry = (eventName: string, params: Record<string, any> = {}) => {\n // Prevent telemetry during development/local testing to avoid noise?\n // Or maybe we want to test it. Let's make it safe.\n if (typeof window === 'undefined') return;\n\n // Fire and forget beacon\n try {\n fetch('https://koin.theretrosaga.com/api/telemetry', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n event_name: eventName,\n params: {\n ...params,\n url: window.location.href,\n referrer: document.referrer,\n timestamp: new Date().toISOString()\n }\n })\n }).catch(() => {\n // Ignore telemetry errors\n });\n } catch (e) {\n // Ignore\n }\n};\n","import { KoinTranslations } from './types';\n\nexport const es: KoinTranslations = {\n controls: {\n play: 'Jugar',\n pause: 'Pausar',\n reset: 'Reiniciar',\n rewind: 'Rebobinar',\n save: 'Guardar',\n load: 'Cargar',\n snap: 'Capturar',\n rec: 'Grabar',\n stopRec: 'Detener',\n startRecord: 'Comenzar grabación',\n stopRecord: 'Detener grabación',\n mute: 'Silenciar',\n unmute: 'Activar sonido',\n help: 'Ayuda',\n full: 'Pantalla comp.', // Abbreviated\n keys: 'Teclas',\n menuOpen: 'Abrir menú',\n menuClose: 'Cerrar menú',\n gamepadConnected: '{{count}} mando{{plural}} conectado(s) - haz clic para configurar',\n noGamepad: 'No hay mando detectado - presiona cualquier botón para conectar',\n press: 'Pulsa',\n startBtn: 'START',\n selectBtn: 'SELECT',\n },\n common: {\n disabledInHardcore: 'Desactivado en modo Hardcore',\n notSupported: 'No compatible con esta consola',\n playToEnableRewind: 'Juega unos segundos para activar el rebobinado',\n },\n settings: {\n title: 'Ajustes',\n general: 'General',\n audio: 'Sonido',\n video: 'Vídeo',\n input: 'Entrada',\n advanced: 'Avanzado',\n fullscreen: 'Pantalla completa',\n controls: 'Controles',\n gamepad: 'Mando',\n cheats: 'Trucos',\n retroAchievements: 'RetroAchievements',\n shortcuts: 'Atajos',\n exit: 'Salir',\n language: 'Idioma',\n selectLanguage: 'Seleccionar idioma',\n },\n overlay: {\n play: 'JUGAR',\n systemFirmware: 'FIRMWARE DEL SISTEMA',\n loading: 'Cargando {{system}}',\n initializing: 'Inicializando emulador',\n loadingSave: 'Cargando partida',\n preparingSlot: 'Preparando ranura {{num}}',\n systemError: 'Error del sistema',\n failedInit: 'Error al inicializar el emulador',\n retry: 'Reintentar',\n slotReady: 'Ranura {{num}} lista',\n paused: 'Pausado',\n },\n notifications: {\n saved: 'Estado guardado',\n loaded: 'Estado cargado',\n error: 'Error',\n recordingStarted: 'Grabación iniciada',\n recordingSaved: 'Grabación guardada',\n downloaded: 'Estado descargado',\n loadedFile: 'Estado cargado desde archivo',\n savedSlot: 'Guardado en ranura {{num}}',\n loadedSlot: 'Cargado desde ranura {{num}}',\n deletedSlot: 'Ranura {{num}} eliminada',\n emptySlot: 'Ranura vacía',\n noSaveFound: 'No se encontró partida guardada',\n failedSave: 'Error al guardar',\n failedLoad: 'Error al cargar',\n failedDelete: 'Error al eliminar',\n failedFetch: 'Error al cargar ranuras',\n controllerConnected: 'Mando conectado',\n controllerDisconnected: 'Mando desconectado',\n controllerReady: 'Mando listo para usar',\n insertCoin: 'Pulsa SHIFT para insertar moneda',\n insertCoinTitle: '🪙 Insertar Moneda',\n controlsSaved: 'Controles guardados',\n controlsReset: 'Controles restablecidos',\n },\n modals: {\n shortcuts: {\n title: 'Atajos de teclado',\n playerShortcuts: 'Atajos del reproductor',\n overlays: 'Superposiciones',\n recording: 'Grabación',\n showHelp: 'Mostrar ayuda',\n perfOverlay: 'Superposición de rendimiento',\n inputDisplay: 'Mostrar entrada',\n toggleRec: 'Alternar grabación',\n toggleMute: 'Alternar silencio',\n pressEsc: 'Pulsa ESC para cerrar',\n },\n controls: {\n title: 'Controles',\n keyboard: 'Asignación de teclado',\n description: 'Haz clic en un botón y pulsa una tecla',\n pressKey: 'Pulsa una tecla...',\n reset: 'Restablecer',\n save: 'Guardar controles',\n },\n gamepad: {\n title: 'Ajustes de mando',\n noGamepad: 'No se detecta mando',\n connected: '{{count}} mando{{s}} conectado(s)',\n none: 'Ningún mando detectado',\n player: 'Jugador:',\n noController: 'Sin mando',\n pressAny: 'Pulsa cualquier botón para conectar',\n waiting: 'Esperando entrada...',\n pressButton: 'Pulsa botón para {{button}}',\n pressEsc: 'Pulsa Escape para cancelar',\n reset: 'Restablecer',\n save: 'Guardar ajustes',\n },\n cheats: {\n title: 'Trucos',\n addCheat: 'Añadir truco',\n available: '{{count}} truco{{s}} disponible(s)',\n emptyTitle: 'No hay trucos disponibles',\n emptyDesc: 'No se encontraron códigos para este juego',\n copy: 'Copiar código',\n active: '{{count}} truco{{s}} activo(s)',\n toggleHint: 'Haz clic para activar/desactivar',\n },\n saveSlots: {\n title: 'Guardar partida',\n saveTitle: 'Guardar',\n loadTitle: 'Cargar',\n emptySlot: 'Ranura vacía',\n subtitleSave: 'Elige una ranura para guardar',\n subtitleLoad: 'Elige una ranura para cargar',\n loading: 'Cargando partidas...',\n locked: 'Ranura {{num}} bloqueada',\n upgrade: 'Mejora para desbloquear más ranuras',\n autoSave: 'Autoguardado',\n autoSaveDesc: 'Reservado para guardado automático',\n noData: 'Sin datos',\n slot: 'Ranura {{num}}',\n footerSave: 'Las partidas se guardan en la nube y se sincronizan',\n footerLoad: 'Tu progreso se restaurará al punto seleccionado',\n },\n bios: {\n title: 'Selección de BIOS',\n description: 'Selecciona una BIOS para este juego',\n warningTitle: 'Nota:',\n warning: 'Cambiar la BIOS reiniciará el emulador. Se perderá el progreso no guardado.',\n systemDefault: 'Por defecto',\n active: 'Activo',\n defaultDesc: \"Usar BIOS interna del emulador\",\n emptyTitle: 'No se encontraron archivos de BIOS.',\n emptyDesc: 'Sube archivos BIOS en tu biblioteca.',\n footer: 'Firmware del sistema',\n },\n },\n retroAchievements: {\n title: 'RetroAchievements',\n login: 'Iniciar sesión',\n logout: 'Cerrar sesión',\n username: 'Usuario',\n password: 'Password',\n hardcore: 'Modo Hardcore',\n achievements: 'Logros',\n locked: 'Bloqueado',\n unlocked: 'Desbloqueado',\n mastered: 'Dominado',\n identifying: 'Identificando juego...',\n achievementsAvailable: '{{count}} logros disponibles',\n gameNotSupported: 'Conectado - Juego no en base de datos',\n connect: 'Conectar RetroAchievements',\n connected: 'RetroAchievements (conectado)',\n createAccount: 'Crear cuenta',\n privacy: 'Privacidad:',\n privacyText: 'Tu contraseña solo se usa para autenticación con RA. No se almacena.',\n connecting: 'Conectando...',\n connectAccount: 'Conecta tu cuenta para rastrear logros',\n poweredBy: 'Con la tecnología de',\n connectedStatus: 'Conectado',\n yourUsername: 'Tu usuario RA',\n yourPassword: 'Tu contraseña RA',\n usernameRequired: 'Usuario y contraseña requeridos',\n noGame: 'Sin juego cargado',\n loadGame: 'Carga un juego para ver los logros',\n noAchievements: 'No se encontraron logros',\n notSupported: 'Este juego puede no ser compatible',\n ptsRemaining: '{{count}} pts restantes',\n filters: {\n all: 'Todos',\n locked: 'Bloqueado',\n unlocked: 'Desbloqueado',\n },\n },\n overlays: {\n performance: {\n title: 'Estadísticas',\n fps: 'FPS',\n frameTime: 'FT',\n memory: 'MEM',\n core: 'Core',\n input: 'ENTRADA',\n active: 'ACTIVO',\n },\n toast: {\n saved: 'Juego guardado',\n loaded: 'Juego cargado',\n error: 'Error',\n },\n recording: {\n started: 'Grabación iniciada',\n stopped: 'Grabación detenida',\n saved: 'Grabación guardada',\n paused: 'PAUSA',\n recording: 'GRABANDO',\n resume: 'Reanudar grabación',\n pause: 'Pausar grabación',\n stop: 'Detener y guardar',\n hover: 'Controles',\n },\n },\n};\n","import { KoinTranslations } from './types';\n\nexport const fr: KoinTranslations = {\n controls: {\n play: 'Jouer',\n pause: 'Pause',\n reset: 'Réinitialiser',\n rewind: 'Rembobiner',\n save: 'Sauver',\n load: 'Charger',\n snap: 'Photo',\n rec: 'Enr.',\n stopRec: 'Arrêter',\n startRecord: 'Démarrer l\\'enregistrement',\n stopRecord: 'Arrêter l\\'enregistrement',\n mute: 'Muet',\n unmute: 'Son',\n help: 'Aide',\n full: 'Plein écran',\n keys: 'Touches',\n menuOpen: 'Ouvrir menu',\n menuClose: 'Fermer menu',\n gamepadConnected: '{{count}} manette{{plural}} connectée(s)',\n noGamepad: 'Aucune manette détectée',\n press: 'Appuyez',\n startBtn: 'START',\n selectBtn: 'SELECT',\n },\n common: {\n disabledInHardcore: 'Désactivé en mode Hardcore',\n notSupported: 'Non supporté sur cette console',\n playToEnableRewind: 'Jouez quelques secondes pour activer le rembobinage',\n },\n settings: {\n title: 'Paramètres',\n general: 'Général',\n audio: 'Audio',\n video: 'Vidéo',\n input: 'Entrée',\n advanced: 'Avancé',\n fullscreen: 'Plein écran',\n controls: 'Contrôles',\n gamepad: 'Manette',\n cheats: 'Codes',\n retroAchievements: 'Succès',\n shortcuts: 'Raccourcis',\n exit: 'Quitter',\n language: 'Langue',\n selectLanguage: 'Choisir la langue',\n },\n overlay: {\n play: 'JOUER',\n systemFirmware: 'MICROLOGICIEL SYSTÈME',\n loading: 'Chargement {{system}}',\n initializing: 'Initialisation de l\\'émulateur',\n loadingSave: 'Chargement de la sauvegarde',\n preparingSlot: 'Préparation de l\\'emplacement {{num}}',\n systemError: 'Erreur système',\n failedInit: 'Échec de l\\'initialisation',\n retry: 'Réessayer',\n slotReady: 'Emplacement {{num}} prêt',\n paused: 'Pause',\n },\n notifications: {\n saved: 'État sauvegardé',\n loaded: 'État chargé',\n error: 'Erreur',\n recordingStarted: 'Enregistrement démarré',\n recordingSaved: 'Enregistrement sauvegardé',\n downloaded: 'État téléchargé',\n loadedFile: 'État chargé depuis fichier',\n savedSlot: 'Sauvegardé sur l\\'emplacement {{num}}',\n loadedSlot: 'Chargé depuis l\\'emplacement {{num}}',\n deletedSlot: 'Emplacement {{num}} supprimé',\n emptySlot: 'Emplacement vide',\n noSaveFound: 'Aucune sauvegarde trouvée',\n failedSave: 'Échec de la sauvegarde',\n failedLoad: 'Échec du chargement',\n failedDelete: 'Échec de la suppression',\n failedFetch: 'Échec du chargement des emplacements',\n controllerConnected: 'Manette connectée',\n controllerDisconnected: 'Manette déconnectée',\n controllerReady: 'Manette prête',\n insertCoin: 'Appuyez sur SHIFT pour insérer une pièce',\n insertCoinTitle: '🪙 Insérer Pièce',\n controlsSaved: 'Contrôles sauvegardés',\n controlsReset: 'Contrôles réinitialisés',\n },\n modals: {\n shortcuts: {\n title: 'Raccourcis clavier',\n playerShortcuts: 'Raccourcis du lecteur',\n overlays: 'Superpositions',\n recording: 'Enregistrement',\n showHelp: 'Afficher l\\'aide',\n perfOverlay: 'Overlay de performance',\n inputDisplay: 'Afficher les entrées',\n toggleRec: 'Basculer l\\'enregistrement',\n toggleMute: 'Basculer le son',\n pressEsc: 'Appuyez sur ESC pour fermer',\n },\n controls: {\n title: 'Contrôles',\n keyboard: 'Configuration clavier',\n description: 'Cliquez sur un bouton et appuyez sur une touche',\n pressKey: 'Appuyez...',\n reset: 'Réinitialiser',\n save: 'Sauvegarder',\n },\n gamepad: {\n title: 'Paramètres manette',\n noGamepad: 'Aucune manette',\n connected: '{{count}} manette{{s}} connectée(s)',\n none: 'Aucune manette détectée',\n player: 'Joueur:',\n noController: 'Aucune manette',\n pressAny: 'Appuyez sur un bouton pour connecter',\n waiting: 'En attente...',\n pressButton: 'Appuyez pour {{button}}',\n pressEsc: 'Echap pour annuler',\n reset: 'Réinitialiser',\n save: 'Sauvegarder',\n },\n cheats: {\n title: 'Codes de triche',\n addCheat: 'Ajouter un code',\n available: '{{count}} code{{s}} disponible(s)',\n emptyTitle: 'Aucun code disponible',\n emptyDesc: 'Aucun code trouvé pour ce jeu',\n copy: 'Copier',\n active: '{{count}} actif(s)',\n toggleHint: 'Cliquez pour activer/désactiver',\n },\n saveSlots: {\n title: 'Sauvegardes',\n saveTitle: 'Sauvegarder',\n loadTitle: 'Charger',\n emptySlot: 'Vide',\n subtitleSave: 'Choisir un emplacement',\n subtitleLoad: 'Choisir une sauvegarde',\n loading: 'Chargement...',\n locked: 'Emplacement {{num}} verrouillé',\n upgrade: 'Améliorer pour plus d\\'emplacements',\n autoSave: 'Auto-Sauvegarde',\n autoSaveDesc: 'Réservé à la sauvegarde automatique',\n noData: 'Aucune donnée',\n slot: 'Emplacement {{num}}',\n footerSave: 'Les sauvegardes sont synchronisées dans le cloud',\n footerLoad: 'Votre progression sera restaurée',\n },\n bios: {\n title: 'Sélection BIOS',\n description: 'Sélectionnez un BIOS',\n warningTitle: 'Note:',\n warning: 'Changer le BIOS redémarre l\\'émulateur. Progression non sauvegardée sera perdue.',\n systemDefault: 'Par défaut',\n active: 'Actif',\n defaultDesc: \"Utiliser le BIOS par défaut\",\n emptyTitle: 'Aucun BIOS trouvé.',\n emptyDesc: 'Téléversez des fichiers BIOS dans votre bibliothèque.',\n footer: 'Firmware système',\n },\n },\n retroAchievements: {\n title: 'RetroAchievements',\n login: 'Connexion',\n logout: 'Déconnexion',\n username: 'Utilisateur',\n password: 'Mot de passe',\n hardcore: 'Mode Hardcore',\n achievements: 'Succès',\n locked: 'Verrouillé',\n unlocked: 'Déverrouillé',\n mastered: 'Maîtrisé',\n identifying: 'Identification...',\n achievementsAvailable: '{{count}} succès disponibles',\n gameNotSupported: 'Jeu non supporté par RA',\n connect: 'Connecter RetroAchievements',\n connected: 'RetroAchievements (connecté)',\n createAccount: 'Créer un compte',\n privacy: 'Confidentialité:',\n privacyText: 'Votre mot de passe n\\'est pas stocké.',\n connecting: 'Connexion...',\n connectAccount: 'Connectez votre compte',\n poweredBy: 'Propulsé par',\n connectedStatus: 'Connecté',\n yourUsername: 'Votre utilisateur RA',\n yourPassword: 'Votre mot de passe RA',\n usernameRequired: 'Utilisateur et mot de passe requis',\n noGame: 'Aucun jeu',\n loadGame: 'Chargez un jeu pour voir les succès',\n noAchievements: 'Aucun succès trouvé',\n notSupported: 'Ce jeu n\\'est peut-être pas supporté',\n ptsRemaining: '{{count}} pts restants',\n filters: {\n all: 'Tous',\n locked: 'Verrouillés',\n unlocked: 'Déverrouillés',\n },\n },\n overlays: {\n performance: {\n title: 'Stats',\n fps: 'FPS',\n frameTime: 'FT',\n memory: 'MEM',\n core: 'Core',\n input: 'ENTRÉE',\n active: 'ACTIF',\n },\n toast: {\n saved: 'Sauvegardé',\n loaded: 'Chargé',\n error: 'Erreur',\n },\n recording: {\n started: 'Enregistrement démarré',\n stopped: 'Enregistrement arrêté',\n saved: 'Enregistrement sauvegardé',\n paused: 'PAUSE',\n recording: 'ENR.',\n resume: 'Reprendre',\n pause: 'Pause',\n stop: 'Arrêter et sauver',\n hover: 'Contrôles',\n },\n },\n};\n","export function deepMerge<T>(target: T, source: any): T {\n const isObject = (obj: any) => obj && typeof obj === 'object';\n\n if (!isObject(target) || !isObject(source)) {\n return source as T;\n }\n\n const output = { ...target } as any;\n\n Object.keys(source).forEach(key => {\n const targetValue = output[key];\n const sourceValue = source[key];\n\n if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {\n output[key] = sourceValue; // Replace arrays entirely\n } else if (isObject(targetValue) && isObject(sourceValue)) {\n output[key] = deepMerge(targetValue, sourceValue);\n } else {\n output[key] = sourceValue;\n }\n });\n\n return output;\n}\n","'use client';\n\nimport { memo, useState, useEffect, useCallback, useMemo } from 'react';\nimport PlayerControls from './PlayerControls';\nimport ToastContainer from './Overlays/ToastContainer';\nimport PerformanceOverlay from './Overlays/PerformanceOverlay';\nimport InputDisplay from './Overlays/InputDisplay';\nimport RecordingIndicator from './Overlays/RecordingIndicator';\nimport ShortcutsModal from './Modals/ShortcutsModal';\nimport { VirtualController } from './VirtualController';\nimport FloatingExitButton from './UI/FloatingExitButton';\nimport FloatingFullscreenButton from './UI/FloatingFullscreenButton';\nimport GameCanvas from './GameCanvas';\nimport GameModals from './GameModals';\nimport RASidebar from './RASidebar';\n\nimport { useGamePlayer } from '../hooks/useGamePlayer';\nimport { usePlayerPersistence } from '../hooks/usePlayerPersistence';\nimport { GamePlayerProps } from './types';\nimport { KeyboardMapping } from '../lib/controls';\nimport { sendTelemetry } from '../lib/telemetry';\nimport { KoinI18nProvider } from '../hooks/useKoinTranslation';\nimport { en, es, fr } from '../locales';\nimport { deepMerge } from '../lib/common-utils';\nimport { KoinTranslations } from '../locales/types';\n\nconst GamePlayerInner = memo(function GamePlayerInner(\n props: GamePlayerProps & {\n controls?: KeyboardMapping;\n saveControls?: (controls: KeyboardMapping) => void;\n currentLanguage?: 'en' | 'es' | 'fr';\n onLanguageChange?: (lang: 'en' | 'es' | 'fr') => void;\n }\n) {\n // -- Persistence Hook --\n const { settings, updateSettings, isLoaded: settingsLoaded } = usePlayerPersistence();\n\n // -- Telemetry --\n useEffect(() => {\n sendTelemetry('game_start', {\n system: props.system,\n core: props.core,\n game: props.title || 'unknown'\n });\n }, [props.system, props.core, props.title]);\n\n // -- Internal State --\n const [biosModalOpen, setBiosModalOpen] = useState(false);\n const [showShortcutsModal, setShowShortcutsModal] = useState(false);\n const [settingsModalOpen, setSettingsModalOpen] = useState(false);\n\n // -- Derived Props from Persistence (if not overridden by direct props) --\n // Use props.shader if provided, otherwise persistent shader\n const effectiveShader = props.shader !== undefined ? props.shader : settings.shader;\n\n const {\n // Refs\n containerRef,\n canvasRef,\n\n // State\n\n isMobile,\n isFullscreen,\n toasts,\n dismissToast,\n raSidebarOpen,\n setRaSidebarOpen,\n\n // Controls\n controls,\n saveControls,\n\n // Gamepads\n gamepads,\n connectedCount,\n\n // Modals\n gamepadModalOpen,\n setGamepadModalOpen,\n controlsModalOpen,\n setControlsModalOpen,\n cheatsModalOpen,\n setCheatsModalOpen,\n\n // Save Modal\n saveModalOpen,\n setSaveModalOpen,\n saveModalMode,\n saveSlots,\n isSlotLoading,\n actioningSlot,\n handleSlotSelect,\n handleSlotDelete,\n autoSaveEnabled,\n autoSavePaused,\n autoSaveState,\n autoSaveProgress,\n handleAutoSaveToggle,\n\n // Restrictions\n hardcoreRestrictions,\n\n // Cheats\n activeCheats,\n handleToggleCheat,\n\n // Emulator Instance & State\n nostalgist, // Contains start, restart, etc.\n volumeState: {\n volume,\n isMuted: muted,\n setVolume,\n toggleMute,\n },\n\n // Handlers\n handleFullscreen,\n handleSave, // Use handleSave instead of handleSaveState\n handleLoad, // Use handleLoad instead of handleLoadState\n\n // Actions (Destructured from nostalgist wrapper in useGamePlayer)\n pause,\n resume,\n\n // Recording\n isRecording,\n isRecordingPaused,\n recordingDuration,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n recordingSupported,\n } = useGamePlayer({\n ...props,\n onToggleCheat: props.onToggleCheat,\n onSessionStart: props.onSessionStart,\n onSessionEnd: props.onSessionEnd,\n shader: effectiveShader, // Pass effective shader to hook\n });\n\n // Destructure remaining emulator actions from nostalgist instance\n const {\n start,\n restart,\n togglePause,\n setSpeed,\n startRewind,\n stopRewind,\n screenshot,\n speed,\n isRewinding,\n rewindBufferSize,\n error,\n isPaused,\n status,\n isPerformanceMode,\n } = nostalgist;\n\n // -- Debug: High Performance Mode --\n useEffect(() => {\n if (status === 'running') {\n console.log('[Koin Debug] Status:', status);\n console.log('[Koin Debug] isPerformanceMode:', isPerformanceMode);\n console.log('[Koin Debug] crossOriginIsolated:', typeof window !== 'undefined' ? window.crossOriginIsolated : 'N/A');\n }\n }, [status, isPerformanceMode]);\n\n // Sync volume from persistence on load\n useEffect(() => {\n if (settingsLoaded) {\n setVolume(settings.volume);\n if (muted !== settings.muted) toggleMute();\n }\n }, [settingsLoaded]); // Run once when loaded\n\n const { system, systemColor = '#00FF41', cheats = [], onExit } = props;\n\n // -- Memoized Handlers --\n\n const handlePauseToggle = useCallback(() => {\n status === 'ready' ? start() : togglePause();\n }, [status, start, togglePause]);\n\n const handleScreenshot = useCallback(async () => {\n const result = await screenshot();\n if (result && props.onScreenshotCaptured) {\n props.onScreenshotCaptured(result);\n }\n }, [screenshot, props.onScreenshotCaptured]);\n\n const handleShowControls = useCallback(() => {\n pause();\n setControlsModalOpen(true);\n }, [pause, setControlsModalOpen]);\n\n const handleShowCheats = useCallback(() => {\n pause();\n setCheatsModalOpen(true);\n }, [pause, setCheatsModalOpen]);\n\n const handleShowRA = useCallback(() => {\n pause();\n setRaSidebarOpen(true);\n }, [pause, setRaSidebarOpen]);\n\n const handleShowGamepadSettings = useCallback(() => {\n pause();\n setGamepadModalOpen(true);\n }, [pause, setGamepadModalOpen]);\n\n const handleShowSettings = useCallback(() => {\n pause();\n setSettingsModalOpen(true);\n }, [pause, setSettingsModalOpen]);\n\n const handleExitClick = useCallback(() => {\n onExit?.();\n }, [onExit]);\n\n const handleBiosSelection = useCallback(() => {\n setBiosModalOpen(true);\n }, [setBiosModalOpen]);\n\n // -- Persistence Updaters --\n\n const handleVolumeChange = useCallback((val: number) => {\n setVolume(val);\n updateSettings({ volume: val });\n }, [setVolume, updateSettings]);\n\n const handleToggleMute = useCallback(() => {\n toggleMute();\n updateSettings({ muted: !muted }); // Current muted state toggled\n }, [toggleMute, updateSettings, muted]);\n\n const handleShaderChange = useCallback((newShader: string, requiresRestart: boolean) => {\n updateSettings({ shader: newShader as any });\n if (props.onShaderChange) {\n props.onShaderChange(newShader, requiresRestart);\n }\n }, [updateSettings, props.onShaderChange]);\n\n const handleTogglePerformanceOverlay = useCallback(() => {\n updateSettings({ showPerformanceOverlay: !settings.showPerformanceOverlay });\n }, [updateSettings, settings.showPerformanceOverlay]);\n\n const handleToggleInputDisplay = useCallback(() => {\n updateSettings({ showInputDisplay: !settings.showInputDisplay });\n }, [updateSettings, settings.showInputDisplay]);\n\n // Recording Toggle Handler (F5) - with auto-download\n const handleToggleRecording = useCallback(async () => {\n if (!recordingSupported) {\n console.warn('[Recording] Not supported in this browser');\n return;\n }\n\n if (isRecording) {\n const blob = await stopRecording();\n if (blob) {\n // Auto-download the recording\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `gameplay-${Date.now()}.webm`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }\n } else {\n startRecording();\n }\n }, [isRecording, recordingSupported, startRecording, stopRecording]);\n\n // Shortcuts Modal Toggle (F1) - pauses game when opening, resumes when closing\n const handleToggleShortcuts = useCallback(() => {\n setShowShortcutsModal(prev => {\n if (!prev) pause();\n else resume();\n return !prev;\n });\n }, [pause, resume]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'F1') {\n e.preventDefault();\n handleToggleShortcuts();\n }\n if (e.key === 'F3') {\n e.preventDefault();\n handleTogglePerformanceOverlay();\n }\n if (e.key === 'F4') {\n e.preventDefault();\n handleToggleInputDisplay();\n }\n if (e.key === 'F5') {\n e.preventDefault();\n handleToggleRecording();\n }\n if (e.key === 'F9') {\n e.preventDefault();\n handleToggleMute();\n }\n if (e.key === 'Escape' && showShortcutsModal) {\n setShowShortcutsModal(false);\n resume(); // Resume when closing with Escape\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleToggleShortcuts, handleTogglePerformanceOverlay, handleToggleInputDisplay, handleToggleRecording, handleToggleMute, showShortcutsModal, resume]);\n\n return (\n <div className=\"koin-scope\" style={{ display: 'contents' }}>\n <div\n ref={containerRef}\n className={`absolute inset-0 bg-black overflow-hidden select-none flex flex-col ${isFullscreen ? 'fixed !inset-0 z-[9999] w-screen h-screen touch-none' : ''\n } ${props.className || ''}`}\n style={props.style}\n >\n {/* Game canvas area */}\n <div className=\"flex-1 relative min-h-0\">\n <GameCanvas\n status={status}\n system={system}\n error={error}\n isPaused={isPaused}\n onStart={start}\n systemColor={systemColor}\n isFullscreen={isFullscreen}\n canvasRef={canvasRef}\n onSelectBios={props.onSelectBios ? handleBiosSelection : undefined}\n />\n\n {/* Virtual controller only shows in fullscreen to avoid overlaying page content */}\n {isFullscreen && (\n <VirtualController\n system={system}\n isRunning={status === 'running' || status === 'paused'}\n controls={controls}\n systemColor={systemColor}\n />\n )}\n\n {!isFullscreen && isMobile && (\n <FloatingFullscreenButton\n onClick={handleFullscreen}\n disabled={status === 'loading' || status === 'error'}\n />\n )}\n\n {isFullscreen && isMobile && (\n <FloatingExitButton\n onClick={handleFullscreen}\n disabled={status === 'loading' || status === 'error'}\n />\n )}\n\n {/* ===== UNIFIED TOP-RIGHT HUD ===== */}\n <div className=\"absolute top-2 right-2 z-40 flex flex-col items-end gap-2 pointer-events-auto\">\n {/* Recording Indicator */}\n <RecordingIndicator\n isRecording={isRecording}\n isPaused={isRecordingPaused}\n duration={recordingDuration}\n onPause={pauseRecording}\n onResume={resumeRecording}\n onStop={handleToggleRecording}\n />\n\n {/* Performance Overlay */}\n {settings.showPerformanceOverlay && (status === 'running' || status === 'paused') && (\n <PerformanceOverlay\n isVisible={true}\n coreName={props.core}\n systemColor={systemColor}\n />\n )}\n\n {/* Performance Mode Badge (Always visible when active) */}\n {isPerformanceMode && (status === 'running' || status === 'paused') && (\n <div\n className=\"bg-black/50 backdrop-blur-md px-2 py-1 rounded border border-white/10 flex items-center gap-1.5\"\n style={{ borderColor: `${systemColor}40` }}\n title=\"High Performance Mode Active (Threaded Video)\"\n >\n <div className=\"w-2 h-2 rounded-full animate-pulse\" style={{ backgroundColor: systemColor, boxShadow: `0 0 8px ${systemColor}` }} />\n <span className=\"text-[10px] uppercase font-bold tracking-wider text-white/90\">\n High Perf\n </span>\n </div>\n )}\n\n {/* Debug: Low Perf Indicator (Temporary) */}\n {!isPerformanceMode && (status === 'running' || status === 'paused') && (\n <div\n className=\"bg-red-900/80 backdrop-blur-md px-2 py-1 rounded border border-red-500/50 flex items-center gap-1.5\"\n title=\"Standard Mode (Single Threaded)\"\n >\n <span className=\"text-[10px] uppercase font-bold tracking-wider text-red-200\">\n Standard ({typeof window !== 'undefined' && window.crossOriginIsolated ? 'Isolated' : 'Not Isolated'})\n </span>\n </div>\n )}\n\n {/* Input Display */}\n {settings.showInputDisplay && (status === 'running' || status === 'paused') && (\n <InputDisplay\n isVisible={true}\n system={system}\n systemColor={systemColor}\n position=\"inline\"\n />\n )}\n </div>\n </div>\n\n {/* Controls bar */}\n {!isFullscreen && (\n <div className=\"shrink-0 z-50\">\n <PlayerControls\n isPaused={isPaused}\n isRunning={status === 'running' || status === 'paused'}\n speed={speed}\n isRewinding={isRewinding}\n rewindBufferSize={rewindBufferSize}\n onPauseToggle={handlePauseToggle}\n onRestart={restart}\n onSave={handleSave}\n onLoad={handleLoad}\n onSpeedChange={setSpeed}\n onRewindStart={startRewind}\n onRewindStop={stopRewind}\n onScreenshot={handleScreenshot}\n onFullscreen={handleFullscreen}\n onControls={handleShowControls}\n onCheats={handleShowCheats}\n onRetroAchievements={handleShowRA}\n onExit={handleExitClick}\n disabled={status === 'loading' || status === 'error'}\n loadDisabled={status === 'loading' || status === 'error'}\n saveDisabled={status === 'ready'}\n systemColor={systemColor}\n gamepadCount={connectedCount}\n onGamepadSettings={handleShowGamepadSettings}\n onSettings={handleShowSettings}\n volume={volume}\n isMuted={muted} // Use local 'muted' which is aliased from 'isMuted'\n onVolumeChange={handleVolumeChange} // Wrapped\n onToggleMute={handleToggleMute} // Wrapped\n hardcoreRestrictions={hardcoreRestrictions}\n raConnected={!!props.raUser}\n raGameFound={!!props.raGame}\n raAchievementCount={props.raAchievements?.length}\n raIsIdentifying={props.raIsLoading}\n autoSaveEnabled={autoSaveEnabled}\n autoSavePaused={autoSavePaused}\n autoSaveState={autoSaveState}\n autoSaveProgress={autoSaveProgress}\n onAutoSaveToggle={handleAutoSaveToggle}\n onShowShortcuts={handleToggleShortcuts}\n onRecordToggle={handleToggleRecording}\n isRecording={isRecording}\n currentShader={effectiveShader as import('./UI/ShaderSelector').ShaderPresetId}\n onShaderChange={handleShaderChange} // Wrapped\n />\n </div>\n )}\n\n {/* Modals */}\n <ShortcutsModal\n isOpen={showShortcutsModal}\n onClose={() => {\n setShowShortcutsModal(false);\n resume();\n }}\n systemColor={systemColor}\n />\n\n <GameModals\n controlsModalOpen={controlsModalOpen}\n setControlsModalOpen={setControlsModalOpen}\n controls={controls}\n saveControls={saveControls}\n system={system}\n onResume={resume}\n\n gamepadModalOpen={gamepadModalOpen}\n setGamepadModalOpen={setGamepadModalOpen}\n gamepads={gamepads}\n systemColor={systemColor}\n\n cheatsModalOpen={cheatsModalOpen}\n setCheatsModalOpen={setCheatsModalOpen}\n cheats={cheats}\n activeCheats={activeCheats}\n onToggleCheat={handleToggleCheat}\n\n saveModalOpen={saveModalOpen}\n setSaveModalOpen={setSaveModalOpen}\n saveModalMode={saveModalMode}\n saveSlots={saveSlots}\n isSlotLoading={isSlotLoading}\n actioningSlot={actioningSlot}\n onSlotSelect={handleSlotSelect}\n onSlotDelete={handleSlotDelete}\n maxSlots={props.maxSlots}\n currentTier={props.currentTier}\n onUpgrade={props.onUpgrade}\n\n biosModalOpen={biosModalOpen}\n setBiosModalOpen={setBiosModalOpen}\n availableBios={props.availableBios}\n currentBiosId={props.currentBiosId}\n onSelectBios={props.onSelectBios}\n\n settingsModalOpen={settingsModalOpen}\n setSettingsModalOpen={setSettingsModalOpen}\n // Props passed from wrapper\n currentLanguage={(props as any).currentLanguage}\n onLanguageChange={(props as any).onLanguageChange}\n />\n\n {/* RASidebar */}\n {!isMobile && (\n <RASidebar\n isOpen={raSidebarOpen}\n onClose={() => setRaSidebarOpen(false)}\n isLoggedIn={!!props.raUser}\n credentials={props.raUser || null}\n isLoading={props.raIsLoading || false}\n error={props.raError}\n onLogin={props.onRALogin || (async () => false)}\n onLogout={props.onRALogout || (() => { })}\n hardcoreEnabled={props.retroAchievementsConfig?.hardcore || false}\n onHardcoreChange={props.onRAHardcoreChange || (() => { })}\n currentGame={props.raGame || null}\n achievements={props.raAchievements || []}\n unlockedIds={props.raUnlockedAchievements || new Set()}\n />\n )}\n\n <ToastContainer toasts={toasts} onDismiss={dismissToast} />\n </div>\n </div>\n );\n});\n\nexport const GamePlayer = memo(function GamePlayer(\n props: GamePlayerProps & {\n controls?: KeyboardMapping;\n saveControls?: (controls: KeyboardMapping) => void;\n initialLanguage?: 'en' | 'es' | 'fr';\n }\n) {\n const [currentLanguage, setCurrentLanguage] = useState<'en' | 'es' | 'fr'>(props.initialLanguage || 'en');\n\n const effectiveTranslations = useMemo(() => {\n const base = currentLanguage === 'es' ? es : currentLanguage === 'fr' ? fr : en;\n if (props.translations) {\n return deepMerge(base, props.translations) as KoinTranslations;\n }\n return base;\n }, [currentLanguage, props.translations]);\n\n const handleLanguageChange = useCallback((lang: 'en' | 'es' | 'fr') => {\n setCurrentLanguage(lang);\n }, []);\n\n return (\n <KoinI18nProvider translations={effectiveTranslations}>\n <GamePlayerInner\n {...props}\n currentLanguage={currentLanguage}\n onLanguageChange={handleLanguageChange}\n />\n </KoinI18nProvider>\n );\n});\n\nexport default GamePlayer;\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { Trophy, X } from 'lucide-react';\nimport { RAAchievement, getAchievementBadgeUrl } from '../../lib/retroachievements';\n\ninterface AchievementPopupProps {\n achievement: RAAchievement;\n hardcore: boolean;\n onDismiss: () => void;\n autoDismissMs?: number;\n}\n\nexport default function AchievementPopup({\n achievement,\n hardcore,\n onDismiss,\n autoDismissMs = 5000,\n}: AchievementPopupProps) {\n const [isVisible, setIsVisible] = useState(false);\n const [isExiting, setIsExiting] = useState(false);\n\n useEffect(() => {\n // Animate in\n requestAnimationFrame(() => {\n setIsVisible(true);\n });\n\n // Auto dismiss\n const timer = setTimeout(() => {\n handleDismiss();\n }, autoDismissMs);\n\n return () => clearTimeout(timer);\n }, [autoDismissMs]);\n\n const handleDismiss = () => {\n setIsExiting(true);\n setTimeout(() => {\n onDismiss();\n }, 300);\n };\n\n return (\n <div\n className={`fixed top-4 right-4 z-[100] transition-all duration-300 ${isVisible && !isExiting\n ? 'translate-x-0 opacity-100'\n : 'translate-x-full opacity-0'\n }`}\n >\n {/* Glow effect */}\n <div className=\"absolute inset-0 bg-gradient-to-r from-yellow-500 to-orange-500 blur-lg opacity-50 animate-pulse\" />\n\n {/* Main container */}\n <div className=\"relative bg-gradient-to-r from-yellow-500 to-orange-500 p-[2px] rounded-lg\">\n <div className=\"bg-gray-900 rounded-lg p-4 flex items-center gap-4 min-w-[320px]\">\n {/* Badge */}\n <div className=\"relative flex-shrink-0\">\n <img\n src={getAchievementBadgeUrl(achievement.BadgeName)}\n alt={achievement.Title}\n className=\"w-16 h-16 rounded-lg border-2 border-yellow-500/50\"\n onError={(e) => {\n // Fallback to placeholder\n (e.target as HTMLImageElement).src = '/placeholder-badge.png';\n }}\n />\n {/* Shine effect */}\n <div className=\"absolute inset-0 bg-gradient-to-br from-white/30 to-transparent rounded-lg pointer-events-none\" />\n </div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <Trophy className=\"text-yellow-400 flex-shrink-0\" size={14} />\n <span className=\"text-xs text-yellow-400 font-bold uppercase tracking-wider\">\n {hardcore ? 'Hardcore ' : ''}Achievement Unlocked!\n </span>\n </div>\n <p className=\"font-bold text-white truncate\">{achievement.Title}</p>\n <p className=\"text-sm text-gray-400 truncate\">{achievement.Description}</p>\n <div className=\"flex items-center gap-2 mt-1\">\n <span className=\"text-yellow-400 font-bold\">{achievement.Points}</span>\n <span className=\"text-xs text-gray-500\">points</span>\n {hardcore && (\n <span className=\"text-xs px-1.5 py-0.5 bg-red-500/20 text-red-400 rounded border border-red-500/30\">\n 2x\n </span>\n )}\n </div>\n </div>\n\n {/* Close button */}\n <button\n onClick={handleDismiss}\n className=\"flex-shrink-0 text-gray-500 hover:text-white transition-colors\"\n >\n <X size={18} />\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n// Queue manager for multiple achievement popups\ninterface QueuedAchievement {\n id: number;\n achievement: RAAchievement;\n hardcore: boolean;\n}\n\ninterface AchievementPopupQueueProps {\n achievements: QueuedAchievement[];\n onDismiss: (id: number) => void;\n}\n\nexport function AchievementPopupQueue({ achievements, onDismiss }: AchievementPopupQueueProps) {\n // Only show one at a time\n const current = achievements[0];\n\n if (!current) return null;\n\n return (\n <AchievementPopup\n key={current.id}\n achievement={current.achievement}\n hardcore={current.hardcore}\n onDismiss={() => onDismiss(current.id)}\n />\n );\n}\n","'use client';\n\nimport { memo, useState, useRef, useEffect } from 'react';\nimport { Palette, ChevronDown } from 'lucide-react';\n\n/**\n * Available CRT Shader Presets\n * ----------------------------\n * These are loaded from libretro/glsl-shaders via Nostalgist.\n * Format: { id: shader_path, name: display_name, description: tooltip }\n */\nexport const SHADER_PRESETS = [\n { id: '', name: 'None', description: 'No shader - sharp pixels' },\n { id: 'crt/crt-lottes', name: 'CRT Lottes', description: 'High-quality arcade monitor look' },\n { id: 'crt/crt-easymode', name: 'CRT Easy', description: 'Popular, performant CRT effect' },\n { id: 'crt/crt-geom', name: 'CRT Geom', description: 'Classic CRT shader with curvature' },\n { id: 'crt/crt-hyllian', name: 'CRT Hyllian', description: 'Attractive with minimal tweaking' },\n { id: 'crt/crt-nes-mini', name: 'NES Mini', description: 'Simple scanlines like NES Classic' },\n { id: 'crt/zfast-crt', name: 'zFast CRT', description: 'Lightweight, great for mobile' },\n { id: 'crt/crt-potato-cool', name: 'CRT Potato', description: 'Fast and good for weak devices' },\n { id: 'handheld/lcd-grid-v2', name: 'LCD Grid', description: 'Game Boy style LCD effect' },\n { id: 'scanlines', name: 'Scanlines', description: 'Simple horizontal scanlines' },\n] as const;\n\nexport type ShaderPresetId = typeof SHADER_PRESETS[number]['id'];\n\ninterface ShaderSelectorProps {\n currentShader: ShaderPresetId;\n onShaderChange: (shaderId: ShaderPresetId) => void;\n disabled?: boolean;\n systemColor?: string;\n}\n\n/**\n * Shader Selector Component\n * -------------------------\n * Dropdown to select CRT/LCD shader effects.\n */\nconst ShaderSelector = memo(function ShaderSelector({\n currentShader,\n onShaderChange,\n disabled = false,\n systemColor = '#00FF41',\n}: ShaderSelectorProps) {\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const currentPreset = SHADER_PRESETS.find(p => p.id === currentShader) || SHADER_PRESETS[0];\n\n return (\n <div ref={dropdownRef} className=\"relative\">\n {/* Trigger Button */}\n <button\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n className=\"flex items-center gap-2 px-3 py-2 rounded text-sm font-medium transition-all\"\n style={{\n backgroundColor: currentShader ? `${systemColor}20` : 'rgba(255,255,255,0.1)',\n color: currentShader ? systemColor : 'rgba(255,255,255,0.7)',\n border: `1px solid ${currentShader ? systemColor : 'rgba(255,255,255,0.2)'}`,\n }}\n >\n <Palette size={16} />\n <span className=\"hidden sm:inline\">{currentPreset.name}</span>\n <ChevronDown size={14} className={`transition-transform ${isOpen ? 'rotate-180' : ''}`} />\n </button>\n\n {/* Dropdown Menu */}\n {isOpen && (\n <div\n className=\"absolute bottom-full left-0 mb-2 w-56 bg-black/95 border border-white/20 rounded-lg shadow-xl overflow-hidden z-50\"\n style={{ backdropFilter: 'blur(8px)' }}\n >\n <div className=\"p-2 border-b border-white/10\">\n <div className=\"text-xs font-bold text-white/60 uppercase tracking-wide\">\n Video Shader\n </div>\n </div>\n <div className=\"max-h-64 overflow-y-auto\">\n {SHADER_PRESETS.map(preset => (\n <button\n key={preset.id}\n onClick={() => {\n onShaderChange(preset.id);\n setIsOpen(false);\n }}\n className=\"w-full px-3 py-2 text-left hover:bg-white/10 transition-colors flex flex-col gap-0.5\"\n style={{\n backgroundColor: currentShader === preset.id ? `${systemColor}20` : undefined,\n }}\n >\n <span\n className=\"text-sm font-medium\"\n style={{ color: currentShader === preset.id ? systemColor : 'white' }}\n >\n {preset.name}\n </span>\n <span className=\"text-xs text-white/50\">\n {preset.description}\n </span>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n});\n\nexport default ShaderSelector;\n","'use client';\n\nimport { memo, useState } from 'react';\nimport { Keyboard, ChevronDown, ChevronUp } from 'lucide-react';\n\n/**\n * Shortcuts Reference\n * -------------------\n * Collapsible panel showing player F-key shortcuts.\n * Game controls have their own config in the Keys modal.\n */\n\ninterface ShortcutsReferenceProps {\n systemColor?: string;\n isExpanded?: boolean;\n}\n\n// F-key shortcuts only - these don't conflict with games\nconst SHORTCUTS = [\n { key: 'F1', description: 'Help' },\n { key: 'F3', description: 'FPS Overlay' },\n { key: 'F4', description: 'Input Display' },\n { key: 'F5', description: 'Record' },\n { key: 'F9', description: 'Mute' },\n];\n\nconst ShortcutsReference = memo(function ShortcutsReference({\n systemColor = '#00FF41',\n isExpanded: initialExpanded = false,\n}: ShortcutsReferenceProps) {\n const [isExpanded, setIsExpanded] = useState(initialExpanded);\n\n return (\n <div\n className=\"rounded overflow-hidden\"\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\n border: `1px solid ${systemColor}40`,\n }}\n >\n {/* Header - always visible */}\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"w-full flex items-center justify-between px-3 py-2 hover:bg-white/5 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n <Keyboard size={14} style={{ color: systemColor }} />\n <span className=\"text-xs font-bold text-white/80\">Shortcuts</span>\n </div>\n {isExpanded ? (\n <ChevronUp size={14} className=\"text-white/50\" />\n ) : (\n <ChevronDown size={14} className=\"text-white/50\" />\n )}\n </button>\n\n {/* Shortcuts list - collapsible */}\n {isExpanded && (\n <div className=\"px-3 pb-3 pt-1 space-y-1.5 border-t border-white/10\">\n {SHORTCUTS.map(({ key, description }) => (\n <div key={key} className=\"flex items-center justify-between text-xs\">\n <span className=\"text-white/60\">{description}</span>\n <kbd\n className=\"px-1.5 py-0.5 rounded text-[10px] font-mono font-bold\"\n style={{\n backgroundColor: `${systemColor}20`,\n color: systemColor,\n border: `1px solid ${systemColor}40`,\n }}\n >\n {key}\n </kbd>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n});\n\nexport default ShortcutsReference;\n"]}
1
+ {"version":3,"sources":["../src/components/PlayerControls/ControlButton.tsx","../src/components/UI/SpeedMenu.tsx","../src/components/UI/VolumeControl.tsx","../src/components/UI/PortalTooltip.tsx","../src/components/UI/HardcoreTooltip.tsx","../src/locales/en.ts","../src/hooks/useKoinTranslation.tsx","../src/components/PlayerControls/PlaybackControls.tsx","../src/components/UI/AutoSaveIndicator.tsx","../src/components/PlayerControls/SaveLoadControls.tsx","../src/components/PlayerControls/ShaderDropdown.tsx","../src/components/RASidebar/RAButton.tsx","../src/components/PlayerControls/SettingsControls.tsx","../src/components/PlayerControls/MobileControlDrawer.tsx","../src/components/PlayerControls.tsx","../src/components/Overlays/ToastContainer.tsx","../src/components/Overlays/PerformanceOverlay.tsx","../src/components/Overlays/InputDisplay.tsx","../src/components/Overlays/RecordingIndicator.tsx","../src/components/Modals/ShortcutsModal.tsx","../src/components/VirtualController/utils/viewport.ts","../src/hooks/useMobile.ts","../src/components/VirtualController/layouts.ts","../src/components/VirtualController/hooks/useTouchHandlers.ts","../src/components/VirtualController/utils/buttonStyles.ts","../src/components/VirtualController/VirtualButton.tsx","../src/lib/controls/types.ts","../src/lib/controls/defaults.ts","../src/lib/controls/labels.ts","../src/lib/controls/presets.ts","../src/lib/controls/storage.ts","../src/lib/controls/retroarch.ts","../src/components/types.ts","../src/components/VirtualController/utils/keyboardEvents.ts","../src/components/VirtualController/Dpad.tsx","../src/components/VirtualController/positioning.ts","../src/components/VirtualController/useButtonPositions.ts","../src/components/VirtualController/ControlsHint.tsx","../src/components/VirtualController/VirtualController.tsx","../src/components/UI/FloatingExitButton.tsx","../src/components/UI/FloatingFullscreenButton.tsx","../src/components/Overlays/GameOverlay.tsx","../src/lib/game-player-utils.ts","../src/components/GameCanvas.tsx","../src/components/Modals/ControlMapper.tsx","../src/hooks/useGamepad.ts","../src/components/Modals/GamepadMapper.tsx","../src/components/Modals/CheatModal.tsx","../src/components/Modals/SaveSlotModal.tsx","../src/components/Modals/BiosSelectionModal.tsx","../src/components/Modals/SettingsModal.tsx","../src/components/GameModals.tsx","../src/components/RASidebar/LoginForm.tsx","../src/lib/retroachievements.ts","../src/components/RASidebar/SettingsTab.tsx","../src/components/RASidebar/AchievementsTab.tsx","../src/components/RASidebar/index.tsx","../src/hooks/useToast.ts","../src/hooks/useGameUI.ts","../src/data/systems-data.ts","../src/lib/systems.ts","../src/lib/emulator-cores.ts","../src/lib/rom-cache.ts","../src/hooks/emulator/useEmulatorCore.ts","../src/hooks/emulator/useEmulatorAudio.ts","../src/hooks/emulator/useEmulatorInput.ts","../src/hooks/useSaveScheduler.ts","../src/hooks/emulator/useEmulatorSaves.ts","../src/hooks/emulator/useEmulatorCheats.ts","../src/hooks/useNostalgist.ts","../src/hooks/useVolume.ts","../src/hooks/useControls.ts","../src/hooks/useGameSession.ts","../src/lib/save-queue.ts","../src/hooks/useAutoSave.ts","../src/hooks/useGameSaves.ts","../src/hooks/useGameCheats.ts","../src/hooks/useGameRecording.ts","../src/hooks/useGamePlayer.ts","../src/hooks/usePlayerPersistence.ts","../src/lib/telemetry.ts","../src/locales/es.ts","../src/locales/fr.ts","../src/lib/common-utils.ts","../src/components/GamePlayer.tsx","../src/components/Overlays/AchievementPopup.tsx","../src/lib/shader-presets.ts","../src/components/UI/ShortcutsReference.tsx"],"names":["memo","ControlButton","jsxs","jsx","SpeedMenu","useState","React","useEffect","Gauge","createPortal","Fragment","VolumeX","Volume1","Volume2","PortalTooltip","useRef","HardcoreTooltip","createContext","useMemo","useContext","PlaybackControls","Play","Pause","RotateCcw","Rewind","PauseCircle","Loader2","Check","Clock","SaveLoadControls","Save","Download","Camera","Video","Circle","ShaderDropdown","Monitor","ChevronDown","RefreshCw","Trophy","SettingsControls","HelpCircle","Maximize","Gamepad2","Joystick","Code","Settings","Power","MobileControlDrawer","PlayerControls","CheckCircle","XCircle","Info","AlertTriangle","X","PerformanceOverlay","InputDisplay","DpadButton","ActionButton","RecordingIndicator","Square","ShortcutsModal","Keyboard","useCallback","VirtualButton","console","DPAD_BUTTONS","DRAG_HOLD_DELAY","Dpad","STORAGE_KEY","Move","SYSTEM_BUTTONS","Minimize2","GameCanvas","User","Copy","Lock","Zap","HardDrive","Trash2","Cpu","AlertCircle","FileCode","Globe","ExternalLink","EyeOff","Eye","Shield","LogOut","List","isFullscreen","getCore","nostalgist","Nostalgist","deepMerge","GamePlayerInner","GamePlayer","ShortcutsReference","ChevronUp"],"mappings":"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","file":"index.js","sourcesContent":["import React, { memo } from 'react';\n\nexport interface ControlButtonProps {\n onClick?: () => void;\n onMouseDown?: () => void;\n onMouseUp?: () => void;\n onMouseLeave?: () => void;\n onTouchStart?: () => void;\n onTouchEnd?: () => void;\n icon: React.ElementType;\n label: string;\n active?: boolean;\n danger?: boolean;\n disabled?: boolean;\n className?: string;\n systemColor?: string; // Console-specific color for theming\n}\n\nexport const ControlButton = memo(function ControlButton({\n onClick,\n onMouseDown,\n onMouseUp,\n onMouseLeave,\n onTouchStart,\n onTouchEnd,\n icon: Icon,\n label,\n active = false,\n danger = false,\n disabled = false,\n className = '',\n systemColor = '#00FF41',\n iconSize = 20,\n}: ControlButtonProps & { iconSize?: number }) {\n return (\n <button\n onClick={onClick}\n onMouseDown={onMouseDown}\n onMouseUp={onMouseUp}\n onMouseLeave={onMouseLeave}\n onTouchStart={onTouchStart}\n onTouchEnd={onTouchEnd}\n disabled={disabled}\n className={`\n flex flex-col items-center justify-center gap-1.5\n px-3 py-2 rounded-lg\n transition-all duration-200\n disabled:opacity-50 disabled:cursor-not-allowed\n hover:bg-white/10 active:bg-white/20\n ${active ? 'bg-white/10 ring-1 ring-inset' : ''}\n ${danger ? 'hover:bg-red-500/20 text-red-400' : 'text-gray-400 hover:text-white'}\n ${className}\n `}\n style={active ? {\n backgroundColor: `${systemColor}20`,\n color: systemColor,\n } : {}}\n title={label}\n >\n <Icon size={iconSize} className={`transition-transform duration-200 ${active ? 'scale-110' : 'group-hover:scale-110'}`} style={active ? { color: systemColor } : undefined} />\n <span className=\"text-[9px] font-bold uppercase tracking-wider whitespace-nowrap\" style={{ color: active ? systemColor : undefined }}>\n {label}\n </span>\n </button>\n );\n});\n","import React, { useState, useEffect, memo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Gauge } from 'lucide-react';\nimport { SpeedMultiplier } from '../../hooks/emulator/types';\n\nconst SPEED_OPTIONS: SpeedMultiplier[] = [1, 2]; // Normal, Fast (browser limitations)\n\ninterface SpeedMenuProps {\n speed: SpeedMultiplier;\n onSpeedChange: (speed: SpeedMultiplier) => void;\n disabled?: boolean;\n}\n\nconst SpeedMenu = memo(function SpeedMenu({ speed, onSpeedChange, disabled = false }: SpeedMenuProps) {\n const [showMenu, setShowMenu] = useState(false);\n const buttonRef = React.useRef<HTMLButtonElement>(null);\n const menuRef = React.useRef<HTMLDivElement>(null);\n const [menuPosition, setMenuPosition] = useState({ bottom: '0px', left: '0px', transform: 'translateX(-50%)' });\n\n const updateMenuPosition = () => {\n if (!buttonRef.current) return;\n const rect = buttonRef.current.getBoundingClientRect();\n setMenuPosition({\n bottom: `${window.innerHeight - rect.top + 8}px`,\n left: `${rect.left + rect.width / 2}px`,\n transform: 'translateX(-50%)'\n });\n };\n\n useEffect(() => {\n if (showMenu) {\n updateMenuPosition();\n window.addEventListener('resize', updateMenuPosition);\n window.addEventListener('scroll', updateMenuPosition);\n return () => {\n window.removeEventListener('resize', updateMenuPosition);\n window.removeEventListener('scroll', updateMenuPosition);\n };\n }\n }, [showMenu]);\n\n // Close on outside click\n useEffect(() => {\n if (!showMenu) return;\n \n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node;\n if (buttonRef.current?.contains(target) || menuRef.current?.contains(target)) {\n return;\n }\n setShowMenu(false);\n };\n \n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [showMenu]);\n\n return (\n <div className=\"relative\">\n <button\n ref={buttonRef}\n onClick={() => setShowMenu(!showMenu)}\n disabled={disabled}\n className={`\n group relative flex flex-col items-center gap-1 px-3 py-2 rounded-lg select-none\n transition-all duration-200 disabled:opacity-40 disabled:cursor-not-allowed\n ${speed !== 1\n ? 'text-white'\n : 'hover:bg-white/10 text-gray-400 hover:text-white'\n }\n `}\n title=\"Speed Control\"\n style={speed !== 1 ? {\n backgroundColor: `rgba(217, 119, 6, 0.2)`, // amber-500/20\n color: '#fbbf24', // amber-400\n borderColor: 'rgba(245, 158, 11, 0.4)' // amber-500/40\n } : {}}\n >\n <Gauge size={20} className={`transition-transform ${showMenu || speed !== 1 ? 'scale-110' : 'group-hover:scale-110'}`} />\n <span className=\"text-[9px] font-bold uppercase tracking-wider opacity-70\">\n {speed}x\n </span>\n </button>\n\n {showMenu && typeof document !== 'undefined' && createPortal(\n <>\n <div className=\"fixed inset-0 z-[9998]\" onClick={() => setShowMenu(false)} />\n <div\n ref={menuRef}\n className=\"fixed z-[9999] bg-black/90 backdrop-blur-md border border-white/20 rounded-lg p-1.5 shadow-xl flex flex-col gap-1 min-w-[80px]\"\n style={menuPosition}\n >\n {SPEED_OPTIONS.map((s) => (\n <button\n key={s}\n onClick={() => {\n onSpeedChange(s);\n setShowMenu(false);\n }}\n className={`\n px-3 py-2 rounded text-xs font-mono font-bold text-center transition-colors\n ${speed === s\n ? 'bg-white/20 text-white'\n : 'hover:bg-white/10 text-gray-400 hover:text-white'\n }\n `}\n >\n {s}x\n </button>\n ))}\n </div>\n </>,\n document.body\n )}\n </div>\n );\n});\n\nexport default SpeedMenu;\n","import { Volume2, VolumeX, Volume1 } from 'lucide-react';\n\ninterface VolumeControlProps {\n volume: number; // 0-100\n isMuted: boolean;\n onVolumeChange: (volume: number) => void;\n onToggleMute: () => void;\n disabled?: boolean;\n systemColor?: string;\n}\n\nexport default function VolumeControl({\n volume,\n isMuted,\n onVolumeChange,\n onToggleMute,\n disabled = false,\n systemColor = '#00FF41',\n}: VolumeControlProps) {\n // Choose icon based on volume level\n const VolumeIcon = isMuted || volume === 0\n ? VolumeX\n : volume < 50\n ? Volume1\n : Volume2;\n\n const displayVolume = isMuted ? 0 : volume;\n\n return (\n <div className=\"flex items-center gap-2\">\n {/* Mute button */}\n <button\n onClick={onToggleMute}\n disabled={disabled}\n className={`\n flex items-center justify-center w-8 h-8 transition-all duration-200\n disabled:opacity-40 disabled:cursor-not-allowed\n ${isMuted || volume === 0\n ? 'text-red-400 hover:text-red-300'\n : 'text-gray-400 hover:text-white'\n }\n `}\n title={isMuted ? 'Unmute' : 'Mute'}\n >\n <VolumeIcon size={18} />\n </button>\n\n {/* Slider - always visible */}\n <div className=\"relative flex items-center w-20\">\n {/* Track background */}\n <div className=\"absolute inset-y-0 left-0 right-0 h-1 my-auto bg-white/20\" />\n {/* Track fill */}\n <div\n className=\"absolute inset-y-0 left-0 h-1 my-auto transition-all\"\n style={{\n width: `${displayVolume}%`,\n backgroundColor: isMuted ? '#6b7280' : systemColor,\n }}\n />\n {/* Input */}\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n value={displayVolume}\n onChange={(e) => {\n const newVolume = parseInt(e.target.value);\n onVolumeChange(newVolume);\n // If volume was muted and user moves slider, unmute\n if (isMuted && newVolume > 0) {\n onToggleMute();\n }\n }}\n disabled={disabled}\n className=\"\n relative w-full h-4 appearance-none cursor-pointer bg-transparent z-10\n disabled:opacity-40 disabled:cursor-not-allowed\n [&::-webkit-slider-thumb]:appearance-none \n [&::-webkit-slider-thumb]:w-3 \n [&::-webkit-slider-thumb]:h-3 \n [&::-webkit-slider-thumb]:rounded-full\n [&::-webkit-slider-thumb]:bg-white\n [&::-webkit-slider-thumb]:cursor-pointer\n [&::-webkit-slider-thumb]:transition-transform\n [&::-webkit-slider-thumb]:hover:scale-125\n [&::-webkit-slider-thumb]:shadow-lg\n [&::-moz-range-thumb]:w-3 \n [&::-moz-range-thumb]:h-3 \n [&::-moz-range-thumb]:rounded-full\n [&::-moz-range-thumb]:bg-white\n [&::-moz-range-thumb]:border-0\n [&::-moz-range-thumb]:cursor-pointer\n [&::-moz-range-thumb]:shadow-lg\n \"\n />\n </div>\n </div>\n );\n}\n","import { memo, useState, useRef, useEffect, ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface PortalTooltipProps {\n content: string;\n children: ReactNode;\n className?: string;\n show?: boolean;\n tooltipClassName?: string;\n}\n\n/**\n * Performance-optimized tooltip that renders via portal\n * Isolated from parent re-renders via memo\n */\nexport const PortalTooltip = memo(function PortalTooltip({ \n content, \n children, \n className = '',\n show = true,\n tooltipClassName = 'bg-black/90 text-white'\n}: PortalTooltipProps) {\n const [isHovered, setIsHovered] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const [tooltipPosition, setTooltipPosition] = useState({ bottom: '0px', left: '0px' });\n\n useEffect(() => {\n if (!isHovered || !show) return;\n\n const updatePosition = () => {\n if (!containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n setTooltipPosition({\n bottom: `${window.innerHeight - rect.top + 8}px`,\n left: `${rect.left + rect.width / 2}px`,\n });\n };\n\n updatePosition();\n window.addEventListener('resize', updatePosition);\n window.addEventListener('scroll', updatePosition);\n \n return () => {\n window.removeEventListener('resize', updatePosition);\n window.removeEventListener('scroll', updatePosition);\n };\n }, [isHovered, show]);\n\n if (!show) return <>{children}</>;\n\n return (\n <>\n <div\n ref={containerRef}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n className={className}\n >\n {children}\n </div>\n {isHovered && typeof document !== 'undefined' && createPortal(\n <div \n className={`fixed px-2 py-1 text-xs rounded whitespace-nowrap z-[9999] ${tooltipClassName}`}\n style={{ ...tooltipPosition, transform: 'translateX(-50%)' }}\n >\n {content}\n </div>,\n document.body\n )}\n </>\n );\n});\n","import React, { memo } from 'react';\nimport { PortalTooltip } from './PortalTooltip';\n\ninterface HardcoreTooltipProps {\n show: boolean;\n message?: string;\n children?: React.ReactNode;\n}\n\n/**\n * Tooltip shown when a feature is disabled in Hardcore mode.\n * Wrap around a control button's parent div (which should have `group` class).\n */\nconst HardcoreTooltip = memo(function HardcoreTooltip({ show, message = \"Disabled in Hardcore mode\", children }: HardcoreTooltipProps) {\n if (!show) return children ? <>{children}</> : null;\n\n return (\n <PortalTooltip \n content={message} \n show={show}\n tooltipClassName=\"bg-amber-500/90 text-black\"\n >\n {children}\n </PortalTooltip>\n );\n});\n\nexport default HardcoreTooltip;\n","import { KoinTranslations } from './types';\n\nexport const en: KoinTranslations = {\n controls: {\n play: 'Play',\n pause: 'Pause',\n reset: 'Reset',\n rewind: 'Rewind',\n save: 'Save',\n load: 'Load',\n snap: 'Snap',\n rec: 'Rec',\n stopRec: 'Stop',\n startRecord: 'Start recording',\n stopRecord: 'Stop recording',\n mute: 'Mute',\n unmute: 'Unmute',\n help: 'Help',\n full: 'Full',\n keys: 'Keys',\n menuOpen: 'Open menu',\n menuClose: 'Close menu',\n gamepadConnected: '{{count}} controller{{plural}} connected - click to configure',\n noGamepad: 'No controller detected - press any button on your gamepad to connect',\n press: 'Press',\n startBtn: 'START',\n selectBtn: 'SEL',\n },\n common: {\n disabledInHardcore: 'Disabled in Hardcore mode',\n notSupported: 'Not supported on this console',\n playToEnableRewind: 'Play for a few seconds to enable rewind',\n },\n settings: {\n title: 'Settings',\n general: 'General',\n audio: 'Audio',\n video: 'Video',\n input: 'Input',\n advanced: 'Advanced',\n fullscreen: 'Fullscreen',\n controls: 'Controls',\n gamepad: 'Gamepad',\n cheats: 'Cheats',\n retroAchievements: 'RetroAchievements',\n shortcuts: 'Shortcuts',\n exit: 'Exit',\n language: 'Language',\n selectLanguage: 'Select Language',\n },\n overlay: {\n play: 'PLAY',\n systemFirmware: 'SYSTEM FIRMWARE',\n loading: 'Loading {{system}}',\n initializing: 'Initializing emulator',\n loadingSave: 'Loading Save',\n preparingSlot: 'Preparing slot {{num}}',\n systemError: 'System Error',\n failedInit: 'Failed to initialize emulator',\n retry: 'Retry',\n slotReady: 'Slot {{num}} ready',\n paused: 'Paused',\n },\n notifications: {\n saved: 'State saved',\n loaded: 'State loaded',\n error: 'Error',\n recordingStarted: 'Recording started',\n recordingSaved: 'Recording saved',\n downloaded: 'State downloaded',\n loadedFile: 'State loaded from file',\n savedSlot: 'Saved to slot {{num}}',\n loadedSlot: 'Loaded from slot {{num}}',\n deletedSlot: 'Deleted slot {{num}}',\n emptySlot: 'Empty slot',\n noSaveFound: 'No save found',\n failedSave: 'Failed to save',\n failedLoad: 'Failed to load',\n failedDelete: 'Failed to delete',\n failedFetch: 'Failed to load save slots',\n controllerConnected: 'Controller Connected',\n controllerDisconnected: 'Controller Lost',\n controllerReady: 'Controller ready to use',\n insertCoin: 'Press SHIFT to insert coin',\n insertCoinTitle: '🪙 Insert Coin',\n controlsSaved: 'Controls saved',\n controlsReset: 'Controls reset to defaults',\n },\n modals: {\n shortcuts: {\n title: 'Keyboard Shortcuts',\n playerShortcuts: 'Player Shortcuts',\n overlays: 'Overlays',\n recording: 'Recording',\n showHelp: 'Show Help',\n perfOverlay: 'Performance Overlay',\n inputDisplay: 'Input Display',\n toggleRec: 'Toggle Recording',\n toggleMute: 'Toggle Mute',\n pressEsc: 'Press ESC to close',\n },\n controls: {\n title: 'Controls',\n keyboard: 'Keyboard Mapping',\n description: 'Click a button and press a key to remap',\n pressKey: 'Press...',\n reset: 'Reset to Default',\n save: 'Save Controls',\n },\n gamepad: {\n title: 'Gamepad Settings',\n noGamepad: 'No gamepad detected',\n connected: '{{count}} controller{{s}} connected',\n none: 'No controllers detected',\n player: 'Player:',\n noController: 'No controller detected',\n pressAny: 'Press any button on your gamepad to connect',\n waiting: 'Waiting for input...',\n pressButton: 'Press a button on your controller for {{button}}',\n pressEsc: 'Press Escape to cancel',\n reset: 'Reset to Default',\n save: 'Save Settings',\n },\n cheats: {\n title: 'Cheats',\n addCheat: 'Add Cheat',\n available: '{{count}} cheat{{s}} available',\n emptyTitle: 'No cheats available',\n emptyDesc: 'No cheat codes found for this game',\n copy: 'Copy code',\n active: '{{count}} cheat{{s}} active',\n toggleHint: 'Click a cheat to toggle it on/off',\n },\n saveSlots: {\n title: 'Save States',\n saveTitle: 'Save Game',\n loadTitle: 'Load Game',\n emptySlot: 'Empty Slot',\n subtitleSave: 'Choose a slot to save your progress',\n subtitleLoad: 'Select a save to restore',\n loading: 'Loading saves...',\n locked: 'Slot {{num}} Locked',\n upgrade: 'Upgrade to unlock more save slots',\n autoSave: 'Auto-Save Slot',\n autoSaveDesc: 'Reserved for automatic saves',\n noData: 'No save data',\n slot: 'Slot {{num}}',\n footerSave: 'Saves are stored in the cloud and sync across devices',\n footerLoad: 'Your progress will be restored to the selected save point',\n },\n bios: {\n title: 'BIOS Selection',\n description: 'Select a BIOS file to use for this game',\n warningTitle: 'Note:',\n warning: 'Changing BIOS requires the emulator to restart. Your unsaved progress will be lost.',\n systemDefault: 'System Default',\n active: 'Active',\n defaultDesc: \"Use the emulator's built-in or default BIOS\",\n emptyTitle: 'No BIOS files found for this console.',\n emptyDesc: 'Upload BIOS files in your Dashboard Library.',\n footer: 'System Firmware Settings',\n },\n },\n retroAchievements: {\n title: 'RetroAchievements',\n login: 'Login',\n logout: 'Logout',\n username: 'Username',\n password: 'Password',\n hardcore: 'Hardcore Mode',\n achievements: 'Achievements',\n locked: 'Locked',\n unlocked: 'Unlocked',\n mastered: 'Mastered',\n identifying: 'Identifying game...',\n achievementsAvailable: '{{count}} achievements available',\n gameNotSupported: 'Connected - Game not in RA database',\n connect: 'Connect RetroAchievements',\n connected: 'RetroAchievements (connected)',\n createAccount: 'Create an account',\n privacy: 'Privacy:',\n privacyText: 'Your password is only used to authenticate with RetroAchievements. It is never stored.',\n connecting: 'Connecting...',\n connectAccount: 'Connect your account to track achievements',\n poweredBy: 'Powered by',\n connectedStatus: 'Connected',\n yourUsername: 'Your RA username',\n yourPassword: 'Your RA password',\n usernameRequired: 'Username and Password are required',\n noGame: 'No game loaded',\n loadGame: 'Load a game to see achievements',\n noAchievements: 'No achievements found',\n notSupported: 'This game may not be supported',\n ptsRemaining: '{{count}} pts remaining',\n filters: {\n all: 'All',\n locked: 'Locked',\n unlocked: 'Unlocked',\n },\n },\n overlays: {\n performance: {\n title: 'Stats',\n fps: 'FPS',\n frameTime: 'FT',\n memory: 'MEM',\n core: 'Core',\n input: 'INPUT',\n active: 'ACTIVE',\n },\n toast: {\n saved: 'Game Saved',\n loaded: 'Game Loaded',\n error: 'Error',\n },\n recording: {\n started: 'Recording Started',\n stopped: 'Recording Stopped',\n saved: 'Recording Saved',\n paused: 'PAUSED',\n recording: 'RECORDING',\n resume: 'Resume recording',\n pause: 'Pause recording',\n stop: 'Stop and save recording',\n hover: 'Hover for controls',\n },\n },\n};\n","import React, { createContext, useContext, useMemo } from 'react';\nimport { KoinTranslations, RecursivePartial } from '../locales/types';\nimport { en } from '../locales/en';\n\n// -- Context --\nconst KoinI18nContext = createContext<KoinTranslations>(en);\n\n// -- Helper: Simple Deep Merge --\nfunction deepMerge<T extends object>(target: T, source: RecursivePartial<T>): T {\n const result: any = { ...target };\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const targetValue = result[key];\n\n if (\n sourceValue &&\n typeof sourceValue === 'object' &&\n targetValue &&\n typeof targetValue === 'object' &&\n !Array.isArray(sourceValue)\n ) {\n result[key] = deepMerge(targetValue, sourceValue as any);\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue;\n }\n }\n }\n return result as T;\n}\n\n// -- Provider --\ninterface KoinI18nProviderProps {\n children: React.ReactNode;\n translations?: RecursivePartial<KoinTranslations>;\n}\n\nexport const KoinI18nProvider: React.FC<KoinI18nProviderProps> = ({ children, translations }) => {\n const value = useMemo(() => {\n if (!translations) return en;\n return deepMerge(en, translations);\n }, [translations]);\n\n return (\n <KoinI18nContext.Provider value={value}>\n {children}\n </KoinI18nContext.Provider>\n );\n};\n\n// -- Hook --\nexport function useKoinTranslation() {\n return useContext(KoinI18nContext);\n}\n","import { memo } from 'react';\nimport { Play, Pause, RotateCcw, Rewind } from 'lucide-react';\nimport { ControlButton } from './ControlButton';\nimport SpeedMenu from '../UI/SpeedMenu';\nimport VolumeControl from '../UI/VolumeControl';\nimport HardcoreTooltip from '../UI/HardcoreTooltip';\nimport { PortalTooltip } from '../UI/PortalTooltip';\nimport { SpeedMultiplier } from '../../hooks/emulator/types';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ninterface PlaybackControlsProps {\n isPaused: boolean;\n isRunning: boolean;\n speed: SpeedMultiplier;\n isRewinding: boolean;\n rewindBufferSize: number;\n onPauseToggle: () => void;\n onRestart: () => void;\n onSpeedChange: (speed: SpeedMultiplier) => void;\n onRewindStart: () => void;\n onRewindStop: () => void;\n volume: number;\n isMuted: boolean;\n onVolumeChange?: (volume: number) => void;\n onToggleMute?: () => void;\n disabled?: boolean;\n systemColor?: string;\n hardcoreRestrictions?: {\n canUseRewind?: boolean;\n isHardcore?: boolean;\n };\n}\n\nexport const PlaybackControls = memo(function PlaybackControls({\n isPaused,\n isRunning,\n speed,\n isRewinding,\n rewindBufferSize,\n onPauseToggle,\n onRestart,\n onSpeedChange,\n onRewindStart,\n onRewindStop,\n volume,\n isMuted,\n onVolumeChange,\n onToggleMute,\n disabled = false,\n systemColor = '#00FF41',\n hardcoreRestrictions,\n}: PlaybackControlsProps) {\n const t = useKoinTranslation();\n const hasRewindHistory = rewindBufferSize > 0;\n\n return (\n <div className=\"flex flex-wrap items-center justify-center gap-4 w-full sm:w-auto sm:flex-nowrap sm:gap-3 flex-shrink-0\">\n <ControlButton\n onClick={onPauseToggle}\n icon={(!isRunning || isPaused) ? Play : Pause}\n label={(!isRunning || isPaused) ? t.controls.play : t.controls.pause}\n active={isPaused}\n disabled={disabled}\n systemColor={systemColor}\n />\n <ControlButton\n onClick={onRestart}\n icon={RotateCcw}\n label={t.controls.reset}\n disabled={disabled}\n systemColor={systemColor}\n />\n\n {/* Speed Control */}\n <SpeedMenu speed={speed} onSpeedChange={onSpeedChange} disabled={disabled} />\n\n <PortalTooltip\n content={t.common.playToEnableRewind}\n show={hardcoreRestrictions?.canUseRewind !== false && !hasRewindHistory}\n className=\"relative group\"\n >\n <ControlButton\n onMouseDown={hasRewindHistory && hardcoreRestrictions?.canUseRewind !== false ? onRewindStart : undefined}\n onMouseUp={hasRewindHistory && hardcoreRestrictions?.canUseRewind !== false ? onRewindStop : undefined}\n onMouseLeave={hasRewindHistory && hardcoreRestrictions?.canUseRewind !== false ? onRewindStop : undefined}\n onTouchStart={hasRewindHistory && hardcoreRestrictions?.canUseRewind !== false ? onRewindStart : undefined}\n onTouchEnd={hasRewindHistory && hardcoreRestrictions?.canUseRewind !== false ? onRewindStop : undefined}\n icon={Rewind}\n label={t.controls.rewind}\n active={isRewinding}\n disabled={disabled || !hasRewindHistory || hardcoreRestrictions?.canUseRewind === false}\n systemColor={systemColor}\n />\n {/* Subtle pulse animation when available */}\n {hasRewindHistory && !isRewinding && hardcoreRestrictions?.canUseRewind !== false && (\n <div className=\"absolute inset-0 rounded-lg animate-pulse pointer-events-none\" style={{ backgroundColor: `${systemColor}20` }} />\n )}\n {/* Tooltips */}\n <HardcoreTooltip\n show={hardcoreRestrictions?.canUseRewind === false}\n message={hardcoreRestrictions?.isHardcore ? t.common.disabledInHardcore : t.common.notSupported}\n />\n </PortalTooltip>\n\n {/* Volume Controls */}\n <div className=\"w-px h-8 bg-white/10 mx-1\" />\n <VolumeControl\n volume={volume}\n isMuted={isMuted}\n onVolumeChange={onVolumeChange || (() => { })}\n onToggleMute={onToggleMute || (() => { })}\n disabled={disabled}\n systemColor={systemColor}\n />\n </div>\n );\n});\n","import { useState, useEffect, useRef } from 'react';\nimport { Clock, Loader2, Check, PauseCircle } from 'lucide-react';\n\nexport type AutoSaveState = 'idle' | 'counting' | 'saving' | 'done';\n\nexport interface AutoSaveIndicatorProps {\n progress: number;\n state: AutoSaveState;\n intervalSeconds: number;\n isPaused?: boolean; // User manually paused auto-save\n onClick?: () => void; // Toggle pause\n}\n\n/**\n * Circular progress indicator for auto-save feature.\n * Shows different states: counting down, saving, done, or paused.\n */\nexport default function AutoSaveIndicator({\n progress,\n state,\n intervalSeconds,\n isPaused = false,\n onClick,\n}: AutoSaveIndicatorProps) {\n // Track previous state for smooth transitions\n\n // Track previous state for smooth transitions\n const prevStateRef = useRef<AutoSaveState>(state);\n const [displayProgress, setDisplayProgress] = useState(progress);\n const [iconOpacity, setIconOpacity] = useState(1);\n\n // Smooth progress animation when transitioning between states\n useEffect(() => {\n const prevState = prevStateRef.current;\n\n if (state === 'done' && prevState === 'saving') {\n // Animate progress to 100% smoothly when saving completes\n const startProgress = displayProgress;\n const targetProgress = 100;\n const duration = 300; // ms\n const startTime = Date.now();\n\n const animate = () => {\n const elapsed = Date.now() - startTime;\n const progressRatio = Math.min(1, elapsed / duration);\n const eased = 1 - Math.pow(1 - progressRatio, 3); // ease-out cubic\n const currentProgress = startProgress + (targetProgress - startProgress) * eased;\n\n setDisplayProgress(currentProgress);\n\n if (progressRatio < 1) {\n requestAnimationFrame(animate);\n } else {\n setDisplayProgress(targetProgress);\n }\n };\n\n requestAnimationFrame(animate);\n } else if (state === 'counting' && prevState === 'done') {\n // Smoothly reset progress from 100% to 0% when restarting\n const startProgress = displayProgress;\n const targetProgress = 0;\n const duration = 200; // ms - faster reset\n const startTime = Date.now();\n\n const animate = () => {\n const elapsed = Date.now() - startTime;\n const progressRatio = Math.min(1, elapsed / duration);\n const eased = progressRatio; // linear for reset\n const currentProgress = startProgress + (targetProgress - startProgress) * eased;\n\n setDisplayProgress(currentProgress);\n\n if (progressRatio < 1) {\n requestAnimationFrame(animate);\n } else {\n setDisplayProgress(targetProgress);\n }\n };\n\n requestAnimationFrame(animate);\n } else if (state !== 'done') {\n // For other state changes, update progress immediately but smoothly\n setDisplayProgress(progress);\n }\n\n prevStateRef.current = state;\n }, [state, progress]); // Removed displayProgress from deps to avoid loops\n\n // Smooth icon transitions with fade\n useEffect(() => {\n if (state !== prevStateRef.current) {\n // Fade out\n setIconOpacity(0);\n // Fade in after brief delay\n const timer = setTimeout(() => {\n setIconOpacity(1);\n }, 100);\n return () => clearTimeout(timer);\n }\n }, [state]);\n\n // Calculate remaining seconds\n const remainingSeconds = Math.ceil((100 - progress) * (intervalSeconds / 100));\n\n // Determine colors based on state\n const getStateColors = () => {\n if (isPaused) {\n return {\n stroke: 'text-gray-500',\n icon: 'text-gray-500',\n label: 'text-gray-500',\n };\n }\n switch (state) {\n case 'saving':\n return {\n stroke: 'text-amber-400',\n icon: 'text-amber-400',\n label: 'text-amber-400/70',\n };\n case 'done':\n return {\n stroke: 'text-emerald-400',\n icon: 'text-emerald-400',\n label: 'text-emerald-400/70',\n };\n default:\n return {\n stroke: 'text-emerald-400/70',\n icon: 'text-emerald-400/70',\n label: 'text-emerald-400/50',\n };\n }\n };\n\n const colors = getStateColors();\n\n // Generate tooltip text\n const getTooltip = () => {\n if (isPaused) return 'Auto-save paused (click to resume)';\n switch (state) {\n case 'saving':\n return 'Saving...';\n case 'done':\n return 'Saved!';\n default:\n return `Auto - save in ${remainingSeconds} s(click to pause)`;\n }\n };\n\n // Get the appropriate icon based on state\n const renderIcon = () => {\n if (isPaused) {\n return <PauseCircle size={14} className={`${colors.icon} transition-colors duration-300`} />;\n }\n if (state === 'saving') {\n return <Loader2 size={14} className={`${colors.icon} animate-spin transition-colors duration-300`} />;\n }\n if (state === 'done') {\n return <Check size={14} className={`${colors.icon} transition-colors duration-300`} />;\n }\n return <Clock size={12} className={`${colors.icon} transition-colors duration-300`} />;\n };\n\n return (\n <button\n onClick={onClick}\n className=\"relative flex flex-col items-center justify-center gap-0.5 min-w-[3rem] py-1 rounded hover:bg-white/5 transition-colors cursor-pointer group\"\n title={getTooltip()}\n type=\"button\"\n >\n <div className=\"relative w-8 h-8 flex items-center justify-center mb-0.5\">\n {/* Progress Ring */}\n {!isPaused && state !== 'saving' && state !== 'done' && (\n <svg className=\"absolute inset-0 w-full h-full -rotate-90 pointer-events-none\">\n <circle\n cx=\"16\"\n cy=\"16\"\n r=\"12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className=\"text-white/10\"\n />\n <circle\n cx=\"16\"\n cy=\"16\"\n r=\"12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray={2 * Math.PI * 12}\n strokeDashoffset={2 * Math.PI * 12 * (1 - progress / 100)}\n className=\"text-emerald-400/50 transition-all duration-1000 linear\"\n />\n </svg>\n )}\n\n {/* Icon Container */}\n <div\n className=\"flex items-center justify-center transition-opacity duration-200\"\n style={{ opacity: iconOpacity }}\n >\n {renderIcon()}\n </div>\n </div>\n\n <span className={`text-[9px] font-bold uppercase tracking-wider ${colors.label} group-hover:text-gray-300 transition-colors`}>\n {isPaused ? 'Paused' : state === 'saving' ? 'Saving' : state === 'done' ? 'Saved' : 'Auto'}\n </span>\n </button>\n );\n}\n","import { memo } from 'react';\nimport { Save, Download, Camera, Video, Circle } from 'lucide-react';\nimport { ControlButton } from './ControlButton';\nimport AutoSaveIndicator, { AutoSaveState } from '../UI/AutoSaveIndicator';\nimport HardcoreTooltip from '../UI/HardcoreTooltip';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ninterface SaveLoadControlsProps {\n onSave: () => void;\n onLoad: () => void;\n onScreenshot: () => void;\n onRecordToggle?: () => void;\n isRecording?: boolean;\n disabled?: boolean;\n loadDisabled?: boolean;\n saveDisabled?: boolean;\n systemColor?: string;\n hardcoreRestrictions?: {\n canUseSaveStates?: boolean;\n isHardcore?: boolean;\n };\n autoSaveEnabled?: boolean;\n autoSaveProgress?: number;\n autoSaveState?: string;\n autoSavePaused?: boolean;\n onAutoSaveToggle?: () => void;\n}\n\nexport const SaveLoadControls = memo(function SaveLoadControls({\n onSave,\n onLoad,\n onScreenshot,\n onRecordToggle,\n isRecording = false,\n disabled = false,\n loadDisabled = false,\n saveDisabled = false,\n systemColor = '#00FF41',\n hardcoreRestrictions,\n autoSaveEnabled = false,\n autoSaveProgress = 0,\n autoSaveState = 'idle',\n autoSavePaused = false,\n onAutoSaveToggle,\n}: SaveLoadControlsProps) {\n const t = useKoinTranslation();\n\n return (\n <div className=\"flex flex-wrap items-center justify-center gap-4 w-full sm:w-auto sm:flex-nowrap sm:gap-3 px-3 sm:px-4 sm:border-x sm:border-white/10 flex-shrink-0\">\n {/* Auto-save indicator - clickable to toggle, always visible when enabled */}\n {autoSaveEnabled && (\n <div className=\"flex-shrink-0\">\n <AutoSaveIndicator\n progress={autoSaveProgress}\n state={autoSavePaused ? 'idle' : autoSaveState as AutoSaveState}\n intervalSeconds={20}\n isPaused={autoSavePaused}\n onClick={onAutoSaveToggle}\n />\n </div>\n )}\n <div className=\"relative group flex-shrink-0\">\n <ControlButton\n onClick={hardcoreRestrictions?.canUseSaveStates === false ? undefined : onSave}\n icon={Save}\n label={t.controls.save}\n disabled={disabled || saveDisabled || hardcoreRestrictions?.canUseSaveStates === false}\n systemColor={systemColor}\n />\n <HardcoreTooltip\n show={hardcoreRestrictions?.canUseSaveStates === false}\n message={hardcoreRestrictions?.isHardcore ? t.common.disabledInHardcore : t.common.notSupported}\n />\n </div>\n <div className=\"relative group flex-shrink-0\">\n <ControlButton\n onClick={hardcoreRestrictions?.canUseSaveStates === false ? undefined : onLoad}\n icon={Download}\n label={t.controls.load}\n disabled={disabled || loadDisabled || hardcoreRestrictions?.canUseSaveStates === false}\n systemColor={systemColor}\n />\n <HardcoreTooltip\n show={hardcoreRestrictions?.canUseSaveStates === false}\n message={hardcoreRestrictions?.isHardcore ? t.common.disabledInHardcore : t.common.notSupported}\n />\n </div>\n <div className=\"flex-shrink-0\">\n <ControlButton\n onClick={onScreenshot}\n icon={Camera}\n label={t.controls.snap}\n disabled={disabled || saveDisabled}\n systemColor={systemColor}\n />\n </div>\n\n {/* Recording button */}\n {onRecordToggle && (\n <div className=\"flex-shrink-0\">\n <button\n onClick={onRecordToggle}\n disabled={disabled}\n className={`flex flex-col items-center gap-1 px-2 sm:px-3 py-2 rounded-lg transition-all duration-200 hover:bg-white/10 ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}\n title={isRecording ? t.controls.stopRecord : t.controls.startRecord}\n >\n <div className=\"relative\">\n {isRecording ? (\n <>\n <Video size={20} className=\"text-red-500\" />\n <Circle size={8} fill=\"#FF3333\" className=\"absolute -top-0.5 -right-0.5 animate-pulse text-red-500\" />\n </>\n ) : (\n <Video size={20} style={{ color: systemColor }} />\n )}\n </div>\n <span\n className=\"text-[10px] font-bold uppercase tracking-wider\"\n style={{ color: isRecording ? '#FF3333' : undefined }}\n >\n {t.controls.rec}\n </span>\n </button>\n </div>\n )}\n </div>\n );\n});\n","'use client';\n\nimport { memo, useState, useRef, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Monitor, ChevronDown, RefreshCw } from 'lucide-react';\nimport { ShaderPresetId } from '../../lib/shader-presets';\n\ninterface ShaderDropdownProps {\n currentShader?: ShaderPresetId;\n onShaderChange?: (shader: ShaderPresetId, requiresRestart: boolean) => void;\n isRunning?: boolean; // If true, shader change requires restart\n systemColor?: string;\n disabled?: boolean;\n}\n\n// Quick shader presets for the dropdown (subset of all presets) - must match ShaderPresetId\nconst QUICK_PRESETS: { id: ShaderPresetId; label: string }[] = [\n { id: '', label: 'None' },\n { id: 'crt/crt-lottes', label: 'CRT Lottes' },\n { id: 'crt/crt-easymode', label: 'CRT Easy' },\n { id: 'crt/crt-geom', label: 'CRT Geom' },\n { id: 'handheld/lcd-grid-v2', label: 'LCD Grid' },\n];\n\n/**\n * Shader Dropdown\n * ---------------\n * Compact dropdown for quick shader selection in the controls bar.\n * When isRunning=true, shows restart warning for mid-game changes.\n */\nconst ShaderDropdown = memo(function ShaderDropdown({\n currentShader = '',\n onShaderChange,\n isRunning = false,\n systemColor = '#00FF41',\n disabled = false,\n}: ShaderDropdownProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [pendingShader, setPendingShader] = useState<ShaderPresetId | null>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const [dropdownPosition, setDropdownPosition] = useState({ bottom: '0px', left: '0px' });\n\n const updateDropdownPosition = () => {\n if (!buttonRef.current) return;\n const rect = buttonRef.current.getBoundingClientRect();\n setDropdownPosition({\n bottom: `${window.innerHeight - rect.top + 8}px`,\n left: `${rect.left}px`,\n });\n };\n\n useEffect(() => {\n if (isOpen) {\n updateDropdownPosition();\n window.addEventListener('resize', updateDropdownPosition);\n window.addEventListener('scroll', updateDropdownPosition);\n return () => {\n window.removeEventListener('resize', updateDropdownPosition);\n window.removeEventListener('scroll', updateDropdownPosition);\n };\n }\n }, [isOpen]);\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) return;\n \n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node;\n if (buttonRef.current?.contains(target) || menuRef.current?.contains(target)) {\n return;\n }\n setIsOpen(false);\n setPendingShader(null);\n };\n \n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen]);\n\n const currentLabel = QUICK_PRESETS.find(p => p.id === currentShader)?.label || 'Custom';\n\n if (!onShaderChange) return null;\n\n const handleSelect = (id: ShaderPresetId) => {\n if (id === currentShader) {\n setIsOpen(false);\n return;\n }\n\n if (isRunning) {\n // Show restart confirmation\n setPendingShader(id);\n } else {\n // Apply immediately if not running\n onShaderChange(id, false);\n setIsOpen(false);\n }\n };\n\n const confirmRestart = () => {\n if (pendingShader !== null) {\n onShaderChange(pendingShader, true);\n setPendingShader(null);\n setIsOpen(false);\n }\n };\n\n const cancelRestart = () => {\n setPendingShader(null);\n };\n\n return (\n <div className=\"relative hidden sm:block\">\n <button\n ref={buttonRef}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n className={`flex items-center gap-1.5 px-2 py-1.5 rounded-lg transition-all duration-200 hover:bg-white/10 ${disabled ? 'opacity-50 cursor-not-allowed' : ''}`}\n title=\"Video Shader\"\n >\n <Monitor size={16} style={{ color: currentShader ? systemColor : 'white' }} />\n <span className=\"text-[10px] font-bold uppercase text-white/80\">{currentLabel}</span>\n <ChevronDown size={12} className={`text-white/60 transition-transform ${isOpen ? 'rotate-180' : ''}`} />\n </button>\n\n {/* Dropdown */}\n {isOpen && typeof document !== 'undefined' && createPortal(\n <>\n <div className=\"fixed inset-0 z-[9998]\" onClick={() => setIsOpen(false)} />\n <div\n ref={menuRef}\n className=\"fixed py-1 rounded-lg shadow-xl z-[9999] min-w-[160px]\"\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.95)',\n border: `1px solid ${systemColor}40`,\n ...dropdownPosition\n }}\n >\n {/* Restart confirmation */}\n {pendingShader !== null ? (\n <div className=\"p-3 space-y-2\">\n <div className=\"flex items-center gap-2 text-xs text-orange-400\">\n <RefreshCw size={14} />\n <span className=\"font-bold\">Restart Required</span>\n </div>\n <p className=\"text-[10px] text-white/60\">\n Shader change requires game restart. Your progress since last save will be lost.\n </p>\n <div className=\"flex gap-2 pt-1\">\n <button\n onClick={confirmRestart}\n className=\"flex-1 px-2 py-1 text-xs font-bold rounded bg-orange-500/20 text-orange-400 hover:bg-orange-500/30\"\n >\n Restart\n </button>\n <button\n onClick={cancelRestart}\n className=\"flex-1 px-2 py-1 text-xs font-bold rounded bg-white/10 text-white/60 hover:bg-white/20\"\n >\n Cancel\n </button>\n </div>\n </div>\n ) : (\n // Shader list\n QUICK_PRESETS.map(({ id, label }) => (\n <button\n key={id}\n onClick={() => handleSelect(id)}\n className={`w-full px-3 py-1.5 text-left text-xs font-medium transition-colors ${currentShader === id\n ? 'text-white'\n : 'text-white/70 hover:bg-white/10'\n }`}\n style={currentShader === id ? { backgroundColor: `${systemColor}30`, color: systemColor } : undefined}\n >\n {label}\n </button>\n ))\n )}\n </div>\n </>,\n document.body\n )}\n </div>\n );\n});\n\nexport default ShaderDropdown;\n","'use client';\n\nimport { Loader2, Trophy } from 'lucide-react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\nimport { PortalTooltip } from '../UI/PortalTooltip';\n\ninterface RAButtonProps {\n onClick: () => void;\n disabled?: boolean;\n isConnected: boolean;\n isGameFound: boolean;\n isIdentifying: boolean;\n achievementCount: number;\n className?: string;\n}\n\n/**\n * RetroAchievements button with status indicators and tooltips.\n */\nexport default function RAButton({\n onClick,\n disabled = false,\n isConnected,\n isGameFound,\n isIdentifying,\n achievementCount,\n className = '',\n}: RAButtonProps) {\n const t = useKoinTranslation();\n\n const title = isGameFound\n ? `${t.retroAchievements.title} (${achievementCount} achievements)`\n : isConnected\n ? t.retroAchievements.connected\n : t.retroAchievements.title;\n\n const tooltip = isIdentifying\n ? t.retroAchievements.identifying\n : isGameFound\n ? t.retroAchievements.achievementsAvailable.replace('{{count}}', achievementCount.toString())\n : isConnected\n ? t.retroAchievements.gameNotSupported\n : t.retroAchievements.connect;\n\n return (\n <PortalTooltip \n content={tooltip} \n className={`relative group ${className}`}\n tooltipClassName=\"bg-gray-900/95 text-white border border-white/10\"\n >\n <button\n onClick={onClick}\n disabled={disabled}\n className={`\n group relative flex flex-col items-center gap-1 px-3 py-2 rounded-lg\n transition-all duration-200 disabled:opacity-40 disabled:cursor-not-allowed\n select-none\n ${isGameFound\n ? 'bg-gradient-to-b from-yellow-500/30 to-orange-500/20 text-yellow-400 ring-1 ring-yellow-500/50 shadow-[0_0_12px_rgba(234,179,8,0.3)]'\n : isConnected\n ? 'bg-yellow-500/10 text-yellow-400/70 ring-1 ring-yellow-500/30'\n : 'hover:bg-white/10 text-gray-400 hover:text-white'\n }\n `}\n title={title}\n >\n {isIdentifying ? (\n <Loader2 size={20} className=\"animate-spin text-yellow-400\" />\n ) : (\n <Trophy\n size={20}\n className={`\n transition-all group-hover:scale-110 \n ${isGameFound ? 'drop-shadow-[0_0_8px_rgba(234,179,8,0.7)] text-yellow-400' : ''}\n ${isConnected && !isGameFound ? 'opacity-70' : ''}\n `}\n />\n )}\n <span className=\"text-[9px] font-bold uppercase tracking-wider opacity-70\">\n {isIdentifying ? '...' : isGameFound ? achievementCount : 'RA'}\n </span>\n </button>\n\n {/* Status indicator dot */}\n {isConnected && (\n <div className={`\n absolute -top-1 -right-1 w-3 h-3 rounded-full border-2 border-black\n ${isGameFound\n ? 'bg-green-500 shadow-[0_0_8px_rgba(34,197,94,0.8)]'\n : 'bg-yellow-500 shadow-[0_0_6px_rgba(234,179,8,0.6)]'\n }\n `}>\n {isGameFound && (\n <div className=\"absolute inset-0 bg-green-400 rounded-full animate-ping opacity-50\" />\n )}\n </div>\n )}\n\n </PortalTooltip>\n );\n}\n\n","import { memo } from 'react';\nimport { Maximize, Gamepad2, Joystick, Code, Power, HelpCircle, Settings } from 'lucide-react';\nimport { ControlButton } from './ControlButton';\nimport ShaderDropdown from './ShaderDropdown';\nimport RAButton from '../RASidebar/RAButton';\nimport HardcoreTooltip from '../UI/HardcoreTooltip';\nimport { ShaderPresetId } from '../../lib/shader-presets';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\nimport { RAHardcodeRestrictions } from '../types';\n\ninterface SettingsControlsProps {\n onFullscreen: () => void;\n onControls: () => void;\n onGamepadSettings?: () => void;\n onSettings?: () => void;\n onCheats: () => void;\n onRetroAchievements: () => void;\n onShowShortcuts?: () => void;\n onExit: () => void;\n // Shader controls\n currentShader?: ShaderPresetId;\n onShaderChange?: (shader: ShaderPresetId, requiresRestart: boolean) => void;\n isRunning?: boolean; // Passed to ShaderDropdown for restart warning\n disabled?: boolean;\n systemColor?: string;\n gamepadCount?: number;\n hardcoreRestrictions?: RAHardcodeRestrictions;\n raConnected?: boolean;\n raGameFound?: boolean;\n raAchievementCount?: number;\n raIsIdentifying?: boolean;\n}\n\nexport const SettingsControls = memo(function SettingsControls({\n onFullscreen,\n onControls,\n onGamepadSettings,\n onSettings,\n onCheats,\n onRetroAchievements,\n onShowShortcuts,\n onExit,\n currentShader,\n onShaderChange,\n isRunning = false,\n disabled = false,\n systemColor = '#00FF41',\n gamepadCount = 0,\n hardcoreRestrictions,\n raConnected = false,\n raGameFound = false,\n raAchievementCount = 0,\n raIsIdentifying = false,\n}: SettingsControlsProps) {\n const t = useKoinTranslation();\n\n // Build gamepad indicator text - simple replacement\n const gamepadIndicatorText = gamepadCount > 0\n ? Array.from({ length: gamepadCount }, (_, i) => `P${i + 1}`).join(' ')\n : '';\n\n const gamepadConnectedTitle = t.controls.gamepadConnected\n .replace('{{count}}', gamepadCount.toString())\n .replace('{{plural}}', gamepadCount > 1 ? 's' : '');\n\n return (\n <div className=\"flex flex-wrap items-center justify-center gap-4 w-full sm:w-auto sm:flex-nowrap sm:gap-3 flex-shrink-0\">\n {/* Shader Selector */}\n <ShaderDropdown\n currentShader={currentShader}\n onShaderChange={onShaderChange}\n isRunning={isRunning}\n systemColor={systemColor}\n disabled={disabled}\n />\n\n {/* Help / Shortcuts button */}\n {onShowShortcuts && (\n <ControlButton onClick={onShowShortcuts} icon={HelpCircle} label={t.controls.help} disabled={disabled} className=\"hidden sm:flex\" systemColor={systemColor} />\n )}\n\n {/* Fullscreen button - hidden on mobile (we have floating button) */}\n <ControlButton onClick={onFullscreen} icon={Maximize} label={t.controls.full} disabled={disabled} className=\"hidden sm:flex\" systemColor={systemColor} />\n {/* Hide some buttons on mobile to save space */}\n <ControlButton onClick={onControls} icon={Gamepad2} label={t.controls.keys} disabled={disabled} className=\"hidden sm:flex\" systemColor={systemColor} />\n\n {/* Gamepad indicator - shows connected controllers OR hint to press button */}\n {gamepadCount > 0 ? (\n <button\n onClick={onGamepadSettings}\n className=\"relative group flex flex-col items-center gap-1 px-2 sm:px-3 py-2 rounded-lg transition-all duration-200 hover:bg-white/10 flex-shrink-0 hidden sm:flex\"\n title={gamepadConnectedTitle}\n >\n <div className=\"relative\">\n <Joystick size={20} style={{ color: systemColor }} className=\"transition-transform group-hover:scale-110\" />\n {/* Connection indicator dot */}\n <div\n className=\"absolute -top-0.5 -right-0.5 w-2 h-2 rounded-full animate-pulse\"\n style={{ backgroundColor: systemColor }}\n />\n </div>\n <span className=\"text-[9px] font-bold uppercase tracking-wider opacity-70\" style={{ color: systemColor }}>\n {gamepadIndicatorText}\n </span>\n </button>\n ) : (\n /* Neo-brutalist hint for users with no detected gamepad */\n <button\n onClick={onGamepadSettings}\n className=\"relative group flex-col items-center gap-1 px-3 py-2 transition-all duration-200 flex-shrink-0\"\n title={t.controls.noGamepad}\n style={{\n border: '2px dashed #6b7280',\n backgroundColor: 'transparent',\n }}\n >\n <div className=\"relative flex items-center gap-2\">\n <Gamepad2 size={18} className=\"text-gray-400 transition-transform group-hover:scale-110 group-hover:text-white\" />\n <span className=\"text-[10px] font-bold uppercase tracking-wider text-gray-400 group-hover:text-white whitespace-nowrap\">\n {t.controls.press}\n </span>\n {/* Circle representing a button */}\n <div className=\"w-5 h-5 rounded-full border-2 border-gray-400 group-hover:border-white flex items-center justify-center animate-pulse\">\n <div className=\"w-2 h-2 rounded-full bg-gray-400 group-hover:bg-white\" />\n </div>\n </div>\n </button>\n )}\n\n <div className=\"relative group hidden sm:block\">\n <ControlButton\n onClick={hardcoreRestrictions?.canUseCheats === false ? undefined : onCheats}\n icon={Code}\n label={t.settings.cheats}\n disabled={disabled || hardcoreRestrictions?.canUseCheats === false}\n systemColor={systemColor}\n />\n <HardcoreTooltip\n show={hardcoreRestrictions?.canUseCheats === false}\n message={hardcoreRestrictions?.isHardcore ? t.common.disabledInHardcore : t.common.notSupported}\n />\n </div>\n <RAButton\n onClick={onRetroAchievements}\n disabled={disabled}\n isConnected={raConnected}\n isGameFound={raGameFound}\n isIdentifying={raIsIdentifying}\n achievementCount={raAchievementCount}\n className=\"hidden sm:flex\"\n />\n {onSettings && (\n <ControlButton\n onClick={onSettings}\n icon={Settings}\n label={t.settings.title}\n disabled={disabled}\n systemColor={systemColor}\n className=\"hidden sm:flex\"\n />\n )}\n <div className=\"w-px h-8 bg-white/10 mx-2 hidden sm:block\" />\n <ControlButton onClick={onExit} icon={Power} label={t.settings.exit} danger disabled={disabled} systemColor={systemColor} />\n </div>\n );\n});\n","'use client';\n\nimport { memo, useState, useEffect, ReactNode } from 'react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ninterface MobileControlDrawerProps {\n children: ReactNode;\n systemColor?: string;\n}\n\n/**\n * Mobile Control Drawer\n * FAB button at bottom-center that opens a slide-up drawer with controls\n * Only visible on mobile (hidden on sm+ screens)\n */\nconst MobileControlDrawer = memo(function MobileControlDrawer({\n children,\n systemColor = '#00FF41',\n}: MobileControlDrawerProps) {\n const t = useKoinTranslation();\n const [isExpanded, setIsExpanded] = useState(false);\n\n // Close drawer when clicking outside\n useEffect(() => {\n if (isExpanded) {\n const handleInteract = (e: MouseEvent | TouchEvent) => {\n const target = e.target as HTMLElement;\n const isInside = target.closest('.player-controls-drawer') || target.closest('.player-controls-fab');\n if (!isInside) {\n setIsExpanded(false);\n }\n };\n window.addEventListener('mousedown', handleInteract);\n window.addEventListener('touchstart', handleInteract);\n return () => {\n window.removeEventListener('mousedown', handleInteract);\n window.removeEventListener('touchstart', handleInteract);\n };\n }\n }, [isExpanded]);\n\n return (\n <>\n {/* FAB (Floating Action Button) */}\n <div className=\"fixed bottom-6 left-1/2 -translate-x-1/2 z-[60] sm:hidden player-controls-fab\">\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n className={`\n w-14 h-14 rounded-full shadow-lg\n flex items-center justify-center\n transition-all duration-300 ease-out\n active:scale-90\n ${isExpanded\n ? 'bg-white text-black rotate-45'\n : 'bg-black/70 backdrop-blur-md text-white border border-white/20'\n }\n `}\n style={{\n boxShadow: isExpanded\n ? `0 0 20px ${systemColor}60, 0 4px 20px rgba(0,0,0,0.5)`\n : '0 4px 20px rgba(0,0,0,0.5)',\n borderColor: isExpanded ? systemColor : undefined\n }}\n aria-label={isExpanded ? t.controls.menuClose : t.controls.menuOpen}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n </button>\n </div>\n\n {/* Slide-up Drawer */}\n <div\n className={`\n fixed inset-x-0 bottom-0 z-50 sm:hidden\n transform transition-all duration-300 ease-out\n player-controls-drawer\n ${isExpanded\n ? 'translate-y-0 opacity-100'\n : 'translate-y-full opacity-0 pointer-events-none'\n }\n `}\n >\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-gradient-to-t from-black/95 to-black/70 backdrop-blur-xl\"\n style={{ paddingBottom: 'env(safe-area-inset-bottom, 20px)' }}\n />\n\n {/* Content */}\n <div\n className=\"relative flex flex-col items-center px-4 py-6 pb-20\"\n style={{ paddingBottom: 'calc(env(safe-area-inset-bottom, 20px) + 80px)' }}\n >\n {children}\n </div>\n\n {/* Drag handle */}\n <div className=\"absolute top-2 left-1/2 -translate-x-1/2 w-10 h-1 bg-white/30 rounded-full\" />\n </div>\n </>\n );\n});\n\nexport default MobileControlDrawer;\n","'use client';\n\nimport { memo } from 'react';\nimport { PlayerControlsProps } from './types';\nimport { PlaybackControls } from './PlayerControls/PlaybackControls';\nimport { SaveLoadControls } from './PlayerControls/SaveLoadControls';\nimport { SettingsControls } from './PlayerControls/SettingsControls';\nimport MobileControlDrawer from './PlayerControls/MobileControlDrawer';\n\nconst PlayerControls = memo(function PlayerControls({\n isPaused,\n isRunning,\n speed,\n isRewinding,\n rewindBufferSize,\n onPauseToggle,\n onRestart,\n onSave,\n onLoad,\n onSpeedChange,\n onRewindStart,\n onRewindStop,\n onScreenshot,\n onFullscreen,\n onControls,\n onCheats,\n onRetroAchievements,\n onShowShortcuts,\n onExit,\n disabled = false,\n loadDisabled = false,\n saveDisabled = false,\n hardcoreRestrictions,\n raConnected = false,\n raGameFound = false,\n raAchievementCount = 0,\n raIsIdentifying = false,\n autoSaveEnabled = false,\n autoSaveProgress = 0,\n autoSaveState = 'idle',\n autoSavePaused = false,\n onAutoSaveToggle,\n systemColor = '#00FF41',\n gamepadCount = 0,\n onGamepadSettings,\n onSettings,\n volume = 100,\n isMuted = false,\n onVolumeChange,\n onToggleMute,\n onRecordToggle,\n isRecording = false,\n currentShader,\n onShaderChange,\n}: PlayerControlsProps & { loadDisabled?: boolean; saveDisabled?: boolean }) {\n\n // Shared controls content\n const controlsContent = (\n <>\n <PlaybackControls\n isPaused={isPaused}\n isRunning={isRunning}\n speed={speed}\n isRewinding={isRewinding}\n rewindBufferSize={rewindBufferSize}\n onPauseToggle={onPauseToggle}\n onRestart={onRestart}\n onSpeedChange={onSpeedChange}\n onRewindStart={onRewindStart}\n onRewindStop={onRewindStop}\n volume={volume}\n isMuted={isMuted}\n onVolumeChange={onVolumeChange}\n onToggleMute={onToggleMute}\n disabled={disabled}\n systemColor={systemColor}\n hardcoreRestrictions={hardcoreRestrictions}\n />\n\n <div className=\"w-full h-px bg-white/10 sm:hidden my-4\" />\n\n <SaveLoadControls\n onSave={onSave}\n onLoad={onLoad}\n onScreenshot={onScreenshot}\n onRecordToggle={onRecordToggle}\n isRecording={isRecording}\n disabled={disabled}\n loadDisabled={loadDisabled}\n saveDisabled={saveDisabled}\n systemColor={systemColor}\n hardcoreRestrictions={hardcoreRestrictions}\n autoSaveEnabled={autoSaveEnabled}\n autoSaveProgress={autoSaveProgress}\n autoSaveState={autoSaveState}\n autoSavePaused={autoSavePaused}\n onAutoSaveToggle={onAutoSaveToggle}\n />\n\n <div className=\"w-full h-px bg-white/10 sm:hidden my-4\" />\n\n <SettingsControls\n onFullscreen={onFullscreen}\n onControls={onControls}\n onGamepadSettings={onGamepadSettings}\n onSettings={onSettings}\n onCheats={onCheats}\n onRetroAchievements={onRetroAchievements}\n onShowShortcuts={onShowShortcuts}\n onExit={onExit}\n currentShader={currentShader}\n onShaderChange={onShaderChange}\n isRunning={isRunning}\n disabled={disabled}\n systemColor={systemColor}\n gamepadCount={gamepadCount}\n hardcoreRestrictions={hardcoreRestrictions}\n raConnected={raConnected}\n raGameFound={raGameFound}\n raAchievementCount={raAchievementCount}\n raIsIdentifying={raIsIdentifying}\n />\n </>\n );\n\n return (\n <>\n {/* Mobile: FAB + Drawer */}\n <MobileControlDrawer systemColor={systemColor}>\n {controlsContent}\n </MobileControlDrawer>\n\n {/* Desktop: Static bar with safe centering and auto-scroll */}\n <div className=\"hidden sm:flex w-full bg-black/90 backdrop-blur-md border-t border-white/10 shrink-0 z-50 overflow-x-auto no-scrollbar\">\n <div className=\"flex items-center min-w-max mx-auto gap-4 px-8 py-4\">\n {controlsContent}\n </div>\n </div>\n </>\n );\n});\n\nexport default PlayerControls;\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport {\n CheckCircle,\n XCircle,\n Info,\n AlertTriangle,\n Gamepad2,\n X\n} from 'lucide-react';\nimport { Toast, ToastType } from '../../hooks/useToast';\n\ninterface ToastItemProps {\n toast: Toast;\n onDismiss?: (id: string) => void;\n}\n\n// Neo-brutalist color schemes - flat colors, no gradients\nconst TOAST_CONFIGS: Record<ToastType, {\n icon: any; // LucideIcon type causes issues with React.ComponentType\n bgColor: string;\n borderColor: string;\n accentColor: string;\n iconClass: string;\n shadowColor: string;\n}> = {\n success: {\n icon: CheckCircle,\n bgColor: '#0a0a0a',\n borderColor: '#eab308', // Golden yellow like RA badge\n accentColor: '#eab308',\n iconClass: 'text-yellow-500',\n shadowColor: '#ca8a04',\n },\n error: {\n icon: XCircle,\n bgColor: '#0a0a0a',\n borderColor: '#ef4444',\n accentColor: '#ef4444',\n iconClass: 'text-red-400',\n shadowColor: '#dc2626',\n },\n info: {\n icon: Info,\n bgColor: '#0a0a0a',\n borderColor: '#3b82f6',\n accentColor: '#3b82f6',\n iconClass: 'text-blue-400',\n shadowColor: '#2563eb',\n },\n warning: {\n icon: AlertTriangle,\n bgColor: '#0a0a0a',\n borderColor: '#f59e0b',\n accentColor: '#f59e0b',\n iconClass: 'text-amber-400',\n shadowColor: '#d97706',\n },\n gamepad: {\n icon: Gamepad2,\n bgColor: '#0a0a0a',\n borderColor: '#a855f7',\n accentColor: '#a855f7',\n iconClass: 'text-purple-400',\n shadowColor: '#9333ea',\n },\n};\n\nfunction ToastItem({ toast, onDismiss }: ToastItemProps) {\n const [isVisible, setIsVisible] = useState(false);\n const [isExiting, setIsExiting] = useState(false);\n\n const config = TOAST_CONFIGS[toast.type];\n const IconComponent = config.icon;\n\n useEffect(() => {\n requestAnimationFrame(() => {\n setIsVisible(true);\n });\n }, []);\n\n const handleDismiss = () => {\n setIsExiting(true);\n setTimeout(() => {\n onDismiss?.(toast.id);\n }, 200);\n };\n\n return (\n <div\n className={`\n relative transition-all duration-300 ease-out\n ${isVisible && !isExiting\n ? 'translate-x-0 opacity-100'\n : 'translate-x-full opacity-0'\n }\n `}\n >\n {/* Neo-brutalist card - flat color, hard shadow, bold border */}\n <div\n className=\"relative w-[320px]\"\n style={{\n backgroundColor: config.bgColor,\n border: `2px solid ${config.borderColor}`,\n boxShadow: `3px 3px 0px ${config.shadowColor}`,\n }}\n >\n <div className=\"px-3 py-2.5 flex items-center gap-2.5\">\n {/* Icon - compact */}\n <div\n className=\"flex-shrink-0 w-8 h-8 flex items-center justify-center\"\n style={{\n backgroundColor: `${config.accentColor}20`,\n border: `2px solid ${config.borderColor}`,\n }}\n >\n {toast.icon ? (\n <span className=\"text-base\">{toast.icon}</span>\n ) : (\n <IconComponent size={16} className={config.iconClass} />\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n {toast.title && (\n <p\n className=\"text-[10px] font-black uppercase tracking-wider leading-none mb-1\"\n style={{ color: config.accentColor }}\n >\n {toast.title}\n </p>\n )}\n <p className=\"text-xs text-gray-200 font-medium leading-snug\">\n {toast.message}\n </p>\n </div>\n\n {/* Action button - inline right side */}\n {toast.action && (\n <button\n onClick={() => {\n toast.action?.onClick();\n handleDismiss();\n }}\n className=\"flex-shrink-0 text-[9px] font-black uppercase tracking-wider px-2 py-1 transition-all hover:-translate-y-0.5 active:translate-y-0\"\n style={{\n color: config.bgColor,\n backgroundColor: config.accentColor,\n border: `2px solid ${config.borderColor}`,\n }}\n >\n {toast.action.label}\n </button>\n )}\n\n {/* Close button */}\n <button\n onClick={handleDismiss}\n className=\"flex-shrink-0 p-0.5 text-gray-500 hover:text-white transition-colors\"\n >\n <X size={14} />\n </button>\n </div>\n\n {/* Progress bar - solid color */}\n {toast.duration && toast.duration > 0 && (\n <div className=\"h-0.5 bg-white/10\">\n <div\n className=\"h-full\"\n style={{\n backgroundColor: config.accentColor,\n animation: `shrink ${toast.duration}ms linear forwards`,\n }}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n\ninterface ToastContainerProps {\n toasts: Toast[];\n onDismiss?: (id: string) => void;\n}\n\nexport default function ToastContainer({ toasts, onDismiss }: ToastContainerProps) {\n if (toasts.length === 0) {\n return null;\n }\n\n return (\n <>\n <style>{`\n @keyframes shrink {\n from { width: 100%; }\n to { width: 0%; }\n }\n `}</style>\n <div className=\"fixed top-4 right-4 z-[9999] flex flex-col gap-2 pointer-events-none\">\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onDismiss={onDismiss} />\n ))}\n </div>\n </>\n );\n}\n","'use client';\n\nimport { memo, useState, useEffect, useRef } from 'react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ninterface PerformanceOverlayProps {\n isVisible: boolean;\n coreName?: string;\n systemColor?: string;\n}\n\n/**\n * Performance Overlay\n * -------------------\n * A subtle HUD displaying real-time performance metrics.\n * Useful for debugging, power users, and streamers.\n * \n * Metrics displayed:\n * - FPS (frames per second)\n * - Frame time (ms per frame)\n * - Core name\n */\nconst PerformanceOverlay = memo(function PerformanceOverlay({\n isVisible,\n coreName = 'Unknown',\n systemColor = '#00FF41',\n}: PerformanceOverlayProps) {\n const t = useKoinTranslation();\n const [fps, setFps] = useState(0);\n const [frameTime, setFrameTime] = useState(0);\n\n const frameTimesRef = useRef<number[]>([]);\n const lastTimeRef = useRef<number>(performance.now());\n const rafIdRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (!isVisible) {\n if (rafIdRef.current) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = null;\n }\n return;\n }\n\n const measureFrame = () => {\n const now = performance.now();\n const delta = now - lastTimeRef.current;\n lastTimeRef.current = now;\n\n // Keep last 60 frame times for smoothing\n frameTimesRef.current.push(delta);\n if (frameTimesRef.current.length > 60) {\n frameTimesRef.current.shift();\n }\n\n // Calculate average\n const avgFrameTime = frameTimesRef.current.reduce((a, b) => a + b, 0) / frameTimesRef.current.length;\n const currentFps = 1000 / avgFrameTime;\n\n setFps(Math.round(currentFps));\n setFrameTime(Number(avgFrameTime.toFixed(1)));\n\n rafIdRef.current = requestAnimationFrame(measureFrame);\n };\n\n rafIdRef.current = requestAnimationFrame(measureFrame);\n\n return () => {\n if (rafIdRef.current) {\n cancelAnimationFrame(rafIdRef.current);\n }\n };\n }, [isVisible]);\n\n if (!isVisible) return null;\n\n return (\n <div\n className=\"z-40 pointer-events-none select-none\"\n style={{ fontFamily: 'monospace' }}\n >\n <div\n className=\"flex items-center gap-3 px-2 py-1 rounded text-xs\"\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.75)',\n color: systemColor,\n border: `1px solid ${systemColor}40`,\n }}\n >\n {/* FPS */}\n <div className=\"flex items-center gap-1\">\n <span className=\"opacity-60 text-[10px] uppercase\">{t.overlays.performance.fps}</span>\n <span className=\"font-bold\">{fps}</span>\n </div>\n\n <div className=\"w-px h-3 bg-white/20\" />\n\n {/* Frame Time */}\n <div className=\"flex items-center gap-1\">\n <span className=\"opacity-60 text-[10px] uppercase\">{t.overlays.performance.frameTime}</span>\n <span className=\"font-bold\">{frameTime}ms</span>\n </div>\n\n <div className=\"w-px h-3 bg-white/20\" />\n\n {/* Core */}\n <div className=\"flex items-center gap-1\">\n <span className=\"opacity-60 text-[10px] uppercase\">{t.overlays.performance.core}</span>\n <span className=\"font-bold text-white/80\">{coreName}</span>\n </div>\n </div>\n </div>\n );\n});\n\nexport default PerformanceOverlay;\n","'use client';\n\nimport React, { memo, useState, useEffect } from 'react';\n\ninterface InputDisplayProps {\n isVisible: boolean;\n system: string;\n systemColor?: string;\n position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'inline';\n}\n\n// Button layout configurations for different systems\nconst BUTTON_LAYOUTS: Record<string, { dpad: boolean; buttons: string[] }> = {\n // Nintendo\n nes: { dpad: true, buttons: ['B', 'A', 'SELECT', 'START'] },\n snes: { dpad: true, buttons: ['Y', 'B', 'X', 'A', 'L', 'R', 'SELECT', 'START'] },\n n64: { dpad: true, buttons: ['A', 'B', 'Z', 'L', 'R', 'C↑', 'C↓', 'C←', 'C→', 'START'] },\n gb: { dpad: true, buttons: ['B', 'A', 'SELECT', 'START'] },\n gbc: { dpad: true, buttons: ['B', 'A', 'SELECT', 'START'] },\n gba: { dpad: true, buttons: ['B', 'A', 'L', 'R', 'SELECT', 'START'] },\n nds: { dpad: true, buttons: ['Y', 'B', 'X', 'A', 'L', 'R', 'SELECT', 'START'] },\n\n // Sega\n genesis: { dpad: true, buttons: ['A', 'B', 'C', 'X', 'Y', 'Z', 'MODE', 'START'] },\n mastersystem: { dpad: true, buttons: ['1', '2', 'PAUSE'] },\n gamegear: { dpad: true, buttons: ['1', '2', 'START'] },\n\n // Sony\n ps1: { dpad: true, buttons: ['□', '×', '○', '△', 'L1', 'R1', 'L2', 'R2', 'SELECT', 'START'] },\n psp: { dpad: true, buttons: ['□', '×', '○', '△', 'L', 'R', 'SELECT', 'START'] },\n\n // Arcade\n arcade: { dpad: true, buttons: ['1', '2', '3', '4', '5', '6', 'COIN', 'START'] },\n neogeo: { dpad: true, buttons: ['A', 'B', 'C', 'D', 'COIN', 'START'] },\n\n // Default\n default: { dpad: true, buttons: ['A', 'B', 'START'] },\n};\n\n// Keyboard to button mapping (simplified - real mapping comes from controls)\nconst KEY_TO_BUTTON: Record<string, string> = {\n 'ArrowUp': '↑',\n 'ArrowDown': '↓',\n 'ArrowLeft': '←',\n 'ArrowRight': '→',\n 'KeyZ': 'A',\n 'KeyX': 'B',\n 'KeyA': 'X',\n 'KeyS': 'Y',\n 'KeyQ': 'L',\n 'KeyW': 'R',\n 'Enter': 'START',\n 'ShiftRight': 'SELECT',\n 'Space': 'COIN',\n};\n\n/**\n * Input Display Overlay\n * ---------------------\n * Shows real-time button presses for streaming and speedruns.\n * Displays a visual representation of the controller with\n * active buttons highlighted.\n */\nconst InputDisplay = memo(function InputDisplay({\n isVisible,\n system,\n systemColor = '#00FF41',\n position = 'bottom-right',\n}: InputDisplayProps) {\n const [activeKeys, setActiveKeys] = useState<Set<string>>(new Set());\n\n // Track keyboard state\n useEffect(() => {\n if (!isVisible) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const button = KEY_TO_BUTTON[e.code];\n if (button) {\n setActiveKeys(prev => new Set(prev).add(button));\n }\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n const button = KEY_TO_BUTTON[e.code];\n if (button) {\n setActiveKeys(prev => {\n const next = new Set(prev);\n next.delete(button);\n return next;\n });\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n };\n }, [isVisible]);\n\n if (!isVisible) return null;\n\n const layout = BUTTON_LAYOUTS[system.toLowerCase()] || BUTTON_LAYOUTS.default;\n\n // Position classes - 'inline' means no absolute positioning (used in HUD container)\n const positionClasses: Record<string, string> = {\n 'top-left': 'absolute top-2 left-2',\n 'top-right': 'absolute top-2 right-2',\n 'bottom-left': 'absolute bottom-2 left-2',\n 'bottom-right': 'absolute bottom-2 right-2',\n 'inline': '', // No positioning - parent controls placement\n };\n\n const isActive = (btn: string) => activeKeys.has(btn);\n const isDpadActive = (dir: string) => activeKeys.has(dir);\n\n return (\n <div\n className={`z-40 pointer-events-none select-none ${positionClasses[position]}`}\n style={{ fontFamily: 'monospace' }}\n >\n <div\n className=\"flex items-center gap-4 px-3 py-2 rounded\"\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.75)',\n border: `1px solid ${systemColor}40`,\n }}\n >\n {/* D-Pad */}\n {layout.dpad && (\n <div className=\"grid grid-cols-3 gap-0.5\" style={{ width: '48px', height: '48px' }}>\n <div /> {/* Empty top-left */}\n <DpadButton active={isDpadActive('↑')} color={systemColor}>↑</DpadButton>\n <div /> {/* Empty top-right */}\n <DpadButton active={isDpadActive('←')} color={systemColor}>←</DpadButton>\n <div className=\"w-3 h-3 bg-gray-700 rounded-sm\" /> {/* Center */}\n <DpadButton active={isDpadActive('→')} color={systemColor}>→</DpadButton>\n <div /> {/* Empty bottom-left */}\n <DpadButton active={isDpadActive('↓')} color={systemColor}>↓</DpadButton>\n <div /> {/* Empty bottom-right */}\n </div>\n )}\n\n {/* Face Buttons */}\n <div className=\"flex flex-wrap gap-1 max-w-[120px]\">\n {layout.buttons.slice(0, 6).map(btn => (\n <ActionButton key={btn} active={isActive(btn)} color={systemColor}>\n {btn}\n </ActionButton>\n ))}\n </div>\n </div>\n </div>\n );\n});\n\n// D-Pad button component\nconst DpadButton = memo(function DpadButton({\n active,\n color,\n children\n}: {\n active: boolean;\n color: string;\n children: React.ReactNode;\n}) {\n return (\n <div\n className=\"w-3 h-3 flex items-center justify-center text-[8px] font-bold rounded-sm transition-all duration-75\"\n style={{\n backgroundColor: active ? color : 'rgba(255,255,255,0.1)',\n color: active ? '#000' : 'rgba(255,255,255,0.5)',\n boxShadow: active ? `0 0 8px ${color}` : 'none',\n }}\n >\n {children}\n </div>\n );\n});\n\n// Action button component\nconst ActionButton = memo(function ActionButton({\n active,\n color,\n children\n}: {\n active: boolean;\n color: string;\n children: React.ReactNode;\n}) {\n return (\n <div\n className=\"min-w-[20px] h-5 px-1 flex items-center justify-center text-[9px] font-bold rounded transition-all duration-75\"\n style={{\n backgroundColor: active ? color : 'rgba(255,255,255,0.1)',\n color: active ? '#000' : 'rgba(255,255,255,0.6)',\n boxShadow: active ? `0 0 8px ${color}` : 'none',\n }}\n >\n {children}\n </div>\n );\n});\n\nexport default InputDisplay;\n","'use client';\n\nimport { memo, useState } from 'react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\nimport { Circle, Pause, Play, Square, Download } from 'lucide-react';\n\ninterface RecordingIndicatorProps {\n isRecording: boolean;\n isPaused: boolean;\n duration: number; // in seconds\n onPause?: () => void;\n onResume?: () => void;\n onStop?: () => void;\n systemColor?: string;\n}\n\n/**\n * Recording Indicator\n * -------------------\n * Shows recording status with interactive controls on hover.\n * Position: Top-left (since performance overlay is top-right)\n */\nconst RecordingIndicator = memo(function RecordingIndicator({\n isRecording,\n isPaused,\n duration,\n onPause,\n onResume,\n onStop,\n systemColor = '#FF3333',\n}: RecordingIndicatorProps) {\n const t = useKoinTranslation();\n const [isHovered, setIsHovered] = useState(false);\n\n if (!isRecording) return null;\n\n // Format duration as MM:SS\n const minutes = Math.floor(duration / 60);\n const seconds = duration % 60;\n const timeString = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n\n return (\n <div\n className=\"z-40 select-none\"\n style={{ fontFamily: 'monospace' }}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n <div\n className=\"flex items-center gap-2 px-3 py-2 rounded transition-all duration-200\"\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.9)',\n border: `2px solid ${isPaused ? '#FFA500' : '#FF3333'}`,\n boxShadow: isPaused ? '0 0 12px rgba(255, 165, 0, 0.3)' : '0 0 12px rgba(255, 51, 51, 0.3)',\n }}\n >\n {/* Recording dot / status */}\n <div className=\"relative flex items-center\">\n {isPaused ? (\n <Pause size={14} className=\"text-orange-400\" />\n ) : (\n <>\n <Circle\n size={14}\n fill=\"#FF3333\"\n className=\"text-red-500\"\n />\n {/* Pulsing animation */}\n <Circle\n size={14}\n fill=\"#FF3333\"\n className=\"text-red-500 absolute inset-0 animate-ping opacity-75\"\n />\n </>\n )}\n </div>\n\n {/* Status + Duration */}\n <div className=\"flex flex-col\">\n <span\n className=\"text-xs font-bold\"\n style={{ color: isPaused ? '#FFA500' : '#FF3333' }}\n >\n {isPaused ? t.overlays.recording.paused : t.overlays.recording.recording}\n </span>\n <span className=\"text-[10px] text-white/60\">{timeString}</span>\n </div>\n\n {/* Controls - show on hover */}\n {isHovered && (\n <div className=\"flex items-center gap-1 ml-2 pl-2 border-l border-white/20\">\n {/* Pause/Resume */}\n {isPaused ? (\n <button\n onClick={onResume}\n className=\"p-1.5 rounded hover:bg-white/20 transition-colors\"\n title={t.overlays.recording.resume}\n >\n <Play size={14} className=\"text-orange-400\" fill=\"#FFA500\" />\n </button>\n ) : (\n <button\n onClick={onPause}\n className=\"p-1.5 rounded hover:bg-white/20 transition-colors\"\n title={t.overlays.recording.pause}\n >\n <Pause size={14} className=\"text-white/80\" />\n </button>\n )}\n\n {/* Stop & Save */}\n <button\n onClick={onStop}\n className=\"p-1.5 rounded hover:bg-red-500/30 transition-colors flex items-center gap-1\"\n title={t.overlays.recording.stop}\n >\n <Square size={12} fill=\"#FF3333\" className=\"text-red-500\" />\n <Download size={12} className=\"text-white/60\" />\n </button>\n </div>\n )}\n </div>\n\n {/* Hint when not hovered */}\n {!isHovered && (\n <div className=\"text-[9px] text-white/40 text-center mt-1\">\n {t.overlays.recording.hover}\n </div>\n )}\n </div>\n );\n});\n\nexport default RecordingIndicator;\n","'use client';\n\nimport { memo, useMemo } from 'react';\nimport { X, Keyboard } from 'lucide-react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ninterface ShortcutsModalProps {\n isOpen: boolean;\n onClose: () => void;\n systemColor?: string;\n}\n\n/**\n * Shortcuts Modal\n * ---------------\n * Shows PLAYER shortcuts (F-keys only).\n * Game controls are configured separately in the Controls modal.\n */\nconst ShortcutsModal = memo(function ShortcutsModal({\n isOpen,\n onClose,\n systemColor = '#00FF41',\n}: ShortcutsModalProps) {\n const t = useKoinTranslation();\n\n // F-key shortcuts - these are PLAYER features, not game controls\n const shortcuts = useMemo(() => [\n {\n section: t.modals.shortcuts.overlays, items: [\n { key: 'F1', description: t.modals.shortcuts.showHelp },\n { key: 'F3', description: t.modals.shortcuts.perfOverlay },\n { key: 'F4', description: t.modals.shortcuts.inputDisplay },\n ]\n },\n {\n section: t.modals.shortcuts.recording, items: [\n { key: 'F5', description: t.modals.shortcuts.toggleRec },\n ]\n },\n {\n section: t.settings.audio, items: [\n { key: 'F9', description: t.modals.shortcuts.toggleMute },\n ]\n },\n ], [t]);\n\n if (!isOpen) return null;\n\n return (\n <div\n className=\"absolute inset-0 z-50 flex items-center justify-center bg-black/80 backdrop-blur-sm\"\n onClick={onClose}\n >\n <div\n className=\"max-w-sm w-full mx-4 bg-black/95 border rounded-lg overflow-hidden\"\n style={{ borderColor: `${systemColor}40` }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n className=\"flex items-center justify-between px-4 py-3 border-b\"\n style={{ borderColor: `${systemColor}20`, backgroundColor: `${systemColor}10` }}\n >\n <div className=\"flex items-center gap-2\">\n <Keyboard size={18} style={{ color: systemColor }} />\n <span className=\"font-bold text-white\">{t.modals.shortcuts.playerShortcuts}</span>\n </div>\n <button\n onClick={onClose}\n className=\"p-1 rounded hover:bg-white/10 transition-colors\"\n >\n <X size={18} className=\"text-white/60 hover:text-white\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-4 space-y-3\">\n {shortcuts.map(({ section, items }) => (\n <div key={section}>\n <h3\n className=\"text-[10px] font-bold uppercase tracking-wider mb-1.5 opacity-60\"\n style={{ color: systemColor }}\n >\n {section}\n </h3>\n <div className=\"space-y-1\">\n {items.map(({ key, description }) => (\n <div\n key={key}\n className=\"flex items-center justify-between text-sm\"\n >\n <span className=\"text-white/70\">{description}</span>\n <kbd\n className=\"px-2 py-0.5 rounded text-xs font-mono font-bold\"\n style={{\n backgroundColor: `${systemColor}20`,\n color: systemColor,\n border: `1px solid ${systemColor}40`,\n }}\n >\n {key}\n </kbd>\n </div>\n ))}\n </div>\n </div>\n ))}\n\n {/* Note about game controls */}\n <div className=\"pt-2 border-t border-white/10 text-xs text-white/40\">\n Game controls can be configured in <strong className=\"text-white/60\">{t.controls.keys}</strong> settings.\n </div>\n </div>\n\n {/* Footer */}\n <div\n className=\"px-4 py-2 text-center text-xs text-white/40 border-t\"\n style={{ borderColor: `${systemColor}20` }}\n >\n {t.modals.shortcuts.pressEsc}\n </div>\n </div>\n </div>\n );\n});\n\nexport default ShortcutsModal;\n","/**\n * Utilities for viewport and fullscreen detection\n */\n\n/**\n * Check if document is in fullscreen mode (all vendor prefixes)\n */\nexport function isFullscreen(): boolean {\n const doc = document as any;\n return !!(\n doc.fullscreenElement ||\n doc.webkitFullscreenElement ||\n doc.mozFullScreenElement ||\n doc.msFullscreenElement\n );\n}\n\n/**\n * Get all fullscreen change event names (for all vendor prefixes)\n */\nexport function getFullscreenEventNames(): string[] {\n return [\n 'fullscreenchange',\n 'webkitfullscreenchange',\n 'mozfullscreenchange',\n 'MSFullscreenChange',\n ];\n}\n\n/**\n * Setup fullscreen change listener with all vendor prefixes\n * Returns cleanup function\n */\nexport function setupFullscreenListener(\n callback: () => void\n): () => void {\n const eventNames = getFullscreenEventNames();\n eventNames.forEach((eventName) => {\n document.addEventListener(eventName, callback);\n });\n\n return () => {\n eventNames.forEach((eventName) => {\n document.removeEventListener(eventName, callback);\n });\n };\n}\n\n/**\n * Request fullscreen on an element (with vendor prefixes)\n * Falls back gracefully if not supported\n */\nexport async function enterFullscreen(element: HTMLElement): Promise<boolean> {\n try {\n if (element.requestFullscreen) {\n await element.requestFullscreen();\n return true;\n } else if ((element as any).webkitRequestFullscreen) {\n await (element as any).webkitRequestFullscreen();\n return true;\n }\n return false;\n } catch (err) {\n console.warn('Fullscreen request failed:', err);\n return false;\n }\n}\n\n/**\n * Exit fullscreen mode (with vendor prefixes)\n */\nexport async function exitFullscreenMode(): Promise<boolean> {\n try {\n if (document.exitFullscreen) {\n await document.exitFullscreen();\n return true;\n } else if ((document as any).webkitExitFullscreen) {\n await (document as any).webkitExitFullscreen();\n return true;\n }\n return false;\n } catch (err) {\n console.warn('Exit fullscreen failed:', err);\n return false;\n }\n}\n\n/**\n * Toggle fullscreen mode on an element\n * Returns whether fullscreen is now active (or should be visually simulated)\n */\nexport async function toggleFullscreen(element: HTMLElement): Promise<boolean> {\n if (isFullscreen()) {\n const exited = await exitFullscreenMode();\n return exited ? false : isFullscreen();\n } else {\n const entered = await enterFullscreen(element);\n // If native fullscreen worked, return true; otherwise caller should use visual fallback\n return entered;\n }\n}\n\n/**\n * Detect if device is mobile\n * Uses multiple heuristics for reliable detection\n */\nexport function isMobileDevice(): boolean {\n // Check for touch capability\n const hasTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n\n // Use matchMedia for pointer type (most reliable)\n const hasCoarsePointer = window.matchMedia('(pointer: coarse)').matches;\n\n // Use visual viewport if available (more accurate on mobile)\n const width = window.visualViewport?.width || window.innerWidth;\n const isSmallScreen = width < 768;\n\n // Check user agent for mobile devices\n const isMobileUA = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n );\n\n // Mobile if has touch AND (coarse pointer OR small screen OR mobile UA)\n return hasTouch && (hasCoarsePointer || isSmallScreen || isMobileUA);\n}\n\n/**\n * Get current viewport dimensions\n * Uses visual viewport API if available (better for mobile with keyboard/address bar)\n */\nexport function getViewportSize(): { width: number; height: number } {\n return {\n width: window.visualViewport?.width || window.innerWidth,\n height: window.visualViewport?.height || window.innerHeight,\n };\n}\n\n/**\n * Get current screen orientation\n * Uses viewport dimensions to determine orientation\n */\nexport function getCurrentOrientation(): 'portrait' | 'landscape' {\n const { width, height } = getViewportSize();\n return width > height ? 'landscape' : 'portrait';\n}\n\n/**\n * Get current screen orientation from container dimensions\n * More reliable than window dimensions during transitions\n */\nexport function getOrientationFromContainer(container: HTMLElement): 'portrait' | 'landscape' {\n const rect = container.getBoundingClientRect();\n return rect.width > rect.height ? 'landscape' : 'portrait';\n}\n\n/**\n * Create an orientation change handler with iOS-specific timing\n * Handles duplicate events and waits for layout updates\n * \n * @param callback - Function to call when orientation changes\n * @param checkReady - Optional function to check if layout is ready (returns true when ready)\n * @param maxRafs - Maximum number of RAF attempts (default: 3)\n * @returns Handler function to attach to orientationchange event\n */\nexport function createOrientationChangeHandler(\n callback: () => void,\n checkReady?: () => boolean,\n maxRafs: number = 3\n): () => void {\n let lastOrientation: 'portrait' | 'landscape' | null = null;\n\n return () => {\n const currentOrientation = getCurrentOrientation();\n\n // Only process if orientation actually changed (iOS can fire multiple times)\n if (lastOrientation === currentOrientation) {\n return;\n }\n\n lastOrientation = currentOrientation;\n\n // iOS Safari: orientationchange fires before layout is updated\n // Use multiple RAFs to wait for layout, with a fallback timeout\n let rafCount = 0;\n\n const tryCallback = () => {\n rafCount++;\n\n // If checkReady is provided, use it to verify layout is ready\n if (checkReady && !checkReady()) {\n // If layout not ready and we haven't tried too many times, try again\n if (rafCount < maxRafs) {\n requestAnimationFrame(tryCallback);\n } else {\n // Fallback: force callback after a short delay (iOS edge case)\n setTimeout(callback, 100);\n }\n return;\n }\n\n // Layout is ready (or no check provided), execute callback\n callback();\n };\n\n // Start with a small delay to let iOS start the transition\n setTimeout(() => {\n requestAnimationFrame(tryCallback);\n }, 50);\n };\n}\n\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport {\n isMobileDevice,\n getCurrentOrientation,\n createOrientationChangeHandler,\n} from '../components/VirtualController/utils/viewport';\n\nexport interface UseMobileReturn {\n isMobile: boolean;\n isLandscape: boolean;\n isPortrait: boolean;\n}\n\n/**\n * Hook to detect mobile devices and screen orientation\n * Uses touch capability and screen size to determine if device is mobile\n */\nexport function useMobile(): UseMobileReturn {\n const [isMobile, setIsMobile] = useState(false);\n const [isLandscape, setIsLandscape] = useState(false);\n const [isPortrait, setIsPortrait] = useState(true);\n\n useEffect(() => {\n let lastOrientation: 'portrait' | 'landscape' | null = null;\n\n // Check orientation with debouncing to avoid rapid updates\n let orientationTimeout: ReturnType<typeof setTimeout> | null = null;\n const checkOrientation = () => {\n if (orientationTimeout) clearTimeout(orientationTimeout);\n\n orientationTimeout = setTimeout(() => {\n const currentOrientation = getCurrentOrientation();\n\n // Only update if orientation actually changed\n if (lastOrientation !== currentOrientation) {\n lastOrientation = currentOrientation;\n const landscape = currentOrientation === 'landscape';\n setIsLandscape(landscape);\n setIsPortrait(!landscape);\n }\n }, 100); // Small debounce to avoid rapid updates during transition\n };\n\n // Initial check\n setIsMobile(isMobileDevice());\n const initialOrientation = getCurrentOrientation();\n lastOrientation = initialOrientation;\n const initialLandscape = initialOrientation === 'landscape';\n setIsLandscape(initialLandscape);\n setIsPortrait(!initialLandscape);\n\n // Listen for resize/orientation changes\n const handleResize = () => {\n setIsMobile(isMobileDevice());\n checkOrientation();\n };\n\n // Handle orientation change with iOS-specific timing\n const handleOrientationChange = createOrientationChangeHandler(() => {\n handleResize();\n });\n\n window.addEventListener('resize', handleResize, { passive: true });\n window.addEventListener('orientationchange', handleOrientationChange);\n\n // Visual viewport changes (iOS Safari address bar)\n if (window.visualViewport) {\n window.visualViewport.addEventListener('resize', handleResize);\n }\n\n return () => {\n if (orientationTimeout) clearTimeout(orientationTimeout);\n window.removeEventListener('resize', handleResize);\n window.removeEventListener('orientationchange', handleOrientationChange);\n if (window.visualViewport) {\n window.visualViewport.removeEventListener('resize', handleResize);\n }\n };\n }, []);\n\n return {\n isMobile,\n isLandscape,\n isPortrait,\n };\n}\n","/**\n * Console-specific virtual controller layouts\n * \n * IMPORTANT: Button `type` maps to RetroPad standard buttons.\n * Button `label` is what the user sees on screen.\n * \n * POSITIONING (percentage of screen):\n * - D-pad: Bottom-left (~14%, ~62%)\n * - Action buttons: Bottom-right (~75-95%, ~45-70%)\n * - System buttons: Top center (~38-62%, ~8%)\n * - Shoulders: Top corners (~8%, ~92%, ~20%)\n */\n\nimport { ButtonId } from '../../lib/controls/types';\n\nexport type ButtonType = ButtonId | 'menu';\n\nexport interface ButtonConfig {\n type: ButtonType;\n label: string;\n x: number;\n y: number;\n size: number;\n showInPortrait: boolean;\n showInLandscape: boolean;\n shape?: 'circle' | 'square' | 'rect' | 'pill';\n}\n\nexport interface ControllerLayout {\n console: string;\n buttons: ButtonConfig[];\n}\n\n// --- SIZE CONSTANTS ---\nconst BUTTON_SMALL = 44;\nconst BUTTON_MEDIUM = 56;\nconst BUTTON_LARGE = 68;\n\n// --- POSITION CONSTANTS ---\nconst START_SELECT_Y = 8;\nconst SELECT_X = 38;\nconst START_X = 62;\n\n// --- SHARED D-PAD BUTTONS (filtered out, handled by Dpad component) ---\nconst DPAD_BUTTONS: ButtonConfig[] = [\n { type: 'up', label: '↑', x: 14, y: 55, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'down', label: '↓', x: 14, y: 70, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'left', label: '←', x: 6, y: 62.5, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'right', label: '→', x: 22, y: 62.5, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n];\n\n// --- LAYOUTS ---\n\n/**\n * 2-Button Layout (NES, GB, GBC, Master System, Game Gear, TG-16, Atari)\n */\nexport const TWO_BUTTON_LAYOUT: ControllerLayout = {\n console: '2BUTTON',\n buttons: [\n ...DPAD_BUTTONS,\n { type: 'b', label: 'B', x: 78, y: 66, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: 'A', x: 90, y: 56, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'select', label: 'SELECT', x: SELECT_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n { type: 'start', label: 'START', x: START_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * SNES Layout (4 Face + L/R)\n */\nexport const SNES_LAYOUT: ControllerLayout = {\n console: 'SNES',\n buttons: [\n ...DPAD_BUTTONS,\n // Diamond: Y-X-B-A (left-top-bottom-right)\n { type: 'y', label: 'Y', x: 74, y: 58, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'x', label: 'X', x: 84, y: 46, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'b', label: 'B', x: 84, y: 70, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: 'A', x: 94, y: 58, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n // Shoulders\n { type: 'l', label: 'L', x: 8, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'r', label: 'R', x: 92, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'select', label: 'SELECT', x: SELECT_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n { type: 'start', label: 'START', x: START_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * GBA Layout (A/B + L/R)\n */\nexport const GBA_LAYOUT: ControllerLayout = {\n console: 'GBA',\n buttons: [\n ...DPAD_BUTTONS,\n { type: 'b', label: 'B', x: 80, y: 62, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: 'A', x: 92, y: 52, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'l', label: 'L', x: 8, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'r', label: 'R', x: 92, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'select', label: 'SELECT', x: SELECT_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n { type: 'start', label: 'START', x: START_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * Genesis 6-Button Layout\n * RetroPad mapping: A=Y, B=B, C=A, X=L, Y=X, Z=R\n */\nexport const SIX_BUTTON_LAYOUT: ControllerLayout = {\n console: '6BUTTON',\n buttons: [\n ...DPAD_BUTTONS,\n // Top row (X, Y, Z) → mapped to L, X, R\n { type: 'l', label: 'X', x: 74, y: 48, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'x', label: 'Y', x: 84, y: 44, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'r', label: 'Z', x: 94, y: 40, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n // Bottom row (A, B, C) → mapped to Y, B, A\n { type: 'y', label: 'A', x: 72, y: 64, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'b', label: 'B', x: 82, y: 60, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: 'C', x: 92, y: 56, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'start', label: 'START', x: 50, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * Saturn Layout (6-Button + L/R triggers)\n * Same face buttons as Genesis, plus dedicated L/R shoulders\n */\nexport const SATURN_LAYOUT: ControllerLayout = {\n console: 'SATURN',\n buttons: [\n ...DPAD_BUTTONS,\n // Face buttons (same as 6-button but uses standard buttons)\n // X/Y/Z on top\n { type: 'x', label: 'X', x: 74, y: 48, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'y', label: 'Y', x: 84, y: 44, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'l', label: 'Z', x: 94, y: 40, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n // A/B/C on bottom\n { type: 'b', label: 'A', x: 72, y: 64, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: 'B', x: 82, y: 60, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'r', label: 'C', x: 92, y: 56, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n // Triggers (L2/R2 for Saturn L/R)\n { type: 'l2', label: 'L', x: 8, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'r2', label: 'R', x: 92, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'start', label: 'START', x: 50, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * Neo Geo 4-Button Curved Layout\n * RetroPad mapping: A→B, B→A, C→Y, D→X\n */\nexport const NEOGEO_LAYOUT: ControllerLayout = {\n console: 'NEOGEO',\n buttons: [\n ...DPAD_BUTTONS,\n // Curved A-B-C-D layout (maps to b-a-y-x for RetroPad)\n { type: 'b', label: 'A', x: 68, y: 68, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: 'B', x: 78, y: 62, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'y', label: 'C', x: 88, y: 56, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'x', label: 'D', x: 96, y: 48, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'select', label: 'COIN', x: SELECT_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n { type: 'start', label: 'START', x: START_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * PlayStation Layout (4 Face + L1/R1 + L2/R2)\n */\nexport const PSX_LAYOUT: ControllerLayout = {\n console: 'PSX',\n buttons: [\n ...DPAD_BUTTONS,\n // PS symbols: △◯✕□ → y, b, a, x (triangle-circle-cross-square)\n { type: 'y', label: '△', x: 84, y: 46, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'b', label: '○', x: 94, y: 58, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: '✕', x: 84, y: 70, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'x', label: '□', x: 74, y: 58, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n // Shoulders\n { type: 'l', label: 'L1', x: 8, y: 25, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'r', label: 'R1', x: 92, y: 25, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'l2', label: 'L2', x: 8, y: 15, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'r2', label: 'R2', x: 92, y: 15, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'select', label: 'SELECT', x: SELECT_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n { type: 'start', label: 'START', x: START_X, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * N64 Layout (A/B + C-buttons + L/R/Z)\n */\nexport const N64_LAYOUT: ControllerLayout = {\n console: 'N64',\n buttons: [\n ...DPAD_BUTTONS,\n // A/B\n { type: 'a', label: 'A', x: 80, y: 68, size: BUTTON_LARGE, showInPortrait: true, showInLandscape: true },\n { type: 'b', label: 'B', x: 72, y: 76, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n // C-buttons (use x/y as C-left/C-up, l2/r2 as C-down/C-right)\n { type: 'y', label: 'C↑', x: 92, y: 50, size: 36, showInPortrait: true, showInLandscape: true },\n { type: 'x', label: 'C←', x: 86, y: 56, size: 36, showInPortrait: true, showInLandscape: true },\n { type: 'l2', label: 'C↓', x: 92, y: 62, size: 36, showInPortrait: true, showInLandscape: true },\n { type: 'r2', label: 'C→', x: 98, y: 56, size: 36, showInPortrait: true, showInLandscape: true },\n // Shoulders\n { type: 'l', label: 'L', x: 8, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'r', label: 'R', x: 92, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n // Z trigger (use select as workaround since it's a unique button)\n { type: 'select', label: 'Z', x: 8, y: 35, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'start', label: 'START', x: 50, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n/**\n * Dreamcast Layout (A/B/X/Y + L/R)\n */\nexport const DREAMCAST_LAYOUT: ControllerLayout = {\n console: 'DREAMCAST',\n buttons: [\n ...DPAD_BUTTONS,\n // Standard diamond\n { type: 'y', label: 'Y', x: 74, y: 58, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'x', label: 'X', x: 84, y: 46, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'b', label: 'B', x: 84, y: 70, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n { type: 'a', label: 'A', x: 94, y: 58, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true },\n // Triggers\n { type: 'l', label: 'L', x: 8, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'r', label: 'R', x: 92, y: 20, size: BUTTON_MEDIUM, showInPortrait: true, showInLandscape: true, shape: 'rect' },\n { type: 'start', label: 'START', x: 50, y: START_SELECT_Y, size: BUTTON_SMALL, showInPortrait: true, showInLandscape: true, shape: 'pill' },\n ],\n};\n\n// --- SYSTEM LOOKUP ---\n\nexport function getLayoutForSystem(system: string): ControllerLayout {\n const s = system.toUpperCase();\n\n // Sony\n if (s === 'PS1' || s === 'PSX' || s === 'PSP') return PSX_LAYOUT;\n\n // Nintendo\n if (s === 'N64') return N64_LAYOUT;\n if (s === 'SNES' || s === 'NDS') return SNES_LAYOUT;\n if (s === 'GBA') return GBA_LAYOUT;\n if (s === 'NES' || s === 'GB' || s === 'GBC' || s === 'VIRTUAL_BOY') return TWO_BUTTON_LAYOUT;\n\n // Sega\n if (s === 'DREAMCAST') return DREAMCAST_LAYOUT;\n if (s === 'SATURN') return SATURN_LAYOUT;\n if (s === 'GENESIS') return SIX_BUTTON_LAYOUT;\n if (s === 'MASTER_SYSTEM' || s === 'GAME_GEAR') return TWO_BUTTON_LAYOUT;\n\n // SNK\n if (s === 'NEOGEO') return NEOGEO_LAYOUT;\n if (s.includes('NEOGEO_POCKET')) return TWO_BUTTON_LAYOUT;\n\n // Others\n if (s === 'ARCADE') return SIX_BUTTON_LAYOUT;\n if (s === 'PC_ENGINE' || s === 'TURBOGRAFX') return TWO_BUTTON_LAYOUT;\n if (s.includes('WONDERSWAN')) return TWO_BUTTON_LAYOUT;\n if (s.includes('ATARI')) return TWO_BUTTON_LAYOUT;\n\n return TWO_BUTTON_LAYOUT;\n}\n","/**\n * Hook for handling touch events on virtual buttons\n * Handles both button presses and drag functionality\n */\n\nimport { useRef, useCallback } from 'react';\nimport { ButtonType } from '../layouts';\n\nexport interface UseTouchHandlersProps {\n buttonType: ButtonType;\n isSystemButton: boolean;\n buttonSize: number;\n displayX: number;\n displayY: number;\n containerWidth: number;\n containerHeight: number;\n onPress: (buttonType: string) => void;\n onPressDown?: (buttonType: string) => void;\n onRelease: (buttonType: string) => void;\n onPositionChange?: (x: number, y: number) => void;\n}\n\nexport interface TouchHandlers {\n handleTouchStart: (e: TouchEvent) => void;\n handleTouchMove: (e: TouchEvent) => void;\n handleTouchEnd: (e: TouchEvent) => void;\n handleTouchCancel: (e: TouchEvent) => void;\n cleanup: () => void;\n}\n\nconst DRAG_HOLD_DELAY = 350; // ms - aligned with Dpad\nconst DRAG_MOVE_THRESHOLD = 10; // pixels\nconst DRAG_CENTER_THRESHOLD = 0.4; // 40% of button size\n\nexport function useTouchHandlers({\n buttonType,\n isSystemButton,\n buttonSize,\n displayX,\n displayY,\n containerWidth,\n containerHeight,\n onPress,\n onPressDown,\n onRelease,\n onPositionChange,\n}: UseTouchHandlersProps): TouchHandlers {\n const isDraggingRef = useRef(false);\n const dragStartRef = useRef({ x: 0, y: 0 });\n const dragTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const touchStartPosRef = useRef({ x: 0, y: 0 });\n\n const clearDragTimer = useCallback(() => {\n if (dragTimerRef.current) {\n clearTimeout(dragTimerRef.current);\n dragTimerRef.current = null;\n }\n }, []);\n\n const startDragging = useCallback(\n (touchX: number, touchY: number) => {\n isDraggingRef.current = true;\n dragStartRef.current = {\n x: touchX - (displayX / 100) * containerWidth,\n y: touchY - (displayY / 100) * containerHeight,\n };\n // Haptic feedback for drag activation (matches D-pad)\n if (navigator.vibrate) {\n navigator.vibrate([10, 30, 10]);\n }\n // Release button press when drag starts\n if (!isSystemButton) {\n onRelease(buttonType);\n }\n },\n [displayX, displayY, containerWidth, containerHeight, isSystemButton, buttonType, onRelease]\n );\n\n const handleTouchStart = useCallback(\n (e: TouchEvent) => {\n const touch = e.touches[0];\n touchStartPosRef.current = { x: touch.clientX, y: touch.clientY };\n\n // Always prevent default to avoid delays and context menus\n e.preventDefault();\n e.stopPropagation();\n\n // Haptic feedback for tactile response\n if (navigator.vibrate) {\n navigator.vibrate(8); // Very short 8ms pulse\n }\n\n if (isSystemButton) {\n onPress(buttonType);\n } else if (onPressDown) {\n onPressDown(buttonType);\n }\n\n // Setup drag detection if enabled\n if (onPositionChange) {\n const target = e.currentTarget as HTMLElement;\n if (!target) return;\n const rect = target.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const distance = Math.sqrt(\n Math.pow(touch.clientX - centerX, 2) + Math.pow(touch.clientY - centerY, 2)\n );\n const dragThreshold = buttonSize * DRAG_CENTER_THRESHOLD;\n\n // Only enable drag if touch is near center\n if (distance < dragThreshold) {\n // Start drag timer - if user holds for delay, enable dragging\n dragTimerRef.current = setTimeout(() => {\n if (!isDraggingRef.current) {\n startDragging(touch.clientX, touch.clientY);\n }\n }, DRAG_HOLD_DELAY);\n }\n }\n },\n [isSystemButton, buttonType, onPress, onPressDown, onPositionChange, buttonSize, startDragging]\n );\n\n const handleTouchMove = useCallback(\n (e: TouchEvent) => {\n const touch = e.touches[0];\n\n // Check if user moved significantly (start drag immediately if moved)\n if (onPositionChange && !isDraggingRef.current) {\n const moveDistance = Math.sqrt(\n Math.pow(touch.clientX - touchStartPosRef.current.x, 2) +\n Math.pow(touch.clientY - touchStartPosRef.current.y, 2)\n );\n\n // If moved more than threshold, start dragging immediately\n if (moveDistance > DRAG_MOVE_THRESHOLD) {\n clearDragTimer();\n startDragging(touch.clientX, touch.clientY);\n }\n }\n\n // Handle drag movement\n if (isDraggingRef.current && onPositionChange) {\n e.preventDefault();\n e.stopPropagation();\n\n const newX = touch.clientX - dragStartRef.current.x;\n const newY = touch.clientY - dragStartRef.current.y;\n\n // Convert to percentage\n const newXPercent = (newX / containerWidth) * 100;\n const newYPercent = (newY / containerHeight) * 100;\n\n // Constrain to screen bounds (with margin for button size)\n const margin = (buttonSize / 2 / Math.min(containerWidth, containerHeight)) * 100;\n const constrainedX = Math.max(margin, Math.min(100 - margin, newXPercent));\n const constrainedY = Math.max(margin, Math.min(100 - margin, newYPercent));\n\n onPositionChange(constrainedX, constrainedY);\n }\n },\n [onPositionChange, clearDragTimer, startDragging, containerWidth, containerHeight, buttonSize]\n );\n\n const handleTouchEnd = useCallback(\n (e: TouchEvent) => {\n clearDragTimer();\n\n if (isDraggingRef.current) {\n e.preventDefault();\n e.stopPropagation();\n isDraggingRef.current = false;\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n // Only release if not a system button (system buttons use press() which auto-releases)\n if (!isSystemButton) {\n onRelease(buttonType);\n }\n },\n [clearDragTimer, isSystemButton, buttonType, onRelease]\n );\n\n const handleTouchCancel = useCallback(\n (e: TouchEvent) => {\n clearDragTimer();\n\n if (isDraggingRef.current) {\n e.preventDefault();\n e.stopPropagation();\n isDraggingRef.current = false;\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n // Only release if not a system button\n if (!isSystemButton) {\n onRelease(buttonType);\n }\n },\n [clearDragTimer, isSystemButton, buttonType, onRelease]\n );\n\n const cleanup = useCallback(() => {\n clearDragTimer();\n }, [clearDragTimer]);\n\n return {\n handleTouchStart,\n handleTouchMove,\n handleTouchEnd,\n handleTouchCancel,\n cleanup,\n };\n}\n\n","/**\n * Button styling utilities for virtual controller buttons\n * \n * Provides console-specific color schemes and pressed state styling.\n */\n\nimport { ButtonType } from '../layouts';\n\nexport interface ButtonStyle {\n bg: string;\n text: string;\n border: string;\n shadow: string;\n transform: string;\n}\n\n// --- DEFAULT STYLES ---\n\nconst DEFAULT_FACE: ButtonStyle = {\n bg: 'bg-white/10 backdrop-blur-md',\n text: 'text-white',\n border: 'border-white/30',\n shadow: 'shadow-lg',\n transform: '',\n};\n\nconst DEFAULT_SHOULDER: ButtonStyle = {\n bg: 'bg-white/20 backdrop-blur-md',\n text: 'text-white',\n border: 'border-white/30',\n shadow: 'shadow-sm',\n transform: '',\n};\n\nconst DEFAULT_SYSTEM: ButtonStyle = {\n bg: 'bg-black/60 backdrop-blur-md',\n text: 'text-white/80',\n border: 'border-white/20',\n shadow: 'shadow-sm',\n transform: '',\n};\n\nconst PRESSED_STYLE: ButtonStyle = {\n bg: 'bg-white/90',\n text: 'text-black',\n border: 'border-white',\n shadow: 'shadow-none',\n transform: 'scale(0.95)',\n};\n\n// --- HELPER FUNCTIONS ---\n\nfunction coloredButton(bgColor: string, textColor: string = 'text-white'): ButtonStyle {\n return {\n bg: bgColor,\n text: textColor,\n border: 'border-white/20',\n shadow: 'shadow-lg',\n transform: '',\n };\n}\n\nfunction psButton(symbolColor: string): ButtonStyle {\n return {\n bg: 'bg-black/80 backdrop-blur-md',\n text: symbolColor,\n border: 'border-white/30',\n shadow: 'shadow-lg',\n transform: '',\n };\n}\n\n// --- MAIN FUNCTION ---\n\n/**\n * Get button styles based on type, pressed state, and console\n */\nexport function getButtonStyles(\n buttonType: ButtonType,\n isPressed: boolean,\n consoleName: string = ''\n): ButtonStyle {\n if (isPressed) {\n return PRESSED_STYLE;\n }\n\n const c = consoleName.toUpperCase();\n\n // Neo Geo: A(red)/B(yellow)/C(green)/D(blue) → mapped to b/a/y/x\n if (c === 'NEOGEO') {\n switch (buttonType) {\n case 'b': return coloredButton('bg-[#E60012]'); // A = Red\n case 'a': return coloredButton('bg-[#FFD600]', 'text-black'); // B = Yellow\n case 'y': return coloredButton('bg-[#009944]'); // C = Green\n case 'x': return coloredButton('bg-[#0068B7]'); // D = Blue\n }\n }\n\n // PlayStation: Symbol colors\n if (c === 'PSX' || c === 'PS1' || c === 'PSP') {\n switch (buttonType) {\n case 'y': return psButton('text-[#25D998]'); // △ = Green\n case 'b': return psButton('text-[#FF5555]'); // ○ = Red\n case 'a': return psButton('text-[#5599FF]'); // ✕ = Blue\n case 'x': return psButton('text-[#E889DD]'); // □ = Pink\n }\n }\n\n // SNES: Colored face buttons\n if (c === 'SNES' || c === 'NDS') {\n switch (buttonType) {\n case 'a': return coloredButton('bg-[#CC0000]'); // A = Red\n case 'b': return coloredButton('bg-[#CCCC00]', 'text-black'); // B = Yellow\n case 'x': return coloredButton('bg-[#0033CC]'); // X = Blue\n case 'y': return coloredButton('bg-[#006600]'); // Y = Green\n }\n }\n\n // Default by button type\n switch (buttonType) {\n case 'a':\n case 'b':\n case 'x':\n case 'y':\n return DEFAULT_FACE;\n\n case 'l':\n case 'r':\n case 'l2':\n case 'r2':\n return DEFAULT_SHOULDER;\n\n case 'start':\n case 'select':\n case 'menu':\n return DEFAULT_SYSTEM;\n\n default:\n return DEFAULT_FACE;\n }\n}\n","'use client';\n\nimport React, { useRef, useEffect } from 'react';\nimport { ButtonConfig } from './layouts';\nimport { useTouchHandlers } from './hooks/useTouchHandlers';\nimport { getButtonStyles } from './utils/buttonStyles';\n\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\nexport interface VirtualButtonProps {\n config: ButtonConfig;\n isPressed: boolean;\n onPress: (buttonType: string) => void;\n onPressDown?: (buttonType: string) => void;\n onRelease: (buttonType: string) => void;\n containerWidth: number;\n containerHeight: number;\n customPosition?: { x: number; y: number } | null; // Custom position from drag\n onPositionChange?: (x: number, y: number) => void; // Callback when position changes\n isLandscape?: boolean; // For semi-transparency in landscape\n console?: string; // The specific console identifier (e.g. 'PSX', 'SNES')\n}\n\n/**\n * Individual virtual button component\n * Handles touch events and provides visual feedback\n */\n// Memoize to prevent re-renders when other buttons are pressed\nconst VirtualButton = React.memo(function VirtualButton({\n config,\n isPressed,\n onPress,\n onPressDown,\n onRelease,\n containerWidth,\n containerHeight,\n customPosition,\n onPositionChange,\n isLandscape = false,\n console = '',\n}: VirtualButtonProps) {\n const t = useKoinTranslation();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const isSystemButton = config.type === 'start' || config.type === 'select' || config.type === 'menu';\n const displayX = customPosition ? customPosition.x : config.x;\n const displayY = customPosition ? customPosition.y : config.y;\n\n let label = config.label;\n if (config.type === 'start') label = t.controls.startBtn;\n if (config.type === 'select') label = t.controls.selectBtn;\n\n // Setup touch handlers\n const {\n handleTouchStart,\n handleTouchMove,\n handleTouchEnd,\n handleTouchCancel,\n cleanup,\n } = useTouchHandlers({\n buttonType: config.type,\n isSystemButton,\n buttonSize: config.size,\n displayX,\n displayY,\n containerWidth,\n containerHeight,\n onPress,\n onPressDown,\n onRelease,\n onPositionChange,\n });\n\n // Setup event listeners\n useEffect(() => {\n const button = buttonRef.current;\n if (!button) return;\n\n button.addEventListener('touchstart', handleTouchStart, { passive: false });\n button.addEventListener('touchmove', handleTouchMove, { passive: false });\n button.addEventListener('touchend', handleTouchEnd, { passive: false });\n button.addEventListener('touchcancel', handleTouchCancel, { passive: false });\n\n return () => {\n button.removeEventListener('touchstart', handleTouchStart);\n button.removeEventListener('touchmove', handleTouchMove);\n button.removeEventListener('touchend', handleTouchEnd);\n button.removeEventListener('touchcancel', handleTouchCancel);\n cleanup();\n };\n }, [handleTouchStart, handleTouchMove, handleTouchEnd, handleTouchCancel, cleanup]);\n\n // Calculate position (percentage based)\n const leftPercent = (displayX / 100) * containerWidth - config.size / 2;\n const topPercent = (displayY / 100) * containerHeight - config.size / 2;\n\n // Use transform for hardware acceleration\n const transform = `translate3d(${leftPercent.toFixed(1)}px, ${topPercent.toFixed(1)}px, 0)`;\n\n // Get button styles\n const styles = getButtonStyles(config.type, isPressed, console);\n\n // Shape handling\n let borderRadius = '50%'; // Default circle\n let width = `${config.size}px`;\n // Aspect ratio adjustments for non-circle shapes\n if (config.shape === 'pill') {\n borderRadius = '20px';\n width = `${config.size * 1.8}px`; // Wider\n } else if (config.shape === 'rect') {\n borderRadius = '8px';\n width = `${config.size * 2.5}px`; // Much wider (shoulders)\n } else if (config.shape === 'square') {\n borderRadius = '12px';\n } else {\n // Default to circle, but check type if shape not explicitly set\n // A/B/X/Y/C/D/Z are typically circles\n // L/R are typically rects or specialized shapes\n if (['l', 'r', 'l2', 'r2'].includes(config.type)) {\n borderRadius = '10px';\n width = `${config.size * 2}px`;\n }\n }\n\n\n\n return (\n <button\n ref={buttonRef}\n className={`\n absolute flex items-center justify-center\n font-heading font-bold uppercase tracking-wider\n transition-all duration-75 select-none\n pointer-events-auto touch-manipulation\n backdrop-blur-sm\n ${isPressed ? '' : `${styles.bg} ${styles.border} ${styles.shadow}`} \n ${styles.text}\n active:shadow-none\n `}\n style={{\n top: 0,\n left: 0,\n transform: transform + (isPressed ? ' scale(0.95)' : ''),\n willChange: 'transform',\n width: width,\n height: `${config.size}px`, // Height stays consistent\n minWidth: `${config.size}px`,\n fontSize: config.size < 50 ? '11px' : '16px',\n borderRadius,\n borderWidth: isPressed ? '0px' : '1.5px', // slightly thicker border\n lineHeight: '1',\n // Semi-transparent in landscape mode\n opacity: isLandscape ? 0.85 : 1,\n WebkitTouchCallout: 'none',\n WebkitUserSelect: 'none',\n userSelect: 'none',\n // Direct style overrides if needed from getButtonStyles (for exact hex colors)\n backgroundColor: isPressed ? styles.bg.startsWith('bg-') ? undefined : styles.bg : styles.bg.startsWith('bg-') ? undefined : styles.bg,\n borderColor: isPressed ? undefined : styles.border.startsWith('border-') ? undefined : styles.border,\n color: styles.text.startsWith('text-') ? undefined : styles.text,\n }}\n aria-label={label}\n onContextMenu={(e) => e.preventDefault()}\n >\n {/* Icon rendering logic could go here, for now using label */}\n <span className=\"drop-shadow-md\">{label}</span>\n </button>\n );\n});\n\nexport default VirtualButton;\n","/**\n * Unified Control System Types\n * \n * Single source of truth for all control-related type definitions.\n */\n\n/**\n * All possible button identifiers (superset of all consoles)\n */\nexport type ButtonId =\n | 'up' | 'down' | 'left' | 'right' // D-pad\n | 'a' | 'b' | 'x' | 'y' // Face buttons (standard RetroPad)\n | 'l' | 'r' // Shoulder buttons\n | 'l2' | 'r2' // Triggers (PS1, Saturn, etc.)\n | 'l3' | 'r3' // Stick clicks (PS1 analog)\n | 'start' | 'select'; // System buttons\n\n/**\n * D-pad buttons\n */\nexport const DPAD_BUTTONS: ButtonId[] = ['up', 'down', 'left', 'right'];\n\n/**\n * Face buttons\n */\nexport const FACE_BUTTONS: ButtonId[] = ['a', 'b', 'x', 'y'];\n\n/**\n * Shoulder buttons (L/R only)\n */\nexport const SHOULDER_BUTTONS: ButtonId[] = ['l', 'r'];\n\n/**\n * Trigger buttons (L2/R2)\n */\nexport const TRIGGER_BUTTONS: ButtonId[] = ['l2', 'r2'];\n\n/**\n * Stick click buttons\n */\nexport const STICK_BUTTONS: ButtonId[] = ['l3', 'r3'];\n\n/**\n * System buttons\n */\nexport const SYSTEM_BUTTONS: ButtonId[] = ['start', 'select'];\n\n/**\n * All buttons in display order\n */\nexport const ALL_BUTTONS: ButtonId[] = [\n ...DPAD_BUTTONS,\n ...FACE_BUTTONS,\n ...SHOULDER_BUTTONS,\n ...TRIGGER_BUTTONS,\n ...STICK_BUTTONS,\n ...SYSTEM_BUTTONS,\n];\n\n/**\n * Keyboard mapping: button → JavaScript KeyboardEvent.code\n * Partial because not all consoles have all buttons\n */\nexport type KeyboardMapping = Partial<Record<ButtonId, string>>;\n\nexport type ControlMapping = KeyboardMapping;\n\n/**\n * Gamepad mapping: button → physical button index (W3C Gamepad API)\n * Partial because users may not map all buttons\n */\nexport type GamepadMapping = Partial<Record<ButtonId, number>>;\n\n/**\n * Which buttons a console actually has\n */\nexport interface ConsoleCapabilities {\n /** Console key (e.g., 'NES', 'SNES') */\n console: string;\n /** List of buttons this console supports */\n buttons: ButtonId[];\n}\n\n/**\n * Information about a connected gamepad\n */\nexport interface GamepadInfo {\n /** Gamepad index (0-3) */\n index: number;\n /** Raw gamepad identifier string */\n id: string;\n /** Cleaned up display name */\n name: string;\n /** Whether currently connected */\n connected: boolean;\n /** Number of buttons */\n buttons: number;\n /** Number of axes */\n axes: number;\n /** Mapping type from Gamepad API */\n mapping: GamepadMappingType;\n}\n\n/**\n * Detected controller brand for UI theming\n */\nexport type ControllerBrand = 'xbox' | 'playstation' | 'nintendo' | 'generic';\n\n/**\n * Player index (1-4)\n */\nexport type PlayerIndex = 1 | 2 | 3 | 4;\n\n/**\n * Full control configuration for the emulator\n */\nexport interface ControlConfig {\n /** Keyboard controls (usually player 1 only) */\n keyboard?: KeyboardMapping;\n /** Gamepad controls per player */\n gamepads?: GamepadMapping[];\n}\n","/**\n * Default Control Mappings\n * \n * Single source of truth for all default button mappings.\n */\n\nimport { ButtonId, KeyboardMapping, GamepadMapping } from './types';\n\n/**\n * Standard W3C Gamepad API button indices\n * https://w3c.github.io/gamepad/#remapping\n */\nexport const STANDARD_GAMEPAD_BUTTONS: Record<ButtonId, number> = {\n // Face buttons (Xbox/PlayStation layout)\n a: 0, // A / Cross (bottom)\n b: 1, // B / Circle (right)\n x: 2, // X / Square (left)\n y: 3, // Y / Triangle (top)\n\n // Shoulders\n l: 4, // LB / L1\n r: 5, // RB / R1\n\n // Triggers\n l2: 6, // LT / L2\n r2: 7, // RT / R2\n\n // System\n select: 8, // Back / Select / Share\n start: 9, // Start / Options\n\n // Stick clicks\n l3: 10, // Left stick click\n r3: 11, // Right stick click\n\n // D-pad\n up: 12,\n down: 13,\n left: 14,\n right: 15,\n};\n\n/**\n * Default keyboard mapping (SNES-like, works for most consoles)\n */\nexport const DEFAULT_KEYBOARD: KeyboardMapping = {\n // D-pad → Arrow keys\n up: 'ArrowUp',\n down: 'ArrowDown',\n left: 'ArrowLeft',\n right: 'ArrowRight',\n\n // Face buttons → ZXAS cluster (natural hand position)\n a: 'KeyX', // Primary action (right side)\n b: 'KeyZ', // Secondary action (left side)\n x: 'KeyS', // Top right\n y: 'KeyA', // Top left\n\n // Shoulders → Q/W\n l: 'KeyQ',\n r: 'KeyW',\n\n // Triggers → E/R (for PS1/Saturn)\n l2: 'KeyE',\n r2: 'KeyR',\n\n // Stick clicks → 1/2 (rarely used)\n l3: 'Digit1',\n r3: 'Digit2',\n\n // System\n start: 'Enter',\n select: 'ShiftRight',\n};\n\n/**\n * Default gamepad mapping (uses standard W3C indices)\n */\nexport const DEFAULT_GAMEPAD: GamepadMapping = { ...STANDARD_GAMEPAD_BUTTONS };\n\n/**\n * Get a complete keyboard mapping with all buttons filled in\n * Uses defaults for any missing buttons\n */\nexport function getFullKeyboardMapping(partial?: Partial<KeyboardMapping>): KeyboardMapping {\n return { ...DEFAULT_KEYBOARD, ...partial };\n}\n\n/**\n * Get a complete gamepad mapping with all buttons filled in\n * Uses defaults for any missing buttons\n */\nexport function getFullGamepadMapping(partial?: Partial<GamepadMapping>): GamepadMapping {\n return { ...DEFAULT_GAMEPAD, ...partial };\n}\n","/**\n * Button Labels for UI Display\n * \n * Single source of truth for button display names.\n */\n\nimport { ButtonId } from './types';\n\n/**\n * Human-readable labels for each button\n */\nexport const BUTTON_LABELS: Record<ButtonId, string> = {\n // D-pad\n up: 'D-Pad Up',\n down: 'D-Pad Down',\n left: 'D-Pad Left',\n right: 'D-Pad Right',\n\n // Face buttons\n a: 'A Button',\n b: 'B Button',\n x: 'X Button',\n y: 'Y Button',\n\n // Shoulders\n l: 'L Shoulder',\n r: 'R Shoulder',\n\n // Triggers\n l2: 'L Trigger',\n r2: 'R Trigger',\n\n // Stick clicks\n l3: 'L Stick Click',\n r3: 'R Stick Click',\n\n // System\n start: 'Start',\n select: 'Select',\n};\n\n/**\n * Button groups for organized UI display\n */\nexport const BUTTON_GROUPS = [\n { label: 'Movement', buttons: ['up', 'down', 'left', 'right'] as ButtonId[] },\n { label: 'Face Buttons', buttons: ['a', 'b', 'x', 'y'] as ButtonId[] },\n { label: 'Shoulders', buttons: ['l', 'r'] as ButtonId[] },\n { label: 'Triggers', buttons: ['l2', 'r2'] as ButtonId[] },\n { label: 'System', buttons: ['start', 'select'] as ButtonId[] },\n];\n\n/**\n * Format a JavaScript key code for display\n */\nexport function formatKeyCode(code: string): string {\n if (code.startsWith('Key')) return code.slice(3);\n if (code.startsWith('Digit')) return code.slice(5);\n if (code === 'ArrowUp') return '↑';\n if (code === 'ArrowDown') return '↓';\n if (code === 'ArrowLeft') return '←';\n if (code === 'ArrowRight') return '→';\n if (code === 'Space') return 'Space';\n if (code === 'ShiftLeft' || code === 'ShiftRight') return 'Shift';\n if (code === 'ControlLeft' || code === 'ControlRight') return 'Ctrl';\n if (code === 'AltLeft' || code === 'AltRight') return 'Alt';\n if (code === 'Enter') return 'Enter';\n if (code === 'Tab') return 'Tab';\n if (code === 'Escape') return 'Esc';\n return code;\n}\n\n/**\n * Get human-readable name for a gamepad button index\n */\nexport function formatGamepadButton(index: number | undefined): string {\n if (index === undefined) return '—';\n\n const names: Record<number, string> = {\n 0: 'A / ✕',\n 1: 'B / ○',\n 2: 'X / □',\n 3: 'Y / △',\n 4: 'LB / L1',\n 5: 'RB / R1',\n 6: 'LT / L2',\n 7: 'RT / R2',\n 8: 'Back / Share',\n 9: 'Start / Options',\n 10: 'L3',\n 11: 'R3',\n 12: 'D-Up',\n 13: 'D-Down',\n 14: 'D-Left',\n 15: 'D-Right',\n 16: 'Home',\n };\n\n return names[index] ?? `Btn ${index}`;\n}\n","/**\n * Per-Console Control Presets\n * \n * Defines which buttons each console supports and\n * console-specific default keyboard layouts.\n */\n\nimport { ButtonId, KeyboardMapping, ConsoleCapabilities, DPAD_BUTTONS } from './types';\nimport { DEFAULT_KEYBOARD } from './defaults';\n\n/**\n * Console capabilities - which buttons each system has\n */\nexport const CONSOLE_CAPABILITIES: Record<string, ConsoleCapabilities> = {\n // ============ Nintendo ============\n NES: {\n console: 'NES',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start', 'select'],\n },\n SNES: {\n console: 'SNES',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'x', 'y', 'l', 'r', 'start', 'select'],\n },\n N64: {\n console: 'N64',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'l', 'r', 'start'], // No select, has Z trigger (mapped to l2)\n },\n GB: {\n console: 'GB',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start', 'select'],\n },\n GBC: {\n console: 'GBC',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start', 'select'],\n },\n GBA: {\n console: 'GBA',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'l', 'r', 'start', 'select'],\n },\n\n // ============ Sega ============\n SMS: {\n console: 'SMS',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start'], // 1, 2, Pause\n },\n GENESIS: {\n console: 'GENESIS',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'x', 'y', 'l', 'r', 'start'], // 6-button: A/B/C + X/Y/Z\n },\n GG: {\n console: 'GG',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start'],\n },\n SATURN: {\n console: 'SATURN',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'x', 'y', 'l', 'r', 'l2', 'r2', 'start'], // Full 8-button\n },\n\n // ============ Sony ============\n PS1: {\n console: 'PS1',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'x', 'y', 'l', 'r', 'l2', 'r2', 'l3', 'r3', 'start', 'select'],\n },\n\n // ============ NEC ============\n PCE: {\n console: 'PCE', // TurboGrafx-16\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start', 'select'], // I, II, Run, Select\n },\n\n // ============ Atari ============\n ATARI2600: {\n console: 'ATARI2600',\n buttons: [...DPAD_BUTTONS, 'a', 'select'], // Fire, Select/Reset\n },\n ATARI7800: {\n console: 'ATARI7800',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'select'],\n },\n LYNX: {\n console: 'LYNX',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start', 'select'], // A, B, Option 1, Option 2\n },\n\n // ============ SNK ============\n NGPC: {\n console: 'NGPC', // Neo Geo Pocket\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'start', 'select'],\n },\n\n // ============ Other ============\n WSC: {\n console: 'WSC', // WonderSwan\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'x', 'y', 'start'],\n },\n ARCADE: {\n console: 'ARCADE',\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'x', 'y', 'l', 'r', 'start', 'select'], // Generic 6-button\n },\n};\n\n/**\n * Console-specific keyboard overrides\n * Only specify keys that differ from DEFAULT_KEYBOARD\n */\nexport const CONSOLE_KEYBOARD_OVERRIDES: Partial<Record<string, Partial<KeyboardMapping>>> = {\n // N64: Remap select since N64 has no select button\n N64: {\n select: 'KeyC', // Free up ShiftRight\n l2: 'KeyQ', // Z trigger\n },\n\n // Genesis: Different layout for 6-button pad\n GENESIS: {\n // Genesis A/B/C maps to our a/b/x (C is like a third action button)\n // Genesis X/Y/Z maps to our y/l/r\n x: 'KeyC', // C button\n y: 'KeyA', // X button\n l: 'KeyS', // Y button\n r: 'KeyD', // Z button\n },\n\n // Atari: Simple fire button\n ATARI2600: {\n select: 'Tab', // Select/Reset\n start: 'KeyR', // Reset\n },\n ATARI7800: {\n select: 'Tab',\n start: 'KeyR',\n },\n};\n\n/**\n * Get capabilities for a console\n * Falls back to SNES-like if unknown\n */\nexport function getConsoleCapabilities(system: string): ConsoleCapabilities {\n const normalized = system.toUpperCase();\n return CONSOLE_CAPABILITIES[normalized] ?? {\n console: normalized,\n buttons: [...DPAD_BUTTONS, 'a', 'b', 'x', 'y', 'l', 'r', 'start', 'select'],\n };\n}\n\n/**\n * Get the list of buttons for a console\n */\nexport function getConsoleButtons(system: string): ButtonId[] {\n return getConsoleCapabilities(system).buttons;\n}\n\n/**\n * Get default keyboard mapping for a console\n * Merges console-specific overrides with defaults\n */\nexport function getConsoleKeyboardDefaults(system: string): KeyboardMapping {\n const normalized = system.toUpperCase();\n const overrides = CONSOLE_KEYBOARD_OVERRIDES[normalized] ?? {};\n const capabilities = getConsoleCapabilities(system);\n\n // Start with defaults, apply overrides, filter to only supported buttons\n const full = { ...DEFAULT_KEYBOARD, ...overrides };\n\n // Only include buttons this console actually has\n const filtered: KeyboardMapping = {};\n for (const button of capabilities.buttons) {\n if (full[button]) {\n filtered[button] = full[button];\n }\n }\n\n return filtered;\n}\n\n/**\n * Check if a console supports a specific button\n */\nexport function consoleHasButton(system: string, button: ButtonId): boolean {\n return getConsoleButtons(system).includes(button);\n}\n","/**\n * Control Storage Utilities\n * \n * Load and save keyboard/gamepad mappings from localStorage.\n */\n\nimport { KeyboardMapping, GamepadMapping, PlayerIndex } from './types';\nimport { DEFAULT_KEYBOARD, DEFAULT_GAMEPAD } from './defaults';\nimport { getConsoleKeyboardDefaults } from './presets';\n\n// Storage key prefixes\nconst KEYBOARD_KEY_PREFIX = 'retrosaga-controls';\nconst GAMEPAD_KEY_PREFIX = 'retrosaga-gamepad';\n\n/**\n * Get localStorage key for keyboard controls\n * Per-system storage: retrosaga-controls-NES, retrosaga-controls-SNES, etc.\n */\nfunction getKeyboardStorageKey(system?: string): string {\n if (system) {\n return `${KEYBOARD_KEY_PREFIX}-${system.toUpperCase()}`;\n }\n return KEYBOARD_KEY_PREFIX; // Legacy global key\n}\n\n/**\n * Get localStorage key for gamepad bindings\n * Per-player storage: retrosaga-gamepad-p1, retrosaga-gamepad-p2, etc.\n */\nfunction getGamepadStorageKey(playerIndex: PlayerIndex): string {\n return `${GAMEPAD_KEY_PREFIX}-p${playerIndex}`;\n}\n\n/**\n * Load keyboard mapping from localStorage\n * Falls back to console-specific defaults if not found\n */\nexport function loadKeyboardMapping(system?: string): KeyboardMapping {\n if (typeof window === 'undefined' || !window.localStorage) {\n return system ? getConsoleKeyboardDefaults(system) : DEFAULT_KEYBOARD;\n }\n\n const storageKey = getKeyboardStorageKey(system);\n\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n return JSON.parse(stored) as KeyboardMapping;\n }\n\n // Fallback: check legacy global key\n if (system) {\n const legacyStored = localStorage.getItem(KEYBOARD_KEY_PREFIX);\n if (legacyStored) {\n return JSON.parse(legacyStored) as KeyboardMapping;\n }\n }\n } catch (e) {\n console.error('[Controls] Failed to load keyboard mapping:', e);\n }\n\n // Return console-specific defaults\n return system ? getConsoleKeyboardDefaults(system) : DEFAULT_KEYBOARD;\n}\n\n/**\n * Save keyboard mapping to localStorage\n */\nexport function saveKeyboardMapping(mapping: KeyboardMapping, system?: string): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n console.warn('[Controls] localStorage not available');\n return;\n }\n\n const storageKey = getKeyboardStorageKey(system);\n\n try {\n localStorage.setItem(storageKey, JSON.stringify(mapping));\n } catch (e) {\n console.error('[Controls] Failed to save keyboard mapping:', e);\n }\n}\n\n/**\n * Load gamepad mapping from localStorage\n * Falls back to standard defaults if not found\n */\nexport function loadGamepadMapping(playerIndex: PlayerIndex = 1): GamepadMapping {\n if (typeof window === 'undefined' || !window.localStorage) {\n return { ...DEFAULT_GAMEPAD };\n }\n\n const storageKey = getGamepadStorageKey(playerIndex);\n\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n return JSON.parse(stored) as GamepadMapping;\n }\n } catch (e) {\n console.error('[Controls] Failed to load gamepad mapping:', e);\n }\n\n return { ...DEFAULT_GAMEPAD };\n}\n\n/**\n * Save gamepad mapping to localStorage\n */\nexport function saveGamepadMapping(mapping: GamepadMapping, playerIndex: PlayerIndex = 1): void {\n if (typeof window === 'undefined' || !window.localStorage) {\n console.warn('[Controls] localStorage not available');\n return;\n }\n\n const storageKey = getGamepadStorageKey(playerIndex);\n\n try {\n localStorage.setItem(storageKey, JSON.stringify(mapping));\n } catch (e) {\n console.error('[Controls] Failed to save gamepad mapping:', e);\n }\n}\n\n/**\n * Load all gamepad mappings for connected players\n */\nexport function loadAllGamepadMappings(playerCount: number): GamepadMapping[] {\n const mappings: GamepadMapping[] = [];\n for (let i = 1; i <= Math.min(playerCount, 4); i++) {\n mappings.push(loadGamepadMapping(i as PlayerIndex));\n }\n return mappings;\n}\n\n/**\n * Clear all saved controls (keyboard and gamepad)\n */\nexport function clearAllControls(): void {\n if (typeof window === 'undefined' || !window.localStorage) return;\n\n // Clear keyboard\n const keysToRemove: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(KEYBOARD_KEY_PREFIX) || key?.startsWith(GAMEPAD_KEY_PREFIX)) {\n keysToRemove.push(key);\n }\n }\n keysToRemove.forEach(key => localStorage.removeItem(key));\n}\n","/**\n * RetroArch Input Configuration\n * \n * Converts our control mappings to RetroArch config format.\n */\n\nimport { ButtonId, KeyboardMapping, GamepadMapping, ControlConfig } from './types';\n\n/**\n * Map JavaScript KeyboardEvent.code to RetroArch key names\n * RetroArch uses lowercase key names without prefixes\n */\nconst JS_TO_RETROARCH_KEY: Record<string, string> = {\n // Letters\n KeyA: 'a', KeyB: 'b', KeyC: 'c', KeyD: 'd', KeyE: 'e', KeyF: 'f',\n KeyG: 'g', KeyH: 'h', KeyI: 'i', KeyJ: 'j', KeyK: 'k', KeyL: 'l',\n KeyM: 'm', KeyN: 'n', KeyO: 'o', KeyP: 'p', KeyQ: 'q', KeyR: 'r',\n KeyS: 's', KeyT: 't', KeyU: 'u', KeyV: 'v', KeyW: 'w', KeyX: 'x',\n KeyY: 'y', KeyZ: 'z',\n\n // Numbers\n Digit0: 'num0', Digit1: 'num1', Digit2: 'num2', Digit3: 'num3',\n Digit4: 'num4', Digit5: 'num5', Digit6: 'num6', Digit7: 'num7',\n Digit8: 'num8', Digit9: 'num9',\n\n // Numpad\n Numpad0: 'kp0', Numpad1: 'kp1', Numpad2: 'kp2', Numpad3: 'kp3',\n Numpad4: 'kp4', Numpad5: 'kp5', Numpad6: 'kp6', Numpad7: 'kp7',\n Numpad8: 'kp8', Numpad9: 'kp9',\n NumpadEnter: 'kp_enter', NumpadAdd: 'kp_plus', NumpadSubtract: 'kp_minus',\n NumpadMultiply: 'kp_multiply', NumpadDivide: 'kp_divide', NumpadDecimal: 'kp_period',\n\n // Arrow keys\n ArrowUp: 'up', ArrowDown: 'down', ArrowLeft: 'left', ArrowRight: 'right',\n\n // Modifiers\n ShiftLeft: 'shift', ShiftRight: 'rshift',\n ControlLeft: 'ctrl', ControlRight: 'rctrl',\n AltLeft: 'alt', AltRight: 'ralt',\n\n // Special keys\n Enter: 'enter', Space: 'space', Tab: 'tab', Escape: 'escape',\n Backspace: 'backspace', Delete: 'del', Insert: 'insert',\n Home: 'home', End: 'end', PageUp: 'pageup', PageDown: 'pagedown',\n\n // Function keys\n F1: 'f1', F2: 'f2', F3: 'f3', F4: 'f4', F5: 'f5', F6: 'f6',\n F7: 'f7', F8: 'f8', F9: 'f9', F10: 'f10', F11: 'f11', F12: 'f12',\n\n // Punctuation\n Comma: 'comma', Period: 'period', Slash: 'slash', Backslash: 'backslash',\n BracketLeft: 'leftbracket', BracketRight: 'rightbracket',\n Semicolon: 'semicolon', Quote: 'apostrophe', Backquote: 'backquote',\n Minus: 'minus', Equal: 'equals',\n};\n\n/**\n * Map our button IDs to RetroArch input names\n */\nconst BUTTON_TO_RETROARCH: Record<ButtonId, string> = {\n up: 'up',\n down: 'down',\n left: 'left',\n right: 'right',\n a: 'a',\n b: 'b',\n x: 'x',\n y: 'y',\n l: 'l',\n r: 'r',\n l2: 'l2',\n r2: 'r2',\n l3: 'l3',\n r3: 'r3',\n start: 'start',\n select: 'select',\n};\n\n/**\n * Convert a JS key code to RetroArch key name\n */\nfunction toRetroArchKey(jsKeyCode: string): string {\n return JS_TO_RETROARCH_KEY[jsKeyCode] || jsKeyCode.toLowerCase();\n}\n\n/**\n * Convert keyboard mapping to RetroArch config for a player\n */\nexport function keyboardToRetroArchConfig(\n mapping: KeyboardMapping,\n playerIndex: number = 1\n): Record<string, string> {\n const config: Record<string, string> = {};\n\n for (const [button, jsKeyCode] of Object.entries(mapping)) {\n const raButton = BUTTON_TO_RETROARCH[button as ButtonId];\n if (raButton && jsKeyCode) {\n const raKey = toRetroArchKey(jsKeyCode);\n config[`input_player${playerIndex}_${raButton}`] = raKey;\n }\n }\n\n return config;\n}\n\n/**\n * Convert gamepad mapping to RetroArch config for a player\n * Uses _btn suffix for button indices\n */\nexport function gamepadToRetroArchConfig(\n mapping: GamepadMapping,\n playerIndex: number = 1\n): Record<string, number | string> {\n const config: Record<string, number | string> = {};\n\n for (const [button, buttonIndex] of Object.entries(mapping)) {\n if (buttonIndex === undefined) continue;\n\n const raButton = BUTTON_TO_RETROARCH[button as ButtonId];\n if (raButton) {\n config[`input_player${playerIndex}_${raButton}_btn`] = buttonIndex;\n }\n }\n\n return config;\n}\n\n/**\n * Build complete RetroArch input config from control configuration\n */\nexport function buildRetroArchConfig(config: ControlConfig): Record<string, unknown> {\n const raConfig: Record<string, unknown> = {};\n\n // Keyboard controls (player 1 only)\n if (config.keyboard) {\n Object.assign(raConfig, keyboardToRetroArchConfig(config.keyboard, 1));\n }\n\n // Gamepad controls for each player\n if (config.gamepads) {\n config.gamepads.forEach((mapping, index) => {\n if (mapping) {\n Object.assign(raConfig, gamepadToRetroArchConfig(mapping, index + 1));\n }\n });\n }\n\n // Enable analog stick → D-pad for all players\n raConfig.input_player1_analog_dpad_mode = 1;\n raConfig.input_player2_analog_dpad_mode = 1;\n raConfig.input_player3_analog_dpad_mode = 1;\n raConfig.input_player4_analog_dpad_mode = 1;\n\n return raConfig;\n}\n","import { SpeedMultiplier } from '../hooks/useNostalgist';\nimport { ShaderPresetId } from '../lib/shader-presets';\n// Re-export from unified controls module for backwards compatibility\nimport { KeyboardMapping, DEFAULT_KEYBOARD } from '../lib/controls';\nimport { RACredentials, RAGameExtended, RAAchievement } from '../lib/retroachievements';\nimport { KoinTranslations, RecursivePartial } from '../locales/types';\n\nexport interface SaveSlot {\n slot: number;\n timestamp: string;\n size: number;\n screenshot?: string | null;\n}\n\n/**\n * @deprecated Use `KeyboardMapping` from `@/lib/controls` instead\n */\nexport type ControlMapping = KeyboardMapping;\n\n/**\n * @deprecated Use `DEFAULT_KEYBOARD` from `@/lib/controls` instead\n */\nexport const DEFAULT_CONTROLS = DEFAULT_KEYBOARD;\n\nexport interface GamePlayerProps {\n className?: string;\n style?: React.CSSProperties;\n romId: string;\n romUrl: string;\n romFileName?: string;\n system: string;\n title: string;\n core?: string;\n biosUrl?: string | { url: string; name: string; location?: 'system' | 'rom_folder' };\n\n // Manual BIOS Selection\n availableBios?: { id: string; name: string; description?: string }[];\n currentBiosId?: string;\n onSelectBios?: (biosId: string) => void;\n\n onReady?: () => void;\n onError?: (error: Error) => void;\n onExit?: () => void;\n systemColor?: string; // Console-specific color for theming\n shader?: string; // CRT shader preset (e.g., 'crt/crt-lottes')\n onShaderChange?: (shader: string, requiresRestart: boolean) => void; // Called when user changes shader mid-game\n initialSlot?: number; // Auto-load save from this slot on start\n\n // Save/Load Handlers\n onSaveState?: (slot: number, blob: Blob, screenshot?: string) => Promise<void>;\n onLoadState?: (slot: number) => Promise<Blob | null>;\n onAutoSave?: (blob: Blob, screenshot?: string) => Promise<void>;\n onGetSaveSlots?: () => Promise<SaveSlot[]>;\n onDeleteSaveState?: (slot: number) => Promise<void>;\n initialSaveState?: Blob;\n onScreenshotCaptured?: (image: string | Blob) => void;\n autoSaveInterval?: number; // Time in ms for auto-save (default: 60000)\n\n // Tier Limits\n maxSlots?: number;\n currentTier?: string;\n onUpgrade?: () => void;\n\n // RetroAchievements\n retroAchievementsConfig?: {\n username: string;\n token: string; // User token, not password\n hardcore?: boolean;\n };\n\n // Cheats\n cheats?: Cheat[];\n onToggleCheat?: (cheatId: number, active: boolean) => void;\n\n // Session Management\n onSessionStart?: () => void;\n onSessionEnd?: () => void;\n\n // RetroAchievements UI\n raUser?: RACredentials | null;\n raGame?: RAGameExtended | null;\n raAchievements?: RAAchievement[];\n raUnlockedAchievements?: Set<number>;\n raIsLoading?: boolean;\n raError?: string | null;\n onRALogin?: (username: string, password: string) => Promise<boolean>;\n onRALogout?: () => void;\n onRAHardcoreChange?: (enabled: boolean) => void;\n\n // Internationalization\n translations?: RecursivePartial<KoinTranslations>;\n}\n\nexport interface PlayerControlsProps {\n isPaused: boolean;\n isRunning: boolean; // Whether the game is actually running (vs ready/loading)\n speed: SpeedMultiplier;\n isRewinding: boolean;\n rewindBufferSize: number; // Number of states in rewind buffer\n onPauseToggle: () => void;\n onRestart: () => void;\n onSave: () => void;\n onLoad: () => void;\n onSpeedChange: (speed: SpeedMultiplier) => void;\n onRewindStart: () => void;\n onRewindStop: () => void;\n onScreenshot: () => void;\n onFullscreen: () => void;\n onControls: () => void;\n onCheats: () => void;\n onRetroAchievements: () => void;\n onExit: () => void;\n disabled?: boolean;\n // Hardcore mode restrictions\n hardcoreRestrictions?: RAHardcodeRestrictions;\n raConnected?: boolean;\n raGameFound?: boolean;\n raAchievementCount?: number;\n raIsIdentifying?: boolean;\n // Auto-save indicator\n autoSaveEnabled?: boolean;\n autoSaveProgress?: number; // 0-100, percentage until next auto-save\n autoSaveState?: 'idle' | 'counting' | 'saving' | 'done';\n autoSavePaused?: boolean; // User manually paused auto-save\n onAutoSaveToggle?: () => void; // Toggle auto-save pause\n systemColor?: string; // Console-specific color for theming\n // Gamepad indicator\n gamepadCount?: number; // Number of connected gamepads\n onGamepadSettings?: () => void; // Open gamepad settings modal\n onSettings?: () => void;\n // Volume controls\n volume?: number; // 0-100\n isMuted?: boolean;\n onVolumeChange?: (volume: number) => void;\n onToggleMute?: () => void;\n onShowShortcuts?: () => void; // Toggle shortcuts panel\n // Recording\n onRecordToggle?: () => void;\n isRecording?: boolean;\n // Shader controls\n currentShader?: ShaderPresetId;\n onShaderChange?: (shader: ShaderPresetId, requiresRestart: boolean) => void;\n}\n\nexport interface SaveSlotModalProps {\n isOpen: boolean;\n mode: 'save' | 'load';\n slots: SaveSlot[];\n isLoading: boolean;\n actioningSlot?: number | null;\n onSelect: (slot: number) => void;\n onDelete: (slot: number) => void;\n onClose: () => void;\n // Tier limits for save slots\n maxSlots?: number; // -1 for unlimited\n currentTier?: string;\n onUpgrade?: () => void;\n}\n\nexport interface ControlMapperProps {\n isOpen: boolean;\n controls: ControlMapping;\n onSave: (controls: ControlMapping) => void;\n onClose: () => void;\n system?: string; // Console type for showing only relevant buttons\n}\n\nexport interface CheatModalProps {\n isOpen: boolean;\n cheats: Cheat[];\n activeCheats: Set<number>;\n onToggle: (cheatId: number) => void;\n onClose: () => void;\n}\n\nexport interface Cheat {\n id: number;\n code: string;\n description: string;\n}\n\n// Toast interface removed to avoid duplication with useToast hook\n\n// RetroAchievements types\nexport interface RAHardcodeRestrictions {\n isHardcore?: boolean;\n canUseSaveStates: boolean;\n canUseRewind: boolean;\n canUseCheats: boolean;\n canUseSlowMotion: boolean;\n}\n","/**\n * Utilities for dispatching keyboard events to the emulator canvas\n */\n\nimport { ControlMapping, DEFAULT_CONTROLS } from '../../types';\n\n/**\n * Get keyboard code for a button type from controls mapping\n */\nexport function getKeyboardCode(\n buttonType: string,\n controls?: ControlMapping\n): string | null {\n const key = buttonType as keyof ControlMapping;\n\n if (controls && key in controls && controls[key]) {\n return controls[key]!;\n }\n\n return DEFAULT_CONTROLS[key] ?? null;\n}\n\n/**\n * Derive key name from keyboard code\n */\nexport function getKeyName(code: string): string {\n if (code.startsWith('Key')) return code.slice(3).toLowerCase();\n if (code.startsWith('Arrow')) return code.slice(5);\n if (code === 'Enter') return 'Enter';\n if (code === 'ShiftRight' || code === 'ShiftLeft') return 'Shift';\n return code;\n}\n\n/**\n * Find the emulator canvas element\n */\nexport function getCanvas(): HTMLCanvasElement | null {\n return document.querySelector('.game-canvas-container canvas') as HTMLCanvasElement ||\n document.querySelector('canvas') as HTMLCanvasElement;\n}\n\n/**\n * Dispatch a keyboard event to the emulator canvas\n */\nexport function dispatchKeyboardEvent(\n type: 'keydown' | 'keyup',\n code: string\n): boolean {\n const canvas = getCanvas();\n if (!canvas) {\n return false;\n }\n\n const event = new KeyboardEvent(type, {\n code,\n key: getKeyName(code),\n bubbles: true,\n cancelable: true,\n });\n canvas.dispatchEvent(event);\n return true;\n}\n\n","'use client';\n\nimport React, { useRef, useCallback, useEffect, useState } from 'react';\nimport { dispatchKeyboardEvent } from './utils/keyboardEvents';\nimport { ControlMapping } from '../../lib/controls/types';\n\ninterface DpadProps {\n size?: number;\n x: number;\n y: number;\n containerWidth: number;\n containerHeight: number;\n controls?: ControlMapping;\n systemColor?: string;\n isLandscape?: boolean;\n customPosition?: { x: number; y: number } | null;\n onPositionChange?: (x: number, y: number) => void;\n}\n\ntype Direction = 'up' | 'down' | 'left' | 'right';\n\nconst DRAG_HOLD_DELAY = 350; // ms to hold before drag mode\nconst CENTER_TOUCH_RADIUS = 0.25; // 25% of size - touch area for drag activation\n\n/**\n * Premium D-pad component with drag repositioning\n * - Long-press center to drag\n * - Glassmorphism aesthetics\n * - Individual direction highlighting with glow\n */\nconst Dpad = React.memo(function Dpad({\n size = 180,\n x,\n y,\n containerWidth,\n containerHeight,\n controls,\n systemColor = '#00FF41',\n isLandscape = false,\n customPosition,\n onPositionChange,\n}: DpadProps) {\n const dpadRef = useRef<HTMLDivElement>(null);\n const activeTouchRef = useRef<number | null>(null);\n const activeDirectionsRef = useRef<Set<Direction>>(new Set());\n\n // Drag state\n const [isDragging, setIsDragging] = useState(false);\n const dragTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const dragStartRef = useRef({ x: 0, y: 0, touchX: 0, touchY: 0 });\n const touchStartPosRef = useRef({ x: 0, y: 0, time: 0 });\n\n // Refs for visual elements\n const upPathRef = useRef<SVGPathElement>(null);\n const downPathRef = useRef<SVGPathElement>(null);\n const leftPathRef = useRef<SVGPathElement>(null);\n const rightPathRef = useRef<SVGPathElement>(null);\n const centerCircleRef = useRef<SVGCircleElement>(null);\n\n // Use custom position if provided, otherwise defaults\n const displayX = customPosition ? customPosition.x : x;\n const displayY = customPosition ? customPosition.y : y;\n\n const getKeyCode = useCallback((direction: Direction): string => {\n if (!controls) {\n const defaults: Record<Direction, string> = {\n up: 'ArrowUp',\n down: 'ArrowDown',\n left: 'ArrowLeft',\n right: 'ArrowRight',\n };\n return defaults[direction];\n }\n return controls[direction] || '';\n }, [controls]);\n\n const getDirectionsFromTouch = useCallback((touchX: number, touchY: number, rect: DOMRect): Set<Direction> => {\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const dx = touchX - centerX;\n const dy = touchY - centerY;\n const distance = Math.sqrt(dx * dx + dy * dy);\n const deadZone = (rect.width / 2) * 0.15;\n\n if (distance < deadZone) return new Set();\n\n const directions = new Set<Direction>();\n const angle = Math.atan2(dy, dx) * (180 / Math.PI);\n\n if (angle >= -150 && angle <= -30) directions.add('up');\n if (angle >= 30 && angle <= 150) directions.add('down');\n if (angle >= 120 || angle <= -120) directions.add('left');\n if (angle >= -60 && angle <= 60) directions.add('right');\n\n return directions;\n }, []);\n\n const updateVisuals = useCallback((directions: Set<Direction>) => {\n const activeFill = `${systemColor}80`;\n const inactiveFill = 'rgba(255, 255, 255, 0.05)';\n const activeStroke = systemColor;\n const inactiveStroke = 'rgba(255, 255, 255, 0.2)';\n const glow = `0 0 15px ${systemColor}`;\n\n const updatePart = (ref: React.RefObject<SVGPathElement>, isActive: boolean) => {\n if (ref.current) {\n ref.current.style.fill = isActive ? activeFill : inactiveFill;\n ref.current.style.stroke = isActive ? activeStroke : inactiveStroke;\n ref.current.style.filter = isActive ? `drop-shadow(${glow})` : 'none';\n ref.current.style.transform = isActive ? 'scale(0.98)' : 'scale(1)';\n ref.current.style.transformOrigin = 'center';\n }\n };\n\n updatePart(upPathRef, directions.has('up'));\n updatePart(downPathRef, directions.has('down'));\n updatePart(leftPathRef, directions.has('left'));\n updatePart(rightPathRef, directions.has('right'));\n\n if (centerCircleRef.current) {\n const isAny = directions.size > 0;\n centerCircleRef.current.style.fill = isAny ? systemColor : 'rgba(0,0,0,0.5)';\n centerCircleRef.current.style.stroke = isAny ? '#fff' : 'rgba(255,255,255,0.3)';\n }\n }, [systemColor]);\n\n const updateDirections = useCallback((newDirections: Set<Direction>) => {\n const prev = activeDirectionsRef.current;\n\n prev.forEach(dir => {\n if (!newDirections.has(dir)) {\n const keyCode = getKeyCode(dir);\n if (keyCode) dispatchKeyboardEvent('keyup', keyCode);\n }\n });\n\n newDirections.forEach(dir => {\n if (!prev.has(dir)) {\n const keyCode = getKeyCode(dir);\n if (keyCode) {\n if (navigator.vibrate) navigator.vibrate(5);\n dispatchKeyboardEvent('keydown', keyCode);\n }\n }\n });\n\n activeDirectionsRef.current = newDirections;\n updateVisuals(newDirections);\n }, [getKeyCode, updateVisuals]);\n\n const clearDragTimer = useCallback(() => {\n if (dragTimerRef.current) {\n clearTimeout(dragTimerRef.current);\n dragTimerRef.current = null;\n }\n }, []);\n\n const startDragging = useCallback((touchX: number, touchY: number) => {\n setIsDragging(true);\n dragStartRef.current = {\n x: displayX,\n y: displayY,\n touchX,\n touchY,\n };\n // Release all directions when entering drag mode\n activeDirectionsRef.current.forEach(dir => {\n const keyCode = getKeyCode(dir);\n if (keyCode) dispatchKeyboardEvent('keyup', keyCode);\n });\n activeDirectionsRef.current = new Set();\n updateVisuals(new Set());\n\n if (navigator.vibrate) navigator.vibrate([10, 30, 10]); // Distinct drag feedback\n }, [displayX, displayY, getKeyCode, updateVisuals]);\n\n const handleTouchStart = useCallback((e: TouchEvent) => {\n e.preventDefault();\n if (activeTouchRef.current !== null) return;\n\n const touch = e.changedTouches[0];\n activeTouchRef.current = touch.identifier;\n touchStartPosRef.current = { x: touch.clientX, y: touch.clientY, time: Date.now() };\n\n const rect = dpadRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n // Check if touch is on center (for drag)\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const distFromCenter = Math.sqrt(\n Math.pow(touch.clientX - centerX, 2) +\n Math.pow(touch.clientY - centerY, 2)\n );\n const centerRadius = size * CENTER_TOUCH_RADIUS;\n\n if (distFromCenter < centerRadius && onPositionChange) {\n // Start drag timer for center touch\n dragTimerRef.current = setTimeout(() => {\n startDragging(touch.clientX, touch.clientY);\n }, DRAG_HOLD_DELAY);\n }\n\n // Normal direction detection\n if (!isDragging) {\n updateDirections(getDirectionsFromTouch(touch.clientX, touch.clientY, rect));\n }\n }, [getDirectionsFromTouch, updateDirections, isDragging, size, onPositionChange, startDragging]);\n\n const handleTouchMove = useCallback((e: TouchEvent) => {\n e.preventDefault();\n\n let touch: Touch | null = null;\n for (let i = 0; i < e.changedTouches.length; i++) {\n if (e.changedTouches[i].identifier === activeTouchRef.current) {\n touch = e.changedTouches[i];\n break;\n }\n }\n if (!touch) return;\n\n if (isDragging && onPositionChange) {\n // Handle drag movement\n const deltaX = touch.clientX - dragStartRef.current.touchX;\n const deltaY = touch.clientY - dragStartRef.current.touchY;\n\n const newXPercent = dragStartRef.current.x + (deltaX / containerWidth) * 100;\n const newYPercent = dragStartRef.current.y + (deltaY / containerHeight) * 100;\n\n // Constrain to screen bounds\n const margin = (size / 2 / Math.min(containerWidth, containerHeight)) * 100;\n const constrainedX = Math.max(margin, Math.min(100 - margin, newXPercent));\n const constrainedY = Math.max(margin, Math.min(100 - margin, newYPercent));\n\n onPositionChange(constrainedX, constrainedY);\n } else {\n // Check if moved significantly - cancel drag timer\n const moveDistance = Math.sqrt(\n Math.pow(touch.clientX - touchStartPosRef.current.x, 2) +\n Math.pow(touch.clientY - touchStartPosRef.current.y, 2)\n );\n if (moveDistance > 15) {\n clearDragTimer();\n }\n\n // Normal direction detection\n const rect = dpadRef.current?.getBoundingClientRect();\n if (rect) {\n updateDirections(getDirectionsFromTouch(touch.clientX, touch.clientY, rect));\n }\n }\n }, [isDragging, onPositionChange, containerWidth, containerHeight, size, getDirectionsFromTouch, updateDirections, clearDragTimer]);\n\n const handleTouchEnd = useCallback((e: TouchEvent) => {\n e.preventDefault();\n clearDragTimer();\n\n let touchEnded = false;\n for (let i = 0; i < e.changedTouches.length; i++) {\n if (e.changedTouches[i].identifier === activeTouchRef.current) {\n touchEnded = true;\n break;\n }\n }\n\n if (touchEnded) {\n activeTouchRef.current = null;\n\n if (isDragging) {\n setIsDragging(false);\n } else {\n // Release all directions\n activeDirectionsRef.current.forEach(dir => {\n const keyCode = getKeyCode(dir);\n if (keyCode) dispatchKeyboardEvent('keyup', keyCode);\n });\n activeDirectionsRef.current = new Set();\n updateVisuals(new Set());\n }\n }\n }, [getKeyCode, updateVisuals, isDragging, clearDragTimer]);\n\n useEffect(() => {\n const dpad = dpadRef.current;\n if (!dpad) return;\n\n dpad.addEventListener('touchstart', handleTouchStart, { passive: false });\n dpad.addEventListener('touchmove', handleTouchMove, { passive: false });\n dpad.addEventListener('touchend', handleTouchEnd, { passive: false });\n dpad.addEventListener('touchcancel', handleTouchEnd, { passive: false });\n\n return () => {\n dpad.removeEventListener('touchstart', handleTouchStart);\n dpad.removeEventListener('touchmove', handleTouchMove);\n dpad.removeEventListener('touchend', handleTouchEnd);\n dpad.removeEventListener('touchcancel', handleTouchEnd);\n clearDragTimer();\n };\n }, [handleTouchStart, handleTouchMove, handleTouchEnd, clearDragTimer]);\n\n const leftPx = (displayX / 100) * containerWidth - size / 2;\n const topPx = (displayY / 100) * containerHeight - size / 2;\n\n const dUp = \"M 35,5 L 65,5 L 65,35 L 50,50 L 35,35 Z\";\n const dRight = \"M 65,35 L 95,35 L 95,65 L 65,65 L 50,50 Z\";\n const dDown = \"M 65,65 L 65,95 L 35,95 L 35,65 L 50,50 Z\";\n const dLeft = \"M 35,65 L 5,65 L 5,35 L 35,35 L 50,50 Z\";\n\n return (\n <div\n ref={dpadRef}\n className={`absolute pointer-events-auto touch-manipulation select-none ${isDragging ? 'opacity-60' : ''}`}\n style={{\n top: 0,\n left: 0,\n transform: `translate3d(${leftPx}px, ${topPx}px, 0)${isDragging ? ' scale(1.05)' : ''}`,\n width: size,\n height: size,\n opacity: isLandscape ? 0.75 : 0.9,\n WebkitTouchCallout: 'none',\n WebkitUserSelect: 'none',\n touchAction: 'none',\n transition: isDragging ? 'none' : 'transform 0.1s ease-out',\n }}\n >\n {/* Base layer */}\n <div className={`absolute inset-0 rounded-full bg-black/40 backdrop-blur-md border shadow-lg ${isDragging ? 'border-white/50 ring-2 ring-white/30' : 'border-white/10'}`} />\n\n <svg width=\"100%\" height=\"100%\" viewBox=\"0 0 100 100\" className=\"drop-shadow-xl relative z-10\">\n <path ref={upPathRef} d={dUp} fill=\"rgba(255,255,255,0.05)\" stroke=\"rgba(255,255,255,0.2)\" strokeWidth=\"1\" className=\"transition-all duration-75\" />\n <path ref={rightPathRef} d={dRight} fill=\"rgba(255,255,255,0.05)\" stroke=\"rgba(255,255,255,0.2)\" strokeWidth=\"1\" className=\"transition-all duration-75\" />\n <path ref={downPathRef} d={dDown} fill=\"rgba(255,255,255,0.05)\" stroke=\"rgba(255,255,255,0.2)\" strokeWidth=\"1\" className=\"transition-all duration-75\" />\n <path ref={leftPathRef} d={dLeft} fill=\"rgba(255,255,255,0.05)\" stroke=\"rgba(255,255,255,0.2)\" strokeWidth=\"1\" className=\"transition-all duration-75\" />\n\n {/* Center Pivot - drag handle */}\n <circle\n ref={centerCircleRef}\n cx=\"50\" cy=\"50\" r=\"12\"\n fill={isDragging ? systemColor : 'rgba(0,0,0,0.5)'}\n stroke={isDragging ? '#fff' : 'rgba(255,255,255,0.3)'}\n strokeWidth={isDragging ? 2 : 1}\n />\n\n {/* Arrow icons */}\n <path d=\"M 50,15 L 50,25 M 45,20 L 50,15 L 55,20\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\" opacity=\"0.8\" pointerEvents=\"none\" />\n <path d=\"M 50,85 L 50,75 M 45,80 L 50,85 L 55,80\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\" opacity=\"0.8\" pointerEvents=\"none\" />\n <path d=\"M 15,50 L 25,50 M 20,45 L 15,50 L 20,55\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\" opacity=\"0.8\" pointerEvents=\"none\" />\n <path d=\"M 85,50 L 75,50 M 80,45 L 85,50 L 80,55\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" fill=\"none\" opacity=\"0.8\" pointerEvents=\"none\" />\n </svg>\n </div>\n );\n});\n\nexport default Dpad;\n","/**\n * Positioning adjustments for virtual controller buttons\n * Layouts define base positions; this module applies minor runtime adjustments.\n */\n\nimport { ButtonConfig } from './layouts';\n\nexport interface PositioningContext {\n isFullscreen: boolean;\n}\n\n/**\n * Apply minor adjustments to button config\n * Currently: enlarge buttons slightly in fullscreen mode\n */\nexport function adjustButtonPosition(\n config: ButtonConfig,\n context: PositioningContext\n): ButtonConfig {\n const sizeMultiplier = context.isFullscreen ? 1.1 : 1.0;\n\n return {\n ...config,\n size: Math.floor(config.size * sizeMultiplier),\n };\n}\n","/**\n * Hook to manage custom button positions (for draggable buttons)\n * Persists to localStorage with separate storage for landscape and portrait\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { ButtonType } from './layouts';\n\nexport type ButtonPositions = Partial<Record<ButtonType, { x: number; y: number }>>;\n\ninterface StoredPositions {\n landscape: ButtonPositions;\n portrait: ButtonPositions;\n}\n\nconst STORAGE_KEY = 'virtual-button-positions';\n\nexport function useButtonPositions() {\n const [landscapePositions, setLandscapePositions] = useState<ButtonPositions>({});\n const [portraitPositions, setPortraitPositions] = useState<ButtonPositions>({});\n\n // Load positions from localStorage\n useEffect(() => {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const parsed: StoredPositions = JSON.parse(stored);\n // Handle migration from old format (single positions object)\n if (parsed.landscape && parsed.portrait) {\n setLandscapePositions(parsed.landscape);\n setPortraitPositions(parsed.portrait);\n } else {\n // Old format - treat as landscape positions\n setLandscapePositions(parsed as any);\n }\n }\n } catch (e) {\n console.error('Failed to load button positions:', e);\n }\n }, []);\n\n // Save position for a button (orientation-specific)\n const savePosition = useCallback((\n buttonType: ButtonType,\n x: number,\n y: number,\n isLandscape: boolean\n ) => {\n if (isLandscape) {\n setLandscapePositions((prev) => {\n const updated = { ...prev, [buttonType]: { x, y } };\n try {\n const stored: StoredPositions = {\n landscape: updated,\n portrait: portraitPositions,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(stored));\n } catch (e) {\n console.error('Failed to save button position:', e);\n }\n return updated;\n });\n } else {\n setPortraitPositions((prev) => {\n const updated = { ...prev, [buttonType]: { x, y } };\n try {\n const stored: StoredPositions = {\n landscape: landscapePositions,\n portrait: updated,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(stored));\n } catch (e) {\n console.error('Failed to save button position:', e);\n }\n return updated;\n });\n }\n }, [landscapePositions, portraitPositions]);\n\n // Get position for a button (orientation-specific)\n const getPosition = useCallback((\n buttonType: ButtonType,\n isLandscape: boolean\n ): { x: number; y: number } | null => {\n const positions = isLandscape ? landscapePositions : portraitPositions;\n return positions[buttonType] || null;\n }, [landscapePositions, portraitPositions]);\n\n // Reset all positions\n const resetPositions = useCallback(() => {\n setLandscapePositions({});\n setPortraitPositions({});\n try {\n localStorage.removeItem(STORAGE_KEY);\n } catch (e) {\n console.error('Failed to reset button positions:', e);\n }\n }, []);\n\n return {\n landscapePositions,\n portraitPositions,\n savePosition,\n getPosition,\n resetPositions,\n };\n}\n\n","'use client';\n\nimport { useState, useEffect } from 'react';\nimport { Move } from 'lucide-react';\n\nconst STORAGE_KEY = 'koin-controls-hint-shown';\n\ninterface ControlsHintProps {\n isVisible: boolean;\n}\n\n/**\n * First-time hint overlay that teaches users about control repositioning\n * Only shows once, stores flag in sessionStorage\n */\nexport default function ControlsHint({ isVisible }: ControlsHintProps) {\n const [show, setShow] = useState(false);\n\n useEffect(() => {\n if (!isVisible) return;\n\n // Check if hint was already shown\n try {\n const wasShown = sessionStorage.getItem(STORAGE_KEY);\n if (!wasShown) {\n // Delay showing to let user see the controls first\n const timer = setTimeout(() => setShow(true), 1500);\n return () => clearTimeout(timer);\n }\n } catch {\n // sessionStorage not available\n }\n }, [isVisible]);\n\n const handleDismiss = () => {\n setShow(false);\n try {\n sessionStorage.setItem(STORAGE_KEY, 'true');\n } catch {\n // sessionStorage not available\n }\n };\n\n if (!show) return null;\n\n return (\n <div\n className=\"fixed inset-0 z-[100] flex items-center justify-center bg-black/60 backdrop-blur-sm\"\n onClick={handleDismiss}\n onTouchEnd={handleDismiss}\n >\n <div\n className=\"bg-black/90 border border-white/30 rounded-2xl p-6 mx-4 max-w-sm text-center shadow-2xl pointer-events-auto\"\n onClick={(e) => e.stopPropagation()}\n onTouchEnd={(e) => e.stopPropagation()}\n >\n <div className=\"flex justify-center mb-4\">\n <div className=\"w-16 h-16 rounded-full bg-green-500/20 border-2 border-green-400 flex items-center justify-center\">\n <Move size={32} className=\"text-green-400\" />\n </div>\n </div>\n\n <h3 className=\"text-white text-lg font-bold mb-2\">\n Customize Your Controls\n </h3>\n\n <p className=\"text-white/70 text-sm mb-4\">\n <strong className=\"text-white\">Long-press</strong> any button or the <strong className=\"text-white\">D-pad center</strong> to drag and reposition it.\n </p>\n\n <p className=\"text-white/50 text-xs mb-4\">\n Your layout is saved separately for portrait and landscape modes.\n </p>\n\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleDismiss();\n }}\n onTouchEnd={(e) => {\n e.stopPropagation();\n handleDismiss();\n }}\n className=\"w-full py-3 px-4 bg-green-500 hover:bg-green-400 active:bg-green-600 text-black font-bold rounded-xl transition-colors flex items-center justify-center gap-2 cursor-pointer touch-manipulation\"\n >\n Got it!\n </button>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport { useMobile } from '../../hooks/useMobile';\nimport { getLayoutForSystem } from './layouts';\nimport VirtualButton from './VirtualButton';\nimport Dpad from './Dpad';\nimport { ControlMapping } from '../../lib/controls/types';\nimport { adjustButtonPosition, PositioningContext } from './positioning';\nimport { useButtonPositions } from './useButtonPositions';\nimport { getKeyboardCode, dispatchKeyboardEvent } from './utils/keyboardEvents';\nimport {\n isFullscreen,\n setupFullscreenListener,\n getViewportSize,\n createOrientationChangeHandler,\n} from './utils/viewport';\nimport ControlsHint from './ControlsHint';\n\nexport interface VirtualControllerProps {\n system: string;\n isRunning: boolean;\n controls?: ControlMapping;\n systemColor?: string; // Console-specific color for theming\n}\n\n/**\n * Virtual gamepad controller for mobile devices\n * Renders console-specific button layouts and handles touch input\n */\nexport default function VirtualController({\n system,\n isRunning,\n controls,\n systemColor = '#00FF41', // Default retro green\n}: VirtualControllerProps) {\n const { isMobile, isLandscape, isPortrait } = useMobile();\n const [pressedButtons, setPressedButtons] = useState<Set<string>>(new Set());\n const [containerSize, setContainerSize] = useState({ width: 0, height: 0 });\n const [isFullscreenState, setIsFullscreenState] = useState(false);\n const { getPosition, savePosition } = useButtonPositions();\n\n // Get layout for current system\n const layout = getLayoutForSystem(system);\n\n // Filter buttons based on orientation\n const visibleButtons = layout.buttons.filter((btn) => {\n if (isPortrait) {\n return btn.showInPortrait;\n }\n return btn.showInLandscape;\n });\n\n // Separate D-pad buttons from other buttons (though we rely on the Dpad component for directions)\n // We keep them in the layout definition for completeness or future fallback\n const DPAD_TYPES = ['up', 'down', 'left', 'right'];\n\n // NOTE: Unlike before, we don't render individual d-pad buttons from the layout array.\n // The Dpad component handles all directional input.\n\n // Update container size and fullscreen state\n useEffect(() => {\n const updateSize = () => {\n const { width, height } = getViewportSize();\n setContainerSize({ width, height });\n setIsFullscreenState(isFullscreen());\n };\n\n // Initial size\n updateSize();\n\n // Handle resize\n const handleResize = () => updateSize();\n\n // Check if viewport is ready (has valid dimensions)\n const checkViewportReady = (): boolean => {\n const { width, height } = getViewportSize();\n return width > 0 && height > 0;\n };\n\n // Handle orientation change with iOS-specific timing\n const handleOrientationChange = createOrientationChangeHandler(\n updateSize,\n checkViewportReady,\n 3 // maxRafs\n );\n\n // Handle fullscreen changes\n const handleFullscreenChange = () => updateSize();\n\n // Listen to visual viewport changes (iOS Safari address bar show/hide)\n const handleVisualViewportResize = () => {\n // Only update if it's a significant change (not just address bar)\n const { height } = getViewportSize();\n const heightDiff = Math.abs(height - containerSize.height);\n if (heightDiff > 50) { // Threshold to ignore small address bar changes\n updateSize();\n }\n };\n\n window.addEventListener('resize', handleResize);\n window.addEventListener('orientationchange', handleOrientationChange);\n\n // Visual viewport API (iOS Safari address bar handling)\n if (window.visualViewport) {\n window.visualViewport.addEventListener('resize', handleVisualViewportResize);\n window.visualViewport.addEventListener('scroll', handleVisualViewportResize);\n }\n\n // Use centralized fullscreen listener utility\n const cleanupFullscreen = setupFullscreenListener(handleFullscreenChange);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n window.removeEventListener('orientationchange', handleOrientationChange);\n if (window.visualViewport) {\n window.visualViewport.removeEventListener('resize', handleVisualViewportResize);\n window.visualViewport.removeEventListener('scroll', handleVisualViewportResize);\n }\n cleanupFullscreen();\n };\n }, [containerSize.height]); // Include containerSize.height to check for significant changes\n\n // Get keyboard code for button type\n const getButtonKeyboardCode = useCallback(\n (buttonType: string): string | null => {\n return getKeyboardCode(buttonType, controls);\n },\n [controls]\n );\n\n // System buttons that work with tap (press + release)\n const SYSTEM_BUTTONS = ['start', 'select', 'menu'];\n\n // Handle system buttons (start/select) - tap to press and release\n const handlePress = useCallback(\n (buttonType: string) => {\n // System buttons work as long as emulator exists\n // Game buttons only work when game is running\n const isSystemButton = SYSTEM_BUTTONS.includes(buttonType);\n if (!isSystemButton && !isRunning) {\n return;\n }\n\n const keyboardCode = getButtonKeyboardCode(buttonType);\n if (!keyboardCode) {\n return;\n }\n\n // Add to pressed set for visual feedback\n setPressedButtons((prev) => new Set(prev).add(buttonType));\n\n // Dispatch keydown\n dispatchKeyboardEvent('keydown', keyboardCode);\n\n // Dispatch keyup after a delay (simulates a tap)\n setTimeout(() => {\n dispatchKeyboardEvent('keyup', keyboardCode);\n setPressedButtons((prev) => {\n const next = new Set(prev);\n next.delete(buttonType);\n return next;\n });\n }, 100);\n },\n [isRunning, getButtonKeyboardCode]\n );\n\n // Handle game buttons (D-pad, A, B, etc.) - hold for continuous input\n const handlePressDown = useCallback(\n (buttonType: string) => {\n if (!isRunning) return;\n\n // System buttons use handlePress() instead\n const isSystemButton = SYSTEM_BUTTONS.includes(buttonType);\n if (isSystemButton) return;\n\n const keyboardCode = getButtonKeyboardCode(buttonType);\n if (!keyboardCode) return;\n\n // Optimization: Only update state if not already pressed to avoid re-renders\n setPressedButtons((prev) => {\n if (prev.has(buttonType)) return prev;\n const next = new Set(prev);\n next.add(buttonType);\n return next;\n });\n dispatchKeyboardEvent('keydown', keyboardCode);\n },\n [isRunning, getButtonKeyboardCode]\n );\n\n const handleRelease = useCallback(\n (buttonType: string) => {\n // System buttons use handlePress() instead\n const isSystemButton = SYSTEM_BUTTONS.includes(buttonType);\n if (isSystemButton) return;\n\n const keyboardCode = getButtonKeyboardCode(buttonType);\n if (!keyboardCode) return;\n\n // Optimization: Only update state if actually pressed\n setPressedButtons((prev) => {\n if (!prev.has(buttonType)) return prev;\n const next = new Set(prev);\n next.delete(buttonType);\n return next;\n });\n dispatchKeyboardEvent('keyup', keyboardCode);\n },\n [getButtonKeyboardCode]\n );\n\n // Release all buttons when game stops (only non-system buttons)\n useEffect(() => {\n if (!isRunning && pressedButtons.size > 0) {\n pressedButtons.forEach((buttonType) => {\n if (!SYSTEM_BUTTONS.includes(buttonType)) {\n handleRelease(buttonType);\n }\n });\n setPressedButtons(new Set());\n }\n }, [isRunning, pressedButtons, handleRelease]);\n\n // Optimize: Memoize button configurations to prevent creating new objects on every render\n const memoizedButtonElements = useMemo(() => {\n // Use window dimensions if container size not yet calculated\n const width = containerSize.width || (typeof window !== 'undefined' ? window.innerWidth : 0);\n const height = containerSize.height || (typeof window !== 'undefined' ? window.innerHeight : 0);\n\n const context: PositioningContext = {\n isFullscreen: isFullscreenState,\n };\n\n return visibleButtons.map((buttonConfig) => {\n const adjustedConfig = adjustButtonPosition(buttonConfig, context);\n const customPosition = getPosition(buttonConfig.type, isLandscape);\n\n return {\n buttonConfig,\n adjustedConfig,\n customPosition,\n width,\n height\n };\n });\n }, [visibleButtons, containerSize, isLandscape, isFullscreenState, getPosition]); // Dependencies that actually change layout\n\n // Don't render on desktop\n if (!isMobile) {\n return null;\n }\n\n // Responsive sizing for D-pad\n const dpadSize = containerSize.width > containerSize.height ? 160 : 180;\n const dpadY = containerSize.width > containerSize.height ? 55 : 62;\n\n // For Neo Geo, D-pad might need to be slightly higher to avoid overlap if 4 buttons are curved\n const finalDpadY = system.toUpperCase() === 'NEOGEO' ? dpadY - 5 : dpadY;\n\n return (\n <div\n className=\"fixed inset-0 z-30 pointer-events-none\"\n style={{ touchAction: 'none' }}\n >\n {/* Unified D-pad */}\n <Dpad\n size={dpadSize}\n x={14}\n y={finalDpadY}\n containerWidth={containerSize.width || window.innerWidth}\n containerHeight={containerSize.height || window.innerHeight}\n controls={controls}\n systemColor={systemColor}\n isLandscape={isLandscape}\n customPosition={getPosition('up', isLandscape)} // 'up' acts as dpad position key\n onPositionChange={(x, y) => savePosition('up', x, y, isLandscape)}\n />\n\n {/* Other buttons (A, B, Start, Select, etc.) */}\n {memoizedButtonElements\n .filter(({ buttonConfig }) => !DPAD_TYPES.includes(buttonConfig.type))\n .map(({ buttonConfig, adjustedConfig, customPosition, width, height }) => (\n <VirtualButton\n key={buttonConfig.type}\n config={adjustedConfig}\n isPressed={pressedButtons.has(buttonConfig.type)}\n onPress={handlePress}\n onPressDown={handlePressDown}\n onRelease={handleRelease}\n containerWidth={width}\n containerHeight={height}\n customPosition={customPosition}\n onPositionChange={(x, y) => savePosition(buttonConfig.type, x, y, isLandscape)}\n isLandscape={isLandscape}\n console={layout.console} // Important: pass the specific console for styling\n />))}\n\n {/* First-time hint */}\n <ControlsHint isVisible={isRunning} />\n </div>\n );\n}\n","'use client';\n\nimport { Minimize2, X } from 'lucide-react';\n\ninterface FloatingExitButtonProps {\n onClick: () => void;\n disabled?: boolean;\n}\n\n/**\n * Floating exit button that appears in fullscreen mode\n * Styled to match FloatingFullscreenButton for consistency\n */\nexport default function FloatingExitButton({ onClick, disabled = false }: FloatingExitButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`\n fixed top-3 right-3 z-50\n px-3 py-2 rounded-xl\n bg-black/80 backdrop-blur-md\n border-2 border-red-400/60\n shadow-xl\n flex items-center gap-2\n transition-all duration-300\n hover:bg-red-600/30 hover:border-red-400 hover:scale-105\n active:scale-95\n disabled:opacity-40 disabled:cursor-not-allowed\n touch-manipulation\n `}\n style={{\n paddingTop: 'max(env(safe-area-inset-top, 0px), 8px)'\n }}\n aria-label=\"Exit fullscreen\"\n >\n <X size={16} className=\"text-red-400\" />\n <span className=\"text-white text-xs font-bold uppercase tracking-wider\">\n Exit\n </span>\n <Minimize2 size={14} className=\"text-white/60\" />\n </button>\n );\n}\n","'use client';\n\nimport { Maximize, Gamepad2 } from 'lucide-react';\nimport { useState, useEffect } from 'react';\n\ninterface FloatingFullscreenButtonProps {\n onClick: () => void;\n disabled?: boolean;\n}\n\n/**\n * Floating fullscreen prompt for mobile devices\n * Shows prominently with clear messaging that controls appear in fullscreen\n */\nexport default function FloatingFullscreenButton({ onClick, disabled = false }: FloatingFullscreenButtonProps) {\n const [pulse, setPulse] = useState(true);\n\n // Stop pulsing after 5 seconds\n useEffect(() => {\n const timer = setTimeout(() => setPulse(false), 5000);\n return () => clearTimeout(timer);\n }, []);\n\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`\n absolute top-3 left-3 z-50\n px-3 py-2 rounded-xl\n bg-black/80 backdrop-blur-md\n border-2 border-white/60\n shadow-xl\n flex items-center gap-2\n transition-all duration-300\n hover:bg-white/20 hover:border-white hover:scale-105\n active:scale-95\n disabled:opacity-40 disabled:cursor-not-allowed\n touch-manipulation\n ${pulse ? 'animate-pulse border-green-400/80' : ''}\n `}\n aria-label=\"Tap for fullscreen controls\"\n >\n <Gamepad2 size={18} className=\"text-green-400\" />\n <span className=\"text-white text-xs font-bold uppercase tracking-wider whitespace-nowrap\">\n Tap for Controls\n </span>\n <Maximize size={14} className=\"text-white/60\" />\n </button>\n );\n}\n","import { AlertTriangle, Loader2, Save, Play } from 'lucide-react';\nimport { EmulatorStatus } from '../../hooks/useNostalgist';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ninterface GameOverlayProps {\n status: EmulatorStatus;\n system?: string;\n error?: string | null;\n isPaused: boolean;\n onStart: () => void;\n systemColor?: string;\n pendingSlot?: number; // If set, indicates a save will be loaded on start\n isLoadingSave?: boolean; // If true, shows loading indicator for save\n onSelectBios?: () => void;\n}\n\n// Unified loading spinner component\nfunction LoadingSpinner({ color, size = 'lg' }: { color: string; size?: 'sm' | 'lg' }) {\n const sizeClass = size === 'lg' ? 'w-12 h-12' : 'w-8 h-8';\n return <Loader2 className={`${sizeClass} animate-spin`} style={{ color }} />;\n}\n\nexport default function GameOverlay({\n status,\n system,\n error,\n isPaused,\n onStart,\n systemColor = '#00FF41',\n pendingSlot,\n isLoadingSave,\n onSelectBios,\n}: GameOverlayProps) {\n const t = useKoinTranslation();\n\n // Unified Loading Overlay - covers both emulator init and save fetching\n const isLoading = status === 'loading' || (status === 'ready' && isLoadingSave);\n\n if (isLoading) {\n const message = status === 'loading'\n ? { title: t.overlay.loading.replace('{{system}}', system || ''), subtitle: t.overlay.initializing }\n : { title: t.overlay.loadingSave, subtitle: t.overlay.preparingSlot.replace('{{num}}', String(pendingSlot || '')) };\n\n return (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black z-20\">\n <div className=\"flex flex-col items-center gap-4\">\n <LoadingSpinner color={systemColor} size=\"lg\" />\n <div className=\"text-center\">\n <p className=\"font-mono uppercase tracking-widest text-sm\" style={{ color: systemColor }}>\n {message.title}\n </p>\n <p className=\"text-xs mt-1 text-gray-500\">{message.subtitle}</p>\n </div>\n </div>\n </div>\n );\n }\n\n // Ready - Press to Start Overlay\n if (status === 'ready') {\n const hasPendingSave = Boolean(pendingSlot);\n\n return (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/95 z-20\">\n <button\n onClick={onStart}\n className=\"group flex flex-col items-center gap-3 p-6 rounded-xl border-2 transition-all cursor-pointer hover:scale-105\"\n style={{\n backgroundColor: `${systemColor}10`,\n borderColor: `${systemColor}40`,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = systemColor;\n e.currentTarget.style.backgroundColor = `${systemColor}20`;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = `${systemColor}40`;\n e.currentTarget.style.backgroundColor = `${systemColor}10`;\n }}\n >\n <div\n className=\"w-16 h-16 rounded-full flex items-center justify-center\"\n style={{ backgroundColor: `${systemColor}20` }}\n >\n <Play className=\"w-8 h-8 ml-1\" style={{ color: systemColor }} fill={systemColor} />\n </div>\n <span className=\"font-mono text-lg uppercase tracking-wider\" style={{ color: systemColor }}>\n {t.overlay.play}\n </span>\n {hasPendingSave && (\n <span className=\"text-gray-400 text-xs flex items-center gap-1\">\n <Save size={12} /> {t.overlay.slotReady.replace('{{num}}', String(pendingSlot))}\n </span>\n )}\n </button>\n\n {onSelectBios && (\n <button\n onClick={onSelectBios}\n className=\"mt-6 flex items-center gap-2 px-4 py-2 rounded-lg text-sm text-gray-400 hover:text-white hover:bg-white/10 transition-colors\"\n >\n <div className=\"w-2 h-2 rounded-full\" style={{ backgroundColor: systemColor }} />\n <span className=\"font-mono uppercase tracking-wider text-xs\">\n {t.overlay.systemFirmware}\n </span>\n </button>\n )}\n </div>\n );\n }\n\n // Error Overlay\n if (status === 'error') {\n return (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/90 z-20\">\n <div className=\"flex flex-col items-center gap-4\">\n <AlertTriangle className=\"w-12 h-12 text-red-500\" />\n <div className=\"text-center\">\n <p className=\"text-red-400 font-mono uppercase tracking-widest text-sm\">\n {t.overlay.systemError}\n </p>\n <p className=\"text-gray-500 text-xs mt-1 max-w-xs\">\n {error || t.overlay.failedInit}\n </p>\n </div>\n <button\n onClick={onStart}\n className=\"mt-2 px-4 py-2 text-sm font-bold rounded-lg transition-colors\"\n style={{ backgroundColor: systemColor, color: '#000' }}\n >\n {t.overlay.retry}\n </button>\n </div>\n </div>\n );\n }\n\n // Paused Overlay\n if (isPaused && status === 'paused') {\n return (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50 z-20\">\n <div className=\"flex flex-col items-center gap-3\">\n <div\n className=\"w-16 h-16 rounded-full border-3 flex items-center justify-center\"\n style={{ borderColor: systemColor }}\n >\n <div className=\"flex gap-1.5\">\n <div className=\"w-2.5 h-8 rounded-sm\" style={{ backgroundColor: systemColor }} />\n <div className=\"w-2.5 h-8 rounded-sm\" style={{ backgroundColor: systemColor }} />\n </div>\n </div>\n <p className=\"font-mono uppercase tracking-wider text-sm\" style={{ color: systemColor }}>\n {t.overlay.paused}\n </p>\n </div>\n </div>\n );\n }\n\n return null;\n}\n\n","import { RefObject } from 'react';\n\nexport function suppressEmulatorWarnings() {\n // Suppress harmless warnings from Emscripten/RetroArch\n const originalWarn = console.warn;\n const originalError = console.error;\n\n const shouldSuppress = (arg: any) => {\n if (typeof arg !== 'string') return false;\n return (\n arg.includes('FS.syncfs') ||\n arg.includes('AL_INVALID_VALUE') ||\n arg.includes('GL_INVALID_VALUE') ||\n arg.includes('Canvas size should be set using CSS properties!')\n );\n };\n\n console.warn = (...args) => {\n if (shouldSuppress(args[0])) return;\n originalWarn.apply(console, args);\n };\n\n console.error = (...args) => {\n if (shouldSuppress(args[0])) return;\n originalError.apply(console, args);\n };\n}\n\nexport function setupCanvasResize(\n containerRef: RefObject<HTMLDivElement>\n) {\n if (!containerRef.current) return;\n\n // Nostalgist handles canvas resolution internally based on CSS size\n // We just need to ensure the container is properly sized\n // Emscripten/RetroArch will fill the canvas based on CSS width/height: 100%\n}\n\n// Volume persistence\nconst VOLUME_KEY = 'retro-player-volume';\nconst MUTE_KEY = 'retro-player-muted';\n\nexport function loadVolume(): number {\n if (typeof window === 'undefined') return 100;\n const saved = localStorage.getItem(VOLUME_KEY);\n return saved ? parseInt(saved, 10) : 100;\n}\n\nexport function saveVolume(volume: number) {\n if (typeof window === 'undefined') return;\n localStorage.setItem(VOLUME_KEY, volume.toString());\n}\n\nexport function loadMuteState(): boolean {\n if (typeof window === 'undefined') return false;\n return localStorage.getItem(MUTE_KEY) === 'true';\n}\n\nexport function saveMuteState(muted: boolean) {\n if (typeof window === 'undefined') return;\n localStorage.setItem(MUTE_KEY, muted.toString());\n}\n","import { useEffect, useRef, memo } from 'react';\nimport GameOverlay from './Overlays/GameOverlay';\nimport { EmulatorStatus } from '../hooks/emulator/types';\nimport { setupCanvasResize } from '../lib/game-player-utils';\n\ninterface GameCanvasProps {\n status: EmulatorStatus;\n system: string;\n error: string | null;\n isPaused: boolean;\n onStart: () => Promise<void>;\n systemColor: string;\n isFullscreen: boolean;\n canvasRef: React.MutableRefObject<HTMLCanvasElement | null>;\n onSelectBios?: () => void;\n}\n\nconst GameCanvas = memo(function GameCanvas({\n status,\n system,\n error,\n isPaused,\n onStart,\n systemColor,\n // isFullscreen, // Unused\n canvasRef,\n onSelectBios\n}: GameCanvasProps) {\n const canvasContainerRef = useRef<HTMLDivElement>(null);\n\n // Create canvas\n useEffect(() => {\n const container = canvasContainerRef.current;\n if (!container || canvasRef.current) return;\n\n const canvas = document.createElement('canvas');\n canvas.id = 'canvas';\n // Use CSS to size the canvas display, not width/height attributes\n canvas.style.width = '100%';\n canvas.style.height = '100%';\n canvas.style.objectFit = 'contain';\n canvas.style.imageRendering = 'pixelated'; // Crisp pixel art\n\n // Emscripten may try to set style on the canvas, so we use important if needed\n // but typically just setting it here works. Explicitly NOT setting width/height attributes\n // lets emscripten manage internal resolution vs display size.\n\n container.appendChild(canvas);\n canvasRef.current = canvas;\n\n return () => {\n if (canvasRef.current && canvasRef.current.parentNode) {\n canvasRef.current.parentNode.removeChild(canvasRef.current);\n }\n canvasRef.current = null;\n };\n }, [canvasRef]);\n\n // Canvas resize\n useEffect(() => {\n if (status !== 'ready' && status !== 'running' && status !== 'paused') return;\n return setupCanvasResize(canvasContainerRef);\n }, [status]);\n\n return (\n <div className=\"absolute inset-0 bg-black overflow-hidden flex items-center justify-center\">\n <div ref={canvasContainerRef} className=\"game-canvas-container w-full h-full flex items-center justify-center\"></div>\n\n <GameOverlay\n status={status}\n system={system}\n error={error}\n isPaused={isPaused}\n onStart={onStart}\n systemColor={systemColor}\n onSelectBios={onSelectBios}\n />\n </div>\n );\n});\n\nexport default GameCanvas;\n","'use client';\n\nimport React, { useState, useEffect, useMemo } from 'react';\nimport { X, Gamepad2, RotateCcw, Check } from 'lucide-react';\nimport { ControlMapperProps } from '../types';\nimport {\n KeyboardMapping,\n ButtonId,\n BUTTON_LABELS,\n BUTTON_GROUPS,\n formatKeyCode,\n getConsoleButtons,\n getConsoleKeyboardDefaults,\n} from '../../lib/controls';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\n// Filter control groups to only show buttons available for this system\nfunction getFilteredGroups(activeButtons: ButtonId[]) {\n return BUTTON_GROUPS.map(group => ({\n ...group,\n buttons: group.buttons.filter(btn => activeButtons.includes(btn))\n })).filter(group => group.buttons.length > 0);\n}\n\nexport default function ControlMapper({\n isOpen,\n controls,\n onSave,\n onClose,\n system,\n}: ControlMapperProps) {\n const t = useKoinTranslation();\n const [localControls, setLocalControls] = useState<KeyboardMapping>(controls);\n const [listeningFor, setListeningFor] = useState<ButtonId | null>(null);\n\n // Get active buttons for this system\n const activeButtons = useMemo(() => {\n return getConsoleButtons(system || 'SNES');\n }, [system]);\n\n // Filter control groups to only show buttons available for this system\n const controlGroups = useMemo(() => {\n return getFilteredGroups(activeButtons);\n }, [activeButtons]);\n\n // Get default controls for this system\n const defaultControls = useMemo(() => {\n return getConsoleKeyboardDefaults(system || 'SNES');\n }, [system]);\n\n // Sync localControls with controls prop when modal opens or controls change\n useEffect(() => {\n if (isOpen) {\n setLocalControls(controls);\n }\n }, [isOpen, controls]);\n\n useEffect(() => {\n if (!isOpen) {\n setListeningFor(null);\n return;\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!listeningFor) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n // Don't allow Escape as a control\n if (e.code === 'Escape') {\n setListeningFor(null);\n return;\n }\n\n setLocalControls((prev) => ({\n ...prev,\n [listeningFor]: e.code,\n }));\n setListeningFor(null);\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, listeningFor]);\n\n const handleReset = () => {\n setLocalControls(defaultControls);\n };\n\n const handleSave = () => {\n onSave(localControls);\n onClose();\n };\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/80 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <div className=\"relative bg-gray-900 border border-retro-primary/30 rounded-xl shadow-2xl w-full max-w-lg mx-4 overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-white/10 bg-black/50\">\n <div className=\"flex items-center gap-3\">\n <Gamepad2 className=\"text-retro-primary\" size={24} />\n <div>\n <h2 className=\"text-lg font-bold text-white\">{t.modals.controls.title}</h2>\n <p className=\"text-xs text-gray-400\">\n {t.modals.controls.description}\n </p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-white/10 text-gray-400 hover:text-white transition-colors\"\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Controls Grid */}\n <div className=\"p-4 space-y-6 max-h-[400px] overflow-y-auto\">\n {controlGroups.map((group) => (\n <div key={group.label}>\n <h3 className=\"text-xs font-bold text-gray-500 uppercase tracking-wider mb-2\">\n {group.label}\n </h3>\n <div className=\"grid grid-cols-2 gap-2\">\n {group.buttons.map((btn) => (\n <button\n key={btn}\n onClick={() => setListeningFor(btn)}\n className={`\n flex items-center justify-between px-4 py-3 rounded-lg border transition-all\n ${listeningFor === btn\n ? 'border-retro-primary bg-retro-primary/20 ring-2 ring-retro-primary/50'\n : 'border-white/10 bg-white/5 hover:border-white/20 hover:bg-white/10'\n }\n `}\n >\n <span className=\"text-sm text-gray-300\">\n {BUTTON_LABELS[btn]}\n </span>\n <span\n className={`\n px-2 py-1 rounded text-xs font-mono\n ${listeningFor === btn\n ? 'bg-retro-primary/30 text-retro-primary animate-pulse'\n : 'bg-black/50 text-white'\n }\n `}\n >\n {listeningFor === btn ? t.modals.controls.pressKey : formatKeyCode(localControls[btn] || '')}\n </span>\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div className=\"flex items-center justify-between px-6 py-4 bg-black/30 border-t border-white/10\">\n <button\n onClick={handleReset}\n className=\"flex items-center gap-2 px-4 py-2 rounded-lg text-sm text-gray-400 hover:text-white hover:bg-white/10 transition-colors\"\n >\n <RotateCcw size={16} />\n {t.modals.controls.reset}\n </button>\n <button\n onClick={handleSave}\n className=\"flex items-center gap-2 px-6 py-2 rounded-lg bg-retro-primary text-black font-bold text-sm hover:bg-retro-primary/90 transition-colors\"\n >\n <Check size={16} />\n {t.modals.controls.save}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { GamepadInfo, ControllerBrand, STANDARD_GAMEPAD_BUTTONS } from '../lib/controls';\n\n// Re-export types for convenience\nexport type { GamepadInfo, ControllerBrand };\nexport { STANDARD_GAMEPAD_BUTTONS };\n\n/**\n * Get a clean display name from gamepad id\n */\nfunction getDisplayName(id: string): string {\n // Common patterns to clean up\n // e.g., \"Xbox 360 Controller (XInput STANDARD GAMEPAD)\" -> \"Xbox 360 Controller\"\n // e.g., \"054c-0ce6-Sony Interactive Entertainment DualSense\" -> \"DualSense\"\n\n let name = id;\n\n // Remove vendor/product ID prefix (e.g., \"054c-0ce6-\")\n name = name.replace(/^[0-9a-f]{4}-[0-9a-f]{4}-/i, '');\n\n // Remove common suffixes\n name = name.replace(/\\s*\\(.*\\)\\s*$/i, '');\n name = name.replace(/\\s*STANDARD GAMEPAD\\s*/i, '');\n\n // Clean up specific controller names\n if (/xbox/i.test(name)) {\n if (/series/i.test(name)) return 'Xbox Series Controller';\n if (/one/i.test(name)) return 'Xbox One Controller';\n if (/360/i.test(name)) return 'Xbox 360 Controller';\n return 'Xbox Controller';\n }\n\n if (/dualsense/i.test(name)) return 'DualSense';\n if (/dualshock\\s*4/i.test(name)) return 'DualShock 4';\n if (/dualshock/i.test(name)) return 'DualShock';\n if (/playstation/i.test(name) || /sony/i.test(name)) return 'PlayStation Controller';\n\n if (/pro\\s*controller/i.test(name)) return 'Switch Pro Controller';\n if (/joy-?con/i.test(name)) return 'Joy-Con';\n if (/nintendo/i.test(name)) return 'Nintendo Controller';\n\n // Fallback: return cleaned name or generic\n return name.trim() || 'Gamepad';\n}\n\n/**\n * Detect controller brand from gamepad id for UI theming\n */\nexport function detectControllerBrand(id: string): ControllerBrand {\n const lowerId = id.toLowerCase();\n\n if (/xbox|xinput|microsoft/i.test(lowerId)) return 'xbox';\n if (/playstation|sony|dualshock|dualsense/i.test(lowerId)) return 'playstation';\n if (/nintendo|switch|joy-?con|pro controller/i.test(lowerId)) return 'nintendo';\n\n return 'generic';\n}\n\n/**\n * Convert raw Gamepad to GamepadInfo\n */\nfunction toGamepadInfo(gamepad: Gamepad): GamepadInfo {\n return {\n index: gamepad.index,\n id: gamepad.id,\n name: getDisplayName(gamepad.id),\n connected: gamepad.connected,\n buttons: gamepad.buttons.length,\n axes: gamepad.axes.length,\n mapping: gamepad.mapping,\n };\n}\n\nexport interface UseGamepadOptions {\n /** Callback when a gamepad connects */\n onConnect?: (gamepad: GamepadInfo) => void;\n /** Callback when a gamepad disconnects */\n onDisconnect?: () => void;\n}\n\nexport interface UseGamepadReturn {\n /** Array of connected gamepads (up to 4) */\n gamepads: GamepadInfo[];\n /** Whether any gamepad is connected */\n isAnyConnected: boolean;\n /** Number of connected gamepads */\n connectedCount: number;\n /** Get raw gamepad by index for reading button states */\n getRawGamepad: (index: number) => Gamepad | null;\n /** Force refresh gamepad list */\n refresh: () => void;\n}\n\n/**\n * Hook to track connected gamepads\n * Uses requestAnimationFrame polling since Gamepad API requires active polling\n * \n * NOTE: Browsers require a button press before reporting gamepads (security feature)\n */\nexport function useGamepad(options?: UseGamepadOptions): UseGamepadReturn {\n const { onConnect, onDisconnect } = options || {};\n const [gamepads, setGamepads] = useState<GamepadInfo[]>([]);\n const rafRef = useRef<number | null>(null);\n const lastStateRef = useRef<string>(''); // Kept for logic compatibility or debug\n const prevCountRef = useRef<number>(0);\n\n // Store callbacks in refs to avoid re-running effect when they change\n const onConnectRef = useRef(onConnect);\n const onDisconnectRef = useRef(onDisconnect);\n\n // Update refs when callbacks change\n useEffect(() => {\n onConnectRef.current = onConnect;\n onDisconnectRef.current = onDisconnect;\n }, [onConnect, onDisconnect]);\n\n // Get current gamepad state\n const getGamepads = useCallback((): GamepadInfo[] => {\n if (typeof navigator === 'undefined' || typeof navigator.getGamepads !== 'function') {\n return [];\n }\n\n const rawGamepads = navigator.getGamepads() ?? [];\n const connected: GamepadInfo[] = [];\n\n for (let i = 0; i < rawGamepads.length; i++) {\n const gp = rawGamepads[i];\n if (gp && gp.connected) {\n connected.push(toGamepadInfo(gp));\n }\n }\n\n return connected;\n }, []);\n\n // Get raw gamepad for button state reading\n const getRawGamepad = useCallback((index: number): Gamepad | null => {\n const rawGamepads = navigator.getGamepads?.() ?? [];\n return rawGamepads[index] ?? null;\n }, []);\n\n // Refresh function\n const refresh = useCallback(() => {\n // Force refresh\n setGamepads(getGamepads());\n }, [getGamepads]);\n\n // Polling loop - only update state when connections change\n useEffect(() => {\n // Check if we're in browser and Gamepad API is supported\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return;\n }\n\n if (typeof navigator.getGamepads !== 'function') {\n console.warn('[useGamepad] Gamepad API not supported in this browser');\n return;\n }\n\n let isActive = true;\n\n const poll = () => {\n if (!isActive) return;\n\n const current = getGamepads();\n // Create a simple state signature to compare\n // Optimized comparison: check length first, then IDs\n // Allocating strings every frame is expensive\n let hasChanged = current.length !== prevCountRef.current;\n\n if (!hasChanged) {\n // Deep check only if counts match\n // We can just check connections and IDs without creating full signature strings\n for (let i = 0; i < current.length; i++) {\n const saved = gamepads[i];\n if (!saved || saved.id !== current[i].id || saved.connected !== current[i].connected) {\n hasChanged = true;\n break;\n }\n }\n }\n\n if (hasChanged) {\n const prevCount = prevCountRef.current;\n const currentCount = current.length;\n\n // Detect connection/disconnection logic remains same\n if (currentCount > prevCount && prevCount >= 0 && onConnectRef.current) {\n const newGamepad = current[current.length - 1];\n onConnectRef.current(newGamepad);\n } else if (currentCount < prevCount && prevCount > 0 && onDisconnectRef.current) {\n onDisconnectRef.current();\n }\n\n prevCountRef.current = currentCount;\n // lastStateRef no longer needed for primary comparison but we keep it if we want to debug\n // lastStateRef.current = stateSignature;\n setGamepads(current);\n }\n\n rafRef.current = requestAnimationFrame(poll);\n };\n\n // Handle connect/disconnect events\n const handleConnect = (e: GamepadEvent) => {\n console.log('[useGamepad] 🎮 Gamepad connected:', e.gamepad.id);\n // Force immediate update\n const current = getGamepads();\n const prevCount = prevCountRef.current;\n prevCountRef.current = current.length;\n lastStateRef.current = current.map(g => `${g.index}:${g.id}`).join('|');\n setGamepads(current);\n\n // Trigger callback if provided\n if (onConnectRef.current && current.length > prevCount) {\n const newGamepad = current[current.length - 1];\n onConnectRef.current(newGamepad);\n }\n };\n\n const handleDisconnect = (e: GamepadEvent) => {\n console.log('[useGamepad] 🎮 Gamepad disconnected:', e.gamepad.id);\n // Force immediate update\n const current = getGamepads();\n const prevCount = prevCountRef.current;\n prevCountRef.current = current.length;\n lastStateRef.current = current.map(g => `${g.index}:${g.id}`).join('|');\n setGamepads(current);\n\n // Trigger callback if provided\n if (onDisconnectRef.current && current.length < prevCount) {\n onDisconnectRef.current();\n }\n };\n\n window.addEventListener('gamepadconnected', handleConnect);\n window.addEventListener('gamepaddisconnected', handleDisconnect);\n\n // Start polling\n rafRef.current = requestAnimationFrame(poll);\n\n // Initial check - gamepads may already be connected\n const initial = getGamepads();\n if (initial.length > 0) {\n console.log('[useGamepad] Initial gamepads found:', initial.map(g => g.name).join(', '));\n prevCountRef.current = initial.length;\n setGamepads(initial);\n lastStateRef.current = initial.map(g => `${g.index}:${g.id}`).join('|');\n } else {\n prevCountRef.current = 0;\n }\n\n return () => {\n isActive = false;\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n window.removeEventListener('gamepadconnected', handleConnect);\n window.removeEventListener('gamepaddisconnected', handleDisconnect);\n };\n }, [getGamepads]); // Callbacks are stored in refs, so they don't need to be in deps\n\n return {\n gamepads,\n isAnyConnected: gamepads.length > 0,\n connectedCount: gamepads.length,\n getRawGamepad,\n refresh,\n };\n}\n\n/**\n * Standard gamepad axis indices\n */\nexport const STANDARD_AXIS_MAP = {\n leftStickX: 0,\n leftStickY: 1,\n rightStickX: 2,\n rightStickY: 3,\n} as const;\n\nexport type StandardAxis = keyof typeof STANDARD_AXIS_MAP;\n","'use client';\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport { X, Joystick, RotateCcw, Check, User } from 'lucide-react';\nimport { GamepadInfo, detectControllerBrand, STANDARD_GAMEPAD_BUTTONS } from '../../hooks/useGamepad';\nimport {\n GamepadMapping,\n ButtonId,\n PlayerIndex,\n BUTTON_LABELS,\n BUTTON_GROUPS,\n DEFAULT_GAMEPAD,\n loadGamepadMapping,\n saveGamepadMapping,\n formatGamepadButton,\n} from '../../lib/controls';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\nexport interface GamepadMapperProps {\n isOpen: boolean;\n gamepads: GamepadInfo[];\n onClose: () => void;\n onSave?: (bindings: GamepadMapping, playerIndex: number) => void;\n systemColor?: string;\n}\n\nexport default function GamepadMapper({\n isOpen,\n gamepads,\n onClose,\n onSave,\n systemColor = '#00FF41',\n}: GamepadMapperProps) {\n const t = useKoinTranslation();\n // Selected player for remapping (1-indexed)\n const [selectedPlayer, setSelectedPlayer] = useState(1);\n\n // Local bindings state (per-player)\n const [bindings, setBindings] = useState<Record<number, GamepadMapping>>({});\n\n // Which button we're listening for\n const [listeningFor, setListeningFor] = useState<ButtonId | null>(null);\n\n // Animation frame ref for gamepad polling\n const rafRef = useRef<number | null>(null);\n\n // Load bindings for all connected players when modal opens\n useEffect(() => {\n if (isOpen) {\n const loadedBindings: Record<number, GamepadMapping> = {};\n for (let i = 1; i <= 4; i++) {\n loadedBindings[i] = loadGamepadMapping(i as PlayerIndex);\n }\n setBindings(loadedBindings);\n\n // Select first connected gamepad's player\n if (gamepads.length > 0) {\n setSelectedPlayer(gamepads[0].index + 1);\n }\n }\n }, [isOpen, gamepads]);\n\n // Poll gamepad for button presses when listening\n useEffect(() => {\n if (!isOpen || !listeningFor) {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n return;\n }\n\n const poll = () => {\n const rawGamepads = navigator.getGamepads?.() ?? [];\n const gamepad = rawGamepads[selectedPlayer - 1];\n\n if (gamepad) {\n // Check for any button press\n for (let i = 0; i < gamepad.buttons.length; i++) {\n if (gamepad.buttons[i].pressed) {\n // Found a pressed button - map it\n setBindings(prev => ({\n ...prev,\n [selectedPlayer]: {\n ...prev[selectedPlayer],\n [listeningFor]: i,\n }\n }));\n setListeningFor(null);\n return; // Stop polling\n }\n }\n }\n\n rafRef.current = requestAnimationFrame(poll);\n };\n\n rafRef.current = requestAnimationFrame(poll);\n\n return () => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, [isOpen, listeningFor, selectedPlayer]);\n\n // Handle keyboard escape to cancel listening\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.code === 'Escape') {\n if (listeningFor) {\n setListeningFor(null);\n } else {\n onClose();\n }\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, listeningFor, onClose]);\n\n const handleReset = () => {\n setBindings(prev => ({\n ...prev,\n [selectedPlayer]: { ...DEFAULT_GAMEPAD },\n }));\n };\n\n const handleSave = () => {\n // Save bindings for all players\n Object.entries(bindings).forEach(([player, playerBindings]) => {\n const playerIdx = parseInt(player) as PlayerIndex;\n saveGamepadMapping(playerBindings, playerIdx);\n });\n onSave?.(bindings[selectedPlayer], selectedPlayer);\n onClose();\n };\n\n if (!isOpen) return null;\n\n const currentBindings = bindings[selectedPlayer] ?? DEFAULT_GAMEPAD;\n const currentGamepad = gamepads.find(g => g.index === selectedPlayer - 1);\n const brand = currentGamepad ? detectControllerBrand(currentGamepad.id) : 'generic';\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/80 backdrop-blur-sm\"\n onClick={() => !listeningFor && onClose()}\n />\n\n {/* Modal */}\n <div className=\"relative bg-gray-900 border border-retro-primary/30 rounded-xl shadow-2xl w-full max-w-lg mx-4 overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-white/10 bg-black/50\">\n <div className=\"flex items-center gap-3\">\n <Joystick className=\"text-retro-primary\" size={24} style={{ color: systemColor }} />\n <div>\n <h2 className=\"text-lg font-bold text-white\">{t.modals.gamepad.title}</h2>\n <p className=\"text-xs text-gray-400\">\n {gamepads.length > 0\n ? t.modals.gamepad.connected.replace('{{count}}', gamepads.length.toString())\n : t.modals.gamepad.none}\n </p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-white/10 text-gray-400 hover:text-white transition-colors\"\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Player selector (if multiple gamepads) */}\n {gamepads.length > 1 && (\n <div className=\"px-6 py-3 border-b border-white/10 bg-black/30\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-gray-400 font-medium\">{t.modals.gamepad.player}</span>\n <div className=\"flex gap-1\">\n {gamepads.map((gp) => (\n <button\n key={gp.index}\n onClick={() => setSelectedPlayer(gp.index + 1)}\n className={`\n flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-sm font-medium transition-all\n ${selectedPlayer === gp.index + 1\n ? 'bg-retro-primary/20 text-retro-primary'\n : 'bg-white/5 text-gray-400 hover:bg-white/10 hover:text-white'\n }\n `}\n style={selectedPlayer === gp.index + 1 ? {\n backgroundColor: `${systemColor}20`,\n color: systemColor\n } : {}}\n >\n <User size={14} />\n P{gp.index + 1}\n </button>\n ))}\n </div>\n </div>\n {currentGamepad && (\n <p className=\"text-xs text-gray-500 mt-1\">\n {currentGamepad.name}\n </p>\n )}\n </div>\n )}\n\n {/* Single gamepad info */}\n {gamepads.length === 1 && currentGamepad && (\n <div className=\"px-6 py-2 border-b border-white/10 bg-black/30\">\n <p className=\"text-xs text-gray-400\">\n {currentGamepad.name} • Player 1\n </p>\n </div>\n )}\n\n {/* No gamepads warning */}\n {gamepads.length === 0 && (\n <div className=\"px-6 py-10 text-center\">\n <div className=\"relative inline-block mb-4\">\n <Joystick size={56} className=\"text-gray-600 animate-pulse\" />\n {/* Animated ring */}\n <div className=\"absolute inset-0 -m-2 rounded-full border-2 border-dashed border-gray-600 animate-spin\" style={{ animationDuration: '8s' }} />\n </div>\n <p className=\"text-gray-300 font-medium mb-2\">{t.modals.gamepad.noController}</p>\n <p className=\"text-sm text-gray-500 mb-4\">\n {t.modals.gamepad.pressAny}\n </p>\n <div className=\"inline-flex items-center gap-2 px-4 py-2 rounded-lg bg-white/5 border border-white/10\">\n <span className=\"text-xs text-gray-400\">{t.modals.gamepad.waiting}</span>\n <div className=\"flex gap-1\">\n <div className=\"w-1.5 h-1.5 rounded-full bg-gray-500 animate-bounce\" style={{ animationDelay: '0ms' }} />\n <div className=\"w-1.5 h-1.5 rounded-full bg-gray-500 animate-bounce\" style={{ animationDelay: '150ms' }} />\n <div className=\"w-1.5 h-1.5 rounded-full bg-gray-500 animate-bounce\" style={{ animationDelay: '300ms' }} />\n </div>\n </div>\n </div>\n )}\n\n {/* Button mapping grid */}\n {gamepads.length > 0 && (\n <div className=\"p-4 space-y-6 max-h-[400px] overflow-y-auto\">\n {listeningFor && (\n <div className=\"p-4 rounded-lg bg-black/50 border border-retro-primary/50 text-center animate-pulse\" style={{ borderColor: `${systemColor}50` }}>\n <p className=\"text-sm text-white mb-1\">\n {t.modals.gamepad.pressButton.replace('{{button}}', BUTTON_LABELS[listeningFor])}\n </p>\n <p className=\"text-xs text-gray-400\">\n {t.modals.gamepad.pressEsc}\n </p>\n </div>\n )}\n\n {BUTTON_GROUPS.map((group) => (\n <div key={group.label}>\n <h3 className=\"text-xs font-bold text-gray-500 uppercase tracking-wider mb-2\">\n {group.label}\n </h3>\n <div className=\"grid grid-cols-2 gap-2\">\n {group.buttons.map((btn) => (\n <button\n key={btn}\n onClick={() => setListeningFor(btn)}\n disabled={!!listeningFor && listeningFor !== btn}\n className={`\n flex items-center justify-between px-4 py-3 rounded-lg border transition-all\n disabled:opacity-50\n ${listeningFor === btn\n ? 'border-retro-primary bg-retro-primary/20 ring-2 ring-retro-primary/50'\n : 'border-white/10 bg-white/5 hover:border-white/20 hover:bg-white/10'\n }\n `}\n style={listeningFor === btn ? {\n borderColor: systemColor,\n backgroundColor: `${systemColor}20`,\n boxShadow: `0 0 0 2px ${systemColor}50`,\n } : {}}\n >\n <span className=\"text-sm text-gray-300\">\n {BUTTON_LABELS[btn]}\n </span>\n <span\n className={`\n px-2 py-1 rounded text-xs font-mono\n ${listeningFor === btn\n ? 'bg-retro-primary/30 text-retro-primary animate-pulse'\n : 'bg-black/50 text-white'\n }\n `}\n style={listeningFor === btn ? {\n backgroundColor: `${systemColor}30`,\n color: systemColor,\n } : {}}\n >\n {listeningFor === btn ? t.controls.press : formatGamepadButton(currentBindings[btn])}\n </span>\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* Footer */}\n {gamepads.length > 0 && (\n <div className=\"flex items-center justify-between px-6 py-4 bg-black/30 border-t border-white/10\">\n <button\n onClick={handleReset}\n disabled={!!listeningFor}\n className=\"flex items-center gap-2 px-4 py-2 rounded-lg text-sm text-gray-400 hover:text-white hover:bg-white/10 transition-colors disabled:opacity-50\"\n >\n <RotateCcw size={16} />\n {t.modals.gamepad.reset}\n </button>\n <button\n onClick={handleSave}\n disabled={!!listeningFor}\n className=\"flex items-center gap-2 px-6 py-2 rounded-lg bg-retro-primary text-black font-bold text-sm hover:bg-retro-primary/90 transition-colors disabled:opacity-50\"\n style={{ backgroundColor: systemColor }}\n >\n <Check size={16} />\n {t.modals.gamepad.save}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { X, Code, Check, Copy } from 'lucide-react';\nimport { CheatModalProps, Cheat } from '../types';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\nexport default function CheatModal({\n isOpen,\n cheats,\n activeCheats,\n onToggle,\n onClose,\n}: CheatModalProps) {\n const t = useKoinTranslation();\n const [copiedId, setCopiedId] = React.useState<number | null>(null);\n\n if (!isOpen) return null;\n\n const handleCopy = async (code: string, id: number) => {\n await navigator.clipboard.writeText(code);\n setCopiedId(id);\n setTimeout(() => setCopiedId(null), 2000);\n };\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/80 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <div className=\"relative bg-gray-900 border border-retro-primary/30 rounded-xl shadow-2xl w-full max-w-lg mx-4 overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-white/10 bg-black/50\">\n <div className=\"flex items-center gap-3\">\n <Code className=\"text-purple-400\" size={24} />\n <div>\n <h2 className=\"text-lg font-bold text-white\">{t.modals.cheats.title}</h2>\n <p className=\"text-xs text-gray-400\">\n {t.modals.cheats.available.replace('{{count}}', cheats.length.toString())}\n </p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-white/10 text-gray-400 hover:text-white transition-colors\"\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Cheats List */}\n <div className=\"p-4 space-y-2 max-h-[400px] overflow-y-auto\">\n {cheats.length === 0 ? (\n <div className=\"text-center py-12 text-gray-500\">\n <Code size={48} className=\"mx-auto mb-3 opacity-50\" />\n <p className=\"font-medium\">{t.modals.cheats.emptyTitle}</p>\n <p className=\"text-sm mt-1\">{t.modals.cheats.emptyDesc}</p>\n </div>\n ) : (\n cheats.map((cheat) => {\n const isActive = activeCheats.has(cheat.id);\n\n return (\n <div\n key={cheat.id}\n className={`\n group flex items-start gap-4 p-4 rounded-lg border transition-all cursor-pointer\n ${isActive\n ? 'border-purple-500/50 bg-purple-500/10'\n : 'border-white/10 bg-white/5 hover:border-white/20 hover:bg-white/10'\n }\n `}\n onClick={() => onToggle(cheat.id)}\n >\n {/* Toggle */}\n <div\n className={`\n flex-shrink-0 w-6 h-6 rounded border-2 flex items-center justify-center transition-all\n ${isActive\n ? 'border-purple-500 bg-purple-500'\n : 'border-gray-600 group-hover:border-gray-400'\n }\n `}\n >\n {isActive && <Check size={14} className=\"text-white\" />}\n </div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <p className={`font-medium ${isActive ? 'text-purple-300' : 'text-white'}`}>\n {cheat.description}\n </p>\n <div className=\"flex items-center gap-2 mt-2\">\n <code className=\"px-2 py-1 bg-black/50 rounded text-xs font-mono text-gray-400 truncate max-w-[200px]\">\n {cheat.code}\n </code>\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleCopy(cheat.code, cheat.id);\n }}\n className=\"p-1.5 rounded hover:bg-white/10 text-gray-500 hover:text-white transition-colors\"\n title={t.modals.cheats.copy}\n >\n {copiedId === cheat.id ? (\n <Check size={14} className=\"text-green-400\" />\n ) : (\n <Copy size={14} />\n )}\n </button>\n </div>\n </div>\n </div>\n );\n })\n )}\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-3 bg-black/30 border-t border-white/10\">\n <p className=\"text-xs text-gray-500 text-center\">\n {activeCheats.size > 0\n ? t.modals.cheats.active.replace('{{count}}', activeCheats.size.toString())\n : t.modals.cheats.toggleHint\n }\n </p>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { X, Save, Download, Trash2, Clock, HardDrive, Loader2, RefreshCw, Lock, Zap } from 'lucide-react';\nimport { SaveSlotModalProps, SaveSlot } from '../types';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\n// Slot 5 is reserved for auto-save\nconst AUTO_SAVE_SLOT = 5;\n\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;\n}\n\nfunction formatTimestamp(timestamp: string): string {\n try {\n const date = new Date(timestamp);\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n\n // Less than 1 minute\n if (diff < 60000) return 'Just now';\n // Less than 1 hour\n if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`;\n // Less than 24 hours\n if (diff < 86400000) return `${Math.floor(diff / 3600000)}h ago`;\n // Otherwise show date\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n } catch {\n return 'Unknown';\n }\n}\n\nexport default function SaveSlotModal({\n isOpen,\n mode,\n slots,\n isLoading,\n actioningSlot,\n onSelect,\n onDelete,\n onClose,\n maxSlots = 5,\n onUpgrade,\n}: SaveSlotModalProps) {\n const t = useKoinTranslation();\n\n if (!isOpen) return null;\n\n const isSaveMode = mode === 'save';\n const allSlots = [1, 2, 3, 4, 5];\n const isUnlimited = maxSlots === -1 || maxSlots >= 5;\n\n // For load mode, sort slots to show most recently saved first\n // For save mode, keep original order (1-5) so users know which slot is which\n const displaySlots = isSaveMode\n ? allSlots\n : [...allSlots].sort((a, b) => {\n const slotA = slots.find(s => s.slot === a);\n const slotB = slots.find(s => s.slot === b);\n // Empty slots go to the end\n if (!slotA && !slotB) return a - b;\n if (!slotA) return 1;\n if (!slotB) return -1;\n // Sort by timestamp descending (most recent first)\n return new Date(slotB.timestamp).getTime() - new Date(slotA.timestamp).getTime();\n });\n\n const getSlotData = (slotNum: number): SaveSlot | undefined => {\n return slots.find((s) => s.slot === slotNum);\n };\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/80 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <div className=\"relative bg-gray-900 border border-retro-primary/30 rounded-xl shadow-2xl w-full max-w-md mx-4 overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-white/10 bg-black/50\">\n <div className=\"flex items-center gap-3\">\n {isSaveMode ? (\n <Save className=\"text-retro-primary\" size={24} />\n ) : (\n <Download className=\"text-retro-primary\" size={24} />\n )}\n <div>\n <h2 className=\"text-lg font-bold text-white\">\n {isSaveMode ? t.modals.saveSlots.saveTitle : t.modals.saveSlots.loadTitle}\n </h2>\n <p className=\"text-xs text-gray-400\">\n {isSaveMode ? t.modals.saveSlots.subtitleSave : t.modals.saveSlots.subtitleLoad}\n </p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-white/10 text-gray-400 hover:text-white transition-colors\"\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Slots List */}\n <div className=\"p-4 space-y-2 max-h-[400px] overflow-y-auto\">\n {isLoading ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-gray-400\">\n <Loader2 className=\"w-8 h-8 animate-spin mb-3\" />\n <span className=\"text-sm\">{t.modals.saveSlots.loading}</span>\n </div>\n ) : (\n displaySlots.map((slotNum) => {\n const slotData = getSlotData(slotNum);\n const isEmpty = !slotData;\n const isAutoSaveSlot = slotNum === AUTO_SAVE_SLOT;\n // Check if slot is locked by tier (only for manual slots 1-4)\n const isLockedByTier = !isUnlimited && !isAutoSaveSlot && slotNum > maxSlots && isEmpty;\n const isDisabled = (!isSaveMode && isEmpty) || (isSaveMode && isAutoSaveSlot) || (isSaveMode && isLockedByTier);\n const isActioning = actioningSlot === slotNum;\n\n // Locked slot - show upgrade prompt\n if (isLockedByTier && isSaveMode) {\n return (\n <div\n key={slotNum}\n onClick={() => onUpgrade?.()}\n className={`group relative flex items-center gap-4 p-4 rounded-lg border border-gray-700 bg-gray-800/50 transition-all ${onUpgrade ? 'cursor-pointer hover:border-retro-primary/30' : 'cursor-default'}`}\n >\n <div className=\"flex-shrink-0 w-12 h-12 rounded-lg flex items-center justify-center font-bold text-xl bg-gray-700 text-gray-500\">\n <Lock size={20} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-gray-400 group-hover:text-white transition-colors\">\n {t.modals.saveSlots.locked.replace('{{num}}', slotNum.toString())}\n </p>\n <p className=\"text-xs text-gray-500 group-hover:text-retro-primary transition-colors flex items-center gap-1\">\n <Zap size={10} />\n {t.modals.saveSlots.upgrade}\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div\n key={slotNum}\n className={`\n group relative flex items-center gap-4 p-4 rounded-lg border transition-all\n ${isAutoSaveSlot && isSaveMode\n ? 'border-retro-primary/20 bg-retro-primary/5 cursor-not-allowed'\n : isDisabled\n ? 'border-white/5 bg-white/5 opacity-50 cursor-not-allowed'\n : isActioning\n ? 'border-retro-primary bg-retro-primary/10 cursor-wait'\n : 'border-white/10 bg-white/5 hover:border-retro-primary/50 hover:border-retro-primary/10 cursor-pointer'\n }\n `}\n onClick={() => !isDisabled && !isActioning && onSelect(slotNum)}\n >\n {/* Slot Number / Auto-save badge */}\n <div className={`\n flex-shrink-0 w-12 h-12 rounded-lg flex items-center justify-center font-bold text-xl\n ${isAutoSaveSlot\n ? 'bg-retro-primary/20 text-retro-primary'\n : isEmpty\n ? 'bg-gray-800 text-gray-600'\n : 'bg-retro-primary/20 text-retro-primary'\n }\n `}>\n {isActioning ? (\n <Loader2 className=\"animate-spin\" size={24} />\n ) : isAutoSaveSlot ? (\n <RefreshCw size={20} />\n ) : (\n slotNum\n )}\n </div>\n\n {/* Slot Info */}\n <div className=\"flex-1 min-w-0\">\n {isAutoSaveSlot ? (\n // Auto-save slot - special display\n isEmpty ? (\n <div className=\"text-retro-primary/70\">\n <p className=\"font-medium\">{t.modals.saveSlots.autoSave}</p>\n <p className=\"text-xs text-retro-primary/50\">{t.modals.saveSlots.autoSaveDesc}</p>\n </div>\n ) : (\n <div className=\"flex items-center gap-3\">\n {slotData.screenshot && (\n <div className=\"flex-shrink-0 w-16 h-12 rounded border border-retro-primary/30 overflow-hidden bg-black\">\n <img\n src={slotData.screenshot}\n alt=\"Auto-save\"\n className=\"w-full h-full object-cover\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-retro-primary truncate\">\n {t.modals.saveSlots.autoSave}\n </p>\n <div className=\"flex items-center gap-3 text-xs text-retro-primary/60 mt-1\">\n <span className=\"flex items-center gap-1\">\n <Clock size={12} />\n {formatTimestamp(slotData.timestamp)}\n </span>\n <span className=\"flex items-center gap-1\">\n <HardDrive size={12} />\n {formatBytes(slotData.size)}\n </span>\n </div>\n </div>\n </div>\n )\n ) : isEmpty ? (\n <div className=\"text-gray-500\">\n <p className=\"font-medium\">{t.modals.saveSlots.emptySlot}</p>\n <p className=\"text-xs\">{t.modals.saveSlots.noData}</p>\n </div>\n ) : (\n <div className=\"flex items-center gap-3\">\n {/* Screenshot */}\n {slotData.screenshot && (\n <div className=\"flex-shrink-0 w-16 h-12 rounded border border-white/10 overflow-hidden bg-black\">\n <img\n src={slotData.screenshot}\n alt={`Save slot ${slotNum}`}\n className=\"w-full h-full object-cover\"\n onError={(e) => {\n // Hide image if it fails to load\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-white truncate\">\n {t.modals.saveSlots.slot.replace('{{num}}', slotNum.toString())}\n </p>\n <div className=\"flex items-center gap-3 text-xs text-gray-400 mt-1\">\n <span className=\"flex items-center gap-1\">\n <Clock size={12} />\n {formatTimestamp(slotData.timestamp)}\n </span>\n <span className=\"flex items-center gap-1\">\n <HardDrive size={12} />\n {formatBytes(slotData.size)}\n </span>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Delete button - only for non-empty slots, hide for auto-save in save mode */}\n {!isEmpty && !(isAutoSaveSlot && isSaveMode) && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDelete(slotNum);\n }}\n className=\"flex-shrink-0 p-2.5 rounded-lg bg-retro-tertiary/10 hover:bg-retro-tertiary/20 text-retro-tertiary hover:text-retro-tertiary transition-all border border-retro-tertiary/20\"\n title=\"Delete save\"\n >\n <Trash2 size={16} />\n </button>\n )}\n </div>\n );\n })\n )}\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-3 bg-black/30 border-t border-white/10\">\n <p className=\"text-xs text-gray-500 text-center\">\n {isSaveMode\n ? t.modals.saveSlots.footerSave\n : t.modals.saveSlots.footerLoad\n }\n </p>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\n\nimport { X, Cpu, Check, FileCode, AlertCircle, Code } from 'lucide-react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\nexport interface BiosOption {\n id: string;\n name: string;\n description?: string;\n}\n\ninterface BiosSelectionModalProps {\n isOpen: boolean;\n onClose: () => void;\n biosOptions: BiosOption[];\n currentBiosId?: string;\n onSelectBios: (id: string) => void;\n systemColor?: string;\n}\n\nexport default function BiosSelectionModal({\n isOpen,\n onClose,\n biosOptions,\n currentBiosId,\n onSelectBios,\n systemColor = '#00FF41',\n}: BiosSelectionModalProps) {\n const t = useKoinTranslation();\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/80 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <div\n className=\"relative bg-gray-900 border rounded-xl shadow-2xl w-full max-w-lg mx-4 overflow-hidden flex flex-col max-h-[80vh]\"\n style={{ borderColor: `${systemColor}40` }}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-white/10 bg-black/50 bg-noise\">\n <div className=\"flex items-center gap-3\">\n <Cpu size={24} style={{ color: systemColor }} />\n <div>\n <h2 className=\"text-lg font-bold text-white uppercase tracking-wide\">{t.modals.bios.title}</h2>\n <p className=\"text-xs text-gray-400\">\n {t.modals.bios.description}\n </p>\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-white/10 text-gray-400 hover:text-white transition-colors\"\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-4 overflow-y-auto space-y-2\">\n {/* Warning Notice */}\n <div className=\"mb-4 p-3 rounded bg-yellow-500/10 border border-yellow-500/20 flex items-start gap-3\">\n <AlertCircle className=\"shrink-0 text-yellow-500 mt-0.5\" size={16} />\n <div className=\"text-xs text-yellow-200/80\">\n <strong>{t.modals.bios.warningTitle}</strong> {t.modals.bios.warning}\n </div>\n </div>\n\n {/* System Default Option (Clear Selection) */}\n <button\n onClick={() => onSelectBios('')}\n className={`\n w-full group flex items-center gap-4 p-4 rounded-lg border transition-all text-left mb-2\n ${!currentBiosId\n ? 'bg-white/10'\n : 'bg-black/20 hover:bg-white/5 border-white/5 hover:border-white/20'\n }\n `}\n style={{\n borderColor: !currentBiosId ? systemColor : undefined\n }}\n >\n <div\n className={`shrink-0 w-10 h-10 rounded-lg flex items-center justify-center border transition-colors\n ${!currentBiosId ? '' : 'border-white/10 bg-black/30 group-hover:border-white/20'}\n `}\n style={{\n backgroundColor: !currentBiosId ? `${systemColor}20` : undefined,\n borderColor: !currentBiosId ? systemColor : undefined\n }}\n >\n <Cpu size={20} style={{ color: !currentBiosId ? systemColor : '#6b7280' }} />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className={`font-mono font-bold truncate ${!currentBiosId ? 'text-white' : 'text-gray-300'}`}>\n {t.modals.bios.systemDefault}\n </span>\n {!currentBiosId && (\n <span className=\"px-1.5 py-0.5 rounded text-[10px] font-bold bg-white/20 text-white uppercase tracking-wider\">\n {t.modals.bios.active}\n </span>\n )}\n </div>\n <p className=\"text-xs text-gray-500 truncate mt-0.5\">\n {t.modals.bios.defaultDesc}\n </p>\n </div>\n {!currentBiosId && (\n <Check size={20} style={{ color: systemColor }} />\n )}\n </button>\n\n {biosOptions.length === 0 ? (\n <div className=\"text-center py-8 text-gray-500\">\n <FileCode size={48} className=\"mx-auto mb-3 opacity-30\" />\n <p className=\"text-sm\">{t.modals.bios.emptyTitle}</p>\n <p className=\"text-[10px] mt-1 text-gray-600\">{t.modals.bios.emptyDesc}</p>\n </div>\n ) : (\n biosOptions.map((bios) => {\n const isSelected = bios.id === currentBiosId;\n\n return (\n <button\n key={bios.id}\n onClick={() => onSelectBios(bios.id)}\n className={`\n w-full group flex items-center gap-4 p-4 rounded-lg border transition-all text-left\n ${isSelected\n ? 'bg-white/10'\n : 'bg-black/20 hover:bg-white/5 border-white/5 hover:border-white/20'\n }\n `}\n style={{\n borderColor: isSelected ? systemColor : undefined\n }}\n >\n {/* Icon */}\n <div\n className={`shrink-0 w-10 h-10 rounded-lg flex items-center justify-center border transition-colors\n ${isSelected ? '' : 'border-white/10 bg-black/30 group-hover:border-white/20'}\n `}\n style={{\n backgroundColor: isSelected ? `${systemColor}20` : undefined,\n borderColor: isSelected ? systemColor : undefined\n }}\n >\n <Code size={20} style={{ color: isSelected ? systemColor : '#6b7280' }} />\n </div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className={`font-mono font-bold truncate ${isSelected ? 'text-white' : 'text-gray-300'}`}>\n {bios.name}\n </span>\n {isSelected && (\n <span className=\"px-1.5 py-0.5 rounded text-[10px] font-bold bg-white/20 text-white uppercase tracking-wider\">\n {t.modals.bios.active}\n </span>\n )}\n </div>\n {bios.description && (\n <p className=\"text-xs text-gray-500 truncate mt-0.5\">\n {bios.description}\n </p>\n )}\n </div>\n\n {/* Checkmark */}\n {isSelected && (\n <Check size={20} style={{ color: systemColor }} />\n )}\n </button>\n );\n })\n )}\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-3 bg-black/30 border-t border-white/10 text-center\">\n <p className=\"text-[10px] text-gray-500 uppercase tracking-widest\">\n {t.modals.bios.footer}\n </p>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { X, Globe, Check, Settings } from 'lucide-react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ninterface SettingsModalProps {\n isOpen: boolean;\n onClose: () => void;\n currentLanguage: string;\n onLanguageChange: (lang: 'en' | 'es' | 'fr') => void;\n systemColor?: string;\n}\n\nexport default function SettingsModal({\n isOpen,\n onClose,\n currentLanguage,\n onLanguageChange,\n systemColor = '#00FF41',\n}: SettingsModalProps) {\n const t = useKoinTranslation();\n\n if (!isOpen) return null;\n\n const languages = [\n { code: 'en', name: 'English' },\n { code: 'es', name: 'Español' },\n { code: 'fr', name: 'Français' },\n ] as const;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/80 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n {/* Modal */}\n <div className=\"relative bg-gray-900 border border-white/10 rounded-xl shadow-2xl w-full max-w-sm mx-4 overflow-hidden animate-in fade-in zoom-in-95 duration-200\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-white/10 bg-black/50\">\n <div className=\"flex items-center gap-3\">\n <Settings className=\"text-white\" size={20} />\n <h2 className=\"text-lg font-bold text-white\">\n {t.settings.title}\n </h2>\n </div>\n <button\n onClick={onClose}\n className=\"p-2 rounded-lg hover:bg-white/10 text-gray-400 hover:text-white transition-colors\"\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"p-6 space-y-6\">\n {/* Language Section */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-gray-400\">\n <Globe size={16} />\n <span>{t.settings.language}</span>\n </div>\n\n <div className=\"grid gap-2\">\n {languages.map((lang) => {\n const isActive = currentLanguage === lang.code;\n return (\n <button\n key={lang.code}\n onClick={() => onLanguageChange(lang.code)}\n className={`\n flex items-center justify-between px-4 py-3 rounded-lg border transition-all\n ${isActive\n ? 'bg-white/10 border-white/20 text-white'\n : 'bg-black/20 border-transparent text-gray-400 hover:bg-white/5 hover:text-white'\n }\n `}\n >\n <span>{lang.name}</span>\n {isActive && (\n <Check size={16} style={{ color: systemColor }} />\n )}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-4 bg-black/30 border-t border-white/10 text-center\">\n <button\n onClick={onClose}\n className=\"text-sm text-gray-500 hover:text-white transition-colors\"\n >\n {t.modals.shortcuts.pressEsc}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import ControlMapper from './Modals/ControlMapper';\nimport GamepadMapper from './Modals/GamepadMapper';\nimport CheatModal from './Modals/CheatModal';\nimport SavedSlotModal from './Modals/SaveSlotModal';\nimport BiosSelectionModal from './Modals/BiosSelectionModal';\nimport SettingsModal from './Modals/SettingsModal';\nimport { KeyboardMapping } from '../lib/controls';\nimport { SaveSlot } from './types';\n\ninterface GameModalsProps {\n controlsModalOpen: boolean;\n setControlsModalOpen: (open: boolean) => void;\n controls: KeyboardMapping;\n saveControls: (newControls: KeyboardMapping) => void;\n system: string;\n onResume: () => void;\n\n gamepadModalOpen: boolean;\n setGamepadModalOpen: (open: boolean) => void;\n gamepads: any[]; // Using any[] for now as Gamepad type might be complex or standard\n systemColor: string;\n\n cheatsModalOpen: boolean;\n setCheatsModalOpen: (open: boolean) => void;\n cheats: any[]; // Using any[] for Cheat type\n activeCheats: Set<number>;\n onToggleCheat: (cheatId: number) => void;\n\n // Save Slot Modal\n saveModalOpen: boolean;\n setSaveModalOpen: (open: boolean) => void;\n saveModalMode: 'save' | 'load';\n saveSlots: SaveSlot[];\n isSlotLoading: boolean;\n actioningSlot: number | null;\n onSlotSelect: (slot: number) => void;\n onSlotDelete: (slot: number) => void;\n maxSlots?: number;\n currentTier?: string;\n onUpgrade?: () => void;\n\n // Bios Modal\n biosModalOpen: boolean;\n setBiosModalOpen: (open: boolean) => void;\n availableBios?: { id: string; name: string; description?: string }[];\n currentBiosId?: string;\n onSelectBios?: (biosId: string) => void;\n\n // Settings Modal\n settingsModalOpen: boolean;\n setSettingsModalOpen: (open: boolean) => void;\n currentLanguage: string;\n onLanguageChange: (lang: 'en' | 'es' | 'fr') => void;\n}\n\nexport default function GameModals({\n controlsModalOpen,\n setControlsModalOpen,\n controls,\n saveControls,\n system,\n onResume,\n\n gamepadModalOpen,\n setGamepadModalOpen,\n gamepads,\n systemColor,\n\n cheatsModalOpen,\n setCheatsModalOpen,\n cheats,\n activeCheats,\n onToggleCheat,\n\n saveModalOpen,\n setSaveModalOpen,\n saveModalMode,\n saveSlots,\n isSlotLoading,\n actioningSlot,\n onSlotSelect,\n onSlotDelete,\n maxSlots,\n currentTier,\n onUpgrade,\n\n biosModalOpen,\n setBiosModalOpen,\n availableBios,\n currentBiosId,\n onSelectBios,\n\n settingsModalOpen,\n setSettingsModalOpen,\n currentLanguage,\n onLanguageChange,\n}: GameModalsProps) {\n return (\n <>\n <ControlMapper\n isOpen={controlsModalOpen}\n controls={controls}\n onSave={saveControls}\n onClose={() => {\n setControlsModalOpen(false);\n onResume();\n }}\n system={system}\n />\n\n <GamepadMapper\n isOpen={gamepadModalOpen}\n gamepads={gamepads}\n onClose={() => {\n setGamepadModalOpen(false);\n onResume();\n }}\n systemColor={systemColor}\n />\n\n <CheatModal\n isOpen={cheatsModalOpen}\n cheats={cheats}\n activeCheats={activeCheats}\n onToggle={onToggleCheat}\n onClose={() => {\n setCheatsModalOpen(false);\n onResume();\n }}\n />\n\n <SavedSlotModal\n isOpen={saveModalOpen}\n mode={saveModalMode}\n slots={saveSlots}\n isLoading={isSlotLoading}\n actioningSlot={actioningSlot}\n onSelect={onSlotSelect}\n onDelete={onSlotDelete}\n onClose={() => {\n setSaveModalOpen(false);\n onResume();\n }}\n maxSlots={maxSlots}\n currentTier={currentTier}\n onUpgrade={onUpgrade}\n />\n\n <BiosSelectionModal\n isOpen={biosModalOpen}\n biosOptions={availableBios || []}\n currentBiosId={currentBiosId}\n onSelectBios={(id) => {\n setBiosModalOpen(false);\n onSelectBios?.(id);\n }}\n onClose={() => {\n setBiosModalOpen(false);\n onResume();\n }}\n systemColor={systemColor}\n />\n\n <SettingsModal\n isOpen={settingsModalOpen}\n onClose={() => {\n setSettingsModalOpen(false);\n onResume();\n }}\n currentLanguage={currentLanguage}\n onLanguageChange={onLanguageChange}\n systemColor={systemColor}\n />\n </>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport {\n Trophy,\n User,\n Lock,\n ExternalLink,\n AlertCircle,\n Loader2,\n Eye,\n EyeOff,\n} from 'lucide-react';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\nexport interface LoginFormProps {\n username: string;\n setUsername: (v: string) => void;\n password: string;\n setPassword: (v: string) => void;\n showPassword: boolean;\n setShowPassword: (v: boolean) => void;\n isLoading: boolean;\n error: string | null;\n onSubmit: (e: React.FormEvent) => void;\n}\n\nexport default function LoginForm({\n username,\n setUsername,\n password,\n setPassword,\n showPassword,\n setShowPassword,\n isLoading,\n error,\n onSubmit,\n}: LoginFormProps) {\n const t = useKoinTranslation();\n\n return (\n <form onSubmit={onSubmit} className=\"p-4 space-y-3\">\n <div className=\"text-center mb-4\">\n <div className=\"w-16 h-16 mx-auto mb-3 rounded-full bg-gradient-to-br from-yellow-500/20 to-orange-500/20 border border-yellow-500/30 flex items-center justify-center\">\n <Trophy className=\"text-yellow-400\" size={32} />\n </div>\n <p className=\"text-gray-400 text-xs\">\n {t.retroAchievements.connectAccount}\n </p>\n <a\n href=\"https://retroachievements.org/createaccount.php\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-yellow-400 hover:text-yellow-300 text-xs inline-flex items-center gap-1 mt-1\"\n >\n {t.retroAchievements.createAccount}\n <ExternalLink size={10} />\n </a>\n </div>\n\n {/* Username */}\n <div>\n <label className=\"block text-[10px] text-gray-500 mb-1 uppercase tracking-wider\">{t.retroAchievements.username}</label>\n <div className=\"relative\">\n <User className=\"absolute left-2.5 top-1/2 -translate-y-1/2 text-gray-500\" size={14} />\n <input\n type=\"text\"\n value={username}\n onChange={(e) => setUsername(e.target.value)}\n placeholder={t.retroAchievements.yourUsername}\n className=\"w-full pl-8 pr-3 py-2 text-sm bg-black/50 border border-white/20 rounded-lg text-white placeholder-gray-500 focus:border-yellow-500/50 focus:outline-none transition-colors\"\n disabled={isLoading}\n />\n </div>\n </div>\n\n {/* Password */}\n <div>\n <label className=\"block text-[10px] text-gray-500 mb-1 uppercase tracking-wider\">\n {t.retroAchievements.password}\n </label>\n <div className=\"relative\">\n <Lock className=\"absolute left-2.5 top-1/2 -translate-y-1/2 text-gray-500\" size={14} />\n <input\n type={showPassword ? 'text' : 'password'}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder={t.retroAchievements.yourPassword}\n className=\"w-full pl-8 pr-9 py-2 text-sm bg-black/50 border border-white/20 rounded-lg text-white placeholder-gray-500 focus:border-yellow-500/50 focus:outline-none transition-colors\"\n disabled={isLoading}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword(!showPassword)}\n className=\"absolute right-2.5 top-1/2 -translate-y-1/2 text-gray-500 hover:text-gray-300\"\n >\n {showPassword ? <EyeOff size={14} /> : <Eye size={14} />}\n </button>\n </div>\n </div>\n\n {/* Error */}\n {error && (\n <div className=\"flex items-center gap-2 p-2 bg-red-500/10 border border-red-500/30 rounded-lg\">\n <AlertCircle className=\"text-red-400 flex-shrink-0\" size={12} />\n <p className=\"text-xs text-red-300\">{error}</p>\n </div>\n )}\n\n {/* Submit */}\n <button\n type=\"submit\"\n disabled={isLoading}\n className=\"w-full flex items-center justify-center gap-2 px-3 py-2.5 bg-gradient-to-r from-yellow-500 to-orange-500 hover:from-yellow-400 hover:to-orange-400 text-black text-sm font-bold rounded-lg transition-all disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {isLoading ? (\n <>\n <Loader2 className=\"animate-spin\" size={14} />\n <span>{t.retroAchievements.connecting}</span>\n </>\n ) : (\n <>\n <Trophy size={14} />\n <span>{t.retroAchievements.login}</span>\n </>\n )}\n </button>\n\n {/* Privacy notice */}\n <div className=\"p-2 bg-blue-500/10 border border-blue-500/20 rounded-lg\">\n <p className=\"text-[10px] text-blue-300 leading-relaxed\">\n <strong>🔒 {t.retroAchievements.privacy}</strong> {t.retroAchievements.privacyText}\n </p>\n </div>\n </form>\n );\n}\n","// RetroAchievements Types & Helpers\n// Extracted from main app for package use\n\nexport const RA_MEDIA_BASE = 'https://media.retroachievements.org';\n\n// ==================== Types ====================\n\nexport interface RACredentials {\n username: string;\n connectToken: string; // Token from password login (for dorequest.php/Connect API)\n apiKey?: string; // Web API Key (optional, for legacy public API calls)\n score?: number;\n softcoreScore?: number;\n avatarUrl?: string;\n}\n\nexport interface RAUser {\n User: string;\n Token: string;\n Score: number;\n SoftcoreScore: number;\n Messages: number;\n Permissions: number;\n AccountType: string;\n}\n\nexport interface RAAchievement {\n ID: number;\n NumAwarded: number;\n NumAwardedHardcore: number;\n Title: string;\n Description: string;\n Points: number;\n TrueRatio: number;\n Author: string;\n DateModified: string;\n DateCreated: string;\n BadgeName: string;\n DisplayOrder: number;\n MemAddr: string; // Achievement trigger conditions\n type: string | null;\n // User progress\n DateEarned?: string;\n DateEarnedHardcore?: string;\n}\n\nexport interface RAGame {\n ID: number;\n Title: string;\n ConsoleID: number;\n ConsoleName: string;\n ForumTopicID: number;\n Flags: number;\n ImageIcon: string;\n ImageTitle: string;\n ImageIngame: string;\n ImageBoxArt: string;\n Publisher: string;\n Developer: string;\n Genre: string;\n Released: string;\n IsFinal: boolean;\n RichPresencePatch?: string;\n NumAchievements?: number;\n NumDistinctPlayersCasual?: number;\n NumDistinctPlayersHardcore?: number;\n}\n\nexport interface RAGameExtended extends RAGame {\n Achievements: Record<string, RAAchievement>;\n NumAwardedToUser?: number;\n NumAwardedToUserHardcore?: number;\n UserCompletion?: string;\n UserCompletionHardcore?: string;\n}\n\n// ==================== Helpers ====================\n\n/**\n * Get achievement badge URL\n */\nexport function getAchievementBadgeUrl(badgeName: string, locked = false): string {\n const suffix = locked ? '_lock' : '';\n return `${RA_MEDIA_BASE}/Badge/${badgeName}${suffix}.png`;\n}\n\n/**\n * Get user avatar URL\n */\nexport function getUserAvatarUrl(userPic: string): string {\n return `${RA_MEDIA_BASE}/UserPic/${userPic}.png`;\n}\n","'use client';\n\nimport {\n Trophy,\n User,\n LogOut,\n ExternalLink,\n Shield,\n CheckCircle,\n} from 'lucide-react';\nimport { RACredentials, RAGameExtended, getUserAvatarUrl } from '../../lib/retroachievements';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\nexport interface SettingsTabProps {\n credentials: RACredentials;\n hardcoreEnabled: boolean;\n onHardcoreChange: (enabled: boolean) => void;\n currentGame: RAGameExtended | null;\n achievementCount: number;\n unlockedCount: number;\n progress: number;\n onLogout: () => void;\n}\n\nexport default function SettingsTab({\n credentials,\n hardcoreEnabled,\n onHardcoreChange,\n currentGame,\n achievementCount,\n unlockedCount,\n progress,\n onLogout,\n}: SettingsTabProps) {\n const t = useKoinTranslation();\n\n return (\n <div className=\"p-3 space-y-3\">\n {/* User Card */}\n <div className=\"flex items-center gap-3 p-3 bg-black/30 rounded-lg border border-yellow-500/20\">\n <div className=\"w-12 h-12 rounded-lg bg-gray-800 overflow-hidden border-2 border-yellow-500/50 flex-shrink-0\">\n {credentials.avatarUrl ? (\n <img\n src={getUserAvatarUrl(credentials.avatarUrl)}\n alt={credentials.username}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <User className=\"text-gray-600\" size={24} />\n </div>\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-heading text-sm text-white truncate\">{credentials.username}</p>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <Trophy className=\"text-yellow-400\" size={12} />\n <span className=\"text-xs text-yellow-400\">{credentials.score?.toLocaleString() || 0}</span>\n </div>\n </div>\n <a\n href={`https://retroachievements.org/user/${credentials.username}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-gray-400 hover:text-yellow-400 transition-colors p-1\"\n >\n <ExternalLink size={14} />\n </a>\n </div>\n\n {/* Current Game */}\n {currentGame && (\n <div className=\"p-3 bg-black/30 rounded-lg border border-green-500/20\">\n <div className=\"flex items-center gap-2\">\n {currentGame.ImageIcon && (\n <img\n src={`https://media.retroachievements.org${currentGame.ImageIcon}`}\n alt={currentGame.Title}\n className=\"w-10 h-10 rounded object-cover flex-shrink-0\"\n />\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs font-medium text-white truncate\">{currentGame.Title}</p>\n <p className=\"text-[10px] text-gray-500\">{currentGame.ConsoleName}</p>\n </div>\n </div>\n {achievementCount > 0 && (\n <div className=\"mt-2 pt-2 border-t border-white/10\">\n <div className=\"flex items-center justify-between text-xs mb-1\">\n <span className=\"text-gray-400\">{progress}%</span>\n <span className=\"text-yellow-400\">{unlockedCount}/{achievementCount}</span>\n </div>\n <div className=\"h-1.5 bg-gray-800 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-gradient-to-r from-yellow-500 to-orange-500 transition-all\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Hardcore Mode */}\n <div className=\"p-3 bg-black/30 rounded-lg border border-white/10\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Shield className={hardcoreEnabled ? 'text-red-500' : 'text-gray-500'} size={16} />\n <div>\n <p className=\"text-xs font-medium text-white\">{t.retroAchievements.hardcore}</p>\n <p className=\"text-[10px] text-gray-500\">2x points, no savestates</p>\n </div>\n </div>\n <button\n onClick={() => onHardcoreChange(!hardcoreEnabled)}\n className={`relative w-10 h-5 rounded-full transition-colors ${hardcoreEnabled ? 'bg-red-500' : 'bg-gray-600'\n }`}\n >\n <div\n className={`absolute top-0.5 w-4 h-4 rounded-full bg-white transition-transform ${hardcoreEnabled ? 'translate-x-5' : 'translate-x-0.5'\n }`}\n />\n </button>\n </div>\n\n {hardcoreEnabled && (\n <div className=\"mt-2 p-2 bg-red-500/10 border border-red-500/20 rounded text-[10px] text-red-300\">\n {t.common.disabledInHardcore}\n </div>\n )}\n </div>\n\n {/* Status */}\n <div className=\"flex items-center gap-1.5 text-xs px-1\">\n <CheckCircle className=\"text-green-500\" size={12} />\n <span className=\"text-green-400\">{t.retroAchievements.connectedStatus}</span>\n </div>\n\n {/* Logout */}\n <button\n onClick={onLogout}\n className=\"w-full flex items-center justify-center gap-2 px-3 py-2 bg-gray-800 hover:bg-gray-700 text-white text-xs rounded-lg transition-colors border border-white/10\"\n >\n <LogOut size={14} />\n <span>{t.retroAchievements.logout}</span>\n </button>\n </div>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { Trophy, ExternalLink, CheckCircle } from 'lucide-react';\nimport { RAGameExtended, RAAchievement, getAchievementBadgeUrl } from '../../lib/retroachievements';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\nexport interface AchievementsTabProps {\n currentGame: RAGameExtended | null;\n achievements: RAAchievement[];\n unlockedIds: Set<number>;\n filter: 'all' | 'locked' | 'unlocked';\n setFilter: (f: 'all' | 'locked' | 'unlocked') => void;\n totalCount: number;\n progress: number;\n earnedPoints: number;\n totalPoints: number;\n isHardcoreMode: boolean;\n}\n\nexport default function AchievementsTab({\n currentGame,\n achievements,\n unlockedIds,\n filter,\n setFilter,\n totalCount,\n progress,\n earnedPoints,\n totalPoints,\n}: AchievementsTabProps) {\n const t = useKoinTranslation();\n\n if (!currentGame) {\n return (\n <div className=\"p-6 text-center\">\n <div className=\"w-12 h-12 mx-auto mb-3 rounded-full bg-gray-800 flex items-center justify-center\">\n <Trophy className=\"text-gray-600\" size={24} />\n </div>\n <p className=\"text-sm text-gray-400\">{t.retroAchievements.noGame}</p>\n <p className=\"text-xs text-gray-500 mt-1\">{t.retroAchievements.loadGame}</p>\n </div>\n );\n }\n\n if (achievements.length === 0) {\n return (\n <div className=\"p-6 text-center\">\n <div className=\"w-12 h-12 mx-auto mb-3 rounded-full bg-gray-800 flex items-center justify-center\">\n <Trophy className=\"text-gray-600\" size={24} />\n </div>\n <p className=\"text-sm text-gray-400\">{t.retroAchievements.noAchievements}</p>\n <p className=\"text-xs text-gray-500 mt-1\">{t.retroAchievements.notSupported}</p>\n </div>\n );\n }\n\n return (\n <div>\n {/* Game Header + Progress */}\n <div className=\"p-3 border-b border-gray-800/50 bg-black/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n {currentGame.ImageIcon && (\n <img\n src={`https://media.retroachievements.org${currentGame.ImageIcon}`}\n alt={currentGame.Title}\n className=\"w-8 h-8 rounded object-cover flex-shrink-0\"\n />\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs font-medium text-white truncate\">{currentGame.Title}</p>\n <p className=\"text-[10px] text-gray-500\">{currentGame.ConsoleName}</p>\n </div>\n <a\n href={`https://retroachievements.org/game/${currentGame.ID}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-gray-400 hover:text-yellow-400 transition-colors p-1\"\n >\n <ExternalLink size={12} />\n </a>\n </div>\n\n {/* Progress */}\n <div className=\"flex items-center gap-2 text-xs\">\n <div className=\"flex-1 h-1.5 bg-gray-800 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-gradient-to-r from-yellow-500 to-orange-500 transition-all\"\n style={{ width: `${progress}%` }}\n />\n </div>\n <span className=\"text-yellow-400 font-medium whitespace-nowrap\">\n {unlockedIds.size}/{totalCount}\n </span>\n <span className=\"text-gray-500\">•</span>\n <span className=\"text-gray-400 whitespace-nowrap\">{earnedPoints} pts</span>\n </div>\n\n {/* Filters */}\n <div className=\"flex gap-1 mt-2\">\n {(['all', 'locked', 'unlocked'] as const).map(f => (\n <button\n key={f}\n onClick={() => setFilter(f)}\n className={`px-2 py-0.5 text-[10px] rounded-full border transition-colors ${filter === f\n ? 'bg-yellow-500/20 border-yellow-500/50 text-yellow-400'\n : 'border-gray-700 text-gray-500 hover:text-gray-300'\n }`}\n >\n {t.retroAchievements.filters[f]}\n </button>\n ))}\n </div>\n </div>\n\n {/* Achievement List */}\n <div className=\"divide-y divide-gray-800/50\">\n {achievements.map((achievement) => {\n const unlocked = unlockedIds.has(achievement.ID);\n\n return (\n <div\n key={achievement.ID}\n className={`flex items-center gap-2 p-2 transition-colors ${unlocked ? 'bg-yellow-500/5' : 'hover:bg-gray-800/30'\n }`}\n >\n {/* Badge */}\n <div className=\"relative flex-shrink-0\">\n <img\n src={getAchievementBadgeUrl(achievement.BadgeName, !unlocked)}\n alt=\"\"\n className={`w-8 h-8 rounded border ${unlocked\n ? 'border-yellow-500/50'\n : 'border-gray-700 opacity-40 grayscale'\n }`}\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n {unlocked && (\n <div className=\"absolute -top-0.5 -right-0.5\">\n <CheckCircle className=\"text-green-500 bg-gray-900 rounded-full\" size={10} />\n </div>\n )}\n </div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <p className={`text-xs font-medium truncate ${unlocked ? 'text-white' : 'text-gray-400'}`}>\n {achievement.Title}\n </p>\n <p className={`text-[10px] truncate ${unlocked ? 'text-gray-500' : 'text-gray-600'}`}>\n {achievement.Description}\n </p>\n </div>\n\n {/* Points */}\n <div className={`flex-shrink-0 px-1.5 py-0.5 rounded text-[10px] font-bold ${unlocked\n ? 'bg-yellow-500/20 text-yellow-400'\n : 'bg-gray-800 text-gray-500'\n }`}>\n {achievement.Points}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Footer */}\n <div className=\"p-2 text-[10px] text-gray-500 text-center border-t border-gray-800/50\">\n {progress}% complete • {t.retroAchievements.ptsRemaining.replace('{{count}}', (totalPoints - earnedPoints).toString())}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { X, Trophy, Settings, List } from 'lucide-react';\nimport { RACredentials, RAGameExtended, RAAchievement } from '../../lib/retroachievements';\nimport LoginForm from './LoginForm';\nimport SettingsTab from './SettingsTab';\nimport AchievementsTab from './AchievementsTab';\nimport { useKoinTranslation } from '../../hooks/useKoinTranslation';\n\ntype TabType = 'achievements' | 'settings';\n\nexport interface RASidebarProps {\n isOpen: boolean;\n onClose: () => void;\n // Auth\n isLoggedIn: boolean;\n credentials: RACredentials | null;\n isLoading: boolean;\n error?: string | null;\n onLogin: (username: string, password: string) => Promise<boolean>;\n onLogout: () => void;\n // Hardcore\n hardcoreEnabled: boolean;\n onHardcoreChange: (enabled: boolean) => void;\n // Game & Achievements\n currentGame: RAGameExtended | null;\n achievements: RAAchievement[];\n unlockedIds: Set<number>;\n}\n\nexport default function RASidebar({\n isOpen,\n onClose,\n isLoggedIn,\n credentials,\n isLoading,\n error,\n onLogin,\n onLogout,\n hardcoreEnabled,\n onHardcoreChange,\n currentGame,\n achievements,\n unlockedIds,\n}: RASidebarProps) {\n const t = useKoinTranslation();\n // If logged in and has game, show achievements tab by default\n const defaultTab: TabType = (isLoggedIn && currentGame && achievements.length > 0) ? 'achievements' : 'settings';\n const [activeTab, setActiveTab] = useState<TabType>(defaultTab);\n const [filter, setFilter] = useState<'all' | 'locked' | 'unlocked'>('all');\n\n // Login form state\n const [username, setUsername] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [localError, setLocalError] = useState<string | null>(null);\n\n // Reset form and tab when sidebar opens/closes\n useEffect(() => {\n if (!isOpen) {\n setUsername('');\n setPassword('');\n setShowPassword(false);\n setLocalError(null);\n } else {\n // Set default tab based on state\n if (isLoggedIn && currentGame && achievements.length > 0) {\n setActiveTab('achievements');\n } else {\n setActiveTab('settings');\n }\n }\n }, [isOpen, isLoggedIn, currentGame, achievements.length]);\n\n const handleLogin = async (e: React.FormEvent) => {\n e.preventDefault();\n setLocalError(null);\n\n if (!username.trim() || !password.trim()) {\n setLocalError(t.retroAchievements.usernameRequired);\n return;\n }\n\n const success = await onLogin(username.trim(), password.trim());\n if (success) {\n setPassword('');\n }\n };\n\n const handleLogout = () => {\n onLogout();\n setUsername('');\n setPassword('');\n };\n\n if (!isOpen) return null;\n\n // Achievement stats\n const totalPoints = achievements.reduce((sum, a) => sum + (a.Points || 0), 0);\n const earnedPoints = achievements\n .filter(a => unlockedIds.has(a.ID))\n .reduce((sum, a) => sum + (a.Points || 0), 0);\n const progress = achievements.length > 0\n ? Math.round((unlockedIds.size / achievements.length) * 100)\n : 0;\n\n // Sort and filter achievements\n const sortedAchievements = [...achievements].sort((a, b) => {\n const aUnlocked = unlockedIds.has(a.ID);\n const bUnlocked = unlockedIds.has(b.ID);\n if (aUnlocked && !bUnlocked) return 1;\n if (!aUnlocked && bUnlocked) return -1;\n return (a.DisplayOrder || 0) - (b.DisplayOrder || 0);\n });\n\n const filteredAchievements = sortedAchievements.filter(a => {\n const unlocked = unlockedIds.has(a.ID);\n if (filter === 'locked') return !unlocked;\n if (filter === 'unlocked') return unlocked;\n return true;\n });\n\n return (\n <div className=\"koin-scope\" style={{ display: 'contents' }}>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 bg-black/50 z-40 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n {/* Sidebar Panel */}\n <div className=\"fixed right-0 top-0 bottom-0 w-80 max-w-[90vw] bg-gray-900 border-l border-yellow-500/20 z-50 flex flex-col shadow-2xl animate-slide-in-right\">\n\n {/* Header */}\n <div className=\"p-3 bg-gradient-to-r from-yellow-500/10 to-orange-500/10 border-b border-yellow-500/20 flex-shrink-0\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <Trophy className=\"text-yellow-400\" size={18} />\n <span className=\"font-heading text-sm text-white\">{t.retroAchievements.title}</span>\n </div>\n <button\n onClick={onClose}\n className=\"text-gray-400 hover:text-white transition-colors p-1\"\n >\n <X size={16} />\n </button>\n </div>\n\n {/* Tabs - only show if logged in */}\n {isLoggedIn && (\n <div className=\"flex gap-1 mt-2 bg-black/30 rounded-lg p-0.5\">\n <button\n onClick={() => setActiveTab('achievements')}\n className={`flex-1 flex items-center justify-center gap-1.5 px-2 py-1.5 text-xs rounded-md transition-colors ${activeTab === 'achievements'\n ? 'bg-yellow-500/20 text-yellow-400'\n : 'text-gray-400 hover:text-white'\n }`}\n >\n <List size={12} />\n {t.retroAchievements.achievements}\n </button>\n <button\n onClick={() => setActiveTab('settings')}\n className={`flex-1 flex items-center justify-center gap-1.5 px-2 py-1.5 text-xs rounded-md transition-colors ${activeTab === 'settings'\n ? 'bg-yellow-500/20 text-yellow-400'\n : 'text-gray-400 hover:text-white'\n }`}\n >\n <Settings size={12} />\n {t.settings.title}\n </button>\n </div>\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto overscroll-contain\">\n {!isLoggedIn ? (\n <LoginForm\n username={username}\n setUsername={setUsername}\n password={password}\n setPassword={setPassword}\n showPassword={showPassword}\n setShowPassword={setShowPassword}\n isLoading={isLoading}\n error={error || localError}\n onSubmit={handleLogin}\n />\n ) : activeTab === 'settings' ? (\n <SettingsTab\n credentials={credentials!}\n hardcoreEnabled={hardcoreEnabled}\n onHardcoreChange={onHardcoreChange}\n currentGame={currentGame}\n achievementCount={achievements.length}\n unlockedCount={unlockedIds.size}\n progress={progress}\n onLogout={handleLogout}\n />\n ) : (\n <AchievementsTab\n currentGame={currentGame}\n achievements={filteredAchievements}\n unlockedIds={unlockedIds}\n filter={filter}\n setFilter={setFilter}\n totalCount={achievements.length}\n progress={progress}\n earnedPoints={earnedPoints}\n totalPoints={totalPoints}\n isHardcoreMode={hardcoreEnabled}\n />\n )}\n </div>\n\n {/* Footer */}\n <div className=\"p-2 border-t border-gray-800 bg-gray-900/80 text-[10px] text-gray-500 text-center flex-shrink-0\">\n {t.retroAchievements.poweredBy}{' '}\n <a\n href=\"https://retroachievements.org\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-yellow-500 hover:text-yellow-400\"\n >\n RetroAchievements.org\n </a>\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback } from 'react';\n\nexport type ToastType = 'success' | 'error' | 'info' | 'warning' | 'gamepad';\n\nexport interface Toast {\n id: string;\n message: string;\n type: ToastType;\n title?: string;\n icon?: string; // Emoji or icon name\n duration?: number;\n action?: {\n label: string;\n onClick: () => void;\n };\n}\n\nexport interface ShowToastOptions {\n title?: string;\n icon?: string;\n duration?: number;\n action?: Toast['action'];\n}\n\nexport interface UseToastReturn {\n toasts: Toast[];\n showToast: (message: string, type?: ToastType, options?: ShowToastOptions) => void;\n dismissToast: (id: string) => void;\n clearToasts: () => void;\n}\n\n/**\n * Hook for managing toast notifications\n * @param defaultDuration - Default duration for toasts (default 3000ms)\n */\nexport function useToast(defaultDuration: number = 3000): UseToastReturn {\n const [toasts, setToasts] = useState<Toast[]>([]);\n\n const showToast = useCallback((\n message: string,\n type: ToastType = 'info',\n options?: ShowToastOptions\n ) => {\n const id = crypto.randomUUID();\n const duration = options?.duration ?? defaultDuration;\n\n const newToast: Toast = {\n id,\n message,\n type,\n title: options?.title,\n icon: options?.icon,\n duration,\n action: options?.action,\n };\n\n setToasts((prev) => [...prev, newToast]);\n\n // Auto-dismiss after duration\n if (duration > 0) {\n setTimeout(() => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, duration);\n }\n }, [defaultDuration]);\n\n const dismissToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n const clearToasts = useCallback(() => {\n setToasts([]);\n }, []);\n\n return {\n toasts,\n showToast,\n dismissToast,\n clearToasts,\n };\n}\n","import { useState, useRef, useCallback, useEffect } from 'react';\nimport { useToast } from './useToast';\nimport { useMobile } from './useMobile';\nimport {\n isFullscreen as checkIsFullscreen,\n setupFullscreenListener,\n toggleFullscreen,\n} from '../components/VirtualController/utils/viewport';\n\nexport function useGameUI() {\n const { isMobile } = useMobile();\n const containerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n // Toast notifications\n const { toasts, showToast, dismissToast } = useToast(3500);\n\n // Fullscreen handling\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [raSidebarOpen, setRaSidebarOpen] = useState(false);\n\n const checkFullscreen = useCallback(() => {\n const fullscreen = checkIsFullscreen();\n setIsFullscreen(fullscreen);\n return fullscreen;\n }, []);\n\n useEffect(() => {\n checkFullscreen();\n return setupFullscreenListener(checkFullscreen);\n }, [checkFullscreen]);\n\n const handleFullscreen = useCallback(async () => {\n if (!containerRef.current) return;\n\n try {\n const nativeWorked = await toggleFullscreen(containerRef.current);\n // If native fullscreen didn't work (e.g. iOS Safari), toggle visual fullscreen\n if (!nativeWorked && !checkIsFullscreen()) {\n setIsFullscreen(prev => !prev);\n }\n } catch (err) {\n console.warn('Fullscreen toggle failed, using visual fallback:', err);\n setIsFullscreen(prev => !prev);\n }\n }, []);\n\n return {\n containerRef,\n canvasRef,\n isMobile,\n isFullscreen,\n toasts,\n showToast,\n dismissToast,\n handleFullscreen,\n raSidebarOpen,\n setRaSidebarOpen,\n };\n}\n","export interface SystemConfig {\n // Canonical key - the internal identifier (e.g., 'NES', 'GB', 'GBA')\n key: string;\n\n // Display info\n label: string; // User-friendly name (e.g., 'Nintendo (NES)')\n fullName: string; // Full name (e.g., 'Nintendo Entertainment System')\n slug: string; // URL-friendly (e.g., 'nes')\n\n // File detection\n extensions: string[]; // File extensions (e.g., ['.nes'])\n\n // Emulation\n core: string; // RetroArch core (e.g., 'fceumm')\n\n // Database matching (LaunchBox)\n dbNames: string[]; // Possible DB names to search for\n\n // UI\n iconName: string; // ConsoleIcon component name\n color: string; // Tailwind hover color class\n accentHex: string; // Hex color for accents\n\n // Aliases - other names that should map to this system\n aliases: string[];\n\n // Metadata\n biosNeeded?: boolean;\n biosFileNames?: string[]; // Expected filenames for BIOS matching\n biosLocation?: 'system' | 'rom_folder'; // Where to mount the BIOS ('system' dir or alongside 'rom_folder')\n}\n\n/**\n * The master system configuration\n * Order matters for display in dropdowns\n */\nexport const SYSTEMS: SystemConfig[] = [\n // ============ Nintendo ============\n {\n key: 'NES',\n label: 'Nintendo (NES)',\n fullName: 'Nintendo Entertainment System',\n slug: 'nes',\n extensions: ['.nes'],\n core: 'fceumm',\n dbNames: ['NES', 'Nintendo Entertainment System'],\n iconName: 'NES',\n color: 'group-hover:text-[#FF3333]',\n accentHex: '#FF3333',\n aliases: ['NINTENDO ENTERTAINMENT SYSTEM', 'FAMICOM'],\n },\n {\n key: 'SNES',\n label: 'Super Nintendo (SNES)',\n fullName: 'Super Nintendo Entertainment System',\n slug: 'snes',\n extensions: ['.snes', '.smc', '.sfc'],\n core: 'snes9x',\n dbNames: ['SNES', 'Super Nintendo Entertainment System'],\n iconName: 'SNES',\n color: 'group-hover:text-[#AA00FF]',\n accentHex: '#AA00FF',\n aliases: ['SUPER NINTENDO', 'SUPER NINTENDO ENTERTAINMENT SYSTEM', 'SUPER FAMICOM'],\n },\n {\n key: 'N64',\n label: 'Nintendo 64',\n fullName: 'Nintendo 64',\n slug: 'n64',\n extensions: ['.n64', '.z64', '.v64'],\n core: 'mupen64plus_next',\n dbNames: ['N64', 'Nintendo 64'],\n iconName: 'N64',\n color: 'group-hover:text-[#FFD600]',\n accentHex: '#FFD600',\n aliases: ['NINTENDO 64'],\n },\n {\n key: 'GB',\n label: 'Game Boy',\n fullName: 'Game Boy',\n slug: 'gb',\n extensions: ['.gb'],\n core: 'gambatte',\n dbNames: ['Nintendo Game Boy'],\n iconName: 'GB',\n color: 'group-hover:text-[#76FF03]',\n accentHex: '#76FF03',\n aliases: ['GAME BOY', 'GAMEBOY', 'NINTENDO GAME BOY'],\n },\n {\n key: 'GBC',\n label: 'Game Boy Color',\n fullName: 'Game Boy Color',\n slug: 'gbc',\n extensions: ['.gbc'],\n core: 'gambatte',\n dbNames: ['Nintendo Game Boy Color'],\n iconName: 'GBC',\n color: 'group-hover:text-[#F50057]',\n accentHex: '#F50057',\n aliases: ['GAME BOY COLOR', 'GAMEBOY COLOR', 'NINTENDO GAME BOY COLOR'],\n },\n {\n key: 'GBA',\n label: 'Game Boy Advance',\n fullName: 'Game Boy Advance',\n slug: 'gba',\n extensions: ['.gba'],\n core: 'mgba',\n dbNames: ['Nintendo Game Boy Advance'],\n iconName: 'GBA',\n color: 'group-hover:text-[#304FFE]',\n accentHex: '#304FFE',\n aliases: ['GAME BOY ADVANCE', 'GAMEBOY ADVANCE', 'NINTENDO GAME BOY ADVANCE'],\n },\n {\n key: 'NDS',\n label: 'Nintendo DS',\n fullName: 'Nintendo DS',\n slug: 'nds',\n extensions: ['.nds'],\n core: 'desmume',\n dbNames: ['Nintendo DS'],\n iconName: 'NDS',\n color: 'group-hover:text-[#C51162]',\n accentHex: '#C51162',\n aliases: ['NDS', 'NINTENDO DS'],\n },\n {\n key: 'VIRTUAL_BOY',\n label: 'Virtual Boy',\n fullName: 'Virtual Boy',\n slug: 'virtualboy',\n extensions: ['.vb'],\n core: 'mednafen_vb',\n dbNames: ['Nintendo Virtual Boy'],\n iconName: 'VIRTUAL_BOY',\n color: 'group-hover:text-[#D50000]',\n accentHex: '#D50000',\n aliases: ['VIRTUAL BOY', 'NINTENDO VIRTUAL BOY'],\n },\n\n {\n key: 'DREAMCAST',\n label: 'Sega Dreamcast',\n fullName: 'Sega Dreamcast',\n slug: 'dreamcast',\n extensions: ['.cdi', '.gdi', '.chd'],\n core: 'flycast',\n dbNames: ['Sega Dreamcast'],\n iconName: 'DREAMCAST', // Use existing icon or fallback\n color: 'group-hover:text-[#FF6D00]',\n accentHex: '#FF6D00',\n aliases: ['DREAMCAST', 'SEGA DREAMCAST'],\n biosNeeded: true,\n biosFileNames: ['dc_boot.bin', 'dc_flash.bin'],\n },\n {\n key: 'SATURN',\n label: 'Sega Saturn',\n fullName: 'Sega Saturn',\n slug: 'saturn',\n extensions: ['.cue', '.chd', '.iso'],\n core: 'yabasanshiro',\n dbNames: ['Sega Saturn'],\n iconName: 'SATURN',\n color: 'group-hover:text-[#6200EA]',\n accentHex: '#6200EA',\n aliases: ['SATURN', 'SEGA SATURN'],\n biosNeeded: true,\n biosFileNames: ['sega_101.bin', 'mpr-17933.bin'],\n },\n {\n key: 'GENESIS',\n label: 'Sega Genesis',\n fullName: 'Sega Genesis / Mega Drive',\n slug: 'genesis',\n extensions: ['.gen', '.md', '.smd', '.bin'],\n core: 'genesis_plus_gx',\n dbNames: ['GENESIS', 'Sega Genesis', 'Sega Mega Drive'],\n iconName: 'GENESIS',\n color: 'group-hover:text-[#2979FF]',\n accentHex: '#2979FF',\n aliases: ['SEGA GENESIS', 'MEGA DRIVE', 'SEGA MEGA DRIVE', 'MEGADRIVE'],\n biosNeeded: true, // For Sega CD\n biosFileNames: ['bios_CD_U.bin', 'bios_CD_E.bin', 'bios_CD_J.bin'],\n },\n {\n key: 'MASTER_SYSTEM',\n label: 'Sega Master System',\n fullName: 'Sega Master System',\n slug: 'mastersystem',\n extensions: ['.sms'],\n core: 'gearsystem',\n dbNames: ['Sega Master System'],\n iconName: 'MASTER_SYSTEM',\n color: 'group-hover:text-[#FF3D00]',\n accentHex: '#FF3D00',\n aliases: ['MASTER SYSTEM', 'SEGA MASTER SYSTEM', 'SMS'],\n },\n {\n key: 'GAME_GEAR',\n label: 'Sega Game Gear',\n fullName: 'Sega Game Gear',\n slug: 'gamegear',\n extensions: ['.gg'],\n core: 'gearsystem',\n dbNames: ['Sega Game Gear'],\n iconName: 'GAME_GEAR',\n color: 'group-hover:text-[#1DE9B6]',\n accentHex: '#1DE9B6',\n aliases: ['GAME GEAR', 'SEGA GAME GEAR', 'GG'],\n },\n\n // ============ Sony ============\n {\n key: 'PS1',\n label: 'PlayStation',\n fullName: 'Sony PlayStation',\n slug: 'ps1',\n extensions: ['.iso', '.cue', '.pbp'],\n core: 'pcsx_rearmed',\n dbNames: ['PLAYSTATION', 'Sony Playstation', 'Sony PlayStation'],\n iconName: 'PS1',\n color: 'group-hover:text-[#448AFF]',\n accentHex: '#448AFF',\n aliases: ['PLAYSTATION', 'PSX', 'PS', 'SONY PLAYSTATION'],\n biosNeeded: true,\n biosFileNames: ['scph5500.bin', 'scph5501.bin', 'scph5502.bin', 'scph1001.bin'],\n },\n {\n key: 'PSP',\n label: 'PlayStation Portable',\n fullName: 'Sony PlayStation Portable',\n slug: 'psp',\n extensions: ['.iso', '.cso'],\n core: 'ppsspp',\n dbNames: ['Sony PSP', 'PSP'],\n iconName: 'PSP',\n color: 'group-hover:text-[#00B0FF]',\n accentHex: '#00B0FF',\n aliases: ['PSP', 'PLAYSTATION PORTABLE'],\n },\n\n // ============ NEC ============\n {\n key: 'PC_ENGINE',\n label: 'PC Engine / TurboGrafx-16',\n fullName: 'PC Engine / TurboGrafx-16',\n slug: 'pcengine',\n extensions: ['.pce'],\n core: 'mednafen_pce_fast',\n dbNames: ['PC Engine', 'TurboGrafx-16', 'NEC PC Engine', 'NEC TurboGrafx-16'],\n iconName: 'PC_ENGINE',\n color: 'group-hover:text-[#FF9100]',\n accentHex: '#FF9100',\n aliases: ['PC ENGINE', 'TURBOGRAFX-16', 'TURBOGRAFX', 'PCE', 'TG16'],\n biosNeeded: true, // For CD games\n biosFileNames: ['syscard3.pce'],\n },\n\n // ============ SNK ============\n {\n key: 'NEOGEO',\n label: 'Neo Geo',\n fullName: 'SNK Neo Geo',\n slug: 'neogeo',\n extensions: ['.neo'],\n core: 'fbalpha2012_neogeo',\n dbNames: ['SNK Neo Geo MVS', 'SNK Neo Geo AES', 'SNK Neo Geo CD', 'Neo Geo'],\n iconName: 'NEOGEO',\n color: 'group-hover:text-[#C62828]',\n accentHex: '#C62828',\n aliases: ['NEO GEO', 'NEO-GEO', 'SNK NEO GEO'],\n biosNeeded: true,\n biosFileNames: ['neogeo.zip'],\n biosLocation: 'rom_folder',\n },\n {\n key: 'NEOGEO_POCKET',\n label: 'Neo Geo Pocket',\n fullName: 'SNK Neo Geo Pocket',\n slug: 'neogeopocket',\n extensions: ['.ngp'],\n core: 'mednafen_ngp',\n dbNames: ['SNK Neo Geo Pocket'],\n iconName: 'NEOGEO_POCKET',\n color: 'group-hover:text-[#00B0FF]',\n accentHex: '#00B0FF',\n aliases: ['NEO GEO POCKET', 'NGP'],\n },\n {\n key: 'NEOGEO_POCKET_COLOR',\n label: 'Neo Geo Pocket Color',\n fullName: 'SNK Neo Geo Pocket Color',\n slug: 'neogeopocketcolor',\n extensions: ['.ngc'],\n core: 'mednafen_ngp',\n dbNames: ['SNK Neo Geo Pocket Color'],\n iconName: 'NEOGEO_POCKET',\n color: 'group-hover:text-[#FF4081]',\n accentHex: '#FF4081',\n aliases: ['NEO GEO POCKET COLOR', 'NGPC'],\n },\n\n // ============ Atari ============\n {\n key: 'LYNX',\n label: 'Atari Lynx',\n fullName: 'Atari Lynx',\n slug: 'lynx',\n extensions: ['.lnx'],\n core: 'handy',\n dbNames: ['Atari Lynx'],\n iconName: 'LYNX',\n color: 'group-hover:text-[#FFC400]',\n accentHex: '#FFC400',\n aliases: ['ATARI LYNX'],\n biosNeeded: true,\n biosFileNames: ['lynxboot.img'],\n },\n {\n key: 'ATARI_2600',\n label: 'Atari 2600',\n fullName: 'Atari 2600',\n slug: 'atari2600',\n extensions: ['.a26'],\n core: 'stella',\n dbNames: ['Atari 2600'],\n iconName: 'ATARI_2600',\n color: 'group-hover:text-[#E64A19]',\n accentHex: '#E64A19',\n aliases: ['ATARI 2600', 'ATARI2600'],\n },\n {\n key: 'ATARI_7800',\n label: 'Atari 7800',\n fullName: 'Atari 7800',\n slug: 'atari7800',\n extensions: ['.a78'],\n core: 'prosystem',\n dbNames: ['Atari 7800'],\n iconName: 'ATARI_7800',\n color: 'group-hover:text-[#BF360C]',\n accentHex: '#BF360C',\n aliases: ['ATARI 7800', 'ATARI7800'],\n },\n\n // ============ Other ============\n {\n key: 'WONDERSWAN',\n label: 'WonderSwan',\n fullName: 'Bandai WonderSwan',\n slug: 'wonderswan',\n extensions: ['.ws'],\n core: 'mednafen_wswan',\n dbNames: ['Bandai WonderSwan'],\n iconName: 'WONDERSWAN',\n color: 'group-hover:text-[#00E5FF]',\n accentHex: '#00E5FF',\n aliases: ['WONDERSWAN', 'WONDER SWAN', 'BANDAI WONDERSWAN'],\n },\n {\n key: 'WONDERSWAN_COLOR',\n label: 'WonderSwan Color',\n fullName: 'Bandai WonderSwan Color',\n slug: 'wonderswancolor',\n extensions: ['.wsc'],\n core: 'mednafen_wswan',\n dbNames: ['Bandai WonderSwan Color'],\n iconName: 'WONDERSWAN',\n color: 'group-hover:text-[#00BCD4]',\n accentHex: '#00BCD4',\n aliases: ['WONDERSWAN COLOR', 'WONDER SWAN COLOR', 'BANDAI WONDERSWAN COLOR', 'WSC'],\n },\n {\n key: 'ARCADE',\n label: 'Arcade (FBNeo)',\n fullName: 'Arcade',\n slug: 'arcade',\n extensions: ['.zip'],\n core: 'fbneo',\n dbNames: ['Arcade', 'MAME', 'FBNeo', 'FinalBurn Neo'],\n iconName: 'ARCADE',\n color: 'group-hover:text-[#D500F9]',\n accentHex: '#D500F9',\n aliases: ['MAME', 'CPS1', 'CPS2', 'CPS3', 'FBNEO', 'FINALBURN', 'SYSTEM16', 'SEGA SYSTEM 16'],\n biosNeeded: true,\n },\n {\n key: 'C64',\n label: 'Commodore 64',\n fullName: 'Commodore 64',\n slug: 'c64',\n extensions: ['.d64', '.t64', '.tap', '.prg'],\n core: 'vice_x64',\n dbNames: ['Commodore 64'],\n iconName: 'C64',\n color: 'group-hover:text-[#795548]',\n accentHex: '#795548',\n aliases: ['C64', 'COMMODORE 64'],\n },\n {\n key: 'DOS',\n label: 'MS-DOS',\n fullName: 'MS-DOS',\n slug: 'dos',\n extensions: ['.zip', '.exe', '.com', '.bat'],\n core: 'dosbox_pure',\n dbNames: ['MS-DOS', 'F-DOS', 'DOS'],\n iconName: 'DOS',\n color: 'group-hover:text-[#607D8B]',\n accentHex: '#607D8B',\n aliases: ['DOS', 'MSDOS', 'MS-DOS'],\n },\n];\n","/**\n * Unified System Configuration\n * \n * SINGLE SOURCE OF TRUTH for all system-related data:\n * - Canonical system keys (used internally)\n * - File extensions → system detection\n * - System → RetroArch emulator core\n * - System → Database names (for LaunchBox matching)\n * - System → Display metadata (UI labels, colors, icons)\n * \n * All other files should import from here instead of maintaining their own mappings.\n */\n\nimport { SYSTEMS, SystemConfig } from '../data/systems-data';\n\nexport type { SystemConfig };\nexport { SYSTEMS };\n\n// ============ Lookup Maps (built from SYSTEMS) ============\n\n// Key → System config\nconst systemByKey = new Map<string, SystemConfig>();\n\n// Alias (uppercase) → System config\nconst systemByAlias = new Map<string, SystemConfig>();\n\n// Extension (lowercase) → System config\nconst systemByExtension = new Map<string, SystemConfig>();\n\n// DB name (lowercase) → System config\nconst systemByDbName = new Map<string, SystemConfig>();\n\n// Build all lookup maps\nfor (const sys of SYSTEMS) {\n // By key\n systemByKey.set(sys.key, sys);\n\n // By aliases (include key itself)\n systemByAlias.set(sys.key.toUpperCase(), sys);\n for (const alias of sys.aliases) {\n systemByAlias.set(alias.toUpperCase(), sys);\n }\n\n // By extension\n for (const ext of sys.extensions) {\n systemByExtension.set(ext.toLowerCase(), sys);\n }\n\n // By DB name\n for (const dbName of sys.dbNames) {\n systemByDbName.set(dbName.toLowerCase(), sys);\n }\n}\n\n// ============ Public API ============\n\n/**\n * Get system by canonical key (e.g., 'NES', 'GBA')\n */\nexport function getSystemByKey(key: string): SystemConfig | undefined {\n return systemByKey.get(key);\n}\n\n/**\n * Get system by any name/alias (case-insensitive)\n * Tries: exact key match, then alias match\n */\nexport function getSystem(name: string): SystemConfig | undefined {\n const upper = name.toUpperCase().trim();\n return systemByAlias.get(upper);\n}\n\n/**\n * Get system from file extension (e.g., '.nes', '.gba')\n */\nexport function getSystemFromExtension(filename: string): SystemConfig | undefined {\n const match = filename.match(/\\.[^.]+$/);\n if (!match) return undefined;\n return systemByExtension.get(match[0].toLowerCase());\n}\n\n/**\n * Get system by database name (for LaunchBox matching)\n */\nexport function getSystemByDbName(dbName: string): SystemConfig | undefined {\n return systemByDbName.get(dbName.toLowerCase());\n}\n\n/**\n * Get RetroArch core for a system name (case-insensitive)\n * Falls back to 'fceumm' (NES) if not found\n */\nexport function getCore(systemName: string): string {\n const sys = getSystem(systemName);\n return sys?.core ?? 'fceumm';\n}\n\n/**\n * Get DB names for matching (used in game search)\n */\nexport function getDBSystemNames(systemKey: string): string[] {\n const sys = getSystem(systemKey);\n return sys?.dbNames ?? [systemKey];\n}\n\n/**\n * Check if a system is supported\n */\nexport function isSystemSupported(name: string): boolean {\n return getSystem(name) !== undefined;\n}\n\n/**\n * Get all supported extensions\n */\nexport function getSupportedExtensions(): string[] {\n const exts = new Set<string>();\n for (const sys of SYSTEMS) {\n for (const ext of sys.extensions) {\n exts.add(ext);\n }\n }\n // Add .zip as special case (handled separately)\n exts.add('.zip');\n return Array.from(exts);\n}\n\n/**\n * Get all systems for UI dropdown\n */\nexport function getSystemsList(): Array<{ value: string; label: string; iconName: string; color: string }> {\n return SYSTEMS.map(sys => ({\n value: sys.key,\n label: sys.label,\n iconName: sys.iconName,\n color: sys.color,\n }));\n}\n\n/**\n * Detect system from filename\n * Returns null for ZIP files (user must select)\n */\nexport function detectSystem(filename: string): SystemConfig | undefined {\n const ext = filename.match(/\\.[^.]+$/)?.[0]?.toLowerCase();\n if (ext === '.zip') return undefined;\n return getSystemFromExtension(filename);\n}\n\n/**\n * Check if two system names refer to the same platform\n */\nexport function systemsMatch(name1: string, name2: string): boolean {\n const sys1 = getSystem(name1);\n const sys2 = getSystem(name2);\n if (!sys1 || !sys2) return false;\n return sys1.key === sys2.key;\n}\n\n/**\n * Normalize a system name to its canonical key\n */\nexport function normalizeSystemKey(name: string): string {\n const sys = getSystem(name);\n return sys?.key ?? name;\n}\n\n// Legacy export names for backward compatibility\nexport const SUPPORTED_EXTENSIONS = getSupportedExtensions();\n\n// Performance Optimization Tiers\n// ===============================\n// Systems are grouped by CPU complexity to apply optimal RetroArch settings.\n// See useEmulatorCore.ts getOptimizedConfig() for the actual settings applied.\n\n/**\n * TIER 1: \"Zero Lag\" - Lightweight Systems\n * ----------------------------------------\n * These 8-bit and 16-bit systems have low CPU requirements in WASM,\n * allowing us to enable Run-Ahead (frame prediction) for near-zero input latency.\n * \n * Run-Ahead works by running the emulator ahead by 1 frame and using that\n * result for display, effectively cutting 1 frame (~16ms) of input lag.\n */\nexport const PERFORMANCE_TIER_1_SYSTEMS = new Set([\n 'NES', 'SNES', 'GENESIS', 'GB', 'GBC',\n 'MASTER_SYSTEM', 'GAME_GEAR', 'PC_ENGINE',\n 'ATARI_2600', 'ATARI_7800', 'LYNX',\n 'NEOGEO_POCKET', 'NEOGEO_POCKET_COLOR',\n 'WONDERSWAN', 'WONDERSWAN_COLOR'\n]);\n\n/**\n * TIER 2: \"Max Smoothness\" - Heavy Systems\n * ----------------------------------------\n * These 32-bit+ systems push WASM hard. Run-Ahead would cause stuttering.\n * Instead, we optimize for smooth, consistent frame delivery:\n * - Threaded video rendering to prevent UI freezes\n * - Larger audio buffers to prevent crackling\n * - Disabled manual rewind capture (saves RAM and CPU cycles)\n */\nexport const PERFORMANCE_TIER_2_SYSTEMS = new Set([\n 'PS1', 'N64', 'GBA', 'SATURN', 'DREAMCAST',\n 'NDS', 'PSP', 'ARCADE', 'DOS', 'NEOGEO'\n]);\n\n","/**\n * Platform to RetroArch core mapping\n * \n * NOTE: This file is maintained for backward compatibility.\n * The canonical system configuration is now in lib/systems.ts\n * \n * Consider using imports from lib/systems.ts directly for new code.\n */\n\nimport {\n SYSTEMS,\n getCore as getCoreFromSystems,\n getSystem,\n getSystemsList,\n} from './systems';\n\n// Build PLATFORM_CORES map from unified config for backward compatibility\nexport const PLATFORM_CORES: Record<string, string> = {};\nfor (const sys of SYSTEMS) {\n // Add canonical key\n PLATFORM_CORES[sys.key] = sys.core;\n // Add all aliases\n for (const alias of sys.aliases) {\n PLATFORM_CORES[alias] = sys.core;\n }\n}\n\n/**\n * Get the RetroArch core for a given system name\n * @param system - System name (case-insensitive)\n * @returns Core identifier, defaults to 'fceumm' (NES) if not found\n */\nexport function getCore(system: string): string {\n return getCoreFromSystems(system);\n}\n\n/**\n * Check if a system is supported\n */\nexport function isSystemSupported(system: string): boolean {\n return getSystem(system) !== undefined;\n}\n\n/**\n * Get all supported system names\n */\nexport function getSupportedSystems(): string[] {\n return Object.keys(PLATFORM_CORES);\n}\n\n/**\n * System metadata for UI display\n */\nexport interface SystemInfo {\n value: string; // System key (e.g., 'NES', 'SNES')\n label: string; // User-friendly name (e.g., 'Nintendo (NES)')\n name: string; // ConsoleIcon system name (e.g., 'NES', 'MASTER_SYSTEM')\n id: string; // URL-friendly ID (e.g., 'nes', 'mastersystem')\n color?: string; // Optional hover color class\n}\n\n/**\n * Get all supported systems with metadata for UI display\n * Returns systems from unified config\n */\nexport function getSupportedSystemsList(): SystemInfo[] {\n return getSystemsList().map(sys => ({\n value: sys.value,\n label: sys.label,\n name: sys.iconName,\n id: sys.value.toLowerCase().replace(/_/g, ''),\n color: sys.color,\n }));\n}\n\nexport default PLATFORM_CORES;\n","const CACHE_NAME = 'koin-rom-cache-v1';\n\n/**\n * Get a ROM blob from the browser cache\n */\nexport async function getCachedRom(romId: string): Promise<Blob | null> {\n if (typeof caches === 'undefined') return null;\n\n try {\n const cache = await caches.open(CACHE_NAME);\n const response = await cache.match(romId);\n if (response) {\n console.log(`[Cache] Hit for ROM ${romId}`);\n return await response.blob();\n }\n } catch (e) {\n console.warn('[Cache] Read failed:', e);\n }\n return null;\n}\n\n/**\n * Fetch a ROM from a URL and cache it\n */\n// In-memory map to store in-flight fetch promises to prevent duplicate requests\nconst pendingFetches = new Map<string, Promise<Blob>>();\n\nexport async function fetchAndCacheRom(romId: string, url: string): Promise<Blob> {\n // 1. Return existing promise if already fetching this ROM\n if (pendingFetches.has(romId)) {\n console.log(`[Cache] Joining in-flight fetch for ${romId}`);\n return pendingFetches.get(romId)!;\n }\n\n // 2. Create new fetch promise\n const fetchPromise = (async () => {\n try {\n // Check cache first (in case another tab/session just cached it)\n const cached = await getCachedRom(romId);\n if (cached) return cached;\n\n console.log(`[Cache] Fetching ROM ${romId}...`);\n const response = await fetch(url);\n if (!response.ok) throw new Error(`Failed to fetch ROM: ${response.statusText}`);\n\n const blob = await response.blob();\n\n // Cache it\n if (typeof caches !== 'undefined') {\n try {\n const cache = await caches.open(CACHE_NAME);\n await cache.put(romId, new Response(blob));\n console.log(`[Cache] Cached ROM ${romId}`);\n } catch (e) {\n console.warn('[Cache] Write failed:', e);\n }\n }\n return blob;\n } finally {\n // Cleanup pending promise\n pendingFetches.delete(romId);\n }\n })();\n\n pendingFetches.set(romId, fetchPromise);\n return fetchPromise;\n}\n","import { useState, useRef, useCallback, MutableRefObject, useEffect } from 'react';\nimport { Nostalgist } from 'nostalgist';\nimport { getCore } from '../../lib/emulator-cores';\nimport { PERFORMANCE_TIER_1_SYSTEMS, PERFORMANCE_TIER_2_SYSTEMS } from '../../lib/systems';\nimport {\n KeyboardMapping,\n GamepadMapping,\n buildRetroArchConfig\n} from '../../lib/controls';\nimport { EmulatorStatus, SpeedMultiplier, RetroAchievementsConfig } from './types';\nimport { getCachedRom, fetchAndCacheRom } from '../../lib/rom-cache';\n\n\ninterface UseEmulatorCoreProps {\n system: string;\n romUrl: string;\n romId?: string;\n core?: string;\n biosUrl?: string | { url: string; name: string; location?: 'system' | 'rom_folder' };\n initialState?: Blob | Uint8Array;\n getCanvasElement?: () => HTMLCanvasElement | null;\n keyboardControls?: KeyboardMapping;\n gamepadBindings?: GamepadMapping[];\n retroAchievements?: RetroAchievementsConfig;\n initialVolume?: number;\n romFileName?: string;\n shader?: string; // CRT shader preset name (e.g., 'crt/crt-lottes')\n onReady?: () => void;\n onError?: (error: Error) => void;\n}\n\ninterface UseEmulatorCoreReturn {\n status: EmulatorStatus;\n setStatus: (status: EmulatorStatus) => void;\n error: string | null;\n isPaused: boolean;\n setIsPaused: (paused: boolean) => void;\n speed: SpeedMultiplier;\n nostalgistRef: MutableRefObject<Nostalgist | null>;\n\n prepare: () => Promise<void>;\n start: () => Promise<void>;\n stop: () => void;\n restart: () => Promise<void>;\n pause: () => void;\n resume: () => void;\n togglePause: () => void;\n setSpeed: (multiplier: SpeedMultiplier) => void;\n screenshot: () => Promise<string | null>;\n resize: (size: { width: number; height: number }) => void;\n getNostalgistInstance: () => Nostalgist | null;\n isPerformanceMode: boolean;\n}\n\nexport function useEmulatorCore({\n system,\n romUrl,\n romId,\n core: coreOverride,\n biosUrl,\n initialState,\n getCanvasElement,\n keyboardControls,\n gamepadBindings,\n retroAchievements,\n initialVolume = 100,\n romFileName,\n shader,\n onReady,\n onError,\n}: UseEmulatorCoreProps): UseEmulatorCoreReturn {\n const [status, setStatus] = useState<EmulatorStatus>('idle');\n const [error, setError] = useState<string | null>(null);\n const [isPaused, setIsPaused] = useState(false);\n const [speed, setSpeedState] = useState<SpeedMultiplier>(1);\n const [isFastForwardOn, setIsFastForwardOn] = useState(false);\n const [isPerformanceMode, setIsPerformanceMode] = useState(false);\n\n const nostalgistRef = useRef<Nostalgist | null>(null);\n const isStartingRef = useRef(false); // Prevent double start\n\n // Prepare the emulator (load files without starting)\n const prepare = useCallback(async () => {\n if (!romUrl || !system) {\n console.warn('[Nostalgist] Missing romUrl or system');\n return;\n }\n\n // Already prepared\n if (nostalgistRef.current) {\n return;\n }\n\n /**\n * Performance Optimization Strategy\n * ==================================\n * RetroArch settings are tuned based on system complexity to balance\n * input latency vs stability. Two tiers:\n *\n * TIER 1 (\"Zero Lag\") - Lightweight 8-bit/16-bit systems\n * - Run-Ahead: Predicts next frame to eliminate ~1 frame of input lag\n * - Single thread video: Keeps everything synchronized for tighter feel\n * - Small audio buffer: Minimizes audio latency\n * - Rewind: Enabled (low memory overhead)\n *\n * TIER 2 (\"Max Smoothness\") - Heavy 32-bit+ and arcade systems\n * - No Run-Ahead: Too CPU-intensive for complex emulation\n * - Threaded video: Prevents UI freezes during heavy rendering\n * - Larger audio buffer: Prevents crackling on demanding games\n * - Rewind: Disabled (saves significant RAM/CPU)\n *\n * @param sysKey - System identifier (e.g., 'NES', 'PS1')\n * @returns RetroArch config overrides for optimal performance\n */\n const getOptimizedConfig = (sysKey: string): Record<string, unknown> => {\n const sys = sysKey.toUpperCase();\n\n // TIER 1: Lightweight systems - optimize for minimal input lag\n // These systems have low CPU requirements, so we can afford Run-Ahead\n if (PERFORMANCE_TIER_1_SYSTEMS.has(sys)) {\n return {\n run_ahead_enabled: true, // Predict next frame to cut 1 frame of lag\n run_ahead_frames: 1, // Only 1 frame - more would increase CPU load\n run_ahead_secondary_instance: false, // Single instance for WASM (dual is too heavy)\n video_threaded: false, // Keep on main thread for tightest sync\n audio_latency: 64, // 64ms buffer - good balance of latency vs stability\n };\n }\n\n // TIER 2: Heavy systems - optimize for smooth, stutter-free gameplay\n // These systems push the CPU hard, so we prioritize stability over latency\n if (PERFORMANCE_TIER_2_SYSTEMS.has(sys)) {\n // Check if environment supports SharedArrayBuffer (required for threading)\n const supportsThreading = typeof window !== 'undefined' && window.crossOriginIsolated;\n\n if (supportsThreading) {\n return {\n run_ahead_enabled: false, // Too expensive for N64/PS1 in WASM\n video_threaded: true, // Offload to prevent UI blocking\n audio_latency: 96, // Larger buffer prevents audio crackle\n rewind_enable: false, // Save RAM - savestate buffer is expensive\n };\n } else {\n console.warn('[Nostalgist] SharedArrayBuffer not available. Falling back to main-thread rendering for heavy system.');\n return {\n run_ahead_enabled: false,\n video_threaded: false, // Fallback: Main thread (might stutter)\n audio_latency: 128, // Increase latency further to handle main thread blocking\n rewind_enable: false,\n };\n }\n }\n\n // DEFAULT: Unknown systems get balanced settings\n return {\n run_ahead_enabled: false,\n video_threaded: true,\n audio_latency: 64,\n };\n };\n\n try {\n setStatus('loading');\n setError(null);\n\n const core = coreOverride || getCore(system);\n\n let romOption: any = romUrl;\n\n // Attempt to load from cache if romId is provided\n if (romId) {\n try {\n let blob = await getCachedRom(romId);\n\n if (!blob) {\n console.log(`[Nostalgist] Fetching and caching ROM ${romId}`);\n blob = await fetchAndCacheRom(romId, romUrl);\n } else {\n console.log(`[Nostalgist] Loaded ROM ${romId} from cache`);\n }\n\n if (blob) {\n romOption = {\n fileName: romFileName || 'rom.bin',\n fileContent: blob\n };\n }\n } catch (err) {\n console.error('[Nostalgist] Cache/Fetch error, falling back to direct URL:', err);\n // Fallback to URL is implicit (romOption = romUrl)\n }\n } else if (romFileName) {\n romOption = { fileName: romFileName, fileContent: romUrl };\n }\n\n // Build input configuration from custom controls\n const inputConfig = buildRetroArchConfig({\n keyboard: keyboardControls,\n gamepads: gamepadBindings,\n });\n\n // 2. Get optimized config based on system tier\n const currentSystem = system;\n const specificConfig = getOptimizedConfig(currentSystem);\n\n // Check if performance mode (threading) is active\n if (specificConfig.video_threaded) {\n setIsPerformanceMode(true);\n } else {\n setIsPerformanceMode(false);\n }\n\n // Convert volume percentage (0-100) to RetroArch dB format\n // RetroArch audio_volume: 0.0 dB = 100%, -20 dB ≈ 10%, -40 dB ≈ 1%\n // Formula: dB = 20 * Math.log10(volume / 100)\n const volumeDb = initialVolume === 0 ? -80 : 20 * Math.log10(initialVolume / 100);\n\n // Get canvas element at prepare time (not hook initialization time)\n const canvasElement = getCanvasElement?.() || '';\n\n const prepareOptions: any = {\n core,\n rom: romOption,\n element: canvasElement,\n retroarchConfig: {\n menu_driver: 'null',\n rgui_show_start_screen: false,\n video_font_enable: false,\n input_menu_toggle_gamepad_combo: 0,\n rewind_enable: true, // Default, can be overridden by optimizedConfig\n rewind_granularity: 1,\n rewind_buffer_size: 100,\n fast_forward_ratio: 2.0,\n fast_forward_frameskip: 0,\n audio_volume: volumeDb.toFixed(2),\n input_volume_up: 'add',\n input_volume_down: 'subtract',\n input_audio_mute: 'f9',\n ...inputConfig,\n ...specificConfig, // Apply system-specific optimizations\n ...(retroAchievements ? {\n cheevos_enable: true,\n cheevos_username: retroAchievements.username,\n cheevos_token: retroAchievements.token,\n cheevos_hardcore_mode_enable: retroAchievements.hardcore ?? false,\n cheevos_verbose_enable: true,\n } : {}),\n } as Record<string, unknown>,\n };\n\n // Handle BIOS\n if (biosUrl) {\n // Pass BIOS URL or object directly to Nostalgist\n prepareOptions.bios = biosUrl;\n }\n\n // Handle initial state\n if (initialState) {\n if (initialState instanceof Blob) {\n prepareOptions.state = initialState;\n } else {\n // Convert Uint8Array to Blob if needed, or pass as is if Nostalgist supports it\n // Nostalgist supports Blob for state\n prepareOptions.state = new Blob([initialState as any]);\n }\n }\n\n // Handle shader (CRT effects)\n if (shader) {\n prepareOptions.shader = shader;\n }\n\n const nostalgist = await Nostalgist.prepare(prepareOptions);\n\n nostalgistRef.current = nostalgist;\n setStatus('ready');\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to prepare emulator';\n console.error('[Nostalgist] Prepare error:', err);\n setError(errorMessage);\n setStatus('error');\n onError?.(err instanceof Error ? err : new Error(errorMessage));\n }\n }, [system, romUrl, coreOverride, biosUrl, initialState, getCanvasElement, keyboardControls, gamepadBindings, initialVolume, onError, retroAchievements]);\n\n // Start the emulator (must be called after prepare, ideally from user click)\n const start = useCallback(async () => {\n // Prevent double start\n if (isStartingRef.current) {\n console.log('[Nostalgist] Already starting');\n return;\n }\n\n // Wait for prepare if needed\n if (!nostalgistRef.current) {\n await prepare();\n }\n\n // Still no instance? Prepare failed or was cleaned up\n if (!nostalgistRef.current) {\n console.warn('[Nostalgist] No emulator instance available');\n return;\n }\n\n isStartingRef.current = true;\n\n try {\n setStatus('loading');\n\n await nostalgistRef.current.start();\n\n // Verify instance still exists after await\n if (!nostalgistRef.current) {\n isStartingRef.current = false;\n return;\n }\n\n setStatus('running');\n setIsPaused(false);\n\n onReady?.();\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to start emulator';\n console.error('[Nostalgist] Start error:', err);\n setError(errorMessage);\n setStatus('error');\n onError?.(err instanceof Error ? err : new Error(errorMessage));\n } finally {\n isStartingRef.current = false;\n }\n }, [prepare, onReady, onError]);\n\n // Stop the emulator\n const stop = useCallback(() => {\n if (nostalgistRef.current) {\n try {\n nostalgistRef.current.exit();\n } catch (err) {\n console.error('[Nostalgist] Exit error:', err);\n }\n nostalgistRef.current = null;\n isStartingRef.current = false;\n setStatus('idle');\n setIsPaused(false);\n }\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (nostalgistRef.current) {\n console.log('[Nostalgist] Cleaning up emulator on unmount');\n stop();\n }\n };\n }, [stop]);\n\n // Restart the emulator (soft reset)\n const restart = useCallback(async () => {\n if (nostalgistRef.current) {\n try {\n // Restart is synchronous but emulator needs time to process\n nostalgistRef.current.restart();\n\n // Small delay to let the emulator process the restart\n await new Promise(resolve => setTimeout(resolve, 100));\n\n // Ensure emulator is running after restart\n nostalgistRef.current.resume();\n setIsPaused(false);\n setStatus('running');\n } catch (err) {\n console.error('[Nostalgist] Restart error:', err);\n // If restart fails, try full stop and start\n stop();\n await start();\n }\n }\n }, [stop, start]);\n\n // Pause\n const pause = useCallback(() => {\n if (nostalgistRef.current && !isPaused && status === 'running') {\n try {\n nostalgistRef.current.pause();\n setIsPaused(true);\n setStatus('paused');\n } catch (err) {\n console.error('[Nostalgist] Pause error:', err);\n }\n }\n }, [isPaused, status]);\n\n // Resume - always attempt to resume, let the emulator handle if already running\n const resume = useCallback(() => {\n if (nostalgistRef.current) {\n try {\n nostalgistRef.current.resume();\n setIsPaused(false);\n // Only transition to running if we were paused\n // This prevents 'ready' state from being overwritten if called prematurely\n if (status === 'paused') {\n setStatus('running');\n }\n } catch (err) {\n console.error('[Nostalgist] Resume error:', err);\n }\n }\n }, [status]);\n\n // Toggle pause\n const togglePause = useCallback(() => {\n if (isPaused) {\n resume();\n } else {\n pause();\n }\n }, [isPaused, pause, resume]);\n\n // Set speed\n const setSpeed = useCallback((multiplier: SpeedMultiplier) => {\n if (!nostalgistRef.current) return;\n\n try {\n const nostalgist = nostalgistRef.current;\n\n if (typeof nostalgist.sendCommand === 'function') {\n // Simple toggle logic: only 1x and 2x supported\n if (multiplier === 2 && !isFastForwardOn) {\n // Enable fast forward\n nostalgist.sendCommand('FAST_FORWARD');\n setIsFastForwardOn(true);\n } else if (multiplier === 1 && isFastForwardOn) {\n // Disable fast forward\n nostalgist.sendCommand('FAST_FORWARD');\n setIsFastForwardOn(false);\n }\n\n setSpeedState(multiplier);\n } else {\n console.warn('[Nostalgist] sendCommand not available');\n }\n } catch (err) {\n console.error('[Nostalgist] Set speed error:', err);\n }\n }, [isFastForwardOn]);\n\n // Screenshot - use Nostalgist's official screenshot() method\n const screenshot = useCallback(async (): Promise<string | null> => {\n if (!nostalgistRef.current) {\n return null;\n }\n\n try {\n // Primary method: Use Nostalgist's official screenshot() API\n const screenshotBlob = await nostalgistRef.current.screenshot();\n\n if (screenshotBlob instanceof Blob) {\n // Convert Blob to data URL\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n if (reader.result) {\n resolve(reader.result as string);\n } else {\n reject(new Error('FileReader result is null'));\n }\n };\n reader.onerror = () => reject(new Error('FileReader error'));\n reader.readAsDataURL(screenshotBlob);\n });\n }\n\n // Fallback: Try to get canvas directly\n const canvas =\n nostalgistRef.current.getCanvas?.() ||\n getCanvasElement?.() ||\n document.querySelector('.game-canvas-container canvas') as HTMLCanvasElement ||\n document.querySelector('canvas') as HTMLCanvasElement;\n\n if (canvas) {\n return canvas.toDataURL('image/png');\n }\n\n return null;\n } catch (err) {\n console.error('[Nostalgist] Screenshot error:', err);\n return null;\n }\n }, []);\n\n // Resize canvas using Nostalgist's resize API\n const resize = useCallback((size: { width: number; height: number }) => {\n if (!nostalgistRef.current) {\n console.warn('[Nostalgist] Cannot resize: emulator not ready');\n return;\n }\n try {\n nostalgistRef.current.resize(size);\n } catch (err) {\n console.error('[Nostalgist] Resize error:', err);\n }\n }, []);\n\n // Get raw Nostalgist instance (for advanced usage)\n const getNostalgistInstance = useCallback((): Nostalgist | null => {\n return nostalgistRef.current;\n }, []);\n\n return {\n status,\n setStatus,\n error,\n isPaused,\n setIsPaused,\n speed,\n nostalgistRef,\n prepare,\n start,\n stop,\n restart,\n pause,\n resume,\n togglePause,\n setSpeed,\n screenshot,\n resize,\n getNostalgistInstance: () => nostalgistRef.current,\n isPerformanceMode,\n };\n}\n","import { useState, useRef, useCallback, useEffect, MutableRefObject } from 'react';\nimport { Nostalgist } from 'nostalgist';\n\ninterface UseEmulatorAudioProps {\n nostalgistRef: MutableRefObject<Nostalgist | null>;\n initialVolume?: number;\n}\n\ninterface UseEmulatorAudioReturn {\n volume: number;\n isMuted: boolean;\n setVolume: (volume: number) => void;\n toggleMute: () => void;\n}\n\nexport function useEmulatorAudio({ nostalgistRef, initialVolume = 100 }: UseEmulatorAudioProps): UseEmulatorAudioReturn {\n const [volume, setVolume] = useState(initialVolume);\n const [isMuted, setIsMuted] = useState(false);\n\n // Volume control - Intercept Web Audio API\n // We monkey-patch AudioNode.connect to inject a GainNode before the destination\n const gainNodeRef = useRef<GainNode | null>(null);\n const lastVolumeRef = useRef(initialVolume);\n\n useEffect(() => {\n // Store original connect method\n const originalConnect = AudioNode.prototype.connect;\n\n // WeakMap to store GainNodes for each AudioContext to avoid creating duplicates\n const contextGainMap = new WeakMap<BaseAudioContext, GainNode>();\n\n // Patch connect\n (AudioNode.prototype as any).connect = function (destination: AudioNode | AudioParam, output?: number, input?: number) {\n // Check if we are connecting to the destination (speakers)\n if (destination instanceof AudioNode && destination === this.context.destination) {\n try {\n // Get or create GainNode for this context\n let gainNode = contextGainMap.get(this.context);\n if (!gainNode) {\n const newGainNode = this.context.createGain();\n // Initialize volume\n newGainNode.gain.value = lastVolumeRef.current / 100;\n // Connect GainNode to destination\n // Use apply to handle variable arguments correctly\n (originalConnect as Function).apply(newGainNode, [destination]);\n contextGainMap.set(this.context, newGainNode);\n\n // Store in ref if this is likely our context (heuristic)\n gainNodeRef.current = newGainNode;\n gainNode = newGainNode;\n console.log('[Nostalgist] AudioContext intercepted and GainNode injected');\n }\n\n // Connect this node to the GainNode instead of destination\n // We cast gainNode to any to avoid strict type checks on the overloaded connect method\n return (originalConnect as Function).call(this, gainNode!, output, input);\n } catch (err) {\n console.error('[Nostalgist] Audio interception error:', err);\n return (originalConnect as Function).apply(this, [destination, output, input]);\n }\n }\n\n // Default behavior for other connections\n return (originalConnect as Function).apply(this, [destination, output, input]);\n };\n\n return () => {\n // Restore original connect on cleanup\n AudioNode.prototype.connect = originalConnect;\n };\n }, []);\n\n const setVolumeLevel = useCallback((newVolume: number) => {\n // Clamp to 0-100 range\n const clampedVolume = Math.max(0, Math.min(100, newVolume));\n const volumeValue = clampedVolume / 100; // Convert to 0.0-1.0\n\n try {\n // Update the GainNode if we have one\n if (gainNodeRef.current) {\n // Smooth transition to avoid clicks\n const currentTime = gainNodeRef.current.context.currentTime;\n gainNodeRef.current.gain.setValueAtTime(volumeValue, currentTime);\n } else {\n // Fallback: Try to find audio elements (for some cores that might use them)\n const audioElements = document.querySelectorAll('audio, video');\n audioElements.forEach((element) => {\n if (element instanceof HTMLMediaElement) {\n element.volume = volumeValue;\n }\n });\n }\n\n // Update state\n setVolume(clampedVolume);\n lastVolumeRef.current = clampedVolume;\n } catch (err) {\n console.error('[Nostalgist] Volume change error:', err);\n }\n }, []);\n\n // Simple mute toggle using keyboard simulation (F9 key)\n const toggleMute = useCallback(() => {\n if (!nostalgistRef.current) return;\n\n try {\n // Fire keyboard event directly to Emscripten's event handlers\n const emscripten = nostalgistRef.current.getEmscripten();\n if (emscripten?.JSEvents) {\n const canvas = nostalgistRef.current.getCanvas?.();\n // Create fake events with required methods\n const createFakeEvent = (code: string) => ({\n code,\n target: canvas,\n preventDefault: () => { },\n stopPropagation: () => { },\n stopImmediatePropagation: () => { },\n });\n\n for (const handler of emscripten.JSEvents.eventHandlers) {\n if (handler.eventTypeString === 'keydown') {\n handler.eventListenerFunc(createFakeEvent('F9'));\n }\n }\n setTimeout(() => {\n for (const handler of emscripten.JSEvents.eventHandlers) {\n if (handler.eventTypeString === 'keyup') {\n handler.eventListenerFunc(createFakeEvent('F9'));\n }\n }\n }, 50);\n }\n setIsMuted(prev => !prev);\n } catch (err) {\n console.error('[Nostalgist] Mute error:', err);\n }\n }, [nostalgistRef]);\n\n return {\n volume,\n isMuted,\n setVolume: setVolumeLevel,\n toggleMute\n };\n}\n","import { useCallback, MutableRefObject } from 'react';\nimport { Nostalgist } from 'nostalgist';\n\ninterface UseEmulatorInputProps {\n nostalgistRef: MutableRefObject<Nostalgist | null>;\n}\n\ninterface UseEmulatorInputReturn {\n pressKey: (key: string) => void;\n}\n\nexport function useEmulatorInput({ nostalgistRef }: UseEmulatorInputProps): UseEmulatorInputReturn {\n // Press key programmatically\n const pressKey = useCallback((key: string) => {\n if (!nostalgistRef.current) return;\n\n try {\n nostalgistRef.current.press(key);\n } catch (err) {\n console.error('[Nostalgist] Press key error:', err);\n }\n }, [nostalgistRef]);\n\n return {\n pressKey\n };\n}\n","import { useRef, useCallback } from 'react';\n\nexport type SavePriority = 'low' | 'high';\n\nexport interface SaveResult {\n data: Uint8Array;\n blob: Blob;\n}\n\ninterface QueuedSave {\n priority: SavePriority;\n resolve: (result: SaveResult | null) => void;\n timestamp: number;\n}\n\n// Minimum delay between saves to let FS settle (ms)\nconst MIN_SAVE_INTERVAL = 100;\n\n// How long to wait for a queued save before timing out (ms)\nconst SAVE_TIMEOUT = 5000;\n\nexport function useSaveScheduler(nostalgistRef: React.MutableRefObject<any>) {\n // Queue of pending save requests\n const queueRef = useRef<QueuedSave[]>([]);\n\n // Is a save currently in progress?\n const savingRef = useRef(false);\n\n // Timestamp of last successful save\n const lastSaveTimeRef = useRef(0);\n\n // Process the next item in the queue\n const processQueue = useCallback(async () => {\n // Already processing or empty queue\n if (savingRef.current || queueRef.current.length === 0) {\n return;\n }\n\n // Sort by priority (high first) then by timestamp (oldest first)\n queueRef.current.sort((a, b) => {\n if (a.priority !== b.priority) {\n return a.priority === 'high' ? -1 : 1;\n }\n return a.timestamp - b.timestamp;\n });\n\n // Get next item\n const item = queueRef.current.shift();\n if (!item) return;\n\n // Check if timed out\n if (Date.now() - item.timestamp > SAVE_TIMEOUT) {\n item.resolve(null);\n // Continue processing\n setTimeout(() => processQueue(), 0);\n return;\n }\n\n savingRef.current = true;\n\n try {\n // Ensure minimum interval between saves\n const timeSinceLastSave = Date.now() - lastSaveTimeRef.current;\n if (timeSinceLastSave < MIN_SAVE_INTERVAL) {\n await new Promise(resolve => setTimeout(resolve, MIN_SAVE_INTERVAL - timeSinceLastSave));\n }\n\n // Perform the save\n if (!nostalgistRef.current) {\n console.warn('[SaveScheduler] Nostalgist instance not available');\n item.resolve(null);\n return;\n }\n\n // Only log for high-priority saves (manual/auto/emergency), not rewind captures\n const isHighPriority = item.priority === 'high';\n if (isHighPriority) {\n console.log('[SaveScheduler] Processing high-priority save...');\n }\n\n const result = await nostalgistRef.current.saveState();\n const stateBlob = result?.state;\n\n if (!stateBlob) {\n console.warn('[SaveScheduler] saveState() returned null or no state blob', { result, priority: item.priority });\n item.resolve(null);\n return;\n }\n\n // Convert Blob to Uint8Array\n const arrayBuffer = await stateBlob.arrayBuffer();\n const stateData = new Uint8Array(arrayBuffer);\n\n // Only log success for high-priority saves to reduce console noise\n if (isHighPriority) {\n console.log('[SaveScheduler] Save successful', { size: stateData.length, priority: item.priority });\n }\n\n lastSaveTimeRef.current = Date.now();\n item.resolve({ data: stateData, blob: stateBlob });\n } catch (err) {\n console.error('[SaveScheduler] Save failed with error:', err);\n item.resolve(null);\n } finally {\n savingRef.current = false;\n\n // Process next item after a brief delay\n setTimeout(() => processQueue(), MIN_SAVE_INTERVAL);\n }\n }, [nostalgistRef]);\n\n // Queue a high-priority save (auto-save, manual save)\n const save = useCallback((): Promise<SaveResult | null> => {\n return new Promise((resolve) => {\n queueRef.current.push({\n priority: 'high',\n resolve,\n timestamp: Date.now(),\n });\n processQueue();\n });\n }, [processQueue]);\n\n // Queue a low-priority save (rewind buffer)\n const queueRewindCapture = useCallback((): Promise<SaveResult | null> => {\n // Drop if queue has too many low-priority items (backpressure)\n const lowPriorityCount = queueRef.current.filter(q => q.priority === 'low').length;\n if (lowPriorityCount >= 3) {\n return Promise.resolve(null);\n }\n\n return new Promise((resolve) => {\n queueRef.current.push({\n priority: 'low',\n resolve,\n timestamp: Date.now(),\n });\n processQueue();\n });\n }, [processQueue]);\n\n // Check if a save is currently in progress\n const isSaving = useCallback(() => savingRef.current, []);\n\n // Get queue length (for debugging)\n const getQueueLength = useCallback(() => queueRef.current.length, []);\n\n // Clear queue (on unmount or stop)\n const clearQueue = useCallback(() => {\n queueRef.current.forEach(item => item.resolve(null));\n queueRef.current = [];\n }, []);\n\n const resultRef = useRef({\n save,\n queueRewindCapture,\n isSaving,\n getQueueLength,\n clearQueue,\n });\n\n resultRef.current.save = save;\n resultRef.current.queueRewindCapture = queueRewindCapture;\n resultRef.current.isSaving = isSaving;\n resultRef.current.getQueueLength = getQueueLength;\n resultRef.current.clearQueue = clearQueue;\n\n return resultRef.current;\n}\n","import { useState, useRef, useCallback, useEffect, MutableRefObject } from 'react';\nimport { Nostalgist } from 'nostalgist';\nimport { useSaveScheduler } from '../useSaveScheduler';\n\ninterface UseEmulatorSavesProps {\n nostalgistRef: MutableRefObject<Nostalgist | null>;\n isPaused: boolean;\n setIsPaused: (paused: boolean) => void;\n setStatus: (status: any) => void;\n rewindEnabled?: boolean;\n}\n\ninterface UseEmulatorSavesReturn {\n isRewinding: boolean;\n rewindBufferSize: number;\n saveState: () => Promise<Uint8Array | null>;\n saveStateWithBlob: () => Promise<{ data: Uint8Array; blob: Blob } | null>;\n loadState: (state: Uint8Array) => Promise<boolean>;\n startRewind: () => void;\n stopRewind: () => void;\n startRewindCapture: () => void;\n stopRewindCapture: () => void;\n}\n\nexport function useEmulatorSaves({ nostalgistRef, isPaused, setIsPaused, setStatus, rewindEnabled = true }: UseEmulatorSavesProps): UseEmulatorSavesReturn {\n const [isRewinding, setIsRewinding] = useState(false);\n const [rewindBufferSize, setRewindBufferSize] = useState(0); // Track buffer size for UI\n\n const rewindIntervalRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const rewindBufferRef = useRef<Uint8Array[]>([]); // Manual rewind buffer using savestates\n const rewindCaptureIntervalRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Centralized save scheduler - all FS operations go through here\n const saveScheduler = useSaveScheduler(nostalgistRef);\n\n // Save state - uses scheduler for serialized FS access (used by rewind buffer)\n const saveState = useCallback(async (): Promise<Uint8Array | null> => {\n if (!nostalgistRef.current) return null;\n const result = await saveScheduler.queueRewindCapture();\n return result?.data ?? null;\n }, [saveScheduler, nostalgistRef]);\n\n // Save state with blob - high priority, returns both data and blob\n // Used by auto-save and manual save\n const saveStateWithBlob = useCallback(async (): Promise<{ data: Uint8Array; blob: Blob } | null> => {\n if (!nostalgistRef.current) return null;\n return saveScheduler.save();\n }, [saveScheduler, nostalgistRef]);\n\n // Load state - also resumes the emulator after loading\n const loadState = useCallback(async (state: Uint8Array): Promise<boolean> => {\n if (!nostalgistRef.current) {\n console.warn('[Nostalgist] Cannot load state: emulator not running');\n return false;\n }\n\n try {\n // loadState expects a Blob, convert Uint8Array to Blob\n const buffer = new ArrayBuffer(state.length);\n const view = new Uint8Array(buffer);\n view.set(state);\n const stateBlob = new Blob([buffer], { type: 'application/octet-stream' });\n\n await nostalgistRef.current.loadState(stateBlob);\n\n // Small delay to let the emulator process the state load before resuming\n await new Promise(resolve => setTimeout(resolve, 50));\n\n // After loading state, ensure emulator is running and state is synced\n nostalgistRef.current.resume();\n setIsPaused(false);\n setStatus('running');\n\n return true;\n } catch (err) {\n console.error('[Nostalgist] Load state error:', err);\n return false;\n }\n }, [nostalgistRef, setIsPaused, setStatus]);\n\n // Start capturing rewind buffer (Afterplay.io style)\n const startRewindCapture = useCallback(() => {\n if (!rewindEnabled) {\n return;\n }\n\n if (rewindCaptureIntervalRef.current) {\n return;\n }\n\n if (!nostalgistRef.current) {\n return;\n }\n\n const MAX_BUFFER_SIZE = 60; // Keep last 30 seconds at 2 saves/sec\n let captureAttempts = 0;\n let successfulCaptures = 0;\n\n rewindCaptureIntervalRef.current = setInterval(async () => {\n if (!nostalgistRef.current || isPaused) return;\n\n captureAttempts++;\n // Scheduler handles all FS serialization - no try/catch needed for FS errors\n const state = await saveState();\n if (state) {\n rewindBufferRef.current.push(state);\n successfulCaptures++;\n\n // Keep buffer size manageable\n if (rewindBufferRef.current.length > MAX_BUFFER_SIZE) {\n rewindBufferRef.current.shift(); // Remove oldest\n }\n\n // Update buffer size for UI\n setRewindBufferSize(rewindBufferRef.current.length);\n\n // Log progress every 50 captures (less verbose)\n if (successfulCaptures % 50 === 0) {\n console.log(`[Nostalgist] 📹 Rewind buffer: ${rewindBufferRef.current.length} states`);\n }\n }\n // If state is null, scheduler either dropped it (backpressure) or failed - that's fine\n }, 500); // Capture every 500ms\n }, [isPaused, saveState, nostalgistRef]);\n\n // Stop capturing rewind buffer\n const stopRewindCapture = useCallback(() => {\n if (rewindCaptureIntervalRef.current) {\n clearInterval(rewindCaptureIntervalRef.current);\n rewindCaptureIntervalRef.current = null;\n }\n }, []);\n\n // Stop rewind (release) - defined before startRewind to avoid closure issues\n const stopRewind = useCallback(() => {\n if (!isRewinding) {\n return;\n }\n\n try {\n setIsRewinding(false);\n\n // Clear the rewind interval\n if (rewindIntervalRef.current) {\n clearInterval(rewindIntervalRef.current);\n rewindIntervalRef.current = null;\n }\n\n // Clear old buffer\n rewindBufferRef.current = [];\n setRewindBufferSize(0);\n\n // Wait a bit before restarting capture - FS needs time to settle after rapid state loads\n setTimeout(() => {\n // Check if emulator is still available (don't check status - it might be stale in closure)\n if (nostalgistRef.current) {\n startRewindCapture();\n }\n }, 1000); // Wait 1 second for FS to settle\n } catch (err) {\n console.error('[Nostalgist] Stop rewind error:', err);\n }\n }, [isRewinding, startRewindCapture, nostalgistRef]);\n\n // Start rewind (hold) - Manual implementation like Afterplay.io\n const startRewind = useCallback(() => {\n if (!nostalgistRef.current || isRewinding) {\n return;\n }\n\n if (rewindBufferRef.current.length === 0) {\n return;\n }\n\n try {\n setIsRewinding(true);\n // Stop capturing while rewinding\n stopRewindCapture();\n\n // Load states backwards from buffer\n let rewindIndex = rewindBufferRef.current.length - 1;\n let isLoadingState = false; // Prevent overlapping loads\n\n rewindIntervalRef.current = setInterval(async () => {\n // Skip if already loading or no more states\n if (isLoadingState || rewindIndex < 0 || !nostalgistRef.current) {\n if (rewindIndex < 0) {\n // Reached beginning of buffer, auto-stop\n stopRewind();\n }\n return;\n }\n\n try {\n const state = rewindBufferRef.current[rewindIndex];\n if (state) {\n isLoadingState = true;\n await loadState(state);\n rewindIndex--;\n isLoadingState = false;\n } else {\n // Invalid state, stop rewinding\n stopRewind();\n }\n } catch (err) {\n isLoadingState = false;\n // Silently handle errors (likely FS issues when switching states fast)\n }\n }, 200); // Load state every 200ms for smoother rewind\n } catch (err) {\n console.error('[Nostalgist] Start rewind error:', err);\n setIsRewinding(false);\n startRewindCapture(); // Resume capturing\n }\n }, [isRewinding, loadState, stopRewindCapture, startRewindCapture, stopRewind, nostalgistRef]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n // Clear save queue\n saveScheduler.clearQueue();\n\n // Clean up rewind intervals\n if (rewindIntervalRef.current) {\n clearInterval(rewindIntervalRef.current);\n rewindIntervalRef.current = null;\n }\n if (rewindCaptureIntervalRef.current) {\n clearInterval(rewindCaptureIntervalRef.current);\n rewindCaptureIntervalRef.current = null;\n }\n\n // Clear rewind buffer\n rewindBufferRef.current = [];\n };\n }, [saveScheduler]);\n\n // Expose startRewindCapture to be called when emulator starts\n // We can't export it directly because it's used internally, but we can trigger it via effect if needed\n // Or we can export it and let useEmulatorCore call it.\n // For now, let's export it as a ref or just expose it.\n // Actually, `useNostalgist` called `startRewindCapture` in `start`.\n // So we should expose it.\n\n return {\n isRewinding,\n rewindBufferSize,\n saveState,\n saveStateWithBlob,\n loadState,\n startRewind,\n stopRewind,\n // Internal but needed by core\n startRewindCapture,\n stopRewindCapture\n };\n}\n","import { useCallback, MutableRefObject } from 'react';\nimport { Nostalgist } from 'nostalgist';\n\ninterface UseEmulatorCheatsProps {\n nostalgistRef: MutableRefObject<Nostalgist | null>;\n}\n\ninterface UseEmulatorCheatsReturn {\n applyCheat: (code: string) => void;\n resetCheats: () => void;\n}\n\nexport function useEmulatorCheats({ nostalgistRef }: UseEmulatorCheatsProps): UseEmulatorCheatsReturn {\n // Apply cheat code\n const applyCheat = useCallback((code: string) => {\n if (!nostalgistRef.current) return;\n try {\n (nostalgistRef.current as any).addCheat(code);\n } catch (err) {\n console.error('[Nostalgist] Apply cheat error:', err);\n }\n }, [nostalgistRef]);\n\n // Reset cheats\n const resetCheats = useCallback(() => {\n if (!nostalgistRef.current) return;\n try {\n (nostalgistRef.current as any).resetCheats();\n } catch (err) {\n console.error('[Nostalgist] Reset cheats error:', err);\n }\n }, [nostalgistRef]);\n\n return {\n applyCheat,\n resetCheats\n };\n}\n","import { useCallback, useMemo } from 'react';\nimport { Nostalgist } from 'nostalgist';\nimport {\n KeyboardMapping,\n GamepadMapping,\n} from '../lib/controls';\nimport { PERFORMANCE_TIER_2_SYSTEMS } from '../lib/systems';\nimport { useEmulatorCore } from './emulator/useEmulatorCore';\nimport { useEmulatorAudio } from './emulator/useEmulatorAudio';\nimport { useEmulatorInput } from './emulator/useEmulatorInput';\nimport { useEmulatorSaves } from './emulator/useEmulatorSaves';\nimport { useEmulatorCheats } from './emulator/useEmulatorCheats';\nimport { EmulatorStatus, SpeedMultiplier, RetroAchievementsConfig } from './emulator/types';\n\n// Re-export types\nexport type { EmulatorStatus, SpeedMultiplier, RetroAchievementsConfig };\n\ninterface UseNostalgistOptions {\n system: string;\n romUrl: string;\n\n core?: string; // Core override\n biosUrl?: string | { url: string; name: string; location?: 'system' | 'rom_folder' }; // Custom BIOS URL\n initialState?: Blob | Uint8Array; // Initial save state\n getCanvasElement?: () => HTMLCanvasElement | null; // Function to get canvas element (must be in DOM before prepare)\n keyboardControls?: KeyboardMapping; // Custom keyboard mappings\n gamepadBindings?: GamepadMapping[]; // Custom gamepad mappings per player\n retroAchievements?: RetroAchievementsConfig;\n onReady?: () => void;\n onError?: (error: Error) => void;\n initialVolume?: number;\n romFileName?: string;\n shader?: string; // CRT shader preset (e.g., 'crt/crt-lottes')\n romId?: string;\n}\n\nexport interface UseNostalgistReturn {\n status: EmulatorStatus;\n error: string | null;\n isPaused: boolean;\n speed: SpeedMultiplier;\n isRewinding: boolean;\n rewindBufferSize: number;\n volume: number; // 0-100\n isMuted: boolean;\n\n // Lifecycle\n prepare: () => Promise<void>;\n start: () => Promise<void>;\n stop: () => void;\n restart: () => Promise<void>;\n\n // Playback\n pause: () => void;\n resume: () => void;\n togglePause: () => void;\n\n // Save/Load\n saveState: () => Promise<Uint8Array | null>;\n saveStateWithBlob: () => Promise<{ data: Uint8Array; blob: Blob } | null>;\n loadState: (state: Uint8Array) => Promise<boolean>;\n\n // Speed & Rewind\n setSpeed: (multiplier: SpeedMultiplier) => void;\n startRewind: () => void;\n stopRewind: () => void;\n rewindEnabled: boolean;\n\n // Volume\n setVolume: (volume: number) => void;\n toggleMute: () => void;\n\n // Utils\n screenshot: () => Promise<string | null>;\n pressKey: (key: string) => void;\n resize: (size: { width: number; height: number }) => void;\n\n // Cheats\n applyCheat: (code: string) => void;\n resetCheats: () => void;\n\n // RetroAchievements integration - get access to emulator internals\n getNostalgistInstance: () => Nostalgist | null;\n isPerformanceMode: boolean;\n}\n\nexport const useNostalgist = ({\n system,\n romUrl,\n core,\n biosUrl,\n initialState,\n getCanvasElement,\n keyboardControls,\n gamepadBindings,\n retroAchievements,\n onReady,\n onError,\n initialVolume = 100,\n romFileName,\n shader,\n romId,\n}: UseNostalgistOptions): UseNostalgistReturn => {\n // 0. System Analysis\n // Check if system is heavy (Tier 2) to disable expensive features like manual rewind capture\n const isHeavySystem = useMemo(() => {\n return PERFORMANCE_TIER_2_SYSTEMS.has(system.toUpperCase());\n }, [system]);\n\n // 1. Core Emulator Logic (Lifecycle, Status, Canvas)\n const {\n status,\n setStatus,\n error,\n isPaused,\n setIsPaused,\n speed,\n nostalgistRef,\n prepare,\n start: coreStart,\n stop: coreStop,\n restart,\n pause,\n resume,\n togglePause,\n setSpeed,\n screenshot,\n resize,\n getNostalgistInstance,\n isPerformanceMode,\n } = useEmulatorCore({\n system,\n romUrl,\n romId,\n core,\n biosUrl,\n initialState,\n getCanvasElement,\n keyboardControls,\n gamepadBindings,\n retroAchievements,\n initialVolume,\n romFileName,\n shader,\n onReady,\n onError,\n });\n\n // 2. Audio Logic (Volume, Mute)\n const {\n volume,\n isMuted,\n setVolume,\n toggleMute,\n } = useEmulatorAudio({\n nostalgistRef,\n initialVolume,\n });\n\n // 3. Input Logic (Press Key)\n const {\n pressKey,\n } = useEmulatorInput({\n nostalgistRef,\n });\n\n // 4. Saves Logic (Save/Load, Rewind)\n const {\n isRewinding,\n rewindBufferSize,\n saveState,\n saveStateWithBlob,\n loadState,\n startRewind,\n stopRewind,\n startRewindCapture,\n stopRewindCapture,\n } = useEmulatorSaves({\n nostalgistRef,\n isPaused,\n setIsPaused,\n setStatus,\n rewindEnabled: !isHeavySystem, // Disable manual rewind loop for heavy systems\n });\n\n // 5. Cheats Logic\n const {\n applyCheat,\n resetCheats,\n } = useEmulatorCheats({\n nostalgistRef,\n });\n\n // Wrapped Start - coordinates core start with rewind capture\n const start = useCallback(async () => {\n await coreStart();\n\n // Start rewind capture after a delay if start was successful\n // We check nostalgistRef.current to ensure it's running\n setTimeout(() => {\n if (nostalgistRef.current) {\n startRewindCapture();\n }\n }, 2000);\n }, [coreStart, startRewindCapture, nostalgistRef]);\n\n // Wrapped Stop - coordinates core stop with rewind cleanup\n const stop = useCallback(() => {\n stopRewindCapture();\n coreStop();\n }, [stopRewindCapture, coreStop]);\n\n // Memoize the return object to prevent unnecessary re-renders in parents\n const hookReturn = useMemo((): UseNostalgistReturn => ({\n status,\n error,\n isPaused,\n speed,\n isRewinding,\n rewindBufferSize,\n volume,\n isMuted,\n\n prepare,\n start,\n stop,\n restart,\n\n pause,\n resume,\n togglePause,\n\n saveState,\n saveStateWithBlob,\n loadState,\n\n setSpeed,\n startRewind,\n stopRewind,\n rewindEnabled: !isHeavySystem,\n\n setVolume,\n toggleMute,\n\n screenshot,\n pressKey,\n resize,\n\n applyCheat,\n resetCheats,\n\n getNostalgistInstance,\n isPerformanceMode,\n }), [\n status, error, isPaused, speed, isRewinding, rewindBufferSize, volume, isMuted,\n prepare, start, stop, restart,\n pause, resume, togglePause,\n saveState, saveStateWithBlob, loadState,\n setSpeed, startRewind, stopRewind,\n isHeavySystem,\n setVolume, toggleMute,\n screenshot, pressKey, resize,\n applyCheat, resetCheats,\n getNostalgistInstance,\n isPerformanceMode\n ]);\n\n return hookReturn;\n};\n","'use client';\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { loadVolume, saveVolume, loadMuteState, saveMuteState } from '../lib/game-player-utils';\n\nexport interface UseVolumeOptions {\n setVolume: (volume: number) => void;\n toggleMute: () => void;\n}\n\nexport interface UseVolumeReturn {\n volume: number; // 0-100\n isMuted: boolean;\n setVolume: (volume: number) => void;\n toggleMute: () => void;\n}\n\n/**\n * Hook to manage volume and mute state with localStorage persistence\n */\nexport function useVolume({\n setVolume: setVolumeInHook,\n toggleMute: toggleMuteInHook,\n}: UseVolumeOptions): UseVolumeReturn {\n const [volume, setVolumeState] = useState(() => loadVolume());\n const [isMuted, setIsMutedState] = useState(() => loadMuteState());\n\n // Sync hook's internal volume state with our state on mount and when volume changes\n useEffect(() => {\n // Initialize hook's volume to match our loaded volume\n setVolumeInHook(volume);\n }, [setVolumeInHook]); // Sync when hook function is available\n\n const setVolume = useCallback((newVolume: number) => {\n const clampedVolume = Math.max(0, Math.min(100, newVolume));\n setVolumeState(clampedVolume);\n saveVolume(clampedVolume);\n setVolumeInHook(clampedVolume);\n }, [setVolumeInHook]);\n\n const toggleMute = useCallback(() => {\n setIsMutedState(prev => {\n const newMuted = !prev;\n saveMuteState(newMuted);\n toggleMuteInHook();\n return newMuted;\n });\n }, [toggleMuteInHook]);\n\n return {\n volume,\n isMuted,\n setVolume,\n toggleMute,\n };\n}\n","'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n KeyboardMapping,\n loadKeyboardMapping,\n saveKeyboardMapping,\n getConsoleKeyboardDefaults,\n} from '../lib/controls';\nimport { ToastType } from './useToast';\nimport { useKoinTranslation } from './useKoinTranslation';\n\nexport interface UseControlsReturn {\n controls: KeyboardMapping;\n saveControls: (newControls: KeyboardMapping) => void;\n resetToDefaults: () => void;\n}\n\n/**\n * Hook for managing keyboard controls\n * Loads/saves per-system mappings from localStorage\n */\nexport function useControls(\n system?: string,\n onNotify?: (message: string, type?: ToastType) => void\n): UseControlsReturn {\n const t = useKoinTranslation();\n // Get default controls for this system\n const defaultControls = getConsoleKeyboardDefaults(system || 'SNES');\n\n // Initialize with loaded controls\n const [controls, setControls] = useState<KeyboardMapping>(() => {\n if (typeof window !== 'undefined') {\n return loadKeyboardMapping(system);\n }\n return defaultControls;\n });\n\n // Reload when system changes\n useEffect(() => {\n const loaded = loadKeyboardMapping(system);\n setControls(loaded);\n }, [system]);\n\n const saveControls = useCallback((newControls: KeyboardMapping) => {\n setControls(newControls);\n saveKeyboardMapping(newControls, system);\n onNotify?.(t.notifications.controlsSaved, 'success');\n }, [system, onNotify, t]);\n\n const resetToDefaults = useCallback(() => {\n setControls(defaultControls);\n saveKeyboardMapping(defaultControls, system);\n onNotify?.(t.notifications.controlsReset, 'info');\n }, [defaultControls, system, onNotify, t]);\n\n return {\n controls,\n saveControls,\n resetToDefaults,\n };\n}\n","import { useState, useMemo, useEffect, RefObject } from 'react';\nimport { useNostalgist } from './useNostalgist';\nimport { useKoinTranslation } from './useKoinTranslation';\nimport { useGamepad } from './useGamepad';\nimport { useVolume } from './useVolume';\nimport { useControls } from './useControls';\nimport { suppressEmulatorWarnings } from '../lib/game-player-utils';\nimport { GamePlayerProps } from '../components/types';\n\ninterface UseGameSessionProps extends GamePlayerProps {\n canvasRef: RefObject<HTMLCanvasElement>;\n showToast: (message: string, type?: 'success' | 'error' | 'info' | 'warning' | 'gamepad', options?: any) => void;\n}\n\nexport function useGameSession(props: UseGameSessionProps) {\n const {\n romUrl,\n romId,\n romFileName,\n system,\n core,\n biosUrl,\n initialSaveState,\n retroAchievementsConfig,\n onSessionStart,\n onSessionEnd,\n onReady,\n onError,\n canvasRef,\n showToast,\n } = props;\n\n const t = useKoinTranslation();\n\n // Controls management\n const { controls, saveControls } = useControls(system, showToast);\n\n // Modals state\n const [gamepadModalOpen, setGamepadModalOpen] = useState(false);\n const [controlsModalOpen, setControlsModalOpen] = useState(false);\n\n // Gamepad detection\n const { gamepads, connectedCount } = useGamepad({\n onConnect: (gamepad) => {\n showToast(\n gamepad.name || t.notifications.controllerReady,\n 'gamepad',\n {\n title: t.notifications.controllerConnected,\n duration: 4000,\n action: {\n label: 'Configure',\n onClick: () => setGamepadModalOpen(true),\n },\n }\n );\n },\n onDisconnect: () => {\n showToast(\n t.notifications.controllerDisconnected,\n 'warning',\n {\n title: t.notifications.controllerDisconnected, // Title repeats or generic? Using same for now\n duration: 3000,\n }\n );\n },\n });\n\n // Load gamepad bindings\n const gamepadBindings = useMemo(() => {\n // We need to implement loadGamepadMapping in useControls or similar\n // For now, passing empty array or implementing a simple loader\n return [];\n }, [gamepads.length]);\n\n // Emulator state\n const nostalgist = useNostalgist({\n system,\n romUrl,\n romId,\n romFileName,\n core,\n biosUrl,\n initialState: initialSaveState,\n getCanvasElement: () => canvasRef.current,\n keyboardControls: controls,\n gamepadBindings: gamepadBindings.length > 0 ? gamepadBindings : undefined,\n retroAchievements: retroAchievementsConfig,\n shader: props.shader,\n onReady: () => {\n console.log('[GamePlayer] Emulator started');\n onSessionStart?.();\n onReady?.();\n\n // Show coin hint for arcade systems\n const arcadeSystems = ['arcade', 'neogeo', 'fba', 'mame'];\n if (arcadeSystems.includes(system.toLowerCase())) {\n setTimeout(() => {\n showToast(\n t.notifications.insertCoin,\n 'info',\n {\n title: t.notifications.insertCoinTitle,\n duration: 5000,\n }\n );\n }, 1500); // Delay to let the game load first\n }\n },\n onError: (err) => {\n console.error('[GamePlayer] Emulator error:', err);\n onError?.(err);\n },\n });\n\n const {\n status,\n setVolume: setVolumeInHook,\n toggleMute: toggleMuteInHook,\n prepare,\n } = nostalgist;\n\n // Session End tracking\n useEffect(() => {\n return () => {\n if (status === 'running' || status === 'paused') {\n onSessionEnd?.();\n }\n };\n }, [status, onSessionEnd]);\n\n // Volume management\n const volumeState = useVolume({\n setVolume: setVolumeInHook,\n toggleMute: toggleMuteInHook,\n });\n\n // Suppress warnings\n useEffect(() => suppressEmulatorWarnings(), []);\n\n // Prepare emulator loop\n useEffect(() => {\n if (!romUrl || !system || status !== 'idle') return;\n\n const checkAndPrepare = async () => {\n if (canvasRef.current && canvasRef.current.isConnected) {\n prepare();\n } else {\n requestAnimationFrame(checkAndPrepare);\n }\n };\n\n const rafId = requestAnimationFrame(checkAndPrepare);\n return () => cancelAnimationFrame(rafId);\n }, [romUrl, system, status, prepare]);\n\n // Hardcore Restrictions\n const hardcoreRestrictions = useMemo(() => {\n const isHardcore = !!retroAchievementsConfig?.hardcore;\n return {\n isHardcore,\n canUseSaveStates: !isHardcore,\n canUseRewind: !isHardcore && (nostalgist.rewindEnabled ?? true),\n canUseCheats: !isHardcore,\n canUseSlowMotion: !isHardcore,\n };\n }, [retroAchievementsConfig?.hardcore, nostalgist.rewindEnabled]);\n\n return {\n nostalgist,\n volumeState,\n controls,\n saveControls,\n gamepads,\n connectedCount,\n gamepadModalOpen,\n setGamepadModalOpen,\n controlsModalOpen,\n setControlsModalOpen,\n hardcoreRestrictions,\n };\n}\n","/**\n * A simple async queue to serialize operations (like saving)\n * ensuring they run one after another.\n */\nexport class SaveQueue {\n private queue: { task: () => Promise<any>; resolve: (val: any) => void; reject: (err: any) => void }[] = [];\n private isProcessing = false;\n\n /**\n * Add a task to the queue.\n * @param task A function that returns a promise.\n * @returns A promise that resolves with the task's result.\n */\n add<T>(task: () => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n this.queue.push({ task, resolve, reject });\n this.process();\n });\n }\n\n /**\n * Check if the queue is currently processing or has pending items.\n */\n get isBusy(): boolean {\n return this.isProcessing || this.queue.length > 0;\n }\n\n private async process() {\n if (this.isProcessing) return;\n this.isProcessing = true;\n\n while (this.queue.length > 0) {\n const item = this.queue.shift();\n if (item) {\n try {\n const result = await item.task();\n item.resolve(result);\n } catch (err) {\n item.reject(err);\n }\n }\n }\n\n this.isProcessing = false;\n }\n}\n","import { useState, useCallback, useEffect, useRef } from 'react';\nimport { UseNostalgistReturn } from './useNostalgist';\nimport { SaveQueue } from '../lib/save-queue';\n\ninterface UseAutoSaveProps {\n nostalgist: UseNostalgistReturn | null;\n onAutoSave?: (blob: Blob, screenshot?: string) => Promise<void>;\n queueRef: React.MutableRefObject<SaveQueue>;\n autoSaveInterval?: number; // Defaults to 60000ms\n}\n\nexport function useAutoSave({\n nostalgist,\n onAutoSave,\n queueRef,\n autoSaveInterval = 60000,\n}: UseAutoSaveProps) {\n const [autoSavePaused, setAutoSavePaused] = useState(false);\n const [autoSaveState, setAutoSaveState] = useState<'idle' | 'counting' | 'saving' | 'done'>('idle');\n const [autoSaveProgress, setAutoSaveProgress] = useState(0);\n\n // Keep latest callbacks in refs to avoid restarting the timer\n const onAutoSaveRef = useRef(onAutoSave);\n const nostalgistRef = useRef(nostalgist);\n\n useEffect(() => {\n onAutoSaveRef.current = onAutoSave;\n nostalgistRef.current = nostalgist;\n }, [onAutoSave, nostalgist]);\n\n // Trigger to restart the auto-save loop\n const [loopTrigger, setLoopTrigger] = useState(0);\n\n useEffect(() => {\n const currentNostalgist = nostalgist;\n\n if (!onAutoSave || !currentNostalgist || currentNostalgist.status !== 'running' || autoSavePaused) {\n setAutoSaveState('idle');\n setAutoSaveProgress(0);\n return;\n }\n\n setAutoSaveState('counting');\n setAutoSaveProgress(0);\n\n const progressInterval = 1000;\n const startTime = Date.now();\n\n // Progress updater\n const progressId = setInterval(() => {\n const elapsed = Date.now() - startTime;\n const progress = Math.min(100, (elapsed / autoSaveInterval) * 100);\n setAutoSaveProgress(progress);\n }, progressInterval);\n\n // Auto-save trigger\n const saveTimeoutId = setTimeout(async () => {\n if (queueRef.current.isBusy) {\n console.log('[GamePlayer] Skipping auto-save (queue busy)');\n // Retry in 5 seconds if busy, don't full reset\n setTimeout(() => setLoopTrigger(prev => prev + 1), 5000);\n return;\n }\n\n const activeNostalgist = nostalgistRef.current;\n const activeOnAutoSave = onAutoSaveRef.current;\n\n if (!activeNostalgist || !activeOnAutoSave) return;\n\n setAutoSaveState('saving');\n setAutoSaveProgress(100);\n\n await queueRef.current.add(async () => {\n const result = await activeNostalgist.saveStateWithBlob();\n if (result) {\n let screen: string | undefined;\n try {\n const screenshotData = await activeNostalgist.screenshot();\n if (screenshotData) screen = screenshotData;\n } catch (e) {\n console.warn('Failed to take screenshot for auto-save', e);\n }\n\n await activeOnAutoSave(result.blob, screen);\n // console.log('[GamePlayer] Auto-saved');\n setAutoSaveState('done');\n\n // Restart loop after 2 seconds\n setTimeout(() => {\n setLoopTrigger(prev => prev + 1);\n }, 2000);\n }\n });\n }, autoSaveInterval);\n\n return () => {\n clearInterval(progressId);\n clearTimeout(saveTimeoutId);\n };\n }, [nostalgist?.status, autoSavePaused, !!onAutoSave, loopTrigger, autoSaveInterval]);\n\n const handleAutoSaveToggle = useCallback(() => {\n setAutoSavePaused(prev => !prev);\n }, []);\n\n // Emergency Save Logic (Visibility Change & Unload)\n useEffect(() => {\n if (!onAutoSave || !nostalgist || nostalgist.status !== 'running') return;\n\n const performEmergencySave = async () => {\n try {\n await queueRef.current.add(async () => {\n const result = await nostalgist.saveStateWithBlob();\n if (result) {\n let screen: string | undefined;\n try {\n const screenshotData = await nostalgist.screenshot();\n if (screenshotData) screen = screenshotData;\n } catch (e) {\n console.warn('Failed to take screenshot for emergency save', e);\n }\n\n await onAutoSave(result.blob, screen);\n console.log('[GamePlayer] Emergency saved');\n }\n });\n } catch (err) {\n console.error('[GamePlayer] Emergency save failed', err);\n }\n };\n\n const handleVisibilityChange = () => {\n if (document.hidden) {\n performEmergencySave();\n }\n };\n\n const handleBeforeUnload = (_e: BeforeUnloadEvent) => {\n if (!document.hidden) {\n performEmergencySave();\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n window.addEventListener('beforeunload', handleBeforeUnload);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n window.removeEventListener('beforeunload', handleBeforeUnload);\n };\n }, [nostalgist?.status, onAutoSave, nostalgist]);\n\n return {\n autoSaveEnabled: !!onAutoSave,\n autoSavePaused,\n autoSaveState,\n autoSaveProgress,\n handleAutoSaveToggle,\n };\n}\n","import { useState, useCallback, useRef } from 'react';\nimport { UseNostalgistReturn } from './useNostalgist';\nimport { useKoinTranslation } from './useKoinTranslation';\nimport { GamePlayerProps, SaveSlot } from '../components/types';\nimport { SaveQueue } from '../lib/save-queue';\nimport { useAutoSave } from './useAutoSave';\n\ninterface UseGameSavesProps extends Partial<GamePlayerProps> {\n nostalgist: UseNostalgistReturn | null;\n showToast: (message: string, type?: 'success' | 'error' | 'info' | 'warning', options?: any) => void;\n pause: () => void;\n resume: () => void;\n}\n\nexport function useGameSaves({\n nostalgist,\n showToast,\n pause,\n resume,\n title,\n onSaveState,\n onLoadState,\n onAutoSave,\n onGetSaveSlots,\n onDeleteSaveState,\n autoSaveInterval,\n}: UseGameSavesProps) {\n const t = useKoinTranslation();\n // Save Slot Modal state\n const [saveModalOpen, setSaveModalOpen] = useState(false);\n const [saveModalMode, setSaveModalMode] = useState<'save' | 'load'>('save');\n const [saveSlots, setSaveSlots] = useState<SaveSlot[]>([]);\n const [isSlotLoading, setIsSlotLoading] = useState(false);\n const [actioningSlot, setActioningSlot] = useState<number | null>(null);\n\n // Save Queue to prevent race conditions\n const queueRef = useRef(new SaveQueue());\n\n // Auto-save hook\n const {\n autoSaveEnabled,\n autoSavePaused,\n autoSaveState,\n autoSaveProgress,\n handleAutoSaveToggle,\n } = useAutoSave({\n nostalgist,\n onAutoSave,\n queueRef,\n autoSaveInterval,\n });\n\n // Fetch slots helper\n const refreshSlots = useCallback(async () => {\n if (!onGetSaveSlots) return;\n setIsSlotLoading(true);\n try {\n const slots = await onGetSaveSlots();\n setSaveSlots(slots);\n } catch (err) {\n console.error('Failed to fetch save slots:', err);\n showToast(t.notifications.failedFetch, 'error', { title: t.overlays.toast.error });\n } finally {\n setIsSlotLoading(false);\n }\n }, [onGetSaveSlots, showToast]);\n\n // Handlers\n const handleSave = async () => {\n if (!nostalgist) return;\n\n if (onGetSaveSlots && onSaveState) {\n // Open modal for slot selection\n setSaveModalMode('save');\n setSaveModalOpen(true);\n pause(); // Pause game while in modal\n refreshSlots();\n } else if (onSaveState) {\n // Direct save to slot 0 if no slot system\n await queueRef.current.add(async () => {\n const result = await nostalgist.saveStateWithBlob();\n if (result) {\n await onSaveState(0, result.blob, undefined);\n showToast(t.notifications.saved, 'success', { title: t.overlays.toast.saved });\n }\n });\n } else {\n // Default: Download blob\n await queueRef.current.add(async () => {\n const result = await nostalgist.saveStateWithBlob();\n if (result) {\n const url = URL.createObjectURL(result.blob);\n const a = document.createElement('a');\n a.href = url;\n const fileName = title || 'game';\n a.download = `${fileName}.state`;\n a.click();\n URL.revokeObjectURL(url);\n showToast(t.notifications.downloaded, 'success', { title: t.overlays.toast.saved });\n }\n });\n }\n };\n\n const handleLoad = async () => {\n if (!nostalgist) return;\n\n if (onGetSaveSlots && onLoadState) {\n // Open modal for slot selection\n setSaveModalMode('load');\n setSaveModalOpen(true);\n pause();\n refreshSlots();\n } else if (onLoadState) {\n // Direct load from slot 0\n const blob = await onLoadState(0);\n if (blob) {\n const buffer = await blob.arrayBuffer();\n await queueRef.current.add(async () => {\n await nostalgist.loadState(new Uint8Array(buffer));\n });\n showToast(t.notifications.loaded, 'success', { title: t.overlays.toast.loaded });\n } else {\n showToast(t.notifications.noSaveFound, 'error', { title: t.overlays.toast.error });\n }\n } else {\n // Default: Open file picker\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.state';\n input.onchange = async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file) {\n const buffer = await file.arrayBuffer();\n await queueRef.current.add(async () => {\n await nostalgist.loadState(new Uint8Array(buffer));\n });\n showToast(t.notifications.loadedFile, 'success', { title: t.overlays.toast.loaded });\n }\n };\n input.click();\n }\n };\n\n const handleSlotSelect = async (slot: number) => {\n if (!nostalgist) return;\n\n if (saveModalMode === 'save') {\n if (!onSaveState) return;\n setActioningSlot(slot);\n try {\n await queueRef.current.add(async () => {\n const result = await nostalgist.saveStateWithBlob();\n if (result) {\n // Take screenshot\n let screen: string | undefined;\n try {\n const screenshotData = await nostalgist.screenshot();\n if (screenshotData) {\n screen = screenshotData;\n }\n } catch (e) {\n console.warn('Screenshot failed', e);\n }\n\n await onSaveState(slot, result.blob, screen);\n showToast(t.notifications.savedSlot.replace('{{num}}', slot.toString()), 'success', { title: t.overlays.toast.saved });\n setSaveModalOpen(false);\n resume();\n }\n });\n } catch (err) {\n console.error('Save failed:', err);\n showToast(t.notifications.failedSave, 'error', { title: t.overlays.toast.error });\n } finally {\n setActioningSlot(null);\n }\n } else {\n if (!onLoadState) return;\n setActioningSlot(slot);\n try {\n const blob = await onLoadState(slot);\n if (blob) {\n const buffer = await blob.arrayBuffer();\n await queueRef.current.add(async () => {\n await nostalgist.loadState(new Uint8Array(buffer));\n });\n showToast(t.notifications.loadedSlot.replace('{{num}}', slot.toString()), 'success', { title: t.overlays.toast.loaded });\n setSaveModalOpen(false);\n resume();\n } else {\n showToast(t.notifications.emptySlot, 'error', { title: t.overlays.toast.error });\n }\n } catch (err) {\n console.error('Load failed:', err);\n showToast(t.notifications.failedLoad, 'error', { title: t.overlays.toast.error });\n } finally {\n setActioningSlot(null);\n }\n }\n };\n\n const handleSlotDelete = async (slot: number) => {\n if (!onDeleteSaveState) return;\n if (!confirm('Are you sure you want to delete this save?')) return;\n\n setActioningSlot(slot);\n try {\n await onDeleteSaveState(slot);\n showToast(t.notifications.deletedSlot.replace('{{num}}', slot.toString()), 'success', { title: t.overlays.toast.saved });\n refreshSlots(); // Refresh list\n } catch (err) {\n console.error('Delete failed:', err);\n showToast(t.notifications.failedDelete, 'error', { title: t.overlays.toast.error });\n } finally {\n setActioningSlot(null);\n }\n };\n\n return {\n saveModalOpen,\n setSaveModalOpen,\n saveModalMode,\n saveSlots,\n isSlotLoading,\n actioningSlot,\n handleSave,\n handleLoad,\n handleSlotSelect,\n handleSlotDelete,\n // Auto-save exports\n autoSaveEnabled,\n autoSavePaused,\n autoSaveState,\n autoSaveProgress,\n handleAutoSaveToggle,\n };\n}\n","import { useState } from 'react';\nimport { UseNostalgistReturn } from './useNostalgist';\nimport { GamePlayerProps } from '../components/types';\n\ninterface UseGameCheatsProps extends Partial<GamePlayerProps> {\n nostalgist: UseNostalgistReturn | null;\n}\n\nexport function useGameCheats({\n nostalgist,\n cheats = [],\n onToggleCheat,\n}: UseGameCheatsProps) {\n const [cheatsModalOpen, setCheatsModalOpen] = useState(false);\n const [activeCheats, setActiveCheats] = useState<Set<number>>(new Set());\n\n const handleToggleCheat = (cheatId: number) => {\n if (!nostalgist) return;\n\n const newActiveCheats = new Set(activeCheats);\n const isActive = newActiveCheats.has(cheatId);\n\n if (isActive) {\n newActiveCheats.delete(cheatId);\n } else {\n newActiveCheats.add(cheatId);\n }\n setActiveCheats(newActiveCheats);\n\n // Notify external handler\n onToggleCheat?.(cheatId, !isActive);\n\n // Re-apply all active cheats\n nostalgist.resetCheats();\n\n // Small delay to ensure reset is processed\n setTimeout(() => {\n newActiveCheats.forEach((id) => {\n const cheat = cheats.find((c) => c.id === id);\n if (cheat) {\n nostalgist.applyCheat(cheat.code);\n }\n });\n }, 50);\n };\n\n return {\n cheatsModalOpen,\n setCheatsModalOpen,\n activeCheats,\n handleToggleCheat,\n };\n}\n","'use client';\n\nimport { useState, useRef, useCallback, useEffect } from 'react';\n\ninterface UseGameRecordingProps {\n getCanvasElement: () => HTMLCanvasElement | null;\n}\n\ninterface UseGameRecordingReturn {\n isRecording: boolean;\n isPaused: boolean;\n recordingDuration: number; // in seconds\n startRecording: () => void;\n stopRecording: () => Promise<Blob | null>;\n pauseRecording: () => void;\n resumeRecording: () => void;\n isSupported: boolean;\n}\n\n/**\n * Gameplay Recording Hook\n * -----------------------\n * Uses MediaRecorder API to capture canvas gameplay as WebM video.\n * \n * Features:\n * - Start/stop recording\n * - Pause/resume\n * - Duration tracking\n * - Returns Blob for download\n */\nexport function useGameRecording({\n getCanvasElement,\n}: UseGameRecordingProps): UseGameRecordingReturn {\n const [isRecording, setIsRecording] = useState(false);\n const [isPaused, setIsPaused] = useState(false);\n const [recordingDuration, setRecordingDuration] = useState(0);\n\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n const startTimeRef = useRef<number>(0);\n const pausedTimeRef = useRef<number>(0);\n const durationIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // Check browser support\n const isSupported = typeof MediaRecorder !== 'undefined' && MediaRecorder.isTypeSupported('video/webm');\n\n // Start recording\n const startRecording = useCallback(() => {\n const canvas = getCanvasElement();\n if (!canvas || !isSupported) {\n console.warn('[Recording] Canvas not found or MediaRecorder not supported');\n return;\n }\n\n try {\n // Capture canvas stream at 30fps\n const stream = canvas.captureStream(30);\n\n // Try to use VP9 for better quality, fallback to VP8\n const mimeType = MediaRecorder.isTypeSupported('video/webm;codecs=vp9')\n ? 'video/webm;codecs=vp9'\n : 'video/webm;codecs=vp8';\n\n const mediaRecorder = new MediaRecorder(stream, {\n mimeType,\n videoBitsPerSecond: 5000000, // 5 Mbps for good quality\n });\n\n chunksRef.current = [];\n\n mediaRecorder.ondataavailable = (e) => {\n if (e.data.size > 0) {\n chunksRef.current.push(e.data);\n }\n };\n\n mediaRecorder.start(1000); // Capture every second\n mediaRecorderRef.current = mediaRecorder;\n\n startTimeRef.current = Date.now();\n pausedTimeRef.current = 0;\n setIsRecording(true);\n setIsPaused(false);\n setRecordingDuration(0);\n\n // Update duration every second\n durationIntervalRef.current = setInterval(() => {\n if (!isPaused) {\n const elapsed = (Date.now() - startTimeRef.current - pausedTimeRef.current) / 1000;\n setRecordingDuration(Math.floor(elapsed));\n }\n }, 1000);\n\n console.log('[Recording] Started');\n } catch (err) {\n console.error('[Recording] Failed to start:', err);\n }\n }, [getCanvasElement, isSupported, isPaused]);\n\n // Stop recording and return blob\n const stopRecording = useCallback(async (): Promise<Blob | null> => {\n return new Promise((resolve) => {\n const mediaRecorder = mediaRecorderRef.current;\n if (!mediaRecorder || mediaRecorder.state === 'inactive') {\n resolve(null);\n return;\n }\n\n mediaRecorder.onstop = () => {\n const blob = new Blob(chunksRef.current, { type: 'video/webm' });\n chunksRef.current = [];\n\n setIsRecording(false);\n setIsPaused(false);\n setRecordingDuration(0);\n\n if (durationIntervalRef.current) {\n clearInterval(durationIntervalRef.current);\n }\n\n console.log('[Recording] Stopped, size:', (blob.size / 1024 / 1024).toFixed(2), 'MB');\n resolve(blob);\n };\n\n mediaRecorder.stop();\n });\n }, []);\n\n // Pause recording\n const pauseRecording = useCallback(() => {\n const mediaRecorder = mediaRecorderRef.current;\n if (mediaRecorder && mediaRecorder.state === 'recording') {\n mediaRecorder.pause();\n setIsPaused(true);\n pausedTimeRef.current = Date.now();\n console.log('[Recording] Paused');\n }\n }, []);\n\n // Resume recording\n const resumeRecording = useCallback(() => {\n const mediaRecorder = mediaRecorderRef.current;\n if (mediaRecorder && mediaRecorder.state === 'paused') {\n // Account for paused time\n pausedTimeRef.current = Date.now() - pausedTimeRef.current;\n mediaRecorder.resume();\n setIsPaused(false);\n console.log('[Recording] Resumed');\n }\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {\n mediaRecorderRef.current.stop();\n }\n if (durationIntervalRef.current) {\n clearInterval(durationIntervalRef.current);\n }\n };\n }, []);\n\n return {\n isRecording,\n isPaused,\n recordingDuration,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n isSupported,\n };\n}\n","import { GamePlayerProps } from '../components/types';\nimport { useGameUI } from './useGameUI';\nimport { useGameSession } from './useGameSession';\nimport { useGameSaves } from './useGameSaves';\nimport { useGameCheats } from './useGameCheats';\nimport { useGameRecording } from './useGameRecording';\n\nexport function useGamePlayer(props: GamePlayerProps) {\n // 1. UI State (Toasts, Fullscreen, Refs)\n const {\n containerRef,\n canvasRef,\n isMobile,\n isFullscreen,\n toasts,\n showToast,\n dismissToast,\n handleFullscreen,\n raSidebarOpen,\n setRaSidebarOpen,\n } = useGameUI();\n\n // 2. Session State (Emulator, Controls, Gamepads, Volume)\n const {\n nostalgist,\n volumeState,\n controls,\n saveControls,\n gamepads,\n connectedCount,\n gamepadModalOpen,\n setGamepadModalOpen,\n controlsModalOpen,\n setControlsModalOpen,\n hardcoreRestrictions,\n } = useGameSession({\n ...props,\n canvasRef,\n showToast,\n });\n\n const {\n pause,\n resume,\n } = nostalgist;\n\n // 3. Saves State (Save/Load, Slots, Auto-save)\n const {\n saveModalOpen,\n setSaveModalOpen,\n saveModalMode,\n saveSlots,\n isSlotLoading,\n actioningSlot,\n handleSave,\n handleLoad,\n handleSlotSelect,\n handleSlotDelete,\n autoSaveEnabled,\n autoSavePaused,\n autoSaveState,\n autoSaveProgress,\n handleAutoSaveToggle,\n } = useGameSaves({\n ...props,\n nostalgist,\n showToast,\n pause,\n resume,\n });\n\n // 4. Cheats State (Modal, Toggling)\n const {\n cheatsModalOpen,\n setCheatsModalOpen,\n activeCheats,\n handleToggleCheat,\n } = useGameCheats({\n ...props,\n nostalgist,\n });\n\n // 5. Recording State (Capture gameplay as video)\n const {\n isRecording,\n isPaused: isRecordingPaused,\n recordingDuration,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n isSupported: recordingSupported,\n } = useGameRecording({\n getCanvasElement: () => canvasRef.current,\n });\n\n return {\n // Refs\n containerRef,\n canvasRef,\n\n // State\n isMobile,\n isFullscreen,\n toasts,\n dismissToast,\n raSidebarOpen,\n setRaSidebarOpen,\n\n // Controls\n controls,\n saveControls,\n\n // Gamepads\n gamepads,\n connectedCount,\n\n // Modals\n gamepadModalOpen,\n setGamepadModalOpen,\n controlsModalOpen,\n setControlsModalOpen,\n cheatsModalOpen,\n setCheatsModalOpen,\n\n // Save Modal\n saveModalOpen,\n setSaveModalOpen,\n saveModalMode,\n saveSlots,\n isSlotLoading,\n actioningSlot,\n handleSlotSelect,\n handleSlotDelete,\n autoSaveEnabled,\n autoSavePaused,\n autoSaveState,\n autoSaveProgress,\n handleAutoSaveToggle,\n\n // Restrictions\n hardcoreRestrictions,\n\n // Cheats\n activeCheats,\n handleToggleCheat,\n\n // Emulator\n nostalgist,\n volumeState,\n\n // Handlers\n handleFullscreen,\n handleSave,\n handleLoad,\n\n // Actions\n pause,\n resume,\n\n // Recording\n isRecording,\n isRecordingPaused,\n recordingDuration,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n recordingSupported,\n };\n}\n","'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { ShaderPresetId } from '../components/UI/ShaderSelector';\n\nconst STORAGE_KEY = 'koin-player-settings';\n\nexport interface PlayerSettings {\n volume: number;\n muted: boolean;\n shader: ShaderPresetId;\n showPerformanceOverlay: boolean;\n showInputDisplay: boolean;\n}\n\nconst DEFAULT_SETTINGS: PlayerSettings = {\n volume: 1,\n muted: false,\n shader: '',\n showPerformanceOverlay: false,\n showInputDisplay: false,\n};\n\n/**\n * Hook to manage persistent player settings (Volume, Shader, Overlays)\n * Synchronizes with localStorage and optional external callback.\n */\nexport function usePlayerPersistence(\n onSettingsChange?: (settings: PlayerSettings) => void\n) {\n // Initialize state function to avoid hydration mismatch if possible, \n // but for localStorage we usually need useEffect or a specific strategy.\n // For simplicity, we start with defaults and load in effect.\n const [settings, setSettings] = useState<PlayerSettings>(DEFAULT_SETTINGS);\n const [isLoaded, setIsLoaded] = useState(false);\n\n // Load from storage on mount\n useEffect(() => {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored);\n setSettings(prev => ({ ...prev, ...parsed }));\n }\n } catch (e) {\n console.error('Failed to load player settings', e);\n }\n setIsLoaded(true);\n }, []);\n\n // Save to storage whenever settings change\n const updateSettings = useCallback((updates: Partial<PlayerSettings>) => {\n setSettings(prev => {\n const next = { ...prev, ...updates };\n\n // Persist\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(next));\n } catch (e) {\n console.error('Failed to save player settings', e);\n }\n\n // Notify\n if (onSettingsChange) {\n onSettingsChange(next);\n }\n\n return next;\n });\n }, [onSettingsChange]);\n\n return {\n settings,\n isLoaded,\n updateSettings,\n };\n}\n","export const sendTelemetry = (eventName: string, params: Record<string, any> = {}) => {\n // Prevent telemetry during development/local testing to avoid noise?\n // Or maybe we want to test it. Let's make it safe.\n if (typeof window === 'undefined') return;\n\n // Fire and forget beacon\n try {\n fetch('https://koin.theretrosaga.com/api/telemetry', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n event_name: eventName,\n params: {\n ...params,\n url: window.location.href,\n referrer: document.referrer,\n timestamp: new Date().toISOString()\n }\n })\n }).catch(() => {\n // Ignore telemetry errors\n });\n } catch (e) {\n // Ignore\n }\n};\n","import { KoinTranslations } from './types';\n\nexport const es: KoinTranslations = {\n controls: {\n play: 'Jugar',\n pause: 'Pausar',\n reset: 'Reiniciar',\n rewind: 'Rebobinar',\n save: 'Guardar',\n load: 'Cargar',\n snap: 'Capturar',\n rec: 'Grabar',\n stopRec: 'Detener',\n startRecord: 'Comenzar grabación',\n stopRecord: 'Detener grabación',\n mute: 'Silenciar',\n unmute: 'Activar sonido',\n help: 'Ayuda',\n full: 'Pantalla comp.', // Abbreviated\n keys: 'Teclas',\n menuOpen: 'Abrir menú',\n menuClose: 'Cerrar menú',\n gamepadConnected: '{{count}} mando{{plural}} conectado(s) - haz clic para configurar',\n noGamepad: 'No hay mando detectado - presiona cualquier botón para conectar',\n press: 'Pulsa',\n startBtn: 'START',\n selectBtn: 'SELECT',\n },\n common: {\n disabledInHardcore: 'Desactivado en modo Hardcore',\n notSupported: 'No compatible con esta consola',\n playToEnableRewind: 'Juega unos segundos para activar el rebobinado',\n },\n settings: {\n title: 'Ajustes',\n general: 'General',\n audio: 'Sonido',\n video: 'Vídeo',\n input: 'Entrada',\n advanced: 'Avanzado',\n fullscreen: 'Pantalla completa',\n controls: 'Controles',\n gamepad: 'Mando',\n cheats: 'Trucos',\n retroAchievements: 'RetroAchievements',\n shortcuts: 'Atajos',\n exit: 'Salir',\n language: 'Idioma',\n selectLanguage: 'Seleccionar idioma',\n },\n overlay: {\n play: 'JUGAR',\n systemFirmware: 'FIRMWARE DEL SISTEMA',\n loading: 'Cargando {{system}}',\n initializing: 'Inicializando emulador',\n loadingSave: 'Cargando partida',\n preparingSlot: 'Preparando ranura {{num}}',\n systemError: 'Error del sistema',\n failedInit: 'Error al inicializar el emulador',\n retry: 'Reintentar',\n slotReady: 'Ranura {{num}} lista',\n paused: 'Pausado',\n },\n notifications: {\n saved: 'Estado guardado',\n loaded: 'Estado cargado',\n error: 'Error',\n recordingStarted: 'Grabación iniciada',\n recordingSaved: 'Grabación guardada',\n downloaded: 'Estado descargado',\n loadedFile: 'Estado cargado desde archivo',\n savedSlot: 'Guardado en ranura {{num}}',\n loadedSlot: 'Cargado desde ranura {{num}}',\n deletedSlot: 'Ranura {{num}} eliminada',\n emptySlot: 'Ranura vacía',\n noSaveFound: 'No se encontró partida guardada',\n failedSave: 'Error al guardar',\n failedLoad: 'Error al cargar',\n failedDelete: 'Error al eliminar',\n failedFetch: 'Error al cargar ranuras',\n controllerConnected: 'Mando conectado',\n controllerDisconnected: 'Mando desconectado',\n controllerReady: 'Mando listo para usar',\n insertCoin: 'Pulsa SHIFT para insertar moneda',\n insertCoinTitle: '🪙 Insertar Moneda',\n controlsSaved: 'Controles guardados',\n controlsReset: 'Controles restablecidos',\n },\n modals: {\n shortcuts: {\n title: 'Atajos de teclado',\n playerShortcuts: 'Atajos del reproductor',\n overlays: 'Superposiciones',\n recording: 'Grabación',\n showHelp: 'Mostrar ayuda',\n perfOverlay: 'Superposición de rendimiento',\n inputDisplay: 'Mostrar entrada',\n toggleRec: 'Alternar grabación',\n toggleMute: 'Alternar silencio',\n pressEsc: 'Pulsa ESC para cerrar',\n },\n controls: {\n title: 'Controles',\n keyboard: 'Asignación de teclado',\n description: 'Haz clic en un botón y pulsa una tecla',\n pressKey: 'Pulsa una tecla...',\n reset: 'Restablecer',\n save: 'Guardar controles',\n },\n gamepad: {\n title: 'Ajustes de mando',\n noGamepad: 'No se detecta mando',\n connected: '{{count}} mando{{s}} conectado(s)',\n none: 'Ningún mando detectado',\n player: 'Jugador:',\n noController: 'Sin mando',\n pressAny: 'Pulsa cualquier botón para conectar',\n waiting: 'Esperando entrada...',\n pressButton: 'Pulsa botón para {{button}}',\n pressEsc: 'Pulsa Escape para cancelar',\n reset: 'Restablecer',\n save: 'Guardar ajustes',\n },\n cheats: {\n title: 'Trucos',\n addCheat: 'Añadir truco',\n available: '{{count}} truco{{s}} disponible(s)',\n emptyTitle: 'No hay trucos disponibles',\n emptyDesc: 'No se encontraron códigos para este juego',\n copy: 'Copiar código',\n active: '{{count}} truco{{s}} activo(s)',\n toggleHint: 'Haz clic para activar/desactivar',\n },\n saveSlots: {\n title: 'Guardar partida',\n saveTitle: 'Guardar',\n loadTitle: 'Cargar',\n emptySlot: 'Ranura vacía',\n subtitleSave: 'Elige una ranura para guardar',\n subtitleLoad: 'Elige una ranura para cargar',\n loading: 'Cargando partidas...',\n locked: 'Ranura {{num}} bloqueada',\n upgrade: 'Mejora para desbloquear más ranuras',\n autoSave: 'Autoguardado',\n autoSaveDesc: 'Reservado para guardado automático',\n noData: 'Sin datos',\n slot: 'Ranura {{num}}',\n footerSave: 'Las partidas se guardan en la nube y se sincronizan',\n footerLoad: 'Tu progreso se restaurará al punto seleccionado',\n },\n bios: {\n title: 'Selección de BIOS',\n description: 'Selecciona una BIOS para este juego',\n warningTitle: 'Nota:',\n warning: 'Cambiar la BIOS reiniciará el emulador. Se perderá el progreso no guardado.',\n systemDefault: 'Por defecto',\n active: 'Activo',\n defaultDesc: \"Usar BIOS interna del emulador\",\n emptyTitle: 'No se encontraron archivos de BIOS.',\n emptyDesc: 'Sube archivos BIOS en tu biblioteca.',\n footer: 'Firmware del sistema',\n },\n },\n retroAchievements: {\n title: 'RetroAchievements',\n login: 'Iniciar sesión',\n logout: 'Cerrar sesión',\n username: 'Usuario',\n password: 'Password',\n hardcore: 'Modo Hardcore',\n achievements: 'Logros',\n locked: 'Bloqueado',\n unlocked: 'Desbloqueado',\n mastered: 'Dominado',\n identifying: 'Identificando juego...',\n achievementsAvailable: '{{count}} logros disponibles',\n gameNotSupported: 'Conectado - Juego no en base de datos',\n connect: 'Conectar RetroAchievements',\n connected: 'RetroAchievements (conectado)',\n createAccount: 'Crear cuenta',\n privacy: 'Privacidad:',\n privacyText: 'Tu contraseña solo se usa para autenticación con RA. No se almacena.',\n connecting: 'Conectando...',\n connectAccount: 'Conecta tu cuenta para rastrear logros',\n poweredBy: 'Con la tecnología de',\n connectedStatus: 'Conectado',\n yourUsername: 'Tu usuario RA',\n yourPassword: 'Tu contraseña RA',\n usernameRequired: 'Usuario y contraseña requeridos',\n noGame: 'Sin juego cargado',\n loadGame: 'Carga un juego para ver los logros',\n noAchievements: 'No se encontraron logros',\n notSupported: 'Este juego puede no ser compatible',\n ptsRemaining: '{{count}} pts restantes',\n filters: {\n all: 'Todos',\n locked: 'Bloqueado',\n unlocked: 'Desbloqueado',\n },\n },\n overlays: {\n performance: {\n title: 'Estadísticas',\n fps: 'FPS',\n frameTime: 'FT',\n memory: 'MEM',\n core: 'Core',\n input: 'ENTRADA',\n active: 'ACTIVO',\n },\n toast: {\n saved: 'Juego guardado',\n loaded: 'Juego cargado',\n error: 'Error',\n },\n recording: {\n started: 'Grabación iniciada',\n stopped: 'Grabación detenida',\n saved: 'Grabación guardada',\n paused: 'PAUSA',\n recording: 'GRABANDO',\n resume: 'Reanudar grabación',\n pause: 'Pausar grabación',\n stop: 'Detener y guardar',\n hover: 'Controles',\n },\n },\n};\n","import { KoinTranslations } from './types';\n\nexport const fr: KoinTranslations = {\n controls: {\n play: 'Jouer',\n pause: 'Pause',\n reset: 'Réinitialiser',\n rewind: 'Rembobiner',\n save: 'Sauver',\n load: 'Charger',\n snap: 'Photo',\n rec: 'Enr.',\n stopRec: 'Arrêter',\n startRecord: 'Démarrer l\\'enregistrement',\n stopRecord: 'Arrêter l\\'enregistrement',\n mute: 'Muet',\n unmute: 'Son',\n help: 'Aide',\n full: 'Plein écran',\n keys: 'Touches',\n menuOpen: 'Ouvrir menu',\n menuClose: 'Fermer menu',\n gamepadConnected: '{{count}} manette{{plural}} connectée(s)',\n noGamepad: 'Aucune manette détectée',\n press: 'Appuyez',\n startBtn: 'START',\n selectBtn: 'SELECT',\n },\n common: {\n disabledInHardcore: 'Désactivé en mode Hardcore',\n notSupported: 'Non supporté sur cette console',\n playToEnableRewind: 'Jouez quelques secondes pour activer le rembobinage',\n },\n settings: {\n title: 'Paramètres',\n general: 'Général',\n audio: 'Audio',\n video: 'Vidéo',\n input: 'Entrée',\n advanced: 'Avancé',\n fullscreen: 'Plein écran',\n controls: 'Contrôles',\n gamepad: 'Manette',\n cheats: 'Codes',\n retroAchievements: 'Succès',\n shortcuts: 'Raccourcis',\n exit: 'Quitter',\n language: 'Langue',\n selectLanguage: 'Choisir la langue',\n },\n overlay: {\n play: 'JOUER',\n systemFirmware: 'MICROLOGICIEL SYSTÈME',\n loading: 'Chargement {{system}}',\n initializing: 'Initialisation de l\\'émulateur',\n loadingSave: 'Chargement de la sauvegarde',\n preparingSlot: 'Préparation de l\\'emplacement {{num}}',\n systemError: 'Erreur système',\n failedInit: 'Échec de l\\'initialisation',\n retry: 'Réessayer',\n slotReady: 'Emplacement {{num}} prêt',\n paused: 'Pause',\n },\n notifications: {\n saved: 'État sauvegardé',\n loaded: 'État chargé',\n error: 'Erreur',\n recordingStarted: 'Enregistrement démarré',\n recordingSaved: 'Enregistrement sauvegardé',\n downloaded: 'État téléchargé',\n loadedFile: 'État chargé depuis fichier',\n savedSlot: 'Sauvegardé sur l\\'emplacement {{num}}',\n loadedSlot: 'Chargé depuis l\\'emplacement {{num}}',\n deletedSlot: 'Emplacement {{num}} supprimé',\n emptySlot: 'Emplacement vide',\n noSaveFound: 'Aucune sauvegarde trouvée',\n failedSave: 'Échec de la sauvegarde',\n failedLoad: 'Échec du chargement',\n failedDelete: 'Échec de la suppression',\n failedFetch: 'Échec du chargement des emplacements',\n controllerConnected: 'Manette connectée',\n controllerDisconnected: 'Manette déconnectée',\n controllerReady: 'Manette prête',\n insertCoin: 'Appuyez sur SHIFT pour insérer une pièce',\n insertCoinTitle: '🪙 Insérer Pièce',\n controlsSaved: 'Contrôles sauvegardés',\n controlsReset: 'Contrôles réinitialisés',\n },\n modals: {\n shortcuts: {\n title: 'Raccourcis clavier',\n playerShortcuts: 'Raccourcis du lecteur',\n overlays: 'Superpositions',\n recording: 'Enregistrement',\n showHelp: 'Afficher l\\'aide',\n perfOverlay: 'Overlay de performance',\n inputDisplay: 'Afficher les entrées',\n toggleRec: 'Basculer l\\'enregistrement',\n toggleMute: 'Basculer le son',\n pressEsc: 'Appuyez sur ESC pour fermer',\n },\n controls: {\n title: 'Contrôles',\n keyboard: 'Configuration clavier',\n description: 'Cliquez sur un bouton et appuyez sur une touche',\n pressKey: 'Appuyez...',\n reset: 'Réinitialiser',\n save: 'Sauvegarder',\n },\n gamepad: {\n title: 'Paramètres manette',\n noGamepad: 'Aucune manette',\n connected: '{{count}} manette{{s}} connectée(s)',\n none: 'Aucune manette détectée',\n player: 'Joueur:',\n noController: 'Aucune manette',\n pressAny: 'Appuyez sur un bouton pour connecter',\n waiting: 'En attente...',\n pressButton: 'Appuyez pour {{button}}',\n pressEsc: 'Echap pour annuler',\n reset: 'Réinitialiser',\n save: 'Sauvegarder',\n },\n cheats: {\n title: 'Codes de triche',\n addCheat: 'Ajouter un code',\n available: '{{count}} code{{s}} disponible(s)',\n emptyTitle: 'Aucun code disponible',\n emptyDesc: 'Aucun code trouvé pour ce jeu',\n copy: 'Copier',\n active: '{{count}} actif(s)',\n toggleHint: 'Cliquez pour activer/désactiver',\n },\n saveSlots: {\n title: 'Sauvegardes',\n saveTitle: 'Sauvegarder',\n loadTitle: 'Charger',\n emptySlot: 'Vide',\n subtitleSave: 'Choisir un emplacement',\n subtitleLoad: 'Choisir une sauvegarde',\n loading: 'Chargement...',\n locked: 'Emplacement {{num}} verrouillé',\n upgrade: 'Améliorer pour plus d\\'emplacements',\n autoSave: 'Auto-Sauvegarde',\n autoSaveDesc: 'Réservé à la sauvegarde automatique',\n noData: 'Aucune donnée',\n slot: 'Emplacement {{num}}',\n footerSave: 'Les sauvegardes sont synchronisées dans le cloud',\n footerLoad: 'Votre progression sera restaurée',\n },\n bios: {\n title: 'Sélection BIOS',\n description: 'Sélectionnez un BIOS',\n warningTitle: 'Note:',\n warning: 'Changer le BIOS redémarre l\\'émulateur. Progression non sauvegardée sera perdue.',\n systemDefault: 'Par défaut',\n active: 'Actif',\n defaultDesc: \"Utiliser le BIOS par défaut\",\n emptyTitle: 'Aucun BIOS trouvé.',\n emptyDesc: 'Téléversez des fichiers BIOS dans votre bibliothèque.',\n footer: 'Firmware système',\n },\n },\n retroAchievements: {\n title: 'RetroAchievements',\n login: 'Connexion',\n logout: 'Déconnexion',\n username: 'Utilisateur',\n password: 'Mot de passe',\n hardcore: 'Mode Hardcore',\n achievements: 'Succès',\n locked: 'Verrouillé',\n unlocked: 'Déverrouillé',\n mastered: 'Maîtrisé',\n identifying: 'Identification...',\n achievementsAvailable: '{{count}} succès disponibles',\n gameNotSupported: 'Jeu non supporté par RA',\n connect: 'Connecter RetroAchievements',\n connected: 'RetroAchievements (connecté)',\n createAccount: 'Créer un compte',\n privacy: 'Confidentialité:',\n privacyText: 'Votre mot de passe n\\'est pas stocké.',\n connecting: 'Connexion...',\n connectAccount: 'Connectez votre compte',\n poweredBy: 'Propulsé par',\n connectedStatus: 'Connecté',\n yourUsername: 'Votre utilisateur RA',\n yourPassword: 'Votre mot de passe RA',\n usernameRequired: 'Utilisateur et mot de passe requis',\n noGame: 'Aucun jeu',\n loadGame: 'Chargez un jeu pour voir les succès',\n noAchievements: 'Aucun succès trouvé',\n notSupported: 'Ce jeu n\\'est peut-être pas supporté',\n ptsRemaining: '{{count}} pts restants',\n filters: {\n all: 'Tous',\n locked: 'Verrouillés',\n unlocked: 'Déverrouillés',\n },\n },\n overlays: {\n performance: {\n title: 'Stats',\n fps: 'FPS',\n frameTime: 'FT',\n memory: 'MEM',\n core: 'Core',\n input: 'ENTRÉE',\n active: 'ACTIF',\n },\n toast: {\n saved: 'Sauvegardé',\n loaded: 'Chargé',\n error: 'Erreur',\n },\n recording: {\n started: 'Enregistrement démarré',\n stopped: 'Enregistrement arrêté',\n saved: 'Enregistrement sauvegardé',\n paused: 'PAUSE',\n recording: 'ENR.',\n resume: 'Reprendre',\n pause: 'Pause',\n stop: 'Arrêter et sauver',\n hover: 'Contrôles',\n },\n },\n};\n","export function deepMerge<T>(target: T, source: any): T {\n const isObject = (obj: any) => obj && typeof obj === 'object';\n\n if (!isObject(target) || !isObject(source)) {\n return source as T;\n }\n\n const output = { ...target } as any;\n\n Object.keys(source).forEach(key => {\n const targetValue = output[key];\n const sourceValue = source[key];\n\n if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {\n output[key] = sourceValue; // Replace arrays entirely\n } else if (isObject(targetValue) && isObject(sourceValue)) {\n output[key] = deepMerge(targetValue, sourceValue);\n } else {\n output[key] = sourceValue;\n }\n });\n\n return output;\n}\n","'use client';\n\nimport { memo, useState, useEffect, useCallback, useMemo } from 'react';\nimport PlayerControls from './PlayerControls';\nimport ToastContainer from './Overlays/ToastContainer';\nimport PerformanceOverlay from './Overlays/PerformanceOverlay';\nimport InputDisplay from './Overlays/InputDisplay';\nimport RecordingIndicator from './Overlays/RecordingIndicator';\nimport ShortcutsModal from './Modals/ShortcutsModal';\nimport { VirtualController } from './VirtualController';\nimport FloatingExitButton from './UI/FloatingExitButton';\nimport FloatingFullscreenButton from './UI/FloatingFullscreenButton';\nimport GameCanvas from './GameCanvas';\nimport GameModals from './GameModals';\nimport RASidebar from './RASidebar';\n\nimport { useGamePlayer } from '../hooks/useGamePlayer';\nimport { usePlayerPersistence } from '../hooks/usePlayerPersistence';\nimport { GamePlayerProps } from './types';\nimport { KeyboardMapping } from '../lib/controls';\nimport { sendTelemetry } from '../lib/telemetry';\nimport { KoinI18nProvider } from '../hooks/useKoinTranslation';\nimport { en, es, fr } from '../locales';\nimport { deepMerge } from '../lib/common-utils';\nimport { KoinTranslations } from '../locales/types';\n\nconst GamePlayerInner = memo(function GamePlayerInner(\n props: GamePlayerProps & {\n controls?: KeyboardMapping;\n saveControls?: (controls: KeyboardMapping) => void;\n currentLanguage?: 'en' | 'es' | 'fr';\n onLanguageChange?: (lang: 'en' | 'es' | 'fr') => void;\n }\n) {\n // -- Persistence Hook --\n const { settings, updateSettings, isLoaded: settingsLoaded } = usePlayerPersistence();\n\n // -- Telemetry --\n useEffect(() => {\n sendTelemetry('game_start', {\n system: props.system,\n core: props.core,\n game: props.title || 'unknown'\n });\n }, [props.system, props.core, props.title]);\n\n // -- Internal State --\n const [biosModalOpen, setBiosModalOpen] = useState(false);\n const [showShortcutsModal, setShowShortcutsModal] = useState(false);\n const [settingsModalOpen, setSettingsModalOpen] = useState(false);\n\n // -- Derived Props from Persistence (if not overridden by direct props) --\n // Use props.shader if provided, otherwise persistent shader\n const effectiveShader = props.shader !== undefined ? props.shader : settings.shader;\n\n const {\n // Refs\n containerRef,\n canvasRef,\n\n // State\n\n isMobile,\n isFullscreen,\n toasts,\n dismissToast,\n raSidebarOpen,\n setRaSidebarOpen,\n\n // Controls\n controls,\n saveControls,\n\n // Gamepads\n gamepads,\n connectedCount,\n\n // Modals\n gamepadModalOpen,\n setGamepadModalOpen,\n controlsModalOpen,\n setControlsModalOpen,\n cheatsModalOpen,\n setCheatsModalOpen,\n\n // Save Modal\n saveModalOpen,\n setSaveModalOpen,\n saveModalMode,\n saveSlots,\n isSlotLoading,\n actioningSlot,\n handleSlotSelect,\n handleSlotDelete,\n autoSaveEnabled,\n autoSavePaused,\n autoSaveState,\n autoSaveProgress,\n handleAutoSaveToggle,\n\n // Restrictions\n hardcoreRestrictions,\n\n // Cheats\n activeCheats,\n handleToggleCheat,\n\n // Emulator Instance & State\n nostalgist, // Contains start, restart, etc.\n volumeState: {\n volume,\n isMuted: muted,\n setVolume,\n toggleMute,\n },\n\n // Handlers\n handleFullscreen,\n handleSave, // Use handleSave instead of handleSaveState\n handleLoad, // Use handleLoad instead of handleLoadState\n\n // Actions (Destructured from nostalgist wrapper in useGamePlayer)\n pause,\n resume,\n\n // Recording\n isRecording,\n isRecordingPaused,\n recordingDuration,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n recordingSupported,\n } = useGamePlayer({\n ...props,\n onToggleCheat: props.onToggleCheat,\n onSessionStart: props.onSessionStart,\n onSessionEnd: props.onSessionEnd,\n shader: effectiveShader, // Pass effective shader to hook\n });\n\n // Destructure remaining emulator actions from nostalgist instance\n const {\n start,\n restart,\n togglePause,\n setSpeed,\n startRewind,\n stopRewind,\n screenshot,\n speed,\n isRewinding,\n rewindBufferSize,\n error,\n isPaused,\n status,\n isPerformanceMode,\n } = nostalgist;\n\n // -- Debug: High Performance Mode --\n useEffect(() => {\n if (status === 'running') {\n console.log('[Koin Debug] Status:', status);\n console.log('[Koin Debug] isPerformanceMode:', isPerformanceMode);\n console.log('[Koin Debug] crossOriginIsolated:', typeof window !== 'undefined' ? window.crossOriginIsolated : 'N/A');\n }\n }, [status, isPerformanceMode]);\n\n // Sync volume from persistence on load\n useEffect(() => {\n if (settingsLoaded) {\n setVolume(settings.volume);\n if (muted !== settings.muted) toggleMute();\n }\n }, [settingsLoaded]); // Run once when loaded\n\n const { system, systemColor = '#00FF41', cheats = [], onExit } = props;\n\n // -- Memoized Handlers --\n\n const handlePauseToggle = useCallback(() => {\n status === 'ready' ? start() : togglePause();\n }, [status, start, togglePause]);\n\n const handleScreenshot = useCallback(async () => {\n const result = await screenshot();\n if (result && props.onScreenshotCaptured) {\n props.onScreenshotCaptured(result);\n }\n }, [screenshot, props.onScreenshotCaptured]);\n\n const handleShowControls = useCallback(() => {\n pause();\n setControlsModalOpen(true);\n }, [pause, setControlsModalOpen]);\n\n const handleShowCheats = useCallback(() => {\n pause();\n setCheatsModalOpen(true);\n }, [pause, setCheatsModalOpen]);\n\n const handleShowRA = useCallback(() => {\n pause();\n setRaSidebarOpen(true);\n }, [pause, setRaSidebarOpen]);\n\n const handleShowGamepadSettings = useCallback(() => {\n pause();\n setGamepadModalOpen(true);\n }, [pause, setGamepadModalOpen]);\n\n const handleShowSettings = useCallback(() => {\n pause();\n setSettingsModalOpen(true);\n }, [pause, setSettingsModalOpen]);\n\n const handleExitClick = useCallback(() => {\n onExit?.();\n }, [onExit]);\n\n const handleBiosSelection = useCallback(() => {\n setBiosModalOpen(true);\n }, [setBiosModalOpen]);\n\n // -- Persistence Updaters --\n\n const handleVolumeChange = useCallback((val: number) => {\n setVolume(val);\n updateSettings({ volume: val });\n }, [setVolume, updateSettings]);\n\n const handleToggleMute = useCallback(() => {\n toggleMute();\n updateSettings({ muted: !muted }); // Current muted state toggled\n }, [toggleMute, updateSettings, muted]);\n\n const handleShaderChange = useCallback((newShader: string, requiresRestart: boolean) => {\n updateSettings({ shader: newShader as any });\n if (props.onShaderChange) {\n props.onShaderChange(newShader, requiresRestart);\n }\n }, [updateSettings, props.onShaderChange]);\n\n const handleTogglePerformanceOverlay = useCallback(() => {\n updateSettings({ showPerformanceOverlay: !settings.showPerformanceOverlay });\n }, [updateSettings, settings.showPerformanceOverlay]);\n\n const handleToggleInputDisplay = useCallback(() => {\n updateSettings({ showInputDisplay: !settings.showInputDisplay });\n }, [updateSettings, settings.showInputDisplay]);\n\n // Recording Toggle Handler (F5) - with auto-download\n const handleToggleRecording = useCallback(async () => {\n if (!recordingSupported) {\n console.warn('[Recording] Not supported in this browser');\n return;\n }\n\n if (isRecording) {\n const blob = await stopRecording();\n if (blob) {\n // Auto-download the recording\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `gameplay-${Date.now()}.webm`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }\n } else {\n startRecording();\n }\n }, [isRecording, recordingSupported, startRecording, stopRecording]);\n\n // Shortcuts Modal Toggle (F1) - pauses game when opening, resumes when closing\n const handleToggleShortcuts = useCallback(() => {\n setShowShortcutsModal(prev => {\n if (!prev) pause();\n else resume();\n return !prev;\n });\n }, [pause, resume]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'F1') {\n e.preventDefault();\n handleToggleShortcuts();\n }\n if (e.key === 'F3') {\n e.preventDefault();\n handleTogglePerformanceOverlay();\n }\n if (e.key === 'F4') {\n e.preventDefault();\n handleToggleInputDisplay();\n }\n if (e.key === 'F5') {\n e.preventDefault();\n handleToggleRecording();\n }\n if (e.key === 'F9') {\n e.preventDefault();\n handleToggleMute();\n }\n if (e.key === 'Escape' && showShortcutsModal) {\n setShowShortcutsModal(false);\n resume(); // Resume when closing with Escape\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [handleToggleShortcuts, handleTogglePerformanceOverlay, handleToggleInputDisplay, handleToggleRecording, handleToggleMute, showShortcutsModal, resume]);\n\n return (\n <div className=\"koin-scope\" style={{ display: 'contents' }}>\n <div\n ref={containerRef}\n className={`absolute inset-0 bg-black overflow-hidden select-none flex flex-col ${isFullscreen ? 'fixed !inset-0 z-[9999] w-screen h-screen touch-none' : ''\n } ${props.className || ''}`}\n style={props.style}\n >\n {/* Game canvas area */}\n <div className=\"flex-1 relative min-h-0\">\n <GameCanvas\n status={status}\n system={system}\n error={error}\n isPaused={isPaused}\n onStart={start}\n systemColor={systemColor}\n isFullscreen={isFullscreen}\n canvasRef={canvasRef}\n onSelectBios={props.onSelectBios ? handleBiosSelection : undefined}\n />\n\n {/* Virtual controller only shows in fullscreen to avoid overlaying page content */}\n {isFullscreen && (\n <VirtualController\n system={system}\n isRunning={status === 'running' || status === 'paused'}\n controls={controls}\n systemColor={systemColor}\n />\n )}\n\n {!isFullscreen && isMobile && (\n <FloatingFullscreenButton\n onClick={handleFullscreen}\n disabled={status === 'loading' || status === 'error'}\n />\n )}\n\n {isFullscreen && isMobile && (\n <FloatingExitButton\n onClick={handleFullscreen}\n disabled={status === 'loading' || status === 'error'}\n />\n )}\n\n {/* ===== UNIFIED TOP-RIGHT HUD ===== */}\n <div className=\"absolute top-2 right-2 z-40 flex flex-col items-end gap-2 pointer-events-auto\">\n {/* Recording Indicator */}\n <RecordingIndicator\n isRecording={isRecording}\n isPaused={isRecordingPaused}\n duration={recordingDuration}\n onPause={pauseRecording}\n onResume={resumeRecording}\n onStop={handleToggleRecording}\n />\n\n {/* Performance Overlay */}\n {settings.showPerformanceOverlay && (status === 'running' || status === 'paused') && (\n <PerformanceOverlay\n isVisible={true}\n coreName={props.core}\n systemColor={systemColor}\n />\n )}\n\n {/* Performance Mode Badge (Always visible when active) */}\n {isPerformanceMode && (status === 'running' || status === 'paused') && (\n <div\n className=\"bg-black/50 backdrop-blur-md px-2 py-1 rounded border border-white/10 flex items-center gap-1.5\"\n style={{ borderColor: `${systemColor}40` }}\n title=\"High Performance Mode Active (Threaded Video)\"\n >\n <div className=\"w-2 h-2 rounded-full animate-pulse\" style={{ backgroundColor: systemColor, boxShadow: `0 0 8px ${systemColor}` }} />\n <span className=\"text-[10px] uppercase font-bold tracking-wider text-white/90\">\n High Perf\n </span>\n </div>\n )}\n\n {/* Debug: Low Perf Indicator (Temporary) */}\n {!isPerformanceMode && (status === 'running' || status === 'paused') && (\n <div\n className=\"bg-red-900/80 backdrop-blur-md px-2 py-1 rounded border border-red-500/50 flex items-center gap-1.5\"\n title=\"Standard Mode (Single Threaded)\"\n >\n <span className=\"text-[10px] uppercase font-bold tracking-wider text-red-200\">\n Standard ({typeof window !== 'undefined' && window.crossOriginIsolated ? 'Isolated' : 'Not Isolated'})\n </span>\n </div>\n )}\n\n {/* Input Display */}\n {settings.showInputDisplay && (status === 'running' || status === 'paused') && (\n <InputDisplay\n isVisible={true}\n system={system}\n systemColor={systemColor}\n position=\"inline\"\n />\n )}\n </div>\n </div>\n\n {/* Controls bar */}\n {!isFullscreen && (\n <div className=\"shrink-0 z-50\">\n <PlayerControls\n isPaused={isPaused}\n isRunning={status === 'running' || status === 'paused'}\n speed={speed}\n isRewinding={isRewinding}\n rewindBufferSize={rewindBufferSize}\n onPauseToggle={handlePauseToggle}\n onRestart={restart}\n onSave={handleSave}\n onLoad={handleLoad}\n onSpeedChange={setSpeed}\n onRewindStart={startRewind}\n onRewindStop={stopRewind}\n onScreenshot={handleScreenshot}\n onFullscreen={handleFullscreen}\n onControls={handleShowControls}\n onCheats={handleShowCheats}\n onRetroAchievements={handleShowRA}\n onExit={handleExitClick}\n disabled={status === 'loading' || status === 'error'}\n loadDisabled={status === 'loading' || status === 'error'}\n saveDisabled={status === 'ready'}\n systemColor={systemColor}\n gamepadCount={connectedCount}\n onGamepadSettings={handleShowGamepadSettings}\n onSettings={handleShowSettings}\n volume={volume}\n isMuted={muted} // Use local 'muted' which is aliased from 'isMuted'\n onVolumeChange={handleVolumeChange} // Wrapped\n onToggleMute={handleToggleMute} // Wrapped\n hardcoreRestrictions={hardcoreRestrictions}\n raConnected={!!props.raUser}\n raGameFound={!!props.raGame}\n raAchievementCount={props.raAchievements?.length}\n raIsIdentifying={props.raIsLoading}\n autoSaveEnabled={autoSaveEnabled}\n autoSavePaused={autoSavePaused}\n autoSaveState={autoSaveState}\n autoSaveProgress={autoSaveProgress}\n onAutoSaveToggle={handleAutoSaveToggle}\n onShowShortcuts={handleToggleShortcuts}\n onRecordToggle={handleToggleRecording}\n isRecording={isRecording}\n currentShader={effectiveShader as import('../lib/shader-presets').ShaderPresetId}\n onShaderChange={handleShaderChange} // Wrapped\n />\n </div>\n )}\n\n {/* Modals */}\n <ShortcutsModal\n isOpen={showShortcutsModal}\n onClose={() => {\n setShowShortcutsModal(false);\n resume();\n }}\n systemColor={systemColor}\n />\n\n <GameModals\n controlsModalOpen={controlsModalOpen}\n setControlsModalOpen={setControlsModalOpen}\n controls={controls}\n saveControls={saveControls}\n system={system}\n onResume={resume}\n\n gamepadModalOpen={gamepadModalOpen}\n setGamepadModalOpen={setGamepadModalOpen}\n gamepads={gamepads}\n systemColor={systemColor}\n\n cheatsModalOpen={cheatsModalOpen}\n setCheatsModalOpen={setCheatsModalOpen}\n cheats={cheats}\n activeCheats={activeCheats}\n onToggleCheat={handleToggleCheat}\n\n saveModalOpen={saveModalOpen}\n setSaveModalOpen={setSaveModalOpen}\n saveModalMode={saveModalMode}\n saveSlots={saveSlots}\n isSlotLoading={isSlotLoading}\n actioningSlot={actioningSlot}\n onSlotSelect={handleSlotSelect}\n onSlotDelete={handleSlotDelete}\n maxSlots={props.maxSlots}\n currentTier={props.currentTier}\n onUpgrade={props.onUpgrade}\n\n biosModalOpen={biosModalOpen}\n setBiosModalOpen={setBiosModalOpen}\n availableBios={props.availableBios}\n currentBiosId={props.currentBiosId}\n onSelectBios={props.onSelectBios}\n\n settingsModalOpen={settingsModalOpen}\n setSettingsModalOpen={setSettingsModalOpen}\n // Props passed from wrapper\n currentLanguage={(props as any).currentLanguage}\n onLanguageChange={(props as any).onLanguageChange}\n />\n\n {/* RASidebar */}\n {!isMobile && (\n <RASidebar\n isOpen={raSidebarOpen}\n onClose={() => setRaSidebarOpen(false)}\n isLoggedIn={!!props.raUser}\n credentials={props.raUser || null}\n isLoading={props.raIsLoading || false}\n error={props.raError}\n onLogin={props.onRALogin || (async () => false)}\n onLogout={props.onRALogout || (() => { })}\n hardcoreEnabled={props.retroAchievementsConfig?.hardcore || false}\n onHardcoreChange={props.onRAHardcoreChange || (() => { })}\n currentGame={props.raGame || null}\n achievements={props.raAchievements || []}\n unlockedIds={props.raUnlockedAchievements || new Set()}\n />\n )}\n\n <ToastContainer toasts={toasts} onDismiss={dismissToast} />\n </div>\n </div>\n );\n});\n\nexport const GamePlayer = memo(function GamePlayer(\n props: GamePlayerProps & {\n controls?: KeyboardMapping;\n saveControls?: (controls: KeyboardMapping) => void;\n initialLanguage?: 'en' | 'es' | 'fr';\n }\n) {\n const [currentLanguage, setCurrentLanguage] = useState<'en' | 'es' | 'fr'>(props.initialLanguage || 'en');\n\n const effectiveTranslations = useMemo(() => {\n const base = currentLanguage === 'es' ? es : currentLanguage === 'fr' ? fr : en;\n if (props.translations) {\n return deepMerge(base, props.translations) as KoinTranslations;\n }\n return base;\n }, [currentLanguage, props.translations]);\n\n const handleLanguageChange = useCallback((lang: 'en' | 'es' | 'fr') => {\n setCurrentLanguage(lang);\n }, []);\n\n return (\n <KoinI18nProvider translations={effectiveTranslations}>\n <GamePlayerInner\n {...props}\n currentLanguage={currentLanguage}\n onLanguageChange={handleLanguageChange}\n />\n </KoinI18nProvider>\n );\n});\n\nexport default GamePlayer;\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { Trophy, X } from 'lucide-react';\nimport { RAAchievement, getAchievementBadgeUrl } from '../../lib/retroachievements';\n\ninterface AchievementPopupProps {\n achievement: RAAchievement;\n hardcore: boolean;\n onDismiss: () => void;\n autoDismissMs?: number;\n}\n\nexport default function AchievementPopup({\n achievement,\n hardcore,\n onDismiss,\n autoDismissMs = 5000,\n}: AchievementPopupProps) {\n const [isVisible, setIsVisible] = useState(false);\n const [isExiting, setIsExiting] = useState(false);\n\n useEffect(() => {\n // Animate in\n requestAnimationFrame(() => {\n setIsVisible(true);\n });\n\n // Auto dismiss\n const timer = setTimeout(() => {\n handleDismiss();\n }, autoDismissMs);\n\n return () => clearTimeout(timer);\n }, [autoDismissMs]);\n\n const handleDismiss = () => {\n setIsExiting(true);\n setTimeout(() => {\n onDismiss();\n }, 300);\n };\n\n return (\n <div\n className={`fixed top-4 right-4 z-[100] transition-all duration-300 ${isVisible && !isExiting\n ? 'translate-x-0 opacity-100'\n : 'translate-x-full opacity-0'\n }`}\n >\n {/* Glow effect */}\n <div className=\"absolute inset-0 bg-gradient-to-r from-yellow-500 to-orange-500 blur-lg opacity-50 animate-pulse\" />\n\n {/* Main container */}\n <div className=\"relative bg-gradient-to-r from-yellow-500 to-orange-500 p-[2px] rounded-lg\">\n <div className=\"bg-gray-900 rounded-lg p-4 flex items-center gap-4 min-w-[320px]\">\n {/* Badge */}\n <div className=\"relative flex-shrink-0\">\n <img\n src={getAchievementBadgeUrl(achievement.BadgeName)}\n alt={achievement.Title}\n className=\"w-16 h-16 rounded-lg border-2 border-yellow-500/50\"\n onError={(e) => {\n // Fallback to placeholder\n (e.target as HTMLImageElement).src = '/placeholder-badge.png';\n }}\n />\n {/* Shine effect */}\n <div className=\"absolute inset-0 bg-gradient-to-br from-white/30 to-transparent rounded-lg pointer-events-none\" />\n </div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <Trophy className=\"text-yellow-400 flex-shrink-0\" size={14} />\n <span className=\"text-xs text-yellow-400 font-bold uppercase tracking-wider\">\n {hardcore ? 'Hardcore ' : ''}Achievement Unlocked!\n </span>\n </div>\n <p className=\"font-bold text-white truncate\">{achievement.Title}</p>\n <p className=\"text-sm text-gray-400 truncate\">{achievement.Description}</p>\n <div className=\"flex items-center gap-2 mt-1\">\n <span className=\"text-yellow-400 font-bold\">{achievement.Points}</span>\n <span className=\"text-xs text-gray-500\">points</span>\n {hardcore && (\n <span className=\"text-xs px-1.5 py-0.5 bg-red-500/20 text-red-400 rounded border border-red-500/30\">\n 2x\n </span>\n )}\n </div>\n </div>\n\n {/* Close button */}\n <button\n onClick={handleDismiss}\n className=\"flex-shrink-0 text-gray-500 hover:text-white transition-colors\"\n >\n <X size={18} />\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n// Queue manager for multiple achievement popups\ninterface QueuedAchievement {\n id: number;\n achievement: RAAchievement;\n hardcore: boolean;\n}\n\ninterface AchievementPopupQueueProps {\n achievements: QueuedAchievement[];\n onDismiss: (id: number) => void;\n}\n\nexport function AchievementPopupQueue({ achievements, onDismiss }: AchievementPopupQueueProps) {\n // Only show one at a time\n const current = achievements[0];\n\n if (!current) return null;\n\n return (\n <AchievementPopup\n key={current.id}\n achievement={current.achievement}\n hardcore={current.hardcore}\n onDismiss={() => onDismiss(current.id)}\n />\n );\n}\n","/**\n * Available CRT Shader Presets\n * ----------------------------\n * These are loaded from libretro/glsl-shaders via Nostalgist.\n * Format: { id: shader_path, name: display_name, description: tooltip }\n */\nexport const SHADER_PRESETS = [\n { id: '', name: 'None', description: 'No shader - sharp pixels' },\n { id: 'crt/crt-lottes', name: 'CRT Lottes', description: 'High-quality arcade monitor look' },\n { id: 'crt/crt-easymode', name: 'CRT Easy', description: 'Popular, performant CRT effect' },\n { id: 'crt/crt-geom', name: 'CRT Geom', description: 'Classic CRT shader with curvature' },\n { id: 'crt/crt-hyllian', name: 'CRT Hyllian', description: 'Attractive with minimal tweaking' },\n { id: 'crt/crt-nes-mini', name: 'NES Mini', description: 'Simple scanlines like NES Classic' },\n { id: 'crt/zfast-crt', name: 'zFast CRT', description: 'Lightweight, great for mobile' },\n { id: 'crt/crt-potato-cool', name: 'CRT Potato', description: 'Fast and good for weak devices' },\n { id: 'handheld/lcd-grid-v2', name: 'LCD Grid', description: 'Game Boy style LCD effect' },\n { id: 'scanlines', name: 'Scanlines', description: 'Simple horizontal scanlines' },\n] as const;\n\nexport type ShaderPresetId = typeof SHADER_PRESETS[number]['id'];\n","'use client';\n\nimport { memo, useState } from 'react';\nimport { Keyboard, ChevronDown, ChevronUp } from 'lucide-react';\n\n/**\n * Shortcuts Reference\n * -------------------\n * Collapsible panel showing player F-key shortcuts.\n * Game controls have their own config in the Keys modal.\n */\n\ninterface ShortcutsReferenceProps {\n systemColor?: string;\n isExpanded?: boolean;\n}\n\n// F-key shortcuts only - these don't conflict with games\nconst SHORTCUTS = [\n { key: 'F1', description: 'Help' },\n { key: 'F3', description: 'FPS Overlay' },\n { key: 'F4', description: 'Input Display' },\n { key: 'F5', description: 'Record' },\n { key: 'F9', description: 'Mute' },\n];\n\nconst ShortcutsReference = memo(function ShortcutsReference({\n systemColor = '#00FF41',\n isExpanded: initialExpanded = false,\n}: ShortcutsReferenceProps) {\n const [isExpanded, setIsExpanded] = useState(initialExpanded);\n\n return (\n <div\n className=\"rounded overflow-hidden\"\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\n border: `1px solid ${systemColor}40`,\n }}\n >\n {/* Header - always visible */}\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"w-full flex items-center justify-between px-3 py-2 hover:bg-white/5 transition-colors\"\n >\n <div className=\"flex items-center gap-2\">\n <Keyboard size={14} style={{ color: systemColor }} />\n <span className=\"text-xs font-bold text-white/80\">Shortcuts</span>\n </div>\n {isExpanded ? (\n <ChevronUp size={14} className=\"text-white/50\" />\n ) : (\n <ChevronDown size={14} className=\"text-white/50\" />\n )}\n </button>\n\n {/* Shortcuts list - collapsible */}\n {isExpanded && (\n <div className=\"px-3 pb-3 pt-1 space-y-1.5 border-t border-white/10\">\n {SHORTCUTS.map(({ key, description }) => (\n <div key={key} className=\"flex items-center justify-between text-xs\">\n <span className=\"text-white/60\">{description}</span>\n <kbd\n className=\"px-1.5 py-0.5 rounded text-[10px] font-mono font-bold\"\n style={{\n backgroundColor: `${systemColor}20`,\n color: systemColor,\n border: `1px solid ${systemColor}40`,\n }}\n >\n {key}\n </kbd>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n});\n\nexport default ShortcutsReference;\n"]}