forked from emre/www_projectmycelium_com
Compare commits
12 Commits
09ac38f598
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 67fb2fd4ac | |||
| 3071e87a9d | |||
| a0fb98409f | |||
| c9335d2c5a | |||
| 05974f5b0e | |||
| 6b4c7b3329 | |||
| a22a8ddcc9 | |||
| a00c090162 | |||
| 8e621c28b3 | |||
| 3a217c2d66 | |||
| ea8c3546c9 | |||
| c784783242 |
@@ -2,12 +2,13 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/png" href="/favicon-32.png" sizes="32x32" />
|
||||
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="google-site-verification" content="rRrZkMEhdC4yFe_BrENEzYmy2bRfD-VE6RTRiDJNLkg" />
|
||||
<title>Project Mycelium - Built for Digital Sovereignty</title>
|
||||
<meta name="description" content="Discover Project Mycelium. A sovereign peer-to-peer network for private communication, storage, and compute. Build and run your digital environment on infrastructure you control." />
|
||||
<meta name="keywords" content="Project Mycelium, Mycelium, digital sovereignty, decentralized network, peer-to-peer infrastructure, private storage, secure compute, sovereign cloud, edge cloud" />
|
||||
<meta name="keywords" content="Project Mycelium, ProjectMycelium, projectmycelium, Mycelium, decentralized network, peer-to-peer infrastructure, private storage, secure compute, sovereign cloud, edge cloud" />
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
<link href="https://fonts.googleapis.com/css2?family=Mulish:wght@400;500;700&display=swap" rel="stylesheet" />
|
||||
|
||||
BIN
public/favicon-32.png
Normal file
BIN
public/favicon-32.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
6
public/robots.txt
Normal file
6
public/robots.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
Sitemap: https://www.projectmycelium.com/sitemap.xml
|
||||
|
||||
|
||||
59
public/sitemap.xml
Normal file
59
public/sitemap.xml
Normal file
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
<url>
|
||||
<loc>https://www.projectmycelium.com/</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://www.projectmycelium.com/cloud</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.9</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://www.projectmycelium.com/network</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.9</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://www.projectmycelium.com/agents</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://www.projectmycelium.com/download</loc>
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://www.projectmycelium.com/compute</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://www.projectmycelium.com/storage</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://www.projectmycelium.com/gpu</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://www.projectmycelium.com/pods</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://www.projectmycelium.com/nodes</loc>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://www.projectmycelium.com/mediakit</loc>
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
</urlset>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { useState } from 'react'
|
||||
import { Link } from 'react-router-dom'
|
||||
import { Link, useLocation, useNavigate } from 'react-router-dom'
|
||||
import { smoothScrollToElement } from '@/utils/scroll'
|
||||
import { Container } from './Container'
|
||||
import { Button } from './Button'
|
||||
import pmyceliumLogo from '../images/logos/mainlogo.svg'
|
||||
@@ -9,6 +10,17 @@ import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline'
|
||||
export function Header() {
|
||||
const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
|
||||
|
||||
const navigate = useNavigate()
|
||||
const location = useLocation()
|
||||
|
||||
const handleGetConnectorClick = () => {
|
||||
if (location.pathname === '/network') {
|
||||
smoothScrollToElement('download', 1200)
|
||||
} else {
|
||||
navigate('/network')
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<header className="bg-white">
|
||||
<nav className="border-b border-gray-100">
|
||||
@@ -61,7 +73,7 @@ export function Header() {
|
||||
>
|
||||
Deploy Now
|
||||
</Button>
|
||||
<Button to="/download" variant="solid" color="cyan">
|
||||
<Button variant="solid" color="cyan" onClick={handleGetConnectorClick}>
|
||||
Get Mycelium Connector
|
||||
</Button>
|
||||
</div>
|
||||
@@ -150,7 +162,15 @@ export function Header() {
|
||||
>
|
||||
Start Deployment
|
||||
</Button>
|
||||
<Button to="/download" variant="solid" color="cyan" className="mt-4 w-full" onClick={() => setMobileMenuOpen(false)}>
|
||||
<Button
|
||||
variant="solid"
|
||||
color="cyan"
|
||||
className="mt-4 w-full"
|
||||
onClick={() => {
|
||||
setMobileMenuOpen(false)
|
||||
handleGetConnectorClick()
|
||||
}}
|
||||
>
|
||||
Get Mycelium Connector
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { useState } from 'react'
|
||||
import { Link } from 'react-router-dom'
|
||||
import { Link, useLocation, useNavigate } from 'react-router-dom'
|
||||
import { smoothScrollToElement } from '@/utils/scroll'
|
||||
import { Container } from './Container'
|
||||
import { Button } from './Button'
|
||||
import pmyceliumLogo from '../images/logos/mainlogo.svg'
|
||||
@@ -9,6 +10,17 @@ import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline'
|
||||
export function HeaderDark() {
|
||||
const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
|
||||
|
||||
const navigate = useNavigate()
|
||||
const location = useLocation()
|
||||
|
||||
const handleGetConnectorClick = () => {
|
||||
if (location.pathname === '/network') {
|
||||
smoothScrollToElement('download', 1200)
|
||||
} else {
|
||||
navigate('/network')
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<header className="bg-[#111111]">
|
||||
<nav className="border-b border-gray-800">
|
||||
@@ -61,7 +73,7 @@ export function HeaderDark() {
|
||||
>
|
||||
Deploy Now
|
||||
</Button>
|
||||
<Button to="/download" variant="solid" color="cyan">
|
||||
<Button variant="solid" color="cyan" onClick={handleGetConnectorClick}>
|
||||
Get Mycelium Connector
|
||||
</Button>
|
||||
</div>
|
||||
@@ -150,7 +162,15 @@ export function HeaderDark() {
|
||||
>
|
||||
Start Deployment
|
||||
</Button>
|
||||
<Button to="/download" variant="solid" color="cyan" className="mt-4 w-full" onClick={() => setMobileMenuOpen(false)}>
|
||||
<Button
|
||||
variant="solid"
|
||||
color="cyan"
|
||||
className="mt-4 w-full"
|
||||
onClick={() => {
|
||||
setMobileMenuOpen(false)
|
||||
handleGetConnectorClick()
|
||||
}}
|
||||
>
|
||||
Get Mycelium Connector
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
@@ -6,9 +6,10 @@ import {
|
||||
useScroll,
|
||||
useMotionValueEvent,
|
||||
} from "motion/react";
|
||||
import { Link } from "react-router-dom";
|
||||
import { Link, useLocation, useNavigate } from "react-router-dom";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { Button } from "../Button";
|
||||
import { smoothScrollToElement } from "@/utils/scroll";
|
||||
|
||||
|
||||
export const FloatingNav = ({
|
||||
@@ -23,8 +24,17 @@ export const FloatingNav = ({
|
||||
className?: string;
|
||||
}) => {
|
||||
const { scrollYProgress } = useScroll();
|
||||
|
||||
const [visible, setVisible] = useState(true);
|
||||
const navigate = useNavigate();
|
||||
const location = useLocation();
|
||||
|
||||
const handleGetConnectorClick = () => {
|
||||
if (location.pathname === "/network") {
|
||||
smoothScrollToElement("download", 1200);
|
||||
} else {
|
||||
navigate("/network");
|
||||
}
|
||||
};
|
||||
|
||||
useMotionValueEvent(scrollYProgress, "change", (current) => {
|
||||
if (typeof current === "number") {
|
||||
@@ -80,7 +90,7 @@ export const FloatingNav = ({
|
||||
>
|
||||
<span className="hidden sm:block text-sm">Docs</span>
|
||||
</a>
|
||||
<Button to="/download" variant="solid" color="cyan">
|
||||
<Button variant="solid" color="cyan" onClick={handleGetConnectorClick}>
|
||||
Get Mycelium Connector
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
@@ -76,7 +76,7 @@ export function CloudArchitecture() {
|
||||
Get Started
|
||||
</Button>
|
||||
<Button variant="outline" color="white" href="/docs">
|
||||
Explore Docs
|
||||
Explore Docs
|
||||
</Button>
|
||||
</div>
|
||||
</Container>
|
||||
|
||||
@@ -47,7 +47,7 @@ export function CloudHeroNew() {
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
Explore Docs <span aria-hidden="true">→</span>
|
||||
Explore Docs
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -26,7 +26,7 @@ export function GpuHero() {
|
||||
How it works
|
||||
</Button>
|
||||
<Button to="#gpu-architecture" as="a" variant="outline">
|
||||
Explore Docs <span aria-hidden="true">→</span>
|
||||
Explore Docs
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -51,7 +51,7 @@ export function CallToAction() {
|
||||
</P>
|
||||
|
||||
<div className="mt-10 flex flex-wrap justify-center items-center gap-x-6 gap-y-4">
|
||||
<Button to="/network#download" variant="solid" color="cyan">
|
||||
<Button to="/network" variant="solid" color="cyan">
|
||||
Join the Network
|
||||
</Button>
|
||||
|
||||
|
||||
@@ -30,7 +30,6 @@ export function HomeCTA() {
|
||||
{/* Button 2 */}
|
||||
<button className="inline-flex items-center justify-between bg-white border border-gray-300 rounded-full px-6 py-3 text-sm font-semibold shadow-sm hover:border-cyan-500 transition">
|
||||
Explore Docs
|
||||
<ArrowRightIcon className="h-4 w-4 ml-2 text-gray-700" />
|
||||
</button>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
import { Container } from '@/components/Container'
|
||||
import { Button } from "@/components/Button";
|
||||
import { smoothScrollToElement } from "@/utils/scroll";
|
||||
|
||||
export function CallToAction() {
|
||||
return (
|
||||
@@ -50,7 +51,8 @@ Use the network to link environments, deploy workloads, or host nodes to strengt
|
||||
|
||||
{/* ✅ Two cards, stacked center with spacing */}
|
||||
<div className="mt-10 flex flex-wrap justify-center items-center gap-x-6 gap-y-4">
|
||||
<Button to="/network" variant="solid" color="cyan">
|
||||
<Button variant="solid" color="cyan" onClick={() => smoothScrollToElement('download', 1200)}
|
||||
>
|
||||
Join the Network
|
||||
</Button>
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { useId } from 'react'
|
||||
import { Container } from '@/components/Container'
|
||||
import { Button } from '@/components/Button'
|
||||
import { smoothScrollToElement } from '@/utils/scroll'
|
||||
import phoneFrame from '../../images/phoneframe.png'
|
||||
import { H3, P
|
||||
, Eyebrow } from "@/components/Texts";
|
||||
@@ -93,7 +94,11 @@ export function Hero() {
|
||||
Your Pod is your personal gateway to the network.
|
||||
</P>
|
||||
<div className="mt-8 flex flex-wrap gap-x-6 gap-y-4">
|
||||
<Button to="/download" variant="solid" color="cyan">
|
||||
<Button
|
||||
variant="solid"
|
||||
color="cyan"
|
||||
onClick={() => smoothScrollToElement('download', 1200)}
|
||||
>
|
||||
Get Started
|
||||
</Button>
|
||||
<Button
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
import { Button } from '@/components/Button'
|
||||
import { Eyebrow, H3, P } from '@/components/Texts'
|
||||
import { smoothScrollToElement } from '@/utils/scroll'
|
||||
|
||||
export function NodeHero() {
|
||||
return (
|
||||
@@ -28,10 +29,14 @@ export function NodeHero() {
|
||||
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>
|
||||
<div className="mt-10 flex items-center gap-x-6">
|
||||
<Button to="#node-getting-started" as="a" variant="solid" color="cyan">
|
||||
<Button
|
||||
variant="solid"
|
||||
color="cyan"
|
||||
onClick={() => smoothScrollToElement('node-how-it-works', 1200)}
|
||||
>
|
||||
How it works
|
||||
</Button>
|
||||
<Button to="#node-architecture" as="a" variant="outline">
|
||||
<Button to="https://threefold.info/mycelium_economics/docs/faq/hosting_faq" as="a" variant="outline" target="_blank">
|
||||
Explore Docs
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
@@ -37,7 +37,7 @@ const steps = [
|
||||
|
||||
export function NodeSteps() {
|
||||
return (
|
||||
<section className="w-full max-w-8xl mx-auto bg-transparent">
|
||||
<section id="node-how-it-works" className="w-full max-w-8xl mx-auto bg-transparent">
|
||||
|
||||
{/* Header spacing + borders */}
|
||||
<div className="max-w-7xl mx-auto py-6 border border-t-0 border-b-0 border-gray-100" />
|
||||
|
||||
@@ -45,9 +45,12 @@ export default function Homepod() {
|
||||
>
|
||||
Join the Waitlist
|
||||
</Button>
|
||||
|
||||
{/* The updated onClick handler calls the function
|
||||
<Button to="#" variant="outline">
|
||||
Explore Docs
|
||||
</Button>
|
||||
*/}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -30,7 +30,7 @@ export function StorageHero() {
|
||||
as="a"
|
||||
variant="outline"
|
||||
>
|
||||
Explore Docs <span aria-hidden="true">→</span>
|
||||
Explore Docs
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
28
src/utils/scroll.ts
Normal file
28
src/utils/scroll.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
export function smoothScrollToElement(id: string, duration = 800) {
|
||||
const element = document.getElementById(id)
|
||||
if (!element) return
|
||||
|
||||
const startY = window.scrollY || window.pageYOffset
|
||||
const targetRect = element.getBoundingClientRect()
|
||||
const targetY = startY + targetRect.top
|
||||
const startTime = performance.now()
|
||||
|
||||
function easeInOutQuad(t: number) {
|
||||
return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t
|
||||
}
|
||||
|
||||
function step(currentTime: number) {
|
||||
const elapsed = currentTime - startTime
|
||||
const progress = Math.min(elapsed / duration, 1)
|
||||
const eased = easeInOutQuad(progress)
|
||||
const nextY = startY + (targetY - startY) * eased
|
||||
|
||||
window.scrollTo(0, nextY)
|
||||
|
||||
if (progress < 1) {
|
||||
requestAnimationFrame(step)
|
||||
}
|
||||
}
|
||||
|
||||
requestAnimationFrame(step)
|
||||
}
|
||||
Reference in New Issue
Block a user