@@ -13,35 +13,30 @@ interface QuickKeyGroup {
1313 keys : QuickKey [ ] ;
1414}
1515
16+ // Always-visible nav keys below the text input
17+ const NAV_KEYS : QuickKey [ ] = [
18+ { label : "Tab" , key : "\t" , title : "Autocomplete" } ,
19+ { label : "Enter" , key : "\r" , title : "Enter / Confirm" } ,
20+ { label : "Bksp" , key : "\x7f" , title : "Backspace" } ,
21+ { label : "Esc" , key : "\x1b" , title : "Escape" } ,
22+ { label : "Up" , key : "\x1b[A" , title : "Previous command" } ,
23+ { label : "Down" , key : "\x1b[B" , title : "Next command" } ,
24+ { label : "Left" , key : "\x1b[D" , title : "Cursor left" } ,
25+ { label : "Right" , key : "\x1b[C" , title : "Cursor right" } ,
26+ { label : "y" , key : "y" , title : "Yes" } ,
27+ { label : "n" , key : "n" , title : "No" } ,
28+ { label : "q" , key : "q" , title : "Quit (htop/less)" } ,
29+ ] ;
30+
1631const GROUPS : QuickKeyGroup [ ] = [
1732 {
18- label : "Ctrl" ,
19- title : "Control combos" ,
20- keys : [
21- { label : "Ctrl+C" , key : "\x03" , title : "Interrupt" } ,
22- { label : "Ctrl+D" , key : "\x04" , title : "EOF / Exit" } ,
23- { label : "Ctrl+Z" , key : "\x1a" , title : "Suspend" } ,
24- { label : "Ctrl+L" , key : "\x0c" , title : "Clear screen" } ,
25- { label : "Ctrl+A" , key : "\x01" , title : "Home" } ,
26- { label : "Ctrl+E" , key : "\x05" , title : "End" } ,
27- { label : "Ctrl+R" , key : "\x12" , title : "Reverse search" } ,
28- ] ,
29- } ,
30- {
31- label : "Nav" ,
32- title : "Navigation keys" ,
33- keys : [
34- { label : "Enter" , key : "\r" , title : "Enter / Confirm" } ,
35- { label : "Tab" , key : "\t" , title : "Autocomplete" } ,
36- { label : "Esc" , key : "\x1b" , title : "Escape" } ,
37- { label : "Up" , key : "\x1b[A" , title : "Previous command" } ,
38- { label : "Down" , key : "\x1b[B" , title : "Next command" } ,
39- { label : "Left" , key : "\x1b[D" , title : "Cursor left" } ,
40- { label : "Right" , key : "\x1b[C" , title : "Cursor right" } ,
41- { label : "q" , key : "q" , title : "Quit (htop/less)" } ,
42- { label : "y" , key : "y" , title : "Yes" } ,
43- { label : "n" , key : "n" , title : "No" } ,
44- ] ,
33+ label : "Ctrl+" ,
34+ title : "Ctrl + key combos" ,
35+ keys : "ABCDEFGHIJKLMNOPQRSTUVWXYZ" . split ( "" ) . map ( ( ch ) => ( {
36+ label : ch ,
37+ key : String . fromCharCode ( ch . charCodeAt ( 0 ) - 64 ) , // Ctrl+A = 0x01, Ctrl+Z = 0x1A
38+ title : `Ctrl+${ ch } ` ,
39+ } ) ) ,
4540 } ,
4641 {
4742 label : "nano" ,
@@ -204,7 +199,7 @@ export default function InputBox() {
204199 value = { text }
205200 onChange = { ( e ) => setText ( e . target . value ) }
206201 onKeyDown = { handleKeyDown }
207- placeholder = "Type a command ..."
202+ placeholder = "Type anything ..."
208203 rows = { 1 }
209204 className = "flex-1 bg-[#1a1a2e] text-white border border-gray-600 rounded-lg px-3 py-2 text-sm resize-none focus:outline-none focus:ring-1 focus:ring-blue-500"
210205 />
@@ -216,6 +211,22 @@ export default function InputBox() {
216211 Send
217212 </ button >
218213 </ div >
214+ { /* Persistent nav keys */ }
215+ < div className = "border-t border-gray-700/50 overflow-x-auto scrollbar-none" style = { { minWidth : 0 } } >
216+ < div className = "flex items-center gap-1 px-2 py-1 w-max" >
217+ { NAV_KEYS . map ( ( qk ) => (
218+ < button
219+ key = { qk . label }
220+ onClick = { ( ) => handleQuickKey ( qk . key ) }
221+ disabled = { ! activeSessionId }
222+ title = { qk . title }
223+ className = "px-2 py-0.5 text-[11px] bg-[#1a1a2e] text-gray-400 hover:text-white hover:bg-[#2a2a4a] disabled:text-gray-600 rounded border border-gray-700 whitespace-nowrap transition-colors shrink-0"
224+ >
225+ { qk . label }
226+ </ button >
227+ ) ) }
228+ </ div >
229+ </ div >
219230 </ div >
220231 ) ;
221232}
0 commit comments