90 lines
2.3 KiB
TypeScript
90 lines
2.3 KiB
TypeScript
'use client';
|
|
|
|
import type * as React from 'react';
|
|
import { Popover as PopoverPrimitive } from 'radix-ui';
|
|
|
|
import { cn } from '@gib/ui';
|
|
|
|
function Popover({
|
|
...props
|
|
}: React.ComponentProps<typeof PopoverPrimitive.Root>) {
|
|
return <PopoverPrimitive.Root data-slot='popover' {...props} />;
|
|
}
|
|
|
|
function PopoverTrigger({
|
|
...props
|
|
}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {
|
|
return <PopoverPrimitive.Trigger data-slot='popover-trigger' {...props} />;
|
|
}
|
|
|
|
function PopoverContent({
|
|
className,
|
|
align = 'center',
|
|
sideOffset = 4,
|
|
...props
|
|
}: React.ComponentProps<typeof PopoverPrimitive.Content>) {
|
|
return (
|
|
<PopoverPrimitive.Portal>
|
|
<PopoverPrimitive.Content
|
|
data-slot='popover-content'
|
|
align={align}
|
|
sideOffset={sideOffset}
|
|
className={cn(
|
|
'bg-popover text-popover-foreground 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 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden',
|
|
className,
|
|
)}
|
|
{...props}
|
|
/>
|
|
</PopoverPrimitive.Portal>
|
|
);
|
|
}
|
|
|
|
function PopoverAnchor({
|
|
...props
|
|
}: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {
|
|
return <PopoverPrimitive.Anchor data-slot='popover-anchor' {...props} />;
|
|
}
|
|
|
|
function PopoverHeader({ className, ...props }: React.ComponentProps<'div'>) {
|
|
return (
|
|
<div
|
|
data-slot='popover-header'
|
|
className={cn('flex flex-col gap-1 text-sm', className)}
|
|
{...props}
|
|
/>
|
|
);
|
|
}
|
|
|
|
function PopoverTitle({ className, ...props }: React.ComponentProps<'h2'>) {
|
|
return (
|
|
<div
|
|
data-slot='popover-title'
|
|
className={cn('font-medium', className)}
|
|
{...props}
|
|
/>
|
|
);
|
|
}
|
|
|
|
function PopoverDescription({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<'p'>) {
|
|
return (
|
|
<p
|
|
data-slot='popover-description'
|
|
className={cn('text-muted-foreground', className)}
|
|
{...props}
|
|
/>
|
|
);
|
|
}
|
|
|
|
export {
|
|
Popover,
|
|
PopoverTrigger,
|
|
PopoverContent,
|
|
PopoverAnchor,
|
|
PopoverHeader,
|
|
PopoverTitle,
|
|
PopoverDescription,
|
|
};
|