The twin pane is DOM: scrollable, no twin can vanish - #10
Merged
Conversation
The pane was the one part of the page that is a variable-height nested
tree with per-node collapse -- which a browser already knows how to lay
out, scroll and hit-test. It is now a scrollable <div> positioned over
the canvas frame; the canvas keeps everything else (header, channels,
pools, arcs) and draws only the pane's frame and empty-state.
* ~320 lines of hand-rolled card/agent/sparkline drawing and
hit-testing replaced by markup + CSS; sparklines are inline SVG fed
from the same fake-data functions (still placeholder until #8).
* the visibility contract survives: the pane publishes each visible
card's rect onto `tw._rect` in canvas coordinates, null when
scrolled out -- same meaning it had when the layout dropped cards.
* constraints held: no jumping (scrollTop survives rebuilds, plain
birth order, gone twins fade in place), no auto-scroll on a new
twin, newly-seen twins still start collapsed.
* full twin id rides the title tooltip; state pill, initializing
pulse, stream-pulse ring and the closed marker all carried over.
Verified against a live broker with four twins across two sessions at a
1280x620 viewport: expand, scroll to the last strip, collapse -- and the
recording tests still pass (12). VERSION 0.8.0.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* 'collapse all' / 'expand all' chip in the pane header (twin level);
an 'agents' chip per expanded card toggles that twin's agent blocks
at once. Agents now start collapsed, like the twins themselves.
* scroll cues: a thin styled scrollbar plus a subtle edge gradient at
whichever end has more content -- shown only when there is any.
* 'Endpoint Pools' is 'Resource Pools', and each pool title is a
link to the task dispatcher's surface (`.../task_dispatcher/pools`;
its Explorer page once one exists) -- the pools are its, after all.
Verified live: four twins, bulk toggles both directions, cues appear
only on overflow, the pool link lands on the dispatcher listing.
VERSION 0.8.1.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The all-twins chip reads `twins ▸/▾`, same as the per-card agents chip. Native scrollbars are overlay-style on current desktops and hide themselves, so the pane hides them for real and draws its own 3px position thumb -- always present when there is overflow, wider on hover, draggable. VERSION 0.8.2. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Moved into the gutter between the cards and the Digital Twins frame, and brightened -- flush on the cards' right edge it read as part of their border. VERSION 0.8.3. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This was referenced Aug 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #6 (retarget to devel when that merges). Implements the decision from the twin-pane discussion: the pane is a variable-height nested tree with per-node collapse, so it moved from canvas to a scrollable DOM overlay instead of hand-rolling canvas scrolling.
+N morehint) — on small windows, expanding one twin hid a sibling entirely.tw._rectstill published per visible card in canvas coordinates (null when scrolled out); scrollTop survives rebuilds; plain birth order, gone twins fade in place; no auto-scroll on a new twin; fresh twins start collapsed. Pane title renamed to "Digital Twins" (on Changed the UI to better match the different abstractions #6).🤖 Generated with Claude Code