From 3392aeb9dba0ed9e9cabfb96b6010e46fa453ca1 Mon Sep 17 00:00:00 2001 From: chillerno1 Date: Wed, 29 Jul 2026 18:45:52 +1000 Subject: [PATCH 1/2] fix(desktop): flip zone collapse chevron to action direction MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Collapsed tool zones (terminal/logs) kept a down chevron after minimize, so the restore affordance looked like another collapse. Point the icon in the action direction — down when expanded, up when collapsed — matching master-detail collapsible detail headers. Same fix for floating panes. --- .../pane-shell/tree/renderer/floating-panes.test.tsx | 5 +++++ .../components/pane-shell/tree/renderer/floating-panes.tsx | 2 +- .../src/components/pane-shell/tree/renderer/tree-group.tsx | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/desktop/src/components/pane-shell/tree/renderer/floating-panes.test.tsx b/apps/desktop/src/components/pane-shell/tree/renderer/floating-panes.test.tsx index b5e97640dfa2..62b825659f1b 100644 --- a/apps/desktop/src/components/pane-shell/tree/renderer/floating-panes.test.tsx +++ b/apps/desktop/src/components/pane-shell/tree/renderer/floating-panes.test.tsx @@ -167,6 +167,10 @@ describe('FloatingPanes (live DOM)', () => { const before = card()!.style.left const toggle = card()!.querySelector('button')! + const chevron = () => toggle.querySelector('i')! + + // Expanded: down chevron (fold). Collapsed: up chevron (restore). + expect(chevron().className).toContain('codicon-chevron-down') // The button is inside the drag handle — [data-floating-no-drag] must // stop it starting a drag. @@ -182,6 +186,7 @@ describe('FloatingPanes (live DOM)', () => { expect(document.querySelector('[data-testid="hud-body"]')).toBeNull() expect(card()!.style.height).toBe('') + expect(chevron().className).toContain('codicon-chevron-up') }) it('renders one card per floating contribution', () => { diff --git a/apps/desktop/src/components/pane-shell/tree/renderer/floating-panes.tsx b/apps/desktop/src/components/pane-shell/tree/renderer/floating-panes.tsx index 338a2f17b9c0..404620e25116 100644 --- a/apps/desktop/src/components/pane-shell/tree/renderer/floating-panes.tsx +++ b/apps/desktop/src/components/pane-shell/tree/renderer/floating-panes.tsx @@ -172,7 +172,7 @@ function FloatingPane({ pane }: { pane: Contribution }) { onClick={toggleCollapsed} type="button" > - + diff --git a/apps/desktop/src/components/pane-shell/tree/renderer/tree-group.tsx b/apps/desktop/src/components/pane-shell/tree/renderer/tree-group.tsx index 8c480dbefcd0..c34c1788e7e8 100644 --- a/apps/desktop/src/components/pane-shell/tree/renderer/tree-group.tsx +++ b/apps/desktop/src/components/pane-shell/tree/renderer/tree-group.tsx @@ -544,7 +544,7 @@ export function TreeGroup({ onPointerDown={e => e.stopPropagation()} type="button" > - + )} From 95358428f95175ef57376da334b69279618cce6a Mon Sep 17 00:00:00 2001 From: chillerno1 Date: Fri, 31 Jul 2026 07:48:27 +1000 Subject: [PATCH 2/2] test(desktop): cover docked zone chevron direction --- .../tree/renderer/tree-group.test.tsx | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 apps/desktop/src/components/pane-shell/tree/renderer/tree-group.test.tsx diff --git a/apps/desktop/src/components/pane-shell/tree/renderer/tree-group.test.tsx b/apps/desktop/src/components/pane-shell/tree/renderer/tree-group.test.tsx new file mode 100644 index 000000000000..8241ae1b50f8 --- /dev/null +++ b/apps/desktop/src/components/pane-shell/tree/renderer/tree-group.test.tsx @@ -0,0 +1,76 @@ +import { act, type ReactNode } from 'react' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, describe, expect, it, vi } from 'vitest' + +import { registry } from '@/contrib/registry' + +import type { GroupNode } from '../model' + +import { TreeGroup } from './tree-group' + +let root: null | Root = null +let container: HTMLDivElement | null = null +let disposePane: (() => void) | null = null + +function render(ui: ReactNode) { + if (!container) { + container = globalThis.document.createElement('div') + globalThis.document.body.append(container) + root = createRoot(container) + } + + act(() => { + root!.render(ui) + }) +} + +function terminalGroup(minimized: boolean): GroupNode { + return { + active: 'terminal', + headerHidden: false, + id: 'terminal-zone', + minimized, + panes: ['terminal'], + type: 'group' + } +} + +const toggle = (label: string) => + globalThis.document.querySelector( + `[data-tree-group="terminal-zone"] button[aria-label="${label}"]` + )! + +afterEach(() => { + if (root) { + act(() => root!.unmount()) + } + + container?.remove() + disposePane?.() + root = null + container = null + disposePane = null + vi.unstubAllGlobals() +}) + +describe('TreeGroup', () => { + it('points the docked-zone chevron in the collapse or restore action direction', () => { + disposePane = registry.register({ + area: 'panes', + data: { height: '12rem' }, + id: 'terminal', + render: () =>
Terminal
, + title: 'Terminal' + }) + // jsdom does not implement CSS.escape, which the real tab-strip effect uses. + vi.stubGlobal('CSS', { escape: (value: string) => value }) + + render() + + expect(toggle('Minimize').querySelector('i')!.className).toContain('codicon-chevron-down') + + render() + + expect(toggle('Restore').querySelector('i')!.className).toContain('codicon-chevron-up') + }) +})