What happens
On an iPhone in Safari, with the phone layout active, there is an empty band roughly 40 CSS px tall between the bottom toolbar (Run / Enter / mic) and Safari's bottom bar whenever the bar is expanded. The terminal is padded by the same amount, so the band is dead space below the last prompt line. It closes when the bar collapses on scroll and reopens when it expands.
Why
mobile.css lifts the toolbar on iOS Safari by calc(var(--safe-area-bottom) + (100vh - var(--app-height))) and pads .main by the same amount, on the assumption that position: fixed anchors to a layout viewport that extends behind the browser bar. On iPhone Safari fixed elements already stop above the bar. 100vh is the large viewport (bar collapsed) and --app-height is visualViewport.height (bar expanded), so the expression measures the bar's collapsible height, and that is the band.
Environment
Proposed fix
Lift by the measured overlap instead: set a --chrome-overlap variable in updateAppHeight() as innerHeight - visualViewport.height (0 where fixed elements already clear the bar, the overlap where they do not) and use it in the two rules in place of 100vh - --app-height. PR to follow.
What happens
On an iPhone in Safari, with the phone layout active, there is an empty band roughly 40 CSS px tall between the bottom toolbar (Run / Enter / mic) and Safari's bottom bar whenever the bar is expanded. The terminal is padded by the same amount, so the band is dead space below the last prompt line. It closes when the bar collapses on scroll and reopens when it expands.
Why
mobile.csslifts the toolbar on iOS Safari bycalc(var(--safe-area-bottom) + (100vh - var(--app-height)))and pads.mainby the same amount, on the assumption thatposition: fixedanchors to a layout viewport that extends behind the browser bar. On iPhone Safari fixed elements already stop above the bar.100vhis the large viewport (bar collapsed) and--app-heightisvisualViewport.height(bar expanded), so the expression measures the bar's collapsible height, and that is the band.Environment
codeman@1.26.1, run as a systemd user service on Ubuntu 22.04 (WSL2) behind an nginx reverse proxy with TLS terminationProposed fix
Lift by the measured overlap instead: set a
--chrome-overlapvariable inupdateAppHeight()asinnerHeight - visualViewport.height(0 where fixed elements already clear the bar, the overlap where they do not) and use it in the two rules in place of100vh - --app-height. PR to follow.