Popover
Display advanced information on hover over an element.
The Popover component is suitable to display advanced information on hover over an element. It is a small box that appears when the user hovers over an element.
import { Popover } from '@almond-ui/core';
function App() {
return (
<Popover>
<Popover.Trigger>
<Button>Hover over me!</Button>
</Popover.Trigger>
<Popover.Content>I am the popover content</Popover.Content>
</Popover>
);
}
Import
Import the Popover
component using the following import statement.
import { Popover } from '@almond-ui/core';
Colors
The following colors are available for the Popover
component: white
, gray
, zinc
and slate
.
<View>
<Popover color="white" >
// ...
</Popover>
<Popover color="gray" >
// ...
</Popover>
<Popover color="slate" >
// ...
</Popover>
<Popover color="zinc" >
// ...
</Popover>
</View>
Sizes
The following sizes are available for the Popover
component: xs
, sm
, md
and lg
.
<View>
<Popover size="xs">
// ...
</Popover>
<Popover size="sm">
// ...
</Popover>
<Popover size="md">
// ...
</Popover>
<Popover size="lg">
// ...
</Popover>
</View>
Radiuses
The following radiuses are available for the Popover
component: none
, sm
, base
, md
, lg
and full
.
<View>
<Popover radius="none">
// ...
</Popover>
<Popover radius="sm">
// ...
</Popover>
<Popover radius="base">
// ...
</Popover>
<Popover radius="md">
// ...
</Popover>
<Popover radius="lg">
// ...
</Popover>
<Popover radius="full">
// ...
</Popover>
</View>
Shadows
The following shadows are available for the Popover
component: none
, sm
, base
and md
.
<View>
<Popover shadow="none" color="white">
// ...
</Popover>
<Popover shadow="sm" color="white">
// ...
</Popover>
<Popover shadow="base" color="white">
// ...
</Popover>
<Popover shadow="md" color="white">
// ...
</Popover>
</View>
Placements
Basic placements
The following basic placements are supported by the Popover
component: top
, bottom
, left
and right
.
<View>
<Popover placement="top">
// ...
</Popover>
<Popover placement="bottom">
// ...
</Popover>
<Popover placement="left">
// ...
</Popover>
<Popover placement="right">
// ...
</Popover>
</View>
Extended placements
Furthermore, the above placements can be combined with the following modifiers: start
and end
.
Top
<View>
<Popover placement="top-start">
// ...
</Popover>
<Popover placement="top-end">
// ...
</Popover>
</View>
Bottom
<View>
<Popover placement="bottom-start">
// ...
</Popover>
<Popover placement="bottom-end">
// ...
</Popover>
</View>
Left
<View>
<Popover placement="left-start">
// ...
</Popover>
<Popover placement="left-end">
// ...
</Popover>
</View>
Right
<View>
<Popover placement="right-start">
// ...
</Popover>
<Popover placement="right-end">
// ...
</Popover>
</View>
Initial state
The initial state of the Popover
component can be controlled by setting the initiallyOpen
prop.
<View>
<Popover initiallyOpen={true}>
// ...
</Popover>
<Popover initiallyOpen={false}>
// ...
</Popover>
</View>
Examples
With Card component
The Popover
component can be combined with the Card
component to create a more complex popover.
<View>
<Popover
size="tight"
color="gray"
placement="bottom-start"
withinPortal={true}
>
<Popover.Trigger>
<Button>I am the trigger</Button>
</Popover.Trigger>
<Popover.Content>
<Card shadow="none" size="sm" radius="md">
<Card.Header className="bg-gray-50">This is a Card Header</Card.Header>
<Card.Body>This is the body of the card</Card.Body>
<Card.Footer className="bg-gray-50">And here is the footer</Card.Footer>
</Card>
</Popover.Content>
</Popover>
</View>
With Radio component
<View>
<Popover size="tight" color="gray" placement="bottom-start" withinPortal={true}>
<Popover.Trigger>
<Button color="black">Deploy</Button>
</Popover.Trigger>
<Popover.Content>
<Card shadow="none" size="sm" radius="md">
<Card.Header className="bg-gray-50">Select deployment target</Card.Header>
<Card.Body className="flex flex-col space-y-2">
<Radio
color="dark"
name="radio-example"
size="sm"
label="Testing"
description="testing.example.com"
defaultChecked={true}
/>
<Radio
color="dark"
name="radio-example"
size="sm"
label="Staging"
description="staging.example.com"
/>
<Radio
color="dark"
name="radio-example"
size="sm"
label="Production"
description="example.com"
/>
</Card.Body>
<Card.Footer className="bg-gray-50">
<Button color="black" size="sm" className="w-full">
Run
</Button>
</Card.Footer>
</Card>
</Popover.Content>
</Popover>
</View>
API Reference
Properties
Prop | Type | Description | Default |
---|---|---|---|
color | PopoverColor | Sets the Popover color | dark |
initiallyOpen | boolean | Sets the initial state of the Popover | false |
offset | number | Sets the Popover offset | 6 |
placement | PopoverPlacement | Sets the placement of the Popover in relation to the trigger element | top |
radius | PopoverRadius | Sets the Popover radius | md |
shadow | PopoverShadow | Sets the Popover shadow | none |
size | PopoverSize | Sets the Popover size | sm |
tone | PopoverTone | Sets the Popover tone | solid |
withinPortal | boolean | Renders the Popover within a portal | true |
Types
type PopoverColor =
| 'white'
| 'gray'
| 'slate'
| 'zinc';
type Alignment = 'start' | 'end';
type Side = 'top' | 'right' | 'bottom' | 'left';
type AlignedPlacement = `${Side}-${Alignment}`;
type PopoverPlacement = Side | AlignedPlacement;
type PopoverRadius = 'none' | 'sm' | 'base' | 'md' | 'lg' | 'full';
type PopoverShadow = 'none' | 'sm' | 'base' | 'md';
type PopoverSize = 'tight' | 'xs' | 'sm' | 'md' | 'lg';
type PopoverTone = 'solid' | 'light';
Accessibility
The Popover
component partially adheres to the WAI-ARIA Dialog (Modal) Pattern.
To make the modal dialog fully accessible, aria-labelledby
and aria-describedby
props should be provided to the Popover
component. The aria-labelledby
prop should point to the id
of the popover header element, and the aria-describedby
prop should point to the id
of the body element.