bootstrap.bundle.js 244 KB
Newer Older
XhmikosR's avatar
Dist    
XhmikosR committed
2001
2002
        if (actives.length === 0) {
          actives = null;
Mark Otto's avatar
dist  
Mark Otto committed
2003
        }
XhmikosR's avatar
Dist    
XhmikosR committed
2004
      }
Mark Otto's avatar
dist  
Mark Otto committed
2005

XhmikosR's avatar
XhmikosR committed
2006
2007
      var container = SelectorEngine.findOne(this._selector);

XhmikosR's avatar
Dist    
XhmikosR committed
2008
      if (actives) {
XhmikosR's avatar
XhmikosR committed
2009
2010
2011
2012
        var tempActiveData = actives.filter(function (elem) {
          return container !== elem;
        });
        activesData = tempActiveData[0] ? Data.getData(tempActiveData[0], DATA_KEY$3) : null;
Mark Otto's avatar
dist    
Mark Otto committed
2013

XhmikosR's avatar
Dist    
XhmikosR committed
2014
        if (activesData && activesData._isTransitioning) {
Mark Otto's avatar
dist    
Mark Otto committed
2015
2016
          return;
        }
XhmikosR's avatar
Dist    
XhmikosR committed
2017
      }
Mark Otto's avatar
dist  
Mark Otto committed
2018

XhmikosR's avatar
XhmikosR committed
2019
      var startEvent = EventHandler.trigger(this._element, Event$4.SHOW);
Mark Otto's avatar
dist  
Mark Otto committed
2020

XhmikosR's avatar
XhmikosR committed
2021
      if (startEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
2022
2023
        return;
      }
Mark Otto's avatar
dist  
Mark Otto committed
2024

XhmikosR's avatar
Dist    
XhmikosR committed
2025
      if (actives) {
XhmikosR's avatar
XhmikosR committed
2026
2027
        actives.forEach(function (elemActive) {
          if (container !== elemActive) {
XhmikosR's avatar
XhmikosR committed
2028
            Collapse.collapseInterface(elemActive, 'hide');
XhmikosR's avatar
XhmikosR committed
2029
          }
Mark Otto's avatar
dist  
Mark Otto committed
2030

XhmikosR's avatar
XhmikosR committed
2031
2032
2033
2034
          if (!activesData) {
            Data.setData(elemActive, DATA_KEY$3, null);
          }
        });
XhmikosR's avatar
Dist    
XhmikosR committed
2035
      }
Mark Otto's avatar
dist  
Mark Otto committed
2036

XhmikosR's avatar
Dist    
XhmikosR committed
2037
      var dimension = this._getDimension();
Mark Otto's avatar
dist  
Mark Otto committed
2038

XhmikosR's avatar
XhmikosR committed
2039
2040
2041
2042
      this._element.classList.remove(ClassName$3.COLLAPSE);

      this._element.classList.add(ClassName$3.COLLAPSING);

XhmikosR's avatar
Dist    
XhmikosR committed
2043
      this._element.style[dimension] = 0;
Mark Otto's avatar
dist  
Mark Otto committed
2044

XhmikosR's avatar
Dist    
XhmikosR committed
2045
      if (this._triggerArray.length) {
XhmikosR's avatar
XhmikosR committed
2046
2047
2048
2049
        this._triggerArray.forEach(function (element) {
          element.classList.remove(ClassName$3.COLLAPSED);
          element.setAttribute('aria-expanded', true);
        });
XhmikosR's avatar
Dist    
XhmikosR committed
2050
      }
Mark Otto's avatar
dist  
Mark Otto committed
2051

XhmikosR's avatar
Dist    
XhmikosR committed
2052
      this.setTransitioning(true);
Mark Otto's avatar
dist  
Mark Otto committed
2053

XhmikosR's avatar
Dist    
XhmikosR committed
2054
      var complete = function complete() {
XhmikosR's avatar
XhmikosR committed
2055
2056
2057
2058
2059
2060
        _this._element.classList.remove(ClassName$3.COLLAPSING);

        _this._element.classList.add(ClassName$3.COLLAPSE);

        _this._element.classList.add(ClassName$3.SHOW);

XhmikosR's avatar
Dist    
XhmikosR committed
2061
2062
2063
2064
        _this._element.style[dimension] = '';

        _this.setTransitioning(false);

XhmikosR's avatar
XhmikosR committed
2065
        EventHandler.trigger(_this._element, Event$4.SHOWN);
Mark Otto's avatar
dist    
Mark Otto committed
2066
      };
