Sidebar
uiable/sidebarFreeComponent
Sidebar component.
Live preview
live · rendered by the registry
Rendered by uiable on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://uiable.com/r/sidebar.jsonSource
1"use client"23import {4 CSSProperties,5 ComponentProps,6 createContext,7 useCallback,8 useContext,9 useEffect,10 useMemo,11 useState,12} from "react"1314import { mergeProps } from "@base-ui/react/merge-props"15import { useRender } from "@base-ui/react/use-render"16import { cva, type VariantProps } from "class-variance-authority"1718import { useIsMobile } from "@/hooks/use-mobile"19import { cn } from "@/lib/utils"20import { Button } from "@/components/ui/button"21import { Input } from "@/components/ui/input"22import { Separator } from "@/components/ui/separator"23import {24 Sheet,25 SheetContent,26 SheetDescription,27 SheetHeader,28 SheetTitle,29} from "@/components/ui/sheet"30import { Skeleton } from "@/components/ui/skeleton"31import {32 Tooltip,33 TooltipContent,34 TooltipTrigger,35} from "@/components/ui/tooltip"36import { HamburgerMenu } from "iconsax-reactjs"3738const SIDEBAR_COOKIE_NAME = "sidebar_state"39const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 740const SIDEBAR_WIDTH = "17.5rem"41const SIDEBAR_WIDTH_MOBILE = "17.5rem"42const SIDEBAR_WIDTH_ICON = "3rem"43const SIDEBAR_KEYBOARD_SHORTCUT = "b"4445type SidebarContextProps = {46 state: "expanded" | "collapsed"47 open: boolean48 setOpen: (open: boolean) => void49 openMobile: boolean50 setOpenMobile: (open: boolean) => void51 isMobile: boolean52 toggleSidebar: () => void53}5455const SidebarContext = createContext<SidebarContextProps | null>(null)5657function useSidebar() {58 const context = useContext(SidebarContext)59 if (!context) {60 throw new Error("useSidebar must be used within a SidebarProvider.")61 }6263 return context64}6566function SidebarProvider({67 defaultOpen = true,68 open: openProp,69 onOpenChange: setOpenProp,70 className,71 style,72 children,73 ...props74}: ComponentProps<"div"> & {75 defaultOpen?: boolean76 open?: boolean77 onOpenChange?: (open: boolean) => void78}) {79 const isMobile = useIsMobile()80 const [openMobile, setOpenMobile] = useState(false)8182 // This is the internal state of the sidebar.83 // We use openProp and setOpenProp for control from outside the component.84 const [_open, _setOpen] = useState(defaultOpen)85 const open = openProp ?? _open86 const setOpen = useCallback(87 (value: boolean | ((value: boolean) => boolean)) => {88 const openState = typeof value === "function" ? value(open) : value89 if (setOpenProp) {90 setOpenProp(openState)91 } else {92 _setOpen(openState)93 }9495 // This sets the cookie to keep the sidebar state.96// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from uiable
All 747 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | uiable | Components | Free | 2 deps | |
| Accordion Basicaccordion-basic | uiable | Components | Free | no deps | |
| Accordion Bordersaccordion-borders | uiable | Components | Free | no deps | |
| Accordion Cardaccordion-card | uiable | Components | Free | no deps | |
| Accordion Disabledaccordion-disabled | uiable | Components | Free | no deps | |
| Accordion Flushaccordion-flush | uiable | Components | Free | no deps | |
| Accordion Multipleaccordion-multiple | uiable | Components | Free | no deps | |
| Alertalert | uiable | Components | Free | 1 dep |
