vrembem 1.35.2 → 1.38.0

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.
@@ -66,6 +66,8 @@
66
66
  });
67
67
  };
68
68
 
69
+ var focusableSelectors = ['a[href]:not([tabindex^="-"])', 'area[href]:not([tabindex^="-"])', 'input:not([type="hidden"]):not([type="radio"]):not([disabled]):not([tabindex^="-"])', 'input[type="radio"]:not([disabled]):not([tabindex^="-"])', 'select:not([disabled]):not([tabindex^="-"])', 'textarea:not([disabled]):not([tabindex^="-"])', 'button:not([disabled]):not([tabindex^="-"])', 'iframe:not([tabindex^="-"])', 'audio[controls]:not([tabindex^="-"])', 'video[controls]:not([tabindex^="-"])', '[contenteditable]:not([tabindex^="-"])', '[tabindex]:not([tabindex^="-"])'];
70
+
69
71
  var focusTarget = function focusTarget(target, settings) {
70
72
  var innerFocus = target.querySelector("[data-" + settings.dataFocus + "]");
71
73
 
@@ -118,6 +120,28 @@
118
120
  this.target = null;
119
121
  };
120
122
 
123
+ _proto.refresh = function refresh() {
124
+ // Check if a target has been set
125
+ if (!this.target) return; // Remove existing events
126
+
127
+ this.target.removeEventListener('keydown', this.__handlerFocusTrap);
128
+ this.target.removeEventListener('keydown', this.handlerFocusLock); // Get the focusable elements
129
+
130
+ this.focusable = this.getFocusable(); // Setup the focus handlers based on focusable length
131
+
132
+ if (this.focusable.length) {
133
+ // If there are focusable elements, setup focus trap
134
+ this.focusableFirst = this.focusable[0];
135
+ this.focusableLast = this.focusable[this.focusable.length - 1];
136
+ this.target.addEventListener('keydown', this.__handlerFocusTrap);
137
+ } else {
138
+ // If there are no focusable elements, setup focus lock
139
+ this.focusableFirst = null;
140
+ this.focusableLast = null;
141
+ this.target.addEventListener('keydown', this.handlerFocusLock);
142
+ }
143
+ };
144
+
121
145
  _proto.handlerFocusTrap = function handlerFocusTrap(event) {
122
146
  var isTab = event.key === 'Tab' || event.keyCode === 9;
123
147
  if (!isTab) return;
@@ -144,7 +168,7 @@
144
168
  var focusable = [];
145
169
  var initFocus = document.activeElement;
146
170
  var initScrollTop = this.inner ? this.inner.scrollTop : 0;
147
- this.target.querySelectorAll('a[href]:not([disabled]),button:not([disabled]),textarea:not([disabled]),input[type="text"]:not([disabled]),input[type="radio"]:not([disabled]),input[type="checkbox"]:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex="-1"])').forEach(function (el) {
171
+ this.target.querySelectorAll(focusableSelectors.join(',')).forEach(function (el) {
148
172
  el.focus();
149
173
 
150
174
  if (el === document.activeElement) {
@@ -879,6 +903,7 @@
879
903
 
880
904
  focusTarget(drawer, _this4.settings);
881
905
  drawer.dispatchEvent(new CustomEvent(_this4.settings.customEventPrefix + 'opened', {
906
+ detail: _this4,
882
907
  bubbles: true
883
908
  }));
884
909
  _this4.working = false;
@@ -917,6 +942,7 @@
917
942
  _this6.focusTrap.destroy();
918
943
 
919
944
  drawer.dispatchEvent(new CustomEvent(_this6.settings.customEventPrefix + 'closed', {
945
+ detail: _this6,
920
946
  bubbles: true
921
947
  }));
922
948
  _this6.working = false;
@@ -963,10 +989,6 @@
963
989
 
964
990
  var handlerClick$1 = function handlerClick(event) {
965
991
  try {
966
- var _exit2;
967
-
968
- var _this2 = this;
969
-
970
992
  var _temp3 = function _temp3(_result) {
971
993
  if (_exit2) return _result;
972
994
 
@@ -985,6 +1007,10 @@
985
1007
  }
986
1008
  };
987
1009
 
1010
+ var _exit2;
1011
+
1012
+ var _this2 = this;
1013
+
988
1014
  // Working catch
989
1015
  if (_this2.working) return Promise.resolve(); // Trigger click
990
1016
 
@@ -1151,6 +1177,7 @@
1151
1177
  focusTarget(modal, _this2.settings);
1152
1178
  setInert(true, _this2.settings.selectorInert);
1153
1179
  modal.dispatchEvent(new CustomEvent(_this2.settings.customEventPrefix + 'opened', {
1180
+ detail: _this2,
1154
1181
  bubbles: true
1155
1182
  }));
1156
1183
  _this2.working = false;
@@ -1184,6 +1211,7 @@
1184
1211
  _this4.focusTrap.destroy();
1185
1212
 
1186
1213
  modal.dispatchEvent(new CustomEvent(_this4.settings.customEventPrefix + 'closed', {
1214
+ detail: _this4,
1187
1215
  bubbles: true
1188
1216
  }));
1189
1217
  _this4.working = false;
@@ -1599,17 +1627,42 @@
1599
1627
  return placement.split('-')[0];
1600
1628
  }
1601
1629
 
1602
- function getBoundingClientRect(element) {
1630
+ var max = Math.max;
1631
+ var min = Math.min;
1632
+ var round = Math.round;
1633
+
1634
+ function getBoundingClientRect(element, includeScale) {
1635
+ if (includeScale === void 0) {
1636
+ includeScale = false;
1637
+ }
1638
+
1603
1639
  var rect = element.getBoundingClientRect();
1640
+ var scaleX = 1;
1641
+ var scaleY = 1;
1642
+
1643
+ if (isHTMLElement(element) && includeScale) {
1644
+ var offsetHeight = element.offsetHeight;
1645
+ var offsetWidth = element.offsetWidth; // Do not attempt to divide by 0, otherwise we get `Infinity` as scale
1646
+ // Fallback to 1 in case both values are `0`
1647
+
1648
+ if (offsetWidth > 0) {
1649
+ scaleX = round(rect.width) / offsetWidth || 1;
1650
+ }
1651
+
1652
+ if (offsetHeight > 0) {
1653
+ scaleY = round(rect.height) / offsetHeight || 1;
1654
+ }
1655
+ }
1656
+
1604
1657
  return {
1605
- width: rect.width,
1606
- height: rect.height,
1607
- top: rect.top,
1608
- right: rect.right,
1609
- bottom: rect.bottom,
1610
- left: rect.left,
1611
- x: rect.left,
1612
- y: rect.top
1658
+ width: rect.width / scaleX,
1659
+ height: rect.height / scaleY,
1660
+ top: rect.top / scaleY,
1661
+ right: rect.right / scaleX,
1662
+ bottom: rect.bottom / scaleY,
1663
+ left: rect.left / scaleX,
1664
+ x: rect.left / scaleX,
1665
+ y: rect.top / scaleY
1613
1666
  };
1614
1667
  }
1615
1668
 
@@ -1754,13 +1807,13 @@
1754
1807
  return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';
1755
1808
  }
1756
1809
 
1757
- var max = Math.max;
1758
- var min = Math.min;
1759
- var round = Math.round;
1760
-
1761
1810
  function within(min$1, value, max$1) {
1762
1811
  return max(min$1, min(value, max$1));
1763
1812
  }
1813
+ function withinMaxClamp(min, value, max) {
1814
+ var v = within(min, value, max);
1815
+ return v > max ? max : v;
1816
+ }
1764
1817
 
1765
1818
  function getFreshSideObject() {
1766
1819
  return {
@@ -1864,6 +1917,10 @@
1864
1917
  requiresIfExists: ['preventOverflow']
1865
1918
  };
1866
1919
 
1920
+ function getVariation(placement) {
1921
+ return placement.split('-')[1];
1922
+ }
1923
+
1867
1924
  var unsetSides = {
1868
1925
  top: 'auto',
1869
1926
  right: 'auto',
@@ -1879,8 +1936,8 @@
1879
1936
  var win = window;
1880
1937
  var dpr = win.devicePixelRatio || 1;
1881
1938
  return {
1882
- x: round(round(x * dpr) / dpr) || 0,
1883
- y: round(round(y * dpr) / dpr) || 0
1939
+ x: round(x * dpr) / dpr || 0,
1940
+ y: round(y * dpr) / dpr || 0
1884
1941
  };
1885
1942
  }
1886
1943
 
@@ -1890,18 +1947,28 @@
1890
1947
  var popper = _ref2.popper,
1891
1948
  popperRect = _ref2.popperRect,
1892
1949
  placement = _ref2.placement,
1950
+ variation = _ref2.variation,
1893
1951
  offsets = _ref2.offsets,
1894
1952
  position = _ref2.position,
1895
1953
  gpuAcceleration = _ref2.gpuAcceleration,
1896
1954
  adaptive = _ref2.adaptive,
1897
- roundOffsets = _ref2.roundOffsets;
1898
-
1899
- var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets,
1900
- _ref3$x = _ref3.x,
1901
- x = _ref3$x === void 0 ? 0 : _ref3$x,
1902
- _ref3$y = _ref3.y,
1903
- y = _ref3$y === void 0 ? 0 : _ref3$y;
1955
+ roundOffsets = _ref2.roundOffsets,
1956
+ isFixed = _ref2.isFixed;
1957
+ var _offsets$x = offsets.x,
1958
+ x = _offsets$x === void 0 ? 0 : _offsets$x,
1959
+ _offsets$y = offsets.y,
1960
+ y = _offsets$y === void 0 ? 0 : _offsets$y;
1961
+
1962
+ var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({
1963
+ x: x,
1964
+ y: y
1965
+ }) : {
1966
+ x: x,
1967
+ y: y
1968
+ };
1904
1969
 
1970
+ x = _ref3.x;
1971
+ y = _ref3.y;
1905
1972
  var hasX = offsets.hasOwnProperty('x');
1906
1973
  var hasY = offsets.hasOwnProperty('y');
1907
1974
  var sideX = left;
@@ -1916,7 +1983,7 @@
1916
1983
  if (offsetParent === getWindow(popper)) {
1917
1984
  offsetParent = getDocumentElement(popper);
1918
1985
 
1919
- if (getComputedStyle$1(offsetParent).position !== 'static') {
1986
+ if (getComputedStyle$1(offsetParent).position !== 'static' && position === 'absolute') {
1920
1987
  heightProp = 'scrollHeight';
1921
1988
  widthProp = 'scrollWidth';
1922
1989
  }
@@ -1925,17 +1992,19 @@
1925
1992
 
1926
1993
  offsetParent = offsetParent;
1927
1994
 
1928
- if (placement === top) {
1929
- sideY = bottom; // $FlowFixMe[prop-missing]
1930
-
1931
- y -= offsetParent[heightProp] - popperRect.height;
1995
+ if (placement === top || (placement === left || placement === right) && variation === end) {
1996
+ sideY = bottom;
1997
+ var offsetY = isFixed && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]
1998
+ offsetParent[heightProp];
1999
+ y -= offsetY - popperRect.height;
1932
2000
  y *= gpuAcceleration ? 1 : -1;
1933
2001
  }
1934
2002
 
1935
- if (placement === left) {
1936
- sideX = right; // $FlowFixMe[prop-missing]
1937
-
1938
- x -= offsetParent[widthProp] - popperRect.width;
2003
+ if (placement === left || (placement === top || placement === bottom) && variation === end) {
2004
+ sideX = right;
2005
+ var offsetX = isFixed && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]
2006
+ offsetParent[widthProp];
2007
+ x -= offsetX - popperRect.width;
1939
2008
  x *= gpuAcceleration ? 1 : -1;
1940
2009
  }
1941
2010
  }
@@ -1944,18 +2013,29 @@
1944
2013
  position: position
1945
2014
  }, adaptive && unsetSides);
1946
2015
 
2016
+ var _ref4 = roundOffsets === true ? roundOffsetsByDPR({
2017
+ x: x,
2018
+ y: y
2019
+ }) : {
2020
+ x: x,
2021
+ y: y
2022
+ };
2023
+
2024
+ x = _ref4.x;
2025
+ y = _ref4.y;
2026
+
1947
2027
  if (gpuAcceleration) {
1948
2028
  var _Object$assign;
1949
2029
 
1950
- 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));
2030
+ 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));
1951
2031
  }
1952
2032
 
1953
2033
  return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2));
