Repository navigation
bug(desktop): v2.10.0 map popup header/close button misplaced; CSS override fixes until reopen #9481
Description
Environment
- Official Windows desktop release v2.10.0 (Tauri / WebView2)
- Desktop dashboard in German; observed on multiple map overlays (conflict-zone 'KYIV', cyber threat 'Dragonfly')
- Issue occurs when clicking an icon/zone on the map and opening an informational
.map-popup.
Actual behavior
The popup content/body renders normally, but the title bar and close button are visually displaced above and left of the popup, with much of the title bar clipped/overlaid. Closing via Escape works; close button can be hit in an unexpected position, and the popup body can still scroll. Reopening reproduces.
When testing the first affected conflict-zone popup in DevTools:
popup (getBoundingClientRect): left=632, top=781, width=360, height=560
popup .popup-header: left=461, top=759, width=343, height=45
popup .popup-close: left=766, top=769, width=24, height=24
popup.scrollLeft=0; popup.scrollTop=0
popup.scrollWidth=343; popup.clientWidth=343
elementFromPoint(closeButtonCenter).tagName = BUTTON
The positions clearly put the header to the left/above the parent rectangle even when the popup's own scroll offsets are 0. Resetting scroll offsets made no difference.
Confirmed temporary workaround
While the popup is open, apply the following styles to its .popup-header only:
header.style.setProperty('position', 'static', 'important');
header.style.setProperty('transform', 'none', 'important');
header.style.setProperty('translate', 'none', 'important');
header.style.setProperty('margin', '0', 'important');
header.style.setProperty('inset', 'auto', 'important');This immediately restores the complete title bar and aligns the close (×) icon at the right edge. New popups are freshly created DOM nodes, so a session-only MutationObserver applying the same style overrides to each new .map-popup:not(.map-popup-sheet) .popup-header reproduces a good layout across repeated openings of several popup types.
This is diagnostic evidence of a CSS layout/positioning problem, not proof that position: sticky by itself is the root cause; which of the overrides is essential remains to be isolated.
Expected
The desktop map popup title bar should be entirely inside the top edge of its own popup, with the close control aligned on the upper right, on repeated opening and when the content is long.
Code pointers
src/components/MapPopup.ts:show()constructs.map-popup, positions and appends it todocument.body;hide()discards it; Escape handler works.src/styles/main.css:.map-popup { position: fixed; overflow-y:auto; };.popup-header { display:flex; position:sticky; top:0; };.popup-closebutton styles.- Please check the interaction between
position:sticky, any inherited transforms/zoom/scale, and the scroll container in the packaged WebView2 release. A fix should preserve sticky behavior if possible and cover desktop popup reopen flows in a regression test.
No personal information, account data or secrets included.
Activity
koala73 commentedon Oct 21, 2026
Thanks for the detailed report and the DevTools numbers. They made this much easier to chase.
I couldn't reproduce it on current
main(v2.11.2). I rendered the real conflict-zone popups and measured the header against the popup in:I tried 100%, 125% and 150% display scaling, classic scrollbars, a popup long enough to scroll (at rest and scrolled), the German locale, and repeated reopening. In every case the header sat flush inside the popup's top edge. Nothing in our CSS sets
transform,translate,marginorinseton.popup-header, and the popup code hasn't changed in a relevant way since v2.10.0.So the trigger is probably something in your environment. With a misplaced popup open, could you run these in DevTools and paste the results?
navigator.userAgent[devicePixelRatio, outerWidth / innerWidth], plus your Windows display scale (Settings → Display → Scale), and whether you've ever used Ctrl+mouse wheel or Ctrl+/- in the app.transform,translate,margin,inset) and tell us which one fixes it.With those answers I can write a regression test that fails the way it does for you, then fix the real cause instead of guessing.