LearnNewsExamplesServices
Frontmatter
id18028
titleDock rail previews contain long titles and read as floating panes
stateClosed
labels
bugdesignaitestingregressioncore
assigneesneo-gpt
createdAtSep 1, 2026, 7:36 PM
updatedAtSep 1, 2026, 8:27 PM
githubUrlhttps://github.com/neomjs/neo/issues/18028
authorneo-gpt
commentsCount0
parentIssue17836
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtSep 1, 2026, 8:27 PM

Dock rail previews contain long titles and read as floating panes

Closed Backlog/active-chunk-20 bugdesignaitestingregressioncore
neo-gpt
neo-gpt commented on Sep 1, 2026, 7:36 PM

Context

Merged PR #18019 made the rail reveal header use real tab-header primitives. On current dev, an operator-captured Workstation reveal exposed two regressions in the complete preview surface:

  1. Dependency Graph Explorer overflows the narrow left reveal header and visually collides with chrome outside the preview.
  2. A bottom reveal is shallow and visually merges with the pane underneath: the reveal root has neither an opaque surface nor elevation, so the covered header remains legible through it.

Live inspection on 2026-09-01 found the title button resolving flex: 0 1 auto, white-space: nowrap, overflow: visible, and text-overflow: clip. Its VDOM contains the long title. The existing tab system already owns the correct over-wide active-tab treatment in .neo-tab-overflow-capped; the reveal composition simply does not opt into it.

Memory prior art: session 8c150fe3-e8a4-4475-8694-a6f92115dce9 established that overlap defects require real rect-intersection/containment evidence, not crop-only or scroll-width probes.

The Problem

The preview is an edge-anchored overlay by design, but it does not read as one:

  • Its active-tab title can paint outside its flex allocation.
  • Its root is transparent and has no box shadow, so an underlying tab header bleeds into the reveal header.
  • Its free dimension comes from the last committed owning edge-zone extent; only an absent extent falls back to defaultRevealFraction (25%). A previously narrow dock band therefore creates a narrow reveal with no usability floor.

The three symptoms compound: a small, transparent, unelevated pane with escaping text reads as accidental overlap rather than a deliberate transient preview.

The Architectural Reality

  • src/dashboard/dock/interaction/RevealOverlay.mjs owns transient composition, visibility, and free-dimension sizing.
  • src/dashboard/dock/projection/LayoutAdapter.mjs#resolveRevealExtent() correctly reads only the owning edge descriptor; nested split shares are not preview-size authority.
  • resources/scss/src/tab/header/Button.scss already owns the active-tab ellipsis contract through .neo-tab-overflow-capped.
  • resources/scss/src/dashboard/Container.scss owns engine reveal structure; resources/scss/src/apps/workstation/Workspace.scss owns Workstation-specific visual values.
  • A reveal is non-modal hover/focus chrome. A workspace-wide dimmer would overstate modality and flash on pointer dwell, so this leaf uses surface opacity and elevation instead.

Decision Record impact: none; aligned with the transient overlay model in ADR 0029.

The Fix

  1. Mark the reveal title button with the existing tab overflow-cap variant. Do not duplicate the ellipsis CSS.
  2. Treat defaultRevealFraction as both fallback and minimum: effective = max(committedExtent, defaultRevealFraction). Preserve larger committed extents exactly.
  3. Let Workstation supply defaultRevealFraction: 0.35 through its existing getDockProjectionOptions() hook; generic consumers retain the engine default.
  4. Add tokenized physical floors capped by the available workspace. Workstation supplies 20rem inline / 16rem block so a phone-width viewport does not turn 35% into a 147px pane.
  5. Give the reveal root an opaque engine surface plus tokenized border/shadow; Workstation supplies its signal-aware values. Keep the overlay pointer model unchanged and add no full-workspace scrim.
  6. Add full-surface visual/geometry coverage using a deliberately long title and a narrow committed extent. Assertions must include overlay boundaries and the covered neighboring header, not only the title row.

Acceptance Criteria

  • A long reveal title stays within the title button and ellipsizes; its rendered rect never intersects the pin action or escapes the reveal header.
  • The pin action remains fully contained and clickable at the narrowest supported reveal width.
  • A committed extent below the configured default reveals at the configured floor; a larger committed extent is preserved.
  • Workstation rail previews use a 35% minimum/fallback fraction plus 20rem inline / 16rem block physical floors, capped by available workspace.
  • The reveal root is opaque: covered pane/header text is not visible through it.
  • All four edges render a clear border/elevation boundary in Workstation dark and light palettes without a workspace-wide dimmer.
  • Unit coverage pins fraction resolution and title composition; real-browser coverage pins title/pin containment and complete-preview paint.
  • Exact-head unit/components CI is green.

Out of Scope

  • Changing committed dock-zone extents or relaying out the workspace during reveal.
  • Adding modal pointer capture or a full-workspace backdrop/dimmer.
  • Replacing the tab-header primitives introduced by #18019.

Avoided Traps

  • A title-only screenshot can pass while the complete preview escapes its boundary; assert rect containment and capture the entire overlay against neighboring content.
  • New reveal-specific ellipsis rules would duplicate .neo-tab-overflow-capped.
  • Borrowing nested split sizes would violate the owning edge-descriptor contract.

Related

Live duplicate sweep: latest open issues and recent A2A claims re-checked immediately before creation; no equivalent found.

Origin Session ID: 01a0534f-a981-7560-93de-8d3d54966db6

Retrieval Hint: Dock RevealOverlay long title containment transparent preview surface minimum extent