diff --git a/package.json b/package.json
index 0358b0f..ad69281 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,7 @@
},
"dependencies": {
"@base-ui/react": "^1.5.0",
+ "@hookform/resolvers": "^5.4.0",
"@posthog/react": "^1.10.3",
"@react-spring/three": "^10.1.2",
"@react-three/drei": "^10.7.7",
@@ -34,6 +35,7 @@
"radix-ui": "^1.4.3",
"react": "19.2.4",
"react-dom": "19.2.4",
+ "react-hook-form": "^7.81.0",
"shadcn": "^4.8.0",
"sonner": "^2.0.7",
"tailwind-merge": "^3.6.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index dd5e8ad..6a6a4d5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -11,6 +11,9 @@ importers:
'@base-ui/react':
specifier: ^1.5.0
version: 1.6.0(@types/react@19.2.17)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ '@hookform/resolvers':
+ specifier: ^5.4.0
+ version: 5.4.0(react-hook-form@7.81.0(react@19.2.4))
'@posthog/react':
specifier: ^1.10.3
version: 1.10.3(@types/react@19.2.17)(posthog-js@1.399.2)(react@19.2.4)
@@ -68,6 +71,9 @@ importers:
react-dom:
specifier: 19.2.4
version: 19.2.4(react@19.2.4)
+ react-hook-form:
+ specifier: ^7.81.0
+ version: 7.81.0(react@19.2.4)
shadcn:
specifier: ^4.8.0
version: 4.13.0(typescript@5.9.3)
@@ -371,6 +377,11 @@ packages:
peerDependencies:
hono: ^4
+ '@hookform/resolvers@5.4.0':
+ resolution: {integrity: sha512-EIsqr/t/qbinPIhGjMdtvutIN1Kk4uwbROE9/UQ93CAVGR7GkA7Y92+fX80OzXi/OB67jVFYwKGO1WzkxmkFZw==}
+ peerDependencies:
+ react-hook-form: ^7.55.0
+
'@humanfs/core@0.19.2':
resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==}
engines: {node: '>=18.18.0'}
@@ -1418,6 +1429,9 @@ packages:
resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
engines: {node: '>=18'}
+ '@standard-schema/utils@0.3.0':
+ resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==}
+
'@swc/helpers@0.5.15':
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
@@ -3571,6 +3585,12 @@ packages:
peerDependencies:
react: ^19.2.4
+ react-hook-form@7.81.0:
+ resolution: {integrity: sha512-ocbmr2p5KBMoAfj4WCUvped33lVi1Kd5DuDUvQDnB6VEAacOjPI/jMbtDdbhco4y9ct4xUuCmMY0b/C9L0QHjw==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ react: ^16.8.0 || ^17 || ^18 || ^19
+
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
@@ -4509,6 +4529,11 @@ snapshots:
dependencies:
hono: 4.12.29
+ '@hookform/resolvers@5.4.0(react-hook-form@7.81.0(react@19.2.4))':
+ dependencies:
+ '@standard-schema/utils': 0.3.0
+ react-hook-form: 7.81.0(react@19.2.4)
+
'@humanfs/core@0.19.2':
dependencies:
'@humanfs/types': 0.15.0
@@ -5572,6 +5597,8 @@ snapshots:
'@sindresorhus/merge-streams@4.0.0': {}
+ '@standard-schema/utils@0.3.0': {}
+
'@swc/helpers@0.5.15':
dependencies:
tslib: 2.8.1
@@ -7788,6 +7815,10 @@ snapshots:
react: 19.2.4
scheduler: 0.27.0
+ react-hook-form@7.81.0(react@19.2.4):
+ dependencies:
+ react: 19.2.4
+
react-is@16.13.1: {}
react-remove-scroll-bar@2.3.8(@types/react@19.2.17)(react@19.2.4):
diff --git a/src/app/(auth)/layout.tsx b/src/app/(auth)/layout.tsx
deleted file mode 100644
index 2bbb63c..0000000
--- a/src/app/(auth)/layout.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import type React from "react";
-
-interface Props {
- children: React.ReactNode;
-}
-
-const DashboardLayout = ({}: Props) => {
- return (
-
- );
-};
-
-export default DashboardLayout;
diff --git a/src/app/(member)/profile/page.tsx b/src/app/(member)/profile/page.tsx
index 60b71d3..c5b3bd4 100644
--- a/src/app/(member)/profile/page.tsx
+++ b/src/app/(member)/profile/page.tsx
@@ -1,19 +1,20 @@
import type { Metadata } from "next";
+import { ProfileForm } from "@/features/members";
+
export const metadata: Metadata = {
title: "Your profile | Community Pro",
};
export default function Page() {
return (
-
- You're in
- Welcome to Community Pro
- {/* why: placeholder until Phase 2 ships profile editing — keeps the post-activation
- redirect from landing on a 404. */}
-
- Profile setup is on its way. Soon you'll add your skills, portfolio link, and avatar here.
-
+
+
+
Your profile
+
Edit your profile
+
This is what the community sees on the spotlight and members directory.
+
+
);
}
diff --git a/src/app/(public)/members/page.tsx b/src/app/(public)/members/page.tsx
index 539f3e5..7a52394 100644
--- a/src/app/(public)/members/page.tsx
+++ b/src/app/(public)/members/page.tsx
@@ -1,9 +1,24 @@
-const Page = () => {
+import type { Metadata } from "next";
+import { Suspense } from "react";
+
+import { Loader } from "@/components/shared";
+import { MemberDirectory } from "@/features/members";
+
+export const metadata: Metadata = {
+ title: "Members | Community Pro",
+ description: "Search and filter the Community Pro member directory by skill, role, and experience.",
+};
+
+export default function Page() {
return (
-
-
Events
+
+
+
Members
+
Find and connect with growth-focused engineers across the community.
+
+
}>
+
+
);
-};
-
-export default Page;
+}
diff --git a/src/app/(public)/page.tsx b/src/app/(public)/page.tsx
index aad6801..2db12ad 100644
--- a/src/app/(public)/page.tsx
+++ b/src/app/(public)/page.tsx
@@ -8,6 +8,7 @@ import Link from "next/link";
import { Avatar, AvatarGroup, AvatarImage } from "@/components/ui/avatar";
import { Button } from "@/components/ui/button";
import { AVATARS, METRICS } from "@/constants";
+import { MembersSpotlightSection } from "@/features/members";
const Page = () => {
const posthong = usePostHog();
@@ -97,7 +98,9 @@ const Page = () => {
diff --git a/src/components/shared/header.tsx b/src/components/shared/header.tsx
index 41b45b6..1c540fe 100644
--- a/src/components/shared/header.tsx
+++ b/src/components/shared/header.tsx
@@ -13,7 +13,7 @@ import { cn, normalize } from "@/lib";
const image = "/assets/images/community-pro.png";
export const Header = () => {
- const { setTheme, theme } = useTheme();
+ const { setTheme, resolvedTheme } = useTheme();
const pathname = usePathname();
return (
@@ -27,7 +27,7 @@ export const Header = () => {
className={cn(
"relative text-sm",
route.href === normalize(pathname)
- ? "font-bold before:scale-x-100"
+ ? "font-bold before:scale-x-100 border-b-2 border-main"
: "link before:bg-foreground font-medium",
)}
href={route.href}
@@ -38,8 +38,13 @@ export const Header = () => {
))}
-