Components
Popover
A floating panel anchored to a trigger element. Built on Radix Popover with token-driven styling and positioning.
Import
import { Popover, PopoverTrigger, PopoverContent } from "@sigil-ui/components";Preview
Usage
<Popover>
<PopoverTrigger asChild>
<Button variant="outline">Open settings</Button>
</PopoverTrigger>
<PopoverContent>
<Stack gap={12}>
<Label htmlFor="width">Width</Label>
<Input id="width" defaultValue="100%" />
</Stack>
</PopoverContent>
</Popover>Placement
<Popover>
<PopoverTrigger asChild><Button>Top</Button></PopoverTrigger>
<PopoverContent side="top">Above the trigger.</PopoverContent>
</Popover>
<Popover>
<PopoverTrigger asChild><Button>Right</Button></PopoverTrigger>
<PopoverContent side="right">To the right.</PopoverContent>
</Popover>Controlled
import { useState } from "react";
function ControlledPopover() {
const [open, setOpen] = useState(false);
return (
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild><Button>Toggle</Button></PopoverTrigger>
<PopoverContent>
<p>Controlled popover</p>
<Button size="sm" onClick={() => setOpen(false)}>Close</Button>
</PopoverContent>
</Popover>
);
}Token integration
| CSS Variable | Used for |
|---|---|
--s-surface | Content background |
--s-border | Content border |
--s-shadow-lg | Content elevation |
--s-card-radius | Border radius |
--s-duration-fast | Enter/exit animation |
--s-ease-default | Animation easing |
Props
PopoverContent
| Prop | Type | Default | Description |
|---|---|---|---|
side | "top" | "right" | "bottom" | "left" | "bottom" | Preferred side |
align | "start" | "center" | "end" | "center" | Alignment |
sideOffset | number | 4 | Offset from trigger in px |
className | string | — | Additional CSS classes |
children | ReactNode | — | Popover content |
Accessibility
- Focus is trapped inside open content
- Escape closes the popover and returns focus to trigger
- Content linked to trigger via
aria-describedby