brunner56's picture
implement app
0bfe2e3
'use client';
import * as PopoverPrimitive from '@radix-ui/react-popover';
import { cva } from 'class-variance-authority';
import * as React from 'react';
import { cn, defineStyleAnatomy } from '../core/styling';
/* -------------------------------------------------------------------------------------------------
* Anatomy
* -----------------------------------------------------------------------------------------------*/
export const PopoverAnatomy = defineStyleAnatomy({
root: cva([
'UI-Popover__root',
'z-50 w-72 rounded-[--radius] border bg-[--background] p-4 text-base shadow-sm outline-none',
'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0',
'data-[state=open]:fade-in-50 data-[state=closed]:zoom-out-100 data-[state=open]:zoom-in-95',
'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2',
'data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
]),
});
/* -------------------------------------------------------------------------------------------------
* Popover
* -----------------------------------------------------------------------------------------------*/
export type PopoverProps = React.ComponentPropsWithoutRef<
typeof PopoverPrimitive.Root
> &
Omit<
React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>,
'asChild'
> & {
/**
* The trigger element that opens the popover
*/
trigger: React.ReactElement;
/**
* Additional props for the trigger element
*/
triggerProps?: React.ComponentPropsWithoutRef<
typeof PopoverPrimitive.Trigger
>;
};
export const Popover = React.forwardRef<HTMLDivElement, PopoverProps>(
(props, ref) => {
const {
trigger,
triggerProps,
// Root
defaultOpen,
open,
onOpenChange,
modal = true,
// Content
className,
align = 'center',
sideOffset = 8,
...contentProps
} = props;
return (
<PopoverPrimitive.Root
defaultOpen={defaultOpen}
open={open}
onOpenChange={onOpenChange}
modal={modal}
>
<PopoverPrimitive.Trigger asChild {...triggerProps}>
{trigger}
</PopoverPrimitive.Trigger>
<PopoverPrimitive.Portal>
<PopoverPrimitive.Content
ref={ref}
align={align}
sideOffset={sideOffset}
className={cn(PopoverAnatomy.root(), className)}
onOpenAutoFocus={(e) => e.preventDefault()}
{...contentProps}
/>
</PopoverPrimitive.Portal>
</PopoverPrimitive.Root>
);
}
);
Popover.displayName = 'Popover';