fix(onboarding): make Accept/Install reachable on small screens#999
Merged
Conversation
The dependency setup wizard had three reachability bugs on short viewports (landscape phones, small laptops, resized windows): 1. `.onboarding-container` used `100vh` + `overflow: hidden`. On iOS Safari the URL bar makes `100vh` larger than the actual visible viewport, and `overflow: hidden` clipped any content that overflowed. 2. `.onboarding-welcome-card`, `.onboarding-legal-card`, and `.onboarding-step-card` all set `min-height: clamp(min, vh, max)` where the *min* clamp value (320-360px) was enforced even on viewports shorter than ~600px. Combined with header + footer + paddings, the action row (I Agree, Start setup, Install, Next/Back) was pushed past the bottom of the viewport with no way to scroll. 3. The body-level `body.dependency-onboarding-active #dependency-setup-modal` override had higher specificity than `.onboarding-overlay`, so any padding/overflow changes had to be applied at both selectors. Fix: - `100vh` → `100dvh` for accurate mobile viewport - `overflow: hidden` → `overflow-y: auto` on the container + the body-active modal selector, with `scrollbar-gutter: stable` and `overscroll-behavior: contain` so the wider page never bounce-scrolls - New `@media (max-height: 800px)` and `(max-height: 600px)` rules that drop the decorative `min-height` clamps and tighten paddings so the action row is always reachable, even on 320-600px-tall windows - `align-items: flex-start` on short viewports so content begins at the top and the user can scroll down naturally - Safe-area insets (`env(safe-area-inset-*)`) added to all overlay paddings for notched devices
This was referenced May 31, 2026
Merged
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The dependency setup wizard had reachability bugs on short viewports (landscape phones, small laptops, resized windows): the I Agree button on the Terms screen — and the Install/Next buttons on every setup step — could be pushed below the visible viewport with no way to scroll.
Root causes
.onboarding-containerused100vh+overflow: hidden. On iOS Safari,100vhincludes the URL bar, so the container was larger than the actual visible viewport, andoverflow: hiddenclipped anything that overflowed..onboarding-welcome-card,.onboarding-legal-card, and.onboarding-step-cardsetmin-height: clamp(min, vh, max)where the min clamp value (320–360px) was enforced even on viewports shorter than ~600px. Combined with header + footer + paddings, the action row was pushed past the bottom of the viewport — and the container would not scroll.body.dependency-onboarding-active #dependency-setup-modaloverride had higher specificity than.onboarding-overlay, so any padding/overflow fix had to be applied at both selectors.What changed
100vh→100dvheverywhere (accurate mobile viewport)overflow: hidden→overflow-y: autoon the container + the body-active modal selector, withscrollbar-gutter: stableandoverscroll-behavior: contain@media (max-height: 800px)and(max-height: 600px)rules drop the decorativemin-heightclamps and tighten paddings/typography so the action row is reachable on 320–800px-tall windowsalign-items: flex-starton short viewports so the modal starts at the top and users can scroll down naturallyenv(safe-area-inset-*)) added to all overlay paddings for notched devicesTest plan
Tested with Puppeteer at 6 viewport sizes — every size passes (I Agree button is either initially in view or reachable via container scroll):
Manual:
localStorage, reload — Terms screen appears🤖 Generated with Claude Code