Mark Otto's avatar
dist  
Mark Otto committed
2067

XhmikosR's avatar
Dist    
XhmikosR committed
2068
2069
      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
      var scrollSize = "scroll" + capitalizedDimension;
XhmikosR's avatar
XhmikosR committed
2070
2071
2072
      var transitionDuration = getTransitionDurationFromElement(this._element);
      EventHandler.one(this._element, TRANSITION_END, complete);
      emulateTransitionEnd(this._element, transitionDuration);
XhmikosR's avatar
Dist    
XhmikosR committed
2073
2074
      this._element.style[dimension] = this._element[scrollSize] + "px";
    };
Mark Otto's avatar
dist  
Mark Otto committed
2075

XhmikosR's avatar
Dist    
XhmikosR committed
2076
2077
2078
    _proto.hide = function hide() {
      var _this2 = this;

XhmikosR's avatar
XhmikosR committed
2079
      if (this._isTransitioning || !this._element.classList.contains(ClassName$3.SHOW)) {
XhmikosR's avatar
Dist    
XhmikosR committed
2080
2081
        return;
      }
Mark Otto's avatar
dist  
Mark Otto committed
2082

XhmikosR's avatar
XhmikosR committed
2083
      var startEvent = EventHandler.trigger(this._element, Event$4.HIDE);
Mark Otto's avatar
dist    
Mark Otto committed
2084

XhmikosR's avatar
XhmikosR committed
2085
      if (startEvent.defaultPrevented) {
XhmikosR's avatar
Dist    
XhmikosR committed
2086
2087
        return;
      }
Mark Otto's avatar
dist  
Mark Otto committed
2088

XhmikosR's avatar
Dist    
XhmikosR committed
2089
      var dimension = this._getDimension();
Mark Otto's avatar
dist  
Mark Otto committed
2090

XhmikosR's avatar
Dist    
XhmikosR committed
2091
      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
XhmikosR's avatar
XhmikosR committed
2092
2093
2094
2095
2096
2097
2098
2099
      reflow(this._element);

      this._element.classList.add(ClassName$3.COLLAPSING);

      this._element.classList.remove(ClassName$3.COLLAPSE);

      this._element.classList.remove(ClassName$3.SHOW);

XhmikosR's avatar
Dist    
XhmikosR committed
2100
      var triggerArrayLength = this._triggerArray.length;
Mark Otto's avatar
dist  
Mark Otto committed
2101

XhmikosR's avatar
Dist    
XhmikosR committed
2102
2103
2104
      if (triggerArrayLength > 0) {
        for (var i = 0; i < triggerArrayLength; i++) {
          var trigger = this._triggerArray[i];
XhmikosR's avatar
XhmikosR committed
2105
          var elem = getElementFromSelector(trigger);
Mark Otto's avatar
dist    
Mark Otto committed
2106

XhmikosR's avatar
XhmikosR committed
2107
2108
2109
          if (elem && !elem.classList.contains(ClassName$3.SHOW)) {
            trigger.classList.add(ClassName$3.COLLAPSED);
            trigger.setAttribute('aria-expanded', false);
Mark Otto's avatar
dist  
Mark Otto committed
2110
2111
          }
        }
XhmikosR's avatar
Dist    
XhmikosR committed
2112
      }
Mark Otto's avatar
dist  
Mark Otto committed
2113

XhmikosR's avatar
Dist    
XhmikosR committed
2114
      this.setTransitioning(true);
Mark Otto's avatar
dist  
Mark Otto committed
2115

XhmikosR's avatar
Dist    
XhmikosR committed
2116
2117
      var complete = function complete() {
        _this2.setTransitioning(false);
Mark Otto's avatar
dist  
Mark Otto committed
2118

XhmikosR's avatar
XhmikosR committed
2119
2120
2121
2122
2123
        _this2._element.classList.remove(ClassName$3.COLLAPSING);

        _this2._element.classList.add(ClassName$3.COLLAPSE);

        EventHandler.trigger(_this2._element, Event$4.HIDDEN);
Mark Otto's avatar
dist    
Mark Otto committed
2124
      };
Mark Otto's avatar
dist  
Mark Otto committed
2125

XhmikosR's avatar
Dist    
XhmikosR committed
2126
      this._element.style[dimension] = '';
XhmikosR's avatar
XhmikosR committed
2127
2128
2129
      var transitionDuration = getTransitionDurationFromElement(this._element);
      EventHandler.one(this._element, TRANSITION_END, complete);
      emulateTransitionEnd(this._element, transitionDuration);
XhmikosR's avatar
Dist    
XhmikosR committed
2130
    };
