|
import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; |
|
import { type ReactNode } from 'react'; |
|
import { classNames } from '~/utils/classNames'; |
|
|
|
interface DropdownProps { |
|
trigger: ReactNode; |
|
children: ReactNode; |
|
align?: 'start' | 'center' | 'end'; |
|
sideOffset?: number; |
|
} |
|
|
|
interface DropdownItemProps { |
|
children: ReactNode; |
|
onSelect?: () => void; |
|
className?: string; |
|
} |
|
|
|
export const DropdownItem = ({ children, onSelect, className }: DropdownItemProps) => ( |
|
<DropdownMenu.Item |
|
className={classNames( |
|
'relative flex items-center gap-2 px-3 py-2 rounded-lg text-sm', |
|
'text-bolt-elements-textPrimary hover:text-bolt-elements-textPrimary', |
|
'hover:bg-bolt-elements-background-depth-3', |
|
'transition-colors cursor-pointer', |
|
'outline-none', |
|
className, |
|
)} |
|
onSelect={onSelect} |
|
> |
|
{children} |
|
</DropdownMenu.Item> |
|
); |
|
|
|
export const DropdownSeparator = () => <DropdownMenu.Separator className="h-px bg-bolt-elements-borderColor my-1" />; |
|
|
|
export const Dropdown = ({ trigger, children, align = 'end', sideOffset = 5 }: DropdownProps) => { |
|
return ( |
|
<DropdownMenu.Root> |
|
<DropdownMenu.Trigger asChild>{trigger}</DropdownMenu.Trigger> |
|
|
|
<DropdownMenu.Portal> |
|
<DropdownMenu.Content |
|
className={classNames( |
|
'min-w-[220px] rounded-lg p-2', |
|
'bg-bolt-elements-background-depth-2', |
|
'border border-bolt-elements-borderColor', |
|
'shadow-lg', |
|
'animate-in fade-in-80 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', |
|
'z-[1000]', |
|
)} |
|
sideOffset={sideOffset} |
|
align={align} |
|
> |
|
{children} |
|
</DropdownMenu.Content> |
|
</DropdownMenu.Portal> |
|
</DropdownMenu.Root> |
|
); |
|
}; |
|
|