diff --git a/client/components/showcase/ShowcaseCard.tsx b/client/components/showcase/ShowcaseCard.tsx new file mode 100644 index 00000000..a0d47ccb --- /dev/null +++ b/client/components/showcase/ShowcaseCard.tsx @@ -0,0 +1,72 @@ +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import type { ShowcaseProject } from "@/data/showcase"; + +function initials(name: string) { + const parts = name.trim().split(/\s+/); + const [a, b] = [parts[0] || "", parts[1] || ""]; + return (a[0] || "").concat(b[0] || "").toUpperCase() || "A"; +} + +export default function ShowcaseCard({ p }: { p: ShowcaseProject }) { + return ( + + {p.image && ( +
+ {p.title} +
+ )} + +
+
+ {p.orgUnit && ( + {p.orgUnit} + )} + {p.timeframe && ( + {p.timeframe} + )} +
+
+ {p.title} + {p.description} +
+ + {p.tags && p.tags.length > 0 && ( +
+ {p.tags.map((t) => ( + {t} + ))} +
+ )} + + {p.contributors && p.contributors.length > 0 && ( +
+
+ {p.contributors.slice(0, 5).map((c) => ( + + + {initials(c.name)} + + ))} +
+
+ {p.role || "AeThex"} +
+
+ )} + + {p.links && p.links.length > 0 && ( +
+ {p.links.map((l) => ( + + ))} +
+ )} +
+
+ ); +}