Ultimenu flyout with submenu
Ultimenu regions

Ultimenu is the UltimatelyDeadSimple™ megamenu ever with dynamic region creation.

An Ultimenu block is based on a menu.
Ultimenu regions are based on the menu items.
The result is a block contains regions containing blocks, as opposed to: a region contains blocks.

This is no longer a new concept. It is also seen at widget.module with subtle difference.

First things first!

Running a multilingual site?
Be sure to read this and this!

The module manages the toggle of Ultimenu blocks, regions, and a skins library, while leaving the management of block, menu and regions to Drupal.

At individual Ultimenu block, you can define a unique skin and the flyout orientation.

You don't have to write regions in the theme .info, however you can always permanently store resulting region definitions in it. See Notes below for possible handle of confusion.



  1. Multiple instance of Ultimenus based on system and menu modules.
  2. Dynamic regions based on menu items which is toggled without touching .info.
  3. Render menu description.
  4. Menu description above menu title.
  5. Add title class to menu item list.
  6. Add mlid class to menu item list.
  7. Add menu counter class
  8. Remove browser tooltip.
  9. Use mlid, not title for Ultimenu region key. This is the important key to have a working multilingual site.
  10. Custom skins, or theme default "css/ultimenu" directory for auto discovery.
  11. Individual flyout orientation: horizontal to bottom or top, vertical to left or right.
  12. Pure CSS3 animation and basic styling is provided without assumption. Please see and override the ultimenu.css for more elaborate positioning, either left, centered or right to menu list or menu bar. And a simple JS to highlight the current menu item after hover (.hover) whenever CSS (:hover) fails.
  13. With the goodness of core blocks and regions, you can embed almost anything: views, panels, blocks, menu_block, boxes, slideshow..., except a toothpick.

All 1-9 are off by default.


  1. Enable or install the module.
  2. Visit admin/structure/ultimenu to manage the Ultimenu blocks, regions, a skin library and a few goodies.
  3. Once a menu is enabled and saved, dynamic regions will be available to toggle. Only enabled regions (based on enabled menu items) will be visible at block/ context admin.
  4. Visit admin/structure/block to assign the "Ultimenu: Menu name" block into header, sidebar, footer or navigation region, except Ultimenu regions.
  5. Add other blocks to the Ultimenu regions.


- Drupal core optional menu.module should be enabled.

i18n with Entity translation integration

Ultimenu works great if the region is not language dependent, that is using the MLID (D7), or UUID/ HASH (D8) as the region key.

These region keys are ugly. However as they are more to machine than human, nothing to worry about. For human, hence themers, relevant CSS classes can be enabled by options.

Check out this screenshot. If Entity translation (D7) keeps one node for multiple languages, Ultimenu keeps one region for multiple languages. D8 already supports entity translation.

  1. admin/structure/ultimenu
    Check: Use mlid, not title for Ultimenu region key, because the title is language dependent which will cause issue with different languages.
  2. admin/structure/menu/manage/[MENU-NAME]/edit
    Check: option #2 - Translate and Localize.
  3. admin/structure/menu/item/[MLID]/edit
    Keep "language neutral" to localize the menu title.

Why another megamenu?

I tried one or two, not all, and read some, but found no similar approach. Unless I missed one. Please file an issue if any similar approach worth a merge.

Why silly claim UltimatelyDeadSimple™?

  • Ultimenu doesn't create another database table just to store blocks. Meaning less complexity. It doesn't want to manage block placements which is already existing at core system. Silly put, Ultimenu doesn't create a government within a government.
  • Ultimenu doesn't modify core menu tables. Meaning less headache and smaller footprint with tons of menu items. Drupal has already hundreds of menu items at fresh install, and adding more stuffs into each item is a big take. Ultimenu is not brave for such a take.
  • Ultimenu doesn't create another new entity just to have blocks which are already entities. Meaning adheres to KISS principle.
  • Ultimenu doesn't rely on JavaScript. It will simply work fine with JS disabled! Meaning respectful to non-JS users and SE friendly.
  • Ultimenu integrates very well with the ancient system of core Drupal blocks, regions and themes, which is proven to last to D8 today and likely future-proof. Meaning no beating around the bush, nor workarounds. You can just do straight things with core system.
  • Ultimenu is proudly ugly by default. Meaning it is your themer's job to make it awesome.

How can you help?

Please consider helping in the issue queue, provide improvement, or helping with documentation.

  • Widget,
    to have a single block which holds a few sub-blocks with the ease of core layout plugins for unique layout composition per Ultimenu region.
  • Gridstack Beta5+, or latest DEV in tandem with Widget. Alternatively use Radix, or Bootstrap layouts, to ease up building complex layouts with individual region within Widget.


Whenever a menu item is removed/disabled, the relevant region will be removed.
If you manually copy/store them in theme .info, regions will always be visible, which is another case.
Dynamic region is indeed removed, but system now displays your written regions. However you can force disabling unwanted Ultimenu regions via UI if so required, altering the system.

Make sure to clear the cache to see the new regions, or when updated the module.

Known issues

Please read this before you start working with Ultimenu to avoid issues in the first place.

  • Context module integration, a nice to have:
    Placing both Ultimenu containers and items inside the same context will behave, see above tips for solution.
  • Context produces some notices: Notice: Undefined property: stdClass::$content in _block_get_renderable_array() Context issues are fixed at #2233215, thanks to quintux.
  • This module is not for you if you are not familiar with CSS. It requires custom CSS works to fit your design needs, and also to fix Ultimenu limitation with CSS thingies. This module was created by an ancient themer for themers who just want to have their blocks available within menus items, and integrate with core Drupal blocks and regions. Ultimenu doesn't want to deal with different themes compatibility which is more a themer's job. Sensible defaults are provided. Please consider them as a starter, not final.
  • Multilingual site limitation which wants a single unique region key for different languages as mentioned above.


Ultimenu was created years before RWD was a must. D7 version is not responsive. D8 is. The original employer refused to make their sites responsive, and wanted to remove anything that supported RWD which sound odd nowadays but that happened once. The reason was you can just tap to zoom with touch devices.

Ultimenu just provides the bare minimum, admittedly ugly, layout and styling, so that themers can get a job for it.

Update notes

Be sure to clear the cache whenever updating the module to the latest if trouble with the changes. Optionally regenerate CSS and JS to pick latest changes if any.

Project information