virtual-scroller 1.7.9 → 1.9.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/.gitlab-ci.yml +1 -1
- package/CHANGELOG.md +71 -1
- package/README.md +434 -151
- package/bundle/index-bypass.html +1 -1
- package/bundle/index-dom.html +1 -1
- package/bundle/index-grid.html +1 -2
- package/bundle/index-scrollableContainer.html +1 -1
- package/bundle/index-tbody-scrollableContainer.html +2 -0
- package/bundle/index-tbody.html +2 -0
- package/bundle/virtual-scroller-dom.js +1 -1
- package/bundle/virtual-scroller-dom.js.map +1 -1
- package/bundle/virtual-scroller-react.js +1 -1
- package/bundle/virtual-scroller-react.js.map +1 -1
- package/bundle/virtual-scroller.js +1 -1
- package/bundle/virtual-scroller.js.map +1 -1
- package/commonjs/BeforeResize.js +315 -0
- package/commonjs/BeforeResize.js.map +1 -0
- package/commonjs/DOM/Engine.js +46 -0
- package/commonjs/DOM/Engine.js.map +1 -0
- package/commonjs/DOM/ItemsContainer.js +78 -0
- package/commonjs/DOM/ItemsContainer.js.map +1 -0
- package/commonjs/DOM/{WaitForStylesToLoad.js → ListTopOffsetWatcher.js} +71 -44
- package/commonjs/DOM/ListTopOffsetWatcher.js.map +1 -0
- package/commonjs/DOM/ScrollableContainer.js +69 -101
- package/commonjs/DOM/ScrollableContainer.js.map +1 -1
- package/commonjs/DOM/VirtualScroller.js +37 -29
- package/commonjs/DOM/VirtualScroller.js.map +1 -1
- package/commonjs/DOM/tbody.js +17 -11
- package/commonjs/DOM/tbody.js.map +1 -1
- package/commonjs/ItemHeights.js +33 -34
- package/commonjs/ItemHeights.js.map +1 -1
- package/commonjs/Layout.js +591 -216
- package/commonjs/Layout.js.map +1 -1
- package/commonjs/Layout.test.js +196 -0
- package/commonjs/Layout.test.js.map +1 -0
- package/commonjs/ListHeightMeasurement.js +124 -0
- package/commonjs/ListHeightMeasurement.js.map +1 -0
- package/commonjs/Resize.js +50 -39
- package/commonjs/Resize.js.map +1 -1
- package/commonjs/Scroll.js +139 -95
- package/commonjs/Scroll.js.map +1 -1
- package/commonjs/VirtualScroller.columns.js +43 -0
- package/commonjs/VirtualScroller.columns.js.map +1 -0
- package/commonjs/VirtualScroller.constructor.js +408 -0
- package/commonjs/VirtualScroller.constructor.js.map +1 -0
- package/commonjs/VirtualScroller.items.js +305 -0
- package/commonjs/VirtualScroller.items.js.map +1 -0
- package/commonjs/VirtualScroller.js +160 -1021
- package/commonjs/VirtualScroller.js.map +1 -1
- package/commonjs/VirtualScroller.layout.js +562 -0
- package/commonjs/VirtualScroller.layout.js.map +1 -0
- package/commonjs/VirtualScroller.onRender.js +357 -0
- package/commonjs/VirtualScroller.onRender.js.map +1 -0
- package/commonjs/VirtualScroller.resize.js +186 -0
- package/commonjs/VirtualScroller.resize.js.map +1 -0
- package/commonjs/VirtualScroller.state.js +301 -0
- package/commonjs/VirtualScroller.state.js.map +1 -0
- package/commonjs/VirtualScroller.verticalSpacing.js +65 -0
- package/commonjs/VirtualScroller.verticalSpacing.js.map +1 -0
- package/commonjs/getItemCoordinates.js.map +1 -1
- package/commonjs/getItemsDiff.js.map +1 -1
- package/commonjs/getVerticalSpacing.js +8 -8
- package/commonjs/getVerticalSpacing.js.map +1 -1
- package/commonjs/package.json +5 -0
- package/commonjs/react/VirtualScroller.js +182 -628
- package/commonjs/react/VirtualScroller.js.map +1 -1
- package/commonjs/react/useClassName.js +26 -0
- package/commonjs/react/useClassName.js.map +1 -0
- package/commonjs/react/useHandleItemsChange.js +116 -0
- package/commonjs/react/useHandleItemsChange.js.map +1 -0
- package/commonjs/react/useInstanceMethods.js +37 -0
- package/commonjs/react/useInstanceMethods.js.map +1 -0
- package/commonjs/react/useItemKeys.js +60 -0
- package/commonjs/react/useItemKeys.js.map +1 -0
- package/commonjs/react/useOnItemHeightChange.js +32 -0
- package/commonjs/react/useOnItemHeightChange.js.map +1 -0
- package/commonjs/react/useOnItemStateChange.js +32 -0
- package/commonjs/react/useOnItemStateChange.js.map +1 -0
- package/commonjs/react/useState.js +140 -0
- package/commonjs/react/useState.js.map +1 -0
- package/commonjs/react/useStyle.js +29 -0
- package/commonjs/react/useStyle.js.map +1 -0
- package/commonjs/react/useVirtualScroller.js +62 -0
- package/commonjs/react/useVirtualScroller.js.map +1 -0
- package/commonjs/react/useVirtualScrollerStartStop.js +20 -0
- package/commonjs/react/useVirtualScrollerStartStop.js.map +1 -0
- package/commonjs/test/Engine.js +23 -0
- package/commonjs/test/Engine.js.map +1 -0
- package/commonjs/test/ItemsContainer.js +127 -0
- package/commonjs/test/ItemsContainer.js.map +1 -0
- package/commonjs/test/ScrollableContainer.js +130 -0
- package/commonjs/test/ScrollableContainer.js.map +1 -0
- package/commonjs/test/VirtualScroller.js +281 -0
- package/commonjs/test/VirtualScroller.js.map +1 -0
- package/commonjs/utility/debounce.js +28 -6
- package/commonjs/utility/debounce.js.map +1 -1
- package/commonjs/utility/debug.js +51 -12
- package/commonjs/utility/debug.js.map +1 -1
- package/commonjs/utility/getStateSnapshot.js +50 -0
- package/commonjs/utility/getStateSnapshot.js.map +1 -0
- package/commonjs/utility/px.js +1 -1
- package/commonjs/utility/px.js.map +1 -1
- package/commonjs/utility/px.test.js +14 -0
- package/commonjs/utility/px.test.js.map +1 -0
- package/commonjs/utility/shallowEqual.js +1 -1
- package/commonjs/utility/shallowEqual.js.map +1 -1
- package/commonjs/utility/throttle.js.map +1 -1
- package/dom/index.cjs +4 -0
- package/dom/index.cjs.js +9 -0
- package/dom/index.d.ts +25 -0
- package/dom/index.js +1 -1
- package/dom/package.json +10 -4
- package/index.cjs +4 -0
- package/index.cjs.js +9 -0
- package/index.d.ts +99 -0
- package/index.js +1 -1
- package/modules/BeforeResize.js +305 -0
- package/modules/BeforeResize.js.map +1 -0
- package/modules/DOM/Engine.js +27 -0
- package/modules/DOM/Engine.js.map +1 -0
- package/modules/DOM/ItemsContainer.js +71 -0
- package/modules/DOM/ItemsContainer.js.map +1 -0
- package/modules/DOM/{WaitForStylesToLoad.js → ListTopOffsetWatcher.js} +72 -44
- package/modules/DOM/ListTopOffsetWatcher.js.map +1 -0
- package/modules/DOM/ScrollableContainer.js +68 -100
- package/modules/DOM/ScrollableContainer.js.map +1 -1
- package/modules/DOM/VirtualScroller.js +32 -28
- package/modules/DOM/VirtualScroller.js.map +1 -1
- package/modules/DOM/tbody.js +11 -9
- package/modules/DOM/tbody.js.map +1 -1
- package/modules/ItemHeights.js +28 -33
- package/modules/ItemHeights.js.map +1 -1
- package/modules/Layout.js +585 -214
- package/modules/Layout.js.map +1 -1
- package/modules/Layout.test.js +190 -0
- package/modules/Layout.test.js.map +1 -0
- package/modules/ListHeightMeasurement.js +117 -0
- package/modules/ListHeightMeasurement.js.map +1 -0
- package/modules/Resize.js +50 -39
- package/modules/Resize.js.map +1 -1
- package/modules/Scroll.js +139 -94
- package/modules/Scroll.js.map +1 -1
- package/modules/VirtualScroller.columns.js +36 -0
- package/modules/VirtualScroller.columns.js.map +1 -0
- package/modules/VirtualScroller.constructor.js +371 -0
- package/modules/VirtualScroller.constructor.js.map +1 -0
- package/modules/VirtualScroller.items.js +288 -0
- package/modules/VirtualScroller.items.js.map +1 -0
- package/modules/VirtualScroller.js +159 -1014
- package/modules/VirtualScroller.js.map +1 -1
- package/modules/VirtualScroller.layout.js +549 -0
- package/modules/VirtualScroller.layout.js.map +1 -0
- package/modules/VirtualScroller.onRender.js +337 -0
- package/modules/VirtualScroller.onRender.js.map +1 -0
- package/modules/VirtualScroller.resize.js +176 -0
- package/modules/VirtualScroller.resize.js.map +1 -0
- package/modules/VirtualScroller.state.js +283 -0
- package/modules/VirtualScroller.state.js.map +1 -0
- package/modules/VirtualScroller.verticalSpacing.js +54 -0
- package/modules/VirtualScroller.verticalSpacing.js.map +1 -0
- package/modules/getItemCoordinates.js.map +1 -1
- package/modules/getItemsDiff.js.map +1 -1
- package/modules/getVerticalSpacing.js +8 -8
- package/modules/getVerticalSpacing.js.map +1 -1
- package/modules/react/VirtualScroller.js +179 -634
- package/modules/react/VirtualScroller.js.map +1 -1
- package/modules/react/useClassName.js +18 -0
- package/modules/react/useClassName.js.map +1 -0
- package/modules/react/useHandleItemsChange.js +108 -0
- package/modules/react/useHandleItemsChange.js.map +1 -0
- package/modules/react/useInstanceMethods.js +28 -0
- package/modules/react/useInstanceMethods.js.map +1 -0
- package/modules/react/useItemKeys.js +52 -0
- package/modules/react/useItemKeys.js.map +1 -0
- package/modules/react/useOnItemHeightChange.js +24 -0
- package/modules/react/useOnItemHeightChange.js.map +1 -0
- package/modules/react/useOnItemStateChange.js +24 -0
- package/modules/react/useOnItemStateChange.js.map +1 -0
- package/modules/react/useState.js +132 -0
- package/modules/react/useState.js.map +1 -0
- package/modules/react/useStyle.js +19 -0
- package/modules/react/useStyle.js.map +1 -0
- package/modules/react/useVirtualScroller.js +51 -0
- package/modules/react/useVirtualScroller.js.map +1 -0
- package/modules/react/useVirtualScrollerStartStop.js +12 -0
- package/modules/react/useVirtualScrollerStartStop.js.map +1 -0
- package/modules/test/Engine.js +11 -0
- package/modules/test/Engine.js.map +1 -0
- package/modules/test/ItemsContainer.js +120 -0
- package/modules/test/ItemsContainer.js.map +1 -0
- package/modules/test/ScrollableContainer.js +123 -0
- package/modules/test/ScrollableContainer.js.map +1 -0
- package/modules/test/VirtualScroller.js +270 -0
- package/modules/test/VirtualScroller.js.map +1 -0
- package/modules/utility/debounce.js +28 -6
- package/modules/utility/debounce.js.map +1 -1
- package/modules/utility/debug.js +47 -10
- package/modules/utility/debug.js.map +1 -1
- package/modules/utility/getStateSnapshot.js +43 -0
- package/modules/utility/getStateSnapshot.js.map +1 -0
- package/modules/utility/px.js +1 -1
- package/modules/utility/px.js.map +1 -1
- package/modules/utility/px.test.js +9 -0
- package/modules/utility/px.test.js.map +1 -0
- package/modules/utility/shallowEqual.js +1 -1
- package/modules/utility/shallowEqual.js.map +1 -1
- package/modules/utility/throttle.js.map +1 -1
- package/package.json +54 -29
- package/react/index.cjs +4 -0
- package/react/index.cjs.js +9 -0
- package/react/index.d.ts +28 -0
- package/react/index.js +1 -1
- package/react/package.json +10 -4
- package/rollup.config.mjs +62 -0
- package/runnable/create-commonjs-package-json.js +11 -0
- package/source/BeforeResize.js +312 -0
- package/source/DOM/Engine.js +30 -0
- package/source/DOM/ItemsContainer.js +48 -0
- package/source/DOM/{WaitForStylesToLoad.js → ListTopOffsetWatcher.js} +61 -30
- package/source/DOM/ScrollableContainer.js +51 -73
- package/source/DOM/VirtualScroller.js +33 -18
- package/source/DOM/tbody.js +30 -21
- package/source/ItemHeights.js +27 -27
- package/source/Layout.js +629 -252
- package/source/Layout.test.js +176 -0
- package/source/ListHeightMeasurement.js +95 -0
- package/source/Resize.js +56 -32
- package/source/Scroll.js +135 -82
- package/source/VirtualScroller.columns.js +26 -0
- package/source/VirtualScroller.constructor.js +336 -0
- package/source/VirtualScroller.items.js +302 -0
- package/source/VirtualScroller.js +162 -936
- package/source/VirtualScroller.layout.js +539 -0
- package/source/VirtualScroller.onRender.js +345 -0
- package/source/VirtualScroller.resize.js +189 -0
- package/source/VirtualScroller.state.js +284 -0
- package/source/VirtualScroller.verticalSpacing.js +51 -0
- package/source/getVerticalSpacing.js +7 -7
- package/source/react/VirtualScroller.js +243 -603
- package/source/react/useClassName.js +14 -0
- package/source/react/useHandleItemsChange.js +115 -0
- package/source/react/useInstanceMethods.js +25 -0
- package/source/react/useItemKeys.js +59 -0
- package/source/react/useOnItemHeightChange.js +28 -0
- package/source/react/useOnItemStateChange.js +28 -0
- package/source/react/useState.js +114 -0
- package/source/react/useStyle.js +20 -0
- package/source/react/useVirtualScroller.js +59 -0
- package/source/react/useVirtualScrollerStartStop.js +12 -0
- package/source/test/Engine.js +11 -0
- package/source/test/ItemsContainer.js +87 -0
- package/source/test/ScrollableContainer.js +88 -0
- package/source/test/VirtualScroller.js +232 -0
- package/source/utility/debounce.js +22 -5
- package/source/utility/debug.js +34 -3
- package/source/utility/getStateSnapshot.js +36 -0
- package/source/utility/px.js +1 -1
- package/source/utility/px.test.js +9 -0
- package/website/index-bypass.html +195 -0
- package/website/index-grid.html +0 -1
- package/website/index-scrollableContainer.html +208 -0
- package/website/index-tbody-scrollableContainer.html +68 -0
- package/website/index-tbody.html +55 -0
- package/commonjs/DOM/RenderingEngine.js +0 -33
- package/commonjs/DOM/RenderingEngine.js.map +0 -1
- package/commonjs/DOM/Screen.js +0 -87
- package/commonjs/DOM/Screen.js.map +0 -1
- package/commonjs/DOM/WaitForStylesToLoad.js.map +0 -1
- package/commonjs/RestoreScroll.js +0 -118
- package/commonjs/RestoreScroll.js.map +0 -1
- package/dom/index.commonjs.js +0 -4
- package/index.commonjs.js +0 -4
- package/modules/DOM/RenderingEngine.js +0 -19
- package/modules/DOM/RenderingEngine.js.map +0 -1
- package/modules/DOM/Screen.js +0 -80
- package/modules/DOM/Screen.js.map +0 -1
- package/modules/DOM/WaitForStylesToLoad.js.map +0 -1
- package/modules/RestoreScroll.js +0 -111
- package/modules/RestoreScroll.js.map +0 -1
- package/react/index.commonjs.js +0 -4
- package/source/DOM/RenderingEngine.js +0 -22
- package/source/DOM/Screen.js +0 -51
- package/source/RestoreScroll.js +0 -86
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports["default"] = _useState;
|
|
7
|
+
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
|
|
10
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
11
|
+
|
|
12
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
13
|
+
|
|
14
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
15
|
+
|
|
16
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
17
|
+
|
|
18
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
19
|
+
|
|
20
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
21
|
+
|
|
22
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
23
|
+
|
|
24
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
25
|
+
|
|
26
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
27
|
+
|
|
28
|
+
// Creates state management functions.
|
|
29
|
+
function _useState(_ref) {
|
|
30
|
+
var initialState = _ref.initialState,
|
|
31
|
+
onRender = _ref.onRender,
|
|
32
|
+
items = _ref.items;
|
|
33
|
+
|
|
34
|
+
// `VirtualScroller` state.
|
|
35
|
+
//
|
|
36
|
+
// The `_stateUpdate` variable shouldn't be used directly
|
|
37
|
+
// because in some cases its value may not represent
|
|
38
|
+
// the actual `state` of the `VirtualScroller`.
|
|
39
|
+
//
|
|
40
|
+
// * It will contain an incorrect initial value if `initialState` property is passed
|
|
41
|
+
// because it doesn't get initialized to `initialState`.
|
|
42
|
+
//
|
|
43
|
+
// * If `items` property gets changed, `state` reference variable gets updated immediately
|
|
44
|
+
// but the `_stateUpdate` variable here doesn't (until the component re-renders some other time).
|
|
45
|
+
//
|
|
46
|
+
// Instead, use the `state` reference below.
|
|
47
|
+
//
|
|
48
|
+
var _useState2 = (0, _react.useState)(),
|
|
49
|
+
_useState3 = _slicedToArray(_useState2, 2),
|
|
50
|
+
_stateUpdate = _useState3[0],
|
|
51
|
+
_setStateUpdate = _useState3[1]; // This `state` reference is used for accessing the externally stored
|
|
52
|
+
// virtual scroller state from inside a `VirtualScroller` instance.
|
|
53
|
+
//
|
|
54
|
+
// It's also the "source of truth" on the actual `VirtualScroller` state.
|
|
55
|
+
//
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
var state = (0, _react.useRef)(initialState); // Accumulates state updates until they have been applied.
|
|
59
|
+
|
|
60
|
+
var targetState = (0, _react.useRef)(initialState); // Update the current state reference.
|
|
61
|
+
//
|
|
62
|
+
// Ignores the cases when `state` reference has already been updated
|
|
63
|
+
// "immediately" bypassing a `_setStateUpdate()` call, because
|
|
64
|
+
// in that case, `_stateUpdate` holds a stale value.
|
|
65
|
+
//
|
|
66
|
+
|
|
67
|
+
if (state.current !== targetState.current) {
|
|
68
|
+
state.current = _stateUpdate;
|
|
69
|
+
} // Call `onRender()` right after every state update.
|
|
70
|
+
//
|
|
71
|
+
// When `items` property changes, `useHandleItemsChange()` hook doesn't call
|
|
72
|
+
// `_setStateUpdate()` because there's no need for a re-render.
|
|
73
|
+
// But chaning `items` still does trigger a `VirtualScroller` state update,
|
|
74
|
+
// so added `items` property in the list of this "effect"'s dependencies.
|
|
75
|
+
//
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
(0, _react.useLayoutEffect)(function () {
|
|
79
|
+
onRender();
|
|
80
|
+
}, [_stateUpdate, items]);
|
|
81
|
+
return {
|
|
82
|
+
getState: function getState() {
|
|
83
|
+
return state.current;
|
|
84
|
+
},
|
|
85
|
+
// Updates existing state.
|
|
86
|
+
//
|
|
87
|
+
// State updates are incremental meaning that this code should mimick
|
|
88
|
+
// the classic `React.Component`'s `this.setState()` behavior
|
|
89
|
+
// when calling `this.setState()` doesn't replace `state` but rather merges
|
|
90
|
+
// a set of the updated state properties with the rest of the old ones.
|
|
91
|
+
//
|
|
92
|
+
// The reason is that `useState()` updates are "asynchronous" (not immediate),
|
|
93
|
+
// and simply merging over `...state` would merge over potentially stale
|
|
94
|
+
// property values in cases when more than a single `updateState()` call is made
|
|
95
|
+
// before the state actually updates, resulting in losing some of the state updates.
|
|
96
|
+
//
|
|
97
|
+
// For example, the first `updateState()` call updates shown item indexes,
|
|
98
|
+
// and the second `updateState()` call updates `verticalSpacing`.
|
|
99
|
+
// If it was simply `updateState({ ...state, ...stateUpdate })`
|
|
100
|
+
// then the second state update could overwrite the first state update,
|
|
101
|
+
// resulting in incorrect items being shown/hidden.
|
|
102
|
+
//
|
|
103
|
+
// Using `...state.current` instead of `...pendingState.current` here
|
|
104
|
+
// would produce "stale" results.
|
|
105
|
+
//
|
|
106
|
+
updateState: function updateState(stateUpdate) {
|
|
107
|
+
var newState = _objectSpread(_objectSpread({}, targetState.current), stateUpdate);
|
|
108
|
+
|
|
109
|
+
targetState.current = newState; // If `items` property did change the component detects it at render time
|
|
110
|
+
// and updates `VirtualScroller` items immediately by calling `.setItems()`.
|
|
111
|
+
// But, since all of that happens at render time and not in an "effect",
|
|
112
|
+
// if the state update was done as usual by calling `_setStateUpdate()`,
|
|
113
|
+
// React would throw an error about updating state during render.
|
|
114
|
+
// Hence, state update in that particular case should happen "directly",
|
|
115
|
+
// without waiting for an "asynchronous" effect to trigger and call
|
|
116
|
+
// an "asyncronous" `_setStateUpdate()` function.
|
|
117
|
+
//
|
|
118
|
+
// Updating state directly in that particular case works because there
|
|
119
|
+
// already is a render ongoing, so there's no need to re-render the component
|
|
120
|
+
// again after such render-time state update.
|
|
121
|
+
//
|
|
122
|
+
// When the initial `VirtualScroller` state is being set, it contains an `.items`
|
|
123
|
+
// property too, but that initial setting is done using another function called
|
|
124
|
+
// `setInitialState()`, so using `if (stateUpdate.items)` condition here for describing
|
|
125
|
+
// just the case when `state` has been updated as a result of a `setItems()` call
|
|
126
|
+
// seems to be fine.
|
|
127
|
+
//
|
|
128
|
+
|
|
129
|
+
if (stateUpdate.items) {
|
|
130
|
+
// If a `stateUpdate` contains `items` then it means that there was a `setItems()` call.
|
|
131
|
+
// No need to trigger a re-render — the component got re-rendered anyway.
|
|
132
|
+
// Just update the `state` "in place".
|
|
133
|
+
state.current = newState;
|
|
134
|
+
} else {
|
|
135
|
+
_setStateUpdate(newState);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=useState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useState.js","names":["_useState","initialState","onRender","items","useState","_stateUpdate","_setStateUpdate","state","useRef","targetState","current","useLayoutEffect","getState","updateState","stateUpdate","newState"],"sources":["../../source/react/useState.js"],"sourcesContent":["import { useState, useRef, useLayoutEffect } from 'react'\r\n\r\n// Creates state management functions.\r\nexport default function _useState({ initialState, onRender, items }) {\r\n\t// `VirtualScroller` state.\r\n\t//\r\n\t// The `_stateUpdate` variable shouldn't be used directly\r\n\t// because in some cases its value may not represent\r\n\t// the actual `state` of the `VirtualScroller`.\r\n\t//\r\n\t// * It will contain an incorrect initial value if `initialState` property is passed\r\n\t// because it doesn't get initialized to `initialState`.\r\n\t//\r\n\t// * If `items` property gets changed, `state` reference variable gets updated immediately\r\n\t// but the `_stateUpdate` variable here doesn't (until the component re-renders some other time).\r\n\t//\r\n\t// Instead, use the `state` reference below.\r\n\t//\r\n\tconst [_stateUpdate, _setStateUpdate] = useState()\r\n\r\n\t// This `state` reference is used for accessing the externally stored\r\n\t// virtual scroller state from inside a `VirtualScroller` instance.\r\n\t//\r\n\t// It's also the \"source of truth\" on the actual `VirtualScroller` state.\r\n\t//\r\n\tconst state = useRef(initialState)\r\n\r\n\t// Accumulates state updates until they have been applied.\r\n\tconst targetState = useRef(initialState)\r\n\r\n\t// Update the current state reference.\r\n\t//\r\n\t// Ignores the cases when `state` reference has already been updated\r\n\t// \"immediately\" bypassing a `_setStateUpdate()` call, because\r\n\t// in that case, `_stateUpdate` holds a stale value.\r\n\t//\r\n\tif (state.current !== targetState.current) {\r\n\t\tstate.current = _stateUpdate\r\n\t}\r\n\r\n\t// Call `onRender()` right after every state update.\r\n\t//\r\n\t// When `items` property changes, `useHandleItemsChange()` hook doesn't call\r\n\t// `_setStateUpdate()` because there's no need for a re-render.\r\n\t// But chaning `items` still does trigger a `VirtualScroller` state update,\r\n\t// so added `items` property in the list of this \"effect\"'s dependencies.\r\n\t//\r\n\tuseLayoutEffect(() => {\r\n\t\tonRender()\r\n\t}, [\r\n\t\t_stateUpdate,\r\n\t\titems\r\n\t])\r\n\r\n\treturn {\r\n\t\tgetState: () => state.current,\r\n\r\n\t\t// Updates existing state.\r\n\t\t//\r\n\t\t// State updates are incremental meaning that this code should mimick\r\n\t\t// the classic `React.Component`'s `this.setState()` behavior\r\n\t\t// when calling `this.setState()` doesn't replace `state` but rather merges\r\n\t\t// a set of the updated state properties with the rest of the old ones.\r\n\t\t//\r\n\t\t// The reason is that `useState()` updates are \"asynchronous\" (not immediate),\r\n\t\t// and simply merging over `...state` would merge over potentially stale\r\n\t\t// property values in cases when more than a single `updateState()` call is made\r\n\t\t// before the state actually updates, resulting in losing some of the state updates.\r\n\t\t//\r\n\t\t// For example, the first `updateState()` call updates shown item indexes,\r\n\t\t// and the second `updateState()` call updates `verticalSpacing`.\r\n\t\t// If it was simply `updateState({ ...state, ...stateUpdate })`\r\n\t\t// then the second state update could overwrite the first state update,\r\n\t\t// resulting in incorrect items being shown/hidden.\r\n\t\t//\r\n\t\t// Using `...state.current` instead of `...pendingState.current` here\r\n\t\t// would produce \"stale\" results.\r\n\t\t//\r\n\t\tupdateState: (stateUpdate) => {\r\n\t\t\tconst newState = {\r\n\t\t\t\t...targetState.current,\r\n\t\t\t\t...stateUpdate\r\n\t\t\t}\r\n\t\t\ttargetState.current = newState\r\n\t\t\t// If `items` property did change the component detects it at render time\r\n\t\t\t// and updates `VirtualScroller` items immediately by calling `.setItems()`.\r\n\t\t\t// But, since all of that happens at render time and not in an \"effect\",\r\n\t\t\t// if the state update was done as usual by calling `_setStateUpdate()`,\r\n\t\t\t// React would throw an error about updating state during render.\r\n\t\t\t// Hence, state update in that particular case should happen \"directly\",\r\n\t\t\t// without waiting for an \"asynchronous\" effect to trigger and call\r\n\t\t\t// an \"asyncronous\" `_setStateUpdate()` function.\r\n\t\t\t//\r\n\t\t\t// Updating state directly in that particular case works because there\r\n\t\t\t// already is a render ongoing, so there's no need to re-render the component\r\n\t\t\t// again after such render-time state update.\r\n\t\t\t//\r\n\t\t\t// When the initial `VirtualScroller` state is being set, it contains an `.items`\r\n\t\t\t// property too, but that initial setting is done using another function called\r\n\t\t\t// `setInitialState()`, so using `if (stateUpdate.items)` condition here for describing\r\n\t\t\t// just the case when `state` has been updated as a result of a `setItems()` call\r\n\t\t\t// seems to be fine.\r\n\t\t\t//\r\n\t\t\tif (stateUpdate.items) {\r\n\t\t\t\t// If a `stateUpdate` contains `items` then it means that there was a `setItems()` call.\r\n\t\t\t\t// No need to trigger a re-render — the component got re-rendered anyway.\r\n\t\t\t\t// Just update the `state` \"in place\".\r\n\t\t\t\tstate.current = newState\r\n\t\t\t} else {\r\n\t\t\t\t_setStateUpdate(newState)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}"],"mappings":";;;;;;;AAAA;;;;;;;;;;;;;;;;;;;;AAEA;AACe,SAASA,SAAT,OAAsD;EAAA,IAAjCC,YAAiC,QAAjCA,YAAiC;EAAA,IAAnBC,QAAmB,QAAnBA,QAAmB;EAAA,IAATC,KAAS,QAATA,KAAS;;EACpE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,iBAAwC,IAAAC,eAAA,GAAxC;EAAA;EAAA,IAAOC,YAAP;EAAA,IAAqBC,eAArB,iBAfoE,CAiBpE;EACA;EACA;EACA;EACA;;;EACA,IAAMC,KAAK,GAAG,IAAAC,aAAA,EAAOP,YAAP,CAAd,CAtBoE,CAwBpE;;EACA,IAAMQ,WAAW,GAAG,IAAAD,aAAA,EAAOP,YAAP,CAApB,CAzBoE,CA2BpE;EACA;EACA;EACA;EACA;EACA;;EACA,IAAIM,KAAK,CAACG,OAAN,KAAkBD,WAAW,CAACC,OAAlC,EAA2C;IAC1CH,KAAK,CAACG,OAAN,GAAgBL,YAAhB;EACA,CAnCmE,CAqCpE;EACA;EACA;EACA;EACA;EACA;EACA;;;EACA,IAAAM,sBAAA,EAAgB,YAAM;IACrBT,QAAQ;EACR,CAFD,EAEG,CACFG,YADE,EAEFF,KAFE,CAFH;EAOA,OAAO;IACNS,QAAQ,EAAE;MAAA,OAAML,KAAK,CAACG,OAAZ;IAAA,CADJ;IAGN;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACAG,WAAW,EAAE,qBAACC,WAAD,EAAiB;MAC7B,IAAMC,QAAQ,mCACVN,WAAW,CAACC,OADF,GAEVI,WAFU,CAAd;;MAIAL,WAAW,CAACC,OAAZ,GAAsBK,QAAtB,CAL6B,CAM7B;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;MACA,IAAID,WAAW,CAACX,KAAhB,EAAuB;QACtB;QACA;QACA;QACAI,KAAK,CAACG,OAAN,GAAgBK,QAAhB;MACA,CALD,MAKO;QACNT,eAAe,CAACS,QAAD,CAAf;MACA;IACD;EAzDK,CAAP;AA2DA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports["default"] = useStyle;
|
|
7
|
+
|
|
8
|
+
var _px = _interopRequireDefault(require("../utility/px.js"));
|
|
9
|
+
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
11
|
+
|
|
12
|
+
function useStyle(_ref) {
|
|
13
|
+
var tbody = _ref.tbody,
|
|
14
|
+
virtualScroller = _ref.virtualScroller;
|
|
15
|
+
|
|
16
|
+
if (tbody) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
var _virtualScroller$getS = virtualScroller.getState(),
|
|
21
|
+
beforeItemsHeight = _virtualScroller$getS.beforeItemsHeight,
|
|
22
|
+
afterItemsHeight = _virtualScroller$getS.afterItemsHeight;
|
|
23
|
+
|
|
24
|
+
return {
|
|
25
|
+
paddingTop: (0, _px["default"])(beforeItemsHeight),
|
|
26
|
+
paddingBottom: (0, _px["default"])(afterItemsHeight)
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=useStyle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStyle.js","names":["useStyle","tbody","virtualScroller","getState","beforeItemsHeight","afterItemsHeight","paddingTop","px","paddingBottom"],"sources":["../../source/react/useStyle.js"],"sourcesContent":["import px from '../utility/px.js'\r\n\r\nexport default function useStyle({\r\n\ttbody,\r\n\tvirtualScroller\r\n}) {\r\n\tif (tbody) {\r\n\t\treturn\r\n\t}\r\n\r\n\tconst {\r\n\t\tbeforeItemsHeight,\r\n\t\tafterItemsHeight\r\n\t} = virtualScroller.getState()\r\n\r\n\treturn {\r\n\t\tpaddingTop: px(beforeItemsHeight),\r\n\t\tpaddingBottom: px(afterItemsHeight)\r\n\t}\r\n}"],"mappings":";;;;;;;AAAA;;;;AAEe,SAASA,QAAT,OAGZ;EAAA,IAFFC,KAEE,QAFFA,KAEE;EAAA,IADFC,eACE,QADFA,eACE;;EACF,IAAID,KAAJ,EAAW;IACV;EACA;;EAED,4BAGIC,eAAe,CAACC,QAAhB,EAHJ;EAAA,IACCC,iBADD,yBACCA,iBADD;EAAA,IAECC,gBAFD,yBAECA,gBAFD;;EAKA,OAAO;IACNC,UAAU,EAAE,IAAAC,cAAA,EAAGH,iBAAH,CADN;IAENI,aAAa,EAAE,IAAAD,cAAA,EAAGF,gBAAH;EAFT,CAAP;AAIA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports["default"] = useVirtualScroller;
|
|
7
|
+
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
|
|
10
|
+
var _VirtualScroller2 = _interopRequireDefault(require("../VirtualScroller.js"));
|
|
11
|
+
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
13
|
+
|
|
14
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
15
|
+
|
|
16
|
+
// Creates a `VirtualScroller` instance.
|
|
17
|
+
function useVirtualScroller(_ref, _ref2) {
|
|
18
|
+
var items = _ref.items,
|
|
19
|
+
estimatedItemHeight = _ref.estimatedItemHeight,
|
|
20
|
+
bypass = _ref.bypass,
|
|
21
|
+
tbody = _ref.tbody,
|
|
22
|
+
onItemInitialRender = _ref.onItemInitialRender,
|
|
23
|
+
onItemFirstRender = _ref.onItemFirstRender,
|
|
24
|
+
initialScrollPosition = _ref.initialScrollPosition,
|
|
25
|
+
onScrollPositionChange = _ref.onScrollPositionChange,
|
|
26
|
+
measureItemsBatchSize = _ref.measureItemsBatchSize,
|
|
27
|
+
scrollableContainer = _ref.scrollableContainer,
|
|
28
|
+
getScrollableContainer = _ref.getScrollableContainer,
|
|
29
|
+
getColumnsCount = _ref.getColumnsCount,
|
|
30
|
+
getItemId = _ref.getItemId,
|
|
31
|
+
AsComponent = _ref.AsComponent,
|
|
32
|
+
initialState = _ref.initialState,
|
|
33
|
+
onStateChange = _ref.onStateChange;
|
|
34
|
+
var container = _ref2.container;
|
|
35
|
+
return (0, _react.useMemo)(function () {
|
|
36
|
+
var _VirtualScroller;
|
|
37
|
+
|
|
38
|
+
// Create `virtual-scroller` instance.
|
|
39
|
+
return new _VirtualScroller2["default"](function () {
|
|
40
|
+
return container.current;
|
|
41
|
+
}, items, (_VirtualScroller = {
|
|
42
|
+
_useTimeoutInRenderLoop: true,
|
|
43
|
+
estimatedItemHeight: estimatedItemHeight,
|
|
44
|
+
bypass: bypass,
|
|
45
|
+
// bypassBatchSize,
|
|
46
|
+
tbody: tbody,
|
|
47
|
+
onItemInitialRender: onItemInitialRender,
|
|
48
|
+
// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.
|
|
49
|
+
onItemFirstRender: onItemFirstRender,
|
|
50
|
+
initialScrollPosition: initialScrollPosition,
|
|
51
|
+
onScrollPositionChange: onScrollPositionChange,
|
|
52
|
+
measureItemsBatchSize: measureItemsBatchSize,
|
|
53
|
+
// `scrollableContainer` property is deprecated.
|
|
54
|
+
// Use `getScrollableContainer()` property instead.
|
|
55
|
+
scrollableContainer: scrollableContainer,
|
|
56
|
+
getScrollableContainer: getScrollableContainer,
|
|
57
|
+
getColumnsCount: getColumnsCount,
|
|
58
|
+
getItemId: getItemId
|
|
59
|
+
}, _defineProperty(_VirtualScroller, "tbody", AsComponent === 'tbody'), _defineProperty(_VirtualScroller, "state", initialState), _defineProperty(_VirtualScroller, "onStateChange", onStateChange), _VirtualScroller));
|
|
60
|
+
}, []);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=useVirtualScroller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useVirtualScroller.js","names":["useVirtualScroller","items","estimatedItemHeight","bypass","tbody","onItemInitialRender","onItemFirstRender","initialScrollPosition","onScrollPositionChange","measureItemsBatchSize","scrollableContainer","getScrollableContainer","getColumnsCount","getItemId","AsComponent","initialState","onStateChange","container","useMemo","VirtualScroller","current","_useTimeoutInRenderLoop"],"sources":["../../source/react/useVirtualScroller.js"],"sourcesContent":["import { useMemo } from 'react'\r\n\r\nimport VirtualScroller from '../VirtualScroller.js'\r\n\r\n// Creates a `VirtualScroller` instance.\r\nexport default function useVirtualScroller({\r\n\titems,\r\n\testimatedItemHeight,\r\n\tbypass,\r\n\t// bypassBatchSize,\r\n\ttbody,\r\n\tonItemInitialRender,\r\n\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\tonItemFirstRender,\r\n\tinitialScrollPosition,\r\n\tonScrollPositionChange,\r\n\tmeasureItemsBatchSize,\r\n\t// `scrollableContainer` property is deprecated.\r\n\t// Use `getScrollableContainer()` property instead.\r\n\tscrollableContainer,\r\n\tgetScrollableContainer,\r\n\tgetColumnsCount,\r\n\tgetItemId,\r\n\tAsComponent,\r\n\tinitialState,\r\n\tonStateChange\r\n}, {\r\n\tcontainer\r\n}) {\r\n\treturn useMemo(() => {\r\n\t\t// Create `virtual-scroller` instance.\r\n\t\treturn new VirtualScroller(\r\n\t\t\t() => container.current,\r\n\t\t\titems,\r\n\t\t\t{\r\n\t\t\t\t_useTimeoutInRenderLoop: true,\r\n\t\t\t\testimatedItemHeight,\r\n\t\t\t\tbypass,\r\n\t\t\t\t// bypassBatchSize,\r\n\t\t\t\ttbody,\r\n\t\t\t\tonItemInitialRender,\r\n\t\t\t\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\t\t\t\tonItemFirstRender,\r\n\t\t\t\tinitialScrollPosition,\r\n\t\t\t\tonScrollPositionChange,\r\n\t\t\t\tmeasureItemsBatchSize,\r\n\t\t\t\t// `scrollableContainer` property is deprecated.\r\n\t\t\t\t// Use `getScrollableContainer()` property instead.\r\n\t\t\t\tscrollableContainer,\r\n\t\t\t\tgetScrollableContainer,\r\n\t\t\t\tgetColumnsCount,\r\n\t\t\t\tgetItemId,\r\n\t\t\t\ttbody: AsComponent === 'tbody',\r\n\t\t\t\tstate: initialState,\r\n\t\t\t\tonStateChange\r\n\t\t\t}\r\n\t\t)\r\n\t}, [])\r\n}"],"mappings":";;;;;;;AAAA;;AAEA;;;;;;AAEA;AACe,SAASA,kBAAT,cAuBZ;EAAA,IAtBFC,KAsBE,QAtBFA,KAsBE;EAAA,IArBFC,mBAqBE,QArBFA,mBAqBE;EAAA,IApBFC,MAoBE,QApBFA,MAoBE;EAAA,IAlBFC,KAkBE,QAlBFA,KAkBE;EAAA,IAjBFC,mBAiBE,QAjBFA,mBAiBE;EAAA,IAfFC,iBAeE,QAfFA,iBAeE;EAAA,IAdFC,qBAcE,QAdFA,qBAcE;EAAA,IAbFC,sBAaE,QAbFA,sBAaE;EAAA,IAZFC,qBAYE,QAZFA,qBAYE;EAAA,IATFC,mBASE,QATFA,mBASE;EAAA,IARFC,sBAQE,QARFA,sBAQE;EAAA,IAPFC,eAOE,QAPFA,eAOE;EAAA,IANFC,SAME,QANFA,SAME;EAAA,IALFC,WAKE,QALFA,WAKE;EAAA,IAJFC,YAIE,QAJFA,YAIE;EAAA,IAHFC,aAGE,QAHFA,aAGE;EAAA,IADFC,SACE,SADFA,SACE;EACF,OAAO,IAAAC,cAAA,EAAQ,YAAM;IAAA;;IACpB;IACA,OAAO,IAAIC,4BAAJ,CACN;MAAA,OAAMF,SAAS,CAACG,OAAhB;IAAA,CADM,EAENnB,KAFM;MAILoB,uBAAuB,EAAE,IAJpB;MAKLnB,mBAAmB,EAAnBA,mBALK;MAMLC,MAAM,EAANA,MANK;MAOL;MACAC,KAAK,EAALA,KARK;MASLC,mBAAmB,EAAnBA,mBATK;MAUL;MACAC,iBAAiB,EAAjBA,iBAXK;MAYLC,qBAAqB,EAArBA,qBAZK;MAaLC,sBAAsB,EAAtBA,sBAbK;MAcLC,qBAAqB,EAArBA,qBAdK;MAeL;MACA;MACAC,mBAAmB,EAAnBA,mBAjBK;MAkBLC,sBAAsB,EAAtBA,sBAlBK;MAmBLC,eAAe,EAAfA,eAnBK;MAoBLC,SAAS,EAATA;IApBK,8CAqBEC,WAAW,KAAK,OArBlB,8CAsBEC,YAtBF,sDAuBLC,aAvBK,qBAAP;EA0BA,CA5BM,EA4BJ,EA5BI,CAAP;AA6BA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports["default"] = useVirtualScrollerStartStop;
|
|
7
|
+
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
|
|
10
|
+
function useVirtualScrollerStartStop(virtualScroller) {
|
|
11
|
+
(0, _react.useLayoutEffect)(function () {
|
|
12
|
+
// Start listening to scroll events.
|
|
13
|
+
virtualScroller.start();
|
|
14
|
+
return function () {
|
|
15
|
+
// Stop listening to scroll events.
|
|
16
|
+
virtualScroller.stop();
|
|
17
|
+
};
|
|
18
|
+
}, []);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=useVirtualScrollerStartStop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useVirtualScrollerStartStop.js","names":["useVirtualScrollerStartStop","virtualScroller","useLayoutEffect","start","stop"],"sources":["../../source/react/useVirtualScrollerStartStop.js"],"sourcesContent":["import { useLayoutEffect } from 'react'\r\n\r\nexport default function useVirtualScrollerStartStop(virtualScroller) {\r\n\tuseLayoutEffect(() => {\r\n\t\t// Start listening to scroll events.\r\n\t\tvirtualScroller.start()\r\n\t\treturn () => {\r\n\t\t\t// Stop listening to scroll events.\r\n\t\t\tvirtualScroller.stop()\r\n\t\t}\r\n\t}, [])\r\n}"],"mappings":";;;;;;;AAAA;;AAEe,SAASA,2BAAT,CAAqCC,eAArC,EAAsD;EACpE,IAAAC,sBAAA,EAAgB,YAAM;IACrB;IACAD,eAAe,CAACE,KAAhB;IACA,OAAO,YAAM;MACZ;MACAF,eAAe,CAACG,IAAhB;IACA,CAHD;EAIA,CAPD,EAOG,EAPH;AAQA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports["default"] = void 0;
|
|
7
|
+
|
|
8
|
+
var _ItemsContainer = _interopRequireDefault(require("./ItemsContainer.js"));
|
|
9
|
+
|
|
10
|
+
var _ScrollableContainer = _interopRequireDefault(require("./ScrollableContainer.js"));
|
|
11
|
+
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
13
|
+
|
|
14
|
+
var _default = {
|
|
15
|
+
createItemsContainer: function createItemsContainer(getItemsContainerElement) {
|
|
16
|
+
return new _ItemsContainer["default"](getItemsContainerElement);
|
|
17
|
+
},
|
|
18
|
+
createScrollableContainer: function createScrollableContainer(getScrollableContainerElement, getItemsContainerElement) {
|
|
19
|
+
return new _ScrollableContainer["default"](getScrollableContainerElement, getItemsContainerElement);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
exports["default"] = _default;
|
|
23
|
+
//# sourceMappingURL=Engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Engine.js","names":["createItemsContainer","getItemsContainerElement","ItemsContainer","createScrollableContainer","getScrollableContainerElement","ScrollableContainer"],"sources":["../../source/test/Engine.js"],"sourcesContent":["import ItemsContainer from './ItemsContainer.js'\r\nimport ScrollableContainer from './ScrollableContainer.js'\r\n\r\nexport default {\r\n\tcreateItemsContainer(getItemsContainerElement) {\r\n\t\treturn new ItemsContainer(getItemsContainerElement)\r\n\t},\r\n\tcreateScrollableContainer(getScrollableContainerElement, getItemsContainerElement) {\r\n\t\treturn new ScrollableContainer(getScrollableContainerElement, getItemsContainerElement)\r\n\t}\r\n}"],"mappings":";;;;;;;AAAA;;AACA;;;;eAEe;EACdA,oBADc,gCACOC,wBADP,EACiC;IAC9C,OAAO,IAAIC,0BAAJ,CAAmBD,wBAAnB,CAAP;EACA,CAHa;EAIdE,yBAJc,qCAIYC,6BAJZ,EAI2CH,wBAJ3C,EAIqE;IAClF,OAAO,IAAII,+BAAJ,CAAwBD,6BAAxB,EAAuDH,wBAAvD,CAAP;EACA;AANa,C"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports["default"] = void 0;
|
|
7
|
+
|
|
8
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
9
|
+
|
|
10
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
11
|
+
|
|
12
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
13
|
+
|
|
14
|
+
var ItemsContainer = /*#__PURE__*/function () {
|
|
15
|
+
/**
|
|
16
|
+
* Constructs a new "container" from an element.
|
|
17
|
+
* @param {function} getElement
|
|
18
|
+
*/
|
|
19
|
+
function ItemsContainer(getElement) {
|
|
20
|
+
_classCallCheck(this, ItemsContainer);
|
|
21
|
+
|
|
22
|
+
this.getElement = getElement;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Returns an item element's "top offset", relative to the items `container`'s top edge.
|
|
26
|
+
* @param {number} renderedElementIndex — An index of an item relative to the "first shown item index". For example, if the list is showing items from index 8 to index 12 then `renderedElementIndex = 0` would mean the item at index `8`.
|
|
27
|
+
* @return {number}
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
_createClass(ItemsContainer, [{
|
|
32
|
+
key: "getNthRenderedItemTopOffset",
|
|
33
|
+
value: function getNthRenderedItemTopOffset(renderedElementIndex) {
|
|
34
|
+
var children = this.getElement().children;
|
|
35
|
+
var maxWidth = this.getElement().width;
|
|
36
|
+
var topOffset = this.getElement().paddingTop;
|
|
37
|
+
var rowWidth;
|
|
38
|
+
var rowHeight;
|
|
39
|
+
var startNewRow = true;
|
|
40
|
+
var i = 0;
|
|
41
|
+
|
|
42
|
+
while (i <= renderedElementIndex) {
|
|
43
|
+
if (startNewRow || rowWidth + children[i].width > maxWidth) {
|
|
44
|
+
if (i > 0) {
|
|
45
|
+
topOffset += rowHeight;
|
|
46
|
+
topOffset += children[i].marginTop;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
rowWidth = children[i].width;
|
|
50
|
+
rowHeight = children[i].height;
|
|
51
|
+
|
|
52
|
+
if (rowWidth > maxWidth) {
|
|
53
|
+
startNewRow = true;
|
|
54
|
+
} else {
|
|
55
|
+
startNewRow = false;
|
|
56
|
+
}
|
|
57
|
+
} else {
|
|
58
|
+
rowWidth += children[i].width;
|
|
59
|
+
rowHeight = Math.max(rowHeight, children[i].height);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
i++;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return topOffset;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Returns an item element's height.
|
|
69
|
+
* @param {number} renderedElementIndex — An index of an item relative to the "first shown item index". For example, if the list is showing items from index 8 to index 12 then `renderedElementIndex = 0` would mean the item at index `8`.
|
|
70
|
+
* @return {number}
|
|
71
|
+
*/
|
|
72
|
+
|
|
73
|
+
}, {
|
|
74
|
+
key: "getNthRenderedItemHeight",
|
|
75
|
+
value: function getNthRenderedItemHeight(renderedElementIndex) {
|
|
76
|
+
return this.getElement().children[renderedElementIndex].height;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Returns items container height.
|
|
80
|
+
* @return {number}
|
|
81
|
+
*/
|
|
82
|
+
|
|
83
|
+
}, {
|
|
84
|
+
key: "getHeight",
|
|
85
|
+
value: function getHeight() {
|
|
86
|
+
var children = this.getElement().children;
|
|
87
|
+
var maxWidth = this.getElement().width;
|
|
88
|
+
var contentHeight = this.getElement().paddingTop;
|
|
89
|
+
var i = 0;
|
|
90
|
+
|
|
91
|
+
while (i < children.length) {
|
|
92
|
+
var rowWidth = 0;
|
|
93
|
+
var rowHeight = 0;
|
|
94
|
+
|
|
95
|
+
while (rowWidth <= maxWidth && i < children.length) {
|
|
96
|
+
if (rowWidth === 0 && i > 0) {
|
|
97
|
+
var verticalSpacing = children[i].marginTop;
|
|
98
|
+
contentHeight += verticalSpacing;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
rowWidth += children[i].width;
|
|
102
|
+
rowHeight = Math.max(rowHeight, children[i].height);
|
|
103
|
+
i++;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
contentHeight += rowHeight;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
contentHeight += this.getElement().paddingBottom;
|
|
110
|
+
return contentHeight;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Removes all item elements of an items container.
|
|
114
|
+
*/
|
|
115
|
+
|
|
116
|
+
}, {
|
|
117
|
+
key: "clear",
|
|
118
|
+
value: function clear() {
|
|
119
|
+
this.getElement().children = [];
|
|
120
|
+
}
|
|
121
|
+
}]);
|
|
122
|
+
|
|
123
|
+
return ItemsContainer;
|
|
124
|
+
}();
|
|
125
|
+
|
|
126
|
+
exports["default"] = ItemsContainer;
|
|
127
|
+
//# sourceMappingURL=ItemsContainer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ItemsContainer.js","names":["ItemsContainer","getElement","renderedElementIndex","children","maxWidth","width","topOffset","paddingTop","rowWidth","rowHeight","startNewRow","i","marginTop","height","Math","max","contentHeight","length","verticalSpacing","paddingBottom"],"sources":["../../source/test/ItemsContainer.js"],"sourcesContent":["export default class ItemsContainer {\r\n\t/**\r\n\t * Constructs a new \"container\" from an element.\r\n\t * @param {function} getElement\r\n\t */\r\n\tconstructor(getElement) {\r\n\t\tthis.getElement = getElement\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an item element's \"top offset\", relative to the items `container`'s top edge.\r\n\t * @param {number} renderedElementIndex — An index of an item relative to the \"first shown item index\". For example, if the list is showing items from index 8 to index 12 then `renderedElementIndex = 0` would mean the item at index `8`.\r\n\t * @return {number}\r\n\t */\r\n\tgetNthRenderedItemTopOffset(renderedElementIndex) {\r\n\t\tconst children = this.getElement().children\r\n\t\tconst maxWidth = this.getElement().width\r\n\t\tlet topOffset = this.getElement().paddingTop\r\n\t\tlet rowWidth\r\n\t\tlet rowHeight\r\n\t\tlet startNewRow = true\r\n\t\tlet i = 0\r\n\t\twhile (i <= renderedElementIndex) {\r\n\t\t\tif (startNewRow || rowWidth + children[i].width > maxWidth) {\r\n\t\t\t\tif (i > 0) {\r\n\t\t\t\t\ttopOffset += rowHeight\r\n\t\t\t\t\ttopOffset += children[i].marginTop\r\n\t\t\t\t}\r\n\t\t\t\trowWidth = children[i].width\r\n\t\t\t\trowHeight = children[i].height\r\n\t\t\t\tif (rowWidth > maxWidth) {\r\n\t\t\t\t\tstartNewRow = true\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstartNewRow = false\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\trowWidth += children[i].width\r\n\t\t\t\trowHeight = Math.max(rowHeight, children[i].height)\r\n\t\t\t}\r\n\t\t\ti++\r\n\t\t}\r\n\t\treturn topOffset\r\n\t}\r\n\r\n\t/**\r\n\t * Returns an item element's height.\r\n\t * @param {number} renderedElementIndex — An index of an item relative to the \"first shown item index\". For example, if the list is showing items from index 8 to index 12 then `renderedElementIndex = 0` would mean the item at index `8`.\r\n\t * @return {number}\r\n\t */\r\n\tgetNthRenderedItemHeight(renderedElementIndex) {\r\n\t\treturn this.getElement().children[renderedElementIndex].height\r\n\t}\r\n\r\n\t/**\r\n\t * Returns items container height.\r\n\t * @return {number}\r\n\t */\r\n\tgetHeight() {\r\n\t\tconst children = this.getElement().children\r\n\t\tconst maxWidth = this.getElement().width\r\n\t\tlet contentHeight = this.getElement().paddingTop\r\n\t\tlet i = 0\r\n\t\twhile (i < children.length) {\r\n\t\t\tlet rowWidth = 0\r\n\t\t\tlet rowHeight = 0\r\n\t\t\twhile (rowWidth <= maxWidth && i < children.length) {\r\n\t\t\t\tif (rowWidth === 0 && i > 0) {\r\n\t\t\t\t\tconst verticalSpacing = children[i].marginTop\r\n\t\t\t\t\tcontentHeight += verticalSpacing\r\n\t\t\t\t}\r\n\t\t\t\trowWidth += children[i].width\r\n\t\t\t\trowHeight = Math.max(rowHeight, children[i].height)\r\n\t\t\t\ti++\r\n\t\t\t}\r\n\t\t\tcontentHeight += rowHeight\r\n\t\t}\r\n\t\tcontentHeight += this.getElement().paddingBottom\r\n\t\treturn contentHeight\r\n\t}\r\n\r\n\t/**\r\n\t * Removes all item elements of an items container.\r\n\t */\r\n\tclear() {\r\n\t\tthis.getElement().children = []\r\n\t}\r\n}"],"mappings":";;;;;;;;;;;;;IAAqBA,c;EACpB;AACD;AACA;AACA;EACC,wBAAYC,UAAZ,EAAwB;IAAA;;IACvB,KAAKA,UAAL,GAAkBA,UAAlB;EACA;EAED;AACD;AACA;AACA;AACA;;;;;WACC,qCAA4BC,oBAA5B,EAAkD;MACjD,IAAMC,QAAQ,GAAG,KAAKF,UAAL,GAAkBE,QAAnC;MACA,IAAMC,QAAQ,GAAG,KAAKH,UAAL,GAAkBI,KAAnC;MACA,IAAIC,SAAS,GAAG,KAAKL,UAAL,GAAkBM,UAAlC;MACA,IAAIC,QAAJ;MACA,IAAIC,SAAJ;MACA,IAAIC,WAAW,GAAG,IAAlB;MACA,IAAIC,CAAC,GAAG,CAAR;;MACA,OAAOA,CAAC,IAAIT,oBAAZ,EAAkC;QACjC,IAAIQ,WAAW,IAAIF,QAAQ,GAAGL,QAAQ,CAACQ,CAAD,CAAR,CAAYN,KAAvB,GAA+BD,QAAlD,EAA4D;UAC3D,IAAIO,CAAC,GAAG,CAAR,EAAW;YACVL,SAAS,IAAIG,SAAb;YACAH,SAAS,IAAIH,QAAQ,CAACQ,CAAD,CAAR,CAAYC,SAAzB;UACA;;UACDJ,QAAQ,GAAGL,QAAQ,CAACQ,CAAD,CAAR,CAAYN,KAAvB;UACAI,SAAS,GAAGN,QAAQ,CAACQ,CAAD,CAAR,CAAYE,MAAxB;;UACA,IAAIL,QAAQ,GAAGJ,QAAf,EAAyB;YACxBM,WAAW,GAAG,IAAd;UACA,CAFD,MAEO;YACNA,WAAW,GAAG,KAAd;UACA;QACD,CAZD,MAYO;UACNF,QAAQ,IAAIL,QAAQ,CAACQ,CAAD,CAAR,CAAYN,KAAxB;UACAI,SAAS,GAAGK,IAAI,CAACC,GAAL,CAASN,SAAT,EAAoBN,QAAQ,CAACQ,CAAD,CAAR,CAAYE,MAAhC,CAAZ;QACA;;QACDF,CAAC;MACD;;MACD,OAAOL,SAAP;IACA;IAED;AACD;AACA;AACA;AACA;;;;WACC,kCAAyBJ,oBAAzB,EAA+C;MAC9C,OAAO,KAAKD,UAAL,GAAkBE,QAAlB,CAA2BD,oBAA3B,EAAiDW,MAAxD;IACA;IAED;AACD;AACA;AACA;;;;WACC,qBAAY;MACX,IAAMV,QAAQ,GAAG,KAAKF,UAAL,GAAkBE,QAAnC;MACA,IAAMC,QAAQ,GAAG,KAAKH,UAAL,GAAkBI,KAAnC;MACA,IAAIW,aAAa,GAAG,KAAKf,UAAL,GAAkBM,UAAtC;MACA,IAAII,CAAC,GAAG,CAAR;;MACA,OAAOA,CAAC,GAAGR,QAAQ,CAACc,MAApB,EAA4B;QAC3B,IAAIT,QAAQ,GAAG,CAAf;QACA,IAAIC,SAAS,GAAG,CAAhB;;QACA,OAAOD,QAAQ,IAAIJ,QAAZ,IAAwBO,CAAC,GAAGR,QAAQ,CAACc,MAA5C,EAAoD;UACnD,IAAIT,QAAQ,KAAK,CAAb,IAAkBG,CAAC,GAAG,CAA1B,EAA6B;YAC5B,IAAMO,eAAe,GAAGf,QAAQ,CAACQ,CAAD,CAAR,CAAYC,SAApC;YACAI,aAAa,IAAIE,eAAjB;UACA;;UACDV,QAAQ,IAAIL,QAAQ,CAACQ,CAAD,CAAR,CAAYN,KAAxB;UACAI,SAAS,GAAGK,IAAI,CAACC,GAAL,CAASN,SAAT,EAAoBN,QAAQ,CAACQ,CAAD,CAAR,CAAYE,MAAhC,CAAZ;UACAF,CAAC;QACD;;QACDK,aAAa,IAAIP,SAAjB;MACA;;MACDO,aAAa,IAAI,KAAKf,UAAL,GAAkBkB,aAAnC;MACA,OAAOH,aAAP;IACA;IAED;AACD;AACA;;;;WACC,iBAAQ;MACP,KAAKf,UAAL,GAAkBE,QAAlB,GAA6B,EAA7B;IACA"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports["default"] = void 0;
|
|
7
|
+
|
|
8
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
9
|
+
|
|
10
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
11
|
+
|
|
12
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
13
|
+
|
|
14
|
+
var ScrollableContainer = /*#__PURE__*/function () {
|
|
15
|
+
/**
|
|
16
|
+
* Constructs a new "scrollable container" from an element.
|
|
17
|
+
* @param {func} getElement — Returns the scrollable container element.
|
|
18
|
+
* @param {func} getItemsContainerElement — Returns items "container" element.
|
|
19
|
+
*/
|
|
20
|
+
function ScrollableContainer(getElement, getItemsContainerElement) {
|
|
21
|
+
_classCallCheck(this, ScrollableContainer);
|
|
22
|
+
|
|
23
|
+
this.getElement = getElement;
|
|
24
|
+
this.getItemsContainerElement = getItemsContainerElement;
|
|
25
|
+
this.scrollTop = 0;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Returns the current scroll position.
|
|
29
|
+
* @return {number}
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
_createClass(ScrollableContainer, [{
|
|
34
|
+
key: "getScrollY",
|
|
35
|
+
value: function getScrollY() {
|
|
36
|
+
return this.scrollTop;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Scrolls to a specific position.
|
|
40
|
+
* @param {number} scrollY
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
}, {
|
|
44
|
+
key: "scrollToY",
|
|
45
|
+
value: function scrollToY(scrollY) {
|
|
46
|
+
this.scrollTop = scrollY;
|
|
47
|
+
|
|
48
|
+
if (this.onScrollListener) {
|
|
49
|
+
this.onScrollListener();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Returns "scrollable container" width,
|
|
54
|
+
* i.e. the available width for its content.
|
|
55
|
+
* @return {number}
|
|
56
|
+
*/
|
|
57
|
+
|
|
58
|
+
}, {
|
|
59
|
+
key: "getWidth",
|
|
60
|
+
value: function getWidth() {
|
|
61
|
+
return this.getElement().width;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Returns the height of the "scrollable container" itself.
|
|
65
|
+
* Not to be confused with the height of "scrollable container"'s content.
|
|
66
|
+
* @return {number}
|
|
67
|
+
*/
|
|
68
|
+
|
|
69
|
+
}, {
|
|
70
|
+
key: "getHeight",
|
|
71
|
+
value: function getHeight() {
|
|
72
|
+
return this.getElement().height;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Returns a "top offset" of an items container element
|
|
76
|
+
* relative to the "scrollable container"'s top edge.
|
|
77
|
+
* @return {number}
|
|
78
|
+
*/
|
|
79
|
+
|
|
80
|
+
}, {
|
|
81
|
+
key: "getItemsContainerTopOffset",
|
|
82
|
+
value: function getItemsContainerTopOffset() {
|
|
83
|
+
return 0;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Adds a "scroll" event listener to the "scrollable container".
|
|
87
|
+
* @param {onScroll} Should be called whenever the scroll position inside the "scrollable container" (potentially) changes.
|
|
88
|
+
* @return {function} Returns a function that stops listening.
|
|
89
|
+
*/
|
|
90
|
+
|
|
91
|
+
}, {
|
|
92
|
+
key: "onScroll",
|
|
93
|
+
value: function onScroll(_onScroll) {
|
|
94
|
+
var _this = this;
|
|
95
|
+
|
|
96
|
+
this.onScrollListener = _onScroll;
|
|
97
|
+
return function () {
|
|
98
|
+
delete _this.onScrollListener;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Adds a "resize" event listener to the "scrollable container".
|
|
103
|
+
* @param {onResize} Should be called whenever the "scrollable container"'s width or height (potentially) changes.
|
|
104
|
+
* @return {function} Returns a function that stops listening.
|
|
105
|
+
*/
|
|
106
|
+
|
|
107
|
+
}, {
|
|
108
|
+
key: "onResize",
|
|
109
|
+
value: function onResize(_onResize) {
|
|
110
|
+
var _this2 = this;
|
|
111
|
+
|
|
112
|
+
this.onResizeListener = _onResize;
|
|
113
|
+
return function () {
|
|
114
|
+
delete _this2.onResizeListener;
|
|
115
|
+
};
|
|
116
|
+
} // Returns a `Promise` because `this.onResizeListener()` is a "debounced" function.
|
|
117
|
+
// See `./utility/debounce.js` for more details.
|
|
118
|
+
|
|
119
|
+
}, {
|
|
120
|
+
key: "_triggerResizeListener",
|
|
121
|
+
value: function _triggerResizeListener() {
|
|
122
|
+
return this.onResizeListener();
|
|
123
|
+
}
|
|
124
|
+
}]);
|
|
125
|
+
|
|
126
|
+
return ScrollableContainer;
|
|
127
|
+
}();
|
|
128
|
+
|
|
129
|
+
exports["default"] = ScrollableContainer;
|
|
130
|
+
//# sourceMappingURL=ScrollableContainer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollableContainer.js","names":["ScrollableContainer","getElement","getItemsContainerElement","scrollTop","scrollY","onScrollListener","width","height","onScroll","onResize","onResizeListener"],"sources":["../../source/test/ScrollableContainer.js"],"sourcesContent":["export default class ScrollableContainer {\r\n\t/**\r\n\t * Constructs a new \"scrollable container\" from an element.\r\n\t * @param {func} getElement — Returns the scrollable container element.\r\n\t * @param {func} getItemsContainerElement — Returns items \"container\" element.\r\n\t */\r\n\tconstructor(getElement, getItemsContainerElement) {\r\n\t\tthis.getElement = getElement\r\n\t\tthis.getItemsContainerElement = getItemsContainerElement\r\n\t\tthis.scrollTop = 0\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the current scroll position.\r\n\t * @return {number}\r\n\t */\r\n\tgetScrollY() {\r\n\t\treturn this.scrollTop\r\n\t}\r\n\r\n\t/**\r\n\t * Scrolls to a specific position.\r\n\t * @param {number} scrollY\r\n\t */\r\n\tscrollToY(scrollY) {\r\n\t\tthis.scrollTop = scrollY\r\n\t\tif (this.onScrollListener) {\r\n\t\t\tthis.onScrollListener()\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns \"scrollable container\" width,\r\n\t * i.e. the available width for its content.\r\n\t * @return {number}\r\n\t */\r\n\tgetWidth() {\r\n\t\treturn this.getElement().width\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the height of the \"scrollable container\" itself.\r\n\t * Not to be confused with the height of \"scrollable container\"'s content.\r\n\t * @return {number}\r\n\t */\r\n\tgetHeight() {\r\n\t\treturn this.getElement().height\r\n\t}\r\n\r\n\t/**\r\n\t * Returns a \"top offset\" of an items container element\r\n\t * relative to the \"scrollable container\"'s top edge.\r\n\t * @return {number}\r\n\t */\r\n\tgetItemsContainerTopOffset() {\r\n\t\treturn 0\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a \"scroll\" event listener to the \"scrollable container\".\r\n\t * @param {onScroll} Should be called whenever the scroll position inside the \"scrollable container\" (potentially) changes.\r\n\t * @return {function} Returns a function that stops listening.\r\n\t */\r\n\tonScroll(onScroll) {\r\n\t\tthis.onScrollListener = onScroll\r\n\t\treturn () => {\r\n\t\t\tdelete this.onScrollListener\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a \"resize\" event listener to the \"scrollable container\".\r\n\t * @param {onResize} Should be called whenever the \"scrollable container\"'s width or height (potentially) changes.\r\n\t * @return {function} Returns a function that stops listening.\r\n\t */\r\n\tonResize(onResize) {\r\n\t\tthis.onResizeListener = onResize\r\n\t\treturn () => {\r\n\t\t\tdelete this.onResizeListener\r\n\t\t}\r\n\t}\r\n\r\n\t// Returns a `Promise` because `this.onResizeListener()` is a \"debounced\" function.\r\n\t// See `./utility/debounce.js` for more details.\r\n\t_triggerResizeListener() {\r\n\t\treturn this.onResizeListener()\r\n\t}\r\n}"],"mappings":";;;;;;;;;;;;;IAAqBA,mB;EACpB;AACD;AACA;AACA;AACA;EACC,6BAAYC,UAAZ,EAAwBC,wBAAxB,EAAkD;IAAA;;IACjD,KAAKD,UAAL,GAAkBA,UAAlB;IACA,KAAKC,wBAAL,GAAgCA,wBAAhC;IACA,KAAKC,SAAL,GAAiB,CAAjB;EACA;EAED;AACD;AACA;AACA;;;;;WACC,sBAAa;MACZ,OAAO,KAAKA,SAAZ;IACA;IAED;AACD;AACA;AACA;;;;WACC,mBAAUC,OAAV,EAAmB;MAClB,KAAKD,SAAL,GAAiBC,OAAjB;;MACA,IAAI,KAAKC,gBAAT,EAA2B;QAC1B,KAAKA,gBAAL;MACA;IACD;IAED;AACD;AACA;AACA;AACA;;;;WACC,oBAAW;MACV,OAAO,KAAKJ,UAAL,GAAkBK,KAAzB;IACA;IAED;AACD;AACA;AACA;AACA;;;;WACC,qBAAY;MACX,OAAO,KAAKL,UAAL,GAAkBM,MAAzB;IACA;IAED;AACD;AACA;AACA;AACA;;;;WACC,sCAA6B;MAC5B,OAAO,CAAP;IACA;IAED;AACD;AACA;AACA;AACA;;;;WACC,kBAASC,SAAT,EAAmB;MAAA;;MAClB,KAAKH,gBAAL,GAAwBG,SAAxB;MACA,OAAO,YAAM;QACZ,OAAO,KAAI,CAACH,gBAAZ;MACA,CAFD;IAGA;IAED;AACD;AACA;AACA;AACA;;;;WACC,kBAASI,SAAT,EAAmB;MAAA;;MAClB,KAAKC,gBAAL,GAAwBD,SAAxB;MACA,OAAO,YAAM;QACZ,OAAO,MAAI,CAACC,gBAAZ;MACA,CAFD;IAGA,C,CAED;IACA;;;;WACA,kCAAyB;MACxB,OAAO,KAAKA,gBAAL,EAAP;IACA"}
|