Redpanda UIRedpanda UI

Popover

Displays rich content in a portal, triggered by a button.

Made by imskyleen

Installation

Loading component...

Positioning

Loading component...

Controlled

Loading component...

When to use

The Popover component displays rich content in a positioned overlay triggered by user interaction. Use this decision tree to determine when it's appropriate:

Usage

<Popover>
  <PopoverTrigger>Open Popover</PopoverTrigger>
  <PopoverContent>Popover Content</PopoverContent>
</Popover>

Examples

Date Picker Example

Loading component...

Props

Keyboard interactions

KeyAction
Enter / Space on PopoverTriggerToggles the popover open/closed.
Tab / Shift+TabCycles focus between focusable elements inside the popover.
EscapeCloses the popover and restores focus to the trigger.
Click outside PopoverContentCloses the popover.

Accessibility

  • PopoverTrigger exposes aria-expanded / aria-controls for the screen-reader state of the popover.
  • PopoverContent is focusable and traps focus while open — pressing Tab past the last focusable control wraps back to the first.
  • The trigger must be a real button (or another interactive element via asChild). Static <div> triggers lose focus behaviour.
  • onOpenChange keeps the Radix-style (open: boolean) => void signature via the Base UI compat layer.

Controlled vs uncontrolled

Uncontrolled — the popover owns open state:

<Popover onOpenChange={(open) => console.log('open:', open)}>
  <PopoverTrigger>Open</PopoverTrigger>
  <PopoverContent>{/* ... */}</PopoverContent>
</Popover>

Controlled — drive open from parent state (e.g. to open the popover programmatically or close it after a form submission):

const [open, setOpen] = useState(false);

<Popover open={open} onOpenChange={setOpen}>
  <PopoverTrigger asChild>
    <Button onClick={() => undefined} variant="outline">Open</Button>
  </PopoverTrigger>
  <PopoverContent>
    <Button onClick={() => setOpen(false)}>Done</Button>
  </PopoverContent>
</Popover>

Credits

Recent changes

  • patchv1.2.0Pin shipped dependency floors to the version we develop against. Registry items now declare ranges like `^5.1.9` (the actual installed version) instead of collapsing to `^5.0.0`, so consumers start on the known-tested b…#133
  • minorv1.1.0Theme docs refresh, readability pass on semantic foregrounds, and consumer-facing Base UI regression fixes.#121
  • minorv1.0.0Post-Base-UI polish. Public API unchanged.#116
  • majorv1.0.0Migrate every Radix-based primitive to `@base-ui/react@^1.4.0` (Base UI).#114
  • patchv0.3.1**Accordion** - `AccordionTrigger` now shows `cursor-pointer` on hover.#112
See full history →
Built by malinskibeniamin. The source code is available on GitHub.

On this page