import { useFocusable, FocusContext, } from "@noriginmedia/norigin-spatial-navigation"; import { Button } from "../options/Button"; import useActiveControl from "@/mainview/scripts/gamepads"; import { ChevronRight, CircleQuestionMark, SearchAlert } from "lucide-react"; import { GamePadButtonCode, useShortcuts } from "@/mainview/scripts/shortcuts"; import { RPC_URL } from "@/shared/constants"; import { FOCUS_KEYS } from "@/mainview/scripts/types"; import { oneShot } from "@/mainview/scripts/audio/audio"; // ── Single missing-emulator card ─────────────────────────────────────────── interface MissingCardProps { emulator: FrontEndEmulator; onSelect?: (id: string, focusKey: string) => void; } function MissingCard ({ emulator: em, onSelect }: MissingCardProps) { const handleSelect = () => { onSelect?.(em.name, focusKey); oneShot('click'); }; const { ref, focusKey } = useFocusable({ focusKey: FOCUS_KEYS.MISSING_CARD(em.name), onEnterPress: handleSelect, }); useShortcuts(focusKey, () => [{ button: GamePadButtonCode.A, label: "Details", action: handleSelect }], [handleSelect]); const { isMouse } = useActiveControl(); return (
e.key === "Enter" && handleSelect} className={"focusable focusable-accent bg-base-100 rounded-4xl transition-all focused:animate-scale-small shadow-lg"} >
{em.logo ? : }

{em.name}

{em.systems?.map(s => s.name).join(',')}

{em.name}

{isMouse && }
); } export function MissingEmulatorsSection ({ emulators, onSelect, }: { emulators: FrontEndEmulator[]; onSelect?: (id: string, focusKey: string) => void; }) { const { ref, focusKey } = useFocusable({ focusKey: FOCUS_KEYS.MISSING_SECTION, trackChildren: true, onFocus: (_l, _p, details) => (ref.current as HTMLElement)?.scrollIntoView({ behavior: details.instant ? 'instant' : 'smooth', block: 'end' }) }); return (

Missing Emulators

{emulators.map((em) => ( ))}
); }