bootstrap.bundle.js 243 KB
Newer Older
XhmikosR's avatar
Dist    
XhmikosR committed
2001
2002
2003
2004
2005
      this._config = null;
      this._parent = null;
      this._element = null;
      this._triggerArray = null;
      this._isTransitioning = null;
Mark Otto's avatar
Mark Otto committed
2006
2007
    } // Private
    ;
Mark Otto's avatar
dist    
Mark Otto committed
2008

XhmikosR's avatar
Dist    
XhmikosR committed
2009
    _proto._getConfig = function _getConfig(config) {
XhmikosR's avatar
XhmikosR committed
2010
      config = _objectSpread2(_objectSpread2({}, Default$1), config);
XhmikosR's avatar
Dist    
XhmikosR committed
2011
      config.toggle = Boolean(config.toggle); // Coerce string values
Mark Otto's avatar
dist  
Mark Otto committed
2012

XhmikosR's avatar
XhmikosR committed
2013
      typeCheckConfig(NAME$3, config, DefaultType$1);
XhmikosR's avatar
Dist    
XhmikosR committed
2014
2015
      return config;
    };
Mark Otto's avatar
dist  
Mark Otto committed
2016

XhmikosR's avatar
Dist    
XhmikosR committed
2017
    _proto._getDimension = function _getDimension() {
XhmikosR's avatar
XhmikosR committed
2018
      var hasWidth = this._element.classList.contains(WIDTH);
XhmikosR's avatar
XhmikosR committed
2019

XhmikosR's avatar
XhmikosR committed
2020
      return hasWidth ? WIDTH : HEIGHT;
XhmikosR's avatar
Dist    
XhmikosR committed
2021
    };
Mark Otto's avatar
dist  
Mark Otto committed
2022

XhmikosR's avatar
Dist    
XhmikosR committed
2023
2024
    _proto._getParent = function _getParent() {
      var _this3 = this;
Mark Otto's avatar
dist  
Mark Otto committed
2025

XhmikosR's avatar
Dist.    
XhmikosR committed
2026
      var parent = this._config.parent;
Mark Otto's avatar
dist    
Mark Otto committed
2027

XhmikosR's avatar
Dist.    
XhmikosR committed
2028
2029
2030
2031
      if (isElement(parent)) {
        // it's a jQuery object
        if (typeof parent.jquery !== 'undefined' || typeof parent[0] !== 'undefined') {
          parent = parent[0];
XhmikosR's avatar
Dist    
XhmikosR committed
2032
2033
        }
      } else {
XhmikosR's avatar
Dist.    
XhmikosR committed
2034
        parent = SelectorEngine.findOne(parent);
XhmikosR's avatar
Dist    
XhmikosR committed
2035
      }
Mark Otto's avatar
dist  
Mark Otto committed
2036

XhmikosR's avatar
XhmikosR committed
2037
2038
      var selector = SELECTOR_DATA_TOGGLE$1 + "[data-parent=\"" + parent + "\"]";
      SelectorEngine.find(selector, parent).forEach(function (element) {
XhmikosR's avatar
XhmikosR committed
2039
        var selected = getElementFromSelector(element);
2040
2041

        _this3._addAriaAndCollapsedClass(selected, [element]);
XhmikosR's avatar
Dist    
XhmikosR committed
2042
2043
2044
      });
      return parent;
    };
Mark Otto's avatar
dist  
Mark Otto committed
2045

XhmikosR's avatar
XhmikosR committed
2046
2047
    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
      if (element) {
XhmikosR's avatar
XhmikosR committed
2048
        var isOpen = element.classList.contains(CLASS_NAME_SHOW);
XhmikosR's avatar
XhmikosR committed
2049
2050
2051

        if (triggerArray.length) {
          triggerArray.forEach(function (elem) {
XhmikosR's avatar
Dist.    
XhmikosR committed
2052
            if (isOpen) {
XhmikosR's avatar
XhmikosR committed
2053
              elem.classList.remove(CLASS_NAME_COLLAPSED);
XhmikosR's avatar
Dist.    
XhmikosR committed
2054
            } else {
XhmikosR's avatar
XhmikosR committed
2055
              elem.classList.add(CLASS_NAME_COLLAPSED);
XhmikosR's avatar
XhmikosR committed
2056
            }
Mark Otto's avatar
dist  
Mark Otto committed
2057

XhmikosR's avatar
XhmikosR committed
2058
2059
2060
            elem.setAttribute('aria-expanded', isOpen);
          });
        }
XhmikosR's avatar
Dist    
XhmikosR committed
2061
      }
Mark Otto's avatar
Mark Otto committed
2062
2063
    } // Static
    ;
Mark Otto's avatar
dist  
Mark Otto committed
2064

XhmikosR's avatar
XhmikosR committed
2065
    Collapse.collapseInterface = function collapseInterface(element, config) {
XhmikosR's avatar
XhmikosR committed
2066
      var data = Data.getData(element, DATA_KEY$3);
Mark Otto's avatar
dist  
Mark Otto committed
2067

XhmikosR's avatar
XhmikosR committed
2068
      var _config = _objectSpread2(_objectSpread2(_objectSpread2({}, Default$1), Manipulator.getDataAttributes(element)), typeof config === 'object' && config ? config : {});
Mark Otto's avatar
dist  
Mark Otto committed
2069

XhmikosR's avatar
XhmikosR committed
2070
      if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {
XhmikosR's avatar
XhmikosR committed
2071
2072
        _config.toggle = false;
      }
Mark Otto's avatar
dist    
Mark Otto committed
2073

XhmikosR's avatar
XhmikosR committed
2074
2075
2076
2077
2078
2079
      if (!data) {
        data = new Collapse(element, _config);
      }

      if (typeof config === 'string') {
        if (typeof data[config] === 'undefined') {
XhmikosR's avatar
Dist.    
XhmikosR committed
2080
          throw new TypeError("No method named \"" + config + "\"");
XhmikosR's avatar
Dist    
XhmikosR committed
2081
        }
Mark Otto's avatar
dist  
Mark Otto committed
2082

XhmikosR's avatar
XhmikosR committed
2083
2084
2085
        data[config]();
      }
    };