1954
2034
  }
1955
2035
 
1956
- function computeStyles(_ref4) {
1957
- var state = _ref4.state,
1958
- options = _ref4.options;
2036
+ function computeStyles(_ref5) {
2037
+ var state = _ref5.state,
2038
+ options = _ref5.options;
1959
2039
  var _options$gpuAccelerat = options.gpuAcceleration,
1960
2040
  gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,
1961
2041
  _options$adaptive = options.adaptive,
@@ -1965,9 +2045,11 @@
1965
2045
 
1966
2046
  var commonStyles = {
1967
2047
  placement: getBasePlacement(state.placement),
2048
+ variation: getVariation(state.placement),
1968
2049
  popper: state.elements.popper,
1969
2050
  popperRect: state.rects.popper,
1970
- gpuAcceleration: gpuAcceleration
2051
+ gpuAcceleration: gpuAcceleration,
2052
+ isFixed: state.options.strategy === 'fixed'
1971
2053
  };
1972
2054
 
1973
2055
  if (state.modifiersData.popperOffsets != null) {
@@ -2225,7 +2307,7 @@
2225
2307
  }
2226
2308
 
2227
2309
  function getClientRectFromMixedType(element, clippingParent) {
2228
- return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
2310
+ return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
2229
2311
  } // A "clipping parent" is an overflowable container with the characteristic of
2230
2312
  // clipping (or hiding) overflowing elements with a position different from
2231
2313
  // `initial`
@@ -2267,10 +2349,6 @@
2267
2349
  return clippingRect;
2268
2350
  }
2269
2351
 
2270
- function getVariation(placement) {
2271
- return placement.split('-')[1];
2272
- }
2273
-
2274
2352
  function computeOffsets(_ref) {
2275
2353
  var reference = _ref.reference,
2276
2354
  element = _ref.element,
@@ -2356,11 +2434,10 @@
2356
2434
  padding = _options$padding === void 0 ? 0 : _options$padding;
2357
2435
  var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));
