Naruto is a Japanese manga series written and illustrated by Masashi Kishimoto.
'use client'
import { Text } from '@chakra-ui/react'
import { Button, Input, Popover } from '@saas-ui/react'
export const PopoverBasic = () => {
  return (
    <Popover.Root>
      <Popover.Trigger asChild>
        <Button size="sm" variant="outline">
          Click me
        </Button>
      </Popover.Trigger>
      <Popover.Content>
        <Popover.Arrow />
        <Popover.Body>
          <Popover.Title fontWeight="medium">Naruto Form</Popover.Title>
          <Text my="4">
            Naruto is a Japanese manga series written and illustrated by Masashi
            Kishimoto.
          </Text>
          <Input placeholder="Your fav. character" size="sm" />
        </Popover.Body>
      </Popover.Content>
    </Popover.Root>
  )
}
import { Popover } from '@saas-ui/react/popover'<Popover.Root>
  <Popover.Trigger />
  <Popover.Content>
    <Popover.Body>
      <Popover.Title />
    </Popover.Body>
  </Popover.Content>
</Popover.Root>Use the open and onOpenChange to control the visibility of the popover.
'use client'
import { useState } from 'react'
import { Button, Popover } from '@saas-ui/react'
export const PopoverControlled = () => {
  const [open, setOpen] = useState(false)
  return (
    <Popover.Root open={open} onOpenChange={(e) => setOpen(e.open)}>
      <Popover.Trigger asChild>
        <Button size="sm" variant="outline">
          Click me
        </Button>
      </Popover.Trigger>
      <Popover.Content>
        <Popover.Arrow />
        <Popover.Body>
          This is a popover with the same width as the trigger button
        </Popover.Body>
      </Popover.Content>
    </Popover.Root>
  )
}
Use the size prop to change the size of the popover component.
Naruto is a Japanese manga series written and illustrated by Masashi Kishimoto.
Naruto is a Japanese manga series written and illustrated by Masashi Kishimoto.
Naruto is a Japanese manga series written and illustrated by Masashi Kishimoto.
Naruto is a Japanese manga series written and illustrated by Masashi Kishimoto.
import { For, Input, Stack, Text } from '@chakra-ui/react'
import { Button, Popover } from '@saas-ui/react'
export const PopoverWithSizes = () => {
  return (
    <Stack align="center" direction="row" gap="10">
      <For each={['xs', 'sm', 'md', 'lg']}>
        {(size) => (
          <Popover.Root key={size} size={size}>
            <Popover.Trigger asChild>
              <Button size={size} variant="outline">
                Click me
              </Button>
            </Popover.Trigger>
            <Popover.Content>
              <Popover.Arrow />
              <Popover.Body>
                <Popover.Title fontWeight="medium">Naruto Form</Popover.Title>
                <Text my="4">
                  Naruto is a Japanese manga series written and illustrated by
                  Masashi Kishimoto.
                </Text>
                <Input placeholder="Your fav. character" size={size} />
              </Popover.Body>
            </Popover.Content>
          </Popover.Root>
        )}
      </For>
    </Stack>
  )
}
Use the lazyMounted and/or unmountOnExit prop to defer the mounting of the
popover content until it's opened.
'use client'
import { Text } from '@chakra-ui/react'
import { Button, Popover } from '@saas-ui/react'
export const PopoverLazyMounted = () => {
  return (
    <Popover.Root lazyMount unmountOnExit>
      <Popover.Trigger asChild>
        <Button size="sm" variant="outline">
          Click me
        </Button>
      </Popover.Trigger>
      <Popover.Content>
        <Popover.Arrow />
        <Popover.Body>
          <Popover.Title fontWeight="medium">Naruto Form</Popover.Title>
          <Text my="4">
            Naruto is a Japanese manga series written and illustrated by Masashi
            Kishimoto.
          </Text>
        </Popover.Body>
      </Popover.Content>
    </Popover.Root>
  )
}
Use the positioning.placement prop to configure the underlying floating-ui
positioning logic.
'use client'
import { Button, Popover } from '@saas-ui/react'
export const PopoverWithPlacement = () => {
  return (
    <Popover.Root positioning={{ placement: 'bottom-end' }}>
      <Popover.Trigger asChild>
        <Button size="sm" variant="outline">
          Click me
        </Button>
      </Popover.Trigger>
      <Popover.Content>
        <Popover.Arrow />
        <Popover.Body>Some content</Popover.Body>
      </Popover.Content>
    </Popover.Root>
  )
}
Use the positioning.offset prop to adjust the position of the popover content.
'use client'
import { Button, Popover } from '@saas-ui/react'
export const PopoverWithOffset = () => {
  return (
    <Popover.Root positioning={{ offset: { crossAxis: 0, mainAxis: 0 } }} open>
      <Popover.Trigger asChild>
        <Button size="sm" variant="outline">
          Open
        </Button>
      </Popover.Trigger>
      <Popover.Content>
        <Popover.Body>
          This is a popover with the same width as the trigger button
        </Popover.Body>
      </Popover.Content>
    </Popover.Root>
  )
}
Use the positioning.sameWidth prop to make the popover content the same width
as the trigger.
'use client'
import { Button, Popover } from '@saas-ui/react'
export const PopoverWithSameWidth = () => {
  return (
    <Popover.Root positioning={{ sameWidth: true }}>
      <Popover.Trigger asChild>
        <Button size="sm" variant="outline" minW="xs">
          Click me
        </Button>
      </Popover.Trigger>
      <Popover.Content width="auto">
        <Popover.Arrow />
        <Popover.Body>
          This is a popover with the same width as the trigger button
        </Popover.Body>
      </Popover.Content>
    </Popover.Root>
  )
}
When nesting overlay elements like popover, select, menu, inside of the popover,
set portalled=false on them.
Here's an example of a popover inside another popover.
Naruto is a Japanese manga series written and illustrated by Masashi Kishimoto.
'use client'
import { Text } from '@chakra-ui/react'
import { Button, Popover } from '@saas-ui/react'
export const PopoverNested = () => {
  return (
    <Popover.Root>
      <Popover.Trigger asChild>
        <Button size="sm" variant="outline">
          Click me
        </Button>
      </Popover.Trigger>
      <Popover.Content>
        <Popover.Arrow />
        <Popover.Body>
          <Text mb="4">
            Naruto is a Japanese manga series written and illustrated by Masashi
            Kishimoto.
          </Text>
          <Popover.Root>
            <Popover.Trigger asChild>
              <Button variant="outline" size="xs">
                Open Nested Popover
              </Button>
            </Popover.Trigger>
            <Popover.Content portalled={false}>
              <Popover.Arrow />
              <Popover.Body>Some nested popover content</Popover.Body>
            </Popover.Content>
          </Popover.Root>
        </Popover.Body>
      </Popover.Content>
    </Popover.Root>
  )
}
Use the initialFocusEl prop to set the initial focus of the popover content.
'use client'
import { useRef } from 'react'
import { Box, Group } from '@chakra-ui/react'
import { Button, Popover } from '@saas-ui/react'
export const PopoverWithInitialFocus = () => {
  const ref = useRef<HTMLButtonElement>(null)
  return (
    <Popover.Root initialFocusEl={() => ref.current}>
      <Popover.Trigger asChild>
        <Button size="sm" variant="outline">
          Click me
        </Button>
      </Popover.Trigger>
      <Popover.Content>
        <Popover.Header>Manage Your Channels</Popover.Header>
        <Popover.Arrow />
        <Popover.Body>
          This is a popover with the same width as the trigger button
        </Popover.Body>
        <Popover.Footer>
          <Box fontSize="sm" flex="1">
            Step 2 of 4
          </Box>
          <Group>
            <Button size="sm" ref={ref}>
              Prev
            </Button>
            <Button size="sm">Next</Button>
          </Group>
        </Popover.Footer>
        <Popover.CloseTrigger />
      </Popover.Content>
    </Popover.Root>
  )
}
Here's an example of a popover with a form inside.
'use client'
import { Field, Input, Stack, Textarea } from '@chakra-ui/react'
import { Button, Popover } from '@saas-ui/react'
export const PopoverWithForm = () => {
  return (
    <Popover.Root>
      <Popover.Trigger asChild>
        <Button size="sm" variant="outline">
          Click me
        </Button>
      </Popover.Trigger>
      <Popover.Content>
        <Popover.Arrow />
        <Popover.Body>
          <Stack gap="4">
            <Field.Root>
              <Field.Label>Width</Field.Label>
              <Input placeholder="40px" />
            </Field.Root>
            <Field.Root>
              <Field.Label>Height</Field.Label>
              <Input placeholder="32px" />
            </Field.Root>
            <Field.Root>
              <Field.Label>Comments</Field.Label>
              <Textarea placeholder="Start typing..." />
            </Field.Root>
          </Stack>
        </Popover.Body>
        <Popover.CloseTrigger />
      </Popover.Content>
    </Popover.Root>
  )
}
| Prop | Default | Type | 
|---|---|---|
| autoFocus  | true | booleanWhether to automatically set focus on the first focusable content within the popover when opened. | 
| closeOnEscape  | true | booleanWhether to close the popover when the escape key is pressed. | 
| closeOnInteractOutside  | true | booleanWhether to close the popover when the user clicks outside of the popover. | 
| lazyMount  | false | booleanWhether to enable lazy mounting | 
| modal  | false | booleanWhether 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 | 
| portalled  | true | booleanWhether the popover is portalled. This will proxy the tabbing behavior regardless of the DOM position of the popover content. | 
| unmountOnExit  | false | booleanWhether to unmount on exit. | 
| colorPalette  | 'gray' | 'gray' | 'red' | 'orange' | 'yellow' | 'green' | 'teal' | 'blue' | 'cyan' | 'purple' | 'pink' | 'accent'The color palette of the component | 
| size  | 'md' | 'xs' | 'sm' | 'md' | 'lg'The size of the component | 
| defaultOpen  | booleanThe initial open state of the popover when it is first rendered. Use when you do not need to control its open state. | |
| id  | stringThe unique identifier of the machine. | |
| ids  | Partial<{
  anchor: string
  trigger: string
  content: string
  title: string
  description: string
  closeTrigger: string
  positioner: string
  arrow: string
}>The ids of the elements in the popover. Useful for composition. | |
| immediate  | booleanWhether to synchronize the present change immediately or defer it to the next frame | |
| initialFocusEl  | () => HTMLElement | nullThe element to focus on when the popover is opened. | |
| onEscapeKeyDown  | (event: KeyboardEvent) => voidFunction called when the escape key is pressed | |
| onExitComplete  | () => voidFunction called when the animation ends in the closed state | |
| onFocusOutside  | (event: FocusOutsideEvent) => voidFunction called when the focus is moved outside the component | |
| onInteractOutside  | (event: InteractOutsideEvent) => voidFunction called when an interaction happens outside the component | |
| onOpenChange  | (details: OpenChangeDetails) => voidFunction invoked when the popover opens or closes | |
| onPointerDownOutside  | (event: PointerDownOutsideEvent) => voidFunction called when the pointer is pressed down outside the component | |
| open  | booleanWhether the popover is open | |
| persistentElements  | (() => Element | null)[]Returns the persistent elements that: - should not have pointer-events disabled - should not trigger the dismiss event | |
| positioning  | PositioningOptionsThe user provided options used to position the popover content | |
| present  | booleanWhether the node is present (controlled by the user) | |
| as  | React.ElementTypeThe underlying element to render. | |
| asChild  | booleanUse the provided child element as the default rendered element, combining their props and behavior.For more details, read our Composition guide. | |
| unstyled  | booleanWhether to remove the component's style. |