Files
juip-web/src/home/header.tsx

92 lines
2.6 KiB
TypeScript
Raw Normal View History

2026-07-24 18:00:22 +08:00
import { useSyncExternalStore } from "react"
import { NavLink } from "react-router-dom"
import Wrap from "@/components/wrap"
import { cn } from "@/lib/utils"
export default function Header() {
const scroll = useSyncExternalStore(
callback => {
window.addEventListener("scroll", callback)
return () => {
window.removeEventListener("scroll", callback)
}
},
() => window.scrollY > 48,
() => false,
)
return (
<header className={cn("fixed top-0 left-0 w-screen z-10 flex flex-col ")}>
<div
className={cn(
`flex-none pointer-events-auto`,
`transition-[background,shadow] duration-200 ease-in-out`,
scroll
? `bg-[#fffe] backdrop-blur-sm shadow-lg`
: `bg-transparent shadow-none`,
)}
>
<Wrap className="h-20 max-md:h-16 flex justify-between pl-15 pr-15">
<nav className="flex items-center justify-between gap-4 lg:gap-8">
<ul className="h-full items-stretch hidden lg:flex">
<NavItem to="/"></NavItem>
<NavItem to="/product"></NavItem>
<NavItem to="/ipline">IP线路表</NavItem>
<NavItem to="/softDownload"></NavItem>
<NavItem to="/help">/</NavItem>
2026-07-30 13:55:28 +08:00
{/* <NavItem to="/client">下载客户端</NavItem> */}
2026-07-24 18:00:22 +08:00
</ul>
</nav>
<ProfileOrLogin />
</Wrap>
</div>
</header>
)
}
const NavItem = ({
to,
children,
}: {
to: string
children: React.ReactNode
}) => (
<NavLink
to={to}
className={({ isActive }) =>
`h-full flex items-center relative px-3 ${
isActive
? "text-blue-500 after:absolute after:bottom-0 after:left-0 after:right-0 after:h-0.5 after:bg-blue-500"
: "text-slate-700"
}`
}
>
{children}
</NavLink>
)
function ProfileOrLogin() {
return (
<div className="flex items-center">
<NavLink
to="/login"
state={{ tab: "login" }}
className="w-24 h-12 flex items-center justify-center lg:text-lg"
>
<span></span>
</NavLink>
<NavLink
to="/login"
state={{ tab: "register" }}
className={[
`w-20 lg:w-24 h-10 lg:h-12 bg-linear-to-r rounded-full flex items-center justify-center lg:text-lg text-white`,
`transition-colors duration-200 ease-in-out`,
`from-blue-500 to-cyan-400 hover:from-blue-500 hover:to-cyan-300`,
].join(" ")}
>
<span></span>
</NavLink>
</div>
)
}