{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "action-toolbar", "type": "registry:ui", "title": "Action Toolbar", "description": "Versatile toolbar component with action buttons and dropdown menus for common operations.", "dependencies": [ "lucide-react" ], "registryDependencies": [ "button", "dropdown-menu", "badge" ], "files": [ { "path": "registry/ruixenui/action-toolbar.tsx", "content": "\"use client\";\n\nimport { useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { ChevronDown } from \"lucide-react\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface ToolbarButton {\n label: string;\n icon?: React.ReactNode;\n count?: number;\n onClick?: () => void;\n dropdownItems?: string[];\n active?: boolean;\n}\n\ninterface ActionToolbarProps {\n buttons: ToolbarButton[];\n compact?: boolean;\n className?: string;\n}\n\nexport function ActionToolbar({\n buttons,\n compact = false,\n className = \"\",\n}: ActionToolbarProps) {\n const [activeStates, setActiveStates] = useState(\n buttons.map((btn) => !!btn.active),\n );\n\n const handleToggle = (index: number, onClick?: () => void) => {\n const updated = [...activeStates];\n updated[index] = !updated[index];\n setActiveStates(updated);\n if (onClick) onClick();\n };\n\n return (\n \n {buttons.map((btn, index) => {\n const isActive = activeStates[index];\n\n const buttonClasses = cn(\n \"flex items-center gap-2 px-3 h-9 rounded-xl transition-all duration-200\",\n isActive\n ? \"bg-primary text-primary-foreground shadow-sm\"\n : \"hover:bg-muted/80 hover:text-foreground text-muted-foreground\",\n );\n\n if (btn.dropdownItems) {\n return (\n
\n handleToggle(index, btn.onClick)}\n variant=\"ghost\"\n className={cn(buttonClasses, compact && \"px-2\")}\n >\n {btn.icon}\n {btn.label}\n {btn.count !== undefined && (\n \n {btn.count}\n \n )}\n \n \n \n \n \n \n \n \n {btn.dropdownItems.map((item, i) => (\n console.log(item)}>\n {item}\n \n ))}\n \n \n
\n );\n }\n\n return (\n handleToggle(index, btn.onClick)}\n variant=\"ghost\"\n className={cn(buttonClasses, compact && \"px-2\")}\n >\n {btn.icon}\n {btn.label}\n {btn.count !== undefined && (\n \n {btn.count}\n \n )}\n \n );\n })}\n \n );\n}\n", "type": "registry:ui", "target": "components/ruixen/action-toolbar.tsx" } ] }