import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
import { motion } from 'framer-motion';
import { forwardRef, type ComponentPropsWithoutRef } from 'react';
import { cn } from '@/lib/utils';
import { usePlatform } from '@/platform';
import { dropdown, dropdownTransition } from '../../motion/transitions';
export {
Root as DropdownMenu,
Trigger as DropdownMenuTrigger,
Group as DropdownMenuGroup,
Portal as DropdownMenuPortal,
Sub as DropdownMenuSub,
RadioGroup as DropdownMenuRadioGroup,
} from '@radix-ui/react-dropdown-menu';
// Icons
const CheckIcon = () => (
);
const ChevronRightIcon = () => (
);
const DotIcon = () => (
);
// SubTrigger
export interface DropdownMenuSubTriggerProps extends ComponentPropsWithoutRef<
typeof DropdownMenuPrimitive.SubTrigger
> {
inset?: boolean;
}
export const DropdownMenuSubTrigger = forwardRef(
({ className, inset, children, ...props }, ref) => (
{children}
),
);
DropdownMenuSubTrigger.displayName = 'DropdownMenuSubTrigger';
// SubContent
export type DropdownMenuSubContentProps = ComponentPropsWithoutRef<
typeof DropdownMenuPrimitive.SubContent
>;
export const DropdownMenuSubContent = forwardRef(
({ className, ...props }, ref) => (
),
);
DropdownMenuSubContent.displayName = 'DropdownMenuSubContent';
// Content
export type DropdownMenuContentProps = ComponentPropsWithoutRef<
typeof DropdownMenuPrimitive.Content
>;
export const DropdownMenuContent = forwardRef(
({ className, sideOffset = 4, ...props }, ref) => {
const { haptic } = usePlatform();
return (
haptic.impact('light')}
asChild
{...props}
>
);
},
);
DropdownMenuContent.displayName = 'DropdownMenuContent';
// Item
export interface DropdownMenuItemProps extends ComponentPropsWithoutRef<
typeof DropdownMenuPrimitive.Item
> {
inset?: boolean;
destructive?: boolean;
}
export const DropdownMenuItem = forwardRef(
({ className, inset, destructive, ...props }, ref) => {
const { haptic } = usePlatform();
return (
haptic.impact('light')}
{...props}
/>
);
},
);
DropdownMenuItem.displayName = 'DropdownMenuItem';
// CheckboxItem
export type DropdownMenuCheckboxItemProps = ComponentPropsWithoutRef<
typeof DropdownMenuPrimitive.CheckboxItem
>;
export const DropdownMenuCheckboxItem = forwardRef(
({ className, children, checked, ...props }, ref) => (
{children}
),
);
DropdownMenuCheckboxItem.displayName = 'DropdownMenuCheckboxItem';
// RadioItem
export type DropdownMenuRadioItemProps = ComponentPropsWithoutRef<
typeof DropdownMenuPrimitive.RadioItem
>;
export const DropdownMenuRadioItem = forwardRef(
({ className, children, ...props }, ref) => (
{children}
),
);
DropdownMenuRadioItem.displayName = 'DropdownMenuRadioItem';
// Label
export interface DropdownMenuLabelProps extends ComponentPropsWithoutRef<
typeof DropdownMenuPrimitive.Label
> {
inset?: boolean;
}
export const DropdownMenuLabel = forwardRef(
({ className, inset, ...props }, ref) => (
),
);
DropdownMenuLabel.displayName = 'DropdownMenuLabel';
// Separator
export type DropdownMenuSeparatorProps = ComponentPropsWithoutRef<
typeof DropdownMenuPrimitive.Separator
>;
export const DropdownMenuSeparator = forwardRef(
({ className, ...props }, ref) => (
),
);
DropdownMenuSeparator.displayName = 'DropdownMenuSeparator';
// Shortcut
export type DropdownMenuShortcutProps = React.HTMLAttributes;
export const DropdownMenuShortcut = ({ className, ...props }: DropdownMenuShortcutProps) => (
);
DropdownMenuShortcut.displayName = 'DropdownMenuShortcut';