- Shipped
- September 7, 2026 at 12:44 AM UTC
- Author
- Kamo
- Commit
- f6ae0e2
The launchpad backdrop — the plain gradient, the org watermark and the wallpaper slideshow it carries — has been completely invisible since 03743d02. Nothing failed to fetch. The whole layer was being painted underneath <body>. Backdrop is `position: fixed; inset: 0; z-index: -1`. A negative z-index paints BELOW the backgrounds of its stacking context's in-flow descendants, so it is only ever visible while every ancestor up to the nearest stacking context is transparent. This component owns none of that chain. It was visible because AuthedChrome's content wrapper happened to be `position: absolute; z-index: 1` and therefore a transparent stacking context wrapped around it — a fact asserted in a comment here ("nothing above it is opaque") about a value in another file. 03743d02 removed that z-index, and was right to: it made every page in the app a child of a level-1 context, so a dropdown asking for 40 painted at 1 and the scrollbars ScrollbarOverlay portals to <body> drew straight over it. But with it gone, `-1` escaped to the ROOT stacking context, where `html` and `body` both carry `background: var(--background)` (#ffffff, globals.css). Negative layer, opaque body on top of it: the backdrop vanished, silently, on the two pages that render it. The fix drops the negative value rather than restoring the context that hid the problem. `z-index: 0` puts the layer in the same painting step as its positioned siblings, which are then ordered by TREE ORDER — and both consumers already render their content box after <Backdrop />, so the content still paints on top. That depends only on the page's own subtree. The scrollbar the negative value was avoiding is gone too: `.kamo-page-scroll`'s native bar is deliberately coloured transparent and the visible one is portalled to <body> at a positive z-index in the root context, above anything this layer can reach from inside the page. Measured in a browser against a copy of the real chain — html/body opaque, the shell wrapper, the page scroller, PageWrapper, the page's main, the backdrop and the content box, with a portalled bar at 13 and a dropdown at 40: wrapper z-index 1, backdrop -1 -> backdrop VISIBLE (before 03743d02) wrapper none, backdrop -1 -> backdrop HIDDEN (what shipped) wrapper none, backdrop 0 -> backdrop VISIBLE (this commit) and in that last row the bar still wins the scrollbar strip and the dropdown still wins over the bar, so neither fix this one sits between is undone. Guarded, because the assertion that broke was a comment: check-negative-zindex fails the build on any negative z-index under app/. There was exactly one in the codebase, and this was it.