headerBlock.tsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. "use client"
  2. import type React from "react"
  3. import {useState} from "react"
  4. import {Drawer} from "antd"
  5. import Image from "next/image"
  6. import Link from "next/link"
  7. import {usePathname} from "next/navigation"
  8. import {MenuIcon, PhoneCall, X} from "lucide-react"
  9. const Navigation: React.FC = () => {
  10. const pathname = usePathname()
  11. const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
  12. const pathToKey: { [key: string]: string } = {
  13. "/": "home",
  14. "/products": "products",
  15. "/solutions": "solutions",
  16. "/news": "news",
  17. "/support": "support",
  18. "/about": "about",
  19. "/business": "business",
  20. }
  21. const selectedKey = pathToKey[pathname] || ""
  22. const menuItems = [
  23. { key: "home", label: "首页", href: "/" },
  24. { key: "products", label: "产品中心", href: "/products" },
  25. { key: "solutions", label: "解决方案", href: "/solutions" },
  26. { key: "news", label: "新闻动态", href: "/news" },
  27. { key: "support", label: "服务支持", href: "/support" },
  28. { key: "business", label: "商务合作", href: "/business" },
  29. { key: "about", label: "关于我们", href: "/about" },
  30. ]
  31. const handleMobileMenuClick = () => {
  32. setMobileMenuOpen(false)
  33. }
  34. return (
  35. <header className="w-full bg-white shadow-sm border-b border-gray-100 sticky top-0 z-50">
  36. <div className="max-w-full mx-auto md:px-20 sm:px-6 px-4">
  37. <div className="flex justify-between items-center h-18">
  38. {/* Logo 区域 */}
  39. <div className="flex items-center">
  40. <div className="flex items-center space-x-2">
  41. <Image src={"/assets/logo.png"} width={160} height={80} alt={"logo"}/>
  42. </div>
  43. </div>
  44. {/* 桌面端菜单 */}
  45. <div className="hidden sm:flex flex-1 justify-end items-center">
  46. <nav className="flex h-18">
  47. {menuItems.map((item) => (
  48. <Link
  49. key={item.key}
  50. href={item.href}
  51. className={`inline-flex items-center justify-center px-8 text-md font-semibold h-full relative transition-colors duration-200 ${
  52. selectedKey === item.key
  53. ? "text-blue-600 bg-blue-50"
  54. : "text-gray-600 hover:text-gray-900"
  55. }`}
  56. >
  57. <span className={`relative py-2 ${
  58. selectedKey === item.key
  59. ? "after:content-[''] after:absolute after:bottom-[-4px] after:left-1/2 after:-translate-x-1/2 after:w-6 after:h-1 after:bg-blue-600 after:rounded-full"
  60. : ""
  61. }`}>
  62. {item.label}
  63. </span>
  64. </Link>
  65. ))}
  66. </nav>
  67. {/* 新增服务热线小组件 */}
  68. <div className="hidden lg:flex items-center ml-10 border-l border-gray-100 pl-10 h-10">
  69. <div className="flex items-center space-x-3 group">
  70. <div className="text-blue-600 bg-blue-50 p-2.5 rounded-full transition-transform duration-300 group-hover:scale-110">
  71. <PhoneCall size={26} strokeWidth={2.5} />
  72. </div>
  73. <div className="flex flex-col justify-center">
  74. <span className="text-gray-500 text-base font-bold leading-tight tracking-tight">24小时服务热线</span>
  75. <span className="text-blue-600 text-xl font-black leading-tight tracking-tighter">400-666-7001</span>
  76. </div>
  77. </div>
  78. </div>
  79. </div>
  80. {/* 移动端菜单按钮 */}
  81. <div className="sm:hidden">
  82. <button
  83. onClick={() => setMobileMenuOpen(true)}
  84. className="p-2 rounded-md text-gray-600 hover:text-gray-900 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"
  85. >
  86. <MenuIcon size={24}/>
  87. </button>
  88. </div>
  89. </div>
  90. </div>
  91. {/* 移动端侧边菜单 */}
  92. <Drawer
  93. title="菜单"
  94. placement="right"
  95. onClose={() => setMobileMenuOpen(false)}
  96. open={mobileMenuOpen}
  97. width={280}
  98. closeIcon={<X size={20}/>}
  99. >
  100. <nav className="flex flex-col space-y-4">
  101. {menuItems.map((item) => (
  102. <Link
  103. key={item.key}
  104. href={item.href}
  105. onClick={handleMobileMenuClick}
  106. style={{ color: selectedKey === item.key ? '#2563eb' : '#374151' }}
  107. className={`px-4 py-3 rounded-md text-base font-medium ${
  108. selectedKey === item.key
  109. ? "bg-blue-50"
  110. : "hover:bg-gray-100"
  111. }`}
  112. >
  113. {item.label}
  114. </Link>
  115. ))}
  116. </nav>
  117. {/* 移动端服务热线 */}
  118. <div className="mt-10 pt-8 border-t border-gray-100">
  119. <div className="flex items-center space-x-4 bg-blue-50/50 p-4 rounded-xl border border-blue-100/50">
  120. <div className="text-blue-600 bg-white p-3 rounded-full shadow-sm">
  121. <PhoneCall size={24} strokeWidth={2.5} />
  122. </div>
  123. <div className="flex flex-col">
  124. <span className="text-gray-500 text-xs font-bold leading-tight">24小时服务热线</span>
  125. <span className="text-blue-600 text-lg font-black leading-tight tracking-tight">400-666-7001</span>
  126. </div>
  127. </div>
  128. </div>
  129. </Drawer>
  130. </header>
  131. )
  132. }
  133. export default Navigation