@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.
Files changed (254) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +34 -0
  3. package/changes.json +22 -0
  4. package/dist/commonjs/ArrowKeyStepper/ArrowKeyStepper.example.js +184 -0
  5. package/dist/commonjs/ArrowKeyStepper/ArrowKeyStepper.jest.js +338 -0
  6. package/dist/commonjs/ArrowKeyStepper/ArrowKeyStepper.js +204 -0
  7. package/dist/commonjs/ArrowKeyStepper/index.js +19 -0
  8. package/dist/commonjs/ArrowKeyStepper/types.js +5 -0
  9. package/dist/commonjs/AutoSizer/AutoSizer.example.js +104 -0
  10. package/dist/commonjs/AutoSizer/AutoSizer.jest.js +341 -0
  11. package/dist/commonjs/AutoSizer/AutoSizer.js +199 -0
  12. package/dist/commonjs/AutoSizer/AutoSizer.ssr.js +25 -0
  13. package/dist/commonjs/AutoSizer/index.js +19 -0
  14. package/dist/commonjs/CellMeasurer/CellMeasurer.DynamicHeightGrid.example.js +100 -0
  15. package/dist/commonjs/CellMeasurer/CellMeasurer.DynamicHeightList.example.js +99 -0
  16. package/dist/commonjs/CellMeasurer/CellMeasurer.DynamicHeightTableColumn.example.js +107 -0
  17. package/dist/commonjs/CellMeasurer/CellMeasurer.DynamicWidthGrid.example.js +102 -0
  18. package/dist/commonjs/CellMeasurer/CellMeasurer.DynamicWidthMultiGrid.example.js +107 -0
  19. package/dist/commonjs/CellMeasurer/CellMeasurer.example.js +129 -0
  20. package/dist/commonjs/CellMeasurer/CellMeasurer.jest.js +345 -0
  21. package/dist/commonjs/CellMeasurer/CellMeasurer.js +195 -0
  22. package/dist/commonjs/CellMeasurer/CellMeasurerCache.jest.js +298 -0
  23. package/dist/commonjs/CellMeasurer/CellMeasurerCache.js +202 -0
  24. package/dist/commonjs/CellMeasurer/index.js +22 -0
  25. package/dist/commonjs/CellMeasurer/types.js +14 -0
  26. package/dist/commonjs/Collection/Collection.example.js +231 -0
  27. package/dist/commonjs/Collection/Collection.jest.js +829 -0
  28. package/dist/commonjs/Collection/Collection.js +266 -0
  29. package/dist/commonjs/Collection/CollectionView.js +553 -0
  30. package/dist/commonjs/Collection/Section.jest.js +63 -0
  31. package/dist/commonjs/Collection/Section.js +57 -0
  32. package/dist/commonjs/Collection/SectionManager.jest.js +121 -0
  33. package/dist/commonjs/Collection/SectionManager.js +134 -0
  34. package/dist/commonjs/Collection/TestData.js +77 -0
  35. package/dist/commonjs/Collection/index.js +15 -0
  36. package/dist/commonjs/Collection/types.js +22 -0
  37. package/dist/commonjs/Collection/utils/calculateSizeAndPositionData.jest.js +34 -0
  38. package/dist/commonjs/Collection/utils/calculateSizeAndPositionData.js +38 -0
  39. package/dist/commonjs/ColumnSizer/ColumnSizer.example.js +159 -0
  40. package/dist/commonjs/ColumnSizer/ColumnSizer.jest.js +129 -0
  41. package/dist/commonjs/ColumnSizer/ColumnSizer.js +103 -0
  42. package/dist/commonjs/ColumnSizer/index.js +15 -0
  43. package/dist/commonjs/Grid/Grid.example.js +330 -0
  44. package/dist/commonjs/Grid/Grid.jest.js +2561 -0
  45. package/dist/commonjs/Grid/Grid.js +1432 -0
  46. package/dist/commonjs/Grid/Grid.ssr.js +62 -0
  47. package/dist/commonjs/Grid/accessibilityOverscanIndicesGetter.jest.js +92 -0
  48. package/dist/commonjs/Grid/accessibilityOverscanIndicesGetter.js +40 -0
  49. package/dist/commonjs/Grid/defaultCellRangeRenderer.js +139 -0
  50. package/dist/commonjs/Grid/defaultOverscanIndicesGetter.jest.js +92 -0
  51. package/dist/commonjs/Grid/defaultOverscanIndicesGetter.js +36 -0
  52. package/dist/commonjs/Grid/index.js +40 -0
  53. package/dist/commonjs/Grid/types.js +8 -0
  54. package/dist/commonjs/Grid/utils/CellSizeAndPositionManager.jest.js +375 -0
  55. package/dist/commonjs/Grid/utils/CellSizeAndPositionManager.js +296 -0
  56. package/dist/commonjs/Grid/utils/ScalingCellSizeAndPositionManager.jest.js +201 -0
  57. package/dist/commonjs/Grid/utils/ScalingCellSizeAndPositionManager.js +204 -0
  58. package/dist/commonjs/Grid/utils/calculateSizeAndPositionDataAndUpdateScrollOffset.jest.js +84 -0
  59. package/dist/commonjs/Grid/utils/calculateSizeAndPositionDataAndUpdateScrollOffset.js +59 -0
  60. package/dist/commonjs/Grid/utils/maxElementSize.js +22 -0
  61. package/dist/commonjs/Grid/utils/updateScrollIndexHelper.jest.js +180 -0
  62. package/dist/commonjs/Grid/utils/updateScrollIndexHelper.js +85 -0
  63. package/dist/commonjs/InfiniteLoader/InfiniteLoader.example.js +179 -0
  64. package/dist/commonjs/InfiniteLoader/InfiniteLoader.jest.js +571 -0
  65. package/dist/commonjs/InfiniteLoader/InfiniteLoader.js +274 -0
  66. package/dist/commonjs/InfiniteLoader/index.js +15 -0
  67. package/dist/commonjs/List/List.example.js +236 -0
  68. package/dist/commonjs/List/List.jest.js +517 -0
  69. package/dist/commonjs/List/List.js +318 -0
  70. package/dist/commonjs/List/index.js +19 -0
  71. package/dist/commonjs/List/types.js +6 -0
  72. package/dist/commonjs/Masonry/Masonry.example.js +287 -0
  73. package/dist/commonjs/Masonry/Masonry.jest.js +450 -0
  74. package/dist/commonjs/Masonry/Masonry.js +431 -0
  75. package/dist/commonjs/Masonry/PositionCache.js +88 -0
  76. package/dist/commonjs/Masonry/createCellPositioner.js +59 -0
  77. package/dist/commonjs/Masonry/index.js +22 -0
  78. package/dist/commonjs/MultiGrid/CellMeasurerCacheDecorator.js +106 -0
  79. package/dist/commonjs/MultiGrid/MultiGrid.example.js +131 -0
  80. package/dist/commonjs/MultiGrid/MultiGrid.jest.js +584 -0
  81. package/dist/commonjs/MultiGrid/MultiGrid.js +743 -0
  82. package/dist/commonjs/MultiGrid/index.js +15 -0
  83. package/dist/commonjs/ScrollSync/ScrollSync.example.js +257 -0
  84. package/dist/commonjs/ScrollSync/ScrollSync.jest.js +66 -0
  85. package/dist/commonjs/ScrollSync/ScrollSync.js +88 -0
  86. package/dist/commonjs/ScrollSync/index.js +15 -0
  87. package/dist/commonjs/Table/Column.jest.js +90 -0
  88. package/dist/commonjs/Table/Column.js +93 -0
  89. package/dist/commonjs/Table/SortDirection.js +19 -0
  90. package/dist/commonjs/Table/SortIndicator.js +40 -0
  91. package/dist/commonjs/Table/Table.example.js +325 -0
  92. package/dist/commonjs/Table/Table.jest.js +1257 -0
  93. package/dist/commonjs/Table/Table.js +742 -0
  94. package/dist/commonjs/Table/createMultiSort.jest.js +165 -0
  95. package/dist/commonjs/Table/createMultiSort.js +99 -0
  96. package/dist/commonjs/Table/defaultCellDataGetter.js +21 -0
  97. package/dist/commonjs/Table/defaultCellRenderer.js +19 -0
  98. package/dist/commonjs/Table/defaultHeaderRenderer.js +35 -0
  99. package/dist/commonjs/Table/defaultHeaderRowRenderer.js +21 -0
  100. package/dist/commonjs/Table/defaultRowRenderer.js +87 -0
  101. package/dist/commonjs/Table/index.js +78 -0
  102. package/dist/commonjs/Table/types.js +39 -0
  103. package/dist/commonjs/WindowScroller/WindowScroller.e2e.js +298 -0
  104. package/dist/commonjs/WindowScroller/WindowScroller.example.js +167 -0
  105. package/dist/commonjs/WindowScroller/WindowScroller.header-resize.e2e.js +359 -0
  106. package/dist/commonjs/WindowScroller/WindowScroller.jest.js +536 -0
  107. package/dist/commonjs/WindowScroller/WindowScroller.js +268 -0
  108. package/dist/commonjs/WindowScroller/WindowScroller.ssr.js +25 -0
  109. package/dist/commonjs/WindowScroller/index.js +23 -0
  110. package/dist/commonjs/WindowScroller/utils/dimensions.js +89 -0
  111. package/dist/commonjs/WindowScroller/utils/onScroll.js +70 -0
  112. package/dist/commonjs/index.js +180 -0
  113. package/dist/commonjs/jest-setup.js +7 -0
  114. package/dist/commonjs/utils/TestHelper.js +36 -0
  115. package/dist/commonjs/utils/animationFrame.js +29 -0
  116. package/dist/commonjs/utils/createCallbackMemoizer.jest.js +219 -0
  117. package/dist/commonjs/utils/createCallbackMemoizer.js +31 -0
  118. package/dist/commonjs/utils/getUpdatedOffsetForIndex.jest.js +68 -0
  119. package/dist/commonjs/utils/getUpdatedOffsetForIndex.js +38 -0
  120. package/dist/commonjs/utils/initCellMetadata.js +37 -0
  121. package/dist/commonjs/utils/requestAnimationTimeout.js +38 -0
  122. package/dist/commonjs/vendor/binarySearchBounds.js +200 -0
  123. package/dist/commonjs/vendor/detectElementResize.js +192 -0
  124. package/dist/commonjs/vendor/intervalTree.js +361 -0
  125. package/dist/es/ArrowKeyStepper/ArrowKeyStepper.example.js +176 -0
  126. package/dist/es/ArrowKeyStepper/ArrowKeyStepper.jest.js +332 -0
  127. package/dist/es/ArrowKeyStepper/ArrowKeyStepper.js +197 -0
  128. package/dist/es/ArrowKeyStepper/index.js +3 -0
  129. package/dist/es/ArrowKeyStepper/types.js +4 -0
  130. package/dist/es/AutoSizer/AutoSizer.example.js +96 -0
  131. package/dist/es/AutoSizer/AutoSizer.jest.js +335 -0
  132. package/dist/es/AutoSizer/AutoSizer.js +190 -0
  133. package/dist/es/AutoSizer/AutoSizer.js.flow +200 -0
  134. package/dist/es/AutoSizer/AutoSizer.ssr.js +19 -0
  135. package/dist/es/AutoSizer/index.js +2 -0
  136. package/dist/es/AutoSizer/index.js.flow +4 -0
  137. package/dist/es/CellMeasurer/CellMeasurer.DynamicHeightGrid.example.js +91 -0
  138. package/dist/es/CellMeasurer/CellMeasurer.DynamicHeightList.example.js +90 -0
  139. package/dist/es/CellMeasurer/CellMeasurer.DynamicHeightTableColumn.example.js +98 -0
  140. package/dist/es/CellMeasurer/CellMeasurer.DynamicWidthGrid.example.js +93 -0
  141. package/dist/es/CellMeasurer/CellMeasurer.DynamicWidthMultiGrid.example.js +98 -0
  142. package/dist/es/CellMeasurer/CellMeasurer.example.js +120 -0
  143. package/dist/es/CellMeasurer/CellMeasurer.jest.js +340 -0
  144. package/dist/es/CellMeasurer/CellMeasurer.js +187 -0
  145. package/dist/es/CellMeasurer/CellMeasurerCache.jest.js +293 -0
  146. package/dist/es/CellMeasurer/CellMeasurerCache.js +196 -0
  147. package/dist/es/CellMeasurer/index.js +4 -0
  148. package/dist/es/CellMeasurer/types.js +13 -0
  149. package/dist/es/Collection/Collection.example.js +223 -0
  150. package/dist/es/Collection/Collection.jest.js +824 -0
  151. package/dist/es/Collection/Collection.js +257 -0
  152. package/dist/es/Collection/CollectionView.js +544 -0
  153. package/dist/es/Collection/Section.jest.js +60 -0
  154. package/dist/es/Collection/Section.js +51 -0
  155. package/dist/es/Collection/SectionManager.jest.js +118 -0
  156. package/dist/es/Collection/SectionManager.js +128 -0
  157. package/dist/es/Collection/TestData.js +71 -0
  158. package/dist/es/Collection/index.js +3 -0
  159. package/dist/es/Collection/types.js +21 -0
  160. package/dist/es/Collection/utils/calculateSizeAndPositionData.jest.js +31 -0
  161. package/dist/es/Collection/utils/calculateSizeAndPositionData.js +31 -0
  162. package/dist/es/ColumnSizer/ColumnSizer.example.js +150 -0
  163. package/dist/es/ColumnSizer/ColumnSizer.jest.js +123 -0
  164. package/dist/es/ColumnSizer/ColumnSizer.js +95 -0
  165. package/dist/es/ColumnSizer/index.js +3 -0
  166. package/dist/es/Grid/Grid.example.js +321 -0
  167. package/dist/es/Grid/Grid.jest.js +2555 -0
  168. package/dist/es/Grid/Grid.js +1425 -0
  169. package/dist/es/Grid/Grid.ssr.js +57 -0
  170. package/dist/es/Grid/accessibilityOverscanIndicesGetter.jest.js +87 -0
  171. package/dist/es/Grid/accessibilityOverscanIndicesGetter.js +33 -0
  172. package/dist/es/Grid/defaultCellRangeRenderer.js +134 -0
  173. package/dist/es/Grid/defaultOverscanIndicesGetter.jest.js +87 -0
  174. package/dist/es/Grid/defaultOverscanIndicesGetter.js +29 -0
  175. package/dist/es/Grid/index.js +15 -0
  176. package/dist/es/Grid/types.js +96 -0
  177. package/dist/es/Grid/utils/CellSizeAndPositionManager.jest.js +372 -0
  178. package/dist/es/Grid/utils/CellSizeAndPositionManager.js +290 -0
  179. package/dist/es/Grid/utils/ScalingCellSizeAndPositionManager.jest.js +198 -0
  180. package/dist/es/Grid/utils/ScalingCellSizeAndPositionManager.js +198 -0
  181. package/dist/es/Grid/utils/calculateSizeAndPositionDataAndUpdateScrollOffset.jest.js +81 -0
  182. package/dist/es/Grid/utils/calculateSizeAndPositionDataAndUpdateScrollOffset.js +53 -0
  183. package/dist/es/Grid/utils/maxElementSize.js +16 -0
  184. package/dist/es/Grid/utils/updateScrollIndexHelper.jest.js +174 -0
  185. package/dist/es/Grid/utils/updateScrollIndexHelper.js +79 -0
  186. package/dist/es/InfiniteLoader/InfiniteLoader.example.js +170 -0
  187. package/dist/es/InfiniteLoader/InfiniteLoader.jest.js +565 -0
  188. package/dist/es/InfiniteLoader/InfiniteLoader.js +263 -0
  189. package/dist/es/InfiniteLoader/index.js +3 -0
  190. package/dist/es/List/List.example.js +227 -0
  191. package/dist/es/List/List.jest.js +511 -0
  192. package/dist/es/List/List.js +312 -0
  193. package/dist/es/List/index.js +3 -0
  194. package/dist/es/List/types.js +21 -0
  195. package/dist/es/Masonry/Masonry.example.js +278 -0
  196. package/dist/es/Masonry/Masonry.jest.js +444 -0
  197. package/dist/es/Masonry/Masonry.js +421 -0
  198. package/dist/es/Masonry/PositionCache.js +82 -0
  199. package/dist/es/Masonry/createCellPositioner.js +53 -0
  200. package/dist/es/Masonry/index.js +4 -0
  201. package/dist/es/MultiGrid/CellMeasurerCacheDecorator.js +100 -0
  202. package/dist/es/MultiGrid/MultiGrid.example.js +122 -0
  203. package/dist/es/MultiGrid/MultiGrid.jest.js +579 -0
  204. package/dist/es/MultiGrid/MultiGrid.js +733 -0
  205. package/dist/es/MultiGrid/index.js +3 -0
  206. package/dist/es/ScrollSync/ScrollSync.example.js +248 -0
  207. package/dist/es/ScrollSync/ScrollSync.jest.js +60 -0
  208. package/dist/es/ScrollSync/ScrollSync.js +80 -0
  209. package/dist/es/ScrollSync/index.js +3 -0
  210. package/dist/es/Table/Column.jest.js +84 -0
  211. package/dist/es/Table/Column.js +85 -0
  212. package/dist/es/Table/SortDirection.js +13 -0
  213. package/dist/es/Table/SortIndicator.js +31 -0
  214. package/dist/es/Table/Table.example.js +316 -0
  215. package/dist/es/Table/Table.jest.js +1251 -0
  216. package/dist/es/Table/Table.js +735 -0
  217. package/dist/es/Table/createMultiSort.jest.js +162 -0
  218. package/dist/es/Table/createMultiSort.js +93 -0
  219. package/dist/es/Table/defaultCellDataGetter.js +15 -0
  220. package/dist/es/Table/defaultCellRenderer.js +13 -0
  221. package/dist/es/Table/defaultHeaderRenderer.js +25 -0
  222. package/dist/es/Table/defaultHeaderRowRenderer.js +12 -0
  223. package/dist/es/Table/defaultRowRenderer.js +77 -0
  224. package/dist/es/Table/index.js +12 -0
  225. package/dist/es/Table/types.js +38 -0
  226. package/dist/es/WindowScroller/WindowScroller.e2e.js +295 -0
  227. package/dist/es/WindowScroller/WindowScroller.example.js +158 -0
  228. package/dist/es/WindowScroller/WindowScroller.header-resize.e2e.js +356 -0
  229. package/dist/es/WindowScroller/WindowScroller.jest.js +530 -0
  230. package/dist/es/WindowScroller/WindowScroller.js +259 -0
  231. package/dist/es/WindowScroller/WindowScroller.js.flow +277 -0
  232. package/dist/es/WindowScroller/WindowScroller.ssr.js +19 -0
  233. package/dist/es/WindowScroller/index.js +3 -0
  234. package/dist/es/WindowScroller/index.js.flow +6 -0
  235. package/dist/es/WindowScroller/utils/dimensions.js +81 -0
  236. package/dist/es/WindowScroller/utils/dimensions.js.flow +91 -0
  237. package/dist/es/WindowScroller/utils/onScroll.js +64 -0
  238. package/dist/es/WindowScroller/utils/onScroll.js.flow +94 -0
  239. package/dist/es/index.js +13 -0
  240. package/dist/es/jest-setup.js +5 -0
  241. package/dist/es/utils/TestHelper.js +30 -0
  242. package/dist/es/utils/animationFrame.js +23 -0
  243. package/dist/es/utils/createCallbackMemoizer.jest.js +216 -0
  244. package/dist/es/utils/createCallbackMemoizer.js +25 -0
  245. package/dist/es/utils/getUpdatedOffsetForIndex.jest.js +65 -0
  246. package/dist/es/utils/getUpdatedOffsetForIndex.js +32 -0
  247. package/dist/es/utils/initCellMetadata.js +31 -0
  248. package/dist/es/utils/requestAnimationTimeout.js +32 -0
  249. package/dist/es/vendor/binarySearchBounds.js +194 -0
  250. package/dist/es/vendor/detectElementResize.js +186 -0
  251. package/dist/es/vendor/intervalTree.js +354 -0
  252. package/dist/umd/react-virtualized.js +4638 -0
  253. package/package.json +188 -0
  254. 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,3 @@
1
+ import WindowScroller, { IS_SCROLLING_TIMEOUT } from './WindowScroller';
2
+ export default WindowScroller;
3
+ export { WindowScroller, IS_SCROLLING_TIMEOUT };
@@ -0,0 +1,6 @@
1
+ // @flow
2
+
3
+ import WindowScroller, {IS_SCROLLING_TIMEOUT} from './WindowScroller';
4
+
5
+ export default WindowScroller;
6
+ export {WindowScroller, IS_SCROLLING_TIMEOUT};
@@ -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
+ }