Optionalfooter: HTMLElement
Optional element docked at the rail's bottom (e.g. the perf readout).
Private ReadonlyrootPrivate ReadonlycontainerPrivate ReadonlyitemsPrivate ReadonlybuttonsPrivate ReadonlyoverlayFlyout + panel-popover lifecycle (only one open at a time).
Private ReadonlydisposeLong-press → the same context popovers right-click opens (touch).
Private OptionalhintPrivate OptionalhintPrivate OptionalhintPrivate OptionalidlePrivate OptionalrefreshPrivatedisposedPrivatecollapsedPrivate Optional ReadonlyfooterOptional element docked at the rail's bottom (e.g. the perf readout).
Private ReadonlyonPrivate ReadonlyonPrivate ReadonlyonPrivate ReadonlyonPrivate ReadonlyonPrivatebuildThe chevron handle that collapses the rail to a stub and expands it back.
Collapse to just the handle, or expand back to the full rail.
PrivatebuildBuild one rail button, including its tooltip and flyout/popover wiring.
PrivatesafeRun an item's optional render hook fail-soft — a throwing hook must not
abort the refresh loop for the other buttons (matches the guarded
activate/isActive callbacks elsewhere in this class).
PrivatewakeBring the rail to full opacity and restart the idle-fade countdown.
PrivatescheduleArm the idle timer that dims the rail once the pointer stays away.
PrivatesyncReflect fullscreen state — the rail hides (hover-to-reveal) in fullscreen.
PrivatescheduleCoalesce active-state refreshes to one per frame.
PrivateisFail-soft hidden predicate: a throwing predicate leaves the button shown.
PrivaterefreshRe-read every item's active/disabled state and repaint the buttons.
PrivateisResolve an item's active state from its own predicate, else from its panel.
PrivatemaybeShow the one-time 'controls live here' hint, unless it was seen before.
PrivatefadeAuto-hide path: fade the hint out, then dismiss (and persist) for real.
PrivatedismissRemove the hint for good and remember that the user has seen it.
PrivateopenOpen the 'context'-trigger popover of the rail button under target, if
any — the shared body of the right-click delegate and the touch
long-press. A disabled button or a button without such a popover is a
no-op (the native menu is still suppressed by the caller).
Apply side effects for a keydown handled by the official input router.
Close the transient flyout / popover without disposing the rail.
Tear down listeners, timers, the overlay and the rail DOM. Idempotent.
Build the rail DOM, wire the global listeners, and mount it in the viewer container. Items are rendered in the order given; the rail starts collapsed if the user left it that way last session.