Mark Otto's avatar
dist  
Mark Otto committed
2131

XhmikosR's avatar
Dist    
XhmikosR committed
2132
2133
2134
    _proto.setTransitioning = function setTransitioning(isTransitioning) {
      this._isTransitioning = isTransitioning;
    };
Mark Otto's avatar
dist  
Mark Otto committed
2135

XhmikosR's avatar
Dist    
XhmikosR committed
2136
    _proto.dispose = function dispose() {
XhmikosR's avatar
XhmikosR committed
2137
      Data.removeData(this._element, DATA_KEY$3);
XhmikosR's avatar
Dist    
XhmikosR committed
2138
2139
2140
2141
2142
      this._config = null;
      this._parent = null;
      this._element = null;
      this._triggerArray = null;
      this._isTransitioning = null;
Mark Otto's avatar
Mark Otto committed
2143
2144
    } // Private
    ;
Mark Otto's avatar
dist    
Mark Otto committed
2145

XhmikosR's avatar
Dist    
XhmikosR committed
2146
    _proto._getConfig = function _getConfig(config) {
2147
      config = _objectSpread2({}, Default$1, {}, config);
XhmikosR's avatar
Dist    
XhmikosR committed
2148
      config.toggle = Boolean(config.toggle); // Coerce string values
Mark Otto's avatar
dist  
Mark Otto committed
2149

XhmikosR's avatar
XhmikosR committed
2150
      typeCheckConfig(NAME$3, config, DefaultType$1);
XhmikosR's avatar
Dist    
XhmikosR committed
2151
2152
      return config;
    };
Mark Otto's avatar
dist  
Mark Otto committed
2153

XhmikosR's avatar
Dist    
XhmikosR committed
2154
    _proto._getDimension = function _getDimension() {
XhmikosR's avatar
XhmikosR committed
2155
2156
      var hasWidth = this._element.classList.contains(Dimension.WIDTH);

XhmikosR's avatar
Dist    
XhmikosR committed
2157
2158
      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
    };
Mark Otto's avatar
dist  
Mark Otto committed
2159

XhmikosR's avatar
Dist    
XhmikosR committed
2160
2161
    _proto._getParent = function _getParent() {
      var _this3 = this;
Mark Otto's avatar
dist  
Mark Otto committed
2162

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

XhmikosR's avatar
Dist.    
XhmikosR committed
2165
2166
2167
2168
      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
2169
2170
        }
      } else {
XhmikosR's avatar
Dist.    
XhmikosR committed
2171
        parent = SelectorEngine.findOne(parent);
XhmikosR's avatar
Dist    
XhmikosR committed
2172
      }
Mark Otto's avatar
dist  
Mark Otto committed
2173

XhmikosR's avatar
Dist.    
XhmikosR committed
2174
      var selector = "[data-toggle=\"collapse\"][data-parent=\"" + parent + "\"]";
XhmikosR's avatar
XhmikosR committed
2175
      makeArray(SelectorEngine.find(selector, parent)).forEach(function (element) {
XhmikosR's avatar
XhmikosR committed
2176
        var selected = getElementFromSelector(element);
2177
2178

        _this3._addAriaAndCollapsedClass(selected, [element]);
XhmikosR's avatar
Dist    
XhmikosR committed
2179
2180
2181
      });
      return parent;
    };
Mark Otto's avatar
dist  
Mark Otto committed
2182

XhmikosR's avatar
XhmikosR committed
2183
2184
2185
2186
2187
2188
    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
      if (element) {
        var isOpen = element.classList.contains(ClassName$3.SHOW);

        if (triggerArray.length) {
          triggerArray.forEach(function (elem) {
XhmikosR's avatar
Dist.    
XhmikosR committed
2189
            if (isOpen) {
XhmikosR's avatar
XhmikosR committed
2190
              elem.classList.remove(ClassName$3.COLLAPSED);
XhmikosR's avatar
Dist.    
XhmikosR committed
2191
2192
            } else {
              elem.classList.add(ClassName$3.COLLAPSED);
XhmikosR's avatar
XhmikosR committed
2193
            }
Mark Otto's avatar
dist  
Mark Otto committed
2194

XhmikosR's avatar
XhmikosR committed
2195
2196
2197
            elem.setAttribute('aria-expanded', isOpen);
          });
        }
XhmikosR's avatar
Dist    
XhmikosR committed
2198
      }