2358
2436
  var altContext = elementContext === popper ? reference : popper;
2359
- var referenceElement = state.elements.reference;
2360
2437
  var popperRect = state.rects.popper;
2361
2438
  var element = state.elements[altBoundary ? altContext : elementContext];
2362
2439
  var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);
2363
- var referenceClientRect = getBoundingClientRect(referenceElement);
2440
+ var referenceClientRect = getBoundingClientRect(state.elements.reference);
2364
2441
  var popperOffsets = computeOffsets({
2365
2442
  reference: referenceClientRect,
2366
2443
  element: popperRect,
@@ -2743,6 +2820,14 @@
2743
2820
  var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {
2744
2821
  placement: state.placement
2745
2822
  })) : tetherOffset;
2823
+ var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {
2824
+ mainAxis: tetherOffsetValue,
2825
+ altAxis: tetherOffsetValue
2826
+ } : Object.assign({
2827
+ mainAxis: 0,
2828
+ altAxis: 0
2829
+ }, tetherOffsetValue);
2830
+ var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;
2746
2831
  var data = {
2747
2832
  x: 0,
2748
2833
  y: 0
@@ -2752,13 +2837,15 @@
2752
2837
  return;
2753
2838
  }
2754
2839
 
2755
- if (checkMainAxis || checkAltAxis) {
2840
+ if (checkMainAxis) {
2841
+ var _offsetModifierState$;
2842
+
2756
2843
  var mainSide = mainAxis === 'y' ? top : left;
2757
2844
  var altSide = mainAxis === 'y' ? bottom : right;
2758
2845
  var len = mainAxis === 'y' ? 'height' : 'width';
2759
2846
  var offset = popperOffsets[mainAxis];
2760
- var min$1 = popperOffsets[mainAxis] + overflow[mainSide];
2761
- var max$1 = popperOffsets[mainAxis] - overflow[altSide];
2847
+ var min$1 = offset + overflow[mainSide];
2848
+ var max$1 = offset - overflow[altSide];
2762
2849
  var additive = tether ? -popperRect[len] / 2 : 0;
2763
2850
  var minLen = variation === start ? referenceRect[len] : popperRect[len];
2764
2851
  var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go
@@ -2778,36 +2865,45 @@
2778
2865
  // width or height)
2779
2866
 
2780
2867
  var arrowLen = within(0, referenceRect[len], arrowRect[len]);
2781
- var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;
2782
- var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;
2868
+ var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;
2869
+ var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;
2783
2870
  var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);
2784
2871
  var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
2785
- var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;
2786
- var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset;
2787
- var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue;
2872
+ var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;
2873
+ var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;
2874
+ var tetherMax = offset + maxOffset - offsetModifierValue;
2875
+ var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1);
2876
+ popperOffsets[mainAxis] = preventedOffset;
2877
+ data[mainAxis] = preventedOffset - offset;
2878
+ }
2788
2879
 