Mark Otto's avatar
dist    
Mark Otto committed
2086

XhmikosR's avatar
XhmikosR committed
2087
    Collapse.jQueryInterface = function jQueryInterface(config) {
XhmikosR's avatar
XhmikosR committed
2088
      return this.each(function () {
XhmikosR's avatar
XhmikosR committed
2089
        Collapse.collapseInterface(this, config);
XhmikosR's avatar
Dist    
XhmikosR committed
2090
2091
      });
    };
Mark Otto's avatar
dist  
Mark Otto committed
2092

XhmikosR's avatar
XhmikosR committed
2093
    Collapse.getInstance = function getInstance(element) {
XhmikosR's avatar
XhmikosR committed
2094
2095
2096
      return Data.getData(element, DATA_KEY$3);
    };

XhmikosR's avatar
Dist    
XhmikosR committed
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
    _createClass(Collapse, null, [{
      key: "VERSION",
      get: function get() {
        return VERSION$3;
      }
    }, {
      key: "Default",
      get: function get() {
        return Default$1;
      }
    }]);
Mark Otto's avatar
dist  
Mark Otto committed
2108

XhmikosR's avatar
Dist    
XhmikosR committed
2109
2110
2111
2112
2113
2114
2115
    return Collapse;
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */
Mark Otto's avatar
dist    
Mark Otto committed
2116

Mark Otto's avatar
dist  
Mark Otto committed
2117

XhmikosR's avatar
XhmikosR committed
2118
  EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$1, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
2119
    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
XhmikosR's avatar
XhmikosR committed
2120
    if (event.target.tagName === 'A') {
XhmikosR's avatar
Dist    
XhmikosR committed
2121
2122
      event.preventDefault();
    }
Mark Otto's avatar
dist    
Mark Otto committed
2123

XhmikosR's avatar
XhmikosR committed
2124
2125
    var triggerData = Manipulator.getDataAttributes(this);
    var selector = getSelectorFromElement(this);
XhmikosR's avatar
XhmikosR committed
2126
    var selectorElements = SelectorEngine.find(selector);
XhmikosR's avatar
XhmikosR committed
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
    selectorElements.forEach(function (element) {
      var data = Data.getData(element, DATA_KEY$3);
      var config;

      if (data) {
        // update parent attribute
        if (data._parent === null && typeof triggerData.parent === 'string') {
          data._config.parent = triggerData.parent;
          data._parent = data._getParent();
        }

        config = 'toggle';
      } else {
        config = triggerData;
      }
Mark Otto's avatar
dist  
Mark Otto committed
2142

XhmikosR's avatar
XhmikosR committed
2143
      Collapse.collapseInterface(element, config);
XhmikosR's avatar
Dist    
XhmikosR committed
2144
2145
    });
  });
XhmikosR's avatar
XhmikosR committed
2146
  var $$4 = getjQuery();
XhmikosR's avatar
Dist    
XhmikosR committed
2147
2148
2149
2150
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
XhmikosR's avatar
XhmikosR committed
2151
   * add .collapse to jQuery only if jQuery is present
XhmikosR's avatar
Dist    
XhmikosR committed
2152
   */
Mark Otto's avatar
dist    
Mark Otto committed
2153

2154
2155
  /* istanbul ignore if */

XhmikosR's avatar
XhmikosR committed
2156
2157
2158
2159
  if ($$4) {
    var JQUERY_NO_CONFLICT$3 = $$4.fn[NAME$3];
    $$4.fn[NAME$3] = Collapse.jQueryInterface;
    $$4.fn[NAME$3].Constructor = Collapse;
Mark Otto's avatar
dist  
Mark Otto committed
2160

XhmikosR's avatar
XhmikosR committed
2161
2162
2163
    $$4.fn[NAME$3].noConflict = function () {
      $$4.fn[NAME$3] = JQUERY_NO_CONFLICT$3;
      return Collapse.jQueryInterface;
XhmikosR's avatar
XhmikosR committed
2164
2165
    };
  }
Mark Otto's avatar
dist  
Mark Otto committed
2166

Mark Otto's avatar
dist    
Mark Otto committed
2167
2168
  /**!
   * @fileOverview Kickass library to create and place poppers near their reference elements.
XhmikosR's avatar
XhmikosR committed
2169
   * @version 1.16.0
Mark Otto's avatar
dist    
Mark Otto committed
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
   * @license
   * Copyright (c) 2016 Federico Zivolo and contributors
   *
   * Permission is hereby granted, free of charge, to any person obtaining a copy
   * of this software and associated documentation files (the "Software"), to deal
   * in the Software without restriction, including without limitation the rights
   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
   * copies of the Software, and to permit persons to whom the Software is
   * furnished to do so, subject to the following conditions:
   *
   * The above copyright notice and this permission notice shall be included in all
   * copies or substantial portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
   * SOFTWARE.
   */
XhmikosR's avatar
XhmikosR committed
2191
2192
2193
2194
2195
2196
2197
2198
  var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';

  var timeoutDuration = function () {
    var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];
    for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {
      if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {
        return 1;
      }
Mark Otto's avatar
dist  
Mark Otto committed
2199
    }
XhmikosR's avatar
XhmikosR committed
2200
2201
    return 0;
  }();
Mark Otto's avatar
dist  
Mark Otto committed
2202

Mark Otto's avatar
dist    
Mark Otto committed
2203
2204
2205
2206
2207
2208
2209
2210
2211
  function microtaskDebounce(fn) {
    var called = false;
    return function () {
      if (called) {
        return;
      }
      called = true;
      window.Promise.resolve().then(function () {
        called = false;
Mark Otto's avatar
dist  
Mark Otto committed
2212
        fn();
Mark Otto's avatar
dist    
Mark Otto committed
2213
2214
      });
    };
Mark Otto's avatar
dist  
Mark Otto committed
2215
2216
  }

Mark Otto's avatar
dist    
Mark Otto committed
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
  function taskDebounce(fn) {
    var scheduled = false;
    return function () {
      if (!scheduled) {
        scheduled = true;
        setTimeout(function () {
          scheduled = false;
          fn();
        }, timeoutDuration);
      }
    };
Mark Otto's avatar
dist    
Mark Otto committed
2228
2229
  }

