@platned/ui 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sidebar/index.tsx","../src/index.tsx","../src/components/avatar.tsx","../src/components/nav-item.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useRef, useState } from 'react';\r\nimport { NavLink } from 'react-router-dom';\r\nimport clsx from 'clsx';\r\n\r\nimport { Avatar, NavItem } from '../index';\r\n\r\n// ── Inline SVG icons (Lucide-compatible, 24×24 viewBox rendered at 16×16) ──\r\n\r\nfunction GridIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\r\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\r\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\r\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction LayersIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <polygon points=\"12 2 2 7 12 12 22 7 12 2\" />\r\n <polyline points=\"2 17 12 22 22 17\" />\r\n <polyline points=\"2 12 12 17 22 12\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction BuildingIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\" />\r\n <path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction UsersIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\" />\r\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\r\n <path d=\"M23 21v-2a4 4 0 0 0-3-3.87\" />\r\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction RssIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <path d=\"M4 11a9 9 0 0 1 9 9\" />\r\n <path d=\"M4 4a16 16 0 0 1 16 16\" />\r\n <circle cx=\"5\" cy=\"19\" r=\"1\" fill=\"currentColor\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction FileTextIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\r\n <polyline points=\"14 2 14 8 20 8\" />\r\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\r\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction BellIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\" />\r\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ServerIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" />\r\n <rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\" />\r\n <line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SettingsIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\r\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ClipboardListIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <path d=\"M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2\" />\r\n <rect x=\"9\" y=\"3\" width=\"6\" height=\"4\" rx=\"1\" />\r\n <line x1=\"9\" y1=\"12\" x2=\"15\" y2=\"12\" />\r\n <line x1=\"9\" y1=\"16\" x2=\"13\" y2=\"16\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction GlobeIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\" />\r\n <path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronLeftIcon() {\r\n return (\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <polyline points=\"15 18 9 12 15 6\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronRightIcon() {\r\n return (\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <polyline points=\"9 18 15 12 9 6\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction MoreVerticalIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <circle cx=\"12\" cy=\"5\" r=\"1\" fill=\"currentColor\" />\r\n <circle cx=\"12\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\r\n <circle cx=\"12\" cy=\"19\" r=\"1\" fill=\"currentColor\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction LogOutIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\r\n <polyline points=\"16 17 21 12 16 7\" />\r\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ── Logo ────────────────────────────────────────────────────────────────────\r\n\r\nfunction SidebarLogo({ collapsed }: { collapsed: boolean }) {\r\n return (\r\n <div\r\n className={clsx(\r\n 'flex shrink-0 items-center overflow-hidden p-4',\r\n collapsed ? 'justify-center' : 'gap-2.5',\r\n )}\r\n >\r\n <div className=\"flex shrink-0 size-10 items-center justify-center rounded-xl bg-background-brand-hover overflow-hidden\">\r\n <div className=\"grid grid-cols-2 gap-[3px]\">\r\n <div className=\"size-2 rounded-[2px] bg-white\" />\r\n <div className=\"size-2 rounded-[2px] bg-white/50\" />\r\n <div className=\"size-2 rounded-[2px] bg-white/50\" />\r\n <div className=\"size-2 rounded-[2px] bg-white\" />\r\n </div>\r\n </div>\r\n {!collapsed && (\r\n <span className=\"text-heading font-semibold text-text-default tracking-tight whitespace-nowrap\">\r\n SCIC\r\n </span>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ── NavLink item ─────────────────────────────────────────────────────────────\r\n\r\ninterface NavLinkItemProps {\r\n to: string;\r\n icon: ReactNode;\r\n label: string;\r\n indicator?: boolean;\r\n collapsed: boolean;\r\n end?: boolean;\r\n}\r\n\r\nfunction NavLinkItem({ to, icon, label, indicator, collapsed, end }: NavLinkItemProps) {\r\n return (\r\n <NavLink to={to} end={end} className=\"block w-full no-underline\">\r\n {({ isActive }) => (\r\n <NavItem\r\n icon={icon}\r\n label={label}\r\n isActive={isActive}\r\n indicator={indicator}\r\n collapsed={collapsed}\r\n />\r\n )}\r\n </NavLink>\r\n );\r\n}\r\n\r\n// ── User card ────────────────────────────────────────────────────────────────\r\n\r\nfunction UserCard({ collapsed, name, role, onLogout }: { collapsed: boolean; name: string; role: string; onLogout: () => void }) {\r\n const [menuOpen, setMenuOpen] = useState(false);\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const initial = name.trim().charAt(0);\r\n\r\n useEffect(() => {\r\n if (!menuOpen) return;\r\n function handleClickOutside(e: MouseEvent) {\r\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\r\n setMenuOpen(false);\r\n }\r\n }\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, [menuOpen]);\r\n\r\n const menuItems = (\r\n <button\r\n type=\"button\"\r\n onClick={() => { setMenuOpen(false); onLogout(); }}\r\n className=\"flex w-full items-center gap-2 px-3 py-2 text-body-sm text-text-default hover:bg-background-default-hover transition-colors\"\r\n >\r\n <LogOutIcon />\r\n Sign out\r\n </button>\r\n );\r\n\r\n return (\r\n <div\r\n className={clsx(\r\n 'flex shrink-0 items-center p-4',\r\n collapsed ? 'justify-center' : 'gap-2.5',\r\n )}\r\n >\r\n {collapsed ? (\r\n <div className=\"relative\" ref={menuRef}>\r\n <button\r\n type=\"button\"\r\n aria-label=\"User options\"\r\n aria-haspopup=\"menu\"\r\n aria-expanded={menuOpen}\r\n onClick={() => setMenuOpen(v => !v)}\r\n className=\"rounded-full\"\r\n >\r\n <Avatar initial={initial} size=\"md\" shape=\"circle\" />\r\n </button>\r\n {menuOpen && (\r\n <div className=\"absolute bottom-0 left-full ml-2 w-36 rounded-lg border border-border-default bg-background-default shadow-md py-1 z-20\">\r\n {menuItems}\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <>\r\n <Avatar initial={initial} size=\"md\" shape=\"circle\" />\r\n <div className=\"flex flex-1 min-w-0 flex-col gap-0.5\">\r\n <span className=\"truncate text-body-sm font-semibold text-text-default leading-snug\">\r\n {name}\r\n </span>\r\n <span className=\"truncate text-body-tiny font-regular text-text-default-secondary leading-none\">\r\n {role}\r\n </span>\r\n </div>\r\n <div className=\"relative shrink-0\" ref={menuRef}>\r\n <button\r\n type=\"button\"\r\n aria-label=\"User options\"\r\n aria-haspopup=\"menu\"\r\n aria-expanded={menuOpen}\r\n onClick={() => setMenuOpen(v => !v)}\r\n className=\"flex size-6 items-center justify-center rounded-md text-text-default-secondary hover:bg-background-default-hover hover:text-text-default transition-colors\"\r\n >\r\n <MoreVerticalIcon />\r\n </button>\r\n {menuOpen && (\r\n <div className=\"absolute bottom-full right-0 mb-1 w-36 rounded-lg border border-border-default bg-background-default shadow-md py-1 z-20\">\r\n {menuItems}\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ── Main sidebar ─────────────────────────────────────────────────────────────\r\n\r\ninterface AppSidebarProps {\r\n collapsed: boolean;\r\n onToggle: () => void;\r\n isAdmin?: boolean;\r\n userName: string;\r\n userRole: string;\r\n onLogout: () => void;\r\n}\r\n\r\nexport function AppSidebar({ collapsed, onToggle, isAdmin = false, userName, userRole, onLogout }: AppSidebarProps) {\r\n\r\n return (\r\n <aside\r\n className={clsx(\r\n 'relative flex flex-col shrink-0 transition-all duration-200',\r\n 'bg-background-default-secondary border-r border-border-default rounded-xl',\r\n 'h-full',\r\n collapsed ? 'w-20' : 'w-80',\r\n )}\r\n >\r\n {/* Toggle button */}\r\n <button\r\n type=\"button\"\r\n aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}\r\n onClick={onToggle}\r\n className={clsx(\r\n 'absolute -right-3 top-5 z-10 flex size-6 items-center justify-center rounded-full',\r\n 'bg-background-default border border-border-default text-text-default-secondary',\r\n 'hover:bg-background-default-hover shadow-sm transition-colors',\r\n )}\r\n >\r\n {collapsed ? <ChevronRightIcon /> : <ChevronLeftIcon />}\r\n </button>\r\n\r\n {/* Top — logo + primary nav */}\r\n <div className=\"flex flex-1 min-h-0 flex-col gap-1\">\r\n <SidebarLogo collapsed={collapsed} />\r\n\r\n <nav className=\"flex flex-col gap-3 overflow-y-auto px-4 pt-2 pb-3\">\r\n <NavLinkItem to=\"/dashboard\" icon={<GridIcon />} label=\"Dashboard\" collapsed={collapsed} end />\r\n <NavLinkItem to=\"/entities\" icon={<LayersIcon />} label=\"Entities\" collapsed={collapsed} indicator />\r\n <NavLinkItem to=\"/suppliers\" icon={<BuildingIcon />} label=\"Suppliers\" collapsed={collapsed} />\r\n <NavLinkItem to=\"/customers\" icon={<UsersIcon />} label=\"Customers\" collapsed={collapsed} />\r\n <NavLinkItem to=\"/sources\" icon={<FileTextIcon />} label=\"Sources\" collapsed={collapsed} />\r\n <NavLinkItem to=\"/articles\" icon={<RssIcon />} label=\"Intelligence\" collapsed={collapsed} />\r\n <NavLinkItem to=\"/alerts\" icon={<BellIcon />} label=\"Alerts\" collapsed={collapsed} />\r\n <NavLinkItem to=\"/website-scraper\" icon={<GlobeIcon />} label=\"Website Intel\" collapsed={collapsed} />\r\n <NavLinkItem to=\"/review\" icon={<ClipboardListIcon />} label=\"Review queue\" collapsed={collapsed} />\r\n {isAdmin && (\r\n <NavLinkItem to=\"/queues\" icon={<ServerIcon />} label=\"Queues\" collapsed={collapsed} />\r\n )}\r\n </nav>\r\n </div>\r\n\r\n {/* Bottom — settings + user card */}\r\n <div className=\"flex flex-col\">\r\n {isAdmin && (\r\n <div className=\"px-4 pb-2\">\r\n <NavLinkItem\r\n to=\"/settings\"\r\n icon={<SettingsIcon />}\r\n label=\"Settings\"\r\n collapsed={collapsed}\r\n />\r\n </div>\r\n )}\r\n <div className=\"border-t border-border-default\">\r\n <UserCard collapsed={collapsed} name={userName} role={userRole} onLogout={onLogout} />\r\n </div>\r\n </div>\r\n </aside>\r\n );\r\n}\r\n","import clsx from 'clsx';\r\nimport type { ReactNode } from 'react';\r\n\r\nexport { Button } from './components/button';\r\nexport type { ButtonProps, ButtonVariant, ButtonSize } from './components/button';\r\n\r\nexport { IconButton } from './components/icon-button';\r\nexport type { IconButtonProps, IconButtonVariant } from './components/icon-button';\r\n\r\nexport { ButtonGroup } from './components/button-group';\r\nexport type { ButtonGroupProps, ButtonGroupItem, ButtonGroupVariant, ButtonGroupAlign } from './components/button-group';\r\n\r\nexport { Avatar } from './components/avatar';\r\nexport type { AvatarProps, AvatarInitialProps, AvatarImageProps, AvatarSize, AvatarShape } from './components/avatar';\r\n\r\nexport { AvatarGroup } from './components/avatar-group';\r\nexport type { AvatarGroupProps, AvatarGroupSpacing } from './components/avatar-group';\r\n\r\nexport { NavItem } from './components/nav-item';\r\nexport type { NavItemProps } from './components/nav-item';\r\n\r\nexport { Input } from './components/input';\r\nexport type { InputProps, InputSize } from './components/input';\r\n\r\nexport { Textarea } from './components/textarea';\r\nexport type { TextareaProps } from './components/textarea';\r\n\r\nexport { Select } from './components/select';\r\nexport type { SelectProps, SelectOption } from './components/select';\r\n\r\nexport { Stepper } from './components/stepper';\r\nexport type { StepperProps, StepItem, StepStatus } from './components/stepper';\r\n\r\nexport { MultiSelectCard } from './components/multiselect-card';\r\nexport type { MultiSelectCardProps } from './components/multiselect-card';\r\n\r\nexport { DataTable, TableCellLeadText, TableCellText, TableCellBadge, TableCellStatusPill, TableCellProgress } from './components/data-table';\r\nexport type { ColumnDef } from './components/data-table';\r\n\r\nexport { StatTile } from './components/stat-tile';\r\nexport type { StatTileProps } from './components/stat-tile';\r\n\r\nexport { Toggle } from './components/toggle';\r\nexport type { ToggleProps } from './components/toggle';\r\n\r\nexport { FileDropZone } from './components/file-drop-zone';\r\nexport type { FileDropZoneProps } from './components/file-drop-zone';\r\n\r\nexport { FormCard, FormCardHeader, FormCardFooter } from './components/form-card';\r\nexport type { FormCardHeaderProps, FormCardFooterProps } from './components/form-card';\r\n\r\nexport { DocumentRow } from './components/document-row';\r\nexport type { DocumentRowProps, DocumentStatus } from './components/document-row';\r\n\r\nexport function Panel({\r\n children,\r\n className\r\n}: {\r\n children: ReactNode;\r\n className?: string;\r\n}) {\r\n return (\r\n <section className={clsx('rounded-3xl border border-white/70 bg-white/90 p-6 shadow-panel backdrop-blur', className)}>\r\n {children}\r\n </section>\r\n );\r\n}\r\n\r\nexport function MetricCard({\r\n label,\r\n value,\r\n tone = 'default'\r\n}: {\r\n label: string;\r\n value: string | number;\r\n tone?: 'default' | 'signal' | 'ember' | 'moss';\r\n}) {\r\n const tones = {\r\n default: 'from-white to-slate-50 text-text-default',\r\n signal: 'from-background-brand-tertiary to-cyan-50 text-text-brand',\r\n ember: 'from-amber-50 to-orange-50 text-text-danger',\r\n moss: 'from-emerald-50 to-lime-50 text-text-positive'\r\n };\r\n\r\n return (\r\n <Panel className={clsx('bg-gradient-to-br', tones[tone])}>\r\n <p className=\"text-sm uppercase tracking-[0.2em] text-slate-500\">{label}</p>\r\n <p className=\"mt-3 text-3xl font-semibold\">{value}</p>\r\n </Panel>\r\n );\r\n}\r\n\r\nexport function SeverityBadge({ severity }: { severity?: string | null }) {\r\n const styles: Record<string, string> = {\r\n critical: 'bg-red-100 text-red-700',\r\n high: 'bg-orange-100 text-orange-700',\r\n medium: 'bg-amber-100 text-amber-700',\r\n low: 'bg-slate-100 text-slate-700'\r\n };\r\n\r\n return (\r\n <span className={clsx('inline-flex rounded-full px-3 py-1 text-xs font-semibold uppercase tracking-wide', styles[severity ?? 'low'])}>\r\n {severity ?? 'unknown'}\r\n </span>\r\n );\r\n}\r\n\r\nexport function SentimentBadge({ sentiment }: { sentiment?: string | null }) {\r\n const styles: Record<string, string> = {\r\n positive: 'bg-emerald-100 text-emerald-700',\r\n neutral: 'bg-slate-100 text-slate-700',\r\n negative: 'bg-rose-100 text-rose-700',\r\n concerning: 'bg-amber-100 text-amber-700'\r\n };\r\n\r\n return (\r\n <span className={clsx('inline-flex rounded-full px-3 py-1 text-xs font-semibold capitalize', styles[sentiment ?? 'neutral'] ?? styles.neutral)}>\r\n {sentiment ?? 'unknown'}\r\n </span>\r\n );\r\n}\r\n\r\nexport { Modal } from './components/modal';\r\nexport type { ModalProps } from './components/modal';\r\n\r\nexport { RoleBadge } from './components/role-badge';\r\nexport type { RoleBadgeProps } from './components/role-badge';\r\n\r\nexport { RoleComboBox, ROLE_COMBO_OPTIONS } from './components/role-combo-box';\r\nexport type { RoleComboBoxProps, RoleOption } from './components/role-combo-box';\r\n\r\nexport function SectionHeading({\r\n eyebrow,\r\n title,\r\n detail\r\n}: {\r\n eyebrow: string;\r\n title: string;\r\n detail?: string;\r\n}) {\r\n return (\r\n <div>\r\n <p className=\"text-xs uppercase tracking-[0.25em] text-text-brand\">{eyebrow}</p>\r\n <h2 className=\"mt-2 text-2xl font-semibold text-text-default\">{title}</h2>\r\n {detail ? <p className=\"mt-2 max-w-2xl text-sm text-slate-600\">{detail}</p> : null}\r\n </div>\r\n );\r\n}\r\n\r\n","import clsx from 'clsx';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg';\nexport type AvatarShape = 'circle' | 'square';\n\nexport interface AvatarInitialProps {\n type?: 'initial';\n /** Single character — Figma spec: one letter only to avoid overflow */\n initial: string;\n size?: AvatarSize;\n shape?: AvatarShape;\n className?: string;\n}\n\nexport interface AvatarImageProps {\n type: 'image';\n src: string;\n alt?: string;\n size?: AvatarSize;\n shape?: AvatarShape;\n className?: string;\n}\n\nexport type AvatarProps = AvatarInitialProps | AvatarImageProps;\n\n// Figma sizes: lg=40px, md=32px, sm=24px\nconst sizeStyles: Record<AvatarSize, string> = {\n lg: 'size-10',\n md: 'size-8',\n sm: 'size-6',\n};\n\n// Figma text sizes for initials: body-medium at lg, scales down proportionally\nconst initialTextStyles: Record<AvatarSize, string> = {\n lg: 'text-body font-semibold',\n md: 'text-body-xs font-semibold',\n sm: 'text-body-tiny font-semibold',\n};\n\n// Figma shape radii: circle=full, square=8px (rounded-lg)\nconst shapeStyles: Record<AvatarShape, string> = {\n circle: 'rounded-full',\n square: 'rounded-lg',\n};\n\nexport function Avatar(props: AvatarProps) {\n const { size = 'lg', shape = 'circle', className } = props;\n\n const base = clsx(\n 'shrink-0 overflow-hidden',\n sizeStyles[size],\n shapeStyles[shape],\n className,\n );\n\n if (props.type === 'image') {\n return (\n <div className={base}>\n <img\n src={props.src}\n alt={props.alt ?? ''}\n className=\"size-full object-cover\"\n />\n </div>\n );\n }\n\n return (\n <div\n className={clsx(base, 'flex items-center justify-center')}\n style={{\n background:\n 'linear-gradient(135deg, var(--color-graphic-blue) 30%, var(--color-graphic-red) 100%)',\n }}\n >\n <span\n className={clsx(\n 'select-none leading-none text-text-brand-on-brand',\n initialTextStyles[size],\n )}\n >\n {props.initial.charAt(0).toUpperCase()}\n </span>\n </div>\n );\n}\n","import { type ReactNode } from 'react';\nimport clsx from 'clsx';\n\nexport interface NavItemProps {\n icon?: ReactNode;\n label: string;\n isActive?: boolean;\n /** Red indicator dot at top-right corner (e.g. unread count) */\n indicator?: boolean;\n /** Collapsed mode — icon only, label hidden */\n collapsed?: boolean;\n className?: string;\n}\n\nexport function NavItem({\n icon,\n label,\n isActive = false,\n indicator = false,\n collapsed = false,\n className,\n}: NavItemProps) {\n return (\n <span\n className={clsx(\n 'relative flex h-11 w-full items-center gap-3 rounded-xl px-3.5 py-2.5 transition-colors',\n collapsed && 'justify-center',\n isActive\n ? 'bg-background-brand text-text-brand-on-brand'\n : [\n 'border border-border-default bg-background-default text-text-default-secondary',\n 'hover:bg-background-brand-tertiary-hover hover:border-border-brand-tertiary hover:text-text-brand',\n ],\n className,\n )}\n >\n {icon !== undefined && (\n <span className=\"shrink-0 [&_svg]:size-4\">{icon}</span>\n )}\n {!collapsed && (\n <span className=\"flex-1 min-w-0 truncate text-body-sm font-regular leading-snug\">\n {label}\n </span>\n )}\n {indicator && (\n <span className=\"absolute -right-px -top-px size-2 rounded-full bg-background-danger\" />\n )}\n </span>\n );\n}\n"],"mappings":"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","names":["import_clsx","import_clsx","clsx","import_clsx","import_jsx_runtime","clsx","import_jsx_runtime","import_jsx_runtime","clsx"]}
1
+ {"version":3,"sources":["../src/sidebar/index.tsx","../src/index.tsx","../src/components/avatar.tsx","../src/components/nav-item.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useRef, useState } from 'react';\nimport { NavLink } from 'react-router-dom';\nimport clsx from 'clsx';\n\nimport { Avatar, NavItem } from '../index';\n\n// ── Inline SVG icons (Lucide-compatible, 24×24 viewBox rendered at 16×16) ──\n\nfunction GridIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n </svg>\n );\n}\n\nfunction LayersIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <polygon points=\"12 2 2 7 12 12 22 7 12 2\" />\n <polyline points=\"2 17 12 22 22 17\" />\n <polyline points=\"2 12 12 17 22 12\" />\n </svg>\n );\n}\n\nfunction BuildingIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\" />\n <path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\" />\n </svg>\n );\n}\n\nfunction UsersIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M23 21v-2a4 4 0 0 0-3-3.87\" />\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n </svg>\n );\n}\n\nfunction RssIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M4 11a9 9 0 0 1 9 9\" />\n <path d=\"M4 4a16 16 0 0 1 16 16\" />\n <circle cx=\"5\" cy=\"19\" r=\"1\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction FileTextIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n </svg>\n );\n}\n\nfunction BellIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\" />\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\" />\n </svg>\n );\n}\n\nfunction ServerIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" />\n <rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" />\n <line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\" />\n <line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction SettingsIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\" />\n </svg>\n );\n}\n\nfunction ClipboardListIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2\" />\n <rect x=\"9\" y=\"3\" width=\"6\" height=\"4\" rx=\"1\" />\n <line x1=\"9\" y1=\"12\" x2=\"15\" y2=\"12\" />\n <line x1=\"9\" y1=\"16\" x2=\"13\" y2=\"16\" />\n </svg>\n );\n}\n\nfunction GlobeIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\" />\n <path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" />\n </svg>\n );\n}\n\nfunction ChevronLeftIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n );\n}\n\nfunction ChevronRightIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\nfunction MoreVerticalIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction LogOutIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <polyline points=\"16 17 21 12 16 7\" />\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" />\n </svg>\n );\n}\n\n// ── Logo ────────────────────────────────────────────────────────────────────\n\nfunction SidebarLogo({ collapsed }: { collapsed: boolean }) {\n return (\n <div\n className={clsx(\n 'flex shrink-0 items-center overflow-hidden p-4',\n collapsed ? 'justify-center' : 'gap-2.5',\n )}\n >\n <div className=\"flex shrink-0 size-10 items-center justify-center rounded-xl bg-brand-hover overflow-hidden\">\n <div className=\"grid grid-cols-2 gap-[3px]\">\n <div className=\"size-2 rounded-[2px] bg-white\" />\n <div className=\"size-2 rounded-[2px] bg-white/50\" />\n <div className=\"size-2 rounded-[2px] bg-white/50\" />\n <div className=\"size-2 rounded-[2px] bg-white\" />\n </div>\n </div>\n {!collapsed && (\n <span className=\"text-heading font-semibold text-default tracking-tight whitespace-nowrap\">\n SCIC\n </span>\n )}\n </div>\n );\n}\n\n// ── NavLink item ─────────────────────────────────────────────────────────────\n\ninterface NavLinkItemProps {\n to: string;\n icon: ReactNode;\n label: string;\n indicator?: boolean;\n collapsed: boolean;\n end?: boolean;\n}\n\nfunction NavLinkItem({ to, icon, label, indicator, collapsed, end }: NavLinkItemProps) {\n return (\n <NavLink to={to} end={end} className=\"block w-full no-underline\">\n {({ isActive }) => (\n <NavItem\n icon={icon}\n label={label}\n isActive={isActive}\n indicator={indicator}\n collapsed={collapsed}\n />\n )}\n </NavLink>\n );\n}\n\n// ── User card ────────────────────────────────────────────────────────────────\n\nfunction UserCard({ collapsed, name, role, onLogout }: { collapsed: boolean; name: string; role: string; onLogout: () => void }) {\n const [menuOpen, setMenuOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n const initial = name.trim().charAt(0);\n\n useEffect(() => {\n if (!menuOpen) return;\n function handleClickOutside(e: MouseEvent) {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n setMenuOpen(false);\n }\n }\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [menuOpen]);\n\n const menuItems = (\n <button\n type=\"button\"\n onClick={() => { setMenuOpen(false); onLogout(); }}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-body-sm text-default hover:bg-default-hover transition-colors\"\n >\n <LogOutIcon />\n Sign out\n </button>\n );\n\n return (\n <div\n className={clsx(\n 'flex shrink-0 items-center p-4',\n collapsed ? 'justify-center' : 'gap-2.5',\n )}\n >\n {collapsed ? (\n <div className=\"relative\" ref={menuRef}>\n <button\n type=\"button\"\n aria-label=\"User options\"\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen(v => !v)}\n className=\"rounded-full\"\n >\n <Avatar initial={initial} size=\"md\" shape=\"circle\" />\n </button>\n {menuOpen && (\n <div className=\"absolute bottom-0 left-full ml-2 w-36 rounded-lg border border-default bg-default shadow-md py-1 z-20\">\n {menuItems}\n </div>\n )}\n </div>\n ) : (\n <>\n <Avatar initial={initial} size=\"md\" shape=\"circle\" />\n <div className=\"flex flex-1 min-w-0 flex-col gap-0.5\">\n <span className=\"truncate text-body-sm font-semibold text-default leading-snug\">\n {name}\n </span>\n <span className=\"truncate text-body-tiny font-regular text-default-secondary leading-none\">\n {role}\n </span>\n </div>\n <div className=\"relative shrink-0\" ref={menuRef}>\n <button\n type=\"button\"\n aria-label=\"User options\"\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen(v => !v)}\n className=\"flex size-6 items-center justify-center rounded-md text-default-secondary hover:bg-default-hover hover:text-default transition-colors\"\n >\n <MoreVerticalIcon />\n </button>\n {menuOpen && (\n <div className=\"absolute bottom-full right-0 mb-1 w-36 rounded-lg border border-default bg-default shadow-md py-1 z-20\">\n {menuItems}\n </div>\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n\n// ── Main sidebar ─────────────────────────────────────────────────────────────\n\ninterface AppSidebarProps {\n collapsed: boolean;\n onToggle: () => void;\n isAdmin?: boolean;\n userName: string;\n userRole: string;\n onLogout: () => void;\n}\n\nexport function AppSidebar({ collapsed, onToggle, isAdmin = false, userName, userRole, onLogout }: AppSidebarProps) {\n\n return (\n <aside\n className={clsx(\n 'relative flex flex-col shrink-0 transition-all duration-200',\n 'bg-default-secondary border-r border-default rounded-xl',\n 'h-full',\n collapsed ? 'w-20' : 'w-80',\n )}\n >\n {/* Toggle button */}\n <button\n type=\"button\"\n aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n onClick={onToggle}\n className={clsx(\n 'absolute -right-3 top-5 z-10 flex size-6 items-center justify-center rounded-full',\n 'bg-default border border-default text-default-secondary',\n 'hover:bg-default-hover shadow-sm transition-colors',\n )}\n >\n {collapsed ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </button>\n\n {/* Top — logo + primary nav */}\n <div className=\"flex flex-1 min-h-0 flex-col gap-1\">\n <SidebarLogo collapsed={collapsed} />\n\n <nav className=\"flex flex-col gap-3 overflow-y-auto px-4 pt-2 pb-3\">\n <NavLinkItem to=\"/dashboard\" icon={<GridIcon />} label=\"Dashboard\" collapsed={collapsed} end />\n <NavLinkItem to=\"/entities\" icon={<LayersIcon />} label=\"Entities\" collapsed={collapsed} indicator />\n <NavLinkItem to=\"/suppliers\" icon={<BuildingIcon />} label=\"Suppliers\" collapsed={collapsed} />\n <NavLinkItem to=\"/customers\" icon={<UsersIcon />} label=\"Customers\" collapsed={collapsed} />\n <NavLinkItem to=\"/sources\" icon={<FileTextIcon />} label=\"Sources\" collapsed={collapsed} />\n <NavLinkItem to=\"/articles\" icon={<RssIcon />} label=\"Intelligence\" collapsed={collapsed} />\n <NavLinkItem to=\"/alerts\" icon={<BellIcon />} label=\"Alerts\" collapsed={collapsed} />\n <NavLinkItem to=\"/website-scraper\" icon={<GlobeIcon />} label=\"Website Intel\" collapsed={collapsed} />\n <NavLinkItem to=\"/review\" icon={<ClipboardListIcon />} label=\"Review queue\" collapsed={collapsed} />\n {isAdmin && (\n <NavLinkItem to=\"/queues\" icon={<ServerIcon />} label=\"Queues\" collapsed={collapsed} />\n )}\n </nav>\n </div>\n\n {/* Bottom — settings + user card */}\n <div className=\"flex flex-col\">\n {isAdmin && (\n <div className=\"px-4 pb-2\">\n <NavLinkItem\n to=\"/settings\"\n icon={<SettingsIcon />}\n label=\"Settings\"\n collapsed={collapsed}\n />\n </div>\n )}\n <div className=\"border-t border-default\">\n <UserCard collapsed={collapsed} name={userName} role={userRole} onLogout={onLogout} />\n </div>\n </div>\n </aside>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport { Button } from './components/button';\nexport type { ButtonProps, ButtonVariant, ButtonSize } from './components/button';\n\nexport { IconButton } from './components/icon-button';\nexport type { IconButtonProps, IconButtonVariant } from './components/icon-button';\n\nexport { ButtonGroup } from './components/button-group';\nexport type { ButtonGroupProps, ButtonGroupItem, ButtonGroupVariant, ButtonGroupAlign } from './components/button-group';\n\nexport { Avatar } from './components/avatar';\nexport type { AvatarProps, AvatarInitialProps, AvatarImageProps, AvatarSize, AvatarShape } from './components/avatar';\n\nexport { AvatarGroup } from './components/avatar-group';\nexport type { AvatarGroupProps, AvatarGroupSpacing } from './components/avatar-group';\n\nexport { AvatarBlock } from './components/avatar-block';\nexport type { AvatarBlockProps } from './components/avatar-block';\n\nexport { NavItem } from './components/nav-item';\nexport type { NavItemProps } from './components/nav-item';\n\nexport { Input } from './components/input';\nexport type { InputProps, InputSize } from './components/input';\n\nexport { Textarea } from './components/textarea';\nexport type { TextareaProps } from './components/textarea';\n\nexport { Select } from './components/select';\nexport type { SelectProps, SelectOption } from './components/select';\n\nexport { Stepper } from './components/stepper';\nexport type { StepperProps, StepItem, StepStatus } from './components/stepper';\n\nexport { MultiSelectCard } from './components/multiselect-card';\nexport type { MultiSelectCardProps } from './components/multiselect-card';\n\nexport { DataTable, TableCellLeadText, TableCellText, TableCellBadge, TableCellStatusPill, TableCellProgress } from './components/data-table';\nexport type { ColumnDef } from './components/data-table';\n\nexport { StatTile } from './components/stat-tile';\nexport type { StatTileProps } from './components/stat-tile';\n\nexport { Toggle } from './components/toggle';\nexport type { ToggleProps } from './components/toggle';\n\nexport { FileDropZone } from './components/file-drop-zone';\nexport type { FileDropZoneProps } from './components/file-drop-zone';\n\nexport { FormCard, FormCardHeader, FormCardFooter } from './components/form-card';\nexport type { FormCardHeaderProps, FormCardFooterProps } from './components/form-card';\n\nexport { DocumentRow } from './components/document-row';\nexport type { DocumentRowProps, DocumentStatus } from './components/document-row';\n\nexport function Panel({\n children,\n className\n}: {\n children: ReactNode;\n className?: string;\n}) {\n return (\n <section className={clsx('rounded-3xl border border-white/70 bg-white/90 p-6 shadow-panel backdrop-blur', className)}>\n {children}\n </section>\n );\n}\n\nexport function MetricCard({\n label,\n value,\n tone = 'default'\n}: {\n label: string;\n value: string | number;\n tone?: 'default' | 'signal' | 'ember' | 'moss';\n}) {\n const tones = {\n default: 'from-white to-slate-50 text-default',\n signal: 'from-brand-tertiary to-cyan-50 text-brand',\n ember: 'from-amber-50 to-orange-50 text-danger',\n moss: 'from-emerald-50 to-lime-50 text-positive'\n };\n\n return (\n <Panel className={clsx('bg-gradient-to-br', tones[tone])}>\n <p className=\"text-sm uppercase tracking-[0.2em] text-slate-500\">{label}</p>\n <p className=\"mt-3 text-3xl font-semibold\">{value}</p>\n </Panel>\n );\n}\n\nexport function SeverityBadge({ severity }: { severity?: string | null }) {\n const styles: Record<string, string> = {\n critical: 'bg-red-100 text-red-700',\n high: 'bg-orange-100 text-orange-700',\n medium: 'bg-amber-100 text-amber-700',\n low: 'bg-slate-100 text-slate-700'\n };\n\n return (\n <span className={clsx('inline-flex rounded-full px-3 py-1 text-xs font-semibold uppercase tracking-wide', styles[severity ?? 'low'])}>\n {severity ?? 'unknown'}\n </span>\n );\n}\n\nexport function SentimentBadge({ sentiment }: { sentiment?: string | null }) {\n const styles: Record<string, string> = {\n positive: 'bg-emerald-100 text-emerald-700',\n neutral: 'bg-slate-100 text-slate-700',\n negative: 'bg-rose-100 text-rose-700',\n concerning: 'bg-amber-100 text-amber-700'\n };\n\n return (\n <span className={clsx('inline-flex rounded-full px-3 py-1 text-xs font-semibold capitalize', styles[sentiment ?? 'neutral'] ?? styles.neutral)}>\n {sentiment ?? 'unknown'}\n </span>\n );\n}\n\nexport { Modal } from './components/modal';\nexport type { ModalProps } from './components/modal';\n\nexport { RoleBadge } from './components/role-badge';\nexport type { RoleBadgeProps } from './components/role-badge';\n\nexport { RoleComboBox, ROLE_COMBO_OPTIONS } from './components/role-combo-box';\nexport type { RoleComboBoxProps, RoleOption } from './components/role-combo-box';\n\nexport function SectionHeading({\n eyebrow,\n title,\n detail\n}: {\n eyebrow: string;\n title: string;\n detail?: string;\n}) {\n return (\n <div>\n <p className=\"text-xs uppercase tracking-[0.25em] text-brand\">{eyebrow}</p>\n <h2 className=\"mt-2 text-2xl font-semibold text-default\">{title}</h2>\n {detail ? <p className=\"mt-2 max-w-2xl text-sm text-slate-600\">{detail}</p> : null}\n </div>\n );\n}\n\n","import clsx from 'clsx';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg';\nexport type AvatarShape = 'circle' | 'square';\n\nexport interface AvatarInitialProps {\n type?: 'initial';\n /** Single character — Figma spec: one letter only to avoid overflow */\n initial: string;\n size?: AvatarSize;\n shape?: AvatarShape;\n className?: string;\n}\n\nexport interface AvatarImageProps {\n type: 'image';\n src: string;\n alt?: string;\n size?: AvatarSize;\n shape?: AvatarShape;\n className?: string;\n}\n\nexport type AvatarProps = AvatarInitialProps | AvatarImageProps;\n\n// Figma sizes: lg=40px, md=32px, sm=24px\nconst sizeStyles: Record<AvatarSize, string> = {\n lg: 'size-10',\n md: 'size-8',\n sm: 'size-6',\n};\n\n// Figma text sizes for initials: body-medium at lg, scales down proportionally\nconst initialTextStyles: Record<AvatarSize, string> = {\n lg: 'text-body font-semibold',\n md: 'text-body-xs font-semibold',\n sm: 'text-body-tiny font-semibold',\n};\n\n// Figma shape radii: circle=full, square: lg/md=8px (rounded-lg), sm=4px (rounded)\nfunction getShapeClass(shape: AvatarShape, size: AvatarSize): string {\n if (shape === 'circle') return 'rounded-full';\n return size === 'sm' ? 'rounded' : 'rounded-lg';\n}\n\nexport function Avatar(props: AvatarProps) {\n const { size = 'lg', shape = 'circle', className } = props;\n\n const base = clsx(\n 'shrink-0 overflow-hidden',\n sizeStyles[size],\n getShapeClass(shape, size),\n className,\n );\n\n if (props.type === 'image') {\n return (\n <div className={base}>\n <img\n src={props.src}\n alt={props.alt ?? ''}\n className=\"size-full object-cover\"\n />\n </div>\n );\n }\n\n return (\n <div\n className={clsx(base, 'flex items-center justify-center')}\n style={{\n background:\n 'linear-gradient(135deg, var(--color-graphic-blue) 30%, var(--color-graphic-red) 100%)',\n }}\n >\n <span\n className={clsx(\n 'select-none leading-none text-brand-on-brand',\n initialTextStyles[size],\n )}\n >\n {props.initial.charAt(0).toUpperCase()}\n </span>\n </div>\n );\n}\n","import { type ReactNode } from 'react';\nimport clsx from 'clsx';\n\nexport interface NavItemProps {\n icon?: ReactNode;\n label: string;\n isActive?: boolean;\n /** Red indicator dot at top-right corner (e.g. unread count) */\n indicator?: boolean;\n /** Collapsed mode — icon only, label hidden */\n collapsed?: boolean;\n className?: string;\n}\n\nexport function NavItem({\n icon,\n label,\n isActive = false,\n indicator = false,\n collapsed = false,\n className,\n}: NavItemProps) {\n return (\n <span\n className={clsx(\n 'relative flex h-11 w-full items-center gap-3 rounded-xl px-3.5 py-2.5 transition-colors',\n collapsed && 'justify-center',\n isActive\n ? 'bg-brand text-brand-on-brand'\n : [\n 'border border-default bg-default text-default-secondary',\n 'hover:bg-brand-tertiary-hover hover:border-brand-tertiary hover:text-brand',\n ],\n className,\n )}\n >\n {icon !== undefined && (\n <span className=\"shrink-0 [&_svg]:size-4\">{icon}</span>\n )}\n {!collapsed && (\n <span className=\"flex-1 min-w-0 truncate text-body-sm font-regular leading-snug\">\n {label}\n </span>\n )}\n {indicator && (\n <span className=\"absolute -right-px -top-px size-2 rounded-full bg-danger\" />\n )}\n </span>\n );\n}\n"],"mappings":"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","names":["import_clsx","import_clsx","clsx","import_clsx","import_jsx_runtime","clsx","import_jsx_runtime","import_jsx_runtime","clsx"]}
package/dist/sidebar.js CHANGED
@@ -19,16 +19,16 @@ var initialTextStyles = {
19
19
  md: "text-body-xs font-semibold",
20
20
  sm: "text-body-tiny font-semibold"
21
21
  };
