feat(web): make the whole no-workspace composer card the picker trigger

The pick target grows from the read-only textarea to the full capsule:
the card owns the click, its disabled controls let pointer events fall
through, and a dashed l4 stroke with a business-blue hover marks the
affordance (an SVG dash ring — native dashed has a fixed pattern). The
card contains pointerdown so the open picker's outside-close cannot
race the reopen, which flickered the chip's expansion echo.
This commit is contained in:
Yif
2026-08-07 17:06:01 +08:00
parent c44c6c93c8
commit 0a248bcea8
9 changed files with 71 additions and 14 deletions

View File

@@ -563,6 +563,20 @@ describe('running and lock semantics (queue cut 1)', () => {
fireEvent.keyDown(textarea, { key: 'Enter' })
fireEvent.keyDown(textarea, { key: ' ' })
expect(onRequestWorkspace).toHaveBeenCalledTimes(3)
// The WHOLE capsule is the pick target, and its pointerdown never reaches
// the document — the open picker's outside-close must not race the reopen.
const card = view.container.querySelector('[data-composer-card]') as HTMLElement
fireEvent.click(card)
expect(onRequestWorkspace).toHaveBeenCalledTimes(4)
const onDocumentPointerDown = vi.fn()
document.addEventListener('pointerdown', onDocumentPointerDown)
try {
fireEvent.pointerDown(card)
} finally {
document.removeEventListener('pointerdown', onDocumentPointerDown)
}
expect(onDocumentPointerDown).not.toHaveBeenCalled()
})
it('the plan projection swaps the placeholder while its effective target is plan mode', () => {