From c5265cea83ee53915c0bfa510e0f4e97769dae5d Mon Sep 17 00:00:00 2001 From: "Builder.io" Date: Sat, 4 Oct 2025 20:58:46 +0000 Subject: [PATCH] Rebuild Community page with expanded community features cgen-d3d9c7bbe58b448899efc1b79e682b60 --- client/pages/Community.tsx | 1552 +++++++++++++++++++++++++++++++++++- 1 file changed, 1550 insertions(+), 2 deletions(-) diff --git a/client/pages/Community.tsx b/client/pages/Community.tsx index 78805f0f..04d57559 100644 --- a/client/pages/Community.tsx +++ b/client/pages/Community.tsx @@ -1,3 +1,4 @@ +import Layout from "@/components/Layout"; import { Button } from "@/components/ui/button"; import { Card, @@ -7,7 +8,15 @@ import { CardTitle, } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; -import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; @@ -15,6 +24,7 @@ import LoadingScreen from "@/components/LoadingScreen"; import { aethexToast } from "@/lib/aethex-toast"; import { cn } from "@/lib/utils"; import { Link } from "react-router-dom"; +import { useCallback, useEffect, useRef, useState, type FormEvent } from "react"; import { AlertTriangle, ArrowDown, @@ -106,6 +116,7 @@ type FeedbackChannel = { tone: "neutral" | "positive" | "warning"; }[]; owner: string; + icon: LucideIcon; }; type PollTrend = "up" | "steady" | "down"; @@ -553,4 +564,1541 @@ function PollCard({ poll, selectedOption, onSelect }: PollCardProps) { ); } -export default function Community() { \ No newline at end of file +export default function Community() { + const [isLoading, setIsLoading] = useState(true); + const toastShownRef = useRef(false); + const [registeredEvents, setRegisteredEvents] = useState>({}); + const [polls, setPolls] = useState(() => [ + { + id: "winter-cosmetic", + question: "Which cosmetic drop should we fast-track for the winter update?", + closesIn: "Closes in 3 days", + options: [ + { id: "frostbyte-operative", label: "Frostbyte Operative Skin", votes: 342, trend: "up" }, + { id: "aurora-trails", label: "Aurora Hover Trails", votes: 287, trend: "steady" }, + { id: "synthwave-lobby", label: "Synthwave Lobby Music Pack", votes: 198, trend: "down" }, + ], + }, + { + id: "platform-priority", + question: "What should the team prioritise next for the companion app?", + closesIn: "Closes in 6 days", + options: [ + { id: "build-tracker", label: "Squad build tracking & loadouts", votes: 264, trend: "up" }, + { id: "voice-integrations", label: "Native voice channel integration", votes: 192, trend: "steady" }, + { id: "marketplace", label: "Creator marketplace beta", votes: 148, trend: "up" }, + ], + }, + ]); + const [pollSelections, setPollSelections] = useState>({}); + const [reportForm, setReportForm] = useState({ reason: "", details: "" }); + + useEffect(() => { + const timer = setTimeout(() => { + setIsLoading(false); + if (!toastShownRef.current) { + aethexToast.system("Community hub connected"); + toastShownRef.current = true; + } + }, 1000); + + return () => clearTimeout(timer); + }, []); + + const platforms = [ + { + name: "Discord Server", + description: "Real-time chat with developers and get instant help", + icon: MessageSquare, + members: "15K+ members", + activity: "500+ daily active", + link: "/discord", + color: "from-purple-500 to-indigo-600", + }, + { + name: "GitHub Community", + description: "Contribute to open source projects and share code", + icon: Github, + members: "8K+ contributors", + activity: "200+ repositories", + link: "/github", + color: "from-gray-700 to-gray-900", + }, + { + name: "Twitter Community", + description: "Follow the latest updates and join conversations", + icon: Twitter, + members: "25K+ followers", + activity: "Daily updates", + link: "/twitter", + color: "from-blue-400 to-blue-600", + }, + ]; + + const events: CommunityEvent[] = [ + { + id: "aethex-game-jam-2025", + title: "AeThex Game Jam 2025", + date: "January 17-19, 2025", + location: "Online", + type: "Competition", + participants: 500, + prize: "$10,000 grand prize", + status: "Registration Open", + description: + "A 48-hour remote jam where cross-discipline teams ship a playable build and pitch their live-ops plan to AeThex Studios.", + agenda: [ + "Day 1, 9:00 AM PST — Theme reveal, team sync, and tech check", + "Day 2, 12:00 PM PST — Mentor office hours and vertical slice review", + "Day 3, 3:00 PM PST — Final submissions, judging, and community showcase", + ], + registrationEnabled: true, + registrationUrl: "https://devconnect.sbs/events/game-jam-2025", + }, + { + id: "weekly-developer-meetup", + title: "Weekly Developer Meetup", + date: "Every Wednesday, 7:00 PM PST", + location: "DevConnect Studio Lounge", + type: "Meetup", + participants: 80, + prize: null, + status: "Recurring", + description: + "An ongoing roundtable for sharing progress, pairing on blockers, and highlighting new community tools across AeThex projects.", + agenda: [ + "15 min — Lightning updates from active squads", + "30 min — Deep-dive breakout rooms hosted by AeThex mentors", + "15 min — Open Q&A and contributor shout-outs", + ], + registrationEnabled: true, + registrationUrl: "https://devconnect.sbs/events/weekly-meetup", + }, + { + id: "ai-in-games-workshop", + title: "AI in Games Workshop", + date: "December 20, 2024", + location: "San Francisco HQ + Live Stream", + type: "Workshop", + participants: 120, + prize: null, + status: "Upcoming", + description: + "Hands-on sessions covering inference optimization, procedural storytelling, and guardrailed AI systems for live games.", + agenda: [ + "Session 1 — Deploying performant ML models on AeThex Edge", + "Session 2 — Narrative design with adaptive dialogue tooling", + "Session 3 — Compliance, telemetry, and post-launch monitoring", + ], + registrationEnabled: true, + registrationUrl: "https://devconnect.sbs/events/ai-games", + }, + ]; + + const stats = [ + { label: "Community Members", value: "50K+", icon: Users }, + { label: "Daily Messages", value: "2K+", icon: MessageCircle }, + { label: "Open Source Projects", value: "200+", icon: Code }, + { label: "Games Created", value: "1K+", icon: Gamepad2 }, + ]; + + const devConnectHighlights = [ + { + title: "Unified Creator Profiles", + description: + "Showcase your AeThex achievements, GitHub contributions, and live projects in one public hub.", + icon: Users, + }, + { + title: "Real-time Collaboration Rooms", + description: + "Spin up focused channels with voice, video, and whiteboards tailored for each build sprint.", + icon: MessageCircle, + }, + { + title: "Integrated Delivery Pipeline", + description: + "Track deployments, alerts, and community feedback with automated insights across your stack.", + icon: TrendingUp, + }, + ]; + + const forumSpaces: ForumSpace[] = [ + { + id: "strategy-lab", + name: "Strategy Lab", + description: "Break down balance changes and evolving metas with systems designers.", + threads: 182, + activeToday: 46, + latestThread: { + title: "Season 4 economy tuning notes", + author: "PixelPilot", + timeAgo: "1h ago", + }, + icon: Hash, + }, + { + id: "build-clinic", + name: "Build Clinic", + description: "Share pipelines, CI setups, and performance wins with fellow builders.", + threads: 241, + activeToday: 63, + latestThread: { + title: "Optimising shader hot reloads in WebGPU", + author: "LunaDev", + timeAgo: "3h ago", + }, + icon: MessageSquarePlus, + }, + { + id: "playtest-reports", + name: "Playtest Reports", + description: "Swap qualitative feedback, telemetry, and next-step experiments.", + threads: 96, + activeToday: 22, + latestThread: { + title: "Week 18 retention snapshot", + author: "DataForge", + timeAgo: "30m ago", + }, + icon: ClipboardList, + }, + ]; + + const feedbackChannels: FeedbackChannel[] = [ + { + id: "bug-reports", + title: "Bug Reports", + description: "Track crashes, blockers, and gameplay issues spotted by players.", + submissionsThisWeek: 52, + statuses: [ + { label: "New", count: 7, tone: "warning" }, + { label: "Triaged", count: 28, tone: "neutral" }, + { label: "Resolved", count: 17, tone: "positive" }, + ], + owner: "QA Vanguard", + icon: AlertTriangle, + }, + { + id: "balance-insights", + title: "Balance Insights", + description: "Surface tuning feedback for weapons, archetypes, and encounters.", + submissionsThisWeek: 38, + statuses: [ + { label: "In Review", count: 15, tone: "neutral" }, + { label: "Next Patch", count: 9, tone: "positive" }, + { label: "Released", count: 14, tone: "positive" }, + ], + owner: "Combat Council", + icon: BarChart3, + }, + { + id: "feature-ideas", + title: "Ideas & Features", + description: "Prioritise new systems, cosmetics, and social tools suggested by the community.", + submissionsThisWeek: 61, + statuses: [ + { label: "Ideation", count: 24, tone: "neutral" }, + { label: "Planned", count: 10, tone: "positive" }, + { label: "Backlog", count: 27, tone: "warning" }, + ], + owner: "Product Guild", + icon: Sparkles, + }, + ]; + + const chatChannels: ChatChannel[] = [ + { + id: "squad-voice", + name: "Squad Voice Lounge", + description: "Hop into matchmaking-ready rooms with spatial audio support.", + participants: 640, + activeNow: 132, + icon: Headphones, + }, + { + id: "build-help", + name: "Build Help Desk", + description: "Pair programming office hours and live debugging streams.", + participants: 420, + activeNow: 94, + icon: MessageSquareText, + }, + { + id: "playtest-queue", + name: "Live Playtest Queue", + description: "Coordinate session times and share immediate reactions.", + participants: 310, + activeNow: 57, + icon: Mic, + }, + ]; + + const profileHighlights: ProfileHighlight[] = [ + { + id: "portfolio", + title: "Unified Portfolio", + description: "Link GitHub, AeThex achievements, and live builds in one profile.", + metricLabel: "Portfolio views", + metricValue: "3.2K / wk", + icon: Layers, + }, + { + id: "streaks", + title: "Contribution Streaks", + description: "Track commits, bug reports, and mentoring sessions automatically.", + metricLabel: "Longest streak", + metricValue: "48 days", + icon: Sparkles, + }, + { + id: "reputation", + title: "Reputation Signals", + description: "Surface kudos, endorsements, and verified roles in the community.", + metricLabel: "Reputation", + metricValue: "4.9 ★", + icon: UserCircle, + }, + ]; + + const contributors: FeaturedContributor[] = [ + { + name: "Alex Developer", + avatar: + "https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=120&h=120&fit=crop&crop=face", + title: "Community Leader", + contributions: 156, + badge: "🏆 Top Contributor", + speciality: "Game Development", + bio: "Hosts the weekly build clinics and mentors new squads shipping co-op missions.", + recentContribution: "Rolled out the Adaptive Matchmaking toolkit for Season 4.", + reputation: "4.9/5 player rating", + profileUrl: "/profiles/alex-developer", + }, + { + name: "Sarah Coder", + avatar: + "https://images.unsplash.com/photo-1494790108755-2616b612b029?w=120&h=120&fit=crop&crop=face", + title: "Documentation Expert", + contributions: 89, + badge: "📚 Knowledge Hero", + speciality: "Technical Writing", + bio: "Maintains the AeThex SDK quickstarts and keeps localisation packs up to date.", + recentContribution: "Launched the multiplayer onboarding walkthrough in seven languages.", + reputation: "4.8/5 creator rating", + profileUrl: "/profiles/sarah-coder", + }, + { + name: "Jordan AI", + avatar: + "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=120&h=120&fit=crop&crop=face", + title: "AI Researcher", + contributions: 134, + badge: "🧠 AI Pioneer", + speciality: "Machine Learning", + bio: "Builds guardrailed inference pipelines and shares evaluation playbooks weekly.", + recentContribution: "Released the Procedural Dialogue orchestrator adopted by 40+ teams.", + reputation: "4.9/5 mentor rating", + profileUrl: "/profiles/jordan-ai", + }, + ]; + + const workshopItems: WorkshopItem[] = [ + { + id: "photon-ridge", + title: "Photon Ridge Raid", + description: "Modded endgame encounter balancing puzzle mechanics with co-op combat.", + downloads: 12045, + rating: 4.8, + author: "NebulaFox", + icon: FolderGit2, + }, + { + id: "neon-run", + title: "Neon Run Track Pack", + description: "Five synthwave-inspired courses with dynamic weather scripting.", + downloads: 8742, + rating: 4.7, + author: "CircuitBreaker", + icon: Puzzle, + }, + { + id: "dynamic-hubs", + title: "Dynamic Hub Templates", + description: "Drop-in lobby layouts with reactive NPC chatter and map voting.", + downloads: 6403, + rating: 4.9, + author: "Astra", + icon: Layers, + }, + ]; + + const mediaGallery: MediaItem[] = [ + { + id: "screenshot-1", + title: "Aurora Rift", + type: "Screenshot", + thumbnail: "https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=600&h=400&fit=crop", + author: "Nova", + likes: 684, + }, + { + id: "artwork-1", + title: "Character concept: Vox", + type: "Artwork", + thumbnail: "https://images.unsplash.com/photo-1604079628040-94301bb21b11?w=600&h=400&fit=crop", + author: "Sketchbyte", + likes: 542, + }, + { + id: "video-1", + title: "Speedrun showcase", + type: "Video", + thumbnail: "https://images.unsplash.com/photo-1511512578047-dfb367046420?w=600&h=400&fit=crop", + author: "Dash", + likes: 452, + }, + { + id: "screenshot-2", + title: "Photon Ridge sunset", + type: "Screenshot", + thumbnail: "https://images.unsplash.com/photo-1517694712202-14dd9538aa97?w=600&h=400&fit=crop", + author: "NebulaFox", + likes: 398, + }, + { + id: "artwork-2", + title: "Kairos armor set", + type: "Artwork", + thumbnail: "https://images.unsplash.com/photo-1498050108023-c5249f4df085?w=600&h=400&fit=crop", + author: "Synth", + likes: 356, + }, + { + id: "video-2", + title: "Live jam timelapse", + type: "Video", + thumbnail: "https://images.unsplash.com/photo-1451187580459-43490279c0fa?w=600&h=400&fit=crop", + author: "BeatSync", + likes: 312, + }, + ]; + + const spotlightCreators: SpotlightCreator[] = [ + { + id: "nebulafox", + name: "NebulaFox", + role: "Systems Designer", + highlight: "Created the Photon Ridge raid encounter adopted by 54% of squads.", + link: "/community/spotlight/nebulafox", + avatar: "https://images.unsplash.com/photo-1529626455594-4ff0802cfb7e?w=120&h=120&fit=crop&crop=face", + metrics: [ + { label: "Downloads", value: "12K" }, + { label: "Avg Rating", value: "4.8" }, + { label: "Featured Weeks", value: "6" }, + ], + }, + { + id: "lunatech", + name: "LunaTech", + role: "Technical Artist", + highlight: "Delivered the AeThex holographic shader pack powering six community events.", + link: "/community/spotlight/lunatech", + avatar: "https://images.unsplash.com/photo-1527980965255-d3b416303d12?w=120&h=120&fit=crop&crop=face", + metrics: [ + { label: "Adopted Studios", value: "32" }, + { label: "Workshop Forks", value: "210" }, + { label: "Tutorial Views", value: "18K" }, + ], + }, + ]; + + const roadmapSnapshot = [ + { + id: "roadmap-1", + title: "Patch 3.6 — Balance refresh", + status: "In QA", + statusTone: "positive" as const, + eta: "Shipping Nov 16", + }, + { + id: "roadmap-2", + title: "Creator economy beta", + status: "Planning", + statusTone: "neutral" as const, + eta: "Sprint 47", + }, + { + id: "roadmap-3", + title: "Voice presence improvements", + status: "Investigating", + statusTone: "warning" as const, + eta: "Discovery ongoing", + }, + ]; + + const chatFeatures = [ + "Discord bridge keeps roles in sync across text, voice, and forums", + "Threaded replies are archived to knowledge bases automatically", + "Temporary strike teams spin up with stage, video, and whiteboard tools", + ]; + + const moderationGuidelines = [ + { + title: "Respect every player", + description: "Harassment, hate speech, and discrimination are removed without debate.", + }, + { + title: "Keep feedback actionable", + description: "Aim critiques at builds and behaviours, never at people.", + }, + { + title: "Collaborate transparently", + description: "Disclose monetisation, affiliations, or sensitive data sources when sharing work.", + }, + ]; + + const moderationTools: ModerationTool[] = [ + { + id: "auto-shields", + title: "Automated Shields", + description: "Realtime filters flag slurs, spam, and phishing before they hit the feed.", + icon: Shield, + }, + { + id: "casebook", + title: "Casebook Workflows", + description: "Escalate complex cases with evidence bundles and audit trails.", + icon: Gavel, + }, + { + id: "report-routing", + title: "Report Routing", + description: "Route player reports to dedicated channel owners for rapid follow-up.", + icon: Flag, + }, + ]; + + const reportReasons: ReportReason[] = [ + { + id: "harassment", + label: "Harassment or hateful content", + description: "Toxic language, slurs, or targeted harassment toward a player or group.", + }, + { + id: "cheating", + label: "Cheating or exploit", + description: "Sharing hacks, stolen assets, or instructions to bypass fair play.", + }, + { + id: "inappropriate", + label: "Inappropriate media", + description: "Adult content, personal data leaks, or otherwise unsafe material.", + }, + ]; + + const feedbackToneStyles: Record<"neutral" | "positive" | "warning", string> = { + neutral: "bg-blue-500/10 text-blue-200 border border-blue-400/40", + positive: "bg-emerald-500/10 text-emerald-200 border border-emerald-400/40", + warning: "bg-amber-500/10 text-amber-200 border border-amber-400/40", + }; + + const selectedReportReason = reportReasons.find((reason) => reason.id === reportForm.reason); + + const handleEventRegistration = useCallback( + (eventData: CommunityEvent, payload: EventRegistrationPayload) => { + setRegisteredEvents((prev) => ({ + ...prev, + [eventData.id]: payload, + })); + + const firstName = payload.name.split(" ")[0] || payload.name; + aethexToast.system( + `${firstName}, you're registered for ${eventData.title}. Confirmation sent to ${payload.email}.`, + ); + }, + [], + ); + + const handlePollVote = useCallback( + (pollId: string, optionId: string) => { + setPolls((prevPolls) => + prevPolls.map((poll) => { + if (poll.id !== pollId) { + return poll; + } + + const previousSelection = pollSelections[pollId]; + if (previousSelection === optionId) { + return poll; + } + + return { + ...poll, + options: poll.options.map((option) => { + if (option.id === optionId) { + return { ...option, votes: option.votes + 1 }; + } + if (previousSelection && option.id === previousSelection) { + return { ...option, votes: Math.max(0, option.votes - 1) }; + } + return option; + }), + }; + }), + ); + + setPollSelections((prev) => ({ + ...prev, + [pollId]: optionId, + })); + }, + [pollSelections], + ); + + const handleReportSubmit = useCallback( + (submitEvent: FormEvent) => { + submitEvent.preventDefault(); + const trimmedDetails = reportForm.details.trim(); + + if (!reportForm.reason) { + aethexToast.system("Select a reason before submitting a report."); + return; + } + + if (!trimmedDetails) { + aethexToast.system("Add a brief description so moderators can respond quickly."); + return; + } + + aethexToast.system("Report submitted. Our moderation team will review shortly."); + setReportForm({ reason: "", details: "" }); + }, + [reportForm], + ); + + if (isLoading) { + return ( + + ); + } + + return ( + +
+ {/* Hero Section */} +
+
+
+ + + AeThex Community + + +

+ + Join the Innovation Network + +

+ +

+ Connect with developers, creators, and innovators from around + the world. Share knowledge, collaborate on projects, and grow + together. +

+ +
+ + +
+
+
+
+ + {/* Community Stats */} +
+
+
+ {stats.map((stat, index) => { + const Icon = stat.icon; + return ( +
+
+
+ +
+
+
+
+ {stat.value} +
+

+ {stat.label} +

+
+
+ ); + })} +
+
+
+ + {/* 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} + +
+
+ Activity: + + {platform.activity} + +
+
+ + +
+
+ ); + })} +
+
+
+ + {/* 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 profiles, so your + activity, streaks, and achievements follow you across every + build. +
+
+
+
+
+
+ + {/* 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} +

+
+ +
+
+ ); + })} +
+
+
+ + {/* Feedback & Roadmap */} +
+
+ +
+
+ {feedbackChannels.map((channel) => { + const Icon = channel.icon; + return ( + + +
+
+
+ +
+
+ {channel.title} + {channel.description} +
+
+ + {channel.submissionsThisWeek} this week + +
+

+ Stewarded by {channel.owner} +

+
+ +
+ {channel.statuses.map((status) => ( + + {status.label}: {status.count} + + ))} +
+ +
+
+ ); + })} +
+ + + Live roadmap snapshot + + Track what the team is shipping next based on player momentum. + + + + {roadmapSnapshot.map((item) => ( +
+
+

{item.title}

+

{item.eta}

+
+ {item.status} +
+ ))} + +
+
+
+
+
+ + {/* Community Polls */} +
+
+ +
+ {polls.map((poll) => ( + handlePollVote(poll.id, optionId)} + /> + ))} +
+
+
+ + {/* 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} +
  • + ))} +
+ +
+
+
+
+
+ + {/* Upcoming Events */} +
+
+ +
+ {events.map((event, index) => ( + handleEventRegistration(event, payload)} + /> + ))} +
+
+
+ + {/* Player Profile Highlights */} +
+
+ +
+ {profileHighlights.map((highlight) => { + const Icon = highlight.icon; + return ( + + +
+ +
+ {highlight.title} + {highlight.description} +
+ +
+

+ {highlight.metricLabel} +

+

+ {highlight.metricValue} +

+
+
+
+ ); + })} +
+
+
+ + {/* Featured Player Profiles */} +
+
+ +
+ {contributors.map((contributor, index) => ( + + + {contributor.name} +
+

+ {contributor.name} +

+

+ {contributor.title} +

+
+ + {contributor.speciality} + +

+ {contributor.bio} +

+
+

+ {contributor.recentContribution} +

+
+ {contributor.reputation} + {contributor.contributions} contributions +
+
+ + {contributor.badge} + + +
+
+ ))} +
+
+
+ + {/* 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} +

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

{item.title}

+

by {item.author}

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

+ {creator.name} +

+

{creator.role}

+
+
+ + Featured creator + +
+

+ {creator.highlight} +

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

+ {metric.label} +

+

+ {metric.value} +

+
+ ))} +
+ +
+
+ ))} +
+
+
+ + {/* Community Governance */} +
+
+ +
+ + +
+ Community guidelines + Expectations for every player and contributor. +
+ + Updated weekly + +
+ +
    + {moderationGuidelines.map((guideline) => ( +
  • + +
    +

    {guideline.title}

    +

    {guideline.description}

    +
    +
  • + ))} +
+
+
+
+ + + Moderation toolkit + + Equip community managers with actionable, auditable controls. + + + + {moderationTools.map((tool) => { + const Icon = tool.icon; + return ( +
+
+ +
+

{tool.title}

+

{tool.description}

+
+ ); + })} +
+
+ + + Submit a report + + Reports are routed to the right channel owners for fast follow-up. + + + +
+
+ + + {selectedReportReason && ( +

+ {selectedReportReason.description} +

+ )} +
+
+ +