Spaces:
Sleeping
Sleeping
| 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> | |
| ); | |
| }; | |