2789
- if (checkMainAxis) {
2790
- var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1);
2791
- popperOffsets[mainAxis] = preventedOffset;
2792
- data[mainAxis] = preventedOffset - offset;
2793
- }
2880
+ if (checkAltAxis) {
2881
+ var _offsetModifierState$2;
2794
2882
 
2795
- if (checkAltAxis) {
2796
- var _mainSide = mainAxis === 'x' ? top : left;
2883
+ var _mainSide = mainAxis === 'x' ? top : left;
2797
2884
 
2798
- var _altSide = mainAxis === 'x' ? bottom : right;
2885
+ var _altSide = mainAxis === 'x' ? bottom : right;
2799
2886
 
2800
- var _offset = popperOffsets[altAxis];
2887
+ var _offset = popperOffsets[altAxis];
2801
2888
 
2802
- var _min = _offset + overflow[_mainSide];
2889
+ var _len = altAxis === 'y' ? 'height' : 'width';
2803
2890
 
2804
- var _max = _offset - overflow[_altSide];
2891
+ var _min = _offset + overflow[_mainSide];
2805
2892
 
2806
- var _preventedOffset = within(tether ? min(_min, tetherMin) : _min, _offset, tether ? max(_max, tetherMax) : _max);
2893
+ var _max = _offset - overflow[_altSide];
2807
2894
 
2808
- popperOffsets[altAxis] = _preventedOffset;
2809
- data[altAxis] = _preventedOffset - _offset;
2810
- }
2895
+ var isOriginSide = [top, left].indexOf(basePlacement) !== -1;
2896
+
2897
+ var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;
2898
+
2899
+ var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;
2900
+
2901
+ var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;
2902
+
2903
+ var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);
2904
+
2905
+ popperOffsets[altAxis] = _preventedOffset;
2906
+ data[altAxis] = _preventedOffset - _offset;
2811
2907
  }
