* fix: prevent mobile keyboard from occluding terminal viewport
On mobile, 100dvh does not shrink when the soft keyboard opens, causing
the terminal and other absolute-inset-0 views to extend behind the keyboard.
Add useVisualViewport hook that tracks window.visualViewport.resize/scroll
via RAF. On mobile, use the visual viewport height (actual visible area)
for the root container instead of 100dvh, so content resizes above the
keyboard when it opens.
* fix: skip unchanged visual viewport updates
---------
Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
* fix: handle terminal keyboard input on Android with desktop UA
- Detect Android via navigator.userAgentData.platform when UA is
spoofed by Chrome's "Desktop site" mode, so the <input> overlay
(useTextInput) is used instead of <textarea>.
- Handle Ctrl+letter and Alt+letter combos in the hidden input
overlay's keydown handler, so terminal control sequences (^C, ^D,
^S, M-x, etc.) work through the touch input path.
- Skip global keyboard shortcuts (sidebar toggle, etc.) when focus
is inside the terminal viewport, preventing shortcut steal.
* fix: preserve terminal keyboard shortcuts
---------
Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
On Android tablets in Desktop site mode, the handleDocumentFocusIn handler
intercepted Ghostty's internal element focus and blurred them, but never
redirected focus to the hidden input overlay. This left the terminal with
no focused element - the IME keyboard would appear but keystrokes went
nowhere. Now focusHiddenInput() is called after the blur to ensure the
terminal always has a focused input surface.