virtual-scroller 1.13.0 → 1.14.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 (77) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +712 -524
  3. package/bundle/index-dom.html +2 -0
  4. package/bundle/virtual-scroller-dom.js +1 -1
  5. package/bundle/virtual-scroller-dom.js.map +1 -1
  6. package/bundle/virtual-scroller-react.js +1 -1
  7. package/bundle/virtual-scroller-react.js.map +1 -1
  8. package/bundle/virtual-scroller.js +1 -1
  9. package/bundle/virtual-scroller.js.map +1 -1
  10. package/commonjs/DOM/VirtualScroller.js +60 -31
  11. package/commonjs/DOM/VirtualScroller.js.map +1 -1
  12. package/commonjs/DOM/tbody.js +9 -9
  13. package/commonjs/DOM/tbody.js.map +1 -1
  14. package/commonjs/Layout.js +3 -3
  15. package/commonjs/Layout.js.map +1 -1
  16. package/commonjs/Scroll.js +3 -3
  17. package/commonjs/Scroll.js.map +1 -1
  18. package/commonjs/ScrollableContainerResizeHandler.js +4 -5
  19. package/commonjs/ScrollableContainerResizeHandler.js.map +1 -1
  20. package/commonjs/VirtualScroller.constructor.js +15 -27
  21. package/commonjs/VirtualScroller.constructor.js.map +1 -1
  22. package/commonjs/VirtualScroller.js +21 -14
  23. package/commonjs/VirtualScroller.js.map +1 -1
  24. package/commonjs/VirtualScroller.layout.js +2 -2
  25. package/commonjs/VirtualScroller.layout.js.map +1 -1
  26. package/commonjs/VirtualScroller.onRender.js +1 -1
  27. package/commonjs/VirtualScroller.onRender.js.map +1 -1
  28. package/commonjs/VirtualScroller.state.js +8 -0
  29. package/commonjs/VirtualScroller.state.js.map +1 -1
  30. package/commonjs/react/VirtualScroller.js +15 -5
  31. package/commonjs/react/VirtualScroller.js.map +1 -1
  32. package/commonjs/react/useState.js +1 -2
  33. package/commonjs/react/useState.js.map +1 -1
  34. package/commonjs/react/useVirtualScroller.js +8 -11
  35. package/commonjs/react/useVirtualScroller.js.map +1 -1
  36. package/dom/index.d.ts +5 -4
  37. package/index.d.ts +0 -1
  38. package/modules/DOM/VirtualScroller.js +60 -31
  39. package/modules/DOM/VirtualScroller.js.map +1 -1
  40. package/modules/DOM/tbody.js +10 -9
  41. package/modules/DOM/tbody.js.map +1 -1
  42. package/modules/Layout.js +3 -3
  43. package/modules/Layout.js.map +1 -1
  44. package/modules/Scroll.js +3 -3
  45. package/modules/Scroll.js.map +1 -1
  46. package/modules/ScrollableContainerResizeHandler.js +4 -5
  47. package/modules/ScrollableContainerResizeHandler.js.map +1 -1
  48. package/modules/VirtualScroller.constructor.js +16 -27
  49. package/modules/VirtualScroller.constructor.js.map +1 -1
  50. package/modules/VirtualScroller.js +21 -14
  51. package/modules/VirtualScroller.js.map +1 -1
  52. package/modules/VirtualScroller.layout.js +2 -2
  53. package/modules/VirtualScroller.layout.js.map +1 -1
  54. package/modules/VirtualScroller.onRender.js +1 -1
  55. package/modules/VirtualScroller.onRender.js.map +1 -1
  56. package/modules/VirtualScroller.state.js +8 -0
  57. package/modules/VirtualScroller.state.js.map +1 -1
  58. package/modules/react/VirtualScroller.js +15 -5
  59. package/modules/react/VirtualScroller.js.map +1 -1
  60. package/modules/react/useState.js +1 -2
  61. package/modules/react/useState.js.map +1 -1
  62. package/modules/react/useVirtualScroller.js +6 -9
  63. package/modules/react/useVirtualScroller.js.map +1 -1
  64. package/package.json +2 -2
  65. package/source/DOM/VirtualScroller.js +58 -27
  66. package/source/DOM/tbody.js +10 -9
  67. package/source/Layout.js +3 -3
  68. package/source/Scroll.js +3 -3
  69. package/source/ScrollableContainerResizeHandler.js +4 -4
  70. package/source/VirtualScroller.constructor.js +13 -27
  71. package/source/VirtualScroller.js +26 -13
  72. package/source/VirtualScroller.layout.js +2 -2
  73. package/source/VirtualScroller.onRender.js +1 -1
  74. package/source/VirtualScroller.state.js +8 -0
  75. package/source/react/VirtualScroller.js +16 -4
  76. package/source/react/useState.js +1 -2
  77. package/source/react/useVirtualScroller.js +0 -3
@@ -13,7 +13,7 @@ var _debug = _interopRequireWildcard(require("../utility/debug.js"));
13
13
 
14
14
  var _px = _interopRequireDefault(require("../utility/px.js"));
15
15
 
16
- var _excluded = ["onMount", "onItemUnmount"];
16
+ var _excluded = ["onMount", "onItemUnmount", "readyToStart", "readyToRender"];
17
17
 
18
18
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
19
19
 
@@ -38,7 +38,7 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
38
38
  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; }
39
39
 
