Popover

A floating panel for contextual UI, with flexible sizing, hover triggers, a controllable open state and nesting.

import { Popover } from "@plexui/ui/components/Popover";

Examples

Overview

Sizing the popover

Open on hover

Using the controller

Nesting

All floating UI components in Plex UI can be infinitely nested by relying on z-index: auto; and natural stacking order.

Additionally, esc keypresses are handled independently as a stacking order.

API

Popover (root)

PropTypeDefaultDescription
openboolean—Controlled open state; uncontrolled when omitted
onOpenChange(nextState: boolean) => void—Called when the popover opens or closes
showOnHoverbooleanfalseOpen on hover and focus instead of click
hoverOpenDelaynumber150Delay before a hover popover opens (ms)

Popover.Trigger: Renders the element that toggles the popover. The trigger should be the user's point of interaction for revealing the popup. No specific props.

Popover.Content

PropTypeDefaultDescription
widthnumber | "auto""auto"Panel width in px
minWidthnumber | "auto"300Minimum panel width in px
maxWidthnumber700Maximum panel width in px, capped by the space available in the viewport
side"top" | "right" | "bottom" | "left""bottom"Preferred placement; flips when it collides
align"start" | "center" | "end""center"Alignment relative to trigger
sideOffsetnumber8Offset from trigger (px)
alignOffsetnumber-5Offset from the start or end alignment (px)
avoidCollisionsbooleantrueReposition to stay inside the viewport and scroll containers
translucentbooleanfalseTranslucent, blurred surface
autoFocusbooleantrueMove focus into the panel when it opens (hover popovers never take focus)
classNamestring—Applied to the panel

usePopoverController(): Hook available inside Popover.Content. Returns { close: () => void, shake: () => void }.

Styling

Popover reads these component tokens. Override them at any scope to restyle it:

  • --popover-radius: radius (default var(--radius-xl))