Sidebar
adn-ui/sidebarFreeComponent
An accessible, collapsible application navigation sidebar.
Live preview
live · rendered by the registry
Rendered by adn-ui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://ui.awaiden.com/r/sidebar.jsonSource
1"use client";23import "./sidebar.css";4import React, { useState } from "react";5import { cn } from "tailwind-variants";67import { SidebarContext, useSidebar } from "./sidebar.context";8import { sidebarVariants, type SidebarVariants } from "./sidebar.variants";910export type SidebarProviderProps = {11 defaultOpen?: boolean;12 open?: boolean;13 onOpenChange?: (open: boolean) => void;14 children?: React.ReactNode;15 className?: string;16} & React.ComponentProps<"div">;1718export const SidebarProvider = ({19 children,20 className,21 defaultOpen = true,22 open: openProp,23 onOpenChange,24 ...props25}: SidebarProviderProps) => {26 const [internalOpen, setInternalOpen] = useState(defaultOpen);27 const open = openProp ?? internalOpen;2829 const setOpen = React.useCallback(30 (value: boolean | ((prev: boolean) => boolean)) => {31 const nextOpen = typeof value === "function" ? value(open) : value;32 if (onOpenChange) {33 onOpenChange(nextOpen);34 } else {35 setInternalOpen(nextOpen);36 }37 },38 [open, onOpenChange]39 );4041 const toggleSidebar = React.useCallback(() => {42 setOpen((prev) => !prev);43 }, [setOpen]);4445 const slots = sidebarVariants();4647 return (48 <SidebarContext.Provider value={{ slots, open, setOpen, toggleSidebar }}>49 <div className={cn(slots.provider(), className)} {...props}>50 {children}51 </div>52 </SidebarContext.Provider>53 );54};5556export type SidebarProps = SidebarVariants & React.ComponentProps<"aside">;5758export const SidebarRoot = ({ className, children, ...props }: SidebarProps) => {59 const { slots, open } = useSidebar();60 return (61 <aside62 data-collapsed={!open}63 className={cn(slots.root(), className)}64 {...props}65 >66 {children}67 </aside>68 );69};7071export type SidebarHeaderProps = React.ComponentProps<"div">;72export const SidebarHeader = ({ className, ...props }: SidebarHeaderProps) => {73 const { slots } = useSidebar();74 return <div className={cn(slots.header(), className)} {...props} />;75};7677export type SidebarContentProps = React.ComponentProps<"div">;78export const SidebarContent = ({ className, ...props }: SidebarContentProps) => {79 const { slots } = useSidebar();80 return <div className={cn(slots.content(), className)} {...props} />;81};8283export type SidebarFooterProps = React.ComponentProps<"div">;84export const SidebarFooter = ({ className, ...props }: SidebarFooterProps) => {85 const { slots } = useSidebar();86// … truncated
What it pulls in
npm packages
Files it writes
More from adn-ui
All 46 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | adn-ui | Components | Free | 2 deps · 5 files | |
| Alert Dialogalert-dialog | adn-ui | Components | Free | 2 deps · 5 files | |
| Aspect Ratioaspect-ratio | adn-ui | Components | Free | 1 dep · 5 files | |
| Autocompleteautocomplete | adn-ui | Components | Free | 2 deps · 5 files | |
| Avataravatar | adn-ui | Components | Free | 2 deps · 5 files | |
| Badgebadge | adn-ui | Components | Free | 1 dep · 5 files | |
| Breadcrumbbreadcrumb | adn-ui | Components | Free | 1 dep · 5 files | |
| Buttonbutton | adn-ui | Components | Free | 1 dep · 4 files |
