Popper

Low-level positioning primitive using @floating-ui/react-dom.

Popper

Popper is a low-level positioning primitive built on @floating-ui/react-dom. It handles anchor-to-content positioning with collision detection, offset, and alignment options. Popover, Tooltip, and DropdownMenu are built on top of Popper.

Popper is a primitive positioning engine. Use higher-level components like Popover or DropdownMenu for most cases. Use Popper directly when you need full control over positioning logic.


Usage

import { Popper, PopperAnchor, PopperContent, PopperArrow } from '@loke/ui/popper';
import { useState } from 'react';

export default function Example() {
  const [open, setOpen] = useState(false);

  return (
    <Popper open={open}>
      <PopperAnchor asChild>
        <button onClick={() => setOpen(!open)}>Anchor</button>
      </PopperAnchor>
      <PopperContent side="bottom" align="start">
        <div style={{ background: 'white', border: '1px solid #ccc', padding: '8px' }}>
          Content
        </div>
        <PopperArrow width={10} height={5} />
      </PopperContent>
    </Popper>
  );
}

Sub-components

  • PopperAnchor — Anchor element for positioning
  • PopperContent — Floating content positioned relative to anchor
  • PopperArrow — Arrow pointing to the anchor

Props

Prop

Type


Examples

Content anchored below a trigger

Content anchored to the side


Accessibility

  • Popper itself has no accessibility features; consumers must add appropriate ARIA.
  • Content rendered in a portal should have role="dialog", role="tooltip", or similar.
  • Use aria-labelledby and aria-describedby for screen reader context.

Best practices

  • Use higher-level components (Popover, Tooltip, DropdownMenu) when possible.
  • Set avoidCollisions= to prevent content from being cut off near viewport edges.
  • Provide both side and align for predictable positioning.
  • Use sideOffset to create visual space between anchor and content.