调整组件位置

This commit is contained in:
2025-05-12 22:43:24 +08:00
parent 37c422e752
commit 94276be2b7
6 changed files with 5 additions and 5 deletions

View File

@@ -0,0 +1,47 @@
"use client";
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "@/components/ui/popover";
import { Button } from "@/components/ui/button";
import { toast } from "sonner";
async function handleCopy(text: string) {
try {
await navigator.clipboard.writeText(text);
toast.success("复制成功");
} catch (error) {
if (error instanceof Error) {
toast.error(`复制失败 ${error.message}`);
}
}
}
export default function Footer() {
return (
<footer className="border-t border-zinc-300 h-3 relative">
<div className="bg-zinc-50 h-20 flex sm:justify-between justify-center items-center sm:px-20 flex-col sm:flex-row">
<div className="flex flex-col items-center sm:block">
<a href="https://beian.miit.gov.cn/" className="text-sm text-zinc-500 hover:border-zinc-500 border-b border-transparent">ICP备2023009516号-1</a>
<div className="text-sm text-zinc-500 cursor-default">© 2025 TONE Page. All rights reserved.</div>
</div>
<div>
<Popover>
<PopoverTrigger>
<div className="cursor-pointer text-zinc-600 hover:border-zinc-600 border-b border-transparent"></div>
</PopoverTrigger>
<PopoverContent className="w-60 mr-5">
<div className="flex items-center">
<div className="text-sm">:</div>
<Button variant="link" className="cursor-pointer select-text" onClick={() => handleCopy('tone@ctbu.net.cn')}>tone@ctbu.net.cn</Button>
</div>
</PopoverContent>
</Popover>
</div>
</div>
</footer>
)
}

View File

@@ -0,0 +1,96 @@
'use client';
import { cn } from "@/lib/utils";
import Link from "next/link";
import { usePathname } from "next/navigation";
import { useState } from "react";
import {
Drawer,
DrawerContent,
DrawerDescription,
DrawerHeader,
DrawerTitle,
DrawerTrigger,
} from "@/components/ui/drawer"
import { Button } from "@/components/ui/button";
import { X } from "lucide-react";
export default function Header() {
const pathname = usePathname();
const [showMenu, setShowMenu] = useState(false);
const menuItems = [
{ name: '特恩(TONE)', href: '/' },
{ name: '资源', href: '/resource' },
{ name: '博客', href: '/blog' },
{ name: '控制台', href: '/console/login' },
]
return (
<header className="sticky top-0 z-50 backdrop-blur-sm bg-white/40 shadow">
<div className="flex items-center justify-between px-10 md:h-18 md:px-20 h-14 duration-300">
<Link
href="/"
className={cn(
"cursor-pointer font-medium text-zinc-500 hover:text-zinc-800 border-b-4 border-transparent duration-200",
pathname === "/" && "text-zinc-800"
)}
>
{pathname === "/"
? <div className="text-2xl"> 🍭</div>
: <div className="md:text-lg">(TONE)</div>}
</Link>
<Drawer direction="right" open={showMenu} onOpenChange={(state) => !state && setShowMenu(false)}>
<DrawerTrigger>
<div className="sm:hidden cursor-pointer text-zinc-600" onClick={() => setShowMenu(true)}>
</div>
</DrawerTrigger>
<DrawerContent>
<DrawerHeader>
<DrawerTitle className="flex justify-between">
<span></span>
<X className="cursor-pointer" onClick={() => setShowMenu(false)} />
</DrawerTitle>
<DrawerDescription></DrawerDescription>
</DrawerHeader>
<div className="w-full flex flex-col px-4 gap-2">
{menuItems.slice(1).map((item) => (
<Link
key={item.name}
href={item.href}
onClick={() => setShowMenu(false)}
>
<Button className="w-full" size='lg'
variant={pathname.startsWith(item.href) ? 'default' : 'outline'}
>{item.name}</Button>
</Link>
))}
</div>
</DrawerContent>
</Drawer>
<div className={cn(
"sm:flex items-center gap-12 hidden",
)}>
{menuItems.slice(1).map((item) => (
<Link
key={item.href}
href={item.href}
className={cn(
"cursor-pointer md:text-lg font-medium text-zinc-500 hover:text-zinc-800 border-b-4 border-transparent duration-200",
pathname.startsWith(item.href) && "text-zinc-800 border-b-pink-500"
)}
>
{item.name}
</Link>
))}
</div>
</div>
</header >
)
}

View File

@@ -0,0 +1,11 @@
"use client"
import * as React from "react"
import { ThemeProvider as NextThemesProvider } from "next-themes"
export function ThemeProvider({
children,
...props
}: React.ComponentProps<typeof NextThemesProvider>) {
return <NextThemesProvider {...props}>{children}</NextThemesProvider>
}