40
40
  var VirtualScroller = /*#__PURE__*/function () {
41
- function VirtualScroller(itemsContainerElement, _items, renderItem) {
41
+ function VirtualScroller(_itemsContainerElement, _items, renderItem) {
42
42
  var _this = this;
43
43
 
44
44
  var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
@@ -50,18 +50,25 @@ var VirtualScroller = /*#__PURE__*/function () {
50
50
  firstShownItemIndex = state.firstShownItemIndex,
51
51
  lastShownItemIndex = state.lastShownItemIndex,
52
52
  beforeItemsHeight = state.beforeItemsHeight,
53
- afterItemsHeight = state.afterItemsHeight; // log('~ On state change ~')
53
+ afterItemsHeight = state.afterItemsHeight;
54
+
55
+ var itemsContainerElement = _this.getItemsContainerElement(); // log('~ On state change ~')
54
56
  // log('Previous state', prevState)
55
57
  // log('New state', state)
56
- // Set container padding top and bottom.
57
- // Work around `<tbody/>` not being able to have `padding`.
58
+ // Set items container's padding-top and padding-bottom.
59
+ // But only do that for a non-`<tbody/>` item container
60
+ // because, strangely, CSS `padding` doesn't work on a `<tbody/>` element.
58
61
  // https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1
62
+ //
59
63
  // `this.virtualScroller` hasn't been initialized yet at this stage,
60
- // so using `this.tbody` instead of `this.virtualScroller.tbody`.
64
+ // so this code can't use `this.virtualScroller.isItemsContainerElementTableBody()` function yet.
65
+ // Instead, it uses its own method of detecting the use of a `<tbody/>` container.
66
+ //
67
+
61
68
 
62
- if (!_this.tbody) {
63
- _this.container.style.paddingTop = (0, _px["default"])(beforeItemsHeight);
64
- _this.container.style.paddingBottom = (0, _px["default"])(afterItemsHeight);
69
+ if (!_this.virtualScroller.isItemsContainerElementTableBody()) {
70
+ itemsContainerElement.style.paddingTop = (0, _px["default"])(beforeItemsHeight);
71
+ itemsContainerElement.style.paddingBottom = (0, _px["default"])(afterItemsHeight);
65
72
  } // Perform an intelligent "diff" re-render if the `items` are the same.
66
73
 
67
74
 
@@ -69,7 +76,7 @@ var VirtualScroller = /*#__PURE__*/function () {
69
76
 
70
77
  if (diffRender) {
71
78
  // Decrement instead of increment here because
72
- // `this.container.removeChild()` changes indexes.
79
+ // `itemsContainerElement.removeChild()` changes indexes.
73
80
  var _i = prevState.lastShownItemIndex;
74
81
 
75
82
  while (_i >= prevState.firstShownItemIndex) {
@@ -77,7 +84,7 @@ var VirtualScroller = /*#__PURE__*/function () {
77
84
  } else {
78
85
  (0, _debug["default"])('DOM: Remove element for item index', _i); // The item is no longer visible. Remove it.
79
86
 
80
- _this.unmountItem(_this.container.childNodes[_i - prevState.firstShownItemIndex]);
87
+ _this.unmountItem(itemsContainerElement.childNodes[_i - prevState.firstShownItemIndex]);
81
88
  }
82
89
 
83
90
  _i--;
@@ -85,14 +92,14 @@ var VirtualScroller = /*#__PURE__*/function () {
85
92
  } else {
86
93
  (0, _debug["default"])('DOM: Rerender the list from scratch');
87
94
 
88
- while (_this.container.firstChild) {
89
- _this.unmountItem(_this.container.firstChild);
95
+ while (itemsContainerElement.firstChild) {
96
+ _this.unmountItem(itemsContainerElement.firstChild);
90
97
  }
91
98
  } // Add newly visible items to the DOM.
92
99
 
93
100
 
94
101
  var shouldPrependItems = diffRender;
95
- var prependBeforeItemElement = shouldPrependItems && _this.container.firstChild;
102
+ var prependBeforeItemElement = shouldPrependItems && itemsContainerElement.firstChild;
96
103
  var i = firstShownItemIndex;
97
104
 
98
105
  while (i <= lastShownItemIndex) {
@@ -106,17 +113,30 @@ var VirtualScroller = /*#__PURE__*/function () {
106
113
  var item = _this.renderItem(items[i]);
107
114
 
108
115
  if (shouldPrependItems) {
109
- (0, _debug["default"])('DOM: Prepend element for item index', i); // Append `item` to `this.container` before the retained items.
116
+ (0, _debug["default"])('DOM: Prepend element for item index', i); // Append `item` to `itemsContainerElement` before the retained items.
110
117
 
111
- _this.container.insertBefore(item, prependBeforeItemElement);
118
+ itemsContainerElement.insertBefore(item, prependBeforeItemElement);
112
119
  } else {
113
- (0, _debug["default"])('DOM: Append element for item index', i); // Append `item` to `this.container`.
120
+ (0, _debug["default"])('DOM: Append element for item index', i); // Append `item` to `itemsContainerElement`.
114
121
 
115
- _this.container.appendChild(item);
122
+ itemsContainerElement.appendChild(item);
116
123
  }
117
124
  }
118
125
 
119
126
  i++;
127
+ } // Call `onMount()` function when the list has rendered for the first time.
128
+ //
129
+ // `onMount()` option is deprecated due to no longer being used.
130
+ // If someone thinks there's a valid use case for it, create an issue.
131
+ //
132
+
133
+
134
+ if (!_this._isMounted) {
135
+ _this._isMounted = true;
136
+
137
+ if (_this._onMount) {
138
+ _this._onMount();
139
+ }
120
140
  }
121
141
  });
122
142
 
@@ -140,33 +160,42 @@ var VirtualScroller = /*#__PURE__*/function () {
140
160
  _this.virtualScroller.start();
141
161
  });
142
162
 
143
- this.container = itemsContainerElement;
163
+ this.getItemsContainerElement = typeof _itemsContainerElement === 'function' ? _itemsContainerElement : function () {
164
+ return _itemsContainerElement;
165
+ };
144
166
  this.renderItem = renderItem;
145
167
 
146
168
  var onMount = options.onMount,
147
169
  onItemUnmount = options.onItemUnmount,
148
- restOptions = _objectWithoutProperties(options, _excluded);
170
+ readyToStart = options.readyToStart,
171
+ readyToRender = options.readyToRender,
172
+ restOptions = _objectWithoutProperties(options, _excluded); // `onMount()` option is deprecated due to no longer being used.
173
+ // If someone thinks there's a valid use case for it, create an issue.
149
174
 
175
+
176
+ this._onMount = onMount;
150
177
  this.onItemUnmount = onItemUnmount;
151
- this.tbody = this.container.tagName === 'TBODY';
152
- this.virtualScroller = new _VirtualScroller["default"](function () {
153
- return _this.container;
154
- }, _items, _objectSpread(_objectSpread({}, restOptions), {}, {
155
- render: this.render,
156
- tbody: this.tbody
178
+ this.virtualScroller = new _VirtualScroller["default"](this.getItemsContainerElement, _items, _objectSpread(_objectSpread({}, restOptions), {}, {
179
+ render: this.render
157
180
  }));
158
- this.start(); // `onMount()` option is deprecated due to no longer being used.
159
- // If someone thinks there's a valid use case for it, create an issue.
160
181
 
161
- if (onMount) {
162
- onMount();
182
+ if (readyToRender === false) {// Don't automatically perform the initial render of the list.
183
+ // This means that neither `this.render()` nor `this.start()` methods should be called.
184
+ } else if (readyToStart === false) {
185
+ // Don't automatically call the `.start()` method of the "core" component.
186
+ // Still, perform the initial render of the list.
187
+ this.render(this.virtualScroller.getInitialState());
188
+ } else {
189
+ // Calls the `.start()` method of the "core" component.
190
+ // It performs the initial render of the list and starts listening to scroll events.
191
+ this.start();
163
192
  }
164
193
  }
165
194
 
166
195
  _createClass(VirtualScroller, [{
167
196
  key: "unmountItem",
168
197
  value: function unmountItem(itemElement) {
169
- this.container.removeChild(itemElement);
198
+ this.getItemsContainerElement().removeChild(itemElement);
170
199
 
171
200
  if (this.onItemUnmount) {
172
201
  this.onItemUnmount(itemElement);
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualScroller.js","names":["VirtualScroller","itemsContainerElement","items","renderItem","options","state","prevState","firstShownItemIndex","lastShownItemIndex","beforeItemsHeight","afterItemsHeight","tbody","container","style","paddingTop","px","paddingBottom","diffRender","length","i","log","unmountItem","childNodes","firstChild","shouldPrependItems","prependBeforeItemElement","item","insertBefore","appendChild","warn","stop","virtualScroller","start","onMount","onItemUnmount","restOptions","tagName","VirtualScrollerCore","render","itemElement","removeChild","onItemHeightDidChange","newState","setItemState","newItems","setItems"],"sources":["../../source/DOM/VirtualScroller.js"],"sourcesContent":["import VirtualScrollerCore from '../VirtualScroller.js'\r\n\r\nimport log, { warn } from '../utility/debug.js'\r\nimport px from '../utility/px.js'\r\n\r\nexport default class VirtualScroller {\r\n constructor(itemsContainerElement, items, renderItem, options = {}) {\r\n this.container = itemsContainerElement\r\n this.renderItem = renderItem\r\n\r\n const {\r\n onMount,\r\n onItemUnmount,\r\n ...restOptions\r\n } = options\r\n\r\n this.onItemUnmount = onItemUnmount\r\n this.tbody = this.container.tagName === 'TBODY'\r\n\r\n this.virtualScroller = new VirtualScrollerCore(\r\n () => this.container,\r\n items,\r\n {\r\n ...restOptions,\r\n render: this.render,\r\n tbody: this.tbody\r\n }\r\n )\r\n\r\n this.start()\r\n\r\n // `onMount()` option is deprecated due to no longer being used.\r\n // If someone thinks there's a valid use case for it, create an issue.\r\n if (onMount) {\r\n onMount()\r\n }\r\n }\r\n\r\n render = (state, prevState) => {\r\n const {\r\n items,\r\n firstShownItemIndex,\r\n lastShownItemIndex,\r\n beforeItemsHeight,\r\n afterItemsHeight\r\n } = state\r\n\r\n // log('~ On state change ~')\r\n // log('Previous state', prevState)\r\n // log('New state', state)\r\n\r\n // Set container padding top and bottom.\r\n // Work around `<tbody/>` not being able to have `padding`.\r\n // https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n // `this.virtualScroller` hasn't been initialized yet at this stage,\r\n // so using `this.tbody` instead of `this.virtualScroller.tbody`.\r\n if (!this.tbody) {\r\n this.container.style.paddingTop = px(beforeItemsHeight)\r\n this.container.style.paddingBottom = px(afterItemsHeight)\r\n }\r\n\r\n // Perform an intelligent \"diff\" re-render if the `items` are the same.\r\n const diffRender = prevState && items === prevState.items && items.length > 0\r\n // Remove no longer visible items from the DOM.\r\n if (diffRender) {\r\n // Decrement instead of increment here because\r\n // `this.container.removeChild()` changes indexes.\r\n let i = prevState.lastShownItemIndex\r\n while (i >= prevState.firstShownItemIndex) {\r\n if (i >= firstShownItemIndex && i <= lastShownItemIndex) {\r\n // The item is still visible.\r\n } else {\r\n log('DOM: Remove element for item index', i)\r\n // The item is no longer visible. Remove it.\r\n this.unmountItem(this.container.childNodes[i - prevState.firstShownItemIndex])\r\n }\r\n i--\r\n }\r\n } else {\r\n log('DOM: Rerender the list from scratch')\r\n while (this.container.firstChild) {\r\n this.unmountItem(this.container.firstChild)\r\n }\r\n }\r\n\r\n // Add newly visible items to the DOM.\r\n let shouldPrependItems = diffRender\r\n const prependBeforeItemElement = shouldPrependItems && this.container.firstChild\r\n let i = firstShownItemIndex\r\n while (i <= lastShownItemIndex) {\r\n if (diffRender && i >= prevState.firstShownItemIndex && i <= prevState.lastShownItemIndex) {\r\n // The item is already being rendered.\r\n // Next items will be appended rather than prepended.\r\n if (shouldPrependItems) {\r\n shouldPrependItems = false\r\n }\r\n } else {\r\n const item = this.renderItem(items[i])\r\n if (shouldPrependItems) {\r\n log('DOM: Prepend element for item index', i)\r\n // Append `item` to `this.container` before the retained items.\r\n this.container.insertBefore(item, prependBeforeItemElement)\r\n } else {\r\n log('DOM: Append element for item index', i)\r\n // Append `item` to `this.container`.\r\n this.container.appendChild(item)\r\n }\r\n }\r\n i++\r\n }\r\n }\r\n\r\n // Public API. Should be \"bound\" to `this`.\r\n onUnmount = () => {\r\n warn('`.onUnmount()` instance method name is deprecated, use `.stop()` instance method name instead.')\r\n this.stop()\r\n }\r\n\r\n // Public API. Should be \"bound\" to `this`.\r\n destroy = () => {\r\n warn('`.destroy()` instance method name is deprecated, use `.stop()` instance method name instead.')\r\n this.stop()\r\n }\r\n\r\n // Public API.\r\n // Should be \"bound\" to `this`.\r\n stop = () => {\r\n this.virtualScroller.stop()\r\n }\r\n\r\n // Potentially public API in some hypothetical scenario.\r\n // Should be \"bound\" to `this`.\r\n start = () => {\r\n this.virtualScroller.start()\r\n }\r\n\r\n unmountItem(itemElement) {\r\n this.container.removeChild(itemElement)\r\n if (this.onItemUnmount) {\r\n this.onItemUnmount(itemElement)\r\n }\r\n }\r\n\r\n /**\r\n * @deprecated\r\n * `.onItemHeightChange()` has been renamed to `.onItemHeightDidChange()`.\r\n */\r\n onItemHeightChange(i) {\r\n warn('`.onItemHeightChange(i)` method was renamed to `.onItemHeightDidChange(i)`')\r\n this.onItemHeightDidChange(i)\r\n }\r\n\r\n onItemHeightDidChange(i) {\r\n this.virtualScroller.onItemHeightDidChange(i)\r\n }\r\n\r\n setItemState(i, newState) {\r\n this.virtualScroller.setItemState(i, newState)\r\n }\r\n\r\n /**\r\n * @deprecated\r\n * `.updateItems()` has been renamed to `.setItems()`.\r\n */\r\n updateItems(newItems, options) {\r\n warn('`.updateItems()` method was renamed to `.setItems(i)`')\r\n this.setItems(newItems, options)\r\n }\r\n\r\n setItems(newItems, options) {\r\n this.virtualScroller.setItems(newItems, options)\r\n }\r\n\r\n /*\r\n getItemCoordinates(i) {\r\n return this.virtualScroller.getItemCoordinates(i)\r\n }\r\n */\r\n}"],"mappings":";;;;;;;;;AAAA;;AAEA;;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;IAEqBA,e;EACnB,yBAAYC,qBAAZ,EAAmCC,MAAnC,EAA0CC,UAA1C,EAAoE;IAAA;;IAAA,IAAdC,OAAc,uEAAJ,EAAI;;IAAA;;IAAA,gCAgC3D,UAACC,KAAD,EAAQC,SAAR,EAAsB;MAC7B,IACEJ,KADF,GAMIG,KANJ,CACEH,KADF;MAAA,IAEEK,mBAFF,GAMIF,KANJ,CAEEE,mBAFF;MAAA,IAGEC,kBAHF,GAMIH,KANJ,CAGEG,kBAHF;MAAA,IAIEC,iBAJF,GAMIJ,KANJ,CAIEI,iBAJF;MAAA,IAKEC,gBALF,GAMIL,KANJ,CAKEK,gBALF,CAD6B,CAS7B;MACA;MACA;MAEA;MACA;MACA;MACA;MACA;;MACA,IAAI,CAAC,KAAI,CAACC,KAAV,EAAiB;QACf,KAAI,CAACC,SAAL,CAAeC,KAAf,CAAqBC,UAArB,GAAkC,IAAAC,cAAA,EAAGN,iBAAH,CAAlC;QACA,KAAI,CAACG,SAAL,CAAeC,KAAf,CAAqBG,aAArB,GAAqC,IAAAD,cAAA,EAAGL,gBAAH,CAArC;MACD,CArB4B,CAuB7B;;;MACA,IAAMO,UAAU,GAAGX,SAAS,IAAIJ,KAAK,KAAKI,SAAS,CAACJ,KAAjC,IAA0CA,KAAK,CAACgB,MAAN,GAAe,CAA5E,CAxB6B,CAyB7B;;MACA,IAAID,UAAJ,EAAgB;QACd;QACA;QACA,IAAIE,EAAC,GAAGb,SAAS,CAACE,kBAAlB;;QACA,OAAOW,EAAC,IAAIb,SAAS,CAACC,mBAAtB,EAA2C;UACzC,IAAIY,EAAC,IAAIZ,mBAAL,IAA4BY,EAAC,IAAIX,kBAArC,EAAyD,CACvD;UACD,CAFD,MAEO;YACL,IAAAY,iBAAA,EAAI,oCAAJ,EAA0CD,EAA1C,EADK,CAEL;;YACA,KAAI,CAACE,WAAL,CAAiB,KAAI,CAACT,SAAL,CAAeU,UAAf,CAA0BH,EAAC,GAAGb,SAAS,CAACC,mBAAxC,CAAjB;UACD;;UACDY,EAAC;QACF;MACF,CAdD,MAcO;QACL,IAAAC,iBAAA,EAAI,qCAAJ;;QACA,OAAO,KAAI,CAACR,SAAL,CAAeW,UAAtB,EAAkC;UAChC,KAAI,CAACF,WAAL,CAAiB,KAAI,CAACT,SAAL,CAAeW,UAAhC;QACD;MACF,CA7C4B,CA+C7B;;;MACA,IAAIC,kBAAkB,GAAGP,UAAzB;MACA,IAAMQ,wBAAwB,GAAGD,kBAAkB,IAAI,KAAI,CAACZ,SAAL,CAAeW,UAAtE;MACA,IAAIJ,CAAC,GAAGZ,mBAAR;;MACA,OAAOY,CAAC,IAAIX,kBAAZ,EAAgC;QAC9B,IAAIS,UAAU,IAAIE,CAAC,IAAIb,SAAS,CAACC,mBAA7B,IAAoDY,CAAC,IAAIb,SAAS,CAACE,kBAAvE,EAA2F;UACzF;UACA;UACA,IAAIgB,kBAAJ,EAAwB;YACtBA,kBAAkB,GAAG,KAArB;UACD;QACF,CAND,MAMO;UACL,IAAME,IAAI,GAAG,KAAI,CAACvB,UAAL,CAAgBD,KAAK,CAACiB,CAAD,CAArB,CAAb;;UACA,IAAIK,kBAAJ,EAAwB;YACtB,IAAAJ,iBAAA,EAAI,qCAAJ,EAA2CD,CAA3C,EADsB,CAEtB;;YACA,KAAI,CAACP,SAAL,CAAee,YAAf,CAA4BD,IAA5B,EAAkCD,wBAAlC;UACD,CAJD,MAIO;YACL,IAAAL,iBAAA,EAAI,oCAAJ,EAA0CD,CAA1C,EADK,CAEL;;YACA,KAAI,CAACP,SAAL,CAAegB,WAAf,CAA2BF,IAA3B;UACD;QACF;;QACDP,CAAC;MACF;IACF,CAxGmE;;IAAA,mCA2GxD,YAAM;MAChB,IAAAU,WAAA,EAAK,gGAAL;;MACA,KAAI,CAACC,IAAL;IACD,CA9GmE;;IAAA,iCAiH1D,YAAM;MACd,IAAAD,WAAA,EAAK,8FAAL;;MACA,KAAI,CAACC,IAAL;IACD,CApHmE;;IAAA,8BAwH7D,YAAM;MACX,KAAI,CAACC,eAAL,CAAqBD,IAArB;IACD,CA1HmE;;IAAA,+BA8H5D,YAAM;MACZ,KAAI,CAACC,eAAL,CAAqBC,KAArB;IACD,CAhImE;;IAClE,KAAKpB,SAAL,GAAiBX,qBAAjB;IACA,KAAKE,UAAL,GAAkBA,UAAlB;;IAEA,IACE8B,OADF,GAII7B,OAJJ,CACE6B,OADF;IAAA,IAEEC,aAFF,GAII9B,OAJJ,CAEE8B,aAFF;IAAA,IAGKC,WAHL,4BAII/B,OAJJ;;IAMA,KAAK8B,aAAL,GAAqBA,aAArB;IACA,KAAKvB,KAAL,GAAa,KAAKC,SAAL,CAAewB,OAAf,KAA2B,OAAxC;IAEA,KAAKL,eAAL,GAAuB,IAAIM,2BAAJ,CACrB;MAAA,OAAM,KAAI,CAACzB,SAAX;IAAA,CADqB,EAErBV,MAFqB,kCAIhBiC,WAJgB;MAKnBG,MAAM,EAAE,KAAKA,MALM;MAMnB3B,KAAK,EAAE,KAAKA;IANO,GAAvB;IAUA,KAAKqB,KAAL,GAvBkE,CAyBlE;IACA;;IACA,IAAIC,OAAJ,EAAa;MACXA,OAAO;IACR;EACF;;;;WAoGD,qBAAYM,WAAZ,EAAyB;MACvB,KAAK3B,SAAL,CAAe4B,WAAf,CAA2BD,WAA3B;;MACA,IAAI,KAAKL,aAAT,EAAwB;QACtB,KAAKA,aAAL,CAAmBK,WAAnB;MACD;IACF;IAED;AACF;AACA;AACA;;;;WACE,4BAAmBpB,CAAnB,EAAsB;MACpB,IAAAU,WAAA,EAAK,4EAAL;MACA,KAAKY,qBAAL,CAA2BtB,CAA3B;IACD;;;WAED,+BAAsBA,CAAtB,EAAyB;MACvB,KAAKY,eAAL,CAAqBU,qBAArB,CAA2CtB,CAA3C;IACD;;;WAED,sBAAaA,CAAb,EAAgBuB,QAAhB,EAA0B;MACxB,KAAKX,eAAL,CAAqBY,YAArB,CAAkCxB,CAAlC,EAAqCuB,QAArC;IACD;IAED;AACF;AACA;AACA;;;;WACE,qBAAYE,QAAZ,EAAsBxC,OAAtB,EAA+B;MAC7B,IAAAyB,WAAA,EAAK,uDAAL;MACA,KAAKgB,QAAL,CAAcD,QAAd,EAAwBxC,OAAxB;IACD;;;WAED,kBAASwC,QAAT,EAAmBxC,OAAnB,EAA4B;MAC1B,KAAK2B,eAAL,CAAqBc,QAArB,CAA8BD,QAA9B,EAAwCxC,OAAxC;IACD;IAED;AACF;AACA;AACA;AACA"}
1
+ {"version":3,"file":"VirtualScroller.js","names":["VirtualScroller","itemsContainerElement","items","renderItem","options","state","prevState","firstShownItemIndex","lastShownItemIndex","beforeItemsHeight","afterItemsHeight","getItemsContainerElement","virtualScroller","isItemsContainerElementTableBody","style","paddingTop","px","paddingBottom","diffRender","length","i","log","unmountItem","childNodes","firstChild","shouldPrependItems","prependBeforeItemElement","item","insertBefore","appendChild","_isMounted","_onMount","warn","stop","start","onMount","onItemUnmount","readyToStart","readyToRender","restOptions","VirtualScrollerCore","render","getInitialState","itemElement","removeChild","onItemHeightDidChange","newState","setItemState","newItems","setItems"],"sources":["../../source/DOM/VirtualScroller.js"],"sourcesContent":["import VirtualScrollerCore from '../VirtualScroller.js'\r\n\r\nimport log, { warn } from '../utility/debug.js'\r\nimport px from '../utility/px.js'\r\n\r\nexport default class VirtualScroller {\r\n constructor(itemsContainerElement, items, renderItem, options = {}) {\r\n this.getItemsContainerElement = typeof itemsContainerElement === 'function'\r\n ? itemsContainerElement\r\n : () => itemsContainerElement\r\n\r\n this.renderItem = renderItem\r\n\r\n const {\r\n onMount,\r\n onItemUnmount,\r\n readyToStart,\r\n readyToRender,\r\n ...restOptions\r\n } = options\r\n\r\n // `onMount()` option is deprecated due to no longer being used.\r\n // If someone thinks there's a valid use case for it, create an issue.\r\n this._onMount = onMount\r\n\r\n this.onItemUnmount = onItemUnmount\r\n\r\n this.virtualScroller = new VirtualScrollerCore(\r\n this.getItemsContainerElement,\r\n items,\r\n {\r\n ...restOptions,\r\n render: this.render\r\n }\r\n )\r\n\r\n if (readyToRender === false) {\r\n // Don't automatically perform the initial render of the list.\r\n // This means that neither `this.render()` nor `this.start()` methods should be called.\r\n } else if (readyToStart === false) {\r\n // Don't automatically call the `.start()` method of the \"core\" component.\r\n // Still, perform the initial render of the list.\r\n this.render(this.virtualScroller.getInitialState())\r\n } else {\r\n // Calls the `.start()` method of the \"core\" component.\r\n // It performs the initial render of the list and starts listening to scroll events.\r\n this.start()\r\n }\r\n }\r\n\r\n render = (state, prevState) => {\r\n const {\r\n items,\r\n firstShownItemIndex,\r\n lastShownItemIndex,\r\n beforeItemsHeight,\r\n afterItemsHeight\r\n } = state\r\n\r\n const itemsContainerElement = this.getItemsContainerElement()\r\n\r\n // log('~ On state change ~')\r\n // log('Previous state', prevState)\r\n // log('New state', state)\r\n\r\n // Set items container's padding-top and padding-bottom.\r\n // But only do that for a non-`<tbody/>` item container\r\n // because, strangely, CSS `padding` doesn't work on a `<tbody/>` element.\r\n // https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n //\r\n // `this.virtualScroller` hasn't been initialized yet at this stage,\r\n // so this code can't use `this.virtualScroller.isItemsContainerElementTableBody()` function yet.\r\n // Instead, it uses its own method of detecting the use of a `<tbody/>` container.\r\n //\r\n if (!this.virtualScroller.isItemsContainerElementTableBody()) {\r\n itemsContainerElement.style.paddingTop = px(beforeItemsHeight)\r\n itemsContainerElement.style.paddingBottom = px(afterItemsHeight)\r\n }\r\n\r\n // Perform an intelligent \"diff\" re-render if the `items` are the same.\r\n const diffRender = prevState && items === prevState.items && items.length > 0\r\n // Remove no longer visible items from the DOM.\r\n if (diffRender) {\r\n // Decrement instead of increment here because\r\n // `itemsContainerElement.removeChild()` changes indexes.\r\n let i = prevState.lastShownItemIndex\r\n while (i >= prevState.firstShownItemIndex) {\r\n if (i >= firstShownItemIndex && i <= lastShownItemIndex) {\r\n // The item is still visible.\r\n } else {\r\n log('DOM: Remove element for item index', i)\r\n // The item is no longer visible. Remove it.\r\n this.unmountItem(itemsContainerElement.childNodes[i - prevState.firstShownItemIndex])\r\n }\r\n i--\r\n }\r\n } else {\r\n log('DOM: Rerender the list from scratch')\r\n while (itemsContainerElement.firstChild) {\r\n this.unmountItem(itemsContainerElement.firstChild)\r\n }\r\n }\r\n\r\n // Add newly visible items to the DOM.\r\n let shouldPrependItems = diffRender\r\n const prependBeforeItemElement = shouldPrependItems && itemsContainerElement.firstChild\r\n let i = firstShownItemIndex\r\n while (i <= lastShownItemIndex) {\r\n if (diffRender && i >= prevState.firstShownItemIndex && i <= prevState.lastShownItemIndex) {\r\n // The item is already being rendered.\r\n // Next items will be appended rather than prepended.\r\n if (shouldPrependItems) {\r\n shouldPrependItems = false\r\n }\r\n } else {\r\n const item = this.renderItem(items[i])\r\n if (shouldPrependItems) {\r\n log('DOM: Prepend element for item index', i)\r\n // Append `item` to `itemsContainerElement` before the retained items.\r\n itemsContainerElement.insertBefore(item, prependBeforeItemElement)\r\n } else {\r\n log('DOM: Append element for item index', i)\r\n // Append `item` to `itemsContainerElement`.\r\n itemsContainerElement.appendChild(item)\r\n }\r\n }\r\n i++\r\n }\r\n\r\n // Call `onMount()` function when the list has rendered for the first time.\r\n //\r\n // `onMount()` option is deprecated due to no longer being used.\r\n // If someone thinks there's a valid use case for it, create an issue.\r\n //\r\n if (!this._isMounted) {\r\n this._isMounted = true\r\n if (this._onMount) {\r\n this._onMount()\r\n }\r\n }\r\n }\r\n\r\n // Public API. Should be \"bound\" to `this`.\r\n onUnmount = () => {\r\n warn('`.onUnmount()` instance method name is deprecated, use `.stop()` instance method name instead.')\r\n this.stop()\r\n }\r\n\r\n // Public API. Should be \"bound\" to `this`.\r\n destroy = () => {\r\n warn('`.destroy()` instance method name is deprecated, use `.stop()` instance method name instead.')\r\n this.stop()\r\n }\r\n\r\n // Public API.\r\n // Should be \"bound\" to `this`.\r\n stop = () => {\r\n this.virtualScroller.stop()\r\n }\r\n\r\n // Potentially public API in some hypothetical scenario.\r\n // Should be \"bound\" to `this`.\r\n start = () => {\r\n this.virtualScroller.start()\r\n }\r\n\r\n unmountItem(itemElement) {\r\n this.getItemsContainerElement().removeChild(itemElement)\r\n\r\n if (this.onItemUnmount) {\r\n this.onItemUnmount(itemElement)\r\n }\r\n }\r\n\r\n /**\r\n * @deprecated\r\n * `.onItemHeightChange()` has been renamed to `.onItemHeightDidChange()`.\r\n */\r\n onItemHeightChange(i) {\r\n warn('`.onItemHeightChange(i)` method was renamed to `.onItemHeightDidChange(i)`')\r\n this.onItemHeightDidChange(i)\r\n }\r\n\r\n onItemHeightDidChange(i) {\r\n this.virtualScroller.onItemHeightDidChange(i)\r\n }\r\n\r\n setItemState(i, newState) {\r\n this.virtualScroller.setItemState(i, newState)\r\n }\r\n\r\n /**\r\n * @deprecated\r\n * `.updateItems()` has been renamed to `.setItems()`.\r\n */\r\n updateItems(newItems, options) {\r\n warn('`.updateItems()` method was renamed to `.setItems(i)`')\r\n this.setItems(newItems, options)\r\n }\r\n\r\n setItems(newItems, options) {\r\n this.virtualScroller.setItems(newItems, options)\r\n }\r\n\r\n /*\r\n getItemCoordinates(i) {\r\n return this.virtualScroller.getItemCoordinates(i)\r\n }\r\n */\r\n}"],"mappings":"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"}
@@ -18,18 +18,18 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "d
18
18
  var BROWSER_NOT_SUPPORTED_ERROR = 'It looks like you\'re using Internet Explorer which doesn\'t support CSS variables required for a <tbody/> container. VirtualScroller has been switched into "bypass" mode (render all items). See: https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1';
19
19
  exports.BROWSER_NOT_SUPPORTED_ERROR = BROWSER_NOT_SUPPORTED_ERROR;
20
20
 
21
- function supportsTbody() {
22
- // Detect Internet Explorer.
21
+ function isInternetExplorer() {
22
+ // This function detects Internet Explorer using `documentMode` IE-only property.
23
23
  // https://stackoverflow.com/questions/19999388/check-if-user-is-using-ie
24
- // `documentMode` is an IE-only property.
25
- // Supports IE 9-11. Maybe even IE 8.
24
+ // The `documentMode` property exists in IE 9-11. Maybe even IE 8.
26
25
  // http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
27
- if (typeof window !== 'undefined' && window.document.documentMode) {
28
- // CSS variables aren't supported in Internet Explorer.
29
- return false;
30
- }
26
+ return typeof window !== 'undefined' && Boolean(window.document.documentMode);
27
+ }
31
28
 
32
- return true;
29
+ function supportsTbody() {
30
+ // Internet Explorer doesn't support CSS Variables
31
+ // and therefore it will not be able to apply the `<tbody/>` workaround.
32
+ return !isInternetExplorer();
33
33
  }
34
34
 
35
35
  var TBODY_CLASS_NAME = 'VirtualScroller';
@@ -1 +1 @@
1
- {"version":3,"file":"tbody.js","names":["BROWSER_NOT_SUPPORTED_ERROR","supportsTbody","window","document","documentMode","TBODY_CLASS_NAME","STYLE_ELEMENT_ID","hasTbodyStyles","tbody","classList","contains","Boolean","getElementById","addTbodyStyles","add","style","createElement","id","innerText","replace","head","appendChild","setTbodyPadding","beforeItemsHeight","afterItemsHeight","setProperty","px"],"sources":["../../source/DOM/tbody.js"],"sourcesContent":["// A workaround for `<tbody/>` not being able to have `padding`.\r\n// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n\r\nimport px from '../utility/px.js'\r\n\r\nexport const BROWSER_NOT_SUPPORTED_ERROR = 'It looks like you\\'re using Internet Explorer which doesn\\'t support CSS variables required for a <tbody/> container. VirtualScroller has been switched into \"bypass\" mode (render all items). See: https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1'\r\n\r\nexport function supportsTbody() {\r\n\t// Detect Internet Explorer.\r\n\t// https://stackoverflow.com/questions/19999388/check-if-user-is-using-ie\r\n\t// `documentMode` is an IE-only property.\r\n\t// Supports IE 9-11. Maybe even IE 8.\r\n\t// http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx\r\n\tif (typeof window !== 'undefined' && window.document.documentMode) {\r\n\t\t// CSS variables aren't supported in Internet Explorer.\r\n\t\treturn false\r\n\t}\r\n\treturn true\r\n}\r\n\r\nexport const TBODY_CLASS_NAME = 'VirtualScroller'\r\nconst STYLE_ELEMENT_ID = 'VirtualScrollerStyle'\r\n\r\nexport function hasTbodyStyles(tbody) {\r\n\treturn tbody.classList.contains(TBODY_CLASS_NAME) &&\r\n\t\tBoolean(document.getElementById(STYLE_ELEMENT_ID))\r\n}\r\n\r\nexport function addTbodyStyles(tbody) {\r\n\t// `classList.add` is supported in Internet Explorer 10+.\r\n\ttbody.classList.add(TBODY_CLASS_NAME)\r\n\r\n\t// Create a `<style/>` element.\r\n\tconst style = document.createElement('style')\r\n\tstyle.id = STYLE_ELEMENT_ID\r\n\r\n\t// CSS variables aren't supported in Internet Explorer.\r\n\tstyle.innerText = `\r\n\t\ttbody.${TBODY_CLASS_NAME}:before {\r\n\t\t\tcontent: '';\r\n\t\t\tdisplay: table-row;\r\n\t\t\theight: var(--VirtualScroller-paddingTop);\r\n\t\t}\r\n\t\ttbody.${TBODY_CLASS_NAME}:after {\r\n\t\t\tcontent: '';\r\n\t\t\tdisplay: table-row;\r\n\t\t\theight: var(--VirtualScroller-paddingBottom);\r\n\t\t}\r\n\t`.replace(/[\\n\\t]/g, '')\r\n\r\n\tdocument.head.appendChild(style)\r\n}\r\n\r\nexport function setTbodyPadding(tbody, beforeItemsHeight, afterItemsHeight) {\r\n\t// CSS variables aren't supported in Internet Explorer.\r\n\ttbody.style.setProperty('--VirtualScroller-paddingTop', px(beforeItemsHeight));\r\n\ttbody.style.setProperty('--VirtualScroller-paddingBottom', px(afterItemsHeight));\r\n}"],"mappings":";;;;;;;;;;;AAGA;;;;AAHA;AACA;AAIO,IAAMA,2BAA2B,GAAG,mQAApC;;;AAEA,SAASC,aAAT,GAAyB;EAC/B;EACA;EACA;EACA;EACA;EACA,IAAI,OAAOC,MAAP,KAAkB,WAAlB,IAAiCA,MAAM,CAACC,QAAP,CAAgBC,YAArD,EAAmE;IAClE;IACA,OAAO,KAAP;EACA;;EACD,OAAO,IAAP;AACA;;AAEM,IAAMC,gBAAgB,GAAG,iBAAzB;;AACP,IAAMC,gBAAgB,GAAG,sBAAzB;;AAEO,SAASC,cAAT,CAAwBC,KAAxB,EAA+B;EACrC,OAAOA,KAAK,CAACC,SAAN,CAAgBC,QAAhB,CAAyBL,gBAAzB,KACNM,OAAO,CAACR,QAAQ,CAACS,cAAT,CAAwBN,gBAAxB,CAAD,CADR;AAEA;;AAEM,SAASO,cAAT,CAAwBL,KAAxB,EAA+B;EACrC;EACAA,KAAK,CAACC,SAAN,CAAgBK,GAAhB,CAAoBT,gBAApB,EAFqC,CAIrC;;EACA,IAAMU,KAAK,GAAGZ,QAAQ,CAACa,aAAT,CAAuB,OAAvB,CAAd;EACAD,KAAK,CAACE,EAAN,GAAWX,gBAAX,CANqC,CAQrC;;EACAS,KAAK,CAACG,SAAN,GAAkB,sBACTb,gBADS,0IAMTA,gBANS,6HAWhBc,OAXgB,CAWR,SAXQ,EAWG,EAXH,CAAlB;EAaAhB,QAAQ,CAACiB,IAAT,CAAcC,WAAd,CAA0BN,KAA1B;AACA;;AAEM,SAASO,eAAT,CAAyBd,KAAzB,EAAgCe,iBAAhC,EAAmDC,gBAAnD,EAAqE;EAC3E;EACAhB,KAAK,CAACO,KAAN,CAAYU,WAAZ,CAAwB,8BAAxB,EAAwD,IAAAC,cAAA,EAAGH,iBAAH,CAAxD;EACAf,KAAK,CAACO,KAAN,CAAYU,WAAZ,CAAwB,iCAAxB,EAA2D,IAAAC,cAAA,EAAGF,gBAAH,CAA3D;AACA"}
1
+ {"version":3,"file":"tbody.js","names":["BROWSER_NOT_SUPPORTED_ERROR","isInternetExplorer","window","Boolean","document","documentMode","supportsTbody","TBODY_CLASS_NAME","STYLE_ELEMENT_ID","hasTbodyStyles","tbody","classList","contains","getElementById","addTbodyStyles","add","style","createElement","id","innerText","replace","head","appendChild","setTbodyPadding","beforeItemsHeight","afterItemsHeight","setProperty","px"],"sources":["../../source/DOM/tbody.js"],"sourcesContent":["// A workaround for `<tbody/>` not being able to have `padding`.\r\n// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n\r\nimport px from '../utility/px.js'\r\n\r\nexport const BROWSER_NOT_SUPPORTED_ERROR = 'It looks like you\\'re using Internet Explorer which doesn\\'t support CSS variables required for a <tbody/> container. VirtualScroller has been switched into \"bypass\" mode (render all items). See: https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1'\r\n\r\nfunction isInternetExplorer() {\r\n\t// This function detects Internet Explorer using `documentMode` IE-only property.\r\n\t// https://stackoverflow.com/questions/19999388/check-if-user-is-using-ie\r\n\t// The `documentMode` property exists in IE 9-11. Maybe even IE 8.\r\n\t// http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx\r\n\treturn typeof window !== 'undefined' && Boolean(window.document.documentMode)\r\n}\r\n\r\nexport function supportsTbody() {\r\n\t// Internet Explorer doesn't support CSS Variables\r\n\t// and therefore it will not be able to apply the `<tbody/>` workaround.\r\n\treturn !isInternetExplorer()\r\n}\r\n\r\nexport const TBODY_CLASS_NAME = 'VirtualScroller'\r\nconst STYLE_ELEMENT_ID = 'VirtualScrollerStyle'\r\n\r\nexport function hasTbodyStyles(tbody) {\r\n\treturn tbody.classList.contains(TBODY_CLASS_NAME) &&\r\n\t\tBoolean(document.getElementById(STYLE_ELEMENT_ID))\r\n}\r\n\r\nexport function addTbodyStyles(tbody) {\r\n\t// `classList.add` is supported in Internet Explorer 10+.\r\n\ttbody.classList.add(TBODY_CLASS_NAME)\r\n\r\n\t// Create a `<style/>` element.\r\n\tconst style = document.createElement('style')\r\n\tstyle.id = STYLE_ELEMENT_ID\r\n\r\n\t// CSS variables aren't supported in Internet Explorer.\r\n\tstyle.innerText = `\r\n\t\ttbody.${TBODY_CLASS_NAME}:before {\r\n\t\t\tcontent: '';\r\n\t\t\tdisplay: table-row;\r\n\t\t\theight: var(--VirtualScroller-paddingTop);\r\n\t\t}\r\n\t\ttbody.${TBODY_CLASS_NAME}:after {\r\n\t\t\tcontent: '';\r\n\t\t\tdisplay: table-row;\r\n\t\t\theight: var(--VirtualScroller-paddingBottom);\r\n\t\t}\r\n\t`.replace(/[\\n\\t]/g, '')\r\n\r\n\tdocument.head.appendChild(style)\r\n}\r\n\r\nexport function setTbodyPadding(tbody, beforeItemsHeight, afterItemsHeight) {\r\n\t// CSS variables aren't supported in Internet Explorer.\r\n\ttbody.style.setProperty('--VirtualScroller-paddingTop', px(beforeItemsHeight));\r\n\ttbody.style.setProperty('--VirtualScroller-paddingBottom', px(afterItemsHeight));\r\n}"],"mappings":";;;;;;;;;;;AAGA;;;;AAHA;AACA;AAIO,IAAMA,2BAA2B,GAAG,mQAApC;;;AAEP,SAASC,kBAAT,GAA8B;EAC7B;EACA;EACA;EACA;EACA,OAAO,OAAOC,MAAP,KAAkB,WAAlB,IAAiCC,OAAO,CAACD,MAAM,CAACE,QAAP,CAAgBC,YAAjB,CAA/C;AACA;;AAEM,SAASC,aAAT,GAAyB;EAC/B;EACA;EACA,OAAO,CAACL,kBAAkB,EAA1B;AACA;;AAEM,IAAMM,gBAAgB,GAAG,iBAAzB;;AACP,IAAMC,gBAAgB,GAAG,sBAAzB;;AAEO,SAASC,cAAT,CAAwBC,KAAxB,EAA+B;EACrC,OAAOA,KAAK,CAACC,SAAN,CAAgBC,QAAhB,CAAyBL,gBAAzB,KACNJ,OAAO,CAACC,QAAQ,CAACS,cAAT,CAAwBL,gBAAxB,CAAD,CADR;AAEA;;AAEM,SAASM,cAAT,CAAwBJ,KAAxB,EAA+B;EACrC;EACAA,KAAK,CAACC,SAAN,CAAgBI,GAAhB,CAAoBR,gBAApB,EAFqC,CAIrC;;EACA,IAAMS,KAAK,GAAGZ,QAAQ,CAACa,aAAT,CAAuB,OAAvB,CAAd;EACAD,KAAK,CAACE,EAAN,GAAWV,gBAAX,CANqC,CAQrC;;EACAQ,KAAK,CAACG,SAAN,GAAkB,sBACTZ,gBADS,0IAMTA,gBANS,6HAWhBa,OAXgB,CAWR,SAXQ,EAWG,EAXH,CAAlB;EAaAhB,QAAQ,CAACiB,IAAT,CAAcC,WAAd,CAA0BN,KAA1B;AACA;;AAEM,SAASO,eAAT,CAAyBb,KAAzB,EAAgCc,iBAAhC,EAAmDC,gBAAnD,EAAqE;EAC3E;EACAf,KAAK,CAACM,KAAN,CAAYU,WAAZ,CAAwB,8BAAxB,EAAwD,IAAAC,cAAA,EAAGH,iBAAH,CAAxD;EACAd,KAAK,CAACM,KAAN,CAAYU,WAAZ,CAAwB,iCAAxB,EAA2D,IAAAC,cAAA,EAAGF,gBAAH,CAA3D;AACA"}
@@ -31,7 +31,7 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
31
31
 
32
32
  var Layout = /*#__PURE__*/function () {
33
33
  function Layout(_ref) {
34
- var bypass = _ref.bypass,
34
+ var isInBypassMode = _ref.isInBypassMode,
35
35
  getInitialEstimatedItemHeight = _ref.getInitialEstimatedItemHeight,
36
36
  getInitialEstimatedVisibleItemRowsCount = _ref.getInitialEstimatedVisibleItemRowsCount,
37
37
  measureItemsBatchSize = _ref.measureItemsBatchSize,
@@ -49,7 +49,7 @@ var Layout = /*#__PURE__*/function () {
49
49
 
50
50
  _classCallCheck(this, Layout);
51
51
 
52
- this.bypass = bypass;
52
+ this.isInBypassMode = isInBypassMode;
53
53
  this.getInitialEstimatedItemHeight = getInitialEstimatedItemHeight;
54
54
  this.getInitialEstimatedVisibleItemRowsCount = getInitialEstimatedVisibleItemRowsCount;
55
55
  this.measureItemsBatchSize = measureItemsBatchSize;
@@ -131,7 +131,7 @@ var Layout = /*#__PURE__*/function () {
131
131
  columnsCount = _ref3.columnsCount,
132
132
  firstShownItemIndex = _ref3.firstShownItemIndex;
133
133
 
134
- if (this.bypass) {
134
+ if (this.isInBypassMode()) {
135
135
  return itemsCount - 1;
136
136
  } // On server side, at initialization time,
137
137
  // `scrollableContainer` is `undefined`,
@@ -1 +1 @@
1
- {"version":3,"file":"Layout.js","names":["Layout","bypass","getInitialEstimatedItemHeight","getInitialEstimatedVisibleItemRowsCount","measureItemsBatchSize","getPrerenderMargin","getVerticalSpacing","getVerticalSpacingBeforeResize","getColumnsCount","getColumnsCountBeforeResize","getItemHeight","getItemHeightBeforeResize","getBeforeResizeItemsCount","getAverageItemHeight","getMaxVisibleAreaHeight","getPreviouslyCalculatedLayout","name","getValue","defaultValue","error","ScrollableContainerNotReadyError","log","itemsCount","columnsCount","beforeStart","firstShownItemIndex","lastShownItemIndex","getLastShownItemIndex","getInitialLastShownItemIndex","getInitialLayoutValueWithFallback","beforeItemsHeight","afterItemsHeight","estimatedRowsCount","getEstimatedRowsCountForHeight","isNaN","Error","Math","min","height","estimatedItemHeight","getEstimatedItemHeight","verticalSpacing","ceil","averageItemHeight","prependedItemsCount","appendedItemsCount","shouldRestoreScrollPosition","onResetGridLayout","appendedRowsCount","addedHeightAfter","prependedRowsCount","addedHeightBefore","warn","shownItemsCountBeforeItemsUpdate","afterItemsCount","i","nonMeasuredAreaHeight","indexOfTheFirstItemInTheRow","itemsCountToRenderForMeasurement","Infinity","undefined","firstNonMeasuredItemIndex","visibleAreaInsideTheList","indexes","_getShownItemIndex","fromIndex","findFirstShownItemIndex","getNonVisibleListShownItemIndexes","findLastShownItemIndex","parameters","beforeResize","beforeResizeItemsCount","notFound","beforeResizeItemsHeight","floor","currentRowFirstItemIndex","hasMoreRows","verticalSpacingAfterCurrentRow","currentRowHeight","columnIndex","itemHeight","getItemNotMeasuredIndexes","bottom","max","itemsHeightFromFirstRowToThisRow","rowStepsIntoVisibleAreaTop","top","rowStepsOutOfVisibleAreaBottomOrIsAtTheBorder","layout","beforeItemsCount","getBeforeItemsHeight","rowHeight","lastShownRowIndex","topOffsetInsideScrollableContainer","beforeResizeRowsCount","maxBeforeResizeRowsCount","beforeResizeRowIndex","itemRowIndex","rowIndex","LAYOUT_REASON","SCROLL","STOPPED_SCROLLING","MANUAL","STARTED","NON_MEASURED_ITEMS_HAVE_BEEN_MEASURED","VIEWPORT_WIDTH_CHANGED","VIEWPORT_HEIGHT_CHANGED","VIEWPORT_SIZE_UNCHANGED","ITEM_HEIGHT_CHANGED","ITEMS_CHANGED","TOP_OFFSET_CHANGED"],"sources":["../source/Layout.js"],"sourcesContent":["import log, { warn } from './utility/debug.js'\r\nimport ScrollableContainerNotReadyError from './ScrollableContainerNotReadyError.js'\r\n\r\nexport default class Layout {\r\n\tconstructor({\r\n\t\tbypass,\r\n\t\tgetInitialEstimatedItemHeight,\r\n\t\tgetInitialEstimatedVisibleItemRowsCount,\r\n\t\tmeasureItemsBatchSize,\r\n\t\tgetPrerenderMargin,\r\n\t\tgetVerticalSpacing,\r\n\t\tgetVerticalSpacingBeforeResize,\r\n\t\tgetColumnsCount,\r\n\t\tgetColumnsCountBeforeResize,\r\n\t\tgetItemHeight,\r\n\t\tgetItemHeightBeforeResize,\r\n\t\tgetBeforeResizeItemsCount,\r\n\t\tgetAverageItemHeight,\r\n\t\tgetMaxVisibleAreaHeight,\r\n\t\tgetPreviouslyCalculatedLayout\r\n\t}) {\r\n\t\tthis.bypass = bypass\r\n\t\tthis.getInitialEstimatedItemHeight = getInitialEstimatedItemHeight\r\n\t\tthis.getInitialEstimatedVisibleItemRowsCount = getInitialEstimatedVisibleItemRowsCount\r\n\t\tthis.measureItemsBatchSize = measureItemsBatchSize\r\n\t\tthis.getPrerenderMargin = getPrerenderMargin\r\n\t\tthis.getVerticalSpacing = getVerticalSpacing\r\n\t\tthis.getVerticalSpacingBeforeResize = getVerticalSpacingBeforeResize\r\n\t\tthis.getColumnsCount = getColumnsCount\r\n\t\tthis.getColumnsCountBeforeResize = getColumnsCountBeforeResize\r\n\t\tthis.getItemHeight = getItemHeight\r\n\t\tthis.getItemHeightBeforeResize = getItemHeightBeforeResize\r\n\t\tthis.getBeforeResizeItemsCount = getBeforeResizeItemsCount\r\n\t\tthis.getAverageItemHeight = getAverageItemHeight\r\n\t\tthis.getMaxVisibleAreaHeight = getMaxVisibleAreaHeight\r\n\t\t//\r\n\t\t// The \"previously calculated layout\" feature is not currently used.\r\n\t\t//\r\n\t\t// The current layout snapshot could be stored as a \"previously calculated layout\" variable\r\n\t\t// so that it could theoretically be used when calculating new layout incrementally\r\n\t\t// rather than from scratch, which would be an optimization.\r\n\t\t//\r\n\t\tthis.getPreviouslyCalculatedLayout = getPreviouslyCalculatedLayout\r\n\t}\r\n\r\n\t// React `<VirtualScroller/>` component attempts to create the initial state\r\n\t// before the component tree has mounted. This could result in an inability to\r\n\t// calculate some initial layout values like `columnsCount` or `lastShownItemIndex`.\r\n\t// Such errors aren't considered critical because layout will be re-calculated\r\n\t// after the component mounts. The workaround is to use some sane default values\r\n\t// until the scrollable container has mounted.\r\n\tgetInitialLayoutValueWithFallback(name, getValue, defaultValue) {\r\n\t\ttry {\r\n\t\t\treturn getValue()\r\n\t\t} catch (error) {\r\n\t\t\tif (error instanceof ScrollableContainerNotReadyError) {\r\n\t\t\t\tlog(`Scrollable container size is not known at this point, so \"${name}\" can't be calculated yet. Default to`, defaultValue);\r\n\t\t\t\treturn defaultValue\r\n\t\t\t} else {\r\n\t\t\t\tthrow error\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tgetInitialLayoutValues({\r\n\t\titemsCount,\r\n\t\tcolumnsCount,\r\n\t\tbeforeStart\r\n\t}) {\r\n\t\tlet firstShownItemIndex\r\n\t\tlet lastShownItemIndex\r\n\t\t// If there're no items then `firstShownItemIndex` stays `undefined`.\r\n\t\tif (itemsCount > 0) {\r\n\t\t\tconst getLastShownItemIndex = () => {\r\n\t\t\t\treturn this.getInitialLastShownItemIndex({\r\n\t\t\t\t\titemsCount,\r\n\t\t\t\t\tcolumnsCount,\r\n\t\t\t\t\tfirstShownItemIndex\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\tfirstShownItemIndex = 0\r\n\t\t\tlastShownItemIndex = beforeStart\r\n\t\t\t\t? this.getInitialLayoutValueWithFallback(\r\n\t\t\t\t\t'lastShownItemIndex',\r\n\t\t\t\t\tgetLastShownItemIndex,\r\n\t\t\t\t\t0\r\n\t\t\t\t)\r\n\t\t\t\t: getLastShownItemIndex()\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tbeforeItemsHeight: 0,\r\n\t\t\tafterItemsHeight: 0,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\tgetInitialLastShownItemIndex({\r\n\t\titemsCount,\r\n\t\tcolumnsCount,\r\n\t\tfirstShownItemIndex\r\n\t}) {\r\n\t\tif (this.bypass) {\r\n\t\t\treturn itemsCount - 1\r\n\t\t}\r\n\t\t// On server side, at initialization time,\r\n\t\t// `scrollableContainer` is `undefined`,\r\n\t\t// so default to `1` estimated rows count.\r\n\t\tlet estimatedRowsCount = 1\r\n\t\tif (this.getMaxVisibleAreaHeight()) {\r\n\t\t\testimatedRowsCount = this.getEstimatedRowsCountForHeight(this.getMaxVisibleAreaHeight() + this.getPrerenderMargin())\r\n\t\t} else if (this.getInitialEstimatedVisibleItemRowsCount) {\r\n\t\t\testimatedRowsCount = this.getInitialEstimatedVisibleItemRowsCount()\r\n\t\t\tif (isNaN(estimatedRowsCount)) {\r\n\t\t\t\tthrow new Error('[virtual-scroller] `getEstimatedVisibleItemRowsCount()` must return a number')\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn Math.min(\r\n\t\t\tfirstShownItemIndex + (estimatedRowsCount * columnsCount - 1),\r\n\t\t\titemsCount - 1\r\n\t\t)\r\n\t}\r\n\r\n\tgetEstimatedRowsCountForHeight(height) {\r\n\t\tconst estimatedItemHeight = this.getEstimatedItemHeight()\r\n\t\tconst verticalSpacing = this.getVerticalSpacing()\r\n\t\tif (estimatedItemHeight) {\r\n\t\t\treturn Math.ceil((height + verticalSpacing) / (estimatedItemHeight + verticalSpacing))\r\n\t\t} else {\r\n\t\t\t// If no items have been rendered yet, and no `estimatedItemHeight` option\r\n\t\t\t// has been passed, then default to `1` estimated rows count in any `height`.\r\n\t\t\treturn 1\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns estimated list item height.\r\n\t * (depends on which items have been previously rendered and measured).\r\n\t * @return {number}\r\n\t */\r\n\tgetEstimatedItemHeight() {\r\n\t\tconst averageItemHeight = this.getAverageItemHeight()\r\n\t\tif (averageItemHeight) {\r\n\t\t\treturn averageItemHeight\r\n\t\t}\r\n\t\tif (this.getInitialEstimatedItemHeight) {\r\n\t\t\tconst estimatedItemHeight = this.getInitialEstimatedItemHeight()\r\n\t\t\tif (isNaN(estimatedItemHeight)) {\r\n\t\t\t\tthrow new Error('[virtual-scroller] `getInitialEstimatedItemHeight()` must return a number')\r\n\t\t\t}\r\n\t\t\treturn estimatedItemHeight\r\n\t\t}\r\n\t\treturn 0\r\n\t}\r\n\r\n\tgetLayoutUpdateForItemsDiff({\r\n\t\tfirstShownItemIndex,\r\n\t\tlastShownItemIndex,\r\n\t\tbeforeItemsHeight,\r\n\t\tafterItemsHeight\r\n\t}, {\r\n\t\tprependedItemsCount,\r\n\t\tappendedItemsCount\r\n\t}, {\r\n\t\titemsCount,\r\n\t\tcolumnsCount,\r\n\t\tshouldRestoreScrollPosition,\r\n\t\tonResetGridLayout\r\n\t}) {\r\n\t\t// const layoutUpdate = {}\r\n\r\n\t\t// If the layout stays the same, then simply increase\r\n\t\t// the top and bottom margins proportionally to the amount\r\n\t\t// of the items added.\r\n\t\tconst averageItemHeight = this.getAverageItemHeight()\r\n\t\tconst verticalSpacing = this.getVerticalSpacing()\r\n\r\n\t\tif (appendedItemsCount > 0) {\r\n\t\t\tconst appendedRowsCount = Math.ceil(appendedItemsCount / columnsCount)\r\n\t\t\tconst addedHeightAfter = appendedRowsCount * (verticalSpacing + averageItemHeight)\r\n\r\n\t\t\tafterItemsHeight += addedHeightAfter\r\n\r\n\t\t\t// layoutUpdate = {\r\n\t\t\t// \t...layoutUpdate,\r\n\t\t\t// \tafterItemsHeight\r\n\t\t\t// }\r\n\t\t}\r\n\r\n\t\tif (prependedItemsCount > 0) {\r\n\t\t\tconst prependedRowsCount = Math.ceil(prependedItemsCount / columnsCount)\r\n\t\t\tconst addedHeightBefore = prependedRowsCount * (averageItemHeight + verticalSpacing)\r\n\r\n\t\t\tfirstShownItemIndex += prependedItemsCount\r\n\t\t\tlastShownItemIndex += prependedItemsCount\r\n\t\t\tbeforeItemsHeight += addedHeightBefore\r\n\r\n\t\t\t// If the currently shown items position on screen should be preserved\r\n\t\t\t// when prepending new items, then it means that:\r\n\t\t\t// * The current scroll position should be snapshotted.\r\n\t\t\t// * The current list height should be snapshotted.\r\n\t\t\t// * All prepended items should be shown so that their height could be\r\n\t\t\t// measured after they're rendered. Based on the prepended items' height,\r\n\t\t\t// the scroll position will be restored so that there's no \"jump of content\".\r\n\t\t\tif (shouldRestoreScrollPosition) {\r\n\t\t\t\tfirstShownItemIndex = 0\r\n\t\t\t\tbeforeItemsHeight = 0\r\n\t\t\t}\r\n\r\n\t\t\tif (prependedItemsCount % columnsCount > 0) {\r\n\t\t\t\t// Rows will be rebalanced as a result of prepending new items,\r\n\t\t\t\t// and row heights can change as a result, so re-layout items\r\n\t\t\t\t// after they've been measured (after the upcoming re-render).\r\n\t\t\t\t//\r\n\t\t\t\t// For example, consider a web page where item rows are `display: flex`.\r\n\t\t\t\t// Suppose there're 3 columns and it shows items from 4 to 6.\r\n\t\t\t\t//\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Apples are | Bananas | Cranberries |\r\n\t\t\t\t// | green | | |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Dates | Elderberry | Figs are |\r\n\t\t\t\t// | | | tasty |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t//\r\n\t\t\t\t// Now, 1 item gets prepended. As a result, all existing rows will have\r\n\t\t\t\t// a different set of items, which means that the row heights will change.\r\n\t\t\t\t//\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Zucchini | Apples are | Bananas |\r\n\t\t\t\t// | | green | |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Cranberries | Dates | Elderberry |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Figs |\r\n\t\t\t\t// | are tasty |\r\n\t\t\t\t// ---------------\r\n\t\t\t\t//\r\n\t\t\t\t// As it can be seen above, the second row's height has changed from 2 to 1.\r\n\t\t\t\t// Not only that, but `itemHeights` have changed as well, so if you thought\r\n\t\t\t\t// that the library could easily recalculate row heights using `Math.max()` — \r\n\t\t\t\t// turns out it's not always the case.\r\n\t\t\t\t//\r\n\t\t\t\t// There could be an explicit opt-in option for automatically recalculating\r\n\t\t\t\t// row heights, but I don't want to write code for such an extremely rare\r\n\t\t\t\t// use case. Instead, use the `getColumnsCount()` parameter function when\r\n\t\t\t\t// fetching previous items.\r\n\r\n\t\t\t\tonResetGridLayout()\r\n\r\n\t\t\t\twarn('~ Prepended items count', prependedItemsCount, 'is not divisible by Columns Count', columnsCount, '~')\r\n\t\t\t\twarn('Layout reset required')\r\n\r\n\t\t\t\tconst shownItemsCountBeforeItemsUpdate = lastShownItemIndex - firstShownItemIndex + 1\r\n\r\n\t\t\t\tfirstShownItemIndex = 0\r\n\t\t\t\tbeforeItemsHeight = 0\r\n\r\n\t\t\t\tif (!shouldRestoreScrollPosition) {\r\n\t\t\t\t\t// Limit shown items count if too many items have been prepended.\r\n\t\t\t\t\tif (prependedItemsCount > shownItemsCountBeforeItemsUpdate) {\r\n\t\t\t\t\t\tlastShownItemIndex = this.getInitialLastShownItemIndex({\r\n\t\t\t\t\t\t\titemsCount,\r\n\t\t\t\t\t\t\tcolumnsCount,\r\n\t\t\t\t\t\t\tfirstShownItemIndex\r\n\t\t\t\t\t\t})\r\n\r\n\t\t\t\t\t\t// Approximate `afterItemsHeight` calculation.\r\n\t\t\t\t\t\tconst afterItemsCount = itemsCount - (lastShownItemIndex + 1)\r\n\t\t\t\t\t\tafterItemsHeight = Math.ceil(afterItemsCount / columnsCount) * (verticalSpacing + averageItemHeight)\r\n\r\n\t\t\t\t\t\t// layoutUpdate = {\r\n\t\t\t\t\t\t// \t...layoutUpdate,\r\n\t\t\t\t\t\t// \tafterItemsHeight\r\n\t\t\t\t\t\t// }\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// layoutUpdate = {\r\n\t\t\t// \t...layoutUpdate,\r\n\t\t\t// \tbeforeItemsHeight,\r\n\t\t\t// \tfirstShownItemIndex,\r\n\t\t\t// \tlastShownItemIndex\r\n\t\t\t// }\r\n\t\t}\r\n\r\n\t\t// return layoutUpdate\r\n\r\n\t\t// Overwrite all four props in all scenarios.\r\n\t\t// The reason is that only this way subsequent `setItems()` calls\r\n\t\t// will be truly \"stateless\" when a chain of `setItems()` calls\r\n\t\t// could be replaced with just the last one in a scenario when\r\n\t\t// `updateState()` calls are \"asynchronous\" (delayed execution).\r\n\t\t//\r\n\t\t// So, for example, the user calls `setItems()` with one set of items.\r\n\t\t// A `updateState()` call has been dispatched but the `state` hasn't been updated yet.\r\n\t\t// Then the user calls `setItems()` with another set of items.\r\n\t\t// If this function only returned a minimal set of properties that actually change,\r\n\t\t// the other layout properties of the second `setItems()` call wouldn't overwrite the ones\r\n\t\t// scheduled for update during the first `setItems()` call, resulting in an inconsistent `state`.\r\n\t\t//\r\n\t\t// For example, the first `setItems()` call does a `updateState()` call where it updates\r\n\t\t// `afterItemsHeight`, and then the second `setItems()` call only updates `beforeItemsHeight`\r\n\t\t// and `firstShownItemIndex` and `lastShownItemIndex`. If the second `setItems()` call was to\r\n\t\t// overwrite any effects of the pending-but-not-yet-applied first `setItems()` call, it would\r\n\t\t// have to call `updateState()` with an `afterItemsHeight` property too, even though it hasn't change.\r\n\t\t// That would be just to revert the change to `afterItemsHeight` state property already scheduled\r\n\t\t// by the first `setItems()` call.\r\n\t\t//\r\n\t\treturn {\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tafterItemsHeight,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\t// If an item that hasn't been shown (and measured) yet is encountered\r\n\t// then show such item and then retry after it has been measured.\r\n\tgetItemNotMeasuredIndexes(i, {\r\n\t\titemsCount,\r\n\t\tfirstShownItemIndex,\r\n\t\tnonMeasuredAreaHeight,\r\n\t\tindexOfTheFirstItemInTheRow\r\n\t}) {\r\n\t\tlog('Item index', i, 'height is required for calculations but hasn\\'t been measured yet. Mark the item as \"shown\", rerender the list, measure the item\\'s height and redo the layout.')\r\n\r\n\t\tconst columnsCount = this.getColumnsCount()\r\n\r\n\t\tconst itemsCountToRenderForMeasurement = Math.min(\r\n\t\t\tthis.getEstimatedRowsCountForHeight(nonMeasuredAreaHeight) * columnsCount,\r\n\t\t\tthis.measureItemsBatchSize || Infinity,\r\n\t\t)\r\n\r\n\t\tif (firstShownItemIndex === undefined) {\r\n\t\t\tfirstShownItemIndex = indexOfTheFirstItemInTheRow\r\n\t\t}\r\n\r\n\t\tconst lastShownItemIndex = Math.min(\r\n\t\t\tindexOfTheFirstItemInTheRow + itemsCountToRenderForMeasurement - 1,\r\n\t\t\t// Guard against index overflow.\r\n\t\t\titemsCount - 1\r\n\t\t)\r\n\r\n\t\treturn {\r\n\t\t\tfirstNonMeasuredItemIndex: i,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Finds the indexes of the currently visible items.\r\n\t * @return {object} `{ firstShownItemIndex: number, lastShownItemIndex: number, firstNonMeasuredItemIndex: number? }`\r\n\t */\r\n\tgetShownItemIndexes({\r\n\t\titemsCount,\r\n\t\tvisibleAreaInsideTheList\r\n\t}) {\r\n\t\tlet indexes = this._getShownItemIndex({\r\n\t\t\titemsCount,\r\n\t\t\tfromIndex: 0,\r\n\t\t\tvisibleAreaInsideTheList,\r\n\t\t\tfindFirstShownItemIndex: true\r\n\t\t})\r\n\r\n\t\tif (indexes === null) {\r\n\t\t\treturn this.getNonVisibleListShownItemIndexes()\r\n\t\t}\r\n\r\n\t\tif (indexes.firstNonMeasuredItemIndex !== undefined) {\r\n\t\t\treturn indexes\r\n\t\t}\r\n\r\n\t\tconst { firstShownItemIndex, beforeItemsHeight } = indexes\r\n\r\n\t\tindexes = this._getShownItemIndex({\r\n\t\t\titemsCount,\r\n\t\t\tfromIndex: firstShownItemIndex,\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tvisibleAreaInsideTheList,\r\n\t\t\tfindLastShownItemIndex: true\r\n\t\t})\r\n\r\n\t\tif (indexes === null) {\r\n\t\t\treturn this.getNonVisibleListShownItemIndexes()\r\n\t\t}\r\n\r\n\t\tif (indexes.firstNonMeasuredItemIndex !== undefined) {\r\n\t\t\treturn indexes\r\n\t\t}\r\n\r\n\t\tconst { lastShownItemIndex } = indexes\r\n\r\n\t\treturn {\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\t_getShownItemIndex(parameters) {\r\n\t\tconst {\r\n\t\t\tbeforeResize,\r\n\t\t\titemsCount,\r\n\t\t\tvisibleAreaInsideTheList,\r\n\t\t\tfindFirstShownItemIndex,\r\n\t\t\tfindLastShownItemIndex,\r\n\t\t\t// backwards\r\n\t\t} = parameters\r\n\r\n\t\tlet {\r\n\t\t\tfromIndex,\r\n\t\t\tbeforeItemsHeight\r\n\t\t} = parameters\r\n\r\n\t\t// This function could potentially also use `this.getPreviouslyCalculatedLayout()`\r\n\t\t// in order to skip calculating visible item indexes from scratch\r\n\t\t// and instead just calculate the difference from a \"previously calculated layout\".\r\n\t\t//\r\n\t\t// I did a simple test in a web browser and found out that running the following\r\n\t\t// piece of code is less than 10 milliseconds:\r\n\t\t//\r\n\t\t// var startedAt = Date.now()\r\n\t\t// var i = 0\r\n\t\t// while (i < 1000000) {\r\n\t\t// i++\r\n\t\t// }\r\n\t\t// console.log(Date.now() - startedAt)\r\n\t\t//\r\n\t\t// Which becomes negligible in my project's use case (a couple thousands items max).\r\n\t\t//\r\n\t\t// If someone would attempt to use a \"previously calculated layout\" here\r\n\t\t// then `shownItemsHeight` would also have to be returned from this function:\r\n\t\t// the total height of all shown items including vertical spacing between them.\r\n\t\t//\r\n\t\t// If \"previously calculated layout\" would be used then it would first find\r\n\t\t// `firstShownItemIndex` and then find `lastShownItemIndex` as part of two\r\n\t\t// separate calls of this function, each with or without `backwards` flag,\r\n\t\t// depending on whether `visibleAreaInsideTheList.top` and `visibleAreaInsideTheList.top`\r\n\t\t// have shifted up or down.\r\n\r\n\t\tlet firstShownItemIndex\r\n\t\tlet lastShownItemIndex\r\n\r\n\t\t// It's not always required to pass `beforeItemsHeight` parameter:\r\n\t\t// when `fromIndex` is `0`, it's also assumed to be `0`.\r\n\t\tif (fromIndex === 0) {\r\n\t\t\tbeforeItemsHeight = 0\r\n\t\t}\r\n\r\n\t\tif (beforeItemsHeight === undefined) {\r\n\t\t\tthrow new Error('[virtual-scroller] `beforeItemsHeight` not passed to `Layout.getShownItemIndexes()` when starting from index ' + fromIndex);\r\n\t\t}\r\n\r\n\t\t// const backwards = false\r\n\t\t// while (backwards ? i >= 0 : i < itemsCount) {}\r\n\r\n\t\tif (!beforeResize) {\r\n\t\t\tconst beforeResizeItemsCount = this.getBeforeResizeItemsCount()\r\n\t\t\tif (beforeResizeItemsCount > fromIndex) {\r\n\t\t\t\t// First search for the item in \"before resize\" items.\r\n\t\t\t\tconst {\r\n\t\t\t\t\tnotFound,\r\n\t\t\t\t\tbeforeItemsHeight: beforeResizeItemsHeight,\r\n\t\t\t\t\tfirstShownItemIndex,\r\n\t\t\t\t\tlastShownItemIndex\r\n\t\t\t\t} = this._getShownItemIndex({\r\n\t\t\t\t\t...parameters,\r\n\t\t\t\t\tbeforeResize: true,\r\n\t\t\t\t\titemsCount: beforeResizeItemsCount\r\n\t\t\t\t})\r\n\r\n\t\t\t\t// If the item was not found in \"before resize\" items\r\n\t\t\t\t// then search in regular items skipping \"before resize\" ones.\r\n\t\t\t\tif (notFound) {\r\n\t\t\t\t\tbeforeItemsHeight = beforeResizeItemsHeight\r\n\t\t\t\t\tfromIndex += beforeResizeItemsCount\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// If the item was found in \"before resize\" items\r\n\t\t\t\t\t// then return the result.\r\n\t\t\t\t\t// Rebalance first / last shown item indexes based on\r\n\t\t\t\t\t// the current columns count, if required.\r\n\t\t\t\t\tconst columnsCount = this.getColumnsCount()\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tfirstShownItemIndex: firstShownItemIndex === undefined\r\n\t\t\t\t\t\t\t? undefined\r\n\t\t\t\t\t\t\t: Math.floor(firstShownItemIndex / columnsCount) * columnsCount,\r\n\t\t\t\t\t\tlastShownItemIndex: lastShownItemIndex === undefined\r\n\t\t\t\t\t\t\t? undefined\r\n\t\t\t\t\t\t\t: Math.floor(lastShownItemIndex / columnsCount) * columnsCount,\r\n\t\t\t\t\t\tbeforeItemsHeight: beforeResizeItemsHeight\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst columnsCount = beforeResize ? this.getColumnsCountBeforeResize() : this.getColumnsCount()\r\n\t\tconst verticalSpacing = beforeResize ? this.getVerticalSpacingBeforeResize() : this.getVerticalSpacing()\r\n\r\n\t\tlet i = fromIndex\r\n\t\twhile (i < itemsCount) {\r\n\t\t\tconst currentRowFirstItemIndex = i\r\n\r\n\t\t\tconst hasMoreRows = itemsCount > currentRowFirstItemIndex + columnsCount\r\n\t\t\tconst verticalSpacingAfterCurrentRow = hasMoreRows ? verticalSpacing : 0\r\n\r\n\t\t\tlet currentRowHeight = 0\r\n\r\n\t\t\t// Calculate current row height.\r\n\t\t\tlet columnIndex = 0\r\n\t\t\twhile (columnIndex < columnsCount && i < itemsCount) {\r\n\t\t\t\tconst itemHeight = beforeResize ? this.getItemHeightBeforeResize(i) : this.getItemHeight(i)\r\n\r\n\t\t\t\t// If this item hasn't been measured yet (or re-measured after a resize)\r\n\t\t\t\t// then mark it as the first non-measured one.\r\n\t\t\t\t//\r\n\t\t\t\t// Can't happen by definition when `beforeResize` parameter is `true`.\r\n\t\t\t\t//\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\treturn this.getItemNotMeasuredIndexes(i, {\r\n\t\t\t\t\t\titemsCount,\r\n\t\t\t\t\t\tfirstShownItemIndex: findLastShownItemIndex ? fromIndex : undefined,\r\n\t\t\t\t\t\tindexOfTheFirstItemInTheRow: currentRowFirstItemIndex,\r\n\t\t\t\t\t\tnonMeasuredAreaHeight: (visibleAreaInsideTheList.bottom + this.getPrerenderMargin()) - beforeItemsHeight\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcurrentRowHeight = Math.max(currentRowHeight, itemHeight)\r\n\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t\ti++\r\n\t\t\t}\r\n\r\n\t\t\tconst itemsHeightFromFirstRowToThisRow = beforeItemsHeight + currentRowHeight\r\n\r\n\t\t\tconst rowStepsIntoVisibleAreaTop = itemsHeightFromFirstRowToThisRow > visibleAreaInsideTheList.top - this.getPrerenderMargin()\r\n\t\t\tconst rowStepsOutOfVisibleAreaBottomOrIsAtTheBorder = itemsHeightFromFirstRowToThisRow + verticalSpacingAfterCurrentRow >= visibleAreaInsideTheList.bottom + this.getPrerenderMargin()\r\n\r\n\t\t\t// if (backwards) {\r\n\t\t\t// \tif (findFirstShownItemIndex) {\r\n\t\t\t// \t\tif (rowStepsOutOfVisibleAreaTop) {\r\n\t\t\t// \t\t\treturn {\r\n\t\t\t// \t\t\t\tfirstShownItemIndex: currentRowFirstItemIndex + columnsCount\r\n\t\t\t// \t\t\t}\r\n\t\t\t// \t\t}\r\n\t\t\t// \t} else if (findLastShownItemIndex) {\r\n\t\t\t// \t\tif (rowStepsIntoVisibleAreaBottom) {\r\n\t\t\t// \t\t\treturn {\r\n\t\t\t// \t\t\t\tlastShownItemIndex: currentRowFirstItemIndex + columnsCount - 1\r\n\t\t\t// \t\t\t}\r\n\t\t\t// \t\t}\r\n\t\t\t// \t}\r\n\t\t\t// }\r\n\r\n\t\t\tif (findFirstShownItemIndex) {\r\n\t\t\t\tif (rowStepsIntoVisibleAreaTop) {\r\n\t\t\t\t\t// If item is the first one visible in the viewport\r\n\t\t\t\t\t// then start showing items from this row.\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tfirstShownItemIndex: currentRowFirstItemIndex,\r\n\t\t\t\t\t\tbeforeItemsHeight\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (findLastShownItemIndex) {\r\n\t\t\t\tif (rowStepsOutOfVisibleAreaBottomOrIsAtTheBorder) {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tlastShownItemIndex: Math.min(\r\n\t\t\t\t\t\t\t// The index of the last item in the current row.\r\n\t\t\t\t\t\t\tcurrentRowFirstItemIndex + columnsCount - 1,\r\n\t\t\t\t\t\t\t// Guards against index overflow.\r\n\t\t\t\t\t\t\titemsCount - 1\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tbeforeItemsHeight += currentRowHeight + verticalSpacingAfterCurrentRow\r\n\r\n\t\t\t// if (backwards) {\r\n\t\t\t// \t// Set `i` to be the first item of the current row.\r\n\t\t\t// \ti -= columnsCount\r\n\t\t\t// \tconst prevoiusRowIsBeforeResize = i - 1 < this.getBeforeResizeItemsCount()\r\n\t\t\t// \tconst previousRowColumnsCount = prevoiusRowIsBeforeResize ? this.getColumnsCountBeforeResize() : this.getColumnsCount()\r\n\t\t\t// \t// Set `i` to be the first item of the previous row.\r\n\t\t\t// \ti -= previousRowColumnsCount\r\n\t\t\t// }\r\n\t\t}\r\n\r\n\t\t// if (backwards) {\r\n\t\t// \tif (findFirstShownItemIndex) {\r\n\t\t// \t\twarn('The list is supposed to be visible but no visible item has been found (while traversing backwards)')\r\n\t\t// \t\treturn null\r\n\t\t// \t} else if (findLastShownItemIndex) {\r\n\t\t// \t\treturn {\r\n\t\t// \t\t\tfirstShownItemIndex: 0\r\n\t\t// \t\t}\r\n\t\t// \t}\r\n\t\t// }\r\n\r\n\t\tif (beforeResize) {\r\n\t\t\treturn {\r\n\t\t\t\tnotFound: true,\r\n\t\t\t\tbeforeItemsHeight\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// This case isn't supposed to happen but it could hypothetically happen\r\n\t\t// because the list height is measured from the user's screen and\r\n\t\t// not necessarily can be trusted.\r\n\t\tif (findFirstShownItemIndex) {\r\n\t\t\twarn('The list is supposed to be visible but no visible item has been found')\r\n\t\t\treturn null\r\n\t\t} else if (findLastShownItemIndex) {\r\n\t\t\treturn {\r\n\t\t\t\tlastShownItemIndex: itemsCount - 1\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tgetNonVisibleListShownItemIndexes() {\r\n\t\tconst layout = {\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 0\r\n\t\t}\r\n\t\tif (this.getItemHeight(0) === undefined) {\r\n\t\t\tlayout.firstNonMeasuredItemIndex = 0\r\n\t\t}\r\n\t\treturn layout\r\n\t}\r\n\r\n\t/**\r\n\t * Measures \"before\" items height.\r\n\t * @param {number} beforeItemsCount — Basically, first shown item index.\r\n\t * @return {number}\r\n\t */\r\n\tgetBeforeItemsHeight(\r\n\t\tbeforeItemsCount,\r\n\t\t{ beforeResize } = {}\r\n\t) {\r\n\t\t// This function could potentially also use `this.getPreviouslyCalculatedLayout()`\r\n\t\t// in order to skip calculating visible item indexes from scratch\r\n\t\t// and instead just calculate the difference from a \"previously calculated layout\".\r\n\t\t//\r\n\t\t// I did a simple test in a web browser and found out that running the following\r\n\t\t// piece of code is less than 10 milliseconds:\r\n\t\t//\r\n\t\t// var startedAt = Date.now()\r\n\t\t// var i = 0\r\n\t\t// while (i < 1000000) {\r\n\t\t// i++\r\n\t\t// }\r\n\t\t// console.log(Date.now() - startedAt)\r\n\t\t//\r\n\t\t// Which becomes negligible in my project's use case (a couple thousands items max).\r\n\r\n\t\tlet beforeItemsHeight = 0\r\n\t\tlet i = 0\r\n\r\n\t\tif (!beforeResize) {\r\n\t\t\tconst beforeResizeItemsCount = this.getBeforeResizeItemsCount()\r\n\r\n\t\t\tif (beforeResizeItemsCount > 0) {\r\n\t\t\t\t// First add all \"before resize\" item heights.\r\n\t\t\t\tbeforeItemsHeight = this.getBeforeItemsHeight(\r\n\t\t\t\t\t// `firstShownItemIndex` (called `beforeItemsCount`) could be greater than\r\n\t\t\t\t\t// `beforeResizeItemsCount` when the user scrolls down.\r\n\t\t\t\t\t// `firstShownItemIndex` (called `beforeItemsCount`) could be less than\r\n\t\t\t\t\t// `beforeResizeItemsCount` when the user scrolls up.\r\n\t\t\t\t\tMath.min(beforeItemsCount, beforeResizeItemsCount),\r\n\t\t\t\t\t{ beforeResize: true }\r\n\t\t\t\t)\r\n\t\t\t\ti = beforeResizeItemsCount\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst columnsCount = beforeResize ? this.getColumnsCountBeforeResize() : this.getColumnsCount()\r\n\t\tconst verticalSpacing = beforeResize ? this.getVerticalSpacingBeforeResize() : this.getVerticalSpacing()\r\n\r\n\t\twhile (i < beforeItemsCount) {\r\n\t\t\tconst currentRowFirstItemIndex = i\r\n\r\n\t\t\tlet rowHeight = 0\r\n\t\t\tlet columnIndex = 0\r\n\t\t\t// Not checking for `itemsCount` overflow here because `i = beforeItemsCount`\r\n\t\t\t// can only start at the start of a row, meaning that when calculating\r\n\t\t\t// \"before items height\" it's not supposed to add item heights from the\r\n\t\t\t// last row of items because in that case it would have to iterate from\r\n\t\t\t// `i === beforeItemsCount` and that condition is already checked above.\r\n\t\t\t// while (i < itemsCount) {\r\n\t\t\twhile (columnIndex < columnsCount) {\r\n\t\t\t\tlet itemHeight = beforeResize ? this.getItemHeightBeforeResize(i) : this.getItemHeight(i)\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\t// `itemHeight` can only be `undefined` when not `beforeResize`.\r\n\t\t\t\t\t// Use the current \"average item height\" as a substitute.\r\n\t\t\t\t\titemHeight = this.getAverageItemHeight()\r\n\t\t\t\t}\r\n\t\t\t\trowHeight = Math.max(rowHeight, itemHeight)\r\n\t\t\t\ti++\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t}\r\n\r\n\t\t\tbeforeItemsHeight += rowHeight\r\n\t\t\tbeforeItemsHeight += verticalSpacing\r\n\t\t}\r\n\r\n\t\treturn beforeItemsHeight\r\n\t}\r\n\r\n\t/**\r\n\t * Measures \"after\" items height.\r\n\t * @param {number} lastShownItemIndex — Last shown item index.\r\n\t * @param {number} itemsCount — Items count.\r\n\t * @return {number}\r\n\t */\r\n\tgetAfterItemsHeight(\r\n\t\tlastShownItemIndex,\r\n\t\titemsCount\r\n\t) {\r\n\t\t// This function could potentially also use `this.getPreviouslyCalculatedLayout()`\r\n\t\t// in order to skip calculating visible item indexes from scratch\r\n\t\t// and instead just calculate the difference from a \"previously calculated layout\".\r\n\t\t//\r\n\t\t// I did a simple test in a web browser and found out that running the following\r\n\t\t// piece of code is less than 10 milliseconds:\r\n\t\t//\r\n\t\t// var startedAt = Date.now()\r\n\t\t// var i = 0\r\n\t\t// while (i < 1000000) {\r\n\t\t// i++\r\n\t\t// }\r\n\t\t// console.log(Date.now() - startedAt)\r\n\t\t//\r\n\t\t// Which becomes negligible in my project's use case (a couple thousands items max).\r\n\r\n\t\tconst columnsCount = this.getColumnsCount()\r\n\t\tconst lastShownRowIndex = Math.floor(lastShownItemIndex / columnsCount)\r\n\r\n\t\tlet afterItemsHeight = 0\r\n\r\n\t\tlet i = lastShownItemIndex + 1\r\n\t\twhile (i < itemsCount) {\r\n\t\t\tlet rowHeight = 0\r\n\t\t\tlet columnIndex = 0\r\n\t\t\twhile (columnIndex < columnsCount && i < itemsCount) {\r\n\t\t\t\tlet itemHeight = this.getItemHeight(i)\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\titemHeight = this.getAverageItemHeight()\r\n\t\t\t\t}\r\n\t\t\t\trowHeight = Math.max(rowHeight, itemHeight)\r\n\t\t\t\ti++\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t}\r\n\r\n\t\t\t// Add all \"after\" items height.\r\n\t\t\tafterItemsHeight += this.getVerticalSpacing()\r\n\t\t\tafterItemsHeight += rowHeight\r\n\t\t}\r\n\r\n\t\treturn afterItemsHeight\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the items's top offset relative to the top edge of the first item.\r\n\t * @param {number} i — Item index\r\n\t * @return {[number]} Returns `undefined` if any of the previous items haven't been rendered yet.\r\n\t */\r\n\tgetItemTopOffset(i) {\r\n\t\tlet topOffsetInsideScrollableContainer = 0\r\n\r\n\t\tconst beforeResizeItemsCount = this.getBeforeResizeItemsCount()\r\n\t\tconst beforeResizeRowsCount = beforeResizeItemsCount === 0\r\n\t\t\t? 0\r\n\t\t\t: Math.ceil(beforeResizeItemsCount / this.getColumnsCountBeforeResize())\r\n\r\n\t\tconst maxBeforeResizeRowsCount = i < beforeResizeItemsCount\r\n\t\t\t? Math.floor(i / this.getColumnsCountBeforeResize())\r\n\t\t\t: beforeResizeRowsCount\r\n\r\n\t\tlet beforeResizeRowIndex = 0\r\n\t\twhile (beforeResizeRowIndex < maxBeforeResizeRowsCount) {\r\n\t\t\tconst rowHeight = this.getItemHeightBeforeResize(\r\n\t\t\t\tbeforeResizeRowIndex * this.getColumnsCountBeforeResize()\r\n\t\t\t)\r\n\r\n\t\t\ttopOffsetInsideScrollableContainer += rowHeight\r\n\t\t\ttopOffsetInsideScrollableContainer += this.getVerticalSpacingBeforeResize()\r\n\r\n\t\t\tbeforeResizeRowIndex++\r\n\t\t}\r\n\r\n\t\tconst itemRowIndex = Math.floor((i - beforeResizeItemsCount) / this.getColumnsCount())\r\n\r\n\t\tlet rowIndex = 0\r\n\t\twhile (rowIndex < itemRowIndex) {\r\n\t\t\tlet rowHeight = 0\r\n\t\t\tlet columnIndex = 0\r\n\t\t\twhile (columnIndex < this.getColumnsCount()) {\r\n\t\t\t\tconst itemHeight = this.getItemHeight(\r\n\t\t\t\t\tbeforeResizeItemsCount + rowIndex * this.getColumnsCount() + columnIndex\r\n\t\t\t\t)\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t\trowHeight = Math.max(rowHeight, itemHeight)\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t}\r\n\r\n\t\t\ttopOffsetInsideScrollableContainer += rowHeight\r\n\t\t\ttopOffsetInsideScrollableContainer += this.getVerticalSpacing()\r\n\r\n\t\t\trowIndex++\r\n\t\t}\r\n\r\n\t\treturn topOffsetInsideScrollableContainer\r\n\t}\r\n}\r\n\r\nexport const LAYOUT_REASON = {\r\n\tSCROLL: 'scroll',\r\n\tSTOPPED_SCROLLING: 'stopped scrolling',\r\n\tMANUAL: 'manual',\r\n\tSTARTED: 'started',\r\n\tNON_MEASURED_ITEMS_HAVE_BEEN_MEASURED: 'non-measured item heights have been measured',\r\n\tVIEWPORT_WIDTH_CHANGED: 'viewport width changed',\r\n\tVIEWPORT_HEIGHT_CHANGED: 'viewport height changed',\r\n\tVIEWPORT_SIZE_UNCHANGED: 'viewport size unchanged',\r\n\tITEM_HEIGHT_CHANGED: 'item height changed',\r\n\tITEMS_CHANGED: 'items changed',\r\n\tTOP_OFFSET_CHANGED: 'list top offset changed'\r\n}"],"mappings":"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"}
1
+ {"version":3,"file":"Layout.js","names":["Layout","isInBypassMode","getInitialEstimatedItemHeight","getInitialEstimatedVisibleItemRowsCount","measureItemsBatchSize","getPrerenderMargin","getVerticalSpacing","getVerticalSpacingBeforeResize","getColumnsCount","getColumnsCountBeforeResize","getItemHeight","getItemHeightBeforeResize","getBeforeResizeItemsCount","getAverageItemHeight","getMaxVisibleAreaHeight","getPreviouslyCalculatedLayout","name","getValue","defaultValue","error","ScrollableContainerNotReadyError","log","itemsCount","columnsCount","beforeStart","firstShownItemIndex","lastShownItemIndex","getLastShownItemIndex","getInitialLastShownItemIndex","getInitialLayoutValueWithFallback","beforeItemsHeight","afterItemsHeight","estimatedRowsCount","getEstimatedRowsCountForHeight","isNaN","Error","Math","min","height","estimatedItemHeight","getEstimatedItemHeight","verticalSpacing","ceil","averageItemHeight","prependedItemsCount","appendedItemsCount","shouldRestoreScrollPosition","onResetGridLayout","appendedRowsCount","addedHeightAfter","prependedRowsCount","addedHeightBefore","warn","shownItemsCountBeforeItemsUpdate","afterItemsCount","i","nonMeasuredAreaHeight","indexOfTheFirstItemInTheRow","itemsCountToRenderForMeasurement","Infinity","undefined","firstNonMeasuredItemIndex","visibleAreaInsideTheList","indexes","_getShownItemIndex","fromIndex","findFirstShownItemIndex","getNonVisibleListShownItemIndexes","findLastShownItemIndex","parameters","beforeResize","beforeResizeItemsCount","notFound","beforeResizeItemsHeight","floor","currentRowFirstItemIndex","hasMoreRows","verticalSpacingAfterCurrentRow","currentRowHeight","columnIndex","itemHeight","getItemNotMeasuredIndexes","bottom","max","itemsHeightFromFirstRowToThisRow","rowStepsIntoVisibleAreaTop","top","rowStepsOutOfVisibleAreaBottomOrIsAtTheBorder","layout","beforeItemsCount","getBeforeItemsHeight","rowHeight","lastShownRowIndex","topOffsetInsideScrollableContainer","beforeResizeRowsCount","maxBeforeResizeRowsCount","beforeResizeRowIndex","itemRowIndex","rowIndex","LAYOUT_REASON","SCROLL","STOPPED_SCROLLING","MANUAL","STARTED","NON_MEASURED_ITEMS_HAVE_BEEN_MEASURED","VIEWPORT_WIDTH_CHANGED","VIEWPORT_HEIGHT_CHANGED","VIEWPORT_SIZE_UNCHANGED","ITEM_HEIGHT_CHANGED","ITEMS_CHANGED","TOP_OFFSET_CHANGED"],"sources":["../source/Layout.js"],"sourcesContent":["import log, { warn } from './utility/debug.js'\r\nimport ScrollableContainerNotReadyError from './ScrollableContainerNotReadyError.js'\r\n\r\nexport default class Layout {\r\n\tconstructor({\r\n\t\tisInBypassMode,\r\n\t\tgetInitialEstimatedItemHeight,\r\n\t\tgetInitialEstimatedVisibleItemRowsCount,\r\n\t\tmeasureItemsBatchSize,\r\n\t\tgetPrerenderMargin,\r\n\t\tgetVerticalSpacing,\r\n\t\tgetVerticalSpacingBeforeResize,\r\n\t\tgetColumnsCount,\r\n\t\tgetColumnsCountBeforeResize,\r\n\t\tgetItemHeight,\r\n\t\tgetItemHeightBeforeResize,\r\n\t\tgetBeforeResizeItemsCount,\r\n\t\tgetAverageItemHeight,\r\n\t\tgetMaxVisibleAreaHeight,\r\n\t\tgetPreviouslyCalculatedLayout\r\n\t}) {\r\n\t\tthis.isInBypassMode = isInBypassMode\r\n\t\tthis.getInitialEstimatedItemHeight = getInitialEstimatedItemHeight\r\n\t\tthis.getInitialEstimatedVisibleItemRowsCount = getInitialEstimatedVisibleItemRowsCount\r\n\t\tthis.measureItemsBatchSize = measureItemsBatchSize\r\n\t\tthis.getPrerenderMargin = getPrerenderMargin\r\n\t\tthis.getVerticalSpacing = getVerticalSpacing\r\n\t\tthis.getVerticalSpacingBeforeResize = getVerticalSpacingBeforeResize\r\n\t\tthis.getColumnsCount = getColumnsCount\r\n\t\tthis.getColumnsCountBeforeResize = getColumnsCountBeforeResize\r\n\t\tthis.getItemHeight = getItemHeight\r\n\t\tthis.getItemHeightBeforeResize = getItemHeightBeforeResize\r\n\t\tthis.getBeforeResizeItemsCount = getBeforeResizeItemsCount\r\n\t\tthis.getAverageItemHeight = getAverageItemHeight\r\n\t\tthis.getMaxVisibleAreaHeight = getMaxVisibleAreaHeight\r\n\t\t//\r\n\t\t// The \"previously calculated layout\" feature is not currently used.\r\n\t\t//\r\n\t\t// The current layout snapshot could be stored as a \"previously calculated layout\" variable\r\n\t\t// so that it could theoretically be used when calculating new layout incrementally\r\n\t\t// rather than from scratch, which would be an optimization.\r\n\t\t//\r\n\t\tthis.getPreviouslyCalculatedLayout = getPreviouslyCalculatedLayout\r\n\t}\r\n\r\n\t// React `<VirtualScroller/>` component attempts to create the initial state\r\n\t// before the component tree has mounted. This could result in an inability to\r\n\t// calculate some initial layout values like `columnsCount` or `lastShownItemIndex`.\r\n\t// Such errors aren't considered critical because layout will be re-calculated\r\n\t// after the component mounts. The workaround is to use some sane default values\r\n\t// until the scrollable container has mounted.\r\n\tgetInitialLayoutValueWithFallback(name, getValue, defaultValue) {\r\n\t\ttry {\r\n\t\t\treturn getValue()\r\n\t\t} catch (error) {\r\n\t\t\tif (error instanceof ScrollableContainerNotReadyError) {\r\n\t\t\t\tlog(`Scrollable container size is not known at this point, so \"${name}\" can't be calculated yet. Default to`, defaultValue);\r\n\t\t\t\treturn defaultValue\r\n\t\t\t} else {\r\n\t\t\t\tthrow error\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tgetInitialLayoutValues({\r\n\t\titemsCount,\r\n\t\tcolumnsCount,\r\n\t\tbeforeStart\r\n\t}) {\r\n\t\tlet firstShownItemIndex\r\n\t\tlet lastShownItemIndex\r\n\t\t// If there're no items then `firstShownItemIndex` stays `undefined`.\r\n\t\tif (itemsCount > 0) {\r\n\t\t\tconst getLastShownItemIndex = () => {\r\n\t\t\t\treturn this.getInitialLastShownItemIndex({\r\n\t\t\t\t\titemsCount,\r\n\t\t\t\t\tcolumnsCount,\r\n\t\t\t\t\tfirstShownItemIndex\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\tfirstShownItemIndex = 0\r\n\t\t\tlastShownItemIndex = beforeStart\r\n\t\t\t\t? this.getInitialLayoutValueWithFallback(\r\n\t\t\t\t\t'lastShownItemIndex',\r\n\t\t\t\t\tgetLastShownItemIndex,\r\n\t\t\t\t\t0\r\n\t\t\t\t)\r\n\t\t\t\t: getLastShownItemIndex()\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tbeforeItemsHeight: 0,\r\n\t\t\tafterItemsHeight: 0,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\tgetInitialLastShownItemIndex({\r\n\t\titemsCount,\r\n\t\tcolumnsCount,\r\n\t\tfirstShownItemIndex\r\n\t}) {\r\n\t\tif (this.isInBypassMode()) {\r\n\t\t\treturn itemsCount - 1\r\n\t\t}\r\n\t\t// On server side, at initialization time,\r\n\t\t// `scrollableContainer` is `undefined`,\r\n\t\t// so default to `1` estimated rows count.\r\n\t\tlet estimatedRowsCount = 1\r\n\t\tif (this.getMaxVisibleAreaHeight()) {\r\n\t\t\testimatedRowsCount = this.getEstimatedRowsCountForHeight(this.getMaxVisibleAreaHeight() + this.getPrerenderMargin())\r\n\t\t} else if (this.getInitialEstimatedVisibleItemRowsCount) {\r\n\t\t\testimatedRowsCount = this.getInitialEstimatedVisibleItemRowsCount()\r\n\t\t\tif (isNaN(estimatedRowsCount)) {\r\n\t\t\t\tthrow new Error('[virtual-scroller] `getEstimatedVisibleItemRowsCount()` must return a number')\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn Math.min(\r\n\t\t\tfirstShownItemIndex + (estimatedRowsCount * columnsCount - 1),\r\n\t\t\titemsCount - 1\r\n\t\t)\r\n\t}\r\n\r\n\tgetEstimatedRowsCountForHeight(height) {\r\n\t\tconst estimatedItemHeight = this.getEstimatedItemHeight()\r\n\t\tconst verticalSpacing = this.getVerticalSpacing()\r\n\t\tif (estimatedItemHeight) {\r\n\t\t\treturn Math.ceil((height + verticalSpacing) / (estimatedItemHeight + verticalSpacing))\r\n\t\t} else {\r\n\t\t\t// If no items have been rendered yet, and no `estimatedItemHeight` option\r\n\t\t\t// has been passed, then default to `1` estimated rows count in any `height`.\r\n\t\t\treturn 1\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Returns estimated list item height.\r\n\t * (depends on which items have been previously rendered and measured).\r\n\t * @return {number}\r\n\t */\r\n\tgetEstimatedItemHeight() {\r\n\t\tconst averageItemHeight = this.getAverageItemHeight()\r\n\t\tif (averageItemHeight) {\r\n\t\t\treturn averageItemHeight\r\n\t\t}\r\n\t\tif (this.getInitialEstimatedItemHeight) {\r\n\t\t\tconst estimatedItemHeight = this.getInitialEstimatedItemHeight()\r\n\t\t\tif (isNaN(estimatedItemHeight)) {\r\n\t\t\t\tthrow new Error('[virtual-scroller] `getInitialEstimatedItemHeight()` must return a number')\r\n\t\t\t}\r\n\t\t\treturn estimatedItemHeight\r\n\t\t}\r\n\t\treturn 0\r\n\t}\r\n\r\n\tgetLayoutUpdateForItemsDiff({\r\n\t\tfirstShownItemIndex,\r\n\t\tlastShownItemIndex,\r\n\t\tbeforeItemsHeight,\r\n\t\tafterItemsHeight\r\n\t}, {\r\n\t\tprependedItemsCount,\r\n\t\tappendedItemsCount\r\n\t}, {\r\n\t\titemsCount,\r\n\t\tcolumnsCount,\r\n\t\tshouldRestoreScrollPosition,\r\n\t\tonResetGridLayout\r\n\t}) {\r\n\t\t// const layoutUpdate = {}\r\n\r\n\t\t// If the layout stays the same, then simply increase\r\n\t\t// the top and bottom margins proportionally to the amount\r\n\t\t// of the items added.\r\n\t\tconst averageItemHeight = this.getAverageItemHeight()\r\n\t\tconst verticalSpacing = this.getVerticalSpacing()\r\n\r\n\t\tif (appendedItemsCount > 0) {\r\n\t\t\tconst appendedRowsCount = Math.ceil(appendedItemsCount / columnsCount)\r\n\t\t\tconst addedHeightAfter = appendedRowsCount * (verticalSpacing + averageItemHeight)\r\n\r\n\t\t\tafterItemsHeight += addedHeightAfter\r\n\r\n\t\t\t// layoutUpdate = {\r\n\t\t\t// \t...layoutUpdate,\r\n\t\t\t// \tafterItemsHeight\r\n\t\t\t// }\r\n\t\t}\r\n\r\n\t\tif (prependedItemsCount > 0) {\r\n\t\t\tconst prependedRowsCount = Math.ceil(prependedItemsCount / columnsCount)\r\n\t\t\tconst addedHeightBefore = prependedRowsCount * (averageItemHeight + verticalSpacing)\r\n\r\n\t\t\tfirstShownItemIndex += prependedItemsCount\r\n\t\t\tlastShownItemIndex += prependedItemsCount\r\n\t\t\tbeforeItemsHeight += addedHeightBefore\r\n\r\n\t\t\t// If the currently shown items position on screen should be preserved\r\n\t\t\t// when prepending new items, then it means that:\r\n\t\t\t// * The current scroll position should be snapshotted.\r\n\t\t\t// * The current list height should be snapshotted.\r\n\t\t\t// * All prepended items should be shown so that their height could be\r\n\t\t\t// measured after they're rendered. Based on the prepended items' height,\r\n\t\t\t// the scroll position will be restored so that there's no \"jump of content\".\r\n\t\t\tif (shouldRestoreScrollPosition) {\r\n\t\t\t\tfirstShownItemIndex = 0\r\n\t\t\t\tbeforeItemsHeight = 0\r\n\t\t\t}\r\n\r\n\t\t\tif (prependedItemsCount % columnsCount > 0) {\r\n\t\t\t\t// Rows will be rebalanced as a result of prepending new items,\r\n\t\t\t\t// and row heights can change as a result, so re-layout items\r\n\t\t\t\t// after they've been measured (after the upcoming re-render).\r\n\t\t\t\t//\r\n\t\t\t\t// For example, consider a web page where item rows are `display: flex`.\r\n\t\t\t\t// Suppose there're 3 columns and it shows items from 4 to 6.\r\n\t\t\t\t//\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Apples are | Bananas | Cranberries |\r\n\t\t\t\t// | green | | |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Dates | Elderberry | Figs are |\r\n\t\t\t\t// | | | tasty |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t//\r\n\t\t\t\t// Now, 1 item gets prepended. As a result, all existing rows will have\r\n\t\t\t\t// a different set of items, which means that the row heights will change.\r\n\t\t\t\t//\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Zucchini | Apples are | Bananas |\r\n\t\t\t\t// | | green | |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Cranberries | Dates | Elderberry |\r\n\t\t\t\t// ------------------------------------------\r\n\t\t\t\t// | Figs |\r\n\t\t\t\t// | are tasty |\r\n\t\t\t\t// ---------------\r\n\t\t\t\t//\r\n\t\t\t\t// As it can be seen above, the second row's height has changed from 2 to 1.\r\n\t\t\t\t// Not only that, but `itemHeights` have changed as well, so if you thought\r\n\t\t\t\t// that the library could easily recalculate row heights using `Math.max()` — \r\n\t\t\t\t// turns out it's not always the case.\r\n\t\t\t\t//\r\n\t\t\t\t// There could be an explicit opt-in option for automatically recalculating\r\n\t\t\t\t// row heights, but I don't want to write code for such an extremely rare\r\n\t\t\t\t// use case. Instead, use the `getColumnsCount()` parameter function when\r\n\t\t\t\t// fetching previous items.\r\n\r\n\t\t\t\tonResetGridLayout()\r\n\r\n\t\t\t\twarn('~ Prepended items count', prependedItemsCount, 'is not divisible by Columns Count', columnsCount, '~')\r\n\t\t\t\twarn('Layout reset required')\r\n\r\n\t\t\t\tconst shownItemsCountBeforeItemsUpdate = lastShownItemIndex - firstShownItemIndex + 1\r\n\r\n\t\t\t\tfirstShownItemIndex = 0\r\n\t\t\t\tbeforeItemsHeight = 0\r\n\r\n\t\t\t\tif (!shouldRestoreScrollPosition) {\r\n\t\t\t\t\t// Limit shown items count if too many items have been prepended.\r\n\t\t\t\t\tif (prependedItemsCount > shownItemsCountBeforeItemsUpdate) {\r\n\t\t\t\t\t\tlastShownItemIndex = this.getInitialLastShownItemIndex({\r\n\t\t\t\t\t\t\titemsCount,\r\n\t\t\t\t\t\t\tcolumnsCount,\r\n\t\t\t\t\t\t\tfirstShownItemIndex\r\n\t\t\t\t\t\t})\r\n\r\n\t\t\t\t\t\t// Approximate `afterItemsHeight` calculation.\r\n\t\t\t\t\t\tconst afterItemsCount = itemsCount - (lastShownItemIndex + 1)\r\n\t\t\t\t\t\tafterItemsHeight = Math.ceil(afterItemsCount / columnsCount) * (verticalSpacing + averageItemHeight)\r\n\r\n\t\t\t\t\t\t// layoutUpdate = {\r\n\t\t\t\t\t\t// \t...layoutUpdate,\r\n\t\t\t\t\t\t// \tafterItemsHeight\r\n\t\t\t\t\t\t// }\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// layoutUpdate = {\r\n\t\t\t// \t...layoutUpdate,\r\n\t\t\t// \tbeforeItemsHeight,\r\n\t\t\t// \tfirstShownItemIndex,\r\n\t\t\t// \tlastShownItemIndex\r\n\t\t\t// }\r\n\t\t}\r\n\r\n\t\t// return layoutUpdate\r\n\r\n\t\t// Overwrite all four props in all scenarios.\r\n\t\t// The reason is that only this way subsequent `setItems()` calls\r\n\t\t// will be truly \"stateless\" when a chain of `setItems()` calls\r\n\t\t// could be replaced with just the last one in a scenario when\r\n\t\t// `updateState()` calls are \"asynchronous\" (delayed execution).\r\n\t\t//\r\n\t\t// So, for example, the user calls `setItems()` with one set of items.\r\n\t\t// A `updateState()` call has been dispatched but the `state` hasn't been updated yet.\r\n\t\t// Then the user calls `setItems()` with another set of items.\r\n\t\t// If this function only returned a minimal set of properties that actually change,\r\n\t\t// the other layout properties of the second `setItems()` call wouldn't overwrite the ones\r\n\t\t// scheduled for update during the first `setItems()` call, resulting in an inconsistent `state`.\r\n\t\t//\r\n\t\t// For example, the first `setItems()` call does a `updateState()` call where it updates\r\n\t\t// `afterItemsHeight`, and then the second `setItems()` call only updates `beforeItemsHeight`\r\n\t\t// and `firstShownItemIndex` and `lastShownItemIndex`. If the second `setItems()` call was to\r\n\t\t// overwrite any effects of the pending-but-not-yet-applied first `setItems()` call, it would\r\n\t\t// have to call `updateState()` with an `afterItemsHeight` property too, even though it hasn't change.\r\n\t\t// That would be just to revert the change to `afterItemsHeight` state property already scheduled\r\n\t\t// by the first `setItems()` call.\r\n\t\t//\r\n\t\treturn {\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tafterItemsHeight,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\t// If an item that hasn't been shown (and measured) yet is encountered\r\n\t// then show such item and then retry after it has been measured.\r\n\tgetItemNotMeasuredIndexes(i, {\r\n\t\titemsCount,\r\n\t\tfirstShownItemIndex,\r\n\t\tnonMeasuredAreaHeight,\r\n\t\tindexOfTheFirstItemInTheRow\r\n\t}) {\r\n\t\tlog('Item index', i, 'height is required for calculations but hasn\\'t been measured yet. Mark the item as \"shown\", rerender the list, measure the item\\'s height and redo the layout.')\r\n\r\n\t\tconst columnsCount = this.getColumnsCount()\r\n\r\n\t\tconst itemsCountToRenderForMeasurement = Math.min(\r\n\t\t\tthis.getEstimatedRowsCountForHeight(nonMeasuredAreaHeight) * columnsCount,\r\n\t\t\tthis.measureItemsBatchSize || Infinity,\r\n\t\t)\r\n\r\n\t\tif (firstShownItemIndex === undefined) {\r\n\t\t\tfirstShownItemIndex = indexOfTheFirstItemInTheRow\r\n\t\t}\r\n\r\n\t\tconst lastShownItemIndex = Math.min(\r\n\t\t\tindexOfTheFirstItemInTheRow + itemsCountToRenderForMeasurement - 1,\r\n\t\t\t// Guard against index overflow.\r\n\t\t\titemsCount - 1\r\n\t\t)\r\n\r\n\t\treturn {\r\n\t\t\tfirstNonMeasuredItemIndex: i,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Finds the indexes of the currently visible items.\r\n\t * @return {object} `{ firstShownItemIndex: number, lastShownItemIndex: number, firstNonMeasuredItemIndex: number? }`\r\n\t */\r\n\tgetShownItemIndexes({\r\n\t\titemsCount,\r\n\t\tvisibleAreaInsideTheList\r\n\t}) {\r\n\t\tlet indexes = this._getShownItemIndex({\r\n\t\t\titemsCount,\r\n\t\t\tfromIndex: 0,\r\n\t\t\tvisibleAreaInsideTheList,\r\n\t\t\tfindFirstShownItemIndex: true\r\n\t\t})\r\n\r\n\t\tif (indexes === null) {\r\n\t\t\treturn this.getNonVisibleListShownItemIndexes()\r\n\t\t}\r\n\r\n\t\tif (indexes.firstNonMeasuredItemIndex !== undefined) {\r\n\t\t\treturn indexes\r\n\t\t}\r\n\r\n\t\tconst { firstShownItemIndex, beforeItemsHeight } = indexes\r\n\r\n\t\tindexes = this._getShownItemIndex({\r\n\t\t\titemsCount,\r\n\t\t\tfromIndex: firstShownItemIndex,\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tvisibleAreaInsideTheList,\r\n\t\t\tfindLastShownItemIndex: true\r\n\t\t})\r\n\r\n\t\tif (indexes === null) {\r\n\t\t\treturn this.getNonVisibleListShownItemIndexes()\r\n\t\t}\r\n\r\n\t\tif (indexes.firstNonMeasuredItemIndex !== undefined) {\r\n\t\t\treturn indexes\r\n\t\t}\r\n\r\n\t\tconst { lastShownItemIndex } = indexes\r\n\r\n\t\treturn {\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t}\r\n\t}\r\n\r\n\t_getShownItemIndex(parameters) {\r\n\t\tconst {\r\n\t\t\tbeforeResize,\r\n\t\t\titemsCount,\r\n\t\t\tvisibleAreaInsideTheList,\r\n\t\t\tfindFirstShownItemIndex,\r\n\t\t\tfindLastShownItemIndex,\r\n\t\t\t// backwards\r\n\t\t} = parameters\r\n\r\n\t\tlet {\r\n\t\t\tfromIndex,\r\n\t\t\tbeforeItemsHeight\r\n\t\t} = parameters\r\n\r\n\t\t// This function could potentially also use `this.getPreviouslyCalculatedLayout()`\r\n\t\t// in order to skip calculating visible item indexes from scratch\r\n\t\t// and instead just calculate the difference from a \"previously calculated layout\".\r\n\t\t//\r\n\t\t// I did a simple test in a web browser and found out that running the following\r\n\t\t// piece of code is less than 10 milliseconds:\r\n\t\t//\r\n\t\t// var startedAt = Date.now()\r\n\t\t// var i = 0\r\n\t\t// while (i < 1000000) {\r\n\t\t// i++\r\n\t\t// }\r\n\t\t// console.log(Date.now() - startedAt)\r\n\t\t//\r\n\t\t// Which becomes negligible in my project's use case (a couple thousands items max).\r\n\t\t//\r\n\t\t// If someone would attempt to use a \"previously calculated layout\" here\r\n\t\t// then `shownItemsHeight` would also have to be returned from this function:\r\n\t\t// the total height of all shown items including vertical spacing between them.\r\n\t\t//\r\n\t\t// If \"previously calculated layout\" would be used then it would first find\r\n\t\t// `firstShownItemIndex` and then find `lastShownItemIndex` as part of two\r\n\t\t// separate calls of this function, each with or without `backwards` flag,\r\n\t\t// depending on whether `visibleAreaInsideTheList.top` and `visibleAreaInsideTheList.top`\r\n\t\t// have shifted up or down.\r\n\r\n\t\tlet firstShownItemIndex\r\n\t\tlet lastShownItemIndex\r\n\r\n\t\t// It's not always required to pass `beforeItemsHeight` parameter:\r\n\t\t// when `fromIndex` is `0`, it's also assumed to be `0`.\r\n\t\tif (fromIndex === 0) {\r\n\t\t\tbeforeItemsHeight = 0\r\n\t\t}\r\n\r\n\t\tif (beforeItemsHeight === undefined) {\r\n\t\t\tthrow new Error('[virtual-scroller] `beforeItemsHeight` not passed to `Layout.getShownItemIndexes()` when starting from index ' + fromIndex);\r\n\t\t}\r\n\r\n\t\t// const backwards = false\r\n\t\t// while (backwards ? i >= 0 : i < itemsCount) {}\r\n\r\n\t\tif (!beforeResize) {\r\n\t\t\tconst beforeResizeItemsCount = this.getBeforeResizeItemsCount()\r\n\t\t\tif (beforeResizeItemsCount > fromIndex) {\r\n\t\t\t\t// First search for the item in \"before resize\" items.\r\n\t\t\t\tconst {\r\n\t\t\t\t\tnotFound,\r\n\t\t\t\t\tbeforeItemsHeight: beforeResizeItemsHeight,\r\n\t\t\t\t\tfirstShownItemIndex,\r\n\t\t\t\t\tlastShownItemIndex\r\n\t\t\t\t} = this._getShownItemIndex({\r\n\t\t\t\t\t...parameters,\r\n\t\t\t\t\tbeforeResize: true,\r\n\t\t\t\t\titemsCount: beforeResizeItemsCount\r\n\t\t\t\t})\r\n\r\n\t\t\t\t// If the item was not found in \"before resize\" items\r\n\t\t\t\t// then search in regular items skipping \"before resize\" ones.\r\n\t\t\t\tif (notFound) {\r\n\t\t\t\t\tbeforeItemsHeight = beforeResizeItemsHeight\r\n\t\t\t\t\tfromIndex += beforeResizeItemsCount\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// If the item was found in \"before resize\" items\r\n\t\t\t\t\t// then return the result.\r\n\t\t\t\t\t// Rebalance first / last shown item indexes based on\r\n\t\t\t\t\t// the current columns count, if required.\r\n\t\t\t\t\tconst columnsCount = this.getColumnsCount()\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tfirstShownItemIndex: firstShownItemIndex === undefined\r\n\t\t\t\t\t\t\t? undefined\r\n\t\t\t\t\t\t\t: Math.floor(firstShownItemIndex / columnsCount) * columnsCount,\r\n\t\t\t\t\t\tlastShownItemIndex: lastShownItemIndex === undefined\r\n\t\t\t\t\t\t\t? undefined\r\n\t\t\t\t\t\t\t: Math.floor(lastShownItemIndex / columnsCount) * columnsCount,\r\n\t\t\t\t\t\tbeforeItemsHeight: beforeResizeItemsHeight\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst columnsCount = beforeResize ? this.getColumnsCountBeforeResize() : this.getColumnsCount()\r\n\t\tconst verticalSpacing = beforeResize ? this.getVerticalSpacingBeforeResize() : this.getVerticalSpacing()\r\n\r\n\t\tlet i = fromIndex\r\n\t\twhile (i < itemsCount) {\r\n\t\t\tconst currentRowFirstItemIndex = i\r\n\r\n\t\t\tconst hasMoreRows = itemsCount > currentRowFirstItemIndex + columnsCount\r\n\t\t\tconst verticalSpacingAfterCurrentRow = hasMoreRows ? verticalSpacing : 0\r\n\r\n\t\t\tlet currentRowHeight = 0\r\n\r\n\t\t\t// Calculate current row height.\r\n\t\t\tlet columnIndex = 0\r\n\t\t\twhile (columnIndex < columnsCount && i < itemsCount) {\r\n\t\t\t\tconst itemHeight = beforeResize ? this.getItemHeightBeforeResize(i) : this.getItemHeight(i)\r\n\r\n\t\t\t\t// If this item hasn't been measured yet (or re-measured after a resize)\r\n\t\t\t\t// then mark it as the first non-measured one.\r\n\t\t\t\t//\r\n\t\t\t\t// Can't happen by definition when `beforeResize` parameter is `true`.\r\n\t\t\t\t//\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\treturn this.getItemNotMeasuredIndexes(i, {\r\n\t\t\t\t\t\titemsCount,\r\n\t\t\t\t\t\tfirstShownItemIndex: findLastShownItemIndex ? fromIndex : undefined,\r\n\t\t\t\t\t\tindexOfTheFirstItemInTheRow: currentRowFirstItemIndex,\r\n\t\t\t\t\t\tnonMeasuredAreaHeight: (visibleAreaInsideTheList.bottom + this.getPrerenderMargin()) - beforeItemsHeight\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcurrentRowHeight = Math.max(currentRowHeight, itemHeight)\r\n\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t\ti++\r\n\t\t\t}\r\n\r\n\t\t\tconst itemsHeightFromFirstRowToThisRow = beforeItemsHeight + currentRowHeight\r\n\r\n\t\t\tconst rowStepsIntoVisibleAreaTop = itemsHeightFromFirstRowToThisRow > visibleAreaInsideTheList.top - this.getPrerenderMargin()\r\n\t\t\tconst rowStepsOutOfVisibleAreaBottomOrIsAtTheBorder = itemsHeightFromFirstRowToThisRow + verticalSpacingAfterCurrentRow >= visibleAreaInsideTheList.bottom + this.getPrerenderMargin()\r\n\r\n\t\t\t// if (backwards) {\r\n\t\t\t// \tif (findFirstShownItemIndex) {\r\n\t\t\t// \t\tif (rowStepsOutOfVisibleAreaTop) {\r\n\t\t\t// \t\t\treturn {\r\n\t\t\t// \t\t\t\tfirstShownItemIndex: currentRowFirstItemIndex + columnsCount\r\n\t\t\t// \t\t\t}\r\n\t\t\t// \t\t}\r\n\t\t\t// \t} else if (findLastShownItemIndex) {\r\n\t\t\t// \t\tif (rowStepsIntoVisibleAreaBottom) {\r\n\t\t\t// \t\t\treturn {\r\n\t\t\t// \t\t\t\tlastShownItemIndex: currentRowFirstItemIndex + columnsCount - 1\r\n\t\t\t// \t\t\t}\r\n\t\t\t// \t\t}\r\n\t\t\t// \t}\r\n\t\t\t// }\r\n\r\n\t\t\tif (findFirstShownItemIndex) {\r\n\t\t\t\tif (rowStepsIntoVisibleAreaTop) {\r\n\t\t\t\t\t// If item is the first one visible in the viewport\r\n\t\t\t\t\t// then start showing items from this row.\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tfirstShownItemIndex: currentRowFirstItemIndex,\r\n\t\t\t\t\t\tbeforeItemsHeight\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (findLastShownItemIndex) {\r\n\t\t\t\tif (rowStepsOutOfVisibleAreaBottomOrIsAtTheBorder) {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tlastShownItemIndex: Math.min(\r\n\t\t\t\t\t\t\t// The index of the last item in the current row.\r\n\t\t\t\t\t\t\tcurrentRowFirstItemIndex + columnsCount - 1,\r\n\t\t\t\t\t\t\t// Guards against index overflow.\r\n\t\t\t\t\t\t\titemsCount - 1\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tbeforeItemsHeight += currentRowHeight + verticalSpacingAfterCurrentRow\r\n\r\n\t\t\t// if (backwards) {\r\n\t\t\t// \t// Set `i` to be the first item of the current row.\r\n\t\t\t// \ti -= columnsCount\r\n\t\t\t// \tconst prevoiusRowIsBeforeResize = i - 1 < this.getBeforeResizeItemsCount()\r\n\t\t\t// \tconst previousRowColumnsCount = prevoiusRowIsBeforeResize ? this.getColumnsCountBeforeResize() : this.getColumnsCount()\r\n\t\t\t// \t// Set `i` to be the first item of the previous row.\r\n\t\t\t// \ti -= previousRowColumnsCount\r\n\t\t\t// }\r\n\t\t}\r\n\r\n\t\t// if (backwards) {\r\n\t\t// \tif (findFirstShownItemIndex) {\r\n\t\t// \t\twarn('The list is supposed to be visible but no visible item has been found (while traversing backwards)')\r\n\t\t// \t\treturn null\r\n\t\t// \t} else if (findLastShownItemIndex) {\r\n\t\t// \t\treturn {\r\n\t\t// \t\t\tfirstShownItemIndex: 0\r\n\t\t// \t\t}\r\n\t\t// \t}\r\n\t\t// }\r\n\r\n\t\tif (beforeResize) {\r\n\t\t\treturn {\r\n\t\t\t\tnotFound: true,\r\n\t\t\t\tbeforeItemsHeight\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// This case isn't supposed to happen but it could hypothetically happen\r\n\t\t// because the list height is measured from the user's screen and\r\n\t\t// not necessarily can be trusted.\r\n\t\tif (findFirstShownItemIndex) {\r\n\t\t\twarn('The list is supposed to be visible but no visible item has been found')\r\n\t\t\treturn null\r\n\t\t} else if (findLastShownItemIndex) {\r\n\t\t\treturn {\r\n\t\t\t\tlastShownItemIndex: itemsCount - 1\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tgetNonVisibleListShownItemIndexes() {\r\n\t\tconst layout = {\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 0\r\n\t\t}\r\n\t\tif (this.getItemHeight(0) === undefined) {\r\n\t\t\tlayout.firstNonMeasuredItemIndex = 0\r\n\t\t}\r\n\t\treturn layout\r\n\t}\r\n\r\n\t/**\r\n\t * Measures \"before\" items height.\r\n\t * @param {number} beforeItemsCount — Basically, first shown item index.\r\n\t * @return {number}\r\n\t */\r\n\tgetBeforeItemsHeight(\r\n\t\tbeforeItemsCount,\r\n\t\t{ beforeResize } = {}\r\n\t) {\r\n\t\t// This function could potentially also use `this.getPreviouslyCalculatedLayout()`\r\n\t\t// in order to skip calculating visible item indexes from scratch\r\n\t\t// and instead just calculate the difference from a \"previously calculated layout\".\r\n\t\t//\r\n\t\t// I did a simple test in a web browser and found out that running the following\r\n\t\t// piece of code is less than 10 milliseconds:\r\n\t\t//\r\n\t\t// var startedAt = Date.now()\r\n\t\t// var i = 0\r\n\t\t// while (i < 1000000) {\r\n\t\t// i++\r\n\t\t// }\r\n\t\t// console.log(Date.now() - startedAt)\r\n\t\t//\r\n\t\t// Which becomes negligible in my project's use case (a couple thousands items max).\r\n\r\n\t\tlet beforeItemsHeight = 0\r\n\t\tlet i = 0\r\n\r\n\t\tif (!beforeResize) {\r\n\t\t\tconst beforeResizeItemsCount = this.getBeforeResizeItemsCount()\r\n\r\n\t\t\tif (beforeResizeItemsCount > 0) {\r\n\t\t\t\t// First add all \"before resize\" item heights.\r\n\t\t\t\tbeforeItemsHeight = this.getBeforeItemsHeight(\r\n\t\t\t\t\t// `firstShownItemIndex` (called `beforeItemsCount`) could be greater than\r\n\t\t\t\t\t// `beforeResizeItemsCount` when the user scrolls down.\r\n\t\t\t\t\t// `firstShownItemIndex` (called `beforeItemsCount`) could be less than\r\n\t\t\t\t\t// `beforeResizeItemsCount` when the user scrolls up.\r\n\t\t\t\t\tMath.min(beforeItemsCount, beforeResizeItemsCount),\r\n\t\t\t\t\t{ beforeResize: true }\r\n\t\t\t\t)\r\n\t\t\t\ti = beforeResizeItemsCount\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst columnsCount = beforeResize ? this.getColumnsCountBeforeResize() : this.getColumnsCount()\r\n\t\tconst verticalSpacing = beforeResize ? this.getVerticalSpacingBeforeResize() : this.getVerticalSpacing()\r\n\r\n\t\twhile (i < beforeItemsCount) {\r\n\t\t\tconst currentRowFirstItemIndex = i\r\n\r\n\t\t\tlet rowHeight = 0\r\n\t\t\tlet columnIndex = 0\r\n\t\t\t// Not checking for `itemsCount` overflow here because `i = beforeItemsCount`\r\n\t\t\t// can only start at the start of a row, meaning that when calculating\r\n\t\t\t// \"before items height\" it's not supposed to add item heights from the\r\n\t\t\t// last row of items because in that case it would have to iterate from\r\n\t\t\t// `i === beforeItemsCount` and that condition is already checked above.\r\n\t\t\t// while (i < itemsCount) {\r\n\t\t\twhile (columnIndex < columnsCount) {\r\n\t\t\t\tlet itemHeight = beforeResize ? this.getItemHeightBeforeResize(i) : this.getItemHeight(i)\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\t// `itemHeight` can only be `undefined` when not `beforeResize`.\r\n\t\t\t\t\t// Use the current \"average item height\" as a substitute.\r\n\t\t\t\t\titemHeight = this.getAverageItemHeight()\r\n\t\t\t\t}\r\n\t\t\t\trowHeight = Math.max(rowHeight, itemHeight)\r\n\t\t\t\ti++\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t}\r\n\r\n\t\t\tbeforeItemsHeight += rowHeight\r\n\t\t\tbeforeItemsHeight += verticalSpacing\r\n\t\t}\r\n\r\n\t\treturn beforeItemsHeight\r\n\t}\r\n\r\n\t/**\r\n\t * Measures \"after\" items height.\r\n\t * @param {number} lastShownItemIndex — Last shown item index.\r\n\t * @param {number} itemsCount — Items count.\r\n\t * @return {number}\r\n\t */\r\n\tgetAfterItemsHeight(\r\n\t\tlastShownItemIndex,\r\n\t\titemsCount\r\n\t) {\r\n\t\t// This function could potentially also use `this.getPreviouslyCalculatedLayout()`\r\n\t\t// in order to skip calculating visible item indexes from scratch\r\n\t\t// and instead just calculate the difference from a \"previously calculated layout\".\r\n\t\t//\r\n\t\t// I did a simple test in a web browser and found out that running the following\r\n\t\t// piece of code is less than 10 milliseconds:\r\n\t\t//\r\n\t\t// var startedAt = Date.now()\r\n\t\t// var i = 0\r\n\t\t// while (i < 1000000) {\r\n\t\t// i++\r\n\t\t// }\r\n\t\t// console.log(Date.now() - startedAt)\r\n\t\t//\r\n\t\t// Which becomes negligible in my project's use case (a couple thousands items max).\r\n\r\n\t\tconst columnsCount = this.getColumnsCount()\r\n\t\tconst lastShownRowIndex = Math.floor(lastShownItemIndex / columnsCount)\r\n\r\n\t\tlet afterItemsHeight = 0\r\n\r\n\t\tlet i = lastShownItemIndex + 1\r\n\t\twhile (i < itemsCount) {\r\n\t\t\tlet rowHeight = 0\r\n\t\t\tlet columnIndex = 0\r\n\t\t\twhile (columnIndex < columnsCount && i < itemsCount) {\r\n\t\t\t\tlet itemHeight = this.getItemHeight(i)\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\titemHeight = this.getAverageItemHeight()\r\n\t\t\t\t}\r\n\t\t\t\trowHeight = Math.max(rowHeight, itemHeight)\r\n\t\t\t\ti++\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t}\r\n\r\n\t\t\t// Add all \"after\" items height.\r\n\t\t\tafterItemsHeight += this.getVerticalSpacing()\r\n\t\t\tafterItemsHeight += rowHeight\r\n\t\t}\r\n\r\n\t\treturn afterItemsHeight\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the items's top offset relative to the top edge of the first item.\r\n\t * @param {number} i — Item index\r\n\t * @return {[number]} Returns `undefined` if any of the previous items haven't been rendered yet.\r\n\t */\r\n\tgetItemTopOffset(i) {\r\n\t\tlet topOffsetInsideScrollableContainer = 0\r\n\r\n\t\tconst beforeResizeItemsCount = this.getBeforeResizeItemsCount()\r\n\t\tconst beforeResizeRowsCount = beforeResizeItemsCount === 0\r\n\t\t\t? 0\r\n\t\t\t: Math.ceil(beforeResizeItemsCount / this.getColumnsCountBeforeResize())\r\n\r\n\t\tconst maxBeforeResizeRowsCount = i < beforeResizeItemsCount\r\n\t\t\t? Math.floor(i / this.getColumnsCountBeforeResize())\r\n\t\t\t: beforeResizeRowsCount\r\n\r\n\t\tlet beforeResizeRowIndex = 0\r\n\t\twhile (beforeResizeRowIndex < maxBeforeResizeRowsCount) {\r\n\t\t\tconst rowHeight = this.getItemHeightBeforeResize(\r\n\t\t\t\tbeforeResizeRowIndex * this.getColumnsCountBeforeResize()\r\n\t\t\t)\r\n\r\n\t\t\ttopOffsetInsideScrollableContainer += rowHeight\r\n\t\t\ttopOffsetInsideScrollableContainer += this.getVerticalSpacingBeforeResize()\r\n\r\n\t\t\tbeforeResizeRowIndex++\r\n\t\t}\r\n\r\n\t\tconst itemRowIndex = Math.floor((i - beforeResizeItemsCount) / this.getColumnsCount())\r\n\r\n\t\tlet rowIndex = 0\r\n\t\twhile (rowIndex < itemRowIndex) {\r\n\t\t\tlet rowHeight = 0\r\n\t\t\tlet columnIndex = 0\r\n\t\t\twhile (columnIndex < this.getColumnsCount()) {\r\n\t\t\t\tconst itemHeight = this.getItemHeight(\r\n\t\t\t\t\tbeforeResizeItemsCount + rowIndex * this.getColumnsCount() + columnIndex\r\n\t\t\t\t)\r\n\t\t\t\tif (itemHeight === undefined) {\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t\trowHeight = Math.max(rowHeight, itemHeight)\r\n\t\t\t\tcolumnIndex++\r\n\t\t\t}\r\n\r\n\t\t\ttopOffsetInsideScrollableContainer += rowHeight\r\n\t\t\ttopOffsetInsideScrollableContainer += this.getVerticalSpacing()\r\n\r\n\t\t\trowIndex++\r\n\t\t}\r\n\r\n\t\treturn topOffsetInsideScrollableContainer\r\n\t}\r\n}\r\n\r\nexport const LAYOUT_REASON = {\r\n\tSCROLL: 'scroll',\r\n\tSTOPPED_SCROLLING: 'stopped scrolling',\r\n\tMANUAL: 'manual',\r\n\tSTARTED: 'started',\r\n\tNON_MEASURED_ITEMS_HAVE_BEEN_MEASURED: 'non-measured item heights have been measured',\r\n\tVIEWPORT_WIDTH_CHANGED: 'viewport width changed',\r\n\tVIEWPORT_HEIGHT_CHANGED: 'viewport height changed',\r\n\tVIEWPORT_SIZE_UNCHANGED: 'viewport size unchanged',\r\n\tITEM_HEIGHT_CHANGED: 'item height changed',\r\n\tITEMS_CHANGED: 'items changed',\r\n\tTOP_OFFSET_CHANGED: 'list top offset changed'\r\n}"],"mappings":"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"}
@@ -23,7 +23,7 @@ var Scroll = /*#__PURE__*/function () {
23
23
  function Scroll(_ref) {
24
24
  var _this = this;
25
25
 
26
- var bypass = _ref.bypass,
26
+ var isInBypassMode = _ref.isInBypassMode,
27
27
  scrollableContainer = _ref.scrollableContainer,
28
28
  itemsContainer = _ref.itemsContainer,
29
29
  onScroll = _ref.onScroll,
@@ -57,7 +57,7 @@ var Scroll = /*#__PURE__*/function () {
57
57
  }
58
58
  }
59
59
 
60
- if (_this.bypass) {
60
+ if (_this.isInBypassMode()) {
61
61
  return;
62
62
  }
63
63
 
@@ -119,7 +119,7 @@ var Scroll = /*#__PURE__*/function () {
119
119
  _this.watchOnStopScrolling();
120
120
  });
121
121
 
122
- this.bypass = bypass;
122
+ this.isInBypassMode = isInBypassMode;
123
123
  this.scrollableContainer = scrollableContainer;
124
124
  this.itemsContainer = itemsContainer;
125
125
  this.onScroll = onScroll;