Mark Otto's avatar
dist    
Mark Otto committed
2230
  var supportsMicroTasks = isBrowser && window.Promise;
Mark Otto's avatar
dist  
Mark Otto committed
2231

Mark Otto's avatar
dist    
Mark Otto committed
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
  /**
  * Create a debounced version of a method, that's asynchronously deferred
  * but called in the minimum time possible.
  *
  * @method
  * @memberof Popper.Utils
  * @argument {Function} fn
  * @returns {Function}
  */
  var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;
Mark Otto's avatar
dist  
Mark Otto committed
2242

Mark Otto's avatar
dist    
Mark Otto committed
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
  /**
   * Check if the given variable is a function
   * @method
   * @memberof Popper.Utils
   * @argument {Any} functionToCheck - variable to check
   * @returns {Boolean} answer to: is a function?
   */
  function isFunction(functionToCheck) {
    var getType = {};
    return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
Mark Otto's avatar
dist  
Mark Otto committed
2253
2254
  }

Mark Otto's avatar
dist    
Mark Otto committed
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
  /**
   * Get CSS computed property of the given element
   * @method
   * @memberof Popper.Utils
   * @argument {Eement} element
   * @argument {String} property
   */
  function getStyleComputedProperty(element, property) {
    if (element.nodeType !== 1) {
      return [];
Mark Otto's avatar
dist    
Mark Otto committed
2265
    }
Mark Otto's avatar
dist    
Mark Otto committed
2266
    // NOTE: 1 DOM access here
XhmikosR's avatar
Dist    
XhmikosR committed
2267
2268
    var window = element.ownerDocument.defaultView;
    var css = window.getComputedStyle(element, null);
Mark Otto's avatar
dist    
Mark Otto committed
2269
    return property ? css[property] : css;
Mark Otto's avatar
dist  
Mark Otto committed
2270
2271
  }

Mark Otto's avatar
dist    
Mark Otto committed
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
  /**
   * Returns the parentNode or the host of the element
   * @method
   * @memberof Popper.Utils
   * @argument {Element} element
   * @returns {Element} parent
   */
  function getParentNode(element) {
    if (element.nodeName === 'HTML') {
      return element;
    }
    return element.parentNode || element.host;
Mark Otto's avatar
dist  
Mark Otto committed
2284
2285
  }

Mark Otto's avatar
dist    
Mark Otto committed
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
  /**
   * Returns the scrolling parent of the given element
   * @method
   * @memberof Popper.Utils
   * @argument {Element} element
   * @returns {Element} scroll parent
   */
  function getScrollParent(element) {
    // Return body, `getScroll` will take care to get the correct `scrollTop` from it
    if (!element) {
      return document.body;
    }
Mark Otto's avatar
dist  
Mark Otto committed
2298

Mark Otto's avatar
dist    
Mark Otto committed
2299
2300
2301
2302
2303
2304
2305
    switch (element.nodeName) {
      case 'HTML':
      case 'BODY':
        return element.ownerDocument.body;
      case '#document':
        return element.body;
    }
Mark Otto's avatar
dist  
Mark Otto committed
2306

Mark Otto's avatar
dist    
Mark Otto committed
2307
    // Firefox want us to check `-x` and `-y` variations as well
Mark Otto's avatar
dist  
Mark Otto committed
2308

Mark Otto's avatar
dist    
Mark Otto committed
2309
2310
2311
2312
    var _getStyleComputedProp = getStyleComputedProperty(element),
        overflow = _getStyleComputedProp.overflow,
        overflowX = _getStyleComputedProp.overflowX,
        overflowY = _getStyleComputedProp.overflowY;
Mark Otto's avatar
dist  
Mark Otto committed
2313

Mark Otto's avatar
dist    
Mark Otto committed
2314
2315
    if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {
      return element;
Mark Otto's avatar
dist  
Mark Otto committed
2316
2317
    }

Mark Otto's avatar
dist    
Mark Otto committed
2318
    return getScrollParent(getParentNode(element));
Mark Otto's avatar
dist  
Mark Otto committed
2319
2320
  }

XhmikosR's avatar
XhmikosR committed
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
  /**
   * Returns the reference node of the reference object, or the reference object itself.
   * @method
   * @memberof Popper.Utils
   * @param {Element|Object} reference - the reference element (the popper will be relative to this)
   * @returns {Element} parent
   */
  function getReferenceNode(reference) {
    return reference && reference.referenceNode ? reference.referenceNode : reference;
  }

Mark Otto's avatar
dist    
Mark Otto committed
2332
2333
2334
  var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);
  var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);

Mark Otto's avatar
dist    
Mark Otto committed
2335
  /**
Mark Otto's avatar
dist    
Mark Otto committed
2336
   * Determines if the browser is Internet Explorer
Mark Otto's avatar
dist    
Mark Otto committed
2337
2338
   * @method
   * @memberof Popper.Utils
Mark Otto's avatar
dist    
Mark Otto committed
2339
   * @param {Number} version to check
Mark Otto's avatar
dist    
Mark Otto committed
2340
2341
   * @returns {Boolean} isIE
   */
Mark Otto's avatar
dist    
Mark Otto committed
2342
2343
2344
  function isIE(version) {
    if (version === 11) {
      return isIE11;
Mark Otto's avatar
dist    
Mark Otto committed
2345
    }
Mark Otto's avatar
dist    
Mark Otto committed
2346
2347
    if (version === 10) {
      return isIE10;
Mark Otto's avatar
dist    
Mark Otto committed
2348
    }
Mark Otto's avatar
dist    
Mark Otto committed
2349
2350
    return isIE11 || isIE10;
  }
Mark Otto's avatar
dist  
Mark Otto committed
2351

