2026-11-06 08:28:04 +00:00
function helpSheet () {
openSheet ( "Tastenkürzel" , [ h ( "dl" , { class : "keys" }, KEYS . map (([ key , text ]) => [ h ( "dt" , {}, key ), h ( "dd" , {}, text )])),
2026-11-06 22:20:06 +00:00
h ( "p" , { class : "muted" }, "Leitstand: Vollbild mit großer Schrift für den zweiten Bildschirm, unter ⚙ Ambiente. j, k, x, a und Enter wirken in der Inbox." )], false );
2026-11-06 08:28:04 +00:00
}
function overlayOpen () {
return ! document . getElementById ( "palette" ). hidden || ! document . getElementById ( "sheet" ). hidden ;
}
function moveCursor ( delta ) {
const items = visibleInbox ();
if ( ! items . length ) {
return ;
}
ui . cursor = Math . min ( Math . max ( ui . cursor + delta , 0 ), items . length - 1 );
drawInbox ();
2026-11-06 22:20:06 +00:00
const current = inboxDom && inboxDom . querySelector ( `.item[data-index=" ${ ui . cursor } "]` );
2026-11-06 08:28:04 +00:00
if ( current ) {
current . scrollIntoView ({ block : "nearest" });
}
}
function keyboard ( event ) {
const target = event . target ;
if (( event . ctrlKey || event . metaKey ) && ! event . altKey && event . key . toLowerCase () === "k" ) {
event . preventDefault ();
if ( document . getElementById ( "palette" ). hidden ) {
openPalette ();
} else {
closePalette ();
}
return ;
}
if ( event . key === "Escape" ) {
if ( ! document . getElementById ( "palette" ). hidden ) {
closePalette ();
} else if ( ! document . getElementById ( "sheet" ). hidden ) {
closeSheet ();
} else if ( space . look ) {
skyLook ( false );
} else if ( ui . agent !== null ) {
closeAgent ();
} else {
2026-11-06 22:20:06 +00:00
closeMenus ();
2026-11-06 08:28:04 +00:00
}
return ;
}
if ( event . altKey || event . ctrlKey || event . metaKey || event . isComposing || overlayOpen ()) {
return ;
}
if ( target instanceof HTMLElement && ( target . isContentEditable || [ "INPUT" , "TEXTAREA" , "SELECT" ]. includes ( target . tagName ))) {
return ;
}
2026-11-06 22:20:06 +00:00
const inInbox = ui . screen === "inbox" ;
const current = inInbox ? visibleInbox ()[ ui . cursor ] : null ;
2026-11-06 08:28:04 +00:00
const index = Number ( event . key ) - 1 ;
if ( /^[1-3]$/ . test ( event . key )) {
event . preventDefault ();
2026-11-06 22:20:06 +00:00
go ( Nav . TABS [ index ][ 0 ], null );
} else if ( inInbox && ( event . key === "j" || event . key === "k" )) {
2026-11-06 08:28:04 +00:00
event . preventDefault ();
moveCursor ( event . key === "j" ? 1 : - 1 );
2026-11-06 22:20:06 +00:00
} else if ( inInbox && event . key === "x" ) {
2026-11-06 08:28:04 +00:00
event . preventDefault ();
toggle ( current );
2026-11-06 22:20:06 +00:00
} else if ( inInbox && event . key === "a" ) {
2026-11-06 08:28:04 +00:00
event . preventDefault ();
if ( current && ! current . held ) {
approveOne ( current );
}
} else if ( event . key === "Enter" && current && target === document . body ) {
event . preventDefault ();
openItem ( current );
} else if ( event . key === "/" ) {
event . preventDefault ();
if ( ui . screen !== "stream" ) {
go ( "stream" , null );
}
window . setTimeout (() => stream . dom && stream . dom . search . focus (), 0 );
} else if ( event . key === "?" ) {
event . preventDefault ();
helpSheet ();
} else if ( event . key === "h" ) {
event . preventDefault ();
skyLook ( ! space . look );
}
}