22
- var shapeStyles = {
23
- circle: "rounded-full",
24
- square: "rounded-lg"
25
- };
22
+ function getShapeClass(shape, size) {
23
+ if (shape === "circle") return "rounded-full";
24
+ return size === "sm" ? "rounded" : "rounded-lg";
25
+ }
26
26
  function Avatar(props) {
27
27
  const { size = "lg", shape = "circle", className } = props;
28
28
  const base = clsx(
29
29
  "shrink-0 overflow-hidden",
30
30
  sizeStyles[size],
31
- shapeStyles[shape],
31
+ getShapeClass(shape, size),
32
32
  className
33
33
  );
34
34
  if (props.type === "image") {
@@ -52,7 +52,7 @@ function Avatar(props) {
52
52
  "span",
53
53
  {
54
54
  className: clsx(
55
- "select-none leading-none text-text-brand-on-brand",
55
+ "select-none leading-none text-brand-on-brand",
56
56
  initialTextStyles[size]
57
57
  ),
58
58
  children: props.initial.charAt(0).toUpperCase()
@@ -79,16 +79,16 @@ function NavItem({
79
79
  className: clsx2(
80
80
  "relative flex h-11 w-full items-center gap-3 rounded-xl px-3.5 py-2.5 transition-colors",
81
81
  collapsed && "justify-center",
82
- isActive ? "bg-background-brand text-text-brand-on-brand" : [
83
- "border border-border-default bg-background-default text-text-default-secondary",
84
- "hover:bg-background-brand-tertiary-hover hover:border-border-brand-tertiary hover:text-text-brand"
82
+ isActive ? "bg-brand text-brand-on-brand" : [
83
+ "border border-default bg-default text-default-secondary",
84
+ "hover:bg-brand-tertiary-hover hover:border-brand-tertiary hover:text-brand"
85
85
  ],
86
86
  className
87
87
  ),
88
88
  children: [
89
89
  icon !== void 0 && /* @__PURE__ */ jsx2("span", { className: "shrink-0 [&_svg]:size-4", children: icon }),
90
90
  !collapsed && /* @__PURE__ */ jsx2("span", { className: "flex-1 min-w-0 truncate text-body-sm font-regular leading-snug", children: label }),
91
- indicator && /* @__PURE__ */ jsx2("span", { className: "absolute -right-px -top-px size-2 rounded-full bg-background-danger" })
91
+ indicator && /* @__PURE__ */ jsx2("span", { className: "absolute -right-px -top-px size-2 rounded-full bg-danger" })
92
92
  ]
93
93
  }
94
94
  );
@@ -207,13 +207,13 @@ function SidebarLogo({ collapsed }) {
207
207
  collapsed ? "justify-center" : "gap-2.5"
208
208
  ),
209
209
  children: [
210
- /* @__PURE__ */ jsx4("div", { className: "flex shrink-0 size-10 items-center justify-center rounded-xl bg-background-brand-hover overflow-hidden", children: /* @__PURE__ */ jsxs3("div", { className: "grid grid-cols-2 gap-[3px]", children: [
210
+ /* @__PURE__ */ jsx4("div", { className: "flex shrink-0 size-10 items-center justify-center rounded-xl bg-brand-hover overflow-hidden", children: /* @__PURE__ */ jsxs3("div", { className: "grid grid-cols-2 gap-[3px]", children: [
211
211
  /* @__PURE__ */ jsx4("div", { className: "size-2 rounded-[2px] bg-white" }),
212
212
  /* @__PURE__ */ jsx4("div", { className: "size-2 rounded-[2px] bg-white/50" }),
213
213
  /* @__PURE__ */ jsx4("div", { className: "size-2 rounded-[2px] bg-white/50" }),
214
214
  /* @__PURE__ */ jsx4("div", { className: "size-2 rounded-[2px] bg-white" })
215
215
  ] }) }),
216
- !collapsed && /* @__PURE__ */ jsx4("span", { className: "text-heading font-semibold text-text-default tracking-tight whitespace-nowrap", children: "SCIC" })
216
+ !collapsed && /* @__PURE__ */ jsx4("span", { className: "text-heading font-semibold text-default tracking-tight whitespace-nowrap", children: "SCIC" })
217
217
  ]
218
218
  }
219
219
  );
@@ -252,7 +252,7 @@ function UserCard({ collapsed, name, role, onLogout }) {
252
252
  setMenuOpen(false);
253
253
  onLogout();
254
254
  },
255
- className: "flex w-full items-center gap-2 px-3 py-2 text-body-sm text-text-default hover:bg-background-default-hover transition-colors",
255
+ className: "flex w-full items-center gap-2 px-3 py-2 text-body-sm text-default hover:bg-default-hover transition-colors",
256
256
  children: [
257
257
  /* @__PURE__ */ jsx4(LogOutIcon, {}),
258
258
  "Sign out"
@@ -279,12 +279,12 @@ function UserCard({ collapsed, name, role, onLogout }) {
279
279
  children: /* @__PURE__ */ jsx4(Avatar, { initial, size: "md", shape: "circle" })
280
280
  }
281
281
  ),
282
- menuOpen && /* @__PURE__ */ jsx4("div", { className: "absolute bottom-0 left-full ml-2 w-36 rounded-lg border border-border-default bg-background-default shadow-md py-1 z-20", children: menuItems })
282
+ menuOpen && /* @__PURE__ */ jsx4("div", { className: "absolute bottom-0 left-full ml-2 w-36 rounded-lg border border-default bg-default shadow-md py-1 z-20", children: menuItems })
283
283
  ] }) : /* @__PURE__ */ jsxs3(Fragment, { children: [
284
284
  /* @__PURE__ */ jsx4(Avatar, { initial, size: "md", shape: "circle" }),
285
285
  /* @__PURE__ */ jsxs3("div", { className: "flex flex-1 min-w-0 flex-col gap-0.5", children: [
286
- /* @__PURE__ */ jsx4("span", { className: "truncate text-body-sm font-semibold text-text-default leading-snug", children: name }),
287
- /* @__PURE__ */ jsx4("span", { className: "truncate text-body-tiny font-regular text-text-default-secondary leading-none", children: role })
286
+ /* @__PURE__ */ jsx4("span", { className: "truncate text-body-sm font-semibold text-default leading-snug", children: name }),
287
+ /* @__PURE__ */ jsx4("span", { className: "truncate text-body-tiny font-regular text-default-secondary leading-none", children: role })
288
288
  ] }),
289
289
  /* @__PURE__ */ jsxs3("div", { className: "relative shrink-0", ref: menuRef, children: [
290
290
  /* @__PURE__ */ jsx4(
@@ -295,11 +295,11 @@ function UserCard({ collapsed, name, role, onLogout }) {
295
295
  "aria-haspopup": "menu",
296
296
  "aria-expanded": menuOpen,
297
297
  onClick: () => setMenuOpen((v) => !v),
298
- className: "flex size-6 items-center justify-center rounded-md text-text-default-secondary hover:bg-background-default-hover hover:text-text-default transition-colors",
298
+ className: "flex size-6 items-center justify-center rounded-md text-default-secondary hover:bg-default-hover hover:text-default transition-colors",
299
299
  children: /* @__PURE__ */ jsx4(MoreVerticalIcon, {})
300
300
  }
301
301
  ),
302
- menuOpen && /* @__PURE__ */ jsx4("div", { className: "absolute bottom-full right-0 mb-1 w-36 rounded-lg border border-border-default bg-background-default shadow-md py-1 z-20", children: menuItems })
302
+ menuOpen && /* @__PURE__ */ jsx4("div", { className: "absolute bottom-full right-0 mb-1 w-36 rounded-lg border border-default bg-default shadow-md py-1 z-20", children: menuItems })
303
303
  ] })
304
304
  ] })
305
305
  }
@@ -311,7 +311,7 @@ function AppSidebar({ collapsed, onToggle, isAdmin = false, userName, userRole,
311
311
  {
312
312
  className: clsx4(
313
313
  "relative flex flex-col shrink-0 transition-all duration-200",
314
- "bg-background-default-secondary border-r border-border-default rounded-xl",
314
+ "bg-default-secondary border-r border-default rounded-xl",
315
315
  "h-full",
316
316
  collapsed ? "w-20" : "w-80"
317
317
  ),
@@ -324,8 +324,8 @@ function AppSidebar({ collapsed, onToggle, isAdmin = false, userName, userRole,
324
324
  onClick: onToggle,
325
325
  className: clsx4(
326
326
  "absolute -right-3 top-5 z-10 flex size-6 items-center justify-center rounded-full",
327
- "bg-background-default border border-border-default text-text-default-secondary",
328
- "hover:bg-background-default-hover shadow-sm transition-colors"
327
+ "bg-default border border-default text-default-secondary",
328
+ "hover:bg-default-hover shadow-sm transition-colors"
329
329
  ),
330
330
  children: collapsed ? /* @__PURE__ */ jsx4(ChevronRightIcon, {}) : /* @__PURE__ */ jsx4(ChevronLeftIcon, {})
331
331
  }
@@ -355,7 +355,7 @@ function AppSidebar({ collapsed, onToggle, isAdmin = false, userName, userRole,
355
355
  collapsed
356
356
  }
357
357
  ) }),
358
- /* @__PURE__ */ jsx4("div", { className: "border-t border-border-default", children: /* @__PURE__ */ jsx4(UserCard, { collapsed, name: userName, role: userRole, onLogout }) })
358
+ /* @__PURE__ */ jsx4("div", { className: "border-t border-default", children: /* @__PURE__ */ jsx4(UserCard, { collapsed, name: userName, role: userRole, onLogout }) })
359
359
  ] })
360
360
  ]
361
361
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sidebar/index.tsx","../src/index.tsx","../src/components/avatar.tsx","../src/components/nav-item.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useRef, useState } from 'react';\r\nimport { NavLink } from 'react-router-dom';\r\nimport clsx from 'clsx';\r\n\r\nimport { Avatar, NavItem } from '../index';\r\n\r\n// ── Inline SVG icons (Lucide-compatible, 24×24 viewBox rendered at 16×16) ──\r\n\r\nfunction GridIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\r\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\r\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\r\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction LayersIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <polygon points=\"12 2 2 7 12 12 22 7 12 2\" />\r\n <polyline points=\"2 17 12 22 22 17\" />\r\n <polyline points=\"2 12 12 17 22 12\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction BuildingIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\" />\r\n <path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction UsersIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\" />\r\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\r\n <path d=\"M23 21v-2a4 4 0 0 0-3-3.87\" />\r\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction RssIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <path d=\"M4 11a9 9 0 0 1 9 9\" />\r\n <path d=\"M4 4a16 16 0 0 1 16 16\" />\r\n <circle cx=\"5\" cy=\"19\" r=\"1\" fill=\"currentColor\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction FileTextIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\r\n <polyline points=\"14 2 14 8 20 8\" />\r\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\r\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction BellIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\" />\r\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ServerIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" />\r\n <rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" />\r\n <line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\" />\r\n <line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction SettingsIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\r\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ClipboardListIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <path d=\"M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2\" />\r\n <rect x=\"9\" y=\"3\" width=\"6\" height=\"4\" rx=\"1\" />\r\n <line x1=\"9\" y1=\"12\" x2=\"15\" y2=\"12\" />\r\n <line x1=\"9\" y1=\"16\" x2=\"13\" y2=\"16\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction GlobeIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\r\n <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\" />\r\n <path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronLeftIcon() {\r\n return (\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <polyline points=\"15 18 9 12 15 6\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronRightIcon() {\r\n return (\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <polyline points=\"9 18 15 12 9 6\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction MoreVerticalIcon() {\r\n return (\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <circle cx=\"12\" cy=\"5\" r=\"1\" fill=\"currentColor\" />\r\n <circle cx=\"12\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\r\n <circle cx=\"12\" cy=\"19\" r=\"1\" fill=\"currentColor\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction LogOutIcon() {\r\n return (\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\r\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\r\n <polyline points=\"16 17 21 12 16 7\" />\r\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ── Logo ────────────────────────────────────────────────────────────────────\r\n\r\nfunction SidebarLogo({ collapsed }: { collapsed: boolean }) {\r\n return (\r\n <div\r\n className={clsx(\r\n 'flex shrink-0 items-center overflow-hidden p-4',\r\n collapsed ? 'justify-center' : 'gap-2.5',\r\n )}\r\n >\r\n <div className=\"flex shrink-0 size-10 items-center justify-center rounded-xl bg-background-brand-hover overflow-hidden\">\r\n <div className=\"grid grid-cols-2 gap-[3px]\">\r\n <div className=\"size-2 rounded-[2px] bg-white\" />\r\n <div className=\"size-2 rounded-[2px] bg-white/50\" />\r\n <div className=\"size-2 rounded-[2px] bg-white/50\" />\r\n <div className=\"size-2 rounded-[2px] bg-white\" />\r\n </div>\r\n </div>\r\n {!collapsed && (\r\n <span className=\"text-heading font-semibold text-text-default tracking-tight whitespace-nowrap\">\r\n SCIC\r\n </span>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ── NavLink item ─────────────────────────────────────────────────────────────\r\n\r\ninterface NavLinkItemProps {\r\n to: string;\r\n icon: ReactNode;\r\n label: string;\r\n indicator?: boolean;\r\n collapsed: boolean;\r\n end?: boolean;\r\n}\r\n\r\nfunction NavLinkItem({ to, icon, label, indicator, collapsed, end }: NavLinkItemProps) {\r\n return (\r\n <NavLink to={to} end={end} className=\"block w-full no-underline\">\r\n {({ isActive }) => (\r\n <NavItem\r\n icon={icon}\r\n label={label}\r\n isActive={isActive}\r\n indicator={indicator}\r\n collapsed={collapsed}\r\n />\r\n )}\r\n </NavLink>\r\n );\r\n}\r\n\r\n// ── User card ────────────────────────────────────────────────────────────────\r\n\r\nfunction UserCard({ collapsed, name, role, onLogout }: { collapsed: boolean; name: string; role: string; onLogout: () => void }) {\r\n const [menuOpen, setMenuOpen] = useState(false);\r\n const menuRef = useRef<HTMLDivElement>(null);\r\n const initial = name.trim().charAt(0);\r\n\r\n useEffect(() => {\r\n if (!menuOpen) return;\r\n function handleClickOutside(e: MouseEvent) {\r\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\r\n setMenuOpen(false);\r\n }\r\n }\r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, [menuOpen]);\r\n\r\n const menuItems = (\r\n <button\r\n type=\"button\"\r\n onClick={() => { setMenuOpen(false); onLogout(); }}\r\n className=\"flex w-full items-center gap-2 px-3 py-2 text-body-sm text-text-default hover:bg-background-default-hover transition-colors\"\r\n >\r\n <LogOutIcon />\r\n Sign out\r\n </button>\r\n );\r\n\r\n return (\r\n <div\r\n className={clsx(\r\n 'flex shrink-0 items-center p-4',\r\n collapsed ? 'justify-center' : 'gap-2.5',\r\n )}\r\n >\r\n {collapsed ? (\r\n <div className=\"relative\" ref={menuRef}>\r\n <button\r\n type=\"button\"\r\n aria-label=\"User options\"\r\n aria-haspopup=\"menu\"\r\n aria-expanded={menuOpen}\r\n onClick={() => setMenuOpen(v => !v)}\r\n className=\"rounded-full\"\r\n >\r\n <Avatar initial={initial} size=\"md\" shape=\"circle\" />\r\n </button>\r\n {menuOpen && (\r\n <div className=\"absolute bottom-0 left-full ml-2 w-36 rounded-lg border border-border-default bg-background-default shadow-md py-1 z-20\">\r\n {menuItems}\r\n </div>\r\n )}\r\n </div>\r\n ) : (\r\n <>\r\n <Avatar initial={initial} size=\"md\" shape=\"circle\" />\r\n <div className=\"flex flex-1 min-w-0 flex-col gap-0.5\">\r\n <span className=\"truncate text-body-sm font-semibold text-text-default leading-snug\">\r\n {name}\r\n </span>\r\n <span className=\"truncate text-body-tiny font-regular text-text-default-secondary leading-none\">\r\n {role}\r\n </span>\r\n </div>\r\n <div className=\"relative shrink-0\" ref={menuRef}>\r\n <button\r\n type=\"button\"\r\n aria-label=\"User options\"\r\n aria-haspopup=\"menu\"\r\n aria-expanded={menuOpen}\r\n onClick={() => setMenuOpen(v => !v)}\r\n className=\"flex size-6 items-center justify-center rounded-md text-text-default-secondary hover:bg-background-default-hover hover:text-text-default transition-colors\"\r\n >\r\n <MoreVerticalIcon />\r\n </button>\r\n {menuOpen && (\r\n <div className=\"absolute bottom-full right-0 mb-1 w-36 rounded-lg border border-border-default bg-background-default shadow-md py-1 z-20\">\r\n {menuItems}\r\n </div>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ── Main sidebar ─────────────────────────────────────────────────────────────\r\n\r\ninterface AppSidebarProps {\r\n collapsed: boolean;\r\n onToggle: () => void;\r\n isAdmin?: boolean;\r\n userName: string;\r\n userRole: string;\r\n onLogout: () => void;\r\n}\r\n\r\nexport function AppSidebar({ collapsed, onToggle, isAdmin = false, userName, userRole, onLogout }: AppSidebarProps) {\r\n\r\n return (\r\n <aside\r\n className={clsx(\r\n 'relative flex flex-col shrink-0 transition-all duration-200',\r\n 'bg-background-default-secondary border-r border-border-default rounded-xl',\r\n 'h-full',\r\n collapsed ? 'w-20' : 'w-80',\r\n )}\r\n >\r\n {/* Toggle button */}\r\n <button\r\n type=\"button\"\r\n aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}\r\n onClick={onToggle}\r\n className={clsx(\r\n 'absolute -right-3 top-5 z-10 flex size-6 items-center justify-center rounded-full',\r\n 'bg-background-default border border-border-default text-text-default-secondary',\r\n 'hover:bg-background-default-hover shadow-sm transition-colors',\r\n )}\r\n >\r\n {collapsed ? <ChevronRightIcon /> : <ChevronLeftIcon />}\r\n </button>\r\n\r\n {/* Top — logo + primary nav */}\r\n <div className=\"flex flex-1 min-h-0 flex-col gap-1\">\r\n <SidebarLogo collapsed={collapsed} />\r\n\r\n <nav className=\"flex flex-col gap-3 overflow-y-auto px-4 pt-2 pb-3\">\r\n <NavLinkItem to=\"/dashboard\" icon={<GridIcon />} label=\"Dashboard\" collapsed={collapsed} end />\r\n <NavLinkItem to=\"/entities\" icon={<LayersIcon />} label=\"Entities\" collapsed={collapsed} indicator />\r\n <NavLinkItem to=\"/suppliers\" icon={<BuildingIcon />} label=\"Suppliers\" collapsed={collapsed} />\r\n <NavLinkItem to=\"/customers\" icon={<UsersIcon />} label=\"Customers\" collapsed={collapsed} />\r\n <NavLinkItem to=\"/sources\" icon={<FileTextIcon />} label=\"Sources\" collapsed={collapsed} />\r\n <NavLinkItem to=\"/articles\" icon={<RssIcon />} label=\"Intelligence\" collapsed={collapsed} />\r\n <NavLinkItem to=\"/alerts\" icon={<BellIcon />} label=\"Alerts\" collapsed={collapsed} />\r\n <NavLinkItem to=\"/website-scraper\" icon={<GlobeIcon />} label=\"Website Intel\" collapsed={collapsed} />\r\n <NavLinkItem to=\"/review\" icon={<ClipboardListIcon />} label=\"Review queue\" collapsed={collapsed} />\r\n {isAdmin && (\r\n <NavLinkItem to=\"/queues\" icon={<ServerIcon />} label=\"Queues\" collapsed={collapsed} />\r\n )}\r\n </nav>\r\n </div>\r\n\r\n {/* Bottom — settings + user card */}\r\n <div className=\"flex flex-col\">\r\n {isAdmin && (\r\n <div className=\"px-4 pb-2\">\r\n <NavLinkItem\r\n to=\"/settings\"\r\n icon={<SettingsIcon />}\r\n label=\"Settings\"\r\n collapsed={collapsed}\r\n />\r\n </div>\r\n )}\r\n <div className=\"border-t border-border-default\">\r\n <UserCard collapsed={collapsed} name={userName} role={userRole} onLogout={onLogout} />\r\n </div>\r\n </div>\r\n </aside>\r\n );\r\n}\r\n","import clsx from 'clsx';\r\nimport type { ReactNode } from 'react';\r\n\r\nexport { Button } from './components/button';\r\nexport type { ButtonProps, ButtonVariant, ButtonSize } from './components/button';\r\n\r\nexport { IconButton } from './components/icon-button';\r\nexport type { IconButtonProps, IconButtonVariant } from './components/icon-button';\r\n\r\nexport { ButtonGroup } from './components/button-group';\r\nexport type { ButtonGroupProps, ButtonGroupItem, ButtonGroupVariant, ButtonGroupAlign } from './components/button-group';\r\n\r\nexport { Avatar } from './components/avatar';\r\nexport type { AvatarProps, AvatarInitialProps, AvatarImageProps, AvatarSize, AvatarShape } from './components/avatar';\r\n\r\nexport { AvatarGroup } from './components/avatar-group';\r\nexport type { AvatarGroupProps, AvatarGroupSpacing } from './components/avatar-group';\r\n\r\nexport { NavItem } from './components/nav-item';\r\nexport type { NavItemProps } from './components/nav-item';\r\n\r\nexport { Input } from './components/input';\r\nexport type { InputProps, InputSize } from './components/input';\r\n\r\nexport { Textarea } from './components/textarea';\r\nexport type { TextareaProps } from './components/textarea';\r\n\r\nexport { Select } from './components/select';\r\nexport type { SelectProps, SelectOption } from './components/select';\r\n\r\nexport { Stepper } from './components/stepper';\r\nexport type { StepperProps, StepItem, StepStatus } from './components/stepper';\r\n\r\nexport { MultiSelectCard } from './components/multiselect-card';\r\nexport type { MultiSelectCardProps } from './components/multiselect-card';\r\n\r\nexport { DataTable, TableCellLeadText, TableCellText, TableCellBadge, TableCellStatusPill, TableCellProgress } from './components/data-table';\r\nexport type { ColumnDef } from './components/data-table';\r\n\r\nexport { StatTile } from './components/stat-tile';\r\nexport type { StatTileProps } from './components/stat-tile';\r\n\r\nexport { Toggle } from './components/toggle';\r\nexport type { ToggleProps } from './components/toggle';\r\n\r\nexport { FileDropZone } from './components/file-drop-zone';\r\nexport type { FileDropZoneProps } from './components/file-drop-zone';\r\n\r\nexport { FormCard, FormCardHeader, FormCardFooter } from './components/form-card';\r\nexport type { FormCardHeaderProps, FormCardFooterProps } from './components/form-card';\r\n\r\nexport { DocumentRow } from './components/document-row';\r\nexport type { DocumentRowProps, DocumentStatus } from './components/document-row';\r\n\r\nexport function Panel({\r\n children,\r\n className\r\n}: {\r\n children: ReactNode;\r\n className?: string;\r\n}) {\r\n return (\r\n <section className={clsx('rounded-3xl border border-white/70 bg-white/90 p-6 shadow-panel backdrop-blur', className)}>\r\n {children}\r\n </section>\r\n );\r\n}\r\n\r\nexport function MetricCard({\r\n label,\r\n value,\r\n tone = 'default'\r\n}: {\r\n label: string;\r\n value: string | number;\r\n tone?: 'default' | 'signal' | 'ember' | 'moss';\r\n}) {\r\n const tones = {\r\n default: 'from-white to-slate-50 text-text-default',\r\n signal: 'from-background-brand-tertiary to-cyan-50 text-text-brand',\r\n ember: 'from-amber-50 to-orange-50 text-text-danger',\r\n moss: 'from-emerald-50 to-lime-50 text-text-positive'\r\n };\r\n\r\n return (\r\n <Panel className={clsx('bg-gradient-to-br', tones[tone])}>\r\n <p className=\"text-sm uppercase tracking-[0.2em] text-slate-500\">{label}</p>\r\n <p className=\"mt-3 text-3xl font-semibold\">{value}</p>\r\n </Panel>\r\n );\r\n}\r\n\r\nexport function SeverityBadge({ severity }: { severity?: string | null }) {\r\n const styles: Record<string, string> = {\r\n critical: 'bg-red-100 text-red-700',\r\n high: 'bg-orange-100 text-orange-700',\r\n medium: 'bg-amber-100 text-amber-700',\r\n low: 'bg-slate-100 text-slate-700'\r\n };\r\n\r\n return (\r\n <span className={clsx('inline-flex rounded-full px-3 py-1 text-xs font-semibold uppercase tracking-wide', styles[severity ?? 'low'])}>\r\n {severity ?? 'unknown'}\r\n </span>\r\n );\r\n}\r\n\r\nexport function SentimentBadge({ sentiment }: { sentiment?: string | null }) {\r\n const styles: Record<string, string> = {\r\n positive: 'bg-emerald-100 text-emerald-700',\r\n neutral: 'bg-slate-100 text-slate-700',\r\n negative: 'bg-rose-100 text-rose-700',\r\n concerning: 'bg-amber-100 text-amber-700'\r\n };\r\n\r\n return (\r\n <span className={clsx('inline-flex rounded-full px-3 py-1 text-xs font-semibold capitalize', styles[sentiment ?? 'neutral'] ?? styles.neutral)}>\r\n {sentiment ?? 'unknown'}\r\n </span>\r\n );\r\n}\r\n\r\nexport { Modal } from './components/modal';\r\nexport type { ModalProps } from './components/modal';\r\n\r\nexport { RoleBadge } from './components/role-badge';\r\nexport type { RoleBadgeProps } from './components/role-badge';\r\n\r\nexport { RoleComboBox, ROLE_COMBO_OPTIONS } from './components/role-combo-box';\r\nexport type { RoleComboBoxProps, RoleOption } from './components/role-combo-box';\r\n\r\nexport function SectionHeading({\r\n eyebrow,\r\n title,\r\n detail\r\n}: {\r\n eyebrow: string;\r\n title: string;\r\n detail?: string;\r\n}) {\r\n return (\r\n <div>\r\n <p className=\"text-xs uppercase tracking-[0.25em] text-text-brand\">{eyebrow}</p>\r\n <h2 className=\"mt-2 text-2xl font-semibold text-text-default\">{title}</h2>\r\n {detail ? <p className=\"mt-2 max-w-2xl text-sm text-slate-600\">{detail}</p> : null}\r\n </div>\r\n );\r\n}\r\n\r\n","import clsx from 'clsx';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg';\nexport type AvatarShape = 'circle' | 'square';\n\nexport interface AvatarInitialProps {\n type?: 'initial';\n /** Single character — Figma spec: one letter only to avoid overflow */\n initial: string;\n size?: AvatarSize;\n shape?: AvatarShape;\n className?: string;\n}\n\nexport interface AvatarImageProps {\n type: 'image';\n src: string;\n alt?: string;\n size?: AvatarSize;\n shape?: AvatarShape;\n className?: string;\n}\n\nexport type AvatarProps = AvatarInitialProps | AvatarImageProps;\n\n// Figma sizes: lg=40px, md=32px, sm=24px\nconst sizeStyles: Record<AvatarSize, string> = {\n lg: 'size-10',\n md: 'size-8',\n sm: 'size-6',\n};\n\n// Figma text sizes for initials: body-medium at lg, scales down proportionally\nconst initialTextStyles: Record<AvatarSize, string> = {\n lg: 'text-body font-semibold',\n md: 'text-body-xs font-semibold',\n sm: 'text-body-tiny font-semibold',\n};\n\n// Figma shape radii: circle=full, square=8px (rounded-lg)\nconst shapeStyles: Record<AvatarShape, string> = {\n circle: 'rounded-full',\n square: 'rounded-lg',\n};\n\nexport function Avatar(props: AvatarProps) {\n const { size = 'lg', shape = 'circle', className } = props;\n\n const base = clsx(\n 'shrink-0 overflow-hidden',\n sizeStyles[size],\n shapeStyles[shape],\n className,\n );\n\n if (props.type === 'image') {\n return (\n <div className={base}>\n <img\n src={props.src}\n alt={props.alt ?? ''}\n className=\"size-full object-cover\"\n />\n </div>\n );\n }\n\n return (\n <div\n className={clsx(base, 'flex items-center justify-center')}\n style={{\n background:\n 'linear-gradient(135deg, var(--color-graphic-blue) 30%, var(--color-graphic-red) 100%)',\n }}\n >\n <span\n className={clsx(\n 'select-none leading-none text-text-brand-on-brand',\n initialTextStyles[size],\n )}\n >\n {props.initial.charAt(0).toUpperCase()}\n </span>\n </div>\n );\n}\n","import { type ReactNode } from 'react';\nimport clsx from 'clsx';\n\nexport interface NavItemProps {\n icon?: ReactNode;\n label: string;\n isActive?: boolean;\n /** Red indicator dot at top-right corner (e.g. unread count) */\n indicator?: boolean;\n /** Collapsed mode — icon only, label hidden */\n collapsed?: boolean;\n className?: string;\n}\n\nexport function NavItem({\n icon,\n label,\n isActive = false,\n indicator = false,\n collapsed = false,\n className,\n}: NavItemProps) {\n return (\n <span\n className={clsx(\n 'relative flex h-11 w-full items-center gap-3 rounded-xl px-3.5 py-2.5 transition-colors',\n collapsed && 'justify-center',\n isActive\n ? 'bg-background-brand text-text-brand-on-brand'\n : [\n 'border border-border-default bg-background-default text-text-default-secondary',\n 'hover:bg-background-brand-tertiary-hover hover:border-border-brand-tertiary hover:text-text-brand',\n ],\n className,\n )}\n >\n {icon !== undefined && (\n <span className=\"shrink-0 [&_svg]:size-4\">{icon}</span>\n )}\n {!collapsed && (\n <span className=\"flex-1 min-w-0 truncate text-body-sm font-regular leading-snug\">\n {label}\n </span>\n )}\n {indicator && (\n <span className=\"absolute -right-px -top-px size-2 rounded-full bg-background-danger\" />\n )}\n </span>\n );\n}\n"],"mappings":"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","names":["clsx","clsx","clsx","jsx","jsx","jsxs","jsx","jsxs","clsx"]}
1
+ {"version":3,"sources":["../src/sidebar/index.tsx","../src/index.tsx","../src/components/avatar.tsx","../src/components/nav-item.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useRef, useState } from 'react';\nimport { NavLink } from 'react-router-dom';\nimport clsx from 'clsx';\n\nimport { Avatar, NavItem } from '../index';\n\n// ── Inline SVG icons (Lucide-compatible, 24×24 viewBox rendered at 16×16) ──\n\nfunction GridIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n </svg>\n );\n}\n\nfunction LayersIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <polygon points=\"12 2 2 7 12 12 22 7 12 2\" />\n <polyline points=\"2 17 12 22 22 17\" />\n <polyline points=\"2 12 12 17 22 12\" />\n </svg>\n );\n}\n\nfunction BuildingIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\" />\n <path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\" />\n </svg>\n );\n}\n\nfunction UsersIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M23 21v-2a4 4 0 0 0-3-3.87\" />\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n </svg>\n );\n}\n\nfunction RssIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M4 11a9 9 0 0 1 9 9\" />\n <path d=\"M4 4a16 16 0 0 1 16 16\" />\n <circle cx=\"5\" cy=\"19\" r=\"1\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction FileTextIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n </svg>\n );\n}\n\nfunction BellIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\" />\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\" />\n </svg>\n );\n}\n\nfunction ServerIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" />\n <rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" />\n <line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\" />\n <line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction SettingsIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\" />\n </svg>\n );\n}\n\nfunction ClipboardListIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2\" />\n <rect x=\"9\" y=\"3\" width=\"6\" height=\"4\" rx=\"1\" />\n <line x1=\"9\" y1=\"12\" x2=\"15\" y2=\"12\" />\n <line x1=\"9\" y1=\"16\" x2=\"13\" y2=\"16\" />\n </svg>\n );\n}\n\nfunction GlobeIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\" />\n <path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" />\n </svg>\n );\n}\n\nfunction ChevronLeftIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n );\n}\n\nfunction ChevronRightIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n}\n\nfunction MoreVerticalIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nfunction LogOutIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <polyline points=\"16 17 21 12 16 7\" />\n <line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\" />\n </svg>\n );\n}\n\n// ── Logo ────────────────────────────────────────────────────────────────────\n\nfunction SidebarLogo({ collapsed }: { collapsed: boolean }) {\n return (\n <div\n className={clsx(\n 'flex shrink-0 items-center overflow-hidden p-4',\n collapsed ? 'justify-center' : 'gap-2.5',\n )}\n >\n <div className=\"flex shrink-0 size-10 items-center justify-center rounded-xl bg-brand-hover overflow-hidden\">\n <div className=\"grid grid-cols-2 gap-[3px]\">\n <div className=\"size-2 rounded-[2px] bg-white\" />\n <div className=\"size-2 rounded-[2px] bg-white/50\" />\n <div className=\"size-2 rounded-[2px] bg-white/50\" />\n <div className=\"size-2 rounded-[2px] bg-white\" />\n </div>\n </div>\n {!collapsed && (\n <span className=\"text-heading font-semibold text-default tracking-tight whitespace-nowrap\">\n SCIC\n </span>\n )}\n </div>\n );\n}\n\n// ── NavLink item ─────────────────────────────────────────────────────────────\n\ninterface NavLinkItemProps {\n to: string;\n icon: ReactNode;\n label: string;\n indicator?: boolean;\n collapsed: boolean;\n end?: boolean;\n}\n\nfunction NavLinkItem({ to, icon, label, indicator, collapsed, end }: NavLinkItemProps) {\n return (\n <NavLink to={to} end={end} className=\"block w-full no-underline\">\n {({ isActive }) => (\n <NavItem\n icon={icon}\n label={label}\n isActive={isActive}\n indicator={indicator}\n collapsed={collapsed}\n />\n )}\n </NavLink>\n );\n}\n\n// ── User card ────────────────────────────────────────────────────────────────\n\nfunction UserCard({ collapsed, name, role, onLogout }: { collapsed: boolean; name: string; role: string; onLogout: () => void }) {\n const [menuOpen, setMenuOpen] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n const initial = name.trim().charAt(0);\n\n useEffect(() => {\n if (!menuOpen) return;\n function handleClickOutside(e: MouseEvent) {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n setMenuOpen(false);\n }\n }\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [menuOpen]);\n\n const menuItems = (\n <button\n type=\"button\"\n onClick={() => { setMenuOpen(false); onLogout(); }}\n className=\"flex w-full items-center gap-2 px-3 py-2 text-body-sm text-default hover:bg-default-hover transition-colors\"\n >\n <LogOutIcon />\n Sign out\n </button>\n );\n\n return (\n <div\n className={clsx(\n 'flex shrink-0 items-center p-4',\n collapsed ? 'justify-center' : 'gap-2.5',\n )}\n >\n {collapsed ? (\n <div className=\"relative\" ref={menuRef}>\n <button\n type=\"button\"\n aria-label=\"User options\"\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen(v => !v)}\n className=\"rounded-full\"\n >\n <Avatar initial={initial} size=\"md\" shape=\"circle\" />\n </button>\n {menuOpen && (\n <div className=\"absolute bottom-0 left-full ml-2 w-36 rounded-lg border border-default bg-default shadow-md py-1 z-20\">\n {menuItems}\n </div>\n )}\n </div>\n ) : (\n <>\n <Avatar initial={initial} size=\"md\" shape=\"circle\" />\n <div className=\"flex flex-1 min-w-0 flex-col gap-0.5\">\n <span className=\"truncate text-body-sm font-semibold text-default leading-snug\">\n {name}\n </span>\n <span className=\"truncate text-body-tiny font-regular text-default-secondary leading-none\">\n {role}\n </span>\n </div>\n <div className=\"relative shrink-0\" ref={menuRef}>\n <button\n type=\"button\"\n aria-label=\"User options\"\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen(v => !v)}\n className=\"flex size-6 items-center justify-center rounded-md text-default-secondary hover:bg-default-hover hover:text-default transition-colors\"\n >\n <MoreVerticalIcon />\n </button>\n {menuOpen && (\n <div className=\"absolute bottom-full right-0 mb-1 w-36 rounded-lg border border-default bg-default shadow-md py-1 z-20\">\n {menuItems}\n </div>\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n\n// ── Main sidebar ─────────────────────────────────────────────────────────────\n\ninterface AppSidebarProps {\n collapsed: boolean;\n onToggle: () => void;\n isAdmin?: boolean;\n userName: string;\n userRole: string;\n onLogout: () => void;\n}\n\nexport function AppSidebar({ collapsed, onToggle, isAdmin = false, userName, userRole, onLogout }: AppSidebarProps) {\n\n return (\n <aside\n className={clsx(\n 'relative flex flex-col shrink-0 transition-all duration-200',\n 'bg-default-secondary border-r border-default rounded-xl',\n 'h-full',\n collapsed ? 'w-20' : 'w-80',\n )}\n >\n {/* Toggle button */}\n <button\n type=\"button\"\n aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n onClick={onToggle}\n className={clsx(\n 'absolute -right-3 top-5 z-10 flex size-6 items-center justify-center rounded-full',\n 'bg-default border border-default text-default-secondary',\n 'hover:bg-default-hover shadow-sm transition-colors',\n )}\n >\n {collapsed ? <ChevronRightIcon /> : <ChevronLeftIcon />}\n </button>\n\n {/* Top — logo + primary nav */}\n <div className=\"flex flex-1 min-h-0 flex-col gap-1\">\n <SidebarLogo collapsed={collapsed} />\n\n <nav className=\"flex flex-col gap-3 overflow-y-auto px-4 pt-2 pb-3\">\n <NavLinkItem to=\"/dashboard\" icon={<GridIcon />} label=\"Dashboard\" collapsed={collapsed} end />\n <NavLinkItem to=\"/entities\" icon={<LayersIcon />} label=\"Entities\" collapsed={collapsed} indicator />\n <NavLinkItem to=\"/suppliers\" icon={<BuildingIcon />} label=\"Suppliers\" collapsed={collapsed} />\n <NavLinkItem to=\"/customers\" icon={<UsersIcon />} label=\"Customers\" collapsed={collapsed} />\n <NavLinkItem to=\"/sources\" icon={<FileTextIcon />} label=\"Sources\" collapsed={collapsed} />\n <NavLinkItem to=\"/articles\" icon={<RssIcon />} label=\"Intelligence\" collapsed={collapsed} />\n <NavLinkItem to=\"/alerts\" icon={<BellIcon />} label=\"Alerts\" collapsed={collapsed} />\n <NavLinkItem to=\"/website-scraper\" icon={<GlobeIcon />} label=\"Website Intel\" collapsed={collapsed} />\n <NavLinkItem to=\"/review\" icon={<ClipboardListIcon />} label=\"Review queue\" collapsed={collapsed} />\n {isAdmin && (\n <NavLinkItem to=\"/queues\" icon={<ServerIcon />} label=\"Queues\" collapsed={collapsed} />\n )}\n </nav>\n </div>\n\n {/* Bottom — settings + user card */}\n <div className=\"flex flex-col\">\n {isAdmin && (\n <div className=\"px-4 pb-2\">\n <NavLinkItem\n to=\"/settings\"\n icon={<SettingsIcon />}\n label=\"Settings\"\n collapsed={collapsed}\n />\n </div>\n )}\n <div className=\"border-t border-default\">\n <UserCard collapsed={collapsed} name={userName} role={userRole} onLogout={onLogout} />\n </div>\n </div>\n </aside>\n );\n}\n","import clsx from 'clsx';\nimport type { ReactNode } from 'react';\n\nexport { Button } from './components/button';\nexport type { ButtonProps, ButtonVariant, ButtonSize } from './components/button';\n\nexport { IconButton } from './components/icon-button';\nexport type { IconButtonProps, IconButtonVariant } from './components/icon-button';\n\nexport { ButtonGroup } from './components/button-group';\nexport type { ButtonGroupProps, ButtonGroupItem, ButtonGroupVariant, ButtonGroupAlign } from './components/button-group';\n\nexport { Avatar } from './components/avatar';\nexport type { AvatarProps, AvatarInitialProps, AvatarImageProps, AvatarSize, AvatarShape } from './components/avatar';\n\nexport { AvatarGroup } from './components/avatar-group';\nexport type { AvatarGroupProps, AvatarGroupSpacing } from './components/avatar-group';\n\nexport { AvatarBlock } from './components/avatar-block';\nexport type { AvatarBlockProps } from './components/avatar-block';\n\nexport { NavItem } from './components/nav-item';\nexport type { NavItemProps } from './components/nav-item';\n\nexport { Input } from './components/input';\nexport type { InputProps, InputSize } from './components/input';\n\nexport { Textarea } from './components/textarea';\nexport type { TextareaProps } from './components/textarea';\n\nexport { Select } from './components/select';\nexport type { SelectProps, SelectOption } from './components/select';\n\nexport { Stepper } from './components/stepper';\nexport type { StepperProps, StepItem, StepStatus } from './components/stepper';\n\nexport { MultiSelectCard } from './components/multiselect-card';\nexport type { MultiSelectCardProps } from './components/multiselect-card';\n\nexport { DataTable, TableCellLeadText, TableCellText, TableCellBadge, TableCellStatusPill, TableCellProgress } from './components/data-table';\nexport type { ColumnDef } from './components/data-table';\n\nexport { StatTile } from './components/stat-tile';\nexport type { StatTileProps } from './components/stat-tile';\n\nexport { Toggle } from './components/toggle';\nexport type { ToggleProps } from './components/toggle';\n\nexport { FileDropZone } from './components/file-drop-zone';\nexport type { FileDropZoneProps } from './components/file-drop-zone';\n\nexport { FormCard, FormCardHeader, FormCardFooter } from './components/form-card';\nexport type { FormCardHeaderProps, FormCardFooterProps } from './components/form-card';\n\nexport { DocumentRow } from './components/document-row';\nexport type { DocumentRowProps, DocumentStatus } from './components/document-row';\n\nexport function Panel({\n children,\n className\n}: {\n children: ReactNode;\n className?: string;\n}) {\n return (\n <section className={clsx('rounded-3xl border border-white/70 bg-white/90 p-6 shadow-panel backdrop-blur', className)}>\n {children}\n </section>\n );\n}\n\nexport function MetricCard({\n label,\n value,\n tone = 'default'\n}: {\n label: string;\n value: string | number;\n tone?: 'default' | 'signal' | 'ember' | 'moss';\n}) {\n const tones = {\n default: 'from-white to-slate-50 text-default',\n signal: 'from-brand-tertiary to-cyan-50 text-brand',\n ember: 'from-amber-50 to-orange-50 text-danger',\n moss: 'from-emerald-50 to-lime-50 text-positive'\n };\n\n return (\n <Panel className={clsx('bg-gradient-to-br', tones[tone])}>\n <p className=\"text-sm uppercase tracking-[0.2em] text-slate-500\">{label}</p>\n <p className=\"mt-3 text-3xl font-semibold\">{value}</p>\n </Panel>\n );\n}\n\nexport function SeverityBadge({ severity }: { severity?: string | null }) {\n const styles: Record<string, string> = {\n critical: 'bg-red-100 text-red-700',\n high: 'bg-orange-100 text-orange-700',\n medium: 'bg-amber-100 text-amber-700',\n low: 'bg-slate-100 text-slate-700'\n };\n\n return (\n <span className={clsx('inline-flex rounded-full px-3 py-1 text-xs font-semibold uppercase tracking-wide', styles[severity ?? 'low'])}>\n {severity ?? 'unknown'}\n </span>\n );\n}\n\nexport function SentimentBadge({ sentiment }: { sentiment?: string | null }) {\n const styles: Record<string, string> = {\n positive: 'bg-emerald-100 text-emerald-700',\n neutral: 'bg-slate-100 text-slate-700',\n negative: 'bg-rose-100 text-rose-700',\n concerning: 'bg-amber-100 text-amber-700'\n };\n\n return (\n <span className={clsx('inline-flex rounded-full px-3 py-1 text-xs font-semibold capitalize', styles[sentiment ?? 'neutral'] ?? styles.neutral)}>\n {sentiment ?? 'unknown'}\n </span>\n );\n}\n\nexport { Modal } from './components/modal';\nexport type { ModalProps } from './components/modal';\n\nexport { RoleBadge } from './components/role-badge';\nexport type { RoleBadgeProps } from './components/role-badge';\n\nexport { RoleComboBox, ROLE_COMBO_OPTIONS } from './components/role-combo-box';\nexport type { RoleComboBoxProps, RoleOption } from './components/role-combo-box';\n\nexport function SectionHeading({\n eyebrow,\n title,\n detail\n}: {\n eyebrow: string;\n title: string;\n detail?: string;\n}) {\n return (\n <div>\n <p className=\"text-xs uppercase tracking-[0.25em] text-brand\">{eyebrow}</p>\n <h2 className=\"mt-2 text-2xl font-semibold text-default\">{title}</h2>\n {detail ? <p className=\"mt-2 max-w-2xl text-sm text-slate-600\">{detail}</p> : null}\n </div>\n );\n}\n\n","import clsx from 'clsx';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg';\nexport type AvatarShape = 'circle' | 'square';\n\nexport interface AvatarInitialProps {\n type?: 'initial';\n /** Single character — Figma spec: one letter only to avoid overflow */\n initial: string;\n size?: AvatarSize;\n shape?: AvatarShape;\n className?: string;\n}\n\nexport interface AvatarImageProps {\n type: 'image';\n src: string;\n alt?: string;\n size?: AvatarSize;\n shape?: AvatarShape;\n className?: string;\n}\n\nexport type AvatarProps = AvatarInitialProps | AvatarImageProps;\n\n// Figma sizes: lg=40px, md=32px, sm=24px\nconst sizeStyles: Record<AvatarSize, string> = {\n lg: 'size-10',\n md: 'size-8',\n sm: 'size-6',\n};\n\n// Figma text sizes for initials: body-medium at lg, scales down proportionally\nconst initialTextStyles: Record<AvatarSize, string> = {\n lg: 'text-body font-semibold',\n md: 'text-body-xs font-semibold',\n sm: 'text-body-tiny font-semibold',\n};\n\n// Figma shape radii: circle=full, square: lg/md=8px (rounded-lg), sm=4px (rounded)\nfunction getShapeClass(shape: AvatarShape, size: AvatarSize): string {\n if (shape === 'circle') return 'rounded-full';\n return size === 'sm' ? 'rounded' : 'rounded-lg';\n}\n\nexport function Avatar(props: AvatarProps) {\n const { size = 'lg', shape = 'circle', className } = props;\n\n const base = clsx(\n 'shrink-0 overflow-hidden',\n sizeStyles[size],\n getShapeClass(shape, size),\n className,\n );\n\n if (props.type === 'image') {\n return (\n <div className={base}>\n <img\n src={props.src}\n alt={props.alt ?? ''}\n className=\"size-full object-cover\"\n />\n </div>\n );\n }\n\n return (\n <div\n className={clsx(base, 'flex items-center justify-center')}\n style={{\n background:\n 'linear-gradient(135deg, var(--color-graphic-blue) 30%, var(--color-graphic-red) 100%)',\n }}\n >\n <span\n className={clsx(\n 'select-none leading-none text-brand-on-brand',\n initialTextStyles[size],\n )}\n >\n {props.initial.charAt(0).toUpperCase()}\n </span>\n </div>\n );\n}\n","import { type ReactNode } from 'react';\nimport clsx from 'clsx';\n\nexport interface NavItemProps {\n icon?: ReactNode;\n label: string;\n isActive?: boolean;\n /** Red indicator dot at top-right corner (e.g. unread count) */\n indicator?: boolean;\n /** Collapsed mode — icon only, label hidden */\n collapsed?: boolean;\n className?: string;\n}\n\nexport function NavItem({\n icon,\n label,\n isActive = false,\n indicator = false,\n collapsed = false,\n className,\n}: NavItemProps) {\n return (\n <span\n className={clsx(\n 'relative flex h-11 w-full items-center gap-3 rounded-xl px-3.5 py-2.5 transition-colors',\n collapsed && 'justify-center',\n isActive\n ? 'bg-brand text-brand-on-brand'\n : [\n 'border border-default bg-default text-default-secondary',\n 'hover:bg-brand-tertiary-hover hover:border-brand-tertiary hover:text-brand',\n ],\n className,\n )}\n >\n {icon !== undefined && (\n <span className=\"shrink-0 [&_svg]:size-4\">{icon}</span>\n )}\n {!collapsed && (\n <span className=\"flex-1 min-w-0 truncate text-body-sm font-regular leading-snug\">\n {label}\n </span>\n )}\n {indicator && (\n <span className=\"absolute -right-px -top-px size-2 rounded-full bg-danger\" />\n )}\n </span>\n );\n}\n"],"mappings":"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","names":["clsx","clsx","clsx","jsx","jsx","jsxs","jsx","jsxs","clsx"]}