{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "adminlte-dropdown", "title": "AdminLTE Dropdown", "description": "Dropdown menu with trigger element, items, headers, footers, and dividers.", "registryDependencies": [ "https://raw.githubusercontent.com/dnachavez/adminlte-next/master/public/r/adminlte-theme.json" ], "files": [ { "path": "registry/new-york/adminlte-dropdown/ui/adminlte-dropdown.tsx", "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"@/registry/new-york/adminlte-theme/lib/cn\"\n\ninterface AdminLTEDropdownProps extends React.HTMLAttributes {\n trigger: React.ReactNode\n align?: \"left\" | \"right\"\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nconst AdminLTEDropdown = React.forwardRef(\n (\n {\n className,\n trigger,\n align = \"left\",\n open: controlledOpen,\n onOpenChange,\n children,\n ...props\n },\n ref\n ) => {\n const [internalOpen, setInternalOpen] = React.useState(false)\n const isOpen = controlledOpen ?? internalOpen\n const containerRef = React.useRef(null)\n\n const setOpen = React.useCallback(\n (value: boolean) => {\n setInternalOpen(value)\n onOpenChange?.(value)\n },\n [onOpenChange]\n )\n\n React.useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setOpen(false)\n }\n }\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside)\n }\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [isOpen, setOpen])\n\n return (\n {\n ;(containerRef as React.MutableRefObject).current = node\n if (typeof ref === \"function\") ref(node)\n else if (ref) ref.current = node\n }}\n className={cn(\"relative inline-block\", isOpen && \"open\", className)}\n {...props}\n >\n
setOpen(!isOpen)} className=\"cursor-pointer\">\n {trigger}\n
\n {isOpen && (\n \n {children}\n \n )}\n \n )\n }\n)\nAdminLTEDropdown.displayName = \"AdminLTEDropdown\"\n\ninterface DropdownItemProps extends React.LiHTMLAttributes {\n divider?: boolean\n header?: boolean\n active?: boolean\n disabled?: boolean\n}\n\nconst DropdownItem = React.forwardRef(\n (\n { className, divider, header, active, disabled, children, onClick, ...props },\n ref\n ) => {\n if (divider) {\n return (\n \n )\n }\n\n if (header) {\n return (\n \n {children}\n \n )\n }\n\n return (\n \n }\n >\n {children}\n \n \n )\n }\n)\nDropdownItem.displayName = \"DropdownItem\"\n\ninterface DropdownHeaderProps extends React.LiHTMLAttributes {}\n\nconst DropdownHeader = React.forwardRef(\n ({ className, children, ...props }, ref) => {\n return (\n \n {children}\n \n )\n }\n)\nDropdownHeader.displayName = \"DropdownHeader\"\n\ninterface DropdownFooterProps extends React.LiHTMLAttributes {}\n\nconst DropdownFooter = React.forwardRef(\n ({ className, children, ...props }, ref) => {\n return (\n \n {children}\n \n )\n }\n)\nDropdownFooter.displayName = \"DropdownFooter\"\n\nexport {\n AdminLTEDropdown,\n DropdownItem,\n DropdownHeader,\n DropdownFooter,\n}\nexport type { AdminLTEDropdownProps, DropdownItemProps }\n", "type": "registry:ui" } ], "type": "registry:ui" }