forked from emre/www_projectmycelium_com
feat: add dark theme header component with navigation
- Created HeaderDark component with responsive navigation including Cloud dropdown menu with breadcrumb-style display - Implemented mobile menu with slide-out panel using Headless UI Dialog - Integrated HeaderDark into HomeHostingDark page for consistent dark theme experience
This commit is contained in:
181
src/components/HeaderDark.tsx
Normal file
181
src/components/HeaderDark.tsx
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
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 HeaderDark() {
|
||||||
|
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 className="bg-[#111111]">
|
||||||
|
<nav className="border-b border-gray-800">
|
||||||
|
<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={
|
||||||
|
<>
|
||||||
|
{['Compute', 'Storage', 'GPU'].includes(getCurrentPageName()) ? (
|
||||||
|
<>
|
||||||
|
<span className="text-gray-400">Cloud {' >'} </span>
|
||||||
|
<span className="text-white">{getCurrentPageName()}</span>
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<span className="text-white">Cloud</span>
|
||||||
|
)}
|
||||||
|
<ChevronDownIcon className="h-5 w-5 text-white" aria-hidden="true" />
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
items={cloudNavItems}
|
||||||
|
/>
|
||||||
|
<Link
|
||||||
|
to="/network"
|
||||||
|
className="text-base/7 tracking-tight text-gray-300 hover:text-cyan-400 transition-colors"
|
||||||
|
>
|
||||||
|
Network
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
to="/agents"
|
||||||
|
className="text-base/7 tracking-tight text-gray-300 hover:text-cyan-400 transition-colors"
|
||||||
|
>
|
||||||
|
Agents
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
to="/pods"
|
||||||
|
className="text-base/7 tracking-tight text-gray-300 hover:text-cyan-400 transition-colors"
|
||||||
|
>
|
||||||
|
Pods
|
||||||
|
</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"
|
||||||
|
>
|
||||||
|
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-300 hover:text-cyan-400 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-[#111111] px-6 py-6 sm:max-w-sm sm:ring-1 sm:ring-gray-200/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-300 hover:text-cyan-400 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/20">
|
||||||
|
<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-white hover:bg-gray-800"
|
||||||
|
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-white hover:bg-gray-800"
|
||||||
|
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-white hover:bg-gray-800"
|
||||||
|
onClick={() => setMobileMenuOpen(false)}
|
||||||
|
>
|
||||||
|
Agents
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
to="/pods"
|
||||||
|
className="-mx-3 block rounded-lg px-3 py-2 text-base font-semibold leading-7 text-white hover:bg-gray-800"
|
||||||
|
onClick={() => setMobileMenuOpen(false)}
|
||||||
|
>
|
||||||
|
Pods
|
||||||
|
</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>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ import {
|
|||||||
} from '@heroicons/react/24/outline'
|
} from '@heroicons/react/24/outline'
|
||||||
import { CP, CT, Eyebrow, H3, P } from '@/components/Texts'
|
import { CP, CT, Eyebrow, H3, P } from '@/components/Texts'
|
||||||
import { DarkCard } from '@/components/ui/cards'
|
import { DarkCard } from '@/components/ui/cards'
|
||||||
|
import { HeaderDark } from '@/components/HeaderDark'
|
||||||
|
|
||||||
const features = [
|
const features = [
|
||||||
{
|
{
|
||||||
@@ -32,7 +33,9 @@ const features = [
|
|||||||
|
|
||||||
export function HomeHostingDark() {
|
export function HomeHostingDark() {
|
||||||
return (
|
return (
|
||||||
<div className="relative py-24 bg-[#111111] lg:py-32">
|
<>
|
||||||
|
<HeaderDark />
|
||||||
|
<div className="relative py-24 bg-[#111111] lg:py-32">
|
||||||
<div className="mx-auto max-w-md px-6 text-center sm:max-w-3xl lg:max-w-7xl lg:px-8">
|
<div className="mx-auto max-w-md px-6 text-center sm:max-w-3xl lg:max-w-7xl lg:px-8">
|
||||||
<Eyebrow>DEPLOY</Eyebrow>
|
<Eyebrow>DEPLOY</Eyebrow>
|
||||||
<H3 className="mt-2 text-gray-200">Run Real Infrastructure on Your Own Hardware</H3>
|
<H3 className="mt-2 text-gray-200">Run Real Infrastructure on Your Own Hardware</H3>
|
||||||
@@ -60,5 +63,6 @@ export function HomeHostingDark() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user