10 Commits

Author SHA1 Message Date
d16d4e02e0 refactor: standardize Tailwind class syntax and component usage
- Replaced arbitrary CSS values with standard Tailwind utilities (e.g., `bottom-[-18rem]` → `-bottom-72`, `mt-[-2rem]` → `-mt-8`)
- Fixed invalid gradient syntax by removing `bg-` prefix from gradient utilities
- Consolidated text styling by replacing inline elements with CT/CP text components
- Adjusted CT component typography from semibold to medium for better visual hierarchy
2025-11-10 15:28:17 +01:00
2865b1e1fd refactor: replace wrapper div with React fragment in ComputePage 2025-11-08 01:11:43 +01:00
b723f889cb fix: remove duplicate lg:bg-transparent class in mobile menu 2025-11-08 01:07:13 +01:00
2752c690d6 chore: remove archived image assets 2025-11-08 01:03:09 +01:00
a7dd803da2 refactor: standardize background color to #121212
- Replaced inconsistent gray-900 and #171717 background colors with unified #121212 across all pages
- Removed unused imports from multiple component files
- Cleaned up trailing spaces in className attributes
2025-11-08 01:02:42 +01:00
22e2e4b80c feat: replace static icons with animated SVG components in GPU capabilities
- Replaced Heroicons with custom animated SVG components for each GPU capability card
- Added four new animation components: InterferenceAnimation, KubernetesAcceleration, RenderingSimulation, and RAGPipeline
- Updated card layout to accommodate full-width animations above text content
2025-11-08 00:56:07 +01:00
5ab909bd12 feat: add breadcrumb navigation and redesign GPU page sections
- Implemented breadcrumb-style navigation in header dropdown showing "Cloud > [Section]" for compute, storage, and GPU pages
- Redesigned GPU page components with dark theme, horizontal card sliders, and improved visual hierarchy
- Updated CallToAction components across multiple pages with consistent background colors and border styling
2025-11-08 00:40:33 +01:00
61cbaae7e0 refactor: simplify infinite-moving-cards and redesign agents page layout
- Removed getDirection callback in favor of inline style calculation for cleaner animation control
- Replaced BentoSection and AgentComponents with unified AgentBento component featuring video backgrounds and updated card structure
- Standardized border styling across CallToAction components (gray-700 → gray-800) for consistent visual hierarchy
2025-11-07 23:56:54 +01:00
f46482e0f4 feat: redesign CallToAction section with bordered card layout
- Replaced animated circle background with bordered container design using gray-700 borders
- Updated background colors to darker theme (#121212 and #090909) for improved contrast
- Changed button styling from white to cyan for primary action
2025-11-07 23:37:44 +01:00
ee6b5458de feat: convert network use cases to horizontal carousel with icons
- Replaced static grid layout with scrollable carousel supporting touch/mouse navigation
- Added hero icons to each use case card for visual hierarchy
- Introduced intro card with navigation controls and updated styling for better mobile experience
2025-11-07 23:34:27 +01:00
88 changed files with 1522 additions and 448 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 497 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 431 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 878 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 938 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

BIN
public/images/pods.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

View File

@@ -24,8 +24,7 @@ export function Header() {
if (currentPath.startsWith('/compute')) return 'Compute'; if (currentPath.startsWith('/compute')) return 'Compute';
if (currentPath.startsWith('/storage')) return 'Storage'; if (currentPath.startsWith('/storage')) return 'Storage';
if (currentPath.startsWith('/gpu')) return 'GPU'; if (currentPath.startsWith('/gpu')) return 'GPU';
if (currentPath.startsWith('/cloud')) return 'Cloud'; return 'Cloud';
return 'Cloud';
}; };
return ( return (
@@ -40,7 +39,14 @@ export function Header() {
<Dropdown <Dropdown
buttonContent={ buttonContent={
<> <>
{getCurrentPageName()} {['Compute', 'Storage', 'GPU'].includes(getCurrentPageName()) ? (
<>
<span className="text-gray-500">Cloud {' >'} </span>
<span>{getCurrentPageName()}</span>
</>
) : (
'Cloud'
)}
<ChevronDownIcon className="h-5 w-5" aria-hidden="true" /> <ChevronDownIcon className="h-5 w-5" aria-hidden="true" />
</> </>
} }
@@ -90,7 +96,7 @@ export function Header() {
</nav> </nav>
<Dialog as="div" className="lg:hidden" open={mobileMenuOpen} onClose={setMobileMenuOpen}> <Dialog as="div" className="lg:hidden" open={mobileMenuOpen} onClose={setMobileMenuOpen}>
<div className="fixed inset-0 z-10" /> <div className="fixed inset-0 z-10" />
<Dialog.Panel className="fixed inset-y-0 right-0 z-10 w-full overflow-y-auto lg:bg-transparent bg-white px-6 py-6 sm:max-w-sm sm:ring-1 sm:ring-gray-900/10"> <Dialog.Panel className="fixed inset-y-0 right-0 z-10 w-full overflow-y-auto lg:bg-transparent lg:bg-transparent bg-white px-6 py-6 sm:max-w-sm sm:ring-1 sm:ring-gray-900/10">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<Link to="#" className="-m-1.5 p-1.5"> <Link to="#" className="-m-1.5 p-1.5">
<span className="sr-only">Mycelium</span> <span className="sr-only">Mycelium</span>

View File

@@ -162,5 +162,5 @@ export const DownloadCardDescription = createTextComponent(
'text-base/7 leading-normal tracking-normal' 'text-base/7 leading-normal tracking-normal'
) )
export const CT = createTextComponent('span', 'text-lg lg:text-xl font-semibold') export const CT = createTextComponent('span', 'text-base lg:text-lg font-medium')
export const CP = createTextComponent('p', 'text-sm lg:text-base tracking-wide leading-tight font-light') export const CP = createTextComponent('p', 'text-sm lg:text-base tracking-wide leading-tight font-light')

View File

@@ -20,15 +20,6 @@ export const InfiniteMovingCards = ({
const scrollerRef = React.useRef<HTMLUListElement>(null); const scrollerRef = React.useRef<HTMLUListElement>(null);
const [start, setStart] = useState(false); const [start, setStart] = useState(false);
const getDirection = useCallback(() => {
if (containerRef.current) {
if (direction === "left") {
containerRef.current.style.setProperty("--animation-direction", "forwards");
} else {
containerRef.current.style.setProperty("--animation-direction", "reverse");
}
}
}, [direction]);
const getSpeed = useCallback(() => { const getSpeed = useCallback(() => {
if (containerRef.current) { if (containerRef.current) {
@@ -53,11 +44,10 @@ export const InfiniteMovingCards = ({
} }
}); });
getDirection();
getSpeed(); getSpeed();
setStart(true); setStart(true);
} }
}, [getDirection, getSpeed]); }, [getSpeed]);
useEffect(() => { useEffect(() => {
addAnimation(); addAnimation();
@@ -75,6 +65,9 @@ export const InfiniteMovingCards = ({
start && "animate-scroll", start && "animate-scroll",
pauseOnHover && "hover:[animation-play-state:paused]", pauseOnHover && "hover:[animation-play-state:paused]",
)} )}
style={{
"--animation-direction": direction === "left" ? "forwards" : "reverse",
} as React.CSSProperties}
> >
{items.map((item, idx) => ( {items.map((item, idx) => (
<li className="relative flex-shrink-0" key={idx}> <li className="relative flex-shrink-0" key={idx}>

View File

@@ -1,7 +1,7 @@
import { StrictMode } from 'react' import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client' import { createRoot } from 'react-dom/client'
import './styles/tailwind.css' import './styles/tailwind.css'
import App from './App.tsx' import App from './App'
createRoot(document.getElementById('root')!).render( createRoot(document.getElementById('root')!).render(
<StrictMode> <StrictMode>

View File

@@ -0,0 +1,157 @@
"use client";
import { Eyebrow, H3, P } from "@/components/Texts";
const bentos = [
{
id: "core",
eyebrow: "ARCHITECTURE",
title: "Deterministic by Design",
description:
"Every workload runs exactly as declared: no drift, no hidden state, no surprises.",
video: null,
colSpan: "lg:col-span-3",
rowSpan: "lg:row-span-1",
custom: true,
noBorder: true,
},
// ✅ Updated Bento Cards
{
id: "fungistor",
title: "FungiStor",
subtitle: "Long-Term AI Memory",
description:
"Erasure coding + compression slash storage bloat by up to 10× vs basic replication. Source-encrypted shards are geo-dispersed—lose pieces, rebuild perfectly from a quorum.",
video: "/videos/fungistor.mp4",
colSpan: "lg:col-span-3",
rowSpan: "lg:row-span-1",
},
{
id: "herodb",
title: "HeroDB",
subtitle: "Active AI Memory",
description:
"Multimodal vector+keyword retrieval makes RAG feel instant across text, image, audio. Time-aware, policy-guarded context keeps results fresh while access stays governed.",
video: "/videos/herodb.mp4",
colSpan: "lg:col-span-3",
rowSpan: "lg:row-span-1",
},
{
id: "mos",
title: "MOS Sandboxes",
subtitle: "Secure Agent Workspaces",
description:
"Attested, signed workspaces spin up ≈5s worldwide—ready to execute. Hardware isolation and scoped egress: run hard, tear down clean, zero residue.",
video: "/videos/herodb.mp4",
colSpan: "lg:col-span-3",
rowSpan: "lg:row-span-1",
},
{
id: "mesh",
title: "Mycelium Mesh",
subtitle: "Secure Communication Network",
description:
"A private, public-key fabric with self-healing multi-path routing. Glides through NATs and firewalls—direct, low-latency, no middlemen.",
video: "/videos/mesh.mp4",
colSpan: "lg:col-span-2",
rowSpan: "lg:row-span-1",
},
{
id: "deterministic",
title: "Deterministic Deployment",
subtitle: "Verifiable Code Execution",
description:
"Declare intent, get a hash; remote attestation proves that is what runs. Reproducible builds, signed artifacts, immutable logs—supply chain, sealed.",
video: "/videos/deterministic.mp4",
colSpan: "lg:col-span-2",
rowSpan: "lg:row-span-1",
},
{
id: "agent-coordination",
title: "Agent Coordination",
subtitle: "Sovereign Workflow Management",
description:
"Your private agent conducts swarms of specialists in parallel. Policies fan out work; human checkpoints keep you in command.",
video: "/videos/agent.mp4",
colSpan: "lg:col-span-2",
rowSpan: "lg:row-span-1",
},
];
export function AgentBento() {
return (
<section className="relative w-full bg-[#121212] overflow-hidden">
<div className="max-w-7xl bg-[#121212] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
<div className="w-full border-t border-l border-r border-gray-800" />
<div className="mx-auto bg-[#111111] max-w-2xl px-6 lg:max-w-7xl lg:px-10 border border-t-0 border-b-0 border-gray-800">
<div className="grid grid-cols-1 gap-6 pt-6 lg:grid-cols-6 lg:grid-rows-3 pb-6">
{bentos.map((card) => (
<div
key={card.id}
className={`relative ${card.colSpan} ${card.rowSpan} transition-transform duration-300 hover:scale-102 group`}
>
{!card.noBorder && (
<div
className={`absolute inset-0 rounded-md border border-gray-800 bg-[#111212] `}
/>
)}
<div
className={`relative flex lg:h-90 flex-col overflow-hidden rounded-[calc(var(--radius-lg)+1px)] `}
>
{/* ✅ VIDEO instead of animation */}
{card.video ? (
<div className="lg:h-64 h-48 w-full overflow-hidden bg-transparent flex items-center">
<video
src={card.video}
autoPlay
loop
muted
playsInline
className="w-full h-full object-cover"
/>
</div>
) : (
<div className="h-48 w-full flex items-center justify-center bg-transparent" />
)}
<div className="px-8 pt-4 pb-6">
{card.custom ? (
<>
{card.eyebrow && <Eyebrow>{card.eyebrow}</Eyebrow>}
<H3 className="mt-2 text-white">{card.title}</H3>
<P className="mt-4 max-w-lg text-gray-200">{card.description}</P>
</>
) : (
<>
{/* ✅ NEW SUBTITLE */}
<p className="text-sm text-cyan-400">{card.subtitle}</p>
<p className="mt-1 text-lg font-medium lg:text-xl tracking-tight text-white">
{card.title}
</p>
<p className="mt-1 max-w-lg text-sm/6 text-gray-200">
{card.description}
</p>
</>
)}
</div>
</div>
{!card.noBorder && (
<div
className={`pointer-events-none absolute inset-0 rounded-lg shadow-sm outline outline-black/5 `}
/>
)}
</div>
))}
</div>
</div>
</section>
);
}

View File

@@ -2,10 +2,9 @@ import { AnimatedSection } from '../../components/AnimatedSection'
import { DeploySection } from './DeploySection' import { DeploySection } from './DeploySection'
import { GallerySection } from './GallerySection' import { GallerySection } from './GallerySection'
import { Companies } from './Companies' import { Companies } from './Companies'
import { BentoSection } from './BentoSection' import { AgentBento } from './AgentBento'
import { AgentHeroAlt } from './AgentHeroAlt' import { AgentHeroAlt } from './AgentHeroAlt'
import { CallToAction } from './CallToAction' import { CallToAction } from './CallToAction'
import { AgentComponents } from './AgentComponents'
export default function AgentsPage() { export default function AgentsPage() {
return ( return (
@@ -27,11 +26,7 @@ export default function AgentsPage() {
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>
<BentoSection /> <AgentBento />
</AnimatedSection>
<AnimatedSection>
<AgentComponents />
</AnimatedSection> </AnimatedSection>
<AnimatedSection> <AnimatedSection>

View File

@@ -69,7 +69,7 @@ export function BentoSection() {
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.2 }} viewport={{ once: true, amount: 0.2 }}
transition={{ duration: 0.45, delay: index * 0.1, ease: 'easeOut' }} transition={{ duration: 0.45, delay: index * 0.1, ease: 'easeOut' }}
className="overflow-hidden rounded-2xl border border-gray-800 bg-gray-900 p-6 transition-all duration-300 hover:scale-105 hover:border-cyan-500 hover:shadow-lg" className="overflow-hidden rounded-2xl border border-gray-800 bg-[#121212] p-6 transition-all duration-300 hover:scale-105 hover:border-cyan-500 hover:shadow-lg"
> >
<video <video
src={item.video} src={item.video}

View File

@@ -1,59 +1,57 @@
import { CircleBackground } from '../../components/CircleBackground' "use client";
import { Container } from '@/components/Container'
import { Button } from '@/components/Button' import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
export function CallToAction() { export function CallToAction() {
return ( return (
<section <section className="relative overflow-hidden bg-[#121212]">
id="get-started" {/* ✅ Top horizontal line with spacing */}
className="relative overflow-hidden bg-gray-900 py-20 sm:py-28" <div className="max-w-7xl bg-[#121212] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
> <div className="w-full border-t border-l border-r border-gray-800" />
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
<CircleBackground color="#06b6d4" className="animate-spin-slower" /> {/* ✅ Main boxed area */}
<div
id="get-started"
className="relative py-18 max-w-7xl mx-auto bg-[#111111] border border-t-0 border-b-0 border-gray-800"
>
<Container className="relative">
<div className="mx-auto max-w-3xl text-center">
<h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
Start Building the Future of Sovereign AI
</h2>
<p className="mt-6 text-lg text-gray-300">
Use todays components models, storage, compute, mesh and step into agents as they arrive.
</p>
{/* ✅ Two cards, stacked center with spacing */}
<div className="mt-10 flex flex-wrap justify-center gap-x-10 gap-y-8">
<div className="flex flex-col items-center text-center max-w-xs">
<Button to="/deploy" variant="solid" color="cyan" className="mt-4">
Deploy a Model
</Button>
</div>
<div className="flex flex-col items-center text-center max-w-xs">
<Button to="/host" as="a" variant="outline" color="white" className="mt-4">
Host a Node
</Button>
</div>
<div className="flex flex-col items-center text-center max-w-xs">
<Button to="https://threefold.info/mycelium_network/docs/" as="a" target="_blank" variant="outline" color="white" className="mt-4">
Follow Development
</Button>
</div>
</div>
</div>
</Container>
</div> </div>
<Container className="relative"> {/* ✅ Bottom horizontal line with spacing */}
<div className="mx-auto max-w-2xl text-center"> <div className="w-full border-b border-gray-800" />
<h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl"> <div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
Start Building the Future of Sovereign AI
</h2>
<p className="mt-6 text-lg text-gray-300">
Use todays components models, storage, compute, mesh
and step into agents as they arrive.
</p>
<div className="mt-10 flex flex-wrap justify-center gap-x-6 gap-y-4">
<Button
as="a"
to="/deploy"
variant="solid"
color="white"
>
Deploy a Model
</Button>
<Button
as="a"
to="/host"
variant="outline"
color="white"
>
Host a Node
</Button>
<Button
as="a"
to="https://threefold.info/mycelium_network/docs/"
target="_blank"
rel="noreferrer"
variant="outline"
color="white"
>
Follow Development
</Button>
</div>
</div>
</Container>
</section> </section>
) );
} }

View File

@@ -1,7 +1,5 @@
"use client"; "use client";
import { motion } from "framer-motion";
import { P, Eyebrow } from "@/components/Texts";
import { InfiniteMovingCards } from "@/components/magicui/infinite-moving-cards"; import { InfiniteMovingCards } from "@/components/magicui/infinite-moving-cards";
@@ -39,25 +37,10 @@ const row2 = logos.slice(6);
export function Companies() { export function Companies() {
return ( return (
<div id="companies" className="relative bg-black flex flex-col items-center justify-center w-full overflow-hidden antialiased py-4 mb-12"> <div id="companies" className="relative bg-[#121212] flex flex-col items-center justify-center w-full overflow-hidden antialiased py-4 mb-12">
<div className="relative z-10 mx-auto w-full max-w-6xl p-4"> <div className="relative z-10 mx-auto w-full max-w-7xl p-4">
{/* Heading */}
<motion.div
className="flex flex-col justify-center max-w-4xl items-center mb-8 mx-auto"
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.3 }}
transition={{ duration: 0.6, ease: "easeOut" }}
>
<Eyebrow color="accent"></Eyebrow>
<P className="hidden min-xl:text-gray-100 text-center mb-6">
Mycelium Cloud allows you to deploy and scale AI agents from top global providers on a decentralized, privacy-first infrastructure.
</P>
</motion.div>
{/* Logos grid */} {/* Logos grid */}
<div className="flex flex-col items-center gap-y-6 text-white"> <div className="flex flex-col items-center gap-y-6 text-white ">
<InfiniteMovingCards <InfiniteMovingCards
items={row1} items={row1}
direction="right" direction="right"

View File

@@ -46,8 +46,12 @@ const features = [
export function DeploySection() { export function DeploySection() {
return ( return (
<section id="benefits" className="relative bg-black px-4 pb-4 pt-12 text-white lg:px-12 lg:pt-24"> <section className="bg-[#121212] w-full max-w-8xl mx-auto">
<div className="relative px-6 lg:px-12"> {/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800" />
<div className="w-full border-t border-l border-r border-gray-800" />
<div className="relative px-6 lg:px-12 py-12 bg-[#111111] border border-t-0 border-b-0 border-gray-800 max-w-7xl mx-auto">
<motion.div <motion.div
initial={{ opacity: 0, y: 20 }} initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
@@ -90,6 +94,8 @@ export function DeploySection() {
))} ))}
</motion.ul> </motion.ul>
</div> </div>
<div className="w-full border-b border-gray-800 bg-[#121212]" />
</section> </section>
); );
} }

View File

@@ -136,7 +136,7 @@ export function GallerySection() {
</div> </div>
{/* Foreground pill (Desktop) */} {/* Foreground pill (Desktop) */}
<div className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-[60] hidden md:block"> <div className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 z-60 hidden md:block">
<div className="flex items-center justify-between w-[1040px] gap-6 rounded-2xl bg-gray-100/80 shadow-[0_8px_40px_rgba(0,0,0,0.15)] px-12 backdrop-blur"> <div className="flex items-center justify-between w-[1040px] gap-6 rounded-2xl bg-gray-100/80 shadow-[0_8px_40px_rgba(0,0,0,0.15)] px-12 backdrop-blur">
<CP as="h4" className="max-w-[820px] h-[72px] flex items-center" color="dark"> <CP as="h4" className="max-w-[820px] h-[72px] flex items-center" color="dark">
<TypeAnimation <TypeAnimation

View File

@@ -5,15 +5,15 @@ import { Button } from "@/components/Button";
export function CallToAction() { export function CallToAction() {
return ( return (
<section className="relative overflow-hidden bg-gray-900"> <section className="relative overflow-hidden bg-[#121212]">
{/* ✅ Top horizontal line with spacing */} {/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-[#090909] mx-auto py-6 border border-t-0 border-b-0 border-gray-700"></div> <div className="max-w-7xl bg-[#121212] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
<div className="w-full border-t border-l border-r border-gray-700" /> <div className="w-full border-t border-l border-r border-gray-800" />
{/* ✅ Main boxed area */} {/* ✅ Main boxed area */}
<div <div
id="get-started" id="get-started"
className="relative py-18 max-w-7xl mx-auto bg-[#090909] border border-t-0 border-b-0 border-gray-700" className="relative py-18 max-w-7xl mx-auto bg-[#111111] border border-t-0 border-b-0 border-gray-800"
> >
@@ -48,8 +48,8 @@ export function CallToAction() {
</div> </div>
{/* ✅ Bottom horizontal line with spacing */} {/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-700" /> <div className="w-full border-b border-gray-800" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-700 bg-transparent" /> <div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
</section> </section>
); );
} }

View File

@@ -406,7 +406,7 @@ export function CloudFeatures() {
<section <section
id="overview" id="overview"
aria-label="Features for investing all your money" aria-label="Features for investing all your money"
className="bg-gray-900 py-20 sm:py-32" className="bg-[#121212] py-20 sm:py-32"
> >
<Container> <Container>
<div className="mx-auto max-w-2xl lg:mx-0 lg:max-w-3xl"> <div className="mx-auto max-w-2xl lg:mx-0 lg:max-w-3xl">

View File

@@ -69,7 +69,7 @@ export function CloudGettingStarted() {
return ( return (
<section <section
id="getting-started" id="getting-started"
className="relative overflow-hidden bg-gray-900 py-24 sm:py-32" className="relative overflow-hidden bg-[#121212] py-24 sm:py-32"
> >
<div className="absolute inset-0 bg-[radial-gradient(circle_at_top,_rgba(34,211,238,0.12),_transparent_60%)]" /> <div className="absolute inset-0 bg-[radial-gradient(circle_at_top,_rgba(34,211,238,0.12),_transparent_60%)]" />
<Container className="relative"> <Container className="relative">

View File

@@ -5,15 +5,15 @@ import { Button } from "@/components/Button";
export function CallToAction() { export function CallToAction() {
return ( return (
<section className="relative overflow-hidden bg-gray-900"> <section className="relative overflow-hidden bg-[#121212] ">
{/* ✅ Top horizontal line with spacing */} {/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-[#090909] mx-auto py-6 border border-t-0 border-b-0 border-gray-700"></div> <div className="max-w-7xl bg-[#111111] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
<div className="w-full border-t border-l border-r border-gray-700" /> <div className="w-full border-t border-l border-r border-gray-800" />
{/* ✅ Main boxed area */} {/* ✅ Main boxed area */}
<div <div
id="get-started" id="get-started"
className="relative py-18 max-w-7xl mx-auto bg-[#090909] border border-t-0 border-b-0 border-gray-700" className="relative py-18 max-w-7xl mx-auto bg-[#111111] border border-t-0 border-b-0 border-gray-800"
> >
@@ -48,8 +48,8 @@ export function CallToAction() {
</div> </div>
{/* ✅ Bottom horizontal line with spacing */} {/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-700" /> <div className="w-full border-b border-gray-800" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-700 bg-transparent" /> <div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
</section> </section>
); );
} }

View File

@@ -55,9 +55,9 @@ const deterministicCards = [
export function ComputeArchitecture() { export function ComputeArchitecture() {
return ( return (
<section className="relative w-full bg-[#171717] overflow-hidden"> <section className="relative w-full bg-[#121212] overflow-hidden">
{/* ✅ Top horizontal line */} {/* ✅ Top horizontal line */}
<div className="max-w-7xl bg-[#171717] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div> <div className="max-w-7xl bg-[#121212] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
<div className="w-full border-t border-l border-r border-gray-800" /> <div className="w-full border-t border-l border-r border-gray-800" />
<div className="mx-auto bg-[#111111] max-w-2xl px-6 lg:max-w-7xl lg:px-10 border border-t-0 border-b-0 border-gray-800"> <div className="mx-auto bg-[#111111] max-w-2xl px-6 lg:max-w-7xl lg:px-10 border border-t-0 border-b-0 border-gray-800">

View File

@@ -86,14 +86,14 @@ export function ComputeCapabilitiesNew() {
</a> </a>
<button <button
onClick={scrollLeft} onClick={scrollLeft}
className="h-8 w-8 flex items-center justify-center border border-gray-700 rounded-md hover:border-cyan-500 transition-colors" className="h-8 w-8 flex items-center justify-center border border-gray-800 rounded-md hover:border-cyan-500 transition-colors"
> >
<IoArrowBackOutline className="text-gray-300" size={16} /> <IoArrowBackOutline className="text-gray-300" size={16} />
</button> </button>
<button <button
onClick={scrollRight} onClick={scrollRight}
className="h-8 w-8 flex items-center justify-center border border-gray-700 rounded-md hover:border-cyan-500 transition-colors" className="h-8 w-8 flex items-center justify-center border border-gray-800 rounded-md hover:border-cyan-500 transition-colors"
> >
<IoArrowForwardOutline className="text-gray-300" size={16} /> <IoArrowForwardOutline className="text-gray-300" size={16} />
</button> </button>

View File

@@ -72,7 +72,7 @@ export function ComputeCodeTabs() {
/> />
<div className="mx-auto max-w-2xl sm:mx-0 sm:max-w-none"> <div className="mx-auto max-w-2xl sm:mx-0 sm:max-w-none">
<div className="w-screen overflow-hidden rounded-tl-xl bg-gray-900 ring-1 ring-white/10"> <div className="w-screen overflow-hidden rounded-tl-xl bg-[#121212] ring-1 ring-white/10">
{/* FILE TABS */} {/* FILE TABS */}
<div className="flex bg-gray-800/40 ring-1 ring-white/5"> <div className="flex bg-gray-800/40 ring-1 ring-white/5">

View File

@@ -38,7 +38,7 @@ export function ComputeDesign() {
<div className="mx-auto max-w-7xl border-gray-100"> <div className="mx-auto max-w-7xl border-gray-100">
<dl className="grid grid-cols-1 gap-4 lg:gap-14 overflow-hidden text-center lg:grid-cols-3"> <dl className="grid grid-cols-1 gap-4 lg:gap-14 overflow-hidden text-center lg:grid-cols-3">
{stats.map((stat) => ( {stats.map((stat) => (
<div key={stat.id} className="flex flex-col items-center bg-gray-400/5 py-8 px-12 border border-gray-100 lg:border-t-0 lg:border-b-0"> <div key={stat.id} className="flex flex-col items-center bg-gray-100 py-8 px-12 border border-gray-100 lg:border-t-0 lg:border-b-0">
<stat.icon className="h-8 w-8 fill-cyan-500 mb-4" aria-hidden="true" /> <stat.icon className="h-8 w-8 fill-cyan-500 mb-4" aria-hidden="true" />
<CT className="">{stat.value}</CT> <CT className="">{stat.value}</CT>
<CP className="mt-1">{stat.name}</CP> <CP className="mt-1">{stat.name}</CP>

View File

@@ -31,9 +31,9 @@ export function ComputeOverview() {
/> />
<CircleBackground <CircleBackground
color="#22d3ee" color="#22d3ee"
className="absolute bottom-[-18rem] left-[15%] h-[420px] w-[420px] opacity-15 blur-3xl" className="absolute -bottom-72 left-[15%] h-[420px] w-[420px] opacity-15 blur-3xl"
/> />
<div className="absolute inset-0 bg-[radial-gradient(circle_at_top,_rgba(0,0,0,0.03),_transparent_55%)]" /> <div className="absolute inset-0 bg-radial-gradient(circle_at_top,_rgba(0,0,0,0.03),_transparent_55%)]" />
</div> </div>
<Container className="relative py-12 bg-white mx-auto s border border-t-0 border-b-0 border-gray-100"> <Container className="relative py-12 bg-white mx-auto s border border-t-0 border-b-0 border-gray-100">
@@ -69,7 +69,7 @@ export function ComputeOverview() {
key={card.title} key={card.title}
className="group relative overflow-hidden rounded-md border border-gray-100 bg-white p-10 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg" className="group relative overflow-hidden rounded-md border border-gray-100 bg-white p-10 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg"
> >
<div className="absolute inset-0 bg-gradient-to-br from-cyan-50 via-white to-cyan-100 opacity-0 transition group-hover:opacity-70" /> <div className="absolute inset-0 bg-linear-to-br from-cyan-50 via-white to-cyan-100 opacity-0 transition group-hover:opacity-70" />
<div className="relative"> <div className="relative">
<p className="text-[0.7rem] font-semibold uppercase tracking-[0.35em] text-cyan-600"> <p className="text-[0.7rem] font-semibold uppercase tracking-[0.35em] text-cyan-600">

View File

@@ -11,7 +11,7 @@ import { ComputeCapabilitiesNew } from './ComputeCapabilitiesNew'
export default function ComputePage() { export default function ComputePage() {
return ( return (
<div> <>
<AnimatedSection> <AnimatedSection>
<ComputeHero /> <ComputeHero />
</AnimatedSection> </AnimatedSection>
@@ -43,6 +43,6 @@ export default function ComputePage() {
<AnimatedSection> <AnimatedSection>
<CallToAction /> <CallToAction />
</AnimatedSection> </AnimatedSection>
</div> </>
) )
} }

View File

@@ -99,7 +99,7 @@ export function ComputeDeveloperExperience() {
{sample.description} {sample.description}
</p> </p>
</div> </div>
<div className="mt-auto bg-gray-900 p-6"> <div className="mt-auto bg-[#121212] p-6">
<pre className="overflow-auto text-left text-xs leading-relaxed text-cyan-100"> <pre className="overflow-auto text-left text-xs leading-relaxed text-cyan-100">
<code>{sample.code}</code> <code>{sample.code}</code>
</pre> </pre>

View File

@@ -36,7 +36,7 @@ const features = [
export function DevHub() { export function DevHub() {
return ( return (
<div className="bg-gray-900 py-24 sm:py-32"> <div className="bg-[#121212] py-24 sm:py-32">
<div className="mx-auto max-w-7xl px-6 lg:px-8"> <div className="mx-auto max-w-7xl px-6 lg:px-8">
<div className="mx-auto grid max-w-2xl grid-cols-1 gap-x-8 gap-y-16 sm:gap-y-20 lg:mx-0 lg:max-w-none lg:grid-cols-5"> <div className="mx-auto grid max-w-2xl grid-cols-1 gap-x-8 gap-y-16 sm:gap-y-20 lg:mx-0 lg:max-w-none lg:grid-cols-5">
<div className="col-span-2"> <div className="col-span-2">
@@ -54,7 +54,7 @@ export function DevHub() {
href={feature.href} href={feature.href}
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
className="block rounded-2xl border border-gray-700 bg-gray-900/40 p-6 shadow-sm transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:bg-gray-800 hover:shadow-lg hover:shadow-cyan-500/20" className="block rounded-2xl border border-gray-800 bg-[#121212] /40 p-6 shadow-sm transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:bg-gray-800 hover:shadow-lg hover:shadow-cyan-500/20"
> >
<feature.icon aria-hidden="true" className="mb-4 h-6 w-6 flex-none text-cyan-500" /> <feature.icon aria-hidden="true" className="mb-4 h-6 w-6 flex-none text-cyan-500" />
<dt className="font-semibold text-white">{feature.name}</dt> <dt className="font-semibold text-white">{feature.name}</dt>

View File

@@ -1,48 +1,67 @@
import { CircleBackground } from '../../components/CircleBackground' "use client";
import { Container } from '@/components/Container'
import { Button } from '@/components/Button' import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
export function CallToAction() { export function CallToAction() {
return ( return (
<section <section className="relative overflow-hidden bg-[#121212]">
id="get-started" {/* ✅ Top horizontal line with spacing */}
className="relative overflow-hidden bg-gray-900 py-20 sm:py-28" <div className="max-w-7xl bg-[#121212] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
> <div className="w-full border-t border-l border-r border-gray-800" />
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
<CircleBackground color="#06b6d4" className="animate-spin-slower" />
</div>
<Container className="relative">
<div className="mx-auto max-w-2xl text-center">
<h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
Choose How You Want to Start
</h2>
<p className="mt-6 text-lg text-gray-300">
Use GPUs through Mycelium Cloud,
or contribute GPU nodes to the mesh and run your own workloads.
</p> {/* ✅ Main boxed area */}
<div className="mt-10 flex flex-wrap justify-center gap-x-6 gap-y-4"> <div
<Button id="get-started"
to="https://myceliumcloud.tf" className="relative py-18 max-w-7xl mx-auto bg-[#111111] border border-t-0 border-b-0 border-gray-800"
as="a" >
variant="solid"
color="white"
target="_blank" <Container className="relative">
rel="noreferrer" <div className="mx-auto max-w-3xl text-center">
> <h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
Deploy GPU Workloads Choose How You Want to Start
</Button> </h2>
<Button
to="#gpu-architecture" <p className="mt-6 text-lg text-gray-300">
as="a" Use GPUs through Mycelium Cloud, or contribute GPU nodes to the mesh and run your own workloads.
variant="outline" </p>
color="white"
> {/* ✅ Two cards, stacked center with spacing */}
Host A GPU Node <div className="mt-10 flex flex-wrap justify-center gap-x-10 gap-y-8">
</Button> <div className="flex flex-col items-center text-center max-w-xs">
<Button
to="https://myceliumcloud.tf"
as="a"
variant="solid"
color="cyan"
target="_blank"
rel="noreferrer"
className="mt-4"
>
Deploy GPU Workloads
</Button>
</div>
<div className="flex flex-col items-center text-center max-w-xs">
<Button
to="#gpu-architecture"
as="a"
variant="outline"
color="white"
className="mt-4"
>
Host a GPU Node
</Button>
</div>
</div>
</div> </div>
</div> </Container>
</Container> </div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-800" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
</section> </section>
) );
} }

View File

@@ -1,48 +1,79 @@
import { Container } from '@/components/Container' import { Eyebrow, H3, P } from '@/components/Texts'
import { Eyebrow, SectionHeader } from '@/components/Texts' import {
CpuChipIcon,
const architecture = [ LockClosedIcon,
{ ShieldCheckIcon,
title: 'Sovereign Compute Nodes', } from '@heroicons/react/24/solid'
description: 'GPUs hosted on hardware you trust.',
},
{
title: 'Encrypted Mesh Networking',
description: 'Secure, private connectivity to workloads.',
},
{
title: 'Reservation & Verification Layer',
description: 'Guarantees GPU access and consistency.',
},
]
export function GpuArchitecture() { export function GpuArchitecture() {
return ( return (
<section id="gpu-architecture" className="bg-white py-24 sm:py-32"> <section id="gpu-architecture" className="w-full max-w-8xl mx-auto bg-transparent">
<Container>
<div className="mx-auto max-w-3xl text-center"> {/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
<div className="w-full border-t border-l border-r border-gray-100" />
<div className="mx-auto max-w-7xl px-6 bg-white lg:px-8 grid grid-cols-1 lg:grid-cols-2 gap-20 py-12 border border-t-0 border-b-0 border-gray-100">
{/* ✅ LEFT — Title + Intro text */}
<div className="max-w-xl">
<Eyebrow>ARCHITECTURE</Eyebrow> <Eyebrow>ARCHITECTURE</Eyebrow>
<SectionHeader as="h2" className="mt-6 text-gray-900">
HOW IT WORKS <H3 className="mt-6">
</SectionHeader> How It Works
</H3>
<P className="mt-6 text-lg text-gray-600">
Mycelium GPU architecture ensures secure, sovereign computation using
hardware you trust. Nodes communicate through encrypted mesh networking,
and access is guaranteed through verifiable reservations.
</P>
</div> </div>
<div className="mx-auto mt-16 max-w-4xl space-y-6 lg:space-y-0 lg:grid lg:grid-cols-3 lg:gap-8"> {/* ✅ RIGHT — items stacked with cyan dividers */}
{architecture.map((item) => ( <div className="space-y-8">
<div
key={item.title} {/* 1 — Sovereign Compute Nodes */}
className="rounded-3xl border border-slate-200 bg-white p-8 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg" <div>
> <h3 className="text-lg font-semibold text-gray-950 flex items-center">
<h3 className="text-xl font-semibold text-gray-900"> <CpuChipIcon className="h-6 w-6 text-cyan-500 mr-3" />
{item.title} Sovereign Compute Nodes
</h3> </h3>
<p className="mt-3 text-sm leading-relaxed text-gray-600"> <p className="mt-2 text-gray-600 max-w-2xl">
{item.description} GPUs run only on hardware you control eliminating reliance on centralized clouds.
</p> </p>
</div> <div className="mt-8 h-px w-full bg-cyan-500/50" />
))} </div>
{/* 2 — Encrypted Mesh Networking */}
<div>
<h3 className="text-lg font-semibold text-gray-950 flex items-center">
<LockClosedIcon className="h-6 w-6 text-cyan-500 mr-3" />
Encrypted Mesh Networking
</h3>
<p className="mt-2 text-gray-600 max-w-2xl">
Nodes form private, encrypted tunnels to workloads no public exposure required.
</p>
<div className="mt-8 h-px w-full bg-cyan-500/50" />
</div>
{/* 3 — Reservation & Verification Layer */}
<div>
<h3 className="text-lg font-semibold text-gray-950 flex items-center">
<ShieldCheckIcon className="h-6 w-6 text-cyan-500 mr-3" />
Reservation & Verification Layer
</h3>
<p className="mt-2 text-gray-600 max-w-2xl">
Cryptographically enforced reservations guarantee GPU availability
with deterministic behavior across workloads.
</p>
</div>
</div> </div>
</Container> </div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-100" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
</section> </section>
) )
} }

View File

@@ -1,58 +1,133 @@
import { "use client";
SparklesIcon,
Cog6ToothIcon,
CubeTransparentIcon,
CpuChipIcon,
} from '@heroicons/react/24/solid'
import { Eyebrow, H3, CT, CP } from '@/components/Texts'
import { Container } from '@/components/Container'
const capabilities = [ import { useRef } from "react";
import { Eyebrow, CP, CT, H5 } from "@/components/Texts";
import { IoArrowBackOutline, IoArrowForwardOutline } from "react-icons/io5";
// ✅ Import animations
import KubernetesAcceleration from "./animations/KubernetesAcceleration";
import RenderingSimulation from "./animations/RenderingSimulation";
import RAGPipeline from "./animations/RAGPipeline";
import InterferenceAnimation from "./animations/InterferenceAnimation";
const gpuCapabilities = [
{ {
name: 'AI / ML Inference & Training', isIntro: true,
description: 'LLMs, embeddings, transformers, fine-tuning', eyebrow: "CAPABILITIES",
icon: SparklesIcon, title: "What You Can Run on Mycelium Cloud",
description:
"GPU acceleration for inference, training, rendering, and agent workloads — on sovereign hardware.",
}, },
{ {
name: 'Acceleration in Kubernetes Workloads', name: "AI / ML Inference & Training",
description: 'GPU-backed deployments on Mycelium Cloud', description: "LLMs, embeddings, transformers, fine-tuning",
icon: Cog6ToothIcon, animation: InterferenceAnimation,
}, },
{ {
name: 'Rendering & Simulation', name: "Acceleration in Kubernetes Workloads",
description: 'Scientific visualization, VFX, real-time 3D', description: "GPU-backed deployments on Mycelium Cloud",
icon: CubeTransparentIcon, animation: KubernetesAcceleration,
}, },
{ {
name: 'Agent Compute & RAG Pipelines', name: "Rendering & Simulation",
description: 'Vector memory + model execution on sovereign hardware', description: "Scientific visualization, VFX, real-time 3D",
icon: CpuChipIcon, animation: RenderingSimulation,
}, },
] {
name: "Agent Compute & RAG Pipelines",
description:
"Vector memory + model execution on sovereign hardware",
animation: RAGPipeline,
},
];
export function GpuCapabilities() { export function GpuCapabilities() {
return ( const sliderRef = useRef<HTMLUListElement>(null);
<section className="bg-white py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl text-center">
<Eyebrow>CAPABILITIES</Eyebrow>
<H3 className="mt-4 text-gray-900">What You Can Run on Mycelium Cloud</H3>
</div>
<div className="mx-auto mt-16 max-w-5xl"> const scrollLeft = () =>
<dl className="grid grid-cols-1 gap-12 sm:grid-cols-2 lg:grid-cols-4"> sliderRef.current?.scrollBy({ left: -400, behavior: "smooth" });
{capabilities.map((feature) => ( const scrollRight = () =>
<div key={feature.name} className="flex flex-col text-center"> sliderRef.current?.scrollBy({ left: 400, behavior: "smooth" });
<div className="mx-auto flex size-12 items-center justify-center rounded-xl bg-cyan-50">
<feature.icon className="size-6 text-cyan-600" aria-hidden="true" /> return (
<section className="bg-[#121212] w-full max-w-8xl mx-auto">
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800" />
<div className="w-full border-t border-l border-r border-gray-800" />
<div className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-800 bg-[#111111] overflow-hidden">
{/* ✅ Horizontal Slider */}
<ul
ref={sliderRef}
className="flex overflow-x-auto snap-x snap-mandatory scroll-smooth no-scrollbar"
>
{gpuCapabilities.map((item, idx) => (
<li
key={idx}
className={`snap-start shrink-0 w-[85%] sm:w-[50%] lg:w-[33%] border border-gray-800 relative flex flex-col ${
item.isIntro ? "bg-[#1b1b1b] p-10" : "bg-[#111]/60"
}`}
>
{item.isIntro ? (
<div className="flex flex-col justify-between h-full">
<div>
<Eyebrow>{item.eyebrow}</Eyebrow>
<H5 className="text-white mt-4 lg:text-2xl text-xl">
{item.title}
</H5>
<p className="mt-4 text-gray-400 lg:text-lg text-sm leading-relaxed">
{item.description}
</p>
</div>
<div className="flex items-center gap-x-4 mt-3">
<a
href="#"
className="inline-flex items-center gap-1 text-cyan-400 hover:text-cyan-300 text-sm font-medium mr-auto"
>
Learn more
</a>
<button
onClick={scrollLeft}
className="h-8 w-8 flex items-center justify-center border border-gray-800 rounded-md hover:border-cyan-500 transition-colors"
>
<IoArrowBackOutline className="text-gray-300" size={16} />
</button>
<button
onClick={scrollRight}
className="h-8 w-8 flex items-center justify-center border border-gray-800 rounded-md hover:border-cyan-500 transition-colors"
>
<IoArrowForwardOutline className="text-gray-300" size={16} />
</button>
</div>
</div> </div>
<CT className="mt-6 text-gray-900">{feature.name}</CT> ) : (
<CP className="mt-2 text-gray-600">{feature.description}</CP> <>
</div> {/* ✅ STREAMING ANIMATION REPLACES ICON */}
))} <div className="w-full flex items-center justify-center">
</dl> {item.animation && <item.animation />}
</div> </div>
</Container>
<div className="p-6 text-center">
<CT className="text-lg font-semibold text-white mt-2">
{item.name}
</CT>
<CP className="mt-2 text-gray-400 leading-snug">
{item.description}
</CP>
</div>
</>
)}
</li>
))}
</ul>
</div>
<div className="w-full border-b border-gray-800" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800" />
</section> </section>
) );
} }

View File

@@ -1,5 +1,3 @@
import { Container } from '@/components/Container'
import { Eyebrow, H3, CT } from '@/components/Texts'
import { import {
BoltIcon, BoltIcon,
BanknotesIcon, BanknotesIcon,
@@ -9,51 +7,55 @@ import {
const benefits = [ const benefits = [
{ {
name: 'Consistent, reserved GPU performance (no noisy neighbor effects)', id: 1,
title: 'Consistent, reserved GPU performance (no noisy neighbor effects)',
icon: BoltIcon, icon: BoltIcon,
}, },
{ {
name: 'Transparent cost (no markup, no surprise billing)', id: 2,
title: 'Transparent cost (no markup, no surprise billing)',
icon: BanknotesIcon, icon: BanknotesIcon,
}, },
{ {
name: 'Run anywhere cloud, on-prem, edge, home lab', id: 3,
title: 'Run anywhere cloud, on-prem, edge, home lab',
icon: GlobeAltIcon, icon: GlobeAltIcon,
}, },
{ {
name: 'Your data never leaves your control', id: 4,
title: 'Your data never leaves your control',
icon: ShieldCheckIcon, icon: ShieldCheckIcon,
}, },
] ]
export function GpuDesign() { export function GpuDesign() {
return ( return (
<section className="bg-white py-24 sm:py-32"> <section className="w-full max-w-8xl mx-auto bg-transparent">
<Container>
{/* Header */}
<div className="mx-auto max-w-3xl sm:text-center">
<Eyebrow>CORE VALUE</Eyebrow>
<H3 className="mt-4 text-gray-900">GPU Power You Actually Control</H3>
</div> {/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
<div className="w-full border border-l border-r border-gray-100" />
{/* ✅ Main content */}
<div className="mx-auto max-w-7xl border-gray-100 ">
<dl className="grid grid-cols-1 gap-4 lg:gap-6 lg:grid-cols-4 text-center ">
{benefits.map((item) => (
<div
key={item.id}
className="flex flex-col items-center bg-white/40 dark:bg-black/40 py-10 px-4 border border-gray-100 dark:border-gray-800 lg:border-t-0 lg:border-b-0"
>
<item.icon className="h-10 w-10 text-cyan-500 mb-4" />
<h3 className="text-base font-medium text-black dark:text-white max-w-xs">
{item.title}
</h3>
</div>
))}
</dl>
</div>
{/* Key Benefits */} {/* ✅ Bottom horizontal line with spacing */}
<div className="mx-auto mt-16 max-w-5xl"> <div className="w-full border border-gray-100" />
<dl className="grid grid-cols-1 gap-12 sm:grid-cols-2 lg:grid-cols-2"> <div className="max-w-7xl bg-transparent mx-auto py-0 border border-t-0 border-b-0 border-gray-100"></div>
{benefits.map((benefit) => (
<div key={benefit.name} className="relative pl-12">
<benefit.icon
className="absolute left-0 top-1 size-6 text-cyan-600"
aria-hidden="true"
/>
<CT className="font-semibold text-gray-900">
{benefit.name}
</CT>
</div>
))}
</dl>
</div>
</Container>
</section> </section>
) )
} }

View File

@@ -1,3 +1,5 @@
'use client'
import { import {
AdjustmentsHorizontalIcon, AdjustmentsHorizontalIcon,
GlobeAltIcon, GlobeAltIcon,
@@ -30,40 +32,66 @@ const coreFeatures = [
export function GpuOverview() { export function GpuOverview() {
return ( return (
<section className="bg-gray-950 py-24 sm:py-32"> <section className="bg-[#121212] w-full max-w-8xl mx-auto">
<Container>
<div className="mx-auto max-w-3xl text-center">
<Eyebrow className="tracking-[0.32em] uppercase text-cyan-300">
PLATFORM OVERVIEW
</Eyebrow>
<SectionHeader as="h2" color="light" className="mt-6 font-medium">
Core Features
</SectionHeader>
<P color="lightSecondary" className="mt-6">
The Mycelium GPU layer provides predictable, sovereign acceleration
without arbitrary limits or hidden economics.
</P>
</div>
<div className="mx-auto mt-16 max-w-5xl grid gap-8 sm:grid-cols-2 lg:grid-cols-3"> {/* ✅ Top spacer */}
{coreFeatures.map((feature) => ( <div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
<div <div className="w-full border-t border-l border-r border-gray-800" />
key={feature.name}
className="rounded-3xl border border-white/10 bg-white/[0.04] p-8 text-left backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/[0.08]" {/* ✅ Boxed container */}
<div className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-800 bg-[#111111] py-12">
<Container>
<div className="mx-auto max-w-3xl text-center">
<Eyebrow className="text-cyan-400 tracking-[0.32em] uppercase">
PLATFORM OVERVIEW
</Eyebrow>
<SectionHeader
as="h2"
className="mt-6 text-3xl lg:text-4xl font-medium tracking-tight text-white"
> >
<div className="mb-6 flex size-12 items-center justify-center rounded-full bg-cyan-500/15"> Core GPU Features
<feature.icon className="size-6 text-cyan-300" aria-hidden="true" /> </SectionHeader>
</div>
<h3 className="text-lg font-semibold text-white"> <P className="mt-6 text-lg text-gray-300">
{feature.name} The Mycelium GPU fabric provides predictable, sovereign acceleration
</h3> without arbitrary limits or hidden economics.
<p className="mt-3 text-sm leading-relaxed text-gray-300"> </P>
{feature.description} </div>
</p>
</div> {/* ✅ Grid matching CloudArchitecture card layout */}
))} <ul
</div> role="list"
</Container> className="mx-auto mt-12 grid max-w-2xl grid-cols-1 gap-6 text-sm
sm:grid-cols-2 lg:max-w-none lg:grid-cols-3 md:gap-y-10 "
>
{coreFeatures.map((feature) => (
<li
key={feature.name}
className="rounded-xl border border-gray-800 bg-[#111]/60 p-6 hover:transform-[scale(1.05)] transition"
>
<div className="mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-cyan-500/15">
<feature.icon className="h-6 w-6 text-cyan-300" />
</div>
<h3 className="text-lg font-semibold text-white">
{feature.name}
</h3>
<p className="mt-2 text-gray-400 leading-snug">
{feature.description}
</p>
</li>
))}
</ul>
</Container>
</div>
{/* ✅ Bottom border + spacer */}
<div className="w-full border-b border-gray-800" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
</section> </section>
) )
} }

View File

@@ -1,4 +1,3 @@
import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P } from '@/components/Texts' import { Eyebrow, SectionHeader, P } from '@/components/Texts'
const gpuUseCases = [ const gpuUseCases = [
@@ -18,35 +17,52 @@ const gpuUseCases = [
export function GpuUseCases() { export function GpuUseCases() {
return ( return (
<section className="bg-white py-24 sm:py-32"> <section className="w-full max-w-8xl mx-auto bg-white">
<Container>
<div className="mx-auto max-w-3xl text-center"> {/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-slate-200"></div>
<div className="w-full border-t border-l border-r border-slate-200" />
{/* ✅ Main boxed content */}
<div className="mx-auto max-w-7xl px-6 bg-white lg:px-8 grid grid-cols-1 lg:grid-cols-2 gap-20 py-12 border border-t-0 border-b-0 border-slate-200">
{/* ✅ LEFT SIDE — Title + Intro */}
<div className="max-w-xl">
<Eyebrow>USE CASES</Eyebrow> <Eyebrow>USE CASES</Eyebrow>
<SectionHeader as="h2" className="mt-6 text-gray-900"> <SectionHeader as="h2" className="mt-6 text-gray-900">
Built for Intelligent Workloads Built for Intelligent Workloads
</SectionHeader> </SectionHeader>
<P className="mt-6 text-gray-600"> <P className="mt-6 text-gray-600">
From sovereign AI execution to real-time rendering and edge inference, From sovereign AI execution to real-time rendering and edge inference,
Mycelium GPU ensures predictable acceleration with full ownership and no centralized control. Mycelium GPU ensures predictable acceleration with full ownership
no centralized control.
</P> </P>
</div> </div>
<div className="mx-auto mt-16 max-w-4xl space-y-6 lg:space-y-0 lg:grid lg:grid-cols-3 lg:gap-8"> {/* ✅ RIGHT SIDE — 3 stacked features */}
<div className="space-y-8">
{gpuUseCases.map((useCase) => ( {gpuUseCases.map((useCase) => (
<div <div key={useCase.title}>
key={useCase.title} <h3 className="text-lg font-semibold text-gray-900">
className="rounded-3xl border border-slate-200 bg-white p-8 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg"
>
<h3 className="text-xl font-semibold text-gray-900">
{useCase.title} {useCase.title}
</h3> </h3>
<p className="mt-3 text-sm leading-relaxed text-gray-600"> <p className="mt-2 text-gray-600 max-w-2xl">
{useCase.description} {useCase.description}
</p> </p>
{/* ✅ divider except last item */}
{useCase.title !== 'Distributed & Edge Compute' && (
<div className="mt-8 h-px w-full bg-cyan-300/40" />
)}
</div> </div>
))} ))}
</div> </div>
</Container> </div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-slate-200" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-slate-200"></div>
</section> </section>
) )
} }

View File

@@ -0,0 +1,296 @@
"use client";
export default function InferenceAnimation() {
return (
<svg
width="382"
height="282"
viewBox="0 0 382 282"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="title desc"
>
<title id="title">AI / ML Inference & Training Animation</title>
<desc id="desc">
Animated neural graph sending signals to a glowing GPU chip on a dark
background.
</desc>
{/* ---------- DEFINITIONS ---------- */}
<defs>
{/* Dark grid pattern */}
<pattern id="grid" width="16" height="16" patternUnits="userSpaceOnUse">
<path d="M16 0H0V16" fill="none" stroke="#0f1621" strokeWidth="1" />
</pattern>
{/* Cyan gradient */}
<linearGradient id="cyanglow" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stopColor="#00E5FF">
<animate
attributeName="stop-color"
values="#00E5FF;#00B8DB;#00E5FF"
dur="4s"
repeatCount="indefinite"
/>
</stop>
<stop offset="100%" stopColor="#00B8DB">
<animate
attributeName="stop-color"
values="#00B8DB;#00E5FF;#00B8DB"
dur="4s"
repeatCount="indefinite"
/>
</stop>
</linearGradient>
{/* Soft outer glow */}
<filter id="softGlow" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur stdDeviation="6" result="blur" />
<feMerge>
<feMergeNode in="blur" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
{/* Sharper glow for nodes */}
<filter id="nodeGlow" x="-150%" y="-150%" width="400%" height="400%">
<feGaussianBlur stdDeviation="3" result="ng" />
<feMerge>
<feMergeNode in="ng" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
{/* Dashed link style */}
<style>{`
.link {
stroke: #11cdef;
stroke-width: 1.75;
stroke-linecap: round;
stroke-dasharray: 6 10;
opacity: 0.9;
}
.muted { opacity: 0.65; }
.chip-line { stroke: #93c5fd; stroke-width: 1; opacity: 0.7; }
`}</style>
{/* Reusable motion path for packet */}
<path
id="path1"
d="M 64 156 C 110 118, 160 130, 206 140 S 280 158, 316 150"
fill="none"
/>
<path
id="path2"
d="M 64 116 C 116 96, 160 104, 204 112 S 280 126, 316 112"
fill="none"
/>
</defs>
{/* ---------- BACKGROUND ---------- */}
<rect width="382" height="282" fill="transparent" />
<rect width="382" height="282" fill="url(#grid)" opacity="0.55" />
{/* ---------- GPU CHIP (RIGHT) ---------- */}
<g transform="translate(252,62)">
{/* Outer casing */}
<rect
x="0"
y="0"
width="112"
height="158"
rx="18"
fill="#0e1724"
stroke="url(#cyanglow)"
strokeWidth="2"
filter="url(#softGlow)"
/>
{/* Inner frame */}
<rect
x="12"
y="14"
width="88"
height="130"
rx="10"
fill="#0b1320"
stroke="#163447"
strokeWidth="1.5"
/>
{/* Matrix / cores */}
{[...Array(5)].map((_, r) => (
<line
key={`row-${r}`}
x1="20"
x2="92"
y1={28 + r * 24}
y2={28 + r * 24}
className="chip-line"
/>
))}
{[...Array(6)].map((_, c) => (
<line
key={`col-${c}`}
y1="26"
y2="126"
x1={22 + c * 12}
x2={22 + c * 12}
className="chip-line"
/>
))}
{/* Pulsing GPU die */}
<rect
x="40"
y="58"
width="32"
height="32"
rx="6"
fill="url(#cyanglow)"
opacity="0.85"
>
<animate
attributeName="opacity"
values="0.5;0.95;0.5"
dur="2.2s"
repeatCount="indefinite"
/>
</rect>
{/* Glow ring */}
<rect
x="36"
y="54"
width="40"
height="40"
rx="8"
stroke="url(#cyanglow)"
strokeWidth="2"
fill="none"
>
<animate
attributeName="stroke-width"
values="2;4;2"
dur="2.2s"
repeatCount="indefinite"
/>
</rect>
</g>
{/* ---------- NEURAL GRAPH (LEFT/MID) ---------- */}
<g transform="translate(28,34)">
{/* Links */}
<g className="muted">
{/* lower cluster to chip */}
<path className="link" d="M36 148 L96 124" >
<animate
attributeName="stroke-dashoffset"
values="0;-32"
dur="1.6s"
repeatCount="indefinite"
/>
</path>
<path className="link" d="M96 124 L152 138" >
<animate
attributeName="stroke-dashoffset"
values="0;-32"
dur="1.6s"
repeatCount="indefinite"
/>
</path>
<path className="link" d="M152 138 L212 132" >
<animate
attributeName="stroke-dashoffset"
values="0;-32"
dur="1.6s"
repeatCount="indefinite"
/>
</path>
{/* upper cluster to mid */}
<path className="link" d="M40 76 L92 88" >
<animate
attributeName="stroke-dashoffset"
values="0;-28"
dur="1.4s"
repeatCount="indefinite"
/>
</path>
<path className="link" d="M92 88 L140 96" >
<animate
attributeName="stroke-dashoffset"
values="0;-28"
dur="1.4s"
repeatCount="indefinite"
/>
</path>
<path className="link" d="M140 96 L206 106" >
<animate
attributeName="stroke-dashoffset"
values="0;-28"
dur="1.4s"
repeatCount="indefinite"
/>
</path>
{/* vertical cross links */}
<path className="link" d="M92 88 L96 124" >
<animate
attributeName="stroke-dashoffset"
values="0;-24"
dur="1.2s"
repeatCount="indefinite"
/>
</path>
<path className="link" d="M140 96 L152 138" >
<animate
attributeName="stroke-dashoffset"
values="0;-24"
dur="1.2s"
repeatCount="indefinite"
/>
</path>
</g>
{/* Nodes */}
{[
{ x: 36, y: 148, r: 6 },
{ x: 40, y: 76, r: 6 },
{ x: 96, y: 124, r: 7 },
{ x: 92, y: 88, r: 7 },
{ x: 140, y: 96, r: 7 },
{ x: 152, y: 138, r: 7 },
{ x: 206, y: 106, r: 6.5 },
{ x: 212, y: 132, r: 6.5 },
].map((n, i) => (
<g key={i} filter="url(#nodeGlow)">
<circle cx={n.x} cy={n.y} r={n.r} fill="#06121a" stroke="#163447" />
<circle cx={n.x} cy={n.y} r={n.r - 2} fill="url(#cyanglow)" opacity="0.9">
<animate
attributeName="opacity"
values="0.6;1;0.6"
dur={`${1.2 + (i % 4) * 0.2}s`}
repeatCount="indefinite"
/>
</circle>
</g>
))}
{/* Data packets moving along paths */}
<g>
<circle r="3.2" fill="url(#cyanglow)">
<animateMotion dur="2.6s" repeatCount="indefinite">
<mpath href="#path1" />
</animateMotion>
</circle>
<circle r="2.8" fill="url(#cyanglow)" opacity="0.85">
<animateMotion dur="2.2s" begin="0.4s" repeatCount="indefinite">
<mpath href="#path2" />
</animateMotion>
</circle>
</g>
</g>
{/* ---------- LABELS ---------- */}
</svg>
);
}

View File

@@ -0,0 +1,124 @@
"use client";
export default function KubernetesAcceleration() {
return (
<svg
width="382"
height="282"
viewBox="0 0 382 282"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="title desc"
>
<title id="title">Acceleration in Kubernetes</title>
<desc id="desc">Pods spin up on a grid and get GPU badges.</desc>
<defs>
{/* Dark grid */}
<pattern id="grid" width="16" height="16" patternUnits="userSpaceOnUse">
<path d="M16 0H0V16" fill="none" stroke="#0f1621" strokeWidth="1" />
</pattern>
{/* Cyan gradient */}
<linearGradient id="cyanglow" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stopColor="#00E5FF">
<animate attributeName="stop-color" values="#00E5FF;#00B8DB;#00E5FF" dur="4s" repeatCount="indefinite" />
</stop>
<stop offset="100%" stopColor="#00B8DB">
<animate attributeName="stop-color" values="#00B8DB;#00E5FF;#00B8DB" dur="4s" repeatCount="indefinite" />
</stop>
</linearGradient>
<filter id="softGlow" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur stdDeviation="5" result="b" />
<feMerge>
<feMergeNode in="b" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<style>{`
.pod {
fill: #0e1724;
stroke: #163447;
stroke-width: 1.5;
}
.podOn {
stroke: url(#cyanglow);
}
.badge {
stroke: url(#cyanglow);
stroke-width: 1.5;
fill: #09131c;
}
`}</style>
</defs>
{/* Background */}
<rect width="382" height="282" fill="transparent" />
<rect width="382" height="282" fill="url(#grid)" opacity="0.55" />
{/* Cluster grid */}
<g transform="translate(40,50)">
{/* 4 rows × 6 cols */}
{Array.from({ length: 4 }).map((_, r) =>
Array.from({ length: 6 }).map((__, c) => {
const x = 18 + c * 48;
const y = 24 + r * 46;
const delay = (r * 6 + c) * 0.06;
const on = (r + c) % 2 === 0; // mark some pods "on"
return (
<g key={`${r}-${c}`}>
{/* Pod */}
<rect
x={x}
y={y}
width="34"
height="26"
rx="6"
className={`pod ${on ? "podOn" : ""}`}
>
<animate
attributeName="opacity"
values="0;1"
dur="0.35s"
begin={`${delay}s`}
fill="freeze"
/>
<animateTransform
attributeName="transform"
attributeType="XML"
type="scale"
additive="sum"
values="0.7 0.7;1 1"
dur="0.35s"
begin={`${delay}s`}
fill="freeze"
/>
</rect>
{/* GPU badge (appears on powered pods) */}
{on && (
<g transform={`translate(${x + 20},${y - 10})`} filter="url(#softGlow)">
{/* small chip */}
<rect x="-10" y="-10" width="20" height="20" rx="4" className="badge" />
<rect x="-6" y="-6" width="12" height="12" rx="2" fill="url(#cyanglow)" opacity="0.9">
<animate attributeName="opacity" values="0;1;0.6;1" dur="1.8s" begin={`${delay + 0.25}s`} repeatCount="indefinite" />
</rect>
{/* pins */}
{[-10, 10].map((px, i) => (
<line key={i} x1={px} y1="0" x2={px + (px > 0 ? 6 : -6)} y2="0" stroke="#93c5fd" strokeWidth="1" />
))}
{/* pop-in */}
<animateTransform attributeName="transform" type="scale" values="0 0;1 1" dur="0.28s" begin={`${delay + 0.18}s`} fill="freeze" />
</g>
)}
</g>
);
})
)}
</g>
</svg>
);
}

View File

@@ -0,0 +1,144 @@
"use client";
export default function RAGPipeline() {
return (
<svg
width="382"
height="282"
viewBox="0 0 382 282"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="title desc"
>
<title id="title">Agent Compute & RAG Pipelines</title>
<desc id="desc">Documents flow into a vector DB, then a model, and finally an answer bubble.</desc>
<defs>
<pattern id="grid" width="16" height="16" patternUnits="userSpaceOnUse">
<path d="M16 0H0V16" fill="none" stroke="#0f1621" strokeWidth="1" />
</pattern>
<linearGradient id="cyanglow" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stopColor="#00E5FF">
<animate attributeName="stop-color" values="#00E5FF;#00B8DB;#00E5FF" dur="4s" repeatCount="indefinite" />
</stop>
<stop offset="100%" stopColor="#00B8DB">
<animate attributeName="stop-color" values="#00B8DB;#00E5FF;#00B8DB" dur="4s" repeatCount="indefinite" />
</stop>
</linearGradient>
<filter id="glow" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur stdDeviation="4" result="b" />
<feMerge>
<feMergeNode in="b" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<style>{`
.label { fill: #8ea2b2; font-weight: 600; letter-spacing: .06em; font-size: 12px; }
.box { fill: #0e1724; stroke: #163447; stroke-width: 1.5; }
.cyl { fill: #0b1320; stroke: url(#cyanglow); stroke-width: 2; }
.brain{ fill: #09131c; stroke: url(#cyanglow); stroke-width: 2; }
.arrow{ stroke: #11cdef; stroke-width: 2; fill: none; stroke-linecap: round; marker-end: url(#arrowhead); }
.pkt { fill: url(#cyanglow); }
.doc { fill: #0b1320; stroke: #2a4253; stroke-width: 1.2; }
`}</style>
{/* Arrowhead */}
<marker id="arrowhead" markerWidth="8" markerHeight="8" refX="6" refY="3.5" orient="auto">
<polygon points="0 0, 7 3.5, 0 7" fill="#11cdef" />
</marker>
{/* Paths for packets */}
<path id="p1" d="M 96 132 C 140 132, 164 132, 200 132" fill="none" />
<path id="p2" d="M 240 132 C 270 132, 300 132, 328 116" fill="none" />
</defs>
{/* Background */}
<rect width="382" height="282" fill="transparent" />
<rect width="382" height="282" fill="url(#grid)" opacity="0.55" />
{/* Documents (left) */}
<g transform="translate(36,84)">
{[-16, 0, 16].map((dy, i) => (
<g key={i} transform={`translate(0,${dy})`} filter="url(#glow)">
<rect x="0" y="0" width="56" height="70" rx="6" className="doc" />
<rect x="0" y="10" width="56" height="10" fill="#0f1b27" />
<line x1="10" y1="28" x2="46" y2="28" stroke="#294155" strokeWidth="2" />
<line x1="10" y1="38" x2="40" y2="38" stroke="#294155" strokeWidth="2" />
<line x1="10" y1="48" x2="44" y2="48" stroke="#294155" strokeWidth="2" />
<animateTransform attributeName="transform" type="translate" values="0,8;0,0;0,8" dur="4s" begin={`${i * 0.25}s`} repeatCount="indefinite" />
<animate attributeName="opacity" values="0.8;1;0.8" dur="3.2s" begin={`${i * 0.25}s`} repeatCount="indefinite" />
</g>
))}
</g>
{/* Arrow: docs -> vector DB */}
<path className="arrow" d="M 96 120 L 190 120" opacity="0.7" />
<path className="arrow" d="M 96 144 L 190 144" opacity="0.7" />
{/* Vector DB (middle cylinder stack) */}
<g transform="translate(190,84)" filter="url(#glow)">
{/* cylinder 1 */}
<ellipse cx="50" cy="12" rx="50" ry="12" className="cyl" fillOpacity="0.9" />
<rect x="0" y="12" width="100" height="22" className="cyl" fillOpacity="0.9" />
{/* cylinder 2 */}
<ellipse cx="50" cy="34" rx="50" ry="12" className="cyl" fillOpacity="0.9" />
<rect x="0" y="34" width="100" height="22" className="cyl" fillOpacity="0.9" />
{/* cylinder 3 */}
<ellipse cx="50" cy="56" rx="50" ry="12" className="cyl" fillOpacity="0.9" />
<rect x="0" y="56" width="100" height="22" className="cyl" fillOpacity="0.9" />
<ellipse cx="50" cy="78" rx="50" ry="12" className="cyl" />
{/* pulse */}
<rect x="0" y="12" width="100" height="68" fill="url(#cyanglow)" opacity="0.0">
<animate attributeName="opacity" values="0;0.12;0" dur="2.4s" repeatCount="indefinite" />
</rect>
</g>
{/* Arrow: DB -> model */}
<path className="arrow" d="M 290 132 L 332 112" />
{/* Model (right) */}
<g transform="translate(300,84)" filter="url(#glow)">
{/* brain-ish blob */}
<path
d="M 32 30
c 10 -16, 28 -12, 30 6
c 12 2, 14 18, 2 26
c -2 16, -18 20, -28 10
c -10 10, -28 4, -26 -12
c -12 -6, -10 -22, 6 -28
c 2 -12, 16 -12, 16 -2 z"
className="brain"
/>
{/* inner highlight */}
<circle cx="42" cy="46" r="10" fill="url(#cyanglow)" opacity="0.85">
<animate attributeName="r" values="9;12;9" dur="2.2s" repeatCount="indefinite" />
</circle>
</g>
{/* Output bubble */}
<g transform="translate(312,54)">
<rect x="-6" y="-6" width="64" height="28" rx="8" fill="#0e1724" stroke="url(#cyanglow)" strokeWidth="1.5" opacity="0.95" />
<text x="6" y="13" fontSize="10" fill="#cbe7f3" fontFamily="ui-sans-serif, system-ui">Answer </text>
<animateTransform attributeName="transform" type="translate" values="312,64;312,54;312,64" dur="3.4s" repeatCount="indefinite" />
</g>
{/* Packets along paths */}
<g>
<circle r="3.2" className="pkt">
<animateMotion dur="2.4s" repeatCount="indefinite">
<mpath href="#p1" />
</animateMotion>
</circle>
<circle r="3.2" className="pkt" opacity="0.85">
<animateMotion dur="2.0s" begin="0.35s" repeatCount="indefinite">
<mpath href="#p2" />
</animateMotion>
</circle>
</g>
</svg>
);
}

View File

@@ -0,0 +1,101 @@
"use client";
export default function RenderingSimulation() {
return (
<svg
width="382"
height="282"
viewBox="0 0 382 282"
xmlns="http://www.w3.org/2000/svg"
role="img"
aria-labelledby="title desc"
>
<title id="title">Rendering & Simulation</title>
<desc id="desc">Wireframe mesh animates and resolves into a shaded render.</desc>
<defs>
<pattern id="grid" width="16" height="16" patternUnits="userSpaceOnUse">
<path d="M16 0H0V16" fill="none" stroke="#0f1621" strokeWidth="1" />
</pattern>
<linearGradient id="cyanglow" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stopColor="#00E5FF">
<animate attributeName="stop-color" values="#00E5FF;#00B8DB;#00E5FF" dur="4s" repeatCount="indefinite" />
</stop>
<stop offset="100%" stopColor="#00B8DB">
<animate attributeName="stop-color" values="#00B8DB;#00E5FF;#00B8DB" dur="4s" repeatCount="indefinite" />
</stop>
</linearGradient>
<filter id="softGlow" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur stdDeviation="4" result="b" />
<feMerge>
<feMergeNode in="b" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<style>{`
.wire { stroke: #11cdef; stroke-width: 1.6; fill: none; opacity: 0.9; }
.tri { fill: url(#cyanglow); opacity: 0; }
`}</style>
</defs>
{/* Background */}
<rect width="382" height="282" fill="transparent" />
<rect width="382" height="282" fill="url(#grid)" opacity="0.55" />
{/* Mesh group */}
<g transform="translate(191,150)">
{/* Orbit rotation for the model */}
<g>
{/* Wireframe: icosahedron-like */}
{/* Outer ring */}
<ellipse rx="110" ry="44" className="wire">
<animateTransform attributeName="transform" type="rotate" from="0" to="360" dur="12s" repeatCount="indefinite" />
</ellipse>
{/* Cross rings */}
<ellipse rx="110" ry="44" className="wire" transform="rotate(60)">
<animateTransform attributeName="transform" type="rotate" from="60" to="420" dur="12s" repeatCount="indefinite" />
</ellipse>
<ellipse rx="110" ry="44" className="wire" transform="rotate(120)">
<animateTransform attributeName="transform" type="rotate" from="120" to="480" dur="12s" repeatCount="indefinite" />
</ellipse>
{/* Connecting chords */}
{[-80, -40, 0, 40, 80].map((a, i) => (
<line
key={i}
x1={-100}
y1={Math.sin((a * Math.PI) / 180) * 40}
x2={100}
y2={-Math.sin((a * Math.PI) / 180) * 40}
className="wire"
opacity="0.7"
/>
))}
{/* Triangles that fade in to "render" */}
<g filter="url(#softGlow)">
{/* central tri */}
<polygon points="-36,-10 0,-58 36,-10" className="tri">
<animate attributeName="opacity" values="0;0.85" dur="1.4s" begin="0.4s" fill="freeze" />
</polygon>
{/* lower tri */}
<polygon points="-30,-4 -2,30 26,-4" className="tri">
<animate attributeName="opacity" values="0;0.75" dur="1.2s" begin="0.7s" fill="freeze" />
</polygon>
{/* side tris */}
<polygon points="-62,-6 -36,-10 -46,-40" className="tri">
<animate attributeName="opacity" values="0;0.6" dur="1.0s" begin="0.9s" fill="freeze" />
</polygon>
<polygon points="62,-6 36,-10 46,-40" className="tri">
<animate attributeName="opacity" values="0;0.6" dur="1.0s" begin="1.0s" fill="freeze" />
</polygon>
</g>
</g>
</g>
</svg>
);
}

View File

@@ -42,7 +42,7 @@ export function GpuGettingStarted() {
return ( return (
<section <section
id="gpu-getting-started" id="gpu-getting-started"
className="relative overflow-hidden bg-gray-900 py-24 sm:py-32" className="relative overflow-hidden bg-[#121212] py-24 sm:py-32"
> >
<div className="absolute inset-0 bg-[radial-gradient(circle_at_top,rgba(34,211,238,0.12),transparent_60%)]" /> <div className="absolute inset-0 bg-[radial-gradient(circle_at_top,rgba(34,211,238,0.12),transparent_60%)]" />
<Container className="relative"> <Container className="relative">

View File

@@ -3,9 +3,9 @@ import { Button } from '@/components/Button'
export function CallToAction() { export function CallToAction() {
return ( return (
<section className='relative overflow-hidden bg-gray-900'> <section className='relative overflow-hidden bg-[#121212]'>
{/* ✅ Top horizontal line with spacing */} {/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-[#111111] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div> <div className="max-w-7xl bg-[#121212] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
{/* === Content === */} {/* === Content === */}
<div className="w-full border-t border-l border-r border-gray-800 " /> <div className="w-full border-t border-l border-r border-gray-800 " />
<div <div

View File

@@ -1,7 +1,7 @@
"use client"; "use client";
import { Container } from '@/components/Container' import { Container } from '@/components/Container'
import { Eyebrow, H3, P } from '@/components/Texts' import { CT, CP, Eyebrow, H3, P } from '@/components/Texts'
/* ✅ Custom Icons (unchanged) */ /* ✅ Custom Icons (unchanged) */
@@ -142,8 +142,8 @@ export function HomeHosting() {
hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20 bg-white" hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20 bg-white"
> >
<feature.icon className="h-14 w-14" /> <feature.icon className="h-14 w-14" />
<h3 className="mt-4 font-semibold text-gray-900">{feature.name}</h3> <CT className="mt-4 text-gray-900">{feature.name}</CT>
<p className="mt-2 text-gray-700 leading-snug">{feature.description}</p> <CP className="mt-2 text-gray-700 leading-snug">{feature.description}</CP>
</li> </li>
))} ))}
</ul> </ul>

View File

@@ -1,7 +1,7 @@
"use client"; "use client";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { Eyebrow, H3, P } from "@/components/Texts"; import { CP, CT, Eyebrow, H3, P } from "@/components/Texts";
const bentoCards = [ const bentoCards = [
{ {
@@ -107,10 +107,10 @@ export function HomeTab() {
/> />
<div className="px-8 pt-4 pb-6"> <div className="px-8 pt-4 pb-6">
<h3 className="text-sm/4 font-semibold text-cyan-500">{card.eyebrow}</h3> <h3 className="text-sm/4 font-semibold text-cyan-500">{card.eyebrow}</h3>
<p className="mt-2 text-lg font-medium lg:text-xl tracking-tight text-gray-950">{card.title}</p> <CT className="mt-2 text-lg lg:text-xl tracking-tight text-gray-950">{card.title}</CT>
<p className="mt-1 max-w-lg text-sm/6 text-gray-600"> <CP className="mt-1 max-w-lg text-gray-600">
{card.description} {card.description}
</p> </CP>
</div> </div>
</div> </div>
<div className={`pointer-events-none absolute inset-0 rounded-lg shadow-sm outline outline-black/5 ${card.rounded}`} /> <div className={`pointer-events-none absolute inset-0 rounded-lg shadow-sm outline outline-black/5 ${card.rounded}`} />

View File

@@ -7,7 +7,7 @@ import { FadeIn } from "@/components/ui/FadeIn";
export function StackSectionDark() { export function StackSectionDark() {
return ( return (
<section className="relative w-full bg-[#171717] overflow-hidden"> <section className="relative w-full bg-[#121212] overflow-hidden">
{/* ✅ Top horizontal line with spacing */} {/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl bg-[#111111] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div> <div className="max-w-7xl bg-[#111111] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
<div className="w-full border-t border-l border-r border-gray-800" /> <div className="w-full border-t border-l border-r border-gray-800" />

View File

@@ -42,7 +42,7 @@ export function HomeFeaturesDark() {
<div className="mx-auto mt-16 max-w-2xl lg:max-w-7xl"> <div className="mx-auto mt-16 max-w-2xl lg:max-w-7xl">
<div className="grid grid-cols-1 gap-x-12 gap-y-12 lg:grid-cols-3"> <div className="grid grid-cols-1 gap-x-12 gap-y-12 lg:grid-cols-3">
{features.map((feature) => ( {features.map((feature) => (
<div key={feature.name} className="relative flex flex-col p-8 rounded-3xl border border-gray-700 bg-gray-900/50 backdrop-blur-lg overflow-hidden shadow-2xl hover:shadow-cyan-500/40 hover:border-cyan-500 hover:scale-105 transform transition-all duration-300"> <div key={feature.name} className="relative flex flex-col p-8 rounded-3xl border border-gray-800 bg-[#121212] /50 backdrop-blur-lg overflow-hidden shadow-2xl hover:shadow-cyan-500/40 hover:border-cyan-500 hover:scale-105 transform transition-all duration-300">
<div className="w-20 h-20 bg-gray-800/80 rounded-full flex items-center justify-center"> <div className="w-20 h-20 bg-gray-800/80 rounded-full flex items-center justify-center">
<feature.icon className="h-12 w-12 text-cyan-500" /> <feature.icon className="h-12 w-12 text-cyan-500" />
</div> </div>

View File

@@ -6,7 +6,7 @@ export function About() {
return ( return (
<section <section
id="about" id="about"
className="relative overflow-hidden bg-gray-900 py-20 lg:py-32 lg:top-0 top-0" className="relative overflow-hidden bg-[#121212] py-20 lg:py-32 lg:top-0 top-0"
> >
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2"> <div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
<CircleBackground color="#06b6d4" className="animate-spin-slower" /> <CircleBackground color="#06b6d4" className="animate-spin-slower" />

View File

@@ -1,40 +1,53 @@
import { CircleBackground } from '../../components/CircleBackground' "use client";
import { Container } from '@/components/Container'
import { Button } from '@/components/Button' import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
export function CallToAction() { export function CallToAction() {
return ( return (
<section <section className="relative overflow-hidden bg-[#121212]">
id="get-started" {/* ✅ Top horizontal line with spacing */}
className="relative overflow-hidden bg-gray-900 py-20 sm:py-28" <div className="max-w-7xl bg-[#121212] mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
> <div className="w-full border-t border-l border-r border-gray-800" />
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
<CircleBackground color="#06b6d4" className="animate-spin-slower" /> {/* ✅ Main boxed area */}
</div> <div
<Container className="relative"> id="get-started"
<div className="mx-auto max-w-2xl text-center"> className="relative py-18 max-w-7xl mx-auto bg-[#111111] border border-t-0 border-b-0 border-gray-800"
<h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl"> >
Choose How You Want to Start
</h2>
<p className="mt-6 text-lg text-gray-300"> <Container className="relative">
Use the network to connect workloads or host nodes to deepen mesh resilience and run your environments on your own hardware. <div className="mx-auto max-w-3xl text-center">
</p> <h2 className="text-3xl lg:text-4xl font-medium tracking-tight text-white sm:text-4xl">
<div className="mt-10 flex flex-wrap justify-center gap-x-6 gap-y-4"> Choose How You Want to Start
<Button to="/download" variant="solid" color="white"> </h2>
Get Mycelium Network
</Button> <p className="mt-6 text-lg text-gray-300">
<Button Use the network to connect workloads or host nodes to deepen mesh resilience and run your environments on your own hardware.
to="https://threefold.info/mycelium_network/docs/" </p>
as="a"
target="_blank" {/* ✅ Two cards, stacked center with spacing */}
variant="outline" <div className="mt-10 flex flex-wrap justify-center gap-x-10 gap-y-8">
color="white" <div className="flex flex-col items-center text-center max-w-xs">
> <Button to="/download" variant="solid" color="cyan" className="mt-4">
Host a Node Get Mycelium Network
</Button> </Button>
</div>
<div className="flex flex-col items-center text-center max-w-xs">
<Button to="https://threefold.info/mycelium_network/docs/" as="a" target="_blank" variant="outline" color="white" className="mt-4">
Host a Node
</Button>
</div>
</div>
</div> </div>
</div> </Container>
</Container> </div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-800" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
</section> </section>
) );
} }

View File

@@ -3,7 +3,7 @@ import MessageBus from './animations/MessageBus'
import ProxyDetection from './animations/ProxyDetection' import ProxyDetection from './animations/ProxyDetection'
import ProxyForwarding from './animations/ProxyForwarding' import ProxyForwarding from './animations/ProxyForwarding'
import ContentDistribution from './animations/ContentDistribution' import ContentDistribution from './animations/ContentDistribution'
import { H2, P, H3, CT, CP, Eyebrow } from '@/components/Texts' import { P, H3, Eyebrow } from '@/components/Texts'
export function Features() { export function Features() {
return ( return (

View File

@@ -2,7 +2,7 @@ import { useId } from 'react'
import { Container } from '@/components/Container' import { Container } from '@/components/Container'
import { Button } from '@/components/Button' import { Button } from '@/components/Button'
import phoneFrame from '../../images/phoneframe.png' import phoneFrame from '../../images/phoneframe.png'
import { H3, Eyebrow, P, CT, CP } from "@/components/Texts"; import { H3, P, CT } from "@/components/Texts";
function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) { function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) {
let id = useId() let id = useId()

View File

@@ -1,64 +1,127 @@
import { Container } from '@/components/Container' "use client";
import { Eyebrow, SectionHeader, P } from '@/components/Texts'
import { useRef } from "react";
import { Eyebrow, SectionHeader, P } from "@/components/Texts";
import { IoArrowBackOutline, IoArrowForwardOutline } from "react-icons/io5";
import {
LockClosedIcon,
ArrowPathIcon,
GlobeAltIcon,
} from "@heroicons/react/24/solid";
const networkUseCases = [ const networkUseCases = [
{ {
title: 'Secure Access to Self-Hosted Services', isIntro: true,
eyebrow: "USE CASES",
title: "Private Connectivity for People, Services, and Infrastructures",
description: description:
'Access your services, VMs, and clusters remotely without VPNs, public IPs, or port forwarding.', "Mycelium Network provides a secure, autonomous communication layer that works across homes, clouds, edge workloads, and global deployments.",
ideal:
'Ideal for: homelabs, personal clouds, long-running self-hosted stacks',
}, },
{ {
title: 'Service-to-Service Networking Across Environments', title: "Secure Access to Self-Hosted Services",
description: description:
'Connect applications running across home labs, cloud regions, edge nodes, and data centers all on one address space.', "Access your services, VMs, and clusters remotely without VPNs, public IPs, or port forwarding.",
ideal: ideal: "Ideal for: homelabs, personal clouds, long-running self-hosted stacks",
'Ideal for: dev teams, distributed apps, container + K3s workloads', icon: LockClosedIcon,
}, },
{ {
title: 'Resilient Connectivity Across Regions & Outages', title: "Service-to-Service Networking Across Environments",
description: description:
'Connect systems across countries, datacenters, edge locations, and remote deployments — with routing that automatically heals around ISP failures, censorship, and regional outages.', "Connect applications running across home labs, cloud regions, edge nodes, and data centers all on one address space.",
ideal: ideal: "Ideal for: dev teams, distributed apps, container + K3s workloads",
'Ideal for: research networks, cross-border orgs, distributed compute, off-grid / rural deployments', icon: GlobeAltIcon,
}, },
] {
title: "Resilient Connectivity Across Regions & Outages",
description:
"Connect systems across countries, datacenters, edge locations, and remote deployments — with routing that automatically heals around ISP failures, censorship, and regional outages.",
ideal:
"Ideal for: research networks, cross-border orgs, distributed compute, off-grid / rural deployments",
icon: ArrowPathIcon,
},
];
export function NetworkUsecases() { export function NetworkUsecases() {
return ( const sliderRef = useRef<HTMLUListElement>(null);
<section className="bg-white py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl text-center">
<Eyebrow>USE CASES</Eyebrow>
<SectionHeader as="h2" className="mt-6 text-gray-900">
Private Connectivity for People, Services, and Infrastructures
</SectionHeader>
<P className="mt-6 text-gray-600">
Mycelium Network provides a secure, autonomous communication layer
that works across homes, clouds, edge workloads, and global deployments.
</P>
</div>
<div className="mx-auto mt-16 max-w-5xl grid gap-8 lg:grid-cols-3"> const scrollLeft = () =>
{networkUseCases.map((useCase) => ( sliderRef.current?.scrollBy({ left: -400, behavior: "smooth" });
<div
key={useCase.title} const scrollRight = () =>
className="rounded-3xl border border-slate-200 bg-white p-8 shadow-sm transition hover:-translate-y-1 hover:border-cyan-300 hover:shadow-lg" sliderRef.current?.scrollBy({ left: 400, behavior: "smooth" });
return (
<section className="bg-white w-full max-w-8xl mx-auto">
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-slate-200" />
<div className="w-full border-t border-l border-r border-slate-200" />
<div className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-slate-200 bg-white overflow-hidden">
<ul
ref={sliderRef}
className="flex overflow-x-auto snap-x snap-mandatory scroll-smooth no-scrollbar"
>
{networkUseCases.map((item, idx) => (
<li
key={idx}
className={`snap-start shrink-0 w-[85%] sm:w-[50%] lg:w-[33%] border border-slate-200 p-10 relative ${
item.isIntro ? "bg-gray-50/80" : "bg-white"
}`}
> >
<h3 className="text-xl font-semibold text-gray-900"> {item.isIntro ? (
{useCase.title} <div className="flex flex-col justify-between h-full">
</h3> <div>
<p className="mt-4 text-sm leading-relaxed text-gray-600"> <Eyebrow>{item.eyebrow}</Eyebrow>
{useCase.description} <SectionHeader
</p> as="h3"
<p className="mt-4 text-xs font-medium text-cyan-700"> className="mt-4 text-gray-900 text-xl lg:text-2xl"
{useCase.ideal} >
</p> {item.title}
</div> </SectionHeader>
<P className="mt-4 text-gray-600 text-sm lg:text-base">
{item.description}
</P>
</div>
<div className="flex items-center gap-x-4 mt-2">
<button
onClick={scrollLeft}
className="h-8 w-8 flex items-center justify-center border border-slate-300 rounded-md hover:border-cyan-500 transition-colors"
>
<IoArrowBackOutline className="text-gray-600" size={16} />
</button>
<button
onClick={scrollRight}
className="h-8 w-8 flex items-center justify-center border border-slate-300 rounded-md hover:border-cyan-500 transition-colors"
>
<IoArrowForwardOutline className="text-gray-600" size={16} />
</button>
</div>
</div>
) : (
<>
{/* ✅ Icon above title */}
{item.icon && (
<div className="h-10 w-10 flex items-center justify-center rounded-xl bg-gray-100 mb-4">
<item.icon className="h-6 w-6 text-cyan-600" />
</div>
)}
<p className="text-lg font-semibold text-gray-900">
{item.title}
</p>
<p className="mt-2 text-gray-600 leading-snug">
{item.description}
</p>
<p className="mt-3 text-xs font-medium text-cyan-700">
{item.ideal}
</p>
</>
)}
</li>
))} ))}
</div> </ul>
</Container> </div>
</section> </section>
) );
} }

View File

@@ -185,7 +185,7 @@ const bodyAnimation: MotionProps = {
function InviteScreen() { function InviteScreen() {
return ( return (
<AppScreen className="w-full"> <AppScreen className="w-full">
<img src={connectorImg} alt="Mycelium Connector" width="366" height="732" className="mt-[-2rem]" /> <img src={connectorImg} alt="Mycelium Connector" width="366" height="732" className="-mt-8" />
</AppScreen> </AppScreen>
) )
} }
@@ -193,7 +193,7 @@ function InviteScreen() {
function StocksScreen() { function StocksScreen() {
return ( return (
<AppScreen className="w-full"> <AppScreen className="w-full">
<img src={peersImg} alt="Mycelium Peers" width="366" height="732" className="mt-[-2rem]" /> <img src={peersImg} alt="Mycelium Peers" width="366" height="732" className="-mt-8" />
</AppScreen> </AppScreen>
) )
} }
@@ -201,7 +201,7 @@ function StocksScreen() {
function InvestScreen() { function InvestScreen() {
return ( return (
<AppScreen className="w-full"> <AppScreen className="w-full">
<img src={settingImg} alt="Mycelium Settings" width="366" height="732" className="mt-[-2rem]" /> <img src={settingImg} alt="Mycelium Settings" width="366" height="732" className="-mt-8" />
</AppScreen> </AppScreen>
) )
} }

View File

@@ -1,5 +1,6 @@
import { useId } from 'react' import { useId } from 'react'
import { Container } from '@/components/Container' import { Container } from '@/components/Container'
import { CP } from '@/components/Texts'
const features = [ const features = [
{ {
@@ -187,12 +188,14 @@ function DeviceChartIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
export function SecondaryFeatures() { export function SecondaryFeatures() {
return ( return (
<section <section className="w-full max-w-8xl mx-auto bg-transparent">
id="comingsoon"
aria-label="Features for building a portfolio" {/* ✅ Top horizontal line with spacing */}
className="py-20 sm:py-32" <div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
> <div className="w-full border-t border-l border-r border-gray-100" />
<Container>
<Container className="py-12 border border-t-0 border-b-0 border-gray-100">
<div className="mx-auto max-w-4xl sm:text-center"> <div className="mx-auto max-w-4xl sm:text-center">
<h2 className="text-base/7 font-semibold text-cyan-500">IN ACTIVE EVOLUTION</h2> <h2 className="text-base/7 font-semibold text-cyan-500">IN ACTIVE EVOLUTION</h2>
<p className="text-3xl lg:text-4xl font-medium tracking-tight text-gray-900"> <p className="text-3xl lg:text-4xl font-medium tracking-tight text-gray-900">
@@ -204,7 +207,7 @@ export function SecondaryFeatures() {
</div> </div>
<ul <ul
role="list" role="list"
className="mx-auto mt-16 grid max-w-2xl grid-cols-1 gap-6 text-sm sm:mt-20 sm:grid-cols-2 md:gap-y-10 lg:max-w-none lg:grid-cols-3" className="mx-auto mt-12 grid max-w-2xl grid-cols-1 gap-6 text-sm sm:grid-cols-2 md:gap-y-10 lg:max-w-none lg:grid-cols-3"
> >
{features.map((feature) => ( {features.map((feature) => (
<li <li
@@ -212,14 +215,17 @@ export function SecondaryFeatures() {
className="rounded-2xl border border-gray-100 p-8 transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20" className="rounded-2xl border border-gray-100 p-8 transition-all duration-300 ease-in-out hover:scale-105 hover:border-cyan-500 hover:shadow-lg hover:shadow-cyan-500/20"
> >
<feature.icon className="h-8 w-8" /> <feature.icon className="h-8 w-8" />
<h3 className="mt-6 font-semibold text-gray-900"> <CP className="mt-6 font-semibold text-gray-900">
{feature.name} {feature.name}
</h3> </CP>
<p className="mt-2 text-gray-700">{feature.description}</p> <p className="mt-2 text-gray-700">{feature.description}</p>
</li> </li>
))} ))}
</ul> </ul>
</Container> </Container>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-100" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-100"></div>
</section> </section>
) )
} }

View File

@@ -0,0 +1,11 @@
import Homepod from './Homepod';
const PodsPage = () => {
return (
<>
<Homepod />
</>
);
};
export default PodsPage;

View File

@@ -5,15 +5,15 @@ import { Button } from "@/components/Button";
export function CallToAction() { export function CallToAction() {
return ( return (
<section className="relative overflow-hidden bg-gray-900"> <section className="relative overflow-hidden bg-[#121212] ">
{/* ✅ Top horizontal line with spacing */} {/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-700"></div> <div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
<div className="w-full border-t border-l border-r border-gray-700" /> <div className="w-full border-t border-l border-r border-gray-800" />
{/* ✅ Main boxed area */} {/* ✅ Main boxed area */}
<div <div
id="get-started" id="get-started"
className="relative py-18 max-w-7xl mx-auto bg-[#090909] border border-t-0 border-b-0 border-gray-700" className="relative py-18 max-w-7xl mx-auto bg-[#111111] border border-t-0 border-b-0 border-gray-800"
> >
<Container className="relative"> <Container className="relative">
<div className="mx-auto max-w-3xl text-center"> <div className="mx-auto max-w-3xl text-center">
@@ -59,8 +59,8 @@ export function CallToAction() {
</div> </div>
{/* ✅ Bottom horizontal line with spacing */} {/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-700" /> <div className="w-full border-b border-gray-800" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-700 bg-transparent" /> <div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
</section> </section>
); );
} }

View File

@@ -2,7 +2,7 @@
import { useState } from "react"; import { useState } from "react";
import { Container } from "@/components/Container"; import { Container } from "@/components/Container";
import { Eyebrow, SectionHeader, P, H3, H4, H5, CT, CP } from "@/components/Texts"; import { Eyebrow, P, H3, H5, CP } from "@/components/Texts";
const architecture = [ const architecture = [
{ {
@@ -49,7 +49,7 @@ export function StorageArchitecture() {
{architecture.map((item, index) => ( {architecture.map((item, index) => (
<button <button
key={item.title} key={item.title}
className={`w-full border bg-[#171717] text-left border-white/10 p-4 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/8 className={`w-full border bg-[#121212] text-left border-white/10 p-4 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/8
${active === index ${active === index
? "border-cyan-400 shadow-md" ? "border-cyan-400 shadow-md"
: "border-gray-800 hover:border-cyan-200 hover:shadow-sm"}`} : "border-gray-800 hover:border-cyan-200 hover:shadow-sm"}`}
@@ -61,7 +61,7 @@ export function StorageArchitecture() {
</div> </div>
{/* RIGHT — 2 columns */} {/* RIGHT — 2 columns */}
<div className="lg:col-span-2 flex items-center justify-center border border-gray-800 bg-[#171717] p-10 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/8" > <div className="lg:col-span-2 flex items-center justify-center border border-gray-800 bg-[#121212] p-10 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/8" >
<div <div
key={active} // ✅ force smooth transition key={active} // ✅ force smooth transition
className="transition-opacity duration-300 opacity-100 animate-fade" className="transition-opacity duration-300 opacity-100 animate-fade"

View File

@@ -1,7 +1,7 @@
"use client"; "use client";
import { useRef } from "react"; import { useRef } from "react";
import { Eyebrow, CP, CT, H5 } from "@/components/Texts"; import { Eyebrow, H5 } from "@/components/Texts";
import { IoArrowBackOutline, IoArrowForwardOutline } from "react-icons/io5"; import { IoArrowBackOutline, IoArrowForwardOutline } from "react-icons/io5";
const capabilities = [ const capabilities = [
@@ -78,14 +78,14 @@ export function StorageCapabilitiesNew() {
</a> </a>
<button <button
onClick={scrollLeft} onClick={scrollLeft}
className="h-8 w-8 flex items-center justify-center border border-gray-700 rounded-md hover:border-cyan-500 transition-colors" className="h-8 w-8 flex items-center justify-center border border-gray-800 rounded-md hover:border-cyan-500 transition-colors"
> >
<IoArrowBackOutline className="text-gray-300" size={16} /> <IoArrowBackOutline className="text-gray-300" size={16} />
</button> </button>
<button <button
onClick={scrollRight} onClick={scrollRight}
className="h-8 w-8 flex items-center justify-center border border-gray-700 rounded-md hover:border-cyan-500 transition-colors" className="h-8 w-8 flex items-center justify-center border border-gray-800 rounded-md hover:border-cyan-500 transition-colors"
> >
<IoArrowForwardOutline className="text-gray-300" size={16} /> <IoArrowForwardOutline className="text-gray-300" size={16} />
</button> </button>

View File

@@ -1,7 +1,7 @@
"use client"; "use client";
import { Container } from "@/components/Container"; import { Container } from "@/components/Container";
import { H3, P, Eyebrow, CT, CP } from "@/components/Texts"; import { H3, P, Eyebrow, CT } from "@/components/Texts";
import Encrypted from "./animation/Encrypted"; import Encrypted from "./animation/Encrypted";
import SelfHealing from "./animation/SelfHealing"; import SelfHealing from "./animation/SelfHealing";
import Residency from "./animation/Residency"; import Residency from "./animation/Residency";

View File

@@ -1,4 +1,4 @@
import { Eyebrow, SectionHeader, P, Small } from '@/components/Texts' import { Small } from '@/components/Texts'
const highlights = [ const highlights = [
{ {

View File

@@ -75,7 +75,7 @@ export function StorageDeveloperExperience() {
return ( return (
<section <section
id="storage-developer-experience" id="storage-developer-experience"
className="bg-gray-900 py-24 sm:py-32" className="bg-[#121212] py-24 sm:py-32"
> >
<Container> <Container>
<div className="mx-auto max-w-3xl text-center"> <div className="mx-auto max-w-3xl text-center">

View File

@@ -10,6 +10,11 @@ export default {
sans: ['Mulish', 'system-ui', 'Avenir', 'Helvetica', 'Arial', 'sans-serif'], sans: ['Mulish', 'system-ui', 'Avenir', 'Helvetica', 'Arial', 'sans-serif'],
}, },
keyframes: { keyframes: {
scroll: {
to: {
transform: "translate(calc(-100% - var(--gap)))",
},
},
logoScroll: { logoScroll: {
'0%': { transform: 'translateX(0)' }, '0%': { transform: 'translateX(0)' },
'100%': { transform: 'translateX(-50%)' }, '100%': { transform: 'translateX(-50%)' },
@@ -30,6 +35,8 @@ export default {
}, },
}, },
animation: { animation: {
scroll:
"scroll var(--animation-duration, 40s) var(--animation-direction, forwards) linear infinite",
logoScroll: 'logoScroll 16s linear infinite', logoScroll: 'logoScroll 16s linear infinite',
'glitch-1': 'glitch-1 1s infinite', 'glitch-1': 'glitch-1 1s infinite',
'glitch-2': 'glitch-2 1s infinite', 'glitch-2': 'glitch-2 1s infinite',

View File

@@ -14,7 +14,7 @@
/* Bundler mode */ /* Bundler mode */
"moduleResolution": "bundler", "moduleResolution": "bundler",
"allowImportingTsExtensions": true, "allowImportingTsExtensions": false,
"verbatimModuleSyntax": true, "verbatimModuleSyntax": true,
"moduleDetection": "force", "moduleDetection": "force",
"noEmit": true, "noEmit": true,