LearnNewsExamplesServices
Frontmatter
id16120
titleBody-mounted dock tab drag proxy renders on a transparent toolbar surface
stateOpen
labels
bugdesignaitestingregressioncore
assigneesneo-gpt
createdAt9:13 AM
updatedAt1:55 PM
githubUrlhttps://github.com/neomjs/neo/issues/16120
authorneo-gpt-emmy
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]

Body-mounted dock tab drag proxy renders on a transparent toolbar surface

Open Backlog/active-chunk-10 bugdesignaitestingregressioncore
neo-gpt-emmy
neo-gpt-emmy commented on 9:13 AM

Context

Live operator QA on 2026-07-29 found that an ordinary Workstation tab-header drag proxy has no background. The dragged header text and strip fragment appear directly over pane content, so the embodiment does not read as a distinct object.

This is a new successor to the historical closed #5845 (tab.header.Toolbar: missing drag proxy styles) and to the later dock-affordance work. Those predecessors remain closed.

The Problem

DockTabSortZone#getDragProxyConfig() correctly carries a dock marker, the nearest active theme, and the preview-language class onto the body-mounted proxy. The missing piece is an owned surface ground:

  • the copied root class is .neo-tab-header-toolbar;
  • the shared toolbar background is explicitly transparent;
  • Workstation's opaque toolbar treatment is descendant-scoped under .workstation-viewport, which a direct-body proxy cannot match;
  • .neo-dock-dragproxy.neo-preview-lang-signal adds an edge-light only, not a background surface.

The proxy therefore carries enough identity to select a dock-owned skin but no rule actually gives it an opaque/semi-opaque panel ground. Existing tests prove carried classes and, on the separate target-vessel path, opacity. They never assert the ordinary tab proxy's computed background or retained appearance.

The Architectural Reality

The proxy intentionally mounts outside the dock subtree so the drag can move without layout coupling. As with floating themes, the styling authority must travel with the embodiment. The correct owner is the dock-specific proxy marker plus app-projected component-domain tokens—not a page-global descendant selector and not the generic .neo-dragproxy used by grid/list/tree gestures.

Ordinary tab-header proxy skin and popup-over-popup conversion are separate contracts. This ticket owns the former even if a later implementation PR can reuse a token with #16117.

The Fix

  1. Add a headed Workstation regression for an ordinary real-pointer tab drag in dark and light modes.
  2. Give .neo-dock-dragproxy a dock-owned, token-backed surface ground, border/radius, and readable elevation treatment that travels with its theme carrier.
  3. Preserve the source tab button/strip proportions and active preview-language treatment without making the proxy look like raw pane content.
  4. Pin the body-mount and scoping boundary so non-dock drag proxies remain unchanged.

Contract Ledger

Surface Authority Required behavior Failure fallback Evidence
Dock tab drag proxy DockTabSortZone#getDragProxyConfig() Carries dock marker, nearest theme, preview language, and a distinct token-backed panel ground Missing app projection is visible, not silently replaced by unrelated app colors Root class/token census + computed style
Generic drag proxy Neo.draggable.DragProxyComponent Keeps generic behavior and existing consumer skins No dock-specific leakage Selector/census assertion
Workstation presentation Workstation theme projection Proxy is readable above pane content in both modes Gesture remains functional if visual token resolution fails Same-position screenshots and contrast receipt
Drag semantics Existing sort-zone path Pointer follow, reorder, cancel, and drop semantics unchanged Existing cleanup path Semantic suite remains green

Acceptance Criteria

  • A current-dev headed real-pointer witness fails because the ordinary .neo-dock-dragproxy computed background has zero alpha / no distinct surface.
  • In both Workstation themes the proxy has a nontransparent token-backed background, visible boundary/elevation, and readable text/glyph contrast over representative light and dark pane content.
  • Retained screenshots show the whole proxy at two pointer positions; a class census or token lookup alone is insufficient visual proof.
  • The proxy remains a body-mounted embodiment and continues to follow the pointer without size/offset regression.
  • Preview-language edge-light treatment composes with the ground rather than replacing it.
  • Generic grid/list/tree .neo-dragproxy surfaces do not acquire the dock treatment.
  • Reorder, cross-zone drop, cancel, Escape, and cleanup assertions remain green.

Out of Scope

Popup-over-popup conversion/materialization (#16117) · overflow menu skin (#16119) · drop-preview thickness · native-titlebar reintegration · changing tab-strip layout.

Avoided Traps

  • Do not reopen #5845.
  • Do not add a background to every .neo-dragproxy globally.
  • Do not rely on .workstation-viewport .neo-tab-header-toolbar; the proxy is deliberately outside that subtree.
  • Do not treat a theme class or box shadow as proof of a readable surface.
  • Do not solve this with copied pixel colors; use the dock/app token boundary already carried by the proxy.

Decision Record impact

aligned-with the body-mounted embodiment and app-projected theme boundary; no ADR amendment expected.

Related

Historical predecessor #5845 · #14930 / PR #14955 drag-affordance authority · QT-parity epic #13158 · sibling #16117 · sibling #16119.

Freshness evidence: live all-state GitHub searches for tab drag proxy, drag proxy background, and related Workstation terms; current source/SCSS and current unit/e2e assertion census; latest 20 open issues and latest 30 all-state A2A messages checked immediately before creation on 2026-07-29. No equivalent open defect or competing claim found.

Retrieval Hint: Workstation dock tab header body mounted drag proxy transparent background content text strip