Mark Otto's avatar
dist    
Mark Otto committed
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
  /**
   * Returns the offset parent of the given element
   * @method
   * @memberof Popper.Utils
   * @argument {Element} element
   * @returns {Element} offset parent
   */
  function getOffsetParent(element) {
    if (!element) {
      return document.documentElement;
Mark Otto's avatar
dist  
Mark Otto committed
2362
2363
    }

Mark Otto's avatar
dist    
Mark Otto committed
2364
    var noOffsetParent = isIE(10) ? document.body : null;
Mark Otto's avatar
dist  
Mark Otto committed
2365

Mark Otto's avatar
dist    
Mark Otto committed
2366
    // NOTE: 1 DOM access here
XhmikosR's avatar
Dist    
XhmikosR committed
2367
    var offsetParent = element.offsetParent || null;
Mark Otto's avatar
dist    
Mark Otto committed
2368
2369
2370
2371
    // Skip hidden elements which don't have an offsetParent
    while (offsetParent === noOffsetParent && element.nextElementSibling) {
      offsetParent = (element = element.nextElementSibling).offsetParent;
    }
Mark Otto's avatar
dist  
Mark Otto committed
2372

Mark Otto's avatar
dist    
Mark Otto committed
2373
    var nodeName = offsetParent && offsetParent.nodeName;
Mark Otto's avatar
dist  
Mark Otto committed
2374

Mark Otto's avatar
dist    
Mark Otto committed
2375
2376
2377
    if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {
      return element ? element.ownerDocument.documentElement : document.documentElement;
    }
Mark Otto's avatar
dist  
Mark Otto committed
2378

XhmikosR's avatar
Dist    
XhmikosR committed
2379
    // .offsetParent will return the closest TH, TD or TABLE in case
Mark Otto's avatar
dist    
Mark Otto committed
2380
    // no offsetParent is present, I hate this job...
XhmikosR's avatar
Dist    
XhmikosR committed
2381
    if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {
Mark Otto's avatar
dist    
Mark Otto committed
2382
2383
      return getOffsetParent(offsetParent);
    }
Mark Otto's avatar
dist  
Mark Otto committed
2384

Mark Otto's avatar
dist    
Mark Otto committed
2385
    return offsetParent;
Mark Otto's avatar
dist  
Mark Otto committed
2386
2387
  }

Mark Otto's avatar
dist    
Mark Otto committed
2388
2389
  function isOffsetContainer(element) {
    var nodeName = element.nodeName;
Mark Otto's avatar
dist  
Mark Otto committed
2390

Mark Otto's avatar
dist    
Mark Otto committed
2391
2392
    if (nodeName === 'BODY') {
      return false;
Mark Otto's avatar
dist  
Mark Otto committed
2393
    }
Mark Otto's avatar
dist    
Mark Otto committed
2394
    return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;
Mark Otto's avatar
dist  
Mark Otto committed
2395
2396
  }

Mark Otto's avatar
dist    
Mark Otto committed
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
  /**
   * Finds the root node (document, shadowDOM root) of the given element
   * @method
   * @memberof Popper.Utils
   * @argument {Element} node
   * @returns {Element} root node
   */
  function getRoot(node) {
    if (node.parentNode !== null) {
      return getRoot(node.parentNode);
    }
Mark Otto's avatar
dist  
Mark Otto committed
2408

Mark Otto's avatar
dist    
Mark Otto committed
2409
    return node;
Mark Otto's avatar
dist  
Mark Otto committed
2410
2411
  }

Mark Otto's avatar
dist    
Mark Otto committed
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
  /**
   * Finds the offset parent common to the two provided nodes
   * @method
   * @memberof Popper.Utils
   * @argument {Element} element1
   * @argument {Element} element2
   * @returns {Element} common offset parent
   */
  function findCommonOffsetParent(element1, element2) {
    // This check is needed to avoid errors in case one of the elements isn't defined for any reason
    if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {
      return document.documentElement;
    }
Mark Otto's avatar
dist  
Mark Otto committed
2425

Mark Otto's avatar
dist    
Mark Otto committed
2426
2427
2428
2429
    // Here we make sure to give as "start" the element that comes first in the DOM
    var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;
    var start = order ? element1 : element2;
    var end = order ? element2 : element1;
Mark Otto's avatar
dist  
Mark Otto committed
2430

Mark Otto's avatar
dist    
Mark Otto committed
2431
2432
2433
2434
2435
    // Get common ancestor container
    var range = document.createRange();
    range.setStart(start, 0);
    range.setEnd(end, 0);
    var commonAncestorContainer = range.commonAncestorContainer;
Mark Otto's avatar
dist  
Mark Otto committed
2436

Mark Otto's avatar
dist    
Mark Otto committed
2437
    // Both nodes are inside #document
Mark Otto's avatar
dist  
Mark Otto committed
2438

Mark Otto's avatar
dist    
Mark Otto committed
2439
2440
2441
2442
    if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {
      if (isOffsetContainer(commonAncestorContainer)) {
        return commonAncestorContainer;
      }
Mark Otto's avatar
dist  
Mark Otto committed
2443

Mark Otto's avatar
dist    
Mark Otto committed
2444
2445
      return getOffsetParent(commonAncestorContainer);
    }
Mark Otto's avatar
dist  
Mark Otto committed
2446

Mark Otto's avatar
dist    
Mark Otto committed
2447
2448
2449
2450
    // one of the nodes is inside shadowDOM, find which one
    var element1root = getRoot(element1);
    if (element1root.host) {
      return findCommonOffsetParent(element1root.host, element2);
Mark Otto's avatar
dist  
Mark Otto committed
2451
    } else {
Mark Otto's avatar
dist    
Mark Otto committed
2452
      return findCommonOffsetParent(element1, getRoot(element2).host);
Mark Otto's avatar
dist  
Mark Otto committed
2453
    }
Mark Otto's avatar
dist    
Mark Otto committed
2454
  }
Mark Otto's avatar
dist  
Mark Otto committed
2455

