A theme-agnostic mega menu for Magento 2.
- Themes supported: Hyvä, Luma, Adobe Commerce default, and any custom theme inheriting from either.
- No jQuery dependency in the Luma variant — uses vanilla JS only, so it stays light and works in lean themes.
- No Knockout / RequireJS in the Hyvä variant — uses Alpine.js (already shipped with every Hyvä theme).
- Lazy-loaded data: dropdown subcategories + featured products are fetched on first hover from a 1-hour-cached JSON endpoint (
/megamenu/products/index?cat=<id>). - Auto theme detection at runtime — picks the right template per request.
# from your Magento root
cp -r /path/to/Etechflow_MegaMenu app/code/Etechflow/MegaMenu
bin/magento module:enable Etechflow_MegaMenu
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento setup:static-content:deploy -f
bin/magento cache:flushSee the top-level INSTALL.md in the distribution ZIP for full instructions (3 install methods, production-mode notes, troubleshooting).
Stores → Configuration → eTechFlow → Mega Menu:
- Master enable/disable
- Root Category ID (which category's children become the top-level menu items)
- Attach All Active Categories — Yes = every active category & sub-category auto-shows on enable, even ones set to "Include in Menu = No". No (default) = respect each category's flag. (Categories attach automatically either way — this just controls hidden ones.)
- Custom Menu Links — add your own top-level items (Label + URL/path + Sort). They merge in after the category items. Lets admins add custom links without touching categories.
- Max depth, featured products per category, mobile drill-down toggle, cache TTL
- Featured Products Source — choose what fills each dropdown's product column: Category Position (default) / Newest / Best Sellers / On Sale / Price Low→High / Price High→Low
- Dropdown Promo CMS Block — optional CMS block identifier rendered as a banner/column inside every dropdown (Content → Blocks). Leave blank for none.
Etechflow_MegaMenu/
├── composer.json
├── registration.php
├── etc/ # module.xml, config.xml, acl.xml, routes.xml, system.xml, di.xml
├── Controller/ # JSON endpoint (megamenu/products/index)
├── Block/ # MegaMenu renderer (picks template by theme)
├── ViewModel/ # MenuData — top-level categories + theme detection
├── Model/Config.php # Typed config reader
├── view/frontend/ # Layout, both phtml variants, CSS, vanilla JS
└── i18n/en_US.csv
- Template: drop your own
mega-menu.phtml(ormega-menu-luma.phtml) underapp/design/frontend/<Vendor>/<theme>/Etechflow_MegaMenu/templates/. - CSS: override
mega-menu.cssthe same way. - Block: subclass
Etechflow\MegaMenu\Block\MegaMenuand rebind via your theme'sdi.xml. - Data: subclass
ViewModel\MenuDatafor custom queries or pre-baked menus.
GET /megamenu/products/index?cat=<id> → JSON:
{
"subcategories": [{"id":3,"name":"Range Rover","url":"https://…","count":42}, …],
"products": [{"name":"…","price":29.99,"price_formatted":"£29.99","url":"…","img":"…"}, …]
}MIT — see LICENSE.md in the distribution.