forked from emre/www_projectmycelium_com
- Implemented responsive mobile menu using Headless UI Dialog component with hamburger toggle - Refactored hero sections to use consistent boxed layout with background images and improved spacing - Standardized button styling across hero components with arrow indicators for secondary actions
159 lines
5.9 KiB
TypeScript
159 lines
5.9 KiB
TypeScript
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';
|
|
if (currentPath.startsWith('/cloud')) return 'Cloud';
|
|
return 'Cloud';
|
|
};
|
|
|
|
return (
|
|
<header className="bg-white">
|
|
<nav className="border-b border-gray-200">
|
|
<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" />
|
|
</Link>
|
|
<div className="hidden lg:flex lg:gap-10">
|
|
<Dropdown
|
|
buttonContent={
|
|
<>
|
|
{getCurrentPageName()}
|
|
<ChevronDownIcon className="h-5 w-5" aria-hidden="true" />
|
|
</>
|
|
}
|
|
items={cloudNavItems}
|
|
/>
|
|
<Link
|
|
to="/network"
|
|
className="text-base/7 tracking-tight text-gray-700 hover:text-cyan-500 transition-colors"
|
|
>
|
|
Network
|
|
</Link>
|
|
<Link
|
|
to="/agents"
|
|
className="text-base/7 tracking-tight text-gray-700 hover:text-cyan-500 transition-colors"
|
|
>
|
|
Agents
|
|
</Link>
|
|
</div>
|
|
</div>
|
|
<div className="flex items-center gap-6">
|
|
<div className="flex items-center gap-6 max-lg:hidden">
|
|
<Button
|
|
to="https://myceliumcloud.tf"
|
|
variant="outline"
|
|
as="a"
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
>
|
|
Start Deployment
|
|
</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 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>
|
|
)
|
|
}
|