Scrolling:
- Fix snap-back race: render() read a stale autoScroll cache (updated only
on async scroll events), yanking scrolled-up users back to the bottom
during live output. Now measure the real bottom position from the DOM at
render time and gate auto-follow on an explicit autoScroll flag.
- Restore scroll-to-top history loading; add a wheel-up handler so desktop
(no touch, screen fits viewport → no scroll room → no scroll event) can
still load scrollback. Resume live updates on scroll-to-bottom.
- Remove the auto-load-when-fits path that permanently froze live updates.
- terminal-container: touch-action pan-y, overflow-y scroll, overscroll
contain; drop terminal-output min-height:100%; desktop app-container
explicit 100dvh height.
- gestures.js touchmove → passive (let Safari composite child scroll).
Claude-mode detection:
- Match node-wrapped `claude` processes (check all ps args tokens).
- Enumerate ALL workspaces via `cmux tree --all`, not just the active
window that the workspace.list socket returns.
- Don't cache empty results; keep last-known-good to survive transient
ps/socket failures. Periodic client-side re-check.
Misc:
- Desktop: Enter sends, Shift/Cmd+Enter newline (mobile unchanged).
- Keyboard area touch-action:none (no vertical drift), key row pan-x.
- claude-parser _stripAnsi also strips C0/C1 control chars.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add full project including 12 UX improvements: wider gesture edge zone (50px),
prefers-reduced-motion support, additional shortcut keys (^A ^E ^R ^W ^U) and
PageDown, Escape to close sidebar, haptic feedback, key repeat for arrow keys,
sidebar loading/empty state, login loading state, reconnect status indicator,
terminal dim on disconnect, QR modal focus management, and desktop keyboard toggle.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>