229 lines
9.5 KiB
Markdown
Raw Normal View History

2021-07-27 14:46:32 +02:00
# About
This module integrates the mmenu library with Drupal's menu system with the aim
of having an off-canvas mobile menu and a horizontal menu at wider widths. It
integrates with your theme's breakpoints to allow you to trigger the display of
the horizontal menu at your desired breakpoint. The mobile off-canvas menu is
displayed through a toggle icon or with the optional integration of a swipe
gesture.
# Install
The module should be installed using composer:
```
composer require drupal/responsive_menu:^4.0
```
# Libraries install
The module requires the installation of at least the mmenujs library. There are
two methods to install the external libraries:
## NPM method:
If you have npm installed you can change directory into the `responsive_menu`
module directory and run `npm install`. This will create a `libraries`
directory which you _must_ move to your Drupal root.
## Manual method:
The only library required by this module is the [mmenu](https://mmenujs.com/)
plugin. You need to [download an 8.x.x
version](https://github.com/FrDH/mmenu-js/releases) of the library and place it
in `/libraries` in your docroot (create the directory if you need to). Rename
your newly placed download to mmenu, so the resulting path is
`/libraries/mmenu`. This module will look in `/libraries/mmenu/dist` for the
javascript files so ensure you have the correct file structure.
The other optional library which adds functionality (if desired) is the
[superfish](https://github.com/joeldbirch/superfish) plugin. This library uses
jQuery so your theme will also need to use jQuery. Place this in `/libraries`
and rename it to superfish, so that you have a structure like
`/libraries/superfish/dist/js` starting at your docroot/webroot (at the same
level as index.php)`.
# Upgrade from 8.x-2.x versions
Due to class name changes upstream in the mmenu library you may need to adjust
your custom css. The main css change implemented in the provided
`responsive_menu.css` is the targeting of the `html.mm-opening` class which no
longer exists. This has changed to `.mm-wrapper_opening`. So for example:
```css
html.mm-opening .responsive-menu-toggle-icon span.icon {
```
is now:
```css
.mm-wrapper_opening .responsive-menu-toggle-icon span.icon {
```
# Configuration
As an administrator visit `/admin/config/user-interface/responsive-menu`
You can adjust the various options. Some of the options will require the
libraries to be present before allowing configuration.
There is an option to _not use_ the breakpoint which in turn will not add the
breakpoint css file to the page. This will allow you to use the off-canvas menu
at any screen size. Alternatively you might want to use your own menu at desktop
screen widths and control the visibility of both with your own css.
# Block placement
The module provides two blocks, one for the horizontal menu, labeled in the
block UI as "Horizontal menu". The other is labeled as "Responsive menu mobile
icon" and is the 'burger' style menu icon and text which allows the user to
toggle the mobile menu open and closed.
The placement of the horizontal menu block is _optional_, the off-canvas menu
will work regardless of the existence of the horizontal menu block. This is
useful if you want to use another block for the horizontal menu, eg. Bootstrap.
The mobile icon block is necessary for the mobile menu to work.
# Theming and theme compatibility
This module should be compatible with most themes. One basic requirement is that
the theme includes a wrapping 'page' div. This is so that mmenu knows which
elements belong inside the wrapper when the off canvas menu is opened. Bartik is
an example of a theme with a wrapping div. Bootstrap (v3) is an example of a
theme which doesn't have the wrapping div. There is a setting to
automatically add a wrapping div should your theme need it.
It should also be noted that the default css that comes with the module provides
some _very basic_ styling and should be copied and pasted into your theme's css
so that you can modify it to fit your theme's style. Once you've copied and
pasted the css into your stylesheet you can disable the inclusion of the
module's css on the settings page.
There is a default 'selected' class of `menu-item--active-trail` which
corresponds to the active menu trail class of any theme using `classy` as the
base theme. If you want to change this take a look at the preprocess code below
as an example. Note that this class will be replaced with `mm-listitem_selected`
by the mmenu library in the off-canvas menu so don't rely on the original Drupal
class for styling.
The mmenu library does not require jQuery and this module does not have a
requirement for jQuery either, so your theme could potentially use both the
horizontal and the off-canvas (mmenu based) menu without any jQuery. The
optional superfish library (and the included hoverintent) do require jQuery so
if you want to use those your theme will need to include jQuery (jQuery will be
automatically added by the module as a dependency in this situation).
## Bootstrap compatibility
Since version 4.3.1 this module supports Bootstrap 4 themes. It has been tested
with the Varbase distribution which uses `bootstrap_barrio` as the base theme for
the front end. It has not been tested with Bootstrap 3 themes and there will be
no support for Boostrap 3 as it has been superceded by Bootstrap 4.
By default the collapsible navbar provided by Bootstrap 4's
[navbar component](https://getbootstrap.com/docs/4.0/components/navbar/) and
`bootstrap_barrio` theme is a horizontal navbar that at narrower browser widths
provides a menu 'burger' icon which opens a vertical mobile-friendly menu.
Instead of opening that mobile-friendly Bootstrap menu we can open the
off-canvas mmenu provided by this module and the mmenu library.
To use the Bootstrap navbar element and have the menu 'burger' icon open the
off-canvas mmenu instead of the default Bootstrap mobile menu, you need two
things:
1. Enable the new setting labeled "Enable compatibility mode for Bootstrap 4 themes".
2. Make sure the "Main navigation" block is placed in the "Navigation
(Collapsible)" region of your theme.
In case you have customised any templates and changed anything, for the
JavaScript to correctly override the menu icon it needs to find the menu icon
within a wrapper with the ID `#navbar-main`. This is the default for
`bootstrap_barrio`.
You don't need to place this module's horizontal menu block or enable superfish
when you are using the Bootstrap navbar. If you don't want to use the Bootstrap
navbar you can instead use this module's horizontal menu block and place it in
the "Navigation" region, along with this module's "Responsive menu mobile icon"
block. You won't need to have the Bootstrap compatibility setting enabled either
as this is only for the navbar component.
# Customising the mmenu config and settings (advanced)
It is possible to completely customise the config provided to the mmenu library,
beyond what the module's admin form provides. This is done by preprocessing the
page and providing a `custom` element on the `drupalSettings` for the
`responsive_menu`.
In the following example you would place this in your custom theme's `.theme`
file and change `MYTHEME` to the name of your theme. This example adds a navbar
title to the off-canvas menu with the string 'This is a test'. It also changes
the selected class name to `my-custom-menu--active-trail`:
```php
/**
* Implements hook_preprocess_page().
*/
function MYTHEME_preprocess_page(&$variables) {
$variables['#attached']['drupalSettings']['responsive_menu']['custom'] = [
'options' => [
'navbar' => [
'add' => TRUE,
'title' => 'This is a test',
]
],
'config' => [
'classNames' => [
'selected' => 'my-custom-menu--active-trail',
],
]
];
}
```
# Disabling the off-canvas menu under specific conditions
In rare cases you may not want the off-canvas menu to be rendered, for example
you may have a members section of the site which uses a different menu system
and theme. To stop the off-canvas menu from being added to the DOM and to
disable the JavaScript you can use a hook in a custom module. Change `MYMODULE`
to the machine name of your module and place this code in your custom module's
`.module` file:
```php
/**
* Implements hook_responsive_menu_off_canvas_output_alter().
*/
function MYMODULE_responsive_menu_off_canvas_output_alter(&$output) {
if (\Drupal::service('theme.manager')->getActiveTheme()->getName() === 'bartik') {
$output = FALSE;
}
}
```
You will want to change the logic in the example above to trigger only when your
specific condition has been met. This might be checking the theme name, if the
user is logged in, if the user is visiting a certain page etc.
Note that disabling the module's output of the `page_bottom` region code will
also disable the included css (if enabled) that might be needed for the
horizontal menu. You should disable the included css (see settings page) and
instead maintain your own css in your theme(s). The breakpoints css will also
not be included, so again it is up to the developer to maintain their own
breakpoint code.
The idea of this hook is to disable all custom output in that region, it is up
to the site builder to decide how they will manage their menus in that
situation.
# Licenses
The licenses for the libraries used by this module are:
mmenu: Creative Commons Attribution-NonCommercial
superfish: MIT
The mmenu plugin used to have an MIT license but has changed to the CC
NonCommercial license. So you'll need to pay the developer a fee to use it in a
commercial web site.