Mark Otto's avatar
Mark Otto committed
2199
2200
    } // Static
    ;
Mark Otto's avatar
dist  
Mark Otto committed
2201

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

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

XhmikosR's avatar
XhmikosR committed
2207
2208
2209
      if (!data && _config.toggle && /show|hide/.test(config)) {
        _config.toggle = false;
      }
Mark Otto's avatar
dist    
Mark Otto committed
2210

XhmikosR's avatar
XhmikosR committed
2211
2212
2213
2214
2215
2216
      if (!data) {
        data = new Collapse(element, _config);
      }

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

XhmikosR's avatar
XhmikosR committed
2220
2221
2222
        data[config]();
      }
    };
Mark Otto's avatar
dist    
Mark Otto committed
2223

XhmikosR's avatar
XhmikosR committed
2224
    Collapse.jQueryInterface = function jQueryInterface(config) {
XhmikosR's avatar
XhmikosR committed
2225
      return this.each(function () {
XhmikosR's avatar
XhmikosR committed
2226
        Collapse.collapseInterface(this, config);
XhmikosR's avatar
Dist    
XhmikosR committed
2227
2228
      });
    };
Mark Otto's avatar
dist  
Mark Otto committed
2229

XhmikosR's avatar
XhmikosR committed
2230
    Collapse.getInstance = function getInstance(element) {
XhmikosR's avatar
XhmikosR committed
2231
2232
2233
      return Data.getData(element, DATA_KEY$3);
    };

XhmikosR's avatar
Dist    
XhmikosR committed
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
    _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
2245

XhmikosR's avatar
Dist    
XhmikosR committed
2246
2247
2248
2249
2250
2251
2252
    return Collapse;
  }();
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */
Mark Otto's avatar
dist    
Mark Otto committed
2253

Mark Otto's avatar
dist  
Mark Otto committed
2254

XhmikosR's avatar
XhmikosR committed
2255
  EventHandler.on(document, Event$4.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) {
XhmikosR's avatar
Dist    
XhmikosR committed
2256
    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
XhmikosR's avatar
XhmikosR committed
2257
    if (event.target.tagName === 'A') {
XhmikosR's avatar
Dist    
XhmikosR committed
2258
2259
      event.preventDefault();
    }
Mark Otto's avatar
dist    
Mark Otto committed
2260

XhmikosR's avatar
XhmikosR committed
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
    var triggerData = Manipulator.getDataAttributes(this);
    var selector = getSelectorFromElement(this);
    var selectorElements = makeArray(SelectorEngine.find(selector));
    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
2279

XhmikosR's avatar
XhmikosR committed
2280
      Collapse.collapseInterface(element, config);
XhmikosR's avatar
Dist    
XhmikosR committed
2281
2282
    });
  });
XhmikosR's avatar
XhmikosR committed
2283
  var $$4 = getjQuery();
XhmikosR's avatar
Dist    
XhmikosR committed
2284
2285
2286
2287
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
XhmikosR's avatar
XhmikosR committed
2288
   * add .collapse to jQuery only if jQuery is present
XhmikosR's avatar
Dist    
XhmikosR committed
2289
   */
Mark Otto's avatar
dist    
Mark Otto committed
2290

2291
2292
  /* istanbul ignore if */

XhmikosR's avatar
XhmikosR committed
2293
2294
2295
2296
  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
2297

XhmikosR's avatar
XhmikosR committed
2298
2299
2300
    $$4.fn[NAME$3].noConflict = function () {
      $$4.fn[NAME$3] = JQUERY_NO_CONFLICT$3;
      return Collapse.jQueryInterface;
XhmikosR's avatar
XhmikosR committed
2301
2302
    };
  }
Mark Otto's avatar
dist  
Mark Otto committed
2303

