LearnNewsExamplesServices
Frontmatter
id12955
titleRight-edge column drag: sliding headers shrink + date-header alignment flips (operator-observed)
stateClosed
labels
bugaigrid
assigneesneo-fable-clio
createdAtJun 12, 2026, 5:55 AM
updatedAtJun 12, 2026, 6:47 AM
githubUrlhttps://github.com/neomjs/neo/issues/12955
authorneo-fable-clio
commentsCount1
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJun 12, 2026, 6:47 AM

Right-edge column drag: sliding headers shrink + date-header alignment flips (operator-observed)

neo-fable-clio
neo-fable-clio commented on Jun 12, 2026, 5:55 AM

Context

Operator visual report (2026-06-12 ~03:50Z, during the v13 wrap, devindex): grabbing the second-last column and dragging it to the right edge produces two defects. Filed with the operator's verbatim observation as the primary evidence plus an instrumented non-repro baseline on merged dev (data below) — the delta between the two surfaces is itself diagnostic.

Release classification: #12883 gate-trail pending repro confirmation on merged dev — if it reproduces there, it joins the L4 gate; if it only reproduces on a pre-merge tree, it is evidence the #12938 family fixed it.

The Problem (operator's observation, verbatim symptoms)

  1. Header/cell width desync: dragging the second-last column to the right edge, the headers of the sliding columns shrink — and stay shrunken when switching positions back within the same drag op. Cells keep their width, so header and cell widths are out of sync.
  2. Date-header alignment flip: Updated has its header text right-aligned initially; while sliding and after the drop it is left-aligned.

Instrumented baseline (merged dev d6d6a1c75, fresh Chromium session, :8091 own-checkout server)

Scripted gesture: scroll center to right end → grab 2010 (second-last of 37) → drag onto Updated's right edge (switch confirmed: positions swapped mid-drag, header AND cell layers) → drag back to origin within the same op (order restored) → drop.

  • No width change at any phase: every visible header held its width (years 80px, Updated 120px) through switch, switch-back, and drop; row-0 cell widths identical and x-aligned with headers throughout. After-drop state == before state, exactly.
  • Alignment anomaly with a twist: Updated's header reads justifyContent: start (left) from initial render on merged dev — the operator's "right-aligned initially" state does not exist on this tree/probe. Either (a) the operator's :8080 serves a tree that differs from merged dev (his initial state is the correct one and merged dev ALREADY lost the right-alignment — i.e. the "after" state shipped as the permanent state), or (b) the justifyContent probe is too coarse (real alignment may live in .neo-button-text text-align / a neo-align-* cls) — both need one falsifier each.

Open falsifiers (cheap, ordered)

  1. Tree check (operator, one minute): pull merged dev on the :8080 checkout, hard-reload a FRESH tab, repeat the gesture. Persists → real on dev, joins the L4 gate. Gone → the #12938 family (drag-end scrollLeft re-sync etc.) already fixed it; close with that attribution. (Taint note: the older devindex tab carries the #12946 wedge + probe debris — fresh tab essential.)
  2. Alignment probe refinement: read getComputedStyle(.neo-button-text).textAlign + the button's full cls list on Updated before/during/after — decides observation (a) vs (b) above; if dev's initial render really lost date-header right-alignment, that is a separate one-line-class regression worth its own fix regardless of the drag.
  3. Overdrag leg: the scripted drag stayed inside the toolbar; the operator's "right edge" may engage the overdrag auto-scroll boundary — script the drag to hold AT the grid's right boundary (overdrag armed) and re-measure widths during scroll-while-dragging.

The Architectural Reality (candidate seams, unverified)

  • Header buttons re-render during SortZone switchItems; width comes from column.width applied to the button — a shrink that persists within one drag op suggests the in-flight proxy/placeholder styling (drag-start wrapperStyle handling) rather than column-model mutation, since the engine's widths verified stable under the scripted switch.
  • neo-last-column handling (Row.mjs applyRendererOutput :232-236, plus the d2759166f multi-sub-grid cls fix) flips on the last↔second-last boundary — exactly the columns in play.

Acceptance Criteria

  • Falsifier 1 executed: reproduces-on-merged-dev verdict recorded.
  • If reproducing: root cause + fix for the width shrink (headers == cells at every drag phase); alignment stable through drag lifecycle.
  • If not reproducing: closed with attribution to the fixing change + the initial-alignment question (falsifier 2) dispositioned separately.

Out of Scope

  • The locked-end zero-rows defect (#12954) and the update-race family (#12939/#12946).

Related

  • Gate family: #12883 · Adjacent fixes: PR #12938 (drag-end scrollLeft re-sync), d2759166f (last-column cls across sub-grids) · Surfaces: devindex (operator), instrumented baseline this session.

Live latest-open sweep: checked latest 10+20 open issues at 2026-06-12T03:58Z; no equivalent. A2A in-flight sweep: clean.

Origin Session ID: c29b5ccc-d711-4cde-8401-32d1e4bbc4f1

Retrieval Hint: "header width shrink drag right edge second-last column date header alignment flip"

tobiu referenced in commit 6177b3d - "fix: pin header toolbar scroll extent during column drags (#12955) (#12961) on Jun 12, 2026, 6:47 AM
tobiu closed this issue on Jun 12, 2026, 6:47 AM