LearnNewsExamplesServices
Frontmatter
id19588
titleGrid sparkline cells stay blank in a popup for rows recycled after the pane moved there
stateClosed
labels
bugaigriddashboard
assigneesneo-gpt-emmy
createdAtOct 11, 2026, 4:10 AM
updatedAtOct 11, 2026, 5:08 AM
githubUrlhttps://github.com/neomjs/neo/issues/19588
authorneo-fable
commentsCount2
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[ ] 15252 The five-beat multi-window wow demo: recorded journey on the workstation
closedAtOct 11, 2026, 5:08 AM

Grid sparkline cells stay blank in a popup for rows recycled after the pane moved there

Closed v13.2.0/archive-v13-2-0-chunk-25 bugaigriddashboard
neo-fable
neo-fable commented on Oct 11, 2026, 4:10 AM

Context

The operator, 2026-10-11 02:0xZ, watching the film take at PR #19587's head live on the stage display: "offscreen canvases do not show inside the grid inside the popup." Confirmed on the recording (take 2026-10-11T02-05-48-526Z, the matrix window's frames at 90.5–97.5 s): after the Workstation's 100k-row matrix (Workstation.view.ScalePane, type: 'sparkline' column — the framework's OffscreenCanvas path) is torn out into its own window (?popout=scale) and that window is grown, the rows that were mounted at the move paint their sparklines; after the jump to row 50000 and the drag-scroll throw, every recycled row shows an empty Living signal column while the other columns (text, progress bars, the component column's buttons) render. The same grid in the main window paints its sparklines on scroll (take 2026-10-11T00-55-16-516Z, the strokes at 90–95 s).

Observation, separated from inference: observed = blank sparkline cells for rows that enter the viewport after the move; the rows present at the move paint. Inferred (unverified) = the incremental cell path (row recycling → the sparkline cell's canvas registration / repaint with the Canvas worker) resolves the window or the canvas handle of the pane's former window, while the full re-mount at the move registers the visible cells in the popup's document correctly.

The Problem

A torn-out grid is a first-class Workstation state (the dock's vessels), and the sparkline column is the grid's OffscreenCanvas showcase. In a vessel the column goes blank the moment the user scrolls — a visible defect in the product's most demonstrative pane, and the film's close (#19584) cannot be shot until it paints.

The Architectural Reality

  • src/grid/column/Sparkline.mjs (the column), src/component/Sparkline.mjs (the cell component) and src/canvas/Sparkline.mjs (the Canvas-worker side) own the path; Neo.grid.Body recycles row/cell instances on scroll (createRowPool, the column pool). The pane keeps its instance across the tear-out (the dock's claim, proven by the film's identity checks); its DOM is re-created in the popup's document.
  • The tear-out and the popup are the dock's (src/dashboard/dock/*, VesselWorkspace); the film's vessel-resize grow (PR #19587) only moves and resizes the frame through the owner-granted routes — the blank cells follow the scroll, not the resize (the rows mounted before the jump kept their paint through the grow).

The Fix

Owner's investigation, with a falsifier first: a whitebox e2e that tears the scale pane out (the existing tear-out executor or the dock API), scrolls the grid in the vessel, and asserts per recycled sparkline cell that the Canvas worker received its registration and paint for the popup's window (or that the cell's canvas has a non-blank bitmap via the popup page). Then fix where the incremental path binds the window / canvas handle. Not a film change.

Acceptance Criteria

  • A whitebox e2e reproduces the blank recycled cells in a vessel at the current head and passes after the fix: after a scroll in the torn-out matrix, every visible sparkline cell paints (Canvas-worker receipt or a non-blank bitmap in the popup page).
  • The main-window path is unchanged (the existing film witness's canvas-update cue and the dense tour stay green).
  • Post-merge, deferred to #15252: a film take at a head containing this fix shows the Living signal column painted through the midpoint jump and the throw in the matrix window.

Out of Scope

  • The film's choreography (#19584 / PR #19587) and the vessel's road home (two defect-notes, 2026-10-11).
  • #19585 (the SharedCanvas pointer origin after resize): a different canvas symptom.

Related

#15252 (the film; its close is blocked on this) · #19584 / PR #19587 (the close that exposed it) · #19585 / PR #19586 (SharedCanvas pointer origin — Emmy's adjacent canvas lane)

handoff: @neo-gpt-emmy — the canvas lane is hers tonight, with budget; decline by reply and it returns to the board.

Live latest-open sweep: the latest 20 open issues at 02:10Z, no equivalent (#19585 is the pointer origin, #19583 the road home). A2A: the defect-note of 02:10Z (mine); no claim. MC sweep: no prior decision on sparklines in a vessel (the film's canvas cue only ever ran in the main window). Own-assignment sweep: #15252, #19584 — the parent and the exposing leaf.

Origin Session ID: 9f6cd919-c61d-434d-a709-c700109af56b

Retrieval Hint: "sparkline OffscreenCanvas blank in popup vessel after scroll recycled rows torn-out grid"

tobiu referenced in commit f1fbfe5 - "fix(canvas): connect the target window before transfer (#19588) (#19589)" on Oct 11, 2026, 5:08 AM
tobiu closed this issue on Oct 11, 2026, 5:08 AM