From 9eaf7d49d039c2b9b704e89d3e512fea10bfc152 Mon Sep 17 00:00:00 2001
From: Brennen Ho <76419189+brennenho@users.noreply.github.com>
Date: Fri, 16 Oct 2026 15:31:42 -0700
Subject: [PATCH 1/2] feat(frontend): show year and role on flashcards
---
src/features/flashcards/flashcards.tsx | 11 ++-
src/features/flashcards/members.ts | 102 +++++++++++++++++++++++++
tests/members.test.ts | 2 +
3 files changed, 112 insertions(+), 3 deletions(-)
diff --git a/src/features/flashcards/flashcards.tsx b/src/features/flashcards/flashcards.tsx
index c5e02c8..581d79a 100644
--- a/src/features/flashcards/flashcards.tsx
+++ b/src/features/flashcards/flashcards.tsx
@@ -81,6 +81,8 @@ export function Flashcards({ members }: { members: readonly Member[] }) {
const photo = member.photo === failedPhoto ? null : member.photo;
const photoLabel = photo ? "Member photo" : "Member photo placeholder";
+ const memberDetails = [member.year, member.role];
+ const memberLabel = [member.name, ...memberDetails].join(". ");
const nextPhoto = members[currentIndex + 1]?.photo;
if (nextPhoto) {
@@ -95,7 +97,7 @@ export function Flashcards({ members }: { members: readonly Member[] }) {
size="custom"
onClick={flip}
aria-label={
- showName ? `${member.name}. Show photo` : `${photoLabel}. Show name`
+ showName ? `${memberLabel}. Show photo` : `${photoLabel}. Show name`
}
aria-keyshortcuts="ArrowUp ArrowDown Space Enter"
className={cn(styles.card, "group block w-full rounded-2xl text-left")}
@@ -141,12 +143,15 @@ export function Flashcards({ members }: { members: readonly Member[] }) {
className={cn(
styles.face,
styles.back,
- "bg-primary text-primary-foreground flex items-center justify-center rounded-2xl border border-transparent p-8 text-center shadow-sm",
+ "bg-primary text-primary-foreground flex flex-col items-center justify-center gap-3 rounded-2xl border border-transparent p-8 text-center shadow-sm",
)}
>
{member.name}
+
+ {memberDetails.join(" ยท ")}
+
@@ -220,7 +225,7 @@ export function Flashcards({ members }: { members: readonly Member[] }) {
- {`Card ${currentIndex + 1} of ${members.length}. ${showName ? member.name : photoLabel}`}
+ {`Card ${currentIndex + 1} of ${members.length}. ${showName ? memberLabel : photoLabel}`}
);
diff --git a/src/features/flashcards/members.ts b/src/features/flashcards/members.ts
index c4ac0c0..2722cce 100644
--- a/src/features/flashcards/members.ts
+++ b/src/features/flashcards/members.ts
@@ -3,6 +3,8 @@ import "server-only";
export type Member = {
id: string;
name: string;
+ year: string;
+ role: string;
photo: string | null;
};
@@ -10,251 +12,351 @@ export const members: readonly Member[] = [
{
id: "halas-graden",
name: "Halas Graden",
+ year: "Sophomore",
+ role: "Developer",
photo: "/members/halas-graden.webp",
},
{
id: "shin-masada",
name: "Shin Masada",
+ year: "Freshman",
+ role: "Developer",
photo: "/members/shin-masada.webp",
},
{
id: "ruina-liu",
name: "Ruina Liu",
+ year: "Sophomore",
+ role: "Developer",
photo: "/members/ruina-liu.webp",
},
{
id: "kyle-yuen",
name: "Kyle Yuen",
+ year: "Sophomore",
+ role: "Developer",
photo: "/members/kyle-yuen.webp",
},
{
id: "Christopher-Tutor",
name: "Christopher Tutor",
+ year: "Sophomore",
+ role: "Developer",
photo: "/members/christopher-tutor.webp",
},
{
id: "joshua-zhang",
name: "Joshua Zhang",
+ year: "Sophomore",
+ role: "Developer",
photo: "/members/joshua-zhang.webp",
},
{
id: "6506829008",
name: "Siddharth Yelisetty",
+ year: "Freshman",
+ role: "Developer",
photo: "/members/siddharth-yelisetty.webp",
},
{
id: "rachel-he",
name: "Rachel He",
+ year: "Freshman",
+ role: "Developer",
photo: "/members/rachel-he.webp",
},
{
id: "connor-mao",
name: "Connor Mao",
+ year: "Sophomore",
+ role: "Developer",
photo: "/members/connor-mao.webp",
},
{
id: "gautham-gopinath",
name: "Gautham Gopinath",
+ year: "Sophomore",
+ role: "Developer",
photo: "/members/gautham-gopinath.webp",
},
{
id: "brennen-ho",
name: "Brennen Ho",
+ year: "Senior",
+ role: "President",
photo: "/members/brennen-ho.webp",
},
{
id: "rohan-george",
name: "Rohan George",
+ year: "Sophomore",
+ role: "Developer",
photo: "/members/rohan-george.webp",
},
{
id: "dale-dai",
name: "Dale Dai",
+ year: "Freshman",
+ role: "Developer",
photo: "/members/dale-dai.webp",
},
{
id: "darren-shen",
name: "Darren Shen",
+ year: "Junior",
+ role: "Developer",
photo: "/members/darren-shen.webp",
},
{
id: "marcus-cao",
name: "Marcus Cao",
+ year: "Sophomore",
+ role: "Developer",
photo: "/members/marcus-cao.webp",
},
{
id: "micah-muir",
name: "Micah Muir",
+ year: "Sophomore",
+ role: "Developer",
photo: "/members/micah-muir.webp",
},
{
id: "jeremy-sedillo",
name: "Jeremy Sedillo",
+ year: "Senior",
+ role: "VP of Development",
photo: "/members/jeremy-sedillo.webp",
},
{
id: "shubha-vajragiri",
name: "Shubha Vajragiri",
+ year: "Junior",
+ role: "Dev Mentor",
photo: "/members/shubha-vajragiri.webp",
},
{
id: "emily-teo",
name: "Emily Teo",
+ year: "Junior",
+ role: "Dev Mentor",
photo: "/members/emily-teo.webp",
},
{
id: "yirui-song",
name: "Yirui Song",
+ year: "Senior",
+ role: "Project Manager",
photo: "/members/yirui-song.webp",
},
{
id: "gavin-huang",
name: "Gavin Huang",
+ year: "Sophomore",
+ role: "Technical Lead",
photo: "/members/gavin-huang.webp",
},
{
id: "akhil-pullela",
name: "Akhil Pullela",
+ year: "Junior",
+ role: "Developer",
photo: "/members/akhil-pullela.webp",
},
{
id: "angela-zhuang",
name: "Angela Zhuang",
+ year: "Junior",
+ role: "VP of Finance",
photo: "/members/angela-zhuang.webp",
},
{
id: "naysa-bhargava",
name: "Naysa Bhargava",
+ year: "Senior",
+ role: "VP of DEI",
photo: "/members/naysa-bhargava.webp",
},
{
id: "daisy-fregoso",
name: "Daisy Fregoso",
+ year: "Junior",
+ role: "Dev Mentor",
photo: "/members/daisy-fregoso.webp",
},
{
id: "avni-hulyalkar",
name: "Avni Hulyalkar",
+ year: "Senior",
+ role: "President",
photo: "/members/avni-hulyalkar.webp",
},
{
id: "brian-shi",
name: "Brian Shi",
+ year: "Junior",
+ role: "Developer",
photo: "/members/brian-shi.webp",
},
{
id: "julia-mao",
name: "Julia Mao",
+ year: "Junior",
+ role: "Project Manager",
photo: "/members/julia-mao.webp",
},
{
id: "natasha-thombre",
name: "Natasha Thombre",
+ year: "Sophomore",
+ role: "Dev Mentor",
photo: "/members/natasha-thombre.webp",
},
{
id: "michelle-zhu",
name: "Michelle Zhu",
+ year: "Sophomore",
+ role: "Technical Lead",
photo: "/members/michelle-zhu.webp",
},
{
id: "sophie-shim",
name: "Sophie Shim",
+ year: "Junior",
+ role: "Technical Lead",
photo: "/members/sophie-shim.webp",
},
{
id: "trent-kobielusz",
name: "Trent Kobielusz",
+ year: "Junior",
+ role: "Dev Mentor",
photo: "/members/trent-kobielusz.webp",
},
{
id: "aaron-lee",
name: "Aaron Lee",
+ year: "Junior",
+ role: "Design Mentor",
photo: "/members/aaron-lee.webp",
},
{
id: "jamie-hsu",
name: "Jamie Hsu",
+ year: "Senior",
+ role: "Project Manager",
photo: "/members/jamie-hsu.webp",
},
{
id: "joshua-placido",
name: "Joshua Placido",
+ year: "Senior",
+ role: "Design Mentor",
photo: "/members/joshua-placido.webp",
},
{
id: "serena-li",
name: "Serena Li",
+ year: "Senior",
+ role: "Dev Mentor",
photo: "/members/serena-li.webp",
},
{
id: "charlotte-qin",
name: "Charlotte Qin",
+ year: "Junior",
+ role: "VP of Internal Affairs",
photo: "/members/charlotte-qin.webp",
},
{
id: "mark-mcguire",
name: "Mark McGuire",
+ year: "Senior",
+ role: "VP of Product",
photo: "/members/mark-mcguire.webp",
},
{
id: "andrew-choi",
name: "Andrew Choi",
+ year: "Senior",
+ role: "VP of External Affairs",
photo: "/members/andrew-choi.webp",
},
{
id: "christine-lai",
name: "Christine Lai",
+ year: "Senior",
+ role: "Design Mentor",
photo: "/members/christine-lai.webp",
},
{
id: "lian-song",
name: "LiAn Song",
+ year: "Senior",
+ role: "VP of Design",
photo: "/members/lian-song.webp",
},
{
id: "grace-li",
name: "Grace Li",
+ year: "Senior",
+ role: "Dev Mentor",
photo: "/members/grace-li.webp",
},
{
id: "jason-wiemels",
name: "Jason Wiemels",
+ year: "Senior",
+ role: "VP of Product (S27)",
photo: "/members/jason-wiemels.webp",
},
{
id: "josh-kim",
name: "Josh Kim",
+ year: "Sophomore",
+ role: "VP of Internal Affairs (S27)",
photo: "/members/josh-kim.webp",
},
{
id: "christine-wu",
name: "Christine Wu",
+ year: "Sophomore",
+ role: "Designer",
photo: "/members/christine-wu.webp",
},
{
id: "vani-sharma",
name: "Vani Sharma",
+ year: "Sophomore",
+ role: "Designer",
photo: "/members/vani-sharma.webp",
},
{
id: "cici-fang",
name: "Cici Fang",
+ year: "Junior",
+ role: "Designer",
photo: "/members/cici-fang.webp",
},
{
id: "dhrithi-vishwa",
name: "Dhrithi Vishwa",
+ year: "Sophomore",
+ role: "Designer",
photo: "/members/dhrithi-vishwa.webp",
},
{
id: "janice-yoon",
name: "Janice Yoon",
+ year: "Junior",
+ role: "Designer",
photo: "/members/janice-yoon.webp",
},
{
id: "emma-li",
name: "Emma Li",
+ year: "Freshman",
+ role: "Designer",
photo: "/members/emma-li.webp",
},
];
diff --git a/tests/members.test.ts b/tests/members.test.ts
index 5c5425c..f91fd7f 100644
--- a/tests/members.test.ts
+++ b/tests/members.test.ts
@@ -11,6 +11,8 @@ it("uses unique member IDs", () => {
it.each(members)("has valid details and a local photo for $id", (member) => {
expect(member.id.trim()).not.toBe("");
expect(member.name.trim()).not.toBe("");
+ expect(member.year.trim()).not.toBe("");
+ expect(member.role.trim()).not.toBe("");
if (member.photo === null) return;
From a7ef6d1837d499ba6b518bdd2d83b2604b2823e8 Mon Sep 17 00:00:00 2001
From: Brennen Ho <76419189+brennenho@users.noreply.github.com>
Date: Fri, 16 Oct 2026 15:36:20 -0700
Subject: [PATCH 2/2] fix(frontend): correct Jason Wiemels's role
---
src/features/flashcards/members.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/features/flashcards/members.ts b/src/features/flashcards/members.ts
index 2722cce..cee61fe 100644
--- a/src/features/flashcards/members.ts
+++ b/src/features/flashcards/members.ts
@@ -307,7 +307,7 @@ export const members: readonly Member[] = [
id: "jason-wiemels",
name: "Jason Wiemels",
year: "Senior",
- role: "VP of Product (S27)",
+ role: "Developer",
photo: "/members/jason-wiemels.webp",
},
{