{"version":3,"sources":["slinky.js"],"names":["Slinky","element","options","arguments","length","undefined","_classCallCheck","this","settings","_objectSpread","resize","speed","theme","title","menu","jQuery","base","children","first","addClass","_transition","prev","prepend","back","prop","wrapInner","each","index","label","find","text","append","_addListeners","_jumpToInitial","_this","e","_clicked","Date","now","link","currentTarget","preventDefault","indexOf","hasClass","removeClass","next","show","_move","parent","parentsUntil","active","jump","depth","setTimeout","callback","height","outerHeight","content","left","Math","round","parseInt","get","style","css","concat","animate","to","target","count","menus","hide","_resize","parents","not","_this2","styles","attr","fields","forEach","off","transition-duration","contents","split","field","fn","slinky"],"mappings":"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","file":"slinky.min.js","sourcesContent":["/*\n * Slinky\n * Rather sweetmenus\n * @author Ali Zahid \n * @license MIT\n */\n\nclass Slinky {\n // default options\n get options() {\n return {\n resize: true,\n speed: 300,\n theme: 'slinky-theme-default',\n title: false\n }\n }\n\n constructor(element, options = {}) {\n // save settings\n this.settings = {\n ...this.options,\n ...options\n }\n\n // let's go!\n this._init(element)\n }\n\n // setup the DOM just for us\n _init(element) {\n // the two elements of water and moisture\n this.menu = jQuery(element)\n this.base = this.menu.children().first()\n\n const { base, menu, settings } = this\n\n // set theme\n menu.addClass('slinky-menu').addClass(settings.theme)\n\n // set transition speed\n this._transition(settings.speed)\n\n // add arrows to links with children\n jQuery('a + ul', menu)\n .prev()\n .addClass('next')\n\n // wrap link text with \n // mostly for styling\n jQuery('li > a', menu).wrapInner('')\n\n // create header item\n const header = jQuery('
  • ').addClass('header')\n\n // prepend it to the list\n jQuery('li > ul', menu).prepend(header)\n\n // create back buttons\n const back = jQuery('')\n .prop('href', '#')\n .addClass('back')\n\n // prepend them to the headers\n jQuery('.header', menu).prepend(back)\n\n // do we need to add titles?\n if (settings.title) {\n // loop through each child list\n jQuery('li > ul', menu).each((index, element) => {\n // get the label from the parent link\n const label = jQuery(element)\n .parent()\n .find('a')\n .first()\n .text()\n\n // if it's not empty, create the title\n if (label) {\n const title = jQuery('
    ')\n .addClass('title')\n .text(label)\n\n // append it to the immediate header\n jQuery('> .header', element).append(title)\n }\n })\n }\n\n // add click listeners\n this._addListeners()\n\n // jump to initial active\n this._jumpToInitial()\n }\n\n // click listeners\n _addListeners() {\n const { menu, settings } = this\n\n jQuery('a', menu).on('click', e => {\n // prevent broken/half transitions\n if (this._clicked + settings.speed > Date.now()) {\n return false\n }\n\n // cache click time to check on next click\n this._clicked = Date.now()\n\n // get the link\n const link = jQuery(e.currentTarget)\n\n // prevent default if it's a hash\n // or a Slinky button\n if (\n link.attr('href').indexOf('#') === 0 ||\n link.hasClass('next') ||\n link.hasClass('back')\n ) {\n e.preventDefault()\n }\n\n // time to move\n if (link.hasClass('next')) {\n // one step forward\n\n // remove the current active\n menu.find('.active').removeClass('active')\n\n // set the new active\n link\n .next()\n .show()\n .addClass('active')\n\n // make the chess move\n this._move(1)\n\n // resize the menu if need be\n if (settings.resize) {\n this._resize(link.next())\n }\n } else if (link.hasClass('back')) {\n // and two steps back\n // just one step back, actually\n\n // make the move\n this._move(-1, () => {\n // remove the current active\n menu.find('.active').removeClass('active')\n\n // set the new active\n link\n .parent()\n .parent()\n .hide()\n .parentsUntil(menu, 'ul')\n .first()\n .addClass('active')\n })\n\n // resize the menu if need be\n if (settings.resize) {\n this._resize(\n link\n .parent()\n .parent()\n .parentsUntil(menu, 'ul')\n )\n }\n }\n })\n }\n\n // jump to initial active on init\n _jumpToInitial() {\n const { menu, settings } = this\n\n // get initial active\n const active = menu.find('.active')\n\n if (active.length > 0) {\n // remove initial active\n active.removeClass('active')\n\n // jump without animation\n this.jump(active, false)\n }\n\n // set initial height on the menu\n // to fix the first transition resize bug\n setTimeout(() => menu.height(menu.outerHeight()), settings.speed)\n }\n\n // slide the menu\n _move(depth = 0, callback = () => {}) {\n // don't bother packing if we're not going anywhere\n if (depth === 0) {\n return\n }\n\n const { settings, base } = this\n\n // get current position from the left\n const left = Math.round(parseInt(base.get(0).style.left)) || 0\n\n // set the new position from the left\n base.css('left', `${left - depth * 100}%`)\n\n // callback after the animation\n if (typeof callback === 'function') {\n setTimeout(callback, settings.speed)\n }\n }\n\n // resize the menu\n // to match content height\n _resize(content) {\n const { menu } = this\n\n menu.height(content.outerHeight())\n }\n\n // set the transition speed\n _transition(speed = 300) {\n const { menu, base } = this\n\n menu.css('transition-duration', `${speed}ms`)\n base.css('transition-duration', `${speed}ms`)\n }\n\n // jump to an element\n jump(target, animate = true) {\n if (!target) {\n return\n }\n\n const { menu, settings } = this\n\n const to = jQuery(target)\n\n // get all current active\n const active = menu.find('.active')\n\n // how many moves must we jump?\n let count = 0\n\n // this many\n // until we reach the parent list\n if (active.length > 0) {\n count = active.parentsUntil(menu, 'ul').length\n }\n\n // remove current active\n // hide all lists\n menu\n .find('ul')\n .removeClass('active')\n .hide()\n\n // get parent list\n const menus = to.parentsUntil(menu, 'ul')\n\n // show parent list\n menus.show()\n\n //\n to.show().addClass('active')\n\n // set transition speed to 0 if no animation\n if (!animate) {\n this._transition(0)\n }\n\n // make the checkers move\n this._move(menus.length - count)\n\n // resize menu if need be\n if (settings.resize) {\n this._resize(to)\n }\n\n // set transition speed to default after transition\n if (!animate) {\n this._transition(settings.speed)\n }\n }\n\n // go big or go home\n // just go home\n home(animate = true) {\n const { base, menu, settings } = this\n\n // set transition speed to 0 if no animation\n if (!animate) {\n this._transition(0)\n }\n\n // get current active\n const active = menu.find('.active')\n\n // get all parent lists\n const parents = active.parentsUntil(menu, 'ul')\n\n // make the move\n this._move(-parents.length, () => {\n // remove the current active\n active.removeClass('active').hide()\n\n // hide all parents except base\n parents.not(base).hide()\n })\n\n // resize if need be\n if (settings.resize) {\n this._resize(base)\n }\n\n // set transition speed back to default\n if (animate === false) {\n this._transition(settings.speed)\n }\n }\n\n // crush, kill, destroy\n destroy() {\n const { base, menu } = this\n\n // remove all headers\n jQuery('.header', menu).remove()\n\n // remove Slinky links\n // and click listeners\n jQuery('a', menu)\n .removeClass('next')\n .off('click')\n\n // remove inline styles\n menu.css({\n height: '',\n 'transition-duration': ''\n })\n\n base.css({\n left: '',\n 'transition-duration': ''\n })\n\n // remove Slinky HTML\n jQuery('li > a > span', menu)\n .contents()\n .unwrap()\n\n // remove any current active\n menu.find('.active').removeClass('active')\n\n // remove any Slinky style classes\n const styles = menu.attr('class').split(' ')\n\n styles.forEach(style => {\n if (style.indexOf('slinky') === 0) {\n menu.removeClass(style)\n }\n })\n\n // reset fields\n const fields = ['settings', 'menu', 'base']\n\n fields.forEach(field => delete this[field])\n }\n}\n\n// jQuery plugin\n;($ => {\n $.fn.slinky = function(options) {\n const menu = new Slinky(this, options)\n\n return menu\n }\n})(jQuery)\n"]}