source: imaps-frontend/node_modules/@popperjs/core/dist/umd/popper.js

main
Last change on this file was 79a0317, checked in by stefan toskovski <stefantoska84@…>, 4 days ago

F4 Finalna Verzija

  • Property mode set to 100644
File size: 61.6 KB
Line 
1/**
2 * @popperjs/core v2.11.8 - MIT License
3 */
4
5(function (global, factory) {
6 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
7 typeof define === 'function' && define.amd ? define(['exports'], factory) :
8 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Popper = {}));
9}(this, (function (exports) { 'use strict';
10
11 function getWindow(node) {
12 if (node == null) {
13 return window;
14 }
15
16 if (node.toString() !== '[object Window]') {
17 var ownerDocument = node.ownerDocument;
18 return ownerDocument ? ownerDocument.defaultView || window : window;
19 }
20
21 return node;
22 }
23
24 function isElement(node) {
25 var OwnElement = getWindow(node).Element;
26 return node instanceof OwnElement || node instanceof Element;
27 }
28
29 function isHTMLElement(node) {
30 var OwnElement = getWindow(node).HTMLElement;
31 return node instanceof OwnElement || node instanceof HTMLElement;
32 }
33
34 function isShadowRoot(node) {
35 // IE 11 has no ShadowRoot
36 if (typeof ShadowRoot === 'undefined') {
37 return false;
38 }
39
40 var OwnElement = getWindow(node).ShadowRoot;
41 return node instanceof OwnElement || node instanceof ShadowRoot;
42 }
43
44 var max = Math.max;
45 var min = Math.min;
46 var round = Math.round;
47
48 function getUAString() {
49 var uaData = navigator.userAgentData;
50
51 if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {
52 return uaData.brands.map(function (item) {
53 return item.brand + "/" + item.version;
54 }).join(' ');
55 }
56
57 return navigator.userAgent;
58 }
59
60 function isLayoutViewport() {
61 return !/^((?!chrome|android).)*safari/i.test(getUAString());
62 }
63
64 function getBoundingClientRect(element, includeScale, isFixedStrategy) {
65 if (includeScale === void 0) {
66 includeScale = false;
67 }
68
69 if (isFixedStrategy === void 0) {
70 isFixedStrategy = false;
71 }
72
73 var clientRect = element.getBoundingClientRect();
74 var scaleX = 1;
75 var scaleY = 1;
76
77 if (includeScale && isHTMLElement(element)) {
78 scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;
79 scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;
80 }
81
82 var _ref = isElement(element) ? getWindow(element) : window,
83 visualViewport = _ref.visualViewport;
84
85 var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;
86 var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;
87 var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;
88 var width = clientRect.width / scaleX;
89 var height = clientRect.height / scaleY;
90 return {
91 width: width,
92 height: height,
93 top: y,
94 right: x + width,
95 bottom: y + height,
96 left: x,
97 x: x,
98 y: y
99 };
100 }
101
102 function getWindowScroll(node) {
103 var win = getWindow(node);
104 var scrollLeft = win.pageXOffset;
105 var scrollTop = win.pageYOffset;
106 return {
107 scrollLeft: scrollLeft,
108 scrollTop: scrollTop
109 };
110 }
111
112 function getHTMLElementScroll(element) {
113 return {
114 scrollLeft: element.scrollLeft,
115 scrollTop: element.scrollTop
116 };
117 }
118
119 function getNodeScroll(node) {
120 if (node === getWindow(node) || !isHTMLElement(node)) {
121 return getWindowScroll(node);
122 } else {
123 return getHTMLElementScroll(node);
124 }
125 }
126
127 function getNodeName(element) {
128 return element ? (element.nodeName || '').toLowerCase() : null;
129 }
130
131 function getDocumentElement(element) {
132 // $FlowFixMe[incompatible-return]: assume body is always available
133 return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]
134 element.document) || window.document).documentElement;
135 }
136
137 function getWindowScrollBarX(element) {
138 // If <html> has a CSS width greater than the viewport, then this will be
139 // incorrect for RTL.
140 // Popper 1 is broken in this case and never had a bug report so let's assume
141 // it's not an issue. I don't think anyone ever specifies width on <html>
142 // anyway.
143 // Browsers where the left scrollbar doesn't cause an issue report `0` for
144 // this (e.g. Edge 2019, IE11, Safari)
145 return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;
146 }
147
148 function getComputedStyle(element) {
149 return getWindow(element).getComputedStyle(element);
150 }
151
152 function isScrollParent(element) {
153 // Firefox wants us to check `-x` and `-y` variations as well
154 var _getComputedStyle = getComputedStyle(element),
155 overflow = _getComputedStyle.overflow,
156 overflowX = _getComputedStyle.overflowX,
157 overflowY = _getComputedStyle.overflowY;
158
159 return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);
160 }
161
162 function isElementScaled(element) {
163 var rect = element.getBoundingClientRect();
164 var scaleX = round(rect.width) / element.offsetWidth || 1;
165 var scaleY = round(rect.height) / element.offsetHeight || 1;
166 return scaleX !== 1 || scaleY !== 1;
167 } // Returns the composite rect of an element relative to its offsetParent.
168 // Composite means it takes into account transforms as well as layout.
169
170
171 function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
172 if (isFixed === void 0) {
173 isFixed = false;
174 }
175
176 var isOffsetParentAnElement = isHTMLElement(offsetParent);
177 var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);
178 var documentElement = getDocumentElement(offsetParent);
179 var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);
180 var scroll = {
181 scrollLeft: 0,
182 scrollTop: 0
183 };
184 var offsets = {
185 x: 0,
186 y: 0
187 };
188
189 if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
190 if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078
191 isScrollParent(documentElement)) {
192 scroll = getNodeScroll(offsetParent);
193 }
194
195 if (isHTMLElement(offsetParent)) {
196 offsets = getBoundingClientRect(offsetParent, true);
197 offsets.x += offsetParent.clientLeft;
198 offsets.y += offsetParent.clientTop;
199 } else if (documentElement) {
200 offsets.x = getWindowScrollBarX(documentElement);
201 }
202 }
203
204 return {
205 x: rect.left + scroll.scrollLeft - offsets.x,
206 y: rect.top + scroll.scrollTop - offsets.y,
207 width: rect.width,
208 height: rect.height
209 };
210 }
211
212 // means it doesn't take into account transforms.
213
214 function getLayoutRect(element) {
215 var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.
216 // Fixes https://github.com/popperjs/popper-core/issues/1223
217
218 var width = element.offsetWidth;
219 var height = element.offsetHeight;
220
221 if (Math.abs(clientRect.width - width) <= 1) {
222 width = clientRect.width;
223 }
224
225 if (Math.abs(clientRect.height - height) <= 1) {
226 height = clientRect.height;
227 }
228
229 return {
230 x: element.offsetLeft,
231 y: element.offsetTop,
232 width: width,
233 height: height
234 };
235 }
236
237 function getParentNode(element) {
238 if (getNodeName(element) === 'html') {
239 return element;
240 }
241
242 return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle
243 // $FlowFixMe[incompatible-return]
244 // $FlowFixMe[prop-missing]
245 element.assignedSlot || // step into the shadow DOM of the parent of a slotted node
246 element.parentNode || ( // DOM Element detected
247 isShadowRoot(element) ? element.host : null) || // ShadowRoot detected
248 // $FlowFixMe[incompatible-call]: HTMLElement is a Node
249 getDocumentElement(element) // fallback
250
251 );
252 }
253
254 function getScrollParent(node) {
255 if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {
256 // $FlowFixMe[incompatible-return]: assume body is always available
257 return node.ownerDocument.body;
258 }
259
260 if (isHTMLElement(node) && isScrollParent(node)) {
261 return node;
262 }
263
264 return getScrollParent(getParentNode(node));
265 }
266
267 /*
268 given a DOM element, return the list of all scroll parents, up the list of ancesors
269 until we get to the top window object. This list is what we attach scroll listeners
270 to, because if any of these parent elements scroll, we'll need to re-calculate the
271 reference element's position.
272 */
273
274 function listScrollParents(element, list) {
275 var _element$ownerDocumen;
276
277 if (list === void 0) {
278 list = [];
279 }
280
281 var scrollParent = getScrollParent(element);
282 var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);
283 var win = getWindow(scrollParent);
284 var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;
285 var updatedList = list.concat(target);
286 return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here
287 updatedList.concat(listScrollParents(getParentNode(target)));
288 }
289
290 function isTableElement(element) {
291 return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;
292 }
293
294 function getTrueOffsetParent(element) {
295 if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837
296 getComputedStyle(element).position === 'fixed') {
297 return null;
298 }
299
300 return element.offsetParent;
301 } // `.offsetParent` reports `null` for fixed elements, while absolute elements
302 // return the containing block
303
304
305 function getContainingBlock(element) {
306 var isFirefox = /firefox/i.test(getUAString());
307 var isIE = /Trident/i.test(getUAString());
308
309 if (isIE && isHTMLElement(element)) {
310 // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport
311 var elementCss = getComputedStyle(element);
312
313 if (elementCss.position === 'fixed') {
314 return null;
315 }
316 }
317
318 var currentNode = getParentNode(element);
319
320 if (isShadowRoot(currentNode)) {
321 currentNode = currentNode.host;
322 }
323
324 while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {
325 var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that
326 // create a containing block.
327 // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
328
329 if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {
330 return currentNode;
331 } else {
332 currentNode = currentNode.parentNode;
333 }
334 }
335
336 return null;
337 } // Gets the closest ancestor positioned element. Handles some edge cases,
338 // such as table ancestors and cross browser bugs.
339
340
341 function getOffsetParent(element) {
342 var window = getWindow(element);
343 var offsetParent = getTrueOffsetParent(element);
344
345 while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {
346 offsetParent = getTrueOffsetParent(offsetParent);
347 }
348
349 if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {
350 return window;
351 }
352
353 return offsetParent || getContainingBlock(element) || window;
354 }
355
356 var top = 'top';
357 var bottom = 'bottom';
358 var right = 'right';
359 var left = 'left';
360 var auto = 'auto';
361 var basePlacements = [top, bottom, right, left];
362 var start = 'start';
363 var end = 'end';
364 var clippingParents = 'clippingParents';
365 var viewport = 'viewport';
366 var popper = 'popper';
367 var reference = 'reference';
368 var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {
369 return acc.concat([placement + "-" + start, placement + "-" + end]);
370 }, []);
371 var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {
372 return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
373 }, []); // modifiers that need to read the DOM
374
375 var beforeRead = 'beforeRead';
376 var read = 'read';
377 var afterRead = 'afterRead'; // pure-logic modifiers
378
379 var beforeMain = 'beforeMain';
380 var main = 'main';
381 var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)
382
383 var beforeWrite = 'beforeWrite';
384 var write = 'write';
385 var afterWrite = 'afterWrite';
386 var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
387
388 function order(modifiers) {
389 var map = new Map();
390 var visited = new Set();
391 var result = [];
392 modifiers.forEach(function (modifier) {
393 map.set(modifier.name, modifier);
394 }); // On visiting object, check for its dependencies and visit them recursively
395
396 function sort(modifier) {
397 visited.add(modifier.name);
398 var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
399 requires.forEach(function (dep) {
400 if (!visited.has(dep)) {
401 var depModifier = map.get(dep);
402
403 if (depModifier) {
404 sort(depModifier);
405 }
406 }
407 });
408 result.push(modifier);
409 }
410
411 modifiers.forEach(function (modifier) {
412 if (!visited.has(modifier.name)) {
413 // check for visited object
414 sort(modifier);
415 }
416 });
417 return result;
418 }
419
420 function orderModifiers(modifiers) {
421 // order based on dependencies
422 var orderedModifiers = order(modifiers); // order based on phase
423
424 return modifierPhases.reduce(function (acc, phase) {
425 return acc.concat(orderedModifiers.filter(function (modifier) {
426 return modifier.phase === phase;
427 }));
428 }, []);
429 }
430
431 function debounce(fn) {
432 var pending;
433 return function () {
434 if (!pending) {
435 pending = new Promise(function (resolve) {
436 Promise.resolve().then(function () {
437 pending = undefined;
438 resolve(fn());
439 });
440 });
441 }
442
443 return pending;
444 };
445 }
446
447 function mergeByName(modifiers) {
448 var merged = modifiers.reduce(function (merged, current) {
449 var existing = merged[current.name];
450 merged[current.name] = existing ? Object.assign({}, existing, current, {
451 options: Object.assign({}, existing.options, current.options),
452 data: Object.assign({}, existing.data, current.data)
453 }) : current;
454 return merged;
455 }, {}); // IE11 does not support Object.values
456
457 return Object.keys(merged).map(function (key) {
458 return merged[key];
459 });
460 }
461
462 function getViewportRect(element, strategy) {
463 var win = getWindow(element);
464 var html = getDocumentElement(element);
465 var visualViewport = win.visualViewport;
466 var width = html.clientWidth;
467 var height = html.clientHeight;
468 var x = 0;
469 var y = 0;
470
471 if (visualViewport) {
472 width = visualViewport.width;
473 height = visualViewport.height;
474 var layoutViewport = isLayoutViewport();
475
476 if (layoutViewport || !layoutViewport && strategy === 'fixed') {
477 x = visualViewport.offsetLeft;
478 y = visualViewport.offsetTop;
479 }
480 }
481
482 return {
483 width: width,
484 height: height,
485 x: x + getWindowScrollBarX(element),
486 y: y
487 };
488 }
489
490 // of the `<html>` and `<body>` rect bounds if horizontally scrollable
491
492 function getDocumentRect(element) {
493 var _element$ownerDocumen;
494
495 var html = getDocumentElement(element);
496 var winScroll = getWindowScroll(element);
497 var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;
498 var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);
499 var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);
500 var x = -winScroll.scrollLeft + getWindowScrollBarX(element);
501 var y = -winScroll.scrollTop;
502
503 if (getComputedStyle(body || html).direction === 'rtl') {
504 x += max(html.clientWidth, body ? body.clientWidth : 0) - width;
505 }
506
507 return {
508 width: width,
509 height: height,
510 x: x,
511 y: y
512 };
513 }
514
515 function contains(parent, child) {
516 var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method
517
518 if (parent.contains(child)) {
519 return true;
520 } // then fallback to custom implementation with Shadow DOM support
521 else if (rootNode && isShadowRoot(rootNode)) {
522 var next = child;
523
524 do {
525 if (next && parent.isSameNode(next)) {
526 return true;
527 } // $FlowFixMe[prop-missing]: need a better way to handle this...
528
529
530 next = next.parentNode || next.host;
531 } while (next);
532 } // Give up, the result is false
533
534
535 return false;
536 }
537
538 function rectToClientRect(rect) {
539 return Object.assign({}, rect, {
540 left: rect.x,
541 top: rect.y,
542 right: rect.x + rect.width,
543 bottom: rect.y + rect.height
544 });
545 }
546
547 function getInnerBoundingClientRect(element, strategy) {
548 var rect = getBoundingClientRect(element, false, strategy === 'fixed');
549 rect.top = rect.top + element.clientTop;
550 rect.left = rect.left + element.clientLeft;
551 rect.bottom = rect.top + element.clientHeight;
552 rect.right = rect.left + element.clientWidth;
553 rect.width = element.clientWidth;
554 rect.height = element.clientHeight;
555 rect.x = rect.left;
556 rect.y = rect.top;
557 return rect;
558 }
559
560 function getClientRectFromMixedType(element, clippingParent, strategy) {
561 return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
562 } // A "clipping parent" is an overflowable container with the characteristic of
563 // clipping (or hiding) overflowing elements with a position different from
564 // `initial`
565
566
567 function getClippingParents(element) {
568 var clippingParents = listScrollParents(getParentNode(element));
569 var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;
570 var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;
571
572 if (!isElement(clipperElement)) {
573 return [];
574 } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414
575
576
577 return clippingParents.filter(function (clippingParent) {
578 return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';
579 });
580 } // Gets the maximum area that the element is visible in due to any number of
581 // clipping parents
582
583
584 function getClippingRect(element, boundary, rootBoundary, strategy) {
585 var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);
586 var clippingParents = [].concat(mainClippingParents, [rootBoundary]);
587 var firstClippingParent = clippingParents[0];
588 var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {
589 var rect = getClientRectFromMixedType(element, clippingParent, strategy);
590 accRect.top = max(rect.top, accRect.top);
591 accRect.right = min(rect.right, accRect.right);
592 accRect.bottom = min(rect.bottom, accRect.bottom);
593 accRect.left = max(rect.left, accRect.left);
594 return accRect;
595 }, getClientRectFromMixedType(element, firstClippingParent, strategy));
596 clippingRect.width = clippingRect.right - clippingRect.left;
597 clippingRect.height = clippingRect.bottom - clippingRect.top;
598 clippingRect.x = clippingRect.left;
599 clippingRect.y = clippingRect.top;
600 return clippingRect;
601 }
602
603 function getBasePlacement(placement) {
604 return placement.split('-')[0];
605 }
606
607 function getVariation(placement) {
608 return placement.split('-')[1];
609 }
610
611 function getMainAxisFromPlacement(placement) {
612 return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';
613 }
614
615 function computeOffsets(_ref) {
616 var reference = _ref.reference,
617 element = _ref.element,
618 placement = _ref.placement;
619 var basePlacement = placement ? getBasePlacement(placement) : null;
620 var variation = placement ? getVariation(placement) : null;
621 var commonX = reference.x + reference.width / 2 - element.width / 2;
622 var commonY = reference.y + reference.height / 2 - element.height / 2;
623 var offsets;
624
625 switch (basePlacement) {
626 case top:
627 offsets = {
628 x: commonX,
629 y: reference.y - element.height
630 };
631 break;
632
633 case bottom:
634 offsets = {
635 x: commonX,
636 y: reference.y + reference.height
637 };
638 break;
639
640 case right:
641 offsets = {
642 x: reference.x + reference.width,
643 y: commonY
644 };
645 break;
646
647 case left:
648 offsets = {
649 x: reference.x - element.width,
650 y: commonY
651 };
652 break;
653
654 default:
655 offsets = {
656 x: reference.x,
657 y: reference.y
658 };
659 }
660
661 var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;
662
663 if (mainAxis != null) {
664 var len = mainAxis === 'y' ? 'height' : 'width';
665
666 switch (variation) {
667 case start:
668 offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);
669 break;
670
671 case end:
672 offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);
673 break;
674 }
675 }
676
677 return offsets;
678 }
679
680 function getFreshSideObject() {
681 return {
682 top: 0,
683 right: 0,
684 bottom: 0,
685 left: 0
686 };
687 }
688
689 function mergePaddingObject(paddingObject) {
690 return Object.assign({}, getFreshSideObject(), paddingObject);
691 }
692
693 function expandToHashMap(value, keys) {
694 return keys.reduce(function (hashMap, key) {
695 hashMap[key] = value;
696 return hashMap;
697 }, {});
698 }
699
700 function detectOverflow(state, options) {
701 if (options === void 0) {
702 options = {};
703 }
704
705 var _options = options,
706 _options$placement = _options.placement,
707 placement = _options$placement === void 0 ? state.placement : _options$placement,
708 _options$strategy = _options.strategy,
709 strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,
710 _options$boundary = _options.boundary,
711 boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,
712 _options$rootBoundary = _options.rootBoundary,
713 rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,
714 _options$elementConte = _options.elementContext,
715 elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,
716 _options$altBoundary = _options.altBoundary,
717 altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,
718 _options$padding = _options.padding,
719 padding = _options$padding === void 0 ? 0 : _options$padding;
720 var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));
721 var altContext = elementContext === popper ? reference : popper;
722 var popperRect = state.rects.popper;
723 var element = state.elements[altBoundary ? altContext : elementContext];
724 var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);
725 var referenceClientRect = getBoundingClientRect(state.elements.reference);
726 var popperOffsets = computeOffsets({
727 reference: referenceClientRect,
728 element: popperRect,
729 strategy: 'absolute',
730 placement: placement
731 });
732 var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));
733 var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect
734 // 0 or negative = within the clipping rect
735
736 var overflowOffsets = {
737 top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
738 bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
739 left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
740 right: elementClientRect.right - clippingClientRect.right + paddingObject.right
741 };
742 var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element
743
744 if (elementContext === popper && offsetData) {
745 var offset = offsetData[placement];
746 Object.keys(overflowOffsets).forEach(function (key) {
747 var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;
748 var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';
749 overflowOffsets[key] += offset[axis] * multiply;
750 });
751 }
752
753 return overflowOffsets;
754 }
755
756 var DEFAULT_OPTIONS = {
757 placement: 'bottom',
758 modifiers: [],
759 strategy: 'absolute'
760 };
761
762 function areValidElements() {
763 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
764 args[_key] = arguments[_key];
765 }
766
767 return !args.some(function (element) {
768 return !(element && typeof element.getBoundingClientRect === 'function');
769 });
770 }
771
772 function popperGenerator(generatorOptions) {
773 if (generatorOptions === void 0) {
774 generatorOptions = {};
775 }
776
777 var _generatorOptions = generatorOptions,
778 _generatorOptions$def = _generatorOptions.defaultModifiers,
779 defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,
780 _generatorOptions$def2 = _generatorOptions.defaultOptions,
781 defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;
782 return function createPopper(reference, popper, options) {
783 if (options === void 0) {
784 options = defaultOptions;
785 }
786
787 var state = {
788 placement: 'bottom',
789 orderedModifiers: [],
790 options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),
791 modifiersData: {},
792 elements: {
793 reference: reference,
794 popper: popper
795 },
796 attributes: {},
797 styles: {}
798 };
799 var effectCleanupFns = [];
800 var isDestroyed = false;
801 var instance = {
802 state: state,
803 setOptions: function setOptions(setOptionsAction) {
804 var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;
805 cleanupModifierEffects();
806 state.options = Object.assign({}, defaultOptions, state.options, options);
807 state.scrollParents = {
808 reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],
809 popper: listScrollParents(popper)
810 }; // Orders the modifiers based on their dependencies and `phase`
811 // properties
812
813 var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers
814
815 state.orderedModifiers = orderedModifiers.filter(function (m) {
816 return m.enabled;
817 });
818 runModifierEffects();
819 return instance.update();
820 },
821 // Sync update – it will always be executed, even if not necessary. This
822 // is useful for low frequency updates where sync behavior simplifies the
823 // logic.
824 // For high frequency updates (e.g. `resize` and `scroll` events), always
825 // prefer the async Popper#update method
826 forceUpdate: function forceUpdate() {
827 if (isDestroyed) {
828 return;
829 }
830
831 var _state$elements = state.elements,
832 reference = _state$elements.reference,
833 popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements
834 // anymore
835
836 if (!areValidElements(reference, popper)) {
837 return;
838 } // Store the reference and popper rects to be read by modifiers
839
840
841 state.rects = {
842 reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),
843 popper: getLayoutRect(popper)
844 }; // Modifiers have the ability to reset the current update cycle. The
845 // most common use case for this is the `flip` modifier changing the
846 // placement, which then needs to re-run all the modifiers, because the
847 // logic was previously ran for the previous placement and is therefore
848 // stale/incorrect
849
850 state.reset = false;
851 state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier
852 // is filled with the initial data specified by the modifier. This means
853 // it doesn't persist and is fresh on each update.
854 // To ensure persistent data, use `${name}#persistent`
855
856 state.orderedModifiers.forEach(function (modifier) {
857 return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);
858 });
859
860 for (var index = 0; index < state.orderedModifiers.length; index++) {
861 if (state.reset === true) {
862 state.reset = false;
863 index = -1;
864 continue;
865 }
866
867 var _state$orderedModifie = state.orderedModifiers[index],
868 fn = _state$orderedModifie.fn,
869 _state$orderedModifie2 = _state$orderedModifie.options,
870 _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,
871 name = _state$orderedModifie.name;
872
873 if (typeof fn === 'function') {
874 state = fn({
875 state: state,
876 options: _options,
877 name: name,
878 instance: instance
879 }) || state;
880 }
881 }
882 },
883 // Async and optimistically optimized update – it will not be executed if
884 // not necessary (debounced to run at most once-per-tick)
885 update: debounce(function () {
886 return new Promise(function (resolve) {
887 instance.forceUpdate();
888 resolve(state);
889 });
890 }),
891 destroy: function destroy() {
892 cleanupModifierEffects();
893 isDestroyed = true;
894 }
895 };
896
897 if (!areValidElements(reference, popper)) {
898 return instance;
899 }
900
901 instance.setOptions(options).then(function (state) {
902 if (!isDestroyed && options.onFirstUpdate) {
903 options.onFirstUpdate(state);
904 }
905 }); // Modifiers have the ability to execute arbitrary code before the first
906 // update cycle runs. They will be executed in the same order as the update
907 // cycle. This is useful when a modifier adds some persistent data that
908 // other modifiers need to use, but the modifier is run after the dependent
909 // one.
910
911 function runModifierEffects() {
912 state.orderedModifiers.forEach(function (_ref) {
913 var name = _ref.name,
914 _ref$options = _ref.options,
915 options = _ref$options === void 0 ? {} : _ref$options,
916 effect = _ref.effect;
917
918 if (typeof effect === 'function') {
919 var cleanupFn = effect({
920 state: state,
921 name: name,
922 instance: instance,
923 options: options
924 });
925
926 var noopFn = function noopFn() {};
927
928 effectCleanupFns.push(cleanupFn || noopFn);
929 }
930 });
931 }
932
933 function cleanupModifierEffects() {
934 effectCleanupFns.forEach(function (fn) {
935 return fn();
936 });
937 effectCleanupFns = [];
938 }
939
940 return instance;
941 };
942 }
943
944 var passive = {
945 passive: true
946 };
947
948 function effect$2(_ref) {
949 var state = _ref.state,
950 instance = _ref.instance,
951 options = _ref.options;
952 var _options$scroll = options.scroll,
953 scroll = _options$scroll === void 0 ? true : _options$scroll,
954 _options$resize = options.resize,
955 resize = _options$resize === void 0 ? true : _options$resize;
956 var window = getWindow(state.elements.popper);
957 var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);
958
959 if (scroll) {
960 scrollParents.forEach(function (scrollParent) {
961 scrollParent.addEventListener('scroll', instance.update, passive);
962 });
963 }
964
965 if (resize) {
966 window.addEventListener('resize', instance.update, passive);
967 }
968
969 return function () {
970 if (scroll) {
971 scrollParents.forEach(function (scrollParent) {
972 scrollParent.removeEventListener('scroll', instance.update, passive);
973 });
974 }
975
976 if (resize) {
977 window.removeEventListener('resize', instance.update, passive);
978 }
979 };
980 } // eslint-disable-next-line import/no-unused-modules
981
982
983 var eventListeners = {
984 name: 'eventListeners',
985 enabled: true,
986 phase: 'write',
987 fn: function fn() {},
988 effect: effect$2,
989 data: {}
990 };
991
992 function popperOffsets(_ref) {
993 var state = _ref.state,
994 name = _ref.name;
995 // Offsets are the actual position the popper needs to have to be
996 // properly positioned near its reference element
997 // This is the most basic placement, and will be adjusted by
998 // the modifiers in the next step
999 state.modifiersData[name] = computeOffsets({
1000 reference: state.rects.reference,
1001 element: state.rects.popper,
1002 strategy: 'absolute',
1003 placement: state.placement
1004 });
1005 } // eslint-disable-next-line import/no-unused-modules
1006
1007
1008 var popperOffsets$1 = {
1009 name: 'popperOffsets',
1010 enabled: true,
1011 phase: 'read',
1012 fn: popperOffsets,
1013 data: {}
1014 };
1015
1016 var unsetSides = {
1017 top: 'auto',
1018 right: 'auto',
1019 bottom: 'auto',
1020 left: 'auto'
1021 }; // Round the offsets to the nearest suitable subpixel based on the DPR.
1022 // Zooming can change the DPR, but it seems to report a value that will
1023 // cleanly divide the values into the appropriate subpixels.
1024
1025 function roundOffsetsByDPR(_ref, win) {
1026 var x = _ref.x,
1027 y = _ref.y;
1028 var dpr = win.devicePixelRatio || 1;
1029 return {
1030 x: round(x * dpr) / dpr || 0,
1031 y: round(y * dpr) / dpr || 0
1032 };
1033 }
1034
1035 function mapToStyles(_ref2) {
1036 var _Object$assign2;
1037
1038 var popper = _ref2.popper,
1039 popperRect = _ref2.popperRect,
1040 placement = _ref2.placement,
1041 variation = _ref2.variation,
1042 offsets = _ref2.offsets,
1043 position = _ref2.position,
1044 gpuAcceleration = _ref2.gpuAcceleration,
1045 adaptive = _ref2.adaptive,
1046 roundOffsets = _ref2.roundOffsets,
1047 isFixed = _ref2.isFixed;
1048 var _offsets$x = offsets.x,
1049 x = _offsets$x === void 0 ? 0 : _offsets$x,
1050 _offsets$y = offsets.y,
1051 y = _offsets$y === void 0 ? 0 : _offsets$y;
1052
1053 var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({
1054 x: x,
1055 y: y
1056 }) : {
1057 x: x,
1058 y: y
1059 };
1060
1061 x = _ref3.x;
1062 y = _ref3.y;
1063 var hasX = offsets.hasOwnProperty('x');
1064 var hasY = offsets.hasOwnProperty('y');
1065 var sideX = left;
1066 var sideY = top;
1067 var win = window;
1068
1069 if (adaptive) {
1070 var offsetParent = getOffsetParent(popper);
1071 var heightProp = 'clientHeight';
1072 var widthProp = 'clientWidth';
1073
1074 if (offsetParent === getWindow(popper)) {
1075 offsetParent = getDocumentElement(popper);
1076
1077 if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {
1078 heightProp = 'scrollHeight';
1079 widthProp = 'scrollWidth';
1080 }
1081 } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it
1082
1083
1084 offsetParent = offsetParent;
1085
1086 if (placement === top || (placement === left || placement === right) && variation === end) {
1087 sideY = bottom;
1088 var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]
1089 offsetParent[heightProp];
1090 y -= offsetY - popperRect.height;
1091 y *= gpuAcceleration ? 1 : -1;
1092 }
1093
1094 if (placement === left || (placement === top || placement === bottom) && variation === end) {
1095 sideX = right;
1096 var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]
1097 offsetParent[widthProp];
1098 x -= offsetX - popperRect.width;
1099 x *= gpuAcceleration ? 1 : -1;
1100 }
1101 }
1102
1103 var commonStyles = Object.assign({
1104 position: position
1105 }, adaptive && unsetSides);
1106
1107 var _ref4 = roundOffsets === true ? roundOffsetsByDPR({
1108 x: x,
1109 y: y
1110 }, getWindow(popper)) : {
1111 x: x,
1112 y: y
1113 };
1114
1115 x = _ref4.x;
1116 y = _ref4.y;
1117
1118 if (gpuAcceleration) {
1119 var _Object$assign;
1120
1121 return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));
1122 }
1123
1124 return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2));
1125 }
1126
1127 function computeStyles(_ref5) {
1128 var state = _ref5.state,
1129 options = _ref5.options;
1130 var _options$gpuAccelerat = options.gpuAcceleration,
1131 gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,
1132 _options$adaptive = options.adaptive,
1133 adaptive = _options$adaptive === void 0 ? true : _options$adaptive,
1134 _options$roundOffsets = options.roundOffsets,
1135 roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;
1136 var commonStyles = {
1137 placement: getBasePlacement(state.placement),
1138 variation: getVariation(state.placement),
1139 popper: state.elements.popper,
1140 popperRect: state.rects.popper,
1141 gpuAcceleration: gpuAcceleration,
1142 isFixed: state.options.strategy === 'fixed'
1143 };
1144
1145 if (state.modifiersData.popperOffsets != null) {
1146 state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {
1147 offsets: state.modifiersData.popperOffsets,
1148 position: state.options.strategy,
1149 adaptive: adaptive,
1150 roundOffsets: roundOffsets
1151 })));
1152 }
1153
1154 if (state.modifiersData.arrow != null) {
1155 state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {
1156 offsets: state.modifiersData.arrow,
1157 position: 'absolute',
1158 adaptive: false,
1159 roundOffsets: roundOffsets
1160 })));
1161 }
1162
1163 state.attributes.popper = Object.assign({}, state.attributes.popper, {
1164 'data-popper-placement': state.placement
1165 });
1166 } // eslint-disable-next-line import/no-unused-modules
1167
1168
1169 var computeStyles$1 = {
1170 name: 'computeStyles',
1171 enabled: true,
1172 phase: 'beforeWrite',
1173 fn: computeStyles,
1174 data: {}
1175 };
1176
1177 // and applies them to the HTMLElements such as popper and arrow
1178
1179 function applyStyles(_ref) {
1180 var state = _ref.state;
1181 Object.keys(state.elements).forEach(function (name) {
1182 var style = state.styles[name] || {};
1183 var attributes = state.attributes[name] || {};
1184 var element = state.elements[name]; // arrow is optional + virtual elements
1185
1186 if (!isHTMLElement(element) || !getNodeName(element)) {
1187 return;
1188 } // Flow doesn't support to extend this property, but it's the most
1189 // effective way to apply styles to an HTMLElement
1190 // $FlowFixMe[cannot-write]
1191
1192
1193 Object.assign(element.style, style);
1194 Object.keys(attributes).forEach(function (name) {
1195 var value = attributes[name];
1196
1197 if (value === false) {
1198 element.removeAttribute(name);
1199 } else {
1200 element.setAttribute(name, value === true ? '' : value);
1201 }
1202 });
1203 });
1204 }
1205
1206 function effect$1(_ref2) {
1207 var state = _ref2.state;
1208 var initialStyles = {
1209 popper: {
1210 position: state.options.strategy,
1211 left: '0',
1212 top: '0',
1213 margin: '0'
1214 },
1215 arrow: {
1216 position: 'absolute'
1217 },
1218 reference: {}
1219 };
1220 Object.assign(state.elements.popper.style, initialStyles.popper);
1221 state.styles = initialStyles;
1222
1223 if (state.elements.arrow) {
1224 Object.assign(state.elements.arrow.style, initialStyles.arrow);
1225 }
1226
1227 return function () {
1228 Object.keys(state.elements).forEach(function (name) {
1229 var element = state.elements[name];
1230 var attributes = state.attributes[name] || {};
1231 var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them
1232
1233 var style = styleProperties.reduce(function (style, property) {
1234 style[property] = '';
1235 return style;
1236 }, {}); // arrow is optional + virtual elements
1237
1238 if (!isHTMLElement(element) || !getNodeName(element)) {
1239 return;
1240 }
1241
1242 Object.assign(element.style, style);
1243 Object.keys(attributes).forEach(function (attribute) {
1244 element.removeAttribute(attribute);
1245 });
1246 });
1247 };
1248 } // eslint-disable-next-line import/no-unused-modules
1249
1250
1251 var applyStyles$1 = {
1252 name: 'applyStyles',
1253 enabled: true,
1254 phase: 'write',
1255 fn: applyStyles,
1256 effect: effect$1,
1257 requires: ['computeStyles']
1258 };
1259
1260 function distanceAndSkiddingToXY(placement, rects, offset) {
1261 var basePlacement = getBasePlacement(placement);
1262 var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;
1263
1264 var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {
1265 placement: placement
1266 })) : offset,
1267 skidding = _ref[0],
1268 distance = _ref[1];
1269
1270 skidding = skidding || 0;
1271 distance = (distance || 0) * invertDistance;
1272 return [left, right].indexOf(basePlacement) >= 0 ? {
1273 x: distance,
1274 y: skidding
1275 } : {
1276 x: skidding,
1277 y: distance
1278 };
1279 }
1280
1281 function offset(_ref2) {
1282 var state = _ref2.state,
1283 options = _ref2.options,
1284 name = _ref2.name;
1285 var _options$offset = options.offset,
1286 offset = _options$offset === void 0 ? [0, 0] : _options$offset;
1287 var data = placements.reduce(function (acc, placement) {
1288 acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);
1289 return acc;
1290 }, {});
1291 var _data$state$placement = data[state.placement],
1292 x = _data$state$placement.x,
1293 y = _data$state$placement.y;
1294
1295 if (state.modifiersData.popperOffsets != null) {
1296 state.modifiersData.popperOffsets.x += x;
1297 state.modifiersData.popperOffsets.y += y;
1298 }
1299
1300 state.modifiersData[name] = data;
1301 } // eslint-disable-next-line import/no-unused-modules
1302
1303
1304 var offset$1 = {
1305 name: 'offset',
1306 enabled: true,
1307 phase: 'main',
1308 requires: ['popperOffsets'],
1309 fn: offset
1310 };
1311
1312 var hash$1 = {
1313 left: 'right',
1314 right: 'left',
1315 bottom: 'top',
1316 top: 'bottom'
1317 };
1318 function getOppositePlacement(placement) {
1319 return placement.replace(/left|right|bottom|top/g, function (matched) {
1320 return hash$1[matched];
1321 });
1322 }
1323
1324 var hash = {
1325 start: 'end',
1326 end: 'start'
1327 };
1328 function getOppositeVariationPlacement(placement) {
1329 return placement.replace(/start|end/g, function (matched) {
1330 return hash[matched];
1331 });
1332 }
1333
1334 function computeAutoPlacement(state, options) {
1335 if (options === void 0) {
1336 options = {};
1337 }
1338
1339 var _options = options,
1340 placement = _options.placement,
1341 boundary = _options.boundary,
1342 rootBoundary = _options.rootBoundary,
1343 padding = _options.padding,
1344 flipVariations = _options.flipVariations,
1345 _options$allowedAutoP = _options.allowedAutoPlacements,
1346 allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;
1347 var variation = getVariation(placement);
1348 var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {
1349 return getVariation(placement) === variation;
1350 }) : basePlacements;
1351 var allowedPlacements = placements$1.filter(function (placement) {
1352 return allowedAutoPlacements.indexOf(placement) >= 0;
1353 });
1354
1355 if (allowedPlacements.length === 0) {
1356 allowedPlacements = placements$1;
1357 } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...
1358
1359
1360 var overflows = allowedPlacements.reduce(function (acc, placement) {
1361 acc[placement] = detectOverflow(state, {
1362 placement: placement,
1363 boundary: boundary,
1364 rootBoundary: rootBoundary,
1365 padding: padding
1366 })[getBasePlacement(placement)];
1367 return acc;
1368 }, {});
1369 return Object.keys(overflows).sort(function (a, b) {
1370 return overflows[a] - overflows[b];
1371 });
1372 }
1373
1374 function getExpandedFallbackPlacements(placement) {
1375 if (getBasePlacement(placement) === auto) {
1376 return [];
1377 }
1378
1379 var oppositePlacement = getOppositePlacement(placement);
1380 return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];
1381 }
1382
1383 function flip(_ref) {
1384 var state = _ref.state,
1385 options = _ref.options,
1386 name = _ref.name;
1387
1388 if (state.modifiersData[name]._skip) {
1389 return;
1390 }
1391
1392 var _options$mainAxis = options.mainAxis,
1393 checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,
1394 _options$altAxis = options.altAxis,
1395 checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,
1396 specifiedFallbackPlacements = options.fallbackPlacements,
1397 padding = options.padding,
1398 boundary = options.boundary,
1399 rootBoundary = options.rootBoundary,
1400 altBoundary = options.altBoundary,
1401 _options$flipVariatio = options.flipVariations,
1402 flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,
1403 allowedAutoPlacements = options.allowedAutoPlacements;
1404 var preferredPlacement = state.options.placement;
1405 var basePlacement = getBasePlacement(preferredPlacement);
1406 var isBasePlacement = basePlacement === preferredPlacement;
1407 var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));
1408 var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {
1409 return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {
1410 placement: placement,
1411 boundary: boundary,
1412 rootBoundary: rootBoundary,
1413 padding: padding,
1414 flipVariations: flipVariations,
1415 allowedAutoPlacements: allowedAutoPlacements
1416 }) : placement);
1417 }, []);
1418 var referenceRect = state.rects.reference;
1419 var popperRect = state.rects.popper;
1420 var checksMap = new Map();
1421 var makeFallbackChecks = true;
1422 var firstFittingPlacement = placements[0];
1423
1424 for (var i = 0; i < placements.length; i++) {
1425 var placement = placements[i];
1426
1427 var _basePlacement = getBasePlacement(placement);
1428
1429 var isStartVariation = getVariation(placement) === start;
1430 var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;
1431 var len = isVertical ? 'width' : 'height';
1432 var overflow = detectOverflow(state, {
1433 placement: placement,
1434 boundary: boundary,
1435 rootBoundary: rootBoundary,
1436 altBoundary: altBoundary,
1437 padding: padding
1438 });
1439 var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;
1440
1441 if (referenceRect[len] > popperRect[len]) {
1442 mainVariationSide = getOppositePlacement(mainVariationSide);
1443 }
1444
1445 var altVariationSide = getOppositePlacement(mainVariationSide);
1446 var checks = [];
1447
1448 if (checkMainAxis) {
1449 checks.push(overflow[_basePlacement] <= 0);
1450 }
1451
1452 if (checkAltAxis) {
1453 checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);
1454 }
1455
1456 if (checks.every(function (check) {
1457 return check;
1458 })) {
1459 firstFittingPlacement = placement;
1460 makeFallbackChecks = false;
1461 break;
1462 }
1463
1464 checksMap.set(placement, checks);
1465 }
1466
1467 if (makeFallbackChecks) {
1468 // `2` may be desired in some cases – research later
1469 var numberOfChecks = flipVariations ? 3 : 1;
1470
1471 var _loop = function _loop(_i) {
1472 var fittingPlacement = placements.find(function (placement) {
1473 var checks = checksMap.get(placement);
1474
1475 if (checks) {
1476 return checks.slice(0, _i).every(function (check) {
1477 return check;
1478 });
1479 }
1480 });
1481
1482 if (fittingPlacement) {
1483 firstFittingPlacement = fittingPlacement;
1484 return "break";
1485 }
1486 };
1487
1488 for (var _i = numberOfChecks; _i > 0; _i--) {
1489 var _ret = _loop(_i);
1490
1491 if (_ret === "break") break;
1492 }
1493 }
1494
1495 if (state.placement !== firstFittingPlacement) {
1496 state.modifiersData[name]._skip = true;
1497 state.placement = firstFittingPlacement;
1498 state.reset = true;
1499 }
1500 } // eslint-disable-next-line import/no-unused-modules
1501
1502
1503 var flip$1 = {
1504 name: 'flip',
1505 enabled: true,
1506 phase: 'main',
1507 fn: flip,
1508 requiresIfExists: ['offset'],
1509 data: {
1510 _skip: false
1511 }
1512 };
1513
1514 function getAltAxis(axis) {
1515 return axis === 'x' ? 'y' : 'x';
1516 }
1517
1518 function within(min$1, value, max$1) {
1519 return max(min$1, min(value, max$1));
1520 }
1521 function withinMaxClamp(min, value, max) {
1522 var v = within(min, value, max);
1523 return v > max ? max : v;
1524 }
1525
1526 function preventOverflow(_ref) {
1527 var state = _ref.state,
1528 options = _ref.options,
1529 name = _ref.name;
1530 var _options$mainAxis = options.mainAxis,
1531 checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,
1532 _options$altAxis = options.altAxis,
1533 checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,
1534 boundary = options.boundary,
1535 rootBoundary = options.rootBoundary,
1536 altBoundary = options.altBoundary,
1537 padding = options.padding,
1538 _options$tether = options.tether,
1539 tether = _options$tether === void 0 ? true : _options$tether,
1540 _options$tetherOffset = options.tetherOffset,
1541 tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;
1542 var overflow = detectOverflow(state, {
1543 boundary: boundary,
1544 rootBoundary: rootBoundary,
1545 padding: padding,
1546 altBoundary: altBoundary
1547 });
1548 var basePlacement = getBasePlacement(state.placement);
1549 var variation = getVariation(state.placement);
1550 var isBasePlacement = !variation;
1551 var mainAxis = getMainAxisFromPlacement(basePlacement);
1552 var altAxis = getAltAxis(mainAxis);
1553 var popperOffsets = state.modifiersData.popperOffsets;
1554 var referenceRect = state.rects.reference;
1555 var popperRect = state.rects.popper;
1556 var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {
1557 placement: state.placement
1558 })) : tetherOffset;
1559 var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {
1560 mainAxis: tetherOffsetValue,
1561 altAxis: tetherOffsetValue
1562 } : Object.assign({
1563 mainAxis: 0,
1564 altAxis: 0
1565 }, tetherOffsetValue);
1566 var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;
1567 var data = {
1568 x: 0,
1569 y: 0
1570 };
1571
1572 if (!popperOffsets) {
1573 return;
1574 }
1575
1576 if (checkMainAxis) {
1577 var _offsetModifierState$;
1578
1579 var mainSide = mainAxis === 'y' ? top : left;
1580 var altSide = mainAxis === 'y' ? bottom : right;
1581 var len = mainAxis === 'y' ? 'height' : 'width';
1582 var offset = popperOffsets[mainAxis];
1583 var min$1 = offset + overflow[mainSide];
1584 var max$1 = offset - overflow[altSide];
1585 var additive = tether ? -popperRect[len] / 2 : 0;
1586 var minLen = variation === start ? referenceRect[len] : popperRect[len];
1587 var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go
1588 // outside the reference bounds
1589
1590 var arrowElement = state.elements.arrow;
1591 var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {
1592 width: 0,
1593 height: 0
1594 };
1595 var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();
1596 var arrowPaddingMin = arrowPaddingObject[mainSide];
1597 var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want
1598 // to include its full size in the calculation. If the reference is small
1599 // and near the edge of a boundary, the popper can overflow even if the
1600 // reference is not overflowing as well (e.g. virtual elements with no
1601 // width or height)
1602
1603 var arrowLen = within(0, referenceRect[len], arrowRect[len]);
1604 var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;
1605 var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;
1606 var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);
1607 var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
1608 var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;
1609 var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;
1610 var tetherMax = offset + maxOffset - offsetModifierValue;
1611 var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1);
1612 popperOffsets[mainAxis] = preventedOffset;
1613 data[mainAxis] = preventedOffset - offset;
1614 }
1615
1616 if (checkAltAxis) {
1617 var _offsetModifierState$2;
1618
1619 var _mainSide = mainAxis === 'x' ? top : left;
1620
1621 var _altSide = mainAxis === 'x' ? bottom : right;
1622
1623 var _offset = popperOffsets[altAxis];
1624
1625 var _len = altAxis === 'y' ? 'height' : 'width';
1626
1627 var _min = _offset + overflow[_mainSide];
1628
1629 var _max = _offset - overflow[_altSide];
1630
1631 var isOriginSide = [top, left].indexOf(basePlacement) !== -1;
1632
1633 var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;
1634
1635 var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;
1636
1637 var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;
1638
1639 var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);
1640
1641 popperOffsets[altAxis] = _preventedOffset;
1642 data[altAxis] = _preventedOffset - _offset;
1643 }
1644
1645 state.modifiersData[name] = data;
1646 } // eslint-disable-next-line import/no-unused-modules
1647
1648
1649 var preventOverflow$1 = {
1650 name: 'preventOverflow',
1651 enabled: true,
1652 phase: 'main',
1653 fn: preventOverflow,
1654 requiresIfExists: ['offset']
1655 };
1656
1657 var toPaddingObject = function toPaddingObject(padding, state) {
1658 padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {
1659 placement: state.placement
1660 })) : padding;
1661 return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));
1662 };
1663
1664 function arrow(_ref) {
1665 var _state$modifiersData$;
1666
1667 var state = _ref.state,
1668 name = _ref.name,
1669 options = _ref.options;
1670 var arrowElement = state.elements.arrow;
1671 var popperOffsets = state.modifiersData.popperOffsets;
1672 var basePlacement = getBasePlacement(state.placement);
1673 var axis = getMainAxisFromPlacement(basePlacement);
1674 var isVertical = [left, right].indexOf(basePlacement) >= 0;
1675 var len = isVertical ? 'height' : 'width';
1676
1677 if (!arrowElement || !popperOffsets) {
1678 return;
1679 }
1680
1681 var paddingObject = toPaddingObject(options.padding, state);
1682 var arrowRect = getLayoutRect(arrowElement);
1683 var minProp = axis === 'y' ? top : left;
1684 var maxProp = axis === 'y' ? bottom : right;
1685 var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];
1686 var startDiff = popperOffsets[axis] - state.rects.reference[axis];
1687 var arrowOffsetParent = getOffsetParent(arrowElement);
1688 var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;
1689 var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is
1690 // outside of the popper bounds
1691
1692 var min = paddingObject[minProp];
1693 var max = clientSize - arrowRect[len] - paddingObject[maxProp];
1694 var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;
1695 var offset = within(min, center, max); // Prevents breaking syntax highlighting...
1696
1697 var axisProp = axis;
1698 state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);
1699 }
1700
1701 function effect(_ref2) {
1702 var state = _ref2.state,
1703 options = _ref2.options;
1704 var _options$element = options.element,
1705 arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;
1706
1707 if (arrowElement == null) {
1708 return;
1709 } // CSS selector
1710
1711
1712 if (typeof arrowElement === 'string') {
1713 arrowElement = state.elements.popper.querySelector(arrowElement);
1714
1715 if (!arrowElement) {
1716 return;
1717 }
1718 }
1719
1720 if (!contains(state.elements.popper, arrowElement)) {
1721 return;
1722 }
1723
1724 state.elements.arrow = arrowElement;
1725 } // eslint-disable-next-line import/no-unused-modules
1726
1727
1728 var arrow$1 = {
1729 name: 'arrow',
1730 enabled: true,
1731 phase: 'main',
1732 fn: arrow,
1733 effect: effect,
1734 requires: ['popperOffsets'],
1735 requiresIfExists: ['preventOverflow']
1736 };
1737
1738 function getSideOffsets(overflow, rect, preventedOffsets) {
1739 if (preventedOffsets === void 0) {
1740 preventedOffsets = {
1741 x: 0,
1742 y: 0
1743 };
1744 }
1745
1746 return {
1747 top: overflow.top - rect.height - preventedOffsets.y,
1748 right: overflow.right - rect.width + preventedOffsets.x,
1749 bottom: overflow.bottom - rect.height + preventedOffsets.y,
1750 left: overflow.left - rect.width - preventedOffsets.x
1751 };
1752 }
1753
1754 function isAnySideFullyClipped(overflow) {
1755 return [top, right, bottom, left].some(function (side) {
1756 return overflow[side] >= 0;
1757 });
1758 }
1759
1760 function hide(_ref) {
1761 var state = _ref.state,
1762 name = _ref.name;
1763 var referenceRect = state.rects.reference;
1764 var popperRect = state.rects.popper;
1765 var preventedOffsets = state.modifiersData.preventOverflow;
1766 var referenceOverflow = detectOverflow(state, {
1767 elementContext: 'reference'
1768 });
1769 var popperAltOverflow = detectOverflow(state, {
1770 altBoundary: true
1771 });
1772 var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);
1773 var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);
1774 var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);
1775 var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
1776 state.modifiersData[name] = {
1777 referenceClippingOffsets: referenceClippingOffsets,
1778 popperEscapeOffsets: popperEscapeOffsets,
1779 isReferenceHidden: isReferenceHidden,
1780 hasPopperEscaped: hasPopperEscaped
1781 };
1782 state.attributes.popper = Object.assign({}, state.attributes.popper, {
1783 'data-popper-reference-hidden': isReferenceHidden,
1784 'data-popper-escaped': hasPopperEscaped
1785 });
1786 } // eslint-disable-next-line import/no-unused-modules
1787
1788
1789 var hide$1 = {
1790 name: 'hide',
1791 enabled: true,
1792 phase: 'main',
1793 requiresIfExists: ['preventOverflow'],
1794 fn: hide
1795 };
1796
1797 var defaultModifiers$1 = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1];
1798 var createPopper$1 = /*#__PURE__*/popperGenerator({
1799 defaultModifiers: defaultModifiers$1
1800 }); // eslint-disable-next-line import/no-unused-modules
1801
1802 var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1];
1803 var createPopper = /*#__PURE__*/popperGenerator({
1804 defaultModifiers: defaultModifiers
1805 }); // eslint-disable-next-line import/no-unused-modules
1806
1807 exports.applyStyles = applyStyles$1;
1808 exports.arrow = arrow$1;
1809 exports.computeStyles = computeStyles$1;
1810 exports.createPopper = createPopper;
1811 exports.createPopperLite = createPopper$1;
1812 exports.defaultModifiers = defaultModifiers;
1813 exports.detectOverflow = detectOverflow;
1814 exports.eventListeners = eventListeners;
1815 exports.flip = flip$1;
1816 exports.hide = hide$1;
1817 exports.offset = offset$1;
1818 exports.popperGenerator = popperGenerator;
1819 exports.popperOffsets = popperOffsets$1;
1820 exports.preventOverflow = preventOverflow$1;
1821
1822 Object.defineProperty(exports, '__esModule', { value: true });
1823
1824})));
1825//# sourceMappingURL=popper.js.map
Note: See TracBrowser for help on using the repository browser.