Twigs Logo

Popover

A component that displays rich content in a portal, triggered by a button. Perfect settings panels, and contextual information with smooth animations and positioning control.

Import

import {Popover,PopoverTrigger,PopoverContent,PopoverClose,PopoverArrow,PopoverPortal,PopoverAnchor} from "@sparrowengg/twigs-react";

Usage

const PopoverExample = () => {
  return (
    <Box css={{ display: "flex", flexDirection: "column", gap: "$6", alignItems: "center" }}>
      <Popover>
        <PopoverTrigger asChild>
          <Button size="md" leftIcon={<SettingsIcon />} color="primary">
            Settings
          </Button>
        </PopoverTrigger>
        <PopoverContent side="bottom" align="start" sideOffset={8}>
          <Box css={{ display: "flex", flexDirection: "column", gap: "$4" }}>
            <Text css={{ fontSize: "$md", fontWeight: "$6" }}>Settings</Text>
            <Flex css={{ flexDirection: "column", gap: "$3" }}>
              <Text css={{ fontSize: "$sm" }}>Configure your preferences</Text>
              <Text css={{ fontSize: "$sm" }}>Update your profile settings</Text>
              <Text css={{ fontSize: "$sm" }}>Manage notifications</Text>
            </Flex>
            <PopoverClose asChild>
              <Button size="sm" color="default">
                Close
              </Button>
            </PopoverClose>
          </Box>
          <PopoverArrow />
        </PopoverContent>
      </Popover>
    </Box>
  );
};

Props

Popover

PropTypeDefault
defaultOpen?
boolean
-
open?
boolean
-
onOpenChange?
(open: boolean) => void
-
modal?
boolean
false
css?
object
-

PopoverTrigger

PropTypeDefault
asChild?
boolean
false

PopoverContent

PropTypeDefault
side?
'top' | 'right' | 'bottom' | 'left'
'bottom'
sideOffset?
number
0
align?
'start' | 'center' | 'end'
'center'
alignOffset?
number
0
avoidCollisions?
boolean
true
collisionBoundary?
Boundary
[]
collisionPadding?
number | Padding
0
arrowPadding?
number
0
sticky?
'partial' | 'always'
'partial'
hideWhenDetached?
boolean
false
forceMount?
boolean
-
onOpenAutoFocus?
(event: Event) => void
-
onCloseAutoFocus?
(event: Event) => void
-
onEscapeKeyDown?
(event: KeyboardEvent) => void
-
onPointerDownOutside?
(event: PointerDownOutsideEvent) => void
-
onFocusOutside?
(event: FocusOutsideEvent) => void
-
onInteractOutside?
(event: PointerDownOutsideEvent | FocusOutsideEvent) => void
-
asChild?
boolean
false

PopoverClose

PropTypeDefault
asChild?
boolean
false

PopoverArrow

PropTypeDefault
width?
number
10
height?
number
5
asChild?
boolean
false

PopoverPortal

PropTypeDefault
forceMount?
boolean
-
container?
HTMLElement
document.body

PopoverAnchor

PropTypeDefault
asChild?
boolean
false

Data Attributes

These props are used for the conditional rendering of the components

Applicable - PopoverTrigger
PropTypeDefault
[data-state]?
'open' | 'closed'
-
Applicable - PopoverContent
PropTypeDefault
[data-state]?
'open' | 'closed'
-
[data-side]?
'top' | 'right' | 'bottom' | 'left'
-
[data-align]?
'start' | 'center' | 'end'
-