shadcn-remix
GitHub

Popover

Displays rich content in a portal, triggered by a button.

import { css } from 'remix/component'

import { buttonVariants } from '#app/ui/button.tsx'
import { Input } from '#app/ui/input.tsx'
import { Label } from '#app/ui/label.tsx'
import { Popover, PopoverContent, PopoverTrigger } from '#app/ui/popover.tsx'
import { css } from 'remix/component'

import { buttonVariants } from '#app/ui/button.tsx'
import { Input } from '#app/ui/input.tsx'
import { Label } from '#app/ui/label.tsx'
import { Popover, PopoverContent, PopoverTrigger } from '#app/ui/popover.tsx'

const fields = [
  { id: 'width', label: 'Width', defaultValue: '100%' },
  { id: 'maxWidth', label: 'Max. width', defaultValue: '300px' },
  { id: 'height', label: 'Height', defaultValue: '25px' },
  { id: 'maxHeight', label: 'Max. height', defaultValue: 'none' },
]

export function PopoverDemo() {
  return () => (
    <Popover>
      <PopoverTrigger mix={buttonVariants({ variant: 'outline' })}>Open popover</PopoverTrigger>
      <PopoverContent mix={css({ width: '20rem' })}>
        <div mix={css({ display: 'grid', gap: '1rem' })}>
          <div mix={css({ '& > :not(:last-child)': { marginBlockEnd: '0.5rem' } })}>
            <h4 mix={css({ lineHeight: 1, fontWeight: 500 })}>Dimensions</h4>
            <p
              mix={css({
                fontSize: '0.875rem',
                lineHeight: 'calc(1.25 / 0.875)',
                color: 'var(--muted-foreground)',
              })}
            >
              Set the dimensions for the layer.
            </p>
          </div>
          <div mix={css({ display: 'grid', gap: '0.5rem' })}>
            {fields.map((field) => (
              <div
                key={field.id}
                mix={css({
                  display: 'grid',
                  gridTemplateColumns: 'repeat(3, minmax(0, 1fr))',
                  alignItems: 'center',
                  gap: '1rem',
                })}
              >
                <Label htmlFor={field.id}>{field.label}</Label>
                <Input
                  id={field.id}
                  defaultValue={field.defaultValue}
                  mix={css({ gridColumn: 'span 2 / span 2', height: '2rem' })}
                />
              </div>
            ))}
          </div>
        </div>
      </PopoverContent>
    </Popover>
  )
}

Installation

$ pnpm dlx shadcn@latest add https://www.shadcn-remix.com/r/popover.json

Usage

import { buttonVariants } from '#app/ui/button.tsx'
import {
  Popover,
  PopoverContent,
  PopoverDescription,
  PopoverHeader,
  PopoverTitle,
  PopoverTrigger,
} from '#app/ui/popover.tsx'
<Popover>
  <PopoverTrigger mix={buttonVariants({ variant: 'outline' })}>Open Popover</PopoverTrigger>
  <PopoverContent>
    <PopoverHeader>
      <PopoverTitle>Title</PopoverTitle>
      <PopoverDescription>Description text here.</PopoverDescription>
    </PopoverHeader>
  </PopoverContent>
</Popover>

API Reference

Popover

PropTypeDefault
openboolean-
defaultOpenboolean-
onOpenChange((open: boolean) => void)-

PopoverTrigger

Renders a <button> that toggles the popover. shadcn's asChild maps to mix: <PopoverTrigger mix={buttonVariants({ variant: 'outline' })}>Open</PopoverTrigger>.

PropTypeDefault
mixMixValue-

PopoverAnchor

An optional element to position the content against instead of the trigger.

PropTypeDefault
mixMixValue-

PopoverContent

PropTypeDefault
sideSide"bottom"
alignAlign"center"
sideOffsetnumber4
alignOffsetnumber0
mixMixValue-

PopoverHeader

PropTypeDefault
mixMixValue-

PopoverTitle

PropTypeDefault
mixMixValue-

PopoverDescription

PropTypeDefault
mixMixValue-