Components
Mega Menu
BetaA multi-column dropdown navigation panel that expands below the primary nav bar. Used for destination browsers, holiday type menus, and content-rich navigation structures.
Destinations
Holiday TypesOffersAfrica
- Kenya
- Tanzania
- Rwanda
Indian Ocean
- Maldives
- Seychelles
- Mauritius
Asia
- Japan
- Sri Lanka
- India
Purpose
The MegaMenu is a wide, multi-column dropdown for sites with deep navigation hierarchies. Unlike a simple dropdown, it reveals multiple grouped link sets simultaneously — letting users see all of "Destinations" at once without drilling through sub-menus.
On kuoni.co.uk, a MegaMenu would serve:
- Destinations — columns by region: Africa, Indian Ocean, Asia, Americas, Europe
- Holiday types — columns: Luxury, Safari, Beach, Ski, Honeymoon, Family
- Inspiration — columns: Editorial picks, Guides, Expert advice
Items without sub-columns render as simple nav links. Items with columns configured open a full-width panel on hover (desktop) or click (any pointer).
Static rendering note: The MegaMenu is interactive (
'use client') and requires hover/click state to open. The preview above shows a static mockup of the open state. In your application, hover a "Destinations"-type nav item to open the panel.
Usage
Reach for MegaMenu when a top-level nav section (like "Destinations") has too many sub-items to fit a simple dropdown legibly — grouping them into headed columns lets users scan an entire category at once. For a nav item with only a handful of links, a simple link (no panel) is enough; reserve MegaMenu for genuinely deep hierarchies.
MegaMenu is triggered from an item inside the site's NavBar — it is not a standalone nav bar itself. On mobile, it does not render a panel at all; navigation instead collapses into the NavBar's built-in drawer pattern.
Anatomy
Africa
- Kenya
- Tanzania
- South Africa
Indian Ocean
- Maldives
- Seychelles
- Mauritius
- 1Nav bar — Horizontal list of nav items. Items with columns show a ChevronDown that rotates when open.
- 2Panel backdrop — Full-width area below the nav. White bg with bottom shadow-kuoni-xl. Appears on hover/click.
- 3Column heading — Regional or category heading in 10px uppercase grey-400. e.g. "Africa", "Indian Ocean".
- 4Link list — Vertically stacked Next.js links. Grey-700 text, transitions to teal on hover.
- 5Featured card — Optional image card in a column — editorial pick with thumbnail, label, and description.
- 6Badge — Optional teal chip on a link label. e.g. "New" or "Sale".
Variants
Links only
The simplest mega menu — columns of grouped links, no featured cards.
<MegaMenu
items={[
{
label: 'Destinations',
columns: [
{
heading: 'Africa',
links: [
{ label: 'Kenya', href: '/destinations/kenya' },
{ label: 'Tanzania', href: '/destinations/tanzania' },
{ label: 'South Africa', href: '/destinations/south-africa' },
],
},
{
heading: 'Indian Ocean',
links: [
{ label: 'Maldives', href: '/destinations/maldives' },
{ label: 'Seychelles', href: '/destinations/seychelles' },
{ label: 'Mauritius', href: '/destinations/mauritius' },
],
},
{
heading: 'Asia',
links: [
{ label: 'Japan', href: '/destinations/japan', badge: 'New' },
{ label: 'Sri Lanka', href: '/destinations/sri-lanka' },
{ label: 'India', href: '/destinations/india' },
],
},
],
},
{ label: 'Offers', href: '/offers' },
{ label: 'Inspiration', href: '/inspiration' },
]}
/>
With featured card
Add a featured object to a column to render an editorial image card alongside the link lists.
<MegaMenu
items={[
{
label: 'Destinations',
columns: [
{
featured: {
label: 'Destination of the month: Japan',
description: 'Cherry blossoms and hidden ryokans',
href: '/destinations/japan',
image: {
alt: 'Cherry blossom avenue at a Kyoto temple',
},
},
},
{
heading: 'Asia',
links: [
{ label: 'Japan', href: '/destinations/japan' },
{ label: 'Sri Lanka', href: '/destinations/sri-lanka' },
],
},
],
},
]}
/>
States
| State | Trigger appearance | Panel |
|---|---|---|
| All closed | Grey-700 text | Hidden |
| Hover on item with columns | Teal text, ChevronDown rotated 180° | Full-width panel visible |
| Hover on simple link | Teal text | No panel |
| Active link (current page) | Teal text | — |
| Panel link hover | Teal text | — |
| Any nav item focused | Teal focus ring | Panel opens |
Best practices
Limit mega menu columns to 4 per panel and links per column to 8.
Three to four columns of 6-8 links each gives users a complete picture without scrolling.
Try to fit every destination or holiday type into a single mega menu panel.
A mega menu with 6 columns of 15 links each is harder to scan than a search box.
Give every column a clear heading that groups the links logically.
Column headings like 'Indian Ocean' immediately orient users within the geography.
Put all links in one column without sub-headings.
An ungrouped flat list of 30 destinations with no headings requires reading every item.
Ensure the mega menu closes reliably on outside click and Escape key.
The panel closes when the user clicks outside or presses Escape — natural exit affordance.
Keep the mega menu open until the user explicitly closes it — rely on outside click + Escape.
A sticky open mega menu blocks page content and confuses users who want to scroll.
Mix simple nav links (no panel) with mega menu items (with columns) in the same nav bar.
Simple top-level links (Offers, Inspiration) sit alongside mega menu items without a panel.
Give every nav item a mega panel, even simple sections with just a few links.
Forcing every nav item to open a panel adds interaction cost for simple sections.
Props
MegaMenu
| Prop | Type | Default | Description |
|---|---|---|---|
| items* | NavItem[] | — | Array of nav items. Each item is either a simple link or has columns for a mega panel. |
| className | string | — | Additional Tailwind classes on the nav element. |
NavItem shape
| Prop | Type | Default | Description |
|---|---|---|---|
| label* | string | — | Text label for the nav item. |
| href | string | '#' | URL for simple link items (no panel). Ignored when columns are provided. |
| active | boolean | false | Marks this nav item as the current page link (teal colour). |
| columns | PanelColumn[] | — | When provided, the item opens a mega panel instead of linking directly. |
PanelColumn shape
| Prop | Type | Default | Description |
|---|---|---|---|
| heading | string | — | Column section heading. e.g. "Africa", "Indian Ocean". |
| links | Array<{ label: string; href: string; icon?: ReactNode; badge?: string }> | [] | Array of link items within this column. |
| featured | { label, description?, href, image? } | — | Optional featured card at the top of the column with image thumbnail. |
Accessibility
Navigation landmarks
<nav aria-label="Primary navigation with mega menu">
<ul role="menubar">
<li role="none">
<button role="menuitem" aria-haspopup="true" aria-expanded={isOpen}>
Destinations
</button>
</li>
</ul>
</nav>
role="menubar"on the nav list +role="menuitem"on each nav item follow the WAI-ARIA Menu patternaria-haspopup="true"on items with panels signals that a sub-menu will openaria-expandedannounces open/closed state to screen readers
Keyboard interaction
| Key | Action |
|---|---|
Tab | Move between nav items |
Enter / Space | Open/close panel or follow a simple link |
Escape | Close open panel |
Tab within panel | Navigate between panel links |
Enter on panel link | Follow the link and close the panel |
Mobile
On mobile, the MegaMenu renders nav items as flat links without panels. Use the NavBar component's built-in mobile drawer for mobile navigation — the MegaMenu is a desktop-only component.
Related components
- Navigation — MegaMenu panels are triggered from items inside the site's NavBar; the two are used together, not interchangeably.
- Drawer — the pattern NavBar falls back to for mobile navigation, replacing the desktop-only MegaMenu panel.