ad02425470
ChatPage stays mounted (hidden) on every dashboard route so the PTY survives tab switches. With the visualViewport listeners attached unconditionally in the PTY effect, the NS-434 scroll pin (window.scrollTo(0, 0)) fired whenever a soft keyboard opened on ANY page — fighting iOS Safari's own scroll-into-view for focused inputs on Settings, Sessions, etc. Move listener attachment into an isActive-gated effect: attach on chat-tab activation, detach on deactivation (clean lifecycle, no if-check inside the hot handler). The handler reads through refs populated by the PTY effect, so the two lifecycles stay independent. Deactivation also clears any applied inset padding so a keyboard left open during navigation can't strand stale bottom padding on the hidden terminal wrapper. Adds a component-level test asserting listeners attach only while isActive and detach on deactivation.