// React port of ../../help.ts: the `?` overlay renders the command registry // (commands.ts) directly — the same list that dispatches the keys — so a // binding can never be documented as one thing and do another. import { useEffect, useState } from "react"; import { createPortal } from "react-dom"; import { CommandSet, defineCommands, keyCaps } from "../../commands.js"; import { TOGGLE_HELP_EVENT } from "../../uiEvents.js"; import { groupedCommands } from "./model.js"; export function HelpOverlay() { const [open, setOpen] = useState(false); useEffect(() => { const helpKeys = new CommandSet(defineCommands({ "help.toggle": () => setOpen((o) => !o) })); const overlayKeys = new CommandSet(defineCommands({ "help.close": () => setOpen(false) })); const onKeydown = (e: KeyboardEvent) => { if (open && overlayKeys.handle(e)) return; helpKeys.handle(e); }; const onToggle = () => setOpen((o) => !o); window.addEventListener("keydown", onKeydown); document.addEventListener(TOGGLE_HELP_EVENT, onToggle); return () => { window.removeEventListener("keydown", onKeydown); document.removeEventListener(TOGGLE_HELP_EVENT, onToggle); }; }, [open]); if (!open) return null; const close = () => setOpen(false); return createPortal(