Sidebar
hoogin/sidebarFreeComponent
A collapsible sidebar that persists its state in localStorage.
Install it
npx shadcn@latest add https://shadcn.hoogin.be/r/sidebar.jsonSource
1import * as React from "react"2import { mergeProps } from "@base-ui/react/merge-props"3import { useRender } from "@base-ui/react/use-render"4import { cva, type VariantProps } from "class-variance-authority"56import { useIsMobile } from "@/hooks/use-mobile"7import { cn } from "@/lib/utils"8import { Button } from "@/components/ui/button"9import { Input } from "@/components/ui/input"10import { Separator } from "@/components/ui/separator"11import {12 Sheet,13 SheetContent,14 SheetDescription,15 SheetHeader,16 SheetTitle,17} from "@/components/ui/sheet"18import { Skeleton } from "@/components/ui/skeleton"19import {20 Tooltip,21 TooltipContent,22 TooltipTrigger,23} from "@/components/ui/tooltip"24import { PanelLeftIcon } from "lucide-react"2526const SIDEBAR_STORAGE_KEY = "sidebar_state"27const SIDEBAR_WIDTH = "16rem"28const SIDEBAR_WIDTH_MOBILE = "18rem"29const SIDEBAR_WIDTH_ICON = "3rem"30const SIDEBAR_KEYBOARD_SHORTCUT = "b"3132type SidebarContextProps = {33 state: "expanded" | "collapsed"34 open: boolean35 setOpen: (open: boolean) => void36 openMobile: boolean37 setOpenMobile: (open: boolean) => void38 isMobile: boolean39 toggleSidebar: () => void40}4142const SidebarContext = React.createContext<SidebarContextProps | null>(null)4344function useSidebar() {45 const context = React.useContext(SidebarContext)46 if (!context) {47 throw new Error("useSidebar must be used within a SidebarProvider.")48 }4950 return context51}5253function SidebarProvider({54 defaultOpen = true,55 open: openProp,56 onOpenChange: setOpenProp,57 className,58 style,59 children,60 ...props61}: React.ComponentProps<"div"> & {62 defaultOpen?: boolean63 open?: boolean64 onOpenChange?: (open: boolean) => void65}) {66 const isMobile = useIsMobile()67 const [openMobile, setOpenMobile] = React.useState(false)6869 // This is the internal state of the sidebar.70 // We use openProp and setOpenProp for control from outside the component.71 const [_open, _setOpen] = React.useState(() => {72 const stored = localStorage.getItem(SIDEBAR_STORAGE_KEY)73 return stored === null ? defaultOpen : stored === "true"74 })75 const open = openProp ?? _open76 const setOpen = React.useCallback(77 (value: boolean | ((value: boolean) => boolean)) => {78 const openState = typeof value === "function" ? value(open) : value79 if (setOpenProp) {80 setOpenProp(openState)81 } else {82 _setOpen(openState)83 }8485 // This sets the sidebar state in localStorage.86// … truncated
What it pulls in
Other registry items
Files it writes
More from hoogin
All 6 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| App Sidebarapp-sidebar | hoogin | Components | Free | no deps · 6 files | |
| Spinnerspinner | hoogin | Components | Free | no deps | |
| Theme Providertheme-provider | hoogin | Components | Free | no deps | |
| Theme Toggletheme-toggle | hoogin | Components | Free | no deps |
