From 12eda5004f6d05a30d638c1a2ff37e6d19220ac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=9C=E7=81=AF?= Date: Tue, 20 Oct 2026 05:13:12 +0800 Subject: [PATCH 1/2] fix: compact the machine filter menu Model: gpt-6.1-sol --- .agents/docs/components-package.md | 6 ++ .../machine-filter-menu-density/checked.png | Bin 0 -> 15703 bytes .../machine-filter-menu-density/unchecked.png | Bin 0 -> 14953 bytes .../2026-10-20-machine-filter-menu-density.md | 47 +++++++++++++++ ...26-10-20-machine-filter-menu-density.zh.md | 40 +++++++++++++ .../components/settings/machine-tab-list.tsx | 13 +++-- .../tests/e2e/desktop-settings-layout.spec.ts | 50 ++++++++++++++++ packages/ui/README.md | 4 ++ packages/ui/src/gallery/gallery.tsx | 6 +- packages/ui/src/menu/menu.tsx | 45 ++++++++++----- packages/ui/test/menu.test.tsx | 54 +++++++++++------- 11 files changed, 221 insertions(+), 44 deletions(-) create mode 100644 .agents/notes/assets/machine-filter-menu-density/checked.png create mode 100644 .agents/notes/assets/machine-filter-menu-density/unchecked.png create mode 100644 .agents/notes/implemented/bug-fix/2026-10-20-machine-filter-menu-density.md create mode 100644 .agents/notes/implemented/bug-fix/2026-10-20-machine-filter-menu-density.zh.md diff --git a/.agents/docs/components-package.md b/.agents/docs/components-package.md index f09dc60a59..4d4ebfcf13 100644 --- a/.agents/docs/components-package.md +++ b/.agents/docs/components-package.md @@ -262,6 +262,12 @@ does not name a control. The Preferences switches use this association with the existing translated copy. See the [decision and browser regression](../notes/implemented/bug-fix/2026-10-01-preferences-switch-names.md). +Machine-list filters compose `Menu.Content width="compact"` and +`Menu.CheckboxItem indicatorSide="end"`. The trigger names this two-option menu, +so the popup contains only the independent filters. The shared checkable row +keeps keyboard and multi-select behavior; its existing start-aligned indicator +remains the default for other menus. + `--input` is the theme's raw `input.background` and doubles as a muted chip/composer slab, so in a light theme it can sit below the page color and read as a disabled field. `--input-field` is derived in `lib/vscode-theme/vscode-theme-css.ts` as the lighter of diff --git a/.agents/notes/assets/machine-filter-menu-density/checked.png b/.agents/notes/assets/machine-filter-menu-density/checked.png new file mode 100644 index 0000000000000000000000000000000000000000..94d2f525a101870664d7783d37289563ab538c76 GIT binary patch literal 15703 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 Q;K(Z(NqJ}m#L)kL0J84yi2wiq literal 0 HcmV?d00001 diff --git a/.agents/notes/assets/machine-filter-menu-density/unchecked.png b/.agents/notes/assets/machine-filter-menu-density/unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..6ee3a04afe7a7d5a41a8d34b491a7872e3fe8e66 GIT binary patch literal 14953 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 JE0Ht|_ } /> - - - {t('settings.agent.machineTabs.filter.label', 'Filter machines')} - - + void; }) { return ( - onSelect()}> + onSelect()} + > {label} ); diff --git a/packages/components/tests/e2e/desktop-settings-layout.spec.ts b/packages/components/tests/e2e/desktop-settings-layout.spec.ts index 9b2fbed16c..8b6dcad789 100644 --- a/packages/components/tests/e2e/desktop-settings-layout.spec.ts +++ b/packages/components/tests/e2e/desktop-settings-layout.spec.ts @@ -381,3 +381,53 @@ for (const locale of ['en', 'zh_CN']) { ).toHaveCount(0); }); } + +for (const { locale, triggerName, onlineName, mineName } of [ + { locale: 'en', triggerName: 'Filter machines', onlineName: 'Online', mineName: 'My machines' }, + { locale: 'zh_CN', triggerName: '过滤机器', onlineName: '在线', mineName: '我的机器' }, +]) { + test(`machine filters keep labels unindented in a compact menu (${locale})`, async ({ page }) => { + await page.setViewportSize({ width: 900, height: 600 }); + await page.goto( + `/iframe.html?id=settings-machinetablist--default&viewMode=story&globals=theme:dark;locale:${locale}` + ); + const trigger = page.getByRole('button', { name: triggerName, exact: true }); + const machines = page.locator('button[data-settings-machine-id]'); + await expect(machines).toHaveCount(4); + await trigger.click(); + const menu = page.getByRole('menu'); + const online = menu.getByRole('menuitemcheckbox', { name: onlineName, exact: true }); + const mine = menu.getByRole('menuitemcheckbox', { name: mineName, exact: true }); + await expect(online).toBeVisible(); + await expect(mine).toHaveAttribute('aria-checked', 'false'); + const box = await menu.boundingBox(); + expect(box!.width).toBeLessThanOrEqual(182); + expect(box!.height).toBeLessThanOrEqual(72); + const labelLeft = await online.evaluate( + (row) => row.firstElementChild!.getBoundingClientRect().left + ); + expect(labelLeft - box!.x).toBeLessThanOrEqual(14); + await online.click(); + await expect(online).toHaveAttribute('aria-checked', 'true'); + await expect(machines).toHaveCount(2); + await expect(online.locator(':scope > span:last-child svg')).toBeVisible(); + expect( + await online.evaluate((row) => row.firstElementChild!.getBoundingClientRect().left) + ).toBe(labelLeft); + await mine.click(); + await expect(mine).toHaveAttribute('aria-checked', 'true'); + await expect(machines).toHaveCount(1); + await page.keyboard.press('ArrowUp'); + await expect(online).toBeFocused(); + await page.keyboard.press('Space'); + await expect(online).toHaveAttribute('aria-checked', 'false'); + await expect(machines).toHaveCount(2); + await page.keyboard.press('Escape'); + await expect(menu).toBeHidden(); + await trigger.click(); + await expect(mine).toHaveAttribute('aria-checked', 'true'); + await mine.click(); + await expect(machines).toHaveCount(4); + await expect(menu).toBeVisible(); + }); +} diff --git a/packages/ui/README.md b/packages/ui/README.md index 545ed7081a..5ab54c269b 100644 --- a/packages/ui/README.md +++ b/packages/ui/README.md @@ -204,6 +204,10 @@ had there, through Base UI's `render`: `width="compact"` for a short two-choice menu; the regular width remains the default. Width is a primitive variant, not a caller class override. +`Menu.CheckboxItem indicatorSide="end"` places the tick after the label for +compact filters. It reserves the trailing mark box in both states, keeping the +label aligned without a leading indent. The default remains `start`. + `ContextMenu` and `Menubar` restate only the way in — a right click or a long press, and a bar of names — and re-export `Menu`'s rows rather than rebuilding them, so a command looks and behaves the same wherever a person meets it. A row diff --git a/packages/ui/src/gallery/gallery.tsx b/packages/ui/src/gallery/gallery.tsx index 8fc3dbca59..c5bc279ef5 100644 --- a/packages/ui/src/gallery/gallery.tsx +++ b/packages/ui/src/gallery/gallery.tsx @@ -1844,8 +1844,10 @@ function CompactMenu() { }>Two choices - Local - Worktree + + Online + + My machines ); diff --git a/packages/ui/src/menu/menu.tsx b/packages/ui/src/menu/menu.tsx index ba161e9a71..9f3748a3c8 100644 --- a/packages/ui/src/menu/menu.tsx +++ b/packages/ui/src/menu/menu.tsx @@ -93,7 +93,10 @@ export interface MenuLinkItemProps } export interface MenuCheckboxItemProps - extends Omit, Omit {} + extends Omit, Omit { + /** Place the tick after the label to leave the start of short filter rows unindented. */ + indicatorSide?: 'start' | 'end'; +} export interface MenuRadioItemProps extends Omit, MenuRowProps { @@ -342,10 +345,24 @@ export const MenuLinkItem = forwardRef(fun * Base UI unmounts the tick while the row is unticked, so an icon sharing that * box would slide sideways every time the row was toggled. A row that needs a * glyph as well puts it in `endContent`. The box itself is always reserved, so - * the list does not reflow as the tick appears. + * the list does not reflow as the tick appears. Short filters can move this box + * to the end with `indicatorSide="end"`, leaving the label unindented. */ export const MenuCheckboxItem = forwardRef( - function MenuCheckboxItem({ className, children, shortcut, endContent, ...rest }, ref) { + function MenuCheckboxItem( + { className, children, shortcut, endContent, indicatorSide = 'start', ...rest }, + ref + ) { + const mark = ( + + } + > + + + + ); return ( rowClassName(state, 'neutral', className)} > - } - > - - - - } + leading={indicatorSide === 'start' ? mark : undefined} shortcut={shortcut} - endContent={endContent} + endContent={ + indicatorSide === 'end' ? ( + <> + {endContent} + {mark} + + ) : ( + endContent + ) + } > {children} diff --git a/packages/ui/test/menu.test.tsx b/packages/ui/test/menu.test.tsx index 7f11f13d22..1e66a70146 100644 --- a/packages/ui/test/menu.test.tsx +++ b/packages/ui/test/menu.test.tsx @@ -275,29 +275,39 @@ describe('Menu row', () => { }); describe('Menu checkbox and radio rows', () => { - test('a checkbox row announces its state and toggles without closing the menu', async () => { - function Toggles() { - const [notify, setNotify] = useState(false); - return ( - - - Notify me - - - ); + test.each(['start', 'end'] as const)( + 'a checkbox row with its mark at %s toggles by pointer and keyboard without closing', + async (indicatorSide) => { + function Toggles() { + const [notify, setNotify] = useState(false); + return ( + + + Notify me + + + ); + } + mounted = await mount(); + await click(trigger()); + const row = () => rows('menuitemcheckbox')[0]; + expect(row().getAttribute('aria-checked')).toBe('false'); + + await click(row()); + + expect(row().getAttribute('aria-checked')).toBe('true'); + // A setting is toggled, not chosen: the menu stays up so a second one can + // be toggled without reopening it. + expect(trigger().getAttribute('aria-expanded')).toBe('true'); + await press('Enter'); + expect(row().getAttribute('aria-checked')).toBe('false'); + expect(trigger().getAttribute('aria-expanded')).toBe('true'); } - mounted = await mount(); - await click(trigger()); - const row = () => rows('menuitemcheckbox')[0]; - expect(row().getAttribute('aria-checked')).toBe('false'); - - await click(row()); - - expect(row().getAttribute('aria-checked')).toBe('true'); - // A setting is toggled, not chosen: the menu stays up so a second one can - // be toggled without reopening it. - expect(trigger().getAttribute('aria-expanded')).toBe('true'); - }); + ); test('a radio group holds one value and marks the row that has it', async () => { function Sort() { From 635f5d3220c76c5ee76da1a3fca3c56f7ad80a25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=9C=E7=81=AF?= Date: Tue, 20 Oct 2026 05:14:00 +0800 Subject: [PATCH 2/2] docs: link compact machine filter pull request Model: gpt-6.1-sol --- .../bug-fix/2026-10-20-machine-filter-menu-density.md | 2 ++ .../bug-fix/2026-10-20-machine-filter-menu-density.zh.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.agents/notes/implemented/bug-fix/2026-10-20-machine-filter-menu-density.md b/.agents/notes/implemented/bug-fix/2026-10-20-machine-filter-menu-density.md index 2e9c7ac594..40ef52d9a9 100644 --- a/.agents/notes/implemented/bug-fix/2026-10-20-machine-filter-menu-density.md +++ b/.agents/notes/implemented/bug-fix/2026-10-20-machine-filter-menu-density.md @@ -3,6 +3,8 @@ Status: implemented Translation: current +PR: [#1743](https://github.com/LodyAI/Lody/pull/1743) + [中文](2026-10-20-machine-filter-menu-density.zh.md) ## Abstract diff --git a/.agents/notes/implemented/bug-fix/2026-10-20-machine-filter-menu-density.zh.md b/.agents/notes/implemented/bug-fix/2026-10-20-machine-filter-menu-density.zh.md index 7c42be0e49..b52eeba412 100644 --- a/.agents/notes/implemented/bug-fix/2026-10-20-machine-filter-menu-density.zh.md +++ b/.agents/notes/implemented/bug-fix/2026-10-20-machine-filter-menu-density.zh.md @@ -3,6 +3,8 @@ Status: implemented Translation: current +PR: [#1743](https://github.com/LodyAI/Lody/pull/1743) + [English](2026-10-20-machine-filter-menu-density.md) ## 摘要