mosaicmap/components/tiptap-ui-primitive/dropdown-menu/dropdown-menu.tsx
2025-08-12 21:25:52 +08:00

99 lines
2.8 KiB
TypeScript

"use client"
import * as React from "react"
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
import { cn } from "@/lib/tiptap-utils"
import "@/components/tiptap-ui-primitive/dropdown-menu/dropdown-menu.scss"
function DropdownMenu({
...props
}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
return <DropdownMenuPrimitive.Root modal={false} {...props} />
}
function DropdownMenuPortal({
...props
}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {
return <DropdownMenuPrimitive.Portal {...props} />
}
const DropdownMenuTrigger = React.forwardRef<
React.ComponentRef<typeof DropdownMenuPrimitive.Trigger>,
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Trigger>
>(({ ...props }, ref) => <DropdownMenuPrimitive.Trigger ref={ref} {...props} />)
DropdownMenuTrigger.displayName = DropdownMenuPrimitive.Trigger.displayName
const DropdownMenuGroup = DropdownMenuPrimitive.Group
const DropdownMenuSub = DropdownMenuPrimitive.Sub
const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup
const DropdownMenuItem = DropdownMenuPrimitive.Item
const DropdownMenuSubTrigger = DropdownMenuPrimitive.SubTrigger
const DropdownMenuSubContent = React.forwardRef<
React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent> & {
portal?: boolean | React.ComponentProps<typeof DropdownMenuPortal>
}
>(({ className, portal = true, ...props }, ref) => {
const content = (
<DropdownMenuPrimitive.SubContent
ref={ref}
className={cn("tiptap-dropdown-menu", className)}
{...props}
/>
)
return portal ? (
<DropdownMenuPortal {...(typeof portal === "object" ? portal : {})}>
{content}
</DropdownMenuPortal>
) : (
content
)
})
DropdownMenuSubContent.displayName =
DropdownMenuPrimitive.SubContent.displayName
const DropdownMenuContent = React.forwardRef<
React.ComponentRef<typeof DropdownMenuPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> & {
portal?: boolean
}
>(({ className, sideOffset = 4, portal = false, ...props }, ref) => {
const content = (
<DropdownMenuPrimitive.Content
ref={ref}
sideOffset={sideOffset}
onCloseAutoFocus={(e) => e.preventDefault()}
className={cn("tiptap-dropdown-menu", className)}
{...props}
/>
)
return portal ? (
<DropdownMenuPortal {...(typeof portal === "object" ? portal : {})}>
{content}
</DropdownMenuPortal>
) : (
content
)
})
DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName
export {
DropdownMenu,
DropdownMenuTrigger,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuGroup,
DropdownMenuSub,
DropdownMenuPortal,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
DropdownMenuRadioGroup,
}