diff options
| author | Adam <[email protected]> | 2026-02-19 06:35:14 -0600 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-02-19 06:35:14 -0600 |
| commit | d07f09925fae3dd0eac245b1817ace5eee19f0aa (patch) | |
| tree | 78a834c2c851be37bb6d25846fc029f2fbbaff6e /packages/app/src/pages | |
| parent | c7b35342ddca083b2a2b9668778b4cccb6b5f602 (diff) | |
| download | opencode-d07f09925fae3dd0eac245b1817ace5eee19f0aa.tar.gz opencode-d07f09925fae3dd0eac245b1817ace5eee19f0aa.zip | |
fix(app): terminal rework (#14217)
Diffstat (limited to 'packages/app/src/pages')
| -rw-r--r-- | packages/app/src/pages/session/terminal-panel.tsx | 60 |
1 files changed, 47 insertions, 13 deletions
diff --git a/packages/app/src/pages/session/terminal-panel.tsx b/packages/app/src/pages/session/terminal-panel.tsx index 33421c386..73f61ab05 100644 --- a/packages/app/src/pages/session/terminal-panel.tsx +++ b/packages/app/src/pages/session/terminal-panel.tsx @@ -38,9 +38,34 @@ export function TerminalPanel() { const [store, setStore] = createStore({ autoCreated: false, + everOpened: false, activeDraggable: undefined as string | undefined, }) + const rendered = createMemo(() => isDesktop() && (opened() || store.everOpened)) + + createEffect( + on(open, (isOpen, prev) => { + if (isOpen) { + if (!store.everOpened) setStore("everOpened", true) + const activeId = terminal.active() + if (!activeId) return + if (document.activeElement instanceof HTMLElement) { + document.activeElement.blur() + } + setTimeout(() => focusTerminalById(activeId), 0) + return + } + + if (!prev) return + const panel = document.getElementById("terminal-panel") + const activeElement = document.activeElement + if (!panel || !(activeElement instanceof HTMLElement)) return + if (!panel.contains(activeElement)) return + activeElement.blur() + }), + ) + createEffect(() => { if (!opened()) { setStore("autoCreated", false) @@ -67,7 +92,7 @@ export function TerminalPanel() { on( () => terminal.active(), (activeId) => { - if (!activeId || !opened()) return + if (!activeId || !open()) return if (document.activeElement instanceof HTMLElement) { document.activeElement.blur() } @@ -133,23 +158,32 @@ export function TerminalPanel() { } return ( - <Show when={open()}> + <Show when={rendered()}> <div id="terminal-panel" role="region" aria-label={language.t("terminal.title")} - class="relative w-full flex flex-col shrink-0 border-t border-border-weak-base" - style={{ height: `${height()}px` }} + classList={{ + "relative w-full flex flex-col shrink-0 overflow-hidden": true, + "border-t border-border-weak-base": open(), + "pointer-events-none": !open(), + }} + style={{ + height: `${height()}px`, + display: open() ? "flex" : "none", + }} > - <ResizeHandle - direction="vertical" - size={height()} - min={100} - max={typeof window === "undefined" ? 1000 : window.innerHeight * 0.6} - collapseThreshold={50} - onResize={layout.terminal.resize} - onCollapse={close} - /> + <Show when={open()}> + <ResizeHandle + direction="vertical" + size={height()} + min={100} + max={typeof window === "undefined" ? 1000 : window.innerHeight * 0.6} + collapseThreshold={50} + onResize={layout.terminal.resize} + onCollapse={close} + /> + </Show> <Show when={terminal.ready()} fallback={ |
