Merge branch 'development'

This commit is contained in:
2025-11-24 14:17:42 +01:00
7 changed files with 97 additions and 18 deletions

View File

@@ -1,5 +1,6 @@
import { useState } from 'react' 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 { Container } from './Container'
import { Button } from './Button' import { Button } from './Button'
import pmyceliumLogo from '../images/logos/mainlogo.svg' import pmyceliumLogo from '../images/logos/mainlogo.svg'
@@ -9,6 +10,17 @@ import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline'
export function Header() { export function Header() {
const [mobileMenuOpen, setMobileMenuOpen] = useState(false) const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
const navigate = useNavigate()
const location = useLocation()
const handleGetConnectorClick = () => {
if (location.pathname === '/network') {
smoothScrollToElement('download', 1200)
} else {
navigate('/network')
}
}
return ( return (
<header className="bg-white"> <header className="bg-white">
<nav className="border-b border-gray-100"> <nav className="border-b border-gray-100">
@@ -61,7 +73,7 @@ export function Header() {
> >
Deploy Now Deploy Now
</Button> </Button>
<Button to="/download" variant="solid" color="cyan"> <Button variant="solid" color="cyan" onClick={handleGetConnectorClick}>
Get Mycelium Connector Get Mycelium Connector
</Button> </Button>
</div> </div>
@@ -150,7 +162,15 @@ export function Header() {
> >
Start Deployment Start Deployment
</Button> </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 Get Mycelium Connector
</Button> </Button>
</div> </div>

View File

@@ -1,5 +1,6 @@
import { useState } from 'react' 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 { Container } from './Container'
import { Button } from './Button' import { Button } from './Button'
import pmyceliumLogo from '../images/logos/mainlogo.svg' import pmyceliumLogo from '../images/logos/mainlogo.svg'
@@ -9,6 +10,17 @@ import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/outline'
export function HeaderDark() { export function HeaderDark() {
const [mobileMenuOpen, setMobileMenuOpen] = useState(false) const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
const navigate = useNavigate()
const location = useLocation()
const handleGetConnectorClick = () => {
if (location.pathname === '/network') {
smoothScrollToElement('download', 1200)
} else {
navigate('/network')
}
}
return ( return (
<header className="bg-[#111111]"> <header className="bg-[#111111]">
<nav className="border-b border-gray-800"> <nav className="border-b border-gray-800">
@@ -61,7 +73,7 @@ export function HeaderDark() {
> >
Deploy Now Deploy Now
</Button> </Button>
<Button to="/download" variant="solid" color="cyan"> <Button variant="solid" color="cyan" onClick={handleGetConnectorClick}>
Get Mycelium Connector Get Mycelium Connector
</Button> </Button>
</div> </div>
@@ -150,7 +162,15 @@ export function HeaderDark() {
> >
Start Deployment Start Deployment
</Button> </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 Get Mycelium Connector
</Button> </Button>
</div> </div>

View File

@@ -6,9 +6,10 @@ import {
useScroll, useScroll,
useMotionValueEvent, useMotionValueEvent,
} from "motion/react"; } from "motion/react";
import { Link } from "react-router-dom"; import { Link, useLocation, useNavigate } from "react-router-dom";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { Button } from "../Button"; import { Button } from "../Button";
import { smoothScrollToElement } from "@/utils/scroll";
export const FloatingNav = ({ export const FloatingNav = ({
@@ -23,8 +24,17 @@ export const FloatingNav = ({
className?: string; className?: string;
}) => { }) => {
const { scrollYProgress } = useScroll(); const { scrollYProgress } = useScroll();
const [visible, setVisible] = useState(true); 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) => { useMotionValueEvent(scrollYProgress, "change", (current) => {
if (typeof current === "number") { if (typeof current === "number") {
@@ -80,7 +90,7 @@ export const FloatingNav = ({
> >
<span className="hidden sm:block text-sm">Docs</span> <span className="hidden sm:block text-sm">Docs</span>
</a> </a>
<Button to="/download" variant="solid" color="cyan"> <Button variant="solid" color="cyan" onClick={handleGetConnectorClick}>
Get Mycelium Connector Get Mycelium Connector
</Button> </Button>
</div> </div>

View File

@@ -51,7 +51,7 @@ export function CallToAction() {
</P> </P>
<div className="mt-10 flex flex-wrap justify-center items-center gap-x-6 gap-y-4"> <div className="mt-10 flex flex-wrap justify-center items-center gap-x-6 gap-y-4">
<Button to="/network#download" variant="solid" color="cyan"> <Button to="/network" variant="solid" color="cyan">
Join the Network Join the Network
</Button> </Button>

View File

@@ -1,6 +1,7 @@
import { useId } from 'react' import { useId } from 'react'
import { Container } from '@/components/Container' import { Container } from '@/components/Container'
import { Button } from '@/components/Button' import { Button } from '@/components/Button'
import { smoothScrollToElement } from '@/utils/scroll'
import phoneFrame from '../../images/phoneframe.png' import phoneFrame from '../../images/phoneframe.png'
import { H3, P import { H3, P
, Eyebrow } from "@/components/Texts"; , Eyebrow } from "@/components/Texts";
@@ -93,7 +94,11 @@ export function Hero() {
Your Pod is your personal gateway to the network. Your Pod is your personal gateway to the network.
</P> </P>
<div className="mt-8 flex flex-wrap gap-x-6 gap-y-4"> <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 Get Started
</Button> </Button>
<Button <Button

View File

@@ -2,6 +2,7 @@
import { Button } from '@/components/Button' import { Button } from '@/components/Button'
import { Eyebrow, H3, P } from '@/components/Texts' import { Eyebrow, H3, P } from '@/components/Texts'
import { smoothScrollToElement } from '@/utils/scroll'
export function NodeHero() { export function NodeHero() {
return ( return (
@@ -31,16 +32,11 @@ export function NodeHero() {
<Button <Button
variant="solid" variant="solid"
color="cyan" color="cyan"
onClick={() => { onClick={() => smoothScrollToElement('node-how-it-works', 1200)}
const el = document.getElementById('node-how-it-works')
if (el) {
el.scrollIntoView({ behavior: 'smooth', block: 'start' })
}
}}
> >
How it works How it works
</Button> </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 Explore Docs
</Button> </Button>
</div> </div>

28
src/utils/scroll.ts Normal file
View 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)
}