Repository navigation
Commit c225a74
authored
🤖 fix: fade sideways-scrolling rows, full skill descriptions, keep pop-out terminals out of the sidebar (#5732)
## Summary
Three small layout and terminal fixes from the bug bash:
- Rows that scroll sideways with a hidden scrollbar (workspace footer,
Timeline filter chips) now fade the edge where more items sit past it.
- The Skills popover shows each skill's full description instead of one
line.
- A terminal open in a pop-out window no longer comes back as a (often
hidden) right-sidebar tab when the main window reloads. In the desktop
app, closing the pop-out window ends its session.
Fixes #5696
Fixes #5697
Fixes #5673
## Implementation
**#5696** One shared CSS class, `scroll-fade-x`, in `scrollbar-none.css`
(shared with the VS Code webview, because both rows are
webview-importable). It is scroll-driven CSS (`animation-timeline:
scroll(self inline)` animating two registered `@property` lengths into a
`mask-image`), so there is no JS and no per-render work. A row that fits
has an inactive scroll timeline and shows no fade. Browsers without
scroll timelines keep today's plain row.
**#5697** The description drops `line-clamp-1` and wraps
(`break-words`). The list already scrolls inside
`max-h-[min(400px,60vh)]`. I chose full text over click-to-expand
because expanding would be a new operation that needs its own keyboard
shortcut.
**#5673** (coordinator-approved design, no persisted state):
1. Pop-out terminal windows mount `TerminalRouterProvider popout`, so
their `terminal.attach` calls send `popout: true` (new optional input
field, no new subscription).
2. While such an attach stream is open, `TerminalService` counts the
session as shown in a pop-out, and `terminal.listSessions` skips it. So
the right sidebar's reload sync (and layout presets) do not adopt it.
3. The count drops when the stream ends: the pop-out closed, crashed,
reloaded or lost its connection. A backend restart starts with no
counts.
4. Desktop: `TerminalWindowManager` reports a closed pop-out window, and
`TerminalService` closes that session. This matches closing a sidebar
terminal tab, which also does not ask first. Reloading or crashing a
pop-out does not close its window, so the session survives those.
5. Browser mode (documented decision): a pop-out page cannot tell its
window closing from its own reload, so closing a browser pop-out does
not end the session. Killing it would lose the shell on every pop-out
reload. After the pop-out closes, the session returns as a sidebar tab
on the next main-window load, which is today's recovery path.
## Validation
Test-first for #5673. Before the fix:
```
TypeError: service.markPopoutAttached is not a function
(fail) TerminalService > pop-out attachments (#5673) > a session with a live pop-out is not listed, so the sidebar does not adopt it
(fail) TerminalService > pop-out attachments (#5673) > the session stays hidden until every pop-out attach for it has ended
(fail) TerminalService > pop-out attachments (#5673) > closing the desktop pop-out window ends its session
```
`routerSubscriptions.test.ts` adds the stream-level test
(reload-adoption and crash path): a pop-out attach hides the session
while it is live, and aborting it lists the session again. If
`attachTerminal` ignores the flag, the test fails.
`vscode/src/webview/webviewCss.test.ts` passes (it first caught the
class living only in desktop CSS, so the class moved to the shared
file).
#5696 and #5697 are CSS-only. Asserting class names would be a
tautological test, so the evidence is measured in the browser
(agent-browser against `tests/bugbash/startApp.ts` servers built from
main and from this branch):
| Check | main | this branch |
|---|---|---|
| Footer row at 375px (`scrollWidth` 430 > `clientWidth` 375) | cut at
the edge, no hint | right edge fades; after scrolling to the end the
left edge fades |
| Timeline chip row in the default sidebar (438 > 373) | cut chip, no
hint | edge fades |
| Skills popover: first 10 description spans clipped | 9 of 10 | 0 of 10
(desktop and 375px) |
| Main-window reload with a browser pop-out terminal open | session
added as a sidebar Terminal tab | no tab added |
| Main-window reload after that browser pop-out is closed | tab | tab
(session comes back, as designed) |
Footer at 375px: main (top), branch at the start (middle), branch
scrolled to the end (bottom):

Timeline chips (row narrowed to 240px, as in a narrow sidebar): main
(top), branch (bottom):

Skills popover on main (desktop) and on this branch (375px):


## Risks
Low. The fade only paints a mask on two rows and needs scroll-timeline
support (Chromium, so Electron and the VS Code webview). Long skill
descriptions make the popover list taller, and it scrolls.
`listSessions` now hides sessions that a pop-out shows, so the
layout-preset terminal mapping also skips them, which matches the
intent. Closing a desktop pop-out now kills its shell. Before, the shell
kept running unseen until the sidebar adopted it.
---
_Generated with `xum` • Model: `anthropic:claude-opus-5-5` • Thinking:
`high` • Cost: `$3.19`_
<!-- mux-attribution: model=anthropic:claude-opus-5-5 thinking=high -->1 parent d084763 commit c225a74
14 files changed
Lines changed: 236 additions & 14 deletions
File tree
- src
- browser
- components
- ChatPane
- SkillIndicator
- features/RightSidebar/Timeline
- styles
- terminal
- common/orpc/schemas
- desktop
- node
- orpc
- services
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
400 | 400 | | |
401 | 401 | | |
402 | 402 | | |
403 | | - | |
| 403 | + | |
404 | 404 | | |
405 | 405 | | |
406 | 406 | | |
| |||
Lines changed: 3 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
91 | 91 | | |
92 | 92 | | |
93 | 93 | | |
94 | | - | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
95 | 97 | | |
96 | 98 | | |
97 | 99 | | |
| |||
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
813 | 813 | | |
814 | 814 | | |
815 | 815 | | |
816 | | - | |
| 816 | + | |
817 | 817 | | |
818 | 818 | | |
819 | 819 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
63 | 63 | | |
64 | 64 | | |
65 | 65 | | |
66 | | - | |
| 66 | + | |
67 | 67 | | |
68 | 68 | | |
69 | 69 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| 16 | + | |
| 17 | + | |
16 | 18 | | |
17 | 19 | | |
18 | 20 | | |
| |||
35 | 37 | | |
36 | 38 | | |
37 | 39 | | |
38 | | - | |
| 40 | + | |
39 | 41 | | |
40 | 42 | | |
41 | 43 | | |
42 | 44 | | |
43 | | - | |
| 45 | + | |
44 | 46 | | |
45 | 47 | | |
46 | 48 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
51 | 51 | | |
52 | 52 | | |
53 | 53 | | |
54 | | - | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
55 | 58 | | |
| 59 | + | |
56 | 60 | | |
57 | 61 | | |
58 | 62 | | |
| |||
287 | 291 | | |
288 | 292 | | |
289 | 293 | | |
290 | | - | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
291 | 298 | | |
292 | 299 | | |
293 | 300 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2907 | 2907 | | |
2908 | 2908 | | |
2909 | 2909 | | |
2910 | | - | |
| 2910 | + | |
| 2911 | + | |
| 2912 | + | |
| 2913 | + | |
| 2914 | + | |
2911 | 2915 | | |
2912 | 2916 | | |
2913 | 2917 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
27 | 31 | | |
28 | 32 | | |
29 | 33 | | |
| |||
34 | 38 | | |
35 | 39 | | |
36 | 40 | | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
37 | 48 | | |
38 | 49 | | |
39 | 50 | | |
| |||
117 | 128 | | |
118 | 129 | | |
119 | 130 | | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
120 | 143 | | |
121 | 144 | | |
122 | 145 | | |
| |||
158 | 181 | | |
159 | 182 | | |
160 | 183 | | |
| 184 | + | |
161 | 185 | | |
162 | 186 | | |
163 | 187 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2492 | 2492 | | |
2493 | 2493 | | |
2494 | 2494 | | |
2495 | | - | |
| 2495 | + | |
| 2496 | + | |
| 2497 | + | |
2496 | 2498 | | |
2497 | 2499 | | |
2498 | 2500 | | |
| |||
0 commit comments