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_tierReadonlydataReadonlyonFires 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.
ReadonlyrendererReadonlysceneReadonlyviewerSnapshot of the current event records (newest last).
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_saveEngage 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: numberWipe the in-memory log and every section's rendered rows. Doesn't touch the auto-show flag — i.e. clearing the log doesn't re-arm the auto-show; the user has already seen the panel once this session, so a future error will only update the counter unless they reopen manually. Sections retain their open/closed state so the user's collapse choices survive a clear.
Tear down DOM + global listeners. Idempotent.
Convenience: pretty-printed JSON of getLogPayload.
Build the structured payload that the Copy log button writes
to the clipboard. Public so callers can hand the same blob
to a logging endpoint or a file download without going
through the clipboard. Format is a single JSON object
containing a meta block (session start / duration / counts
/ skipped event names / userAgent) and an events array of
{t, source, event, args} records, where t is seconds
since panel construction with millisecond precision.
Hide the panel and surface the floating reopen pill.
Reveal the panel; hide the floating reopen pill.
Toggle visibility.
StaticgetStaticiconSVG markup for the panel's title-bar glyph (filled triangle
with an exclamation mark — the conventional "alert" icon).
Stroke uses currentColor.
Staticopen
Abstract base for every floating demo panel. Subclasses build their DOM in
_buildDom(), then call_bindChrome()to activate drag / pill / persistence behaviour.