Files
OmniRoute/src/shared/components/docs/DocsSidebar.tsx
2026-05-05 09:32:43 -03:00

78 lines
2.5 KiB
TypeScript

"use client";
import React, { useState } from "react";
import Link from "next/link";
import { usePathname } from "next/navigation";
import { cn } from "@/shared/utils/cn";
import { DOCS_TOKENS } from "./tokens";
interface NavItem {
title: string;
href: string;
children?: NavItem[];
}
interface DocsSidebarProps {
sections: NavItem[];
currentPath?: string;
className?: string;
}
export default function DocsSidebar({ sections, currentPath, className }: DocsSidebarProps) {
const pathname = usePathname();
const [collapsed, setCollapsed] = useState(false);
const isActive = (href: string) => pathname === href || currentPath === href;
return (
<div
className={cn(
"flex flex-col h-full bg-sidebar border-r border-border transition-all duration-300",
collapsed ? "w-16" : "w-64",
className
)}
>
<div className="p-4 flex items-center justify-between border-b border-border">
{!collapsed && <span className="font-bold text-text-primary">OmniRoute Docs</span>}
<button
onClick={() => setCollapsed(!collapsed)}
className="p-1 hover:bg-bg-subtle rounded transition-colors"
aria-label="Toggle Sidebar"
>
<span className="block w-4 h-0.5 bg-text-main mb-1"></span>
<span className="block w-4 h-0.5 bg-text-main mb-1"></span>
<span className="block w-4 h-0.5 bg-text-main"></span>
</button>
</div>
<div className="flex-1 overflow-y-auto p-4 space-y-6">
{sections.map((section, idx) => (
<div key={idx} className="space-y-2">
{!collapsed && (
<h3 className="text-xs font-semibold text-text-muted uppercase tracking-wider">
{section.title}
</h3>
)}
<div className="space-y-1">
{section.children?.map((item, childIdx) => (
<Link
key={childIdx}
href={item.href}
className={cn(
"flex items-center gap-3 px-3 py-2 rounded-md text-sm transition-colors",
isActive(item.href)
? "bg-primary/10 text-primary font-medium"
: "text-text-main hover:bg-bg-subtle"
)}
>
<span className="truncate">{item.title}</span>
</Link>
))}
</div>
</div>
))}
</div>
</div>
);
}