Skip to content

fix: guard scrollSelectedIntoView against viewport scroll - #408

Open
shaah1d wants to merge 1 commit into
dip:mainfrom
shaah1d:main
Open

fix: guard scrollSelectedIntoView against viewport scroll#408
shaah1d wants to merge 1 commit into
dip:mainfrom
shaah1d:main

Conversation

@shaah1d

@shaah1d shaah1d commented Jun 10, 2026

Copy link
Copy Markdown

Problem

When <Command /> is mounted off-screen (below the fold), it internally calls Element.scrollIntoView() on the selected item at mount time. If the <CommandList> has no overflow/scroll (i.e. it isn't tall enough to scroll), the browser escalates the scrollIntoView call to the viewport, causing the entire page to jump down to where the component is mounted.

Fix

Added an early return in scrollSelectedIntoView() when the list has nothing to scroll (scrollHeight <= clientHeight). This prevents both the item and group heading scrollIntoView calls from firing when the list isn't scrollable, stopping the viewport from being affected.

##Testing
Tested by placing below a "150vh" spacer and checking if it auto scrolls or not when refreshed.

Closes #405

pull Bot pushed a commit to geekbrownbear/bifrost that referenced this pull request Aug 8, 2026
Fixes gobifrost#564.

## What changed
- constrain cmdk selected-item scrolling to the nearest command list
instead of allowing native scrollIntoView to traverse the iframe
boundary
- focus the post-submit confirmation with preventScroll
- add a self-contained cross-origin iframe regression for the
consecutive Company Size / How did you hear about us sequence

## Evidence
The live headed Chrome reproduction moved the host page 646-811px.
Runtime isolation showed suppressing focus did not stop it, while
suppressing cmdk selected-item scrollIntoView (or scoping it to the
nearest container) did. This matches the upstream cmdk report and
proposed fix:
- dip/cmdk#405
- dip/cmdk#408

The local implementation preserves keyboard navigation by adjusting only
the command list scrollTop, including long-list upward and downward
movement.

## Focused verification
- TypeScript build: passed
- ESLint on touched files: passed
- Command, FormConfirmation, and form MultiCombobox tests: 11 passed
- Cross-origin physical-click Playwright regression: passed 3/3
consecutive repetitions

Per request, the broad repository test suites were not run locally and
are left to CI.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Off-screen <Command /> mount can scroll the window unexpectedly

1 participant