Popover
adn-ui/popoverFreeComponent
An accessible popup anchored to a trigger button.
Live preview
live · rendered by the registry
Rendered by adn-ui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://ui.awaiden.com/r/popover.jsonSource
1"use client";23import "./popover.css";4import { Popover as BasePopover } from "@base-ui/react/popover";5import React from "react";6import { cn } from "tailwind-variants";78import { PopoverContext, usePopoverContext } from "./popover.context";9import { popoverVariants, type PopoverVariants } from "./popover.variants";1011export type PopoverProps = PopoverVariants & React.ComponentProps<typeof BasePopover.Root>;1213export const PopoverRoot = ({ children, size, ...props }: PopoverProps) => {14 const slots = popoverVariants({ size });1516 return (17 <PopoverContext.Provider value={{ slots }}>18 <BasePopover.Root {...props}>{children}</BasePopover.Root>19 </PopoverContext.Provider>20 );21};2223export type PopoverTriggerProps = React.ComponentProps<typeof BasePopover.Trigger> & {24 render?: React.ReactElement;25 asChild?: boolean;26};2728export const PopoverTrigger = ({29 className,30 children,31 render,32 asChild: _asChild,33 ...props34}: PopoverTriggerProps) => {35 const { slots } = usePopoverContext();36 const renderElement = render ?? (React.isValidElement(children) ? children : undefined);37 return (38 <BasePopover.Trigger39 className={cn(slots.trigger(), className)}40 {...props}41 {...(renderElement ? { render: renderElement } : { children })}42 />43 );44};4546export type PopoverPortalProps = React.ComponentProps<typeof BasePopover.Portal>;4748export const PopoverPortal = (props: PopoverPortalProps) => {49 return <BasePopover.Portal {...props} />;50};5152export type PopoverBackdropProps = React.ComponentProps<typeof BasePopover.Backdrop>;5354export const PopoverBackdrop = ({ className, ...props }: PopoverBackdropProps) => {55 const { slots } = usePopoverContext();56 return <BasePopover.Backdrop className={cn(slots.backdrop(), className)} {...props} />;57};5859export type PopoverPositionerProps = React.ComponentProps<typeof BasePopover.Positioner>;6061export const PopoverPositioner = ({62 className,63 sideOffset = 4,64 ...props65}: PopoverPositionerProps) => {66 const { slots } = usePopoverContext();67 return (68 <BasePopover.Positioner69 className={cn(slots.positioner(), className)}70 sideOffset={sideOffset}71 {...props}72 />73 );74};7576export type PopoverPopupProps = React.ComponentProps<typeof BasePopover.Popup>;7778export const PopoverPopup = ({ className, ...props }: PopoverPopupProps) => {79 const { slots } = usePopoverContext();80 return <BasePopover.Popup className={cn(slots.popup(), className)} {...props} />;81};8283// … truncated
What it pulls in
npm packages
Files it writes
More from adn-ui
All 46 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | adn-ui | Components | Free | 2 deps · 5 files | |
| Alert Dialogalert-dialog | adn-ui | Components | Free | 2 deps · 5 files | |
| Aspect Ratioaspect-ratio | adn-ui | Components | Free | 1 dep · 5 files | |
| Autocompleteautocomplete | adn-ui | Components | Free | 2 deps · 5 files | |
| Avataravatar | adn-ui | Components | Free | 2 deps · 5 files | |
| Badgebadge | adn-ui | Components | Free | 1 dep · 5 files | |
| Breadcrumbbreadcrumb | adn-ui | Components | Free | 1 dep · 5 files | |
| Buttonbutton | adn-ui | Components | Free | 1 dep · 4 files |
