virtual-scroller 1.14.0 → 1.15.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 (216) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +309 -250
  3. package/bundle/index-dom-bypass.html +198 -0
  4. package/bundle/index-dom-grid.html +204 -0
  5. package/bundle/index-dom-scrollableContainer.html +215 -0
  6. package/bundle/index-dom-tbody-scrollableContainer.html +81 -0
  7. package/bundle/index-dom-tbody.html +65 -0
  8. package/bundle/index-dom.html +115 -84
  9. package/bundle/{index-bypass.html → index-react-bypass.html} +83 -78
  10. package/bundle/{index-grid.html → index-react-grid.html} +78 -91
  11. package/bundle/{index-scrollableContainer.html → index-react-scrollableContainer.html} +96 -91
  12. package/bundle/index-react-strictMode.html +199 -0
  13. package/bundle/index-react-tbody-scrollableContainer.html +96 -0
  14. package/bundle/index-react-tbody.html +80 -0
  15. package/bundle/{messages.js → items.js} +1 -1
  16. package/bundle/lib/babel.min.js +25 -0
  17. package/bundle/lib/prop-types.min.js +1 -0
  18. package/bundle/lib/react-dom.development.js +29924 -0
  19. package/bundle/lib/react-dom.production.min.js +267 -0
  20. package/bundle/lib/react.development.js +3343 -0
  21. package/bundle/lib/react.production.min.js +31 -0
  22. package/bundle/style.base.css +33 -0
  23. package/{website/style.css → bundle/style.list.css} +10 -43
  24. package/bundle/style.list.grid.css +23 -0
  25. package/bundle/virtual-scroller-dom.js +1 -1
  26. package/bundle/virtual-scroller-dom.js.map +1 -1
  27. package/bundle/virtual-scroller-react.js +1 -1
  28. package/bundle/virtual-scroller-react.js.map +1 -1
  29. package/bundle/virtual-scroller.js +1 -1
  30. package/bundle/virtual-scroller.js.map +1 -1
  31. package/commonjs/BeforeResize.js +1 -2
  32. package/commonjs/BeforeResize.js.map +1 -1
  33. package/commonjs/DOM/VirtualScroller.js +7 -13
  34. package/commonjs/DOM/VirtualScroller.js.map +1 -1
  35. package/commonjs/DOM/tbody.js +6 -6
  36. package/commonjs/DOM/tbody.js.map +1 -1
  37. package/commonjs/ItemHeights.js +10 -13
  38. package/commonjs/ItemHeights.js.map +1 -1
  39. package/commonjs/Layout.defaults.js +21 -0
  40. package/commonjs/Layout.defaults.js.map +1 -0
  41. package/commonjs/Layout.js +75 -64
  42. package/commonjs/Layout.js.map +1 -1
  43. package/commonjs/Layout.test.js +8 -4
  44. package/commonjs/Layout.test.js.map +1 -1
  45. package/commonjs/VirtualScroller.constructor.js +38 -4
  46. package/commonjs/VirtualScroller.constructor.js.map +1 -1
  47. package/commonjs/VirtualScroller.items.js +50 -4
  48. package/commonjs/VirtualScroller.items.js.map +1 -1
  49. package/commonjs/VirtualScroller.js +23 -14
  50. package/commonjs/VirtualScroller.js.map +1 -1
  51. package/commonjs/VirtualScroller.layout.js +40 -29
  52. package/commonjs/VirtualScroller.layout.js.map +1 -1
  53. package/commonjs/VirtualScroller.onContainerResize.js +1 -2
  54. package/commonjs/VirtualScroller.onContainerResize.js.map +1 -1
  55. package/commonjs/VirtualScroller.state.js +10 -9
  56. package/commonjs/VirtualScroller.state.js.map +1 -1
  57. package/commonjs/VirtualScroller.verticalSpacing.js +39 -6
  58. package/commonjs/VirtualScroller.verticalSpacing.js.map +1 -1
  59. package/commonjs/react/VirtualScroller.js +85 -34
  60. package/commonjs/react/VirtualScroller.js.map +1 -1
  61. package/commonjs/react/useClassName.js +2 -2
  62. package/commonjs/react/useClassName.js.map +1 -1
  63. package/commonjs/react/useForwardedRef.js +50 -0
  64. package/commonjs/react/useForwardedRef.js.map +1 -0
  65. package/commonjs/react/useInstanceMethods.js +4 -4
  66. package/commonjs/react/useInstanceMethods.js.map +1 -1
  67. package/commonjs/react/useItemKeys.js +28 -5
  68. package/commonjs/react/useItemKeys.js.map +1 -1
  69. package/commonjs/react/useOnItemHeightDidChange.js +28 -12
  70. package/commonjs/react/useOnItemHeightDidChange.js.map +1 -1
  71. package/commonjs/react/useSetItemState.js +31 -12
  72. package/commonjs/react/useSetItemState.js.map +1 -1
  73. package/commonjs/react/useState.js +9 -9
  74. package/commonjs/react/useState.js.map +1 -1
  75. package/commonjs/react/{useStateNoStaleBug.js → useStateWithRepeatableRead.js} +3 -3
  76. package/commonjs/react/useStateWithRepeatableRead.js.map +1 -0
  77. package/commonjs/react/useStyle.js +10 -4
  78. package/commonjs/react/useStyle.js.map +1 -1
  79. package/commonjs/react/useValidateTableBodyItemsContainer.js +24 -0
  80. package/commonjs/react/useValidateTableBodyItemsContainer.js.map +1 -0
  81. package/commonjs/react/useVirtualScroller.js +4 -3
  82. package/commonjs/react/useVirtualScroller.js.map +1 -1
  83. package/commonjs/test/ItemsContainer.js +10 -10
  84. package/commonjs/test/ItemsContainer.js.map +1 -1
  85. package/commonjs/test/VirtualScroller.js +25 -10
  86. package/commonjs/test/VirtualScroller.js.map +1 -1
  87. package/dom/index.d.ts +6 -5
  88. package/index.d.ts +19 -8
  89. package/modules/BeforeResize.js +1 -2
  90. package/modules/BeforeResize.js.map +1 -1
  91. package/modules/DOM/VirtualScroller.js +7 -13
  92. package/modules/DOM/VirtualScroller.js.map +1 -1
  93. package/modules/DOM/tbody.js +4 -4
  94. package/modules/DOM/tbody.js.map +1 -1
  95. package/modules/ItemHeights.js +11 -14
  96. package/modules/ItemHeights.js.map +1 -1
  97. package/modules/Layout.defaults.js +11 -0
  98. package/modules/Layout.defaults.js.map +1 -0
  99. package/modules/Layout.js +74 -64
  100. package/modules/Layout.js.map +1 -1
  101. package/modules/Layout.test.js +8 -4
  102. package/modules/Layout.test.js.map +1 -1
  103. package/modules/VirtualScroller.constructor.js +37 -4
  104. package/modules/VirtualScroller.constructor.js.map +1 -1
  105. package/modules/VirtualScroller.items.js +51 -5
  106. package/modules/VirtualScroller.items.js.map +1 -1
  107. package/modules/VirtualScroller.js +23 -14
  108. package/modules/VirtualScroller.js.map +1 -1
  109. package/modules/VirtualScroller.layout.js +40 -29
  110. package/modules/VirtualScroller.layout.js.map +1 -1
  111. package/modules/VirtualScroller.onContainerResize.js +1 -2
  112. package/modules/VirtualScroller.onContainerResize.js.map +1 -1
  113. package/modules/VirtualScroller.state.js +10 -9
  114. package/modules/VirtualScroller.state.js.map +1 -1
  115. package/modules/VirtualScroller.verticalSpacing.js +38 -6
  116. package/modules/VirtualScroller.verticalSpacing.js.map +1 -1
  117. package/modules/react/VirtualScroller.js +84 -35
  118. package/modules/react/VirtualScroller.js.map +1 -1
  119. package/modules/react/useClassName.js +3 -3
  120. package/modules/react/useClassName.js.map +1 -1
  121. package/modules/react/useForwardedRef.js +42 -0
  122. package/modules/react/useForwardedRef.js.map +1 -0
  123. package/modules/react/useInstanceMethods.js +4 -4
  124. package/modules/react/useInstanceMethods.js.map +1 -1
  125. package/modules/react/useItemKeys.js +28 -5
  126. package/modules/react/useItemKeys.js.map +1 -1
  127. package/modules/react/useOnItemHeightDidChange.js +28 -12
  128. package/modules/react/useOnItemHeightDidChange.js.map +1 -1
  129. package/modules/react/useSetItemState.js +31 -12
  130. package/modules/react/useSetItemState.js.map +1 -1
  131. package/modules/react/useState.js +9 -9
  132. package/modules/react/useState.js.map +1 -1
  133. package/modules/react/{useStateNoStaleBug.js → useStateWithRepeatableRead.js} +2 -2
  134. package/modules/react/useStateWithRepeatableRead.js.map +1 -0
  135. package/modules/react/useStyle.js +10 -4
  136. package/modules/react/useStyle.js.map +1 -1
  137. package/modules/react/useValidateTableBodyItemsContainer.js +16 -0
  138. package/modules/react/useValidateTableBodyItemsContainer.js.map +1 -0
  139. package/modules/react/useVirtualScroller.js +4 -3
  140. package/modules/react/useVirtualScroller.js.map +1 -1
  141. package/modules/test/ItemsContainer.js +10 -10
  142. package/modules/test/ItemsContainer.js.map +1 -1
  143. package/modules/test/VirtualScroller.js +25 -10
  144. package/modules/test/VirtualScroller.js.map +1 -1
  145. package/package.json +1 -1
  146. package/react/as.d.ts +42 -0
  147. package/react/index.d.ts +204 -63
  148. package/source/BeforeResize.js +1 -2
  149. package/source/DOM/VirtualScroller.js +7 -13
  150. package/source/DOM/tbody.js +5 -5
  151. package/source/ItemHeights.js +11 -12
  152. package/source/Layout.defaults.js +8 -0
  153. package/source/Layout.js +66 -53
  154. package/source/Layout.test.js +7 -2
  155. package/source/VirtualScroller.constructor.js +27 -4
  156. package/source/VirtualScroller.items.js +47 -2
  157. package/source/VirtualScroller.js +23 -14
  158. package/source/VirtualScroller.layout.js +41 -28
  159. package/source/VirtualScroller.onContainerResize.js +1 -2
  160. package/source/VirtualScroller.state.js +10 -11
  161. package/source/VirtualScroller.verticalSpacing.js +32 -6
  162. package/source/react/VirtualScroller.js +96 -33
  163. package/source/react/useClassName.js +3 -3
  164. package/source/react/useForwardedRef.js +39 -0
  165. package/source/react/useInstanceMethods.js +12 -4
  166. package/source/react/useItemKeys.js +22 -4
  167. package/source/react/useOnItemHeightDidChange.js +29 -10
  168. package/source/react/useSetItemState.js +32 -10
  169. package/source/react/useState.js +6 -6
  170. package/source/react/{useStateNoStaleBug.js → useStateWithRepeatableRead.js} +1 -1
  171. package/source/react/useStyle.js +3 -2
  172. package/source/react/useValidateTableBodyItemsContainer.js +16 -0
  173. package/source/react/useVirtualScroller.js +4 -3
  174. package/source/test/ItemsContainer.js +10 -10
  175. package/source/test/VirtualScroller.js +16 -10
  176. package/website/index-dom-bypass.html +198 -0
  177. package/website/index-dom-grid.html +204 -0
  178. package/website/index-dom-scrollableContainer.html +215 -0
  179. package/website/index-dom-tbody-scrollableContainer.html +81 -0
  180. package/website/index-dom-tbody.html +65 -0
  181. package/website/index-dom.html +117 -84
  182. package/website/index-react-bypass.html +200 -0
  183. package/website/{index-grid.html → index-react-grid.html} +79 -92
  184. package/website/index-react-scrollableContainer.html +213 -0
  185. package/website/index-react-strictMode.html +199 -0
  186. package/website/index-react-tbody-scrollableContainer.html +96 -0
  187. package/website/index-react-tbody.html +80 -0
  188. package/website/{index-bypass.html → index-react.html} +84 -70
  189. package/website/index.html +84 -69
  190. package/website/{messages.js → items.js} +1 -1
  191. package/website/lib/babel.min.js +25 -0
  192. package/website/lib/prop-types.min.js +1 -0
  193. package/website/lib/react-dom.development.js +29924 -0
  194. package/website/lib/react-dom.production.min.js +267 -0
  195. package/website/lib/react.development.js +3343 -0
  196. package/website/lib/react.production.min.js +31 -0
  197. package/website/style.base.css +33 -0
  198. package/website/style.list.css +92 -0
  199. package/website/style.list.grid.css +23 -0
  200. package/bundle/index-tbody-scrollableContainer.html +0 -70
  201. package/bundle/index-tbody.html +0 -57
  202. package/bundle/on-scroll-to-dom.js +0 -2
  203. package/bundle/on-scroll-to-dom.js.map +0 -1
  204. package/bundle/on-scroll-to-react.js +0 -2
  205. package/bundle/on-scroll-to-react.js.map +0 -1
  206. package/bundle/on-scroll-to.js +0 -2
  207. package/bundle/on-scroll-to.js.map +0 -1
  208. package/commonjs/react/useStateNoStaleBug.js.map +0 -1
  209. package/modules/react/useStateNoStaleBug.js.map +0 -1
  210. package/website/index-scrollableContainer.html +0 -208
  211. package/website/index-tbody-scrollableContainer.html +0 -70
  212. package/website/index-tbody.html +0 -57
  213. package/website/lib/on-scroll-to-dom.js +0 -2
  214. package/website/lib/on-scroll-to-dom.js.map +0 -1
  215. package/website/lib/on-scroll-to-react.js +0 -2
  216. package/website/lib/on-scroll-to-react.js.map +0 -1
