modcomms/frontend/components/Sidebar.tsx
michael 532d7541d6 Implement Barclays design system UI update
- Update Tailwind config with new color tokens (primary-blue, active-blue,
  electric-violet, lime, grey-100/300/700/900, success, warning, error)
- Add Inter font from Google Fonts as Barclays Effra alternative
- Update Sidebar with primary-blue background and white active state
- Update Hero with electric-violet accent and pill-shaped buttons
- Update all tables with lime (#C3FB5A) header backgrounds
- Implement alternating row colors (white/grey-100) on tables
- Update status badges: In Progress (amber), Completed (green)
- Update tabs with active-blue underline styling
- Apply 10px border radius to cards and containers
- Update button styling to pill-shaped with active-blue
- Update input/dropdown borders to grey-700 with 2px
- Update selected state highlighting to info-light (#E7F0FB)
- Update FeedbackReport RAG status colors to new design system

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 13:50:46 -06:00

96 lines
4.5 KiB
TypeScript
Executable file

import React from 'react';
import { BarclaysLogo } from './icons/BarclaysLogo';
import { DashboardIcon } from './icons/DashboardIcon';
import { AnalyticsIcon } from './icons/AnalyticsIcon';
import { SettingsIcon } from './icons/SettingsIcon';
import { UserIcon } from './icons/UserIcon';
import { CampaignsIcon } from './icons/CampaignsIcon';
import { AuditIcon } from './icons/AuditIcon';
const navigation = [
{ name: 'Home', icon: DashboardIcon },
{ name: 'Campaigns', icon: CampaignsIcon },
// { name: 'WIP Reviewer', icon: ClipboardIcon }, // Hidden: Moved to Settings > Beta
// { name: 'CopyGenAI', icon: CopyGenAIIcon }, // Hidden: Moved to Settings > Beta
{ name: 'Analytics', icon: AnalyticsIcon },
{ name: 'Auditing', icon: AuditIcon },
{ name: 'Settings', icon: SettingsIcon },
];
interface SidebarProps {
activeItem: string;
onNavigate: (viewName: string) => void;
userName?: string;
userEmail?: string;
}
export const Sidebar: React.FC<SidebarProps> = ({ activeItem, onNavigate, userName, userEmail }) => {
return (
<aside className="w-72 flex-shrink-0 bg-primary-blue text-slate-200 flex flex-col border-r border-white/10 font-sans">
{/* Brand Header */}
<div className="h-24 flex items-center px-8 border-b border-white/10">
<BarclaysLogo className="h-8 w-auto text-cyan-brand" />
<div className="ml-3 flex flex-col">
<span className="text-lg font-bold tracking-tight text-white leading-tight">
Mod Comms
</span>
<span className="text-xs text-electric-violet uppercase tracking-widest font-semibold">
Compliance AI
</span>
</div>
</div>
{/* Navigation */}
<nav className="flex-1 px-4 py-8 space-y-2 overflow-y-auto">
{navigation.map((item) => {
const Icon = item.icon;
const isActive = item.name === activeItem;
const isComingSoon = (item as any).isComingSoon;
return (
<button
key={item.name}
onClick={() => !isComingSoon && onNavigate(item.name)}
className={`group w-full flex items-center px-4 py-3.5 text-left text-sm font-medium rounded-xl transition-all duration-300 ease-in-out ${
isActive
? 'bg-white text-primary-blue shadow-lg'
: isComingSoon
? 'text-slate-600 cursor-not-allowed'
: 'text-slate-300 hover:bg-white/10 hover:text-white'
}`}
aria-current={isActive ? 'page' : undefined}
disabled={isComingSoon}
>
<Icon className={`h-5 w-5 mr-4 transition-transform duration-300 ${isActive ? 'scale-110' : 'group-hover:scale-110'}`} />
<span className="flex-1 tracking-wide">{item.name}</span>
{isActive && (
<div className="w-1.5 h-1.5 rounded-full bg-active-blue"></div>
)}
</button>
);
})}
</nav>
{/* User Profile Snippet */}
<div className="p-4 border-t border-white/10 bg-primary-blue/80">
<button
onClick={() => onNavigate('Profile')}
className={`group w-full flex items-center gap-3 p-3 rounded-xl text-left transition-all duration-200 ${
activeItem === 'Profile'
? 'bg-white/10'
: 'hover:bg-white/10'
}`}
>
<div className="w-10 h-10 rounded-full bg-active-blue flex items-center justify-center ring-2 ring-white/20 group-hover:ring-active-blue/50 transition-all">
<UserIcon className="h-5 w-5 text-white" />
</div>
<div className="overflow-hidden">
<p className="font-semibold text-sm text-white truncate">{userName || 'Unknown User'}</p>
<p className="text-xs text-slate-400 truncate">{userEmail || ''}</p>
</div>
</button>
</div>
</aside>
);
};