From 5e3852ecd72804bb3a5e3ad40f8a53681405e7dc Mon Sep 17 00:00:00 2001 From: "Builder.io" Date: Tue, 14 Oct 2025 02:48:15 +0000 Subject: [PATCH] Prettier format pending files --- client/App.tsx | 5 +- .../admin/AdminAchievementManager.tsx | 85 +- .../components/admin/AdminMemberManager.tsx | 87 +- client/components/admin/AdminStatCard.tsx | 17 +- client/components/social/FeedItemCard.tsx | 18 +- client/lib/skip-agent.ts | 20 +- client/pages/Admin.tsx | 208 +- client/pages/Community.tsx | 4291 +++++++++-------- client/pages/Feed.tsx | 131 +- client/pages/docs/DocsApiReference.tsx | 114 +- client/pages/docs/DocsCli.tsx | 102 +- client/pages/docs/DocsExamples.tsx | 79 +- client/pages/docs/DocsGettingStarted.tsx | 95 +- client/pages/docs/DocsIntegrations.tsx | 142 +- client/pages/docs/DocsOverview.tsx | 27 +- client/pages/docs/DocsPlatform.tsx | 92 +- client/pages/docs/DocsTutorials.tsx | 5 +- 17 files changed, 3112 insertions(+), 2406 deletions(-) diff --git a/client/App.tsx b/client/App.tsx index 85b9ab0f..39463614 100644 --- a/client/App.tsx +++ b/client/App.tsx @@ -116,7 +116,10 @@ const App = () => ( }> } /> } /> - } /> + } + /> } /> } /> } /> diff --git a/client/components/admin/AdminAchievementManager.tsx b/client/components/admin/AdminAchievementManager.tsx index a4b46df5..4fcdacc6 100644 --- a/client/components/admin/AdminAchievementManager.tsx +++ b/client/components/admin/AdminAchievementManager.tsx @@ -33,8 +33,11 @@ const AdminAchievementManager = ({ targetUser, }: AdminAchievementManagerProps) => { const [achievements, setAchievements] = useState([]); - const [userAchievements, setUserAchievements] = useState([]); - const [selectedAchievementId, setSelectedAchievementId] = useState(""); + const [userAchievements, setUserAchievements] = useState( + [], + ); + const [selectedAchievementId, setSelectedAchievementId] = + useState(""); const [loadingList, setLoadingList] = useState(false); const [loadingUserAchievements, setLoadingUserAchievements] = useState(false); const [awarding, setAwarding] = useState(false); @@ -53,21 +56,18 @@ const AdminAchievementManager = ({ } }, []); - const loadUserAchievements = useCallback( - async (userId: string) => { - setLoadingUserAchievements(true); - try { - const list = await aethexAchievementService.getUserAchievements(userId); - setUserAchievements(list); - } catch (error) { - console.warn("Failed to load user achievements", error); - setUserAchievements([]); - } finally { - setLoadingUserAchievements(false); - } - }, - [], - ); + const loadUserAchievements = useCallback(async (userId: string) => { + setLoadingUserAchievements(true); + try { + const list = await aethexAchievementService.getUserAchievements(userId); + setUserAchievements(list); + } catch (error) { + console.warn("Failed to load user achievements", error); + setUserAchievements([]); + } finally { + setLoadingUserAchievements(false); + } + }, []); useEffect(() => { loadAchievements().catch(() => undefined); @@ -82,7 +82,10 @@ const AdminAchievementManager = ({ }, [targetUser?.id, loadUserAchievements]); const selectedAchievement = useMemo( - () => achievements.find((achievement) => achievement.id === selectedAchievementId) ?? null, + () => + achievements.find( + (achievement) => achievement.id === selectedAchievementId, + ) ?? null, [achievements, selectedAchievementId], ); @@ -133,7 +136,8 @@ const AdminAchievementManager = ({ if (!result) { aethexToast.error({ title: "Activation failed", - description: "No rewards were activated. Check server logs for details.", + description: + "No rewards were activated. Check server logs for details.", }); } else { const awarded = result.awardedAchievementIds?.length ?? 0; @@ -177,7 +181,10 @@ const AdminAchievementManager = ({ {targetUser ? (

- {targetUser.full_name ?? targetUser.username ?? targetUser.email ?? "Unknown"} + {targetUser.full_name ?? + targetUser.username ?? + targetUser.email ?? + "Unknown"}

{targetUser.email ?? "No email on record"} @@ -197,7 +204,11 @@ const AdminAchievementManager = ({ disabled={!targetUser || loadingList} > - + {achievements.map((achievement) => ( @@ -240,7 +251,9 @@ const AdminAchievementManager = ({

-

Achievement history

+

+ Achievement history +

{loadingUserAchievements ? ( Loading… @@ -252,16 +265,24 @@ const AdminAchievementManager = ({ {userAchievements.length ? (
    {userAchievements.map((achievement) => ( -
  • +
  • -

    {achievement.name}

    +

    + {achievement.name} +

    {achievement.description ? (

    {achievement.description}

    ) : null}
    - + {achievement.xp_reward ?? 0} XP
  • @@ -289,12 +310,18 @@ const AdminAchievementManager = ({

    {selectedAchievement.description}

    ) : null}
    - {selectedAchievement.xp_reward ?? 0} XP + + {selectedAchievement.xp_reward ?? 0} XP + ID: {selectedAchievement.id} - Created {formatDistanceToNowStrict(new Date(selectedAchievement.created_at), { - addSuffix: true, - })} + Created{" "} + {formatDistanceToNowStrict( + new Date(selectedAchievement.created_at), + { + addSuffix: true, + }, + )}
diff --git a/client/components/admin/AdminMemberManager.tsx b/client/components/admin/AdminMemberManager.tsx index 65c99275..c72153b7 100644 --- a/client/components/admin/AdminMemberManager.tsx +++ b/client/components/admin/AdminMemberManager.tsx @@ -95,7 +95,11 @@ const buildProfileDraft = (profile: AethexUserProfile): ProfileDraft => ({ : "0", }); -const ensureOwnerRoles = (roles: string[], profile: AethexUserProfile | null, ownerEmail: string) => { +const ensureOwnerRoles = ( + roles: string[], + profile: AethexUserProfile | null, + ownerEmail: string, +) => { if (!profile) return roles; if ((profile.email ?? "").toLowerCase() !== ownerEmail.toLowerCase()) { return roles; @@ -138,21 +142,18 @@ const AdminMemberManager = ({ } }, [profiles, selectedId, onSelectedIdChange]); - const loadRoles = useCallback( - async (id: string) => { - setLoadingRoles(true); - try { - const fetched = await aethexRoleService.getUserRoles(id); - setRoles(normalizeRoles(fetched)); - } catch (error) { - console.warn("Failed to load user roles", error); - setRoles(["member"]); - } finally { - setLoadingRoles(false); - } - }, - [], - ); + const loadRoles = useCallback(async (id: string) => { + setLoadingRoles(true); + try { + const fetched = await aethexRoleService.getUserRoles(id); + setRoles(normalizeRoles(fetched)); + } catch (error) { + console.warn("Failed to load user roles", error); + setRoles(["member"]); + } finally { + setLoadingRoles(false); + } + }, []); useEffect(() => { if (selectedProfile) { @@ -217,7 +218,8 @@ const AdminMemberManager = ({ console.error("Failed to set user roles", error); aethexToast.error({ title: "Role update failed", - description: error?.message || "Unable to update roles. Check Supabase policies.", + description: + error?.message || "Unable to update roles. Check Supabase policies.", }); } finally { setSavingRoles(false); @@ -242,7 +244,8 @@ const AdminMemberManager = ({ updates.total_xp = Number(profileDraft.total_xp) || 0; } if (profileDraft.loyalty_points.trim().length) { - (updates as any).loyalty_points = Number(profileDraft.loyalty_points) || 0; + (updates as any).loyalty_points = + Number(profileDraft.loyalty_points) || 0; } await aethexUserService.updateProfile(selectedProfile.id, updates); aethexToast.success({ @@ -254,7 +257,9 @@ const AdminMemberManager = ({ console.error("Failed to update profile", error); aethexToast.error({ title: "Profile update failed", - description: error?.message || "Supabase rejected the update. Review payload and RLS policies.", + description: + error?.message || + "Supabase rejected the update. Review payload and RLS policies.", }); } finally { setSavingProfile(false); @@ -273,7 +278,9 @@ const AdminMemberManager = ({
Directory - Search and select members to administer. + + Search and select members to administer. +
@@ -587,7 +612,11 @@ const AdminMemberManager = ({ ) : ( roles.map((role) => ( - + {role} )) @@ -610,7 +639,9 @@ const AdminMemberManager = ({
- + {item.mediaType === "video" ? "Video" : item.mediaType === "image" diff --git a/client/lib/skip-agent.ts b/client/lib/skip-agent.ts index 5c61580a..9a3b7e41 100644 --- a/client/lib/skip-agent.ts +++ b/client/lib/skip-agent.ts @@ -183,7 +183,10 @@ let shouldEnableSkipAgent = false; // Example override (console): window.__AETHEX_SKIP_AGENT_CONFIG = { src: 'https://example.com/agent.js', id: '...' }; const getRuntimeConfig = () => { try { - if (typeof window !== "undefined" && (window as any).__AETHEX_SKIP_AGENT_CONFIG) { + if ( + typeof window !== "undefined" && + (window as any).__AETHEX_SKIP_AGENT_CONFIG + ) { return (window as any).__AETHEX_SKIP_AGENT_CONFIG as { src?: string; id?: string; @@ -217,7 +220,10 @@ const createSkipAgentTheme = () => { const isDocsPath = () => { try { - return typeof window !== "undefined" && window.location.pathname.startsWith("/docs"); + return ( + typeof window !== "undefined" && + window.location.pathname.startsWith("/docs") + ); } catch (e) { return false; } @@ -273,9 +279,9 @@ const isSkipAgentReachable = async (): Promise => { throw new Error(`Agent status request failed with ${response.status}`); } - const payload = (await response.json().catch(() => null)) as - | { active?: boolean } - | null; + const payload = (await response.json().catch(() => null)) as { + active?: boolean; + } | null; if (payload && payload.active === false) { throw new Error("Agent reported inactive"); @@ -413,7 +419,9 @@ const loadSkipAgent = async (): Promise => { } const scriptText = await response.text(); - const blobUrl = URL.createObjectURL(new Blob([scriptText], { type: "application/javascript" })); + const blobUrl = URL.createObjectURL( + new Blob([scriptText], { type: "application/javascript" }), + ); const script = document.createElement("script"); script.id = SKIP_AGENT_SCRIPT_ID; diff --git a/client/pages/Admin.tsx b/client/pages/Admin.tsx index 2866be16..b64441c1 100644 --- a/client/pages/Admin.tsx +++ b/client/pages/Admin.tsx @@ -171,12 +171,17 @@ export default function Admin() { Access denied - This panel is restricted to {ownerEmail}. If you need access, contact the site owner. + This panel is restricted to {ownerEmail}. If you need access, + contact the site owner. - - + +
@@ -191,7 +196,8 @@ export default function Admin() { const selectedMember = useMemo( () => - managedProfiles.find((profile) => profile.id === selectedMemberId) ?? null, + managedProfiles.find((profile) => profile.id === selectedMemberId) ?? + null, [managedProfiles, selectedMemberId], ); @@ -200,7 +206,9 @@ export default function Admin() { const featuredStudios = studios.length; const pendingApplications = applications.filter((app) => { const status = (app.status ?? "").toLowerCase(); - return status !== "approved" && status !== "completed" && status !== "closed"; + return ( + status !== "approved" && status !== "completed" && status !== "closed" + ); }).length; const overviewStats = useMemo( @@ -209,7 +217,9 @@ export default function Admin() { title: "Total members", value: totalMembers ? totalMembers.toString() : "—", description: "Profiles synced from AeThex identity service.", - trend: totalMembers ? `${totalMembers} active profiles` : "Awaiting sync", + trend: totalMembers + ? `${totalMembers} active profiles` + : "Awaiting sync", icon: Users, tone: "blue" as const, }, @@ -365,23 +375,37 @@ export default function Admin() {
-

Admin Control Center

+

+ Admin Control Center +

Unified oversight for AeThex operations, content, and community.

- + Owner - + Admin - + Founder

- Signed in as {normalizedEmail || ownerEmail} + Signed in as{" "} + + {normalizedEmail || ownerEmail} +

@@ -391,11 +415,17 @@ export default function Admin() { - +
- + Overview Content @@ -425,23 +455,31 @@ export default function Admin() { Quick actions
- Launch frequent administrative workflows. + + Launch frequent administrative workflows. + - {quickActions.map(({ label, description, icon: ActionIcon, action }) => ( - - ))} + {quickActions.map( + ({ label, description, icon: ActionIcon, action }) => ( + + ), + )} @@ -451,21 +489,37 @@ export default function Admin() { Access control
- Owner-only access enforced via Supabase roles. + + Owner-only access enforced via Supabase roles. +
  • - Owner email: {ownerEmail} + Owner email:{" "} + {ownerEmail} +
  • +
  • + Roles are provisioned automatically on owner sign-in. +
  • +
  • + Grant additional admins by updating Supabase role + assignments.
  • -
  • Roles are provisioned automatically on owner sign-in.
  • -
  • Grant additional admins by updating Supabase role assignments.
- -
@@ -482,12 +536,18 @@ export default function Admin() { Content overview
- {publishedPosts} published {publishedPosts === 1 ? "post" : "posts"} · {loadingPosts ? "refreshing content…" : "latest Supabase sync"} + {publishedPosts} published{" "} + {publishedPosts === 1 ? "post" : "posts"} ·{" "} + {loadingPosts + ? "refreshing content…" + : "latest Supabase sync"}

- Drafts and announcements appear instantly on the public blog after saving. Use scheduled releases for major updates and keep thumbnails optimised for 1200×630. + Drafts and announcements appear instantly on the public blog + after saving. Use scheduled releases for major updates and + keep thumbnails optimised for 1200×630.

@@ -498,7 +558,9 @@ export default function Admin() { Blog posts - Manage blog content stored in Supabase + + Manage blog content stored in Supabase +
@@ -538,7 +600,8 @@ export default function Admin() { {blogPosts.length === 0 && (

- No posts loaded yet. Use “Refresh” or “Add post” to start managing content. + No posts loaded yet. Use “Refresh” or “Add post” to start + managing content.

)} @@ -680,14 +743,28 @@ export default function Admin() { Community actions
- Grow the network and celebrate contributors. + + Grow the network and celebrate contributors. + - - + - + @@ -700,7 +777,9 @@ export default function Admin() { Featured studios - Control studios highlighted across AeThex experiences. + + Control studios highlighted across AeThex experiences. + {studios.map((s, i) => ( @@ -762,7 +841,9 @@ export default function Admin() { @@ -773,7 +854,9 @@ export default function Admin() { @@ -788,12 +871,14 @@ export default function Admin() { if (!resp.ok) { aethexToast.error({ title: "Save failed", - description: "Unable to persist featured studios.", + description: + "Unable to persist featured studios.", }); } else { aethexToast.success({ title: "Studios saved", - description: "Featured studios updated successfully.", + description: + "Featured studios updated successfully.", }); } }} @@ -810,7 +895,9 @@ export default function Admin() { Project applications - Review collaboration requests and prioritize approvals. + + Review collaboration requests and prioritize approvals. +
@@ -847,7 +934,9 @@ export default function Admin() { >

- {app.applicant_name || app.applicant_email || "Unknown applicant"} + {app.applicant_name || + app.applicant_email || + "Unknown applicant"}

{(app.status ?? "pending").toLowerCase()} @@ -858,14 +947,18 @@ export default function Admin() {

{app.created_at ? (

- Submitted {new Date(app.created_at).toLocaleString()} + Submitted{" "} + {new Date(app.created_at).toLocaleString()}

) : null}
))}
) : ( -

No applications on file. Encourage partners to apply via briefs.

+

+ No applications on file. Encourage partners to apply via + briefs. +

)}
@@ -876,7 +969,9 @@ export default function Admin() { System status - Auth, database, and realtime services. + + Auth, database, and realtime services. +

Auth: Operational

@@ -891,11 +986,16 @@ export default function Admin() { Your account - Owner privileges are active. + + Owner privileges are active. +

Signed in as {user.email}.

-

You have full administrative access across AeThex services.

+

+ You have full administrative access across AeThex + services. +

diff --git a/client/pages/Community.tsx b/client/pages/Community.tsx index bad16d24..ba6e575f 100644 --- a/client/pages/Community.tsx +++ b/client/pages/Community.tsx @@ -713,7 +713,9 @@ export default function Community() { event.preventDefault(); const query = knowledgeQuery.trim(); if (!query) { - aethexToast.system("Add a topic or question to search the knowledge base."); + aethexToast.system( + "Add a topic or question to search the knowledge base.", + ); return; } aethexToast.system(`Searching guides for "${query}"...`); @@ -730,7 +732,9 @@ export default function Community() { aethexToast.system("Enter your email to join the newsletter."); return; } - aethexToast.system(`Subscribed ${address} to the AeThex community briefing.`); + aethexToast.system( + `Subscribed ${address} to the AeThex community briefing.`, + ); setNewsletterEmail(""); }, [newsletterEmail], @@ -849,19 +853,22 @@ export default function Community() { { id: "join-discord", title: "Join the live chat", - description: "Hop into Discord intros and grab the starter role in under five minutes.", + description: + "Hop into Discord intros and grab the starter role in under five minutes.", icon: MessageCircle, }, { id: "complete-profile", title: "Complete your profile", - description: "Upload an avatar, link your GitHub, and let the network know your focus.", + description: + "Upload an avatar, link your GitHub, and let the network know your focus.", icon: UserCircle, }, { id: "make-intro", title: "Share your first post", - description: "Publish a quick intro or project teaser in the feed to unlock your first badge.", + description: + "Publish a quick intro or project teaser in the feed to unlock your first badge.", icon: Sparkles, }, ]; @@ -870,21 +877,24 @@ export default function Community() { { id: "orientation", title: "Orientation Checklist", - description: "Track every onboarding milestone with an interactive guide.", + description: + "Track every onboarding milestone with an interactive guide.", href: "/onboarding", label: "Open checklist", }, { id: "community-tour", title: "Community Tour", - description: "Watch a quick walkthrough of forums, events, and support channels.", + description: + "Watch a quick walkthrough of forums, events, and support channels.", href: "/docs/getting-started", label: "View tour", }, { id: "starter-kit", title: "Starter Resource Kit", - description: "Download templates, style guides, and best practices curated by mentors.", + description: + "Download templates, style guides, and best practices curated by mentors.", href: "/docs/examples", label: "Browse kit", }, @@ -901,7 +911,8 @@ export default function Community() { { id: "faq", title: "FAQ & Community Policies", - description: "Find answers to the most common setup, support, and conduct questions.", + description: + "Find answers to the most common setup, support, and conduct questions.", articles: 42, icon: ClipboardList, href: "/support", @@ -909,7 +920,8 @@ export default function Community() { { id: "how-to", title: "How-to Guides", - description: "Step-by-step tutorials for publishing builds, tracking analytics, and launching events.", + description: + "Step-by-step tutorials for publishing builds, tracking analytics, and launching events.", articles: 58, icon: Code, href: "/docs/tutorials", @@ -917,7 +929,8 @@ export default function Community() { { id: "troubleshooting", title: "Troubleshooting Library", - description: "Resolve build errors, auth issues, and integration blockers with proven fixes.", + description: + "Resolve build errors, auth issues, and integration blockers with proven fixes.", articles: 34, icon: AlertTriangle, href: "/status", @@ -928,21 +941,24 @@ export default function Community() { { id: "technical", title: "Technical mentorship", - description: "Pair with senior engineers for architecture reviews, performance tuning, and launch plans.", + description: + "Pair with senior engineers for architecture reviews, performance tuning, and launch plans.", mentors: 36, icon: Code, }, { id: "creative", title: "Creative direction", - description: "Work with art directors and narrative leads to sharpen your storytelling and worldbuilding.", + description: + "Work with art directors and narrative leads to sharpen your storytelling and worldbuilding.", mentors: 22, icon: Sparkles, }, { id: "career", title: "Career coaching", - description: "Get guidance on portfolios, interviews, and collaborating inside cross-disciplinary teams.", + description: + "Get guidance on portfolios, interviews, and collaborating inside cross-disciplinary teams.", mentors: 18, icon: Users, }, @@ -952,7 +968,8 @@ export default function Community() { { id: "aurora", title: "Aurora Protocol", - summary: "Scaled from prototype to 150K players after co-developing monetisation loops with AeThex mentors.", + summary: + "Scaled from prototype to 150K players after co-developing monetisation loops with AeThex mentors.", metricLabel: "Retention uplift", metricValue: "+28%", icon: TrendingUp, @@ -960,7 +977,8 @@ export default function Community() { { id: "zenith", title: "Project Zenith", - summary: "Community artists produced 240+ assets in three weeks using our collaborative review pipeline.", + summary: + "Community artists produced 240+ assets in three weeks using our collaborative review pipeline.", metricLabel: "Assets delivered", metricValue: "243", icon: FolderGit2, @@ -968,7 +986,8 @@ export default function Community() { { id: "ember", title: "Ember Syndicate", - summary: "A mentorship trio rallied devs worldwide to revive a dormant roguelite into a live service.", + summary: + "A mentorship trio rallied devs worldwide to revive a dormant roguelite into a live service.", metricLabel: "Mentor sessions", metricValue: "64", icon: Heart, @@ -979,21 +998,24 @@ export default function Community() { { id: "contributors", title: "Top contributors", - description: "Members with the most merged pull requests and community answers this month.", + description: + "Members with the most merged pull requests and community answers this month.", leaders: ["QuasarForge", "LunaDev", "SynthRider"], icon: Award, }, { id: "mentors", title: "Mentor impact", - description: "Hours spent mentoring, code reviewing, and onboarding new squads.", + description: + "Hours spent mentoring, code reviewing, and onboarding new squads.", leaders: ["ByteSage", "AriaNova", "FluxPilot"], icon: Heart, }, { id: "creators", title: "Creator highlights", - description: "Streamers and educators with the highest workshop enrollments and video watch time.", + description: + "Streamers and educators with the highest workshop enrollments and video watch time.", leaders: ["NeonNarrator", "EchoArtist", "TechnoFable"], icon: Star, }, @@ -1833,7 +1855,8 @@ export default function Community() { Welcome to AeThex

- Learn how to customise your profile, meet mentors, and ship your first contribution. + Learn how to customise your profile, meet + mentors, and ship your first contribution.

))} @@ -1958,90 +1996,259 @@ export default function Community() { {activeTab === "knowledge" && ( - {/* Knowledge Base */} -
-
- -
- - -
- - Search the library -
- Find step-by-step help - - Enter a topic, tool, or problem and we will surface curated guides written by mentors and staff. - -
- -
-
- setKnowledgeQuery(event.target.value)} - placeholder="e.g. Deploying multiplayer servers" - className="pl-10 bg-background/60 border-border/60" - aria-label="Search knowledge base" - /> - + {/* Knowledge Base */} +
+
+ +
+ + +
+ + Search the library
- - -
-

- Quick suggestions -

-
- {knowledgeSuggestions.map((suggestion) => ( - - ))} + + Find step-by-step help + + + Enter a topic, tool, or problem and we will surface + curated guides written by mentors and staff. + + + +
+
+ + setKnowledgeQuery(event.target.value) + } + placeholder="e.g. Deploying multiplayer servers" + className="pl-10 bg-background/60 border-border/60" + aria-label="Search knowledge base" + /> + +
+ +
+
+

+ Quick suggestions +

+
+ {knowledgeSuggestions.map((suggestion) => ( + + ))} +
-
- - -
- {knowledgeBaseTopics.map((topic) => { - const Icon = topic.icon; + + +
+ {knowledgeBaseTopics.map((topic) => { + const Icon = topic.icon; + return ( + + +
+
+ + {topic.articles} articles +
+ + Updated weekly + +
+ + {topic.title} + + + {topic.description} + +
+ + + +
+ ); + })} +
+
+
+
+ + )} + + {activeTab === "mentorship" && ( + + {/* Mentorship Program */} +
+
+ +
+ + +
+ + Mentor spotlight +
+ + Kick off a guided sprint + + + Submit your goals and interests, and we’ll connect you + with mentors who ship in similar spaces. + +
+ +
    +
  • + + 1:1 sessions and group clinics each week +
  • +
  • + + Direct feedback on builds, pitch decks, and + production plans +
  • +
  • + + Priority invites to closed playtests and God Mode + rewards +
  • +
+
+ + +
+
+
+
+ {mentorshipTracks.map((track) => { + const Icon = track.icon; + return ( +
+
+
+ +
+
+

+ {track.title} +

+

+ {track.description} +

+

+ {track.mentors} mentors available +

+
+
+
+ ); + })} +
+
+
+
+
+ )} + + {activeTab === "case-studies" && ( + + {/* Case Studies */} +
+
+ +
+ {caseStudyHighlights.map((study) => { + const Icon = study.icon; return ( - -
-
- - {topic.articles} articles -
- - Updated weekly - +
+ +
+ + {study.metricLabel}
- - {topic.title} + + {study.title} - {topic.description} +

+ {study.metricValue} +

- - @@ -2049,763 +2256,622 @@ export default function Community() { })}
-
-
-
+
+
)} - {activeTab === "mentorship" && ( - - {/* Mentorship Program */} -
-
- -
- - -
- - Mentor spotlight + {activeTab === "leaderboards" && ( + + {/* Leaderboards */} +
+
+ +
+ {leaderboardCategories.map((category) => { + const Icon = category.icon; + return ( + + +
+ + + {category.title} + + + Updated daily + +
+ + {category.description} + +
+ +
    + {category.leaders.map((leader, index) => ( +
  1. + + #{index + 1} + + + {leader} + +
  2. + ))} +
+
+
+ ); + })} +
+
+ +
+
+
+
+ )} + + {activeTab === "newsletter" && ( + + {/* Community Newsletter */} +
+
+ + + +
+
+ + Weekly digest +
+

+ Each Monday we share major updates, spotlight + champions, and surface new opportunities—no noise, + just impact. +

- Kick off a guided sprint - - Submit your goals and interests, and we’ll connect you with mentors who ship in similar spaces. - - - -
    -
  • - - 1:1 sessions and group clinics each week -
  • -
  • - - Direct feedback on builds, pitch decks, and production plans -
  • -
  • - - Priority invites to closed playtests and God Mode rewards -
  • -
-
- - -
+ +

+ We respect your time—unsubscribe anytime with a single + click. +

-
- {mentorshipTracks.map((track) => { - const Icon = track.icon; +
+
+
+ )} + + {activeTab === "growth" && ( + + {/* Professional Growth & Fun */} +
+
+ +
+ {opportunityHighlights.map((item) => { + const Icon = item.icon; + return ( + + +
+ + {item.title} +
+ + {item.description} + +
+ +
+ {item.metrics.map((metric) => ( +
+

+ {metric.label} +

+

+ {metric.value} +

+
+ ))} +
+ +
+
+ ); + })} +
+
+
+
+ )} + + {activeTab === "activities" && ( + + {/* Content & Activities */} +
+
+ +
+ {creativeActivities.map((activity) => { + const Icon = activity.icon; + return ( + + +
+ + {activity.title} +
+ + {activity.description} + +
+ +
    + {activity.highlights.map((highlight) => ( +
  • + + {highlight} +
  • + ))} +
+ +
+
+ ); + })} +
+
+
+
+ )} + + {activeTab === "recognition" && ( + + {/* Recognition & Roles */} +
+
+ +
+ {recognitionPrograms.map((program) => { + const Icon = program.icon; + return ( + + +
+ + {program.title} +
+ + {program.description} + +
+ +
    + {program.perks.map((perk) => ( +
  • + + {perk} +
  • + ))} +
+ +
+
+ ); + })} +
+
+
+
+ )} + + {activeTab === "features" && ( + + {/* Community Features */} +
+
+ +
+ {socialFeatures.map((feature) => { + const Icon = feature.icon; + return ( + + +
+ + {feature.title} +
+ + {feature.description} + +
+ +
    + {feature.bullets.map((bullet) => ( +
  • + + {bullet} +
  • + ))} +
+ +
+
+ ); + })} +
+
+
+
+ )} + + {activeTab === "stats" && ( + + {/* Community Stats */} +
+
+
+ {stats.map((stat, index) => { + const Icon = stat.icon; return (
-
-
- +
+
+
-
-

- {track.title} -

-

- {track.description} -

-

- {track.mentors} mentors available -

+
+
+
+ {stat.value}
+

+ {stat.label} +

); })}
-
-
-
- )} - - {activeTab === "case-studies" && ( - - {/* Case Studies */} -
-
- -
- {caseStudyHighlights.map((study) => { - const Icon = study.icon; - return ( - -
- -
- - {study.metricLabel} -
- - {study.title} - -

- {study.metricValue} -

-
- -

- {study.summary} -

- -
- - ); - })} -
-
-
-
- )} - - {activeTab === "leaderboards" && ( - - {/* Leaderboards */} -
-
- -
- {leaderboardCategories.map((category) => { - const Icon = category.icon; - return ( - - -
- - - {category.title} - - - Updated daily - -
- {category.description} -
- -
    - {category.leaders.map((leader, index) => ( -
  1. - #{index + 1} - {leader} -
  2. - ))} -
-
-
- ); - })} -
-
- -
-
-
-
- )} - - {activeTab === "newsletter" && ( - - {/* Community Newsletter */} -
-
- - - -
-
- - Weekly digest -
-

- Each Monday we share major updates, spotlight champions, and surface new opportunities—no noise, just impact. -

-
-
- setNewsletterEmail(event.target.value)} - placeholder="you@example.com" - className="bg-background/60 border-border/60" - aria-label="Email address" - /> - -
-

- We respect your time—unsubscribe anytime with a single click. -

-
-
-
-
-
- )} - - {activeTab === "growth" && ( - - {/* Professional Growth & Fun */} -
-
- -
- {opportunityHighlights.map((item) => { - const Icon = item.icon; - return ( - - -
- - {item.title} -
- {item.description} -
- -
- {item.metrics.map((metric) => ( -
-

{metric.label}

-

- {metric.value} -

-
- ))} -
- -
-
- ); - })} -
-
-
-
- )} - - {activeTab === "activities" && ( - - {/* Content & Activities */} -
-
- -
- {creativeActivities.map((activity) => { - const Icon = activity.icon; - return ( - - -
- - {activity.title} -
- {activity.description} -
- -
    - {activity.highlights.map((highlight) => ( -
  • - - {highlight} -
  • - ))} -
- -
-
- ); - })} -
-
-
-
- )} - - {activeTab === "recognition" && ( - - {/* Recognition & Roles */} -
-
- -
- {recognitionPrograms.map((program) => { - const Icon = program.icon; - return ( - - -
- - {program.title} -
- {program.description} -
- -
    - {program.perks.map((perk) => ( -
  • - - {perk} -
  • - ))} -
- -
-
- ); - })} -
-
-
-
- )} - - {activeTab === "features" && ( - - {/* Community Features */} -
-
- -
- {socialFeatures.map((feature) => { - const Icon = feature.icon; - return ( - - -
- - {feature.title} -
- {feature.description} -
- -
    - {feature.bullets.map((bullet) => ( -
  • - - {bullet} -
  • - ))} -
- -
-
- ); - })} -
-
-
-
- )} - - {activeTab === "stats" && ( - - {/* Community Stats */} -
-
-
- {stats.map((stat, index) => { - const Icon = stat.icon; - return ( -
-
-
- -
-
-
-
- {stat.value} -
-

- {stat.label} -

-
-
- ); - })} -
-
-
-
+
+
)} {activeTab === "platforms" && ( - {/* Community Platforms */} -
-
-
-

- Connect on Your Favorite Platform -

-

- Multiple ways to engage with the AeThex community -

-
+ {/* Community Platforms */} +
+
+
+

+ Connect on Your Favorite Platform +

+

+ Multiple ways to engage with the AeThex community +

+
-
- {platforms.map((platform, index) => { - const Icon = platform.icon; - return ( - - -
- -
- {platform.name} - {platform.description} -
- -
-
- Members: - - {platform.members} - +
+ {platforms.map((platform, index) => { + const Icon = platform.icon; + return ( + + +
+
-
- Activity: - - {platform.activity} - + + {platform.name} + + + {platform.description} + + + +
+
+ Members: + + {platform.members} + +
+
+ Activity: + + {platform.activity} + +
-
- - -
- ); - })} + + + + ); + })} +
-
-
- +
+
)} {activeTab === "devconnect" && ( - {/* DevConnect Spotlight */} -
-
-
-
-
- - New Platform - -

- Introducing DevConnect -

-

- DevConnect is our dedicated hub for platform teams building the next wave of AeThex experiences. Launch collabs, monitor live services, and activate the Studio network — all from one command center. -

-
+ + +
+ {devConnectHighlights.map((highlight, index) => { + const Icon = highlight.icon; + return ( +
+
+ +
+
+

+ {highlight.title} +

+

+ {highlight.description} +

+
+
+ ); + })} +
+
+ DevConnect syncs directly with AeThex developer + profiles, so your activity, streaks, and achievements + follow you across every build. +
+
+
- - -
- {devConnectHighlights.map((highlight, index) => { - const Icon = highlight.icon; - return ( -
-
- -
-
-

- {highlight.title} -

-

- {highlight.description} -

-
-
- ); - })} -
-
- DevConnect syncs directly with AeThex developer profiles, so your activity, streaks, and achievements follow you across every build. -
-
-
-
-
-
+ + )} {activeTab === "forums" && ( - {/* Forums & Discussion */} -
-
- -
- {forumSpaces.map((space, index) => { - const Icon = space.icon; - return ( - - -
-
-
- -
-
- - {space.name} - - - {space.description} - -
-
- - {space.threads} threads - -
-
- -
- {space.activeToday} active today - - Latest - -
-
-

- {space.latestThread.title} -

-

- by {space.latestThread.author} • {space.latestThread.timeAgo} -

-
- -
-
- ); - })} -
-
-
-
- )} - - {activeTab === "feedback" && ( - - {/* Feedback & Roadmap */} -
-
- -
-
- {feedbackChannels.map((channel) => { - const Icon = channel.icon; + {/* Forums & Discussion */} +
+
+ +
+ {forumSpaces.map((space, index) => { + const Icon = space.icon; return ( - +
-
-
+
+
- {channel.title} + {space.name} - {channel.description} + {space.description}
- {channel.submissionsThisWeek} this week + {space.threads} threads
-

- Stewarded by {channel.owner} -

- -
- {channel.statuses.map((status) => ( - - {status.label}: {status.count} - - ))} + +
+ {space.activeToday} active today + + Latest + +
+
+

+ {space.latestThread.title} +

+

+ by {space.latestThread.author} •{" "} + {space.latestThread.timeAgo} +

@@ -2814,485 +2880,592 @@ export default function Community() { ); })}
- - - Live roadmap snapshot - - Track what the team is shipping next based on player momentum. - - - - {roadmapSnapshot.map((item) => ( -
-
-

- {item.title} -

-

- {item.eta} -

-
- - {item.status} - -
- ))} - -
-
-
-
- +
+
)} - {activeTab === "polls" && ( - - {/* Community Polls */} -
-
- -
- {polls.map((poll) => ( - handlePollVote(poll.id, optionId)} - /> - ))} -
-
-
-
- )} - - {activeTab === "collaboration" && ( - - {/* Real-time Collaboration */} -
-
- -
- - - Active channels - - See who’s online and jump into the conversations that matter right now. - - - - {chatChannels.map((channel) => { + {activeTab === "feedback" && ( + + {/* Feedback & Roadmap */} +
+
+ +
+
+ {feedbackChannels.map((channel) => { const Icon = channel.icon; return ( -
-
-
-
- -
-
-

- {channel.name} -

-

- {channel.description} -

+ +
+
+
+ +
+
+ + {channel.title} + + + {channel.description} + +
+ + {channel.submissionsThisWeek} this week +
- + Stewarded by {channel.owner} +

+
+ +
+ {channel.statuses.map((status) => ( + + {status.label}: {status.count} + + ))} +
+
-
- Synced with Discord - - {channel.activeNow} live now - -
-
+ + Submit feedback + + + + + ); })} - - - - - Why players love integrated chat - - Keep every squad aligned across devices with presence, threads, and recordings. - - - -
    - {chatFeatures.map((feature) => ( -
  • - - {feature} -
  • +
+ + + Live roadmap snapshot + + Track what the team is shipping next based on player + momentum. + + + + {roadmapSnapshot.map((item) => ( +
+
+

+ {item.title} +

+

+ {item.eta} +

+
+ + {item.status} + +
))} - - -
-
-
-
-
-
- )} - - {activeTab === "events" && ( - - {/* Upcoming Events */} -
-
- -
- {events.map((event, index) => ( - - handleEventRegistration(event, payload) - } - /> - ))} -
-
-
-
- )} - - {activeTab === "profiles" && ( - - {/* Developer Profile Highlights */} -
-
- -
- {profileHighlights.map((highlight) => { - const Icon = highlight.icon; - return ( - - -
- -
- - {highlight.title} - - {highlight.description} -
- -
-

- {highlight.metricLabel} -

-

- {highlight.metricValue} -

-
-
-
- ); - })} -
-
-
-
- )} - - {activeTab === "featured" && ( - - {/* Featured Developers */} -
-
- -
- {contributors.map((contributor, index) => ( - - - {contributor.name} -
-

- {contributor.name} -

-

- {contributor.title} -

-
- - {contributor.speciality} - -

- {contributor.bio} -

-
-

- {contributor.recentContribution} -

-
- {contributor.reputation} - {contributor.contributions} contributions -
-
- - {contributor.badge} -
- ))} +
-
-
-
+ + )} - {activeTab === "workshop" && ( - - {/* Workshop & Mod Support */} -
-
- -
- {workshopItems.map((item) => { - const Icon = item.icon; - return ( + {activeTab === "polls" && ( + + {/* Community Polls */} +
+
+ +
+ {polls.map((poll) => ( + + handlePollVote(poll.id, optionId) + } + /> + ))} +
+
+
+
+ )} + + {activeTab === "collaboration" && ( + + {/* Real-time Collaboration */} +
+
+ +
+ + + Active channels + + See who’s online and jump into the conversations that + matter right now. + + + + {chatChannels.map((channel) => { + const Icon = channel.icon; + return ( +
+
+
+
+ +
+
+

+ {channel.name} +

+

+ {channel.description} +

+
+
+ + {channel.participants} members + +
+
+ Synced with Discord + + {" "} + {channel.activeNow} live now + +
+
+ ); + })} +
+
+ + + Why players love integrated chat + + Keep every squad aligned across devices with presence, + threads, and recordings. + + + +
    + {chatFeatures.map((feature) => ( +
  • + + {feature} +
  • + ))} +
+ +
+
+
+
+
+
+ )} + + {activeTab === "events" && ( + + {/* Upcoming Events */} +
+
+ +
+ {events.map((event, index) => ( + + handleEventRegistration(event, payload) + } + /> + ))} +
+
+
+
+ )} + + {activeTab === "profiles" && ( + + {/* Developer Profile Highlights */} +
+
+ +
+ {profileHighlights.map((highlight) => { + const Icon = highlight.icon; + return ( + + +
+ +
+ + {highlight.title} + + + {highlight.description} + +
+ +
+

+ {highlight.metricLabel} +

+

+ {highlight.metricValue} +

+
+
+
+ ); + })} +
+
+
+
+ )} + + {activeTab === "featured" && ( + + {/* Featured Developers */} +
+
+ +
+ {contributors.map((contributor, index) => ( - -
- + + {contributor.name} +
+

+ {contributor.name} +

+

+ {contributor.title} +

- {item.title} - {item.description} - - -
- Downloads - - {item.downloads.toLocaleString()} - -
-
- Rating - - {item.rating.toFixed(1)} - -
-

- Created by {item.author} + + {contributor.speciality} + +

+ {contributor.bio}

+
+

+ {contributor.recentContribution} +

+
+ {contributor.reputation} + + {contributor.contributions} contributions + +
+
+ + {contributor.badge} +
- ); - })} + ))} +
-
-
-
+
+
+ )} + + {activeTab === "workshop" && ( + + {/* Workshop & Mod Support */} +
+
+ +
+ {workshopItems.map((item) => { + const Icon = item.icon; + return ( + + +
+ +
+ + {item.title} + + + {item.description} + +
+ +
+ Downloads + + {item.downloads.toLocaleString()} + +
+
+ Rating + + {item.rating.toFixed(1)} + +
+

+ Created by {item.author} +

+ +
+
+ ); + })} +
+
+
+
)} {activeTab === "media" && ( - {/* Media Galleries */} -
-
- -
- {mediaGallery.map((item) => ( - -
- {item.title} - - {item.type} - -
- -
-

- {item.title} -

-

- by {item.author} -

+ {/* Media Galleries */} +
+
+ +
+ {mediaGallery.map((item) => ( + +
+ {item.title} + + {item.type} +
-
- - - {item.likes} - - -
- -
- ))} + +
+

+ {item.title} +

+

+ by {item.author} +

+
+
+ + + {item.likes} + + +
+
+ + ))} +
-
-
-
+ + )} {activeTab === "spotlight" && ( - {/* Creator Spotlight */} -
-
- -
- {spotlightCreators.map((creator) => ( - - -
-
- {creator.name} -
-

- {creator.name} -

-

- {creator.role} -

+ {/* Creator Spotlight */} +
+
+ +
+ {spotlightCreators.map((creator) => ( + + +
+
+ {creator.name} +
+

+ {creator.name} +

+

+ {creator.role} +

+
+ + Featured creator +
- - Featured creator - -
-

- {creator.highlight} -

-
- {creator.metrics.map((metric) => ( -
-

- {metric.label} -

-

- {metric.value} -

-
- ))} -
- - - - ))} +

+ {creator.highlight} +

+
+ {creator.metrics.map((metric) => ( +
+

+ {metric.label} +

+

+ {metric.value} +

+
+ ))} +
+ + + + ))} +
-
-
-
+ + )} {activeTab === "governance" && ( @@ -3378,12 +3551,15 @@ export default function Community() { Submit a report - Reports are routed to the right channel owners for fast - follow-up. + Reports are routed to the right channel owners for + fast follow-up. -
+
+ setReportForm((prev) => ({ + ...prev, + reason: event.target.value, + })) + } + className="w-full rounded-lg border border-border/50 bg-background/80 px-3 py-2 text-sm focus:border-aethex-400 focus:outline-none focus:ring-2 focus:ring-aethex-400/40" + > + + {reportReasons.map((reason) => ( + + ))} + + {selectedReportReason && ( +

+ {selectedReportReason.description} +

+ )} +
+
+ +