Mark Otto's avatar
dist    
Mark Otto committed
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
  /**
   * Gets the scroll value of the given element in the given side (top and left)
   * @method
   * @memberof Popper.Utils
   * @argument {Element} element
   * @argument {String} side `top` or `left`
   * @returns {number} amount of scrolled pixels
   */
  function getScroll(element) {
    var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';
Mark Otto's avatar
dist  
Mark Otto committed
2466

Mark Otto's avatar
dist    
Mark Otto committed
2467
2468
    var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';
    var nodeName = element.nodeName;
Mark Otto's avatar
dist  
Mark Otto committed
2469

Mark Otto's avatar
dist    
Mark Otto committed
2470
2471
2472
2473
    if (nodeName === 'BODY' || nodeName === 'HTML') {
      var html = element.ownerDocument.documentElement;
      var scrollingElement = element.ownerDocument.scrollingElement || html;
      return scrollingElement[upperSide];
Mark Otto's avatar
dist  
Mark Otto committed
2474
2475
    }

Mark Otto's avatar
dist    
Mark Otto committed
2476
    return element[upperSide];
Mark Otto's avatar
dist  
Mark Otto committed
2477
2478
  }

Mark Otto's avatar
dist    
Mark Otto committed
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
  /*
   * Sum or subtract the element scroll values (left and top) from a given rect object
   * @method
   * @memberof Popper.Utils
   * @param {Object} rect - Rect object you want to change
   * @param {HTMLElement} element - The element from the function reads the scroll values
   * @param {Boolean} subtract - set to true if you want to subtract the scroll values
   * @return {Object} rect - The modifier rect object
   */
  function includeScroll(rect, element) {
    var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;

    var scrollTop = getScroll(element, 'top');
    var scrollLeft = getScroll(element, 'left');
    var modifier = subtract ? -1 : 1;
    rect.top += scrollTop * modifier;
    rect.bottom += scrollTop * modifier;
    rect.left += scrollLeft * modifier;
    rect.right += scrollLeft * modifier;
    return rect;
  }
Mark Otto's avatar
dist  
Mark Otto committed
2500

Mark Otto's avatar
dist    
Mark Otto committed
2501
2502
2503
2504
2505
2506
2507
2508
2509
  /*
   * Helper to detect borders of a given element
   * @method
   * @memberof Popper.Utils
   * @param {CSSStyleDeclaration} styles
   * Result of `getStyleComputedProperty` on the given element
   * @param {String} axis - `x` or `y`
   * @return {number} borders - The borders size of the given axis
   */
Mark Otto's avatar
dist  
Mark Otto committed
2510

Mark Otto's avatar
dist    
Mark Otto committed
2511
2512
2513
  function getBordersSize(styles, axis) {
    var sideA = axis === 'x' ? 'Left' : 'Top';
    var sideB = sideA === 'Left' ? 'Right' : 'Bottom';
Mark Otto's avatar
dist  
Mark Otto committed
2514

Mark Otto's avatar
dist    
Mark Otto committed
2515
    return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);
Mark Otto's avatar
dist  
Mark Otto committed
2516
2517
  }

Mark Otto's avatar
dist    
Mark Otto committed
2518
  function getSize(axis, body, html, computedStyle) {
Mark Otto's avatar
dist    
Mark Otto committed
2519
    return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);
Mark Otto's avatar
dist  
Mark Otto committed
2520
2521
  }

Mark Otto's avatar
dist    
Mark Otto committed
2522
  function getWindowSizes(document) {
Mark Otto's avatar
dist    
Mark Otto committed
2523
2524
2525
    var body = document.body;
    var html = document.documentElement;
    var computedStyle = isIE(10) && getComputedStyle(html);
Mark Otto's avatar
dist  
Mark Otto committed
2526

Mark Otto's avatar
dist    
Mark Otto committed
2527
2528
2529
2530
    return {
      height: getSize('Height', body, html, computedStyle),
      width: getSize('Width', body, html, computedStyle)
    };
Mark Otto's avatar
dist  
Mark Otto committed
2531
2532
  }

Mark Otto's avatar
dist    
Mark Otto committed
2533
2534
2535
2536
  var classCallCheck = function (instance, Constructor) {
    if (!(instance instanceof Constructor)) {
      throw new TypeError("Cannot call a class as a function");
    }
Mark Otto's avatar
dist  
Mark Otto committed
2537
2538
  };

Mark Otto's avatar
dist    
Mark Otto committed
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
  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);
      }
    }
Mark Otto's avatar
dist  
Mark Otto committed
2549

Mark Otto's avatar
dist    
Mark Otto committed
2550
2551
2552
2553
2554
2555
    return function (Constructor, protoProps, staticProps) {
      if (protoProps) defineProperties(Constructor.prototype, protoProps);
      if (staticProps) defineProperties(Constructor, staticProps);
      return Constructor;
    };
  }();
Mark Otto's avatar
dist  
Mark Otto committed
2556
2557
2558
2559
2560





Mark Otto's avatar
dist    
Mark Otto committed
2561
2562
2563
2564
2565
2566
2567
2568
  var defineProperty = function (obj, key, value) {
    if (key in obj) {
      Object.defineProperty(obj, key, {
        value: value,
        enumerable: true,
        configurable: true,
        writable: true
      });
Mark Otto's avatar
dist  
Mark Otto committed
2569
    } else {
Mark Otto's avatar
dist    
Mark Otto committed
2570
      obj[key] = value;
Mark Otto's avatar
dist  
Mark Otto committed
2571
2572
    }

Mark Otto's avatar
dist    
Mark Otto committed
2573
2574
    return obj;
  };
Mark Otto's avatar
dist  
Mark Otto committed
2575

Mark Otto's avatar
dist    
Mark Otto committed
2576
2577
2578
  var _extends = Object.assign || function (target) {
    for (var i = 1; i < arguments.length; i++) {
      var source = arguments[i];
Mark Otto's avatar
dist  
Mark Otto committed
2579

Mark Otto's avatar
dist    
Mark Otto committed
2580
2581
2582
2583
2584
2585
      for (var key in source) {
        if (Object.prototype.hasOwnProperty.call(source, key)) {
          target[key] = source[key];
        }
      }
    }
Mark Otto's avatar
dist  
Mark Otto committed
2586

Mark Otto's avatar
dist    
Mark Otto committed
2587
    return target;
Mark Otto's avatar
dist  
Mark Otto committed
2588
2589
  };

