Popover

Generic floating panel anchored to a trigger — Escape and click-outside close.

Preview

Live

<div class="ui-popover">
  <button type="button" class="btn ui-popover__trigger"
    aria-haspopup="dialog" aria-expanded="false">
    Open popover
  </button>
  <!-- Content typically portaled when open -->
  <div class="ui-popover__content motion-pop" role="dialog"
    aria-label="Quick actions" tabindex="-1">
    <p class="msg">Pin this packet or copy the summary.</p>
    <div class="actions">…</div>
  </div>
</div>

Variants

Content panel

.ui-popover__content — elevated surface for short actions or copy.

Drop-up

.is-drop-up flips transform-origin when placed above the trigger.

asChild trigger

React PopoverTrigger asChild merges props onto a single child (e.g. Button).

vs Filter

Filter is the specialized filter popover — use Popover for generic floating content.

See Filter.

Accessibility

  • Trigger uses aria-haspopup="dialog", aria-expanded, and aria-controls when open.
  • Content is role="dialog" with a required accessible label / aria-label.
  • Escape closes and returns focus to the trigger (React Popover).
  • Click / pointer outside dismisses the panel.
  • Initial focus moves into the content when opened.

API

HTML classes

Class Description
.ui-popover / .is-open Root wrapper (+ open stacking).
.ui-popover__trigger Trigger control class.
.ui-popover__content Floating panel (often portaled).
.motion-pop Entry motion (respects reduced motion).
.is-drop-up Placement above the trigger.

React props

From src/core/Popover.tsx — compound Popover* components.

Prop Type Default Description
open / defaultOpen boolean false Controlled / uncontrolled open state.
onOpenChange (open: boolean) => void Open state change callback.
asChild boolean false PopoverTrigger — merge onto child element.
label string PopoverContent — required dialog accessible name.
estimatedHeight number 240 Placement estimate (px).
minWidth number 200 Minimum content width (px).