Skip to content

Commit a6ea53a

Browse files
add: Arash; add: master student / visiting scholar sections; fix: gs link (#13)
* add: Arash; add: master student / visiting scholar sections; fix: gscholar link * people: add Arash --------- Co-authored-by: arashsm79 <[email protected]>
1 parent 2973aa1 commit a6ea53a

File tree

3 files changed

+152
-3
lines changed

3 files changed

+152
-3
lines changed

app/people/page.tsx

Lines changed: 137 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use client"
22

3-
import { Calendar, ExternalLink, GraduationCap, Mail, MapPin } from "lucide-react"
3+
import { Calendar, ExternalLink, Mail, MapPin } from "lucide-react"
44
import { useState } from "react"
55

66
import { 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">

data/people.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"bio": "Alexander Mathis is an Assistant Professor at EPFL. He holds a Diplom in Mathematics and a PhD from Ludwig-Maximilians-University Munich (with Prof. Andreas Herz). He was a postdoc with Prof. Venkatesh N. Murthy at Harvard University and Prof. Matthias Bethge at Tuebingen AI.",
99
"email": "[email protected]",
1010
"links": {
11-
"scholar": "https://scholar.google.com",
11+
"scholar": "https://scholar.google.com/citations?user=Y1xCzE0AAAAJ&hl=en",
1212
"github": "https://github.com/AlexEMG",
1313
"website": "https://people.epfl.ch/alexander.mathis"
1414
},
@@ -128,6 +128,20 @@
128128
"tags": ["behavior analysis"],
129129
"status": "current"
130130
},
131+
{
132+
"id": "arash",
133+
"name": "Arash Sal Moslehian",
134+
"role": "Master Student",
135+
"avatar": "/images/people/arash-sal-moslehian.jpg",
136+
"project": "Sensorimotor control and behavior analysis",
137+
"links": {
138+
"website": "https://moslehian.com",
139+
"scholar": "https://scholar.google.com/citations?user=2eOS1yEAAAAJ",
140+
"github": "https://github.com/arashsm79"
141+
},
142+
"tags": ["sensorimotor control", "behavior analysis", "DeepLabCut"],
143+
"status": "current"
144+
},
131145
{
132146
"id": "pauline-stehli",
133147
"name": "Pauline Stehli",
25.8 KB
Loading

0 commit comments

Comments
 (0)