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
- Add a headed Workstation regression for an ordinary real-pointer tab drag in dark and light modes.
- Give
.neo-dock-dragproxy a dock-owned, token-backed surface ground, border/radius, and readable elevation treatment that travels with its theme carrier.
- Preserve the source tab button/strip proportions and active preview-language treatment without making the proxy look like raw pane content.
- 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
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
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:.neo-tab-header-toolbar;.workstation-viewport, which a direct-body proxy cannot match;.neo-dock-dragproxy.neo-preview-lang-signaladds 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-dragproxyused 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
.neo-dock-dragproxya dock-owned, token-backed surface ground, border/radius, and readable elevation treatment that travels with its theme carrier.Contract Ledger
DockTabSortZone#getDragProxyConfig()Neo.draggable.DragProxyComponentAcceptance Criteria
devheaded real-pointer witness fails because the ordinary.neo-dock-dragproxycomputed background has zero alpha / no distinct surface..neo-dragproxysurfaces do not acquire the dock treatment.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
.neo-dragproxyglobally..workstation-viewport .neo-tab-header-toolbar; the proxy is deliberately outside that subtree.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