sigilUI

Popover

A floating panel anchored to a trigger element. Built on Radix Popover with token-driven styling and positioning.

@sigil-ui/componentsReact

Preview

Live preview Interactive

Import

import { Popover, PopoverTrigger, PopoverContent } from "@sigil-ui/components";

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 VariableUsed for
--s-surfaceContent background
--s-borderContent border
--s-shadow-lgContent elevation
--s-card-radiusBorder radius
--s-duration-fastEnter/exit animation
--s-ease-defaultAnimation easing

Props

PopoverContent

PropTypeDefaultDescription
side"top" | "right" | "bottom" | "left""bottom"Preferred side
align"start" | "center" | "end""center"Alignment
sideOffsetnumber4Offset from trigger in px
classNamestring—Additional CSS classes
childrenReactNode—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