[ui] Popover's mobile bottom sheet doesn't follow scroll and occludes controls with no backdrop
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 48/100
- Issue type
- Feature
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- tailwindcss, typescript
- Domain
- accessibility, design, frontend
Research direction
Start at the shared Popover primitive and inspect its two callers, ScoreExplainerPopover and AchievementTypePicker. Run e2e/viewport.spec.ts first to preserve the above-sm behavior, then choose and validate a mobile scroll/backdrop strategy and test long unbreakable content. Done means the open sheet is clearly handled on scroll, does not silently occlude controls, and has no horizontal scrollbar.
Written by the indexing model from the issue text.
Description
#959 fixed Popover's containment below sm by pinning the panel to the viewport (max-sm:fixed max-sm:inset-x-4 max-sm:top-auto max-sm:bottom-4, plus max-h/overflow-y-auto). That solves "the panel is off screen". It leaves two behaviours a bottom-sheet inherits, both surfaced in review and deliberately not fixed there.
1. The sheet does not follow the page
Measured: after scrolling 1200px the panel sits at y 610 while its trigger is at y −887. A non-modal panel stays pinned to the bottom of the viewport with the aria-expanded control that owns it scrolled out of sight, and it occludes unrelated controls — measured covering "+ Add work authorization" and "+ Add a profile" at 375px — with no backdrop to signal that a layer is open.
Options, roughly increasing in cost: dismiss on scroll; a backdrop/scrim so the layer reads as modal; or scroll-linked repositioning (which would mean JS positioning, against the primitive's stated dependency-free constraint).
2. overflow-x coerces to auto
CSS coerces a visible axis to auto when the other axis is not visible, so max-sm:overflow-y-auto makes overflow-x: auto too. Harmless today — no horizontal overflow measured in either current caller — but a future caller with a long unbreakable string gets a horizontal scrollbar inside the sheet instead of a wrap.
Why not fixed in #959
Both are inherent to the sheet pattern rather than to the containment bug that issue filed, and the panel is a shared design-system primitive with two callers today (ScoreExplainerPopover, AchievementTypePicker). The behaviour is correct as shipped; this is about making it good.
Acceptance criteria
- An open panel at ≤640px either dismisses, follows, or reads unambiguously as a modal layer when the page scrolls.
- It does not silently occlude interactive controls with no signal.
- Long content wraps rather than producing a horizontal scrollbar inside the sheet.
- Above
sm, behaviour is unchanged (pinned bye2e/viewport.spec.ts).
- Dominant language
- TypeScript
- Stars
- 11
- Forks
- 4
- Avg merge
- 1d 15h
- Merged PRs (30d)
- 45
Getting set up
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from offlinecv/OfflineCV
-
refactor testing
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
Maintainers usually reply within 1 day
-
chore
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Maintainers usually reply within 1 day
-
documentation
Difficulty 1/5 Under an hour Newbie friendliness 92/100
Maintainers usually reply within 1 day
-
improvement ux:job-search
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
Maintainers usually reply within 1 day
-
documentation
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
Maintainers usually reply within 1 day
All issues in offlinecv/OfflineCV
Similar issues
-
ADD openalgoOpentemplate
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
Maintainers usually reply within 1 day
-
factory-active factory-automatic task-bug-reproduction-success task-identify-harness-labels-done task-identify-issue-type-done
Difficulty 2/5 1-3 hours Newbie friendliness 90/100
vercel/ai#21528 · 3 comments ·
Maintainers usually reply within 1 day
-
bug Needs: Triage :mag:
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
microsoft/fluentui-contrib#671 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
sveltejs/acorn-typescript#150 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100