@@ -11,6 +11,8 @@ var _debug = _interopRequireWildcard(require("./utility/debug.js"));
11
11
 
12
12
  var _ScrollableContainerNotReadyError = _interopRequireDefault(require("./ScrollableContainerNotReadyError.js"));
13
13
 
14
+ var _LayoutDefaults = require("./Layout.defaults.js");
15
+
14
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
15
17
 
16
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); }
@@ -32,10 +34,10 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
32
34
  var Layout = /*#__PURE__*/function () {
33
35
  function Layout(_ref) {
34
36
  var isInBypassMode = _ref.isInBypassMode,
35
- getInitialEstimatedItemHeight = _ref.getInitialEstimatedItemHeight,
36
- getInitialEstimatedVisibleItemRowsCount = _ref.getInitialEstimatedVisibleItemRowsCount,
37
+ getEstimatedVisibleItemRowsCountForInitialRender = _ref.getEstimatedVisibleItemRowsCountForInitialRender,
37
38
  measureItemsBatchSize = _ref.measureItemsBatchSize,
38
39
  getPrerenderMargin = _ref.getPrerenderMargin,
40
+ getPrerenderMarginRatio = _ref.getPrerenderMarginRatio,
39
41
  getVerticalSpacing = _ref.getVerticalSpacing,
40
42
  getVerticalSpacingBeforeResize = _ref.getVerticalSpacingBeforeResize,
41
43
  getColumnsCount = _ref.getColumnsCount,
@@ -50,10 +52,10 @@ var Layout = /*#__PURE__*/function () {
50
52
  _classCallCheck(this, Layout);
51
53
 
52
54
  this.isInBypassMode = isInBypassMode;
53
- this.getInitialEstimatedItemHeight = getInitialEstimatedItemHeight;
54
- this.getInitialEstimatedVisibleItemRowsCount = getInitialEstimatedVisibleItemRowsCount;
55
+ this.getEstimatedVisibleItemRowsCountForInitialRender = getEstimatedVisibleItemRowsCountForInitialRender;
55
56
  this.measureItemsBatchSize = measureItemsBatchSize;
56
57
  this.getPrerenderMargin = getPrerenderMargin;
58
+ this.getPrerenderMarginRatio = getPrerenderMarginRatio;
57
59
  this.getVerticalSpacing = getVerticalSpacing;
58
60
  this.getVerticalSpacingBeforeResize = getVerticalSpacingBeforeResize;
59
61
  this.getColumnsCount = getColumnsCount;
@@ -102,7 +104,9 @@ var Layout = /*#__PURE__*/function () {
102
104
  columnsCount = _ref2.columnsCount,
103
105
  beforeStart = _ref2.beforeStart;
104
106
  var firstShownItemIndex;
105
- var lastShownItemIndex; // If there're no items then `firstShownItemIndex` stays `undefined`.
107
+ var lastShownItemIndex;
108
+ var beforeItemsHeight = 0;
109
+ var afterItemsHeight = 0; // If there're no items then `firstShownItemIndex` stays `undefined`.
106
110
 
107
111
  if (itemsCount > 0) {
108
112
  var getLastShownItemIndex = function getLastShownItemIndex() {
@@ -114,12 +118,18 @@ var Layout = /*#__PURE__*/function () {
114
118
  };
115
119
 
116
120
  firstShownItemIndex = 0;
117
- lastShownItemIndex = beforeStart ? this.getInitialLayoutValueWithFallback('lastShownItemIndex', getLastShownItemIndex, 0) : getLastShownItemIndex();
121
+ lastShownItemIndex = beforeStart ? this.getInitialLayoutValueWithFallback('lastShownItemIndex', getLastShownItemIndex, firstShownItemIndex) : getLastShownItemIndex();
122
+ var averageItemHeight = this.getAverageItemHeight();
123
+ var verticalSpacing = this.getVerticalSpacing();
124
+ var beforeItemsCount = firstShownItemIndex;
125
+ var afterItemsCount = itemsCount - (lastShownItemIndex + 1);
126
+ beforeItemsHeight = Math.ceil(beforeItemsCount / columnsCount) * (verticalSpacing + averageItemHeight);
127
+ afterItemsHeight = Math.ceil(afterItemsCount / columnsCount) * (verticalSpacing + averageItemHeight);
118
128
  }
119
129
 
120
130
  return {
121
- beforeItemsHeight: 0,
122
- afterItemsHeight: 0,
131
+ beforeItemsHeight: beforeItemsHeight,
132
+ afterItemsHeight: afterItemsHeight,
123
133
  firstShownItemIndex: firstShownItemIndex,
124
134
  lastShownItemIndex: lastShownItemIndex
125
135
  };
@@ -133,65 +143,56 @@ var Layout = /*#__PURE__*/function () {
133
143
 
134
144
  if (this.isInBypassMode()) {
135
145
  return itemsCount - 1;
136
- } // On server side, at initialization time,
137
- // `scrollableContainer` is `undefined`,
138
- // so default to `1` estimated rows count.
139
-
140
-
141
- var estimatedRowsCount = 1;
142
-
143
- if (this.getMaxVisibleAreaHeight()) {
144
- estimatedRowsCount = this.getEstimatedRowsCountForHeight(this.getMaxVisibleAreaHeight() + this.getPrerenderMargin());
145
- } else if (this.getInitialEstimatedVisibleItemRowsCount) {
146
- estimatedRowsCount = this.getInitialEstimatedVisibleItemRowsCount();
147
-
148
- if (isNaN(estimatedRowsCount)) {
149
- throw new Error('[virtual-scroller] `getEstimatedVisibleItemRowsCount()` must return a number');
150
- }
151
146
  }
152
147
 
153
- return Math.min(firstShownItemIndex + (estimatedRowsCount * columnsCount - 1), itemsCount - 1);
148
+ return Math.min(firstShownItemIndex + (this.getInitialRenderedRowsCount() * columnsCount - 1), itemsCount - 1);
154
149
  }
155
150
  }, {
156
- key: "getEstimatedRowsCountForHeight",
157
- value: function getEstimatedRowsCountForHeight(height) {
158
- var estimatedItemHeight = this.getEstimatedItemHeight();
159
- var verticalSpacing = this.getVerticalSpacing();
151
+ key: "getInitialRenderedRowsCount",
152
+ value: function getInitialRenderedRowsCount() {
153
+ var estimatedVisibleItemRowsCount = this.getEstimatedVisibleItemRowsCount();
160
154
 
161
- if (estimatedItemHeight) {
162
- return Math.ceil((height + verticalSpacing) / (estimatedItemHeight + verticalSpacing));
163
- } else {
164
- // If no items have been rendered yet, and no `estimatedItemHeight` option
165
- // has been passed, then default to `1` estimated rows count in any `height`.
166
- return 1;
167
- }
168
- }
169
- /**
170
- * Returns estimated list item height.
171
- * (depends on which items have been previously rendered and measured).
172
- * @return {number}
173
- */
155
+ if (typeof estimatedVisibleItemRowsCount === 'number') {
156
+ return Math.ceil(estimatedVisibleItemRowsCount * (1 + this.getPrerenderMarginRatio()));
157
+ } // `DEFAULT_VISIBLE_ITEM_ROWS_COUNT` will be used in server-side render
158
+ // unless `getEstimatedVisibleItemRowsCount()` parameter is specified.
174
159
 
160
+
161
+ return _LayoutDefaults.DEFAULT_VISIBLE_ITEM_ROWS_COUNT;
162
+ }
175
163
  }, {
176
- key: "getEstimatedItemHeight",
177
- value: function getEstimatedItemHeight() {
178
- var averageItemHeight = this.getAverageItemHeight();
164
+ key: "getEstimatedVisibleItemRowsCount",
165
+ value: function getEstimatedVisibleItemRowsCount() {
166
+ var maxVisibleAreaHeight = this.getMaxVisibleAreaHeight();
167
+
168
+ if (typeof maxVisibleAreaHeight === 'number') {
169
+ var estimatedRowsCount = this.getEstimatedRowsCountForHeight(maxVisibleAreaHeight);
179
170
 
180
- if (averageItemHeight) {
181
- return averageItemHeight;
171
+ if (typeof estimatedRowsCount === 'number') {
172
+ return estimatedRowsCount;
173
+ }
182
174
  }
183
175
 
184
- if (this.getInitialEstimatedItemHeight) {
185
- var estimatedItemHeight = this.getInitialEstimatedItemHeight();
176
+ if (this.getEstimatedVisibleItemRowsCountForInitialRender) {
177
+ var _estimatedRowsCount = this.getEstimatedVisibleItemRowsCountForInitialRender();
186
178
 
187
- if (isNaN(estimatedItemHeight)) {
188
- throw new Error('[virtual-scroller] `getInitialEstimatedItemHeight()` must return a number');
179
+ if (typeof _estimatedRowsCount === 'number') {
180
+ return _estimatedRowsCount;
189
181
  }
190
182
 
191
- return estimatedItemHeight;
183
+ throw new Error('[virtual-scroller] `getEstimatedVisibleItemRowsCount()` must return a number');
192
184
  }
185
+ }
186
+ }, {
187
+ key: "getEstimatedRowsCountForHeight",
188
+ value: function getEstimatedRowsCountForHeight(height) {
189
+ var averageItemHeight = this.getAverageItemHeight();
190
+ var verticalSpacing = this.getVerticalSpacing(); // `estimatedItemHeight` will most likely be `0` if it hasn't been specified explicitly.
191
+ // In that case, it can't divide by `0`.
193
192
 
194
- return 0;
193
+ if (averageItemHeight + verticalSpacing > 0) {
194
+ return Math.ceil((height + verticalSpacing) / (averageItemHeight + verticalSpacing));
195
+ }
195
196
  }
196
197
  }, {
197
198
  key: "getLayoutUpdateForItemsDiff",
@@ -344,13 +345,27 @@ var Layout = /*#__PURE__*/function () {
344
345
  }, {
345
346
  key: "getItemNotMeasuredIndexes",
346
347
  value: function getItemNotMeasuredIndexes(i, _ref7) {
348
+ var _this2 = this;
349
+
347
350
  var itemsCount = _ref7.itemsCount,
348
351
  firstShownItemIndex = _ref7.firstShownItemIndex,
349
352
  nonMeasuredAreaHeight = _ref7.nonMeasuredAreaHeight,
350
353
  indexOfTheFirstItemInTheRow = _ref7.indexOfTheFirstItemInTheRow;
351
354
  (0, _debug["default"])('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.');
352
355
  var columnsCount = this.getColumnsCount();
353
- var itemsCountToRenderForMeasurement = Math.min(this.getEstimatedRowsCountForHeight(nonMeasuredAreaHeight) * columnsCount, this.measureItemsBatchSize || Infinity);
356
+
357
+ var getNonMeasuredItemRowsCount = function getNonMeasuredItemRowsCount() {
358
+ var estimatedRowsCount = _this2.getEstimatedRowsCountForHeight(nonMeasuredAreaHeight);
359
+
360
+ if (typeof estimatedRowsCount === 'number') {
361
+ return estimatedRowsCount;
362
+ } // Render all available item rows as a sensible fallback behavior.
363
+
364
+
365
+ return Math.ceil(itemsCount / columnsCount);
366
+ };
367
+
368
+ var itemsCountToRenderForMeasurement = Math.min(getNonMeasuredItemRowsCount() * columnsCount, this.measureItemsBatchSize || Infinity);
354
369
 
355
370
  if (firstShownItemIndex === undefined) {
356
371
  firstShownItemIndex = indexOfTheFirstItemInTheRow;
@@ -445,14 +460,12 @@ var Layout = /*#__PURE__*/function () {
445
460
  // then `shownItemsHeight` would also have to be returned from this function:
446
461
  // the total height of all shown items including vertical spacing between them.
447
462
  //
448
- // If "previously calculated layout" would be used then it would first find
449
- // `firstShownItemIndex` and then find `lastShownItemIndex` as part of two
463
+ // If "previously calculated layout" would be used then it would first calculate
464
+ // `firstShownItemIndex` and then calculate `lastShownItemIndex` as part of two
450
465
  // separate calls of this function, each with or without `backwards` flag,
451
466
  // depending on whether `visibleAreaInsideTheList.top` and `visibleAreaInsideTheList.top`
452
467
  // have shifted up or down.
453
-
454
- var firstShownItemIndex;
455
- var lastShownItemIndex; // It's not always required to pass `beforeItemsHeight` parameter:
468
+ // It's not always required to pass `beforeItemsHeight` parameter:
456
469
  // when `fromIndex` is `0`, it's also assumed to be `0`.
457
470
 
458
471
  if (fromIndex === 0) {
@@ -476,8 +489,8 @@ var Layout = /*#__PURE__*/function () {
476
489
  })),
477
490
  notFound = _this$_getShownItemIn.notFound,
478
491
  beforeResizeItemsHeight = _this$_getShownItemIn.beforeItemsHeight,
479
- _firstShownItemIndex = _this$_getShownItemIn.firstShownItemIndex,
480
- _lastShownItemIndex = _this$_getShownItemIn.lastShownItemIndex; // If the item was not found in "before resize" items
492
+ firstShownItemIndex = _this$_getShownItemIn.firstShownItemIndex,
493
+ lastShownItemIndex = _this$_getShownItemIn.lastShownItemIndex; // If the item was not found in "before resize" items
481
494
  // then search in regular items skipping "before resize" ones.
482
495
 
483
496
 
@@ -492,8 +505,8 @@ var Layout = /*#__PURE__*/function () {
492
505
  var _columnsCount = this.getColumnsCount();
493
506
 
494
507
  return {
495
- firstShownItemIndex: _firstShownItemIndex === undefined ? undefined : Math.floor(_firstShownItemIndex / _columnsCount) * _columnsCount,
496
- lastShownItemIndex: _lastShownItemIndex === undefined ? undefined : Math.floor(_lastShownItemIndex / _columnsCount) * _columnsCount,
508
+ firstShownItemIndex: firstShownItemIndex === undefined ? undefined : Math.floor(firstShownItemIndex / _columnsCount) * _columnsCount,
509
+ lastShownItemIndex: lastShownItemIndex === undefined ? undefined : Math.floor(lastShownItemIndex / _columnsCount) * _columnsCount,
497
510
  beforeItemsHeight: beforeResizeItemsHeight
498
511
  };
499
512
  }
@@ -673,7 +686,6 @@ var Layout = /*#__PURE__*/function () {
673
686
  var verticalSpacing = beforeResize ? this.getVerticalSpacingBeforeResize() : this.getVerticalSpacing();
674
687
 
675
688
  while (i < beforeItemsCount) {
676
- var currentRowFirstItemIndex = i;
677
689
  var rowHeight = 0;
678
690
  var columnIndex = 0; // Not checking for `itemsCount` overflow here because `i = beforeItemsCount`
679
691
  // can only start at the start of a row, meaning that when calculating
@@ -728,7 +740,6 @@ var Layout = /*#__PURE__*/function () {
728
740
  //
729
741
  // Which becomes negligible in my project's use case (a couple thousands items max).
730
742
  var columnsCount = this.getColumnsCount();
731
- var lastShownRowIndex = Math.floor(lastShownItemIndex / columnsCount);
732
743
  var afterItemsHeight = 0;
733
744
  var i = lastShownItemIndex + 1;
734
745
 
@@ -1 +1 @@
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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"}
1
+ {"version":3,"file":"Layout.js","names":["Layout","isInBypassMode","getEstimatedVisibleItemRowsCountForInitialRender","measureItemsBatchSize","getPrerenderMargin","getPrerenderMarginRatio","getVerticalSpacing","getVerticalSpacingBeforeResize","getColumnsCount","getColumnsCountBeforeResize","getItemHeight","getItemHeightBeforeResize","getBeforeResizeItemsCount","getAverageItemHeight","getMaxVisibleAreaHeight","getPreviouslyCalculatedLayout","name","getValue","defaultValue","error","ScrollableContainerNotReadyError","log","itemsCount","columnsCount","beforeStart","firstShownItemIndex","lastShownItemIndex","beforeItemsHeight","afterItemsHeight","getLastShownItemIndex","getInitialLastShownItemIndex","getInitialLayoutValueWithFallback","averageItemHeight","verticalSpacing","beforeItemsCount","afterItemsCount","Math","ceil","min","getInitialRenderedRowsCount","estimatedVisibleItemRowsCount","getEstimatedVisibleItemRowsCount","DEFAULT_VISIBLE_ITEM_ROWS_COUNT","maxVisibleAreaHeight","estimatedRowsCount","getEstimatedRowsCountForHeight","Error","height","prependedItemsCount","appendedItemsCount","shouldRestoreScrollPosition","onResetGridLayout","appendedRowsCount","addedHeightAfter","prependedRowsCount","addedHeightBefore","warn","shownItemsCountBeforeItemsUpdate","i","nonMeasuredAreaHeight","indexOfTheFirstItemInTheRow","getNonMeasuredItemRowsCount","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","getBeforeItemsHeight","rowHeight","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\nimport { DEFAULT_VISIBLE_ITEM_ROWS_COUNT } from './Layout.defaults.js'\r\n\r\nexport default class Layout {\r\n\tconstructor({\r\n\t\tisInBypassMode,\r\n\t\tgetEstimatedVisibleItemRowsCountForInitialRender,\r\n\t\tmeasureItemsBatchSize,\r\n\t\tgetPrerenderMargin,\r\n\t\tgetPrerenderMarginRatio,\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.getEstimatedVisibleItemRowsCountForInitialRender = getEstimatedVisibleItemRowsCountForInitialRender\r\n\t\tthis.measureItemsBatchSize = measureItemsBatchSize\r\n\t\tthis.getPrerenderMargin = getPrerenderMargin\r\n\t\tthis.getPrerenderMarginRatio = getPrerenderMarginRatio\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\r\n\t\tlet beforeItemsHeight = 0\r\n\t\tlet afterItemsHeight = 0\r\n\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\r\n\t\t\tfirstShownItemIndex = 0\r\n\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\tfirstShownItemIndex\r\n\t\t\t\t)\r\n\t\t\t\t: getLastShownItemIndex()\r\n\r\n\t\t\tconst averageItemHeight = this.getAverageItemHeight()\r\n\t\t\tconst verticalSpacing = this.getVerticalSpacing()\r\n\r\n\t\t\tconst beforeItemsCount = firstShownItemIndex\r\n\t\t\tconst afterItemsCount = itemsCount - (lastShownItemIndex + 1)\r\n\r\n\t\t\tbeforeItemsHeight = Math.ceil(beforeItemsCount / columnsCount) * (verticalSpacing + averageItemHeight)\r\n\t\t\tafterItemsHeight = Math.ceil(afterItemsCount / columnsCount) * (verticalSpacing + averageItemHeight)\r\n\t\t}\r\n\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\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\treturn Math.min(\r\n\t\t\tfirstShownItemIndex + (this.getInitialRenderedRowsCount() * columnsCount - 1),\r\n\t\t\titemsCount - 1\r\n\t\t)\r\n\t}\r\n\r\n\tgetInitialRenderedRowsCount() {\r\n\t\tconst estimatedVisibleItemRowsCount = this.getEstimatedVisibleItemRowsCount()\r\n\t\tif (typeof estimatedVisibleItemRowsCount === 'number') {\r\n\t\t\treturn Math.ceil(estimatedVisibleItemRowsCount * (1 + this.getPrerenderMarginRatio()))\r\n\t\t}\r\n\t\t// `DEFAULT_VISIBLE_ITEM_ROWS_COUNT` will be used in server-side render\r\n\t\t// unless `getEstimatedVisibleItemRowsCount()` parameter is specified.\r\n\t\treturn DEFAULT_VISIBLE_ITEM_ROWS_COUNT\r\n\t}\r\n\r\n\tgetEstimatedVisibleItemRowsCount() {\r\n\t\tconst maxVisibleAreaHeight = this.getMaxVisibleAreaHeight()\r\n\t\tif (typeof maxVisibleAreaHeight === 'number') {\r\n\t\t\tconst estimatedRowsCount = this.getEstimatedRowsCountForHeight(maxVisibleAreaHeight)\r\n\t\t\tif (typeof estimatedRowsCount === 'number') {\r\n\t\t\t\treturn estimatedRowsCount\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (this.getEstimatedVisibleItemRowsCountForInitialRender) {\r\n\t\t\tconst estimatedRowsCount = this.getEstimatedVisibleItemRowsCountForInitialRender()\r\n\t\t\tif (typeof estimatedRowsCount === 'number') {\r\n\t\t\t\treturn estimatedRowsCount\r\n\t\t\t}\r\n\t\t\tthrow new Error('[virtual-scroller] `getEstimatedVisibleItemRowsCount()` must return a number')\r\n\t\t}\r\n\t}\r\n\r\n\tgetEstimatedRowsCountForHeight(height) {\r\n\t\tconst averageItemHeight = this.getAverageItemHeight()\r\n\t\tconst verticalSpacing = this.getVerticalSpacing()\r\n\t\t// `estimatedItemHeight` will most likely be `0` if it hasn't been specified explicitly.\r\n\t\t// In that case, it can't divide by `0`.\r\n\t\tif (averageItemHeight + verticalSpacing > 0) {\r\n\t\t\treturn Math.ceil((height + verticalSpacing) / (averageItemHeight + verticalSpacing))\r\n\t\t}\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 getNonMeasuredItemRowsCount = () => {\r\n\t\t\tconst estimatedRowsCount = this.getEstimatedRowsCountForHeight(nonMeasuredAreaHeight)\r\n\t\t\tif (typeof estimatedRowsCount === 'number') {\r\n\t\t\t\treturn estimatedRowsCount\r\n\t\t\t}\r\n\t\t\t// Render all available item rows as a sensible fallback behavior.\r\n\t\t\treturn Math.ceil(itemsCount / columnsCount)\r\n\t\t}\r\n\r\n\t\tconst itemsCountToRenderForMeasurement = Math.min(\r\n\t\t\tgetNonMeasuredItemRowsCount() * 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 calculate\r\n\t\t// `firstShownItemIndex` and then calculate `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\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\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\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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"}
@@ -178,11 +178,12 @@ describe('Layout', function () {
178
178
  return scrollableContainer.height;
179
179
  }
180
180
  });
181
- var shouldResetGridLayout;
181
+ var shouldResetGridLayout; // Don't `throw` `VirtualScroller` errors but rather collect them in an array.
182
+
182
183
  var errors = [];
183
184
 
184
185
  global.VirtualScrollerCatchError = function (error) {
185
- return errors.push(error);
186
+ errors.push(error);
186
187
  };
187
188
 
188
189
  layout.getLayoutUpdateForItemsDiff({
@@ -205,8 +206,11 @@ describe('Layout', function () {
205
206
  lastShownItemIndex: 5 + 5,
206
207
  beforeItemsHeight: 0,
207
208
  afterItemsHeight: 5 * (ITEM_HEIGHT + VERTICAL_SPACING)
208
- });
209
- global.VirtualScrollerCatchError = undefined;
209
+ }); // Stop collecting `VirtualScroller` errors in the `errors` array.
210
+ // Use the default behavior of just `throw`-ing such errors.
211
+
212
+ global.VirtualScrollerCatchError = undefined; // Verify the errors that have been `throw`-n.
213
+
210
214
  errors.length.should.equal(2);
211
215
  errors[0].message.should.equal('[virtual-scroller] ~ Prepended items count 5 is not divisible by Columns Count 4 ~');
212
216
  errors[1].message.should.equal('[virtual-scroller] Layout reset required');
@@ -1 +1 @@
1
- {"version":3,"file":"Layout.test.js","names":["describe","it","SCREEN_HEIGHT","scrollableContainer","width","height","ITEM_WIDTH","ITEM_HEIGHT","VERTICAL_SPACING","items","Array","fill","layout","Layout","getPrerenderMargin","getVerticalSpacing","getColumnsCount","getItemHeight","i","getBeforeResizeItemsCount","getAverageItemHeight","getScrollableContainerHeight","getShownItemIndexes","itemsCount","length","visibleAreaInsideTheList","top","bottom","should","deep","equal","firstShownItemIndex","lastShownItemIndex","getLayoutUpdateForItemsDiff","beforeItemsHeight","afterItemsHeight","prependedItemsCount","appendedItemsCount","columnsCount","shouldResetGridLayout","errors","global","VirtualScrollerCatchError","error","push","shouldRestoreScrollPosition","onResetGridLayout","undefined","message"],"sources":["../source/Layout.test.js"],"sourcesContent":["import Layout from './Layout.js'\r\n\r\nimport Engine from './test/Engine.js'\r\n\r\ndescribe('Layout', function() {\r\n\tit('should work', function() {\r\n\t\tconst SCREEN_HEIGHT = 400\r\n\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: SCREEN_HEIGHT\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => SCREEN_HEIGHT,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => items[i] / scrollableContainer.width,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\t// Initial render.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: 0,\r\n\t\t\t\tbottom: SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 2\r\n\t\t})\r\n\r\n\t\t// The first item is almost hidden.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: SCREEN_HEIGHT + ITEM_HEIGHT - 1,\r\n\t\t\t\tbottom: (SCREEN_HEIGHT + ITEM_HEIGHT - 1) + SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// The first item is hidden.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: SCREEN_HEIGHT + ITEM_HEIGHT,\r\n\t\t\t\tbottom: (SCREEN_HEIGHT + ITEM_HEIGHT) + SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is almost visible.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT * 2,\r\n\t\t\t\tbottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is visible.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT * 2,\r\n\t\t\t\tbottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 5\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\tlayout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 1\r\n\t\t\t}\r\n\t\t).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 5 + 3,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: (5 + 3) * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\tafterItemsHeight: (3 + 5) * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change (rows get rebalanced)', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 400\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 4,\r\n\t\t\tgetItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\tlet shouldResetGridLayout\r\n\r\n\t\tconst errors = []\r\n\r\n\t\tglobal.VirtualScrollerCatchError = (error) => errors.push(error)\r\n\r\n\t\tlayout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 4,\r\n\t\t\t\tshouldRestoreScrollPosition: true,\r\n\t\t\t\tonResetGridLayout: () => shouldResetGridLayout = true\r\n\t\t\t}\r\n\t\t).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: 0,\r\n\t\t\tafterItemsHeight: 5 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\r\n\t\tglobal.VirtualScrollerCatchError = undefined\r\n\t\terrors.length.should.equal(2)\r\n\t\terrors[0].message.should.equal('[virtual-scroller] ~ Prepended items count 5 is not divisible by Columns Count 4 ~')\r\n\t\terrors[1].message.should.equal('[virtual-scroller] Layout reset required')\r\n\r\n\t\tshouldResetGridLayout.should.equal(true)\r\n\t})\r\n})"],"mappings":"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"}
1
+ {"version":3,"file":"Layout.test.js","names":["describe","it","SCREEN_HEIGHT","scrollableContainer","width","height","ITEM_WIDTH","ITEM_HEIGHT","VERTICAL_SPACING","items","Array","fill","layout","Layout","getPrerenderMargin","getVerticalSpacing","getColumnsCount","getItemHeight","i","getBeforeResizeItemsCount","getAverageItemHeight","getScrollableContainerHeight","getShownItemIndexes","itemsCount","length","visibleAreaInsideTheList","top","bottom","should","deep","equal","firstShownItemIndex","lastShownItemIndex","getLayoutUpdateForItemsDiff","beforeItemsHeight","afterItemsHeight","prependedItemsCount","appendedItemsCount","columnsCount","shouldResetGridLayout","errors","global","VirtualScrollerCatchError","error","push","shouldRestoreScrollPosition","onResetGridLayout","undefined","message"],"sources":["../source/Layout.test.js"],"sourcesContent":["import Layout from './Layout.js'\r\n\r\nimport Engine from './test/Engine.js'\r\n\r\ndescribe('Layout', function() {\r\n\tit('should work', function() {\r\n\t\tconst SCREEN_HEIGHT = 400\r\n\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: SCREEN_HEIGHT\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => SCREEN_HEIGHT,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => items[i] / scrollableContainer.width,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\t// Initial render.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: 0,\r\n\t\t\t\tbottom: SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 2\r\n\t\t})\r\n\r\n\t\t// The first item is almost hidden.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: SCREEN_HEIGHT + ITEM_HEIGHT - 1,\r\n\t\t\t\tbottom: (SCREEN_HEIGHT + ITEM_HEIGHT - 1) + SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// The first item is hidden.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: SCREEN_HEIGHT + ITEM_HEIGHT,\r\n\t\t\t\tbottom: (SCREEN_HEIGHT + ITEM_HEIGHT) + SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is almost visible.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT * 2,\r\n\t\t\t\tbottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 - SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 4\r\n\t\t})\r\n\r\n\t\t// A new item at the bottom is visible.\r\n\t\tlayout.getShownItemIndexes({\r\n\t\t\titemsCount: items.length,\r\n\t\t\tvisibleAreaInsideTheList: {\r\n\t\t\t\ttop: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT * 2,\r\n\t\t\t\tbottom: (ITEM_HEIGHT + VERTICAL_SPACING) * 5 + 1 - SCREEN_HEIGHT\r\n\t\t\t}\r\n\t\t}).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 1,\r\n\t\t\tlastShownItemIndex: 5\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 200\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 1,\r\n\t\t\tgetItemHeight: (i) => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\tlayout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 1\r\n\t\t\t}\r\n\t\t).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 5 + 3,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: (5 + 3) * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\tafterItemsHeight: (3 + 5) * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\t})\r\n\r\n\tit('should update layout for items incremental change (rows get rebalanced)', function() {\r\n\t\tconst scrollableContainer = {\r\n\t\t\twidth: 800,\r\n\t\t\theight: 400\r\n\t\t}\r\n\t\tconst ITEM_WIDTH = scrollableContainer.width\r\n\t\tconst ITEM_HEIGHT = 400\r\n\r\n\t\tconst items = new Array(9).fill(ITEM_WIDTH * ITEM_HEIGHT)\r\n\r\n\t\tconst VERTICAL_SPACING = 100\r\n\r\n\t\tconst layout = new Layout({\r\n\t\t\tgetPrerenderMargin: () => scrollableContainer.height,\r\n\t\t\tgetVerticalSpacing: () => VERTICAL_SPACING,\r\n\t\t\tgetColumnsCount: () => 4,\r\n\t\t\tgetItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetBeforeResizeItemsCount: () => 0,\r\n\t\t\tgetAverageItemHeight: () => ITEM_HEIGHT,\r\n\t\t\tgetScrollableContainerHeight: () => scrollableContainer.height\r\n\t\t})\r\n\r\n\t\tlet shouldResetGridLayout\r\n\r\n\t\t// Don't `throw` `VirtualScroller` errors but rather collect them in an array.\r\n\t\tconst errors = []\r\n\t\tglobal.VirtualScrollerCatchError = (error) => {\r\n\t\t\terrors.push(error)\r\n\t\t}\r\n\r\n\t\tlayout.getLayoutUpdateForItemsDiff(\r\n\t\t\t{\r\n\t\t\t\tfirstShownItemIndex: 3,\r\n\t\t\t\tlastShownItemIndex: 5,\r\n\t\t\t\tbeforeItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING),\r\n\t\t\t\tafterItemsHeight: 3 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprependedItemsCount: 5,\r\n\t\t\t\tappendedItemsCount: 5\r\n\t\t\t}, {\r\n\t\t\t\titemsCount: 5 + 5 + items.length,\r\n\t\t\t\tcolumnsCount: 4,\r\n\t\t\t\tshouldRestoreScrollPosition: true,\r\n\t\t\t\tonResetGridLayout: () => shouldResetGridLayout = true\r\n\t\t\t}\r\n\t\t).should.deep.equal({\r\n\t\t\tfirstShownItemIndex: 0,\r\n\t\t\tlastShownItemIndex: 5 + 5,\r\n\t\t\tbeforeItemsHeight: 0,\r\n\t\t\tafterItemsHeight: 5 * (ITEM_HEIGHT + VERTICAL_SPACING)\r\n\t\t})\r\n\r\n\t\t// Stop collecting `VirtualScroller` errors in the `errors` array.\r\n\t\t// Use the default behavior of just `throw`-ing such errors.\r\n\t\tglobal.VirtualScrollerCatchError = undefined\r\n\t\t// Verify the errors that have been `throw`-n.\r\n\t\terrors.length.should.equal(2)\r\n\t\terrors[0].message.should.equal('[virtual-scroller] ~ Prepended items count 5 is not divisible by Columns Count 4 ~')\r\n\t\terrors[1].message.should.equal('[virtual-scroller] Layout reset required')\r\n\r\n\t\tshouldResetGridLayout.should.equal(true)\r\n\t})\r\n})"],"mappings":"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"}