LearnNewsExamplesServices
Frontmatter
id17409
titleHeader buttons stay at their pre-drag positions for the whole resize drag
stateClosed
labels
bugaigrid
assigneesneo-opus-grace
createdAtAug 20, 2026, 12:05 AM
updatedAtAug 20, 2026, 4:34 PM
githubUrlhttps://github.com/neomjs/neo/issues/17409
authorneo-opus-grace
commentsCount4
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 20, 2026, 4:34 PM

Header buttons stay at their pre-drag positions for the whole resize drag

neo-opus-grace
neo-opus-grace commented on Aug 20, 2026, 12:05 AM

Context

Operator report, 2026-08-19: column drag-and-drop and resizing break in the DevIndex app as it runs inside neomjs/neo. This is an investigation ticket — the observation is the operator's own, and the mechanism is not yet known.

It is filed with negative results attached so whoever picks it up starts from a narrowed search space rather than repeating the gestures already measured. neomjs/neo#17401 fixed a different DevIndex grid defect (component cells not following their record on scroll); this one is separate and survives that fix.

Live latest-open sweep: latest 20 open issues at 2026-08-19T22:04Z, no equivalent. A2A claim sweep: no overlapping lane.

What was measured and did NOT reproduce

All in the GPU e2e harness (playwright.config.e2e.mjs, 1920x1080 Chromium, ANGLE Metal), driving /apps/devindex/ from the neo checkout, comparing visible header rects against first-row cell rects with the off-screen columns clipped out:

gesture result
Resize each of User, Total, Rank, Impact, Activity, Top Repo via the right-edge handle widths applied (e.g. User 250→387); header/cell mismatches [] before and after, every column
Column reorder — drag Total onto Rank at button centre order changed #, Rank, User, Total…#, Total, Rank, User…; mismatches []
Reorder, then resize User User 250→397, order preserved; mismatches [] at baseline, after the drag, and after the resize

So the plain single-body reorder and resize paths are not broken on this checkout, and neither is their composition in that order.

A measurement caveat worth inheriting: the in-app browser pane runs at a 0x0 hidden viewport, so a grid renders no rows there and every reading taken through it is an artifact — the working examples/grid/bigData reads identically to a broken grid. Use the e2e harness. Likewise, off-screen columns legitimately have no rendered cell under column virtualization; a rect comparison without a viewport clip reports ~25 false mismatches.

Candidate directions, none yet tested

  1. Cross-body / locked-region drag. DevIndex declares no locked columns, so it starts single-body, but dragging a column into the start/end region creates one. ColumnCrossBodyDnD.spec.mjs and LockedDnDDuplication.spec.mjs exist and drive other apps. Resizing after a column has been locked is untested here.
  2. Resizing a locked column, or one adjacent to a region boundary.
  3. Overdrag scrollColumnOverdragScroll.spec.mjs covers the gesture elsewhere; dragging past the viewport edge with DevIndex's ~30 columns and horizontal virtualization is untested.
  4. After a horizontal scroll, when the mounted column range no longer starts at 0.
  5. The dynamic column set. GridContainer#buildDynamicColumns assigns this.columns after super.construct(), and afterSetDataMode rewrites every year column's dataField in place. A drag or resize interleaved with a data-mode switch is untested.

The Architectural Reality

  • apps/devindex/view/home/GridContainer.mjs — columns assigned post-construct; bufferColumnRange: 1, bufferRowRange: 1; ~30 columns including 17 year columns
  • src/grid/header/plugin/Resizable.mjs — resize is armed only from .neo-resizable; the handle is injected on hover
  • src/grid/header/Toolbar.mjscreateSortZone sets ignoreDragSelector: '.neo-resizable', so reorder and resize provably never share a gesture
  • src/grid/View.mjs — the multi-body orchestrator; syncBodies drives bodyStart / body / bodyEnd

Existing coverage drives examples/grid/bigData and examples/grid/lockedColumns, never DevIndex's column shape.

Acceptance Criteria

  • The failing gesture is named exactly — which columns, which order, which region — and reproduced in the e2e harness before any fix
  • A spec reproduces it on a neo-owned fixture; DevIndex app tests do not belong in this repository
  • The spec fails on the unfixed tree and passes after, demonstrated in both directions
  • The negative results above are re-run at the fix commit, so a fix that breaks a previously-working gesture is caught

Out of Scope

  • neomjs/neo#17401 — component cells not following their record on scroll; separate defect, separate fix
  • The neomjs/devindex repository's own grid faults, which trace to it running neo.mjs@13.1.0 without either resize fix

Related

  • neomjs/neo#17401 — the scroll-recycle defect in the same grid
  • neomjs/neo#17289, neomjs/neo#17327 — the two resize defects, both verified only on plain-column grids

Origin Session ID: 44746e37-a5f9-44c4-8c9d-f664247f0e38

tobiu referenced in commit 40ceaa1 - "fix(grid): the header tracks a resize drag instead of snapping on drop (#17409) (#17417) on Aug 20, 2026, 4:34 PM
tobiu closed this issue on Aug 20, 2026, 4:34 PM