Prettier format pending files

This commit is contained in:
Builder.io 2025-10-18 02:16:30 +00:00
parent a2b99554be
commit 3e47387639
7 changed files with 419 additions and 266 deletions

View file

@ -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 */}

View file

@ -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) {

View file

@ -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")

View file

@ -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>
))}

View file

@ -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>

View file

@ -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;

View file

@ -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 {