Spaces:
Sleeping
Sleeping
import React from 'react'; | |
import { Fragment } from 'react'; | |
import { Link } from 'react-router-dom'; | |
import { Disclosure, Menu, Transition } from '@headlessui/react'; | |
import { Bars3Icon, XMarkIcon, UserCircleIcon } from '@heroicons/react/24/outline'; | |
const navigation = [ | |
{ name: '儀表板', href: '/', current: true }, | |
{ name: '飲食追蹤', href: '/food', current: false }, | |
{ name: 'AI食物分析', href: '/food-ai', current: false }, | |
{ name: '飲水紀錄', href: '/water', current: false }, | |
{ name: '運動紀錄', href: '/exercise', current: false }, | |
]; | |
function classNames(...classes) { | |
return classes.filter(Boolean).join(' '); | |
} | |
export default function Navbar() { | |
return ( | |
<Disclosure as="nav" className="bg-white shadow-lg"> | |
{({ open }) => ( | |
<> | |
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8"> | |
<div className="flex h-16 justify-between"> | |
<div className="flex"> | |
<div className="flex flex-shrink-0 items-center"> | |
<span className="text-2xl font-bold text-indigo-600">健康助手</span> | |
</div> | |
<div className="hidden sm:ml-6 sm:flex sm:space-x-8"> | |
{navigation.map((item) => ( | |
<Link | |
key={item.name} | |
to={item.href} | |
className={classNames( | |
item.current | |
? 'border-indigo-500 text-gray-900' | |
: 'border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700', | |
'inline-flex items-center border-b-2 px-1 pt-1 text-sm font-medium' | |
)} | |
> | |
{item.name} | |
</Link> | |
))} | |
</div> | |
</div> | |
<div className="hidden sm:ml-6 sm:flex sm:items-center"> | |
<Menu as="div" className="relative ml-3"> | |
<div> | |
<Menu.Button className="flex rounded-full bg-white text-sm focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2"> | |
<UserCircleIcon className="h-8 w-8 text-gray-400" aria-hidden="true" /> | |
</Menu.Button> | |
</div> | |
<Transition | |
as={Fragment} | |
enter="transition ease-out duration-200" | |
enterFrom="transform opacity-0 scale-95" | |
enterTo="transform opacity-100 scale-100" | |
leave="transition ease-in duration-75" | |
leaveFrom="transform opacity-100 scale-100" | |
leaveTo="transform opacity-0 scale-95" | |
> | |
<Menu.Items className="absolute right-0 z-10 mt-2 w-48 origin-top-right rounded-md bg-white py-1 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none"> | |
<Menu.Item> | |
{({ active }) => ( | |
<Link | |
to="/profile" | |
className={classNames( | |
active ? 'bg-gray-100' : '', | |
'block px-4 py-2 text-sm text-gray-700' | |
)} | |
> | |
個人資料 | |
</Link> | |
)} | |
</Menu.Item> | |
<Menu.Item> | |
{({ active }) => ( | |
<a | |
href="#" | |
className={classNames( | |
active ? 'bg-gray-100' : '', | |
'block px-4 py-2 text-sm text-gray-700' | |
)} | |
> | |
登出 | |
</a> | |
)} | |
</Menu.Item> | |
</Menu.Items> | |
</Transition> | |
</Menu> | |
</div> | |
<div className="-mr-2 flex items-center sm:hidden"> | |
<Disclosure.Button className="inline-flex items-center justify-center rounded-md p-2 text-gray-400 hover:bg-gray-100 hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500"> | |
{open ? ( | |
<XMarkIcon className="block h-6 w-6" aria-hidden="true" /> | |
) : ( | |
<Bars3Icon className="block h-6 w-6" aria-hidden="true" /> | |
)} | |
</Disclosure.Button> | |
</div> | |
</div> | |
</div> | |
<Disclosure.Panel className="sm:hidden"> | |
<div className="space-y-1 pb-3 pt-2"> | |
{navigation.map((item) => ( | |
<Link | |
key={item.name} | |
to={item.href} | |
className={classNames( | |
item.current | |
? 'bg-indigo-50 border-indigo-500 text-indigo-700' | |
: 'border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700', | |
'block border-l-4 py-2 pl-3 pr-4 text-base font-medium' | |
)} | |
> | |
{item.name} | |
</Link> | |
))} | |
</div> | |
</Disclosure.Panel> | |
</> | |
)} | |
</Disclosure> | |
); | |
} | |