Mark Otto's avatar
dist    
Mark Otto committed
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
  /**
   * Given element offsets, generate an output similar to getBoundingClientRect
   * @method
   * @memberof Popper.Utils
   * @argument {Object} offsets
   * @returns {Object} ClientRect like output
   */
  function getClientRect(offsets) {
    return _extends({}, offsets, {
      right: offsets.left + offsets.width,
      bottom: offsets.top + offsets.height
    });
Mark Otto's avatar
dist  
Mark Otto committed
2602
2603
  }

Mark Otto's avatar
dist    
Mark Otto committed
2604
2605
2606
2607
2608
2609
2610
2611
2612
  /**
   * Get bounding client rect of given element
   * @method
   * @memberof Popper.Utils
   * @param {HTMLElement} element
   * @return {Object} client rect
   */
  function getBoundingClientRect(element) {
    var rect = {};
Mark Otto's avatar
dist  
Mark Otto committed
2613

Mark Otto's avatar
dist    
Mark Otto committed
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
    // IE10 10 FIX: Please, don't ask, the element isn't
    // considered in DOM in some circumstances...
    // This isn't reproducible in IE10 compatibility mode of IE11
    try {
      if (isIE(10)) {
        rect = element.getBoundingClientRect();
        var scrollTop = getScroll(element, 'top');
        var scrollLeft = getScroll(element, 'left');
        rect.top += scrollTop;
        rect.left += scrollLeft;
        rect.bottom += scrollTop;
        rect.right += scrollLeft;
      } else {
        rect = element.getBoundingClientRect();
      }
    } catch (e) {}

    var result = {
      left: rect.left,
      top: rect.top,
      width: rect.right - rect.left,
      height: rect.bottom - rect.top
    };
Mark Otto's avatar
dist  
Mark Otto committed
2637

Mark Otto's avatar
dist    
Mark Otto committed
2638
    // subtract scrollbar size from sizes
Mark Otto's avatar
dist    
Mark Otto committed
2639
    var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};
XhmikosR's avatar
XhmikosR committed
2640
2641
    var width = sizes.width || element.clientWidth || result.width;
    var height = sizes.height || element.clientHeight || result.height;
Mark Otto's avatar
dist  
Mark Otto committed
2642

Mark Otto's avatar
dist    
Mark Otto committed
2643
2644
    var horizScrollbar = element.offsetWidth - width;
    var vertScrollbar = element.offsetHeight - height;
Mark Otto's avatar
dist  
Mark Otto committed
2645

Mark Otto's avatar
dist    
Mark Otto committed
2646
2647
2648
2649
2650
2651
2652
2653
2654
    // if an hypothetical scrollbar is detected, we must be sure it's not a `border`
    // we make this check conditional for performance reasons
    if (horizScrollbar || vertScrollbar) {
      var styles = getStyleComputedProperty(element);
      horizScrollbar -= getBordersSize(styles, 'x');
      vertScrollbar -= getBordersSize(styles, 'y');

      result.width -= horizScrollbar;
      result.height -= vertScrollbar;
Mark Otto's avatar
dist  
Mark Otto committed
2655
    }
Mark Otto's avatar
dist    
Mark Otto committed
2656
2657

    return getClientRect(result);
Mark Otto's avatar
dist  
Mark Otto committed
2658
2659
  }

Mark Otto's avatar
dist    
Mark Otto committed
2660
2661
  function getOffsetRectRelativeToArbitraryNode(children, parent) {
    var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
Mark Otto's avatar
dist  
Mark Otto committed
2662

Mark Otto's avatar
dist    
Mark Otto committed
2663
2664
2665
2666
2667
    var isIE10 = isIE(10);
    var isHTML = parent.nodeName === 'HTML';
    var childrenRect = getBoundingClientRect(children);
    var parentRect = getBoundingClientRect(parent);
    var scrollParent = getScrollParent(children);
Mark Otto's avatar
dist  
Mark Otto committed
2668

Mark Otto's avatar
dist    
Mark Otto committed
2669
2670
2671
    var styles = getStyleComputedProperty(parent);
    var borderTopWidth = parseFloat(styles.borderTopWidth, 10);
    var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);
Mark Otto's avatar
dist  
Mark Otto committed
2672

Mark Otto's avatar
dist    
Mark Otto committed
2673
    // In cases where the parent is fixed, we must ignore negative scroll in offset calc
Mark Otto's avatar
dist    
Mark Otto committed
2674
    if (fixedPosition && isHTML) {
Mark Otto's avatar
dist    
Mark Otto committed
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
      parentRect.top = Math.max(parentRect.top, 0);
      parentRect.left = Math.max(parentRect.left, 0);
    }
    var offsets = getClientRect({
      top: childrenRect.top - parentRect.top - borderTopWidth,
      left: childrenRect.left - parentRect.left - borderLeftWidth,
      width: childrenRect.width,
      height: childrenRect.height
    });
    offsets.marginTop = 0;
    offsets.marginLeft = 0;

    // Subtract margins of documentElement in case it's being used as parent
    // we do this only on HTML because it's the only element that behaves
    // differently when margins are applied to it. The margins are included in
    // the box of the documentElement, in the other cases not.
    if (!isIE10 && isHTML) {
      var marginTop = parseFloat(styles.marginTop, 10);
      var marginLeft = parseFloat(styles.marginLeft, 10);

      offsets.top -= borderTopWidth - marginTop;
      offsets.bottom -= borderTopWidth - marginTop;
      offsets.left -= borderLeftWidth - marginLeft;
      offsets.right -= borderLeftWidth - marginLeft;

      // Attach marginTop and marginLeft because in some circumstances we may need them
      offsets.marginTop = marginTop;
      offsets.marginLeft = marginLeft;
    }
Mark Otto's avatar
dist  
Mark Otto committed
2704

Mark Otto's avatar
dist    
Mark Otto committed
2705
2706
2707
    if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {
      offsets = includeScroll(offsets, parent);
    }
Mark Otto's avatar
dist  
Mark Otto committed
2708

Mark Otto's avatar
dist    
Mark Otto committed
2709
    return offsets;
Mark Otto's avatar
dist  
Mark Otto committed
2710
2711
  }

