Now.js Framework Documentation
MenuManager
MenuManager
Overview
MenuManager is the navigation menu management system in Now.js Framework. It supports responsive menus, submenus, and touch devices.
When to use:
- Need navigation menu
- Need responsive hamburger menu
- Need dropdown submenus
- Need active state tracking
Why use it:
- ✅ Responsive (mobile/desktop)
- ✅ Dropdown submenus
- ✅ Touch gesture support
- ✅ Keyboard navigation
- ✅ ARIA accessibility
- ✅ Auto-active state
Basic Usage
HTML Structure
<nav data-component="menu">
<button class="menu-toggle">☰</button>
<ul class="menu">
<li><a href="/">Home</a></li>
<li>
<a href="/products">Products</a>
<ul>
<li><a href="/products/new">New</a></li>
<li><a href="/products/sale">Sale</a></li>
</ul>
</li>
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>Initialization
await MenuManager.init({
breakpoint: 768,
animationDuration: 200
});Configuration
MenuManager.init({
// Mobile breakpoint (px)
breakpoint: 768,
// Animation duration (ms)
animationDuration: 100,
// Touch swipe threshold (px)
touchThreshold: 100,
// Accessibility
accessibility: {
enabled: true,
announceChanges: true,
smoothFocus: true
},
// Hover delays
hover: {
openDelay: 100,
closeDelay: 300
}
});Data Attributes
| Attribute | Description |
|---|---|
data-component="menu" |
Initialize menu |
data-source |
API source for menu items |
data-menu-toggle |
Toggle button |
data-expanded |
Expanded state |
API Reference
MenuManager.createMenu(element)
Create menu instance
| Parameter | Type | Description |
|---|---|---|
element |
HTMLElement | Menu container |
Returns: string - Menu ID
MenuManager.openMenu(menu)
Open mobile menu
MenuManager.closeMenu(menu)
Close mobile menu
MenuManager.toggleMenu(menu)
Toggle mobile menu
MenuManager.openSubmenu(menu, button)
Open submenu
MenuManager.closeSubmenu(menu, button)
Close submenu
MenuManager.closeAllSubmenus(menu)
Close all submenus
MenuManager.updateActiveMenu(path)
Update active state based on path
// After route change
MenuManager.updateActiveMenu('/products/new');MenuManager.getMenu(menuId)
Get menu instance
MenuManager.hasMenu(menuId)
Check if menu exists
Keyboard Navigation
| Key | Action |
|---|---|
↓ / → |
Next item |
↑ / ← |
Previous item |
Enter / Space |
Activate/toggle |
Escape |
Close submenu |
Tab |
Navigate focus |
CSS Styling
/* Menu container */
[data-component="menu"] {
position: relative;
}
/* Menu list */
.menu {
display: flex;
list-style: none;
margin: 0;
padding: 0;
}
.menu > li {
position: relative;
}
.menu a {
display: block;
padding: 12px 16px;
color: inherit;
text-decoration: none;
}
.menu a:hover {
background: rgba(0,0,0,0.05);
}
/* Active state */
.menu a.active {
color: #3b82f6;
font-weight: 500;
}
/* Submenu */
.menu ul {
position: absolute;
top: 100%;
left: 0;
min-width: 200px;
background: white;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
opacity: 0;
visibility: hidden;
transition: all 0.2s;
}
.menu li:hover > ul {
opacity: 1;
visibility: visible;
}
/* Mobile toggle */
.menu-toggle {
display: none;
}
/* Mobile responsive */
@media (max-width: 768px) {
.menu-toggle {
display: block;
}
.menu {
position: fixed;
top: 0;
left: -280px;
width: 280px;
height: 100vh;
flex-direction: column;
background: white;
transition: left 0.3s;
}
.menu.open {
left: 0;
}
.menu ul {
position: static;
box-shadow: none;
}
}Real-World Examples
Main Navigation
<header>
<nav data-component="menu">
<a href="/" class="logo">Logo</a>
<button class="menu-toggle" aria-label="Menu">
<span></span>
<span></span>
<span></span>
</button>
<ul class="menu">
<li><a href="/">Home</a></li>
<li>
<button aria-expanded="false">Products ▼</button>
<ul>
<li><a href="/products/software">Software</a></li>
<li><a href="/products/hardware">Hardware</a></li>
<li><a href="/products/services">Services</a></li>
</ul>
</li>
<li><a href="/pricing">Pricing</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
</header>Data-Driven Menu
<nav data-component="menu" data-source="api.menus">
<!-- Menu will be rendered from API data -->
</nav>
<script>
// API response structure
const menus = [
{ label: 'Home', href: '/' },
{
label: 'Products',
children: [
{ label: 'New', href: '/products/new' },
{ label: 'Sale', href: '/products/sale' }
]
}
];
</script>Sidebar Menu
<aside data-component="menu" class="sidebar-menu">
<ul class="menu vertical">
<li><a href="/dashboard">Dashboard</a></li>
<li>
<button>Settings</button>
<ul>
<li><a href="/settings/profile">Profile</a></li>
<li><a href="/settings/security">Security</a></li>
</ul>
</li>
<li><a href="/logout">Logout</a></li>
</ul>
</aside>Common Pitfalls
⚠️ 1. Submenu Must Be Inside li
<!-- ❌ Submenu in wrong place -->
<ul class="menu">
<a href="#">Products</a>
<ul>...</ul>
</ul>
<!-- ✅ Submenu inside li -->
<ul class="menu">
<li>
<a href="#">Products</a>
<ul>...</ul>
</li>
</ul>⚠️ 2. ARIA for Accessibility
<!-- ❌ No ARIA -->
<button>Menu</button>
<!-- ✅ With ARIA -->
<button aria-expanded="false" aria-controls="main-menu">
Menu
</button>Related Documentation
- RouterManager - SPA routing
- AnimationManager - Animations