Shot from the real Sidebar component with the app's own styles.css, panel opened by clicking its button. Six variants: before/after × three availability states × two viewports.
remote simply shortens the right-hand end. With fx last, a missing button would slide fx leftward and the separation would wander.| state | before | after |
|---|---|---|
| all CLIs | row1 7 (wraps), row2 4 | row1 6, row2 6 โ exact fit |
| remote absent | row1 7 (wraps), row2 3 | row1 6, row2 5 |
| OpenClaw unavailable | row1 7 (wraps), row2 4 | row1 6, row2 6 |
An unavailable CLI renders dimmed rather than disappearing, so row one is always exactly six and the two rows cannot go ragged from availability alone.
Seven CLIs in a six-column grid: fx wraps onto a line of its own.
fx joins row two, then an empty cell, then the session types.
Row two loses a button; fx is still stranded above it.
Row two is five cells. The gap stays in column two โ the free column falls off the right, where it means nothing.
An unavailable CLI still renders, dimmed โ row one stays six wide.
Unchanged: nothing goes ragged, because availability never removes a button.
The real Sidebar is mounted with a stubbed transport and a full CLI catalogue, the create button is clicked, and the .widget.quick element is captured at 2× scale. The phone shots wrap the tree in .app.m-home, because under 720px the sidebar becomes full-width โ a phone makes this panel wider, not tighter, and shooting a 390px viewport without that wrapper would have shown the desktop layout by mistake.