Mark Otto's avatar
dist    
Mark Otto committed
2712
2713
  function getViewportOffsetRectRelativeToArtbitraryNode(element) {
    var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
Mark Otto's avatar
dist  
Mark Otto committed
2714

Mark Otto's avatar
dist    
Mark Otto committed
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
    var html = element.ownerDocument.documentElement;
    var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);
    var width = Math.max(html.clientWidth, window.innerWidth || 0);
    var height = Math.max(html.clientHeight, window.innerHeight || 0);

    var scrollTop = !excludeScroll ? getScroll(html) : 0;
    var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;

    var offset = {
      top: scrollTop - relativeOffset.top + relativeOffset.marginTop,
      left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,
      width: width,
      height: height
    };
Mark Otto's avatar
dist  
Mark Otto committed
2729

Mark Otto's avatar
dist    
Mark Otto committed
2730
    return getClientRect(offset);
Mark Otto's avatar
dist  
Mark Otto committed
2731
2732
  }

Mark Otto's avatar
dist    
Mark Otto committed
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
  /**
   * Check if the given element is fixed or is inside a fixed parent
   * @method
   * @memberof Popper.Utils
   * @argument {Element} element
   * @argument {Element} customContainer
   * @returns {Boolean} answer to "isFixed?"
   */
  function isFixed(element) {
    var nodeName = element.nodeName;
    if (nodeName === 'BODY' || nodeName === 'HTML') {
      return false;
Mark Otto's avatar
dist  
Mark Otto committed
2745
    }
Mark Otto's avatar
dist    
Mark Otto committed
2746
2747
2748
    if (getStyleComputedProperty(element, 'position') === 'fixed') {
      return true;
    }
Mark Otto's avatar
Mark Otto committed
2749
2750
2751
2752
2753
    var parentNode = getParentNode(element);
    if (!parentNode) {
      return false;
    }
    return isFixed(parentNode);
Mark Otto's avatar
dist    
Mark Otto committed
2754
  }
Mark Otto's avatar
dist  
Mark Otto committed
2755

Mark Otto's avatar
dist    
Mark Otto committed
2756
2757
2758
2759
2760
2761
2762
  /**
   * Finds the first parent of an element that has a transformed property defined
   * @method
   * @memberof Popper.Utils
   * @argument {Element} element
   * @returns {Element} first transformed parent or documentElement
   */
Mark Otto's avatar
dist  
Mark Otto committed
2763

Mark Otto's avatar
dist    
Mark Otto committed
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
  function getFixedPositionOffsetParent(element) {
    // This check is needed to avoid errors in case one of the elements isn't defined for any reason
    if (!element || !element.parentElement || isIE()) {
      return document.documentElement;
    }
    var el = element.parentElement;
    while (el && getStyleComputedProperty(el, 'transform') === 'none') {
      el = el.parentElement;
    }
    return el || document.documentElement;
  }
Mark Otto's avatar
dist  
Mark Otto committed
2775

Mark Otto's avatar
dist    
Mark Otto committed
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
  /**
   * Computed the boundaries limits and return them
   * @method
   * @memberof Popper.Utils
   * @param {HTMLElement} popper
   * @param {HTMLElement} reference
   * @param {number} padding
   * @param {HTMLElement} boundariesElement - Element used to define the boundaries
   * @param {Boolean} fixedPosition - Is in fixed position mode
   * @returns {Object} Coordinates of the boundaries
   */
  function getBoundaries(popper, reference, padding, boundariesElement) {
    var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
Mark Otto's avatar
dist  
Mark Otto committed
2789

Mark Otto's avatar
dist    
Mark Otto committed
2790
    // NOTE: 1 DOM access here
Mark Otto's avatar
dist  
Mark Otto committed
2791

Mark Otto's avatar
dist    
Mark Otto committed
2792
    var boundaries = { top: 0, left: 0 };
XhmikosR's avatar
XhmikosR committed
2793
    var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));
Mark Otto's avatar
dist  
Mark Otto committed
2794

Mark Otto's avatar
dist    
Mark Otto committed
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
    // Handle viewport case
    if (boundariesElement === 'viewport') {
      boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);
    } else {
      // Handle other cases based on DOM element used as boundaries
      var boundariesNode = void 0;
      if (boundariesElement === 'scrollParent') {
        boundariesNode = getScrollParent(getParentNode(reference));
        if (boundariesNode.nodeName === 'BODY') {
          boundariesNode = popper.ownerDocument.documentElement;
        }
      } else if (boundariesElement === 'window') {
        boundariesNode = popper.ownerDocument.documentElement;
      } else {
        boundariesNode = boundariesElement;
      }
Mark Otto's avatar
dist  
Mark Otto committed
2811

Mark Otto's avatar
dist    
Mark Otto committed
2812
      var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);
Mark Otto's avatar
dist  
Mark Otto committed
2813

Mark Otto's avatar
dist    
Mark Otto committed
2814
2815
      // In case of HTML, we need a different computation
      if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {
Mark Otto's avatar
dist    
Mark Otto committed
2816
        var _getWindowSizes = getWindowSizes(popper.ownerDocument),
Mark Otto's avatar
dist    
Mark Otto committed
2817
2818
            height = _getWindowSizes.height,
            width = _getWindowSizes.width;
Mark Otto's avatar
dist  
Mark Otto committed
2819

Mark Otto's avatar
dist    
Mark Otto committed
2820
2821
2822
2823
2824
2825
2826
        boundaries.top += offsets.top - offsets.marginTop;
        boundaries.bottom = height + offsets.top;
        boundaries.left += offsets.left - offsets.marginLeft;
        boundaries.right = width + offsets.left;
      } else {
        // for all the other DOM elements, this one is good
        boundaries = offsets;
Mark Otto's avatar
dist  
Mark Otto committed
2827
      }
Mark Otto's avatar
dist    
Mark Otto committed
2828
    }
Mark Otto's avatar
dist  
Mark Otto committed
2829

Mark Otto's avatar
dist    
Mark Otto committed
2830
    // Add paddings
Mark Otto's avatar
dist    
Mark Otto committed
2831
2832
2833
2834
2835
2836
    padding = padding || 0;
    var isPaddingNumber = typeof padding === 'number';
    boundaries.left += isPaddingNumber ? padding : padding.left || 0;
    boundaries.top += isPaddingNumber ? padding : padding.top || 0;
    boundaries.right -= isPaddingNumber ? padding : padding.right || 0;
    boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;
