zeroclaw/web/src/components/layout/Sidebar.tsx
argenis de la rosa 49c418e2d5
fix(docs): use absolute URLs for banner in all READMEs + update web dashboard logo
- Replace relative docs/assets/zeroclaw-banner.png paths with absolute
  raw.githubusercontent.com URLs in all 31 README files so the banner
  renders correctly regardless of where the README is viewed
- Switch web dashboard favicon and logos from logo.png to zeroclaw-trans.png
- Add zeroclaw-trans.png and zeroclaw-banner.png assets
- Update build.rs to track new dashboard asset

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 15:29:56 +03:00

87 lines
3.1 KiB
TypeScript

import { NavLink } from 'react-router-dom';
import {
LayoutDashboard,
MessageSquare,
Wrench,
Clock,
Puzzle,
Brain,
Settings,
DollarSign,
Activity,
Stethoscope,
} from 'lucide-react';
import { t } from '@/lib/i18n';
const navItems = [
{ to: '/', icon: LayoutDashboard, labelKey: 'nav.dashboard' },
{ to: '/agent', icon: MessageSquare, labelKey: 'nav.agent' },
{ to: '/tools', icon: Wrench, labelKey: 'nav.tools' },
{ to: '/cron', icon: Clock, labelKey: 'nav.cron' },
{ to: '/integrations', icon: Puzzle, labelKey: 'nav.integrations' },
{ to: '/memory', icon: Brain, labelKey: 'nav.memory' },
{ to: '/config', icon: Settings, labelKey: 'nav.config' },
{ to: '/cost', icon: DollarSign, labelKey: 'nav.cost' },
{ to: '/logs', icon: Activity, labelKey: 'nav.logs' },
{ to: '/doctor', icon: Stethoscope, labelKey: 'nav.doctor' },
];
export default function Sidebar() {
return (
<aside className="fixed top-0 left-0 h-screen w-60 flex flex-col" style={{ background: 'linear-gradient(180deg, #080818 0%, #050510 100%)' }}>
{/* Glow line on right edge */}
<div className="sidebar-glow-line" />
{/* Logo / Title */}
<div className="flex items-center gap-3 px-4 py-4 border-b border-[#1a1a3e]/50">
<img
src="/_app/zeroclaw-trans.png"
alt="ZeroClaw"
className="h-10 w-10 rounded-xl object-cover animate-pulse-glow"
/>
<span className="text-lg font-bold text-gradient-blue tracking-wide">
ZeroClaw
</span>
</div>
{/* Navigation */}
<nav className="flex-1 overflow-y-auto py-4 px-3 space-y-1">
{navItems.map(({ to, icon: Icon, labelKey }, idx) => (
<NavLink
key={to}
to={to}
end={to === '/'}
className={({ isActive }) =>
[
'flex items-center gap-3 px-3 py-2.5 rounded-xl text-sm font-medium transition-all duration-300 animate-slide-in-left group',
isActive
? 'text-white shadow-[0_0_15px_rgba(0,128,255,0.2)]'
: 'text-[#556080] hover:text-white hover:bg-[#0080ff08]',
].join(' ')
}
style={({ isActive }) => ({
animationDelay: `${idx * 40}ms`,
...(isActive ? { background: 'linear-gradient(135deg, rgba(0,128,255,0.15), rgba(0,128,255,0.05))' } : {}),
})}
>
{({ isActive }) => (
<>
<Icon className={`h-5 w-5 flex-shrink-0 transition-colors duration-300 ${isActive ? 'text-[#0080ff]' : 'group-hover:text-[#0080ff80]'}`} />
<span>{t(labelKey)}</span>
{isActive && (
<div className="ml-auto h-1.5 w-1.5 rounded-full bg-[#0080ff] glow-dot" />
)}
</>
)}
</NavLink>
))}
</nav>
{/* Footer */}
<div className="px-5 py-4 border-t border-[#1a1a3e]/50">
<p className="text-[10px] text-[#334060] tracking-wider uppercase">ZeroClaw Runtime</p>
</div>
</aside>
);
}