Skip to content

A demoted widget's popover opens inside the ⋯ menu, not through it - #291

Merged
nyblnet merged 1 commit into
mainfrom
fix-nested-menu-clip
Aug 15, 2026
Merged

A demoted widget's popover opens inside the ⋯ menu, not through it#291
nyblnet merged 1 commit into
mainfrom
fix-nested-menu-clip

Conversation

@nyblnet

@nyblnet nyblnet commented Aug 10, 2026

Copy link
Copy Markdown
Owner

Reported against 1.0.17: opening Share from ⋯ on a narrow window with the properties panel open draws the popover interleaved with the panel — rows cut off down their left edge, panel labels showing through the gap.

Not a stacking bug this time (that was #286). This one is clipping.

Cause

.ed-topbar.ed-bar-fold .ed-menu carries max-height + overflow-y: auto so a ⋯ menu that can outgrow the screen scrolls — correct, and well argued in the comment above it.

But overflow-y: auto cannot be had on its own. Set either axis to a non-visible value and the browser computes the other to auto. So that menu quietly became a clipping box for everything positioned inside it.

Phone chrome demotes whole dropdown widgets (Share, Language) into ⋯, and .ed-share-pop is a 250px popover anchored to its parent's end (inset-inline-end: 0). Inside the 200px menu it hangs off both edges. Measured at a 660px viewport:

rect
⋯ menu 454–654 × 54–650
Share popover 399–649 × 239–719
properties panel 424–660

55px off the left, 69px below the bottom — both clipped away. The properties panel sits under exactly that strip, which is why the panel showed through where the popover had been cut.

Fix

A floating child can never escape a scroll container, so it stops floating. Inside ⋯, a nested menu renders position: static — a section of the list, taking its width and scrolling with it. Nothing overhangs, so nothing can be clipped, and it works the same on a phone where a 250px popover had nowhere to go anyway.

Verified

At the same 660px viewport:

before after
Share popover 399–649, hanging 55px past the menu 443–649, inside menu 438–654
Share rows escaping the menu left column cut 0 of 7
Language rows escaping 0 of 10
popover position absolute static, in the scroll flow

Desktop unaffected — at 1400px the fold class is absent, so the popover is still absolute, min-width: 250px, shadowed, and fully on screen. Screenshot of the fixed narrow layout shows Share expanding cleanly as a section of the ⋯ list.

Adds the overflow-y trap to CLAUDE.md's hard-won list — it is invisible at desktop widths and the obvious reading of the CSS is wrong.

Not for 1.0.17 (already released); this is for the next one.

Opening Share from ⋯ on a narrow window drew the popover interleaved with the
properties panel: rows cut off down their left edge, panel labels showing
through the gap.

.ed-topbar.ed-bar-fold .ed-menu carries max-height + overflow-y:auto so a menu
that can outgrow the screen scrolls. But overflow-y cannot be had on its own —
a browser computes overflow-x to auto as well — so that menu is a CLIPPING BOX
for anything positioned inside it. Phone chrome demotes the whole Share
dropdown into ⋯, and .ed-share-pop is a 250px popover anchored to its parent's
end, so inside the 200px menu it hung off both edges. Measured at 660px:

  menu       454..654 x  54..650
  share pop  399..649 x 239..719     55px off the left, 69px below

Both overhangs were clipped away, and the properties panel sits under exactly
that strip, so the panel showed through where the popover had been cut.

A floating child cannot escape a scroll container, so it stops floating.
Inside ⋯ a nested menu renders position:static — a section of the list, taking
its width and scrolling with it. Nothing overhangs, so nothing can be clipped.

After, at the same 660px: Share 443..649 inside menu 438..654, 0 of 7 rows
escaping; Language likewise, 0 of 10. Desktop is untouched — the fold class is
absent, so the popover is still absolute, 250px, shadowed and fully on screen.
@nyblnet
nyblnet merged commit 9a09d81 into main Aug 15, 2026
1 check passed
nyblnet added a commit that referenced this pull request Aug 15, 2026
#291 and #297 merged without entries. Both are user-visible, so both need one —
and on this release in particular, because the first six bold lead-ins become
the `notes` inside the signed manifest and are all a reader sees in the About
dialog. Four entries now, ordered so that list reads sensibly: the security fix
leads, the Tray change follows, then the two fixes, cosmetic last.

The Share entry says what the reader saw (a popover sliced down its left edge
with the properties panel showing through) before it says why, and keeps the
cause to one plain sentence: a box that scrolls in one direction clips the
other whether you asked for it or not. The stripe entry is short because the
change is small; what makes it worth an entry at all is that the hard-coded
peach stayed peach in dark mode.

Neither is a regression. Both reproduce on 1.0.17 and earlier.
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.

1 participant