import type { KeyboardEvent, MouseEventHandler } from 'react'; import { Activity, Clock3, GitBranch, Link2, MessageCircle, Orbit } from 'lucide-react'; import { Badge } from '@/components/ui/badge'; import { cn } from '@/lib/utils'; import type { SocialCard as SocialCardData, AgentStatus } from '../../lib/social-cards'; import { AgentAvatar } from '../shared/agent-avatar'; interface SocialCardProps { data: SocialCardData; className?: string; selected?: boolean; onClick?: MouseEventHandler; onJumpToGraph?: (id: string) => void; onJumpToActivity?: (id: string) => void; onOpenThread?: () => void; description?: string; updatedLabel?: string; dependencyCount?: number; commentCount?: number; unreadCount?: number; blockedByDetails?: Array<{ id: string; title: string; epic?: string }>; unblocksDetails?: Array<{ id: string; title: string; epic?: string }>; } function handleCardKeyDown(event: KeyboardEvent, onClick?: MouseEventHandler) { if (!onClick) return; if (event.key !== 'Enter' && event.key !== ' ') return; event.preventDefault(); onClick(event as unknown as Parameters>[0]); } function statusVisual(status: SocialCardData['status']) { if (status === 'blocked') { return { border: 'var(--accent-danger)', badgeBg: 'var(--status-blocked)', badgeText: '#ffd5df', chipText: 'Blocked', }; } if (status === 'in_progress') { return { border: 'var(--accent-warning)', badgeBg: 'var(--status-in-progress)', badgeText: '#ffe5c7', chipText: 'Active', }; } if (status === 'ready') { return { border: 'var(--accent-success)', badgeBg: 'var(--status-ready)', badgeText: '#d6ffe7', chipText: 'Ready', }; } return { border: 'var(--border-default)', badgeBg: 'var(--status-closed)', badgeText: 'var(--text-tertiary)', chipText: 'Closed', }; } function dependencyPanel( title: string, color: string, details: Array<{ id: string; title: string; epic?: string }>, ) { if (details.length === 0) return null; return (

{title}

{details.slice(0, 1).map((item) => (
{item.id}

{item.title}

{item.epic ? (

↳ {item.epic}

) : null}
))}
{details.length > 1 ?

+{details.length - 1} more

: null}
); } export function SocialCard({ data, className, selected = false, onClick, onJumpToGraph, onJumpToActivity, onOpenThread, description, updatedLabel = 'just now', dependencyCount, commentCount, unreadCount = 0, blockedByDetails = [], unblocksDetails = [], }: SocialCardProps) { const status = statusVisual(data.status); return (
handleCardKeyDown(event, onClick)} role="button" tabIndex={0} aria-label={`Open ${data.title}`} className={cn( 'group relative flex min-h-[290px] cursor-pointer flex-col rounded-[14px] border px-3.5 py-3 text-left transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--accent-info)]', className, )} style={{ background: 'var(--surface-quaternary)', borderColor: selected ? status.border : 'var(--border-default)', boxShadow: selected ? `0 0 0 2px ${status.border}, 0 20px 40px -20px rgba(0,0,0,0.6)` : '0 4px 12px -6px rgba(0,0,0,0.4)', }} >
{status.chipText} {data.priority} {data.id} {unreadCount > 0 ? ( {unreadCount} ) : null}

{data.title}

{description || 'No summary provided yet.'}

{dependencyPanel('Blocked By', 'var(--accent-danger)', blockedByDetails)} {dependencyPanel('Unblocks', 'var(--accent-success)', unblocksDetails)}
{data.agents.slice(0, 3).map((agent) => ( ))} {data.agents.length === 0 ? No crew : null}
stage active
); }