Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
19 lines
901 B
TypeScript
19 lines
901 B
TypeScript
import { useState } from 'react'
|
|
|
|
const KEYS: [string, string][] = [
|
|
['Esc', '\x1b'], ['Tab', '\t'], ['↑', '\x1b[A'], ['↓', '\x1b[B'], ['←', '\x1b[D'], ['→', '\x1b[C'],
|
|
['Home', '\x1b[H'], ['End', '\x1b[F'], ['|', '|'], ['~', '~'], ['-', '-'], ['/', '/'], ['^C', '\x03'], ['^D', '\x04'],
|
|
]
|
|
|
|
export default function KeyBar({ send, setCtrl }: { send: (s: string) => void; setCtrl: (v: boolean) => void }) {
|
|
const [ctrl, setCtrlState] = useState(false)
|
|
const toggle = () => { const v = !ctrl; setCtrlState(v); setCtrl(v) }
|
|
const press = (s: string) => { send(s); if (ctrl) { setCtrlState(false); setCtrl(false) } }
|
|
return (
|
|
<div className="keybar" onMouseDown={(e) => e.preventDefault()}>
|
|
<button className={ctrl ? 'on' : ''} onClick={toggle}>Ctrl</button>
|
|
{KEYS.map(([label, seq]) => <button key={label} onClick={() => press(seq)}>{label}</button>)}
|
|
</div>
|
|
)
|
|
}
|