mirror of
https://github.com/AeThex-Corporation/AeThex-OS.git
synced 2026-04-18 14:27:20 +00:00
141 lines
5.6 KiB
TypeScript
141 lines
5.6 KiB
TypeScript
import { motion } from "framer-motion";
|
|
import { Link } from "wouter";
|
|
import { ArrowLeft, Lock, CheckCircle2, Circle } from "lucide-react";
|
|
import circuitBg from '@assets/generated_images/dark_digital_circuit_board_background.png';
|
|
|
|
const TECH_TREE = [
|
|
{
|
|
id: "foundation",
|
|
title: "The Foundation",
|
|
nodes: [
|
|
{ id: 1, name: "Data Ethics", status: "completed" },
|
|
{ id: 2, name: "Logic Gates", status: "completed" },
|
|
{ id: 3, name: "System Architecture", status: "completed" },
|
|
]
|
|
},
|
|
{
|
|
id: "verse",
|
|
title: "Verse Mastery",
|
|
nodes: [
|
|
{ id: 4, name: "Input Sanitization", status: "completed" },
|
|
{ id: 5, name: "Concurrency", status: "active" },
|
|
{ id: 6, name: "Spatial Logic", status: "locked" },
|
|
]
|
|
},
|
|
{
|
|
id: "security",
|
|
title: "Aegis Protocols",
|
|
nodes: [
|
|
{ id: 7, name: "Threat Detection", status: "locked" },
|
|
{ id: 8, name: "Kill-Gate Implementation", status: "locked" },
|
|
{ id: 9, name: "Zero Trust Models", status: "locked" },
|
|
]
|
|
}
|
|
];
|
|
|
|
export default function Curriculum() {
|
|
return (
|
|
<div className="min-h-screen bg-background text-foreground font-mono relative overflow-hidden flex flex-col items-center">
|
|
|
|
{/* Background */}
|
|
<div
|
|
className="absolute inset-0 opacity-10 pointer-events-none z-0"
|
|
style={{ backgroundImage: `url(${circuitBg})`, backgroundSize: 'cover' }}
|
|
/>
|
|
|
|
<div className="relative z-10 w-full max-w-5xl px-4 py-10 flex flex-col h-full">
|
|
|
|
{/* Header */}
|
|
<div className="flex justify-between items-center mb-16">
|
|
<Link href="/">
|
|
<button className="text-muted-foreground hover:text-secondary transition-colors flex items-center gap-2 uppercase text-xs tracking-widest">
|
|
<ArrowLeft className="w-4 h-4" /> Return to Codex
|
|
</button>
|
|
</Link>
|
|
<div className="text-right">
|
|
<h1 className="text-2xl font-display font-bold uppercase text-white tracking-widest">
|
|
Codex Tech Tree
|
|
</h1>
|
|
<p className="text-xs text-secondary font-bold uppercase tracking-[0.2em]">
|
|
Current Rank: Architect (Gold)
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Tree Container */}
|
|
<div className="flex-1 flex flex-col md:flex-row justify-between items-center gap-10 relative">
|
|
|
|
{/* Connecting Line (Horizontal on Desktop) */}
|
|
<div className="absolute top-1/2 left-0 w-full h-1 bg-white/5 hidden md:block -z-10" />
|
|
|
|
{TECH_TREE.map((section, index) => (
|
|
<div key={section.id} className="w-full md:w-1/3 flex flex-col items-center relative group">
|
|
|
|
{/* Section Title */}
|
|
<div className="mb-8 text-center">
|
|
<h2 className="text-lg font-display text-white uppercase tracking-wider mb-1">{section.title}</h2>
|
|
<div className="text-[10px] text-muted-foreground uppercase">Module 0{index + 1}</div>
|
|
</div>
|
|
|
|
{/* Nodes */}
|
|
<div className="space-y-6 w-full max-w-[240px]">
|
|
{section.nodes.map((node) => (
|
|
<Node key={node.id} data={node} />
|
|
))}
|
|
</div>
|
|
|
|
{/* Vertical Line for Section */}
|
|
<div className="absolute top-16 bottom-0 w-[1px] bg-gradient-to-b from-white/10 to-transparent -z-10" />
|
|
</div>
|
|
))}
|
|
|
|
</div>
|
|
|
|
<div className="mt-16 text-center">
|
|
<Link href="/passport">
|
|
<button className="bg-secondary/10 hover:bg-secondary/20 text-secondary border border-secondary/50 px-8 py-3 uppercase font-bold tracking-widest text-sm transition-all hover:scale-105">
|
|
View Verified Credential
|
|
</button>
|
|
</Link>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function Node({ data }: { data: { name: string, status: string } }) {
|
|
const isCompleted = data.status === "completed";
|
|
const isActive = data.status === "active";
|
|
const isLocked = data.status === "locked";
|
|
|
|
return (
|
|
<motion.div
|
|
whileHover={{ scale: isLocked ? 1 : 1.05 }}
|
|
className={`
|
|
relative p-4 border transition-all duration-300 backdrop-blur-sm cursor-default
|
|
${isCompleted ? "bg-secondary/10 border-secondary/50 text-white" : ""}
|
|
${isActive ? "bg-primary/10 border-primary text-white shadow-[0_0_15px_-5px_rgba(234,179,8,0.5)]" : ""}
|
|
${isLocked ? "bg-black/40 border-white/5 text-muted-foreground/50" : ""}
|
|
`}
|
|
>
|
|
<div className="flex justify-between items-center">
|
|
<span className="font-bold text-xs uppercase tracking-wider">{data.name}</span>
|
|
{isCompleted && <CheckCircle2 className="w-4 h-4 text-secondary" />}
|
|
{isActive && <div className="w-2 h-2 bg-primary rounded-full animate-pulse" />}
|
|
{isLocked && <Lock className="w-3 h-3" />}
|
|
</div>
|
|
|
|
{/* Progress Bar for Active */}
|
|
{isActive && (
|
|
<div className="mt-3 w-full h-1 bg-white/10 overflow-hidden">
|
|
<motion.div
|
|
initial={{ width: 0 }}
|
|
animate={{ width: "65%" }}
|
|
className="h-full bg-primary"
|
|
/>
|
|
</div>
|
|
)}
|
|
</motion.div>
|
|
)
|
|
}
|