Compare commits
117 Commits
26ae2f156a
...
developmen
| Author | SHA1 | Date | |
|---|---|---|---|
| d16d4e02e0 | |||
| 2865b1e1fd | |||
| b723f889cb | |||
| 2752c690d6 | |||
| a7dd803da2 | |||
| 22e2e4b80c | |||
| 5ab909bd12 | |||
| 61cbaae7e0 | |||
| f46482e0f4 | |||
| ee6b5458de | |||
| 100cae988c | |||
| 716915b19e | |||
| f04a7eb3cf | |||
| de89539de1 | |||
| 1851c2d6fb | |||
| 451c1f5c56 | |||
| 0b6bcfedd0 | |||
| 9bccc89309 | |||
| 73abd593e3 | |||
| 1f267b057d | |||
| 2b5f20f1e9 | |||
| aca13e275b | |||
| e8c424539e | |||
| 912ea4436a | |||
| 53fd05e6b7 | |||
| 5a023651b5 | |||
| b9ba2bab06 | |||
| 852d9bfc3e | |||
| cd3ce54a40 | |||
| 6f4f451144 | |||
| 4b6c8d8327 | |||
| a61267944d | |||
| 46d02fca47 | |||
| 6779218da6 | |||
| 04b94367a9 | |||
| cdd6e3104b | |||
| 8d1e2f4c7d | |||
| 0f2f6df299 | |||
| c56f67ae2e | |||
| 39b748cdac | |||
| 6d186c2304 | |||
| 681a7606d5 | |||
| 0e8de7e7fe | |||
| 3919b72b0c | |||
| f796ec1218 | |||
| 5af349ad4a | |||
| 6485e1e3ce | |||
| e7b33b75c9 | |||
| 2e22ed9683 | |||
| 15e81cb5cd | |||
| 0e6ecedf85 | |||
| 75dd7dfbc5 | |||
| d8ce04252a | |||
| c14c0e92d4 | |||
| 9730129506 | |||
| 8b4e0defb9 | |||
| 15cc1f70e3 | |||
| ae3e78f75a | |||
| 7ee6da68fe | |||
| 6e2ea7c87c | |||
| 5f0c749f94 | |||
| b3836062a3 | |||
| b1c59a9b5a | |||
| db92f1271e | |||
| 6dc318704a | |||
| 6304f8fc1d | |||
| d7769a5ecd | |||
| 005d8c35d4 | |||
| a73608ce6c | |||
| ef7dc12bc2 | |||
| 2d856a5858 | |||
| 8fac6f8edd | |||
| 560ec7dcd0 | |||
| aaf02d0a7c | |||
| b767bdbcb4 | |||
| c25f6aaba6 | |||
| 2bd3026bac | |||
| 88d6a90f60 | |||
| 8d9f02a846 | |||
| e16456bb94 | |||
| 388654fcbd | |||
| 865252274c | |||
| 8b892c9432 | |||
| 7f9023c631 | |||
| f3456eb470 | |||
| 46272e939d | |||
| 0daabe56f5 | |||
| 85afc05c35 | |||
| 866e1df042 | |||
| 28ea2ab49d | |||
| 1f11ca5319 | |||
| 3e99e85e48 | |||
| b39694ea24 | |||
| 363b822d8b | |||
| 00802c7064 | |||
| e45ca7c86f | |||
| 664897ee19 | |||
| 91d249f097 | |||
| 4ba88257eb | |||
| 4c4a0c5dd1 | |||
| 8817272932 | |||
| 6a882371f0 | |||
| 4e8e714f37 | |||
| 01c3c226a9 | |||
| c7371ec21b | |||
| c15b110afe | |||
| 3564b5cb0f | |||
| 51ef8dffb5 | |||
| 9d8f1a6919 | |||
| 0f93199aa4 | |||
| 57fa97cc70 | |||
| fa7c524b18 | |||
| f1c388cbab | |||
| ea3ee4d455 | |||
| 24f6da37ed | |||
| c861f15492 | |||
| bfe3c1e4bd |
|
Before Width: | Height: | Size: 497 KiB |
BIN
public/images/agents.webp
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.9 MiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
BIN
public/images/bento-agent.jpg
Normal file
|
After Width: | Height: | Size: 95 KiB |
BIN
public/images/bento-cloud.jpg
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
public/images/bento-compute.png
Normal file
|
After Width: | Height: | Size: 895 KiB |
BIN
public/images/bento-gpu.jpg
Normal file
|
After Width: | Height: | Size: 179 KiB |
BIN
public/images/bento-network.png
Normal file
|
After Width: | Height: | Size: 151 KiB |
BIN
public/images/bento-storage.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 223 KiB |
|
Before Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 111 KiB |
BIN
public/images/cloud.png
Normal file
|
After Width: | Height: | Size: 723 KiB |
BIN
public/images/cloud/billing.png
Normal file
|
After Width: | Height: | Size: 778 KiB |
BIN
public/images/cloud/kubeconfig.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
public/images/cloud/reserve.png
Normal file
|
After Width: | Height: | Size: 2.0 MiB |
|
Before Width: | Height: | Size: 1.6 MiB |
|
Before Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 938 KiB |
BIN
public/images/cloudhero4.webp
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
public/images/cloudhosting.webp
Normal file
|
After Width: | Height: | Size: 1.8 MiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 878 KiB |
|
Before Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 316 KiB |
|
Before Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 1.1 MiB |
BIN
public/images/computehero.webp
Normal file
|
After Width: | Height: | Size: 1.7 MiB |
BIN
public/images/computehero11.webp
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
|
Before Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.6 MiB |
|
Before Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 327 KiB |
|
Before Width: | Height: | Size: 140 KiB |
BIN
public/images/encrypted.png
Normal file
|
After Width: | Height: | Size: 888 KiB |
BIN
public/images/filesystem.png
Normal file
|
After Width: | Height: | Size: 910 KiB |
4
public/images/github.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" aria-label="GitHub" viewBox="0 0 512 512" id="github">
|
||||
<rect width="512" height="512" fill="#1B1817" rx="15%"></rect>
|
||||
<path fill="#fff" d="M335 499c14 0 12 17 12 17H165s-2-17 12-17c13 0 16-6 16-12l-1-50c-71 16-86-28-86-28-12-30-28-37-28-37-24-16 1-16 1-16 26 2 40 26 40 26 22 39 59 28 74 22 2-17 9-28 16-35-57-6-116-28-116-126 0-28 10-51 26-69-3-6-11-32 3-67 0 0 21-7 70 26 42-12 86-12 128 0 49-33 70-26 70-26 14 35 6 61 3 67 16 18 26 41 26 69 0 98-60 120-117 126 10 8 18 24 18 48l-1 70c0 6 3 12 16 12z"></path>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 563 B |
BIN
public/images/gpuhero2.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 1.8 MiB After Width: | Height: | Size: 51 KiB |
BIN
public/images/iot-gdb6f0c390_1280-1024x706.webp
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
public/images/ipfs.png
Normal file
|
After Width: | Height: | Size: 834 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/cryptpad.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
public/images/logo/gitea.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
public/images/logo/images.png
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
BIN
public/images/logo/lifekit.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
public/images/logo/matrix.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
public/images/logo/nextcloud.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
public/images/logo/stalwart.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
public/images/pages/agent.png
Normal file
|
After Width: | Height: | Size: 107 KiB |
BIN
public/images/pages/cloud.png
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
public/images/pages/compute.png
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
public/images/pages/gpu.png
Normal file
|
After Width: | Height: | Size: 121 KiB |
BIN
public/images/pages/gpuhero2.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
public/images/pages/network.png
Normal file
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 6.1 MiB |
BIN
public/images/pages/storage.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
public/images/pods.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
public/images/s3.png
Normal file
|
After Width: | Height: | Size: 1007 KiB |
BIN
public/images/storage.png
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
public/images/testpic.png
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
public/images/vm.webp
Normal file
|
After Width: | Height: | Size: 78 KiB |
BIN
public/videos/mhero.mp4
Normal file
@@ -1,4 +1,4 @@
|
||||
import { BrowserRouter, Routes, Route } from 'react-router-dom';
|
||||
import { HashRouter, Routes, Route } from 'react-router-dom';
|
||||
import { Layout } from './components/Layout';
|
||||
import { lazy, Suspense } from 'react';
|
||||
|
||||
@@ -13,7 +13,7 @@ const GpuPage = lazy(() => import('./pages/gpu/GpuPage'));
|
||||
|
||||
function App() {
|
||||
return (
|
||||
<BrowserRouter>
|
||||
<HashRouter>
|
||||
<Suspense fallback={<div>Loading...</div>}>
|
||||
<Routes>
|
||||
<Route path="/" element={<Layout />}>
|
||||
@@ -28,7 +28,7 @@ function App() {
|
||||
</Route>
|
||||
</Routes>
|
||||
</Suspense>
|
||||
</BrowserRouter>
|
||||
</HashRouter>
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { motion } from 'framer-motion'
|
||||
import { forwardRef } from 'react'
|
||||
|
||||
type AnimatedSectionProps = {
|
||||
children: React.ReactNode
|
||||
@@ -6,9 +7,11 @@ type AnimatedSectionProps = {
|
||||
className?: string
|
||||
}
|
||||
|
||||
export function AnimatedSection({ children, id, className }: AnimatedSectionProps) {
|
||||
export const AnimatedSection = forwardRef<HTMLElement, AnimatedSectionProps>(
|
||||
({ children, id, className }, ref) => {
|
||||
return (
|
||||
<motion.section
|
||||
ref={ref}
|
||||
id={id}
|
||||
className={className}
|
||||
initial={{ opacity: 0, y: 40 }}
|
||||
@@ -19,4 +22,5 @@ export function AnimatedSection({ children, id, className }: AnimatedSectionProp
|
||||
{children}
|
||||
</motion.section>
|
||||
)
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
@@ -3,9 +3,9 @@ import clsx from 'clsx'
|
||||
|
||||
const baseStyles = {
|
||||
solid:
|
||||
'inline-flex justify-center rounded-full py-2 px-4 text-sm font-semibold transition-colors',
|
||||
'inline-flex justify-center rounded-full py-2 px-5 text-base font-semibold transition-colors',
|
||||
outline:
|
||||
'inline-flex justify-center rounded-full border py-[calc(--spacing(2)-1px)] px-[calc(--spacing(4)-1px)] text-sm transition-colors',
|
||||
'inline-flex justify-center bg-transparent rounded-full border py-[calc(--spacing(2)-1px)] px-[calc(--spacing(5)-1px)] text-base transition-colors',
|
||||
}
|
||||
|
||||
const variantStyles = {
|
||||
@@ -17,7 +17,7 @@ const variantStyles = {
|
||||
green: 'bg-green-500 text-white hover:bg-green-600',
|
||||
},
|
||||
outline: {
|
||||
cyan: 'border-cyan-500 text-cyan-500 hover:bg-cyan-50',
|
||||
cyan: 'border-cyan-500 text-cyan-500',
|
||||
gray: 'border-gray-300 text-gray-700 hover:border-cyan-500 active:border-cyan-500',
|
||||
white: 'border-gray-300 text-white hover:border-cyan-500 active:border-cyan-500',
|
||||
},
|
||||
|
||||
@@ -3,12 +3,12 @@ import { Container } from './Container'
|
||||
|
||||
export function Footer() {
|
||||
return (
|
||||
<footer className="border-t border-gray-200">
|
||||
<footer className="">
|
||||
<Container>
|
||||
<div className="flex flex-col items-start justify-between gap-y-12 pt-16 pb-6 lg:flex-row lg:items-center lg:py-8">
|
||||
<div>
|
||||
<div className="flex items-center text-gray-900">
|
||||
<img src="/src/images/logomark.svg" alt="Mycelium Logomark" className="h-15 w-15 flex-none" />
|
||||
<img src="/images/logomark.svg" alt="Mycelium Logomark" className="h-15 w-15 flex-none" />
|
||||
<div className="ml-4">
|
||||
<p className="text-base font-semibold">Project Mycelium</p>
|
||||
<p className="mt-1 text-sm">Unleash the Power of Decentralization</p>
|
||||
@@ -31,7 +31,7 @@ export function Footer() {
|
||||
</div>
|
||||
<div className="group relative -mx-4 flex items-center self-stretch p-4 transition-colors hover:bg-gray-100 sm:self-auto sm:rounded-2xl lg:mx-0 lg:self-auto lg:p-6">
|
||||
<div className="relative flex h-16 w-16 flex-none items-center justify-center">
|
||||
<img src="/src/images/github.svg" alt="GitHub" className="h-16 w-16" />
|
||||
<img src="/images/github.svg" alt="GitHub" className="h-16 w-16" />
|
||||
</div>
|
||||
<div className="ml-4 lg:w-72">
|
||||
<p className="text-base font-semibold text-gray-900">
|
||||
@@ -46,7 +46,7 @@ export function Footer() {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex flex-col items-center border-t border-gray-200 pt-8 pb-12 md:flex-row-reverse md:justify-between md:pt-6">
|
||||
<div className="flex flex-col items-center border-t border-gray-100 pt-8 pb-12 md:flex-row-reverse md:justify-between md:pt-6">
|
||||
<p className="mt-6 text-sm text-gray-500 md:mt-0">
|
||||
© Copyright{' '}
|
||||
<a href="https://www.threefold.io" target="_blank" rel="noopener noreferrer" className="hover:text-cyan-500 transition-colors">
|
||||
|
||||
@@ -1,15 +1,36 @@
|
||||
import { Link } from 'react-router-dom'
|
||||
import { useState } from 'react'
|
||||
import { Link, useLocation } from 'react-router-dom'
|
||||
import { Dropdown } from './ui/Dropdown'
|
||||
import { ChevronDownIcon } from '@heroicons/react/20/solid'
|
||||
import { Container } from './Container'
|
||||
import { Button } from './Button'
|
||||
import pmyceliumLogo from '../images/logos/logo_1.png'
|
||||
import { Dialog } from '@headlessui/react'
|
||||
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() {
|
||||
const location = useLocation()
|
||||
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 (
|
||||
<header>
|
||||
<nav>
|
||||
<Container className="relative z-50 flex justify-between py-4">
|
||||
<header className="bg-white">
|
||||
<nav className="border-b border-gray-100">
|
||||
<Container className="flex bg-transparent justify-between py-4">
|
||||
<div className="relative z-10 flex items-center gap-16">
|
||||
<Link to="/" aria-label="Home">
|
||||
<img src={pmyceliumLogo} alt="Mycelium" className="h-8 w-auto" />
|
||||
@@ -18,16 +39,18 @@ export function Header() {
|
||||
<Dropdown
|
||||
buttonContent={
|
||||
<>
|
||||
Cloud
|
||||
{['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={[
|
||||
{ name: 'Cloud', href: '/cloud' },
|
||||
{ name: 'Compute', href: '/compute' },
|
||||
{ name: 'Storage', href: '/storage' },
|
||||
{ name: 'GPU', href: '/gpu' },
|
||||
]}
|
||||
items={cloudNavItems}
|
||||
/>
|
||||
<Link
|
||||
to="/network"
|
||||
@@ -52,15 +75,94 @@ export function Header() {
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
Start Deployment
|
||||
Deploy Now
|
||||
</Button>
|
||||
<Button to="/download" variant="solid" color="cyan">
|
||||
Get Mycelium Connector
|
||||
</Button>
|
||||
</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>
|
||||
</Container>
|
||||
</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 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>
|
||||
<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"
|
||||
onClick={() => setMobileMenuOpen(false)}
|
||||
>
|
||||
{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"
|
||||
onClick={() => setMobileMenuOpen(false)}
|
||||
>
|
||||
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"
|
||||
onClick={() => setMobileMenuOpen(false)}
|
||||
>
|
||||
Agents
|
||||
</Link>
|
||||
</div>
|
||||
<div className="py-6">
|
||||
<Button
|
||||
to="https://myceliumcloud.tf"
|
||||
variant="outline"
|
||||
as="a"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="w-full"
|
||||
onClick={() => setMobileMenuOpen(false)}
|
||||
>
|
||||
Start Deployment
|
||||
</Button>
|
||||
<Button to="/download" variant="solid" color="cyan" className="mt-4 w-full" onClick={() => setMobileMenuOpen(false)}>
|
||||
Get Mycelium Connector
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Dialog.Panel>
|
||||
</Dialog>
|
||||
</header>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -5,12 +5,14 @@ import { Header } from './Header'
|
||||
export function Layout() {
|
||||
|
||||
return (
|
||||
<div className="bg-white antialiased" style={{ fontFamily: 'var(--font-inter)' }}>
|
||||
<div className="bg-[#fdfdfd] antialiased relative" style={{ fontFamily: 'var(--font-inter)' }}>
|
||||
<div className="relative z-10">
|
||||
<Header />
|
||||
<main className="">
|
||||
<main>
|
||||
<Outlet />
|
||||
</main>
|
||||
<Footer />
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
@@ -131,7 +131,7 @@ export const FeatureTitle = createTextComponent(
|
||||
)
|
||||
export const FeatureDescription = createTextComponent(
|
||||
'p',
|
||||
'text-sm leading-normal tracking-normal'
|
||||
'lg:text-base text-sm leading-normal tracking-normal'
|
||||
)
|
||||
export const MobileFeatureTitle = createTextComponent(
|
||||
'h3',
|
||||
@@ -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 CP = createTextComponent('p', 'text-sm lg:text-base tracking-wide leading-relaxed font-light')
|
||||
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')
|
||||
|
||||
@@ -59,7 +59,7 @@ export default function FeaturesSectionDemo() {
|
||||
},
|
||||
];
|
||||
return (
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 relative z-10 py-10 max-w-7xl mx-auto">
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 relative z-10 py-8 max-w-7xl mx-auto">
|
||||
{features.map((feature, index) => (
|
||||
<Feature key={feature.title} {...feature} index={index} />
|
||||
))}
|
||||
@@ -81,7 +81,7 @@ const Feature = ({
|
||||
return (
|
||||
<div
|
||||
className={cn(
|
||||
"flex flex-col lg:border-r py-10 relative group/feature dark:border-neutral-800",
|
||||
"flex flex-col lg:border-r py-8 relative group/feature dark:border-neutral-800",
|
||||
(index === 0 || index === 4) && "lg:border-l dark:border-neutral-800",
|
||||
index < 4 && "lg:border-b dark:border-neutral-800"
|
||||
)}
|
||||
|
||||
@@ -40,7 +40,7 @@ export default function FeaturesSectionDemo() {
|
||||
},
|
||||
];
|
||||
return (
|
||||
<div className="relative z-20 py-10 lg:py-40 max-w-7xl mx-auto">
|
||||
<div className="relative z-20 py-8 lg:py-40 max-w-7xl mx-auto">
|
||||
<div className="px-8">
|
||||
<h4 className="text-3xl lg:text-5xl lg:leading-tight max-w-5xl mx-auto text-center tracking-tight font-medium text-black dark:text-white">
|
||||
Packed with thousands of features
|
||||
|
||||
@@ -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}>
|
||||
|
||||
@@ -11,6 +11,7 @@ import {
|
||||
import { cn } from "@/lib/utils";
|
||||
import { Link } from "react-router-dom";
|
||||
import { motion } from "motion/react";
|
||||
import { DarkCard } from "./cards";
|
||||
|
||||
interface CarouselProps {
|
||||
items: JSX.Element[];
|
||||
@@ -61,7 +62,7 @@ export const Carousel = ({ items, initialScroll = 0 }: CarouselProps) => {
|
||||
return (
|
||||
<div className="relative w-full">
|
||||
<div
|
||||
className="flex w-full overflow-x-scroll overscroll-x-auto scroll-smooth py-10 [scrollbar-width:none] md:py-20"
|
||||
className="flex w-full overflow-x-scroll overscroll-x-auto scroll-smooth py-8 [scrollbar-width:none] md:py-20"
|
||||
ref={carouselRef}
|
||||
onScroll={checkScrollability}
|
||||
>
|
||||
@@ -73,7 +74,7 @@ export const Carousel = ({ items, initialScroll = 0 }: CarouselProps) => {
|
||||
|
||||
<div
|
||||
className={cn(
|
||||
"flex flex-row justify-start gap-4 pl-4",
|
||||
"flex flex-row justify-start gap-6 pl-4",
|
||||
"mx-auto max-w-7xl", // remove max-w-4xl if you want the carousel to span the full width of its container
|
||||
)}
|
||||
>
|
||||
@@ -127,42 +128,44 @@ export const Card = ({
|
||||
card: Card;
|
||||
layout?: boolean;
|
||||
}) => {
|
||||
|
||||
return (
|
||||
<Link to={card.link}>
|
||||
<DarkCard className="p-0 rounded-3xl">
|
||||
<motion.div
|
||||
layoutId={layout ? `card-${card.title}` : undefined}
|
||||
className="relative z-10 flex h-60 w-56 flex-col items-start justify-start overflow-hidden rounded-3xl border border-gray-500/30 md:h-120 md:w-96 hover:scale-105 transition-transform duration-200"
|
||||
style={{
|
||||
backgroundImage: `url(${card.bg})`,
|
||||
backgroundSize: 'cover',
|
||||
backgroundPosition: 'center',
|
||||
}}
|
||||
className="relative z-10 flex h-104 w-80 flex-col justify-between overflow-hidden rounded-3xl p-8 md:h-120 md:w-96"
|
||||
>
|
||||
<div className="pointer-events-none absolute inset-x-0 top-0 z-30 h-full bg-gradient-to-b from-black/50 via-transparent to-transparent" />
|
||||
<div className="relative z-40 p-8 w-full">
|
||||
<div className="flex h-2/5 flex-col justify-center py-4 px-4">
|
||||
<motion.p
|
||||
layoutId={layout ? `category-${card.category}` : undefined}
|
||||
className="text-left font-sans text-sm font-medium text-white md:text-base"
|
||||
className="text-left font-sans font-semibold text-cyan-500 uppercase tracking-wider text-xs md:text-sm"
|
||||
>
|
||||
{card.category}
|
||||
</motion.p>
|
||||
<motion.p
|
||||
layoutId={layout ? `title-${card.title}` : undefined}
|
||||
className="mt-2 max-w-xs text-left font-sans text-xl font-semibold [text-wrap:balance] text-white md:text-3xl"
|
||||
className="mt-1 max-w-xs text-left font-sans text-xl font-semibold text-white [text-wrap:balance] lg:text-2xl"
|
||||
>
|
||||
{card.title}
|
||||
</motion.p>
|
||||
<div className="flex flex-row justify-between items-center w-full mt-4">
|
||||
<motion.p className="max-w-xs text-left font-sans lg:text-lg text-base text-neutral-300">
|
||||
<div className="mt-2 flex w-full flex-row items-center justify-between md:mt-4">
|
||||
<motion.p className="max-w-xs text-left font-sans lg:text-xl text-lg text-neutral-300 lg:leading-normal leading-tight">
|
||||
{card.description}
|
||||
</motion.p>
|
||||
<div className="h-8 w-8 bg-[#212121] rounded-full flex items-center justify-center text-[#858585] shrink-0 hover:bg-[#262626] hover:text-white active:bg-[#262626] active:text-white transition-colors duration-200">
|
||||
<IconChevronRight className="h-6 w-6" />
|
||||
<div className="flex h-6 w-6 ml-2 shrink-0 items-center justify-center rounded-full bg-[#212121] text-[#858585] transition-colors duration-200 hover:bg-[#262626] hover:text-white md:h-8 md:w-8">
|
||||
<IconChevronRight className="h-4 w-4 md:h-6 md:w-6 " />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative flex h-3/5 w-full items-end justify-end bg-transparent">
|
||||
<img
|
||||
src={card.src}
|
||||
alt={card.title}
|
||||
className="h-full w-full origin-bottom-right scale-75 object-contain mb-10"
|
||||
/>
|
||||
</div>
|
||||
</motion.div>
|
||||
</DarkCard>
|
||||
</Link>
|
||||
);
|
||||
};
|
||||
|
||||
19
src/components/ui/cards.tsx
Normal file
@@ -0,0 +1,19 @@
|
||||
import * as React from "react";
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
const DarkCard = React.forwardRef<
|
||||
HTMLDivElement,
|
||||
React.HTMLAttributes<HTMLDivElement>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<div
|
||||
ref={ref}
|
||||
className={cn(
|
||||
"border border-white/10 bg-white/3 p-8 backdrop-blur-sm transition hover:-translate-y-1 hover:border-cyan-300/50 rounded-xl hover:bg-white/6 hover:scale-105 hover:shadow-lg hover:shadow-cyan-500/15",
|
||||
className
|
||||
)}
|
||||
{...props}
|
||||
/>
|
||||
));
|
||||
DarkCard.displayName = "DarkCard";
|
||||
|
||||
export { DarkCard };
|
||||
BIN
src/images/6890d07f23cb642ec7274aee_platform-image.webp
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
src/images/ChatGPT Image Nov 6, 2025, 09_01_36 PM.png
Normal file
|
After Width: | Height: | Size: 2.0 MiB |
BIN
src/images/bento-compute.png
Normal file
|
After Width: | Height: | Size: 1002 KiB |
BIN
src/images/bento-gpu.jpg
Normal file
|
After Width: | Height: | Size: 179 KiB |
BIN
src/images/bento-storage.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
src/images/cloudhosting.png
Normal file
|
After Width: | Height: | Size: 2.0 MiB |
@@ -6,9 +6,7 @@
|
||||
line-height: 1.5;
|
||||
font-weight: 400;
|
||||
|
||||
color-scheme: light dark;
|
||||
color: rgba(255, 255, 255, 0.87);
|
||||
background-color: #242424;
|
||||
|
||||
font-synthesis: none;
|
||||
text-rendering: optimizeLegibility;
|
||||
@@ -60,7 +58,6 @@ button:focus-visible {
|
||||
@media (prefers-color-scheme: light) {
|
||||
:root {
|
||||
color: #213547;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
a:hover {
|
||||
color: #747bff;
|
||||
|
||||
@@ -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>
|
||||
|
||||
157
src/pages/agents/AgentBento.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
75
src/pages/agents/AgentComponents.tsx
Normal file
@@ -0,0 +1,75 @@
|
||||
|
||||
import { Container } from '@/components/Container'
|
||||
import { Eyebrow, SectionHeader } from '@/components/Texts'
|
||||
|
||||
const components = [
|
||||
{
|
||||
component: 'Long-Term Memory (FungiStor)',
|
||||
purpose: 'Durable, distributed memory with erasure-coded resilience',
|
||||
backedBy: 'Mycelium Storage',
|
||||
},
|
||||
{
|
||||
component: 'Active Retrieval (HeroDB)',
|
||||
purpose: 'Fast multimodal vector + keyword retrieval',
|
||||
backedBy: 'Compute + Storage',
|
||||
},
|
||||
{
|
||||
component: 'Secure Agent Workspaces (MOS Sandboxes)',
|
||||
purpose: 'Ephemeral, isolated execution for agent actions',
|
||||
backedBy: 'Mycelium Compute',
|
||||
},
|
||||
{
|
||||
component: 'Private Communication (Mycelium Mesh)',
|
||||
purpose: 'Peer-to-peer encrypted network',
|
||||
backedBy: 'Mycelium Network',
|
||||
},
|
||||
{
|
||||
component: 'Verifiable Execution (Deterministic Deploy)',
|
||||
purpose: 'Ensure the code running is exactly what you signed',
|
||||
backedBy: 'The Stack',
|
||||
},
|
||||
{
|
||||
component: 'Agent Coordination Engine (coming online next)',
|
||||
purpose: 'Orchestrate multi-step workflows and tool use',
|
||||
backedBy: 'Hero Orchestrator',
|
||||
},
|
||||
]
|
||||
|
||||
export function AgentComponents() {
|
||||
return (
|
||||
<section className="bg-white py-24 sm:py-32">
|
||||
<Container>
|
||||
<div className="mx-auto max-w-3xl text-center">
|
||||
<Eyebrow>AGENT COMPONENTS</Eyebrow>
|
||||
<SectionHeader as="h2" className="mt-6 text-gray-900">
|
||||
The Building Blocks of Sovereign Agents
|
||||
</SectionHeader>
|
||||
</div>
|
||||
|
||||
<div className="mx-auto mt-16 max-w-6xl overflow-x-auto">
|
||||
<table className="w-full table-auto border-collapse text-left text-sm text-gray-700">
|
||||
<thead>
|
||||
<tr className="bg-cyan-50 border-b border-gray-100">
|
||||
<th className="py-3 px-4 font-semibold text-gray-900">Component</th>
|
||||
<th className="py-3 px-4 font-semibold text-gray-900">Purpose</th>
|
||||
<th className="py-3 px-4 font-semibold text-gray-900">Backed By</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{components.map((item) => (
|
||||
<tr
|
||||
key={item.component}
|
||||
className="border-b border-gray-100 hover:bg-cyan-50/40 transition"
|
||||
>
|
||||
<td className="py-4 px-4 font-medium text-gray-900">{item.component}</td>
|
||||
<td className="py-4 px-4">{item.purpose}</td>
|
||||
<td className="py-4 px-4 text-cyan-700 font-medium">{item.backedBy}</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</Container>
|
||||
</section>
|
||||
)
|
||||
}
|
||||
43
src/pages/agents/AgentHeroAlt.tsx
Normal file
@@ -0,0 +1,43 @@
|
||||
'use client'
|
||||
|
||||
import { Button } from '@/components/Button'
|
||||
import { Eyebrow, H3 } from '@/components/Texts'
|
||||
|
||||
export function AgentHeroAlt() {
|
||||
return (
|
||||
<div className="">
|
||||
{/* Boxed container */}
|
||||
<div
|
||||
className="relative mx-auto max-w-7xl border border-t-0 border-b-0 border-gray-100 bg-white overflow-hidden bg-contain bg-right bg-no-repeat"
|
||||
style={{ backgroundImage: "url('/images/agents.webp')", backgroundSize: "contain" }}
|
||||
>
|
||||
{/* Inner padding */}
|
||||
<div className="px-6 py-16 lg:py-16">
|
||||
<div className="max-w-2xl lg:pl-6">
|
||||
<Eyebrow>MYCELIUM AGENTS</Eyebrow>
|
||||
<H3 as="h1" className="mt-4">
|
||||
Sovereign AI Agents, Coming Soon.
|
||||
</H3>
|
||||
<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.
|
||||
</p>
|
||||
<p className="mt-4 lg:text-base italic text-gray-600 text-sm">
|
||||
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.
|
||||
</p>
|
||||
<div className="mt-10 flex items-center gap-x-6">
|
||||
<Button href="#" variant="solid" color="cyan">
|
||||
Follow Deployment
|
||||
</Button>
|
||||
<Button href="#" variant="outline">
|
||||
Explore Docs <span aria-hidden="true">→</span>
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</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>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -2,14 +2,15 @@ import { AnimatedSection } from '../../components/AnimatedSection'
|
||||
import { DeploySection } from './DeploySection'
|
||||
import { GallerySection } from './GallerySection'
|
||||
import { Companies } from './Companies'
|
||||
import { BentoSection } from './BentoSection'
|
||||
import { AgentsHeroAlt } from './AgentsHeroAlt'
|
||||
import { AgentBento } from './AgentBento'
|
||||
import { AgentHeroAlt } from './AgentHeroAlt'
|
||||
import { CallToAction } from './CallToAction'
|
||||
|
||||
export default function AgentsPage() {
|
||||
return (
|
||||
<div>
|
||||
<AnimatedSection>
|
||||
<AgentsHeroAlt />
|
||||
<AgentHeroAlt />
|
||||
</AnimatedSection>
|
||||
|
||||
<AnimatedSection>
|
||||
@@ -25,7 +26,11 @@ export default function AgentsPage() {
|
||||
</AnimatedSection>
|
||||
|
||||
<AnimatedSection>
|
||||
<BentoSection />
|
||||
<AgentBento />
|
||||
</AnimatedSection>
|
||||
|
||||
<AnimatedSection>
|
||||
<CallToAction />
|
||||
</AnimatedSection>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { motion } from 'framer-motion'
|
||||
import { Container } from '../../components/Container'
|
||||
import { Eyebrow, SectionHeader, P, CT, CP } from '../../components/Texts'
|
||||
import { Container } from '@/components/Container'
|
||||
import { Eyebrow, SectionHeader, P, CT, CP } from '@/components/Texts'
|
||||
|
||||
const items = [
|
||||
{
|
||||
@@ -19,7 +19,7 @@ const items = [
|
||||
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/sandbox.mp4',
|
||||
video: '/videos/herodb.mp4',
|
||||
},
|
||||
{
|
||||
title: 'Mycelium Mesh',
|
||||
@@ -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}
|
||||
|
||||
57
src/pages/agents/CallToAction.tsx
Normal file
@@ -0,0 +1,57 @@
|
||||
"use client";
|
||||
|
||||
import { Container } from "@/components/Container";
|
||||
import { Button } from "@/components/Button";
|
||||
|
||||
export function CallToAction() {
|
||||
return (
|
||||
<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 today’s 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>
|
||||
|
||||
{/* ✅ 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>
|
||||
);
|
||||
}
|
||||
@@ -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,23 +37,8 @@ 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 ">
|
||||
<InfiniteMovingCards
|
||||
|
||||
@@ -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 }}
|
||||
@@ -55,12 +59,12 @@ export function DeploySection() {
|
||||
transition={{ duration: 0.6, ease: "easeOut", delay: 0.1 }}
|
||||
className="mx-auto max-w-5xl text-center"
|
||||
>
|
||||
<Eyebrow color="accent">Get Started</Eyebrow>
|
||||
<Eyebrow color="accent">Deployment</Eyebrow>
|
||||
<SectionHeader className="text-3xl font-medium tracking-tight" color="light">
|
||||
Deploy Scalable LLMs and AI Agents
|
||||
Run LLMs and Agent Workloads privately, today.
|
||||
</SectionHeader>
|
||||
<P className="mt-6" color="light">
|
||||
Launch and scale intelligence on your own terms. Mycelium Cloud makes it simple to deploy models, integrate knowledge, and run everything on a network you control.
|
||||
Even before the full Agent layer launches, you can deploy models and retrieval pipelines using Mycelium Cloud.
|
||||
</P>
|
||||
</motion.div>
|
||||
<motion.ul
|
||||
@@ -90,6 +94,8 @@ export function DeploySection() {
|
||||
))}
|
||||
</motion.ul>
|
||||
</div>
|
||||
<div className="w-full border-b border-gray-800 bg-[#121212]" />
|
||||
|
||||
</section>
|
||||
);
|
||||
}
|
||||
|
||||