The bug: the Channels menu opened and never showed
Under a folded-away title bar — always in fullscreen, or with auto-hide on — clicking ProdCom's Channels button (or the Timers menu) did nothing visible. The click worked: the menu was hidden: false. It just wasn't where anyone could see it.
The folded bar carries a backdrop-filter and a transform, and either one makes a position: fixed descendant position itself against the bar instead of the viewport. The shell parked each menu inside the bar, so its viewport-coordinate top was applied relative to the bar: the menu landed a screen-height below its button, inside the tile's overflow: hidden. Measured on a lower tile: button at y=362, menu at y=703, tile bottom at 622. Tiles near the top showed a misplaced menu; anything lower showed nothing — hence "sometimes" and "with a lot of tiles".
Stacked on that: even a correctly placed menu vanished as soon as the pointer travelled down into it, because leaving the top-edge zone folds the bar, and the menu was the bar's child.
Every header menu now lives on document.body, under a .tile-menu-host carrying the tile's data-module, so a module's scoped CSS still reaches its items (verified for ProdCom; Timers is the only other menu user and its CSS is descendant-scoped too). The module API is unchanged.
Placement keeps the whole menu inside the viewport (the old clamp only kept its top 80 px on screen).
An open menu holds a folded bar open (menu-open on the tile); the bar folds back when the last menu closes with the pointer elsewhere.
The open menu's button gets the gear's is-open accent, so the click is visibly acknowledged.
docs/MODULE-GUIDE.md note updated.
ProdCom 1.3.3: the filter survives a narrow tile
Seven controls need ~175 px of bar, and the shell clips what a narrow tile cannot fit — on a 3-column tile among many the Channels button was half-clipped or gone. Below 380 px the six secondary controls (timestamps, −, +, direction, latest, clear) fold into a single ⋯ menu offering the same actions, with checkmarks mirroring the toggles. Above it the bar is exactly as before; it switches live in both directions via a ResizeObserver on the tile body.
Verified
Browser against tools/prodcom-mock.js:
Auto-hide on, lower-left tile: peek → Channels → menu 6 px under the button, right-aligned, styled; pointer into the menu → bar stays; pick the "Tech" group → 2/4, entries filtered, menu stays open; click away → menu closes, bar folds.
Same with the fullscreen bar state (body.fullscreen + head-off; the app's browser pane can't grant real requestFullscreen, but it's the identical CSS path).
Normal bars: placement unchanged (right-aligned, 6 px under).
Narrow tiles (254 / 338 px): Channels + count + ⋯ shown; ⋯ items toggle timestamps and text size and persist to the layout; 507 px tile shows the full bar.
Rebased onto main after Shell 1.10.0 (#36) landed; the shell is 1.10.1 here. PR #34 still carries a 1.9.3 bump and will need a one-line package.json touch-up when it merges.
## The bug: the Channels menu opened and never showed
Under a folded-away title bar — always in fullscreen, or with auto-hide on — clicking ProdCom's Channels button (or the Timers menu) did nothing visible. The click worked: the menu was `hidden: false`. It just wasn't where anyone could see it.
The folded bar carries a `backdrop-filter` and a `transform`, and either one makes a `position: fixed` descendant position itself against **the bar** instead of the viewport. The shell parked each menu inside the bar, so its viewport-coordinate `top` was applied relative to the bar: the menu landed a screen-height below its button, inside the tile's `overflow: hidden`. Measured on a lower tile: button at y=362, menu at y=703, tile bottom at 622. Tiles near the top showed a misplaced menu; anything lower showed nothing — hence "sometimes" and "with a lot of tiles".
Stacked on that: even a correctly placed menu vanished as soon as the pointer travelled down into it, because leaving the top-edge zone folds the bar, and the menu was the bar's child.
## Shell fix (`public/shell.js` `addMenu`, `public/style.css`)
- Every header menu now lives on `document.body`, under a `.tile-menu-host` carrying the tile's `data-module`, so a module's scoped CSS still reaches its items (verified for ProdCom; Timers is the only other menu user and its CSS is descendant-scoped too). The module API is unchanged.
- Placement keeps the whole menu inside the viewport (the old clamp only kept its top 80 px on screen).
- An open menu holds a folded bar open (`menu-open` on the tile); the bar folds back when the last menu closes with the pointer elsewhere.
- The open menu's button gets the gear's `is-open` accent, so the click is visibly acknowledged.
- `docs/MODULE-GUIDE.md` note updated.
## ProdCom 1.3.3: the filter survives a narrow tile
Seven controls need ~175 px of bar, and the shell clips what a narrow tile cannot fit — on a 3-column tile among many the Channels button was half-clipped or gone. Below 380 px the six secondary controls (timestamps, −, +, direction, latest, clear) fold into a single ⋯ menu offering the same actions, with checkmarks mirroring the toggles. Above it the bar is exactly as before; it switches live in both directions via a `ResizeObserver` on the tile body.
## Verified
Browser against `tools/prodcom-mock.js`:
- Auto-hide on, lower-left tile: peek → Channels → menu 6 px under the button, right-aligned, styled; pointer into the menu → bar stays; pick the "Tech" group → 2/4, entries filtered, menu stays open; click away → menu closes, bar folds.
- Same with the fullscreen bar state (`body.fullscreen` + `head-off`; the app's browser pane can't grant real `requestFullscreen`, but it's the identical CSS path).
- Normal bars: placement unchanged (right-aligned, 6 px under).
- Narrow tiles (254 / 338 px): Channels + count + ⋯ shown; ⋯ items toggle timestamps and text size and persist to the layout; 507 px tile shows the full bar.
Rebased onto main after Shell 1.10.0 (#36) landed; the shell is 1.10.1 here. PR #34 still carries a 1.9.3 bump and will need a one-line `package.json` touch-up when it merges.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
A tile's dropdown menus (ProdCom's Channels, the Timers menu) opened but
never showed under a folded-away title bar — in fullscreen, or with
auto-hide on. The bar carries a backdrop-filter and a transform while
folded, and either one makes a fixed-positioned descendant position
itself against the bar instead of the viewport: the menu landed a
screen-height below its button, inside the tile's overflow. A tile near
the top of the screen showed a misplaced menu; anything lower showed
nothing at all.
The shell now hosts every header menu on the body, under an element
carrying the tile's data-module so a module's scoped CSS still reaches
its items; places it whole inside the viewport; holds a folded bar open
while one of its menus is open (the pointer has to travel down into the
menu); and marks the open menu's button the way the gear is marked.
ProdCom: seven controls need ~175 px of bar, and the shell clips what a
narrow tile cannot fit — the Channels button went with the rest. Below
380 px the six secondary controls fold into a ⋯ menu offering the same
actions, so the filter is the last thing to go.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
michael
changed title from Shell 1.9.4: header menus open where their button is, folded bar or not; ProdCom 1.3.3 keeps its filter on a narrow tile to Shell 1.10.1: header menus open where their button is, folded bar or not; ProdCom 1.3.3 keeps its filter on a narrow tile2026-09-30 14:08:27 -04:00
michael
merged commit 7f6e5bd151 into main2026-09-30 14:21:54 -04:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The bug: the Channels menu opened and never showed
Under a folded-away title bar — always in fullscreen, or with auto-hide on — clicking ProdCom's Channels button (or the Timers menu) did nothing visible. The click worked: the menu was
hidden: false. It just wasn't where anyone could see it.The folded bar carries a
backdrop-filterand atransform, and either one makes aposition: fixeddescendant position itself against the bar instead of the viewport. The shell parked each menu inside the bar, so its viewport-coordinatetopwas applied relative to the bar: the menu landed a screen-height below its button, inside the tile'soverflow: hidden. Measured on a lower tile: button at y=362, menu at y=703, tile bottom at 622. Tiles near the top showed a misplaced menu; anything lower showed nothing — hence "sometimes" and "with a lot of tiles".Stacked on that: even a correctly placed menu vanished as soon as the pointer travelled down into it, because leaving the top-edge zone folds the bar, and the menu was the bar's child.
Shell fix (
public/shell.jsaddMenu,public/style.css)document.body, under a.tile-menu-hostcarrying the tile'sdata-module, so a module's scoped CSS still reaches its items (verified for ProdCom; Timers is the only other menu user and its CSS is descendant-scoped too). The module API is unchanged.menu-openon the tile); the bar folds back when the last menu closes with the pointer elsewhere.is-openaccent, so the click is visibly acknowledged.docs/MODULE-GUIDE.mdnote updated.ProdCom 1.3.3: the filter survives a narrow tile
Seven controls need ~175 px of bar, and the shell clips what a narrow tile cannot fit — on a 3-column tile among many the Channels button was half-clipped or gone. Below 380 px the six secondary controls (timestamps, −, +, direction, latest, clear) fold into a single ⋯ menu offering the same actions, with checkmarks mirroring the toggles. Above it the bar is exactly as before; it switches live in both directions via a
ResizeObserveron the tile body.Verified
Browser against
tools/prodcom-mock.js:body.fullscreen+head-off; the app's browser pane can't grant realrequestFullscreen, but it's the identical CSS path).Rebased onto main after Shell 1.10.0 (#36) landed; the shell is 1.10.1 here. PR #34 still carries a 1.9.3 bump and will need a one-line
package.jsontouch-up when it merges.🤖 Generated with Claude Code
e3967af110to41811ead1cShell 1.9.4: header menus open where their button is, folded bar or not; ProdCom 1.3.3 keeps its filter on a narrow tileto Shell 1.10.1: header menus open where their button is, folded bar or not; ProdCom 1.3.3 keeps its filter on a narrow tile