(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
/**
* MUI CSS/JS main module
* @module main
*/
(function(win) {
'use strict';
// return if library has been loaded already
if (win._muiLoadedJS) return;
else win._muiLoadedJS = true;
// load dependencies
var jqLite = require('src/js/lib/jqLite'),
dropdown = require('src/js/dropdown'),
overlay = require('src/js/overlay'),
ripple = require('src/js/ripple'),
select = require('src/js/select'),
tabs = require('src/js/tabs'),
textfield = require('src/js/textfield');
// expose api
win.mui = {
overlay: overlay,
tabs: tabs.api
};
// init libraries
jqLite.ready(function() {
textfield.initListeners();
select.initListeners();
ripple.initListeners();
dropdown.initListeners();
tabs.initListeners();
});
})(window);
},{"src/js/dropdown":3,"src/js/lib/jqLite":6,"src/js/overlay":8,"src/js/ripple":9,"src/js/select":10,"src/js/tabs":11,"src/js/textfield":12}],2:[function(require,module,exports){
/**
* MUI config module
* @module config
*/
/** Define module API */
module.exports = {
/** Use debug mode */
debug: true
};
},{}],3:[function(require,module,exports){
/**
* MUI CSS/JS dropdown module
* @module dropdowns
*/
'use strict';
var jqLite = require('./lib/jqLite'),
util = require('./lib/util'),
animationHelpers = require('./lib/animationHelpers'),
attrKey = 'data-mui-toggle',
attrSelector = '[data-mui-toggle="dropdown"]',
openClass = 'mui--is-open',
menuClass = 'mui-dropdown__menu';
/**
* Initialize toggle element.
* @param {Element} toggleEl - The toggle element.
*/
function initialize(toggleEl) {
// check flag
if (toggleEl._muiDropdown === true) return;
else toggleEl._muiDropdown = true;
// use type "button" to prevent form submission by default
var tagName = toggleEl.tagName;
if ((tagName === 'INPUT' || tagName === 'BUTTON')
&& !toggleEl.hasAttribute('type')) {
toggleEl.type = 'button';
}
// attach click handler
jqLite.on(toggleEl, 'click', clickHandler);
}
/**
* Handle click events on dropdown toggle element.
* @param {Event} ev - The DOM event
*/
function clickHandler(ev) {
// only left clicks
if (ev.button !== 0) return;
var toggleEl = this;
// exit if toggle button is disabled
if (toggleEl.getAttribute('disabled') !== null) return;
// toggle dropdown
toggleDropdown(toggleEl);
}
/**
* Toggle the dropdown.
* @param {Element} toggleEl - The dropdown toggle element.
*/
function toggleDropdown(toggleEl) {
var wrapperEl = toggleEl.parentNode,
menuEl = toggleEl.nextElementSibling,
doc = wrapperEl.ownerDocument;
// exit if no menu element
if (!menuEl || !jqLite.hasClass(menuEl, menuClass)) {
return util.raiseError('Dropdown menu element not found');
}
// method to close dropdown
function closeDropdownFn() {
jqLite.removeClass(menuEl, openClass);
// remove event handlers
jqLite.off(doc, 'click', closeDropdownFn);
jqLite.off(doc, 'keydown', handleKeyDownFn);
}
// close dropdown on escape key press
function handleKeyDownFn(ev) {
var key = ev.key;
if (key === 'Escape' || key === 'Esc') closeDropdownFn();
}
// method to open dropdown
function openDropdownFn() {
// position menu element below toggle button
var wrapperRect = wrapperEl.getBoundingClientRect(),
toggleRect = toggleEl.getBoundingClientRect();
var top = toggleRect.top - wrapperRect.top + toggleRect.height;
jqLite.css(menuEl, 'top', top + 'px');
// add open class to wrapper
jqLite.addClass(menuEl, openClass);
setTimeout(function() {
// close dropdown when user clicks outside of menu or hits escape key
jqLite.on(doc, 'click', closeDropdownFn);
jqLite.on(doc, 'keydown', handleKeyDownFn);
}, 0);
}
// toggle dropdown
if (jqLite.hasClass(menuEl, openClass)) closeDropdownFn();
else openDropdownFn();
}
/** Define module API */
module.exports = {
/** Initialize module listeners */
initListeners: function() {
// markup elements available when method is called
var elList = document.querySelectorAll(attrSelector),
i = elList.length;
while (i--) {initialize(elList[i]);}
// listen for new elements
animationHelpers.onAnimationStart('mui-dropdown-inserted', function(ev) {
initialize(ev.target);
});
}
};
},{"./lib/animationHelpers":4,"./lib/jqLite":6,"./lib/util":7}],4:[function(require,module,exports){
/**
* MUI CSS/JS animation helper module
* @module lib/animationHelpers
*/
'use strict';
var jqLite = require('./jqLite'),
util = require('./util'),
animationEvents = 'animationstart mozAnimationStart webkitAnimationStart',
animationCallbacks = {};
/**
* Register callbacks
* @param {String} name - The animation name
* @param {Function} callbackFn = The callback function
*/
function onAnimationStartFn(name, callbackFn) {
// get/set callback function
var callbacks = animationCallbacks[name];
if (!callbacks) callbacks = animationCallbacks[name] = [];
callbacks.push(callbackFn);
// initialize listeners
if (!this.init) {
// add css classes
loadCss();
// add listener
jqLite.on(document, animationEvents, animationStartHandler, true);
// set flag
this.init = true;
}
}
/**
* Animation start handler
* @param {Event} ev - The DOM event
*/
function animationStartHandler(ev) {
var callbacks = animationCallbacks[ev.animationName] || [],
i = callbacks.length;
// exit if a callback hasn't been registered
if (!i) return;
// stop other callbacks from firing
ev.stopImmediatePropagation();
// iterate through callbacks
while (i--) callbacks[i](ev);
}
/**
* Load animation css
*/
function loadCss() {
// define rules
var rules = [
['.mui-btn', 'mui-btn-inserted'],
['[data-mui-toggle="dropdown"]', 'mui-dropdown-inserted'],
[
'.mui-btn[data-mui-toggle="dropdown"]',
'mui-btn-inserted,mui-dropdown-inserted'
],
['[data-mui-toggle="tab"]', 'mui-tab-inserted'],
['.mui-textfield > input', 'mui-textfield-inserted'],
['.mui-textfield > textarea', 'mui-textfield-inserted'],
['.mui-select > select', 'mui-select-inserted'],
['.mui-select > select ~ .mui-event-trigger', 'mui-node-inserted'],
['.mui-select > select:disabled ~ .mui-event-trigger', 'mui-node-disabled']
];
// build css
var css = '',
rule;
for (var i=0, m=rules.length; i < m; i++) {
rule = rules[i];
css += '@keyframes ' + rule[1];
css += '{from{transform:none;}to{transform:none;}}';
css += rule[0];
css += '{animation-duration:0.0001s;animation-name:' + rule[1] + ';}';
}
// add CSS to DOM
util.loadStyle(css);
}
/**
* Define module API
*/
module.exports = {
animationEvents: animationEvents,
onAnimationStart: onAnimationStartFn
}
},{"./jqLite":6,"./util":7}],5:[function(require,module,exports){
/**
* MUI CSS/JS form helpers module
* @module lib/forms.py
*/
'use strict';
var jqLite = require('./jqLite');
/**
* Menu position/size/scroll helper
* @returns {Object} Object with keys 'height', 'top', 'scrollTop'
*/
function getMenuPositionalCSSFn(wrapperEl, menuEl, selectedRow) {
var viewHeight = document.documentElement.clientHeight,
numRows = menuEl.children.length;
// determine menu height
var h = parseInt(menuEl.offsetHeight),
height = Math.min(h, viewHeight);
// determine row height
var p