Sidebar rail
blacksite/sidebar-railFreeComponent
Vertical icon navigation rail.
Install it
npx shadcn@latest add https://blacksite.sh/r/sidebar-rail.jsonSource
1"use client";23import * as React from "react";4import type { LucideIcon } from "lucide-react";56import { cn } from "@/lib/utils";7import {8 Tooltip,9 TooltipContent,10 TooltipProvider,11 TooltipTrigger,12} from "@/registry/blacksite/ui/tooltip";1314export interface SidebarRailItem {15 id: string;16 icon: LucideIcon;17 label: string;18 badge?: React.ReactNode;19 onSelect?: () => void;20 disabled?: boolean;21}2223interface SidebarRailProps extends React.HTMLAttributes<HTMLElement> {24 items: SidebarRailItem[];25 footerItems?: SidebarRailItem[];26 activeId?: string;27 onActiveChange?: (id: string) => void;28}2930const SidebarRail = React.forwardRef<HTMLElement, SidebarRailProps>(31 ({ className, items, footerItems, activeId, onActiveChange, ...props }, ref) => {32 return (33 <TooltipProvider delayDuration={150}>34 <nav35 ref={ref}36 aria-label="Primary"37 className={cn(38 "border-border bg-background-elevated flex w-12 flex-col items-center gap-1 border-r py-2",39 className,40 )}41 {...props}42 >43 <div className="flex flex-col items-center gap-1">44 {items.map((item) => (45 <RailButton46 key={item.id}47 item={item}48 active={item.id === activeId}49 onClick={() => {50 if (item.disabled) return;51 item.onSelect?.();52 onActiveChange?.(item.id);53 }}54 />55 ))}56 </div>57 {footerItems && footerItems.length > 0 && (58 <>59 <div className="flex-1" />60 <div className="flex flex-col items-center gap-1">61 {footerItems.map((item) => (62 <RailButton63 key={item.id}64 item={item}65 active={item.id === activeId}66 onClick={() => {67 if (item.disabled) return;68 item.onSelect?.();69 onActiveChange?.(item.id);70 }}71 />72 ))}73 </div>74 </>75 )}76 </nav>77 </TooltipProvider>78 );79 },80);81SidebarRail.displayName = "SidebarRail";8283function RailButton({84 item,85 active,86 onClick,87}: {88 item: SidebarRailItem;89 active?: boolean;90 onClick?: () => void;91}) {92 const Icon = item.icon;93 return (94 <Tooltip>95 <TooltipTrigger asChild>96// … truncated
More from blacksite
All 25 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| App headerapp-header | blacksite | Components | Free | no deps | |
| Badgebadge | blacksite | Components | Free | no deps | |
| Bar chartbar-chart | blacksite | Components | Free | no deps | |
| Buttonbutton | blacksite | Components | Free | no deps | |
| Cardcard | blacksite | Components | Free | no deps | |
| Chart tooltipchart-tooltip | blacksite | Components | Free | no deps | |
| Data listdata-list | blacksite | Components | Free | no deps | |
| Gantt timelinegantt-timeline | blacksite | Components | Free | no deps |
