diff --git a/client/components/TeamWidget.tsx b/client/components/TeamWidget.tsx new file mode 100644 index 00000000..55979832 --- /dev/null +++ b/client/components/TeamWidget.tsx @@ -0,0 +1,174 @@ +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Users, MessageCircle, ExternalLink } from "lucide-react"; + +export interface TeamMember { + id: string; + name: string; + role: string; + title?: string; + avatar_url?: string; + status?: "online" | "offline" | "away"; + bio?: string; + links?: Array<{ title: string; url: string }>; +} + +interface TeamWidgetProps { + members: TeamMember[]; + title?: string; + description?: string; + type?: "sprint" | "org" | "company"; + onViewProfile?: (memberId: string) => void; + onMessage?: (memberId: string) => void; + accentColor?: "green" | "blue" | "purple" | "cyan"; +} + +const colorMap = { + green: { + bg: "bg-gradient-to-br from-green-950/40 to-green-900/20", + border: "border-green-500/20", + }, + blue: { + bg: "bg-gradient-to-br from-blue-950/40 to-blue-900/20", + border: "border-blue-500/20", + }, + purple: { + bg: "bg-gradient-to-br from-purple-950/40 to-purple-900/20", + border: "border-purple-500/20", + }, + cyan: { + bg: "bg-gradient-to-br from-cyan-950/40 to-cyan-900/20", + border: "border-cyan-500/20", + }, +}; + +const statusColors = { + online: "bg-green-500", + offline: "bg-gray-500", + away: "bg-yellow-500", +}; + +export function TeamWidget({ + members, + title = "Team Members", + description = "Sprint team and collaborators", + type = "sprint", + onViewProfile, + onMessage, + accentColor = "green", +}: TeamWidgetProps) { + const colors = colorMap[accentColor]; + + return ( + + + + + {title} + + {description} + + + {members.length === 0 ? ( +
+ +

No team members

+
+ ) : ( +
+ {members.map((member) => ( +
+ {/* Member Header */} +
+
+ {member.avatar_url ? ( + {member.name} + ) : ( +
+ + {member.name.charAt(0).toUpperCase()} + +
+ )} + {member.status && ( +
+ )} +
+ +
+

{member.name}

+

{member.role}

+ {member.title && ( +

{member.title}

+ )} +
+
+ + {/* Bio */} + {member.bio && ( +

{member.bio}

+ )} + + {/* Links */} + {member.links && member.links.length > 0 && ( +
+ {member.links.map((link) => ( + + {link.title} + + + ))} +
+ )} + + {/* Actions */} +
+ {onViewProfile && ( + + )} + {onMessage && ( + + )} +
+
+ ))} +
+ )} + + + ); +} + +export default TeamWidget;