vue-tippy 6.0.0-alpha.37 → 6.0.0-alpha.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * vue-tippy v6.0.0-alpha.37
2
+ * vue-tippy v6.0.0-alpha.40
3
3
  * (c) 2021
4
4
  * @license MIT
5
5
  */
@@ -162,17 +162,42 @@ var VueTippy = (function (exports, vue) {
162
162
  return placement.split('-')[0];
163
163
  }
164
164
 
165
- function getBoundingClientRect(element) {
165
+ var max = Math.max;
166
+ var min = Math.min;
167
+ var round = Math.round;
168
+
169
+ function getBoundingClientRect(element, includeScale) {
170
+ if (includeScale === void 0) {
171
+ includeScale = false;
172
+ }
173
+
166
174
  var rect = element.getBoundingClientRect();
175
+ var scaleX = 1;
176
+ var scaleY = 1;
177
+
178
+ if (isHTMLElement(element) && includeScale) {
179
+ var offsetHeight = element.offsetHeight;
180
+ var offsetWidth = element.offsetWidth; // Do not attempt to divide by 0, otherwise we get `Infinity` as scale
181
+ // Fallback to 1 in case both values are `0`
182
+
183
+ if (offsetWidth > 0) {
184
+ scaleX = round(rect.width) / offsetWidth || 1;
185
+ }
186
+
187
+ if (offsetHeight > 0) {
188
+ scaleY = round(rect.height) / offsetHeight || 1;
189
+ }
190
+ }
191
+
167
192
  return {
168
- width: rect.width,
169
- height: rect.height,
170
- top: rect.top,
171
- right: rect.right,
172
- bottom: rect.bottom,
173
- left: rect.left,
174
- x: rect.left,
175
- y: rect.top
193
+ width: rect.width / scaleX,
194
+ height: rect.height / scaleY,
195
+ top: rect.top / scaleY,
196
+ right: rect.right / scaleX,
197
+ bottom: rect.bottom / scaleY,
198
+ left: rect.left / scaleX,
199
+ x: rect.left / scaleX,
200
+ y: rect.top / scaleY
176
201
  };
177
202
  }
178
203
 
@@ -317,13 +342,13 @@ var VueTippy = (function (exports, vue) {
317
342
  return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';
318
343
  }
319
344
 
320
- var max = Math.max;
321
- var min = Math.min;
322
- var round = Math.round;
323
-
324
345
  function within(min$1, value, max$1) {
325
346
  return max(min$1, min(value, max$1));
326
347
  }
348
+ function withinMaxClamp(min, value, max) {
349
+ var v = within(min, value, max);
350
+ return v > max ? max : v;
351
+ }
327
352
 
328
353
  function getFreshSideObject() {
329
354
  return {
@@ -436,6 +461,10 @@ var VueTippy = (function (exports, vue) {
436
461
  requiresIfExists: ['preventOverflow']
437
462
  };
438
463
 
464
+ function getVariation(placement) {
465
+ return placement.split('-')[1];
466
+ }
467
+
439
468
  var unsetSides = {
440
469
  top: 'auto',
441
470
  right: 'auto',
@@ -451,8 +480,8 @@ var VueTippy = (function (exports, vue) {
451
480
  var win = window;
452
481
  var dpr = win.devicePixelRatio || 1;
453
482
  return {
454
- x: round(round(x * dpr) / dpr) || 0,
455
- y: round(round(y * dpr) / dpr) || 0
483
+ x: round(x * dpr) / dpr || 0,
484
+ y: round(y * dpr) / dpr || 0
456
485
  };
457
486
  }
458
487
 
@@ -462,11 +491,13 @@ var VueTippy = (function (exports, vue) {
462
491
  var popper = _ref2.popper,
463
492
  popperRect = _ref2.popperRect,
464
493
  placement = _ref2.placement,
494
+ variation = _ref2.variation,
465
495
  offsets = _ref2.offsets,
466
496
  position = _ref2.position,
467
497
  gpuAcceleration = _ref2.gpuAcceleration,
468
498
  adaptive = _ref2.adaptive,
469
- roundOffsets = _ref2.roundOffsets;
499
+ roundOffsets = _ref2.roundOffsets,
500
+ isFixed = _ref2.isFixed;
470
501
 
471
502
  var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets,
472
503
  _ref3$x = _ref3.x,
@@ -488,7 +519,7 @@ var VueTippy = (function (exports, vue) {
488
519
  if (offsetParent === getWindow(popper)) {
489
520
  offsetParent = getDocumentElement(popper);
490
521
 
491
- if (getComputedStyle(offsetParent).position !== 'static') {
522
+ if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {
492
523
  heightProp = 'scrollHeight';
493
524
  widthProp = 'scrollWidth';
494
525
  }
@@ -497,17 +528,19 @@ var VueTippy = (function (exports, vue) {
497
528
 
498
529
  offsetParent = offsetParent;
499
530
 
500
- if (placement === top) {
501
- sideY = bottom; // $FlowFixMe[prop-missing]
502
-
503
- y -= offsetParent[heightProp] - popperRect.height;
531
+ if (placement === top || (placement === left || placement === right) && variation === end) {
532
+ sideY = bottom;
533
+ var offsetY = isFixed && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]
534
+ offsetParent[heightProp];
535
+ y -= offsetY - popperRect.height;
504
536
  y *= gpuAcceleration ? 1 : -1;
505
537
  }
506
538
 
507
- if (placement === left) {
508
- sideX = right; // $FlowFixMe[prop-missing]
509
-
510
- x -= offsetParent[widthProp] - popperRect.width;
539
+ if (placement === left || (placement === top || placement === bottom) && variation === end) {
540
+ sideX = right;
541
+ var offsetX = isFixed && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]
542
+ offsetParent[widthProp];
543
+ x -= offsetX - popperRect.width;
511
544
  x *= gpuAcceleration ? 1 : -1;
512
545
  }
513
546
  }
@@ -519,7 +552,7 @@ var VueTippy = (function (exports, vue) {
519
552
  if (gpuAcceleration) {
520
553
  var _Object$assign;
521
554
 
522
- return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) < 2 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));
555
+ 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));
523
556
  }
524
557
 
525
558
  return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2));
@@ -547,9 +580,11 @@ var VueTippy = (function (exports, vue) {
547
580
 
548
581
  var commonStyles = {
549
582
  placement: getBasePlacement(state.placement),
583
+ variation: getVariation(state.placement),
550
584
  popper: state.elements.popper,
551
585
  popperRect: state.rects.popper,
552
- gpuAcceleration: gpuAcceleration
586
+ gpuAcceleration: gpuAcceleration,
587
+ isFixed: state.options.strategy === 'fixed'
553
588
  };
554
589
 
555
590
  if (state.modifiersData.popperOffsets != null) {
@@ -807,7 +842,7 @@ var VueTippy = (function (exports, vue) {
807
842
  }
808
843
 
809
844
  function getClientRectFromMixedType(element, clippingParent) {
810
- return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
845
+ return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
811
846
  } // A "clipping parent" is an overflowable container with the characteristic of
812
847
  // clipping (or hiding) overflowing elements with a position different from
813
848
  // `initial`
@@ -824,7 +859,7 @@ var VueTippy = (function (exports, vue) {
824
859
 
825
860
 
826
861
  return clippingParents.filter(function (clippingParent) {
827
- return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';
862
+ return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body' && (canEscapeClipping ? getComputedStyle(clippingParent).position !== 'static' : true);
828
863
  });
829
864
  } // Gets the maximum area that the element is visible in due to any number of
830
865
  // clipping parents
@@ -849,10 +884,6 @@ var VueTippy = (function (exports, vue) {
849
884
  return clippingRect;
850
885
  }
851
886
 
852
- function getVariation(placement) {
853
- return placement.split('-')[1];
854
- }
855
-
856
887
  function computeOffsets(_ref) {
857
888
  var reference = _ref.reference,
858
889
  element = _ref.element,
@@ -938,11 +969,10 @@ var VueTippy = (function (exports, vue) {
938
969
  padding = _options$padding === void 0 ? 0 : _options$padding;
939
970
  var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));
940
971
  var altContext = elementContext === popper ? reference : popper;
941
- var referenceElement = state.elements.reference;
942
972
  var popperRect = state.rects.popper;
943
973
  var element = state.elements[altBoundary ? altContext : elementContext];
944
974
  var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);
945
- var referenceClientRect = getBoundingClientRect(referenceElement);
975
+ var referenceClientRect = getBoundingClientRect(state.elements.reference);
946
976
  var popperOffsets = computeOffsets({
947
977
  reference: referenceClientRect,
948
978
  element: popperRect,
@@ -1329,6 +1359,14 @@ var VueTippy = (function (exports, vue) {
1329
1359
  var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {
1330
1360
  placement: state.placement
1331
1361
  })) : tetherOffset;
1362
+ var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {
1363
+ mainAxis: tetherOffsetValue,
1364
+ altAxis: tetherOffsetValue
1365
+ } : Object.assign({
1366
+ mainAxis: 0,
1367
+ altAxis: 0
1368
+ }, tetherOffsetValue);
1369
+ var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;
1332
1370
  var data = {
1333
1371
  x: 0,
1334
1372
  y: 0
@@ -1338,13 +1376,15 @@ var VueTippy = (function (exports, vue) {
1338
1376
  return;
1339
1377
  }
1340
1378
 
1341
- if (checkMainAxis || checkAltAxis) {
1379
+ if (checkMainAxis) {
1380
+ var _offsetModifierState$;
1381
+
1342
1382
  var mainSide = mainAxis === 'y' ? top : left;
1343
1383
  var altSide = mainAxis === 'y' ? bottom : right;
1344
1384
  var len = mainAxis === 'y' ? 'height' : 'width';
1345
1385
  var offset = popperOffsets[mainAxis];
1346
- var min$1 = popperOffsets[mainAxis] + overflow[mainSide];
1347
- var max$1 = popperOffsets[mainAxis] - overflow[altSide];
1386
+ var min$1 = offset + overflow[mainSide];
1387
+ var max$1 = offset - overflow[altSide];
1348
1388
  var additive = tether ? -popperRect[len] / 2 : 0;
1349
1389
  var minLen = variation === start ? referenceRect[len] : popperRect[len];
1350
1390
  var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go
@@ -1364,36 +1404,45 @@ var VueTippy = (function (exports, vue) {
1364
1404
  // width or height)
1365
1405
 
1366
1406
  var arrowLen = within(0, referenceRect[len], arrowRect[len]);
1367
- var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;
1368
- var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;
1407
+ var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;
1408
+ var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;
1369
1409
  var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);
1370
1410
  var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
1371
- var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;
1372
- var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset;
1373
- var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue;
1411
+ var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;
1412
+ var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;
1413
+ var tetherMax = offset + maxOffset - offsetModifierValue;
1414
+ var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1);
1415
+ popperOffsets[mainAxis] = preventedOffset;
1416
+ data[mainAxis] = preventedOffset - offset;
1417
+ }
1374
1418
 
1375
- if (checkMainAxis) {
1376
- var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1);
1377
- popperOffsets[mainAxis] = preventedOffset;
1378
- data[mainAxis] = preventedOffset - offset;
1379
- }
1419
+ if (checkAltAxis) {
1420
+ var _offsetModifierState$2;
1380
1421
 
1381
- if (checkAltAxis) {
1382
- var _mainSide = mainAxis === 'x' ? top : left;
1422
+ var _mainSide = mainAxis === 'x' ? top : left;
1383
1423
 
1384
- var _altSide = mainAxis === 'x' ? bottom : right;
1424
+ var _altSide = mainAxis === 'x' ? bottom : right;
1385
1425
 
1386
- var _offset = popperOffsets[altAxis];
1426
+ var _offset = popperOffsets[altAxis];
1387
1427
 
1388
- var _min = _offset + overflow[_mainSide];
1428
+ var _len = altAxis === 'y' ? 'height' : 'width';
1389
1429
 
1390
- var _max = _offset - overflow[_altSide];
1430
+ var _min = _offset + overflow[_mainSide];
1391
1431
 
1392
- var _preventedOffset = within(tether ? min(_min, tetherMin) : _min, _offset, tether ? max(_max, tetherMax) : _max);
1432
+ var _max = _offset - overflow[_altSide];
1393
1433
 
1394
- popperOffsets[altAxis] = _preventedOffset;
1395
- data[altAxis] = _preventedOffset - _offset;
1396
- }
1434
+ var isOriginSide = [top, left].indexOf(basePlacement) !== -1;
1435
+
1436
+ var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;
1437
+
1438
+ var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;
1439
+
1440
+ var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;
1441
+
1442
+ var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);
1443
+
1444
+ popperOffsets[altAxis] = _preventedOffset;
1445
+ data[altAxis] = _preventedOffset - _offset;
1397
1446
  }
1398
1447
 
1399
1448
  state.modifiersData[name] = data;
@@ -1423,16 +1472,24 @@ var VueTippy = (function (exports, vue) {
1423
1472
  }
1424
1473
  }
1425
1474
 
1475
+ function isElementScaled(element) {
1476
+ var rect = element.getBoundingClientRect();
1477
+ var scaleX = round(rect.width) / element.offsetWidth || 1;
1478
+ var scaleY = round(rect.height) / element.offsetHeight || 1;
1479
+ return scaleX !== 1 || scaleY !== 1;
1480
+ } // Returns the composite rect of an element relative to its offsetParent.
1426
1481
  // Composite means it takes into account transforms as well as layout.
1427
1482
 
1483
+
1428
1484
  function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
1429
1485
  if (isFixed === void 0) {
1430
1486
  isFixed = false;
1431
1487
  }
1432
1488
 
1433
- var documentElement = getDocumentElement(offsetParent);
1434
- var rect = getBoundingClientRect(elementOrVirtualElement);
1435
1489
  var isOffsetParentAnElement = isHTMLElement(offsetParent);
1490
+ var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);
1491
+ var documentElement = getDocumentElement(offsetParent);
1492
+ var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled);
1436
1493
  var scroll = {
1437
1494
  scrollLeft: 0,
1438
1495
  scrollTop: 0
@@ -1449,7 +1506,7 @@ var VueTippy = (function (exports, vue) {
1449
1506
  }
1450
1507
 
1451
1508
  if (isHTMLElement(offsetParent)) {
1452
- offsets = getBoundingClientRect(offsetParent);
1509
+ offsets = getBoundingClientRect(offsetParent, true);
1453
1510
  offsets.x += offsetParent.clientLeft;
1454
1511
  offsets.y += offsetParent.clientTop;
1455
1512
  } else if (documentElement) {
@@ -1539,7 +1596,10 @@ var VueTippy = (function (exports, vue) {
1539
1596
  var VALID_PROPERTIES = ['name', 'enabled', 'phase', 'fn', 'effect', 'requires', 'options'];
1540
1597
  function validateModifiers(modifiers) {
1541
1598
  modifiers.forEach(function (modifier) {
1542
- Object.keys(modifier).forEach(function (key) {
1599
+ [].concat(Object.keys(modifier), VALID_PROPERTIES) // IE11-compatible replacement for `new Set(iterable)`
1600
+ .filter(function (value, index, self) {
1601
+ return self.indexOf(value) === index;
1602
+ }).forEach(function (key) {
1543
1603
  switch (key) {
1544
1604
  case 'name':
1545
1605
  if (typeof modifier.name !== 'string') {
@@ -1553,6 +1613,8 @@ var VueTippy = (function (exports, vue) {
1553
1613
  console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', "\"" + String(modifier.enabled) + "\""));
1554
1614
  }
1555
1615
 
1616
+ break;
1617
+
1556
1618
  case 'phase':
1557
1619
  if (modifierPhases.indexOf(modifier.phase) < 0) {
1558
1620
  console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + modifierPhases.join(', '), "\"" + String(modifier.phase) + "\""));
@@ -1568,14 +1630,14 @@ var VueTippy = (function (exports, vue) {
1568
1630
  break;
1569
1631
 
1570
1632
  case 'effect':
1571
- if (typeof modifier.effect !== 'function') {
1633
+ if (modifier.effect != null && typeof modifier.effect !== 'function') {
1572
1634
  console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', "\"" + String(modifier.fn) + "\""));
1573
1635
  }
1574
1636
 
1575
1637
  break;
1576
1638
 
1577
1639
  case 'requires':
1578
- if (!Array.isArray(modifier.requires)) {
1640
+ if (modifier.requires != null && !Array.isArray(modifier.requires)) {
1579
1641
  console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', "\"" + String(modifier.requires) + "\""));
1580
1642
  }
1581
1643
 
@@ -1685,7 +1747,8 @@ var VueTippy = (function (exports, vue) {
1685
1747
  var isDestroyed = false;
1686
1748
  var instance = {
1687
1749
  state: state,
1688
- setOptions: function setOptions(options) {
1750
+ setOptions: function setOptions(setOptionsAction) {
1751
+ var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;
1689
1752
  cleanupModifierEffects();
1690
1753
  state.options = Object.assign({}, defaultOptions, state.options, options);
1691
1754
  state.scrollParents = {
@@ -1884,7 +1947,7 @@ var VueTippy = (function (exports, vue) {
1884
1947
  }); // eslint-disable-next-line import/no-unused-modules
1885
1948
 
1886
1949
  /**!
1887
- * tippy.js v6.3.1
1950
+ * tippy.js v6.3.7
1888
1951
  * (c) 2017-2021 atomiks
1889
1952
  * MIT License
1890
1953
  */
@@ -1899,6 +1962,9 @@ var VueTippy = (function (exports, vue) {
1899
1962
  passive: true,
1900
1963
  capture: true
1901
1964
  };
1965
+ var TIPPY_DEFAULT_APPEND_TO = function TIPPY_DEFAULT_APPEND_TO() {
1966
+ return document.body;
1967
+ };
1902
1968
 
1903
1969
  function hasOwnProperty(obj, key) {
1904
1970
  return {}.hasOwnProperty.call(obj, key);
@@ -2024,7 +2090,7 @@ var VueTippy = (function (exports, vue) {
2024
2090
  element = _normalizeToArray[0]; // Elements created via a <template> have an ownerDocument with no reference to the body
2025
2091
 
2026
2092
 
2027
- return (element == null ? void 0 : (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body) ? element.ownerDocument : document;
2093
+ return element != null && (_element$ownerDocumen = element.ownerDocument) != null && _element$ownerDocumen.body ? element.ownerDocument : document;
2028
2094
  }
2029
2095
  function isCursorOutsideInteractiveBorder(popperTreeData, event) {
2030
2096
  var clientX = event.clientX,
@@ -2060,6 +2126,26 @@ var VueTippy = (function (exports, vue) {
2060
2126
  box[method](event, listener);
2061
2127
  });
2062
2128
  }
2129
+ /**
2130
+ * Compared to xxx.contains, this function works for dom structures with shadow
2131
+ * dom
2132
+ */
2133
+
2134
+ function actualContains(parent, child) {
2135
+ var target = child;
2136
+
2137
+ while (target) {
2138
+ var _target$getRootNode;
2139
+
2140
+ if (parent.contains(target)) {
2141
+ return true;
2142
+ }
2143
+
2144
+ target = target.getRootNode == null ? void 0 : (_target$getRootNode = target.getRootNode()) == null ? void 0 : _target$getRootNode.host;
2145
+ }
2146
+
2147
+ return false;
2148
+ }
2063
2149
 
2064
2150
  var currentInput = {
2065
2151
  isTouch: false
@@ -2123,8 +2209,8 @@ var VueTippy = (function (exports, vue) {
2123
2209
  }
2124
2210
 
2125
2211
  var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
2126
- var ua = isBrowser ? navigator.userAgent : '';
2127
- var isIE = /MSIE |Trident\//.test(ua);
2212
+ var isIE11 = isBrowser ? // @ts-ignore
2213
+ !!window.msCrypto : false;
2128
2214
 
2129
2215
  function createMemoryLeakWarning(method) {
2130
2216
  var txt = method === 'destroy' ? 'n already-' : ' ';
@@ -2199,9 +2285,7 @@ var VueTippy = (function (exports, vue) {
2199
2285
  zIndex: 9999
2200
2286
  };
2201
2287
  var defaultProps = Object.assign({
2202
- appendTo: function appendTo() {
2203
- return document.body;
2204
- },
2288
+ appendTo: TIPPY_DEFAULT_APPEND_TO,
2205
2289
  aria: {
2206
2290
  content: 'auto',
2207
2291
  expanded: 'auto'
@@ -2236,7 +2320,7 @@ var VueTippy = (function (exports, vue) {
2236
2320
  touch: true,
2237
2321
  trigger: 'mouseenter focus',
2238
2322
  triggerTarget: null
2239
- }, pluginProps, {}, renderProps);
2323
+ }, pluginProps, renderProps);
2240
2324
  var defaultKeys = Object.keys(defaultProps);
2241
2325
  var setDefaultProps = function setDefaultProps(partialProps) {
2242
2326
  /* istanbul ignore else */
@@ -2256,12 +2340,14 @@ var VueTippy = (function (exports, vue) {
2256
2340
  defaultValue = plugin.defaultValue;
2257
2341
 
2258
2342
  if (name) {
2259
- acc[name] = passedProps[name] !== undefined ? passedProps[name] : defaultValue;
2343
+ var _name;
2344
+
2345
+ acc[name] = passedProps[name] !== undefined ? passedProps[name] : (_name = defaultProps[name]) != null ? _name : defaultValue;
2260
2346
  }
2261
2347
 
2262
2348
  return acc;
2263
2349
  }, {});
2264
- return Object.assign({}, passedProps, {}, pluginProps);
2350
+ return Object.assign({}, passedProps, pluginProps);
2265
2351
  }
2266
2352
  function getDataAttributeProps(reference, plugins) {
2267
2353
  var propKeys = plugins ? Object.keys(getExtendedPassedProps(Object.assign({}, defaultProps, {
@@ -2292,7 +2378,7 @@ var VueTippy = (function (exports, vue) {
2292
2378
  var out = Object.assign({}, props, {
2293
2379
  content: invokeWithArgsOrReturn(props.content, [reference])
2294
2380
  }, props.ignoreAttributes ? {} : getDataAttributeProps(reference, props.plugins));
2295
- out.aria = Object.assign({}, defaultProps.aria, {}, out.aria);
2381
+ out.aria = Object.assign({}, defaultProps.aria, out.aria);
2296
2382
  out.aria = {
2297
2383
  expanded: out.aria.expanded === 'auto' ? props.interactive : out.aria.expanded,
2298
2384
  content: out.aria.content === 'auto' ? props.interactive ? null : 'describedby' : out.aria.content
@@ -2453,7 +2539,7 @@ var VueTippy = (function (exports, vue) {
2453
2539
 
2454
2540
  var mountedInstances = [];
2455
2541
  function createTippy(reference, passedProps) {
2456
- var props = evaluateProps(reference, Object.assign({}, defaultProps, {}, getExtendedPassedProps(removeUndefinedProps(passedProps)))); // ===========================================================================
2542
+ var props = evaluateProps(reference, Object.assign({}, defaultProps, getExtendedPassedProps(removeUndefinedProps(passedProps)))); // ===========================================================================
2457
2543
  // 🔒 Private members
2458
2544
  // ===========================================================================
2459
2545
 
@@ -2553,10 +2639,9 @@ var VueTippy = (function (exports, vue) {
2553
2639
  instance.clearDelayTimeouts();
2554
2640
  }
2555
2641
  });
2556
- popper.addEventListener('mouseleave', function (event) {
2642
+ popper.addEventListener('mouseleave', function () {
2557
2643
  if (instance.props.interactive && instance.props.trigger.indexOf('mouseenter') >= 0) {
2558
2644
  getDocument().addEventListener('mousemove', debouncedOnMouseMove);
2559
- debouncedOnMouseMove(event);
2560
2645
  }
2561
2646
  });
2562
2647
  return instance; // ===========================================================================
@@ -2576,7 +2661,7 @@ var VueTippy = (function (exports, vue) {
2576
2661
  var _instance$props$rende;
2577
2662
 
2578
2663
  // @ts-ignore
2579
- return !!((_instance$props$rende = instance.props.render) == null ? void 0 : _instance$props$rende.$$tippy);
2664
+ return !!((_instance$props$rende = instance.props.render) != null && _instance$props$rende.$$tippy);
2580
2665
  }
2581
2666
 
2582
2667
  function getCurrentTarget() {
@@ -2603,8 +2688,12 @@ var VueTippy = (function (exports, vue) {
2603
2688
  return getValueAtIndexOrReturn(instance.props.delay, isShow ? 0 : 1, defaultProps.delay);
2604
2689
  }
2605
2690
 
2606
- function handleStyles() {
2607
- popper.style.pointerEvents = instance.props.interactive && instance.state.isVisible ? '' : 'none';
2691
+ function handleStyles(fromHide) {
2692
+ if (fromHide === void 0) {
2693
+ fromHide = false;
2694
+ }
2695
+
2696
+ popper.style.pointerEvents = instance.props.interactive && !fromHide ? '' : 'none';
2608
2697
  popper.style.zIndex = "" + instance.props.zIndex;
2609
2698
  }
2610
2699
 
@@ -2615,7 +2704,7 @@ var VueTippy = (function (exports, vue) {
2615
2704
 
2616
2705
  pluginsHooks.forEach(function (pluginHooks) {
2617
2706
  if (pluginHooks[hook]) {
2618
- pluginHooks[hook].apply(void 0, args);
2707
+ pluginHooks[hook].apply(pluginHooks, args);
2619
2708
  }
2620
2709
  });
2621
2710
 
@@ -2681,15 +2770,18 @@ var VueTippy = (function (exports, vue) {
2681
2770
  if (didTouchMove || event.type === 'mousedown') {
2682
2771
  return;
2683
2772
  }
2684
- } // Clicked on interactive popper
2773
+ }
2685
2774
 
2775
+ var actualTarget = event.composedPath && event.composedPath()[0] || event.target; // Clicked on interactive popper
2686
2776
 
2687
- if (instance.props.interactive && popper.contains(event.target)) {
2777
+ if (instance.props.interactive && actualContains(popper, actualTarget)) {
2688
2778
  return;
2689
2779
  } // Clicked on the event listeners target
2690
2780
 
2691
2781
 
2692
- if (getCurrentTarget().contains(event.target)) {
2782
+ if (normalizeToArray(instance.props.triggerTarget || reference).some(function (el) {
2783
+ return actualContains(el, actualTarget);
2784
+ })) {
2693
2785
  if (currentInput.isTouch) {
2694
2786
  return;
2695
2787
  }
@@ -2817,7 +2909,7 @@ var VueTippy = (function (exports, vue) {
2817
2909
  break;
2818
2910
 
2819
2911
  case 'focus':
2820
- on(isIE ? 'focusout' : 'blur', onBlurOrFocusOut);
2912
+ on(isIE11 ? 'focusout' : 'blur', onBlurOrFocusOut);
2821
2913
  break;
2822
2914
 
2823
2915
  case 'focusin':
@@ -3043,7 +3135,7 @@ var VueTippy = (function (exports, vue) {
3043
3135
 
3044
3136
  var node = getCurrentTarget();
3045
3137
 
3046
- if (instance.props.interactive && appendTo === defaultProps.appendTo || appendTo === 'parent') {
3138
+ if (instance.props.interactive && appendTo === TIPPY_DEFAULT_APPEND_TO || appendTo === 'parent') {
3047
3139
  parentNode = node.parentNode;
3048
3140
  } else {
3049
3141
  parentNode = invokeWithArgsOrReturn(appendTo, [node]);
@@ -3055,6 +3147,7 @@ var VueTippy = (function (exports, vue) {
3055
3147
  parentNode.appendChild(popper);
3056
3148
  }
3057
3149
 
3150
+ instance.state.isMounted = true;
3058
3151
  createPopperInstance();
3059
3152
  /* istanbul ignore else */
3060
3153
 
@@ -3162,7 +3255,7 @@ var VueTippy = (function (exports, vue) {
3162
3255
  invokeHook('onBeforeUpdate', [instance, partialProps]);
3163
3256
  removeListeners();
3164
3257
  var prevProps = instance.props;
3165
- var nextProps = evaluateProps(reference, Object.assign({}, instance.props, {}, partialProps, {
3258
+ var nextProps = evaluateProps(reference, Object.assign({}, prevProps, removeUndefinedProps(partialProps), {
3166
3259
  ignoreAttributes: true
3167
3260
  }));
3168
3261
  instance.props = nextProps;
@@ -3291,7 +3384,6 @@ var VueTippy = (function (exports, vue) {
3291
3384
  // popper has been positioned for the first time
3292
3385
 
3293
3386
  (_instance$popperInsta2 = instance.popperInstance) == null ? void 0 : _instance$popperInsta2.forceUpdate();
3294
- instance.state.isMounted = true;
3295
3387
  invokeHook('onMount', [instance]);
3296
3388
 
3297
3389
  if (instance.props.animation && getIsDefaultRenderFn()) {
@@ -3338,7 +3430,7 @@ var VueTippy = (function (exports, vue) {
3338
3430
 
3339
3431
  cleanupInteractiveMouseListeners();
3340
3432
  removeDocumentPress();
3341
- handleStyles();
3433
+ handleStyles(true);
3342
3434
 
3343
3435
  if (getIsDefaultRenderFn()) {
3344
3436
  var _getDefaultTemplateCh4 = getDefaultTemplateChildren(),
@@ -3512,11 +3604,20 @@ var VueTippy = (function (exports, vue) {
3512
3604
 
3513
3605
  var individualInstances = tippyInstances;
3514
3606
  var references = [];
3607
+ var triggerTargets = [];
3515
3608
  var currentTarget;
3516
3609
  var overrides = optionalProps.overrides;
3517
3610
  var interceptSetPropsCleanups = [];
3518
3611
  var shownOnCreate = false;
3519
3612
 
3613
+ function setTriggerTargets() {
3614
+ triggerTargets = individualInstances.map(function (instance) {
3615
+ return normalizeToArray(instance.props.triggerTarget || instance.reference);
3616
+ }).reduce(function (acc, item) {
3617
+ return acc.concat(item);
3618
+ }, []);
3619
+ }
3620
+
3520
3621
  function setReferences() {
3521
3622
  references = individualInstances.map(function (instance) {
3522
3623
  return instance.reference;
@@ -3553,7 +3654,7 @@ var VueTippy = (function (exports, vue) {
3553
3654
 
3554
3655
 
3555
3656
  function prepareInstance(singleton, target) {
3556
- var index = references.indexOf(target); // bail-out
3657
+ var index = triggerTargets.indexOf(target); // bail-out
3557
3658
 
3558
3659
  if (target === currentTarget) {
3559
3660
  return;
@@ -3566,13 +3667,16 @@ var VueTippy = (function (exports, vue) {
3566
3667
  }, {});
3567
3668
  singleton.setProps(Object.assign({}, overrideProps, {
3568
3669
  getReferenceClientRect: typeof overrideProps.getReferenceClientRect === 'function' ? overrideProps.getReferenceClientRect : function () {
3569
- return target.getBoundingClientRect();
3670
+ var _references$index;
3671
+
3672
+ return (_references$index = references[index]) == null ? void 0 : _references$index.getBoundingClientRect();
3570
3673
  }
3571
3674
  }));
3572
3675
  }
3573
3676
 
3574
3677
  enableInstances(false);
3575
3678
  setReferences();
3679
+ setTriggerTargets();
3576
3680
  var plugin = {
3577
3681
  fn: function fn() {
3578
3682
  return {
@@ -3602,7 +3706,7 @@ var VueTippy = (function (exports, vue) {
3602
3706
  };
3603
3707
  var singleton = tippy(div(), Object.assign({}, removeProperties(optionalProps, ['overrides']), {
3604
3708
  plugins: [plugin].concat(optionalProps.plugins || []),
3605
- triggerTarget: references,
3709
+ triggerTarget: triggerTargets,
3606
3710
  popperOptions: Object.assign({}, optionalProps.popperOptions, {
3607
3711
  modifiers: [].concat(((_optionalProps$popper = optionalProps.popperOptions) == null ? void 0 : _optionalProps$popper.modifiers) || [], [applyStylesModifier])
3608
3712
  })
@@ -3629,13 +3733,13 @@ var VueTippy = (function (exports, vue) {
3629
3733
  } // target is a child tippy instance
3630
3734
 
3631
3735
 
3632
- if (individualInstances.includes(target)) {
3736
+ if (individualInstances.indexOf(target) >= 0) {
3633
3737
  var ref = target.reference;
3634
3738
  return prepareInstance(singleton, ref);
3635
3739
  } // target is a ReferenceElement
3636
3740
 
3637
3741
 
3638
- if (references.includes(target)) {
3742
+ if (references.indexOf(target) >= 0) {
3639
3743
  return prepareInstance(singleton, target);
3640
3744
  }
3641
3745
  };
@@ -3678,9 +3782,10 @@ var VueTippy = (function (exports, vue) {
3678
3782
  individualInstances = nextInstances;
3679
3783
  enableInstances(false);
3680
3784
  setReferences();
3681
- interceptSetProps(singleton);
3785
+ setTriggerTargets();
3786
+ interceptSetPropsCleanups = interceptSetProps(singleton);
3682
3787
  singleton.setProps({
3683
- triggerTarget: references
3788
+ triggerTarget: triggerTargets
3684
3789
  });
3685
3790
  };
3686
3791
 
@@ -3695,7 +3800,7 @@ var VueTippy = (function (exports, vue) {
3695
3800
  var _instance$props$rende;
3696
3801
 
3697
3802
  // @ts-ignore
3698
- if (!((_instance$props$rende = instance.props.render) == null ? void 0 : _instance$props$rende.$$tippy)) {
3803
+ if (!((_instance$props$rende = instance.props.render) != null && _instance$props$rende.$$tippy)) {
3699
3804
  if (process.env.NODE_ENV !== "production") {
3700
3805
  errorWhen(instance.props.animateFill, 'The `animateFill` plugin requires the default render function.');
3701
3806
  }
@@ -3820,6 +3925,7 @@ var VueTippy = (function (exports, vue) {
3820
3925
 
3821
3926
  if (isCursorOverReference || !instance.props.interactive) {
3822
3927
  instance.setProps({
3928
+ // @ts-ignore - unneeded DOMRect properties
3823
3929
  getReferenceClientRect: function getReferenceClientRect() {
3824
3930
  var rect = reference.getBoundingClientRect();
3825
3931
  var x = clientX;
@@ -3956,6 +4062,7 @@ var VueTippy = (function (exports, vue) {
3956
4062
  var placement;
3957
4063
  var cursorRectIndex = -1;
3958
4064
  var isInternalUpdate = false;
4065
+ var triedPlacements = [];
3959
4066
  var modifier = {
3960
4067
  name: 'tippyInlinePositioning',
3961
4068
  enabled: true,
@@ -3964,8 +4071,14 @@ var VueTippy = (function (exports, vue) {
3964
4071
  var state = _ref2.state;
3965
4072
 
3966
4073
  if (isEnabled()) {
3967
- if (placement !== state.placement) {
4074
+ if (triedPlacements.indexOf(state.placement) !== -1) {
4075
+ triedPlacements = [];
4076
+ }
4077
+
4078
+ if (placement !== state.placement && triedPlacements.indexOf(state.placement) === -1) {
4079
+ triedPlacements.push(state.placement);
3968
4080
  instance.setProps({
4081
+ // @ts-ignore - unneeded DOMRect properties
3969
4082
  getReferenceClientRect: function getReferenceClientRect() {
3970
4083
  return _getReferenceClientRect(state.placement);
3971
4084
  }
@@ -4002,10 +4115,11 @@ var VueTippy = (function (exports, vue) {
4002
4115
  var cursorRect = rects.find(function (rect) {
4003
4116
  return rect.left - 2 <= event.clientX && rect.right + 2 >= event.clientX && rect.top - 2 <= event.clientY && rect.bottom + 2 >= event.clientY;
4004
4117
  });
4005
- cursorRectIndex = rects.indexOf(cursorRect);
4118
+ var index = rects.indexOf(cursorRect);
4119
+ cursorRectIndex = index > -1 ? index : cursorRectIndex;
4006
4120
  }
4007
4121
  },
4008
- onUntrigger: function onUntrigger() {
4122
+ onHidden: function onHidden() {
4009
4123
  cursorRectIndex = -1;
4010
4124
  }
4011
4125
  };
@@ -4151,6 +4265,13 @@ var VueTippy = (function (exports, vue) {
4151
4265
  function useTippy(el, opts = {}, settings = { mount: true }) {
4152
4266
  const vm = vue.getCurrentInstance();
4153
4267
  const instance = vue.ref();
4268
+ const state = vue.ref({
4269
+ isEnabled: false,
4270
+ isVisible: false,
4271
+ isDestroyed: false,
4272
+ isMounted: false,
4273
+ isShown: false,
4274
+ });
4154
4275
  let container = null;
4155
4276
  const getContainer = () => {
4156
4277
  if (container)
@@ -4202,6 +4323,38 @@ var VueTippy = (function (exports, vue) {
4202
4323
  ? options.triggerTarget.value
4203
4324
  : options.triggerTarget;
4204
4325
  }
4326
+ options.plugins.push({
4327
+ fn() {
4328
+ return {
4329
+ onCreate() {
4330
+ state.value.isEnabled = true;
4331
+ },
4332
+ onMount() {
4333
+ state.value.isMounted = true;
4334
+ },
4335
+ onShow() {
4336
+ state.value.isMounted = true;
4337
+ state.value.isVisible = true;
4338
+ },
4339
+ onShown() {
4340
+ state.value.isShown = true;
4341
+ },
4342
+ onHide() {
4343
+ state.value.isMounted = false;
4344
+ state.value.isVisible = false;
4345
+ },
4346
+ onHidden() {
4347
+ state.value.isShown = false;
4348
+ },
4349
+ onUnmounted() {
4350
+ state.value.isMounted = false;
4351
+ },
4352
+ onDestroy() {
4353
+ state.value.isDestroyed = true;
4354
+ },
4355
+ };
4356
+ }
4357
+ });
4205
4358
  return options;
4206
4359
  };
4207
4360
  const refresh = () => {
@@ -4240,10 +4393,12 @@ var VueTippy = (function (exports, vue) {
4240
4393
  const disable = () => {
4241
4394
  var _a;
4242
4395
  (_a = instance.value) === null || _a === void 0 ? void 0 : _a.disable();
4396
+ state.value.isEnabled = false;
4243
4397
  };
4244
4398
  const enable = () => {
4245
4399
  var _a;
4246
4400
  (_a = instance.value) === null || _a === void 0 ? void 0 : _a.enable();
4401
+ state.value.isEnabled = true;
4247
4402
  };
4248
4403
  const unmount = () => {
4249
4404
  var _a;
@@ -4274,6 +4429,7 @@ var VueTippy = (function (exports, vue) {
4274
4429
  enable,
4275
4430
  unmount,
4276
4431
  mount,
4432
+ state,
4277
4433
  };
4278
4434
  if (settings.mount) {
4279
4435
  if (vm) {
@@ -4392,9 +4548,11 @@ var VueTippy = (function (exports, vue) {
4392
4548
  };
4393
4549
  const TippyComponent = vue.defineComponent({
4394
4550
  props,
4395
- setup(props, { slots }) {
4551
+ emits: ['state'],
4552
+ setup(props, { slots, emit }) {
4396
4553
  const elem = vue.ref();
4397
4554
  const contentElem = vue.ref();
4555
+ const mounted = vue.ref(false);
4398
4556
  let options = { ...props };
4399
4557
  for (const prop of ['to', 'tag', 'contentTag', 'contentClass']) {
4400
4558
  if (options.hasOwnProperty(prop)) {
@@ -4404,7 +4562,7 @@ var VueTippy = (function (exports, vue) {
4404
4562
  }
4405
4563
  let target = elem;
4406
4564
  if (props.to) {
4407
- if (props.to instanceof Element) {
4565
+ if (typeof Element !== 'undefined' && props.to instanceof Element) {
4408
4566
  target = () => props.to;
4409
4567
  }
4410
4568
  else if (typeof props.to === 'string' || props.to instanceof String) {
@@ -4413,16 +4571,22 @@ var VueTippy = (function (exports, vue) {
4413
4571
  }
4414
4572
  const tippy = useTippy(target, options);
4415
4573
  vue.onMounted(() => {
4416
- if (slots.content)
4417
- tippy.setContent(() => contentElem.value);
4574
+ mounted.value = true;
4575
+ vue.nextTick(() => {
4576
+ if (slots.content)
4577
+ tippy.setContent(() => contentElem.value);
4578
+ });
4418
4579
  });
4419
- return { elem, contentElem, ...tippy };
4580
+ vue.watch(tippy.state, () => {
4581
+ emit('state', vue.unref(tippy.state));
4582
+ }, { immediate: true, deep: true });
4583
+ return { elem, contentElem, mounted, ...tippy };
4420
4584
  },
4421
4585
  render() {
4422
4586
  let slot = this.$slots.default ? this.$slots.default(this) : [];
4423
4587
  return vue.h(this.tag, { ref: 'elem', 'data-v-tippy': '' }, this.$slots.content ? [
4424
4588
  slot,
4425
- vue.h(this.contentTag, { ref: 'contentElem', class: this.contentClass }, this.$slots.content(this))
4589
+ vue.h(this.contentTag, { ref: 'contentElem', style: { display: this.mounted ? 'inherit' : 'none' }, class: this.contentClass }, this.$slots.content(this)),
4426
4590
  ] : slot);
4427
4591
  },
4428
4592
  });