/******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // identity function for calling harmony imports with the correct context /******/ __webpack_require__.i = function(value) { return value; }; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 99); /******/ }) /************************************************************************/ /******/ ({ /***/ 0: /***/ (function(module, exports) { module.exports = jQuery; /***/ }), /***/ 1: /***/ (function(module, exports) { module.exports = {Foundation: window.Foundation}; /***/ }), /***/ 11: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Positionable; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_util_box__ = __webpack_require__(8); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_util_box___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_util_box__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_plugin__ = __webpack_require__(2); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_plugin___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_plugin__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_core__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_core__); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var POSITIONS = ['left', 'right', 'top', 'bottom']; var VERTICAL_ALIGNMENTS = ['top', 'bottom', 'center']; var HORIZONTAL_ALIGNMENTS = ['left', 'right', 'center']; var ALIGNMENTS = { 'left': VERTICAL_ALIGNMENTS, 'right': VERTICAL_ALIGNMENTS, 'top': HORIZONTAL_ALIGNMENTS, 'bottom': HORIZONTAL_ALIGNMENTS }; function nextItem(item, array) { var currentIdx = array.indexOf(item); if (currentIdx === array.length - 1) { return array[0]; } else { return array[currentIdx + 1]; } } var Positionable = function (_Plugin) { _inherits(Positionable, _Plugin); function Positionable() { _classCallCheck(this, Positionable); return _possibleConstructorReturn(this, (Positionable.__proto__ || Object.getPrototypeOf(Positionable)).apply(this, arguments)); } _createClass(Positionable, [{ key: '_init', /** * Abstract class encapsulating the tether-like explicit positioning logic * including repositioning based on overlap. * Expects classes to define defaults for vOffset, hOffset, position, * alignment, allowOverlap, and allowBottomOverlap. They can do this by * extending the defaults, or (for now recommended due to the way docs are * generated) by explicitly declaring them. * **/ value: function _init() { this.triedPositions = {}; this.position = this.options.position === 'auto' ? this._getDefaultPosition() : this.options.position; this.alignment = this.options.alignment === 'auto' ? this._getDefaultAlignment() : this.options.alignment; } }, { key: '_getDefaultPosition', value: function _getDefaultPosition() { return 'bottom'; } }, { key: '_getDefaultAlignment', value: function _getDefaultAlignment() { switch (this.position) { case 'bottom': case 'top': return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__foundation_util_core__["rtl"])() ? 'right' : 'left'; case 'left': case 'right': return 'bottom'; } } /** * Adjusts the positionable possible positions by iterating through alignments * and positions. * @function * @private */ }, { key: '_reposition', value: function _reposition() { if (this._alignmentsExhausted(this.position)) { this.position = nextItem(this.position, POSITIONS); this.alignment = ALIGNMENTS[this.position][0]; } else { this._realign(); } } /** * Adjusts the dropdown pane possible positions by iterating through alignments * on the current position. * @function * @private */ }, { key: '_realign', value: function _realign() { this._addTriedPosition(this.position, this.alignment); this.alignment = nextItem(this.alignment, ALIGNMENTS[this.position]); } }, { key: '_addTriedPosition', value: function _addTriedPosition(position, alignment) { this.triedPositions[position] = this.triedPositions[position] || []; this.triedPositions[position].push(alignment); } }, { key: '_positionsExhausted', value: function _positionsExhausted() { var isExhausted = true; for (var i = 0; i < POSITIONS.length; i++) { isExhausted = isExhausted && this._alignmentsExhausted(POSITIONS[i]); } return isExhausted; } }, { key: '_alignmentsExhausted', value: function _alignmentsExhausted(position) { return this.triedPositions[position] && this.triedPositions[position].length == ALIGNMENTS[position].length; } // When we're trying to center, we don't want to apply offset that's going to // take us just off center, so wrap around to return 0 for the appropriate // offset in those alignments. TODO: Figure out if we want to make this // configurable behavior... it feels more intuitive, especially for tooltips, but // it's possible someone might actually want to start from center and then nudge // slightly off. }, { key: '_getVOffset', value: function _getVOffset() { return this.options.vOffset; } }, { key: '_getHOffset', value: function _getHOffset() { return this.options.hOffset; } }, { key: '_setPosition', value: function _setPosition($anchor, $element, $parent) { if ($anchor.attr('aria-expanded') === 'false') { return false; } var $eleDims = __WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["Box"].GetDimensions($element), $anchorDims = __WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["Box"].GetDimensions($anchor); $element.offset(__WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["Box"].GetExplicitOffsets($element, $anchor, this.position, this.alignment, this._getVOffset(), this._getHOffset())); if (!this.options.allowOverlap) { var overlaps = {}; var minOverlap = 100000000; // default coordinates to how we start, in case we can't figure out better var minCoordinates = { position: this.position, alignment: this.alignment }; while (!this._positionsExhausted()) { var overlap = __WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["Box"].OverlapArea($element, $parent, false, false, this.options.allowBottomOverlap); if (overlap === 0) { return; } if (overlap < minOverlap) { minOverlap = overlap; minCoordinates = { position: this.position, alignment: this.alignment }; } this._reposition(); $element.offset(__WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["Box"].GetExplicitOffsets($element, $anchor, this.position, this.alignment, this._getVOffset(), this._getHOffset())); } // If we get through the entire loop, there was no non-overlapping // position available. Pick the version with least overlap. this.position = minCoordinates.position; this.alignment = minCoordinates.alignment; $element.offset(__WEBPACK_IMPORTED_MODULE_0__foundation_util_box__["Box"].GetExplicitOffsets($element, $anchor, this.position, this.alignment, this._getVOffset(), this._getHOffset())); } } }]); return Positionable; }(__WEBPACK_IMPORTED_MODULE_1__foundation_plugin__["Plugin"]); Positionable.defaults = { /** * Position of positionable relative to anchor. Can be left, right, bottom, top, or auto. * @option * @type {string} * @default 'auto' */ position: 'auto', /** * Alignment of positionable relative to anchor. Can be left, right, bottom, top, center, or auto. * @option * @type {string} * @default 'auto' */ alignment: 'auto', /** * Allow overlap of container/window. If false, dropdown positionable first * try to position as defined by data-position and data-alignment, but * reposition if it would cause an overflow. * @option * @type {boolean} * @default false */ allowOverlap: false, /** * Allow overlap of only the bottom of the container. This is the most common * behavior for dropdowns, allowing the dropdown to extend the bottom of the * screen but not otherwise influence or break out of the container. * @option * @type {boolean} * @default true */ allowBottomOverlap: true, /** * Number of pixels the positionable should be separated vertically from anchor * @option * @type {number} * @default 0 */ vOffset: 0, /** * Number of pixels the positionable should be separated horizontally from anchor * @option * @type {number} * @default 0 */ hOffset: 0 }; /***/ }), /***/ 2: /***/ (function(module, exports) { module.exports = {Plugin: window.Foundation.Plugin}; /***/ }), /***/ 3: /***/ (function(module, exports) { module.exports = {rtl: window.Foundation.rtl, GetYoDigits: window.Foundation.GetYoDigits, transitionend: window.Foundation.transitionend}; /***/ }), /***/ 33: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__foundation_core__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_tooltip__ = __webpack_require__(63); __WEBPACK_IMPORTED_MODULE_0__foundation_core__["Foundation"].plugin(__WEBPACK_IMPORTED_MODULE_1__foundation_tooltip__["a" /* Tooltip */], 'Tooltip'); /***/ }), /***/ 4: /***/ (function(module, exports) { module.exports = {Motion: window.Foundation.Motion, Move: window.Foundation.Move}; /***/ }), /***/ 6: /***/ (function(module, exports) { module.exports = {MediaQuery: window.Foundation.MediaQuery}; /***/ }), /***/ 63: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Tooltip; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_core__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_core___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__ = __webpack_require__(6); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation_util_triggers__ = __webpack_require__(7); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__foundation_positionable__ = __webpack_require__(11); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** * Tooltip module. * @module foundation.tooltip * @requires foundation.util.box * @requires foundation.util.mediaQuery * @requires foundation.util.triggers */ var Tooltip = function (_Positionable) { _inherits(Tooltip, _Positionable); function Tooltip() { _classCallCheck(this, Tooltip); return _possibleConstructorReturn(this, (Tooltip.__proto__ || Object.getPrototypeOf(Tooltip)).apply(this, arguments)); } _createClass(Tooltip, [{ key: '_setup', /** * Creates a new instance of a Tooltip. * @class * @name Tooltip * @fires Tooltip#init * @param {jQuery} element - jQuery object to attach a tooltip to. * @param {Object} options - object to extend the default configuration. */ value: function _setup(element, options) { this.$element = element; this.options = __WEBPACK_IMPORTED_MODULE_0_jquery___default.a.extend({}, Tooltip.defaults, this.$element.data(), options); this.className = 'Tooltip'; // ie9 back compat this.isActive = false; this.isClick = false; // Triggers init is idempotent, just need to make sure it is initialized __WEBPACK_IMPORTED_MODULE_3__foundation_util_triggers__["a" /* Triggers */].init(__WEBPACK_IMPORTED_MODULE_0_jquery___default.a); this._init(); } /** * Initializes the tooltip by setting the creating the tip element, adding it's text, setting private variables and setting attributes on the anchor. * @private */ }, { key: '_init', value: function _init() { __WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__["MediaQuery"]._init(); var elemId = this.$element.attr('aria-describedby') || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__foundation_util_core__["GetYoDigits"])(6, 'tooltip'); this.options.tipText = this.options.tipText || this.$element.attr('title'); this.template = this.options.template ? __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this.options.template) : this._buildTemplate(elemId); if (this.options.allowHtml) { this.template.appendTo(document.body).html(this.options.tipText).hide(); } else { this.template.appendTo(document.body).text(this.options.tipText).hide(); } this.$element.attr({ 'title': '', 'aria-describedby': elemId, 'data-yeti-box': elemId, 'data-toggle': elemId, 'data-resize': elemId }).addClass(this.options.triggerClass); _get(Tooltip.prototype.__proto__ || Object.getPrototypeOf(Tooltip.prototype), '_init', this).call(this); this._events(); } }, { key: '_getDefaultPosition', value: function _getDefaultPosition() { // handle legacy classnames var position = this.$element[0].className.match(/\b(top|left|right|bottom)\b/g); return position ? position[0] : 'top'; } }, { key: '_getDefaultAlignment', value: function _getDefaultAlignment() { return 'center'; } }, { key: '_getHOffset', value: function _getHOffset() { if (this.position === 'left' || this.position === 'right') { return this.options.hOffset + this.options.tooltipWidth; } else { return this.options.hOffset; } } }, { key: '_getVOffset', value: function _getVOffset() { if (this.position === 'top' || this.position === 'bottom') { return this.options.vOffset + this.options.tooltipHeight; } else { return this.options.vOffset; } } /** * builds the tooltip element, adds attributes, and returns the template. * @private */ }, { key: '_buildTemplate', value: function _buildTemplate(id) { var templateClasses = (this.options.tooltipClass + ' ' + this.options.positionClass + ' ' + this.options.templateClasses).trim(); var $template = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('
').addClass(templateClasses).attr({ 'role': 'tooltip', 'aria-hidden': true, 'data-is-active': false, 'data-is-focus': false, 'id': id }); return $template; } /** * sets the position class of an element and recursively calls itself until there are no more possible positions to attempt, or the tooltip element is no longer colliding. * if the tooltip is larger than the screen width, default to full width - any user selected margin * @private */ }, { key: '_setPosition', value: function _setPosition() { _get(Tooltip.prototype.__proto__ || Object.getPrototypeOf(Tooltip.prototype), '_setPosition', this).call(this, this.$element, this.template); } /** * reveals the tooltip, and fires an event to close any other open tooltips on the page * @fires Tooltip#closeme * @fires Tooltip#show * @function */ }, { key: 'show', value: function show() { if (this.options.showOn !== 'all' && !__WEBPACK_IMPORTED_MODULE_2__foundation_util_mediaQuery__["MediaQuery"].is(this.options.showOn)) { // console.error('The screen is too small to display this tooltip'); return false; } var _this = this; this.template.css('visibility', 'hidden').show(); this._setPosition(); this.template.removeClass('top bottom left right').addClass(this.position); this.template.removeClass('align-top align-bottom align-left align-right align-center').addClass('align-' + this.alignment); /** * Fires to close all other open tooltips on the page * @event Closeme#tooltip */ this.$element.trigger('closeme.zf.tooltip', this.template.attr('id')); this.template.attr({ 'data-is-active': true, 'aria-hidden': false }); _this.isActive = true; // console.log(this.template); this.template.stop().hide().css('visibility', '').fadeIn(this.options.fadeInDuration, function () { //maybe do stuff? }); /** * Fires when the tooltip is shown * @event Tooltip#show */ this.$element.trigger('show.zf.tooltip'); } /** * Hides the current tooltip, and resets the positioning class if it was changed due to collision * @fires Tooltip#hide * @function */ }, { key: 'hide', value: function hide() { // console.log('hiding', this.$element.data('yeti-box')); var _this = this; this.template.stop().attr({ 'aria-hidden': true, 'data-is-active': false }).fadeOut(this.options.fadeOutDuration, function () { _this.isActive = false; _this.isClick = false; }); /** * fires when the tooltip is hidden * @event Tooltip#hide */ this.$element.trigger('hide.zf.tooltip'); } /** * adds event listeners for the tooltip and its anchor * TODO combine some of the listeners like focus and mouseenter, etc. * @private */ }, { key: '_events', value: function _events() { var _this = this; var $template = this.template; var isFocus = false; if (!this.options.disableHover) { this.$element.on('mouseenter.zf.tooltip', function (e) { if (!_this.isActive) { _this.timeout = setTimeout(function () { _this.show(); }, _this.options.hoverDelay); } }).on('mouseleave.zf.tooltip', function (e) { clearTimeout(_this.timeout); if (!isFocus || _this.isClick && !_this.options.clickOpen) { _this.hide(); } }); } if (this.options.clickOpen) { this.$element.on('mousedown.zf.tooltip', function (e) { e.stopImmediatePropagation(); if (_this.isClick) { //_this.hide(); // _this.isClick = false; } else { _this.isClick = true; if ((_this.options.disableHover || !_this.$element.attr('tabindex')) && !_this.isActive) { _this.show(); } } }); } else { this.$element.on('mousedown.zf.tooltip', function (e) { e.stopImmediatePropagation(); _this.isClick = true; }); } if (!this.options.disableForTouch) { this.$element.on('tap.zf.tooltip touchend.zf.tooltip', function (e) { _this.isActive ? _this.hide() : _this.show(); }); } this.$element.on({ // 'toggle.zf.trigger': this.toggle.bind(this), // 'close.zf.trigger': this.hide.bind(this) 'close.zf.trigger': this.hide.bind(this) }); this.$element.on('focus.zf.tooltip', function (e) { isFocus = true; if (_this.isClick) { // If we're not showing open on clicks, we need to pretend a click-launched focus isn't // a real focus, otherwise on hover and come back we get bad behavior if (!_this.options.clickOpen) { isFocus = false; } return false; } else { _this.show(); } }).on('focusout.zf.tooltip', function (e) { isFocus = false; _this.isClick = false; _this.hide(); }).on('resizeme.zf.trigger', function () { if (_this.isActive) { _this._setPosition(); } }); } /** * adds a toggle method, in addition to the static show() & hide() functions * @function */ }, { key: 'toggle', value: function toggle() { if (this.isActive) { this.hide(); } else { this.show(); } } /** * Destroys an instance of tooltip, removes template element from the view. * @function */ }, { key: '_destroy', value: function _destroy() { this.$element.attr('title', this.template.text()).off('.zf.trigger .zf.tooltip').removeClass('has-tip top right left').removeAttr('aria-describedby aria-haspopup data-disable-hover data-resize data-toggle data-tooltip data-yeti-box'); this.template.remove(); } }]); return Tooltip; }(__WEBPACK_IMPORTED_MODULE_4__foundation_positionable__["a" /* Positionable */]); Tooltip.defaults = { disableForTouch: false, /** * Time, in ms, before a tooltip should open on hover. * @option * @type {number} * @default 200 */ hoverDelay: 200, /** * Time, in ms, a tooltip should take to fade into view. * @option * @type {number} * @default 150 */ fadeInDuration: 150, /** * Time, in ms, a tooltip should take to fade out of view. * @option * @type {number} * @default 150 */ fadeOutDuration: 150, /** * Disables hover events from opening the tooltip if set to true * @option * @type {boolean} * @default false */ disableHover: false, /** * Optional addtional classes to apply to the tooltip template on init. * @option * @type {string} * @default '' */ templateClasses: '', /** * Non-optional class added to tooltip templates. Foundation default is 'tooltip'. * @option * @type {string} * @default 'tooltip' */ tooltipClass: 'tooltip', /** * Class applied to the tooltip anchor element. * @option * @type {string} * @default 'has-tip' */ triggerClass: 'has-tip', /** * Minimum breakpoint size at which to open the tooltip. * @option * @type {string} * @default 'small' */ showOn: 'small', /** * Custom template to be used to generate markup for tooltip. * @option * @type {string} * @default '' */ template: '', /** * Text displayed in the tooltip template on open. * @option * @type {string} * @default '' */ tipText: '', touchCloseText: 'Tap to close.', /** * Allows the tooltip to remain open if triggered with a click or touch event. * @option * @type {boolean} * @default true */ clickOpen: true, /** * DEPRECATED Additional positioning classes, set by the JS * @option * @type {string} * @default '' */ positionClass: '', /** * Position of tooltip. Can be left, right, bottom, top, or auto. * @option * @type {string} * @default 'auto' */ position: 'auto', /** * Alignment of tooltip relative to anchor. Can be left, right, bottom, top, center, or auto. * @option * @type {string} * @default 'auto' */ alignment: 'auto', /** * Allow overlap of container/window. If false, tooltip will first try to * position as defined by data-position and data-alignment, but reposition if * it would cause an overflow. @option * @type {boolean} * @default false */ allowOverlap: false, /** * Allow overlap of only the bottom of the container. This is the most common * behavior for dropdowns, allowing the dropdown to extend the bottom of the * screen but not otherwise influence or break out of the container. * Less common for tooltips. * @option * @type {boolean} * @default false */ allowBottomOverlap: false, /** * Distance, in pixels, the template should push away from the anchor on the Y axis. * @option * @type {number} * @default 0 */ vOffset: 0, /** * Distance, in pixels, the template should push away from the anchor on the X axis * @option * @type {number} * @default 0 */ hOffset: 0, /** * Distance, in pixels, the template spacing auto-adjust for a vertical tooltip * @option * @type {number} * @default 14 */ tooltipHeight: 14, /** * Distance, in pixels, the template spacing auto-adjust for a horizontal tooltip * @option * @type {number} * @default 12 */ tooltipWidth: 12, /** * Allow HTML in tooltip. Warning: If you are loading user-generated content into tooltips, * allowing HTML may open yourself up to XSS attacks. * @option * @type {boolean} * @default false */ allowHtml: false }; /** * TODO utilize resize event trigger */ /***/ }), /***/ 7: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Triggers; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__ = __webpack_require__(4); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__); var MutationObserver = function () { var prefixes = ['WebKit', 'Moz', 'O', 'Ms', '']; for (var i = 0; i < prefixes.length; i++) { if (prefixes[i] + 'MutationObserver' in window) { return window[prefixes[i] + 'MutationObserver']; } } return false; }(); var triggers = function (el, type) { el.data(type).split(' ').forEach(function (id) { __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#' + id)[type === 'close' ? 'trigger' : 'triggerHandler'](type + '.zf.trigger', [el]); }); }; var Triggers = { Listeners: { Basic: {}, Global: {} }, Initializers: {} }; Triggers.Listeners.Basic = { openListener: function () { triggers(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this), 'open'); }, closeListener: function () { var id = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).data('close'); if (id) { triggers(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this), 'close'); } else { __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).trigger('close.zf.trigger'); } }, toggleListener: function () { var id = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).data('toggle'); if (id) { triggers(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this), 'toggle'); } else { __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).trigger('toggle.zf.trigger'); } }, closeableListener: function (e) { e.stopPropagation(); var animation = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).data('closable'); if (animation !== '') { __WEBPACK_IMPORTED_MODULE_1__foundation_util_motion__["Motion"].animateOut(__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this), animation, function () { __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).trigger('closed.zf'); }); } else { __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).fadeOut().trigger('closed.zf'); } }, toggleFocusListener: function () { var id = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).data('toggle-focus'); __WEBPACK_IMPORTED_MODULE_0_jquery___default()('#' + id).triggerHandler('toggle.zf.trigger', [__WEBPACK_IMPORTED_MODULE_0_jquery___default()(this)]); } }; // Elements with [data-open] will reveal a plugin that supports it when clicked. Triggers.Initializers.addOpenListener = function ($elem) { $elem.off('click.zf.trigger', Triggers.Listeners.Basic.openListener); $elem.on('click.zf.trigger', '[data-open]', Triggers.Listeners.Basic.openListener); }; // Elements with [data-close] will close a plugin that supports it when clicked. // If used without a value on [data-close], the event will bubble, allowing it to close a parent component. Triggers.Initializers.addCloseListener = function ($elem) { $elem.off('click.zf.trigger', Triggers.Listeners.Basic.closeListener); $elem.on('click.zf.trigger', '[data-close]', Triggers.Listeners.Basic.closeListener); }; // Elements with [data-toggle] will toggle a plugin that supports it when clicked. Triggers.Initializers.addToggleListener = function ($elem) { $elem.off('click.zf.trigger', Triggers.Listeners.Basic.toggleListener); $elem.on('click.zf.trigger', '[data-toggle]', Triggers.Listeners.Basic.toggleListener); }; // Elements with [data-closable] will respond to close.zf.trigger events. Triggers.Initializers.addCloseableListener = function ($elem) { $elem.off('close.zf.trigger', Triggers.Listeners.Basic.closeableListener); $elem.on('close.zf.trigger', '[data-closeable], [data-closable]', Triggers.Listeners.Basic.closeableListener); }; // Elements with [data-toggle-focus] will respond to coming in and out of focus Triggers.Initializers.addToggleFocusListener = function ($elem) { $elem.off('focus.zf.trigger blur.zf.trigger', Triggers.Listeners.Basic.toggleFocusListener); $elem.on('focus.zf.trigger blur.zf.trigger', '[data-toggle-focus]', Triggers.Listeners.Basic.toggleFocusListener); }; // More Global/complex listeners and triggers Triggers.Listeners.Global = { resizeListener: function ($nodes) { if (!MutationObserver) { //fallback for IE 9 $nodes.each(function () { __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).triggerHandler('resizeme.zf.trigger'); }); } //trigger all listening elements and signal a resize event $nodes.attr('data-events', "resize"); }, scrollListener: function ($nodes) { if (!MutationObserver) { //fallback for IE 9 $nodes.each(function () { __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this).triggerHandler('scrollme.zf.trigger'); }); } //trigger all listening elements and signal a scroll event $nodes.attr('data-events', "scroll"); }, closeMeListener: function (e, pluginId) { var plugin = e.namespace.split('.')[0]; var plugins = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-' + plugin + ']').not('[data-yeti-box="' + pluginId + '"]'); plugins.each(function () { var _this = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(this); _this.triggerHandler('close.zf.trigger', [_this]); }); } }; // Global, parses whole document. Triggers.Initializers.addClosemeListener = function (pluginName) { var yetiBoxes = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-yeti-box]'), plugNames = ['dropdown', 'tooltip', 'reveal']; if (pluginName) { if (typeof pluginName === 'string') { plugNames.push(pluginName); } else if (typeof pluginName === 'object' && typeof pluginName[0] === 'string') { plugNames.concat(pluginName); } else { console.error('Plugin names must be strings'); } } if (yetiBoxes.length) { var listeners = plugNames.map(function (name) { return 'closeme.zf.' + name; }).join(' '); __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off(listeners).on(listeners, Triggers.Listeners.Global.closeMeListener); } }; function debounceGlobalListener(debounce, trigger, listener) { var timer = void 0, args = Array.prototype.slice.call(arguments, 3); __WEBPACK_IMPORTED_MODULE_0_jquery___default()(window).off(trigger).on(trigger, function (e) { if (timer) { clearTimeout(timer); } timer = setTimeout(function () { listener.apply(null, args); }, debounce || 10); //default time to emit scroll event }); } Triggers.Initializers.addResizeListener = function (debounce) { var $nodes = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-resize]'); if ($nodes.length) { debounceGlobalListener(debounce, 'resize.zf.trigger', Triggers.Listeners.Global.resizeListener, $nodes); } }; Triggers.Initializers.addScrollListener = function (debounce) { var $nodes = __WEBPACK_IMPORTED_MODULE_0_jquery___default()('[data-scroll]'); if ($nodes.length) { debounceGlobalListener(debounce, 'scroll.zf.trigger', Triggers.Listeners.Global.scrollListener, $nodes); } }; Triggers.Initializers.addMutationEventsListener = function ($elem) { if (!MutationObserver) { return false; } var $nodes = $elem.find('[data-resize], [data-scroll], [data-mutate]'); //element callback var listeningElementsMutation = function (mutationRecordsList) { var $target = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(mutationRecordsList[0].target); //trigger the event handler for the element depending on type switch (mutationRecordsList[0].type) { case "attributes": if ($target.attr("data-events") === "scroll" && mutationRecordsList[0].attributeName === "data-events") { $target.triggerHandler('scrollme.zf.trigger', [$target, window.pageYOffset]); } if ($target.attr("data-events") === "resize" && mutationRecordsList[0].attributeName === "data-events") { $target.triggerHandler('resizeme.zf.trigger', [$target]); } if (mutationRecordsList[0].attributeName === "style") { $target.closest("[data-mutate]").attr("data-events", "mutate"); $target.closest("[data-mutate]").triggerHandler('mutateme.zf.trigger', [$target.closest("[data-mutate]")]); } break; case "childList": $target.closest("[data-mutate]").attr("data-events", "mutate"); $target.closest("[data-mutate]").triggerHandler('mutateme.zf.trigger', [$target.closest("[data-mutate]")]); break; default: return false; //nothing } }; if ($nodes.length) { //for each element that needs to listen for resizing, scrolling, or mutation add a single observer for (var i = 0; i <= $nodes.length - 1; i++) { var elementObserver = new MutationObserver(listeningElementsMutation); elementObserver.observe($nodes[i], { attributes: true, childList: true, characterData: false, subtree: true, attributeFilter: ["data-events", "style"] }); } } }; Triggers.Initializers.addSimpleListeners = function () { var $document = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(document); Triggers.Initializers.addOpenListener($document); Triggers.Initializers.addCloseListener($document); Triggers.Initializers.addToggleListener($document); Triggers.Initializers.addCloseableListener($document); Triggers.Initializers.addToggleFocusListener($document); }; Triggers.Initializers.addGlobalListeners = function () { var $document = __WEBPACK_IMPORTED_MODULE_0_jquery___default()(document); Triggers.Initializers.addMutationEventsListener($document); Triggers.Initializers.addResizeListener(); Triggers.Initializers.addScrollListener(); Triggers.Initializers.addClosemeListener(); }; Triggers.init = function ($, Foundation) { if (typeof $.triggersInitialized === 'undefined') { var $document = $(document); if (document.readyState === "complete") { Triggers.Initializers.addSimpleListeners(); Triggers.Initializers.addGlobalListeners(); } else { $(window).on('load', function () { Triggers.Initializers.addSimpleListeners(); Triggers.Initializers.addGlobalListeners(); }); } $.triggersInitialized = true; } if (Foundation) { Foundation.Triggers = Triggers; // Legacy included to be backwards compatible for now. Foundation.IHearYou = Triggers.Initializers.addGlobalListeners; } }; /***/ }), /***/ 8: /***/ (function(module, exports) { module.exports = {Box: window.Foundation.Box}; /***/ }), /***/ 99: /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(33); /***/ }) /******/ });