Sidebar
sidcn/sidebarFreeComponent
A beautiful sidebar component
Live preview
live · rendered by the registry
Rendered by sidcn on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://ui.siddhesh.cc/r/sidebar.jsonSource
1import { cva, type VariantProps } from 'class-variance-authority'2import Cookies from 'js-cookie'3import { PanelLeftIcon } from 'lucide-react'4import { Slot } from 'radix-ui'5import * as React from 'react'6import { Button } from '@/components/ui/button'7import { Input } from '@/components/ui/input'8import { Separator } from '@/components/ui/separator'9import {10 Sheet,11 SheetContent,12 SheetDescription,13 SheetHeader,14 SheetTitle,15} from '@/components/ui/sheet'16import { Skeleton } from '@/components/ui/skeleton'17import {18 Tooltip,19 TooltipContent,20 TooltipProvider,21 TooltipTrigger,22} from '@/components/ui/tooltip'23import { useIsMobile } from '@/hooks/use-mobile'24import { cn } from '@/lib/utils'2526const SIDEBAR_COOKIE_NAME = 'sidebar_state'27const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 728const SIDEBAR_WIDTH = '16rem'29const SIDEBAR_WIDTH_MOBILE = '18rem'30const SIDEBAR_WIDTH_ICON = '3rem'31const SIDEBAR_KEYBOARD_SHORTCUT = 'b'3233type SidebarContextProps = {34 state: 'expanded' | 'collapsed'35 open: boolean36 setOpen: (open: boolean) => void37 openMobile: boolean38 setOpenMobile: (open: boolean) => void39 isMobile: boolean40 toggleSidebar: () => void41}4243const SidebarContext = React.createContext<SidebarContextProps | null>(null)4445function useSidebar() {46 const context = React.useContext(SidebarContext)47 if (!context) {48 throw new Error('useSidebar must be used within a SidebarProvider.')49 }5051 return context52}5354function SidebarProvider({55 defaultOpen = true,56 open: openProp,57 onOpenChange: setOpenProp,58 className,59 style,60 children,61 ...props62}: React.ComponentProps<'div'> & {63 defaultOpen?: boolean64 open?: boolean65 onOpenChange?: (open: boolean) => void66}) {67 const isMobile = useIsMobile()68 const [openMobile, setOpenMobile] = React.useState(false)6970 // This is the internal state of the sidebar.71 // We use openProp and setOpenProp for control from outside the component.72 const [_open, _setOpen] = React.useState(defaultOpen)73 const open = openProp ?? _open74 const setOpen = React.useCallback(75 (value: boolean | ((value: boolean) => boolean)) => {76 const openState = typeof value === 'function' ? value(open) : value77 if (setOpenProp) {78 setOpenProp(openState)79 } else {80 _setOpen(openState)81 }8283 // This sets the cookie to keep the sidebar state.84 Cookies.set(SIDEBAR_COOKIE_NAME, `${openState}`, {85// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from sidcn
All 14 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Badgebadge | sidcn | Components | Free | 3 deps | |
| Buttonbutton | sidcn | Components | Free | 2 deps | |
| Data Tabledata-table | sidcn | Components | Free | 2 deps | |
| Date Inputdate-input | sidcn | Components | Free | 1 dep | |
| Date Time Inputdate-time-input | sidcn | Components | Free | 2 deps | |
| Iconsicons | sidcn | Components | Free | no deps | |
| Package Manager Commandpackage-manager-command | sidcn | Components | Free | no deps | |
| Sonnersonner | sidcn | Components | Free | 2 deps |
