amegmen
TypeScript icon, indicating that this package has built-in type declarations

1.0.7 • Public • Published

AMegMen

AMegMen (Accessible MegaMenu) is an Keyboard accessible, jQuery-free and Framework-free MegaMenu plugin which is fully responsive, and supports multiple levels.

Demo

https://adityakahb.github.io/amegmen

Features

  • Available in Vanilla Javascript and CommonJS module
  • Framework-free
  • Can be navigated through Tab Key
  • Supports 3 levels
  • Supports Click and Hover behaviors
  • Supports Right to Left UI
  • Fully responsive
  • With bare minimum css (with no icons, reset, normalize, custom fonts or images)
  • Can have multiple instances with multiple configurations
  • Compiled through Typescript
  • Styled through SASS (Mobile first and with one breakpoint) - Source included for customization
  • Tested through Karma and Jasmine
  • Polyfills for Object.assign, querySelector:scope, querySelectorAll:scope and Element.closest included, no other polyfill required.

Development Points

Since AMegMen supports 3 levels, following points are considered during the development:

  • Levels start from 0, just like an array.
  • Root -> Level 0 UL/LI -> Level 0 Anchor and Level 0 Subnav Panel
  • Level 0 Subnav Panel -> Level 0 Landing link and Level 1 Panel Columns
  • Level 1 Panel Columns -> Level 1 UL/LI -> Level 1 Anchor and Level 2 Subnav Panel
  • Level 2 Subnav Panel -> Level 1 Landing link and Level 2 a Single Panel Column
  • Level 2 Panel Column -> Level 2 UL/LI -> Level 2 Anchor
  • All Subnav panels must have columns in them, to position the 3rd level accurately.
  • Mobile devices don't support hover, so the hover behavior is implemented as an option, which if required, can be enabled by passing actOnHover as true.
  • Right to Left is based on just a CSS property direction: rtl, and it may not be supported on old browsers.
  • Actual code resides in Typescript, which is compiled to Javascript (ES3 and NO Module code generation) and is compressed through Uglify-JS.
  • Styles reside in SASS files with minimum configurations and changes mobile to desktop view at 768px. The styles are compressed through UglifyCSS.

Installation

NPM

npm install amegmen

THEN

<link href="node_modules/amegmen/dist/styles/theme-1/amegmen.min.css"/>
<script src="node_modules/amegmen/dist/scripts/amegmen.min.js"></script>

OR

import AMegMen from 'amegmen';
@import '~amegmen\src\sass-theme-1\amegmen';

HTML

<!-- Root Element -->
<nav  id="__amegmen_root">
    <!-- Button (on mobile) to toggle Megamenu on mobile device -->
    <button  class="__amegmen--toggle-cta">Menu</button>
    <!-- Off-Canvas which slides on mobile device -->
    <div  class="__amegmen--canvas">
        <!-- Nav Header containing a Button to close the Megamenu -->
        <header>
            <!-- Button (on mobile) to close the Megamenu -->
            <button  class="__amegmen--close-cta">Close</button>
        </header>
        <!-- Main section containing Megamenu navigation -->
        <section  class="__amegmen--main">
            <!-- Level 0 UL/LI -->
            <ul>
                <li>
                    <!-- Level 0 anchor -->
                    <a  href="#">Risus</a>
                        <!-- Level 0 Megamenu panel -->
                        <section  class="__amegmen--panel">
                            <!-- Container for Level 0 anchor's landing page url -->
                            <div  class="__amegmen--landing">
                                <!-- Button (on mobile) to go main menu (level 0) -->
                                <button  class="__amegmen--main-cta">Main</button>
                                <!-- Level 0 anchor's landing page url -->
                                <a  href="#Tempor sit maecenas">Landing page: Tempor sit maecenas</a>
                            </div>
                            <!-- Level 1 navigation -->
                            <nav>
                                <!-- Level 1 navigation column 0 -->
                                <div  class="__amegmen--col">
                                    <!-- Level 1 UL/LI -->
                                    <ul>
                                        <li>
                                            <!-- Level 1 anchor -->
                                            <a  href="#">Amet nunc dis Sem</a>
                                            <!-- Level 1 Megamenu panel -->
                                            <section  class="__amegmen--panel">
                                                <!-- Container for Level 1 anchor's landing page url -->
                                                <div  class="__amegmen--landing">
                                                    <!-- Button (on mobile) to go previous menu (level 1) -->
                                                    <button  class="__amegmen--back-cta">Back</button>
                                                    <!-- Level 1 anchor's landing page url -->
                                                    <a  href="#">Landing page: Tempor consectetur gravida Malesuada penatibus Purus</a>
                                                </div>
                                                <!-- Level 2 navigation -->
                                                <nav>
                                                    <!-- Level 2 navigation column -->
                                                    <div  class="__amegmen--col">
                                                        <!-- Level 2 UL/LI/A -->
                                                        <ul>
                                                            <li><a  href="#">Vivamus maecenas ex</a></li>
                                                            <li><a  href="#">Amet vulputate malesuada</a></li>
                                                            <li><a  href="#">Nulla maximus malesuada Magnis metus Etiam</a></li>
                                                            <li><a  href="#">Eget velit elit</a></li>
                                                            <li><a  href="#">Nullam molestie vestibulum In amet In</a></li>
                                                            <li><a  href="#">Neque congue elit Ut</a></li>
                                                            <li><a  href="#">Nisl et lorem Nullam</a></li>
                                                            <li><a  href="#">Nullam fermentum malesuada Ut ac Quam</a></li>
                                                            <li><a  href="#">Erat quam a In mattis</a></li>
                                                        </ul>
                                                    </div>
                                                </nav>
                                            </section>
                                        </li>
                                        . . .
                                    </ul>
                                </div>
                                <!-- Level 1 navigation column 1 -->
                                <div  class="__amegmen--col">
                                    <!-- Level 1 UL/LI -->
                                    <ul>
                                        <li>
                                            <!-- Level 1 anchor -->
                                            <a  href="#">Et elementum gravida Porttitor</a>
                                            <!-- Level 1 Megamenu panel -->
                                            <section  class="__amegmen--panel">
                                                <!-- Container for Level 1 anchor's landing page url -->
                                                <div  class="__amegmen--landing">
                                                    <!-- Button (on mobile) to go previous menu (level 1) -->
                                                    <button  class="__amegmen--back-cta">Back</button>
                                                    <!-- Level 1 anchor's landing page url -->
                                                    <a  href="#">Landing page: Magnis congue vehicula Aliquam turpis</a>
                                                </div>
                                                <!-- Level 2 navigation -->
                                                <nav>
                                                    <!-- Level 2 navigation column -->
                                                    <div  class="__amegmen--col">
                                                        <!-- Level 2 UL/LI/A -->
                                                        <ul>
                                                            <li><a  href="#">Pulvinar consectetur elementum Phasellus dolor</a></li>
                                                            <li><a  href="#">Nullam vivamus turpis Ut</a></li>
                                                            <li><a  href="#">Tempus et proin</a></li>
                                                            <li><a  href="#">Maximus non nunc Porta in</a></li>
                                                            . . .
                                                        </ul>
                                                    </div>
                                                </nav>
                                            </section>
                                        </li>
                                    </ul>
                                </div>
                                <!-- Repeat Level 1 navigation columns -->
                            </nav>
                        </section>
                    </li>
                <!-- Repeat Repeat Level 0 LI -->
            </ul>
        </section>
    </div>
