aethex-forge/client/pages/Index.tsx
AeThex 7fec93e05c
Some checks are pending
Build / build (push) Waiting to run
Deploy / deploy (push) Waiting to run
Lint & Type Check / lint (push) Waiting to run
Security Scan / dependency-check (push) Waiting to run
Security Scan / semgrep (push) Waiting to run
Test / test (18.x) (push) Waiting to run
Test / test (20.x) (push) Waiting to run
feat: Authentik SSO, nav systems, project pages, and schema fixes
Auth & SSO
- Wire Authentik (auth.aethex.tech) as OIDC PKCE SSO provider
- Server-side only flow with HMAC-signed stateless state token
- Account linking via authentik_sub in user metadata
- AeThex ID connection card in Dashboard connections tab
- Unlink endpoint POST /api/auth/authentik/unlink
- Fix node:https helper to bypass undici DNS bug on Node 18
- Fix resolv.conf to use 1.1.1.1/8.8.8.8 in container

Schema & types
- Regenerate database.types.ts from live Supabase schema (23k lines)
- Fix 511 TypeScript errors caused by stale 582-line types file
- Fix UserProfile import in aethex-database-adapter.ts
- Add notifications migration (title, message, read columns)

Server fixes
- Remove badge_color from achievements seed/upsert (column doesn't exist)
- Rename name→title, add slug field in achievements seed
- Remove email from all user_profiles select queries (column doesn't exist)
- Fix email-based achievement target lookup via auth.admin.listUsers
- Add GET /api/projects/:projectId endpoint
- Fix import.meta.dirname → fileURLToPath for Node 18 compatibility
- Expose VITE_APP_VERSION from package.json at build time

Navigation systems
- DevPlatformNav: reorganize into Learn/Build grouped dropdowns with descriptions
- Migrate all 11 dev-platform pages from main Layout to DevPlatformLayout
- Remove dead isDevMode context nav swap from main Layout
- EthosLayout: purple-accented tab bar (Library, Artists, Licensing, Settings)
  with member-only gating and guest CTA — migrate 4 Ethos pages
- GameForgeLayout: orange-branded sidebar with Studio section and lock icons
  for unauthenticated users — migrate GameForge + GameForgeDashboard
- SysBar: live latency ping, status dot (green/yellow/red), real version

Layout dropdown
- Role-gate Admin (owner/admin/founder only) and Internal Docs (+ staff)
- Add Internal section label with separator
- Fix settings link from /dashboard?tab=profile#settings to /dashboard?tab=settings

Project pages
- Add ProjectDetail page at /projects/:projectId
- Fix ProfilePassport "View mission" link from /projects/new to /projects/:id

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 05:01:10 +00:00

361 lines
14 KiB
TypeScript

import SEO from "@/components/SEO";
import Layout from "@/components/Layout";
import { Button } from "@/components/ui/button";
import { Card } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
import { Link } from "react-router-dom";
import { motion } from "framer-motion";
import {
Boxes,
BookOpen,
Rocket,
ArrowRight,
Terminal,
Layers,
Sparkles,
Users,
Trophy,
Database,
Gamepad2,
Code2,
Zap,
Globe,
} from "lucide-react";
const ecosystemPillars = [
{
icon: Boxes,
title: "Six Realms",
description: "Nexus, GameForge, Foundation, Labs, Corp, and Staff — each with unique APIs and capabilities",
href: "/realms",
},
{
icon: Database,
title: "Developer APIs",
description: "Comprehensive REST APIs for users, content, achievements, and more",
href: "/dev-platform/api-reference",
},
{
icon: Terminal,
title: "SDK & Tools",
description: "TypeScript SDK, CLI tools, and pre-built templates to ship faster",
href: "/dev-platform/quick-start",
},
{
icon: Layers,
title: "Marketplace",
description: "Premium integrations, plugins, and components from the community",
href: "/dev-platform/marketplace",
},
{
icon: Users,
title: "Community",
description: "Join 12,000+ developers building on AeThex",
href: "/community",
},
{
icon: Trophy,
title: "Opportunities",
description: "Get paid to build — contracts, bounties, and commissions",
href: "/opportunities",
},
];
const stats = [
{ value: "12K+", label: "Developers" },
{ value: "2.5M+", label: "API Calls/Day" },
{ value: "150+", label: "Code Examples" },
{ value: "6", label: "Realms" },
];
const features = [
{
icon: Layers,
title: "Cross-Platform Integration Layer",
description: "One unified API to build across Roblox, VRChat, RecRoom, Spatial, Decentraland, The Sandbox, Minecraft, Meta Horizon, Fortnite, and Zepeto — no more managing separate platform SDKs",
},
{
icon: Code2,
title: "Enterprise-Grade Developer Tools",
description: "TypeScript SDK, REST APIs, unified authentication, cross-platform achievements, content delivery, and CLI tools — all integrated and production-ready",
},
{
icon: Gamepad2,
title: "Six Specialized Realms",
description: "Nexus (social hub), GameForge (games), Foundation (education), Labs (AI/innovation), Corp (business), Staff (governance) — each with unique APIs and tools",
},
{
icon: Trophy,
title: "Monetize Your Skills",
description: "Get paid to build — access contracts, bounties, and commissions. 12K+ developers earning while creating cross-platform games, apps, and integrations",
},
{
icon: Users,
title: "Thriving Creator Economy",
description: "Join squads, collaborate on projects, share assets in the marketplace, and grow your reputation across all six realms",
},
{
icon: Rocket,
title: "Ship Everywhere, Fast",
description: "150+ cross-platform code examples, pre-built templates, OAuth integration, Supabase backend — one-command deployment to every metaverse",
},
];
const platforms = ["Roblox", "Minecraft", "Meta Horizon", "Fortnite", "VRChat", "Zepeto"];
const platformIcons = [Gamepad2, Boxes, Globe, Zap, Users, Sparkles];
export default function Index() {
return (
<Layout hideFooter>
<SEO
pageTitle="AeThex | Developer Ecosystem"
description="Build powerful applications on the AeThex ecosystem. Access 6 specialized realms, comprehensive APIs, and a thriving developer community."
canonical={
typeof window !== "undefined"
? window.location.href
: (undefined as any)
}
/>
{/* Static background — radial glow only; grid/scanlines come from body::after/::before in global.css */}
<div className="fixed inset-0 pointer-events-none overflow-hidden">
<div className="absolute inset-0 bg-[radial-gradient(ellipse_70%_40%_at_50%_-10%,hsl(var(--primary)/0.08),transparent)]" />
</div>
<div className="relative space-y-28 pb-28">
{/* Hero */}
<section className="relative min-h-[88vh] flex items-center justify-center pt-20">
<div className="relative text-center max-w-5xl mx-auto space-y-8 px-4">
<motion.div
initial={{ opacity: 0, y: -12 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5 }}
>
<Badge className="text-xs px-4 py-1.5 bg-primary/10 border-primary/30 uppercase tracking-widest font-semibold">
<Sparkles className="w-3 h-3 mr-1.5 inline" />
AeThex Developer Ecosystem
</Badge>
</motion.div>
<motion.h1
initial={{ opacity: 0, y: 16 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.1 }}
className="text-6xl md:text-7xl lg:text-8xl font-black tracking-tight leading-none"
>
Build on{" "}
<span className="text-primary">AeThex</span>
</motion.h1>
<motion.p
initial={{ opacity: 0, y: 16 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.2 }}
className="text-lg md:text-xl text-muted-foreground max-w-3xl mx-auto leading-relaxed"
>
The <span className="text-foreground font-medium">integration layer</span> connecting all metaverse platforms.
Six specialized realms. <span className="text-foreground font-medium">12K+ developers</span>. One powerful ecosystem.
</motion.p>
{/* Platform pills */}
<motion.div
initial={{ opacity: 0, y: 16 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.3 }}
className="flex flex-wrap items-center justify-center gap-2 pt-2"
>
{platforms.map((name, i) => {
const Icon = platformIcons[i];
return (
<div
key={name}
className="flex items-center gap-1.5 bg-secondary/60 px-3 py-1.5 rounded-full border border-border text-sm text-muted-foreground"
>
<Icon className="w-3.5 h-3.5 text-primary" />
<span className="font-medium">{name}</span>
</div>
);
})}
<div className="flex items-center gap-1.5 bg-primary/10 px-3 py-1.5 rounded-full border border-primary/20 text-sm text-primary font-medium">
& More
</div>
</motion.div>
{/* CTAs */}
<motion.div
initial={{ opacity: 0, y: 16 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.4 }}
className="flex flex-wrap gap-3 justify-center pt-4"
>
<Link to="/dev-platform/quick-start">
<Button size="lg" className="px-8 h-12 font-semibold">
Start Building
<Rocket className="w-4 h-4 ml-2" />
</Button>
</Link>
<Link to="/dev-platform/api-reference">
<Button size="lg" variant="outline" className="px-8 h-12 font-semibold">
<BookOpen className="w-4 h-4 mr-2" />
Explore APIs
</Button>
</Link>
</motion.div>
{/* Stats */}
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.8, delay: 0.6 }}
className="grid grid-cols-2 md:grid-cols-4 gap-4 pt-12 max-w-3xl mx-auto"
>
{stats.map((stat) => (
<div
key={stat.label}
className="bg-secondary/40 border border-border rounded-xl p-5 text-center"
>
<p className="text-3xl font-black text-primary">{stat.value}</p>
<p className="text-xs text-muted-foreground mt-1 font-medium uppercase tracking-wide">{stat.label}</p>
</div>
))}
</motion.div>
</div>
</section>
{/* Ecosystem Pillars */}
<section className="space-y-10 px-4">
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6 }}
className="text-center space-y-3"
>
<h2 className="text-4xl md:text-5xl font-black">The AeThex Ecosystem</h2>
<p className="text-muted-foreground max-w-2xl mx-auto">
Six interconnected realms, each with unique capabilities and APIs to power your applications
</p>
</motion.div>
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-4 max-w-6xl mx-auto">
{ecosystemPillars.map((pillar, index) => (
<motion.div
key={pillar.title}
initial={{ opacity: 0, y: 24 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: index * 0.07 }}
>
<Link to={pillar.href}>
<Card className="group h-full border-border hover:border-primary/30 transition-colors duration-200 bg-card">
<div className="p-6 space-y-4">
<div className="w-11 h-11 rounded-lg bg-primary/10 border border-primary/20 flex items-center justify-center group-hover:bg-primary/15 transition-colors">
<pillar.icon className="w-5 h-5 text-primary" />
</div>
<div className="space-y-1.5">
<h3 className="font-semibold text-foreground group-hover:text-primary transition-colors">
{pillar.title}
</h3>
<p className="text-sm text-muted-foreground leading-relaxed">
{pillar.description}
</p>
</div>
<div className="flex items-center text-primary/70 group-hover:text-primary group-hover:translate-x-1 transition-all duration-200 text-sm">
<span className="font-medium mr-1">Explore</span>
<ArrowRight className="w-3.5 h-3.5" />
</div>
</div>
</Card>
</Link>
</motion.div>
))}
</div>
</section>
{/* Why AeThex */}
<section className="space-y-10 px-4">
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6 }}
className="text-center space-y-3"
>
<h2 className="text-4xl md:text-5xl font-black">Why Build on AeThex?</h2>
<p className="text-muted-foreground max-w-2xl mx-auto">
Join a growing ecosystem designed for creators, developers, and entrepreneurs
</p>
</motion.div>
<div className="grid md:grid-cols-3 gap-4 max-w-6xl mx-auto">
{features.map((feature, index) => (
<motion.div
key={feature.title}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.5, delay: index * 0.08 }}
>
<Card className="p-6 space-y-4 border-border bg-card h-full">
<div className="w-10 h-10 rounded-lg bg-primary/10 border border-primary/20 flex items-center justify-center">
<feature.icon className="w-5 h-5 text-primary" />
</div>
<div className="space-y-2">
<h3 className="font-semibold text-foreground">{feature.title}</h3>
<p className="text-sm text-muted-foreground leading-relaxed">
{feature.description}
</p>
</div>
</Card>
</motion.div>
))}
</div>
</section>
{/* CTA */}
<section className="px-4">
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6 }}
className="relative overflow-hidden rounded-2xl max-w-5xl mx-auto border border-primary/20 bg-primary/5"
>
<div className="absolute inset-0 bg-[radial-gradient(ellipse_60%_80%_at_80%_50%,hsl(var(--primary)/0.08),transparent)]" />
<div className="relative z-10 p-12 md:p-16 text-center space-y-6">
<Badge className="text-xs px-4 py-1.5 bg-primary/10 border-primary/30 uppercase tracking-widest font-semibold">
<Terminal className="w-3 h-3 mr-1.5 inline" />
Start Building Today
</Badge>
<h2 className="text-3xl md:text-4xl lg:text-5xl font-black leading-tight">
Ready to Build Something{" "}
<span className="text-primary">Epic?</span>
</h2>
<p className="text-muted-foreground max-w-2xl mx-auto">
Get your API key and start deploying across{" "}
<span className="text-foreground font-medium">5+ metaverse platforms</span> in minutes
</p>
<div className="flex flex-wrap gap-3 justify-center pt-2">
<Link to="/dev-platform/dashboard">
<Button size="lg" className="px-8 h-12 font-semibold">
Get Your API Key
<ArrowRight className="w-4 h-4 ml-2" />
</Button>
</Link>
<Link to="/realms">
<Button size="lg" variant="outline" className="px-8 h-12 font-semibold">
Explore Realms
<Boxes className="w-4 h-4 ml-2" />
</Button>
</Link>
</div>
</div>
</motion.div>
</section>
</div>
</Layout>
);
}