From 0976826090fdb6dabf30beb1ad43483db5f21d88 Mon Sep 17 00:00:00 2001 From: Kun De Date: Fri, 30 Oct 2026 16:23:06 +0800 Subject: [PATCH] fix(web-shell): align no-workspace category header with peers (#15897) * fix(web-shell): align no-workspace category header with peers * test(web-shell): preserve archived no-workspace header presentation * docs(web-shell): show sidebar category header comparison --- docs/assets/sidebar-category-header-after.png | Bin 0 -> 18039 bytes .../assets/sidebar-category-header-before.png | Bin 0 -> 18461 bytes .../daemon-client-adapters/web-shell.md | 16 ++++ .../sidebar/StandaloneRecents.test.tsx | 22 ++++- .../components/sidebar/StandaloneRecents.tsx | 74 ++++++++++---- .../client/e2e/web-shell.standalone.spec.ts | 90 ++++++++++++++++-- 6 files changed, 176 insertions(+), 26 deletions(-) create mode 100644 docs/assets/sidebar-category-header-after.png create mode 100644 docs/assets/sidebar-category-header-before.png diff --git a/docs/assets/sidebar-category-header-after.png b/docs/assets/sidebar-category-header-after.png new file mode 100644 index 0000000000000000000000000000000000000000..c6f6f0a2c101e47e20e8c702533915f9c0097018 GIT binary patch literal 18039 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 literal 0 HcmV?d00001 diff --git a/docs/developers/daemon-client-adapters/web-shell.md b/docs/developers/daemon-client-adapters/web-shell.md index 1d65066594d..d89967afa76 100644 --- a/docs/developers/daemon-client-adapters/web-shell.md +++ b/docs/developers/daemon-client-adapters/web-shell.md @@ -37,6 +37,22 @@ The sidebar trigger, dialog heading, and non-browse submit button all use The Recent heading and its region name continue to share the same translation key; a separate descriptive region label is outside this copy-only update. +## Sidebar category headers + +Pinned, Workspaces, No-workspace sessions, and Recent are peer collapsible +categories. Their active sidebar headers use the same height, spacing, muted +text, and trailing expansion chevron, including hover and keyboard-focus reveal +rules. No-workspace sessions retains its independent saved expansion preference +and search behavior. Its header in Archived settings keeps the workspace-entry +presentation. + +Chromium comparison with simulated daemon responses (hovering the collapsed +No-workspace sessions category): + +| Before | After | +| -------------------------------------------------------------------------- | ----------------------------------------------------------------------- | +| ![Workspace-entry header](../../assets/sidebar-category-header-before.png) | ![Peer category header](../../assets/sidebar-category-header-after.png) | + ## Shared UI Contract Use the TypeScript SDK daemon UI exports as the common boundary: diff --git a/packages/web-shell/client/components/sidebar/StandaloneRecents.test.tsx b/packages/web-shell/client/components/sidebar/StandaloneRecents.test.tsx index 69d5dda25a4..42a83ad4a29 100644 --- a/packages/web-shell/client/components/sidebar/StandaloneRecents.test.tsx +++ b/packages/web-shell/client/components/sidebar/StandaloneRecents.test.tsx @@ -194,7 +194,9 @@ describe('StandaloneRecents', () => { const newSession = container.querySelector( '[data-testid="standalone-active-group"] button[aria-label="sidebar.newTask"]', ); - expect(newSession?.parentElement?.className).toContain('invisible'); + expect(newSession?.parentElement?.className).toContain( + 'projectsHeaderActions', + ); const sessions = container.querySelector( '[data-testid="standalone-active-group"] > div:nth-child(2)', ); @@ -202,6 +204,11 @@ describe('StandaloneRecents', () => { const header = container.querySelector( '[data-testid="standalone-active-group"] > div > button', )!; + expect(header.parentElement?.className).toContain('projectsHeader'); + expect(header.className).toContain('projectsHeaderToggle'); + expect(header.querySelector('span + svg')?.classList).toContain( + 'lucide-chevron-down', + ); header.focus(); await act(async () => header.dispatchEvent( @@ -209,6 +216,9 @@ describe('StandaloneRecents', () => { ), ); expect(document.activeElement).not.toBe(header); + expect(header.querySelector('span + svg')?.classList).toContain( + 'lucide-chevron-right', + ); await act(async () => header.dispatchEvent( new MouseEvent('click', { bubbles: true, detail: 1 }), @@ -313,6 +323,16 @@ describe('StandaloneRecents', () => { it('loads only the requested archived group', async () => { const { renderSession } = await render({ archiveState: 'archived' }); + const group = container.querySelector( + '[data-testid="standalone-archived-group"]', + )!; + expect(group.classList).toContain('mb-3'); + const header = group.querySelector('button[aria-expanded]')!; + expect(header.parentElement?.className).toContain('headerRow'); + expect(header.querySelector('svg')?.classList).toContain( + 'lucide-circle-dashed', + ); + expect(header.querySelector('span + svg')).toBeNull(); expect(container.textContent).toContain('Archived chat'); expect(container.textContent).not.toContain('Active chat'); expect(renderSession).toHaveBeenCalledWith( diff --git a/packages/web-shell/client/components/sidebar/StandaloneRecents.tsx b/packages/web-shell/client/components/sidebar/StandaloneRecents.tsx index 33a5923f623..ccf9903682a 100644 --- a/packages/web-shell/client/components/sidebar/StandaloneRecents.tsx +++ b/packages/web-shell/client/components/sidebar/StandaloneRecents.tsx @@ -5,7 +5,12 @@ import { useState, type ReactNode, } from 'react'; -import { CircleDashedIcon, SquarePenIcon } from 'lucide-react'; +import { + ChevronDownIcon, + ChevronRightIcon, + CircleDashedIcon, + SquarePenIcon, +} from 'lucide-react'; import { STANDALONE_SESSIONS_CAPABILITY, type DaemonSessionArchiveState, @@ -469,7 +474,11 @@ export function StandaloneRecents({ return ( <>
-
+
{archiveState === 'active' && onNewSession && ( -
+