Add downloads page and update roadmap with new milestones

Adds a new downloads page for desktop applications and integrates new milestones for desktop and mobile applications into the roadmap page.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 9203795e-937a-4306-b81d-b4d5c78c240e
Replit-Commit-Checkpoint-Type: intermediate_checkpoint
Replit-Commit-Event-Id: f42fc35c-b758-4fe4-9d6a-c616c5c45526
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/7c94b7a0-29c7-4f2e-94ef-44b2153872b7/9203795e-937a-4306-b81d-b4d5c78c240e/UJaB6ez
Replit-Helium-Checkpoint-Created: true
This commit is contained in:
sirpiglr 2025-12-06 02:13:39 +00:00
parent 41e271eb39
commit f208bce4b7
5 changed files with 518 additions and 31 deletions

View file

@ -52,6 +52,10 @@ externalPort = 80
localPort = 8044
externalPort = 3003
[[ports]]
localPort = 34265
externalPort = 3002
[[ports]]
localPort = 38557
externalPort = 3000

View file

@ -103,6 +103,7 @@ import StaffDashboard from "./pages/dashboards/StaffDashboard";
import Roadmap from "./pages/Roadmap";
import Trust from "./pages/Trust";
import PressKit from "./pages/PressKit";
import Downloads from "./pages/Downloads";
import Projects from "./pages/Projects";
import ProjectsAdmin from "./pages/ProjectsAdmin";
import Directory from "./pages/Directory";
@ -215,6 +216,7 @@ const App = () => (
<Route path="/roadmap" element={<Roadmap />} />
<Route path="/trust" element={<Trust />} />
<Route path="/press" element={<PressKit />} />
<Route path="/downloads" element={<Downloads />} />
<Route path="/projects" element={<Projects />} />
<Route
path="/projects/admin"

View file

@ -3,7 +3,7 @@ import { motion } from "framer-motion";
import { useNavigate, Link } from "react-router-dom";
import IsometricRealmCard, { RealmData } from "./IsometricRealmCard";
const REALM_COLORS = ["#a855f7", "#22c55e", "#ef4444", "#eab308", "#3b82f6"];
const REALM_COLORS = ["#a855f7", "#22c55e", "#ef4444", "#eab308", "#3b82f6", "#7c3aed", "#06b6d4"];
interface ParticleData {
id: number;
@ -75,6 +75,24 @@ const realms: RealmData[] = [
description: "Enterprise solutions. Managed services for teams and organizations.",
features: ["Dedicated support", "Custom integrations", "SLA guarantees"],
},
{
id: "staff",
label: "STAFF",
color: "#7c3aed",
route: "/staff",
icon: "⚡",
description: "Internal operations and team management for AeThex staff members.",
features: ["Team coordination", "Admin tools", "Operations hub"],
},
{
id: "devlink",
label: "DEV-LINK",
color: "#06b6d4",
route: "/devlink",
icon: "🔗",
description: "Developer networking and collaboration. Connect with fellow builders.",
features: ["Developer profiles", "Skill matching", "Collaboration tools"],
},
];
export default function IsometricRealmSelector() {
@ -188,12 +206,30 @@ export default function IsometricRealmSelector() {
{/* Main content */}
<main className="selector-main">
<motion.div
className="hero-text"
className="hero-intro"
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.2 }}
>
<h1>Select Your Realm</h1>
<p className="tagline">Build the Future</p>
<h1 className="main-headline">The Platform for Builders</h1>
<p className="sub-headline">
AeThex is an advanced development platform and community where creators collaborate,
learn, and bring ideas to life. Join thousands of developers, designers, and innovators.
</p>
<div className="hero-cta">
<Link to="/get-started" className="cta-primary">Get Started Free</Link>
<Link to="/downloads" className="cta-secondary">Download Desktop App</Link>
</div>
</motion.div>
<motion.div
className="hero-text"
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.4 }}
>
<h2>Select Your Realm</h2>
<p>Each realm unlocks a unique experience tailored to your journey</p>
</motion.div>
@ -210,18 +246,50 @@ export default function IsometricRealmSelector() {
</div>
<motion.div
className="footer-links"
className="footer-section"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.6, delay: 0.8 }}
>
<Link to="/community">Community</Link>
<span className="divider"></span>
<Link to="/developers">Developers</Link>
<span className="divider"></span>
<Link to="/roadmap">Roadmap</Link>
<span className="divider"></span>
<Link to="/realms">All Realms</Link>
<div className="footer-grid">
<div className="footer-col">
<h4>Platform</h4>
<Link to="/downloads">Downloads</Link>
<Link to="/roadmap">Roadmap</Link>
<Link to="/changelog">Changelog</Link>
<Link to="/status">Status</Link>
</div>
<div className="footer-col">
<h4>Community</h4>
<Link to="/community">Community Hub</Link>
<Link to="/creators">Creators</Link>
<Link to="/developers">Developers</Link>
<Link to="/blog">Blog</Link>
</div>
<div className="footer-col">
<h4>Company</h4>
<Link to="/about">About</Link>
<Link to="/careers">Careers</Link>
<Link to="/press">Press Kit</Link>
<Link to="/contact">Contact</Link>
</div>
<div className="footer-col">
<h4>Legal</h4>
<Link to="/privacy">Privacy</Link>
<Link to="/terms">Terms</Link>
<Link to="/trust">Trust Center</Link>
</div>
</div>
<div className="footer-bottom">
<p>&copy; 2024 AeThex. All rights reserved.</p>
<div className="footer-links-simple">
<a href="https://discord.gg/aethex" target="_blank" rel="noopener noreferrer">Discord</a>
<span className="divider"></span>
<a href="https://twitter.com/aethexdev" target="_blank" rel="noopener noreferrer">Twitter</a>
<span className="divider"></span>
<a href="https://github.com/aethex" target="_blank" rel="noopener noreferrer">GitHub</a>
</div>
</div>
</motion.div>
</main>
@ -319,13 +387,89 @@ export default function IsometricRealmSelector() {
padding: 20px 40px;
}
.hero-intro {
text-align: center;
margin-bottom: 60px;
padding: 40px 0;
}
.tagline {
font-size: 14px;
font-weight: 600;
color: #a855f7;
text-transform: uppercase;
letter-spacing: 0.15em;
margin-bottom: 16px;
}
.main-headline {
font-size: clamp(40px, 6vw, 64px);
font-weight: 800;
margin-bottom: 20px;
background: linear-gradient(135deg, #ffffff 0%, #a855f7 50%, #3b82f6 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
line-height: 1.1;
}
.sub-headline {
font-size: 18px;
color: #94a3b8;
max-width: 600px;
margin: 0 auto 32px;
line-height: 1.6;
}
.hero-cta {
display: flex;
justify-content: center;
gap: 16px;
flex-wrap: wrap;
}
.cta-primary {
padding: 14px 32px;
border-radius: 12px;
background: linear-gradient(135deg, #a855f7 0%, #7c3aed 100%);
color: white;
font-size: 15px;
font-weight: 600;
text-decoration: none;
transition: all 0.3s ease;
box-shadow: 0 4px 20px rgba(168, 85, 247, 0.3);
}
.cta-primary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 30px rgba(168, 85, 247, 0.4);
}
.cta-secondary {
padding: 14px 32px;
border-radius: 12px;
border: 1px solid #334155;
background: rgba(30, 41, 59, 0.5);
color: #e5e7eb;
font-size: 15px;
font-weight: 600;
text-decoration: none;
transition: all 0.3s ease;
}
.cta-secondary:hover {
background: rgba(30, 41, 59, 0.8);
border-color: #475569;
transform: translateY(-2px);
}
.hero-text {
text-align: center;
margin-bottom: 50px;
}
.hero-text h1 {
font-size: clamp(32px, 5vw, 48px);
.hero-text h2 {
font-size: clamp(28px, 4vw, 40px);
font-weight: 700;
margin-bottom: 12px;
background: linear-gradient(135deg, #e5e7eb 0%, #94a3b8 100%);
@ -343,44 +487,98 @@ export default function IsometricRealmSelector() {
.realms-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 32px;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
gap: 24px;
justify-items: center;
perspective: 2000px;
}
@media (min-width: 1200px) {
@media (min-width: 900px) {
.realms-grid {
grid-template-columns: repeat(3, 1fr);
}
}
@media (min-width: 1600px) {
@media (min-width: 1200px) {
.realms-grid {
grid-template-columns: repeat(5, 1fr);
grid-template-columns: repeat(4, 1fr);
}
}
.footer-links {
display: flex;
justify-content: center;
align-items: center;
gap: 16px;
margin-top: 60px;
font-size: 14px;
@media (min-width: 1600px) {
.realms-grid {
grid-template-columns: repeat(7, 1fr);
}
}
.footer-links a {
.footer-section {
margin-top: 80px;
padding-top: 40px;
border-top: 1px solid #1e293b;
}
.footer-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 32px;
margin-bottom: 40px;
}
.footer-col h4 {
font-size: 13px;
font-weight: 600;
color: #e5e7eb;
margin-bottom: 16px;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.footer-col a {
display: block;
font-size: 14px;
color: #64748b;
text-decoration: none;
margin-bottom: 10px;
transition: color 0.2s ease;
}
.footer-col a:hover {
color: #a855f7;
}
.footer-bottom {
display: flex;
justify-content: space-between;
align-items: center;
padding-top: 24px;
border-top: 1px solid #1e293b;
flex-wrap: wrap;
gap: 16px;
}
.footer-bottom p {
font-size: 13px;
color: #475569;
}
.footer-links-simple {
display: flex;
align-items: center;
gap: 12px;
font-size: 13px;
}
.footer-links-simple a {
color: #64748b;
text-decoration: none;
transition: color 0.2s ease;
}
.footer-links a:hover {
.footer-links-simple a:hover {
color: #e5e7eb;
}
.footer-links .divider {
.footer-links-simple .divider {
color: #334155;
}
@ -395,17 +593,46 @@ export default function IsometricRealmSelector() {
padding: 20px;
}
.hero-intro {
padding: 20px 0;
margin-bottom: 40px;
}
.sub-headline {
font-size: 16px;
}
.hero-cta {
flex-direction: column;
align-items: center;
}
.cta-primary, .cta-secondary {
width: 100%;
max-width: 280px;
text-align: center;
}
.hero-text {
margin-bottom: 32px;
}
.realms-grid {
gap: 20px;
}
.footer-section {
margin-top: 50px;
}
.footer-grid {
grid-template-columns: repeat(2, 1fr);
gap: 24px;
}
.footer-links {
flex-wrap: wrap;
margin-top: 40px;
.footer-bottom {
flex-direction: column;
text-align: center;
}
}
`}</style>

218
client/pages/Downloads.tsx Normal file
View file

@ -0,0 +1,218 @@
import { useState } from "react";
import Layout from "@/components/Layout";
import SEO from "@/components/SEO";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
import { Badge } from "@/components/ui/badge";
import { Monitor, Apple, Terminal, Smartphone, Clock, CheckCircle2, Download, ExternalLink } from "lucide-react";
const CURRENT_VERSION = "0.1.0";
const RELEASE_DATE = "December 2024";
interface PlatformDownload {
id: string;
name: string;
icon: React.ReactNode;
description: string;
fileName: string;
fileSize: string;
available: boolean;
requirements: string[];
}
const platforms: PlatformDownload[] = [
{
id: "windows",
name: "Windows",
icon: <Monitor className="h-8 w-8" />,
description: "Windows 10 or later (64-bit)",
fileName: `AeThex-Desktop-Terminal-${CURRENT_VERSION}-win-x64.exe`,
fileSize: "~120 MB",
available: true,
requirements: ["Windows 10 or later", "64-bit processor", "4 GB RAM minimum"],
},
{
id: "macos",
name: "macOS",
icon: <Apple className="h-8 w-8" />,
description: "macOS 10.15 (Catalina) or later",
fileName: `AeThex-Desktop-Terminal-${CURRENT_VERSION}-mac-universal.dmg`,
fileSize: "~130 MB",
available: true,
requirements: ["macOS 10.15 or later", "Apple Silicon or Intel", "4 GB RAM minimum"],
},
{
id: "linux",
name: "Linux",
icon: <Terminal className="h-8 w-8" />,
description: "Ubuntu 20.04+, Debian 10+, Fedora 32+",
fileName: `AeThex-Desktop-Terminal-${CURRENT_VERSION}-x64.AppImage`,
fileSize: "~115 MB",
available: true,
requirements: ["64-bit Linux distribution", "GTK 3.0+", "4 GB RAM minimum"],
},
];
const features = [
"File watcher overlay for real-time project monitoring",
"Quick access to all AeThex realms from your desktop",
"Discord integration with status sync",
"Offline mode for viewing cached content",
"Native notifications for opportunities and messages",
"Secure local credential storage",
];
export default function Downloads() {
const [selectedPlatform, setSelectedPlatform] = useState<string | null>(null);
const handleDownload = (platform: PlatformDownload) => {
setSelectedPlatform(platform.id);
const releaseUrl = `https://github.com/aethex/aethex-forge/releases/latest`;
window.open(releaseUrl, "_blank");
};
return (
<Layout>
<SEO
pageTitle="Downloads | AeThex"
description="Download the AeThex Desktop Terminal for Windows, macOS, and Linux. Access all AeThex features from your desktop."
/>
<div className="min-h-screen bg-aethex-gradient py-12">
<div className="container mx-auto px-4 max-w-6xl">
<div className="text-center mb-12">
<Badge variant="outline" className="mb-4 border-purple-500/50 text-purple-400">
Version {CURRENT_VERSION}
</Badge>
<h1 className="text-4xl md:text-5xl font-bold mb-4 bg-gradient-to-r from-white via-purple-400 to-blue-400 bg-clip-text text-transparent">
Download AeThex Desktop
</h1>
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
The AeThex Desktop Terminal brings the full power of the platform to your computer.
Access realms, manage projects, and stay connected with your community.
</p>
</div>
<div className="grid md:grid-cols-3 gap-6 mb-12">
{platforms.map((platform) => (
<Card
key={platform.id}
className={`bg-card/50 backdrop-blur-sm border transition-all duration-300 hover:border-purple-500/50 ${
selectedPlatform === platform.id ? "border-purple-500 ring-2 ring-purple-500/20" : "border-border/50"
}`}
>
<CardHeader className="text-center">
<div className="mx-auto mb-4 p-4 rounded-full bg-gradient-to-br from-purple-500/20 to-blue-500/20 border border-purple-500/20 text-purple-400">
{platform.icon}
</div>
<CardTitle className="text-xl">{platform.name}</CardTitle>
<CardDescription>{platform.description}</CardDescription>
</CardHeader>
<CardContent className="space-y-4">
<div className="text-sm text-muted-foreground space-y-1">
<p className="font-mono text-xs truncate">{platform.fileName}</p>
<p>Size: {platform.fileSize}</p>
</div>
{platform.available ? (
<Button
className="w-full bg-gradient-to-r from-purple-600 to-blue-600 hover:from-purple-700 hover:to-blue-700"
onClick={() => handleDownload(platform)}
>
<Download className="h-4 w-4 mr-2" />
Download for {platform.name}
</Button>
) : (
<Button className="w-full" variant="secondary" disabled>
<Clock className="h-4 w-4 mr-2" />
Coming Soon
</Button>
)}
<div className="pt-4 border-t border-border/30">
<p className="text-xs font-medium text-muted-foreground mb-2">Requirements:</p>
<ul className="text-xs text-muted-foreground space-y-1">
{platform.requirements.map((req, i) => (
<li key={i} className="flex items-start gap-2">
<CheckCircle2 className="h-3 w-3 mt-0.5 text-green-500 shrink-0" />
{req}
</li>
))}
</ul>
</div>
</CardContent>
</Card>
))}
</div>
<Card className="bg-card/50 backdrop-blur-sm border border-border/50 mb-12">
<CardHeader>
<CardTitle>Desktop Features</CardTitle>
<CardDescription>Everything you need to be productive on your desktop</CardDescription>
</CardHeader>
<CardContent>
<div className="grid md:grid-cols-2 gap-4">
{features.map((feature, i) => (
<div key={i} className="flex items-start gap-3">
<CheckCircle2 className="h-5 w-5 text-purple-500 shrink-0 mt-0.5" />
<span className="text-sm">{feature}</span>
</div>
))}
</div>
</CardContent>
</Card>
<Card className="bg-gradient-to-br from-slate-800/50 to-purple-900/20 border border-purple-500/20 mb-12">
<CardHeader className="text-center">
<div className="mx-auto mb-4 p-4 rounded-full bg-purple-500/10 border border-purple-500/20">
<Smartphone className="h-8 w-8 text-purple-400" />
</div>
<CardTitle>Mobile Apps</CardTitle>
<CardDescription>iOS and Android apps are coming soon</CardDescription>
</CardHeader>
<CardContent className="text-center">
<p className="text-muted-foreground mb-4">
Stay connected on the go. Our mobile apps will bring notifications, messaging,
and quick actions to your pocket.
</p>
<div className="flex justify-center gap-4">
<Badge variant="outline" className="border-slate-600">
<Apple className="h-3 w-3 mr-1" />
iOS - Coming Q2 2025
</Badge>
<Badge variant="outline" className="border-slate-600">
<Smartphone className="h-3 w-3 mr-1" />
Android - Coming Q2 2025
</Badge>
</div>
</CardContent>
</Card>
<div className="text-center space-y-4">
<p className="text-sm text-muted-foreground">
Released {RELEASE_DATE} <a href="/changelog" className="text-purple-400 hover:underline">View changelog</a>
</p>
<div className="flex justify-center gap-4">
<a
href="https://github.com/aethex/aethex-forge/releases"
target="_blank"
rel="noopener noreferrer"
className="text-sm text-muted-foreground hover:text-foreground flex items-center gap-1"
>
<ExternalLink className="h-3 w-3" />
All releases
</a>
<a
href="/roadmap"
className="text-sm text-muted-foreground hover:text-foreground flex items-center gap-1"
>
<ExternalLink className="h-3 w-3" />
View roadmap
</a>
</div>
</div>
</div>
</div>
</Layout>
);
}

View file

@ -58,6 +58,13 @@ const QUESTS: Quest[] = [
phase: "now",
description: "Consistent top-level labels, fewer detours.",
},
{
id: "desktop-app",
title: "Desktop App (Beta)",
xp: 200,
phase: "now",
description: "Windows, macOS, Linux builds with file watcher overlay.",
},
{
id: "mentor-admin",
title: "Mentorship admin flows",
@ -128,6 +135,27 @@ const QUESTS: Quest[] = [
phase: "month3",
description: "This page—interactive and fun.",
},
{
id: "desktop-stable",
title: "Desktop App (Stable)",
xp: 180,
phase: "month2",
description: "Auto-updates, crash reporting, performance tuning.",
},
{
id: "mobile-ios",
title: "iOS App (Beta)",
xp: 250,
phase: "month3",
description: "Native iOS app with notifications and quick actions.",
},
{
id: "mobile-android",
title: "Android App (Beta)",
xp: 250,
phase: "month3",
description: "Native Android app with notifications and quick actions.",
},
];
const PEEKS: Peek[] = [
@ -155,6 +183,14 @@ const PEEKS: Peek[] = [
image:
"https://images.unsplash.com/photo-1553877522-43269d4ea984?q=80&w=1600&auto=format&fit=crop",
},
{
id: "peek-4",
title: "Mobile App Preview",
phase: "month3",
teaser: "Native iOS and Android apps with push notifications.",
image:
"https://images.unsplash.com/photo-1512941937669-90a1b58e7e9c?q=80&w=1600&auto=format&fit=crop",
},
];
const storageKey = "aethex_roadmap_unlocks_v1";