Voice UI Kit
Primitives

Popover

Popover component built on Radix UI for displaying floating content

The Popover component provides a floating content panel that appears above other content. It's built on Radix UI and includes proper portal rendering and animations.

import { Popover, PopoverTrigger, PopoverContent, Button } from "@pipecat-ai/voice-ui-kit";

<Popover>
  <PopoverTrigger asChild>
    <Button variant="outline">Open Popover</Button>
  </PopoverTrigger>
  <PopoverContent>
    <div className="space-y-2">
      <h4 className="font-medium">Popover Title</h4>
      <p className="text-sm text-muted-foreground">
        This is the popover content.
      </p>
    </div>
  </PopoverContent>
</Popover>

Component Variants

Popover

The Popover component is a compound component with multiple parts.

import { Popover, PopoverTrigger, PopoverContent, Button } from "@pipecat-ai/voice-ui-kit";

<Popover>
  <PopoverTrigger asChild>
    <Button>Open</Button>
  </PopoverTrigger>
  <PopoverContent>
    Popover content
  </PopoverContent>
</Popover>
PropTypeDefault
Popover (Root)
React.ComponentProps<typeof PopoverPrimitive.Root>
-
PopoverTrigger
React.ComponentProps<typeof PopoverPrimitive.Trigger>
-
PopoverContent
React.ComponentProps<typeof PopoverPrimitive.Content>
-
PopoverAnchor?
React.ComponentProps<typeof PopoverPrimitive.Anchor>
-

PopoverContent Props

PropTypeDefault
align?
"start" | "center" | "end"
"center"
sideOffset?
number
4
className?
string
undefined

Usage

Basic Usage

Create a simple popover with trigger and content.

import { Popover, PopoverTrigger, PopoverContent, Button } from "@pipecat-ai/voice-ui-kit";

<Popover>
  <PopoverTrigger asChild>
    <Button variant="outline">Open Popover</Button>
  </PopoverTrigger>
  <PopoverContent>
    <p>This is the popover content.</p>
  </PopoverContent>
</Popover>

Custom Alignment

Control the alignment of the popover.

import { Popover, PopoverTrigger, PopoverContent, Button } from "@pipecat-ai/voice-ui-kit";

<div className="flex gap-2">
  <Popover>
    <PopoverTrigger asChild>
      <Button variant="outline">Start</Button>
    </PopoverTrigger>
    <PopoverContent align="start">
      Aligned to start
    </PopoverContent>
  </Popover>
  <Popover>
    <PopoverTrigger asChild>
      <Button variant="outline">Center</Button>
    </PopoverTrigger>
    <PopoverContent align="center">
      Aligned to center
    </PopoverContent>
  </Popover>
  <Popover>
    <PopoverTrigger asChild>
      <Button variant="outline">End</Button>
    </PopoverTrigger>
    <PopoverContent align="end">
      Aligned to end
    </PopoverContent>
  </Popover>
</div>

Custom Offset

Adjust the distance from the trigger.

import { Popover, PopoverTrigger, PopoverContent, Button } from "@pipecat-ai/voice-ui-kit";

<Popover>
  <PopoverTrigger asChild>
    <Button variant="outline">More Spacing</Button>
  </PopoverTrigger>
  <PopoverContent sideOffset={20}>
    This popover has more spacing from the trigger
  </PopoverContent>
</Popover>

Custom Styling

Apply custom classes to style the popover content.

import { Popover, PopoverTrigger, PopoverContent, Button } from "@pipecat-ai/voice-ui-kit";

<Popover>
  <PopoverTrigger asChild>
    <Button variant="outline">Styled</Button>
  </PopoverTrigger>
  <PopoverContent className="w-96 bg-primary text-primary-foreground">
    Custom styled popover content
  </PopoverContent>
</Popover>

Controlled State

Control the popover state programmatically.

import { Popover, PopoverTrigger, PopoverContent, Button } from "@pipecat-ai/voice-ui-kit";

function Demo() {
  const [open, setOpen] = React.useState(false);
  
  return (
    <Popover open={open} onOpenChange={setOpen}>
      <PopoverTrigger asChild>
        <Button variant="outline">Controlled</Button>
      </PopoverTrigger>
      <PopoverContent>
        <p>This popover is controlled by state.</p>
        <Button onClick={() => setOpen(false)} className="mt-2">
          Close
        </Button>
      </PopoverContent>
    </Popover>
  );
}

render(<Demo />);

Animations

The popover includes:

  • Fade in/out animations
  • Zoom in/out animations
  • Slide animations based on side (top, bottom, left, right)

Portal Container

The popover content is rendered in a portal container obtained from getPipecatUIContainer(), ensuring proper z-index stacking and avoiding overflow issues.

Integration

The Popover component is built on Radix UI's Popover primitive and integrates with:

  • Theme colors (bg-popover, text-popover-foreground)
  • Animation utilities
  • Portal rendering system

It's a standalone component that doesn't require any context providers, but works best when used within the Voice UI Kit's theme system.