LearnNewsExamplesServices
Frontmatter
id13025
titlePopup terminal drop: end the infinite-canvas drag as a standalone window
stateClosed
labels
enhancementaiarchitecture
assigneesneo-gpt
createdAtJun 13, 2026, 12:16 AM
updatedAtJun 21, 2026, 2:16 AM
githubUrlhttps://github.com/neomjs/neo/issues/13025
authorneo-fable
commentsCount4
parentIssue13012
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJun 13, 2026, 3:46 AM
milestoneHarness M2: First Neo Widget

Popup terminal drop: end the infinite-canvas drag as a standalone window

Closed v13.1.0/archive-v13-1-0-chunk-1 enhancementaiarchitecture
neo-fable
neo-fable commented on Jun 13, 2026, 12:16 AM

Context

Knowledge-capture + completion leaf under Epic #13012 (window-manager lane), filed from operator first-hand evidence (2026-06-12 planning session) so the frontier knowledge becomes substrate instead of dying in a maintained comment revision. The operator moved this lane's frontier three times in one evening — the canonical instruction to any claimer is therefore: start from the shipping source, not from lane descriptions.

The Problem — and what already works (operator-verified, first-hand)

The reference implementations are apps/colors and the apps/agentos prototype: main viewport, dashboard, 3 panes in a vbox layout. What ships TODAY, web standards only:

  1. Grab a pane header and drag vertically — grid-header-style DnD; the other panes slide-resort live.
  2. Drag ~50% over the viewport boundary → the pane converts to an OS popup window, and the drag CONTINUES inside the same drag operation. This is the magic: no release, no re-grab.
  3. Move that popup over the other connected app → it reintegrates as a pane there — same drag operation, slide-resort live in the target.
  4. Fully reversible: popup↔pane conversions back into the origin app, all within the first drag operation.

Why this is category-unique: the pane stays ONE live component instance in the shared App-Worker heap throughout; only its embodiment migrates between layout-child and OS-window mid-gesture. Architectures that serialize/rehydrate across process boundaries structurally cannot preserve the gesture. This is the M2/M4 demo language for the harness.

Substrate it rides on: Neo.manager.Window (the God View — live geometric map of all connected windows, getWindowAt(x, y) global screen-coordinate intersection testing) + Neo.main.addon.WindowPosition (high-frequency geometry updates) — the #8164#9498 infinite-canvas family (cross-window grid-column DnD shipped in the v13 window).

The Gap — THIS leaf: (A) popup as a terminal drop state

(Split executed 2026-06-12 per @neo-gpt's intake hold — the OS-window reintegration entry point (B) is now its own leaf: #13028. This body's "what already works" section remains the canonical knowledge capture for the whole lane.)

(A) Release the drag while outside any app viewport → the popup persists as a standalone window (today the gesture is designed to end in a pane). The smaller, claim-ready slice — one PR.

The Fix

Extend the existing choreography (do NOT greenfield): study the working gesture pipeline in apps/colors / apps/agentos + the drag stack below, then add the terminal-drop branch. Placement of any new primitives via structural-pre-flight at implementation.

Contract Ledger (surfaces per @neo-gpt's source-level intake analysis)

Target Surface Source of Authority Proposed Behavior Fallback Docs Evidence
Neo.draggable.dashboard.SortZone (drop semantics) shipping source: apps/colors + agentos prototype gesture pipeline NEW terminal branch: release outside every connected viewport → popup persists standalone (today: gesture resolves to a pane) in-viewport drop behavior unchanged (no pre-existing cancel-key path in these surfaces — see the DragDrop row's V-B-A correction) JSDoc on changed methods operator first-hand (2026-06-12); #9498 lineage
Neo.dashboard.Container (pane lifecycle) same origin pane removal finalized on terminal drop — no orphaned proxy/placeholder state n/a (bug-class guard) JSDoc same
Neo.main.addon.DragDrop (drag-end path) same out-of-viewport release recognized as a valid terminal, not a cancel in-viewport drop behavior unchanged. No pre-existing cancel-key path exists in these surfaces (Surface-Anchor V-B-A correction, @neo-gpt 2026-06-12 — prior row text wrongly asserted "ESC remains cancel"); a cancel affordance, if wanted, is a NEW sub-decision documented in the implementing PR, never a preserved behavior JSDoc same
Neo.manager.Window (popup registration) src/manager/Window.mjs terminally-dropped popup stays a registered first-class peer; the SHIPPED reintegration flow works from it unchanged JSDoc God-View source

Rows are altitude-honest: exact method-level shapes resolve at implementation from the shipping source (the claimer instruction stands); any surface drift found at implementation updates this Ledger before the PR.

Acceptance Criteria

  • Releasing the drag outside any connected viewport leaves the popup as a persistent standalone window (no snap-back, no orphaned proxy state).
  • The popup remains a first-class peer: subsequent pane-reintegration (existing shipped flow) works from it.
  • Existing in-viewport gesture behavior is regression-covered (the continuous-drag conversions stay intact).
  • Contract Ledger above reconciled against the implemented surfaces in the PR.

Out of Scope

  • (B) OS-window drag reintegration → #13028 (its own leaf; the no-pointer-events detection problem + Electron move events live there).
  • Snap/dock zone visuals (possible follow-up leaf; not operator-named gap).
  • The Electron build root itself (separate #13012 leaf).
  • Fleet-manager surfaces (#13015).

Related

  • Parent: Epic #13012 (window-manager lane; plan-of-record rev 11 carries the lane history).
  • Substrate lineage: #8164 (window geometry tracking), #9498 (infinite-canvas cross-window column DnD), src/manager/Window.mjs, src/main/addon/WindowPosition.mjs.
  • Composition target: M2 "pane becomes its own window" (milestone 5) + M4 wow arc.
  • Lane state: open; @neo-fable-clio holds a named reload point (post-#13016-re-review + #13018-PR) — any peer may claim sooner, no yield needed.

Origin Session ID: c4caff26-d818-486b-8663-19b85ac3cc11 Retrieval Hint: "infinite canvas window choreography popup terminal drop OS-window drag reintegration continuous drag embodiment migration colors agentos"

tobiu referenced in commit 5a29ea6 - "feat(dashboard): preserve terminal popup drops (#13025) (#13053)" on Jun 13, 2026, 3:46 AM
tobiu closed this issue on Jun 13, 2026, 3:46 AM