diff --git a/app/team/page.tsx b/app/team/page.tsx
index 749c927a..b1b5dff5 100644
--- a/app/team/page.tsx
+++ b/app/team/page.tsx
@@ -42,13 +42,28 @@ export default function TeamPage() {
{category.members.map((member) => (
- {/* eslint-disable-next-line @next/next/no-img-element */}
-

+ {member.imageSrc ? (
+ /* eslint-disable-next-line @next/next/no-img-element */
+

+ ) : (
+
+ {member.name
+ .split(' ')
+ .map((part) => part[0])
+ .filter(Boolean)
+ .slice(0, 2)
+ .join('')
+ .toUpperCase()}
+
+ )}
{member.url ? (
diff --git a/app/team/team.module.css b/app/team/team.module.css
index de7057f6..5754556d 100644
--- a/app/team/team.module.css
+++ b/app/team/team.module.css
@@ -21,6 +21,21 @@
object-fit: cover;
}
+.avatarPlaceholder {
+ flex-shrink: 0;
+ width: 160px;
+ height: 160px;
+ border-radius: 4px;
+ background: #e6e8eb;
+ color: #4a5563;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 48px;
+ font-weight: 500;
+ letter-spacing: 1px;
+}
+
.teamMember h4 {
margin: 0 0 2px 0;
}
diff --git a/lib/data/team.ts b/lib/data/team.ts
index d5864c07..28012c6e 100644
--- a/lib/data/team.ts
+++ b/lib/data/team.ts
@@ -24,8 +24,8 @@ export interface TeamMember {
affiliation: string;
/** Institution website URL */
affiliationUrl?: string;
- /** Path to team member image (relative to /public) */
- imageSrc: string;
+ /** Path to team member image (relative to /public). Optional — page renders an initials placeholder when absent. */
+ imageSrc?: string;
/** Image width in pixels (for consistent layout) */
imageWidth?: number;
/** Image height in pixels (for consistent layout) */
@@ -204,6 +204,18 @@ export const TEAM_DATA: TeamCategory[] = [
},
],
},
+ {
+ title: 'Research Associates',
+ level: 'h3',
+ members: [
+ {
+ name: 'Vibhav Setlur',
+ url: 'https://github.com/VibhavSetlur',
+ role: 'Research Associate',
+ affiliation: 'Argonne National Laboratory',
+ },
+ ],
+ },
{
title: 'Developers',
level: 'h3',
diff --git a/tests/unit/api/biochem.test.ts b/tests/unit/api/biochem.test.ts
index 6b6e14d2..b32b0f12 100644
--- a/tests/unit/api/biochem.test.ts
+++ b/tests/unit/api/biochem.test.ts
@@ -15,8 +15,17 @@ describe('Biochem API Integration Tests', () => {
beforeAll(async () => {
biochemApi = await loadBiochemApi();
+ // Race the live probe against an internal timeout so the catch path runs
+ // (marking isApiAvailable = false) before the vitest hookTimeout aborts the
+ // hook itself. Otherwise CI fails on slow networks even though the suite is
+ // designed to skip gracefully when the API is unreachable.
try {
- const res = await biochemApi.getReactions({ limit: 1 });
+ const res = await Promise.race([
+ biochemApi.getReactions({ limit: 1 }),
+ new Promise((_, reject) =>
+ setTimeout(() => reject(new Error('Biochem API probe timed out after 7s')), 7000),
+ ),
+ ]);
expect(res.docs).toBeDefined();
} catch (e: unknown) {
console.warn('Biochem API is unavailable, skipping tests:', getErrorMessage(e));