2812
2908
 
2813
2909
  state.modifiersData[name] = data;
@@ -2837,16 +2933,24 @@
2837
2933
  }
2838
2934
  }
2839
2935
 
2936
+ function isElementScaled(element) {
2937
+ var rect = element.getBoundingClientRect();
2938
+ var scaleX = round(rect.width) / element.offsetWidth || 1;
2939
+ var scaleY = round(rect.height) / element.offsetHeight || 1;
2940
+ return scaleX !== 1 || scaleY !== 1;
2941
+ } // Returns the composite rect of an element relative to its offsetParent.
2840
2942
  // Composite means it takes into account transforms as well as layout.
2841
2943
 
2944
+
2842
2945
  function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
2843
2946
  if (isFixed === void 0) {
2844
2947
  isFixed = false;
2845
2948
  }
2846
2949
 
2847
- var documentElement = getDocumentElement(offsetParent);
2848
- var rect = getBoundingClientRect(elementOrVirtualElement);
2849
2950
  var isOffsetParentAnElement = isHTMLElement(offsetParent);
2951
+ var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);
2952
+ var documentElement = getDocumentElement(offsetParent);
2953
+ var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled);
2850
2954
  var scroll = {
2851
2955
  scrollLeft: 0,
2852
2956
  scrollTop: 0
@@ -2863,7 +2967,7 @@
2863
2967
  }
2864
2968
 
2865
2969
  if (isHTMLElement(offsetParent)) {
2866
- offsets = getBoundingClientRect(offsetParent);
2970
+ offsets = getBoundingClientRect(offsetParent, true);
2867
2971
  offsets.x += offsetParent.clientLeft;
2868
2972
  offsets.y += offsetParent.clientTop;
2869
2973
  } else if (documentElement) {
@@ -3000,7 +3104,8 @@
3000
3104
  var isDestroyed = false;
3001
3105
  var instance = {
3002
3106
  state: state,
3003
- setOptions: function setOptions(options) {
3107
+ setOptions: function setOptions(setOptionsAction) {
3108
+ var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;
3004
3109
  cleanupModifierEffects();
3005
3110
  state.options = Object.assign({}, defaultOptions, state.options, options);
3006
3111
  state.scrollParents = {