Fix collapsed terminal dock layering

This commit is contained in:
Frank Song 2026-04-28 21:34:01 +08:00 committed by Hermes Agent
parent 7df55b9789
commit d501daafe1
3 changed files with 27 additions and 3 deletions

View file

@ -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;}

View file

@ -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();

View file

@ -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