+
+ {
+ if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {
+ e.preventDefault()
+ void run(sql)
+ }
+ }}
+ />
+
+
+
void run(sql)}
+ disabled={running || sql.trim() === ''}
+ >
+
+ {running ? 'running…' : 'run'}
+
+
void run(`${explainPrefix(driver)}${sql.trim()}`)}
+ disabled={running || sql.trim() === ''}
+ >
+ explain
+
+
setHistoryOpen((v) => !v)}
+ disabled={history.length === 0}
+ >
+
+ history · {history.length}
+
+ {!readOnly ? (
+
+ write statements are rejected — this panel is read-only
+
+ ) : null}
+ {outcome ? (
+
+ {outcome.result.row_count} row
+ {outcome.result.row_count === 1 ? '' : 's'} · {outcome.durationMs}
+ ms
+
+ ) : null}
+
+ {historyOpen && history.length > 0 ? (
+
+ {history.map((entry) => (
+
+ {
+ setSql(entry)
+ setHistoryOpen(false)
+ editorRef.current?.focus()
+ }}
+ title={entry}
+ >
+ {entry}
+
+
+ setHistory((cur) => {
+ const updated = cur.filter((s) => s !== entry)
+ saveHistory(db, updated)
+ return updated
+ })
+ }
+ aria-label="remove from history"
+ >
+
+
+
+ ))}
+
+ ) : null}
+
+ {error ? (
+
+ }
+ headline="query failed"
+ detail={error}
+ />
+
+ ) : outcome ? (
+
+ ) : (
+
+ {running
+ ? 'running…'
+ : 'results appear here. try: select name from sqlite_master limit 10'}
+
+ )}
+