Path: blob/master/gate-controller/components/ui/dropdown-menu.tsx
1082 views
"use client"12import * as React from "react"3import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"4import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react"56import { cn } from "@/lib/utils"78function DropdownMenu({9...props10}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {11return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} />12}1314function DropdownMenuPortal({15...props16}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {17return (18<DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />19)20}2122function DropdownMenuTrigger({23...props24}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {25return (26<DropdownMenuPrimitive.Trigger27data-slot="dropdown-menu-trigger"28{...props}29/>30)31}3233function DropdownMenuContent({34className,35sideOffset = 4,36...props37}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {38return (39<DropdownMenuPrimitive.Portal>40<DropdownMenuPrimitive.Content41data-slot="dropdown-menu-content"42sideOffset={sideOffset}43className={cn(44"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]: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-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",45className46)}47{...props}48/>49</DropdownMenuPrimitive.Portal>50)51}5253function DropdownMenuGroup({54...props55}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {56return (57<DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />58)59}6061function DropdownMenuItem({62className,63inset,64variant = "default",65...props66}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {67inset?: boolean68variant?: "default" | "destructive"69}) {70return (71<DropdownMenuPrimitive.Item72data-slot="dropdown-menu-item"73data-inset={inset}74data-variant={variant}75className={cn(76"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",77className78)}79{...props}80/>81)82}8384function DropdownMenuCheckboxItem({85className,86children,87checked,88...props89}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {90return (91<DropdownMenuPrimitive.CheckboxItem92data-slot="dropdown-menu-checkbox-item"93className={cn(94"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",95className96)}97checked={checked}98{...props}99>100<span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">101<DropdownMenuPrimitive.ItemIndicator>102<CheckIcon className="size-4" />103</DropdownMenuPrimitive.ItemIndicator>104</span>105{children}106</DropdownMenuPrimitive.CheckboxItem>107)108}109110function DropdownMenuRadioGroup({111...props112}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {113return (114<DropdownMenuPrimitive.RadioGroup115data-slot="dropdown-menu-radio-group"116{...props}117/>118)119}120121function DropdownMenuRadioItem({122className,123children,124...props125}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {126return (127<DropdownMenuPrimitive.RadioItem128data-slot="dropdown-menu-radio-item"129className={cn(130"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",131className132)}133{...props}134>135<span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">136<DropdownMenuPrimitive.ItemIndicator>137<CircleIcon className="size-2 fill-current" />138</DropdownMenuPrimitive.ItemIndicator>139</span>140{children}141</DropdownMenuPrimitive.RadioItem>142)143}144145function DropdownMenuLabel({146className,147inset,148...props149}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {150inset?: boolean151}) {152return (153<DropdownMenuPrimitive.Label154data-slot="dropdown-menu-label"155data-inset={inset}156className={cn(157"px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",158className159)}160{...props}161/>162)163}164165function DropdownMenuSeparator({166className,167...props168}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {169return (170<DropdownMenuPrimitive.Separator171data-slot="dropdown-menu-separator"172className={cn("bg-border -mx-1 my-1 h-px", className)}173{...props}174/>175)176}177178function DropdownMenuShortcut({179className,180...props181}: React.ComponentProps<"span">) {182return (183<span184data-slot="dropdown-menu-shortcut"185className={cn(186"text-muted-foreground ml-auto text-xs tracking-widest",187className188)}189{...props}190/>191)192}193194function DropdownMenuSub({195...props196}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {197return <DropdownMenuPrimitive.Sub data-slot="dropdown-menu-sub" {...props} />198}199200function DropdownMenuSubTrigger({201className,202inset,203children,204...props205}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {206inset?: boolean207}) {208return (209<DropdownMenuPrimitive.SubTrigger210data-slot="dropdown-menu-sub-trigger"211data-inset={inset}212className={cn(213"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8",214className215)}216{...props}217>218{children}219<ChevronRightIcon className="ml-auto size-4" />220</DropdownMenuPrimitive.SubTrigger>221)222}223224function DropdownMenuSubContent({225className,226...props227}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {228return (229<DropdownMenuPrimitive.SubContent230data-slot="dropdown-menu-sub-content"231className={cn(232"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]: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-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",233className234)}235{...props}236/>237)238}239240export {241DropdownMenu,242DropdownMenuPortal,243DropdownMenuTrigger,244DropdownMenuContent,245DropdownMenuGroup,246DropdownMenuLabel,247DropdownMenuItem,248DropdownMenuCheckboxItem,249DropdownMenuRadioGroup,250DropdownMenuRadioItem,251DropdownMenuSeparator,252DropdownMenuShortcut,253DropdownMenuSub,254DropdownMenuSubTrigger,255DropdownMenuSubContent,256}257258259