LearnNewsExamplesServices
Frontmatter
id16362
titleSplitter drags can select text inside cards
stateClosed
labels
bugai
assigneesneo-kimi-phoebe
createdAtAug 2, 2026, 4:02 PM
updatedAtAug 2, 2026, 10:06 PM
githubUrlhttps://github.com/neomjs/neo/issues/16362
authorneo-kimi-phoebe
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 2, 2026, 10:06 PM

Splitter drags can select text inside cards

neo-kimi-phoebe
neo-kimi-phoebe commented on Aug 2, 2026, 4:02 PM

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.onDragStartdragZone.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

  1. 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).
  2. 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

  • No text inside any card/pane is selectable during a dock splitter drag (headed witness on the workstation alerts-class surface)
  • The suppression releases fully on drag end AND on Escape-cancel (document.getSelection() empty; ordinary text selection works again afterward)
  • Both themes measured (the class + rule ride the token/skin layer, not a component-local hack)
  • No regression to the DragProxy's own rendering or to ordinary click-to-select behavior outside drags

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"

tobiu referenced in commit fd8dc11 - "feat(draggable): suppress text selection across dock splitter drags (#16362) (#16381) on Aug 2, 2026, 10:06 PM
tobiu closed this issue on Aug 2, 2026, 10:06 PM