Popover

Display popover section relative to a target element. Useful for dropdowns, tooltips, and interactive content.

Import

import { Popover } from '@tidbcloud/uikit'

Basic Usage

import { Popover, Button, Text } from '@tidbcloud/uikit'
 
function Demo() {
  return (
    <Popover width={200} position="bottom" withArrow shadow="md">
      <Popover.Target>
        <Button>Toggle popover</Button>
      </Popover.Target>
      <Popover.Dropdown>
        <Text size="xs">This is the popover content</Text>
      </Popover.Dropdown>
    </Popover>
  )
}

Controlled

import { useState } from 'react'
import { Popover, Button } from '@tidbcloud/uikit'
 
function Demo() {
  const [opened, setOpened] = useState(false)
 
  return (
    <Popover opened={opened} onChange={setOpened}>
      <Popover.Target>
        <Button onClick={() => setOpened((o) => !o)}>Toggle popover</Button>
      </Popover.Target>
      <Popover.Dropdown>Dropdown content</Popover.Dropdown>
    </Popover>
  )
}

Hover Trigger

import { useDisclosure } from '@tidbcloud/uikit'
import { Popover, Button, Text } from '@tidbcloud/uikit'
 
function Demo() {
  const [opened, { close, open }] = useDisclosure(false)
 
  return (
    <Popover width={200} position="bottom" withArrow opened={opened}>
      <Popover.Target>
        <Button onMouseEnter={open} onMouseLeave={close}>
          Hover me
        </Button>
      </Popover.Target>
      <Popover.Dropdown style={{ pointerEvents: 'none' }}>
        <Text size="sm">Hover popover content</Text>
      </Popover.Dropdown>
    </Popover>
  )
}

With Form

import { Popover, Button, TextInput } from '@tidbcloud/uikit'
 
function Demo() {
  return (
    <Popover width={300} trapFocus position="bottom" withArrow shadow="md">
      <Popover.Target>
        <Button>Toggle form</Button>
      </Popover.Target>
      <Popover.Dropdown>
        <TextInput label="Name" placeholder="Name" size="xs" />
        <TextInput label="Email" placeholder="Email" size="xs" mt="xs" />
      </Popover.Dropdown>
    </Popover>
  )
}

Same Width as Target

import { Popover, Button, Text } from '@tidbcloud/uikit'
 
function Demo() {
  return (
    <Popover width="target" position="bottom" withArrow>
      <Popover.Target>
        <Button w={280}>Toggle popover</Button>
      </Popover.Target>
      <Popover.Dropdown>
        <Text size="sm">Dropdown has same width as target</Text>
      </Popover.Dropdown>
    </Popover>
  )
}

Key Props

PropTypeDescription
openedbooleanControlled open state
onChange(opened: boolean) => voidCalled when state changes
defaultOpenedbooleanInitial open state
positionFloatingPositionDropdown position
widthnumber | 'target'Dropdown width
withArrowbooleanShow arrow
arrowSizenumberArrow size in px
offsetnumber | objectDropdown offset
shadowMantineShadowDropdown shadow
radiusMantineRadiusBorder radius
trapFocusbooleanTrap focus in dropdown
closeOnClickOutsidebooleanClose on outside click
closeOnEscapebooleanClose on Escape key
disabledbooleanDisable popover
withinPortalbooleanRender in portal
zIndexnumberz-index value