Skip to content

fix(ui): unbreak two overlays trapped by their ancestors' stacking/co… - #61

Merged
iFlip721 merged 1 commit into
mainfrom
iss-55
Sep 3, 2026
Merged

fix(ui): unbreak two overlays trapped by their ancestors' stacking/co…#61
iFlip721 merged 1 commit into
mainfrom
iss-55

Conversation

@iFlip721

@iFlip721 iFlip721 commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

…ntaining blocks

Closes #55.

  1. Active Streams "View Channel" slide-over (the reported bug)

    /active is a stage route, so ActiveStreamsScreen renders inside .mq-stage-content, which is position: relative; z-index: 1 and therefore a stacking context. The slide-over's z-index: 85 was clamped to level 1 there, losing to .topbar (z-index 20) — so the topbar's "Search everything..." box, Docs button and theme toggle painted over the panel's header, hiding the channel logo, name, LIVE pill and metadata line. The fixed backdrop also painted behind the topbar, leaving the search input clickable and focusable while the panel was open.

    Fixed by wrapping the slide-over in , matching the existing precedent in CopyConfirmModal.vue. Geometry is unchanged (the backdrop was already fixed/inset:0 with no transformed ancestor) — only paint order moves. The panel now covers the topbar for its full height, exactly like ChannelDrawer, LogsDrawer and DocsDrawer already do.

    EPGDetailScreen uses the same .stream-view-bg class and was never affected, because /epg-detail is not a stage route.

  2. Global search click-away backdrop

    .topbar-search centred itself with transform: translateX(-50%). A transform makes an element the containing block for its position:fixed descendants, so SearchResults' .sr-backdrop (position: fixed; inset: 0) collapsed from the viewport to the 480x36 search box — clicking anywhere outside the box never dismissed the results (only Escape did).

    Fixed by centring with a negative half-width margin instead of a transform; pixel-identical placement at both the 480px and 90vw branches, no transform. The input is also raised above the backdrop so clicking back into the box to edit the query moves the caret instead of closing the results.

Landmine comments added at each trap (.mq-stage-content, .stream-view-bg, .topbar-search, .sr-backdrop) so the next overlay added to a stage screen or nested under the topbar does not repeat either failure.

Verified: npm run build (vue-tsc + vite) passes. Both failures and both fixes were reproduced and measured in-browser against the real stylesheet — .sr-backdrop goes 480x36 -> full viewport, outside clicks change from hitting page content to hitting the backdrop, result rows and the input stay hit- testable, and the search box stays exactly centred.

…ntaining blocks

Closes #55.

1. Active Streams "View Channel" slide-over (the reported bug)

   /active is a stage route, so ActiveStreamsScreen renders inside
   .mq-stage-content, which is `position: relative; z-index: 1` and therefore a
   stacking context. The slide-over's `z-index: 85` was clamped to level 1 there,
   losing to .topbar (z-index 20) — so the topbar's "Search everything..." box,
   Docs button and theme toggle painted over the panel's header, hiding the
   channel logo, name, LIVE pill and metadata line. The fixed backdrop also
   painted behind the topbar, leaving the search input clickable and focusable
   while the panel was open.

   Fixed by wrapping the slide-over in <Teleport to="body">, matching the
   existing precedent in CopyConfirmModal.vue. Geometry is unchanged (the
   backdrop was already fixed/inset:0 with no transformed ancestor) — only paint
   order moves. The panel now covers the topbar for its full height, exactly like
   ChannelDrawer, LogsDrawer and DocsDrawer already do.

   EPGDetailScreen uses the same .stream-view-bg class and was never affected,
   because /epg-detail is not a stage route.

2. Global search click-away backdrop

   .topbar-search centred itself with `transform: translateX(-50%)`. A transform
   makes an element the containing block for its position:fixed descendants, so
   SearchResults' .sr-backdrop (position: fixed; inset: 0) collapsed from the
   viewport to the 480x36 search box — clicking anywhere outside the box never
   dismissed the results (only Escape did).

   Fixed by centring with a negative half-width margin instead of a transform;
   pixel-identical placement at both the 480px and 90vw branches, no transform.
   The input is also raised above the backdrop so clicking back into the box to
   edit the query moves the caret instead of closing the results.

Landmine comments added at each trap (.mq-stage-content, .stream-view-bg,
.topbar-search, .sr-backdrop) so the next overlay added to a stage screen or
nested under the topbar does not repeat either failure.

Verified: `npm run build` (vue-tsc + vite) passes. Both failures and both fixes
were reproduced and measured in-browser against the real stylesheet —
.sr-backdrop goes 480x36 -> full viewport, outside clicks change from hitting
page content to hitting the backdrop, result rows and the input stay hit-
testable, and the search box stays exactly centred.
@iFlip721
iFlip721 merged commit bd142f6 into main Sep 3, 2026
6 checks passed
@iFlip721
iFlip721 deleted the iss-55 branch September 3, 2026 11:21
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.

Cosmetic Change Request... View Channel screen covered

1 participant