The pinned state and the hover affordance drew the same slanted pin, so the
only difference was opacity. Rotating the pinned one to vertical separates
"this is pinned" from "click to pin", and the short transition reads as the
toggle landing.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
On a real project the name lost the width fight and the trailing text read
"MyGame.Runtime MyGame.Runtime" — the directory and the project were the
same string, printed twice.
- The detail text now has a shrink factor of 1000 against the name's 1, plus
a 45% cap, so it gives up its width first and the name is the last thing to
ellipsize.
- A directory that already begins with the project name says everything the
project name would, so only one of the two is shown.
- verticalTabs.showDirectory became never / duplicates / always, defaulting
to duplicates: width goes to a directory only when two open tabs share a
file name, which is the usual reason to want it. Turning showProject off
as well gives the name the whole row.
- The trailing text is composed in the extension now rather than the webview,
so the deduplication is unit-testable and there is one implementation.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A tree view row cannot be styled: no border, no spacing, and a long file
name gets middle-ellipsized in a narrow strip — which on a real project left
"ClientDogSurger...nionBehaviour.cs" and hid the project text entirely.
Drawing the rows means controlling all of it.
- A coloured left border per project instead of a tinted icon, so the file
icon slot is free and the name gets the width. The border uses
var(--vscode-verticalTabs-projectN): VS Code injects every contributed
theme colour into a webview, so overrides in colorCustomizations still
apply and nothing is hardcoded.
- The name is split into stem and extension, and only the stem ellipsizes,
so ".cs" survives on a long name in a narrow view.
- Configurable row spacing and border width, a rule under the pinned block,
a dirty dot that the close button replaces on hover, italics for preview
and for tabs that cannot be focused.
- Selection, arrow/Home/End/Enter/Delete keys, middle-click to close, and an
HTML context menu, since contributes.menus does not reach webview rows.
- Clicking a webview row posts nothing rather than asking for an open that
would silently do nothing.
Actions moved to actions.ts so the wiring, the view and the tests share one
implementation; extension.ts is now just registration. The per-row commands
are gone — rows act through webview messages — and the palette keeps
close / closeOthers / togglePin acting on the active editor.
Verified in a browser harness at side-bar width: all twelve project colours
resolve, rows stay a consistent 24px, and click, pin, close, middle-click,
keyboard and both context-menu variants post the right intents.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>