</nav>

JavaScript

var  amegmen_instance = AMegMen.Root.getInstance();
var  amegmen_options = {};
amegmen_instance.init("#__amegmen_root", amegmen_options);

/* You can destroy it as well */
amegmen_instance.destroy("#__amegmen_root");

Options

activeCls - CSS Class Default: active Associated with the root element and its children which get a subnav panel opened or activated

actOnHover - Boolean Default: false Toggles Hover behavior on or after the breakpoint specified by actOnHoverAt

actOnHoverAt - Number Default: 1280 If actOnHover is enabled, Hover behaviour will be activated on or after this breakpoint.

backBtnCls - CSS Class Default: __amegmen--back-cta Associated with the Level 2 Buttons on mobile, which navigates to the Level 1 Menu.

closeBtnCls - CSS Class Default: __amegmen--close-cta Associated with the Button on mobile, which closes the Megamenu.

colCls - CSS Class Default: __amegmen--col Associated with the Columns on Panels at Level 1 and level 2.

focusCls - CSS Class Default: focus Triggered when focus event is fired on related elements.

hoverCls - CSS Class Default: hover Triggered when hover event is fired on related elements.

idPrefix - String Default: __amegmen_id Some elements need an id associated with them for behavior calculation. This is a prefix string for those IDs.

isRTL - Boolean Default: false Changes the direction of the Megamenu to Right to Left. Caution: It uses CSS property direction: rtl

l0AnchorCls - CSS Class Default: __amegmen--anchor-l0 Associated with the links at Level 0

l0PanelCls - CSS Class Default: __amegmen--panel-l0 Associated with the Subnav Panel at Level 0

l1ActiveCls - CSS Class Default: __amegmen--l1-active Associated when the Subnav Panel at Level 0 is active

l1AnchorCls - CSS Class Default: __amegmen--anchor-l1 Associated with the links at Level 1

l1PanelCls - CSS Class Default: __amegmen--panel-l1 Associated with the Subnav Panel at Level 1

l2ActiveCls - CSS Class Default: __amegmen--l2-active Associated when the Subnav Panel at Level 1 is active

l2AnchorCls - CSS Class Default: __amegmen--anchor-l2 Associated with the links at Level 2

landingCtaCls - CSS Class Default: __amegmen--landing Associated with the containers at Level 1 and 2 which contain links to parent links at Level 0 and Level 1 respectively

lastcolCls - CSS Class Default: __amegmen--col-last Associated with the last column at Level 1

mainBtnCls - CSS Class Default: __amegmen--main-cta Associated with the Level 1 Buttons on mobile, which navigates to the Level 0 Menu.

mainElementCls - CSS Class Default: __amegmen--main Associated with the Level 0 main section which contains Level 0 anchors

offcanvasCls - CSS Class Default: __amegmen--canvas Associated with scrollable elements which the scrolling needs to be disabled

overflowHiddenCls - CSS Class Default: __amegmen--nooverflow Associated with scrollable elements which the scrolling needs to be disabled

panelCls - CSS Class Default: __amegmen--panel Associated with the Subnav Panels at Level 1 and Level 2

rootCls - CSS Class Default: __amegmen Associated with the Root Element

rtl_Cls - CSS Class Default: __amegmen--r-to-l Associated with the Root Element, if isRTL is enabled

supportedCols - Number Default: 4 Maximum number of columns associated with Level 1 Subnav Panel

toggleBtnCls - CSS Class Default: __amegmen--toggle-cta Associated with the Button on mobile, which toggles the Megamenu specified by offcanvasCls

Methods

init Parameters: CSS Selector The Root element id or class to be passed to initialize the Megamenu. Example #root, .root

destroy Parameters: CSS Selector The Root element id or class to be passed to destroy the Megamenu. Example #root, .root

License

MIT

Package Sidebar

Install

npm i amegmen

Weekly Downloads

2

Version

1.0.7

License

MIT

Unpacked Size

1.58 MB

Total Files

67

Last publish

Collaborators

  • adityakahb