refactor: simplify navigation structure and update homepage content

- Removed Cloud dropdown menu and flattened navigation to direct links (Network, Cloud, Pods, Agents, Node)
- Reordered navigation items for better flow and renamed "Nodes" to "Node" for consistency
- Updated homepage hero and CTA sections with clearer messaging focused on digital sovereignty and infrastructure control
- Added new bento grid images for visual refresh
This commit is contained in:
2025-11-14 15:41:21 +01:00
parent 48954151c9
commit d1fc11ce80
12 changed files with 257 additions and 247 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

View File

@@ -15,23 +15,20 @@ export function Footer() {
</div> </div>
</div> </div>
<nav className="mt-10 flex gap-8"> <nav className="mt-10 flex gap-8">
<Link to="/" className="text-sm text-gray-700 hover:text-cyan-500 transition-colors"> <Link to="/network" className="text-sm text-gray-700 hover:text-cyan-500 transition-colors">
Home Network
</Link> </Link>
<Link to="/cloud" className="text-sm text-gray-700 hover:text-cyan-500 transition-colors"> <Link to="/cloud" className="text-sm text-gray-700 hover:text-cyan-500 transition-colors">
Cloud Cloud
</Link> </Link>
<Link to="/network" className="text-sm text-gray-700 hover:text-cyan-500 transition-colors"> <Link to="/pods" className="text-sm text-gray-700 hover:text-cyan-500 transition-colors">
Network Pods
</Link> </Link>
<Link to="/agents" className="text-sm text-gray-700 hover:text-cyan-500 transition-colors"> <Link to="/agents" className="text-sm text-gray-700 hover:text-cyan-500 transition-colors">
Agents Agents
</Link> </Link>
<Link to="/pods" className="text-sm text-gray-700 hover:text-cyan-500 transition-colors"> <Link to="/node" className="text-sm text-gray-700 hover:text-cyan-500 transition-colors">
Pods Node
</Link>
<Link to="/nodes" className="text-sm text-gray-700 hover:text-cyan-500 transition-colors">
Nodes
</Link> </Link>
</nav> </nav>
</div> </div>

View File

@@ -1,32 +1,14 @@
import { useState } from 'react' import { useState } from 'react'
import { Link, useLocation } from 'react-router-dom' import { Link } from 'react-router-dom'
import { Dropdown } from './ui/Dropdown'
import { ChevronDownIcon } from '@heroicons/react/20/solid'
import { Container } from './Container' import { Container } from './Container'
import { Button } from './Button' import { Button } from './Button'
import pmyceliumLogo from '../images/logos/logo_1.png' import pmyceliumLogo from '../images/logos/logo_1.png'
import { Dialog } from '@headlessui/react' import { Dialog } from '@headlessui/react'
import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline' import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline'
const cloudNavItems = [
{ name: 'Cloud', href: '/cloud' },
{ name: 'Compute', href: '/compute' },
{ name: 'Storage', href: '/storage' },
{ name: 'GPU', href: '/gpu' },
]
export function Header() { export function Header() {
const location = useLocation()
const [mobileMenuOpen, setMobileMenuOpen] = useState(false) const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
const getCurrentPageName = () => {
const currentPath = location.pathname;
if (currentPath.startsWith('/compute')) return 'Compute';
if (currentPath.startsWith('/storage')) return 'Storage';
if (currentPath.startsWith('/gpu')) return 'GPU';
return 'Cloud';
};
return ( return (
<header className="bg-white"> <header className="bg-white">
<nav className="border-b border-gray-100"> <nav className="border-b border-gray-100">
@@ -36,22 +18,6 @@ export function Header() {
<img src={pmyceliumLogo} alt="Mycelium" className="h-8 w-auto" /> <img src={pmyceliumLogo} alt="Mycelium" className="h-8 w-auto" />
</Link> </Link>
<div className="hidden lg:flex lg:gap-10"> <div className="hidden lg:flex lg:gap-10">
<Dropdown
buttonContent={
<>
{['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" />
</>
}
items={cloudNavItems}
/>
<Link <Link
to="/network" to="/network"
className="text-base/7 tracking-tight text-gray-700 hover:text-cyan-500 transition-colors" className="text-base/7 tracking-tight text-gray-700 hover:text-cyan-500 transition-colors"
@@ -59,10 +25,10 @@ export function Header() {
Network Network
</Link> </Link>
<Link <Link
to="/agents" to="/cloud"
className="text-base/7 tracking-tight text-gray-700 hover:text-cyan-500 transition-colors" className="text-base/7 tracking-tight text-gray-700 hover:text-cyan-500 transition-colors"
> >
Agents Cloud
</Link> </Link>
<Link <Link
to="/pods" to="/pods"
@@ -71,10 +37,16 @@ export function Header() {
Pods Pods
</Link> </Link>
<Link <Link
to="/nodes" to="/agents"
className="text-base/7 tracking-tight text-gray-700 hover:text-cyan-500 transition-colors" className="text-base/7 tracking-tight text-gray-700 hover:text-cyan-500 transition-colors"
> >
Nodes Agents
</Link>
<Link
to="/node"
className="text-base/7 tracking-tight text-gray-700 hover:text-cyan-500 transition-colors"
>
Node
</Link> </Link>
</div> </div>
</div> </div>
@@ -130,16 +102,6 @@ export function Header() {
<div className="mt-6 flow-root"> <div className="mt-6 flow-root">
<div className="-my-6 divide-y divide-gray-500/10"> <div className="-my-6 divide-y divide-gray-500/10">
<div className="space-y-2 py-6"> <div className="space-y-2 py-6">
{cloudNavItems.map((item) => (
<Link
key={item.name}
to={item.href}
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50"
onClick={() => setMobileMenuOpen(false)}
>
{item.name}
</Link>
))}
<Link <Link
to="/network" to="/network"
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50" className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50"
@@ -148,11 +110,11 @@ export function Header() {
Network Network
</Link> </Link>
<Link <Link
to="/agents" to="/cloud"
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50" className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50"
onClick={() => setMobileMenuOpen(false)} onClick={() => setMobileMenuOpen(false)}
> >
Agents Cloud
</Link> </Link>
<Link <Link
to="/pods" to="/pods"
@@ -162,11 +124,18 @@ export function Header() {
Pods Pods
</Link> </Link>
<Link <Link
to="/nodes" to="/agents"
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50" className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50"
onClick={() => setMobileMenuOpen(false)} onClick={() => setMobileMenuOpen(false)}
> >
Nodes Agents
</Link>
<Link
to="/node"
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50"
onClick={() => setMobileMenuOpen(false)}
>
Node
</Link> </Link>
</div> </div>
<div className="py-6"> <div className="py-6">

View File

@@ -1,32 +1,14 @@
import { useState } from 'react' import { useState } from 'react'
import { Link, useLocation } from 'react-router-dom' import { Link } from 'react-router-dom'
import { Dropdown } from './ui/Dropdown'
import { ChevronDownIcon } from '@heroicons/react/20/solid'
import { Container } from './Container' import { Container } from './Container'
import { Button } from './Button' import { Button } from './Button'
import pmyceliumLogo from '../images/logos/logo_1.png' import pmyceliumLogo from '../images/logos/logo_1.png'
import { Dialog } from '@headlessui/react' import { Dialog } from '@headlessui/react'
import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline' import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline'
const cloudNavItems = [
{ name: 'Cloud', href: '/cloud' },
{ name: 'Compute', href: '/compute' },
{ name: 'Storage', href: '/storage' },
{ name: 'GPU', href: '/gpu' },
]
export function HeaderDark() { export function HeaderDark() {
const location = useLocation()
const [mobileMenuOpen, setMobileMenuOpen] = useState(false) const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
const getCurrentPageName = () => {
const currentPath = location.pathname;
if (currentPath.startsWith('/compute')) return 'Compute';
if (currentPath.startsWith('/storage')) return 'Storage';
if (currentPath.startsWith('/gpu')) return 'GPU';
return 'Cloud';
};
return ( return (
<header className="bg-[#111111]"> <header className="bg-[#111111]">
<nav className="border-b border-gray-800"> <nav className="border-b border-gray-800">
@@ -36,28 +18,24 @@ export function HeaderDark() {
<img src={pmyceliumLogo} alt="Mycelium" className="h-8 w-auto" /> <img src={pmyceliumLogo} alt="Mycelium" className="h-8 w-auto" />
</Link> </Link>
<div className="hidden lg:flex lg:gap-10"> <div className="hidden lg:flex lg:gap-10">
<Dropdown
buttonContent={
<>
{['Compute', 'Storage', 'GPU'].includes(getCurrentPageName()) ? (
<>
<span className="text-gray-400">Cloud {' >'} </span>
<span className="text-white">{getCurrentPageName()}</span>
</>
) : (
<span className="text-white">Cloud</span>
)}
<ChevronDownIcon className="h-5 w-5 text-white" aria-hidden="true" />
</>
}
items={cloudNavItems}
/>
<Link <Link
to="/network" to="/network"
className="text-base/7 tracking-tight text-gray-300 hover:text-cyan-400 transition-colors" className="text-base/7 tracking-tight text-gray-300 hover:text-cyan-400 transition-colors"
> >
Network Network
</Link> </Link>
<Link
to="/cloud"
className="text-base/7 tracking-tight text-gray-300 hover:text-cyan-400 transition-colors"
>
Cloud
</Link>
<Link
to="/pods"
className="text-base/7 tracking-tight text-gray-300 hover:text-cyan-400 transition-colors"
>
Pods
</Link>
<Link <Link
to="/agents" to="/agents"
className="text-base/7 tracking-tight text-gray-300 hover:text-cyan-400 transition-colors" className="text-base/7 tracking-tight text-gray-300 hover:text-cyan-400 transition-colors"
@@ -65,10 +43,10 @@ export function HeaderDark() {
Agents Agents
</Link> </Link>
<Link <Link
to="/pods" to="/node"
className="text-base/7 tracking-tight text-gray-300 hover:text-cyan-400 transition-colors" className="text-base/7 tracking-tight text-gray-300 hover:text-cyan-400 transition-colors"
> >
Pods Node
</Link> </Link>
</div> </div>
</div> </div>
@@ -124,16 +102,6 @@ export function HeaderDark() {
<div className="mt-6 flow-root"> <div className="mt-6 flow-root">
<div className="-my-6 divide-y divide-gray-500/20"> <div className="-my-6 divide-y divide-gray-500/20">
<div className="space-y-2 py-6"> <div className="space-y-2 py-6">
{cloudNavItems.map((item) => (
<Link
key={item.name}
to={item.href}
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-white hover:bg-gray-800"
onClick={() => setMobileMenuOpen(false)}
>
{item.name}
</Link>
))}
<Link <Link
to="/network" to="/network"
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-white hover:bg-gray-800" className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-white hover:bg-gray-800"
@@ -141,6 +109,20 @@ export function HeaderDark() {
> >
Network Network
</Link> </Link>
<Link
to="/cloud"
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-white hover:bg-gray-800"
onClick={() => setMobileMenuOpen(false)}
>
Cloud
</Link>
<Link
to="/pods"
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-white hover:bg-gray-800"
onClick={() => setMobileMenuOpen(false)}
>
Pods
</Link>
<Link <Link
to="/agents" to="/agents"
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-white hover:bg-gray-800" className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-white hover:bg-gray-800"
@@ -149,11 +131,11 @@ export function HeaderDark() {
Agents Agents
</Link> </Link>
<Link <Link
to="/pods" to="/node"
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-white hover:bg-gray-800" className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-white hover:bg-gray-800"
onClick={() => setMobileMenuOpen(false)} onClick={() => setMobileMenuOpen(false)}
> >
Pods Node
</Link> </Link>
</div> </div>
<div className="py-6"> <div className="py-6">

View File

@@ -37,38 +37,35 @@ export function CallToAction() {
</svg> </svg>
<Container className="relative"> <Container className="relative">
<div className="mx-auto max-w-2xl text-center"> <div className="mx-auto max-w-3xl text-center">
<H3 className=" text-white "> <H3 className=" text-white ">
A Living Network Use the Mycelium Stack Your Way
</H3> </H3>
<P className="mt-6 text-gray-300"> <P className="mt-6 text-gray-300">
Mycelium isnt a platform. Deploy infrastructure, run workloads, connect environments, and build distributed AI systems, all on one network designed for autonomy and control.
Its the soil where a new internet grows open, resilient, and alive.
</P> </P>
<P className="mt-4 text-gray-300"> <P className="mt-4 text-gray-300">
The self-sovereign network powering the next internet. Start wherever you are. Scale on your own terms.
</P> </P>
<div className="mt-10 flex flex-wrap justify-center gap-x-6 gap-y-4"> <div className="mt-10 flex flex-wrap justify-center items-center gap-x-6 gap-y-4">
<Button to="/cloud" variant="solid" color="cyan"> <Button to="/network" variant="solid" color="cyan">
Join Mycelium Join the Network
</Button> </Button>
<Button <Button
to="https://threefold.info/mycelium_network/docs/" to="/cloud"
as="a"
target="_blank"
variant="outline" variant="outline"
color="white" color="white"
> >
Join Early Cloud Access Deploy in Cloud
</Button> </Button>
<Button to="#" variant="solid" color="cyan"> <a href="/node" className="text-cyan-400 hover:text-cyan-300 transition-colors">
Join the Waitlist Host a Node &rarr;
</Button> </a>
</div> </div>
</div> </div>
</Container> </Container>

View File

@@ -11,7 +11,7 @@ const deterministicCards = [
eyebrow: "Why It Matters", eyebrow: "Why It Matters",
title: "Built for a Sovereign Digital World", title: "Built for a Sovereign Digital World",
description: description:
"The current internet is a rent-seeking one. Mycelium builds one that belongs to everyone — where infrastructure, data, and intelligence stay with the people and organizations who create them.", "The modern internet still runs on centralized platforms that own the servers, shape the rules, and extract the data. Mycelium gives you a way out. You operate the infrastructure. You keep the data. You decide the boundaries.",
animation: null, animation: null,
colSpan: "lg:col-span-3", colSpan: "lg:col-span-3",
rowSpan: "lg:row-span-1", rowSpan: "lg:row-span-1",
@@ -35,18 +35,29 @@ const deterministicCards = [
description: description:
"You own your data. Run services and AI models on your own devices, ensuring privacy and control.", "You own your data. Run services and AI models on your own devices, ensuring privacy and control.",
animation: <NoExtraction className="lg:-mt-12" />, // ✅ NEW animation: <NoExtraction className="lg:-mt-12" />, // ✅ NEW
colSpan: "lg:col-span-3", colSpan: "lg:col-span-2",
rowSpan: "lg:row-span-1", rowSpan: "lg:row-span-1",
rounded: "lg:rounded-bl-4xl max-lg:rounded-b-4xl", rounded: "lg:rounded-bl-4xl max-lg:rounded-b-4xl",
innerRounded: "lg:rounded-bl-[calc(2rem+1px)] max-lg:rounded-b-[calc(2rem+1px)]", innerRounded: "lg:rounded-bl-[calc(2rem+1px)] max-lg:rounded-b-[calc(2rem+1px)]",
}, },
{ {
id: "healing", id: "healing",
title: "No single point of control.", title: "No single point of failure.",
description: description:
"No single entity can dictate or censor your online experience.", "No single entity can dictate or censor your online experience.",
animation: <NoControl />, // ✅ NEW animation: <NoControl />, // ✅ NEW
colSpan: "lg:col-span-3", colSpan: "lg:col-span-2",
rowSpan: "lg:row-span-1",
rounded: "",
innerRounded: "",
},
{
id: "control",
title: "No single point of control.",
description:
"Infrastructure that moves with its operators, not a corporation.",
animation: <NoControl />, // ✅ NEW
colSpan: "lg:col-span-2",
rowSpan: "lg:row-span-1", rowSpan: "lg:row-span-1",
rounded: "lg:rounded-br-4xl max-lg:rounded-b-4xl", rounded: "lg:rounded-br-4xl max-lg:rounded-b-4xl",
innerRounded: "lg:rounded-br-[calc(2rem+1px)] max-lg:rounded-b-[calc(2rem+1px)]", innerRounded: "lg:rounded-br-[calc(2rem+1px)] max-lg:rounded-b-[calc(2rem+1px)]",

View File

@@ -72,7 +72,10 @@ export function HomeAudience() {
<P className="text-gray-800 mt-4"> <P className="text-gray-800 mt-4">
The internet wasnt built for sovereignty. Today, data, AI models, and identity The internet wasnt built for sovereignty. Today, data, AI models, and identity
live on centralized clouds owned by a few. Mycelium brings infrastructure back live on centralized clouds and owned by a few.
</P>
<P className="text-gray-800 mt-4">
Mycelium brings infrastructure back
to people, communities, and nations: private, resilient, and cryptographically yours. to people, communities, and nations: private, resilient, and cryptographically yours.
</P> </P>

View File

@@ -6,7 +6,7 @@ export function HomeAurora({ onGetStartedClick }: { onGetStartedClick: () => voi
<div className="px-4"> <div className="px-4">
{/* Boxed container */} {/* Boxed container */}
<div <div
className="relative mx-auto max-w-7xl border border-t-0 border-gray-100 bg-white overflow-hidden bg-contain bg-right bg-no-repeat" className="relative mx-auto max-w-7xl border border-t-0 border-gray-100 bg-white overflow-hidden bg-size-[65%] bg-right bg-no-repeat"
style={{ backgroundImage: "url('/images/hero11.webp')" }} style={{ backgroundImage: "url('/images/hero11.webp')" }}
> >
{/* Inner padding */} {/* Inner padding */}
@@ -27,11 +27,15 @@ export function HomeAurora({ onGetStartedClick }: { onGetStartedClick: () => voi
</H1> </H1>
<H4 className="mt-8"> <H4 className="mt-8">
The Living Network of the Next Internet Private, distributed infrastructure built
for digital sovereignty
</H4> </H4>
<H5 className="mt-8 text-lg text-gray-600"> <H5 className="mt-8 text-lg text-gray-600">
A new internet is emerging private, distributed, and self-sovereign. Mycelium is the living network that makes it possible. A peer-to-peer foundation where people, data, and intelligence connect directly without intermediaries, without compromise.
Run your apps, data, and intelligence on infrastructure that belongs to you
</H5> </H5>
<div className="mt-10 flex items-center gap-x-6"> <div className="mt-10 flex items-center gap-x-6">

View File

@@ -2,6 +2,13 @@
import WorldMap from "@/components/ui/world-map"; import WorldMap from "@/components/ui/world-map";
import { Eyebrow, H3, P } from "@/components/Texts"; import { Eyebrow, H3, P } from "@/components/Texts";
const stats = [
{ id: 1, name: 'CORES', value: '54,958', description: 'Total Central Processing Unit cores available on the grid.' },
{ id: 2, name: 'NODES', value: '1,493', description: 'Total number of nodes on the grid.' },
{ id: 3, name: 'SSD CAPACITY', value: '5,388,956', description: 'Total GB of storage (SSD, HDD, & RAM) on the grid.' },
{ id: 4, name: 'COUNTRIES', value: '44', description: 'Total number of countries with active nodes.' },
]
export function HomeMap() { export function HomeMap() {
return ( return (
<div className="bg-[#121212] w-full"> <div className="bg-[#121212] w-full">
@@ -9,20 +16,22 @@ export function HomeMap() {
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div> <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" /> <div className="w-full border-t border-l border-r border-gray-800" />
<div className="max-w-7xl mx-auto text-center py-12 border border-t-0 border-b-0 border-gray-800"> <div className="max-w-7xl mx-auto text-center pt-12 border border-t-0 border-b-0 border-gray-800">
<Eyebrow>Mycelium Nodes</Eyebrow> <Eyebrow>PROJECT MYCELIUM IS LIVE. </Eyebrow>
<H3 className="text-white">Host a Node, Grow the Network</H3> <H3 className="text-white">Host a Node, Grow the Network</H3>
<P className="text-sm md:text-lg text-gray-200 max-w-3xl mx-auto py-4"> <P className="text-sm md:text-lg text-gray-200 max-w-3xl mx-auto py-4">
Mycelium runs on real nodes hosted by people, communities, and enterprises across the world. Mycelium runs on nodes hosted by people and organizations around the world.
Each one adds capacity, resilience, and sovereignty to the network and earns rewards in return. Each node adds compute, storage, and bandwidth, expanding the networks capacity and resilience.
</P>
<P className="text-sm md:text-lg text-gray-200 max-w-3xl mx-auto py-4">
You can share your idle resources and earn rewards when they are used.
Configure it once. Your node takes over from there.
</P> </P>
<p className="text-sm md:text-base text-gray-200 max-w-3xl mx-auto py-4">
Plug in once. It runs 24/7 powering the network and earning autonomously.
</p>
</div>
</div>
<div className="max-w-7xl mx-auto border border-t-0 border-b-0 border-gray-800 ">
{/* ✅ Match same side margins */} {/* ✅ Match same side margins */}
<div className="max-w-7xl mx-auto px-6 border border-t-0 border-b-0 border-gray-800"> <div className="max-w-5xl mx-auto px-6 ">
<WorldMap <WorldMap
dots={[ dots={[
{ start: { lat: 64.2008, lng: -149.4937 }, end: { lat: 34.0522, lng: -118.2437 } }, // Alaska → LA { start: { lat: 64.2008, lng: -149.4937 }, end: { lat: 34.0522, lng: -118.2437 } }, // Alaska → LA
@@ -34,6 +43,33 @@ export function HomeMap() {
]} ]}
/> />
</div> </div>
</div>
<div className="mx-auto max-w-7xl px-6 lg:px-8 border border-t-0 border-b-0 border-gray-800 pb-12">
<dl className="pt-6 grid grid-cols-1 gap-0.5 overflow-hidden rounded-md text-center sm:grid-cols-2 lg:grid-cols-4">
{stats.map((stat) => (
<div
key={stat.id}
className="flex flex-col bg-white/1 p-8"
>
<dt className="text-sm/6 font-semibold text-gray-300">
{stat.name}
</dt>
<dd className="order-first text-3xl font-semibold tracking-tight text-white">
{stat.value}
</dd>
<p className="mt-2 text-sm text-gray-400">
{stat.description}
</p>
</div>
))}
</dl>
</div>
{/* ✅ Bottom horizontal line with spacing */} {/* ✅ Bottom horizontal line with spacing */}
<div className="w-full border-b border-gray-800" /> <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> <div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-800"></div>

View File

@@ -3,125 +3,136 @@
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { CP, CT, Eyebrow, H3, P } from "@/components/Texts"; import { CP, CT, Eyebrow, H3, P } from "@/components/Texts";
const bentoCards = [
{
id: 'network',
title: 'Mycelium Network',
eyebrow: 'Network',
description: 'Encrypted peer-to-peer mesh networking across the globe.',
image: '/images/bento-network.png',
link: '/network',
colSpan: 'lg:col-span-3',
rowSpan: 'lg:row-span-1',
rounded: 'lg:rounded-tl-4xl max-lg:rounded-t-4xl',
innerRounded: 'lg:rounded-tl-[calc(2rem+1px)] max-lg:rounded-t-[calc(2rem+1px)]'
},
{
id: 'agents',
title: 'Mycelium Agents',
eyebrow: 'Agents',
description: 'Private, programmable AI systems that run on your hardware.',
image: '/images/bento-agent.jpg',
link: '/agents',
colSpan: 'lg:col-span-3',
rowSpan: 'lg:row-span-1',
rounded: 'lg:rounded-tr-4xl',
innerRounded: 'lg:rounded-tr-[calc(2rem+1px)]'
},
{
id: 'cloud',
title: 'Mycelium Cloud',
eyebrow: 'Cloud',
description: 'Deploy Kubernetes clusters on sovereign infrastructure.',
image: '/images/bento-cloud.jpg',
link: '/cloud',
colSpan: 'lg:col-span-6',
rowSpan: 'lg:row-span-1',
rounded: 'rounded-lg',
innerRounded: 'rounded-[calc(var(--radius-lg)+1px)]'
},
{
id: 'compute',
title: 'Mycelium Compute',
eyebrow: 'Compute',
description: 'The Compute resource layers powering the stack.',
image: '/images/bento-compute.png',
link: '/compute',
colSpan: 'lg:col-span-2',
rowSpan: 'lg:row-span-1',
rounded: 'lg:rounded-bl-4xl',
innerRounded: 'lg:rounded-bl-[calc(2rem+1px)]'
},
{
id: 'storage',
title: 'Mycelium Storage',
eyebrow: 'Storage',
description: 'The Storage resource layers powering the stack.',
image: '/images/bento-storage.png',
link: '/storage',
colSpan: 'lg:col-span-2',
rowSpan: 'lg:row-span-1',
rounded: 'rounded-lg',
innerRounded: 'rounded-[calc(var(--radius-lg)+1px)]'
},
{
id: 'gpu',
title: 'Mycelium GPU',
eyebrow: 'GPU',
description: 'The GPU resource layers powering the stack.',
image: '/images/bento-gpu.jpg',
link: '/gpu',
colSpan: 'lg:col-span-2',
rowSpan: 'lg:row-span-1',
rounded: 'lg:rounded-br-4xl max-lg:rounded-b-4xl',
innerRounded: 'lg:rounded-br-[calc(2rem+1px)] max-lg:rounded-b-[calc(2rem+1px)]'
},
];
export function HomeTab() { export function HomeTab() {
return ( return (
<section className="w-full max-w-8xl mx-auto bg-transparent"> <section className="w-full max-w-8xl mx-auto bg-transparent">
{/* Top spacer + full-width line */} {/* Top section separators */}
<div className="max-w-7xl mx-auto py-6 border-x border-gray-100 bg-white border-t-0 border-b-0" /> <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="w-full border-t border-l border-r border-gray-100" />
{/* Main content */}
{/* ✅ Section with vertical borders */}
<div className="mx-auto bg-white max-w-2xl px-6 lg:max-w-7xl lg:px-10 border border-t-0 border-b-0 border-gray-100"> <div className="mx-auto bg-white max-w-2xl px-6 lg:max-w-7xl lg:px-10 border border-t-0 border-b-0 border-gray-100">
<Eyebrow className="pt-12 ">Components</Eyebrow> <Eyebrow className="pt-12">Components</Eyebrow>
<H3 className="mt-2">Explore the Stack</H3> <H3 className="mt-2">Explore the Stack</H3>
<P className="mt-6 max-w-4xl"> <P className="mt-6 max-w-4xl">
Mycelium unifies everything the next generation internet needs communication, cloud, and intelligence into one seamless, privacy-first network anyone can join. Myceliums technology stack gives you everything you need to build and run applications
From encrypted peer-to-peer communication to decentralized cloud and sovereign AI everything runs on one seamless system. on a distributed network, from connectivity and compute to personal environments and AI.
</P> </P>
<div className="mt-8 grid grid-cols-1 gap-6 sm:mt-10 lg:grid-cols-6 lg:grid-rows-3 pb-12"> {/* BENTO GRID LAYOUT — EXACT MATCH */}
{bentoCards.map((card) => ( <div className="mt-10 grid gap-4 sm:mt-16 lg:grid-cols-3 lg:grid-rows-2 pb-12">
<Link to={card.link} key={card.id} className={`relative ${card.colSpan} ${card.rowSpan} transition-transform duration-300 hover:scale-102 cursor-pointer`}>
<div className={`absolute inset-0 rounded-md bg-white ${card.rounded}`} /> {/* ------------------ LEFT TALL CARD ------------------ */}
<div className={`relative flex h-full flex-col overflow-hidden rounded-[calc(var(--radius-lg)+1px)] ${card.innerRounded}`}> <Link to="/network" className="relative lg:row-span-2 cursor-pointer">
<img <div className="absolute inset-px rounded-lg bg-white lg:rounded-l-4xl" />
alt={card.title} <div className="relative flex h-full flex-col overflow-hidden rounded-[calc(var(--radius-lg)+1px)] lg:rounded-l-[calc(2rem+1px)]">
src={card.image}
className="h-50 object-cover object-center" <div className="px-8 pt-8 pb-3 sm:px-10 sm:pt-10 sm:pb-0">
/> <h3 className="text-sm/4 font-semibold text-cyan-500">LIVE</h3>
<div className="px-8 pt-4 pb-6"> <CT className="mt-2 text-lg font-medium tracking-tight text-gray-950">Mycelium Network</CT>
<h3 className="text-sm/4 font-semibold text-cyan-500">{card.eyebrow}</h3> <CP className="mt-2 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> Peer-to-peer connectivity between users, nodes, and devices. The foundation for secure
<CP className="mt-1 max-w-lg text-gray-600"> communication and collaboration.
{card.description}
</CP> </CP>
</div> </div>
{/* Tall image container */}
<div className="@container relative min-h-120 w-full grow max-lg:mx-auto max-lg:max-w-sm">
<div className="absolute inset-x-10 top-10 bottom-0 overflow-hidden
rounded-t-[12cqw] border-x-[3cqw] border-t-[3cqw]
border-gray-700 bg-gray-900 shadow-2xl">
<img
src="/images/bento-network.jpg"
className="size-full object-cover object-top"
/>
</div> </div>
<div className={`pointer-events-none absolute inset-0 rounded-lg shadow-sm outline outline-black/5 ${card.rounded}`} />
</Link>
))}
</div> </div>
</div> </div>
{/* ✅ Bottom full-width line + spacer */} <div className="pointer-events-none absolute inset-px rounded-lg shadow-sm outline outline-black/5 lg:rounded-l-4xl" />
</Link>
{/* ------------------ MIDDLE TOP ------------------ */}
<Link to="/pods" className="relative cursor-pointer max-lg:row-start-1">
<div className="absolute inset-px rounded-lg bg-white max-lg:rounded-t-4xl" />
<div className="relative flex h-full flex-col overflow-hidden rounded-[calc(var(--radius-lg)+1px)] max-lg:rounded-t-[calc(2rem+1px)]">
<div className="px-8 pt-8 sm:px-10 sm:pt-10">
<h3 className="text-sm/4 font-semibold text-cyan-500">Coming Soon</h3>
<CT className="mt-2 text-lg font-medium tracking-tight text-gray-950">Mycelium Pods</CT>
<CP className="mt-2 max-w-lg text-sm/6 text-gray-600">
Personal digital environments that never reset and stay under your control. Build, deploy,
and connect on your own terms.
</CP>
</div>
<div className="flex flex-1 items-center justify-center px-8 max-lg:pt-10 sm:px-10 lg:pb-2">
<img
src="/images/bento-gpu.jpg"
className="w-full max-lg:max-w-xs"
/>
</div>
</div>
<div className="pointer-events-none absolute inset-px rounded-lg shadow-sm outline outline-black/5 max-lg:rounded-t-4xl" />
</Link>
{/* ------------------ MIDDLE BOTTOM ------------------ */}
<Link to="/agents" className="relative cursor-pointer max-lg:row-start-3 lg:col-start-2 lg:row-start-2">
<div className="absolute inset-px rounded-lg bg-white" />
<div className="relative flex h-full flex-col overflow-hidden rounded-[calc(var(--radius-lg)+1px)]">
<div className="px-8 pt-8 sm:px-10 sm:pt-10">
<h3 className="text-sm/4 font-semibold text-cyan-500">Q1 2026</h3>
<CT className="mt-2 text-lg font-medium tracking-tight text-gray-950">Mycelium Agents</CT>
<CP className="mt-2 max-w-lg text-sm/6 text-gray-600">
Peer-to-peer AI that serves you, not your data. Train, deploy, and own your AI end-to-end.
</CP>
</div>
<div className="@container flex flex-1 items-center justify-center max-lg:py-6 lg:pb-2">
<img
src="/images/bento-agent.jpg"
className="h-[min(200px,40cqw)] object-cover"
/>
</div>
</div>
<div className="pointer-events-none absolute inset-px rounded-lg shadow-sm outline outline-black/5" />
</Link>
{/* ------------------ RIGHT TALL ------------------ */}
<Link to="/cloud" className="relative lg:row-span-2 cursor-pointer">
<div className="absolute inset-px rounded-lg bg-white max-lg:rounded-b-4xl lg:rounded-r-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-r-[calc(2rem+1px)]">
<div className="px-8 pt-8 pb-3 sm:px-10 sm:pt-10 sm:pb-0">
<h3 className="text-sm/4 font-semibold text-cyan-500">Early Access</h3>
<CT className="mt-2 text-lg font-medium tracking-tight text-gray-950">Mycelium Cloud</CT>
<CP className="mt-2 max-w-lg text-sm/6 text-gray-600">
Decentralized compute, storage, and orchestration. A full cloud service without a central operator.
</CP>
</div>
<div className="relative min-h-120 w-full grow">
<div className="absolute top-10 right-0 bottom-0 left-10 overflow-hidden
rounded-tl-xl bg-gray-900 shadow-2xl outline outline-white/10">
<img
src="/images/cloud/reserve.png"
className="size-full object-cover"
/>
</div>
</div>
</div>
<div className="pointer-events-none absolute inset-px rounded-lg shadow-sm outline outline-black/5 max-lg:rounded-b-4xl lg:rounded-r-4xl" />
</Link>
</div>
</div>
{/* Bottom separators */}
<div className="w-full border-b border-gray-100" /> <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" /> <div className="max-w-7xl mx-auto py-6 border-x border-gray-100 border-t-0 border-b-0" />
</section> </section>