16 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
100cae988c refactor: adjust network page styling and typography
- Changed heading levels from H3 to H4 in NetworkCapabilities for better hierarchy
- Updated PrimaryFeatures section with darker background and consistent border styling
- Removed text-lg class from paragraph for standard sizing
2025-11-07 23:21:55 +01:00
716915b19e refactor: update background colors in ComputeUseCases component 2025-11-07 23:21:45 +01:00
f04a7eb3cf feat: redesign network page with improved layout and typography
- Replaced hardcoded text elements with reusable typography components (H2, H3, P, Eyebrow, CT, CP)
- Updated NetworkCapabilities section with dark theme, two-column layout, and visual separators
- Added consistent border styling and spacing across Features and Hero sections
2025-11-07 23:13:40 +01:00
de89539de1 feat: redesign storage use cases section with tabbed layout
- Replaced StorageUseCases with StorageUseCasesNew component featuring interactive tabs
- Implemented two-column layout with tab content on left and image on right
- Added three use case categories: distributed storage, data sovereignty, and content distribution
2025-11-07 23:13:27 +01:00
1851c2d6fb refactor: adjust spacing and styling in compute pages
- Reduced vertical spacing between header and content sections for tighter layout
- Changed border radius from rounded-3xl to rounded-md for consistent styling
- Added hover effect with gradient background to architecture cards
2025-11-07 23:13:18 +01:00
451c1f5c56 feat: redesign storage page with interactive components and dark theme
- Added interactive architecture section with tabbed navigation and smooth transitions
- Implemented horizontal scrolling capabilities carousel with image backgrounds
- Updated call-to-action section with bordered container layout and improved button styling
- Replaced core value section with animated self-healing storage features
- Applied consistent dark theme (#111111, #121212) with cyan accents across all storage components
2025-11-07 22:28:03 +01:00
98 changed files with 2465 additions and 637 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/encrypted.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 888 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 910 KiB

BIN
public/images/ipfs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 834 KiB

BIN
public/images/pods.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
public/images/s3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1007 KiB

View File

@@ -24,7 +24,6 @@ export function Header() {
if (currentPath.startsWith('/compute')) return 'Compute';
if (currentPath.startsWith('/storage')) return 'Storage';
if (currentPath.startsWith('/gpu')) return 'GPU';
if (currentPath.startsWith('/cloud')) return 'Cloud';
return 'Cloud';
};
@@ -40,7 +39,14 @@ export function Header() {
<Dropdown
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" />
</>
}
@@ -90,7 +96,7 @@ export function Header() {
</nav>
<Dialog as="div" className="lg:hidden" open={mobileMenuOpen} onClose={setMobileMenuOpen}>
<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">
<Link to="#" className="-m-1.5 p-1.5">
<span className="sr-only">Mycelium</span>

View File

@@ -106,7 +106,7 @@ export const H5 = createTextComponent(
)
export const Eyebrow = createTextComponent(
'h2',
'text-base/7 font-semibold tracking-[0.18em] uppercase',
'text-base/7 font-semibold uppercase tracking-[0.16em]',
{ color: 'accent' }
)
export const SectionHeader = createTextComponent(
@@ -162,5 +162,5 @@ export const DownloadCardDescription = createTextComponent(
'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')

View File

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

View File

@@ -1,7 +1,7 @@
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './styles/tailwind.css'
import App from './App.tsx'
import App from './App'
createRoot(document.getElementById('root')!).render(
<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 { GallerySection } from './GallerySection'
import { Companies } from './Companies'
import { BentoSection } from './BentoSection'
import { AgentBento } from './AgentBento'
import { AgentHeroAlt } from './AgentHeroAlt'
import { CallToAction } from './CallToAction'
import { AgentComponents } from './AgentComponents'
export default function AgentsPage() {
return (
@@ -27,11 +26,7 @@ export default function AgentsPage() {
</AnimatedSection>
<AnimatedSection>
<BentoSection />
</AnimatedSection>
<AnimatedSection>
<AgentComponents />
<AgentBento />
</AnimatedSection>
<AnimatedSection>

View File

@@ -69,7 +69,7 @@ export function BentoSection() {
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, amount: 0.2 }}
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
src={item.video}

View File

@@ -1,59 +1,57 @@
import { CircleBackground } from '../../components/CircleBackground'
import { Container } from '@/components/Container'
import { Button } from '@/components/Button'
"use client";
import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
export function CallToAction() {
return (
<section
id="get-started"
className="relative overflow-hidden bg-gray-900 py-20 sm:py-28"
>
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2">
<CircleBackground color="#06b6d4" className="animate-spin-slower" />
<section className="relative overflow-hidden bg-[#121212]">
{/* ✅ Top horizontal line with spacing */}
<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" />
{/* ✅ 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>
<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">
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>
{/* ✅ 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>
)
);
}

View File

@@ -1,7 +1,5 @@
"use client";
import { motion } from "framer-motion";
import { P, Eyebrow } from "@/components/Texts";
import { InfiniteMovingCards } from "@/components/magicui/infinite-moving-cards";
@@ -39,25 +37,10 @@ const row2 = logos.slice(6);
export function Companies() {
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 className="relative z-10 mx-auto w-full max-w-6xl 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>
<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-7xl p-4">
{/* 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
items={row1}
direction="right"

View File

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

View File

@@ -136,7 +136,7 @@ export function GallerySection() {
</div>
{/* 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">
<CP as="h4" className="max-w-[820px] h-[72px] flex items-center" color="dark">
<TypeAnimation

View File

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

View File

@@ -406,7 +406,7 @@ export function CloudFeatures() {
<section
id="overview"
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>
<div className="mx-auto max-w-2xl lg:mx-0 lg:max-w-3xl">

View File

@@ -69,7 +69,7 @@ export function CloudGettingStarted() {
return (
<section
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%)]" />
<Container className="relative">

View File

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

View File

@@ -55,9 +55,9 @@ const deterministicCards = [
export function ComputeArchitecture() {
return (
<section className="relative w-full bg-[#171717] overflow-hidden">
<section className="relative w-full bg-[#121212] overflow-hidden">
{/* ✅ 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="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">
@@ -65,12 +65,12 @@ export function ComputeArchitecture() {
{deterministicCards.map((card) => (
<div
key={card.id}
className={`relative ${card.colSpan} ${card.rowSpan} transition-transform duration-300 hover:scale-102`}
className={`relative ${card.colSpan} ${card.rowSpan} transition-transform duration-300 hover:scale-102 group`}
>
{/* ✅ Disable wrapper on first card */}
{!card.noBorder && (
<div
className={`absolute inset-0 rounded-md border border-gray-800 bg-[#111212] ${card.rounded}`}
className={`absolute inset-0 rounded-md border border-gray-800 bg-[#111212] ${card.rounded} group-hover:bg-linear-to-br from-gray-900 to-gray-800`}
/>
)}

View File

@@ -86,14 +86,14 @@ export function ComputeCapabilitiesNew() {
</a>
<button
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} />
</button>
<button
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} />
</button>

View File

@@ -64,7 +64,7 @@ export function ComputeCodeTabs() {
return (
<div className="sm:px-6 lg:px-0">
<div className="relative isolate overflow-hidden bg-cyan-600 px-6 pt-8 sm:mx-auto sm:max-w-2xl sm:rounded-3xl sm:pt-16 sm:pr-0 sm:pl-16 lg:mx-0 lg:max-w-none">
<div className="relative isolate overflow-hidden bg-cyan-600 px-6 pt-8 sm:mx-auto sm:max-w-2xl sm:rounded-md sm:pt-16 sm:pr-0 sm:pl-16 lg:mx-0 lg:max-w-none">
<div
aria-hidden="true"
@@ -72,7 +72,7 @@ export function ComputeCodeTabs() {
/>
<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 */}
<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">
<dl className="grid grid-cols-1 gap-4 lg:gap-14 overflow-hidden text-center lg:grid-cols-3">
{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" />
<CT className="">{stat.value}</CT>
<CP className="mt-1">{stat.name}</CP>

View File

@@ -31,9 +31,9 @@ export function ComputeOverview() {
/>
<CircleBackground
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>
<Container className="relative py-12 bg-white mx-auto s border border-t-0 border-b-0 border-gray-100">
@@ -50,7 +50,7 @@ export function ComputeOverview() {
Deterministic compute fabric for autonomous workloads.
</SectionHeader>
<P color="secondary" className="mt-6 text-gray-600">
<P color="secondary" className="mt-4 text-gray-600">
Mycelium Compute delivers predictable, sovereign performancefree
from lock-in and drift. Deploy any workload with cryptographic
precision, knowing the platform verifies, scales, and heals itself
@@ -63,13 +63,13 @@ export function ComputeOverview() {
</div>
{/* ✅ Light Mode Cards */}
<div className="mt-16 grid gap-6 lg:grid-cols-2">
<div className="mt-12 grid gap-6 lg:grid-cols-2">
{overviewCards.map((card) => (
<div
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"
>
<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">
<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() {
return (
<div>
<>
<AnimatedSection>
<ComputeHero />
</AnimatedSection>
@@ -43,6 +43,6 @@ export default function ComputePage() {
<AnimatedSection>
<CallToAction />
</AnimatedSection>
</div>
</>
)
}

View File

@@ -67,9 +67,9 @@ export function ComputeUseCases() {
const current = tabs.find((t) => t.id === active)!;
return (
<section className="relative w-full bg-[#171717] overflow-hidden">
<section className="relative w-full bg-[#121212] overflow-hidden">
{/* ✅ 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>
<div className="w-full border-t border-l border-r border-gray-800" />
<div className="max-w-7xl mx-auto px-6 lg:px-8 py-12 border border-t-0 border-b-0 border-gray-800 bg-[#111111] overflow-hidden">

View File

@@ -99,7 +99,7 @@ export function ComputeDeveloperExperience() {
{sample.description}
</p>
</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">
<code>{sample.code}</code>
</pre>

View File

@@ -36,7 +36,7 @@ const features = [
export function DevHub() {
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 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">
@@ -54,7 +54,7 @@ export function DevHub() {
href={feature.href}
target="_blank"
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" />
<dt className="font-semibold text-white">{feature.name}</dt>

View File

@@ -1,48 +1,67 @@
import { CircleBackground } from '../../components/CircleBackground'
import { Container } from '@/components/Container'
import { Button } from '@/components/Button'
"use client";
import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
export function CallToAction() {
return (
<section
id="get-started"
className="relative overflow-hidden bg-gray-900 py-20 sm:py-28"
>
<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.
<section className="relative overflow-hidden bg-[#121212]">
{/* ✅ Top horizontal line with spacing */}
<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" />
</p>
<div className="mt-10 flex flex-wrap justify-center gap-x-6 gap-y-4">
<Button
to="https://myceliumcloud.tf"
as="a"
variant="solid"
color="white"
target="_blank"
rel="noreferrer"
>
Deploy GPU Workloads
</Button>
<Button
to="#gpu-architecture"
as="a"
variant="outline"
color="white"
>
Host A GPU Node
</Button>
{/* ✅ 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">
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>
{/* ✅ 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="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>
</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>
)
);
}

View File

@@ -1,48 +1,79 @@
import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader } from '@/components/Texts'
const architecture = [
{
title: 'Sovereign Compute Nodes',
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.',
},
]
import { Eyebrow, H3, P } from '@/components/Texts'
import {
CpuChipIcon,
LockClosedIcon,
ShieldCheckIcon,
} from '@heroicons/react/24/solid'
export function GpuArchitecture() {
return (
<section id="gpu-architecture" className="bg-white py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl text-center">
<section id="gpu-architecture" className="w-full max-w-8xl mx-auto bg-transparent">
{/* ✅ 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>
<SectionHeader as="h2" className="mt-6 text-gray-900">
HOW IT WORKS
</SectionHeader>
<H3 className="mt-6">
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 className="mx-auto mt-16 max-w-4xl space-y-6 lg:space-y-0 lg:grid lg:grid-cols-3 lg:gap-8">
{architecture.map((item) => (
<div
key={item.title}
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">
{item.title}
</h3>
<p className="mt-3 text-sm leading-relaxed text-gray-600">
{item.description}
</p>
</div>
))}
{/* ✅ RIGHT — items stacked with cyan dividers */}
<div className="space-y-8">
{/* 1 — Sovereign Compute Nodes */}
<div>
<h3 className="text-lg font-semibold text-gray-950 flex items-center">
<CpuChipIcon className="h-6 w-6 text-cyan-500 mr-3" />
Sovereign Compute Nodes
</h3>
<p className="mt-2 text-gray-600 max-w-2xl">
GPUs run only on hardware you control eliminating reliance on centralized clouds.
</p>
<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>
</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>
)
}

View File

@@ -1,58 +1,133 @@
import {
SparklesIcon,
Cog6ToothIcon,
CubeTransparentIcon,
CpuChipIcon,
} from '@heroicons/react/24/solid'
import { Eyebrow, H3, CT, CP } from '@/components/Texts'
import { Container } from '@/components/Container'
"use client";
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',
description: 'LLMs, embeddings, transformers, fine-tuning',
icon: SparklesIcon,
isIntro: true,
eyebrow: "CAPABILITIES",
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',
description: 'GPU-backed deployments on Mycelium Cloud',
icon: Cog6ToothIcon,
name: "AI / ML Inference & Training",
description: "LLMs, embeddings, transformers, fine-tuning",
animation: InterferenceAnimation,
},
{
name: 'Rendering & Simulation',
description: 'Scientific visualization, VFX, real-time 3D',
icon: CubeTransparentIcon,
name: "Acceleration in Kubernetes Workloads",
description: "GPU-backed deployments on Mycelium Cloud",
animation: KubernetesAcceleration,
},
{
name: 'Agent Compute & RAG Pipelines',
description: 'Vector memory + model execution on sovereign hardware',
icon: CpuChipIcon,
name: "Rendering & Simulation",
description: "Scientific visualization, VFX, real-time 3D",
animation: RenderingSimulation,
},
]
{
name: "Agent Compute & RAG Pipelines",
description:
"Vector memory + model execution on sovereign hardware",
animation: RAGPipeline,
},
];
export function GpuCapabilities() {
return (
<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>
const sliderRef = useRef<HTMLUListElement>(null);
<div className="mx-auto mt-16 max-w-5xl">
<dl className="grid grid-cols-1 gap-12 sm:grid-cols-2 lg:grid-cols-4">
{capabilities.map((feature) => (
<div key={feature.name} className="flex flex-col text-center">
<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" />
const scrollLeft = () =>
sliderRef.current?.scrollBy({ left: -400, behavior: "smooth" });
const scrollRight = () =>
sliderRef.current?.scrollBy({ left: 400, behavior: "smooth" });
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>
<CT className="mt-6 text-gray-900">{feature.name}</CT>
<CP className="mt-2 text-gray-600">{feature.description}</CP>
</div>
))}
</dl>
</div>
</Container>
) : (
<>
{/* ✅ STREAMING ANIMATION REPLACES ICON */}
<div className="w-full flex items-center justify-center">
{item.animation && <item.animation />}
</div>
<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>
)
);
}

View File

@@ -1,5 +1,3 @@
import { Container } from '@/components/Container'
import { Eyebrow, H3, CT } from '@/components/Texts'
import {
BoltIcon,
BanknotesIcon,
@@ -9,51 +7,55 @@ import {
const benefits = [
{
name: 'Consistent, reserved GPU performance (no noisy neighbor effects)',
id: 1,
title: 'Consistent, reserved GPU performance (no noisy neighbor effects)',
icon: BoltIcon,
},
{
name: 'Transparent cost (no markup, no surprise billing)',
id: 2,
title: 'Transparent cost (no markup, no surprise billing)',
icon: BanknotesIcon,
},
{
name: 'Run anywhere cloud, on-prem, edge, home lab',
id: 3,
title: 'Run anywhere cloud, on-prem, edge, home lab',
icon: GlobeAltIcon,
},
{
name: 'Your data never leaves your control',
id: 4,
title: 'Your data never leaves your control',
icon: ShieldCheckIcon,
},
]
export function GpuDesign() {
return (
<section className="bg-white py-24 sm:py-32">
<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>
<section className="w-full max-w-8xl mx-auto bg-transparent">
</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" />
{/* Key Benefits */}
<div className="mx-auto mt-16 max-w-5xl">
<dl className="grid grid-cols-1 gap-12 sm:grid-cols-2 lg:grid-cols-2">
{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>
{/* ✅ 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>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border border-gray-100" />
<div className="max-w-7xl bg-transparent mx-auto py-0 border border-t-0 border-b-0 border-gray-100"></div>
</section>
)
}

View File

@@ -1,3 +1,5 @@
'use client'
import {
AdjustmentsHorizontalIcon,
GlobeAltIcon,
@@ -30,40 +32,66 @@ const coreFeatures = [
export function GpuOverview() {
return (
<section className="bg-gray-950 py-24 sm:py-32">
<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>
<section className="bg-[#121212] w-full max-w-8xl mx-auto">
<div className="mx-auto mt-16 max-w-5xl grid gap-8 sm:grid-cols-2 lg:grid-cols-3">
{coreFeatures.map((feature) => (
<div
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]"
{/* ✅ Top spacer */}
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
<div className="w-full border-t border-l border-r border-gray-800" />
{/* ✅ 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">
<feature.icon className="size-6 text-cyan-300" aria-hidden="true" />
</div>
<h3 className="text-lg font-semibold text-white">
{feature.name}
</h3>
<p className="mt-3 text-sm leading-relaxed text-gray-300">
{feature.description}
</p>
</div>
))}
</div>
</Container>
Core GPU Features
</SectionHeader>
<P className="mt-6 text-lg text-gray-300">
The Mycelium GPU fabric provides predictable, sovereign acceleration
without arbitrary limits or hidden economics.
</P>
</div>
{/* ✅ Grid matching CloudArchitecture card layout */}
<ul
role="list"
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>
)
}

View File

@@ -1,4 +1,3 @@
import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P } from '@/components/Texts'
const gpuUseCases = [
@@ -18,35 +17,52 @@ const gpuUseCases = [
export function GpuUseCases() {
return (
<section className="bg-white py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl text-center">
<section className="w-full max-w-8xl mx-auto bg-white">
{/* ✅ 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>
<SectionHeader as="h2" className="mt-6 text-gray-900">
Built for Intelligent Workloads
</SectionHeader>
<P className="mt-6 text-gray-600">
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>
</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) => (
<div
key={useCase.title}
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">
<div key={useCase.title}>
<h3 className="text-lg font-semibold text-gray-900">
{useCase.title}
</h3>
<p className="mt-3 text-sm leading-relaxed text-gray-600">
<p className="mt-2 text-gray-600 max-w-2xl">
{useCase.description}
</p>
{/* ✅ divider except last item */}
{useCase.title !== 'Distributed & Edge Compute' && (
<div className="mt-8 h-px w-full bg-cyan-300/40" />
)}
</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>
)
}

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 (
<section
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%)]" />
<Container className="relative">

View File

@@ -3,9 +3,9 @@ import { Button } from '@/components/Button'
export function CallToAction() {
return (
<section className='relative overflow-hidden bg-gray-900'>
<section className='relative overflow-hidden bg-[#121212]'>
{/* ✅ 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 === */}
<div className="w-full border-t border-l border-r border-gray-800 " />
<div

View File

@@ -1,7 +1,7 @@
"use client";
import { Container } from '@/components/Container'
import { Eyebrow, H3, P } from '@/components/Texts'
import { CT, CP, Eyebrow, H3, P } from '@/components/Texts'
/* ✅ 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"
>
<feature.icon className="h-14 w-14" />
<h3 className="mt-4 font-semibold text-gray-900">{feature.name}</h3>
<p className="mt-2 text-gray-700 leading-snug">{feature.description}</p>
<CT className="mt-4 text-gray-900">{feature.name}</CT>
<CP className="mt-2 text-gray-700 leading-snug">{feature.description}</CP>
</li>
))}
</ul>

View File

@@ -1,7 +1,7 @@
"use client";
import { Link } from "react-router-dom";
import { Eyebrow, H3, P } from "@/components/Texts";
import { CP, CT, Eyebrow, H3, P } from "@/components/Texts";
const bentoCards = [
{
@@ -107,10 +107,10 @@ export function HomeTab() {
/>
<div className="px-8 pt-4 pb-6">
<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>
<p className="mt-1 max-w-lg text-sm/6 text-gray-600">
<CT className="mt-2 text-lg lg:text-xl tracking-tight text-gray-950">{card.title}</CT>
<CP className="mt-1 max-w-lg text-gray-600">
{card.description}
</p>
</CP>
</div>
</div>
<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() {
return (
<section className="relative w-full bg-[#171717] overflow-hidden">
<section className="relative w-full bg-[#121212] overflow-hidden">
{/* ✅ 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="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="grid grid-cols-1 gap-x-12 gap-y-12 lg:grid-cols-3">
{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">
<feature.icon className="h-12 w-12 text-cyan-500" />
</div>

View File

@@ -6,7 +6,7 @@ export function About() {
return (
<section
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">
<CircleBackground color="#06b6d4" className="animate-spin-slower" />

View File

@@ -1,40 +1,53 @@
import { CircleBackground } from '../../components/CircleBackground'
import { Container } from '@/components/Container'
import { Button } from '@/components/Button'
"use client";
import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
export function CallToAction() {
return (
<section
id="get-started"
className="relative overflow-hidden bg-gray-900 py-20 sm:py-28"
>
<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 the network to connect workloads or host nodes to deepen mesh resilience and run your environments on your own hardware.
</p>
<div className="mt-10 flex flex-wrap justify-center gap-x-6 gap-y-4">
<Button to="/download" variant="solid" color="white">
Get Mycelium Network
</Button>
<Button
to="https://threefold.info/mycelium_network/docs/"
as="a"
target="_blank"
variant="outline"
color="white"
>
Host a Node
</Button>
<section className="relative overflow-hidden bg-[#121212]">
{/* ✅ Top horizontal line with spacing */}
<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" />
{/* ✅ 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">
Choose How You Want to Start
</h2>
<p className="mt-6 text-lg text-gray-300">
Use the network to connect workloads or host nodes to deepen mesh resilience and run your environments on your own hardware.
</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="/download" variant="solid" color="cyan" className="mt-4">
Get Mycelium Network
</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>
</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>
)
);
}

View File

@@ -3,27 +3,32 @@ import MessageBus from './animations/MessageBus'
import ProxyDetection from './animations/ProxyDetection'
import ProxyForwarding from './animations/ProxyForwarding'
import ContentDistribution from './animations/ContentDistribution'
import { P, H3, Eyebrow } from '@/components/Texts'
export function Features() {
return (
<section id="features" className="py-24">
<div className="mx-auto max-w-2xl px-6 lg:max-w-7xl lg:px-8">
<h2 className="text-base/7 font-semibold text-cyan-500">Core Components</h2>
<p className="mt-2 max-w-2xl text-3xl lg:text-4xl font-medium tracking-tight text-pretty text-gray-950">
Network Capabilities
</p>
<p className="mt-4 max-w-4xl text-lg text-gray-600">
<section className="w-full max-w-8xl mx-auto bg-transparent">
{/* ✅ Top spacer + full-width line */}
<div className="max-w-7xl mx-auto py-6 border-x border-gray-100 bg-white border-t-0 border-b-0" />
<div className="w-full border-t border-l border-r border-gray-100" />
<div className="mx-auto max-w-2xl px-6 lg:max-w-7xl bg-white py-12 lg:px-10 border border-t-0 border-b-0 border-gray-100">
<Eyebrow>Core Components</Eyebrow>
<H3>Network Capabilities</H3>
<P className="mt-4 max-w-4xl text-lg text-gray-600">
Built for resilience and autonomy, the Mycelium Network dynamically connects nodes through intelligent routing, proxy discovery, and decentralized delivery.
</p>
<p className="mt-2 max-w-4xl text-lg text-gray-600">
</P>
<P className="mt-4 max-w-4xl text-lg text-gray-600">
Each component from message passing to content distribution works in harmony to create a fully self-healing, self-optimizing data mesh.
</p>
<div className="mt-10 grid grid-cols-1 gap-x-4 gap-y-8 sm:mt-16 lg:grid-cols-6 lg:grid-rows-2">
</P>
<div className="mt-8 grid grid-cols-1 gap-x-4 gap-y-8 sm:mt-16 lg:grid-cols-6 lg:grid-rows-2">
<div className="group relative lg:col-span-3 transition-all duration-300 ease-in-out hover:scale-105">
<div className="absolute inset-0 rounded-lg bg-white max-lg:rounded-t-4xl lg:rounded-tl-4xl" />
<div className="relative flex h-full flex-col overflow-hidden rounded-[calc(var(--radius-lg)+1px)] max-lg:rounded-t-[calc(2rem+1px)] lg:rounded-tl-[calc(2rem+1px)]">
<Pathfinding />
<div className="p-10 pt-4">
<div className="p-6 pt-4">
<h3 className="text-sm/4 font-semibold text-cyan-500">Routing</h3>
<p className="mt-2 text-lg font-medium tracking-tight text-gray-950">
Automatic pathfinding
@@ -40,7 +45,7 @@ export function Features() {
<div className="absolute inset-0 rounded-lg bg-white lg:rounded-tr-4xl" />
<div className="relative flex h-full flex-col overflow-hidden rounded-[calc(var(--radius-lg)+1px)] lg:rounded-tr-[calc(2rem+1px)]">
<MessageBus />
<div className="p-10 pt-4">
<div className="p-6 pt-4">
<h3 className="text-sm/4 font-semibold text-cyan-500">Communication</h3>
<p className="mt-2 text-lg font-medium tracking-tight text-gray-950">
Distributed message bus
@@ -57,7 +62,7 @@ export function Features() {
<div className="absolute inset-0 rounded-lg bg-white lg:rounded-bl-4xl" />
<div className="relative flex h-full flex-col overflow-hidden rounded-[calc(var(--radius-lg)+1px)] lg:rounded-bl-[calc(2rem+1px)]">
<ProxyDetection className="h-80" />
<div className="p-10 pt-4">
<div className="p-6 pt-4">
<h3 className="text-sm/4 font-semibold text-cyan-500">Discovery</h3>
<p className="mt-2 text-lg font-medium tracking-tight text-gray-950">
Automatic proxy detection
@@ -74,7 +79,7 @@ export function Features() {
<div className="absolute inset-0 rounded-lg bg-white" />
<div className="relative flex h-full flex-col overflow-hidden rounded-[calc(var(--radius-lg)+1px)]">
<ProxyForwarding className="h-80" />
<div className="p-10 pt-4">
<div className="p-6 pt-4">
<h3 className="text-sm/4 font-semibold text-cyan-500">Connectivity</h3>
<p className="mt-2 text-lg font-medium tracking-tight text-gray-950">
Seamless proxy forwarding
@@ -91,7 +96,7 @@ export function Features() {
<div className="absolute inset-0 rounded-lg bg-white max-lg:rounded-b-4xl lg:rounded-br-4xl" />
<div className="relative flex h-full flex-col overflow-hidden rounded-[calc(var(--radius-lg)+1px)] max-lg:rounded-b-[calc(2rem+1px)] lg:rounded-br-[calc(2rem+1px)]">
<ContentDistribution className="h-80" />
<div className="p-10 pt-4">
<div className="p-6 pt-4">
<h3 className="text-sm/4 font-semibold text-cyan-500">Delivery</h3>
<p className="mt-2 text-lg font-medium tracking-tight text-gray-950">
Decentralized content distribution
@@ -106,6 +111,9 @@ export function Features() {
</div>
</div>
</div>
{/* ✅ Bottom full-width line + spacer */}
<div className="w-full border-b border-gray-100" />
<div className="max-w-7xl mx-auto py-6 border-x border-gray-100 border-t-0 border-b-0" />
</section>
)
}

View File

@@ -2,6 +2,7 @@ import { useId } from 'react'
import { Container } from '@/components/Container'
import { Button } from '@/components/Button'
import phoneFrame from '../../images/phoneframe.png'
import { H3, P, CT } from "@/components/Texts";
function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) {
let id = useId()
@@ -74,24 +75,24 @@ function BackgroundIllustration(props: React.ComponentPropsWithoutRef<'div'>) {
export function Hero() {
return (
<div className="overflow-hidden pb-24 lg:py-32 lg:pb-0">
<div className="overflow-hidden pb-24 lg:py-12 mt-10 lg:pb-0 border border-t-0 border-b border-gray-100">
<Container>
<div className="flex flex-col-reverse gap-y-16 lg:grid lg:grid-cols-12 lg:gap-x-8 lg:gap-y-20">
<div className="flex flex-col-reverse gap-y-16 lg:grid lg:grid-cols-12 lg:gap-x-8 lg:gap-y-20 px-6 lg:px-8">
<div className="relative z-10 mx-auto max-w-2xl lg:col-span-7 lg:max-w-none lg:pt-6 xl:col-span-6">
<h1 className="text-4xl font-medium tracking-tight text-gray-900 lg:text-6xl">
<H3 className="mb-4">
Mycelium Network
</h1>
<h2 className="mt-6 text-xl leading-normal tracking-tight text-gray-600 lg:text-2xl">
</H3>
<CT className="mt-8 font-medium text-gray-600 ">
Encrypted Peer-to-Peer Connectivity Across the Globe
</h2>
<p className="mt-6 text-lg leading-tight text-gray-600 lg:text-xl lg:leading-normal">
</CT>
<P className="mt-6 text-lg leading-tight text-gray-600 lg:text-xl lg:leading-normal">
Mycelium Network provides an unbreakable sovereign IPv6 mesh that connects people, nodes, and applications directly, with no central servers.
</p>
<p className="mt-6 text-lg leading-tight text-gray-600 lg:text-xl lg:leading-normal">
</P>
<P className="mt-6 text-lg leading-tight text-gray-600 lg:text-xl lg:leading-normal">
Works Alone. Works Together.
Mycelium Network can be used standalone, or together with Mycelium Cloud
for full-stack sovereignty.
</p>
</P>
<div className="mt-8 flex flex-wrap gap-x-6 gap-y-4">
<Button to="/download" variant="solid" color="cyan">
Get Mycelium Connector

View File

@@ -4,62 +4,94 @@ import {
ArrowPathRoundedSquareIcon,
NoSymbolIcon,
} from '@heroicons/react/24/solid'
import { Container } from '@/components/Container'
import { Eyebrow, H3, P, CT, CP } from '@/components/Texts'
const capabilities = [
{
name: 'End-to-End Encrypted Mesh',
description: 'Every packet is encrypted and routed peer-to-peer.',
icon: LockClosedIcon,
},
{
name: 'Global IPv6 Address Space',
description: 'Every node, app, and service gets its own private address.',
icon: GlobeAltIcon,
},
{
name: 'Self-Healing Routing',
description: 'Traffic automatically finds the fastest, most resilient path.',
icon: ArrowPathRoundedSquareIcon,
},
{
name: 'No Central Control',
description: 'No servers to trust, no middlemen, no corporate choke-points.',
icon: NoSymbolIcon,
},
]
import { Eyebrow, H4, P } from '@/components/Texts'
export function NetworkCapabilities() {
return (
<section className="bg-white py-24 sm:py-32">
<Container>
<div className="mx-auto max-w-3xl text-center">
<section className="w-full max-w-8xl mx-auto bg-[#121212]">
{/* ✅ 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-800"></div>
<div className="w-full border-t border-l border-r border-gray-800" />
{/* ✅ Main content */}
<div className="mx-auto max-w-7xl px-6 bg-[#111111] lg:px-8 grid grid-cols-1 lg:grid-cols-2 gap-20 py-12 border border-t-0 border-b-0 border-gray-800">
{/* ✅ LEFT SIDE — Title + Intro */}
<div className="max-w-xl ">
<Eyebrow>WHAT IT ENABLES</Eyebrow>
<H3 className="mt-4 text-gray-900">
<H4 className="mt-6 text-white">
A Private Networking Layer for Everything You Run
</H3>
<P className="mt-6 text-gray-600">
</H4>
<P className="mt-6 text-gray-200">
Mycelium Network is the backbone for secure, autonomous connectivity
across devices, data centers, clusters, and self-hosted environments,
anywhere in the world.
across devices, data centers, clusters, and self-hosted environments anywhere in the world.
</P>
<P className="mt-3 text-lg text-gray-200">
Every node gets its own encrypted identity and address space, forming a
zero-trust mesh without any centralized controller.
</P>
</div>
<div className="mx-auto mt-16 max-w-5xl">
<dl className="grid grid-cols-1 gap-12 sm:grid-cols-2 lg:grid-cols-4">
{capabilities.map((item) => (
<div key={item.name} className="flex flex-col text-center">
<div className="mx-auto flex size-12 items-center justify-center rounded-xl bg-cyan-50">
<item.icon className="size-6 text-cyan-600" aria-hidden="true" />
</div>
<CT className="mt-6 text-gray-900">{item.name}</CT>
<CP className="mt-2 text-gray-600">{item.description}</CP>
</div>
))}
</dl>
{/* ✅ RIGHT SIDE — 4 stacked features */}
<div className="space-y-8">
{/* 1 — Encrypted Mesh */}
<div>
<h3 className="text-lg font-semibold text-white flex items-center">
<LockClosedIcon className="h-6 w-6 text-cyan-500 mr-3" />
End-to-End Encrypted Mesh
</h3>
<p className="mt-2 text-gray-200 max-w-2xl">
Every packet is encrypted and routed peer-to-peer no intermediaries, no sniffing, no compromise.
</p>
<div className="mt-8 h-px w-full bg-cyan-500/50" />
</div>
{/* 2 — IPv6 Space */}
<div>
<h3 className="text-lg font-semibold text-white flex items-center">
<GlobeAltIcon className="h-6 w-6 text-cyan-500 mr-3" />
Global IPv6 Address Space
</h3>
<p className="mt-2 text-gray-200 max-w-2xl">
Every node, app, and microservice gets an address solving discovery, routing, and NAT issues forever.
</p>
<div className="mt-8 h-px w-full bg-cyan-500/50" />
</div>
{/* 3 — Self-Healing Routing */}
<div>
<h3 className="text-lg font-semibold text-white flex items-center">
<ArrowPathRoundedSquareIcon className="h-6 w-6 text-cyan-500 mr-3" />
Self-Healing Routing
</h3>
<p className="mt-2 text-gray-200 max-w-2xl">
Traffic automatically finds the fastest path, dynamically re-routing around failures or congestion.
</p>
<div className="mt-8 h-px w-full bg-cyan-500/50" />
</div>
{/* 4 — No Central Control */}
<div>
<h3 className="text-lg font-semibold text-white flex items-center">
<NoSymbolIcon className="h-6 w-6 text-cyan-500 mr-3" />
No Central Control
</h3>
<p className="mt-2 text-gray-200 max-w-2xl">
No servers to trust, no corporate choke points, and no authority that can turn you off.
</p>
</div>
</div>
</Container>
</div>
{/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-800" />
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>
</section>
)
}

View File

@@ -1,64 +1,127 @@
import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P } from '@/components/Texts'
"use client";
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 = [
{
title: 'Secure Access to Self-Hosted Services',
isIntro: true,
eyebrow: "USE CASES",
title: "Private Connectivity for People, Services, and Infrastructures",
description:
'Access your services, VMs, and clusters remotely without VPNs, public IPs, or port forwarding.',
ideal:
'Ideal for: homelabs, personal clouds, long-running self-hosted stacks',
"Mycelium Network provides a secure, autonomous communication layer that works across homes, clouds, edge workloads, and global deployments.",
},
{
title: 'Service-to-Service Networking Across Environments',
title: "Secure Access to Self-Hosted Services",
description:
'Connect applications running across home labs, cloud regions, edge nodes, and data centers all on one address space.',
ideal:
'Ideal for: dev teams, distributed apps, container + K3s workloads',
"Access your services, VMs, and clusters remotely without VPNs, public IPs, or port forwarding.",
ideal: "Ideal for: homelabs, personal clouds, long-running self-hosted stacks",
icon: LockClosedIcon,
},
{
title: 'Resilient Connectivity Across Regions & Outages',
title: "Service-to-Service Networking Across Environments",
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',
"Connect applications running across home labs, cloud regions, edge nodes, and data centers all on one address space.",
ideal: "Ideal for: dev teams, distributed apps, container + K3s workloads",
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() {
return (
<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>
const sliderRef = useRef<HTMLUListElement>(null);
<div className="mx-auto mt-16 max-w-5xl grid gap-8 lg:grid-cols-3">
{networkUseCases.map((useCase) => (
<div
key={useCase.title}
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"
const scrollLeft = () =>
sliderRef.current?.scrollBy({ left: -400, behavior: "smooth" });
const scrollRight = () =>
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">
{useCase.title}
</h3>
<p className="mt-4 text-sm leading-relaxed text-gray-600">
{useCase.description}
</p>
<p className="mt-4 text-xs font-medium text-cyan-700">
{useCase.ideal}
</p>
</div>
{item.isIntro ? (
<div className="flex flex-col justify-between h-full">
<div>
<Eyebrow>{item.eyebrow}</Eyebrow>
<SectionHeader
as="h3"
className="mt-4 text-gray-900 text-xl lg:text-2xl"
>
{item.title}
</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>
</Container>
</ul>
</div>
</section>
)
);
}

View File

@@ -185,7 +185,7 @@ const bodyAnimation: MotionProps = {
function InviteScreen() {
return (
<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>
)
}
@@ -193,7 +193,7 @@ function InviteScreen() {
function StocksScreen() {
return (
<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>
)
}
@@ -201,7 +201,7 @@ function StocksScreen() {
function InvestScreen() {
return (
<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>
)
}
@@ -407,10 +407,13 @@ export function PrimaryFeatures() {
<section
id="howitworks"
aria-label="Features for investing all your money"
className="bg-gray-900 py-20 sm:py-32"
className="bg-[#121212]"
>
<Container>
<div className="mx-auto max-w-2xl lg:mx-0 lg:max-w-3xl">
{/* ✅ Top horizontal line with spacing */}
<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" />
<Container className="pt-12 border border-t-0 border-b-0 border-gray-800">
<div className="mx-auto max-w-2xl lg:mx-0 lg:max-w-3xl ">
<Eyebrow color="accent">How It Works</Eyebrow>
<SectionHeader color="white" className="mt-2">
How Mycelium Operates
@@ -425,9 +428,12 @@ export function PrimaryFeatures() {
<div className="mt-16 md:hidden">
<FeaturesMobile />
</div>
<Container className="hidden md:mt-20 md:block">
<Container className="hidden pt-12 pb-12 md:block border border-t-0 border-b-0 border-gray-800">
<FeaturesDesktop />
</Container>
{/* ✅ bottom border + bottom spacer to match */}
<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>
)
}

View File

@@ -1,5 +1,6 @@
import { useId } from 'react'
import { Container } from '@/components/Container'
import { CP } from '@/components/Texts'
const features = [
{
@@ -187,12 +188,14 @@ function DeviceChartIcon(props: React.ComponentPropsWithoutRef<'svg'>) {
export function SecondaryFeatures() {
return (
<section
id="comingsoon"
aria-label="Features for building a portfolio"
className="py-20 sm:py-32"
>
<Container>
<section className="w-full max-w-8xl mx-auto bg-transparent">
{/* ✅ 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" />
<Container className="py-12 border border-t-0 border-b-0 border-gray-100">
<div className="mx-auto max-w-4xl sm:text-center">
<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">
@@ -204,7 +207,7 @@ export function SecondaryFeatures() {
</div>
<ul
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) => (
<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"
>
<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}
</h3>
</CP>
<p className="mt-2 text-gray-700">{feature.description}</p>
</li>
))}
</ul>
</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>
)
}

View File

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

View File

@@ -1,48 +1,66 @@
import { CircleBackground } from '../../components/CircleBackground'
import { Container } from '@/components/Container'
import { Button } from '@/components/Button'
"use client";
import { Container } from "@/components/Container";
import { Button } from "@/components/Button";
export function CallToAction() {
return (
<section
id="get-started"
className="relative overflow-hidden bg-gray-900 py-20 sm:py-28"
>
<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">
Store data in your Mycelium Cloud environment
or host your own node for full sovereignty.
<section className="relative overflow-hidden bg-[#121212] ">
{/* ✅ 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>
<div className="w-full border-t border-l border-r border-gray-800" />
</p>
<div className="mt-10 flex flex-wrap justify-center gap-x-6 gap-y-4">
<Button
to="https://myceliumcloud.tf"
as="a"
variant="solid"
color="white"
target="_blank"
rel="noreferrer"
>
Use Storage in Cloud
</Button>
<Button
to="#storage-developer-experience"
as="a"
variant="outline"
color="white"
>
Host a Node
</Button>
{/* ✅ 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">
Choose How You Want to Start
</h2>
<p className="mt-6 text-lg text-gray-300">
Store data in your Mycelium Cloud environment
or host your own node for full sovereignty.
</p>
{/* ✅ Two cards, stacked center with spacing */}
<div className="mt-8 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="https://myceliumcloud.tf"
as="a"
variant="solid"
color="cyan"
className="mt-4"
target="_blank"
rel="noreferrer"
>
Use Storage in Cloud
</Button>
</div>
<div className="flex flex-col items-center text-center max-w-xs">
<Button
to="#storage-developer-experience"
as="a"
variant="outline"
color="white"
className="mt-4"
>
Host a Node
</Button>
</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>
)
);
}

View File

@@ -1,54 +1,81 @@
import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P } from '@/components/Texts'
"use client";
import { useState } from "react";
import { Container } from "@/components/Container";
import { Eyebrow, P, H3, H5, CP } from "@/components/Texts";
const architecture = [
{
title: 'Encrypted Storage Substrate',
description: 'Keeps data private and verifiable.',
title: "Encrypted Storage Substrate",
description: "Keeps data private and verifiable.",
},
{
title: 'Mesh Routing Layer',
description: 'Connects clients and workloads securely, anywhere.',
title: "Mesh Routing Layer",
description: "Connects clients and workloads securely, anywhere.",
},
{
title: 'Protocol Gateway Layer',
title: "Protocol Gateway Layer",
description:
'Serve the same dataset over S3, IPFS, WebDAV, or HTTP.',
"Serve the same dataset over S3, IPFS, WebDAV, or HTTP.",
},
]
];
export function StorageArchitecture() {
const [active, setActive] = useState(0);
return (
<section className="bg-gray-50 py-24 sm:py-32">
<Container>
<section className="bg-[#121212] w-full max-w-8xl mx-auto">
{/* ✅ 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" />
{/* ✅ Boxed container */}
<Container className="bg-[#111111] w-full max-w-7xl mx-auto py-12 border border-t-0 border-b-0 border-gray-800">
<div className="mx-auto max-w-3xl text-center">
<Eyebrow>ARCHITECTURE</Eyebrow>
<SectionHeader as="h2" className="mt-6 text-gray-900">
HOW IT WORKS
</SectionHeader>
<P className="mt-6 text-gray-600">
<H3 className="mt-4 text-white">
How it Works
</H3>
<P className="mt-6 text-gray-400">
A layered design that encrypts, routes, and exposes storage through
multiple protocols without duplicating data or compromising
sovereignty.
</P>
</div>
<div className="mx-auto mt-16 max-w-4xl space-y-6">
{architecture.map((item) => (
{/* ✅ New 2-column layout */}
<div className="mx-auto mt-8 grid max-w-5xl grid-cols-1 gap-2 lg:grid-cols-3 bg-[#121212] ">
{/* LEFT — 1 column (3 rows) */}
<div className="space-y-2">
{architecture.map((item, index) => (
<button
key={item.title}
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
? "border-cyan-400 shadow-md"
: "border-gray-800 hover:border-cyan-200 hover:shadow-sm"}`}
onClick={() => setActive(index)}
>
<CP className="text-white font-semibold">{item.title}</CP>
</button>
))}
</div>
{/* RIGHT — 2 columns */}
<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
key={item.title}
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"
key={active} // ✅ force smooth transition
className="transition-opacity duration-300 opacity-100 animate-fade"
>
<h3 className="text-xl font-semibold text-gray-900">
{item.title}
</h3>
<p className="mt-3 text-sm leading-relaxed text-gray-600">
{item.description}
</p>
<H5 className="text-white">{architecture[active].title}</H5>
<P className="mt-2 text-gray-400 max-w-xl">
{architecture[active].description}
</P>
</div>
))}
</div>
</div>
</Container>
<div className="w-full border-b border-gray-800 bg-[#121212]" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800" />
</section>
)
);
}

View File

@@ -0,0 +1,110 @@
"use client";
import { useRef } from "react";
import { Eyebrow, H5 } from "@/components/Texts";
import { IoArrowBackOutline, IoArrowForwardOutline } from "react-icons/io5";
const capabilities = [
{
isIntro: true,
eyebrow: "CAPABILITIES",
title: "Flexible, Resilient, and Controllable Storage",
description:
"Mycelium Storage is designed for modern data workloads, providing a range of access methods and control over data placement.",
},
{
title: "S3-Compatible Object Storage",
description: "Works with existing SDKs & tooling.",
imageUrl: "/images/s3.png",
},
{
title: "IPFS & Content-Addressed Access",
description: "Ideal for distributed and decentralized workloads.",
imageUrl: "/images/ipfs.png",
},
{
title: "Filesystem Mounts (WebDAV / POSIX)",
description: "Mount storage directly into workflows and apps.",
imageUrl: "/images/filesystem.png",
},
{
title: "Encrypted Replication & Placement Control",
description: "Choose data's ownership and locations.",
imageUrl: "/images/encrypted.png",
},
];
export function StorageCapabilitiesNew() {
const sliderRef = useRef<HTMLUListElement>(null);
const scrollLeft = () => sliderRef.current?.scrollBy({ left: -400, behavior: "smooth" });
const scrollRight = () => sliderRef.current?.scrollBy({ left: 400, behavior: "smooth" });
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 — shows part of next card */}
<ul
ref={sliderRef}
className="flex overflow-x-auto snap-x snap-mandatory scroll-smooth no-scrollbar"
>
{capabilities.map((item, idx) => (
<li
key={idx}
className={`snap-start shrink-0 w-[85%] sm:w-[50%] lg:w-[33%] border border-gray-800 relative ${item.isIntro ? ' p-10' : 'bg-cover bg-center'}`}
style={item.imageUrl ? { backgroundImage: `url(${item.imageUrl})` } : {}}
>
<div className={`relative z-10 flex flex-col h-full ${item.isIntro ? 'justify-between' : 'justify-end'}`}>
{/* First card with arrows */}
{item.isIntro ? (
<div className="flex flex-col justify-between h-full ">
<div>
<Eyebrow className="">{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>
{/* Arrows inside first card */}
<div className="flex items-center gap-x-4 mt-2">
<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 className="bg-[#111111] p-6 h-20 flex flex-col justify-center border-t border-b-0 border-gray-800">
<p className="text-base font-semibold text-white">{item.title}</p>
<p className="mt-2 text-gray-400 leading-snug">{item.description}</p>
</div>
)}
</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>
);
}

View File

@@ -1,20 +1,37 @@
"use client";
import { Container } from "@/components/Container";
import { H3, P, Eyebrow } from "@/components/Texts";
import { H3, P, Eyebrow, CT } from "@/components/Texts";
import Encrypted from "./animation/Encrypted";
import SelfHealing from "./animation/SelfHealing";
import Residency from "./animation/Residency";
export function StorageCoreValue() {
const logos = [
{ src: '/images/logo/cryptpad.png', href: 'https://cryptpad.fr' },
{ src: '/images/logo/gitea.png', href: 'https://about.gitea.com' },
{ src: '/images/logo/lifekit.png', href: '#' }, // No link available
{ src: '/images/logo/matrix.png', href: 'https://matrix.org' },
{ src: '/images/logo/nextcloud.png', href: 'https://nextcloud.com' },
{ src: '/images/logo/stalwart.png', href: 'https://stalw.art' },
];
const values = [
{ id: "Encrypted",
title: "Encrypted and verifiable at rest and in motion",
href: "#",
animation: Encrypted,
},
{ id: "SelfHealing",
title: "Self-healing replication and integrity checks",
href: "#",
animation: SelfHealing,
},
{ id: "Residency",
title: "Residency + governance policies you actually control",
href: "#",
animation: Residency,
},
]
return (
<section className="w-full max-w-8xl mx-auto bg-transparent">
{/* ✅ 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" />
{/* ✅ Boxed container */}
<div className="max-w-7xl bg-white mx-auto py-12 border border-t-0 border-b-0 border-gray-100">
@@ -23,31 +40,29 @@ export function StorageCoreValue() {
<Eyebrow className="text-cyan-500">Featured Blueprint</Eyebrow>
<H3 className="text-3xl lg:text-4xl font-medium tracking-tight text-gray-900 mt-2">
Your Personal Sovereign Cloud Workspace
Sovereign Storage That Heals Itself
</H3>
<P className="mt-6 text-lg text-gray-600">
Digital Me is an example environment built to demonstrate whats possible on top of the Mycelium Stack a full personal cloud you can deploy, customize, or extend. Your files, communication, apps, and optional AI agent, all running privately on infrastructure you choose.
Mycelium Storage continuously verifies integrity and restores replicas automatically, so data stays available without operational overhead.
</P>
</div>
{/* ✅ 3x2 logo grid */}
<div className="mt-12 grid grid-cols-3 gap-x-8 gap-y-12">
{logos.map((logo, i) => (
<div key={i} className="flex justify-center">
<a
href={logo.href}
target="_blank"
rel="noopener noreferrer"
className="transition-transform duration-300 hover:scale-105"
>
<img
src={logo.src}
alt={`Logo ${i + 1}`}
className="max-h-12 w-auto object-contain"
/>
</a>
</div>
{values.map((value, i) => (
<a
key={i}
href={value.href}
target="_blank"
rel="noopener noreferrer"
className="flex flex-col items-center text-center p-6 border border-gray-200 rounded-lg transition-transform duration-300 hover:scale-105 hover:shadow-lg"
>
<value.animation />
<CT className="text-gray-900 mt-4 font-semibold">
{value.title}
</CT>
</a>
))}
</div>
</Container>

View File

@@ -1,5 +1,4 @@
import { Container } from '@/components/Container'
import { Eyebrow, SectionHeader, P, Small } from '@/components/Texts'
import { Small } from '@/components/Texts'
const highlights = [
{
@@ -24,27 +23,17 @@ const highlights = [
export function StorageOverview() {
return (
<section className="bg-gray-950 py-24 sm:py-32">
<Container>
<section className="bg-[#121212] w-full max-w-8xl mx-auto">
{/* ✅ Top horizontal line with spacing */}
<div className="max-w-7xl mx-auto 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="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">
Built on sovereign infrastructure, Mycelium Storage keeps data
resilient, verifiable, and instantly accessible. Encryption,
replication, and governance are woven directly into the substrate.
</P>
</div>
<div className="mt-16 grid gap-8 lg:grid-cols-3">
<div className="bg-[#121212] w-full max-w-7xl mx-auto border border-t-0 border-b-0 border-gray-800">
<div className="grid lg:grid-cols-3">
{highlights.map((item) => (
<div
key={item.title}
className="group relative overflow-hidden rounded-3xl border border-white/10 bg-white/4 p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 hover:bg-white/8"
className="group relative overflow-hidden border border-white/10 bg-white/4 p-8 backdrop-blur-sm transition hover:border-cyan-300/50 hover:bg-white/8"
>
<div className="absolute inset-0 bg-linear-to-br from-cyan-500/0 via-white/5 to-cyan-300/20 opacity-0 transition group-hover:opacity-100" />
<div className="relative">
@@ -61,7 +50,9 @@ export function StorageOverview() {
</div>
))}
</div>
</Container>
</div>
<div className="w-full border-b border-gray-800 bg-[#121212]" />
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800" />
</section>
)
}

View File

@@ -2,10 +2,10 @@ import { AnimatedSection } from '../../components/AnimatedSection'
import { StorageHero } from './StorageHero'
import { StorageOverview } from './StorageOverview'
import { StorageArchitecture } from './StorageArchitecture'
import { StorageUseCases } from './StorageUseCases'
import { CallToAction } from './CallToAction'
import { StorageCapabilities } from './StorageCapabilities'
import { StorageDesign } from './StorageDesign'
import { StorageCapabilitiesNew } from './StorageCapabilitiesNew'
import { StorageCoreValue } from './StorageCoreValue'
import { StorageUseCasesNew } from './StorageUseCasesNew'
export default function StoragePage() {
return (
@@ -15,11 +15,11 @@ export default function StoragePage() {
</AnimatedSection>
<AnimatedSection>
<StorageCapabilities />
<StorageCapabilitiesNew />
</AnimatedSection>
<AnimatedSection>
<StorageDesign />
<StorageCoreValue />
</AnimatedSection>
<AnimatedSection>
@@ -31,9 +31,10 @@ export default function StoragePage() {
</AnimatedSection>
<AnimatedSection>
<StorageUseCases />
<StorageUseCasesNew />
</AnimatedSection>
<AnimatedSection>
<CallToAction />
</AnimatedSection>

View File

@@ -0,0 +1,108 @@
"use client";
import { useState } from "react";
import { Eyebrow, H3, P } from "@/components/Texts";
const tabs = [
{
id: "distributed",
label: "Distributed Application Storage",
content: [
{
item: "Application-native storage",
desc: "Serve data to services, agents, clusters, or edge workloads.",
},
],
},
{
id: "sovereignty",
label: "Data Sovereignty & Compliance",
content: [
{
item: "Residency-aware storage",
desc: "Keep data under your control, choose residency per dataset.",
},
],
},
{
id: "distribution",
label: "Content Distribution",
content: [
{
item: "Decentralized delivery",
desc: "Serve public or private assets globally, without centralized hosting.",
},
],
},
];
export function StorageUseCasesNew() {
const [active, setActive] = useState("distributed");
const current = tabs.find((t) => t.id === active)!;
return (
<section className="relative w-full overflow-hidden">
{/* Top lines */}
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
<div className="w-full border-t border-l border-r border-gray-200" />
<div className="max-w-7xl mx-auto px-6 lg:px-8 py-12 border border-t-0 border-b-0 border-gray-200 bg-white overflow-hidden">
{/* ✅ Two columns: ALL TEXT LEFT, IMAGE RIGHT */}
<div className="grid grid-cols-1 lg:grid-cols-2 gap-16">
{/* LEFT COLUMN: Full tab + content */}
<div className="w-full text-gray-900">
<Eyebrow color="accent">Use Cases</Eyebrow>
<H3>Built for Real Data Workloads</H3>
<P className="max-w-3xl text-gray-600 mt-4">
Mycelium Storage adapts to compliance-driven enterprise data, distributed application workloads,
and global asset delivery without giving up sovereignty.
</P>
{/* Tabs */}
<div className="flex gap-6 border-b border-gray-200 pb-2 overflow-x-auto mt-12">
{tabs.map((tab) => (
<button
key={tab.id}
onClick={() => setActive(tab.id)}
className={`text-sm font-medium tracking-wide pb-2 whitespace-nowrap ${
active === tab.id
? "border-b-2 border-cyan-500 text-gray-900"
: "text-gray-500 hover:text-gray-900"
}`}
>
{tab.label}
</button>
))}
</div>
{/* Content always stacked in a single column */}
<div className="mt-6 space-y-6">
{current.content.map((c, i) => (
<div key={i}>
<p className="text-base font-medium text-gray-900">{c.item}</p>
<p className="text-sm text-gray-600 leading-relaxed">{c.desc}</p>
</div>
))}
</div>
</div>
{/* RIGHT COLUMN: Image */}
<div className="w-full">
<img
src="/images/testpic.png"
alt="Storage Illustration"
className="w-full h-auto rounded-xl border border-gray-200 object-cover"
/>
</div>
</div>
</div>
{/* Bottom lines */}
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-200" />
<div className="w-full border-b border-gray-200" />
</section>
);
}

View File

@@ -0,0 +1,223 @@
"use client";
import { motion, useReducedMotion } from "framer-motion";
import clsx from "clsx";
type Props = {
className?: string;
accent?: string;
gridStroke?: string;
stroke?: string;
};
const W = 760;
const H = 420;
export default function Residency({
className,
accent = "#00b8db",
gridStroke = "#e5e7eb",
stroke = "#111111",
}: Props) {
const prefers = useReducedMotion();
// Layout: central governance node + 3 regional nodes
const center = { x: 380, y: 200 };
const regions = [
{ x: 220, y: 120 },
{ x: 540, y: 120 },
{ x: 380, y: 300 },
];
// Path for data transfer (circular motion between regions)
const flowPath = `M ${regions[0].x} ${regions[0].y}
C 300 80, 460 80, ${regions[1].x} ${regions[1].y}
C 480 160, 420 260, ${regions[2].x} ${regions[2].y}
C 340 260, 280 160, ${regions[0].x} ${regions[0].y} Z`;
return (
<div
className={clsx("relative overflow-hidden", className)}
aria-hidden="true"
role="img"
style={{ background: "transparent" }}
>
<svg viewBox={`0 0 ${W} ${H}`} className="w-full h-full">
{/* ✅ Subtle light grid (same as Encrypted.tsx) */}
<defs>
<pattern id="grid-residency" width="28" height="28" patternUnits="userSpaceOnUse">
<path
d="M 28 0 L 0 0 0 28"
fill="none"
stroke={gridStroke}
strokeWidth="1"
opacity="0.4"
/>
</pattern>
<filter id="res-glow">
<feGaussianBlur stdDeviation="3" result="b" />
<feMerge>
<feMergeNode in="b" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
</defs>
<rect width={W} height={H} fill="url(#grid-residency)" />
{/* ✅ Base dotted jurisdiction boundary */}
<circle
cx={center.x}
cy={center.y}
r={140}
fill="none"
stroke={stroke}
strokeWidth={2}
strokeDasharray="6 6"
opacity="0.3"
/>
{/* ✅ Cyan policy ring expanding + fading */}
{!prefers && (
<motion.circle
cx={center.x}
cy={center.y}
r={140}
stroke={accent}
strokeWidth={2}
fill="none"
initial={{ scale: 0.9, opacity: 0 }}
animate={{
scale: [1, 1.15, 1.3],
opacity: [0.15, 0.4, 0],
}}
transition={{
duration: 2.8,
repeat: Infinity,
ease: [0.22, 1, 0.36, 1],
}}
filter="url(#res-glow)"
/>
)}
{/* ✅ Cyan glow radius (policy control zone) */}
{!prefers && (
<motion.circle
cx={center.x}
cy={center.y}
r={60}
fill={accent}
opacity={0.08}
initial={{ scale: 1, opacity: 0.05 }}
animate={{
opacity: [0.05, 0.15, 0.05],
scale: [1, 1.05, 1],
}}
transition={{
duration: 2,
repeat: Infinity,
ease: [0.22, 1, 0.36, 1],
}}
/>
)}
{/* ✅ Central governance node */}
<circle
cx={center.x}
cy={center.y}
r={28}
fill="#fff"
stroke={stroke}
strokeWidth={2}
/>
<circle
cx={center.x}
cy={center.y}
r={12}
fill={accent}
stroke={stroke}
strokeWidth={2}
filter="url(#res-glow)"
/>
{/* ✅ Regional nodes */}
{regions.map((r, i) => (
<g key={i}>
<circle
cx={r.x}
cy={r.y}
r={22}
fill="#fff"
stroke={stroke}
strokeWidth={2}
/>
<circle
cx={r.x}
cy={r.y}
r={10}
fill="none"
stroke={stroke}
strokeWidth={1.5}
opacity="0.6"
/>
</g>
))}
{/* ✅ Data transfer flow (light dotted path) */}
<motion.path
d={flowPath}
fill="none"
stroke={stroke}
strokeWidth={1.5}
strokeDasharray="4 4"
opacity="0.3"
initial={{ pathLength: 0 }}
animate={{ pathLength: 1 }}
transition={{ duration: 1.4 }}
/>
{/* ✅ Cyan packet traveling within jurisdiction */}
{!prefers && (
<motion.circle
r={6}
fill={accent}
style={{ offsetPath: `path('${flowPath}')` }}
initial={{ offsetDistance: "0%", opacity: 0 }}
animate={{
offsetDistance: ["0%", "100%"],
opacity: [0.3, 1, 0.3],
}}
transition={{
duration: 4,
repeat: Infinity,
ease: "linear",
}}
filter="url(#res-glow)"
/>
)}
{/* ✅ Governance shield icon */}
<motion.path
d={`M ${center.x} ${center.y - 70}
L ${center.x + 20} ${center.y - 60}
L ${center.x + 16} ${center.y - 35}
L ${center.x} ${center.y - 25}
L ${center.x - 16} ${center.y - 35}
L ${center.x - 20} ${center.y - 60}
Z`}
fill="none"
stroke={accent}
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
initial={{ pathLength: 0 }}
animate={{ pathLength: 1 }}
transition={{ duration: 1.2, ease: [0.22, 1, 0.36, 1] }}
filter="url(#res-glow)"
/>
</svg>
</div>
);
}

View File

@@ -0,0 +1,214 @@
"use client";
import { motion, useReducedMotion } from "framer-motion";
import clsx from "clsx";
type Props = {
className?: string;
accent?: string;
gridStroke?: string;
stroke?: string;
};
const W = 760;
const H = 420;
export default function SelfHealing({
className,
accent = "#00b8db",
gridStroke = "#e5e7eb",
stroke = "#111111",
}: Props) {
const prefers = useReducedMotion();
// diamond node layout
const nodes = [
{ x: 380, y: 130 }, // top
{ x: 240, y: 240 }, // left
{ x: 520, y: 240 }, // right
{ x: 380, y: 320 }, // bottom
];
// connection paths
const links = [
[0, 1],
[0, 2],
[1, 3],
[2, 3],
[1, 2],
];
// helper for path drawing
const drawLine = (i: number, j: number) => {
const a = nodes[i];
const b = nodes[j];
return `M ${a.x} ${a.y} L ${b.x} ${b.y}`;
};
return (
<div
className={clsx("relative overflow-hidden", className)}
aria-hidden="true"
role="img"
style={{ background: "transparent" }}
>
<svg viewBox={`0 0 ${W} ${H}`} className="w-full h-full">
{/* ✅ Subtle grid (same as Encrypted.tsx) */}
<defs>
<pattern id="grid-heal" width="28" height="28" patternUnits="userSpaceOnUse">
<path
d="M 28 0 L 0 0 0 28"
fill="none"
stroke={gridStroke}
strokeWidth="1"
opacity="0.4"
/>
</pattern>
<filter id="glow">
<feGaussianBlur stdDeviation="3" result="b" />
<feMerge>
<feMergeNode in="b" />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
</defs>
<rect width={W} height={H} fill="url(#grid-heal)" />
{/* ✅ Static network links */}
{links.map(([i, j], idx) => (
<motion.path
key={idx}
d={drawLine(i, j)}
stroke={stroke}
strokeWidth={2}
strokeLinecap="round"
fill="none"
opacity="0.25"
initial={{ pathLength: 0 }}
animate={{ pathLength: 1 }}
transition={{ duration: 0.8, delay: idx * 0.1 }}
/>
))}
{/* ✅ Circulating health-check pulse */}
{!prefers &&
[0, 1, 2, 3].map((i) => {
const next = (i + 1) % 4;
const path = drawLine(i, next);
return (
<motion.circle
key={`pulse-${i}`}
r={5}
fill={accent}
style={{ offsetPath: `path('${path}')` }}
initial={{ offsetDistance: "0%", opacity: 0 }}
animate={{
offsetDistance: ["0%", "100%"],
opacity: [0.1, 0.9, 0.1],
}}
transition={{
duration: 2.8,
delay: i * 0.4,
repeat: Infinity,
ease: "linear",
}}
filter="url(#glow)"
/>
);
})}
{/* ✅ Nodes */}
{nodes.map((n, i) => (
<g key={`node-${i}`}>
<circle
cx={n.x}
cy={n.y}
r={26}
fill="none"
stroke={stroke}
strokeWidth={2}
opacity="0.8"
/>
<circle
cx={n.x}
cy={n.y}
r={12}
fill="#fff"
stroke={stroke}
strokeWidth={2}
/>
</g>
))}
{/* ✅ Simulated failure (bottom node flickers out, then heals) */}
{!prefers && (
<motion.circle
cx={nodes[3].x}
cy={nodes[3].y}
r={12}
fill="#fff"
stroke={stroke}
strokeWidth={2}
animate={{
opacity: [1, 0.2, 1, 1],
scale: [1, 0.9, 1, 1],
}}
transition={{
duration: 4,
repeat: Infinity,
ease: "easeInOut",
}}
/>
)}
{/* ✅ Healing pulse wave from neighbors → bottom node */}
{!prefers &&
[nodes[1], nodes[2]].map((n, i) => {
const path = `M ${n.x} ${n.y} L ${nodes[3].x} ${nodes[3].y}`;
return (
<motion.circle
key={`heal-${i}`}
r={5}
fill={accent}
style={{ offsetPath: `path('${path}')` }}
initial={{ offsetDistance: "0%", opacity: 0 }}
animate={{
offsetDistance: ["0%", "100%"],
opacity: [0, 1, 0],
}}
transition={{
delay: 1.5 + i * 0.2,
duration: 1.8,
repeat: Infinity,
repeatDelay: 2.2,
ease: "linear",
}}
filter="url(#glow)"
/>
);
})}
{/* ✅ Integrity halo on healed node */}
{!prefers && (
<motion.circle
cx={nodes[3].x}
cy={nodes[3].y}
r={32}
fill="none"
stroke={accent}
strokeWidth={2}
initial={{ opacity: 0 }}
animate={{ opacity: [0.15, 0.4, 0.15], scale: [1, 1.12, 1] }}
transition={{
duration: 2.8,
repeat: Infinity,
ease: [0.22, 1, 0.36, 1],
}}
filter="url(#glow)"
/>
)}
</svg>
</div>
);
}

View File

@@ -75,7 +75,7 @@ export function StorageDeveloperExperience() {
return (
<section
id="storage-developer-experience"
className="bg-gray-900 py-24 sm:py-32"
className="bg-[#121212] py-24 sm:py-32"
>
<Container>
<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'],
},
keyframes: {
scroll: {
to: {
transform: "translate(calc(-100% - var(--gap)))",
},
},
logoScroll: {
'0%': { transform: 'translateX(0)' },
'100%': { transform: 'translateX(-50%)' },
@@ -30,6 +35,8 @@ export default {
},
},
animation: {
scroll:
"scroll var(--animation-duration, 40s) var(--animation-direction, forwards) linear infinite",
logoScroll: 'logoScroll 16s linear infinite',
'glitch-1': 'glitch-1 1s infinite',
'glitch-2': 'glitch-2 1s infinite',

View File

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