import type { ReactNode, MouseEventHandler } from 'react'; import { cn } from '../../lib/utils'; import type { SocialCard as SocialCardData, AgentStatus } from '../../lib/social-cards'; import { AgentAvatar } from '../shared/agent-avatar'; import { BaseCard } from '../shared/base-card'; interface SocialCardProps { data: SocialCardData; className?: string; selected?: boolean; onClick?: MouseEventHandler; onJumpToGraph?: (id: string) => void; onJumpToKanban?: (id: string) => void; } function DependencyPill({ id, type }: { id: string; type: 'blocked-by' | 'blocking' }) { // Soft, friendly pills. Rose for "blocked by", Amber for "blocking". const styles = type === 'blocked-by' ? 'bg-rose-500/10 text-rose-200 hover:bg-rose-500/20' : 'bg-amber-500/10 text-amber-200 hover:bg-amber-500/20'; return ( {type === 'blocked-by' ? 'Waiting on ' : 'Blocks '} {id} ); } function ActionButton({ icon, label, onClick, }: { icon: ReactNode; label: string; onClick?: () => void; }) { return ( ); } function GraphIcon() { return ( ); } function KanbanIcon() { return ( ); } function StatusBadge({ status }: { status: string }) { const styles = { ready: 'bg-teal-500/10 text-teal-300 border-teal-500/20', in_progress: 'bg-emerald-500/10 text-emerald-300 border-emerald-500/20', blocked: 'bg-amber-500/10 text-amber-300 border-amber-500/20', closed: 'bg-slate-500/10 text-slate-400 border-slate-500/20', }[status as keyof typeof styles] || 'bg-slate-500/10 text-slate-400 border-slate-500/20'; return ( {status.replace('_', ' ')} ); } export function SocialCard({ data, className, selected = false, onClick, onJumpToGraph, onJumpToKanban, }: SocialCardProps) { const hasBlocks = data.blocks.length > 0; const hasUnblocks = data.unblocks.length > 0; return ( {/* Header: ID & Status */}
{data.id}
{/* Hero: Title */}

{data.title}

{/* Content: Dependencies (Pill Cloud) */} {(hasBlocks || hasUnblocks) && (
{/* Unblocks = Blocked By me? No. data.unblocks = tasks blocking THIS task (upstream) -> "Waiting on" data.blocks = tasks THIS task blocks (downstream) -> "Blocks" */} {data.unblocks.slice(0, 3).map((id) => ( ))} {data.blocks.slice(0, 3).map((id) => ( ))} {(data.unblocks.length + data.blocks.length > 6) && ( +{data.unblocks.length + data.blocks.length - 6} more )}
)} {/* Footer: Agents & Actions */}
{/* Crew */}
{data.agents.map((agent) => (
))} {data.agents.length === 0 && ( Unassigned )}
{/* Actions (Share/View) */}
} label="View Graph" onClick={() => onJumpToGraph?.(data.id)} /> } label="View Kanban" onClick={() => onJumpToKanban?.(data.id)} />
); }