- Shipped
- September 3, 2026 at 10:18 PM UTC
- Author
- Kamo
- Commit
- 0cc4258
ChatNavigatorPanel draws no background — it is a positioned, animated shell, and the column inside it is what makes it opaque. ChatSwitcherColumn supplies `bg-white` and a header at the tool window's own title-bar height; TerminalSwitcherColumn supplied neither, so the navigator was see-through and its top edge floated free of the window beside it. The surface is the EMULATOR'S, not the app's. This column shares an edge with the terminal it lists, and painting it in the app's card colours would set a bright panel against a dark screen and read as two unrelated things bolted together. The palette is taken from TERMINAL_DARK/TERMINAL_LIGHT and follows the same prefers-color-scheme read the emulator does, so the two halves stay one instrument in either theme. The header is the exception and stays on var(--color-primary) at 42px, because lining up with the window's title bar is a platform rule worth following rather than reinventing. One accent — the emulator's own green — carries both "this shell is attached" and "this is the one on screen". They are the same idea from either side, and a second colour would invite the reader to look for a distinction that is not there. Selection gets a rail as well as a tint, because the tint alone is nearly invisible in the light palette. Two typefaces, and the split is information rather than decoration: the interface sans for anything a person wrote (the name they gave a terminal), the emulator's mono for anything the machine reports (elapsed time, window count, the count in the header). You can tell at a glance which half of a row you control. The `A · B · C` meta line is gone. Actions now replace the elapsed time on hover instead of crowding in beside it — at this width one has to give, and the time is what you stop needing the moment you have decided to act on the row. Narrower, too: 300px rather than the conversation list's 550. A conversation row carries an avatar, a name, a preview and a timestamp; a terminal row carries a name and a time, so 550 was mostly empty space taken from the one window on the platform measured in columns of text. The width is per kind in one function, because the dock's reservation and the panel's own width must agree or the window overlaps it. Also carries a client fix that was written earlier and never committed: a browser reports a REJECTED HANDSHAKE as close 1006 with no reason, identical to a network drop, so refusals were retried six times and ended as a bare "Disconnected". The one thing script can see is whether `onopen` ever fired — if it did not, the connection was refused rather than lost, and it now says so. Accessibility: the live dot is the only thing carrying attached state, so it is labelled; rows are focusable and open on Enter/Space with a visible focus ring. 415 test files / 5220 tests pass. tsc reports one error, in app/hr/careers, from another session's uncommitted work — not in this change and not on origin.