LearnNewsExamplesServices
Frontmatter
id14929
titleAnimated dock re-layout: FLIP transitions on every committed dockZone operation
stateOpen
labels
enhancementaiarchitecture
assigneesneo-fable-clio
createdAt6:47 AM
updatedAt7:46 AM
githubUrlhttps://github.com/neomjs/neo/issues/14929
authorneo-fable-clio
commentsCount1
parentIssue13158
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]

Animated dock re-layout: FLIP transitions on every committed dockZone operation

Open Backlog/active-chunk-4 enhancementaiarchitecture
neo-fable-clio
neo-fable-clio commented on 6:47 AM

Context

Operator directive (2026-07-10, live session): the drag → drop-target → animated re-layout loop is PRIO 0 for the docking epic — Qt-ADS is the designated capability floor (ADR 0029 §1 already names it "the capability bar"), and a committed dock operation that snaps instead of gliding reads as below that floor on sight. Gap confirmed by tree audit this session: none of the 46 #13158 decomposition leaves owns the commit-animation mechanism; the Demo-A showcase AC ("every shipped v1 op appears with animated transitions", #14589) presumes a mechanism that does not exist.

The Problem

Today every committed operation — human drop, rail restore click, NL execute_dock_operation, tour beat — flows through the reducer-container loop (applyDockZoneOperationonDockZoneDocumentChangeDockLayoutAdapter.project() → re-render) and the projected tree swaps instantly. The dock feels like a page refresh, not a layout choreography. The drag preview tier animates (the DockPreview affordances transition at 120ms), but the commit — the moment that matters — does not. This is the single biggest visible-quality gap between the shipped substrate and the Qt-ADS floor.

The Architectural Reality

  • The sanctioned mutation path is ADR 0029 §2.1's reducer-container pattern: interaction surfaces emit descriptors; the reducer commits; the view-sync re-projects. Animation must ride the view-sync seam (onDockZoneDocumentChange → re-projection) as a presentation-only layer — document truth never waits on motion.
  • FLIP (First-Last-Invert-Play) is the right class of mechanism: capture pre-op geometry of surviving panes (First), let the re-projection land (Last), invert via CSS transforms, play the transition. Surviving-instance identity matters: reconcileTabs()-style instance preservation (the DockRail precedent) and the update-collision bookkeeping fix (#14911/PR #14923) are the substrate that makes FLIP correlation possible.
  • Placement (structural pre-flight, sibling fast-path): a new src/dashboard/ module beside DockLayoutAdapter/DockSplitter (e.g. DockFlipAnimator.mjs) + an opt-in hook at the workspace re-projection call site. Main-thread DOM measurement rides the existing Neo.main.DomAccess rect surfaces (get_dom_rect class) — no parallel measurement system.
  • Reduced-motion: prefers-reduced-motion: reduce renders the instant path (tree line I2's compliance bar); the tour runner's record mode already refuses to capture under reduced motion, so takes always show the choreography.

The Fix

One PR: the FLIP layer + workspace integration + motion proof:

  1. DockFlipAnimator (or equivalent) — captures First rects for surviving projected nodes keyed by stable identity (item ids / node ids), applies invert transforms post-projection, plays with the design language's easing (the Demo-A artifact fixes 240–280ms standard-decelerate), cleans up on transition end; fail-safe = instant landing (animation errors must never wedge layout).
  2. Opt-in wiring at the workspace view-sync seam (examples/dashboard/dock MainContainer + the dockdemo childapp both adopt it) — one config, zero reducer coupling.
  3. Reduced-motion instant path + destroy-safety mid-transition (the #14923 corpse class must not return via animation clones).
  4. Motion evidence: observe_motion assertions on the demo path (no-jank per the #14589 AC); unit specs for rect-correlation and fail-safe behavior.

Acceptance Criteria

  • Every committed operation class (splitNode, addTab/moveItem, resizeSplit, setItemAutoHidden, closeItem) animates the surviving panes' geometry change; entering panes grow from their arrival edge, per the reviewed design artifact's motion notes.
  • Presentation-only: the committed document and all specs/e2e that assert on it are byte-identical with animation on or off.
  • prefers-reduced-motion renders the instant path; the tour record precondition still guarantees motion-on for takes.
  • Mid-transition destroy leaves zero DOM residue (no #14911 regression via animation).
  • observe_motion no-jank evidence on the Demo-A tour path; unit coverage for correlation + fail-safe.
  • Consumed by #14589 (its animated-transitions AC binds to this mechanism) and by human drops in examples/dashboard/dock.
  • Cross-family review before merge.

Out of Scope

  • Drag-preview affordance visuals + the human-drag showcase beat (sibling leaf, filed alongside).
  • Cross-window FLIP continuity (detach/reattach animation across OS windows — later leaf, after the E/C tranches).
  • Any reducer/document-schema change (presentation tier only).

Avoided Traps

  • Animating via vdom-diff side effects or per-scene CSS hacks in the demo: demo-local transitions would fake the story for the camera while human drops still snap — the exact mechanically-false-story class review keeps convicting. One mechanism serves both.
  • Coupling correctness to motion: step settledness (tour runner) and document truth stay synchronous; animation is fire-and-forget presentation.

Decision Record impact

aligned-with ADR 0029 — rides the §2.1 view-sync seam; no authority change.

Related: parent #13158 · consumers #14589 / examples/dashboard/dock · substrate #14906 (instance-preserving reconcile), #14923 (destroy bookkeeping) · sibling: the human-drag showcase/polish leaf (filed with this one) · boundary #14913 (cross-zone drop regression, claimed).

Live latest-open sweep: checked latest 20 open issues at 2026-07-10T04:4xZ; no equivalent (nearest: #14913 regression, #14789 fusion demo). A2A in-flight claim sweep: herd window scanned same-turn; no overlapping claim (Grace's #14913 claim = the cross-zone drop regression, different scope).

Origin Session ID: 54156254-a1a8-40b3-ba22-86e7d2a1bf81 Retrieval Hint: "FLIP animated dock re-layout committed operation view-sync presentation-only"

tobiu referenced in commit e2d39c2 - "feat(ai): deterministic tour-runner + Demo-A dock-choreography screenplay (#14640) (#14912) on 7:48 AM