Commit ·
3acde0a
1
Parent(s): a4bdc89
Toggle header nav by orientation (hamburger only in portrait)
Browse filesTailwind here is pre-compiled without orientation variants, so drive the
landscape/portrait switch with plain media-query CSS classes.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
frontend/src/components/layout/Header.tsx
CHANGED
|
@@ -25,12 +25,12 @@ export function Header() {
|
|
| 25 |
</div>
|
| 26 |
<div className="min-w-0">
|
| 27 |
<div className="text-xl font-semibold text-slate-900 truncate">MuSProt</div>
|
| 28 |
-
<div className="
|
| 29 |
</div>
|
| 30 |
</Link>
|
| 31 |
|
| 32 |
-
{/*
|
| 33 |
-
<nav className="
|
| 34 |
<Link to="/" className={navItemClass(location.pathname === '/')}>
|
| 35 |
<Database className="w-4 h-4 shrink-0" />
|
| 36 |
Explorer
|
|
@@ -48,21 +48,21 @@ export function Header() {
|
|
| 48 |
</a>
|
| 49 |
</nav>
|
| 50 |
|
| 51 |
-
{/*
|
| 52 |
<button
|
| 53 |
type="button"
|
| 54 |
aria-label="Toggle navigation menu"
|
| 55 |
aria-expanded={menuOpen}
|
| 56 |
onClick={() => setMenuOpen((open) => !open)}
|
| 57 |
-
className="
|
| 58 |
>
|
| 59 |
{menuOpen ? <X className="w-6 h-6" /> : <Menu className="w-6 h-6" />}
|
| 60 |
</button>
|
| 61 |
</div>
|
| 62 |
|
| 63 |
-
{/*
|
| 64 |
{menuOpen && (
|
| 65 |
-
<nav className="
|
| 66 |
<Link to="/" className={navItemClass(location.pathname === '/')}>
|
| 67 |
<Database className="w-4 h-4 shrink-0" />
|
| 68 |
Explorer
|
|
|
|
| 25 |
</div>
|
| 26 |
<div className="min-w-0">
|
| 27 |
<div className="text-xl font-semibold text-slate-900 truncate">MuSProt</div>
|
| 28 |
+
<div className="header-nav-subtitle text-xs text-slate-500 truncate">Multistate Protein Structure Database</div>
|
| 29 |
</div>
|
| 30 |
</Link>
|
| 31 |
|
| 32 |
+
{/* Full nav — shown in landscape (W >= H) */}
|
| 33 |
+
<nav className="header-nav-full items-center gap-2">
|
| 34 |
<Link to="/" className={navItemClass(location.pathname === '/')}>
|
| 35 |
<Database className="w-4 h-4 shrink-0" />
|
| 36 |
Explorer
|
|
|
|
| 48 |
</a>
|
| 49 |
</nav>
|
| 50 |
|
| 51 |
+
{/* Menu toggle — shown only in portrait (W < H) */}
|
| 52 |
<button
|
| 53 |
type="button"
|
| 54 |
aria-label="Toggle navigation menu"
|
| 55 |
aria-expanded={menuOpen}
|
| 56 |
onClick={() => setMenuOpen((open) => !open)}
|
| 57 |
+
className="header-nav-toggle items-center justify-center p-2 rounded-lg text-slate-700 hover:bg-slate-100 transition-colors shrink-0"
|
| 58 |
>
|
| 59 |
{menuOpen ? <X className="w-6 h-6" /> : <Menu className="w-6 h-6" />}
|
| 60 |
</button>
|
| 61 |
</div>
|
| 62 |
|
| 63 |
+
{/* Dropdown menu — portrait only */}
|
| 64 |
{menuOpen && (
|
| 65 |
+
<nav className="header-nav-dropdown border-t border-gray-200 bg-white px-4 py-3 flex-col gap-1">
|
| 66 |
<Link to="/" className={navItemClass(location.pathname === '/')}>
|
| 67 |
<Database className="w-4 h-4 shrink-0" />
|
| 68 |
Explorer
|
frontend/src/index.css
CHANGED
|
@@ -3028,3 +3028,38 @@ body {
|
|
| 3028 |
#root {
|
| 3029 |
overflow-x: clip;
|
| 3030 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3028 |
#root {
|
| 3029 |
overflow-x: clip;
|
| 3030 |
}
|
| 3031 |
+
|
| 3032 |
+
/* Header navigation by window orientation.
|
| 3033 |
+
Tailwind here is pre-compiled with no orientation variants, so toggle via
|
| 3034 |
+
plain media queries. Default (landscape, W >= H): full nav + subtitle, no
|
| 3035 |
+
hamburger. Portrait (W < H): hamburger + dropdown, hide the inline nav. */
|
| 3036 |
+
.header-nav-full {
|
| 3037 |
+
display: flex;
|
| 3038 |
+
}
|
| 3039 |
+
.header-nav-subtitle {
|
| 3040 |
+
display: block;
|
| 3041 |
+
}
|
| 3042 |
+
.header-nav-toggle {
|
| 3043 |
+
display: none;
|
| 3044 |
+
}
|
| 3045 |
+
.header-nav-dropdown {
|
| 3046 |
+
display: flex;
|
| 3047 |
+
}
|
| 3048 |
+
|
| 3049 |
+
@media (orientation: portrait) {
|
| 3050 |
+
.header-nav-full {
|
| 3051 |
+
display: none;
|
| 3052 |
+
}
|
| 3053 |
+
.header-nav-subtitle {
|
| 3054 |
+
display: none;
|
| 3055 |
+
}
|
| 3056 |
+
.header-nav-toggle {
|
| 3057 |
+
display: inline-flex;
|
| 3058 |
+
}
|
| 3059 |
+
}
|
| 3060 |
+
|
| 3061 |
+
@media (orientation: landscape) {
|
| 3062 |
+
.header-nav-dropdown {
|
| 3063 |
+
display: none;
|
| 3064 |
+
}
|
| 3065 |
+
}
|