11"use client"
22
3- import { Calendar , ExternalLink , GraduationCap , Mail , MapPin } from "lucide-react"
3+ import { Calendar , ExternalLink , Mail , MapPin } from "lucide-react"
44import { useState } from "react"
55
66import { ImageLightbox } from "@/components/ImageLightbox"
@@ -18,6 +18,8 @@ export default function PeoplePage() {
1818
1919 const pi = currentMembers . find ( p => p . role === "Principal Investigator" )
2020 const phd = currentMembers . filter ( p => p . role === "PhD Student" )
21+ const masters = currentMembers . filter ( p => p . role === "Master Student" )
22+ const visiting = currentMembers . filter ( p => p . role === "Visiting Scholar" )
2123 const staff = currentMembers . filter ( p => p . role === "Research Staff" || p . role === "Software Engineer" )
2224 const admin = currentMembers . filter ( p => p . role === "Lab Administration" )
2325
@@ -178,6 +180,140 @@ export default function PeoplePage() {
178180 </ div >
179181 </ section >
180182
183+ { /* Master Students */ }
184+ { masters . length > 0 && (
185+ < section className = "py-16 lg:py-24" >
186+ < div className = "section-container" >
187+ < h2 className = "mb-8 text-2xl font-bold" > Master Students</ h2 >
188+ < div className = "grid gap-6 sm:grid-cols-2 lg:grid-cols-3" >
189+ { masters . map ( ( person ) => (
190+ < Card key = { person . id } className = "group transition-all hover:shadow-soft-lg" >
191+ < CardHeader >
192+ < div className = "mb-3 flex items-start gap-4" >
193+ { person . avatar && (
194+ < div className = "relative size-28 shrink-0 overflow-hidden rounded-xl ring-2 ring-border" >
195+ < img
196+ src = { person . avatar }
197+ alt = { person . name }
198+ className = "size-full object-cover"
199+ />
200+ </ div >
201+ ) }
202+ < div className = "min-w-0 flex-1" >
203+ < CardTitle className = "text-lg leading-tight" > { person . name } </ CardTitle >
204+ < p className = "mt-1 text-sm text-muted-foreground" > { person . role } </ p >
205+ </ div >
206+ </ div >
207+ { person . project && (
208+ < CardDescription className = "mt-2" > { person . project } </ CardDescription >
209+ ) }
210+ { person . cosupervised && (
211+ < p className = "mt-2 text-sm text-muted-foreground" >
212+ Co-supervised with { person . cosupervised }
213+ </ p >
214+ ) }
215+ </ CardHeader >
216+ < CardContent >
217+ { person . links && (
218+ < div className = "mb-3 flex flex-wrap gap-3" >
219+ { Object . entries ( person . links ) . map ( ( [ key , url ] ) => {
220+ const displayName = key === 'website' ? 'Website' : key . charAt ( 0 ) . toUpperCase ( ) + key . slice ( 1 )
221+ return (
222+ < a
223+ key = { key }
224+ href = { url as string }
225+ target = "_blank"
226+ rel = "noopener noreferrer"
227+ className = "inline-flex items-center gap-1 text-xs text-primary hover:underline"
228+ >
229+ < ExternalLink className = "size-3" />
230+ { displayName }
231+ </ a >
232+ )
233+ } ) }
234+ </ div >
235+ ) }
236+ { person . tags && person . tags . length > 0 && (
237+ < div className = "flex flex-wrap gap-2" >
238+ { person . tags . map ( ( tag ) => (
239+ < Badge key = { tag } variant = "secondary" className = "text-xs" > { tag } </ Badge >
240+ ) ) }
241+ </ div >
242+ ) }
243+ </ CardContent >
244+ </ Card >
245+ ) ) }
246+ </ div >
247+ </ div >
248+ </ section >
249+ ) }
250+
251+ { /* Visiting Scholars */ }
252+ { visiting . length > 0 && (
253+ < section className = "bg-muted/30 py-16 lg:py-24" >
254+ < div className = "section-container" >
255+ < h2 className = "mb-8 text-2xl font-bold" > Visiting Scholars</ h2 >
256+ < div className = "grid gap-6 sm:grid-cols-2 lg:grid-cols-3" >
257+ { visiting . map ( ( person ) => (
258+ < Card key = { person . id } className = "group transition-all hover:shadow-soft-lg" >
259+ < CardHeader >
260+ < div className = "mb-3 flex items-start gap-4" >
261+ { person . avatar && (
262+ < div className = "relative size-28 shrink-0 overflow-hidden rounded-xl ring-2 ring-border" >
263+ < img
264+ src = { person . avatar }
265+ alt = { person . name }
266+ className = "size-full object-cover"
267+ />
268+ </ div >
269+ ) }
270+ < div className = "min-w-0 flex-1" >
271+ < CardTitle className = "text-lg leading-tight" > { person . name } </ CardTitle >
272+ < p className = "mt-1 text-sm text-muted-foreground" > { person . role } </ p >
273+ </ div >
274+ </ div >
275+ { person . project && (
276+ < CardDescription className = "mt-2" > { person . project } </ CardDescription >
277+ ) }
278+ { person . note && (
279+ < p className = "mt-2 text-sm italic text-muted-foreground" > { person . note } </ p >
280+ ) }
281+ </ CardHeader >
282+ < CardContent >
283+ { person . links && (
284+ < div className = "mb-3 flex flex-wrap gap-3" >
285+ { Object . entries ( person . links ) . map ( ( [ key , url ] ) => {
286+ const displayName = key === 'website' ? 'Website' : key . charAt ( 0 ) . toUpperCase ( ) + key . slice ( 1 )
287+ return (
288+ < a
289+ key = { key }
290+ href = { url as string }
291+ target = "_blank"
292+ rel = "noopener noreferrer"
293+ className = "inline-flex items-center gap-1 text-xs text-primary hover:underline"
294+ >
295+ < ExternalLink className = "size-3" />
296+ { displayName }
297+ </ a >
298+ )
299+ } ) }
300+ </ div >
301+ ) }
302+ { person . tags && person . tags . length > 0 && (
303+ < div className = "flex flex-wrap gap-2" >
304+ { person . tags . map ( ( tag ) => (
305+ < Badge key = { tag } variant = "secondary" className = "text-xs" > { tag } </ Badge >
306+ ) ) }
307+ </ div >
308+ ) }
309+ </ CardContent >
310+ </ Card >
311+ ) ) }
312+ </ div >
313+ </ div >
314+ </ section >
315+ ) }
316+
181317 { /* Research Staff */ }
182318 { staff . length > 0 && (
183319 < section className = "py-16 lg:py-24" >
@@ -309,7 +445,6 @@ export default function PeoplePage() {
309445 < section className = "bg-muted/30 py-16 lg:py-24" >
310446 < div className = "section-container" >
311447 < div className = "mb-8 flex items-center gap-3" >
312- < GraduationCap className = "size-8 text-primary" />
313448 < h2 className = "text-2xl font-bold" > Lab Alumni</ h2 >
314449 </ div >
315450 < div className = "grid gap-6 sm:grid-cols-2 lg:grid-cols-3" >
0 commit comments