virtual-scroller 1.7.9 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/.gitlab-ci.yml +1 -1
  2. package/CHANGELOG.md +71 -1
  3. package/README.md +434 -151
  4. package/bundle/index-bypass.html +1 -1
  5. package/bundle/index-dom.html +1 -1
  6. package/bundle/index-grid.html +1 -2
  7. package/bundle/index-scrollableContainer.html +1 -1
  8. package/bundle/index-tbody-scrollableContainer.html +2 -0
  9. package/bundle/index-tbody.html +2 -0
  10. package/bundle/virtual-scroller-dom.js +1 -1
  11. package/bundle/virtual-scroller-dom.js.map +1 -1
  12. package/bundle/virtual-scroller-react.js +1 -1
  13. package/bundle/virtual-scroller-react.js.map +1 -1
  14. package/bundle/virtual-scroller.js +1 -1
  15. package/bundle/virtual-scroller.js.map +1 -1
  16. package/commonjs/BeforeResize.js +315 -0
  17. package/commonjs/BeforeResize.js.map +1 -0
  18. package/commonjs/DOM/Engine.js +46 -0
  19. package/commonjs/DOM/Engine.js.map +1 -0
  20. package/commonjs/DOM/ItemsContainer.js +78 -0
  21. package/commonjs/DOM/ItemsContainer.js.map +1 -0
  22. package/commonjs/DOM/{WaitForStylesToLoad.js → ListTopOffsetWatcher.js} +71 -44
  23. package/commonjs/DOM/ListTopOffsetWatcher.js.map +1 -0
  24. package/commonjs/DOM/ScrollableContainer.js +69 -101
  25. package/commonjs/DOM/ScrollableContainer.js.map +1 -1
  26. package/commonjs/DOM/VirtualScroller.js +37 -29
  27. package/commonjs/DOM/VirtualScroller.js.map +1 -1
  28. package/commonjs/DOM/tbody.js +17 -11
  29. package/commonjs/DOM/tbody.js.map +1 -1
  30. package/commonjs/ItemHeights.js +33 -34
  31. package/commonjs/ItemHeights.js.map +1 -1
  32. package/commonjs/Layout.js +591 -216
  33. package/commonjs/Layout.js.map +1 -1
  34. package/commonjs/Layout.test.js +196 -0
  35. package/commonjs/Layout.test.js.map +1 -0
  36. package/commonjs/ListHeightMeasurement.js +124 -0
  37. package/commonjs/ListHeightMeasurement.js.map +1 -0
  38. package/commonjs/Resize.js +50 -39
  39. package/commonjs/Resize.js.map +1 -1
  40. package/commonjs/Scroll.js +139 -95
  41. package/commonjs/Scroll.js.map +1 -1
  42. package/commonjs/VirtualScroller.columns.js +43 -0
  43. package/commonjs/VirtualScroller.columns.js.map +1 -0
  44. package/commonjs/VirtualScroller.constructor.js +408 -0
  45. package/commonjs/VirtualScroller.constructor.js.map +1 -0
  46. package/commonjs/VirtualScroller.items.js +305 -0
  47. package/commonjs/VirtualScroller.items.js.map +1 -0
  48. package/commonjs/VirtualScroller.js +160 -1021
  49. package/commonjs/VirtualScroller.js.map +1 -1
  50. package/commonjs/VirtualScroller.layout.js +562 -0
  51. package/commonjs/VirtualScroller.layout.js.map +1 -0
  52. package/commonjs/VirtualScroller.onRender.js +357 -0
  53. package/commonjs/VirtualScroller.onRender.js.map +1 -0
  54. package/commonjs/VirtualScroller.resize.js +186 -0
  55. package/commonjs/VirtualScroller.resize.js.map +1 -0
  56. package/commonjs/VirtualScroller.state.js +301 -0
  57. package/commonjs/VirtualScroller.state.js.map +1 -0
  58. package/commonjs/VirtualScroller.verticalSpacing.js +65 -0
  59. package/commonjs/VirtualScroller.verticalSpacing.js.map +1 -0
  60. package/commonjs/getItemCoordinates.js.map +1 -1
  61. package/commonjs/getItemsDiff.js.map +1 -1
  62. package/commonjs/getVerticalSpacing.js +8 -8
  63. package/commonjs/getVerticalSpacing.js.map +1 -1
  64. package/commonjs/package.json +5 -0
  65. package/commonjs/react/VirtualScroller.js +182 -628
  66. package/commonjs/react/VirtualScroller.js.map +1 -1
  67. package/commonjs/react/useClassName.js +26 -0
  68. package/commonjs/react/useClassName.js.map +1 -0
  69. package/commonjs/react/useHandleItemsChange.js +116 -0
  70. package/commonjs/react/useHandleItemsChange.js.map +1 -0
  71. package/commonjs/react/useInstanceMethods.js +37 -0
  72. package/commonjs/react/useInstanceMethods.js.map +1 -0
  73. package/commonjs/react/useItemKeys.js +60 -0
  74. package/commonjs/react/useItemKeys.js.map +1 -0
  75. package/commonjs/react/useOnItemHeightChange.js +32 -0
  76. package/commonjs/react/useOnItemHeightChange.js.map +1 -0
  77. package/commonjs/react/useOnItemStateChange.js +32 -0
  78. package/commonjs/react/useOnItemStateChange.js.map +1 -0
  79. package/commonjs/react/useState.js +140 -0
  80. package/commonjs/react/useState.js.map +1 -0
  81. package/commonjs/react/useStyle.js +29 -0
  82. package/commonjs/react/useStyle.js.map +1 -0
  83. package/commonjs/react/useVirtualScroller.js +62 -0
  84. package/commonjs/react/useVirtualScroller.js.map +1 -0
  85. package/commonjs/react/useVirtualScrollerStartStop.js +20 -0
  86. package/commonjs/react/useVirtualScrollerStartStop.js.map +1 -0
  87. package/commonjs/test/Engine.js +23 -0
  88. package/commonjs/test/Engine.js.map +1 -0
  89. package/commonjs/test/ItemsContainer.js +127 -0
  90. package/commonjs/test/ItemsContainer.js.map +1 -0
  91. package/commonjs/test/ScrollableContainer.js +130 -0
  92. package/commonjs/test/ScrollableContainer.js.map +1 -0
  93. package/commonjs/test/VirtualScroller.js +281 -0
  94. package/commonjs/test/VirtualScroller.js.map +1 -0
  95. package/commonjs/utility/debounce.js +28 -6
  96. package/commonjs/utility/debounce.js.map +1 -1
  97. package/commonjs/utility/debug.js +51 -12
  98. package/commonjs/utility/debug.js.map +1 -1
  99. package/commonjs/utility/getStateSnapshot.js +50 -0
  100. package/commonjs/utility/getStateSnapshot.js.map +1 -0
  101. package/commonjs/utility/px.js +1 -1
  102. package/commonjs/utility/px.js.map +1 -1
  103. package/commonjs/utility/px.test.js +14 -0
  104. package/commonjs/utility/px.test.js.map +1 -0
  105. package/commonjs/utility/shallowEqual.js +1 -1
  106. package/commonjs/utility/shallowEqual.js.map +1 -1
  107. package/commonjs/utility/throttle.js.map +1 -1
  108. package/dom/index.cjs +4 -0
  109. package/dom/index.cjs.js +9 -0
  110. package/dom/index.d.ts +25 -0
  111. package/dom/index.js +1 -1
  112. package/dom/package.json +10 -4
  113. package/index.cjs +4 -0
  114. package/index.cjs.js +9 -0
  115. package/index.d.ts +99 -0
  116. package/index.js +1 -1
  117. package/modules/BeforeResize.js +305 -0
  118. package/modules/BeforeResize.js.map +1 -0
  119. package/modules/DOM/Engine.js +27 -0
  120. package/modules/DOM/Engine.js.map +1 -0
  121. package/modules/DOM/ItemsContainer.js +71 -0
  122. package/modules/DOM/ItemsContainer.js.map +1 -0
  123. package/modules/DOM/{WaitForStylesToLoad.js → ListTopOffsetWatcher.js} +72 -44
  124. package/modules/DOM/ListTopOffsetWatcher.js.map +1 -0
  125. package/modules/DOM/ScrollableContainer.js +68 -100
  126. package/modules/DOM/ScrollableContainer.js.map +1 -1
  127. package/modules/DOM/VirtualScroller.js +32 -28
  128. package/modules/DOM/VirtualScroller.js.map +1 -1
  129. package/modules/DOM/tbody.js +11 -9
  130. package/modules/DOM/tbody.js.map +1 -1
  131. package/modules/ItemHeights.js +28 -33
  132. package/modules/ItemHeights.js.map +1 -1
  133. package/modules/Layout.js +585 -214
  134. package/modules/Layout.js.map +1 -1
  135. package/modules/Layout.test.js +190 -0
  136. package/modules/Layout.test.js.map +1 -0
  137. package/modules/ListHeightMeasurement.js +117 -0
  138. package/modules/ListHeightMeasurement.js.map +1 -0
  139. package/modules/Resize.js +50 -39
  140. package/modules/Resize.js.map +1 -1
  141. package/modules/Scroll.js +139 -94
  142. package/modules/Scroll.js.map +1 -1
  143. package/modules/VirtualScroller.columns.js +36 -0
  144. package/modules/VirtualScroller.columns.js.map +1 -0
  145. package/modules/VirtualScroller.constructor.js +371 -0
  146. package/modules/VirtualScroller.constructor.js.map +1 -0
  147. package/modules/VirtualScroller.items.js +288 -0
  148. package/modules/VirtualScroller.items.js.map +1 -0
  149. package/modules/VirtualScroller.js +159 -1014
  150. package/modules/VirtualScroller.js.map +1 -1
  151. package/modules/VirtualScroller.layout.js +549 -0
  152. package/modules/VirtualScroller.layout.js.map +1 -0
  153. package/modules/VirtualScroller.onRender.js +337 -0
  154. package/modules/VirtualScroller.onRender.js.map +1 -0
  155. package/modules/VirtualScroller.resize.js +176 -0
  156. package/modules/VirtualScroller.resize.js.map +1 -0
  157. package/modules/VirtualScroller.state.js +283 -0
  158. package/modules/VirtualScroller.state.js.map +1 -0
  159. package/modules/VirtualScroller.verticalSpacing.js +54 -0
  160. package/modules/VirtualScroller.verticalSpacing.js.map +1 -0
  161. package/modules/getItemCoordinates.js.map +1 -1
  162. package/modules/getItemsDiff.js.map +1 -1
  163. package/modules/getVerticalSpacing.js +8 -8
  164. package/modules/getVerticalSpacing.js.map +1 -1
  165. package/modules/react/VirtualScroller.js +179 -634
  166. package/modules/react/VirtualScroller.js.map +1 -1
  167. package/modules/react/useClassName.js +18 -0
  168. package/modules/react/useClassName.js.map +1 -0
  169. package/modules/react/useHandleItemsChange.js +108 -0
  170. package/modules/react/useHandleItemsChange.js.map +1 -0
  171. package/modules/react/useInstanceMethods.js +28 -0
  172. package/modules/react/useInstanceMethods.js.map +1 -0
  173. package/modules/react/useItemKeys.js +52 -0
  174. package/modules/react/useItemKeys.js.map +1 -0
  175. package/modules/react/useOnItemHeightChange.js +24 -0
  176. package/modules/react/useOnItemHeightChange.js.map +1 -0
  177. package/modules/react/useOnItemStateChange.js +24 -0
  178. package/modules/react/useOnItemStateChange.js.map +1 -0
  179. package/modules/react/useState.js +132 -0
  180. package/modules/react/useState.js.map +1 -0
  181. package/modules/react/useStyle.js +19 -0
  182. package/modules/react/useStyle.js.map +1 -0
  183. package/modules/react/useVirtualScroller.js +51 -0
  184. package/modules/react/useVirtualScroller.js.map +1 -0
  185. package/modules/react/useVirtualScrollerStartStop.js +12 -0
  186. package/modules/react/useVirtualScrollerStartStop.js.map +1 -0
  187. package/modules/test/Engine.js +11 -0
  188. package/modules/test/Engine.js.map +1 -0
  189. package/modules/test/ItemsContainer.js +120 -0
  190. package/modules/test/ItemsContainer.js.map +1 -0
  191. package/modules/test/ScrollableContainer.js +123 -0
  192. package/modules/test/ScrollableContainer.js.map +1 -0
  193. package/modules/test/VirtualScroller.js +270 -0
  194. package/modules/test/VirtualScroller.js.map +1 -0
  195. package/modules/utility/debounce.js +28 -6
  196. package/modules/utility/debounce.js.map +1 -1
  197. package/modules/utility/debug.js +47 -10
  198. package/modules/utility/debug.js.map +1 -1
  199. package/modules/utility/getStateSnapshot.js +43 -0
  200. package/modules/utility/getStateSnapshot.js.map +1 -0
  201. package/modules/utility/px.js +1 -1
  202. package/modules/utility/px.js.map +1 -1
  203. package/modules/utility/px.test.js +9 -0
  204. package/modules/utility/px.test.js.map +1 -0
  205. package/modules/utility/shallowEqual.js +1 -1
  206. package/modules/utility/shallowEqual.js.map +1 -1
  207. package/modules/utility/throttle.js.map +1 -1
  208. package/package.json +54 -29
  209. package/react/index.cjs +4 -0
  210. package/react/index.cjs.js +9 -0
  211. package/react/index.d.ts +28 -0
  212. package/react/index.js +1 -1
  213. package/react/package.json +10 -4
  214. package/rollup.config.mjs +62 -0
  215. package/runnable/create-commonjs-package-json.js +11 -0
  216. package/source/BeforeResize.js +312 -0
  217. package/source/DOM/Engine.js +30 -0
  218. package/source/DOM/ItemsContainer.js +48 -0
  219. package/source/DOM/{WaitForStylesToLoad.js → ListTopOffsetWatcher.js} +61 -30
  220. package/source/DOM/ScrollableContainer.js +51 -73
  221. package/source/DOM/VirtualScroller.js +33 -18
  222. package/source/DOM/tbody.js +30 -21
  223. package/source/ItemHeights.js +27 -27
  224. package/source/Layout.js +629 -252
  225. package/source/Layout.test.js +176 -0
  226. package/source/ListHeightMeasurement.js +95 -0
  227. package/source/Resize.js +56 -32
  228. package/source/Scroll.js +135 -82
  229. package/source/VirtualScroller.columns.js +26 -0
  230. package/source/VirtualScroller.constructor.js +336 -0
  231. package/source/VirtualScroller.items.js +302 -0
  232. package/source/VirtualScroller.js +162 -936
  233. package/source/VirtualScroller.layout.js +539 -0
  234. package/source/VirtualScroller.onRender.js +345 -0
  235. package/source/VirtualScroller.resize.js +189 -0
  236. package/source/VirtualScroller.state.js +284 -0
  237. package/source/VirtualScroller.verticalSpacing.js +51 -0
  238. package/source/getVerticalSpacing.js +7 -7
  239. package/source/react/VirtualScroller.js +243 -603
  240. package/source/react/useClassName.js +14 -0
  241. package/source/react/useHandleItemsChange.js +115 -0
  242. package/source/react/useInstanceMethods.js +25 -0
  243. package/source/react/useItemKeys.js +59 -0
  244. package/source/react/useOnItemHeightChange.js +28 -0
  245. package/source/react/useOnItemStateChange.js +28 -0
  246. package/source/react/useState.js +114 -0
  247. package/source/react/useStyle.js +20 -0
  248. package/source/react/useVirtualScroller.js +59 -0
  249. package/source/react/useVirtualScrollerStartStop.js +12 -0
  250. package/source/test/Engine.js +11 -0
  251. package/source/test/ItemsContainer.js +87 -0
  252. package/source/test/ScrollableContainer.js +88 -0
  253. package/source/test/VirtualScroller.js +232 -0
  254. package/source/utility/debounce.js +22 -5
  255. package/source/utility/debug.js +34 -3
  256. package/source/utility/getStateSnapshot.js +36 -0
  257. package/source/utility/px.js +1 -1
  258. package/source/utility/px.test.js +9 -0
  259. package/website/index-bypass.html +195 -0
  260. package/website/index-grid.html +0 -1
  261. package/website/index-scrollableContainer.html +208 -0
  262. package/website/index-tbody-scrollableContainer.html +68 -0
  263. package/website/index-tbody.html +55 -0
  264. package/commonjs/DOM/RenderingEngine.js +0 -33
  265. package/commonjs/DOM/RenderingEngine.js.map +0 -1
  266. package/commonjs/DOM/Screen.js +0 -87
  267. package/commonjs/DOM/Screen.js.map +0 -1
  268. package/commonjs/DOM/WaitForStylesToLoad.js.map +0 -1
  269. package/commonjs/RestoreScroll.js +0 -118
  270. package/commonjs/RestoreScroll.js.map +0 -1
  271. package/dom/index.commonjs.js +0 -4
  272. package/index.commonjs.js +0 -4
  273. package/modules/DOM/RenderingEngine.js +0 -19
  274. package/modules/DOM/RenderingEngine.js.map +0 -1
  275. package/modules/DOM/Screen.js +0 -80
  276. package/modules/DOM/Screen.js.map +0 -1
  277. package/modules/DOM/WaitForStylesToLoad.js.map +0 -1
  278. package/modules/RestoreScroll.js +0 -111
  279. package/modules/RestoreScroll.js.map +0 -1
  280. package/react/index.commonjs.js +0 -4
  281. package/source/DOM/RenderingEngine.js +0 -22
  282. package/source/DOM/Screen.js +0 -51
  283. package/source/RestoreScroll.js +0 -86
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/VirtualScroller.js"],"names":["setTimeout","clearTimeout","supportsTbody","BROWSER_NOT_SUPPORTED_ERROR","addTbodyStyles","setTbodyPadding","DOMRenderingEngine","WaitForStylesToLoad","Layout","LAYOUT_REASON","Resize","Scroll","RestoreScroll","ItemHeights","getItemsDiff","getVerticalSpacing","log","warn","isDebug","reportError","shallowEqual","VirtualScroller","getContainerElement","items","options","listTopOffset","scrollableContainer","getTopOffset","waitForStylesToLoad","onGotListTopOffset","newState","prevState","getState","onStateChange","isRendered","newItemsPending","undefined","layoutResetPending","redoLayoutReason","previousItems","newItems","layoutNeedsReCalculating","itemsDiff","prependedItemsCount","appendedItemsCount","itemHeights","onPrepend","restoreScroll","shouldRestoreScrollAfterRender","scrollByY","getScrollDifference","scroll","reset","initialize","ITEMS_CHANGED","firstShownItemIndex","lastShownItemIndex","onRenderedNewLayout","redoLayoutRightAfterRender","reason","bypass","visibleAreaIncludingMargins","getVisibleAreaBoundsIncludingMargins","latestLayoutVisibleAreaIncludingMargins","listTopOffsetInsideScrollableContainer","getListTopOffsetInsideScrollableContainer","layout","getShownItemIndexes","listHeight","screen","getElementHeight","itemsCount","getItemsCount","redoLayoutAfterMeasuringItemHeights","getAnchorItemIndex","validateWillBeHiddenItemHeightsAreAccurate","updateShownItemIndexes","beforeItemsHeight","getBeforeItemsHeight","afterItemsHeight","getAfterItemsHeight","_getColumnsCount","getColumnsCount","getAverage","slice","itemStates","ITEM_HEIGHT_NOT_MEASURED","onBeforeShowItems","setState","onLayout","layoutTimer","onUpdateShownItemIndexes","MANUAL","updateLayout","customState","preserveScrollPositionAtBottomOnMount","preserveScrollPositionOfTheBottomOfTheListOnMount","initialScrollPosition","onScrollPositionChange","measureItemsBatchSize","getScrollableContainer","getItemId","tbody","_useTimeoutInRenderLoop","estimatedItemHeight","onItemInitialRender","onItemFirstRender","state","renderingEngine","createScreen","createScrollableContainer","name","Error","isItemEqual","a","b","initialItems","item","i","indexOf","length","willUpdateState","didUpdateState","clearElement","height","getItemHeight","getAverageItemHeight","resize","resetStateAndLayout","RESIZE","getInitialLayoutState","isImmediateLayoutScheduled","hasNonRenderedItemsAtTheTop","hasNonRenderedItemsAtTheBottom","getLatestLayoutVisibleAreaIncludingMargins","getInitialState","Array","getInitialLayoutValues","visibleAreaHeightIncludingMargins","getMargin","getHeight","columnsCount","verticalSpacing","renderAheadMarginRatio","listen","MOUNT","measureVerticalSpacing","measureItemHeights","visibleArea","getVisibleAreaBounds","top","bottom","stop","container","remeasureItemHeight","itemState","JSON","stringify","previousHeight","newHeight","ITEM_HEIGHT_CHANGED","isValid","previouslyMeasuredItemHeight","actualItemHeight","setItems","concat","updateLayoutForItemsDiff","preserveScrollPositionOnPrependItems","preserveScrollPosition","captureScroll","showItemsFromTheStart"],"mappings":"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","sourcesContent":["// For some weird reason, in Chrome, `setTimeout()` would lag up to a second (or more) behind.\r\n// Turns out, Chrome developers have deprecated `setTimeout()` API entirely without asking anyone.\r\n// Replacing `setTimeout()` with `requestAnimationFrame()` can work around that Chrome bug.\r\n// https://github.com/bvaughn/react-virtualized/issues/722\r\nimport { setTimeout, clearTimeout } from 'request-animation-frame-timeout'\r\n\r\nimport {\r\n\tsupportsTbody,\r\n\tBROWSER_NOT_SUPPORTED_ERROR,\r\n\taddTbodyStyles,\r\n\tsetTbodyPadding\r\n} from './DOM/tbody'\r\n\r\nimport DOMRenderingEngine from './DOM/RenderingEngine'\r\nimport WaitForStylesToLoad from './DOM/WaitForStylesToLoad'\r\n\r\nimport Layout, { LAYOUT_REASON } from './Layout'\r\nimport Resize from './Resize'\r\nimport Scroll from './Scroll'\r\nimport RestoreScroll from './RestoreScroll'\r\nimport ItemHeights from './ItemHeights'\r\nimport getItemsDiff from './getItemsDiff'\r\nimport getVerticalSpacing from './getVerticalSpacing'\r\n// import getItemCoordinates from './getItemCoordinates'\r\n\r\nimport log, { warn, isDebug, reportError } from './utility/debug'\r\nimport shallowEqual from './utility/shallowEqual'\r\n\r\nexport default class VirtualScroller {\r\n\t/**\r\n\t * @param {function} getContainerElement — Returns the container DOM `Element`.\r\n\t * @param {any[]} items — The list of items.\r\n\t * @param {Object} [options] — See README.md.\r\n\t * @return {VirtualScroller}\r\n\t */\r\n\tconstructor(\r\n\t\tgetContainerElement,\r\n\t\titems,\r\n\t\toptions = {}\r\n\t) {\r\n\t\tconst {\r\n\t\t\tgetState,\r\n\t\t\tsetState,\r\n\t\t\tonStateChange,\r\n\t\t\tcustomState,\r\n\t\t\t// `preserveScrollPositionAtBottomOnMount` option name is deprecated,\r\n\t\t\t// use `preserveScrollPositionOfTheBottomOfTheListOnMount` option instead.\r\n\t\t\tpreserveScrollPositionAtBottomOnMount,\r\n\t\t\tpreserveScrollPositionOfTheBottomOfTheListOnMount,\r\n\t\t\tinitialScrollPosition,\r\n\t\t\tonScrollPositionChange,\r\n\t\t\tmeasureItemsBatchSize,\r\n\t\t\t// `getScrollableContainer` option is deprecated.\r\n\t\t\t// Use `scrollableContainer` instead.\r\n\t\t\tgetScrollableContainer,\r\n\t\t\tgetColumnsCount,\r\n\t\t\tgetItemId,\r\n\t\t\ttbody,\r\n\t\t\t_useTimeoutInRenderLoop,\r\n\t\t\t// bypassBatchSize\r\n\t\t} = options\r\n\r\n\t\tlet {\r\n\t\t\tbypass,\r\n\t\t\t// margin,\r\n\t\t\testimatedItemHeight,\r\n\t\t\t// getItemState,\r\n\t\t\tonItemInitialRender,\r\n\t\t\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\t\t\tonItemFirstRender,\r\n\t\t\tscrollableContainer,\r\n\t\t\tstate,\r\n\t\t\trenderingEngine\r\n\t\t} = options\r\n\r\n\t\tlog('~ Initialize ~')\r\n\r\n\t\t// If `state` is passed then use `items` from `state`\r\n\t\t// instead of the `items` argument.\r\n\t\tif (state) {\r\n\t\t\titems = state.items\r\n\t\t}\r\n\r\n\t\t// `getScrollableContainer` option is deprecated.\r\n\t\t// Use `scrollableContainer` instead.\r\n\t\tif (!scrollableContainer && getScrollableContainer) {\r\n\t\t\tscrollableContainer = getScrollableContainer()\r\n\t\t}\r\n\r\n\t\t// Could support non-DOM rendering engines.\r\n\t\t// For example, React Native, `<canvas/>`, etc.\r\n\t\tif (!renderingEngine) {\r\n\t\t\trenderingEngine = DOMRenderingEngine\r\n\t\t}\r\n\r\n\t\tthis.screen = renderingEngine.createScreen()\r\n\t\tthis.scrollableContainer = renderingEngine.createScrollableContainer(scrollableContainer)\r\n\r\n\t\t// if (margin === undefined) {\r\n\t\t// \t// Renders items which are outside of the screen by this \"margin\".\r\n\t\t// \t// Is the screen height by default: seems to be the optimal value\r\n\t\t// \t// for \"Page Up\" / \"Page Down\" navigation and optimized mouse wheel scrolling.\r\n\t\t// \tmargin = this.scrollableContainer ? this.scrollableContainer.getHeight() : 0\r\n\t\t// }\r\n\r\n\t\t// Work around `<tbody/>` not being able to have `padding`.\r\n\t\t// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n\t\tif (tbody) {\r\n\t\t\tif (renderingEngine.name !== 'DOM') {\r\n\t\t\t\tthrow new Error('`tbody` option is only supported for DOM rendering engine')\r\n\t\t\t}\r\n\t\t\tlog('~ <tbody/> detected ~')\r\n\t\t\tthis.tbody = true\r\n\t\t\tif (!supportsTbody()) {\r\n\t\t\t\tlog('~ <tbody/> not supported ~')\r\n\t\t\t\treportError(BROWSER_NOT_SUPPORTED_ERROR)\r\n\t\t\t\tbypass = true\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (bypass) {\r\n\t\t\tlog('~ \"bypass\" mode ~')\r\n\t\t}\r\n\r\n\t\t// In `bypass` mode, `VirtualScroller` doesn't wait\r\n\t\t// for the user to scroll down to render all items:\r\n\t\t// instead, it renders all items right away, as if\r\n\t\t// the list is rendered without using `VirtualScroller`.\r\n\t\t// It was added just to measure how much is the\r\n\t\t// performance difference between using a `VirtualScroller`\r\n\t\t// and not using a `VirtualScroller`.\r\n\t\t// It turned out that unmounting large React component trees\r\n\t\t// is a very long process, so `VirtualScroller` does seem to\r\n\t\t// make sense when used in a React application.\r\n\t\tthis.bypass = bypass\r\n\t\t// this.bypassBatchSize = bypassBatchSize || 10\r\n\r\n\t\t// Using `setTimeout()` in render loop is a workaround\r\n\t\t// for avoiding a React error message:\r\n\t\t// \"Maximum update depth exceeded.\r\n\t\t// This can happen when a component repeatedly calls\r\n\t\t// `.setState()` inside `componentWillUpdate()` or `componentDidUpdate()`.\r\n\t\t// React limits the number of nested updates to prevent infinite loops.\"\r\n\t\tthis._useTimeoutInRenderLoop = _useTimeoutInRenderLoop\r\n\r\n\t\tif (getItemId) {\r\n\t\t\tthis.isItemEqual = (a, b) => getItemId(a) === getItemId(b)\r\n\t\t} else {\r\n\t\t\tthis.isItemEqual = (a, b) => a === b\r\n\t\t}\r\n\r\n\t\tthis.initialItems = items\r\n\t\t// this.margin = margin\r\n\r\n\t\tthis.onStateChange = onStateChange\r\n\r\n\t\tthis._getColumnsCount = getColumnsCount\r\n\r\n\t\tif (onItemInitialRender) {\r\n\t\t\tthis.onItemInitialRender = onItemInitialRender\r\n\t\t}\r\n\t\t// `onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.\r\n\t\telse if (onItemFirstRender) {\r\n\t\t\tthis.onItemInitialRender = (item) => {\r\n\t\t\t\twarn('`onItemFirstRender(i)` is deprecated, use `onItemInitialRender(item)` instead.')\r\n\t\t\t\tconst { items } = this.getState()\r\n\t\t\t\tconst i = items.indexOf(item)\r\n\t\t\t\t// The `item` could also be non-found due to the inconsistency bug:\r\n\t\t\t\t// The reason is that `i` can be non-consistent with the `items`\r\n\t\t\t\t// passed to `<VirtualScroller/>` in React due to `setState()` not being\r\n\t\t\t\t// instanteneous: when new `items` are passed to `<VirtualScroller/>`,\r\n\t\t\t\t// `VirtualScroller.setState({ items })` is called, and if `onItemFirstRender(i)`\r\n\t\t\t\t// is called after the aforementioned `setState()` is called but before it finishes,\r\n\t\t\t\t// `i` would point to an index in \"previous\" `items` while the application\r\n\t\t\t\t// would assume that `i` points to an index in the \"new\" `items`,\r\n\t\t\t\t// resulting in an incorrect item being assumed by the application\r\n\t\t\t\t// or even in an \"array index out of bounds\" error.\r\n\t\t\t\tif (i >= 0) {\r\n\t\t\t\t\tonItemFirstRender(i)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlog('Items count', items.length)\r\n\t\tif (estimatedItemHeight) {\r\n\t\t\tlog('Estimated item height', estimatedItemHeight)\r\n\t\t}\r\n\r\n\t\tif (setState) {\r\n\t\t\tthis.getState = getState\r\n\t\t\tthis.setState = (state) => {\r\n\t\t\t\tlog('Set state', state)\r\n\t\t\t\tsetState(state, {\r\n\t\t\t\t\twillUpdateState: this.willUpdateState,\r\n\t\t\t\t\tdidUpdateState: this.didUpdateState\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis.getState = () => this.state\r\n\t\t\tthis.setState = (state) => {\r\n\t\t\t\tlog('Set state', state)\r\n\t\t\t\tconst prevState = this.getState()\r\n\t\t\t\t// Because this variant of `.setState()` is \"synchronous\" (immediate),\r\n\t\t\t\t// it can be written like `...prevState`, and no state updates would be lost.\r\n\t\t\t\t// But if it was \"asynchronous\" (not immediate), then `...prevState`\r\n\t\t\t\t// wouldn't work in all cases, because it could be stale in cases\r\n\t\t\t\t// when more than a single `setState()` call is made before\r\n\t\t\t\t// the state actually updates, making `prevState` stale.\r\n\t\t\t\tconst newState = {\r\n\t\t\t\t\t...prevState,\r\n\t\t\t\t\t...state\r\n\t\t\t\t}\r\n\t\t\t\tthis.willUpdateState(newState, prevState)\r\n\t\t\t\tthis.state = newState\r\n\t\t\t\tthis.didUpdateState(prevState)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (state) {\r\n\t\t\tlog('Initial state (passed)', state)\r\n\t\t}\r\n\r\n\t\t// Sometimes, when `new VirtualScroller()` instance is created,\r\n\t\t// `getContainerElement()` might not be ready to return the \"container\" DOM Element yet\r\n\t\t// (for example, because it's not rendered yet). That's the reason why it's a getter function.\r\n\t\t// For example, in React `<VirtualScroller/>` component, a `VirtualScroller`\r\n\t\t// instance is created in the React component's `constructor()`, and at that time\r\n\t\t// the container Element is not yet available. The container Element is available\r\n\t\t// in `componentDidMount()`, but `componentDidMount()` is not executed on server,\r\n\t\t// which would mean that React `<VirtualScroller/>` wouldn't render at all\r\n\t\t// on server side, while with the `getContainerElement()` approach, on server side,\r\n\t\t// it still \"renders\" a list with a predefined amount of items in it by default.\r\n\t\t// (`initiallyRenderedItemsCount`, or `1`).\r\n\t\tthis.getContainerElement = getContainerElement\r\n\t\t// Remove any accidental text nodes from container (like whitespace).\r\n\t\t// Also guards against cases when someone accidentally tries\r\n\t\t// using `VirtualScroller` on a non-empty element.\r\n\t\tif (getContainerElement()) {\r\n\t\t\tthis.screen.clearElement(getContainerElement())\r\n\t\t}\r\n\r\n\t\tthis.itemHeights = new ItemHeights(\r\n\t\t\tthis.screen,\r\n\t\t\tthis.getContainerElement,\r\n\t\t\t(i) => this.getState().itemHeights[i],\r\n\t\t\t(i, height) => this.getState().itemHeights[i] = height\r\n\t\t)\r\n\r\n\t\t// Initialize `ItemHeights` from the initially passed `state`.\r\n\t\tif (state) {\r\n\t\t\tthis.itemHeights.initialize(state.itemHeights)\r\n\t\t}\r\n\r\n\t\tthis.layout = new Layout({\r\n\t\t\tbypass,\r\n\t\t\testimatedItemHeight,\r\n\t\t\tmeasureItemsBatchSize: measureItemsBatchSize === undefined ? 50 : measureItemsBatchSize,\r\n\t\t\tgetVerticalSpacing: () => this.getVerticalSpacing(),\r\n\t\t\tgetColumnsCount: () => this.getColumnsCount(),\r\n\t\t\tgetItemHeight: (i) => this.getState().itemHeights[i],\r\n\t\t\tgetAverageItemHeight: () => this.itemHeights.getAverage()\r\n\t\t})\r\n\r\n\t\tthis.resize = new Resize({\r\n\t\t\tbypass,\r\n\t\t\tscrollableContainer: this.scrollableContainer,\r\n\t\t\tgetContainerElement: this.getContainerElement,\r\n\t\t\tupdateLayout: ({ reason }) => this.onUpdateShownItemIndexes({ reason }),\r\n\t\t\tresetStateAndLayout: () => {\r\n\t\t\t\t// Reset item heights, because if scrollable container's width (or height)\r\n\t\t\t\t// has changed, then the list width (or height) most likely also has changed,\r\n\t\t\t\t// and also some CSS `@media()` rules might have been added or removed.\r\n\t\t\t\t// So re-render the list entirely.\r\n\t\t\t\tlog('~ Scrollable container size changed, re-measure item heights. ~')\r\n\t\t\t\tthis.redoLayoutReason = LAYOUT_REASON.RESIZE\r\n\t\t\t\t// `this.layoutResetPending` flag will be cleared in `didUpdateState()`.\r\n\t\t\t\tthis.layoutResetPending = true\r\n\t\t\t\tlog('Reset state')\r\n\t\t\t\t// Calling `this.setState(state)` will trigger `didUpdateState()`.\r\n\t\t\t\t// `didUpdateState()` will detect `this.redoLayoutReason`.\r\n\t\t\t\tthis.setState(this.getInitialLayoutState(this.newItemsPending || this.getState().items))\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\tif (preserveScrollPositionAtBottomOnMount) {\r\n\t\t\twarn('`preserveScrollPositionAtBottomOnMount` option/property has been renamed to `preserveScrollPositionOfTheBottomOfTheListOnMount`')\r\n\t\t}\r\n\r\n\t\tthis.preserveScrollPositionOfTheBottomOfTheListOnMount = preserveScrollPositionOfTheBottomOfTheListOnMount || preserveScrollPositionAtBottomOnMount\r\n\r\n\t\tthis.scroll = new Scroll({\r\n\t\t\tbypass: this.bypass,\r\n\t\t\tscrollableContainer: this.scrollableContainer,\r\n\t\t\tupdateLayout: ({ reason }) => this.onUpdateShownItemIndexes({ reason }),\r\n\t\t\tinitialScrollPosition,\r\n\t\t\tonScrollPositionChange,\r\n\t\t\tisImmediateLayoutScheduled: () => this.layoutTimer,\r\n\t\t\thasNonRenderedItemsAtTheTop: () => this.getState().firstShownItemIndex > 0,\r\n\t\t\thasNonRenderedItemsAtTheBottom: () => this.getState().lastShownItemIndex < this.getItemsCount() - 1,\r\n\t\t\tgetLatestLayoutVisibleAreaIncludingMargins: () => this.latestLayoutVisibleAreaIncludingMargins,\r\n\t\t\tpreserveScrollPositionOfTheBottomOfTheListOnMount: this.preserveScrollPositionOfTheBottomOfTheListOnMount\r\n\t\t})\r\n\r\n\t\tthis.restoreScroll = new RestoreScroll({\r\n\t\t\tscreen: this.screen,\r\n\t\t\tgetContainerElement: this.getContainerElement\r\n\t\t})\r\n\r\n\t\tthis.waitForStylesToLoad = new WaitForStylesToLoad({\r\n\t\t\tupdateLayout: ({ reason }) => this.onUpdateShownItemIndexes({ reason }),\r\n\t\t\tgetListTopOffsetInsideScrollableContainer: this.getListTopOffsetInsideScrollableContainer\r\n\t\t})\r\n\r\n\t\tthis.setState(state || this.getInitialState(customState))\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the initial state of the `VirtualScroller`.\r\n\t * @param {object} [customState] — Any additional \"custom\" state may be stored in `VirtualScroller`'s state. For example, React implementation stores item \"refs\" as \"custom\" state.\r\n\t * @return {object}\r\n\t */\r\n\tgetInitialState(customState) {\r\n\t\tconst items = this.initialItems\r\n\t\tconst state = {\r\n\t\t\t...customState,\r\n\t\t\t...this.getInitialLayoutState(items),\r\n\t\t\titems,\r\n\t\t\titemStates: new Array(items.length)\r\n\t\t}\r\n\t\tlog('Initial state (autogenerated)', state)\r\n\t\tlog('First shown item index', state.firstShownItemIndex)\r\n\t\tlog('Last shown item index', state.lastShownItemIndex)\r\n\t\treturn state\r\n\t}\r\n\r\n\tgetInitialLayoutValues({ itemsCount, bypass }) {\r\n\t\treturn this.layout.getInitialLayoutValues({\r\n\t\t\tbypass,\r\n\t\t\titemsCount,\r\n\t\t\tvisibleAreaHeightIncludingMargins: this.scrollableContainer && (2 * this.getMargin() + this.scrollableContainer.getHeight())\r\n\t\t})\r\n\t}\r\n\r\n\tgetInitialLayoutState(items) {\r\n\t\tconst itemsCount = items.length\r\n\t\tconst {\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex,\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tafterItemsHeight\r\n\t\t} = this.getInitialLayoutValues({\r\n\t\t\titemsCount,\r\n\t\t\tbypass: this.preserveScrollPositionOfTheBottomOfTheListOnMount\r\n\t\t})\r\n\t\tconst itemHeights = new Array(itemsCount)\r\n\t\t// Optionally preload items to be rendered.\r\n\t\tthis.onBeforeShowItems(\r\n\t\t\titems,\r\n\t\t\titemHeights,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t)\r\n\t\t// This \"initial\" state object must include all possible state properties\r\n\t\t// because `this.setState()` gets called with this state on window resize,\r\n\t\t// when `VirtualScroller` gets reset.\r\n\t\t// Item states aren't included here because the state of all items should be\r\n\t\t// preserved on window resize.\r\n\t\treturn {\r\n\t\t\titemHeights,\r\n\t\t\tcolumnsCount: this._getColumnsCount ? this._getColumnsCount(this.scrollableContainer) : undefined,\r\n\t\t\tverticalSpacing: undefined,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex,\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tafterItemsHeight\r\n\t\t}\r\n\t}\r\n\r\n\tgetVerticalSpacing() {\r\n\t\treturn this.getState() && this.getState().verticalSpacing || 0\r\n\t}\r\n\r\n\tgetColumnsCount() {\r\n\t\treturn this.getState() && this.getState().columnsCount || 1\r\n\t}\r\n\r\n\tgetItemsCount() {\r\n\t\treturn this.getState().items.length\r\n\t}\r\n\r\n\tgetMargin() {\r\n\t\t// `VirtualScroller` also items that are outside of the screen\r\n\t\t// by the amount of this \"render ahead margin\" (both on top and bottom).\r\n\t\t// The default \"render ahead margin\" is equal to the screen height:\r\n\t\t// this seems to be the optimal value for \"Page Up\" / \"Page Down\" navigation\r\n\t\t// and optimized mouse wheel scrolling (a user is unlikely to continuously\r\n\t\t// scroll past the height of a screen, and when they stop scrolling,\r\n\t\t// the list is re-rendered).\r\n\t\tconst renderAheadMarginRatio = 1 // in scrollable container heights.\r\n\t\treturn this.scrollableContainer.getHeight() * renderAheadMarginRatio\r\n\t}\r\n\r\n\t/**\r\n\t * Calls `onItemFirstRender()` for items that haven't been\r\n\t * \"seen\" previously.\r\n\t * @param {any[]} items\r\n\t * @param {number[]} itemHeights\r\n\t * @param {number} firstShownItemIndex\r\n\t * @param {number} lastShownItemIndex\r\n\t */\r\n\tonBeforeShowItems(\r\n\t\titems,\r\n\t\titemHeights,\r\n\t\tfirstShownItemIndex,\r\n\t\tlastShownItemIndex\r\n\t) {\r\n\t\tif (this.onItemInitialRender) {\r\n\t\t\tlet i = firstShownItemIndex\r\n\t\t\twhile (i <= lastShownItemIndex) {\r\n\t\t\t\tif (itemHeights[i] === undefined) {\r\n\t\t\t\t\tthis.onItemInitialRender(items[i])\r\n\t\t\t\t}\r\n\t\t\t\ti++\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tonMount() {\r\n\t\twarn('`.onMount()` instance method name is deprecated, use `.listen()` instance method name instead.')\r\n\t\tthis.listen()\r\n\t}\r\n\r\n\trender() {\r\n\t\twarn('`.render()` instance method name is deprecated, use `.listen()` instance method name instead.')\r\n\t\tthis.listen()\r\n\t}\r\n\r\n\t/**\r\n\t * Should be invoked after a \"container\" DOM Element is mounted (inserted into the DOM tree).\r\n\t */\r\n\tlisten() {\r\n\t\tif (this.isRendered === false) {\r\n\t\t\tthrow new Error('[virtual-scroller] Can\\'t restart a `VirtualScroller` after it has been stopped')\r\n\t\t}\r\n\t\tlog('~ Rendered (initial) ~')\r\n\t\t// `this.isRendered = true` should be the first statement in this function,\r\n\t\t// otherwise `DOMVirtualScroller` would enter an infinite re-render loop.\r\n\t\tthis.isRendered = true\r\n\t\tthis.onRenderedNewLayout()\r\n\t\tthis.resize.listen()\r\n\t\tthis.scroll.listen()\r\n\t\t// Work around `<tbody/>` not being able to have `padding`.\r\n\t\t// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n\t\tif (this.tbody) {\r\n\t\t\taddTbodyStyles(this.getContainerElement())\r\n\t\t}\r\n\t\tif (this.preserveScrollPositionOfTheBottomOfTheListOnMount) {\r\n\t\t\t// In this case, all items are shown, so there's no need to call\r\n\t\t\t// `this.onUpdateShownItemIndexes()` after the initial render.\r\n\t\t} else {\r\n\t\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.MOUNT })\r\n\t\t}\r\n\t}\r\n\r\n\tonRenderedNewLayout() {\r\n\t\t// Update item vertical spacing.\r\n\t\tthis.measureVerticalSpacing()\r\n\t\t// Measure \"newly shown\" item heights.\r\n\t\t// Also re-validate already measured items' heights.\r\n\t\tthis.itemHeights.measureItemHeights(\r\n\t\t\tthis.getState().firstShownItemIndex,\r\n\t\t\tthis.getState().lastShownItemIndex\r\n\t\t)\r\n\t\t// Update `<tbody/>` `padding`.\r\n\t\t// (`<tbody/>` is different in a way that it can't have `margin`, only `padding`).\r\n\t\t// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n\t\tif (this.tbody) {\r\n\t\t\tsetTbodyPadding(\r\n\t\t\t\tthis.getContainerElement(),\r\n\t\t\t\tthis.getState().beforeItemsHeight,\r\n\t\t\t\tthis.getState().afterItemsHeight\r\n\t\t\t)\r\n\t\t}\r\n\t}\r\n\r\n\tgetVisibleAreaBoundsIncludingMargins() {\r\n\t\tconst visibleArea = this.scroll.getVisibleAreaBounds()\r\n\t\tvisibleArea.top -= this.getMargin()\r\n\t\tvisibleArea.bottom += this.getMargin()\r\n\t\treturn visibleArea\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the list's top offset relative to the scrollable container's top edge.\r\n\t * @return {number}\r\n\t */\r\n\tgetListTopOffsetInsideScrollableContainer = () => {\r\n\t\tconst listTopOffset = this.scrollableContainer.getTopOffset(this.getContainerElement())\r\n\t\tthis.waitForStylesToLoad.onGotListTopOffset(listTopOffset)\r\n\t\treturn listTopOffset\r\n\t}\r\n\r\n\tonUnmount() {\r\n\t\twarn('`.onUnmount()` instance method name is deprecated, use `.stop()` instance method name instead.')\r\n\t\tthis.stop()\r\n\t}\r\n\r\n\tdestroy() {\r\n\t\twarn('`.destroy()` instance method name is deprecated, use `.stop()` instance method name instead.')\r\n\t\tthis.stop()\r\n\t}\r\n\r\n\tstop() {\r\n\t\tthis.isRendered = false\r\n\t\tthis.resize.stop()\r\n\t\tthis.scroll.stop()\r\n\t\tthis.waitForStylesToLoad.stop()\r\n\t\tif (this.layoutTimer) {\r\n\t\t\tclearTimeout(this.layoutTimer)\r\n\t\t\tthis.layoutTimer = undefined\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Should be called right before `state` is updated.\r\n\t * @param {object} prevState\r\n\t * @param {object} newState\r\n\t */\r\n\twillUpdateState = (newState, prevState) => {\r\n\t\t// Ignore setting initial state.\r\n\t\tif (!prevState) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\t// This function isn't currently used.\r\n\t\t// Was previously used to capture scroll position in order to\r\n\t\t// restore it later after the new state is rendered.\r\n\t}\r\n\r\n\t/**\r\n\t * Should be called right after `state` is updated.\r\n\t * @param {object} prevState\r\n\t */\r\n\tdidUpdateState = (prevState) => {\r\n\t\tconst newState = this.getState()\r\n\t\tif (this.onStateChange) {\r\n\t\t\tif (!shallowEqual(newState, prevState)) {\r\n\t\t\t\tthis.onStateChange(newState, prevState)\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Ignore setting initial state.\r\n\t\tif (!prevState) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\tif (!this.isRendered) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\tlog('~ Rendered ~')\r\n\t\tthis.newItemsPending = undefined\r\n\t\tthis.layoutResetPending = undefined\r\n\t\tlet redoLayoutReason = this.redoLayoutReason\r\n\t\tthis.redoLayoutReason = undefined\r\n\t\tconst { items: previousItems } = prevState\r\n\t\tconst { items: newItems } = newState\r\n\t\tif (newItems !== previousItems) {\r\n\t\t\tlet layoutNeedsReCalculating = true\r\n\t\t\tconst itemsDiff = this.getItemsDiff(previousItems, newItems)\r\n\t\t\t// If it's an \"incremental\" update.\r\n\t\t\tif (itemsDiff) {\r\n\t\t\t\tconst {\r\n\t\t\t\t\tprependedItemsCount,\r\n\t\t\t\t\tappendedItemsCount\r\n\t\t\t\t} = itemsDiff\r\n\t\t\t\tif (prependedItemsCount > 0) {\r\n\t\t\t\t\t// The call to `.onPrepend()` must precede\r\n\t\t\t\t\t// the call to `.measureItemHeights()`\r\n\t\t\t\t\t// which is called in `.onRendered()`.\r\n\t\t\t\t\tthis.itemHeights.onPrepend(prependedItemsCount)\r\n\t\t\t\t\tif (this.restoreScroll.shouldRestoreScrollAfterRender()) {\r\n\t\t\t\t\t\tlayoutNeedsReCalculating = false\r\n\t\t\t\t\t\tlog('~ Restore Scroll Position ~')\r\n\t\t\t\t\t\tconst scrollByY = this.restoreScroll.getScrollDifference()\r\n\t\t\t\t\t\tif (scrollByY) {\r\n\t\t\t\t\t\t\tlog('Scroll down by', scrollByY)\r\n\t\t\t\t\t\t\tthis.scroll.scrollByY(scrollByY)\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tlog('Scroll position hasn\\'t changed')\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} else {\r\n\t\t\t\tthis.itemHeights.reset()\r\n\t\t\t\tthis.itemHeights.initialize(this.getState().itemHeights)\r\n\t\t\t}\r\n\t\t\tif (layoutNeedsReCalculating) {\r\n\t\t\t\tredoLayoutReason = LAYOUT_REASON.ITEMS_CHANGED\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Call `.onRendered()` if shown items configuration changed.\r\n\t\tif (newState.firstShownItemIndex !== prevState.firstShownItemIndex ||\r\n\t\t\tnewState.lastShownItemIndex !== prevState.lastShownItemIndex ||\r\n\t\t\tnewState.items !== prevState.items) {\r\n\t\t\tthis.onRenderedNewLayout()\r\n\t\t}\r\n\t\tif (redoLayoutReason) {\r\n\t\t\treturn this.redoLayoutRightAfterRender({\r\n\t\t\t\treason: redoLayoutReason\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n\r\n\tredoLayoutRightAfterRender({ reason }) {\r\n\t\t// In React, `setTimeout()` is used to prevent a React error:\r\n\t\t// \"Maximum update depth exceeded.\r\n\t\t// This can happen when a component repeatedly calls\r\n\t\t// `.setState()` inside `componentWillUpdate()` or `componentDidUpdate()`.\r\n\t\t// React limits the number of nested updates to prevent infinite loops.\"\r\n\t\tif (this._useTimeoutInRenderLoop) {\r\n\t\t\t// Cancel a previously scheduled re-layout.\r\n\t\t\tif (this.layoutTimer) {\r\n\t\t\t\tclearTimeout(this.layoutTimer)\r\n\t\t\t}\r\n\t\t\t// Schedule a new re-layout.\r\n\t\t\tthis.layoutTimer = setTimeout(() => {\r\n\t\t\t\tthis.layoutTimer = undefined\r\n\t\t\t\tthis.onUpdateShownItemIndexes({ reason })\r\n\t\t\t}, 0)\r\n\t\t} else {\r\n\t\t\tthis.onUpdateShownItemIndexes({ reason })\r\n\t\t}\r\n\t}\r\n\r\n\tmeasureVerticalSpacing() {\r\n\t\tif (this.getState().verticalSpacing === undefined) {\r\n\t\t\tlog('~ Measure item vertical spacing ~')\r\n\t\t\tconst verticalSpacing = getVerticalSpacing({\r\n\t\t\t\tcontainer: this.getContainerElement(),\r\n\t\t\t\tscreen: this.screen\r\n\t\t\t})\r\n\t\t\tif (verticalSpacing === undefined) {\r\n\t\t\t\tlog('Not enough items rendered to measure vertical spacing')\r\n\t\t\t} else {\r\n\t\t\t\tlog('Item vertical spacing', verticalSpacing)\r\n\t\t\t\tthis.setState({ verticalSpacing })\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tremeasureItemHeight(i) {\r\n\t\tconst { firstShownItemIndex } = this.getState()\r\n\t\treturn this.itemHeights.remeasureItemHeight(i, firstShownItemIndex)\r\n\t}\r\n\r\n\tonItemStateChange(i, itemState) {\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('~ Item state changed ~')\r\n\t\t\tlog('Item', i)\r\n\t\t\tlog('Previous state' + '\\n' + JSON.stringify(this.getState().itemStates[i], null, 2))\r\n\t\t\tlog('New state' + '\\n' + JSON.stringify(itemState, null, 2))\r\n\t\t}\r\n\t\tthis.getState().itemStates[i] = itemState\r\n\t}\r\n\r\n\tonItemHeightChange(i) {\r\n\t\tlog('~ Re-measure item height ~')\r\n\t\tlog('Item', i)\r\n\t\tconst { itemHeights } = this.getState()\r\n\t\tconst previousHeight = itemHeights[i]\r\n\t\tif (previousHeight === undefined) {\r\n\t\t\treturn reportError(`\"onItemHeightChange()\" has been called for item ${i}, but that item hasn't been rendered before.`)\r\n\t\t}\r\n\t\tconst newHeight = this.remeasureItemHeight(i)\r\n\t\t// Check if the item is still rendered.\r\n\t\tif (newHeight === undefined) {\r\n\t\t\t// There could be valid cases when an item is no longer rendered\r\n\t\t\t// by the time `.onItemHeightChange(i)` gets called.\r\n\t\t\t// For example, suppose there's a list of several items on a page,\r\n\t\t\t// and those items are in \"minimized\" state (having height 100px).\r\n\t\t\t// Then, a user clicks an \"Expand all items\" button, and all items\r\n\t\t\t// in the list are expanded (expanded item height is gonna be 700px).\r\n\t\t\t// `VirtualScroller` demands that `.onItemHeightChange(i)` is called\r\n\t\t\t// in such cases, and the developer has properly added the code to do that.\r\n\t\t\t// So, if there were 10 \"minimized\" items visible on a page, then there\r\n\t\t\t// will be 10 individual `.onItemHeightChange(i)` calls. No issues so far.\r\n\t\t\t// But, as the first `.onItemHeightChange(i)` call executes, it immediately\r\n\t\t\t// (\"synchronously\") triggers a re-layout, and that re-layout finds out\r\n\t\t\t// that now, because the first item is big, it occupies most of the screen\r\n\t\t\t// space, and only the first 3 items are visible on screen instead of 10,\r\n\t\t\t// and so it leaves the first 3 items mounted and unmounts the rest 7.\r\n\t\t\t// Then, after `VirtualScroller` has rerendered, the code returns to\r\n\t\t\t// where it was executing, and calls `.onItemHeightChange(i)` for the\r\n\t\t\t// second item. It also triggers an immediate re-layout that finds out\r\n\t\t\t// that only the first 2 items are visible on screen, and it unmounts\r\n\t\t\t// the third one too. After that, it calls `.onItemHeightChange(i)`\r\n\t\t\t// for the third item, but that item is no longer rendered, so its height\r\n\t\t\t// can't be measured, and the same's for all the rest of the original 10 items.\r\n\t\t\t// So, even though the developer has written their code properly, there're\r\n\t\t\t// still situations when the item could be no longer rendered by the time\r\n\t\t\t// `.onItemHeightChange(i)` gets called.\r\n\t\t\treturn warn('The item is no longer rendered. This is not necessarily a bug, and could happen, for example, when there\\'re several `onItemHeightChange(i)` calls issued at the same time.')\r\n\t\t}\r\n\t\tlog('Previous height', previousHeight)\r\n\t\tlog('New height', newHeight)\r\n\t\tif (previousHeight !== newHeight) {\r\n\t\t\tlog('~ Item height has changed ~')\r\n\t\t\t// log('Item', i)\r\n\t\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.ITEM_HEIGHT_CHANGED })\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Validates the heights of items to be hidden on next render.\r\n\t * For example, a user could click a \"Show more\" button,\r\n\t * or an \"Expand YouTube video\" button, which would result\r\n\t * in the actual height of the list item being different\r\n\t * from what has been initially measured in `this.itemHeights[i]`,\r\n\t * if the developer didn't call `.onItemStateChange()` and `.onItemHeightChange(i)`.\r\n\t */\r\n\tvalidateWillBeHiddenItemHeightsAreAccurate(firstShownItemIndex, lastShownItemIndex) {\r\n\t\tlet isValid = true\r\n\t\tlet i = this.getState().firstShownItemIndex\r\n\t\twhile (i <= this.getState().lastShownItemIndex) {\r\n\t\t\tif (i >= firstShownItemIndex && i <= lastShownItemIndex) {\r\n\t\t\t\t// The item's still visible.\r\n\t\t\t} else {\r\n\t\t\t\t// The item will be hidden. Re-measure its height.\r\n\t\t\t\t// The rationale is that there could be a situation when an item's\r\n\t\t\t\t// height has changed, and the developer has properly added an\r\n\t\t\t\t// `.onItemHeightChange(i)` call to notify `VirtualScroller`\r\n\t\t\t\t// about that change, but at the same time that wouldn't work.\r\n\t\t\t\t// For example, suppose there's a list of several items on a page,\r\n\t\t\t\t// and those items are in \"minimized\" state (having height 100px).\r\n\t\t\t\t// Then, a user clicks an \"Expand all items\" button, and all items\r\n\t\t\t\t// in the list are expanded (expanded item height is gonna be 700px).\r\n\t\t\t\t// `VirtualScroller` demands that `.onItemHeightChange(i)` is called\r\n\t\t\t\t// in such cases, and the developer has properly added the code to do that.\r\n\t\t\t\t// So, if there were 10 \"minimized\" items visible on a page, then there\r\n\t\t\t\t// will be 10 individual `.onItemHeightChange(i)` calls. No issues so far.\r\n\t\t\t\t// But, as the first `.onItemHeightChange(i)` call executes, it immediately\r\n\t\t\t\t// (\"synchronously\") triggers a re-layout, and that re-layout finds out\r\n\t\t\t\t// that now, because the first item is big, it occupies most of the screen\r\n\t\t\t\t// space, and only the first 3 items are visible on screen instead of 10,\r\n\t\t\t\t// and so it leaves the first 3 items mounted and unmounts the rest 7.\r\n\t\t\t\t// Then, after `VirtualScroller` has rerendered, the code returns to\r\n\t\t\t\t// where it was executing, and calls `.onItemHeightChange(i)` for the\r\n\t\t\t\t// second item. It also triggers an immediate re-layout that finds out\r\n\t\t\t\t// that only the first 2 items are visible on screen, and it unmounts\r\n\t\t\t\t// the third one too. After that, it calls `.onItemHeightChange(i)`\r\n\t\t\t\t// for the third item, but that item is no longer rendered, so its height\r\n\t\t\t\t// can't be measured, and the same's for all the rest of the original 10 items.\r\n\t\t\t\t// So, even though the developer has written their code properly, the\r\n\t\t\t\t// `VirtualScroller` still ends up having incorrect `itemHeights[]`:\r\n\t\t\t\t// `[700px, 700px, 100px, 100px, 100px, 100px, 100px, 100px, 100px, 100px]`\r\n\t\t\t\t// while it should have been `700px` for all of them.\r\n\t\t\t\t// To work around such issues, every item's height is re-measured before it\r\n\t\t\t\t// gets hidden.\r\n\t\t\t\tconst previouslyMeasuredItemHeight = this.getState().itemHeights[i]\r\n\t\t\t\tconst actualItemHeight = this.remeasureItemHeight(i)\r\n\t\t\t\tif (actualItemHeight !== previouslyMeasuredItemHeight) {\r\n\t\t\t\t\tisValid = false\r\n\t\t\t\t\twarn('Item', i, 'will be unmounted at next render because it\\'s no longer visible. Its height has changed from', previouslyMeasuredItemHeight, 'to', actualItemHeight, 'since it was last measured. This is not necessarily a bug, and could happen, for example, when there\\'re several `onItemHeightChange(i)` calls issued at the same time, and the first one triggers a re-layout before the rest of them have had a chance to be executed.')\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\ti++\r\n\t\t}\r\n\t\treturn isValid\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the \"from\" and \"to\" shown item indexes.\r\n\t * If the list is visible and some of the items being shown are new\r\n\t * and are required to be measured first, then\r\n\t * `redoLayoutAfterMeasuringItemHeights` is `true`.\r\n\t * If the list is visible and all items being shown have been encountered\r\n\t * (and measured) before, then `redoLayoutAfterMeasuringItemHeights` is `false`.\r\n\t */\r\n\tupdateShownItemIndexes = () => {\r\n\t\tlog('~ Layout results ' + (this.bypass ? '(bypass) ' : '') + '~')\r\n\t\tconst visibleAreaIncludingMargins = this.getVisibleAreaBoundsIncludingMargins()\r\n\t\tthis.latestLayoutVisibleAreaIncludingMargins = visibleAreaIncludingMargins\r\n\t\tconst listTopOffsetInsideScrollableContainer = this.getListTopOffsetInsideScrollableContainer()\r\n\t\t// Get shown item indexes.\r\n\t\tlet {\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex,\r\n\t\t\tredoLayoutAfterMeasuringItemHeights\r\n\t\t} = this.layout.getShownItemIndexes({\r\n\t\t\tlistHeight: this.screen.getElementHeight(this.getContainerElement()),\r\n\t\t\titemsCount: this.getItemsCount(),\r\n\t\t\tvisibleAreaIncludingMargins,\r\n\t\t\tlistTopOffsetInsideScrollableContainer\r\n\t\t})\r\n\t\t// If scroll position is scheduled to be restored after render,\r\n\t\t// then the \"anchor\" item must be rendered, and all of the prepended\r\n\t\t// items before it, all in a single pass. This way, all of the\r\n\t\t// prepended items' heights could be measured right after the render\r\n\t\t// has finished, and the scroll position can then be immediately restored.\r\n\t\tif (this.restoreScroll.shouldRestoreScrollAfterRender()) {\r\n\t\t\tif (lastShownItemIndex < this.restoreScroll.getAnchorItemIndex()) {\r\n\t\t\t\tlastShownItemIndex = this.restoreScroll.getAnchorItemIndex()\r\n\t\t\t}\r\n\t\t\t// `firstShownItemIndex` is always `0` when prepending items.\r\n\t\t\t// And `lastShownItemIndex` always covers all prepended items in this case.\r\n\t\t\t// None of the prepended items have been rendered before,\r\n\t\t\t// so their heights are unknown. The code at the start of this function\r\n\t\t\t// did therefore set `redoLayoutAfterMeasuringItemHeights` to `true`\r\n\t\t\t// in order to render just the first prepended item in order to\r\n\t\t\t// measure it, and only then make a decision on how many other\r\n\t\t\t// prepended items to render. But since we've instructed the code\r\n\t\t\t// to show all of the prepended items at once, there's no need to\r\n\t\t\t// \"redo layout after render\". Additionally, if layout was re-done\r\n\t\t\t// after render, then there would be a short interval of visual\r\n\t\t\t// \"jitter\" due to the scroll position not being restored because it'd\r\n\t\t\t// wait for the second layout to finish instead of being restored\r\n\t\t\t// right after the first one.\r\n\t\t\tredoLayoutAfterMeasuringItemHeights = false\r\n\t\t}\r\n\t\t// Validate the heights of items to be hidden on next render.\r\n\t\t// For example, a user could click a \"Show more\" button,\r\n\t\t// or an \"Expand YouTube video\" button, which would result\r\n\t\t// in the actual height of the list item being different\r\n\t\t// from what has been initially measured in `this.itemHeights[i]`,\r\n\t\t// if the developer didn't call `.onItemStateChange()` and `.onItemHeightChange(i)`.\r\n\t\tif (!this.validateWillBeHiddenItemHeightsAreAccurate(firstShownItemIndex, lastShownItemIndex)) {\r\n\t\t\t// Redo layout, now with the correct item heights.\r\n\t\t\tlog('~ Some of the will-be-hidden item heights have changed since they\\'ve last been measured. Redo layout. ~')\r\n\t\t\treturn this.updateShownItemIndexes();\r\n\t\t}\r\n\t\t// Measure \"before\" items height.\r\n\t\tconst beforeItemsHeight = this.layout.getBeforeItemsHeight(\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t)\r\n\t\t// Measure \"after\" items height.\r\n\t\tconst afterItemsHeight = this.layout.getAfterItemsHeight(\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex,\r\n\t\t\tthis.getItemsCount()\r\n\t\t)\r\n\t\t// Debugging.\r\n\t\tif (this._getColumnsCount) {\r\n\t\t\tlog('Columns count', this.getColumnsCount())\r\n\t\t}\r\n\t\tlog('First shown item index', firstShownItemIndex)\r\n\t\tlog('Last shown item index', lastShownItemIndex)\r\n\t\tlog('Before items height', beforeItemsHeight)\r\n\t\tlog('After items height (actual or estimated)', afterItemsHeight)\r\n\t\tlog('Average item height (calculated on previous render)', this.itemHeights.getAverage())\r\n\t\tif (isDebug()) {\r\n\t\t\tlog('Item heights', this.getState().itemHeights.slice())\r\n\t\t\tlog('Item states', this.getState().itemStates.slice())\r\n\t\t}\r\n\t\tif (redoLayoutAfterMeasuringItemHeights) {\r\n\t\t\t// `this.redoLayoutReason` will be detected in `didUpdateState()`.\r\n\t\t\t// `didUpdateState()` is triggered by `this.setState()` below.\r\n\t\t\tthis.redoLayoutReason = LAYOUT_REASON.ITEM_HEIGHT_NOT_MEASURED\r\n\t\t}\r\n\t\t// Optionally preload items to be rendered.\r\n\t\tthis.onBeforeShowItems(\r\n\t\t\tthis.getState().items,\r\n\t\t\tthis.getState().itemHeights,\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex\r\n\t\t)\r\n\t\t// Render.\r\n\t\tthis.setState({\r\n\t\t\tfirstShownItemIndex,\r\n\t\t\tlastShownItemIndex,\r\n\t\t\tbeforeItemsHeight,\r\n\t\t\tafterItemsHeight,\r\n\t\t\t// // Average item height is stored in state to differentiate between\r\n\t\t\t// // the initial state and \"anything has been measured already\" state.\r\n\t\t\t// averageItemHeight: this.itemHeights.getAverage()\r\n\t\t})\r\n\t}\r\n\r\n\tonUpdateShownItemIndexes = ({ reason }) => {\r\n\t\t// If there're no items then there's no need to re-layout anything.\r\n\t\tif (this.getItemsCount() === 0) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\t// Cancel a \"re-layout when user stops scrolling\" timer.\r\n\t\tthis.scroll.onLayout()\r\n\t\t// Cancel a re-layout that is scheduled to run at the next \"frame\",\r\n\t\t// because a re-layout will be performed right now.\r\n\t\tif (this.layoutTimer) {\r\n\t\t\tclearTimeout(this.layoutTimer)\r\n\t\t\tthis.layoutTimer = undefined\r\n\t\t}\r\n\t\t// Perform a re-layout.\r\n\t\tlog(`~ Calculate Layout (on ${reason}) ~`)\r\n\t\tthis.updateShownItemIndexes()\r\n\t}\r\n\r\n\tupdateLayout = () => this.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.MANUAL })\r\n\r\n\t// `.layout()` method name is deprecated, use `.updateLayout()` instead.\r\n\tlayout = () => this.updateLayout()\r\n\r\n\t/**\r\n\t * @deprecated\r\n\t * `.updateItems()` has been renamed to `.setItems()`.\r\n\t */\r\n\tupdateItems(newItems, options) {\r\n\t\treturn this.setItems(newItems, options)\r\n\t}\r\n\r\n\t/**\r\n\t * Updates `items`. For example, can prepend or append new items to the list.\r\n\t * @param {any[]} newItems\r\n\t * @param {boolean} [options.preserveScrollPositionOnPrependItems] — Set to `true` to enable \"restore scroll position after prepending items\" feature (could be useful when implementing \"Show previous items\" button).\r\n\t */\r\n\tsetItems(newItems, options = {}) {\r\n\t\t// * @param {object} [newCustomState] — If `customState` was passed to `getInitialState()`, this `newCustomState` updates it.\r\n\t\tconst {\r\n\t\t\titems: previousItems\r\n\t\t} = this.getState()\r\n\t\tlet {\r\n\t\t\titemStates,\r\n\t\t\titemHeights\r\n\t\t} = this.getState()\r\n\t\tlog('~ Update items ~')\r\n\t\tlet layout\r\n\t\tconst itemsDiff = this.getItemsDiff(previousItems, newItems)\r\n\t\t// If it's an \"incremental\" update.\r\n\t\tif (itemsDiff && !this.layoutResetPending) {\r\n\t\t\tconst {\r\n\t\t\t\tfirstShownItemIndex,\r\n\t\t\t\tlastShownItemIndex,\r\n\t\t\t\tbeforeItemsHeight,\r\n\t\t\t\tafterItemsHeight\r\n\t\t\t} = this.getState()\r\n\t\t\tlayout = {\r\n\t\t\t\tfirstShownItemIndex,\r\n\t\t\t\tlastShownItemIndex,\r\n\t\t\t\tbeforeItemsHeight,\r\n\t\t\t\tafterItemsHeight\r\n\t\t\t}\r\n\t\t\tconst {\r\n\t\t\t\tprependedItemsCount,\r\n\t\t\t\tappendedItemsCount\r\n\t\t\t} = itemsDiff\r\n\t\t\tif (prependedItemsCount > 0) {\r\n\t\t\t\tlog('Prepend', prependedItemsCount, 'items')\r\n\t\t\t\titemHeights = new Array(prependedItemsCount).concat(itemHeights)\r\n\t\t\t\tif (itemStates) {\r\n\t\t\t\t\titemStates = new Array(prependedItemsCount).concat(itemStates)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (appendedItemsCount > 0) {\r\n\t\t\t\tlog('Append', appendedItemsCount, 'items')\r\n\t\t\t\titemHeights = itemHeights.concat(new Array(appendedItemsCount))\r\n\t\t\t\tif (itemStates) {\r\n\t\t\t\t\titemStates = itemStates.concat(new Array(appendedItemsCount))\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.layout.updateLayoutForItemsDiff(layout, itemsDiff, {\r\n\t\t\t\titemsCount: newItems.length\r\n\t\t\t})\r\n\t\t\tif (prependedItemsCount > 0) {\r\n\t\t\t\t// `preserveScrollPosition` option name is deprecated,\r\n\t\t\t\t// use `preserveScrollPositionOnPrependItems` instead.\r\n\t\t\t\tif (options.preserveScrollPositionOnPrependItems || options.preserveScrollPosition) {\r\n\t\t\t\t\tif (this.getState().firstShownItemIndex === 0) {\r\n\t\t\t\t\t\tthis.restoreScroll.captureScroll({\r\n\t\t\t\t\t\t\tpreviousItems,\r\n\t\t\t\t\t\t\tnewItems,\r\n\t\t\t\t\t\t\tprependedItemsCount\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\tthis.layout.showItemsFromTheStart(layout)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tlog('Items have changed, and', (itemsDiff ? 'a re-layout from scratch has been requested.' : 'it\\'s not a simple append and/or prepend.'), 'Rerender the entire list from scratch.')\r\n\t\t\tlog('Previous items', previousItems)\r\n\t\t\tlog('New items', newItems)\r\n\t\t\titemHeights = new Array(newItems.length)\r\n\t\t\titemStates = new Array(newItems.length)\r\n\t\t\tlayout = this.getInitialLayoutValues({\r\n\t\t\t\titemsCount: newItems.length\r\n\t\t\t})\r\n\t\t}\r\n\t\tlog('~ Update state ~')\r\n\t\tlog('First shown item index', layout.firstShownItemIndex)\r\n\t\tlog('Last shown item index', layout.lastShownItemIndex)\r\n\t\tlog('Before items height', layout.beforeItemsHeight)\r\n\t\tlog('After items height (actual or estimated)', layout.afterItemsHeight)\r\n\t\t// Optionally preload items to be rendered.\r\n\t\tthis.onBeforeShowItems(\r\n\t\t\tnewItems,\r\n\t\t\titemHeights,\r\n\t\t\tlayout.firstShownItemIndex,\r\n\t\t\tlayout.lastShownItemIndex\r\n\t\t)\r\n\t\t// `this.newItemsPending` will be cleared in `didUpdateState()`.\r\n\t\tthis.newItemsPending = newItems\r\n\t\t// Update state.\r\n\t\tthis.setState({\r\n\t\t\t// ...customState,\r\n\t\t\t...layout,\r\n\t\t\titems: newItems,\r\n\t\t\titemStates,\r\n\t\t\titemHeights\r\n\t\t})\r\n\t}\r\n\r\n\tgetItemsDiff(previousItems, newItems) {\r\n\t\treturn getItemsDiff(previousItems, newItems, this.isItemEqual)\r\n\t}\r\n}"],"file":"VirtualScroller.js"}
1
+ {"version":3,"file":"VirtualScroller.js","names":["VirtualScrollerConstructor","hasTbodyStyles","addTbodyStyles","LAYOUT_REASON","log","VirtualScroller","getItemsContainerElement","items","options","_isActive","Error","resize","stop","scroll","listTopOffsetWatcher","isStarted","cancelLayoutTimer","hasToBeStarted","onUpdateShownItemIndexes","reason","MANUAL","_onRender","getState","previousState","call","isRestart","_usesCustomStateStorage","useDefaultStateStorage","_render","listHeightMeasurement","reset","_isResizing","undefined","_isSettingNewItems","tbody","stateUpdate","_stoppedStateUpdate","verticalSpacing","verticalSpacingStateUpdate","measureItemHeightsAndSpacing","start","scrollableContainerWidth","scrollableContainer","getWidth","newWidth","prevWidth","onResize","columnsCount","getActualColumnsCount","columnsCountFromState","STARTED","i","itemTopOffsetInList","layout","getItemTopOffset","getListTopOffsetInsideScrollableContainer","_onItemHeightChange","newItemState","_onItemStateChange","newItems","_setItems"],"sources":["../source/VirtualScroller.js"],"sourcesContent":["import VirtualScrollerConstructor from './VirtualScroller.constructor.js'\r\nimport { hasTbodyStyles, addTbodyStyles } from './DOM/tbody.js'\r\nimport { LAYOUT_REASON } from './Layout.js'\r\nimport log from './utility/debug.js'\r\n\r\nexport default class VirtualScroller {\r\n\t/**\r\n\t * @param {function} getItemsContainerElement — Returns the container DOM `Element`.\r\n\t * @param {any[]} items — The list of items.\r\n\t * @param {Object} [options] — See README.md.\r\n\t * @return {VirtualScroller}\r\n\t */\r\n\tconstructor(\r\n\t\tgetItemsContainerElement,\r\n\t\titems,\r\n\t\toptions = {}\r\n\t) {\r\n\t\tVirtualScrollerConstructor.call(\r\n\t\t\tthis,\r\n\t\t\tgetItemsContainerElement,\r\n\t\t\titems,\r\n\t\t\toptions\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Should be invoked after a \"container\" DOM Element is mounted (inserted into the DOM tree).\r\n\t */\r\n\tstart() {\r\n\t\tif (this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` has already been started')\r\n\t\t}\r\n\r\n\t\t// If has been stopped previously.\r\n\t\tconst isRestart = this._isActive === false\r\n\r\n\t\tif (!isRestart) {\r\n\t\t\t// If no custom one has been configured, uses the default one.\r\n\t\t\t// Also sets the initial state.\r\n\t\t\tif (!this._usesCustomStateStorage) {\r\n\t\t\t\tthis.useDefaultStateStorage()\r\n\t\t\t}\r\n\t\t\t// If `render()` function parameter was passed,\r\n\t\t\t// perform an initial render.\r\n\t\t\tif (this._render) {\r\n\t\t\t\tthis._render(this.getState())\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlog('~ Start ~')\r\n\r\n\t\t// `this._isActive = true` should be placed somewhere at the start of this function.\r\n\t\tthis._isActive = true\r\n\r\n\t\t// Reset `ListHeightMeasurement` just in case it has some \"leftover\" state.\r\n\t\tthis.listHeightMeasurement.reset()\r\n\r\n\t\t// Reset `_isResizing` flag just in case it has some \"leftover\" value.\r\n\t\tthis._isResizing = undefined\r\n\r\n\t\t// Reset `_isSettingNewItems` flag just in case it has some \"leftover\" value.\r\n\t\tthis._isSettingNewItems = undefined\r\n\r\n\t\t// Work around `<tbody/>` not being able to have `padding`.\r\n\t\t// https://gitlab.com/catamphetamine/virtual-scroller/-/issues/1\r\n\t\tif (this.tbody) {\r\n\t\t\tif (!hasTbodyStyles(this.getItemsContainerElement())) {\r\n\t\t\t\taddTbodyStyles(this.getItemsContainerElement())\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If there was a pending state update that didn't get applied\r\n\t\t// because of stopping the `VirtualScroller`, apply that state update now.\r\n\t\t//\r\n\t\t// The pending state update won't get applied if the scrollable container width\r\n\t\t// has changed but that's ok because that state update currently could only contain:\r\n\t\t// * `scrollableContainerWidth`\r\n\t\t// * `verticalSpacing`\r\n\t\t// * `beforeResize`\r\n\t\t// All of those get rewritten in `onResize()` anyway.\r\n\t\t//\r\n\t\tlet stateUpdate = this._stoppedStateUpdate\r\n\t\tthis._stoppedStateUpdate = undefined\r\n\r\n\t\t// Reset `this.verticalSpacing` so that it re-measures it in cases when\r\n\t\t// the `VirtualScroller` was previously stopped and is now being restarted.\r\n\t\t// The rationale is that a previously captured inter-item vertical spacing\r\n\t\t// can't be \"trusted\" in a sense that the user might have resized the window\r\n\t\t// after the previous `state` has been snapshotted.\r\n\t\t// If the user has resized the window, then changing window width might have\r\n\t\t// activated different CSS `@media()` \"queries\" resulting in a potentially different\r\n\t\t// vertical spacing after the restart.\r\n\t\t// If it's not a restart then `this.verticalSpacing` is `undefined` anyway.\r\n\t\tthis.verticalSpacing = undefined\r\n\r\n\t\tconst verticalSpacingStateUpdate = this.measureItemHeightsAndSpacing()\r\n\t\tif (verticalSpacingStateUpdate) {\r\n\t\t\tstateUpdate = {\r\n\t\t\t\t...stateUpdate,\r\n\t\t\t\t...verticalSpacingStateUpdate\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.resize.start()\r\n\t\tthis.scroll.start()\r\n\r\n\t\t// If `scrollableContainerWidth` hasn't been measured yet,\r\n\t\t// measure it and write it to state.\r\n\t\tif (this.getState().scrollableContainerWidth === undefined) {\r\n\t\t\tconst scrollableContainerWidth = this.scrollableContainer.getWidth()\r\n\t\t\tstateUpdate = {\r\n\t\t\t\t...stateUpdate,\r\n\t\t\t\tscrollableContainerWidth\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Reset layout:\r\n\t\t\t// * If the scrollable container width has changed while stopped.\r\n\t\t\t// * If the restored state was calculated for another scrollable container width.\r\n\t\t\tconst newWidth = this.scrollableContainer.getWidth()\r\n\t\t\tconst prevWidth = this.getState().scrollableContainerWidth\r\n\t\t\tif (newWidth !== prevWidth) {\r\n\t\t\t\tlog('~ Scrollable container width changed from', prevWidth, 'to', newWidth, '~')\r\n\t\t\t\t// `stateUpdate` doesn't get passed to `this.onResize()`, and, therefore,\r\n\t\t\t\t// won't be applied. But that's ok because currently it could only contain:\r\n\t\t\t\t// * `scrollableContainerWidth`\r\n\t\t\t\t// * `verticalSpacing`\r\n\t\t\t\t// * `beforeResize`\r\n\t\t\t\t// All of those get rewritten in `onResize()` anyway.\r\n\t\t\t\treturn this.onResize()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If the `VirtualScroller` uses custom (external) state storage, then\r\n\t\t// check if the columns count has changed between calling `.getInitialState()`\r\n\t\t// and `.start()`. If it has, perform a re-layout \"from scratch\".\r\n\t\tif (this._usesCustomStateStorage) {\r\n\t\t\tconst columnsCount = this.getActualColumnsCount()\r\n\t\t\tconst columnsCountFromState = this.getState().columnsCount || 1\r\n\t\t\tif (columnsCount !== columnsCountFromState) {\r\n\t\t\t\treturn this.onResize()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Re-calculate layout and re-render the list.\r\n\t\t// Do that even if when an initial `state` parameter, containing layout values,\r\n\t\t// has been passed. The reason is that the `state` parameter can't be \"trusted\"\r\n\t\t// in a way that it could have been snapshotted for another window width and\r\n\t\t// the user might have resized their window since then.\r\n\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.STARTED, stateUpdate })\r\n\t}\r\n\r\n\t// Could be passed as a \"callback\" parameter, so bind it to `this`.\r\n\tstop = () => {\r\n\t\tif (!this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] Can\\'t stop a `VirtualScroller` that hasn\\'t been started')\r\n\t\t}\r\n\r\n\t\tthis._isActive = false\r\n\r\n\t\tlog('~ Stop ~')\r\n\r\n\t\tthis.resize.stop()\r\n\t\tthis.scroll.stop()\r\n\r\n\t\t// Stop `ListTopOffsetWatcher` if it has been started.\r\n\t\t// There seems to be no need to restart `ListTopOffsetWatcher`.\r\n\t\t// It's mainly a hacky workaround for development mode anyway.\r\n\t\tif (this.listTopOffsetWatcher && this.listTopOffsetWatcher.isStarted()) {\r\n\t\t\tthis.listTopOffsetWatcher.stop()\r\n\t\t}\r\n\r\n\t\t// Cancel any scheduled layout.\r\n\t\tthis.cancelLayoutTimer({})\r\n\t}\r\n\r\n\thasToBeStarted() {\r\n\t\tif (!this._isActive) {\r\n\t\t\tthrow new Error('[virtual-scroller] `VirtualScroller` hasn\\'t been started')\r\n\t\t}\r\n\t}\r\n\r\n\t// Bind it to `this` because this function could hypothetically be passed\r\n\t// as a \"callback\" parameter.\r\n\tupdateLayout = () => {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis.onUpdateShownItemIndexes({ reason: LAYOUT_REASON.MANUAL })\r\n\t}\r\n\r\n\t// Bind the function to `this` so that it could be passed as a callback\r\n\t// in a random application's code.\r\n\tonRender = () => {\r\n\t\tthis._onRender(this.getState(), this.previousState)\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the items's top offset relative to the scrollable container's top edge.\r\n\t * @param {number} i — Item index\r\n\t * @return {[number]} Returns the item's scroll Y position. Returns `undefined` if any of the previous items haven't been rendered yet.\r\n\t */\r\n\tgetItemScrollPosition(i) {\r\n\t\tconst itemTopOffsetInList = this.layout.getItemTopOffset(i)\r\n\t\tif (itemTopOffsetInList === undefined) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\treturn this.getListTopOffsetInsideScrollableContainer() + itemTopOffsetInList\r\n\t}\r\n\r\n\t/**\r\n\t * Forces a re-measure of an item's height.\r\n\t * @param {number} i — Item index\r\n\t */\r\n\tonItemHeightChange(i) {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis._onItemHeightChange(i)\r\n\t}\r\n\r\n\t/**\r\n\t * Updates an item's state in `state.itemStates[]`.\r\n\t * @param {number} i — Item index\r\n\t * @param {any} i — Item's new state\r\n\t */\r\n\tonItemStateChange(i, newItemState) {\r\n\t\tthis.hasToBeStarted()\r\n\t\tthis._onItemStateChange(i, newItemState)\r\n\t}\r\n\r\n\t/**\r\n\t * Updates `items`. For example, can prepend or append new items to the list.\r\n\t * @param {any[]} newItems\r\n\t * @param {boolean} [options.preserveScrollPositionOnPrependItems] — Set to `true` to enable \"restore scroll position after prepending items\" feature (could be useful when implementing \"Show previous items\" button).\r\n\t */\r\n\tsetItems(newItems, options = {}) {\r\n\t\tthis.hasToBeStarted()\r\n\t\treturn this._setItems(newItems, options)\r\n\t}\r\n}"],"mappings":"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"}