{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "sidebar", "type": "registry:ui", "title": "Sidebar", "description": "A sidebar component that can be used to display a navigation menu.", "registryDependencies": [ "@tra-kit/button" ], "files": [ { "path": "registry/tra-kit/components/sidebar.tsx", "content": "import { createContext, useContext, useState, ReactNode, useMemo, useEffect } from 'react';\r\nimport { CaretLeftIcon, CaretRightIcon } from '@phosphor-icons/react';\r\nimport Button from './button';\r\n\r\ninterface ISidebar {\r\n children: ReactNode;\r\n headerLogo?: string;\r\n expandable?: boolean;\r\n}\r\n\r\ninterface ISidebarItem {\r\n icon: ReactNode;\r\n text: string;\r\n active?: boolean;\r\n alert?: boolean;\r\n url?: string;\r\n onClick?: () => void;\r\n}\r\n\r\nconst SidebarContext = createContext<{ expanded: boolean } | undefined>(undefined);\r\n\r\nconst Sidebar = ({ children, headerLogo, expandable = true }: ISidebar) => {\r\n const [expanded, setExpanded] = useState(true);\r\n const contextValue = useMemo(() => ({ expanded }), [expanded]);\r\n\r\n useEffect(() => {\r\n if (!expandable) {\r\n setExpanded(true);\r\n }\r\n }, [expandable]);\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport const SidebarItem = ({ icon, text, active, alert, onClick }: ISidebarItem) => {\r\n const context = useContext(SidebarContext);\r\n if (!context) {\r\n throw new Error('SidebarItem must be used within a Sidebar');\r\n }\r\n const { expanded } = context;\r\n return (\r\n {\r\n onClick?.();\r\n }}\r\n className={`group relative my-1 flex cursor-pointer items-center rounded-md px-3 py-2 font-medium transition-colors ${active ? 'bg-primary-15 text-primary' : 'justify-center hover:bg-neutral dark:hover:bg-primary-15'}`}\r\n >\r\n {icon}\r\n \r\n {text}\r\n \r\n {alert && (\r\n
\r\n )}\r\n\r\n {!expanded && (\r\n
\r\n {text}\r\n
\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Sidebar;\r\n", "type": "registry:ui" } ] }