Prettier format pending files
This commit is contained in:
parent
a2b99554be
commit
3e47387639
7 changed files with 419 additions and 266 deletions
|
|
@ -76,7 +76,10 @@ export default function CodeLayout({ children, hideFooter }: LayoutProps) {
|
|||
<header className="sticky top-0 z-50 border-b border-border/40 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60 animate-slide-down">
|
||||
<div className="container mx-auto flex min-h-16 h-auto items-center justify-between px-4 py-2 gap-2 min-w-0">
|
||||
{/* Logo */}
|
||||
<Link to="/" className="flex items-center space-x-3 hover-glow group shrink-0">
|
||||
<Link
|
||||
to="/"
|
||||
className="flex items-center space-x-3 hover-glow group shrink-0"
|
||||
>
|
||||
<div className="flex items-center space-x-3">
|
||||
<img
|
||||
src="https://cdn.builder.io/api/v1/image/assets%2Ffc53d607e21d497595ac97e0637001a1%2F3979ec9a8a28471d900a80e94e2c45fe?format=webp&width=800"
|
||||
|
|
@ -375,226 +378,226 @@ export default function CodeLayout({ children, hideFooter }: LayoutProps) {
|
|||
<main className="flex-1 w-full overflow-x-hidden">{children}</main>
|
||||
|
||||
{!hideFooter && (
|
||||
<footer className="border-t border-border/40 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60 animate-slide-up">
|
||||
<div className="container mx-auto px-4 py-12">
|
||||
<div className="grid grid-cols-1 md:grid-cols-4 gap-8">
|
||||
{/* Company Info */}
|
||||
<div className="space-y-4 animate-fade-in">
|
||||
<div className="flex items-center space-x-3 group">
|
||||
<img
|
||||
src="https://cdn.builder.io/api/v1/image/assets%2Ffc53d607e21d497595ac97e0637001a1%2F3979ec9a8a28471d900a80e94e2c45fe?format=webp&width=800"
|
||||
alt="AeThex Logo"
|
||||
className="h-6 w-6 transition-all duration-300 group-hover:scale-110 group-hover:rotate-6"
|
||||
/>
|
||||
<span className="font-bold text-gradient group-hover:animate-pulse">
|
||||
AeThex
|
||||
</span>
|
||||
<footer className="border-t border-border/40 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60 animate-slide-up">
|
||||
<div className="container mx-auto px-4 py-12">
|
||||
<div className="grid grid-cols-1 md:grid-cols-4 gap-8">
|
||||
{/* Company Info */}
|
||||
<div className="space-y-4 animate-fade-in">
|
||||
<div className="flex items-center space-x-3 group">
|
||||
<img
|
||||
src="https://cdn.builder.io/api/v1/image/assets%2Ffc53d607e21d497595ac97e0637001a1%2F3979ec9a8a28471d900a80e94e2c45fe?format=webp&width=800"
|
||||
alt="AeThex Logo"
|
||||
className="h-6 w-6 transition-all duration-300 group-hover:scale-110 group-hover:rotate-6"
|
||||
/>
|
||||
<span className="font-bold text-gradient group-hover:animate-pulse">
|
||||
AeThex
|
||||
</span>
|
||||
</div>
|
||||
<p className="text-sm text-muted-foreground hover:text-muted-foreground/80 transition-colors">
|
||||
Pushing the boundaries of technology through cutting-edge
|
||||
research and breakthrough discoveries.
|
||||
</p>
|
||||
<div className="space-y-2 text-sm text-muted-foreground">
|
||||
<p className="flex items-center gap-2">
|
||||
<span className="h-1.5 w-1.5 rounded-full bg-aethex-400/70" />
|
||||
Queen Creek, Arizona
|
||||
</p>
|
||||
<p className="flex items-center gap-2">
|
||||
<span className="h-1.5 w-1.5 rounded-full bg-aethex-400/70" />
|
||||
<a
|
||||
href="mailto:info@aethex.biz"
|
||||
className="hover:text-aethex-400 transition-colors"
|
||||
>
|
||||
info@aethex.biz
|
||||
</a>
|
||||
</p>
|
||||
<p className="flex items-center gap-2">
|
||||
<span className="h-1.5 w-1.5 rounded-full bg-aethex-400/70" />
|
||||
(346) 556-7100
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<p className="text-sm text-muted-foreground hover:text-muted-foreground/80 transition-colors">
|
||||
Pushing the boundaries of technology through cutting-edge
|
||||
research and breakthrough discoveries.
|
||||
|
||||
{/* Services */}
|
||||
<div
|
||||
className="space-y-4 animate-slide-up"
|
||||
style={{ animationDelay: "0.1s" }}
|
||||
>
|
||||
<h3 className="font-semibold text-foreground hover:text-gradient transition-all duration-300">
|
||||
Services
|
||||
</h3>
|
||||
<ul className="space-y-2 text-sm text-muted-foreground">
|
||||
<li>
|
||||
<Link
|
||||
to="/game-development"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Game Development
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/consulting"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Development Consulting
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/mentorship"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Mentorship Programs
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/research"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Research & Labs
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{/* Company */}
|
||||
<div
|
||||
className="space-y-4 animate-slide-up"
|
||||
style={{ animationDelay: "0.2s" }}
|
||||
>
|
||||
<h3 className="font-semibold text-foreground hover:text-gradient transition-all duration-300">
|
||||
Company
|
||||
</h3>
|
||||
<ul className="space-y-2 text-sm text-muted-foreground">
|
||||
<li>
|
||||
<Link
|
||||
to="/about"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
About AeThex
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/opportunities"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Opportunities
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/community"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Community Hub
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/changelog"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Changelog
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/status"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
System Status
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{/* Resources */}
|
||||
<div
|
||||
className="space-y-4 animate-slide-up"
|
||||
style={{ animationDelay: "0.3s" }}
|
||||
>
|
||||
<h3 className="font-semibold text-foreground hover:text-gradient transition-all duration-300">
|
||||
Resources
|
||||
</h3>
|
||||
<ul className="space-y-2 text-sm text-muted-foreground">
|
||||
<li>
|
||||
<Link
|
||||
to="/docs"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Documentation
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/tutorials"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Tutorials
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/blog"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Blog
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/support"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Support Center
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
className="mt-8 pt-8 border-t border-border/40 flex flex-col sm:flex-row justify-between items-center animate-fade-in"
|
||||
style={{ animationDelay: "0.4s" }}
|
||||
>
|
||||
<p className="text-xs text-muted-foreground hover:text-aethex-400 transition-colors">
|
||||
© 2024 AeThex Corporation. All rights reserved.
|
||||
</p>
|
||||
<div className="space-y-2 text-sm text-muted-foreground">
|
||||
<p className="flex items-center gap-2">
|
||||
<span className="h-1.5 w-1.5 rounded-full bg-aethex-400/70" />
|
||||
Queen Creek, Arizona
|
||||
</p>
|
||||
<p className="flex items-center gap-2">
|
||||
<span className="h-1.5 w-1.5 rounded-full bg-aethex-400/70" />
|
||||
<a
|
||||
href="mailto:info@aethex.biz"
|
||||
className="hover:text-aethex-400 transition-colors"
|
||||
>
|
||||
info@aethex.biz
|
||||
</a>
|
||||
</p>
|
||||
<p className="flex items-center gap-2">
|
||||
<span className="h-1.5 w-1.5 rounded-full bg-aethex-400/70" />
|
||||
(346) 556-7100
|
||||
</p>
|
||||
<div className="flex items-center space-x-4 mt-4 sm:mt-0">
|
||||
<Link
|
||||
to="/privacy"
|
||||
onClick={scrollToTop}
|
||||
className="text-xs text-muted-foreground hover:text-aethex-400 transition-all duration-300 hover:scale-105"
|
||||
>
|
||||
Privacy Policy
|
||||
</Link>
|
||||
<Link
|
||||
to="/terms"
|
||||
onClick={scrollToTop}
|
||||
className="text-xs text-muted-foreground hover:text-aethex-400 transition-all duration-300 hover:scale-105"
|
||||
>
|
||||
Terms of Service
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Services */}
|
||||
<div
|
||||
className="space-y-4 animate-slide-up"
|
||||
style={{ animationDelay: "0.1s" }}
|
||||
>
|
||||
<h3 className="font-semibold text-foreground hover:text-gradient transition-all duration-300">
|
||||
Services
|
||||
</h3>
|
||||
<ul className="space-y-2 text-sm text-muted-foreground">
|
||||
<li>
|
||||
<Link
|
||||
to="/game-development"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Game Development
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/consulting"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Development Consulting
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/mentorship"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Mentorship Programs
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/research"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Research & Labs
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{/* Company */}
|
||||
<div
|
||||
className="space-y-4 animate-slide-up"
|
||||
style={{ animationDelay: "0.2s" }}
|
||||
>
|
||||
<h3 className="font-semibold text-foreground hover:text-gradient transition-all duration-300">
|
||||
Company
|
||||
</h3>
|
||||
<ul className="space-y-2 text-sm text-muted-foreground">
|
||||
<li>
|
||||
<Link
|
||||
to="/about"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
About AeThex
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/opportunities"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Opportunities
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/community"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Community Hub
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/changelog"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Changelog
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/status"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
System Status
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{/* Resources */}
|
||||
<div
|
||||
className="space-y-4 animate-slide-up"
|
||||
style={{ animationDelay: "0.3s" }}
|
||||
>
|
||||
<h3 className="font-semibold text-foreground hover:text-gradient transition-all duration-300">
|
||||
Resources
|
||||
</h3>
|
||||
<ul className="space-y-2 text-sm text-muted-foreground">
|
||||
<li>
|
||||
<Link
|
||||
to="/docs"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Documentation
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/tutorials"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Tutorials
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/blog"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Blog
|
||||
</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link
|
||||
to="/support"
|
||||
onClick={scrollToTop}
|
||||
className="hover:text-aethex-400 transition-all duration-300 hover:translate-x-1 inline-block"
|
||||
>
|
||||
Support Center
|
||||
</Link>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
className="mt-8 pt-8 border-t border-border/40 flex flex-col sm:flex-row justify-between items-center animate-fade-in"
|
||||
style={{ animationDelay: "0.4s" }}
|
||||
>
|
||||
<p className="text-xs text-muted-foreground hover:text-aethex-400 transition-colors">
|
||||
© 2024 AeThex Corporation. All rights reserved.
|
||||
</p>
|
||||
<div className="flex items-center space-x-4 mt-4 sm:mt-0">
|
||||
<Link
|
||||
to="/privacy"
|
||||
onClick={scrollToTop}
|
||||
className="text-xs text-muted-foreground hover:text-aethex-400 transition-all duration-300 hover:scale-105"
|
||||
>
|
||||
Privacy Policy
|
||||
</Link>
|
||||
<Link
|
||||
to="/terms"
|
||||
onClick={scrollToTop}
|
||||
className="text-xs text-muted-foreground hover:text-aethex-400 transition-all duration-300 hover:scale-105"
|
||||
>
|
||||
Terms of Service
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</footer>
|
||||
)}
|
||||
|
||||
{/* Supabase Configuration Status */}
|
||||
|
|
|
|||
|
|
@ -863,7 +863,7 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({
|
|||
const { data, error } = await withTimeout(
|
||||
supabase.auth.updateUser({ password: newPassword }),
|
||||
8000,
|
||||
"Password update timed out"
|
||||
"Password update timed out",
|
||||
);
|
||||
if (error) throw error;
|
||||
if (data?.user) {
|
||||
|
|
|
|||
|
|
@ -868,7 +868,9 @@ export default function Dashboard() {
|
|||
onChange={async (e) => {
|
||||
const ensureBuckets = async () => {
|
||||
try {
|
||||
await fetch("/api/storage/ensure-buckets", { method: "POST" });
|
||||
await fetch("/api/storage/ensure-buckets", {
|
||||
method: "POST",
|
||||
});
|
||||
} catch {}
|
||||
};
|
||||
const file = e.target.files?.[0];
|
||||
|
|
@ -888,7 +890,10 @@ export default function Dashboard() {
|
|||
let { error } = await supabase.storage
|
||||
.from("avatars")
|
||||
.upload(path, file, { upsert: true });
|
||||
if (error && /bucket/i.test(error?.message || "")) {
|
||||
if (
|
||||
error &&
|
||||
/bucket/i.test(error?.message || "")
|
||||
) {
|
||||
await ensureBuckets();
|
||||
({ error } = await supabase.storage
|
||||
.from("avatars")
|
||||
|
|
@ -941,7 +946,9 @@ export default function Dashboard() {
|
|||
onChange={async (e) => {
|
||||
const ensureBuckets = async () => {
|
||||
try {
|
||||
await fetch("/api/storage/ensure-buckets", { method: "POST" });
|
||||
await fetch("/api/storage/ensure-buckets", {
|
||||
method: "POST",
|
||||
});
|
||||
} catch {}
|
||||
};
|
||||
const file = e.target.files?.[0];
|
||||
|
|
@ -961,7 +968,10 @@ export default function Dashboard() {
|
|||
let { error } = await supabase.storage
|
||||
.from("banners")
|
||||
.upload(path, file, { upsert: true });
|
||||
if (error && /bucket/i.test(error?.message || "")) {
|
||||
if (
|
||||
error &&
|
||||
/bucket/i.test(error?.message || "")
|
||||
) {
|
||||
await ensureBuckets();
|
||||
({ error } = await supabase.storage
|
||||
.from("banners")
|
||||
|
|
|
|||
|
|
@ -8,7 +8,18 @@ import {
|
|||
CardTitle,
|
||||
} from "@/components/ui/card";
|
||||
import { Link } from "react-router-dom";
|
||||
import { Microscope, Sparkles, ArrowRight, Rocket, Layers, Users, BookOpen, Terminal, Shield, Compass } from "lucide-react";
|
||||
import {
|
||||
Microscope,
|
||||
Sparkles,
|
||||
ArrowRight,
|
||||
Rocket,
|
||||
Layers,
|
||||
Users,
|
||||
BookOpen,
|
||||
Terminal,
|
||||
Shield,
|
||||
Compass,
|
||||
} from "lucide-react";
|
||||
import { useMemo } from "react";
|
||||
|
||||
export default function Explore() {
|
||||
|
|
@ -153,7 +164,6 @@ export default function Explore() {
|
|||
|
||||
return (
|
||||
<Layout>
|
||||
|
||||
{/* Achievements Section */}
|
||||
<section id="overview" className="py-16 sm:py-20 bg-background/30">
|
||||
<div className="container mx-auto px-4">
|
||||
|
|
@ -194,8 +204,12 @@ export default function Explore() {
|
|||
<section id="services" className="py-16 sm:py-20">
|
||||
<div className="container mx-auto px-4">
|
||||
<div className="text-center mb-12">
|
||||
<h2 className="text-3xl lg:text-4xl font-bold text-gradient">Core Areas</h2>
|
||||
<p className="text-muted-foreground mt-2">Services, programs, resources, and community</p>
|
||||
<h2 className="text-3xl lg:text-4xl font-bold text-gradient">
|
||||
Core Areas
|
||||
</h2>
|
||||
<p className="text-muted-foreground mt-2">
|
||||
Services, programs, resources, and community
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{(() => {
|
||||
|
|
@ -221,13 +235,18 @@ export default function Explore() {
|
|||
</div>
|
||||
)}
|
||||
</div>
|
||||
<CardDescription className={`text-sm ${offering.descriptionClass}`}>
|
||||
<CardDescription
|
||||
className={`text-sm ${offering.descriptionClass}`}
|
||||
>
|
||||
{offering.description}
|
||||
</CardDescription>
|
||||
{offering.tags && (
|
||||
<div className="flex flex-wrap gap-2 pt-1">
|
||||
{offering.tags.map((t: string) => (
|
||||
<span key={t} className="text-[10px] uppercase tracking-wide px-2 py-0.5 rounded border border-white/10 text-white/80">
|
||||
<span
|
||||
key={t}
|
||||
className="text-[10px] uppercase tracking-wide px-2 py-0.5 rounded border border-white/10 text-white/80"
|
||||
>
|
||||
{t}
|
||||
</span>
|
||||
))}
|
||||
|
|
@ -236,7 +255,10 @@ export default function Explore() {
|
|||
</CardHeader>
|
||||
<CardContent className="relative pt-2 mt-auto">
|
||||
{offering.link ? (
|
||||
<Button asChild className={`w-full ${offering.buttonClass || "bg-gradient-to-r from-aethex-500 to-neon-blue"}`}>
|
||||
<Button
|
||||
asChild
|
||||
className={`w-full ${offering.buttonClass || "bg-gradient-to-r from-aethex-500 to-neon-blue"}`}
|
||||
>
|
||||
<Link to={offering.link}>Learn More</Link>
|
||||
</Button>
|
||||
) : (
|
||||
|
|
@ -248,25 +270,43 @@ export default function Explore() {
|
|||
className={`w-full ${offering.actions[0].buttonClass || "border-border"}`}
|
||||
>
|
||||
{offering.actions[0].external ? (
|
||||
<a href={offering.actions[0].href} target="_blank" rel="noreferrer">{offering.actions[0].label}</a>
|
||||
<a
|
||||
href={offering.actions[0].href}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
{offering.actions[0].label}
|
||||
</a>
|
||||
) : (
|
||||
<Link to={offering.actions[0].href}>{offering.actions[0].label}</Link>
|
||||
<Link to={offering.actions[0].href}>
|
||||
{offering.actions[0].label}
|
||||
</Link>
|
||||
)}
|
||||
</Button>
|
||||
) : null}
|
||||
{offering.actions && offering.actions.length > 1 ? (
|
||||
<div className="mt-2 flex flex-wrap gap-3 justify-center text-xs text-muted-foreground">
|
||||
{offering.actions.slice(1).map((a: any) => (
|
||||
{offering.actions.slice(1).map((a: any) =>
|
||||
a.external ? (
|
||||
<a key={a.label} href={a.href} target="_blank" rel="noreferrer" className="hover:text-foreground/80">
|
||||
<a
|
||||
key={a.label}
|
||||
href={a.href}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="hover:text-foreground/80"
|
||||
>
|
||||
{a.label}
|
||||
</a>
|
||||
) : (
|
||||
<Link key={a.label} to={a.href} className="hover:text-foreground/80">
|
||||
<Link
|
||||
key={a.label}
|
||||
to={a.href}
|
||||
className="hover:text-foreground/80"
|
||||
>
|
||||
{a.label}
|
||||
</Link>
|
||||
)
|
||||
))}
|
||||
),
|
||||
)}
|
||||
</div>
|
||||
) : null}
|
||||
</>
|
||||
|
|
@ -287,20 +327,36 @@ export default function Explore() {
|
|||
<div className="pointer-events-none absolute inset-0 bg-gradient-to-br from-yellow-500/10 via-transparent to-transparent" />
|
||||
<CardContent className="p-8 grid grid-cols-1 md:grid-cols-2 gap-8 items-center">
|
||||
<div className="space-y-3">
|
||||
<div className="inline-flex items-center gap-2 rounded-full border border-yellow-400/40 px-3 py-1 text-xs uppercase tracking-widest">R&D</div>
|
||||
<div className="inline-flex items-center gap-2 rounded-full border border-yellow-400/40 px-3 py-1 text-xs uppercase tracking-widest">
|
||||
R&D
|
||||
</div>
|
||||
<h3 className="text-2xl font-bold flex items-center gap-2">
|
||||
<Microscope className="h-5 w-5 text-yellow-300" /> AeThex Labs
|
||||
</h3>
|
||||
<p className="text-yellow-100/80">
|
||||
Experimental interfaces, prototypes, and internal tooling. Enter the BlackSite to see what's next.
|
||||
Experimental interfaces, prototypes, and internal tooling.
|
||||
Enter the BlackSite to see what's next.
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex flex-col sm:flex-row gap-3 justify-end">
|
||||
<Button asChild className="bg-yellow-400 text-black hover:bg-yellow-300">
|
||||
<Button
|
||||
asChild
|
||||
className="bg-yellow-400 text-black hover:bg-yellow-300"
|
||||
>
|
||||
<Link to="/research">Open Interface</Link>
|
||||
</Button>
|
||||
<Button asChild variant="outline" className="border-yellow-400/60 text-yellow-200 hover:bg-yellow-500/10">
|
||||
<a href="https://labs.aethex.biz" target="_blank" rel="noreferrer">Visit labs.aethex.biz</a>
|
||||
<Button
|
||||
asChild
|
||||
variant="outline"
|
||||
className="border-yellow-400/60 text-yellow-200 hover:bg-yellow-500/10"
|
||||
>
|
||||
<a
|
||||
href="https://labs.aethex.biz"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
Visit labs.aethex.biz
|
||||
</a>
|
||||
</Button>
|
||||
</div>
|
||||
</CardContent>
|
||||
|
|
@ -309,7 +365,10 @@ export default function Explore() {
|
|||
</section>
|
||||
|
||||
{/* Technology Showcase */}
|
||||
<section id="technology" className="py-16 sm:py-20 relative overflow-hidden">
|
||||
<section
|
||||
id="technology"
|
||||
className="py-16 sm:py-20 relative overflow-hidden"
|
||||
>
|
||||
<div className="absolute inset-0 bg-gradient-to-r from-aethex-900/20 via-transparent to-neon-blue/20" />
|
||||
|
||||
<div className="container mx-auto px-4 relative z-10">
|
||||
|
|
@ -325,12 +384,48 @@ export default function Explore() {
|
|||
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 animate-fade-in">
|
||||
{[
|
||||
{ name: "Game Studios", status: "Active", color: "from-purple-500 to-blue-600", icon: Rocket, desc: "Production pipelines, content tooling, and live ops." },
|
||||
{ name: "Design Systems", status: "Evolving", color: "from-blue-500 to-green-600", icon: Layers, desc: "Unified components and patterns across apps." },
|
||||
{ name: "Creator Tools", status: "Live", color: "from-green-500 to-yellow-600", icon: Terminal, desc: "CLI, automation, and workflow accelerators." },
|
||||
{ name: "Launch Ops", status: "Scaling", color: "from-yellow-500 to-red-600", icon: Shield, desc: "Release orchestration, quality gates, and metrics." },
|
||||
{ name: "Content Pipeline", status: "In Progress", color: "from-red-500 to-purple-600", icon: BookOpen, desc: "Publishing, assets, and distribution systems." },
|
||||
{ name: "Edge Experiences", status: "Deployed", color: "from-purple-500 to-pink-600", icon: Users, desc: "Low-latency interfaces on the edge." },
|
||||
{
|
||||
name: "Game Studios",
|
||||
status: "Active",
|
||||
color: "from-purple-500 to-blue-600",
|
||||
icon: Rocket,
|
||||
desc: "Production pipelines, content tooling, and live ops.",
|
||||
},
|
||||
{
|
||||
name: "Design Systems",
|
||||
status: "Evolving",
|
||||
color: "from-blue-500 to-green-600",
|
||||
icon: Layers,
|
||||
desc: "Unified components and patterns across apps.",
|
||||
},
|
||||
{
|
||||
name: "Creator Tools",
|
||||
status: "Live",
|
||||
color: "from-green-500 to-yellow-600",
|
||||
icon: Terminal,
|
||||
desc: "CLI, automation, and workflow accelerators.",
|
||||
},
|
||||
{
|
||||
name: "Launch Ops",
|
||||
status: "Scaling",
|
||||
color: "from-yellow-500 to-red-600",
|
||||
icon: Shield,
|
||||
desc: "Release orchestration, quality gates, and metrics.",
|
||||
},
|
||||
{
|
||||
name: "Content Pipeline",
|
||||
status: "In Progress",
|
||||
color: "from-red-500 to-purple-600",
|
||||
icon: BookOpen,
|
||||
desc: "Publishing, assets, and distribution systems.",
|
||||
},
|
||||
{
|
||||
name: "Edge Experiences",
|
||||
status: "Deployed",
|
||||
color: "from-purple-500 to-pink-600",
|
||||
icon: Users,
|
||||
desc: "Low-latency interfaces on the edge.",
|
||||
},
|
||||
].map((tech, index) => (
|
||||
<Card
|
||||
key={index}
|
||||
|
|
@ -340,16 +435,24 @@ export default function Explore() {
|
|||
<CardContent className="p-6 space-y-3">
|
||||
<div className="flex items-center justify-between">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className={`w-9 h-9 rounded-md bg-gradient-to-r ${tech.color} grid place-items-center`}>
|
||||
<div
|
||||
className={`w-9 h-9 rounded-md bg-gradient-to-r ${tech.color} grid place-items-center`}
|
||||
>
|
||||
{/* @ts-ignore */}
|
||||
<tech.icon className="h-4 w-4 text-white" />
|
||||
</div>
|
||||
<h3 className="font-semibold text-foreground">{tech.name}</h3>
|
||||
<h3 className="font-semibold text-foreground">
|
||||
{tech.name}
|
||||
</h3>
|
||||
</div>
|
||||
<span className="text-xs px-2 py-0.5 rounded-full border border-white/10 text-muted-foreground">{tech.status}</span>
|
||||
<span className="text-xs px-2 py-0.5 rounded-full border border-white/10 text-muted-foreground">
|
||||
{tech.status}
|
||||
</span>
|
||||
</div>
|
||||
<p className="text-sm text-muted-foreground">{tech.desc}</p>
|
||||
<div className={`mt-1 h-[2px] w-16 rounded-full bg-gradient-to-r ${tech.color} opacity-60 group-hover:opacity-100 transition-opacity`} />
|
||||
<div
|
||||
className={`mt-1 h-[2px] w-16 rounded-full bg-gradient-to-r ${tech.color} opacity-60 group-hover:opacity-100 transition-opacity`}
|
||||
/>
|
||||
</CardContent>
|
||||
</Card>
|
||||
))}
|
||||
|
|
|
|||
|
|
@ -303,7 +303,8 @@ export default function Index() {
|
|||
Crafting Digital Realities
|
||||
</h2>
|
||||
<p className="text-lg text-muted-foreground max-w-2xl mx-auto animate-slide-up">
|
||||
Where vision meets execution. We craft experiences through design, development, and community.
|
||||
Where vision meets execution. We craft experiences through
|
||||
design, development, and community.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -325,14 +326,22 @@ export default function Index() {
|
|||
>
|
||||
<div className="pointer-events-none absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500 bg-gradient-to-br from-white/6 via-transparent to-white/0" />
|
||||
<CardContent className="p-5 sm:p-6 flex flex-col items-center text-center gap-3">
|
||||
<div className={`relative w-12 h-12 rounded-lg bg-gradient-to-r ${feature.color} grid place-items-center shadow-inner`}>
|
||||
<div
|
||||
className={`relative w-12 h-12 rounded-lg bg-gradient-to-r ${feature.color} grid place-items-center shadow-inner`}
|
||||
>
|
||||
<div className="absolute -inset-[2px] rounded-xl bg-gradient-to-r from-white/20 to-transparent blur-md opacity-0 group-hover:opacity-100 transition-opacity" />
|
||||
<Icon className="h-6 w-6 text-white drop-shadow" />
|
||||
</div>
|
||||
<h3 className="font-semibold text-sm tracking-wide">{feature.title}</h3>
|
||||
<h3 className="font-semibold text-sm tracking-wide">
|
||||
{feature.title}
|
||||
</h3>
|
||||
<div className="flex flex-wrap justify-center gap-2 min-h-[24px]">
|
||||
{(feature.tags || []).slice(0, 2).map((tag, i) => (
|
||||
<Badge key={i} variant="outline" className="border-white/10 text-xs text-foreground/80">
|
||||
<Badge
|
||||
key={i}
|
||||
variant="outline"
|
||||
className="border-white/10 text-xs text-foreground/80"
|
||||
>
|
||||
{tag}
|
||||
</Badge>
|
||||
))}
|
||||
|
|
@ -340,10 +349,15 @@ export default function Index() {
|
|||
<p className="text-xs text-muted-foreground line-clamp-2">
|
||||
{feature.description}
|
||||
</p>
|
||||
<div className={`mt-1 h-[2px] w-16 rounded-full bg-gradient-to-r ${feature.color} opacity-60 group-hover:opacity-100 transition-opacity`} />
|
||||
<div
|
||||
className={`mt-1 h-[2px] w-16 rounded-full bg-gradient-to-r ${feature.color} opacity-60 group-hover:opacity-100 transition-opacity`}
|
||||
/>
|
||||
{feature.link ? (
|
||||
<div className="pt-1">
|
||||
<Link to={feature.link} className="text-xs inline-flex items-center gap-1 text-aethex-300 hover:text-aethex-200">
|
||||
<Link
|
||||
to={feature.link}
|
||||
className="text-xs inline-flex items-center gap-1 text-aethex-300 hover:text-aethex-200"
|
||||
>
|
||||
Explore
|
||||
<ArrowRight className="h-3 w-3" />
|
||||
</Link>
|
||||
|
|
@ -372,14 +386,22 @@ export default function Index() {
|
|||
>
|
||||
<div className="pointer-events-none absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500 bg-gradient-to-br from-white/6 via-transparent to-white/0" />
|
||||
<CardContent className="p-5 sm:p-6 flex flex-col items-center text-center gap-3">
|
||||
<div className={`relative w-12 h-12 rounded-lg bg-gradient-to-r ${feature.color} grid place-items-center shadow-inner`}>
|
||||
<div
|
||||
className={`relative w-12 h-12 rounded-lg bg-gradient-to-r ${feature.color} grid place-items-center shadow-inner`}
|
||||
>
|
||||
<div className="absolute -inset-[2px] rounded-xl bg-gradient-to-r from-white/20 to-transparent blur-md opacity-0 group-hover:opacity-100 transition-opacity" />
|
||||
<Icon className="h-6 w-6 text-white drop-shadow" />
|
||||
</div>
|
||||
<h3 className="font-semibold text-sm tracking-wide">{feature.title}</h3>
|
||||
<h3 className="font-semibold text-sm tracking-wide">
|
||||
{feature.title}
|
||||
</h3>
|
||||
<div className="flex flex-wrap justify-center gap-2 min-h-[24px]">
|
||||
{(feature.tags || []).slice(0, 2).map((tag, i) => (
|
||||
<Badge key={i} variant="outline" className="border-white/10 text-xs text-foreground/80">
|
||||
<Badge
|
||||
key={i}
|
||||
variant="outline"
|
||||
className="border-white/10 text-xs text-foreground/80"
|
||||
>
|
||||
{tag}
|
||||
</Badge>
|
||||
))}
|
||||
|
|
@ -387,10 +409,15 @@ export default function Index() {
|
|||
<p className="text-xs text-muted-foreground line-clamp-2">
|
||||
{feature.description}
|
||||
</p>
|
||||
<div className={`mt-1 h-[2px] w-16 rounded-full bg-gradient-to-r ${feature.color} opacity-60 group-hover:opacity-100 transition-opacity`} />
|
||||
<div
|
||||
className={`mt-1 h-[2px] w-16 rounded-full bg-gradient-to-r ${feature.color} opacity-60 group-hover:opacity-100 transition-opacity`}
|
||||
/>
|
||||
{feature.link ? (
|
||||
<div className="pt-1">
|
||||
<Link to={feature.link} className="text-xs inline-flex items-center gap-1 text-aethex-300 hover:text-aethex-200">
|
||||
<Link
|
||||
to={feature.link}
|
||||
className="text-xs inline-flex items-center gap-1 text-aethex-300 hover:text-aethex-200"
|
||||
>
|
||||
Explore
|
||||
<ArrowRight className="h-3 w-3" />
|
||||
</Link>
|
||||
|
|
|
|||
|
|
@ -49,7 +49,10 @@ export default function ResetPassword() {
|
|||
const access_token = params.get("access_token");
|
||||
const refresh_token = params.get("refresh_token");
|
||||
if (access_token && refresh_token) {
|
||||
const { error: setErr } = await supabase.auth.setSession({ access_token, refresh_token });
|
||||
const { error: setErr } = await supabase.auth.setSession({
|
||||
access_token,
|
||||
refresh_token,
|
||||
});
|
||||
if (setErr) {
|
||||
setLinkError("Reset link is invalid or has expired.");
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -203,19 +203,26 @@ export function createServer() {
|
|||
// Storage administration endpoints (service role)
|
||||
app.post("/api/storage/ensure-buckets", async (_req, res) => {
|
||||
if (!adminSupabase) {
|
||||
return res.status(500).json({ error: "Supabase admin client unavailable" });
|
||||
return res
|
||||
.status(500)
|
||||
.json({ error: "Supabase admin client unavailable" });
|
||||
}
|
||||
try {
|
||||
const targets = [
|
||||
{ name: "avatars", public: true },
|
||||
{ name: "banners", public: true },
|
||||
];
|
||||
const { data: buckets } = await (adminSupabase as any).storage.listBuckets();
|
||||
const { data: buckets } = await (
|
||||
adminSupabase as any
|
||||
).storage.listBuckets();
|
||||
const existing = new Set((buckets || []).map((b: any) => b.name));
|
||||
const created: string[] = [];
|
||||
for (const t of targets) {
|
||||
if (!existing.has(t.name)) {
|
||||
const { error } = await (adminSupabase as any).storage.createBucket(t.name, { public: t.public });
|
||||
const { error } = await (adminSupabase as any).storage.createBucket(
|
||||
t.name,
|
||||
{ public: t.public },
|
||||
);
|
||||
if (error) {
|
||||
console.warn("Failed to create bucket", t.name, error);
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Reference in a new issue