GitHub

Popover

Lightweight anchored surface for secondary actions and supporting content that should stay attached to its trigger rather than interrupting the current page flow.

AccessibleDark ModeAnimatedKeyboard Nav

Install

$npx react-principles add popover
02

Code Snippet

src/ui/Popover.tsx
import { Popover } from "@/ui/Popover";

<Popover side="bottom" align="start">
  <Popover.Trigger>Open details</Popover.Trigger>
  <Popover.Content>
    <p>Popover content goes here.</p>
    <Popover.Close>Close</Popover.Close>
  </Popover.Content>
</Popover>
03

Copy-Paste (Single File)

Popover.tsx
import { createContext, useCallback, useContext, useEffect, useRef, useState, type ButtonHTMLAttributes, type HTMLAttributes, type ReactNode } from "react";
import { cn } from "@/lib/utils";

type PopoverSide = "top" | "bottom";
type PopoverAlign = "start" | "center" | "end";

export interface PopoverProps {
  open?: boolean;
  defaultOpen?: boolean;
  onOpenChange?: (open: boolean) => void;
  side?: PopoverSide;
  align?: PopoverAlign;
  children: ReactNode;
  className?: string;
}
04

Props

PropTypeDefaultDescription
openbooleanControlled open state for the popover.
defaultOpenbooleanfalseInitial open state when used uncontrolled.
onOpenChange(open: boolean) => voidCalled when the popover opens or closes.
side"top" | "bottom""bottom"Places the content above or below the trigger.
align"start" | "center" | "end""start"Aligns the content relative to the trigger width.
classNamestringAdditional classes applied to the root wrapper.
Popover.TriggerButtonHTMLAttributes<HTMLButtonElement>Interactive element that toggles the popover.
Popover.ContentHTMLAttributes<HTMLDivElement>Floating surface that holds the popover content.
Popover.CloseButtonHTMLAttributes<HTMLButtonElement>"Close"Convenience action for closing the popover from within the panel.
react-principles