[Bug] Header session tabs past the visible area are unreachable and the last tab hides its close and menu controls

Author: bashrusakhCreated Sep 22, 2026Updated Sep 22, 2026
Labelsbugarea:sessionsroot-cause:found

Before submitting

  • I searched existing issues and didn't find this bug
  • This is one bug. Other problems get their own issue.

Steps to reproduce

  1. Enable header session tabs (Settings > Visual > session tabs) in the desktop app.
  2. Open more sessions than fit in the header. Tabs are a fixed 176px wide, so about six to eight fit in a normal window, and the strip caps at 10 tabs.
  3. Try to reach a tab that is cut off at the right edge with a mouse or touch.
  4. Hover the rightmost visible tab.

What you expected

Every open tab is reachable, and the rightmost tab shows its close and menu controls on hover.

What happened instead

The tabs past the right edge cannot be reached with a pointer. The scrollbar is hidden on purpose, there is no wheel handler, and dragging on a tab reorders it instead of scrolling. The last visible tab is cut off under the right edge fade, its close and menu controls never appear, and because the strip sits flush against the header buttons (mini-chat, work status) the faded tab looks like it slides under them.

Where does it happen?

Desktop app (Linux). The header tab strip is shared with web.

OpenChamber version

1.24.2

Notes

  • The scroller hides its scrollbar by design: .session-tabs-scroll { scrollbar-width: none } and ::-webkit-scrollbar { display: none } in packages/ui/src/index.css:1987-1997. The comment states overflow is communicated by the edge fades only.
  • No wheel or scrollBy handler exists for the strip. SessionTabsStrip.tsx only reads scrollLeft at :357-363 to drive the fades.
  • Tab slots carry touch-none (:134), and the dnd-kit sensors at :342-345 turn a drag into a reorder, so pointer scrolling is effectively impossible.
  • The right edge fade is 24px (:380-386, applied at :400), and the hover controls are anchored at absolute right-1 (:217), which puts the close button inside the faded zone.
  • Only the active tab is kept in view, through a programmatic scrollIntoView at :374-378. Keyboard next or previous tab changes the active tab, which is the only reliable way to reach a hidden tab today.
  • The strip is capped at 10 tabs (MAX_SESSION_TABS in packages/ui/src/stores/useSessionTabsStore.ts:27), so overflowing is the normal case.

Suggested direction

Replace the horizontal scroll and the edge fade with an overflow menu: show the tabs that fit and put the rest behind a "more" control. That makes every tab reachable and keeps the visible tabs clear of the header buttons.

The indicator placement mismatch is tracked separately in #3809.