diff --git a/static/style.css b/static/style.css index 151fa0fc..09cdafda 100644 --- a/static/style.css +++ b/static/style.css @@ -413,6 +413,7 @@ .update-btn:disabled{opacity:0.5;cursor:not-allowed;} /* ── Composer flyout (approval/clarify slide up from behind composer) ── */ .composer-flyout{position:relative;height:0;z-index:1;} + .composer-wrap.terminal-dock-visible .composer-flyout{z-index:4;} /* ── Approval card ── */ .approval-card{position:absolute;left:0;right:0;bottom:-24px;max-width:var(--msg-max);margin:0 auto;padding:0 20px;box-sizing:border-box;width:100%;overflow:hidden;pointer-events:none;} .approval-card.visible{pointer-events:auto;z-index:3;} @@ -797,7 +798,6 @@ .composer-terminal-panel[hidden]{display:none!important;} .composer-terminal-inner{height:var(--composer-terminal-height,260px);min-height:180px;max-height:min(520px,50vh);display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--border2);border-radius:14px;background:var(--surface);box-shadow:0 12px 32px rgba(0,0,0,.22);padding-bottom:38px;transform:translateY(100%);opacity:0;transition:transform .4s cubic-bezier(.32,.72,.16,1),opacity .25s ease;} .composer-terminal-panel.is-open .composer-terminal-inner{transform:translateY(0);opacity:1;} - .composer-terminal-panel.is-expanding-from-dock .composer-terminal-inner{transition:opacity .18s ease;} .composer-terminal-panel.is-collapsed{bottom:-2px;width:min(calc(100% - 112px),560px);overflow:visible;z-index:4;} .composer-terminal-panel.is-collapsed .composer-terminal-inner{position:absolute;opacity:0;pointer-events:none;transform:translateY(100%);} .composer-terminal-dock{min-height:42px;display:flex;align-items:center;justify-content:space-between;gap:12px;border:1px solid var(--border);border-radius:13px;background:color-mix(in srgb,var(--surface) 86%,transparent);box-shadow:0 8px 22px rgba(0,0,0,.16);padding:7px 9px 7px 12px;backdrop-filter:blur(10px);transform:translateY(100%);opacity:0;transition:transform .32s cubic-bezier(.32,.72,.16,1),opacity .2s ease;} @@ -985,7 +985,12 @@ .send-btn{width:32px;height:32px;} .ctx-indicator{width:32px;height:32px;} .ctx-tooltip{right:-4px;min-width:190px;max-width:220px;} - .composer-terminal-panel.is-open{height:180px;min-height:140px;margin-top:6px;border-radius:12px;} + .composer-terminal-panel{width:calc(100% - 20px);} + .composer-terminal-panel.is-collapsed{bottom:-1px;width:calc(100% - 28px);} + .composer-terminal-inner{height:var(--composer-terminal-height,190px);min-height:140px;max-height:min(300px,44vh);border-radius:12px;padding-bottom:28px;} + .composer-terminal-dock{min-height:40px;padding:6px 7px 6px 10px;border-radius:12px;gap:8px;} + .composer-terminal-dock-title{font-size:11px;} + .composer-terminal-resize-handle{height:10px;cursor:default;} .composer-terminal-header{padding:7px 8px;} .composer-terminal-actions{gap:2px;overflow-x:auto;} .composer-terminal-action{padding:5px 7px;font-size:10px;white-space:nowrap;} diff --git a/static/terminal.js b/static/terminal.js index 4775b0f7..dab98838 100644 --- a/static/terminal.js +++ b/static/terminal.js @@ -309,6 +309,23 @@ function _fitTerminal(){ _scheduleTerminalResize(); } +function _setTerminalChromeState(state){ + const {panel,inner,dock,workspace,dockWorkspace}= _terminalEls(); + const composerWrap=$('composerWrap'); + if(!panel)return; + const collapsed=state==='collapsed'; + const expanded=state==='expanded'; + if(composerWrap)composerWrap.classList.toggle('terminal-dock-visible',collapsed); + panel.hidden=!(collapsed||expanded); + panel.classList.toggle('is-open',expanded); + panel.classList.toggle('is-collapsed',collapsed); + if(inner)inner.setAttribute('aria-hidden',collapsed?'true':'false'); + if(dock)dock.hidden=!collapsed; + const label=_terminalWorkspaceName(); + if(workspace)workspace.textContent=label; + if(dockWorkspace)dockWorkspace.textContent=label; +} + function syncTerminalButton(){ const {toggle}= _terminalEls(); if(!toggle)return; @@ -477,6 +494,9 @@ async function closeComposerTerminal(sessionId,opts){ _disposeXterm(); } TERMINAL_UI.open=false; + TERMINAL_UI.collapsed=false; + const composerWrap=$('composerWrap'); + if(composerWrap)composerWrap.classList.remove('terminal-dock-visible'); TERMINAL_UI.sessionId=null; TERMINAL_UI.workspace=null; syncTerminalButton(); diff --git a/tests/test_embedded_workspace_terminal.py b/tests/test_embedded_workspace_terminal.py index 08920b0f..bd8d8e4d 100644 --- a/tests/test_embedded_workspace_terminal.py +++ b/tests/test_embedded_workspace_terminal.py @@ -36,7 +36,6 @@ def test_terminal_surface_uses_composer_flyout_card_pattern(): assert "width:min(calc(100% - 64px),720px)" in style_css assert ".composer-wrap.terminal-dock-visible .composer-flyout{z-index:4" in style_css assert ".composer-terminal-panel.is-collapsed{bottom:-2px;width:min(calc(100% - 112px),560px);overflow:visible;z-index:4" in style_css - assert ".composer-terminal-panel.is-expanding-from-dock .composer-terminal-inner{transition:opacity .18s ease" in style_css assert ".composer-terminal-dock{min-height:42px" in style_css assert ".composer-terminal-inner{height:var(--composer-terminal-height,260px)" in style_css assert "transform:translateY(100%)" in style_css