Mark Otto's avatar
dist  
Mark Otto committed
2837

Mark Otto's avatar
dist    
Mark Otto committed
2838
    return boundaries;
Mark Otto's avatar
dist  
Mark Otto committed
2839
2840
  }

Mark Otto's avatar
dist    
Mark Otto committed
2841
2842
2843
2844
2845
  function getArea(_ref) {
    var width = _ref.width,
        height = _ref.height;

    return width * height;
Mark Otto's avatar
dist  
Mark Otto committed
2846
2847
  }

Mark Otto's avatar
dist    
Mark Otto committed
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
  /**
   * Utility used to transform the `auto` placement to the placement with more
   * available space.
   * @method
   * @memberof Popper.Utils
   * @argument {Object} data - The data object generated by update method
   * @argument {Object} options - Modifiers configuration and options
   * @returns {Object} The data object, properly modified
   */
  function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {
    var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;
Mark Otto's avatar
dist  
Mark Otto committed
2859

Mark Otto's avatar
dist    
Mark Otto committed
2860
2861
    if (placement.indexOf('auto') === -1) {
      return placement;
Mark Otto's avatar
dist  
Mark Otto committed
2862
2863
    }

Mark Otto's avatar
dist    
Mark Otto committed
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
    var boundaries = getBoundaries(popper, reference, padding, boundariesElement);

    var rects = {
      top: {
        width: boundaries.width,
        height: refRect.top - boundaries.top
      },
      right: {
        width: boundaries.right - refRect.right,
        height: boundaries.height
      },
      bottom: {
        width: boundaries.width,
        height: boundaries.bottom - refRect.bottom
      },
      left: {
        width: refRect.left - boundaries.left,
        height: boundaries.height
Mark Otto's avatar
dist  
Mark Otto committed
2882
      }
Mark Otto's avatar
dist    
Mark Otto committed
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
    };

    var sortedAreas = Object.keys(rects).map(function (key) {
      return _extends({
        key: key
      }, rects[key], {
        area: getArea(rects[key])
      });
    }).sort(function (a, b) {
      return b.area - a.area;
Mark Otto's avatar
dist  
Mark Otto committed
2893
2894
    });

Mark Otto's avatar
dist    
Mark Otto committed
2895
2896
2897
2898
    var filteredAreas = sortedAreas.filter(function (_ref2) {
      var width = _ref2.width,
          height = _ref2.height;
      return width >= popper.clientWidth && height >= popper.clientHeight;
Mark Otto's avatar
dist  
Mark Otto committed
2899
2900
    });

Mark Otto's avatar
dist    
Mark Otto committed
2901
2902
2903
    var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;

    var variation = placement.split('-')[1];
Mark Otto's avatar
dist  
Mark Otto committed
2904

Mark Otto's avatar
dist    
Mark Otto committed
2905
    return computedPlacement + (variation ? '-' + variation : '');
Mark Otto's avatar
dist  
Mark Otto committed
2906
2907
  }

Mark Otto's avatar
dist    
Mark Otto committed
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
  /**
   * Get offsets to the reference element
   * @method
   * @memberof Popper.Utils
   * @param {Object} state
   * @param {Element} popper - the popper element
   * @param {Element} reference - the reference element (the popper will be relative to this)
   * @param {Element} fixedPosition - is in fixed position mode
   * @returns {Object} An object containing the offsets which will be applied to the popper
   */
  function getReferenceOffsets(state, popper, reference) {
    var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
Mark Otto's avatar
dist  
Mark Otto committed
2920

XhmikosR's avatar
XhmikosR committed
2921
    var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));
Mark Otto's avatar
dist    
Mark Otto committed
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
    return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);
  }

  /**
   * Get the outer sizes of the given element (offset size + margins)
   * @method
   * @memberof Popper.Utils
   * @argument {Element} element
   * @returns {Object} object containing width and height properties
   */
  function getOuterSizes(element) {
XhmikosR's avatar
Dist    
XhmikosR committed
2933
2934
    var window = element.ownerDocument.defaultView;
    var styles = window.getComputedStyle(element);
Mark Otto's avatar
dist    
Mark Otto committed
2935
2936
    var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);
    var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);
Mark Otto's avatar
dist    
Mark Otto committed
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
    var result = {
      width: element.offsetWidth + y,
      height: element.offsetHeight + x
    };
    return result;
  }

  /**
   * Get the opposite placement of the given one
   * @method
   * @memberof Popper.Utils
   * @argument {String} placement
   * @returns {String} flipped placement
   */
  function getOppositePlacement(placement) {
    var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };
    return placement.replace(/left|right|bottom|top/g, function (matched) {
      return hash[matched];
    });
  }

  /**
   * Get offsets to the popper
   * @method
   * @memberof Popper.Utils
   * @param {Object} position - CSS position the Popper will get applied
   * @param {HTMLElement} popper - the popper element
   * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)
   * @param {String} placement - one of the valid placement options
   * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper
   */
  function getPopperOffsets(popper, referenceOffsets, placement) {
    placement = placement.split('-')[0];

    // Get popper node sizes
    var popperRect = getOuterSizes(popper);
Mark Otto's avatar
dist  
Mark Otto committed
2973

Mark Otto's avatar
dist    
Mark Otto committed
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
    // Add position, width and height to our offsets object
    var popperOffsets = {
      width: popperRect.width,
      height: popperRect.height
    };

    // depending by the popper placement we have to compute its offsets slightly differently
    var isHoriz = ['right', 'left'].indexOf(placement) !== -1;
    var mainSide = isHoriz ? 'top' : 'left';
    var secondarySide = isHoriz ? 'left' : 'top';
    var measurement = isHoriz ? 'height' : 'width';
    var secondaryMeasurement = !isHoriz ? 'height' : 'width';

    popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;
    if (placement === secondarySide) {
      popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];
    } else {
      popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];
    }

    return popperOffsets;
  }

  /**
   * Mimics the `find` method of Array
   * @method
   * @memberof Popper.Utils
For faster browsing, not all history is shown. View entire blame