Mark Otto's avatar
dist    
Mark Otto committed
2304
2305
  /**!
   * @fileOverview Kickass library to create and place poppers near their reference elements.
XhmikosR's avatar
XhmikosR committed
2306
   * @version 1.15.0
Mark Otto's avatar
dist    
Mark Otto committed
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
   * @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.
   */
  var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
Mark Otto's avatar
dist    
Mark Otto committed
2329

Mark Otto's avatar
dist    
Mark Otto committed
2330
2331
2332
2333
2334
2335
  var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];
  var timeoutDuration = 0;
  for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {
    if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {
      timeoutDuration = 1;
      break;
Mark Otto's avatar
dist  
Mark Otto committed
2336
    }
Mark Otto's avatar
dist    
Mark Otto committed
2337
  }
Mark Otto's avatar
dist  
Mark Otto committed
2338

Mark Otto's avatar
dist    
Mark Otto committed
2339
2340
2341
2342
2343
2344
2345
2346
2347
  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
2348
        fn();
Mark Otto's avatar
dist    
Mark Otto committed
2349
2350
      });
    };
Mark Otto's avatar
dist  
Mark Otto committed
2351
2352
  }

Mark Otto's avatar
dist    
Mark Otto committed
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
  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
2364
2365
  }

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

Mark Otto's avatar
dist    
Mark Otto committed
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
  /**
  * 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
2378

Mark Otto's avatar
dist    
Mark Otto committed
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
  /**
   * 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
2389
2390
  }

Mark Otto's avatar
dist    
Mark Otto committed
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
  /**
   * 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
2401
    }
Mark Otto's avatar
dist    
Mark Otto committed
2402
    // NOTE: 1 DOM access here
XhmikosR's avatar
Dist    
XhmikosR committed
2403
2404
    var window = element.ownerDocument.defaultView;
    var css = window.getComputedStyle(element, null);
Mark Otto's avatar
dist    
Mark Otto committed
2405
    return property ? css[property] : css;
Mark Otto's avatar
dist  
Mark Otto committed
2406
2407
  }

Mark Otto's avatar
dist    
Mark Otto committed
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
  /**
   * 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
2420
2421
  }

Mark Otto's avatar
dist    
Mark Otto committed
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
  /**
   * 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
2434

Mark Otto's avatar
dist    
Mark Otto committed
2435
2436
2437
2438
2439
2440
2441
    switch (element.nodeName) {
      case 'HTML':
      case 'BODY':
        return element.ownerDocument.body;
      case '#document':
        return element.body;
    }
Mark Otto's avatar
dist  
Mark Otto committed
2442

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

Mark Otto's avatar
dist    
Mark Otto committed
2445
2446
2447
2448
    var _getStyleComputedProp = getStyleComputedProperty(element),
        overflow = _getStyleComputedProp.overflow,
        overflowX = _getStyleComputedProp.overflowX,
        overflowY = _getStyleComputedProp.overflowY;
Mark Otto's avatar
dist  
Mark Otto committed
2449

Mark Otto's avatar
dist    
Mark Otto committed
2450
2451
    if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {
      return element;
Mark Otto's avatar
dist  
Mark Otto committed
2452
2453
    }

Mark Otto's avatar
dist    
Mark Otto committed
2454
    return getScrollParent(getParentNode(element));
Mark Otto's avatar
dist  
Mark Otto committed
2455
2456
  }

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

Mark Otto's avatar
dist    
Mark Otto committed
2460
  /**
Mark Otto's avatar
dist    
Mark Otto committed
2461
   * Determines if the browser is Internet Explorer
Mark Otto's avatar
dist    
Mark Otto committed
2462
2463
   * @method
   * @memberof Popper.Utils
Mark Otto's avatar
dist    
Mark Otto committed
2464
   * @param {Number} version to check
Mark Otto's avatar
dist    
Mark Otto committed
2465
2466
   * @returns {Boolean} isIE
   */
Mark Otto's avatar
dist    
Mark Otto committed
2467
2468
2469
  function isIE(version) {
    if (version === 11) {
      return isIE11;
Mark Otto's avatar
dist    
Mark Otto committed
2470
    }
Mark Otto's avatar
dist    
Mark Otto committed
2471
2472
    if (version === 10) {
      return isIE10;
Mark Otto's avatar
dist    
Mark Otto committed
2473
    }
Mark Otto's avatar
dist    
Mark Otto committed
2474
2475
    return isIE11 || isIE10;
  }
