A floating card that appears next to a trigger element. Popovers use the same elevated surface treatment as floating cards and can contain interactive content such as menus, forms, or action lists.
| Prop | Type | Required | Description |
|---|---|---|---|
| PopoverComponent | (props: { close: () => void } & Input) => JSX.Element | Yes | Component to render in the popover |
| children | (props: { toggle: (input: Input) => void }) => JSX.Element | Yes | Render function for the trigger element |
| jss | JSS | No | Custom styles for the wrapper |
| jssDialog | JSS | No | Custom styles for the popover dialog |
| grow | boolean | No | Allow wrapper to grow |
| shrink | boolean | No | Allow wrapper to shrink |
| tag | keyof HTMLElementTagNameMap | No | HTML tag for the wrapper |
| Prop | Type | Required | Description |
|---|---|---|---|
| children | ReactNode | Yes | Popover content |
| close | () => void | Yes | Function to close the popover |
Use PopoverTrigger to create a button that opens a popover with interactive options:
<PopoverTrigger
PopoverComponent={({ close }) => (
<Popover close={close}>
<List ariaLabel="Options">
<ListButtonItem
headline="Edit"
onClick={() => close()}
color="secondary"
/>
<ListButtonItem
headline="Duplicate"
onClick={() => close()}
color="secondary"
/>
<ListButtonItem
headline="Delete"
onClick={() => close()}
color="negative"
/>
</List>
</Popover>
)}
>
{({ toggle }) => (
<Button color="primary" onClick={() => toggle(undefined)}>
Show Options
</Button>
)}
</PopoverTrigger>
Use TypeScript generics to pass data when opening the popover:
interface Item {
id: string;
name: string;
}
<PopoverTrigger<Item>
PopoverComponent={({ close, id, name }) => (
<Popover close={close}>
<Column padding="medium" gap="small">
<P>Edit: {name}</P>
<Button color="primary" onClick={() => {
saveItem(id);
close();
}}>
Save
</Button>
</Column>
</Popover>
)}
>
{({ toggle }) => (
<Button
color="secondary"
onClick={() => toggle({ id: "123", name: "My Item" })}
>
Edit Item
</Button>
)}
</PopoverTrigger>
<PopoverTrigger
PopoverComponent={({ close }) => (
<Popover close={close}>
<List ariaLabel="Menu">
<ListButtonItem headline="Profile" onClick={() => close()} />
<ListButtonItem headline="Settings" onClick={() => close()} />
<ListButtonItem
headline="Logout"
onClick={() => close()}
color="negative"
/>
</List>
</Popover>
)}
>
{({ toggle }) => (
<IconButton
bare
icon="more-vertical"
color="secondary"
onClick={() => toggle(undefined)}
/>
)}
</PopoverTrigger>
<PopoverTrigger
PopoverComponent={({ close }) => (
<Popover close={close}>
<Column padding="medium" gap="medium">
<P>Are you sure you want to delete?</P>
<Row gap="small" justify="end">
<Button bare color="secondary" onClick={close}>
Cancel
</Button>
<Button
color="negative"
onClick={() => {
deleteItem();
close();
}}
>
Delete
</Button>
</Row>
</Column>
</Popover>
)}
>
{({ toggle }) => (
<Button color="negative" onClick={() => toggle(undefined)}>
Delete
</Button>
)}
</PopoverTrigger>
| Popover | Dialog | Tooltip |
|---|---|---|
| Positioned near trigger | Centered on screen | Positioned near trigger |
| Light interactions | Complex workflows | Text only |
| Partial page blocking | Full page blocking | No blocking |
| Menus, quick actions | Forms, confirmations | Hints, labels |