{"version":3,"names":["createContext","createSignal","onCleanup","useContext","createInputBus","keyHandlers","Set","mouseHandlers","pasteHandlers","keySignal","setKeySignal","lastKey","setLastKey","addKeyHandler","handler","add","delete","addMouseHandler","addPasteHandler","_dispatchKey","key","n","h","_dispatchMouse","event","_dispatchPaste","text","InputContext","getInputBus","bus","Error","useInput","remove","useMouse","usePaste"],"sources":["hooks.ts"],"sourcesContent":["/**\n * Solid hooks for consuming terminal input events.\n *\n * Uses Solid context to make key/mouse/paste events available\n * to any component in the tree. The Screen wires up the provider.\n */\nimport { createContext, createSignal, onCleanup, useContext } from \"solid-js\";\nimport type { ParsedKey } from \"./parse-keypress.ts\";\nimport type { RawMouseEvent } from \"./parse-mouse.ts\";\n\n// --- Event bus (signal-based, no EventEmitter overhead) ---\n\nexport type KeyHandler = (key: ParsedKey) => void;\nexport type MouseHandler = (event: RawMouseEvent) => void;\nexport type PasteHandler = (text: string) => void;\n\nexport interface InputBus {\n\taddKeyHandler(handler: KeyHandler): () => void;\n\taddMouseHandler(handler: MouseHandler): () => void;\n\taddPasteHandler(handler: PasteHandler): () => void;\n\t/** Signal that increments on each key event — for triggering reactive reads */\n\tkeySignal: () => number;\n\t/** The most recent key event */\n\tlastKey: () => ParsedKey | null;\n}\n\n/** Internal dispatch methods — not exposed to components */\nexport interface InputBusInternal extends InputBus {\n\t_dispatchKey(key: ParsedKey): void;\n\t_dispatchMouse(event: RawMouseEvent): void;\n\t_dispatchPaste(text: string): void;\n}\n\nexport function createInputBus(): InputBusInternal {\n\tconst keyHandlers = new Set<KeyHandler>();\n\tconst mouseHandlers = new Set<MouseHandler>();\n\tconst pasteHandlers = new Set<PasteHandler>();\n\n\tconst [keySignal, setKeySignal] = createSignal(0);\n\tconst [lastKey, setLastKey] = createSignal<ParsedKey | null>(null);\n\n\treturn {\n\t\tkeySignal,\n\t\tlastKey,\n\n\t\taddKeyHandler(handler: KeyHandler) {\n\t\t\tkeyHandlers.add(handler);\n\t\t\treturn () => {\n\t\t\t\tkeyHandlers.delete(handler);\n\t\t\t};\n\t\t},\n\n\t\taddMouseHandler(handler: MouseHandler) {\n\t\t\tmouseHandlers.add(handler);\n\t\t\treturn () => {\n\t\t\t\tmouseHandlers.delete(handler);\n\t\t\t};\n\t\t},\n\n\t\taddPasteHandler(handler: PasteHandler) {\n\t\t\tpasteHandlers.add(handler);\n\t\t\treturn () => {\n\t\t\t\tpasteHandlers.delete(handler);\n\t\t\t};\n\t\t},\n\n\t\t_dispatchKey(key: ParsedKey) {\n\t\t\tsetLastKey(key);\n\t\t\tsetKeySignal((n) => n + 1);\n\t\t\tfor (const h of keyHandlers) h(key);\n\t\t},\n\n\t\t_dispatchMouse(event: RawMouseEvent) {\n\t\t\tfor (const h of mouseHandlers) h(event);\n\t\t},\n\n\t\t_dispatchPaste(text: string) {\n\t\t\tfor (const h of pasteHandlers) h(text);\n\t\t},\n\t};\n}\n\n// --- Solid Context ---\n// In Solid 2.0, createContext returns the Provider component directly.\n// Use it as: <InputContext value={bus}>{children}</InputContext>\n\nexport const InputContext = createContext<InputBus>();\n\n// --- Hooks ---\n\nfunction getInputBus(): InputBus {\n\tconst bus = useContext(InputContext);\n\tif (!bus) throw new Error(\"useInput() must be used inside a Screen\");\n\treturn bus;\n}\n\n/**\n * Subscribe to key events. The handler is called for every keypress.\n * Automatically cleaned up when the component unmounts.\n */\nexport function useInput(handler: KeyHandler): void {\n\tconst bus = getInputBus();\n\tconst remove = bus.addKeyHandler(handler);\n\tonCleanup(remove);\n}\n\n/**\n * Subscribe to mouse events.\n * Automatically cleaned up when the component unmounts.\n */\nexport function useMouse(handler: MouseHandler): void {\n\tconst bus = getInputBus();\n\tconst remove = bus.addMouseHandler(handler);\n\tonCleanup(remove);\n}\n\n/**\n * Subscribe to paste events (decoded text).\n * Automatically cleaned up when the component unmounts.\n */\nexport function usePaste(handler: PasteHandler): void {\n\tconst bus = getInputBus();\n\tconst remove = bus.addPasteHandler(handler);\n\tonCleanup(remove);\n}\n"],"mappings":"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","ignoreList":[]}