Mark Otto's avatar
dist  
Mark Otto committed
2476

Mark Otto's avatar
dist    
Mark Otto committed
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
  /**
   * 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
2487
2488
    }

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

Mark Otto's avatar
dist    
Mark Otto committed
2491
    // NOTE: 1 DOM access here
XhmikosR's avatar
Dist    
XhmikosR committed
2492
    var offsetParent = element.offsetParent || null;
Mark Otto's avatar
dist    
Mark Otto committed
2493
2494
2495
2496
    // 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
2497

Mark Otto's avatar
dist    
Mark Otto committed
2498
    var nodeName = offsetParent && offsetParent.nodeName;
Mark Otto's avatar
dist  
Mark Otto committed
2499

Mark Otto's avatar
dist    
Mark Otto committed
2500
2501
2502
    if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {
      return element ? element.ownerDocument.documentElement : document.documentElement;
    }
Mark Otto's avatar
dist  
Mark Otto committed
2503

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

Mark Otto's avatar
dist    
Mark Otto committed
2510
    return offsetParent;
Mark Otto's avatar
dist  
Mark Otto committed
2511
2512
  }

Mark Otto's avatar
dist    
Mark Otto committed
2513
2514
  function isOffsetContainer(element) {
    var nodeName = element.nodeName;
Mark Otto's avatar
dist  
Mark Otto committed
2515

Mark Otto's avatar
dist    
Mark Otto committed
2516
2517
    if (nodeName === 'BODY') {
      return false;
Mark Otto's avatar
dist  
Mark Otto committed
2518
    }
Mark Otto's avatar
dist    
Mark Otto committed
2519
    return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;
Mark Otto's avatar
dist  
Mark Otto committed
2520
2521
  }

Mark Otto's avatar
dist    
Mark Otto committed
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
  /**
   * 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
2533

Mark Otto's avatar
dist    
Mark Otto committed
2534
    return node;
Mark Otto's avatar
dist  
Mark Otto committed
2535
2536
  }

Mark Otto's avatar
dist    
Mark Otto committed
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
  /**
   * 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
2550

Mark Otto's avatar
dist    
Mark Otto committed
2551
2552
2553
2554
    // 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
2555

Mark Otto's avatar
dist    
Mark Otto committed
2556
2557
2558
2559
2560
    // 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
2561

Mark Otto's avatar
dist    
Mark Otto committed
2562
    // Both nodes are inside #document
Mark Otto's avatar
dist  
Mark Otto committed
2563

Mark Otto's avatar
dist    
Mark Otto committed
2564
2565
2566
2567
    if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {
      if (isOffsetContainer(commonAncestorContainer)) {
        return commonAncestorContainer;
      }
Mark Otto's avatar
dist  
Mark Otto committed
2568

Mark Otto's avatar
dist    
Mark Otto committed
2569
2570
      return getOffsetParent(commonAncestorContainer);
    }
Mark Otto's avatar
dist  
Mark Otto committed
2571

Mark Otto's avatar
dist    
Mark Otto committed
2572
2573
2574
2575
    // 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
2576
    } else {
Mark Otto's avatar
dist    
Mark Otto committed
2577
      return findCommonOffsetParent(element1, getRoot(element2).host);
Mark Otto's avatar
dist  
Mark Otto committed
2578
    }
Mark Otto's avatar
dist    
Mark Otto committed
2579
  }
Mark Otto's avatar
dist  
Mark Otto committed
2580

Mark Otto's avatar
dist    
Mark Otto committed
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
  /**
   * 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
2591

Mark Otto's avatar
dist    
Mark Otto committed
2592
2593
    var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';
    var nodeName = element.nodeName;
Mark Otto's avatar
dist  
Mark Otto committed
2594

Mark Otto's avatar
dist    
Mark Otto committed
2595
2596
2597
2598
    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
2599
2600
    }

Mark Otto's avatar
dist    
Mark Otto committed
2601
    return element[upperSide];
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
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
  /*
   * 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
2625

Mark Otto's avatar
dist    
Mark Otto committed
2626
2627
2628
2629
2630
2631
2632
2633
2634
  /*
   * 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
2635

Mark Otto's avatar
dist    
Mark Otto committed
2636
2637
2638
  function getBordersSize(styles, axis) {
    var sideA = axis === 'x' ? 'Left' : 'Top';
    var sideB = sideA === 'Left' ? 'Right' : 'Bottom';
Mark Otto's avatar
dist  
Mark Otto committed
2639

Mark Otto's avatar
dist    
Mark Otto committed
2640
    return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);
Mark Otto's avatar
dist  
Mark Otto committed
2641
2642
  }

Mark Otto's avatar
dist    
Mark Otto committed
2643
  function getSize(axis, body, html, computedStyle) {
Mark Otto's avatar
dist    
Mark Otto committed
2644
    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
2645
2646
  }

Mark Otto's avatar
dist    
Mark Otto committed
2647
  function getWindowSizes(document) {
Mark Otto's avatar
dist    
Mark Otto committed
2648
2649
2650
    var body = document.body;
    var html = document.documentElement;
    var computedStyle = isIE(10) && getComputedStyle(html);
Mark Otto's avatar
dist  
Mark Otto committed
2651

Mark Otto's avatar
dist    
Mark Otto committed
2652
2653
2654
2655
    return {
      height: getSize('Height', body, html, computedStyle),
      width: getSize('Width', body, html, computedStyle)
    };
Mark Otto's avatar
dist  
Mark Otto committed
2656
2657
  }

Mark Otto's avatar
dist    
Mark Otto committed
2658
2659
2660
2661
  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
2662
2663
  };

Mark Otto's avatar
dist    
Mark Otto committed
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
  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
2674

Mark Otto's avatar
dist    
Mark Otto committed
2675
2676
2677
2678
2679
2680
    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
2681
2682
2683
2684
2685





Mark Otto's avatar
dist    
Mark Otto committed
2686
2687
2688
2689
2690
2691
2692
2693
  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
2694
    } else {
Mark Otto's avatar
dist    
Mark Otto committed
2695
      obj[key] = value;
Mark Otto's avatar
dist  
Mark Otto committed
2696
2697
    }

Mark Otto's avatar
dist    
Mark Otto committed
2698
2699
    return obj;
  };
Mark Otto's avatar
dist  
Mark Otto committed
2700

Mark Otto's avatar
dist    
Mark Otto committed
2701
2702
2703
  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
2704

Mark Otto's avatar
dist    
Mark Otto committed
2705
2706
2707
2708
2709
2710
      for (var key in source) {
        if (Object.prototype.hasOwnProperty.call(source, key)) {
          target[key] = source[key];
        }
      }
    }
Mark Otto's avatar
dist  
Mark Otto committed
2711

Mark Otto's avatar
dist    
Mark Otto committed
2712
    return target;
Mark Otto's avatar
dist  
Mark Otto committed
2713
2714
  };

Mark Otto's avatar
dist    
Mark Otto committed
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
  /**
   * 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
2727
2728
  }

Mark Otto's avatar
dist    
Mark Otto committed
2729
2730
2731
2732
2733
2734
2735
2736
2737
  /**
   * 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
2738

Mark Otto's avatar
dist    
Mark Otto committed
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
    // 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
2762

Mark Otto's avatar
dist    
Mark Otto committed
2763
    // subtract scrollbar size from sizes
Mark Otto's avatar
dist    
Mark Otto committed
2764
    var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};
Mark Otto's avatar
dist    
Mark Otto committed
2765
2766
    var width = sizes.width || element.clientWidth || result.right - result.left;
    var height = sizes.height || element.clientHeight || result.bottom - result.top;
Mark Otto's avatar
dist  
Mark Otto committed
2767

Mark Otto's avatar
dist    
Mark Otto committed
2768
2769
    var horizScrollbar = element.offsetWidth - width;
    var vertScrollbar = element.offsetHeight - height;
Mark Otto's avatar
dist  
Mark Otto committed
2770

Mark Otto's avatar
dist    
Mark Otto committed
2771
2772
2773
2774
2775
2776
2777
2778
2779
    // 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
2780
    }
Mark Otto's avatar
dist    
Mark Otto committed
2781
2782

    return getClientRect(result);
Mark Otto's avatar
dist  
Mark Otto committed
2783
2784
  }

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

Mark Otto's avatar
dist    
Mark Otto committed
2788
2789
2790
2791
2792
    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
2793

Mark Otto's avatar
dist    
Mark Otto committed
2794
2795
2796
    var styles = getStyleComputedProperty(parent);
    var borderTopWidth = parseFloat(styles.borderTopWidth, 10);
    var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);
Mark Otto's avatar
dist  
Mark Otto committed
2797

Mark Otto's avatar
dist    
Mark Otto committed
2798
    // In cases where the parent is fixed, we must ignore negative scroll in offset calc
Mark Otto's avatar
dist    
Mark Otto committed
2799
    if (fixedPosition && isHTML) {
Mark Otto's avatar
dist    
Mark Otto committed
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
      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
2829

Mark Otto's avatar
dist    
Mark Otto committed
2830
2831
2832
    if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {
      offsets = includeScroll(offsets, parent);
    }
Mark Otto's avatar
dist  
Mark Otto committed
2833

Mark Otto's avatar
dist    
Mark Otto committed
2834
    return offsets;
Mark Otto's avatar
dist  
Mark Otto committed
2835
2836
  }

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

Mark Otto's avatar
dist    
Mark Otto committed
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
    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
2854

Mark Otto's avatar
dist    
Mark Otto committed
2855
    return getClientRect(offset);
Mark Otto's avatar
dist  
Mark Otto committed
2856
2857
  }

Mark Otto's avatar
dist    
Mark Otto committed
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
  /**
   * 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
2870
    }
Mark Otto's avatar
dist    
Mark Otto committed
2871
2872
2873
    if (getStyleComputedProperty(element, 'position') === 'fixed') {
      return true;
    }
Mark Otto's avatar
Mark Otto committed
2874
2875
2876
2877
2878
    var parentNode = getParentNode(element);
    if (!parentNode) {
      return false;
    }
    return isFixed(parentNode);
Mark Otto's avatar
dist    
Mark Otto committed
2879
  }
Mark Otto's avatar
dist  
Mark Otto committed
2880

Mark Otto's avatar
dist    
Mark Otto committed
2881
2882
2883
2884
2885
2886
2887
  /**
   * 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
2888

Mark Otto's avatar
dist    
Mark Otto committed
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
  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
2900

Mark Otto's avatar
dist    
Mark Otto committed
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
  /**
   * 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
2914

Mark Otto's avatar
dist    
Mark Otto committed
2915
    // NOTE: 1 DOM access here
Mark Otto's avatar
dist  
Mark Otto committed
2916

Mark Otto's avatar
dist    
Mark Otto committed
2917
2918
    var boundaries = { top: 0, left: 0 };
    var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);
Mark Otto's avatar
dist  
Mark Otto committed
2919

Mark Otto's avatar
dist    
Mark Otto committed
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
    // 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
2936

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

Mark Otto's avatar
dist    
Mark Otto committed
2939
2940
      // In case of HTML, we need a different computation
      if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {
Mark Otto's avatar
dist    
Mark Otto committed
2941
        var _getWindowSizes = getWindowSizes(popper.ownerDocument),
Mark Otto's avatar
dist    
Mark Otto committed
2942
2943
            height = _getWindowSizes.height,
            width = _getWindowSizes.width;
Mark Otto's avatar
dist  
Mark Otto committed
2944

Mark Otto's avatar
dist    
Mark Otto committed
2945
2946
2947
2948
2949
2950
2951
        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
2952
      }
Mark Otto's avatar
dist    
Mark Otto committed
2953
    }
Mark Otto's avatar
dist  
Mark Otto committed
2954

Mark Otto's avatar
dist    
Mark Otto committed
2955
    // Add paddings
Mark Otto's avatar
dist    
Mark Otto committed
2956
2957
2958
2959
2960
2961
    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
2962

Mark Otto's avatar
dist    
Mark Otto committed
2963
    return boundaries;
Mark Otto's avatar
dist  
Mark Otto committed
2964
2965
  }

Mark Otto's avatar
dist    
Mark Otto committed
2966
2967
2968
2969
2970
  function getArea(_ref) {
    var width = _ref.width,
        height = _ref.height;

    return width * height;
Mark Otto's avatar
dist  
Mark Otto committed
2971
2972
  }

Mark Otto's avatar
dist    
Mark Otto committed
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
  /**
   * 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
2984

Mark Otto's avatar
dist    
Mark Otto committed
2985
2986
    if (placement.indexOf('auto') === -1) {
      return placement;
Mark Otto's avatar
dist  
Mark Otto committed
2987
2988
    }

Mark Otto's avatar
dist    
Mark Otto committed
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
    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: {
For faster browsing, not all history is shown. View entire blame