Context
Operator observation during a headed workstation session (2026-08-02): dragging a dock splitter can select text inside cards — specifically the "Priority Signals" card content (the Priority-Alerts-class pane surface). Filed as a follow-up from the #16353 grid-repaint investigation at the operator's direction — deliberately NOT folded into that ticket's scope.
The Problem
A splitter drag is a mouse-down + move gesture that crosses pane content. With no document-level text-selection suppression while the drag is active, the gesture doubles as a text-selection sweep across whatever the pointer crosses — headers, card bodies, terminals. The visual result is exactly what a flagship recording cannot show: highlighted text flashing inside cards while the layout is being rearranged.
Verified at source (2026-08-02): neither src/dashboard/DockSplitter.mjs nor src/draggable/DragZone.mjs carries any user-select handling across the drag lifecycle (dragStartState bookkeeping only). Existing guards are local and static: resources/scss/src/dashboard/Container.scss:84 sets user-select: none on the dashboard container itself, and DragProxyComponent.scss forces it on the proxy — but card content inside panes (ordinary component DOM, e.g. alert cards, log consoles) is not covered during an active drag.
The Architectural Reality
DockSplitter.onDragStart → dragZone.dragStart(data) (DockSplitter.mjs:360); onDragEnd tears the gesture down (:294, :320). These two points are the natural suppression bracket.
- The draggable layer already owns a global-style precedent: the proxy's forced
user-select: none !important (DragProxyComponent.scss:3-18). A drag-active class on document.body (added at drag start, removed at drag end) is the same mechanism generalized.
- The film's evidence contract applies: any fix needs a headed witness, and a screenplay delay is not a fix.
The Fix
- Suppress text selection document-wide while a dock drag is active: add a body-level class (e.g.
neo-drag-active) in the splitter/drag-zone start path and remove it on drag end (and on any abort path — Escape-cancel included), with user-select: none scoped to that class in the theme-layer SCSS (both skins, measured).
- Headed whitebox witness: begin a real splitter drag across the alerts/card surface, move over the card text, release —
document.getSelection().toString() must be empty and no selection highlight may persist. Assert both mid-drag and post-release states.
Acceptance Criteria
Out of Scope
- The grid-repaint investigation (#16353) and the preview witnesses (#16341)
- Re-styling card content or changing what is selectable outside drag gestures
- A screenplay/film pacing workaround
Related
- #16353 (sibling friction, separate scope) · #15252 (film readiness — this class of visual artifact is a take-killer)
Live latest-open sweep: checked latest 20 open issues at 2026-08-02T13:5xZ; the only selection/splitter match is #16353 (separate scope). Source grep confirms no existing drag-lifecycle user-select handling.
Origin Session ID: 1a7e3f91-8356-48bb-a353-9fd7da2647f5
Retrieval Hint: "splitter drag selects card text user-select drag-active suppression"
Context
Operator observation during a headed workstation session (2026-08-02): dragging a dock splitter can select text inside cards — specifically the "Priority Signals" card content (the Priority-Alerts-class pane surface). Filed as a follow-up from the #16353 grid-repaint investigation at the operator's direction — deliberately NOT folded into that ticket's scope.
The Problem
A splitter drag is a mouse-down + move gesture that crosses pane content. With no document-level text-selection suppression while the drag is active, the gesture doubles as a text-selection sweep across whatever the pointer crosses — headers, card bodies, terminals. The visual result is exactly what a flagship recording cannot show: highlighted text flashing inside cards while the layout is being rearranged.
Verified at source (2026-08-02): neither
src/dashboard/DockSplitter.mjsnorsrc/draggable/DragZone.mjscarries anyuser-selecthandling across the drag lifecycle (dragStartStatebookkeeping only). Existing guards are local and static:resources/scss/src/dashboard/Container.scss:84setsuser-select: noneon the dashboard container itself, andDragProxyComponent.scssforces it on the proxy — but card content inside panes (ordinary component DOM, e.g. alert cards, log consoles) is not covered during an active drag.The Architectural Reality
DockSplitter.onDragStart→dragZone.dragStart(data)(DockSplitter.mjs:360);onDragEndtears the gesture down (:294,:320). These two points are the natural suppression bracket.user-select: none !important(DragProxyComponent.scss:3-18). A drag-active class ondocument.body(added at drag start, removed at drag end) is the same mechanism generalized.The Fix
neo-drag-active) in the splitter/drag-zone start path and remove it on drag end (and on any abort path — Escape-cancel included), withuser-select: nonescoped to that class in the theme-layer SCSS (both skins, measured).document.getSelection().toString()must be empty and no selection highlight may persist. Assert both mid-drag and post-release states.Acceptance Criteria
document.getSelection()empty; ordinary text selection works again afterward)Out of Scope
Related
Live latest-open sweep: checked latest 20 open issues at 2026-08-02T13:5xZ; the only selection/splitter match is #16353 (separate scope). Source grep confirms no existing drag-lifecycle user-select handling.
Origin Session ID: 1a7e3f91-8356-48bb-a353-9fd7da2647f5
Retrieval Hint: "splitter drag selects card text user-select drag-active suppression"