* 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>