@depup/react-virtualized 9.22.6-depup.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.
- package/LICENSE +22 -0
- package/README.md +34 -0
- package/changes.json +22 -0
- package/dist/commonjs/ArrowKeyStepper/ArrowKeyStepper.example.js +184 -0
- package/dist/commonjs/ArrowKeyStepper/ArrowKeyStepper.jest.js +338 -0
- package/dist/commonjs/ArrowKeyStepper/ArrowKeyStepper.js +204 -0
- package/dist/commonjs/ArrowKeyStepper/index.js +19 -0
- package/dist/commonjs/ArrowKeyStepper/types.js +5 -0
- package/dist/commonjs/AutoSizer/AutoSizer.example.js +104 -0
- package/dist/commonjs/AutoSizer/AutoSizer.jest.js +341 -0
- package/dist/commonjs/AutoSizer/AutoSizer.js +199 -0
- package/dist/commonjs/AutoSizer/AutoSizer.ssr.js +25 -0
- package/dist/commonjs/AutoSizer/index.js +19 -0
- package/dist/commonjs/CellMeasurer/CellMeasurer.DynamicHeightGrid.example.js +100 -0
- package/dist/commonjs/CellMeasurer/CellMeasurer.DynamicHeightList.example.js +99 -0
- package/dist/commonjs/CellMeasurer/CellMeasurer.DynamicHeightTableColumn.example.js +107 -0
- package/dist/commonjs/CellMeasurer/CellMeasurer.DynamicWidthGrid.example.js +102 -0
- package/dist/commonjs/CellMeasurer/CellMeasurer.DynamicWidthMultiGrid.example.js +107 -0
- package/dist/commonjs/CellMeasurer/CellMeasurer.example.js +129 -0
- package/dist/commonjs/CellMeasurer/CellMeasurer.jest.js +345 -0
- package/dist/commonjs/CellMeasurer/CellMeasurer.js +195 -0
- package/dist/commonjs/CellMeasurer/CellMeasurerCache.jest.js +298 -0
- package/dist/commonjs/CellMeasurer/CellMeasurerCache.js +202 -0
- package/dist/commonjs/CellMeasurer/index.js +22 -0
- package/dist/commonjs/CellMeasurer/types.js +14 -0
- package/dist/commonjs/Collection/Collection.example.js +231 -0
- package/dist/commonjs/Collection/Collection.jest.js +829 -0
- package/dist/commonjs/Collection/Collection.js +266 -0
- package/dist/commonjs/Collection/CollectionView.js +553 -0
- package/dist/commonjs/Collection/Section.jest.js +63 -0
- package/dist/commonjs/Collection/Section.js +57 -0
- package/dist/commonjs/Collection/SectionManager.jest.js +121 -0
- package/dist/commonjs/Collection/SectionManager.js +134 -0
- package/dist/commonjs/Collection/TestData.js +77 -0
- package/dist/commonjs/Collection/index.js +15 -0
- package/dist/commonjs/Collection/types.js +22 -0
- package/dist/commonjs/Collection/utils/calculateSizeAndPositionData.jest.js +34 -0
- package/dist/commonjs/Collection/utils/calculateSizeAndPositionData.js +38 -0
- package/dist/commonjs/ColumnSizer/ColumnSizer.example.js +159 -0
- package/dist/commonjs/ColumnSizer/ColumnSizer.jest.js +129 -0
- package/dist/commonjs/ColumnSizer/ColumnSizer.js +103 -0
- package/dist/commonjs/ColumnSizer/index.js +15 -0
- package/dist/commonjs/Grid/Grid.example.js +330 -0
- package/dist/commonjs/Grid/Grid.jest.js +2561 -0
- package/dist/commonjs/Grid/Grid.js +1432 -0
- package/dist/commonjs/Grid/Grid.ssr.js +62 -0
- package/dist/commonjs/Grid/accessibilityOverscanIndicesGetter.jest.js +92 -0
- package/dist/commonjs/Grid/accessibilityOverscanIndicesGetter.js +40 -0
- package/dist/commonjs/Grid/defaultCellRangeRenderer.js +139 -0
- package/dist/commonjs/Grid/defaultOverscanIndicesGetter.jest.js +92 -0
- package/dist/commonjs/Grid/defaultOverscanIndicesGetter.js +36 -0
- package/dist/commonjs/Grid/index.js +40 -0
- package/dist/commonjs/Grid/types.js +8 -0
- package/dist/commonjs/Grid/utils/CellSizeAndPositionManager.jest.js +375 -0
- package/dist/commonjs/Grid/utils/CellSizeAndPositionManager.js +296 -0
- package/dist/commonjs/Grid/utils/ScalingCellSizeAndPositionManager.jest.js +201 -0
- package/dist/commonjs/Grid/utils/ScalingCellSizeAndPositionManager.js +204 -0
- package/dist/commonjs/Grid/utils/calculateSizeAndPositionDataAndUpdateScrollOffset.jest.js +84 -0
- package/dist/commonjs/Grid/utils/calculateSizeAndPositionDataAndUpdateScrollOffset.js +59 -0
- package/dist/commonjs/Grid/utils/maxElementSize.js +22 -0
- package/dist/commonjs/Grid/utils/updateScrollIndexHelper.jest.js +180 -0
- package/dist/commonjs/Grid/utils/updateScrollIndexHelper.js +85 -0
- package/dist/commonjs/InfiniteLoader/InfiniteLoader.example.js +179 -0
- package/dist/commonjs/InfiniteLoader/InfiniteLoader.jest.js +571 -0
- package/dist/commonjs/InfiniteLoader/InfiniteLoader.js +274 -0
- package/dist/commonjs/InfiniteLoader/index.js +15 -0
- package/dist/commonjs/List/List.example.js +236 -0
- package/dist/commonjs/List/List.jest.js +517 -0
- package/dist/commonjs/List/List.js +318 -0
- package/dist/commonjs/List/index.js +19 -0
- package/dist/commonjs/List/types.js +6 -0
- package/dist/commonjs/Masonry/Masonry.example.js +287 -0
- package/dist/commonjs/Masonry/Masonry.jest.js +450 -0
- package/dist/commonjs/Masonry/Masonry.js +431 -0
- package/dist/commonjs/Masonry/PositionCache.js +88 -0
- package/dist/commonjs/Masonry/createCellPositioner.js +59 -0
- package/dist/commonjs/Masonry/index.js +22 -0
- package/dist/commonjs/MultiGrid/CellMeasurerCacheDecorator.js +106 -0
- package/dist/commonjs/MultiGrid/MultiGrid.example.js +131 -0
- package/dist/commonjs/MultiGrid/MultiGrid.jest.js +584 -0
- package/dist/commonjs/MultiGrid/MultiGrid.js +743 -0
- package/dist/commonjs/MultiGrid/index.js +15 -0
- package/dist/commonjs/ScrollSync/ScrollSync.example.js +257 -0
- package/dist/commonjs/ScrollSync/ScrollSync.jest.js +66 -0
- package/dist/commonjs/ScrollSync/ScrollSync.js +88 -0
- package/dist/commonjs/ScrollSync/index.js +15 -0
- package/dist/commonjs/Table/Column.jest.js +90 -0
- package/dist/commonjs/Table/Column.js +93 -0
- package/dist/commonjs/Table/SortDirection.js +19 -0
- package/dist/commonjs/Table/SortIndicator.js +40 -0
- package/dist/commonjs/Table/Table.example.js +325 -0
- package/dist/commonjs/Table/Table.jest.js +1257 -0
- package/dist/commonjs/Table/Table.js +742 -0
- package/dist/commonjs/Table/createMultiSort.jest.js +165 -0
- package/dist/commonjs/Table/createMultiSort.js +99 -0
- package/dist/commonjs/Table/defaultCellDataGetter.js +21 -0
- package/dist/commonjs/Table/defaultCellRenderer.js +19 -0
- package/dist/commonjs/Table/defaultHeaderRenderer.js +35 -0
- package/dist/commonjs/Table/defaultHeaderRowRenderer.js +21 -0
- package/dist/commonjs/Table/defaultRowRenderer.js +87 -0
- package/dist/commonjs/Table/index.js +78 -0
- package/dist/commonjs/Table/types.js +39 -0
- package/dist/commonjs/WindowScroller/WindowScroller.e2e.js +298 -0
- package/dist/commonjs/WindowScroller/WindowScroller.example.js +167 -0
- package/dist/commonjs/WindowScroller/WindowScroller.header-resize.e2e.js +359 -0
- package/dist/commonjs/WindowScroller/WindowScroller.jest.js +536 -0
- package/dist/commonjs/WindowScroller/WindowScroller.js +268 -0
- package/dist/commonjs/WindowScroller/WindowScroller.ssr.js +25 -0
- package/dist/commonjs/WindowScroller/index.js +23 -0
- package/dist/commonjs/WindowScroller/utils/dimensions.js +89 -0
- package/dist/commonjs/WindowScroller/utils/onScroll.js +70 -0
- package/dist/commonjs/index.js +180 -0
- package/dist/commonjs/jest-setup.js +7 -0
- package/dist/commonjs/utils/TestHelper.js +36 -0
- package/dist/commonjs/utils/animationFrame.js +29 -0
- package/dist/commonjs/utils/createCallbackMemoizer.jest.js +219 -0
- package/dist/commonjs/utils/createCallbackMemoizer.js +31 -0
- package/dist/commonjs/utils/getUpdatedOffsetForIndex.jest.js +68 -0
- package/dist/commonjs/utils/getUpdatedOffsetForIndex.js +38 -0
- package/dist/commonjs/utils/initCellMetadata.js +37 -0
- package/dist/commonjs/utils/requestAnimationTimeout.js +38 -0
- package/dist/commonjs/vendor/binarySearchBounds.js +200 -0
- package/dist/commonjs/vendor/detectElementResize.js +192 -0
- package/dist/commonjs/vendor/intervalTree.js +361 -0
- package/dist/es/ArrowKeyStepper/ArrowKeyStepper.example.js +176 -0
- package/dist/es/ArrowKeyStepper/ArrowKeyStepper.jest.js +332 -0
- package/dist/es/ArrowKeyStepper/ArrowKeyStepper.js +197 -0
- package/dist/es/ArrowKeyStepper/index.js +3 -0
- package/dist/es/ArrowKeyStepper/types.js +4 -0
- package/dist/es/AutoSizer/AutoSizer.example.js +96 -0
- package/dist/es/AutoSizer/AutoSizer.jest.js +335 -0
- package/dist/es/AutoSizer/AutoSizer.js +190 -0
- package/dist/es/AutoSizer/AutoSizer.js.flow +200 -0
- package/dist/es/AutoSizer/AutoSizer.ssr.js +19 -0
- package/dist/es/AutoSizer/index.js +2 -0
- package/dist/es/AutoSizer/index.js.flow +4 -0
- package/dist/es/CellMeasurer/CellMeasurer.DynamicHeightGrid.example.js +91 -0
- package/dist/es/CellMeasurer/CellMeasurer.DynamicHeightList.example.js +90 -0
- package/dist/es/CellMeasurer/CellMeasurer.DynamicHeightTableColumn.example.js +98 -0
- package/dist/es/CellMeasurer/CellMeasurer.DynamicWidthGrid.example.js +93 -0
- package/dist/es/CellMeasurer/CellMeasurer.DynamicWidthMultiGrid.example.js +98 -0
- package/dist/es/CellMeasurer/CellMeasurer.example.js +120 -0
- package/dist/es/CellMeasurer/CellMeasurer.jest.js +340 -0
- package/dist/es/CellMeasurer/CellMeasurer.js +187 -0
- package/dist/es/CellMeasurer/CellMeasurerCache.jest.js +293 -0
- package/dist/es/CellMeasurer/CellMeasurerCache.js +196 -0
- package/dist/es/CellMeasurer/index.js +4 -0
- package/dist/es/CellMeasurer/types.js +13 -0
- package/dist/es/Collection/Collection.example.js +223 -0
- package/dist/es/Collection/Collection.jest.js +824 -0
- package/dist/es/Collection/Collection.js +257 -0
- package/dist/es/Collection/CollectionView.js +544 -0
- package/dist/es/Collection/Section.jest.js +60 -0
- package/dist/es/Collection/Section.js +51 -0
- package/dist/es/Collection/SectionManager.jest.js +118 -0
- package/dist/es/Collection/SectionManager.js +128 -0
- package/dist/es/Collection/TestData.js +71 -0
- package/dist/es/Collection/index.js +3 -0
- package/dist/es/Collection/types.js +21 -0
- package/dist/es/Collection/utils/calculateSizeAndPositionData.jest.js +31 -0
- package/dist/es/Collection/utils/calculateSizeAndPositionData.js +31 -0
- package/dist/es/ColumnSizer/ColumnSizer.example.js +150 -0
- package/dist/es/ColumnSizer/ColumnSizer.jest.js +123 -0
- package/dist/es/ColumnSizer/ColumnSizer.js +95 -0
- package/dist/es/ColumnSizer/index.js +3 -0
- package/dist/es/Grid/Grid.example.js +321 -0
- package/dist/es/Grid/Grid.jest.js +2555 -0
- package/dist/es/Grid/Grid.js +1425 -0
- package/dist/es/Grid/Grid.ssr.js +57 -0
- package/dist/es/Grid/accessibilityOverscanIndicesGetter.jest.js +87 -0
- package/dist/es/Grid/accessibilityOverscanIndicesGetter.js +33 -0
- package/dist/es/Grid/defaultCellRangeRenderer.js +134 -0
- package/dist/es/Grid/defaultOverscanIndicesGetter.jest.js +87 -0
- package/dist/es/Grid/defaultOverscanIndicesGetter.js +29 -0
- package/dist/es/Grid/index.js +15 -0
- package/dist/es/Grid/types.js +96 -0
- package/dist/es/Grid/utils/CellSizeAndPositionManager.jest.js +372 -0
- package/dist/es/Grid/utils/CellSizeAndPositionManager.js +290 -0
- package/dist/es/Grid/utils/ScalingCellSizeAndPositionManager.jest.js +198 -0
- package/dist/es/Grid/utils/ScalingCellSizeAndPositionManager.js +198 -0
- package/dist/es/Grid/utils/calculateSizeAndPositionDataAndUpdateScrollOffset.jest.js +81 -0
- package/dist/es/Grid/utils/calculateSizeAndPositionDataAndUpdateScrollOffset.js +53 -0
- package/dist/es/Grid/utils/maxElementSize.js +16 -0
- package/dist/es/Grid/utils/updateScrollIndexHelper.jest.js +174 -0
- package/dist/es/Grid/utils/updateScrollIndexHelper.js +79 -0
- package/dist/es/InfiniteLoader/InfiniteLoader.example.js +170 -0
- package/dist/es/InfiniteLoader/InfiniteLoader.jest.js +565 -0
- package/dist/es/InfiniteLoader/InfiniteLoader.js +263 -0
- package/dist/es/InfiniteLoader/index.js +3 -0
- package/dist/es/List/List.example.js +227 -0
- package/dist/es/List/List.jest.js +511 -0
- package/dist/es/List/List.js +312 -0
- package/dist/es/List/index.js +3 -0
- package/dist/es/List/types.js +21 -0
- package/dist/es/Masonry/Masonry.example.js +278 -0
- package/dist/es/Masonry/Masonry.jest.js +444 -0
- package/dist/es/Masonry/Masonry.js +421 -0
- package/dist/es/Masonry/PositionCache.js +82 -0
- package/dist/es/Masonry/createCellPositioner.js +53 -0
- package/dist/es/Masonry/index.js +4 -0
- package/dist/es/MultiGrid/CellMeasurerCacheDecorator.js +100 -0
- package/dist/es/MultiGrid/MultiGrid.example.js +122 -0
- package/dist/es/MultiGrid/MultiGrid.jest.js +579 -0
- package/dist/es/MultiGrid/MultiGrid.js +733 -0
- package/dist/es/MultiGrid/index.js +3 -0
- package/dist/es/ScrollSync/ScrollSync.example.js +248 -0
- package/dist/es/ScrollSync/ScrollSync.jest.js +60 -0
- package/dist/es/ScrollSync/ScrollSync.js +80 -0
- package/dist/es/ScrollSync/index.js +3 -0
- package/dist/es/Table/Column.jest.js +84 -0
- package/dist/es/Table/Column.js +85 -0
- package/dist/es/Table/SortDirection.js +13 -0
- package/dist/es/Table/SortIndicator.js +31 -0
- package/dist/es/Table/Table.example.js +316 -0
- package/dist/es/Table/Table.jest.js +1251 -0
- package/dist/es/Table/Table.js +735 -0
- package/dist/es/Table/createMultiSort.jest.js +162 -0
- package/dist/es/Table/createMultiSort.js +93 -0
- package/dist/es/Table/defaultCellDataGetter.js +15 -0
- package/dist/es/Table/defaultCellRenderer.js +13 -0
- package/dist/es/Table/defaultHeaderRenderer.js +25 -0
- package/dist/es/Table/defaultHeaderRowRenderer.js +12 -0
- package/dist/es/Table/defaultRowRenderer.js +77 -0
- package/dist/es/Table/index.js +12 -0
- package/dist/es/Table/types.js +38 -0
- package/dist/es/WindowScroller/WindowScroller.e2e.js +295 -0
- package/dist/es/WindowScroller/WindowScroller.example.js +158 -0
- package/dist/es/WindowScroller/WindowScroller.header-resize.e2e.js +356 -0
- package/dist/es/WindowScroller/WindowScroller.jest.js +530 -0
- package/dist/es/WindowScroller/WindowScroller.js +259 -0
- package/dist/es/WindowScroller/WindowScroller.js.flow +277 -0
- package/dist/es/WindowScroller/WindowScroller.ssr.js +19 -0
- package/dist/es/WindowScroller/index.js +3 -0
- package/dist/es/WindowScroller/index.js.flow +6 -0
- package/dist/es/WindowScroller/utils/dimensions.js +81 -0
- package/dist/es/WindowScroller/utils/dimensions.js.flow +91 -0
- package/dist/es/WindowScroller/utils/onScroll.js +64 -0
- package/dist/es/WindowScroller/utils/onScroll.js.flow +94 -0
- package/dist/es/index.js +13 -0
- package/dist/es/jest-setup.js +5 -0
- package/dist/es/utils/TestHelper.js +30 -0
- package/dist/es/utils/animationFrame.js +23 -0
- package/dist/es/utils/createCallbackMemoizer.jest.js +216 -0
- package/dist/es/utils/createCallbackMemoizer.js +25 -0
- package/dist/es/utils/getUpdatedOffsetForIndex.jest.js +65 -0
- package/dist/es/utils/getUpdatedOffsetForIndex.js +32 -0
- package/dist/es/utils/initCellMetadata.js +31 -0
- package/dist/es/utils/requestAnimationTimeout.js +32 -0
- package/dist/es/vendor/binarySearchBounds.js +194 -0
- package/dist/es/vendor/detectElementResize.js +186 -0
- package/dist/es/vendor/intervalTree.js +354 -0
- package/dist/umd/react-virtualized.js +4638 -0
- package/package.json +188 -0
- package/styles.css +80 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
|
|
2
|
+
import _createClass from "@babel/runtime/helpers/createClass";
|
|
3
|
+
import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
|
|
4
|
+
import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
|
|
5
|
+
import _inherits from "@babel/runtime/helpers/inherits";
|
|
6
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
7
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
8
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
9
|
+
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
|
10
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
11
|
+
import * as React from 'react';
|
|
12
|
+
import { registerScrollListener, unregisterScrollListener } from './utils/onScroll';
|
|
13
|
+
import { getDimensions, getPositionOffset, getScrollOffset } from './utils/dimensions';
|
|
14
|
+
import createDetectElementResize from '../vendor/detectElementResize';
|
|
15
|
+
/*:: type Props = {
|
|
16
|
+
/**
|
|
17
|
+
* Function responsible for rendering children.
|
|
18
|
+
* This function should implement the following signature:
|
|
19
|
+
* ({ height, isScrolling, scrollLeft, scrollTop, width }) => PropTypes.element
|
|
20
|
+
*-/
|
|
21
|
+
children: ({
|
|
22
|
+
onChildScroll: ({scrollTop: number}) => void,
|
|
23
|
+
registerChild: (?Element) => void,
|
|
24
|
+
height: number,
|
|
25
|
+
isScrolling: boolean,
|
|
26
|
+
scrollLeft: number,
|
|
27
|
+
scrollTop: number,
|
|
28
|
+
width: number,
|
|
29
|
+
}) => React.Node,
|
|
30
|
+
|
|
31
|
+
/** Callback to be invoked on-resize: ({ height, width }) *-/
|
|
32
|
+
onResize: ({height: number, width: number}) => void,
|
|
33
|
+
|
|
34
|
+
/** Callback to be invoked on-scroll: ({ scrollLeft, scrollTop }) *-/
|
|
35
|
+
onScroll: ({scrollLeft: number, scrollTop: number}) => void,
|
|
36
|
+
|
|
37
|
+
/** Element to attach scroll event listeners. Defaults to window. *-/
|
|
38
|
+
scrollElement: ?(typeof window | Element),
|
|
39
|
+
/**
|
|
40
|
+
* Wait this amount of time after the last scroll event before resetting child `pointer-events`.
|
|
41
|
+
*-/
|
|
42
|
+
scrollingResetTimeInterval: number,
|
|
43
|
+
|
|
44
|
+
/** Height used for server-side rendering *-/
|
|
45
|
+
serverHeight: number,
|
|
46
|
+
|
|
47
|
+
/** Width used for server-side rendering *-/
|
|
48
|
+
serverWidth: number,
|
|
49
|
+
|
|
50
|
+
/** Force scrollTop updates when .updatePosition is called, fixing forced header height change updates *-/
|
|
51
|
+
updateScrollTopOnUpdatePosition?: boolean,
|
|
52
|
+
};*/
|
|
53
|
+
/*:: type State = {
|
|
54
|
+
height: number,
|
|
55
|
+
width: number,
|
|
56
|
+
isScrolling: boolean,
|
|
57
|
+
scrollLeft: number,
|
|
58
|
+
scrollTop: number,
|
|
59
|
+
};*/
|
|
60
|
+
/*:: type ResizeHandler = (element: Element, onResize: () => void) => void;*/
|
|
61
|
+
/*:: type DetectElementResize = {
|
|
62
|
+
addResizeListener: ResizeHandler,
|
|
63
|
+
removeResizeListener: ResizeHandler,
|
|
64
|
+
};*/
|
|
65
|
+
/**
|
|
66
|
+
* Specifies the number of milliseconds during which to disable pointer events while a scroll is in progress.
|
|
67
|
+
* This improves performance and makes scrolling smoother.
|
|
68
|
+
*/
|
|
69
|
+
export var IS_SCROLLING_TIMEOUT = 150;
|
|
70
|
+
var getWindow = function getWindow() {
|
|
71
|
+
return typeof window !== 'undefined' ? window : undefined;
|
|
72
|
+
};
|
|
73
|
+
var WindowScroller = /*#__PURE__*/function (_React$PureComponent) {
|
|
74
|
+
function WindowScroller() {
|
|
75
|
+
var _this;
|
|
76
|
+
_classCallCheck(this, WindowScroller);
|
|
77
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
78
|
+
args[_key] = arguments[_key];
|
|
79
|
+
}
|
|
80
|
+
_this = _callSuper(this, WindowScroller, [].concat(args));
|
|
81
|
+
_defineProperty(_this, "_window", getWindow());
|
|
82
|
+
_defineProperty(_this, "_isMounted", false);
|
|
83
|
+
_defineProperty(_this, "_positionFromTop", 0);
|
|
84
|
+
_defineProperty(_this, "_positionFromLeft", 0);
|
|
85
|
+
_defineProperty(_this, "_detectElementResize", void 0);
|
|
86
|
+
_defineProperty(_this, "_child", void 0);
|
|
87
|
+
_defineProperty(_this, "_windowScrollerRef", /*#__PURE__*/React.createRef());
|
|
88
|
+
_defineProperty(_this, "state", _objectSpread(_objectSpread({}, getDimensions(_this.props.scrollElement, _this.props)), {}, {
|
|
89
|
+
isScrolling: false,
|
|
90
|
+
scrollLeft: 0,
|
|
91
|
+
scrollTop: 0
|
|
92
|
+
}));
|
|
93
|
+
_defineProperty(_this, "_registerChild", function (element) {
|
|
94
|
+
if (element && !(element instanceof Element)) {
|
|
95
|
+
console.warn('WindowScroller registerChild expects to be passed Element or null');
|
|
96
|
+
}
|
|
97
|
+
_this._child = element;
|
|
98
|
+
_this.updatePosition();
|
|
99
|
+
});
|
|
100
|
+
_defineProperty(_this, "_onChildScroll", function (_ref) {
|
|
101
|
+
var scrollTop = _ref.scrollTop;
|
|
102
|
+
if (_this.state.scrollTop === scrollTop) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
var scrollElement = _this.props.scrollElement;
|
|
106
|
+
if (scrollElement) {
|
|
107
|
+
if (typeof scrollElement.scrollTo === 'function') {
|
|
108
|
+
scrollElement.scrollTo(0, scrollTop + _this._positionFromTop);
|
|
109
|
+
} else {
|
|
110
|
+
scrollElement.scrollTop = scrollTop + _this._positionFromTop;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
_defineProperty(_this, "_registerResizeListener", function (element) {
|
|
115
|
+
if (element === window) {
|
|
116
|
+
window.addEventListener('resize', _this._onResize, false);
|
|
117
|
+
} else {
|
|
118
|
+
_this._detectElementResize.addResizeListener(element, _this._onResize);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
_defineProperty(_this, "_unregisterResizeListener", function (element) {
|
|
122
|
+
if (element === window) {
|
|
123
|
+
window.removeEventListener('resize', _this._onResize, false);
|
|
124
|
+
} else if (element) {
|
|
125
|
+
_this._detectElementResize.removeResizeListener(element, _this._onResize);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
_defineProperty(_this, "_onResize", function () {
|
|
129
|
+
_this.updatePosition();
|
|
130
|
+
});
|
|
131
|
+
// Referenced by utils/onScroll
|
|
132
|
+
_defineProperty(_this, "__handleWindowScrollEvent", function () {
|
|
133
|
+
if (!_this._isMounted) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
var onScroll = _this.props.onScroll;
|
|
137
|
+
var scrollElement = _this.props.scrollElement;
|
|
138
|
+
if (scrollElement) {
|
|
139
|
+
var scrollOffset = getScrollOffset(scrollElement);
|
|
140
|
+
var scrollLeft = Math.max(0, scrollOffset.left - _this._positionFromLeft);
|
|
141
|
+
var scrollTop = Math.max(0, scrollOffset.top - _this._positionFromTop);
|
|
142
|
+
_this.setState({
|
|
143
|
+
isScrolling: true,
|
|
144
|
+
scrollLeft: scrollLeft,
|
|
145
|
+
scrollTop: scrollTop
|
|
146
|
+
});
|
|
147
|
+
onScroll({
|
|
148
|
+
scrollLeft: scrollLeft,
|
|
149
|
+
scrollTop: scrollTop
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
// Referenced by utils/onScroll
|
|
154
|
+
_defineProperty(_this, "__resetIsScrolling", function () {
|
|
155
|
+
_this.setState({
|
|
156
|
+
isScrolling: false
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
return _this;
|
|
160
|
+
}
|
|
161
|
+
_inherits(WindowScroller, _React$PureComponent);
|
|
162
|
+
return _createClass(WindowScroller, [{
|
|
163
|
+
key: "updatePosition",
|
|
164
|
+
value: function updatePosition() {
|
|
165
|
+
var scrollElement /*: ?Element*/ = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props.scrollElement;
|
|
166
|
+
var onResize = this.props.onResize;
|
|
167
|
+
var _this$state = this.state,
|
|
168
|
+
height = _this$state.height,
|
|
169
|
+
width = _this$state.width;
|
|
170
|
+
var thisNode = this._child || this._windowScrollerRef.current;
|
|
171
|
+
if (thisNode instanceof Element && scrollElement) {
|
|
172
|
+
var offset = getPositionOffset(thisNode, scrollElement);
|
|
173
|
+
this._positionFromTop = offset.top;
|
|
174
|
+
this._positionFromLeft = offset.left;
|
|
175
|
+
}
|
|
176
|
+
var dimensions = getDimensions(scrollElement, this.props);
|
|
177
|
+
if (height !== dimensions.height || width !== dimensions.width) {
|
|
178
|
+
this.setState({
|
|
179
|
+
height: dimensions.height,
|
|
180
|
+
width: dimensions.width
|
|
181
|
+
});
|
|
182
|
+
onResize({
|
|
183
|
+
height: dimensions.height,
|
|
184
|
+
width: dimensions.width
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
if (this.props.updateScrollTopOnUpdatePosition === true) {
|
|
188
|
+
this.__handleWindowScrollEvent();
|
|
189
|
+
this.__resetIsScrolling();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}, {
|
|
193
|
+
key: "componentDidMount",
|
|
194
|
+
value: function componentDidMount() {
|
|
195
|
+
var scrollElement = this.props.scrollElement;
|
|
196
|
+
this._detectElementResize = createDetectElementResize();
|
|
197
|
+
this.updatePosition(scrollElement);
|
|
198
|
+
if (scrollElement) {
|
|
199
|
+
registerScrollListener(this, scrollElement);
|
|
200
|
+
this._registerResizeListener(scrollElement);
|
|
201
|
+
}
|
|
202
|
+
this._isMounted = true;
|
|
203
|
+
}
|
|
204
|
+
}, {
|
|
205
|
+
key: "componentDidUpdate",
|
|
206
|
+
value: function componentDidUpdate(prevProps /*: Props*/, prevState /*: State*/) {
|
|
207
|
+
var scrollElement = this.props.scrollElement;
|
|
208
|
+
var prevScrollElement = prevProps.scrollElement;
|
|
209
|
+
if (prevScrollElement !== scrollElement && prevScrollElement != null && scrollElement != null) {
|
|
210
|
+
this.updatePosition(scrollElement);
|
|
211
|
+
unregisterScrollListener(this, prevScrollElement);
|
|
212
|
+
registerScrollListener(this, scrollElement);
|
|
213
|
+
this._unregisterResizeListener(prevScrollElement);
|
|
214
|
+
this._registerResizeListener(scrollElement);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}, {
|
|
218
|
+
key: "componentWillUnmount",
|
|
219
|
+
value: function componentWillUnmount() {
|
|
220
|
+
var scrollElement = this.props.scrollElement;
|
|
221
|
+
if (scrollElement) {
|
|
222
|
+
unregisterScrollListener(this, scrollElement);
|
|
223
|
+
this._unregisterResizeListener(scrollElement);
|
|
224
|
+
}
|
|
225
|
+
this._isMounted = false;
|
|
226
|
+
}
|
|
227
|
+
}, {
|
|
228
|
+
key: "render",
|
|
229
|
+
value: function render() {
|
|
230
|
+
var children = this.props.children;
|
|
231
|
+
var _this$state2 = this.state,
|
|
232
|
+
isScrolling = _this$state2.isScrolling,
|
|
233
|
+
scrollTop = _this$state2.scrollTop,
|
|
234
|
+
scrollLeft = _this$state2.scrollLeft,
|
|
235
|
+
height = _this$state2.height,
|
|
236
|
+
width = _this$state2.width;
|
|
237
|
+
return /*#__PURE__*/React.createElement('div', {
|
|
238
|
+
ref: this._windowScrollerRef
|
|
239
|
+
}, children({
|
|
240
|
+
onChildScroll: this._onChildScroll,
|
|
241
|
+
registerChild: this._registerChild,
|
|
242
|
+
height: height,
|
|
243
|
+
isScrolling: isScrolling,
|
|
244
|
+
scrollLeft: scrollLeft,
|
|
245
|
+
scrollTop: scrollTop,
|
|
246
|
+
width: width
|
|
247
|
+
}));
|
|
248
|
+
}
|
|
249
|
+
}]);
|
|
250
|
+
}(React.PureComponent);
|
|
251
|
+
_defineProperty(WindowScroller, "defaultProps", {
|
|
252
|
+
onResize: function onResize() {},
|
|
253
|
+
onScroll: function onScroll() {},
|
|
254
|
+
scrollingResetTimeInterval: IS_SCROLLING_TIMEOUT,
|
|
255
|
+
scrollElement: getWindow(),
|
|
256
|
+
serverHeight: 0,
|
|
257
|
+
serverWidth: 0
|
|
258
|
+
});
|
|
259
|
+
export { WindowScroller as default };
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
// @flow
|
|
2
|
+
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import {
|
|
5
|
+
registerScrollListener,
|
|
6
|
+
unregisterScrollListener,
|
|
7
|
+
} from './utils/onScroll';
|
|
8
|
+
import {
|
|
9
|
+
getDimensions,
|
|
10
|
+
getPositionOffset,
|
|
11
|
+
getScrollOffset,
|
|
12
|
+
} from './utils/dimensions';
|
|
13
|
+
import createDetectElementResize from '../vendor/detectElementResize';
|
|
14
|
+
|
|
15
|
+
type Props = {
|
|
16
|
+
/**
|
|
17
|
+
* Function responsible for rendering children.
|
|
18
|
+
* This function should implement the following signature:
|
|
19
|
+
* ({ height, isScrolling, scrollLeft, scrollTop, width }) => PropTypes.element
|
|
20
|
+
*/
|
|
21
|
+
children: ({
|
|
22
|
+
onChildScroll: ({scrollTop: number}) => void,
|
|
23
|
+
registerChild: (?Element) => void,
|
|
24
|
+
height: number,
|
|
25
|
+
isScrolling: boolean,
|
|
26
|
+
scrollLeft: number,
|
|
27
|
+
scrollTop: number,
|
|
28
|
+
width: number,
|
|
29
|
+
}) => React.Node,
|
|
30
|
+
|
|
31
|
+
/** Callback to be invoked on-resize: ({ height, width }) */
|
|
32
|
+
onResize: ({height: number, width: number}) => void,
|
|
33
|
+
|
|
34
|
+
/** Callback to be invoked on-scroll: ({ scrollLeft, scrollTop }) */
|
|
35
|
+
onScroll: ({scrollLeft: number, scrollTop: number}) => void,
|
|
36
|
+
|
|
37
|
+
/** Element to attach scroll event listeners. Defaults to window. */
|
|
38
|
+
scrollElement: ?(typeof window | Element),
|
|
39
|
+
/**
|
|
40
|
+
* Wait this amount of time after the last scroll event before resetting child `pointer-events`.
|
|
41
|
+
*/
|
|
42
|
+
scrollingResetTimeInterval: number,
|
|
43
|
+
|
|
44
|
+
/** Height used for server-side rendering */
|
|
45
|
+
serverHeight: number,
|
|
46
|
+
|
|
47
|
+
/** Width used for server-side rendering */
|
|
48
|
+
serverWidth: number,
|
|
49
|
+
|
|
50
|
+
/** Force scrollTop updates when .updatePosition is called, fixing forced header height change updates */
|
|
51
|
+
updateScrollTopOnUpdatePosition?: boolean,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
type State = {
|
|
55
|
+
height: number,
|
|
56
|
+
width: number,
|
|
57
|
+
isScrolling: boolean,
|
|
58
|
+
scrollLeft: number,
|
|
59
|
+
scrollTop: number,
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
type ResizeHandler = (element: Element, onResize: () => void) => void;
|
|
63
|
+
|
|
64
|
+
type DetectElementResize = {
|
|
65
|
+
addResizeListener: ResizeHandler,
|
|
66
|
+
removeResizeListener: ResizeHandler,
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Specifies the number of milliseconds during which to disable pointer events while a scroll is in progress.
|
|
71
|
+
* This improves performance and makes scrolling smoother.
|
|
72
|
+
*/
|
|
73
|
+
export const IS_SCROLLING_TIMEOUT = 150;
|
|
74
|
+
|
|
75
|
+
const getWindow = () => (typeof window !== 'undefined' ? window : undefined);
|
|
76
|
+
|
|
77
|
+
export default class WindowScroller extends React.PureComponent<Props, State> {
|
|
78
|
+
static defaultProps = {
|
|
79
|
+
onResize: () => {},
|
|
80
|
+
onScroll: () => {},
|
|
81
|
+
scrollingResetTimeInterval: IS_SCROLLING_TIMEOUT,
|
|
82
|
+
scrollElement: getWindow(),
|
|
83
|
+
serverHeight: 0,
|
|
84
|
+
serverWidth: 0,
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
_window = getWindow();
|
|
88
|
+
_isMounted = false;
|
|
89
|
+
_positionFromTop = 0;
|
|
90
|
+
_positionFromLeft = 0;
|
|
91
|
+
_detectElementResize: DetectElementResize;
|
|
92
|
+
_child: ?Element;
|
|
93
|
+
_windowScrollerRef: {current: HTMLElement | null} = React.createRef();
|
|
94
|
+
|
|
95
|
+
state = {
|
|
96
|
+
...getDimensions(this.props.scrollElement, this.props),
|
|
97
|
+
isScrolling: false,
|
|
98
|
+
scrollLeft: 0,
|
|
99
|
+
scrollTop: 0,
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
updatePosition(scrollElement: ?Element = this.props.scrollElement) {
|
|
103
|
+
const {onResize} = this.props;
|
|
104
|
+
const {height, width} = this.state;
|
|
105
|
+
|
|
106
|
+
const thisNode = this._child || this._windowScrollerRef.current;
|
|
107
|
+
if (thisNode instanceof Element && scrollElement) {
|
|
108
|
+
const offset = getPositionOffset(thisNode, scrollElement);
|
|
109
|
+
this._positionFromTop = offset.top;
|
|
110
|
+
this._positionFromLeft = offset.left;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const dimensions = getDimensions(scrollElement, this.props);
|
|
114
|
+
if (height !== dimensions.height || width !== dimensions.width) {
|
|
115
|
+
this.setState({
|
|
116
|
+
height: dimensions.height,
|
|
117
|
+
width: dimensions.width,
|
|
118
|
+
});
|
|
119
|
+
onResize({
|
|
120
|
+
height: dimensions.height,
|
|
121
|
+
width: dimensions.width,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (this.props.updateScrollTopOnUpdatePosition === true) {
|
|
126
|
+
this.__handleWindowScrollEvent();
|
|
127
|
+
this.__resetIsScrolling();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
componentDidMount() {
|
|
132
|
+
const scrollElement = this.props.scrollElement;
|
|
133
|
+
|
|
134
|
+
this._detectElementResize = createDetectElementResize();
|
|
135
|
+
|
|
136
|
+
this.updatePosition(scrollElement);
|
|
137
|
+
|
|
138
|
+
if (scrollElement) {
|
|
139
|
+
registerScrollListener(this, scrollElement);
|
|
140
|
+
this._registerResizeListener(scrollElement);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
this._isMounted = true;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
componentDidUpdate(prevProps: Props, prevState: State) {
|
|
147
|
+
const {scrollElement} = this.props;
|
|
148
|
+
const {scrollElement: prevScrollElement} = prevProps;
|
|
149
|
+
|
|
150
|
+
if (
|
|
151
|
+
prevScrollElement !== scrollElement &&
|
|
152
|
+
prevScrollElement != null &&
|
|
153
|
+
scrollElement != null
|
|
154
|
+
) {
|
|
155
|
+
this.updatePosition(scrollElement);
|
|
156
|
+
|
|
157
|
+
unregisterScrollListener(this, prevScrollElement);
|
|
158
|
+
registerScrollListener(this, scrollElement);
|
|
159
|
+
|
|
160
|
+
this._unregisterResizeListener(prevScrollElement);
|
|
161
|
+
this._registerResizeListener(scrollElement);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
componentWillUnmount() {
|
|
166
|
+
const scrollElement = this.props.scrollElement;
|
|
167
|
+
if (scrollElement) {
|
|
168
|
+
unregisterScrollListener(this, scrollElement);
|
|
169
|
+
this._unregisterResizeListener(scrollElement);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
this._isMounted = false;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
render() {
|
|
176
|
+
const {children} = this.props;
|
|
177
|
+
const {isScrolling, scrollTop, scrollLeft, height, width} = this.state;
|
|
178
|
+
|
|
179
|
+
return React.createElement(
|
|
180
|
+
'div',
|
|
181
|
+
{
|
|
182
|
+
ref: this._windowScrollerRef,
|
|
183
|
+
},
|
|
184
|
+
children({
|
|
185
|
+
onChildScroll: this._onChildScroll,
|
|
186
|
+
registerChild: this._registerChild,
|
|
187
|
+
height,
|
|
188
|
+
isScrolling,
|
|
189
|
+
scrollLeft,
|
|
190
|
+
scrollTop,
|
|
191
|
+
width,
|
|
192
|
+
}),
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
_registerChild = element => {
|
|
197
|
+
if (element && !(element instanceof Element)) {
|
|
198
|
+
console.warn(
|
|
199
|
+
'WindowScroller registerChild expects to be passed Element or null',
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
this._child = element;
|
|
203
|
+
this.updatePosition();
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
_onChildScroll = ({scrollTop}) => {
|
|
207
|
+
if (this.state.scrollTop === scrollTop) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const scrollElement = this.props.scrollElement;
|
|
212
|
+
if (scrollElement) {
|
|
213
|
+
if (typeof scrollElement.scrollTo === 'function') {
|
|
214
|
+
scrollElement.scrollTo(0, scrollTop + this._positionFromTop);
|
|
215
|
+
} else {
|
|
216
|
+
scrollElement.scrollTop = scrollTop + this._positionFromTop;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
_registerResizeListener = element => {
|
|
222
|
+
if (element === window) {
|
|
223
|
+
window.addEventListener('resize', this._onResize, false);
|
|
224
|
+
} else {
|
|
225
|
+
this._detectElementResize.addResizeListener(element, this._onResize);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
_unregisterResizeListener = element => {
|
|
230
|
+
if (element === window) {
|
|
231
|
+
window.removeEventListener('resize', this._onResize, false);
|
|
232
|
+
} else if (element) {
|
|
233
|
+
this._detectElementResize.removeResizeListener(element, this._onResize);
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
_onResize = () => {
|
|
238
|
+
this.updatePosition();
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
// Referenced by utils/onScroll
|
|
242
|
+
__handleWindowScrollEvent = () => {
|
|
243
|
+
if (!this._isMounted) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const {onScroll} = this.props;
|
|
248
|
+
|
|
249
|
+
const scrollElement = this.props.scrollElement;
|
|
250
|
+
if (scrollElement) {
|
|
251
|
+
const scrollOffset = getScrollOffset(scrollElement);
|
|
252
|
+
const scrollLeft = Math.max(
|
|
253
|
+
0,
|
|
254
|
+
scrollOffset.left - this._positionFromLeft,
|
|
255
|
+
);
|
|
256
|
+
const scrollTop = Math.max(0, scrollOffset.top - this._positionFromTop);
|
|
257
|
+
|
|
258
|
+
this.setState({
|
|
259
|
+
isScrolling: true,
|
|
260
|
+
scrollLeft,
|
|
261
|
+
scrollTop,
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
onScroll({
|
|
265
|
+
scrollLeft,
|
|
266
|
+
scrollTop,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
// Referenced by utils/onScroll
|
|
272
|
+
__resetIsScrolling = () => {
|
|
273
|
+
this.setState({
|
|
274
|
+
isScrolling: false,
|
|
275
|
+
});
|
|
276
|
+
};
|
|
277
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @jest-environment node
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import * as React from 'react';
|
|
6
|
+
import * as ReactDOMServer from 'react-dom/server';
|
|
7
|
+
import WindowScroller from './WindowScroller';
|
|
8
|
+
test('should render content with default widths and heights initially', function () {
|
|
9
|
+
var rendered = ReactDOMServer.renderToString(/*#__PURE__*/React.createElement(WindowScroller, {
|
|
10
|
+
serverHeight: 100,
|
|
11
|
+
serverWidth: 200
|
|
12
|
+
}, function (_ref) {
|
|
13
|
+
var height = _ref.height,
|
|
14
|
+
width = _ref.width;
|
|
15
|
+
return /*#__PURE__*/React.createElement("div", null, "height:".concat(height, ";width:").concat(width));
|
|
16
|
+
}));
|
|
17
|
+
expect(rendered).toContain('height:100');
|
|
18
|
+
expect(rendered).toContain('width:200');
|
|
19
|
+
});
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gets the dimensions of the element, accounting for API differences between
|
|
3
|
+
* `window` and other DOM elements.
|
|
4
|
+
*/
|
|
5
|
+
/*:: type Dimensions = {
|
|
6
|
+
height: number,
|
|
7
|
+
width: number,
|
|
8
|
+
};*/
|
|
9
|
+
// TODO Move this into WindowScroller and import from there
|
|
10
|
+
/*:: type WindowScrollerProps = {
|
|
11
|
+
serverHeight: number,
|
|
12
|
+
serverWidth: number,
|
|
13
|
+
};*/
|
|
14
|
+
var isWindow = function isWindow(element) {
|
|
15
|
+
return element === window;
|
|
16
|
+
};
|
|
17
|
+
var getBoundingBox = function getBoundingBox(element) {
|
|
18
|
+
return element.getBoundingClientRect();
|
|
19
|
+
};
|
|
20
|
+
export function getDimensions(scrollElement /*: ?Element*/, props /*: WindowScrollerProps*/) /*: Dimensions*/{
|
|
21
|
+
if (!scrollElement) {
|
|
22
|
+
return {
|
|
23
|
+
height: props.serverHeight,
|
|
24
|
+
width: props.serverWidth
|
|
25
|
+
};
|
|
26
|
+
} else if (isWindow(scrollElement)) {
|
|
27
|
+
var _window = window,
|
|
28
|
+
innerHeight = _window.innerHeight,
|
|
29
|
+
innerWidth = _window.innerWidth;
|
|
30
|
+
return {
|
|
31
|
+
height: typeof innerHeight === 'number' ? innerHeight : 0,
|
|
32
|
+
width: typeof innerWidth === 'number' ? innerWidth : 0
|
|
33
|
+
};
|
|
34
|
+
} else {
|
|
35
|
+
return getBoundingBox(scrollElement);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Gets the vertical and horizontal position of an element within its scroll container.
|
|
41
|
+
* Elements that have been “scrolled past” return negative values.
|
|
42
|
+
* Handles edge-case where a user is navigating back (history) from an already-scrolled page.
|
|
43
|
+
* In this case the body’s top or left position will be a negative number and this element’s top or left will be increased (by that amount).
|
|
44
|
+
*/
|
|
45
|
+
export function getPositionOffset(element /*: Element*/, container /*: Element*/) {
|
|
46
|
+
if (isWindow(container) && document.documentElement) {
|
|
47
|
+
var containerElement = document.documentElement;
|
|
48
|
+
var elementRect = getBoundingBox(element);
|
|
49
|
+
var containerRect = getBoundingBox(containerElement);
|
|
50
|
+
return {
|
|
51
|
+
top: elementRect.top - containerRect.top,
|
|
52
|
+
left: elementRect.left - containerRect.left
|
|
53
|
+
};
|
|
54
|
+
} else {
|
|
55
|
+
var scrollOffset = getScrollOffset(container);
|
|
56
|
+
var _elementRect = getBoundingBox(element);
|
|
57
|
+
var _containerRect = getBoundingBox(container);
|
|
58
|
+
return {
|
|
59
|
+
top: _elementRect.top + scrollOffset.top - _containerRect.top,
|
|
60
|
+
left: _elementRect.left + scrollOffset.left - _containerRect.left
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Gets the vertical and horizontal scroll amount of the element, accounting for IE compatibility
|
|
67
|
+
* and API differences between `window` and other DOM elements.
|
|
68
|
+
*/
|
|
69
|
+
export function getScrollOffset(element /*: Element*/) {
|
|
70
|
+
if (isWindow(element) && document.documentElement) {
|
|
71
|
+
return {
|
|
72
|
+
top: 'scrollY' in window ? window.scrollY : document.documentElement.scrollTop,
|
|
73
|
+
left: 'scrollX' in window ? window.scrollX : document.documentElement.scrollLeft
|
|
74
|
+
};
|
|
75
|
+
} else {
|
|
76
|
+
return {
|
|
77
|
+
top: element.scrollTop,
|
|
78
|
+
left: element.scrollLeft
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|