Mobile header and nav drawer
How the header collapses into a hamburger menu on mobile, and the design principles for the nav drawer layout.
At 640px, the header switches from a horizontal nav bar to a hamburger + drawer. The mega menus that open as floating panels on desktop become flat sections inside the drawer.
The hamburger trigger
The menu toggle button (44×44px tap target, -10px margin offset for visual alignment) shows three horizontal lines. Clicking it opens the drawer and auto-expands the Garden menu inside.
The drawer
The nav slides down from the header as an absolutely positioned panel:
.site-nav {
display: none;
position: absolute;
top: 100%;
left: 0;
right: 0;
background: var(--color-bg);
border-bottom: 1px solid var(--color-border);
padding: var(--space-md);
z-index: 100;
}
.site-nav.open { display: block; }
It’s not an overlay — it pushes the page content down. This avoids z-index conflicts with sticky elements and keeps the one-scrollbar principle intact.
All items start collapsed
When the drawer opens, the three top-level nav items show collapsed: The Garden, Toolshed, About. No section auto-expands. The user taps the section they want.
This keeps the initial drawer compact and avoids assuming which section the user is heading to.
Desktop vs mobile mega menu: design differences
| Desktop | Mobile | |
|---|---|---|
| Position | Absolute floating panel | Static, inline in drawer |
| Descriptions | Shown (scannable before navigating) | Shown (still useful for deciding where to go) |
| Collection items | 2-column grid | Single column |
| Views row | Horizontal flex | Horizontal flex, wrap-allowed |
| Trigger button | Inline in nav bar | Full-width, chevron pushed right |
| Toolshed | Auto-stays closed | Stays closed until tapped |
| Box shadow | Yes | No |
| Border | Yes | No |
Descriptions remain visible on mobile — they’re useful when deciding where to navigate, and the drawer scrolls naturally if it’s tall.
Full-width triggers
On mobile, dropdown trigger buttons stretch to full width with the chevron pushed to the right:
@media (max-width: 640px) {
.garden-dropdown-trigger,
.toolshed-dropdown-trigger {
width: 100%;
justify-content: space-between;
padding: var(--space-sm) var(--space-xs);
min-height: 44px;
}
}
This makes the entire row tappable rather than just the text label.
Views row on mobile
The views strip (Stream, Map, Collections, Stack, Graph) stays horizontal on mobile — it wraps to a second row if needed. Stacking vertically would make the drawer unnecessarily long.
Close behaviors
- Tap outside the drawer
- Press Escape (keyboard)
- No close-on-link-click — the navigation itself handles page change, which resets state