Protected Readonly_classProtected_closeClose button (clicked → hide(), surfaces the pill).
Protected Readonly_containerProtected_destroyedProtected_headerDrag handle inside the panel — usually the title row.
Protected Readonly_minProtected Readonly_minProtected Readonly_modalProtected_panelRoot panel element. Populated by subclass in _buildDom().
Protected_pillFloating "reopen" pill shown while the panel is hidden.
Protected Readonly_resizableProtected Readonly_storageProtected Readonly_tierThe scalar field currently driving slice / iso techniques. Public — but mutate via setGrids so the panel can resync its derived state (value-range, slider bounds, etc).
ReadonlyonFires while the user drags the panel (one notification per
pointermove during a drag) and once when the drag ends.
Drag changes the panel's CSS left / top but never its
size, so a ResizeObserver on any descendant element never
sees it. Subclasses or hosts that need to track the panel's
viewport position — for example a View
embedded in the body whose shared WebGL canvas must follow
the panel — should subscribe to this and re-read the
panel's bounding rect.
ReadonlyonFires when show() / hide() toggles the panel's visibility.
ReadonlysceneHeatmap SceneModel the panel currently shows, or null.
Optional vector field — null when streamlines aren't available.
true when the panel is mounted and visible (pill hidden).
Protected_bindWire the shared chrome behaviour onto the DOM the subclass built. Idempotent — calling twice is a no-op.
Protected_bindInject eight invisible drag handles (4 edges + 4 corners)
into _panel and wire pointer events. Each handle pins the
panel to absolute left / top on pointerdown (so subsequent
size + position writes take effect over any CSS that uses
right / bottom), then writes new width / height —
and, for north / west edges, new left / top — on
pointermove. onLayoutChanged fires per move and at drag-end;
the saved layout is updated on drag-end.
min-width / min-height enforced from _minWidth /
_minHeight; max-width / max-height are released by
setting them to "none" inline so user-driven size is not
clipped by CSS bounds like max-height: calc(100vh - 32px).
Protected_buildSubclass populates _panel, _pill, _header, _closeBtn
here, and appends _panel + _pill to _container. Called
exactly once, before _bindChrome.
Protected_clampProtected_restoreProtected_saveProtected_wireEngage the header drag from an external pointerdown / move
event so the panel begins following ev immediately. Used by
the drag-to-undock gesture on docked View cells — the cell's
own pointer listener detects motion-past-threshold, replaces
the cell with this freshly-created floating panel, and hands
the live pointer over via this method.
The panel is reflowed so the pointer sits inside its header at
(panelOffsetX, panelOffsetY) from the panel's top-left. Then
setPointerCapture routes all subsequent pointermove /
pointerup events for this pointerId to the panel's own
header, where _bindChrome's existing listeners drive
the drag — no parallel drag loop required.
OptionalpanelOffsetX: numberOptionalpanelOffsetY: numberTear down DOM + global listeners. Idempotent.
Hide the panel and surface the floating reopen pill.
Swap the panel's data source. The first scalar array becomes the new grid; the first vector array (if any) becomes the new vectorGrid. The panel re-derives default value-range, slice-position bounds, isovalue range, etc., from the new field and re-bakes the active technique.
The WeakMap singleton key is updated to the new grid so a
subsequent panels.open("volumeOverlayPanel", {grid: ...})
call with the new grid reveals this panel rather than
constructing a second one.
Reveal the panel; hide the floating reopen pill.
Toggle visibility.
StaticgetStaticgetStaticiconTitle-bar glyph — a cube with a horizontal slice plane through it, the symbolic shorthand for "volume cross-section".
Staticopen
Floating Studio panel for slicing a VoxelGrid — axis-selector, in-axis position slider, colormap picker, value- range + opacity controls, slice stats, and a live colourbar legend. Owns the lifetime of the slice SceneModel it builds; each parameter change rebakes the slice.
Per-grid singleton: opening the panel a second time for the same grid reveals the existing instance rather than constructing a new one. Use the static getFor / openFor factories for that behaviour.