# Popover
URL: https://ark-ui.com/docs/components/popover
Source: https://raw.githubusercontent.com/chakra-ui/ark/refs/heads/main/website/src/content/pages/components/popover.mdx
An overlay that displays additional information or options when triggered.
---
## Anatomy
To set up the popover correctly, you'll need to understand its anatomy and how we name its parts.
> Each part includes a `data-part` attribute to help identify them in the DOM.
## Examples
Learn how to use the `Popover` component in your project. Let's take a look at the most basic example:
**Example: basic**
#### React
```tsx
import { Popover } from '@ark-ui/react/popover'
import { ChevronRightIcon } from 'lucide-react'
export const Basic = () => (
Click Me
TitleDescription
)
```
#### Solid
```tsx
import { Popover } from '@ark-ui/solid/popover'
import { ChevronRightIcon } from 'lucide-solid'
export const Basic = () => (
Click Me
TitleDescription
)
```
#### Vue
```vue
Click Me
{{ '>' }}TitleDescription
```
#### Svelte
```svelte
Click MeTitleDescription
```
### Using a Portal
By default, the popover is rendered in the same DOM hierarchy as the trigger. To render the popover within a portal, set
the `portalled` prop to `true`.
> Note: This requires that you render the component within a `Portal` based on the framework you use.
**Example: portalled**
#### React
```tsx
import { Popover } from '@ark-ui/react/popover'
import { Portal } from '@ark-ui/react/portal'
import { ChevronRightIcon } from 'lucide-react'
export const Portalled = () => (
Click Me
TitleDescription
)
```
#### Solid
```tsx
import { Popover } from '@ark-ui/solid/popover'
import { ChevronRightIcon } from 'lucide-solid'
import { Portal } from 'solid-js/web'
export const Portalled = () => (
Click Me
TitleDescription
)
```
#### Vue
```vue
Click Me
{{ '>' }}TitleDescription
```
#### Svelte
```svelte
Click Me
TitleDescription
```
### Adding an arrow
To render an arrow within the popover, render the component `Popover.Arrow` and `Popover.ArrowTip` as children of
`Popover.Positioner`.
**Example: arrow**
#### React
```tsx
import { Popover } from '@ark-ui/react/popover'
export const Arrow = () => (
Click MeTitleDescriptionClose
)
```
#### Solid
```tsx
import { Popover } from '@ark-ui/solid/popover'
export const Arrow = () => (
Click MeTitleDescriptionClose
)
```
#### Vue
```vue
Click MeTitleDescriptionClose
```
#### Svelte
```svelte
Click MeTitleDescription
```
### Listening for open and close events
When the popover is opened or closed, we invoke the `onOpenChange` callback.
**Example: on-open-change**
#### React
```tsx
import { Popover } from '@ark-ui/react/popover'
import { ChevronRightIcon } from 'lucide-react'
export const OnOpenChange = () => {
return (
alert(open ? 'opened' : 'closed')}>
Click Me
TitleDescription
)
}
```
#### Solid
```tsx
import { Popover } from '@ark-ui/solid/popover'
import { ChevronRightIcon } from 'lucide-solid'
export const OnOpenChange = () => {
return (
alert(open ? 'opened' : 'closed')}>
Click Me
TitleDescription
)
}
```
#### Vue
```vue
console.log(open ? 'opened' : 'closed')">
Click Me
{{ '>' }}TitleDescription
```
#### Svelte
```svelte
alert(open ? 'opened' : 'closed')}>
Click Me
TitleDescription
```
### Control the open state
Use the `isOpen` prop to control the open state of the popover.
**Example: controlled**
#### React
```tsx
import { Popover } from '@ark-ui/react/popover'
import { useState } from 'react'
export const Controlled = () => {
const [isOpen, setIsOpen] = useState(false)
return (
<>
AnchorTitleDescriptionClose
>
)
}
```
#### Solid
```tsx
import { Popover } from '@ark-ui/solid/popover'
import { createSignal } from 'solid-js'
export const Controlled = () => {
const [isOpen, setIsOpen] = createSignal(false)
return (
<>
AnchorTitleDescriptionClose
>
)
}
```
#### Vue
```vue
AnchorTitleDescriptionClose
```
#### Svelte
```svelte
AnchorTitleDescriptionClose
```
### Modifying the close behavior
The popover is designed to close on blur and when the esc key is pressed.
To prevent it from closing on blur (clicking or focusing outside), pass the `closeOnInteractOutside` prop and set it to
`false`.
To prevent it from closing when the esc key is pressed, pass the `closeOnEsc` prop and set it to `false`.
**Example: close-behavior**
#### React
```tsx
import { Popover } from '@ark-ui/react/popover'
export const CloseBehavior = () => (
Click MeTitleDescriptionClose
)
```
#### Solid
```tsx
import { Popover } from '@ark-ui/solid/popover'
import { Portal } from 'solid-js/web'
export const CloseBehavior = () => (
Click MeTitleDescriptionClose
)
```
#### Vue
```vue
Click MeTitleDescriptionClose
```
#### Svelte
```svelte
Click MeTitleDescriptionClose
```
### Changing the placement
To change the placement of the popover, set the `positioning` prop.
**Example: positioning**
#### React
```tsx
import { Popover } from '@ark-ui/react/popover'
export const Positioning = () => (
Click MeTitleDescriptionClose
)
```
#### Solid
```tsx
import { Popover } from '@ark-ui/solid/popover'
export const Positioning = () => (
Click MeTitleDescriptionClose
)
```
#### Vue
```vue
Click MeTitleDescriptionClose
```
#### Svelte
```svelte
Click MeTitleDescriptionClose
```
### Changing the modality
In some cases, you might want the popover to be modal. This means that it'll:
- trap focus within its content
- block scrolling on the body
- disable pointer interactions outside the popover
- hide content behind the popover from screen readers
To make the popover modal, set the `modal` prop to `true`. When `modal={true}`, we set the `portalled` attribute to
`true` as well.
**Example: modal**
#### React
```tsx
import { Popover } from '@ark-ui/react/popover'
export const Modal = () => (
Click MeTitleDescriptionClose
)
```
#### Solid
```tsx
import { Popover } from '@ark-ui/solid/popover'
export const Modal = () => (
Click MeTitleDescriptionClose
)
```
#### Vue
```vue
Click MeTitleDescriptionClose
```
#### Svelte
```svelte
Click MeTitleDescriptionClose
```
### Using the Root Provider
The `RootProvider` component provides a context for the popover. It accepts the value of the `usePopover` hook. You can
leverage it to access the component state and methods from outside the popover.
**Example: root-provider**
#### React
```tsx
import { Popover, usePopover } from '@ark-ui/react/popover'
export const RootProvider = () => {
const popover = usePopover({
positioning: {
placement: 'bottom-start',
},
})
return (
<>
TitleDescription
>
)
}
```
#### Solid
```tsx
import { Popover, usePopover } from '@ark-ui/solid/popover'
import { ChevronRightIcon } from 'lucide-solid'
export const RootProvider = () => {
const popover = usePopover()
return (
<>
Click Me
TitleDescription
>
)
}
```
#### Vue
```vue
Click Me
{{ '>' }}TitleDescription
```
#### Svelte
```svelte
TitleDescription
```
> If you're using the `RootProvider` component, you don't need to use the `Root` component.
## Guides
### Available height and width
The following css variables are exposed to the `Popover.Positioner` which you can use to style the `Popover.Content`
```css
/* width of the popover trigger */
--reference-width: ;
/* width of the available viewport */
--available-width: ;
/* height of the available viewport */
--available-height: ;
```
For example, if you want to make sure the maximum height doesn't exceed the available height, use the following css:
```css
[data-scope='popover'][data-part='content'] {
max-height: calc(var(--available-height) - 100px);
}
```
## API Reference
### Props
**Component API Reference**
#### React
**Root Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `autoFocus` | `boolean` | No | Whether to automatically set focus on the first focusable
content within the popover when opened. |
| `closeOnEscape` | `boolean` | No | Whether to close the popover when the escape key is pressed. |
| `closeOnInteractOutside` | `boolean` | No | Whether to close the popover when the user clicks outside of the popover. |
| `defaultOpen` | `boolean` | No | The initial open state of the popover when rendered.
Use when you don't need to control the open state of the popover. |
| `id` | `string` | No | The unique identifier of the machine. |
| `ids` | `Partial<{
anchor: string
trigger: string
content: string
title: string
description: string
closeTrigger: string
positioner: string
arrow: string
}>` | No | The ids of the elements in the popover. Useful for composition. |
| `immediate` | `boolean` | No | Whether to synchronize the present change immediately or defer it to the next frame |
| `initialFocusEl` | `() => HTMLElement | null` | No | The element to focus on when the popover is opened. |
| `lazyMount` | `boolean` | No | Whether to enable lazy mounting |
| `modal` | `boolean` | No | Whether the popover should be modal. When set to `true`:
- interaction with outside elements will be disabled
- only popover content will be visible to screen readers
- scrolling is blocked
- focus is trapped within the popover |
| `onEscapeKeyDown` | `(event: KeyboardEvent) => void` | No | Function called when the escape key is pressed |
| `onExitComplete` | `VoidFunction` | No | Function called when the animation ends in the closed state |
| `onFocusOutside` | `(event: FocusOutsideEvent) => void` | No | Function called when the focus is moved outside the component |
| `onInteractOutside` | `(event: InteractOutsideEvent) => void` | No | Function called when an interaction happens outside the component |
| `onOpenChange` | `(details: OpenChangeDetails) => void` | No | Function invoked when the popover opens or closes |
| `onPointerDownOutside` | `(event: PointerDownOutsideEvent) => void` | No | Function called when the pointer is pressed down outside the component |
| `onRequestDismiss` | `(event: LayerDismissEvent) => void` | No | Function called when this layer is closed due to a parent layer being closed |
| `open` | `boolean` | No | The controlled open state of the popover |
| `persistentElements` | `(() => Element | null)[]` | No | Returns the persistent elements that:
- should not have pointer-events disabled
- should not trigger the dismiss event |
| `portalled` | `boolean` | No | Whether the popover is portalled. This will proxy the tabbing behavior regardless of the DOM position
of the popover content. |
| `positioning` | `PositioningOptions` | No | The user provided options used to position the popover content |
| `present` | `boolean` | No | Whether the node is present (controlled by the user) |
| `skipAnimationOnMount` | `boolean` | No | Whether to allow the initial presence animation. |
| `unmountOnExit` | `boolean` | No | Whether to unmount on exit. |
**Anchor Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Arrow Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**ArrowTip Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**CloseTrigger Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Content Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Content Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | popover |
| `[data-part]` | content |
| `[data-state]` | "open" | "closed" |
| `[data-nested]` | popover |
| `[data-has-nested]` | popover |
| `[data-expanded]` | Present when expanded |
| `[data-placement]` | The placement of the content |
**Description Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Indicator Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Indicator Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | popover |
| `[data-part]` | indicator |
| `[data-state]` | "open" | "closed" |
**Positioner Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**RootProvider Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `value` | `UsePopoverReturn` | Yes | |
| `immediate` | `boolean` | No | Whether to synchronize the present change immediately or defer it to the next frame |
| `lazyMount` | `boolean` | No | Whether to enable lazy mounting |
| `onExitComplete` | `VoidFunction` | No | Function called when the animation ends in the closed state |
| `present` | `boolean` | No | Whether the node is present (controlled by the user) |
| `skipAnimationOnMount` | `boolean` | No | Whether to allow the initial presence animation. |
| `unmountOnExit` | `boolean` | No | Whether to unmount on exit. |
**Title Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Trigger Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Trigger Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | popover |
| `[data-part]` | trigger |
| `[data-placement]` | The placement of the trigger |
| `[data-state]` | "open" | "closed" |
#### Solid
**Root Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `autoFocus` | `boolean` | No | Whether to automatically set focus on the first focusable
content within the popover when opened. |
| `closeOnEscape` | `boolean` | No | Whether to close the popover when the escape key is pressed. |
| `closeOnInteractOutside` | `boolean` | No | Whether to close the popover when the user clicks outside of the popover. |
| `defaultOpen` | `boolean` | No | The initial open state of the popover when rendered.
Use when you don't need to control the open state of the popover. |
| `id` | `string` | No | The unique identifier of the machine. |
| `ids` | `Partial<{
anchor: string
trigger: string
content: string
title: string
description: string
closeTrigger: string
positioner: string
arrow: string
}>` | No | The ids of the elements in the popover. Useful for composition. |
| `immediate` | `boolean` | No | Whether to synchronize the present change immediately or defer it to the next frame |
| `initialFocusEl` | `() => HTMLElement | null` | No | The element to focus on when the popover is opened. |
| `lazyMount` | `boolean` | No | Whether to enable lazy mounting |
| `modal` | `boolean` | No | Whether the popover should be modal. When set to `true`:
- interaction with outside elements will be disabled
- only popover content will be visible to screen readers
- scrolling is blocked
- focus is trapped within the popover |
| `onEscapeKeyDown` | `(event: KeyboardEvent) => void` | No | Function called when the escape key is pressed |
| `onExitComplete` | `VoidFunction` | No | Function called when the animation ends in the closed state |
| `onFocusOutside` | `(event: FocusOutsideEvent) => void` | No | Function called when the focus is moved outside the component |
| `onInteractOutside` | `(event: InteractOutsideEvent) => void` | No | Function called when an interaction happens outside the component |
| `onOpenChange` | `(details: OpenChangeDetails) => void` | No | Function invoked when the popover opens or closes |
| `onPointerDownOutside` | `(event: PointerDownOutsideEvent) => void` | No | Function called when the pointer is pressed down outside the component |
| `onRequestDismiss` | `(event: LayerDismissEvent) => void` | No | Function called when this layer is closed due to a parent layer being closed |
| `open` | `boolean` | No | The controlled open state of the popover |
| `persistentElements` | `(() => Element | null)[]` | No | Returns the persistent elements that:
- should not have pointer-events disabled
- should not trigger the dismiss event |
| `portalled` | `boolean` | No | Whether the popover is portalled. This will proxy the tabbing behavior regardless of the DOM position
of the popover content. |
| `positioning` | `PositioningOptions` | No | The user provided options used to position the popover content |
| `present` | `boolean` | No | Whether the node is present (controlled by the user) |
| `skipAnimationOnMount` | `boolean` | No | Whether to allow the initial presence animation. |
| `unmountOnExit` | `boolean` | No | Whether to unmount on exit. |
**Anchor Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Arrow Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**ArrowTip Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**CloseTrigger Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `(props: ParentProps<'button'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Content Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Content Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | popover |
| `[data-part]` | content |
| `[data-state]` | "open" | "closed" |
| `[data-nested]` | popover |
| `[data-has-nested]` | popover |
| `[data-expanded]` | Present when expanded |
| `[data-placement]` | The placement of the content |
**Description Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Indicator Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Indicator Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | popover |
| `[data-part]` | indicator |
| `[data-state]` | "open" | "closed" |
**Positioner Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**RootProvider Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `value` | `UsePopoverReturn` | Yes | |
| `immediate` | `boolean` | No | Whether to synchronize the present change immediately or defer it to the next frame |
| `lazyMount` | `boolean` | No | Whether to enable lazy mounting |
| `onExitComplete` | `VoidFunction` | No | Function called when the animation ends in the closed state |
| `present` | `boolean` | No | Whether the node is present (controlled by the user) |
| `skipAnimationOnMount` | `boolean` | No | Whether to allow the initial presence animation. |
| `unmountOnExit` | `boolean` | No | Whether to unmount on exit. |
**Title Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `(props: ParentProps<'div'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Trigger Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `(props: ParentProps<'button'>) => Element` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Trigger Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | popover |
| `[data-part]` | trigger |
| `[data-placement]` | The placement of the trigger |
| `[data-state]` | "open" | "closed" |
#### Vue
**Root Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `autoFocus` | `boolean` | No | Whether to automatically set focus on the first focusable
content within the popover when opened. |
| `closeOnEscape` | `boolean` | No | Whether to close the popover when the escape key is pressed. |
| `closeOnInteractOutside` | `boolean` | No | Whether to close the popover when the user clicks outside of the popover. |
| `defaultOpen` | `boolean` | No | The initial open state of the popover when rendered.
Use when you don't need to control the open state of the popover. |
| `id` | `string` | No | The unique identifier of the machine. |
| `ids` | `Partial<{
anchor: string
trigger: string
content: string
title: string
description: string
closeTrigger: string
positioner: string
arrow: string
}>` | No | The ids of the elements in the popover. Useful for composition. |
| `initialFocusEl` | `() => HTMLElement | null` | No | The element to focus on when the popover is opened. |
| `lazyMount` | `boolean` | No | Whether to enable lazy mounting |
| `modal` | `boolean` | No | Whether the popover should be modal. When set to `true`:
- interaction with outside elements will be disabled
- only popover content will be visible to screen readers
- scrolling is blocked
- focus is trapped within the popover |
| `open` | `boolean` | No | The controlled open state of the popover |
| `persistentElements` | `(() => Element | null)[]` | No | Returns the persistent elements that:
- should not have pointer-events disabled
- should not trigger the dismiss event |
| `portalled` | `boolean` | No | Whether the popover is portalled. This will proxy the tabbing behavior regardless of the DOM position
of the popover content. |
| `positioning` | `PositioningOptions` | No | The user provided options used to position the popover content |
| `unmountOnExit` | `boolean` | No | Whether to unmount on exit. |
**Anchor Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Arrow Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**ArrowTip Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**CloseTrigger Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Content Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Content Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | popover |
| `[data-part]` | content |
| `[data-state]` | "open" | "closed" |
| `[data-nested]` | popover |
| `[data-has-nested]` | popover |
| `[data-expanded]` | Present when expanded |
| `[data-placement]` | The placement of the content |
**Description Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Indicator Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Indicator Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | popover |
| `[data-part]` | indicator |
| `[data-state]` | "open" | "closed" |
**Positioner Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**RootProvider Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `value` | `PopoverApi` | Yes | |
| `lazyMount` | `boolean` | No | Whether to enable lazy mounting |
| `unmountOnExit` | `boolean` | No | Whether to unmount on exit. |
**Title Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Trigger Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `boolean` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
**Trigger Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | popover |
| `[data-part]` | trigger |
| `[data-placement]` | The placement of the trigger |
| `[data-state]` | "open" | "closed" |
#### Svelte
**Root Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `autoFocus` | `boolean` | No | Whether to automatically set focus on the first focusable
content within the popover when opened. |
| `closeOnEscape` | `boolean` | No | Whether to close the popover when the escape key is pressed. |
| `closeOnInteractOutside` | `boolean` | No | Whether to close the popover when the user clicks outside of the popover. |
| `defaultOpen` | `boolean` | No | The initial open state of the popover when rendered.
Use when you don't need to control the open state of the popover. |
| `id` | `string` | No | The unique identifier of the machine. |
| `ids` | `Partial<{
anchor: string
trigger: string
content: string
title: string
description: string
closeTrigger: string
positioner: string
arrow: string
}>` | No | The ids of the elements in the popover. Useful for composition. |
| `immediate` | `boolean` | No | Whether to synchronize the present change immediately or defer it to the next frame |
| `initialFocusEl` | `() => HTMLElement | null` | No | The element to focus on when the popover is opened. |
| `lazyMount` | `boolean` | No | Whether to enable lazy mounting |
| `modal` | `boolean` | No | Whether the popover should be modal. When set to `true`:
- interaction with outside elements will be disabled
- only popover content will be visible to screen readers
- scrolling is blocked
- focus is trapped within the popover |
| `onEscapeKeyDown` | `(event: KeyboardEvent) => void` | No | Function called when the escape key is pressed |
| `onExitComplete` | `VoidFunction` | No | Function called when the animation ends in the closed state |
| `onFocusOutside` | `(event: FocusOutsideEvent) => void` | No | Function called when the focus is moved outside the component |
| `onInteractOutside` | `(event: InteractOutsideEvent) => void` | No | Function called when an interaction happens outside the component |
| `onOpenChange` | `(details: OpenChangeDetails) => void` | No | Function invoked when the popover opens or closes |
| `onPointerDownOutside` | `(event: PointerDownOutsideEvent) => void` | No | Function called when the pointer is pressed down outside the component |
| `onRequestDismiss` | `(event: LayerDismissEvent) => void` | No | Function called when this layer is closed due to a parent layer being closed |
| `open` | `boolean` | No | The controlled open state of the popover |
| `persistentElements` | `(() => Element | null)[]` | No | Returns the persistent elements that:
- should not have pointer-events disabled
- should not trigger the dismiss event |
| `portalled` | `boolean` | No | Whether the popover is portalled. This will proxy the tabbing behavior regardless of the DOM position
of the popover content. |
| `positioning` | `PositioningOptions` | No | The user provided options used to position the popover content |
| `present` | `boolean` | No | Whether the node is present (controlled by the user) |
| `skipAnimationOnMount` | `boolean` | No | Whether to allow the initial presence animation. |
| `unmountOnExit` | `boolean` | No | Whether to unmount on exit. |
**Anchor Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `ref` | `Element` | No | |
**Arrow Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `ref` | `Element` | No | |
**ArrowTip Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `ref` | `Element` | No | |
**CloseTrigger Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `Snippet<[PropsFn<'button'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `ref` | `Element` | No | |
**Content Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `ref` | `Element` | No | |
**Content Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | popover |
| `[data-part]` | content |
| `[data-state]` | "open" | "closed" |
| `[data-nested]` | popover |
| `[data-has-nested]` | popover |
| `[data-expanded]` | Present when expanded |
| `[data-placement]` | The placement of the content |
**Context Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `render` | `Snippet<[UsePopoverContext]>` | No | |
**Description Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `Snippet<[PropsFn<'p'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `ref` | `Element` | No | |
**Indicator Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `ref` | `Element` | No | |
**Indicator Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | popover |
| `[data-part]` | indicator |
| `[data-state]` | "open" | "closed" |
**Positioner Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `Snippet<[PropsFn<'div'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `ref` | `Element` | No | |
**RootProvider Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `value` | `UsePopoverReturn` | Yes | |
| `immediate` | `boolean` | No | Whether to synchronize the present change immediately or defer it to the next frame |
| `lazyMount` | `boolean` | No | Whether to enable lazy mounting |
| `onExitComplete` | `VoidFunction` | No | Function called when the animation ends in the closed state |
| `present` | `boolean` | No | Whether the node is present (controlled by the user) |
| `skipAnimationOnMount` | `boolean` | No | Whether to allow the initial presence animation. |
| `unmountOnExit` | `boolean` | No | Whether to unmount on exit. |
**Title Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `Snippet<[PropsFn<'h2'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `ref` | `Element` | No | |
**Trigger Props:**
| Prop | Type | Required | Description |
|------|------|----------|-------------|
| `asChild` | `Snippet<[PropsFn<'button'>]>` | No | Use the provided child element as the default rendered element, combining their props and behavior. |
| `ref` | `Element` | No | |
**Trigger Data Attributes:**
| Attribute | Value |
|-----------|-------|
| `[data-scope]` | popover |
| `[data-part]` | trigger |
| `[data-placement]` | The placement of the trigger |
| `[data-state]` | "open" | "closed" |
### Context
These are the properties available when using `Popover.Context`, `usePopoverContext` hook or `usePopover` hook.
**API:**
| Property | Type | Description |
|----------|------|-------------|
| `portalled` | `boolean` | Whether the popover is portalled. |
| `open` | `boolean` | Whether the popover is open |
| `setOpen` | `(open: boolean) => void` | Function to open or close the popover |
| `reposition` | `(options?: Partial) => void` | Function to reposition the popover |
## Accessibility
### Keyboard Support