Skip to content

Phone: a selected search result in a short folder stays hidden under the selection sheet #406

Closed

Description

@BeSovereign

Where: web/src/components/FolderPane.vue:209-219 (applySelect) calls web/src/components/FileList.vue:88-93 (focusRow, which only calls .focus()). The sheet is styled in web/src/styles/app.css:679-685.

What happens: On a Pixel 7 in de-du, search for "plan", press ↓ and Enter. This opens /home/Projekte?select=/Projekte/plan.txt, a folder with 5 entries. The last row is selected and focused, but it sits at 643-747 px while the sheet covers 666-839 px, and elementFromPoint at the row's centre hits the sheet. The page could scroll 98 px, because the folder keeps the sheet's height free below the list, but scrollY stays 0. focus() only scrolls when the row is outside the viewport, and this row is partly inside. In long lists the row is centred and visible.

Expected: The row the search opened is fully visible above the sheet.

Fix:

  • In focusRow, after focusing, call rowEl(at)?.scrollIntoView({ block: 'nearest' }).
  • On phone width, give rows scroll-margin-bottom: var(--selection-bar-height, 0px). On the desktop, give them the sticky toolbar's height as scroll-margin-top.
  • Do the same for tiles in GalleryGrid.vue.

Test (Playwright, mobile project): In a folder with 5 files, go to /home/<dir>?select=/<dir>/<last file>. Assert that the row's bounding box bottom is at or above the top of .selection-bar. Fails today: row bottom 747 > sheet top 666.


Found by the automatic review round (claude-opus-5-5, b739414); per CLAUDE.md the fix starts with a failing behaviour test.

Activity

  1. added
    rebuildPart of the ground-up rebuild (spec 2026-10-14)
    qaFound by exploratory QA (dogfooding)
    on Oct 20, 2026
  2. added a commit that references this issue on Oct 20, 2026
  3. BeSovereign commented on Oct 20, 2026

    @BeSovereign
    ContributorAuthor

    Fixed: PR #415 squash-merged into main after green CI (one commit; git revert it to undo).

    • Suites: typecheck: 1 passed, 0 failed | lint: 1 passed, 0 failed | unit: 1187 passed, 0 failed | e2e: 609 passed, 0 failed
    • Declared tests fail without the production change and pass with it (output in the PR).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    qaFound by exploratory QA (dogfooding)rebuildPart of the ground-up rebuild (spec 2026-10-14)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions