govlab-styleguide
Version:
A styleguide / lightweight frontend framework for GovLab websites
107 lines (90 loc) • 2.66 kB
JavaScript
/**
* ResponsiveToggle module.
* @module foundation.responsiveToggle
* @requires foundation.util.mediaQuery
*/
!function($, Foundation) {
'use strict';
/**
* Creates a new instance of Tab Bar.
* @class
* @fires ResponsiveToggle#init
* @param {jQuery} element - jQuery object to attach tab bar functionality to.
* @param {Object} options - Overrides to the default plugin settings.
*/
function ResponsiveToggle(element, options) {
this.$element = $(element);
this.options = $.extend({}, ResponsiveToggle.defaults, this.$element.data(), options);
this._init();
this._events();
Foundation.registerPlugin(this, 'ResponsiveToggle');
}
ResponsiveToggle.defaults = {
/**
* The breakpoint after which the menu is always shown, and the tab bar is hidden.
* @option
* @example 'medium'
*/
hideFor: 'medium'
};
/**
* Initializes the tab bar by finding the target element, toggling element, and running update().
* @function
* @private
*/
ResponsiveToggle.prototype._init = function() {
var targetID = this.$element.data('responsive-toggle');
if (!targetID) {
console.error('Your tab bar needs an ID of a Menu as the value of data-tab-bar.');
}
this.$targetMenu = $('#'+targetID);
this.$toggler = this.$element.find('[data-toggle]');
this._update();
};
/**
* Adds necessary event handlers for the tab bar to work.
* @function
* @private
*/
ResponsiveToggle.prototype._events = function() {
var _this = this;
$(window).on('changed.zf.mediaquery', this._update.bind(this));
this.$toggler.on('click.zf.responsiveToggle', this.toggleMenu.bind(this));
};
/**
* Checks the current media query to determine if the tab bar should be visible or hidden.
* @function
* @private
*/
ResponsiveToggle.prototype._update = function() {
// Mobile
if (!Foundation.MediaQuery.atLeast(this.options.hideFor)) {
this.$element.show();
this.$targetMenu.hide();
}
// Desktop
else {
this.$element.hide();
this.$targetMenu.show();
}
};
/**
* Toggles the element attached to the tab bar. The toggle only happens if the screen is small enough to allow it.
* @function
* @fires ResponsiveToggle#toggled
*/
ResponsiveToggle.prototype.toggleMenu = function() {
if (!Foundation.MediaQuery.atLeast(this.options.hideFor)) {
this.$targetMenu.toggle(0);
/**
* Fires when the element attached to the tab bar toggles.
* @event ResponsiveToggle#toggled
*/
this.$element.trigger('toggled.zf.responsiveToggle');
}
};
ResponsiveToggle.prototype.destroy = function(){
//TODO this...
};
Foundation.plugin(ResponsiveToggle, 'ResponsiveToggle');
}(jQuery, Foundation);