)}
diff --git a/src/features/members/profile-schema.ts b/src/features/members/profile-schema.ts
index ab3e86d..58577d5 100644
--- a/src/features/members/profile-schema.ts
+++ b/src/features/members/profile-schema.ts
@@ -1,6 +1,6 @@
import { z } from "zod";
-import { EXPERIENCE_LEVELS } from "./types";
+import { EXPERIENCE_LEVELS, MEMBER_ROLES } from "./types";
/** An optional URL field: accepts a valid URL, or an empty string normalized to `undefined`. */
const optionalUrl = z
@@ -22,7 +22,9 @@ export const profileSchema = z.object({
.trim()
.min(1, "Display name is required.")
.max(100, "Display name must be 100 characters or fewer."),
- title: z.string().trim().min(1, "Title is required.").max(100, "Title must be 100 characters or fewer."),
+ title: z.string().refine((value) => (MEMBER_ROLES as readonly string[]).includes(value), {
+ message: "Choose a role.",
+ }),
bio: z
.string()
.trim()
diff --git a/src/features/members/spotlight-carousel.tsx b/src/features/members/spotlight-carousel.tsx
index 2b3b6cf..a8e9c85 100644
--- a/src/features/members/spotlight-carousel.tsx
+++ b/src/features/members/spotlight-carousel.tsx
@@ -32,7 +32,7 @@ export const SpotlightCarousel = () => {
return (
{members.map((member) => (
-
+
))}
diff --git a/src/features/members/spotlight-section.tsx b/src/features/members/spotlight-section.tsx
index 4b71f1a..7a49d31 100644
--- a/src/features/members/spotlight-section.tsx
+++ b/src/features/members/spotlight-section.tsx
@@ -2,21 +2,31 @@
import { SpotlightCarousel } from "./spotlight-carousel";
+import { Reveal } from "@/features/home";
+
/**
- * Self-contained "Member Spotlight" section for the home page: heading plus the
- * spotlight carousel. Mount directly inside a `` wrapper.
+ * Self-contained "Member Spotlight" section for the home page: eyebrow label,
+ * editorial heading, and the spotlight carousel — matching the other home
+ * sections. Mount directly inside a `` wrapper.
*
* @returns The spotlight section.
* @example
- *
- *
);
diff --git a/src/features/members/types.ts b/src/features/members/types.ts
index f6117fc..8342c01 100644
--- a/src/features/members/types.ts
+++ b/src/features/members/types.ts
@@ -4,6 +4,23 @@ export const EXPERIENCE_LEVELS = ["Junior", "Mid", "Senior", "Lead"] as const;
/** Union of valid `MemberProfile.experience` values. */
export type ExperienceLevel = (typeof EXPERIENCE_LEVELS)[number];
+/** Roles a member can pick for their profile; stored as `title` on the backend. */
+export const MEMBER_ROLES = [
+ "Frontend Developer",
+ "Backend Developer",
+ "Fullstack Developer",
+ "Mobile Developer",
+ "DevOps Engineer",
+ "Data Engineer",
+ "Machine Learning Engineer",
+ "UI/UX Designer",
+ "QA Engineer",
+ "Product Manager",
+] as const;
+
+/** Union of valid member role values. */
+export type MemberRole = (typeof MEMBER_ROLES)[number];
+
/** A member's public profile, as returned by every `/members/*` endpoint. */
export type MemberProfile = {
id: string;