Navigation (Side)
blok/sidebarFreeComponent
A styled, simple, reusable sidebar
Install it
npx shadcn@latest add https://blok.sitecore.com/r/sidebar.jsonSource
1"use client";23import { Button } from "@/components/ui/button";4import { Input } from "@/components/ui/input";5import { Separator } from "@/components/ui/separator";6import {7 Sheet,8 SheetContent,9 SheetDescription,10 SheetHeader,11 SheetTitle,12} from "@/components/ui/sheet";13import { Skeleton } from "@/components/ui/skeleton";14import {15 Tooltip,16 TooltipContent,17 TooltipProvider,18 TooltipTrigger,19} from "@/components/ui/tooltip";20import { useIsMobile } from "@/hooks/use-mobile";21import { cn } from "@/lib/utils";22import { type VariantProps, cva } from "class-variance-authority";23import { PanelLeftIcon } from "lucide-react";24import { Slot } from "radix-ui";25import * as React from "react";2627const SIDEBAR_COOKIE_NAME = "sidebar_state";28const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;29const SIDEBAR_WIDTH = "16rem";30const SIDEBAR_WIDTH_MOBILE = "18rem";31const SIDEBAR_WIDTH_ICON = "3rem";32const SIDEBAR_KEYBOARD_SHORTCUT = "b";3334type SidebarContextProps = {35 state: "expanded" | "collapsed";36 open: boolean;37 setOpen: (open: boolean) => void;38 openMobile: boolean;39 setOpenMobile: (open: boolean) => void;40 isMobile: boolean;41 toggleSidebar: () => void;42};4344const SidebarContext = React.createContext<SidebarContextProps | null>(null);4546function useSidebar() {47 const context = React.useContext(SidebarContext);48 if (!context) {49 throw new Error("useSidebar must be used within a SidebarProvider.");50 }5152 return context;53}5455function SidebarProvider({56 defaultOpen = true,57 open: openProp,58 onOpenChange: setOpenProp,59 className,60 style,61 children,62 ...props63}: React.ComponentProps<"div"> & {64 defaultOpen?: boolean;65 open?: boolean;66 onOpenChange?: (open: boolean) => void;67}) {68 const isMobile = useIsMobile();69 const [openMobile, setOpenMobile] = React.useState(false);7071 // This is the internal state of the sidebar.72 // We use openProp and setOpenProp for control from outside the component.73 const [_open, _setOpen] = React.useState(defaultOpen);74 const open = openProp ?? _open;75 const setOpen = React.useCallback(76 (value: boolean | ((value: boolean) => boolean)) => {77 const openState = typeof value === "function" ? value(open) : value;78 if (setOpenProp) {79 setOpenProp(openState);80 } else {81 _setOpen(openState);82 }8384 // This sets the cookie to keep the sidebar state.85 document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;86 },87// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from blok
All 72 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | blok | Components | Free | 2 deps · 2 files | |
| Action baraction-bar | blok | Components | Free | 1 dep · 2 files | |
| Alertalert | blok | Components | Free | 2 deps · 2 files | |
| Alert dialogalert-dialog | blok | Components | Free | 2 deps | |
| Aspect ratioaspect-ratio | blok | Components | Free | 1 dep | |
| Avataravatar | blok | Components | Free | 1 dep | |
| Badgebadge | blok | Components | Free | 2 deps | |
| All componentsblok-components | blok | Components | Free | no deps |
