# Layout overlap audit — machine scan
_Auto-generated by `scripts/layout-overlap-scan.mjs`. Re-run any time._
## Interpretation (top-line)
1. **Orphan floating overlays** are the biggest source of visible-page
damage: `.fork-compare-drawer` / `.playground-compare-drawer` /
`.devtools-drawer` remain visible after a fixture or button opens
them. On every subsequent pane switch the drawer sits on top,
hiding the actual pane. The fix is a tab-switch hook that hides
these `[hidden]` on `switchTo()`. Task-list `#104` tracks this.
2. **True per-pane overlap** count is small once the orphan overlays
are treated as one root cause: rubrics `#cancel` × interact-card
(only reproducible because the fixture-seeded chat state bleeds
through the orphan drawer's frame), tracing `
` × devtools-drawer.
All three HIGH overlap findings collapse onto the same tab-switch bug.
3. **Overflow** findings are legitimate density issues at 800px:
- `.bench-table` row body overflows by 66–92px because column
widths are hardcoded; needs a min-width breakpoint.
- `.plugins-create-zone .create-card` icon-then-title-then-desc
column overflows the fixed narrow card at 800px.
- `#rubrics-catalog` cards overflow horizontally at 800px.
- `.header-lead .page-title` truncates by 12px on Bench narrow.
4. **CSS static SUSPECT count** is dominated by drawer slide-in
`transform: translateX(0)` sites and the two negative-margin
glue-together lines in `.tool-row + .tool-result-row` and
`.partial-tool-row`. Both negative-margins are 4-8px, well below
the 18px payload-controls hack tier; still called out for review.
---
Generated: 2026-07-18T14:36:33.663Z
Widths: 1512 / 1100 / 800px, height 900
Panes visited: 14 × 3 widths = 42 scans
Fixtures seeded before chat re-visit: 1.1-trace-full, 2.3-toolcall-delta-stream, 2.5-compact-before-after, 2.6-subagent-inline-trace, 2.2-reasoning-interleaved
Exclusion: known payload-controls -18px hack (in-fix); decorative pseudo-elements listed in scan script.
## Summary
| Severity | Overlap | Overflow |
| -------- | ------- | -------- |
| HIGH | 0 | 0 |
| MEDIUM | 0 | 0 |
| LOW | 1 | 0 |
Orphan floating overlays (drawers left open when they should be closed): 39
## Orphan floating overlays
Body-level drawers found visible on panes that don't own them. Each
is a `position: absolute`/`fixed` overlay that a fixture or button
opens but never closes on tab-switch — it covers the current pane's
content until dismissed manually.
- pane `hub` — `.fork-compare-drawer` (widths 800/1100/1512px)
- pane `hub` — `.playground-compare-drawer` (widths 800/1100/1512px)
- pane `bench` — `.fork-compare-drawer` (widths 800/1100/1512px)
- pane `bench` — `.playground-compare-drawer` (widths 800/1100/1512px)
- pane `bench` — `.devtools-drawer` (widths 800/1100/1512px)
- pane `rubrics` — `.fork-compare-drawer` (widths 800/1100/1512px)
- pane `rubrics` — `.playground-compare-drawer` (widths 800/1100/1512px)
- pane `rubrics` — `.devtools-drawer` (widths 800/1100/1512px)
- pane `runtimes` — `.fork-compare-drawer` (widths 800/1100/1512px)
- pane `runtimes` — `.playground-compare-drawer` (widths 800/1100/1512px)
- pane `runtimes` — `.devtools-drawer` (widths 800/1100/1512px)
- pane `mission` — `.fork-compare-drawer` (widths 800/1100/1512px)
- pane `mission` — `.playground-compare-drawer` (widths 800/1100/1512px)
- pane `mission` — `.devtools-drawer` (widths 800/1100/1512px)
- pane `growth` — `.fork-compare-drawer` (widths 800/1100/1512px)
- pane `growth` — `.playground-compare-drawer` (widths 800/1100/1512px)
- pane `growth` — `.devtools-drawer` (widths 800/1100/1512px)
- pane `prs` — `.fork-compare-drawer` (widths 800/1100/1512px)
- pane `prs` — `.playground-compare-drawer` (widths 800/1100/1512px)
- pane `prs` — `.devtools-drawer` (widths 800/1100/1512px)
- pane `settings` — `.fork-compare-drawer` (widths 800/1100/1512px)
- pane `settings` — `.playground-compare-drawer` (widths 800/1100/1512px)
- pane `settings` — `.devtools-drawer` (widths 800/1100/1512px)
- pane `chat` — `.fork-compare-drawer` (widths 800/1100/1512px)
- pane `chat` — `.playground-compare-drawer` (widths 800/1100/1512px)
- pane `chat` — `.devtools-drawer` (widths 800/1100/1512px)
- pane `tree` — `.fork-compare-drawer` (widths 800/1100px)
- pane `tree` — `.playground-compare-drawer` (widths 800/1100px)
- pane `tree` — `.devtools-drawer` (widths 800/1100px)
- pane `context` — `.fork-compare-drawer` (widths 800/1100px)
- pane `context` — `.playground-compare-drawer` (widths 800/1100px)
- pane `context` — `.devtools-drawer` (widths 800/1100px)
- pane `tracing` — `.fork-compare-drawer` (widths 800/1100px)
- pane `tracing` — `.playground-compare-drawer` (widths 800/1100px)
- pane `tracing` — `.devtools-drawer` (widths 800/1100px)
- pane `plugins` — `.fork-compare-drawer` (widths 800/1100px)
- pane `plugins` — `.playground-compare-drawer` (widths 800/1100px)
- pane `plugins` — `.devtools-drawer` (widths 800/1100px)
- pane `hub` — `.devtools-drawer` (widths 800/1100px)
## Overlap findings (real z-order intrusion, text > 20% covered)
### pane: tracing
- **LOW** @ 1100px — `table.tracing-page-table > thead > tr > th.tracing-page-th.num:nth-of-type(6)` × `aside.devtools-drawer:nth-of-type(2) > div.devtools-search-row:nth-of-type(4) > label.devtools-autoscroll > input` (89% intersection)
- A text: “P99 Latency”
- shot: `docs/layout-audit-shots/w1100-tracing-38.png`
## Overflow findings (scrollWidth > clientWidth, overflow:visible)
_None._
## Track 1 — CSS static suspects
Grep of `src/renderer/style.css` for the layout mechanisms that can
pull an element off its own cell onto another's: negative margin,
`position: absolute` (without a scoped stacking context), `float`,
`transform: translate` with non-trivial offsets. `SAFE` = decorative
pseudo-element / accepted idiom; `SUSPECT` = worth eyeballing;
`KNOWN-IN-FIX` = the `payload-controls` -18px hack in the in-flight fix.
| Risk | Count |
| ------------ | ----- |
| SUSPECT | 15 |
| KNOWN-IN-FIX | 0 |
| SAFE | 52 |
### SUSPECT sites
- **style.css:289** (absolute) — `.msg .fork-here`
- rule: `position: absolute; top: 6px; right: 8px;`
- **style.css:612** (translate) — `.layout-toast.show`
- rule: `.layout-toast.show { opacity: 1; transform: translateY(0); }`
- **style.css:1230** (absolute) — `.playground-stream .bubble-error`
- rule: `/* Compare drawer sits above the playground stream (position:absolute). */`
- **style.css:1502** (translate) — `.tool-json-drawer.open`
- rule: `.tool-json-drawer.open { transform: translateX(0); }`
- **style.css:2631** (translate) — `.quickchat-scrim.quickchat-open .quickchat-card`
- rule: `.quickchat-scrim.quickchat-open .quickchat-card { transform: translateY(0); }`
- **style.css:3020** (absolute) — `.debug-popover .debug`
- rule: `position: absolute;`
- **style.css:4152** (absolute) — `.tree-preview-timeline-empty`
- rule: `position: absolute;`
- **style.css:5198** (absolute) — `.card.steer .steer-dismiss`
- rule: `position: absolute; top: 6px; right: 8px;`
- **style.css:6600** (negative-margin) — `.assistant-turn > .turn-body > .tool-row + .tool-result-row`
- rule: `margin-top: -4px; /* pulls result up under call */`
- **style.css:6730** (negative-margin) — `.turn-child.tool-row.partial-tool-row`
- rule: `margin-left: -8px; /* keep the row's baseline aligned with sealed rows */`
- **style.css:7797** (translate) — `.rubric-detail-drawer.open`
- rule: `.rubric-detail-drawer.open { transform: translateX(0); }`
- **style.css:7881** (translate) — `.annotation-drawer.open`
- rule: `.annotation-drawer.open { transform: translateX(0); }`
- **style.css:8172** (translate) — `.export-drawer.open`
- rule: `.export-drawer.open { transform: translateX(0); }`
- **style.css:10488** (negative-margin) — ``
- rule: `* `margin-top:-18px + float:right` hack that overlapped when text grew. */`
- **style.css:10488** (float) — ``
- rule: `* `margin-top:-18px + float:right` hack that overlapped when text grew. */`
### KNOWN-IN-FIX sites (excluded from DOM scan)
_None._
|