Download frontend/src/components/Layout.tsx from Duke410/PawTrace: direct link, hf CLI and curl.
- Browser
- Download file 2.26 kB
-
https://huggingface.co/spaces/Duke410/PawTrace/resolve/main/frontend/src/components/Layout.tsx
- Command line
-
hf download hf://spaces/Duke410/PawTrace/frontend/src/components/Layout.tsx
-
curl -L -o Layout.tsx https://huggingface.co/spaces/Duke410/PawTrace/resolve/main/frontend/src/components/Layout.tsx
2.26 kB
| import { Link, NavLink, useNavigate } from "react-router-dom"; | |
| import { useAuth } from "../auth"; | |
| import type { ReactNode } from "react"; | |
| function navClass({ isActive }: { isActive: boolean }) { | |
| return `px-3 py-2 rounded-md text-sm font-medium ${ | |
| isActive ? "bg-brand-50 text-brand-700" : "text-gray-600 hover:bg-gray-100" | |
| }`; | |
| } | |
| export default function Layout({ children }: { children: ReactNode }) { | |
| const { user, logout } = useAuth(); | |
| const navigate = useNavigate(); | |
| return ( | |
| <div className="min-h-screen text-gray-900"> | |
| <header className="border-b border-gray-200 bg-white sticky top-0 z-10"> | |
| <div className="mx-auto max-w-5xl px-4 flex items-center justify-between h-14"> | |
| <Link to="/" className="flex items-center font-bold tracking-tight text-brand-700"> | |
| PawTrace | |
| </Link> | |
| <nav className="flex items-center gap-1"> | |
| {user ? ( | |
| <> | |
| {user.role === "admin" ? ( | |
| <NavLink to="/admin" className={navClass}> | |
| Admin | |
| </NavLink> | |
| ) : ( | |
| <> | |
| <NavLink to="/dogs" className={navClass}> | |
| My Dogs | |
| </NavLink> | |
| <NavLink to="/cases" className={navClass}> | |
| My Cases | |
| </NavLink> | |
| </> | |
| )} | |
| <button | |
| className="btn-secondary ml-2" | |
| onClick={() => { | |
| logout(); | |
| navigate("/"); | |
| }} | |
| > | |
| Log out | |
| </button> | |
| </> | |
| ) : ( | |
| <NavLink to="/login" className="btn-primary ml-2"> | |
| Log in | |
| </NavLink> | |
| )} | |
| </nav> | |
| </div> | |
| </header> | |
| <main className="mx-auto max-w-5xl px-4 py-6">{children}</main> | |
| <footer className="mx-auto max-w-5xl px-4 py-8 text-center text-xs text-gray-400"> | |
| PawTrace · Photo matches are suggestions requiring human confirmation. Contact is mediated | |
| through the platform — addresses are never shared. | |
| </footer> | |
| </div> | |
| ); | |
| } | |