Compare commits
7 Commits
39b748cdac
...
developmen
| Author | SHA1 | Date | |
|---|---|---|---|
| 46d02fca47 | |||
| 6779218da6 | |||
| 04b94367a9 | |||
| cdd6e3104b | |||
| 8d1e2f4c7d | |||
| 0f2f6df299 | |||
| c56f67ae2e |
BIN
public/images/agents.webp
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
public/images/iot-gdb6f0c390_1280-1024x706.webp
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
public/images/kubernetes.webp
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
public/images/linux.png
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
public/images/logo/1_eVqphQ2aNKxqHPMPxjRzAA (1).png
Normal file
|
After Width: | Height: | Size: 286 KiB |
BIN
public/images/logo/1_eVqphQ2aNKxqHPMPxjRzAA.png
Normal file
|
After Width: | Height: | Size: 286 KiB |
BIN
public/images/logo/images.png
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
BIN
public/images/vm.webp
Normal file
|
After Width: | Height: | Size: 78 KiB |
@@ -1,10 +1,12 @@
|
|||||||
|
import { useState } from 'react'
|
||||||
import { Link, useLocation } from 'react-router-dom'
|
import { Link, useLocation } from 'react-router-dom'
|
||||||
import { Dropdown } from './ui/Dropdown'
|
import { Dropdown } from './ui/Dropdown'
|
||||||
import { ChevronDownIcon } from '@heroicons/react/20/solid'
|
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 { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline'
|
||||||
|
|
||||||
const cloudNavItems = [
|
const cloudNavItems = [
|
||||||
{ name: 'Cloud', href: '/cloud' },
|
{ name: 'Cloud', href: '/cloud' },
|
||||||
@@ -15,6 +17,7 @@ const cloudNavItems = [
|
|||||||
|
|
||||||
export function Header() {
|
export function Header() {
|
||||||
const location = useLocation()
|
const location = useLocation()
|
||||||
|
const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
|
||||||
|
|
||||||
const getCurrentPageName = () => {
|
const getCurrentPageName = () => {
|
||||||
const currentPath = location.pathname;
|
const currentPath = location.pathname;
|
||||||
@@ -72,9 +75,84 @@ export function Header() {
|
|||||||
Get Mycelium Connector
|
Get Mycelium Connector
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="lg:hidden">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="-m-2.5 inline-flex items-center justify-center rounded-md p-2.5 text-gray-700 hover:text-cyan-500 transition-colors"
|
||||||
|
onClick={() => setMobileMenuOpen(true)}
|
||||||
|
>
|
||||||
|
<span className="sr-only">Open main menu</span>
|
||||||
|
<Bars3Icon className="h-6 w-6" aria-hidden="true" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Container>
|
</Container>
|
||||||
</nav>
|
</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 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>
|
||||||
|
<img
|
||||||
|
className="h-8 w-auto"
|
||||||
|
src={pmyceliumLogo}
|
||||||
|
alt=""
|
||||||
|
/>
|
||||||
|
</Link>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="-m-2.5 rounded-md p-2.5 text-gray-700 hover:text-cyan-500 transition-colors"
|
||||||
|
onClick={() => setMobileMenuOpen(false)}
|
||||||
|
>
|
||||||
|
<span className="sr-only">Close menu</span>
|
||||||
|
<XMarkIcon className="h-6 w-6" aria-hidden="true" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div className="mt-6 flow-root">
|
||||||
|
<div className="-my-6 divide-y divide-gray-500/10">
|
||||||
|
<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"
|
||||||
|
>
|
||||||
|
{item.name}
|
||||||
|
</Link>
|
||||||
|
))}
|
||||||
|
<Link
|
||||||
|
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"
|
||||||
|
>
|
||||||
|
Network
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
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"
|
||||||
|
>
|
||||||
|
Agents
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
<div className="py-6">
|
||||||
|
<Button
|
||||||
|
to="https://myceliumcloud.tf"
|
||||||
|
variant="outline"
|
||||||
|
as="a"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="w-full"
|
||||||
|
>
|
||||||
|
Start Deployment
|
||||||
|
</Button>
|
||||||
|
<Button to="/download" variant="solid" color="cyan" className="mt-4 w-full">
|
||||||
|
Get Mycelium Connector
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Dialog.Panel>
|
||||||
|
</Dialog>
|
||||||
</header>
|
</header>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +1,43 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
import { Button } from '@/components/Button'
|
import { Button } from '@/components/Button'
|
||||||
import { Eyebrow, P, H3 } from '@/components/Texts'
|
import { Eyebrow, H3 } from '@/components/Texts'
|
||||||
|
|
||||||
export function AgentHeroAlt() {
|
export function AgentHeroAlt() {
|
||||||
return (
|
return (
|
||||||
<div className="relative bg-white lg:mt-10 mt-0">
|
<div className="">
|
||||||
<div className="relative h-80 overflow-hidden bg-transparent md:absolute md:right-0 md:h-full md:w-1/3 lg:w-2/3">
|
{/* Boxed container */}
|
||||||
<img
|
<div
|
||||||
alt=""
|
className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-200 bg-white overflow-hidden bg-contain bg-right bg-no-repeat"
|
||||||
src="/images/agents.png"
|
style={{ backgroundImage: "url('/images/agents.webp')", backgroundSize: "contain" }}
|
||||||
className="size-full object-cover"
|
>
|
||||||
/>
|
{/* Inner padding */}
|
||||||
|
<div className="px-6 py-16 lg:py-16">
|
||||||
</div>
|
<div className="max-w-2xl lg:pl-6">
|
||||||
<div className="relative mx-auto max-w-7xl py-24 sm:py-32 lg:px-8">
|
<Eyebrow>MYCELIUM AGENTS</Eyebrow>
|
||||||
<div className="pr-6 pl-6 md:mr-auto md:w-2/3 md:pr-16 lg:w-1/2 lg:pl-0 lg:pr-24 xl:pr-32">
|
<H3 as="h1" className="mt-4">
|
||||||
<Eyebrow className="text-base/7 font-semibold text-cyan-500">MYCELIUM AGENTS</Eyebrow>
|
Sovereign AI Agents, Coming Soon.
|
||||||
<H3 as="h1" className="mt-2 text-gray-900">Sovereign AI Agents, Coming Soon.</H3>
|
</H3>
|
||||||
<P className="mt-6 text-gray-600">
|
<p className="mt-6 text-lg">
|
||||||
The Agent layer will allow you to run autonomous, policy-governed AI that operates on infrastructure you control, with private memory, verifiable execution, and coordination across your personal or organizational environment.
|
The Agent layer will allow you to run autonomous, policy-governed AI that operates on infrastructure you control, with private memory, verifiable execution, and coordination across your personal or organizational environment.
|
||||||
</P>
|
</p>
|
||||||
<P className="mt-6 text-gray-600">
|
<p className="mt-4 lg:text-base italic text-gray-600 text-sm">
|
||||||
Works Alone. Works Together.
|
Works Alone. Works Together. Use Agents on top of any Mycelium Cloud deployment or pair them with the Mycelium Network for private, encrypted collaboration across users and systems.
|
||||||
Use Agents on top of any Mycelium Cloud deployment or pair them with the Mycelium Network for private, encrypted collaboration across users and systems.
|
</p>
|
||||||
</P>
|
<div className="mt-10 flex items-center gap-x-6">
|
||||||
<div className="mt-8">
|
|
||||||
<Button href="#" variant="solid" color="cyan">
|
<Button href="#" variant="solid" color="cyan">
|
||||||
Follow Deployment
|
Follow Deployment
|
||||||
</Button>
|
</Button>
|
||||||
<Button href="#" variant="outline" color="white">
|
<Button href="#" variant="outline">
|
||||||
Explore Docs
|
Explore Docs <span aria-hidden="true">→</span>
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{/* ✅ Bottom horizontal line with spacing */}
|
||||||
|
<div className="w-full border-b border-gray-200" />
|
||||||
|
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
|
||||||
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ export function CloudArchitecture() {
|
|||||||
<Button variant="solid" color="cyan" href="/start">
|
<Button variant="solid" color="cyan" href="/start">
|
||||||
Get Started
|
Get Started
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="outline" color="gray" href="/docs">
|
<Button variant="outline" color="white" href="/docs">
|
||||||
Explore Docs
|
Explore Docs
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import {
|
|||||||
} from '@headlessui/react'
|
} from '@headlessui/react'
|
||||||
import { MinusIcon, PlusIcon } from '@heroicons/react/24/outline'
|
import { MinusIcon, PlusIcon } from '@heroicons/react/24/outline'
|
||||||
|
|
||||||
import { Eyebrow, H3 } from "@/components/Texts"
|
import { Eyebrow, H3, H4 } from "@/components/Texts"
|
||||||
|
|
||||||
|
|
||||||
const product = {
|
const product = {
|
||||||
@@ -49,26 +49,28 @@ export function CloudHostingNew() {
|
|||||||
<div className="mx-auto max-w-2xl lg:max-w-none">
|
<div className="mx-auto max-w-2xl lg:max-w-none">
|
||||||
|
|
||||||
{/* ✅ Product Section */}
|
{/* ✅ Product Section */}
|
||||||
<div className="lg:grid lg:grid-cols-2 lg:items-start lg:gap-x-8">
|
<div className="lg:grid lg:grid-cols-5 lg:items-start lg:gap-x-8">
|
||||||
|
|
||||||
{/* ✅ Image */}
|
{/* ✅ Image */}
|
||||||
<img alt="Mycelium Cloud" src="/images/cloudhosting.webp" className="aspect-square w-[600px] object-cover" />
|
<div className="lg:col-span-2 lg:mt-8 mt-2">
|
||||||
|
<img alt="Mycelium Cloud" src="/images/cloudhosting.webp" className="aspect-square w-full object-cover" />
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* ✅ Product info */}
|
{/* ✅ Product info */}
|
||||||
<div className="mt-10 px-4 sm:mt-16 sm:px-0 lg:mt-0">
|
<div className="mt-8 px-4 sm:px-0 lg:mt-0 lg:col-span-3">
|
||||||
<Eyebrow>{product.subtitle}</Eyebrow>
|
<Eyebrow>{product.subtitle}</Eyebrow>
|
||||||
<h3 className="lg:text-4xl text-3xl text-white">{product.name}</h3>
|
<H4 className=" text-white">{product.name}</H4>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div className="mt-6 text-gray-300 text-xl"
|
<div className="mt-4 text-gray-300 text-xl"
|
||||||
dangerouslySetInnerHTML={{ __html: product.description }}
|
dangerouslySetInnerHTML={{ __html: product.description }}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|
||||||
{/* ✅ Details accordion */}
|
{/* ✅ Details accordion */}
|
||||||
<section className="mt-8">
|
<section className="mt-6">
|
||||||
<div className="divide-y divide-gray-800 border-t border-cyan-500">
|
<div className="divide-y divide-gray-800 border-t border-cyan-500">
|
||||||
{product.details.map((detail) => (
|
{product.details.map((detail) => (
|
||||||
<Disclosure key={detail.name} as="div">
|
<Disclosure key={detail.name} as="div">
|
||||||
|
|||||||
@@ -1,58 +1,95 @@
|
|||||||
import {
|
'use client';
|
||||||
CpuChipIcon,
|
|
||||||
CubeIcon,
|
|
||||||
ServerIcon,
|
|
||||||
} from '@heroicons/react/24/solid'
|
|
||||||
import { Eyebrow, H3, P, CT, CP } from '@/components/Texts'
|
|
||||||
import { Container } from '@/components/Container'
|
import { Container } from '@/components/Container'
|
||||||
|
import { Eyebrow, H3, P } from '@/components/Texts'
|
||||||
|
import { Button } from '@/components/Button'
|
||||||
|
|
||||||
const capabilities = [
|
const capabilities = [
|
||||||
{
|
{
|
||||||
name: 'Containers',
|
title: 'Containers & K3s',
|
||||||
description: 'Services, web apps, APIs. Fully compatible with Kubernetes.',
|
description:
|
||||||
icon: CubeIcon,
|
'Deploy services, web apps, and APIs with full Kubernetes compatibility.',
|
||||||
|
icon: (
|
||||||
|
<div className=" flex items-center justify-center">
|
||||||
|
<img src="/images/kubernetes.webp" alt="Kubernetes" className="h-full w-full object-cover" />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Virtual Machines',
|
title: 'Virtual Machines',
|
||||||
description:
|
description:
|
||||||
'Legacy apps and specialized runtime stacks. Secure boot + attestation included.',
|
'Run legacy apps and specialized stacks with secure boot and attestation.',
|
||||||
icon: ServerIcon,
|
icon: (
|
||||||
|
<div className="flex items-center justify-center">
|
||||||
|
<img src="/images/vm.webp" alt="Virtual Machines" className="h-full w-full object-cover" />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'Native Linux Workloads',
|
title: 'Native Linux Workloads',
|
||||||
description:
|
description:
|
||||||
'Agents, batch jobs, tooling. Runs statelessly anywhere.',
|
'Execute agents, batch jobs, and custom tooling statelessly across the grid.',
|
||||||
icon: CpuChipIcon,
|
icon: (
|
||||||
|
<div className="flex items-center justify-center">
|
||||||
|
<img src="/images/linux.png" alt="Linux" className="h-full w-full object-cover" />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
export function ComputeCapabilities() {
|
export function ComputeCapabilities() {
|
||||||
return (
|
return (
|
||||||
<section className="bg-white py-24 sm:py-32">
|
<section className="bg-[#121212] w-full max-w-8xl mx-auto">
|
||||||
|
{/* Top horizontal 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>
|
<Container>
|
||||||
<div className="mx-auto max-w-3xl text-center">
|
<div className="mx-auto max-w-4xl sm:text-center">
|
||||||
<Eyebrow>CAPABILITIES</Eyebrow>
|
<Eyebrow className="text-cyan-400">CAPABILITIES</Eyebrow>
|
||||||
<H3 className="mt-4 text-gray-900">What You Can Run</H3>
|
<H3 className="text-3xl lg:text-4xl font-medium tracking-tight text-white">
|
||||||
<P className="mt-6 text-gray-600">
|
What You Can Run
|
||||||
Mycelium Compute supports multiple workload types on a single
|
</H3>
|
||||||
execution fabric.
|
<P className="mt-6 text-lg text-gray-300">
|
||||||
|
Mycelium Compute supports multiple workload types on a single execution
|
||||||
|
fabric, from legacy VMs to modern Kubernetes clusters.
|
||||||
</P>
|
</P>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="mx-auto mt-16 max-w-5xl">
|
{/* Card layout */}
|
||||||
<dl className="grid grid-cols-1 gap-12 sm:grid-cols-2 lg:grid-cols-3">
|
<ul
|
||||||
{capabilities.map((feature) => (
|
role="list"
|
||||||
<div key={feature.name} className="flex flex-col text-center">
|
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"
|
||||||
<div className="mx-auto flex size-12 items-center justify-center rounded-xl bg-cyan-50">
|
>
|
||||||
<feature.icon aria-hidden="true" className="size-6 text-cyan-600" />
|
{capabilities.map((capability) => (
|
||||||
</div>
|
<li
|
||||||
<CT className="mt-6 text-gray-900">{feature.name}</CT>
|
key={capability.title}
|
||||||
<CP className="mt-2 text-gray-600">{feature.description}</CP>
|
className="rounded-xl border border-gray-800 bg-[#111]/60 p-6 text-center lg:text-left"
|
||||||
</div>
|
>
|
||||||
|
{capability.icon}
|
||||||
|
<h3 className="text-lg font-semibold text-white">{capability.title}</h3>
|
||||||
|
<p className="mt-2 text-gray-400 leading-snug">{capability.description}</p>
|
||||||
|
</li>
|
||||||
))}
|
))}
|
||||||
</dl>
|
</ul>
|
||||||
|
|
||||||
|
{/* Button section */}
|
||||||
|
<div className="mx-auto mt-12 flex justify-center gap-6">
|
||||||
|
<Button variant="solid" color="cyan" href="#">
|
||||||
|
Get Started
|
||||||
|
</Button>
|
||||||
|
<Button variant="outline" color="white" href="#">
|
||||||
|
Explore Docs
|
||||||
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</Container>
|
</Container>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Bottom border + spacer */}
|
||||||
|
<div className="w-full border-b border-gray-800" />
|
||||||
|
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-800 bg-transparent" />
|
||||||
</section>
|
</section>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
118
src/pages/compute/ComputeCapabilitiesNew.tsx
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { useRef } from "react";
|
||||||
|
import { Eyebrow, CP, CT, H5 } from "@/components/Texts";
|
||||||
|
import { IoArrowBackOutline, IoArrowForwardOutline } from "react-icons/io5";
|
||||||
|
|
||||||
|
const capabilities = [
|
||||||
|
{
|
||||||
|
isIntro: true,
|
||||||
|
eyebrow: "CAPABILITIES",
|
||||||
|
title: "What You Can Run",
|
||||||
|
description:
|
||||||
|
"Mycelium Compute supports multiple workload types on a single execution fabric, from legacy VMs to modern Kubernetes clusters.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Containers & K3s",
|
||||||
|
description:
|
||||||
|
"Deploy services, web apps, and APIs with full Kubernetes compatibility.",
|
||||||
|
icon: (
|
||||||
|
<div className="flex items-center justify-center">
|
||||||
|
<img src="/images/kubernetes.webp" alt="Kubernetes" className="h-full w-full object-cover mb-2" />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Virtual Machines",
|
||||||
|
description:
|
||||||
|
"Run legacy apps and specialized stacks with secure boot and attestation.",
|
||||||
|
icon: (
|
||||||
|
<div className="flex items-center justify-center">
|
||||||
|
<img src="/images/vm.webp" alt="Virtual Machines" className="h-full w-full object-cover mb-2" />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Native Linux Workloads",
|
||||||
|
description:
|
||||||
|
"Execute agents, batch jobs, and custom tooling statelessly across the grid.",
|
||||||
|
icon: (
|
||||||
|
<div className="flex items-center justify-center">
|
||||||
|
<img src="/images/linux.png" alt="Linux" className="h-full w-full object-cover mb-2" />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export function ComputeCapabilitiesNew() {
|
||||||
|
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 p-10 relative ${item.isIntro ? 'bg-[#1b1b1b]' : 'bg-[#111]/60'}`}
|
||||||
|
>
|
||||||
|
{/* 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-700 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"
|
||||||
|
>
|
||||||
|
<IoArrowForwardOutline className="text-gray-300" size={16} />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
{item.icon}
|
||||||
|
<CT className="text-lg font-semibold text-white mt-4">{item.title}</CT>
|
||||||
|
<CP className="mt-2 text-gray-400 leading-snug">{item.description}</CP>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</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>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,56 +1,54 @@
|
|||||||
|
import { Eyebrow, H3, P, CP, CT } from '@/components/Texts'
|
||||||
import {
|
import {
|
||||||
ShieldCheckIcon,
|
|
||||||
ArrowPathIcon,
|
ArrowPathIcon,
|
||||||
RocketLaunchIcon,
|
GlobeAltIcon,
|
||||||
|
ShieldCheckIcon,
|
||||||
} from '@heroicons/react/24/solid'
|
} from '@heroicons/react/24/solid'
|
||||||
import { Container } from '@/components/Container'
|
|
||||||
import { Eyebrow, H3, P, CT, CP } from '@/components/Texts'
|
|
||||||
|
|
||||||
const features = [
|
const stats = [
|
||||||
{
|
{
|
||||||
|
id: 1,
|
||||||
name: 'Cryptographically verified deployments',
|
name: 'Cryptographically verified deployments',
|
||||||
description: 'Every cluster state is signed and checksummed to guarantee truth.',
|
value: 'Signed & Checksummed',
|
||||||
icon: ShieldCheckIcon,
|
icon: ShieldCheckIcon,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
id: 2,
|
||||||
name: 'Stateless execution that scales anywhere',
|
name: 'Stateless execution that scales anywhere',
|
||||||
description: 'Run workloads on any node, region, or edge without manual orchestration.',
|
value: 'Global Scaling',
|
||||||
icon: RocketLaunchIcon,
|
icon: GlobeAltIcon,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
id: 3,
|
||||||
name: 'Automatic healing and recovery',
|
name: 'Automatic healing and recovery',
|
||||||
description: 'Self-repairing processes ensure workloads stay available and consistent.',
|
value: 'Self-Repairing',
|
||||||
icon: ArrowPathIcon,
|
icon: ArrowPathIcon,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
export function ComputeDesign() {
|
export function ComputeDesign() {
|
||||||
return (
|
return (
|
||||||
<section className="bg-white py-24 sm:py-32">
|
<div className="">
|
||||||
<Container>
|
|
||||||
<div className="mx-auto max-w-3xl sm:text-center">
|
|
||||||
<Eyebrow>CORE VALUE</Eyebrow>
|
|
||||||
<H3 className="mt-4 text-gray-900">Deterministic by Design</H3>
|
|
||||||
<P className="mt-6 text-gray-600">
|
|
||||||
Every workload runs exactly as declared: no drift, no hidden state, no surprises.
|
|
||||||
</P>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="mx-auto mt-16 max-w-5xl">
|
{/* ✅ Top horizontal line with spacing */}
|
||||||
<dl className="grid grid-cols-1 gap-12 text-gray-600 sm:grid-cols-2 lg:grid-cols-3">
|
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
|
||||||
{features.map((feature) => (
|
<div className="w-full border-t border-l border-r border-gray-200" />
|
||||||
<div key={feature.name} className="relative pl-12">
|
|
||||||
<feature.icon
|
{/* ✅ Top horizontal line with spacing */}
|
||||||
aria-hidden="true"
|
<div className="mx-auto max-w-7xl border-gray-200">
|
||||||
className="absolute left-0 top-1 size-6 text-cyan-600"
|
<dl className="grid grid-cols-1 gap-4 lg:gap-14 overflow-hidden text-center lg:grid-cols-3">
|
||||||
/>
|
{stats.map((stat) => (
|
||||||
<CT className="font-semibold text-gray-900">{feature.name}</CT>
|
<div key={stat.id} className="flex flex-col items-center bg-gray-400/5 py-8 px-12 border border-gray-200 lg:border-t-0 lg:border-b-0">
|
||||||
<CP className="mt-1 text-gray-600">{feature.description}</CP>
|
<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>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
</Container>
|
{/* ✅ Bottom horizontal line + spacing */}
|
||||||
</section>
|
<div className="w-full border-b border-gray-200" />
|
||||||
|
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
|
||||||
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,35 +1,51 @@
|
|||||||
'use client'
|
import { H3, Eyebrow } from "@/components/Texts"
|
||||||
|
import { Button } from "@/components/Button"
|
||||||
|
|
||||||
import { Button } from '@/components/Button'
|
export function ComputeHero({ onGetStartedClick = () => {} }: { onGetStartedClick?: () => void }) {
|
||||||
import { Eyebrow, P, H3 } from '@/components/Texts'
|
|
||||||
|
|
||||||
export function ComputeHero() {
|
|
||||||
return (
|
return (
|
||||||
<div className="relative bg-white">
|
<div className="">
|
||||||
<div className="relative h-80 overflow-hidden bg-transparent md:absolute md:right-0 md:h-full md:w-1/3 lg:w-1/2">
|
{/* Boxed container */}
|
||||||
<img
|
<div
|
||||||
alt=""
|
className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-200 bg-white overflow-hidden bg-contain bg-right bg-no-repeat"
|
||||||
src="/images/computehero.webp"
|
style={{ backgroundImage: "url('/images/computehero.webp')", backgroundSize: "contain" }}
|
||||||
className="size-full object-contain"
|
>
|
||||||
/>
|
{/* Inner padding */}
|
||||||
|
<div className="px-6 py-16 lg:py-16">
|
||||||
</div>
|
<div className="max-w-xl lg:pl-6">
|
||||||
<div className="relative mx-auto max-w-7xl py-12 lg:py-24 lg:px-8">
|
<Eyebrow>
|
||||||
<div className="max-w-2xl pr-6 pl-6 md:mr-auto md:w-2/3 md:pr-16 lg:w-1/2 lg:pl-0 lg:pr-24">
|
Mycelium Compute
|
||||||
<Eyebrow className="text-base/7 font-semibold text-cyan-500">COMPUTE</Eyebrow>
|
</Eyebrow>
|
||||||
<H3 className="mt-2 text-gray-900">Deterministic Compute You Control</H3>
|
<H3 className="mt-4">
|
||||||
<P className="mt-6 text-gray-600">
|
Deterministic Compute You Control
|
||||||
|
</H3>
|
||||||
|
<p className="mt-6 text-lg">
|
||||||
Run workloads on sovereign, self-verifying infrastructure.
|
Run workloads on sovereign, self-verifying infrastructure.
|
||||||
Mycelium Compute delivers predictable execution, zero drift, and automatic healing, whether you’re running containers, VMs, agents, or full Kubernetes clusters.
|
Mycelium Compute delivers predictable execution, zero drift, and automatic healing, whether you’re running containers, VMs, agents, or full Kubernetes clusters.
|
||||||
</P>
|
</p>
|
||||||
<div className="mt-12">
|
<p className="mt-4 lg:text-base italic text-gray-600 text-sm">
|
||||||
<Button href="#" variant="solid" color="cyan">
|
Works Alone. Works Together.
|
||||||
How it works
|
Mycelium Compute can run on any network fabric, or pair with Mycelium Network
|
||||||
|
for sovereign connectivity.
|
||||||
|
</p>
|
||||||
|
<div className="mt-10 flex items-center gap-x-6">
|
||||||
|
<Button
|
||||||
|
onClick={onGetStartedClick}
|
||||||
|
variant="solid"
|
||||||
|
color="cyan"
|
||||||
|
>
|
||||||
|
Get started
|
||||||
|
</Button>
|
||||||
|
<Button to="#" variant="outline">
|
||||||
|
Documentation <span aria-hidden="true">→</span>
|
||||||
</Button>
|
</Button>
|
||||||
<Button href="#" variant="outline" color="cyan">Explore Docs</Button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{/* ✅ Bottom horizontal line with spacing */}
|
||||||
|
<div className="w-full border-b border-gray-200" />
|
||||||
|
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ import { ComputeFeatures } from './ComputeFeatures'
|
|||||||
import { ComputeArchitecture } from './ComputeArchitecture'
|
import { ComputeArchitecture } from './ComputeArchitecture'
|
||||||
import { ComputeUseCases } from './ComputeUseCases'
|
import { ComputeUseCases } from './ComputeUseCases'
|
||||||
import { CallToAction } from './CallToAction'
|
import { CallToAction } from './CallToAction'
|
||||||
import { ComputeCapabilities } from './ComputeCapabilities'
|
|
||||||
import { ComputeDesign } from './ComputeDesign'
|
import { ComputeDesign } from './ComputeDesign'
|
||||||
import { ComputeOverview } from './ComputeOverview'
|
import { ComputeOverview } from './ComputeOverview'
|
||||||
|
import { ComputeCapabilitiesNew } from './ComputeCapabilitiesNew'
|
||||||
|
|
||||||
|
|
||||||
export default function ComputePage() {
|
export default function ComputePage() {
|
||||||
@@ -17,7 +17,7 @@ export default function ComputePage() {
|
|||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
<ComputeCapabilities />
|
<ComputeCapabilitiesNew />
|
||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
|
|||||||
@@ -1,42 +1,40 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
import { Button } from '@/components/Button'
|
import { Button } from '@/components/Button'
|
||||||
import { Eyebrow, SectionHeader, P } from '@/components/Texts'
|
import { Eyebrow, H3 } from '@/components/Texts'
|
||||||
|
|
||||||
export function GpuHero() {
|
export function GpuHero() {
|
||||||
return (
|
return (
|
||||||
<div className="relative bg-white">
|
<div className="">
|
||||||
<div className="relative h-80 overflow-hidden bg-transparent md:absolute md:right-0 md:h-full md:w-1/3 lg:w-1/2">
|
{/* Boxed container */}
|
||||||
<img
|
<div
|
||||||
alt="Mycelium GPU nebula illustration"
|
className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-200 bg-white overflow-hidden bg-contain bg-right bg-no-repeat"
|
||||||
src="/images/gpuhero2.png"
|
style={{ backgroundImage: "url('/images/gpuhero2.png')", backgroundSize: "contain" }}
|
||||||
className="size-full object-contain"
|
>
|
||||||
/>
|
{/* Inner padding */}
|
||||||
</div>
|
<div className="px-6 py-16 lg:py-16">
|
||||||
<div className="relative mx-auto max-w-7xl py-24 lg:py-32 lg:px-8">
|
<div className="max-w-2xl lg:pl-6">
|
||||||
<div className="pr-6 pl-6 md:mr-auto md:w-2/3 md:pr-16 lg:w-1/2 lg:pl-0 lg:pr-24 ">
|
<Eyebrow>Mycelium GPU</Eyebrow>
|
||||||
<Eyebrow className="tracking-[0.35em] uppercase text-cyan-500">
|
<H3 as="h1" className="mt-4">
|
||||||
Mycelium GPU
|
|
||||||
</Eyebrow>
|
|
||||||
<SectionHeader as="h1" className="mt-4 text-gray-900">
|
|
||||||
Sovereign GPU Acceleration for AI and High-Performance Compute
|
Sovereign GPU Acceleration for AI and High-Performance Compute
|
||||||
</SectionHeader>
|
</H3>
|
||||||
<P className="mt-6 text-gray-600">
|
<p className="mt-6 text-lg">
|
||||||
Access GPUs across the Mycelium mesh without waitlists,
|
Access GPUs across the Mycelium mesh without waitlists, inflated pricing, or centralized control. Run inference, training, and compute workloads where they make sense: cloud, edge, or on your own hardware.
|
||||||
inflated pricing, or centralized control.
|
</p>
|
||||||
Run inference, training, and compute workloads where they make sense:
|
<div className="mt-10 flex items-center gap-x-6">
|
||||||
cloud, edge, or on your own hardware.
|
|
||||||
</P>
|
|
||||||
<div className="mt-10 flex flex-wrap gap-4">
|
|
||||||
<Button to="#gpu-getting-started" as="a" variant="solid" color="cyan">
|
<Button to="#gpu-getting-started" as="a" variant="solid" color="cyan">
|
||||||
How it works
|
How it works
|
||||||
</Button>
|
</Button>
|
||||||
<Button to="#gpu-architecture" as="a" variant="outline" color="cyan">
|
<Button to="#gpu-architecture" as="a" variant="outline">
|
||||||
Explore Docs
|
Explore Docs <span aria-hidden="true">→</span>
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{/* ✅ Bottom horizontal line with spacing */}
|
||||||
|
<div className="w-full border-b border-gray-200" />
|
||||||
|
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
|
||||||
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export function HomeHero() {
|
|||||||
Start Hosting
|
Start Hosting
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<Button href="#" variant="outline" color="gray">
|
<Button href="#" variant="outline" color="white">
|
||||||
Deploy in Cloud <span aria-hidden="true">→</span>
|
Deploy in Cloud <span aria-hidden="true">→</span>
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,31 +1,27 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
import { Button } from '@/components/Button'
|
import { Button } from '@/components/Button'
|
||||||
import { Eyebrow, SectionHeader, P } from '@/components/Texts'
|
import { Eyebrow, H3 } from '@/components/Texts'
|
||||||
|
|
||||||
export function StorageHero() {
|
export function StorageHero() {
|
||||||
return (
|
return (
|
||||||
<div className="relative bg-white">
|
<div className="">
|
||||||
<div className="relative h-80 overflow-hidden bg-transparent md:absolute md:right-0 md:h-full md:w-1/3 lg:w-1/2">
|
{/* Boxed container */}
|
||||||
<img
|
<div
|
||||||
alt="Mycelium Storage visual"
|
className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-200 bg-white overflow-hidden bg-contain bg-right bg-no-repeat"
|
||||||
src="/images/computehero11.webp"
|
style={{ backgroundImage: "url('/images/computehero11.webp')", backgroundSize: "contain" }}
|
||||||
className="size-full object-contain"
|
>
|
||||||
/>
|
{/* Inner padding */}
|
||||||
</div>
|
<div className="px-6 py-16 lg:py-16">
|
||||||
<div className="relative mx-auto max-w-7xl py-24 lg:py-32 lg:px-8">
|
<div className="max-w-2xl lg:pl-6">
|
||||||
<div className="pr-6 pl-6 md:mr-auto md:w-2/3 md:pr-16 lg:w-1/2 lg:pl-0 lg:pr-24 xl:pr-32">
|
<Eyebrow>Mycelium Storage</Eyebrow>
|
||||||
<Eyebrow className="tracking-[0.35em] uppercase text-cyan-500">
|
<H3 as="h1" className="mt-4">
|
||||||
Mycelium Storage
|
|
||||||
</Eyebrow>
|
|
||||||
<SectionHeader as="h1" className="mt-4 text-gray-900">
|
|
||||||
Sovereign Storage With Self-Healing and Multi-Protocol Access
|
Sovereign Storage With Self-Healing and Multi-Protocol Access
|
||||||
</SectionHeader>
|
</H3>
|
||||||
<P className="mt-6 text-gray-600">
|
<p className="mt-6 text-lg">
|
||||||
Store, replicate, and serve data across the global mesh
|
Store, replicate, and serve data across the global mesh with encrypted, quantum safe, verifiable storage you control at the infrastructure layer.
|
||||||
with encrypted, quantum safe, verifiable storage you control at the infrastructure layer.
|
</p>
|
||||||
</P>
|
<div className="mt-10 flex items-center gap-x-6">
|
||||||
<div className="mt-10 flex flex-wrap gap-4">
|
|
||||||
<Button to="#storage-features" as="a" variant="solid" color="cyan">
|
<Button to="#storage-features" as="a" variant="solid" color="cyan">
|
||||||
How It Works
|
How It Works
|
||||||
</Button>
|
</Button>
|
||||||
@@ -33,13 +29,16 @@ with encrypted, quantum safe, verifiable storage you control at the infrastructu
|
|||||||
to="#storage-developer-experience"
|
to="#storage-developer-experience"
|
||||||
as="a"
|
as="a"
|
||||||
variant="outline"
|
variant="outline"
|
||||||
color="cyan"
|
|
||||||
>
|
>
|
||||||
Explore Docs
|
Explore Docs <span aria-hidden="true">→</span>
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{/* ✅ Bottom horizontal line with spacing */}
|
||||||
|
<div className="w-full border-b border-gray-200" />
|
||||||
|
<div className="max-w-7xl bg-transparent mx-auto py-6 border border-t-0 border-b-0 border-gray-200"></div>
|
||||||
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||