WinslowFan Claude Opus 4.8 commited on
Commit
3acde0a
·
1 Parent(s): a4bdc89

Toggle header nav by orientation (hamburger only in portrait)

Browse files

Tailwind 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="hidden sm:block text-xs text-slate-500 truncate">Multistate Protein Structure Database</div>
29
  </div>
30
  </Link>
31
 
32
- {/* Desktop nav */}
33
- <nav className="hidden sm:flex items-center gap-2">
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
- {/* Mobile menu toggle */}
52
  <button
53
  type="button"
54
  aria-label="Toggle navigation menu"
55
  aria-expanded={menuOpen}
56
  onClick={() => setMenuOpen((open) => !open)}
57
- className="sm:hidden inline-flex 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
- {/* Mobile dropdown menu */}
64
  {menuOpen && (
65
- <nav className="sm:hidden border-t border-gray-200 bg-white px-4 py-3 flex flex-col gap-1">
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
+ }