import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; import { DropdownMenuRadioGroup } from '@radix-ui/react-dropdown-menu'; import { motion } from 'framer-motion'; import { CheckIcon, ChevronRightIcon, DotFilledIcon, HamburgerMenuIcon, } from '@radix-ui/react-icons'; import { forwardRef, HTMLAttributes, ReactNode, useState } from 'react'; import { Button } from './Button'; import classnames from 'classnames'; import { HotKey } from './HotKey'; interface DropdownMenuRadioProps { children: ReactNode; onValueChange: ((v: { label: string; value: string }) => void) | null; value: string; label?: string; items: { label: string; value: string; }[]; } export function DropdownMenuRadio({ children, items, onValueChange, label, value, }: DropdownMenuRadioProps) { const handleChange = (value: string) => { const item = items.find((item) => item.value === value); if (item && onValueChange) { onValueChange(item); } }; return ( {children} {label && {label}} {items.map((item) => ( {item.label} ))} ); } export interface DropdownProps { children: ReactNode; items: { label: string; onSelect?: () => void; disabled?: boolean; }[]; } export function Dropdown({ children, items }: DropdownProps) { return ( {children} {items.map((item, i) => ( item.onSelect?.()} disabled={item.disabled}> {item.label} ))} ); } const dropdownMenuClasses = 'bg-background rounded-md shadow-lg p-1.5 border border-gray-100'; interface DropdownMenuPortalProps { children: ReactNode; } function DropdownMenuPortal({ children }: DropdownMenuPortalProps) { return ( ('#radix-portal')}> {children} ); } const DropdownMenuContent = forwardRef( function DropdownMenuContent( { className, children, ...props }: DropdownMenu.DropdownMenuContentProps, ref, ) { return ( {children} ); }, ); type DropdownMenuItemProps = DropdownMenu.DropdownMenuItemProps & ItemInnerProps; function DropdownMenuItem({ leftSlot, rightSlot, className, children, disabled, ...props }: DropdownMenuItemProps) { return ( {children} ); } type DropdownMenuCheckboxItemProps = DropdownMenu.DropdownMenuCheckboxItemProps & ItemInnerProps; function DropdownMenuCheckboxItem({ leftSlot, rightSlot, children, ...props }: DropdownMenuCheckboxItemProps) { return ( {children} ); } type DropdownMenuSubTriggerProps = DropdownMenu.DropdownMenuSubTriggerProps & ItemInnerProps; function DropdownMenuSubTrigger({ leftSlot, rightSlot, children, ...props }: DropdownMenuSubTriggerProps) { return ( {children} ); } type DropdownMenuRadioItemProps = Omit< DropdownMenu.DropdownMenuRadioItemProps & ItemInnerProps, 'leftSlot' >; function DropdownMenuRadioItem({ rightSlot, children, ...props }: DropdownMenuRadioItemProps) { return ( } rightSlot={rightSlot} > {children} ); } const DropdownMenuSubContent = forwardRef( function DropdownMenuSubContent( { className, ...props }: DropdownMenu.DropdownMenuSubContentProps, ref, ) { return ( ); }, ); function DropdownMenuLabel({ className, children, ...props }: DropdownMenu.DropdownMenuLabelProps) { return ( {children} ); } function DropdownMenuSeparator({ className, ...props }: DropdownMenu.DropdownMenuSeparatorProps) { return ( ); } function DropdownMenuTrigger({ className, ...props }: DropdownMenu.DropdownMenuTriggerProps) { return ( ); } interface ItemInnerProps extends HTMLAttributes { leftSlot?: ReactNode; rightSlot?: ReactNode; children: ReactNode; noHover?: boolean; } const ItemInner = forwardRef(function ItemInner( { leftSlot, rightSlot, children, className, noHover, ...props }: ItemInnerProps, ref, ) { return (
{leftSlot &&
{leftSlot}
}
{children}
{rightSlot &&
{rightSlot}
}
); });