forked from emre/www_projectmycelium_com
Compare commits
6 Commits
a3028ff448
...
developmen
| Author | SHA1 | Date | |
|---|---|---|---|
| 4f63c20aa6 | |||
| 74dd974da5 | |||
| 0eef2cd013 | |||
| 3cd41ab1d9 | |||
| 3121251272 | |||
| 56ceac1319 |
24
src/App.tsx
24
src/App.tsx
@@ -1,6 +1,6 @@
|
|||||||
import { HashRouter, Routes, Route } from 'react-router-dom';
|
import { HashRouter, Routes, Route, useLocation } from 'react-router-dom';
|
||||||
import { Layout } from './components/Layout';
|
import { Layout } from './components/Layout';
|
||||||
import { lazy, Suspense } from 'react';
|
import { lazy, Suspense, useEffect } from 'react';
|
||||||
|
|
||||||
const HomePage = lazy(() => import('./pages/home/HomePage'));
|
const HomePage = lazy(() => import('./pages/home/HomePage'));
|
||||||
const CloudPage = lazy(() => import('./pages/cloud/CloudPage'));
|
const CloudPage = lazy(() => import('./pages/cloud/CloudPage'));
|
||||||
@@ -13,9 +13,29 @@ const GpuPage = lazy(() => import('./pages/gpu/GpuPage'));
|
|||||||
const PodsPage = lazy(() => import('./pages/pods/PodsPage'));
|
const PodsPage = lazy(() => import('./pages/pods/PodsPage'));
|
||||||
const NodesPage = lazy(() => import('./pages/nodes/NodesPage'));
|
const NodesPage = lazy(() => import('./pages/nodes/NodesPage'));
|
||||||
|
|
||||||
|
function ScrollToTop() {
|
||||||
|
const { pathname, hash } = useLocation();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (hash) {
|
||||||
|
const id = hash.replace('#', '');
|
||||||
|
const element = document.getElementById(id);
|
||||||
|
if (element) {
|
||||||
|
element.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.scrollTo({ top: 0, left: 0, behavior: 'auto' });
|
||||||
|
}, [pathname, hash]);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
return (
|
return (
|
||||||
<HashRouter>
|
<HashRouter>
|
||||||
|
<ScrollToTop />
|
||||||
<Suspense fallback={<div>Loading...</div>}>
|
<Suspense fallback={<div>Loading...</div>}>
|
||||||
<Routes>
|
<Routes>
|
||||||
<Route path="/" element={<Layout />}>
|
<Route path="/" element={<Layout />}>
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ const XAILogo = () => (
|
|||||||
xmlSpace="preserve"
|
xmlSpace="preserve"
|
||||||
width="30"
|
width="30"
|
||||||
height="30"
|
height="30"
|
||||||
|
fill="white"
|
||||||
>
|
>
|
||||||
<g>
|
<g>
|
||||||
<polygon points="557.09,211.99 565.4,538.36 631.96,538.36 640.28,93.18 " />
|
<polygon points="557.09,211.99 565.4,538.36 631.96,538.36 640.28,93.18 " />
|
||||||
|
|||||||
@@ -62,12 +62,9 @@ export const InfiniteMovingCards = ({
|
|||||||
ref={scrollerRef}
|
ref={scrollerRef}
|
||||||
className={cn(
|
className={cn(
|
||||||
"flex min-w-full shrink-0 gap-16 py-4 w-max flex-nowrap",
|
"flex min-w-full shrink-0 gap-16 py-4 w-max flex-nowrap",
|
||||||
start && "animate-scroll",
|
start && (direction === "left" ? "animate-scroll-left" : "animate-scroll-right"),
|
||||||
pauseOnHover && "hover:[animation-play-state:paused]",
|
pauseOnHover && "hover:[animation-play-state:paused]"
|
||||||
)}
|
)}
|
||||||
style={{
|
|
||||||
"--animation-direction": direction === "left" ? "forwards" : "reverse",
|
|
||||||
} as React.CSSProperties}
|
|
||||||
>
|
>
|
||||||
{items.map((item, idx) => (
|
{items.map((item, idx) => (
|
||||||
<li className="relative flex-shrink-0" key={idx}>
|
<li className="relative flex-shrink-0" key={idx}>
|
||||||
|
|||||||
@@ -119,8 +119,8 @@ export function AgentBento() {
|
|||||||
className={`relative flex lg:h-90 flex-col overflow-hidden rounded-[calc(var(--radius-lg)+1px)] `}
|
className={`relative flex lg:h-90 flex-col overflow-hidden rounded-[calc(var(--radius-lg)+1px)] `}
|
||||||
>
|
>
|
||||||
{card.animation ? (
|
{card.animation ? (
|
||||||
<div className="lg:h-64 h-48 w-full overflow-hidden bg-transparent flex items-center">
|
<div className="lg:h-64 h-48 w-full overflow-hidden bg-transparent flex items-center justify-center">
|
||||||
<card.animation />
|
<div className="w-full h-full object-cover"><card.animation /></div>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="h-48 w-full flex items-center justify-center bg-transparent" />
|
<div className="h-48 w-full flex items-center justify-center bg-transparent" />
|
||||||
|
|||||||
@@ -36,10 +36,10 @@ export function AgentDesign() {
|
|||||||
{benefits.map((item) => (
|
{benefits.map((item) => (
|
||||||
<div
|
<div
|
||||||
key={item.id}
|
key={item.id}
|
||||||
className="flex flex-col items-center bg-white dark:bg-black/40 py-10 px-4 border border-gray-100 dark:border-gray-800 lg:border-t-0 lg:border-b-0"
|
className="flex flex-col items-center bg-white py-10 px-4 border border-gray-100 lg:border-t-0 lg:border-b-0"
|
||||||
>
|
>
|
||||||
<item.icon className="h-10 w-10 text-cyan-500 mb-4" />
|
<item.icon className="h-10 w-10 text-cyan-500 mb-4" />
|
||||||
<h3 className="text-base font-medium text-black dark:text-white max-w-xs">
|
<h3 className="text-base font-medium text-black max-w-xs">
|
||||||
{item.title}
|
{item.title}
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
65
src/pages/agents/AgentLogos.tsx
Normal file
65
src/pages/agents/AgentLogos.tsx
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
import { InfiniteMovingCards } from "@/components/magicui/infinite-moving-cards";
|
||||||
|
import Ai21Logo from "@/components/logos/Ai21";
|
||||||
|
import ClaudeLogo from "@/components/logos/Claude";
|
||||||
|
import BaiduCloudLogo from "@/components/logos/BaiduCloud";
|
||||||
|
import ByteDanceLogo from "@/components/logos/ByteDance";
|
||||||
|
import DeepSeekLogo from "@/components/logos/DeepSeek";
|
||||||
|
import DeepMindLogo from "@/components/logos/DeepMind";
|
||||||
|
import MinimaxLogo from "@/components/logos/Minimax";
|
||||||
|
import MistralLogo from "@/components/logos/Mistral";
|
||||||
|
import MoonshotLogo from "@/components/logos/Moonshot";
|
||||||
|
import TencentCloudLogo from "@/components/logos/TencentCloud";
|
||||||
|
import OpenAILogo from "@/components/logos/OpenAI";
|
||||||
|
import XAILogo from "@/components/logos/XAI";
|
||||||
|
|
||||||
|
const logos = [
|
||||||
|
{ id: "ai21", Component: Ai21Logo, label: "AI21" },
|
||||||
|
{ id: "claude", Component: ClaudeLogo, label: "Claude" },
|
||||||
|
{ id: "baidu", Component: BaiduCloudLogo, label: "Baidu Cloud" },
|
||||||
|
{ id: "bytedance", Component: ByteDanceLogo, label: "ByteDance" },
|
||||||
|
{ id: "deepseek", Component: DeepSeekLogo, label: "DeepSeek" },
|
||||||
|
{ id: "deepmind", Component: DeepMindLogo, label: "DeepMind" },
|
||||||
|
{ id: "minimax", Component: MinimaxLogo, label: "Minimax" },
|
||||||
|
{ id: "mistral", Component: MistralLogo, label: "Mistral" },
|
||||||
|
{ id: "moonshot", Component: MoonshotLogo, label: "Moonshot" },
|
||||||
|
{ id: "tencent", Component: TencentCloudLogo, label: "Tencent Cloud" },
|
||||||
|
{ id: "openai", Component: OpenAILogo, label: "OpenAI" },
|
||||||
|
{ id: "xai", Component: XAILogo, label: "xAI" },
|
||||||
|
];
|
||||||
|
|
||||||
|
const splitLogoRows = () => {
|
||||||
|
const midpoint = Math.ceil(logos.length / 2);
|
||||||
|
return [logos.slice(0, midpoint), logos.slice(midpoint)];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const AgentLogos = () => {
|
||||||
|
const rows = splitLogoRows();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section className="relative isolate overflow-hidden bg-[#121212] py-4">
|
||||||
|
<div className="pointer-events-none absolute inset-y-0 left-0 w-32 bg-gradient-to-r from-black to-transparent" />
|
||||||
|
<div className="pointer-events-none absolute inset-y-0 right-0 w-32 bg-gradient-to-l from-black to-transparent" />
|
||||||
|
<div className="flex w-full flex-col gap-1 px-0">
|
||||||
|
{rows.map((row, idx) => (
|
||||||
|
<InfiniteMovingCards
|
||||||
|
key={`logos-row-${idx}`}
|
||||||
|
items={row.map(({ id, Component, label }) => (
|
||||||
|
<div
|
||||||
|
key={id}
|
||||||
|
className="flex h-24 w-36 items-center justify-center bg-transparent px-4"
|
||||||
|
aria-label={label}
|
||||||
|
>
|
||||||
|
<Component />
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
direction={idx % 2 === 0 ? "left" : "right"}
|
||||||
|
speed="slow"
|
||||||
|
pauseOnHover={true}
|
||||||
|
className="w-full"
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { AnimatedSection } from '../../components/AnimatedSection'
|
import { AnimatedSection } from '../../components/AnimatedSection'
|
||||||
import { DeploySection } from './DeploySection'
|
import { DeploySection } from './DeploySection'
|
||||||
import { Companies } from './Companies'
|
import { AgentLogos } from './AgentLogos'
|
||||||
import { AgentBento } from './AgentBento'
|
import { AgentBento } from './AgentBento'
|
||||||
import { AgentHeroAlt } from './AgentHeroAlt'
|
import { AgentHeroAlt } from './AgentHeroAlt'
|
||||||
import { CallToAction } from './CallToAction'
|
import { CallToAction } from './CallToAction'
|
||||||
@@ -19,7 +19,7 @@ export default function AgentsPage() {
|
|||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
<Companies />
|
<AgentLogos />
|
||||||
</AnimatedSection>
|
</AnimatedSection>
|
||||||
|
|
||||||
<AnimatedSection>
|
<AnimatedSection>
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ export function CloudHeroNew({ onGetStartedClick = () => {} }: { onGetStartedCli
|
|||||||
<H3 className="mt-4">
|
<H3 className="mt-4">
|
||||||
Sovereign Edge Cloud Infrastructure
|
Sovereign Edge Cloud Infrastructure
|
||||||
</H3>
|
</H3>
|
||||||
<p className="mt-6 text-lg">
|
<p className="mt-6 text-lg text-gray-600">
|
||||||
Run compute, storage, and AI resources on infrastructure you control.
|
Run compute, storage, and AI resources on infrastructure you control.
|
||||||
</p>
|
</p>
|
||||||
<p className="mt-4 text-lg text-gray-600">
|
<p className="mt-4 text-lg text-gray-600">
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { H1, H4, H5 } from "@/components/Texts"
|
import { H1, H4, H3, H5, Eyebrow } from "@/components/Texts"
|
||||||
import { Button } from "@/components/Button"
|
import { Button } from "@/components/Button"
|
||||||
|
import { H3Icon } from "@heroicons/react/20/solid"
|
||||||
|
|
||||||
export function HomeAurora({ onGetStartedClick }: { onGetStartedClick: () => void }) {
|
export function HomeAurora({ onGetStartedClick }: { onGetStartedClick: () => void }) {
|
||||||
return (
|
return (
|
||||||
@@ -12,33 +13,17 @@ export function HomeAurora({ onGetStartedClick }: { onGetStartedClick: () => voi
|
|||||||
{/* Inner padding */}
|
{/* Inner padding */}
|
||||||
<div className="px-6 py-16 lg:py-32 ">
|
<div className="px-6 py-16 lg:py-32 ">
|
||||||
<div className="max-w-2xl lg:pl-6">
|
<div className="max-w-2xl lg:pl-6">
|
||||||
<div className="hidden sm:flex">
|
<Eyebrow> Project MYCELIUM</Eyebrow>
|
||||||
<div className="relative rounded-full px-3 py-1 text-sm/6 text-gray-500 ring-1 ring-gray-900/10 hover:ring-gray-900/20">
|
<H3 className="mt-4">
|
||||||
Deploying at scale?{' '}
|
Private, Distributed Infrastructure Built
|
||||||
<a href="#" className="font-semibold whitespace-nowrap text-cyan-600">
|
for Digital Sovereignty
|
||||||
<span aria-hidden="true" className="absolute inset-0" />
|
</H3>
|
||||||
Book a call <span>→</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<H1 className="mt-8">
|
|
||||||
MYCELIUM
|
|
||||||
</H1>
|
|
||||||
|
|
||||||
<H4 className="mt-8">
|
|
||||||
Private, distributed infrastructure built
|
|
||||||
for digital sovereignty
|
|
||||||
|
|
||||||
|
|
||||||
</H4>
|
|
||||||
|
|
||||||
<H5 className="mt-8 text-lg text-gray-600">
|
|
||||||
|
|
||||||
|
<H5 className="mt-4 text-lg text-gray-600 max-w-xl">
|
||||||
Run your apps, data, and intelligence on infrastructure that belongs to you
|
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-8 flex items-center gap-x-6">
|
||||||
<Button
|
<Button
|
||||||
variant="solid"
|
variant="solid"
|
||||||
color="cyan"
|
color="cyan"
|
||||||
|
|||||||
@@ -26,19 +26,19 @@ const benefits = [
|
|||||||
|
|
||||||
export function HomeDesign() {
|
export function HomeDesign() {
|
||||||
return (
|
return (
|
||||||
<section className="w-full max-w-8xl mx-auto bg-white dark:bg-transparent">
|
<section className="w-full max-w-8xl mx-auto bg-white">
|
||||||
|
|
||||||
{/* Top spacing line */}
|
{/* Top spacing line */}
|
||||||
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-200 dark:border-gray-800" />
|
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-200" />
|
||||||
<div className="w-full border border-l border-r border-gray-200 dark:border-gray-800" />
|
<div className="w-full border border-l border-r border-gray-200" />
|
||||||
|
|
||||||
{/* Content */}
|
{/* Content */}
|
||||||
<div className="mx-auto max-w-7xl border-gray-200 dark:border-gray-800">
|
<div className="mx-auto max-w-7xl border-gray-200">
|
||||||
<dl className="grid grid-cols-1 lg:grid-cols-3 gap-4 lg:gap-0">
|
<dl className="grid grid-cols-1 lg:grid-cols-3 gap-4 lg:gap-0">
|
||||||
{benefits.map((item) => (
|
{benefits.map((item) => (
|
||||||
<div
|
<div
|
||||||
key={item.id}
|
key={item.id}
|
||||||
className="group flex items-start gap-2 bg-white/40 dark:bg-black/40 px-8 py-12 border border-gray-200 dark:border-gray-800 lg:border-t-0 lg:border-b-0"
|
className="group flex items-start gap-2 bg-white px-8 py-12 border border-gray-200 0 lg:border-t-0 lg:border-b-0"
|
||||||
>
|
>
|
||||||
{/* Image on the LEFT */}
|
{/* Image on the LEFT */}
|
||||||
<img
|
<img
|
||||||
@@ -49,10 +49,10 @@ export function HomeDesign() {
|
|||||||
|
|
||||||
{/* Text on the RIGHT */}
|
{/* Text on the RIGHT */}
|
||||||
<div className="text-left">
|
<div className="text-left">
|
||||||
<h3 className="text-base font-semibold tracking-wide text-gray-900 dark:text-white mb-2">
|
<h3 className="text-base font-semibold tracking-wide text-gray-900 mb-2">
|
||||||
{item.title}
|
{item.title}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-sm text-gray-600 dark:text-gray-300 leading-relaxed max-w-xs">
|
<p className="text-sm text-gray-600 leading-relaxed max-w-xs">
|
||||||
{item.description}
|
{item.description}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ export function NodeHero() {
|
|||||||
<H3 as="h1" className="mt-4">
|
<H3 as="h1" className="mt-4">
|
||||||
Host a Node. Power the Network.
|
Host a Node. Power the Network.
|
||||||
</H3>
|
</H3>
|
||||||
<p className="mt-6 text-lg">
|
<p className="mt-6 text-lg text-gray-800">
|
||||||
The Mycelium Network runs on nodes hosted by people and organizations around the world. Each node adds capacity, resilience, and sovereignty, expanding a global network for private, distributed compute and AI.
|
The Mycelium Network runs on nodes hosted by people and organizations around the world. Each node adds capacity, resilience, and sovereignty, expanding a global network for private, distributed compute and AI.
|
||||||
</p>
|
</p>
|
||||||
<div className="mt-10 flex items-center gap-x-6">
|
<div className="mt-10 flex items-center gap-x-6">
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import { motion } from "framer-motion";
|
|||||||
import { Eyebrow, SectionHeader, P } from "@/components/Texts";
|
import { Eyebrow, SectionHeader, P } from "@/components/Texts";
|
||||||
import {
|
import {
|
||||||
QuestionMarkCircleIcon,
|
QuestionMarkCircleIcon,
|
||||||
ShieldCheckIcon,
|
|
||||||
CheckIcon,
|
CheckIcon,
|
||||||
} from "@heroicons/react/20/solid";
|
} from "@heroicons/react/20/solid";
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { Container } from "@/components/Container";
|
import { Container } from "@/components/Container";
|
||||||
import { Small } from "@/components/Texts";
|
|
||||||
|
|
||||||
// Heroicons
|
// Heroicons
|
||||||
import {
|
import {
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ export function PodsWhat() {
|
|||||||
<>
|
<>
|
||||||
{/* TITLE WITH ICON (matching the TL example) */}
|
{/* TITLE WITH ICON (matching the TL example) */}
|
||||||
<dt className="flex items-center gap-x-3 text-base font-semibold text-white">
|
<dt className="flex items-center gap-x-3 text-base font-semibold text-white">
|
||||||
<Icon className="h-6 w-6 text-cyan-500" aria-hidden="true" />
|
{Icon && <Icon className="h-6 w-6 text-cyan-500" aria-hidden="true" />}
|
||||||
{card.title}
|
{card.title}
|
||||||
</dt>
|
</dt>
|
||||||
|
|
||||||
|
|||||||
@@ -4,11 +4,24 @@
|
|||||||
@custom-variant dark (&:is(.dark *));
|
@custom-variant dark (&:is(.dark *));
|
||||||
|
|
||||||
@theme {
|
@theme {
|
||||||
--animate-scroll: scroll var(--animation-duration, 40s) var(--animation-direction, forwards) linear infinite;
|
--animate-scroll-left: scroll-left var(--animation-duration, 40s) linear infinite;
|
||||||
|
--animate-scroll-right: scroll-right var(--animation-duration, 40s) linear infinite;
|
||||||
|
|
||||||
@keyframes scroll {
|
@keyframes scroll-left {
|
||||||
|
from {
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
to {
|
to {
|
||||||
transform: translate(calc(-50% - 0.5rem));
|
transform: translateX(calc(-50% - 0.5rem));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes scroll-right {
|
||||||
|
from {
|
||||||
|
transform: translateX(calc(-50% - 0.5rem));
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
transform: translateX(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user