From 940c82b2da5227bf51979a73a92c27f1ea3b64ea Mon Sep 17 00:00:00 2001 From: Frank Song Date: Tue, 28 Apr 2026 22:36:39 +0800 Subject: [PATCH] Synchronize initial terminal open layout --- static/terminal.js | 13 ++++++++++--- tests/test_embedded_workspace_terminal.py | 13 +++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/static/terminal.js b/static/terminal.js index 0f10f086..41351758 100644 --- a/static/terminal.js +++ b/static/terminal.js @@ -418,18 +418,25 @@ async function toggleComposerTerminal(force){ return; } const {panel,inner}= _terminalEls(); + const messages=_terminalMessagesEl(); if(!panel)return; clearTimeout(TERMINAL_UI.closeTimer); panel.hidden=false; _initTerminalResizeHandle(); _resetTerminalHeightForViewport(); + if(messages)messages.classList.add('terminal-expanding-from-dock'); + _setTerminalChromeState('expanded'); + TERMINAL_UI.open=true; + TERMINAL_UI.collapsed=false; + _syncTerminalTranscriptSpace(true,{immediate:true}); + if(messages)void messages.offsetHeight; requestAnimationFrame(()=>{ panel.classList.add('is-open'); window.setTimeout(_fitTerminal,80); + setTimeout(()=>{ + if(messages)messages.classList.remove('terminal-expanding-from-dock'); + },120); }); - TERMINAL_UI.open=true; - _syncTerminalTranscriptSpace(true); - if(workspace)workspace.textContent=_terminalWorkspaceName(); syncTerminalButton(); if(!TERMINAL_UI.resizeObserver&&window.ResizeObserver){ TERMINAL_UI.resizeObserver=new ResizeObserver(()=>_fitTerminal()); diff --git a/tests/test_embedded_workspace_terminal.py b/tests/test_embedded_workspace_terminal.py index dfe7bc91..16a181b8 100644 --- a/tests/test_embedded_workspace_terminal.py +++ b/tests/test_embedded_workspace_terminal.py @@ -88,6 +88,19 @@ def test_terminal_open_reserves_transcript_space(): assert "scrollToBottom" in terminal_js +def test_terminal_initial_open_settles_transcript_space_before_reveal(): + terminal_js = _read("static/terminal.js") + + open_block = terminal_js.split("async function toggleComposerTerminal", 1)[1].split("function collapseComposerTerminal", 1)[0] + assert "messages.classList.add('terminal-expanding-from-dock')" in open_block + assert "_syncTerminalTranscriptSpace(true,{immediate:true});" in open_block + assert "void messages.offsetHeight;" in open_block + assert "panel.classList.add('is-open')" in open_block + assert "messages.classList.remove('terminal-expanding-from-dock')" in open_block + assert open_block.index("_syncTerminalTranscriptSpace(true,{immediate:true});") < open_block.index("panel.classList.add('is-open')") + assert open_block.index("void messages.offsetHeight;") < open_block.index("panel.classList.add('is-open')") + + def test_terminal_collapsed_state_preserves_pty_and_output_surface(): html = _read("static/index.html") terminal_js = _read("static/terminal.js")