lazy-render-virtual-scroll 1.0.7 → 1.0.9

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 (483) hide show
  1. package/README.md +10 -0
  2. package/dist/angular/index.d.ts +57 -0
  3. package/dist/cjs/adapters/angular/lazy-scroll.component.d.ts +28 -0
  4. package/dist/cjs/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
  5. package/dist/cjs/adapters/angular/lazy-scroll.directive.d.ts +21 -0
  6. package/dist/cjs/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
  7. package/dist/cjs/adapters/index.d.ts +7 -0
  8. package/dist/cjs/adapters/index.d.ts.map +1 -0
  9. package/dist/cjs/adapters/svelte/lazyScrollAction.d.ts +13 -0
  10. package/dist/cjs/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
  11. package/dist/cjs/adapters/vue/useLazyScroll.d.ts +13 -0
  12. package/dist/cjs/adapters/vue/useLazyScroll.d.ts.map +1 -0
  13. package/dist/cjs/angular/adapters/angular/lazy-scroll.component.d.ts +28 -0
  14. package/dist/cjs/angular/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
  15. package/dist/cjs/angular/adapters/angular/lazy-scroll.directive.d.ts +21 -0
  16. package/dist/cjs/angular/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
  17. package/dist/cjs/angular/adapters/index.d.ts +7 -0
  18. package/dist/cjs/angular/adapters/index.d.ts.map +1 -0
  19. package/dist/cjs/angular/adapters/react/LazyList.d.ts +12 -0
  20. package/dist/cjs/angular/adapters/react/LazyList.d.ts.map +1 -0
  21. package/dist/cjs/angular/adapters/react/useLazyList.d.ts +22 -0
  22. package/dist/cjs/angular/adapters/react/useLazyList.d.ts.map +1 -0
  23. package/dist/cjs/angular/adapters/svelte/lazyScrollAction.d.ts +13 -0
  24. package/dist/cjs/angular/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
  25. package/dist/cjs/angular/adapters/vue/useLazyScroll.d.ts +13 -0
  26. package/dist/cjs/angular/adapters/vue/useLazyScroll.d.ts.map +1 -0
  27. package/dist/cjs/angular/core/AdaptiveBufferCalculator.d.ts +46 -0
  28. package/dist/cjs/angular/core/AdaptiveBufferCalculator.d.ts.map +1 -0
  29. package/dist/cjs/angular/core/ContentComplexityAnalyzer.d.ts +13 -0
  30. package/dist/cjs/angular/core/ContentComplexityAnalyzer.d.ts.map +1 -0
  31. package/dist/cjs/angular/core/DevicePerformanceMonitor.d.ts +22 -0
  32. package/dist/cjs/angular/core/DevicePerformanceMonitor.d.ts.map +1 -0
  33. package/dist/cjs/angular/core/Engine.d.ts +56 -0
  34. package/dist/cjs/angular/core/Engine.d.ts.map +1 -0
  35. package/dist/cjs/angular/core/GPUAccelerator.d.ts +23 -0
  36. package/dist/cjs/angular/core/GPUAccelerator.d.ts.map +1 -0
  37. package/dist/cjs/angular/core/IntelligentScrollDetector.d.ts +19 -0
  38. package/dist/cjs/angular/core/IntelligentScrollDetector.d.ts.map +1 -0
  39. package/dist/cjs/angular/core/MemoryManager.d.ts +33 -0
  40. package/dist/cjs/angular/core/MemoryManager.d.ts.map +1 -0
  41. package/dist/cjs/angular/core/NetworkAwarePrefetchManager.d.ts +10 -0
  42. package/dist/cjs/angular/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
  43. package/dist/cjs/angular/core/NetworkAwareRequestQueue.d.ts +20 -0
  44. package/dist/cjs/angular/core/NetworkAwareRequestQueue.d.ts.map +1 -0
  45. package/dist/cjs/angular/core/NetworkSpeedDetector.d.ts +16 -0
  46. package/dist/cjs/angular/core/NetworkSpeedDetector.d.ts.map +1 -0
  47. package/dist/cjs/angular/core/PerformanceOptimizer.d.ts +39 -0
  48. package/dist/cjs/angular/core/PerformanceOptimizer.d.ts.map +1 -0
  49. package/dist/cjs/angular/core/PrefetchManager.d.ts +16 -0
  50. package/dist/cjs/angular/core/PrefetchManager.d.ts.map +1 -0
  51. package/dist/cjs/angular/core/RequestQueue.d.ts +23 -0
  52. package/dist/cjs/angular/core/RequestQueue.d.ts.map +1 -0
  53. package/dist/cjs/angular/core/WindowManager.d.ts +24 -0
  54. package/dist/cjs/angular/core/WindowManager.d.ts.map +1 -0
  55. package/dist/cjs/angular/core/types.d.ts +28 -0
  56. package/dist/cjs/angular/core/types.d.ts.map +1 -0
  57. package/dist/cjs/angular/index.d.ts +23 -0
  58. package/dist/cjs/angular/index.d.ts.map +1 -0
  59. package/dist/cjs/angular/index.js +1717 -0
  60. package/dist/cjs/angular/index.js.map +1 -0
  61. package/dist/cjs/angular/platform/browser/ScrollObserver.d.ts +25 -0
  62. package/dist/cjs/angular/platform/browser/ScrollObserver.d.ts.map +1 -0
  63. package/dist/cjs/angular/utils/debounce.d.ts +5 -0
  64. package/dist/cjs/angular/utils/debounce.d.ts.map +1 -0
  65. package/dist/cjs/angular/utils/throttle.d.ts +5 -0
  66. package/dist/cjs/angular/utils/throttle.d.ts.map +1 -0
  67. package/dist/cjs/core/Engine.d.ts +3 -0
  68. package/dist/cjs/core/Engine.d.ts.map +1 -1
  69. package/dist/cjs/core/GPUAccelerator.d.ts +23 -0
  70. package/dist/cjs/core/GPUAccelerator.d.ts.map +1 -0
  71. package/dist/cjs/core/MemoryManager.d.ts +33 -0
  72. package/dist/cjs/core/MemoryManager.d.ts.map +1 -0
  73. package/dist/cjs/core/PerformanceOptimizer.d.ts +39 -0
  74. package/dist/cjs/core/PerformanceOptimizer.d.ts.map +1 -0
  75. package/dist/cjs/index.d.ts +5 -0
  76. package/dist/cjs/index.d.ts.map +1 -1
  77. package/dist/cjs/index.js +811 -19
  78. package/dist/cjs/index.js.map +1 -1
  79. package/dist/cjs/svelte/adapters/angular/lazy-scroll.component.d.ts +28 -0
  80. package/dist/cjs/svelte/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
  81. package/dist/cjs/svelte/adapters/angular/lazy-scroll.directive.d.ts +21 -0
  82. package/dist/cjs/svelte/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
  83. package/dist/cjs/svelte/adapters/index.d.ts +7 -0
  84. package/dist/cjs/svelte/adapters/index.d.ts.map +1 -0
  85. package/dist/cjs/svelte/adapters/react/LazyList.d.ts +12 -0
  86. package/dist/cjs/svelte/adapters/react/LazyList.d.ts.map +1 -0
  87. package/dist/cjs/svelte/adapters/react/useLazyList.d.ts +22 -0
  88. package/dist/cjs/svelte/adapters/react/useLazyList.d.ts.map +1 -0
  89. package/dist/cjs/svelte/adapters/svelte/lazyScrollAction.d.ts +13 -0
  90. package/dist/cjs/svelte/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
  91. package/dist/cjs/svelte/adapters/vue/useLazyScroll.d.ts +13 -0
  92. package/dist/cjs/svelte/adapters/vue/useLazyScroll.d.ts.map +1 -0
  93. package/dist/cjs/svelte/core/AdaptiveBufferCalculator.d.ts +46 -0
  94. package/dist/cjs/svelte/core/AdaptiveBufferCalculator.d.ts.map +1 -0
  95. package/dist/cjs/svelte/core/ContentComplexityAnalyzer.d.ts +13 -0
  96. package/dist/cjs/svelte/core/ContentComplexityAnalyzer.d.ts.map +1 -0
  97. package/dist/cjs/svelte/core/DevicePerformanceMonitor.d.ts +22 -0
  98. package/dist/cjs/svelte/core/DevicePerformanceMonitor.d.ts.map +1 -0
  99. package/dist/cjs/svelte/core/Engine.d.ts +56 -0
  100. package/dist/cjs/svelte/core/Engine.d.ts.map +1 -0
  101. package/dist/cjs/svelte/core/GPUAccelerator.d.ts +23 -0
  102. package/dist/cjs/svelte/core/GPUAccelerator.d.ts.map +1 -0
  103. package/dist/cjs/svelte/core/IntelligentScrollDetector.d.ts +19 -0
  104. package/dist/cjs/svelte/core/IntelligentScrollDetector.d.ts.map +1 -0
  105. package/dist/cjs/svelte/core/MemoryManager.d.ts +33 -0
  106. package/dist/cjs/svelte/core/MemoryManager.d.ts.map +1 -0
  107. package/dist/cjs/svelte/core/NetworkAwarePrefetchManager.d.ts +10 -0
  108. package/dist/cjs/svelte/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
  109. package/dist/cjs/svelte/core/NetworkAwareRequestQueue.d.ts +20 -0
  110. package/dist/cjs/svelte/core/NetworkAwareRequestQueue.d.ts.map +1 -0
  111. package/dist/cjs/svelte/core/NetworkSpeedDetector.d.ts +16 -0
  112. package/dist/cjs/svelte/core/NetworkSpeedDetector.d.ts.map +1 -0
  113. package/dist/cjs/svelte/core/PerformanceOptimizer.d.ts +39 -0
  114. package/dist/cjs/svelte/core/PerformanceOptimizer.d.ts.map +1 -0
  115. package/dist/cjs/svelte/core/PrefetchManager.d.ts +16 -0
  116. package/dist/cjs/svelte/core/PrefetchManager.d.ts.map +1 -0
  117. package/dist/cjs/svelte/core/RequestQueue.d.ts +23 -0
  118. package/dist/cjs/svelte/core/RequestQueue.d.ts.map +1 -0
  119. package/dist/cjs/svelte/core/WindowManager.d.ts +24 -0
  120. package/dist/cjs/svelte/core/WindowManager.d.ts.map +1 -0
  121. package/dist/cjs/svelte/core/types.d.ts +28 -0
  122. package/dist/cjs/svelte/core/types.d.ts.map +1 -0
  123. package/dist/cjs/svelte/index.d.ts +23 -0
  124. package/dist/cjs/svelte/index.d.ts.map +1 -0
  125. package/dist/cjs/svelte/index.js +1423 -0
  126. package/dist/cjs/svelte/index.js.map +1 -0
  127. package/dist/cjs/svelte/platform/browser/ScrollObserver.d.ts +25 -0
  128. package/dist/cjs/svelte/platform/browser/ScrollObserver.d.ts.map +1 -0
  129. package/dist/cjs/svelte/utils/debounce.d.ts +5 -0
  130. package/dist/cjs/svelte/utils/debounce.d.ts.map +1 -0
  131. package/dist/cjs/svelte/utils/throttle.d.ts +5 -0
  132. package/dist/cjs/svelte/utils/throttle.d.ts.map +1 -0
  133. package/dist/cjs/vanilla/adapters/angular/lazy-scroll.component.d.ts +28 -0
  134. package/dist/cjs/vanilla/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
  135. package/dist/cjs/vanilla/adapters/angular/lazy-scroll.directive.d.ts +21 -0
  136. package/dist/cjs/vanilla/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
  137. package/dist/cjs/vanilla/adapters/index.d.ts +7 -0
  138. package/dist/cjs/vanilla/adapters/index.d.ts.map +1 -0
  139. package/dist/cjs/vanilla/adapters/react/LazyList.d.ts +12 -0
  140. package/dist/cjs/vanilla/adapters/react/LazyList.d.ts.map +1 -0
  141. package/dist/cjs/vanilla/adapters/react/useLazyList.d.ts +22 -0
  142. package/dist/cjs/vanilla/adapters/react/useLazyList.d.ts.map +1 -0
  143. package/dist/cjs/vanilla/adapters/svelte/lazyScrollAction.d.ts +13 -0
  144. package/dist/cjs/vanilla/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
  145. package/dist/cjs/vanilla/adapters/vue/useLazyScroll.d.ts +13 -0
  146. package/dist/cjs/vanilla/adapters/vue/useLazyScroll.d.ts.map +1 -0
  147. package/dist/cjs/vanilla/core/AdaptiveBufferCalculator.d.ts +46 -0
  148. package/dist/cjs/vanilla/core/AdaptiveBufferCalculator.d.ts.map +1 -0
  149. package/dist/cjs/vanilla/core/ContentComplexityAnalyzer.d.ts +13 -0
  150. package/dist/cjs/vanilla/core/ContentComplexityAnalyzer.d.ts.map +1 -0
  151. package/dist/cjs/vanilla/core/DevicePerformanceMonitor.d.ts +22 -0
  152. package/dist/cjs/vanilla/core/DevicePerformanceMonitor.d.ts.map +1 -0
  153. package/dist/cjs/vanilla/core/Engine.d.ts +56 -0
  154. package/dist/cjs/vanilla/core/Engine.d.ts.map +1 -0
  155. package/dist/cjs/vanilla/core/GPUAccelerator.d.ts +23 -0
  156. package/dist/cjs/vanilla/core/GPUAccelerator.d.ts.map +1 -0
  157. package/dist/cjs/vanilla/core/IntelligentScrollDetector.d.ts +19 -0
  158. package/dist/cjs/vanilla/core/IntelligentScrollDetector.d.ts.map +1 -0
  159. package/dist/cjs/vanilla/core/MemoryManager.d.ts +33 -0
  160. package/dist/cjs/vanilla/core/MemoryManager.d.ts.map +1 -0
  161. package/dist/cjs/vanilla/core/NetworkAwarePrefetchManager.d.ts +10 -0
  162. package/dist/cjs/vanilla/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
  163. package/dist/cjs/vanilla/core/NetworkAwareRequestQueue.d.ts +20 -0
  164. package/dist/cjs/vanilla/core/NetworkAwareRequestQueue.d.ts.map +1 -0
  165. package/dist/cjs/vanilla/core/NetworkSpeedDetector.d.ts +16 -0
  166. package/dist/cjs/vanilla/core/NetworkSpeedDetector.d.ts.map +1 -0
  167. package/dist/cjs/vanilla/core/PerformanceOptimizer.d.ts +39 -0
  168. package/dist/cjs/vanilla/core/PerformanceOptimizer.d.ts.map +1 -0
  169. package/dist/cjs/vanilla/core/PrefetchManager.d.ts +16 -0
  170. package/dist/cjs/vanilla/core/PrefetchManager.d.ts.map +1 -0
  171. package/dist/cjs/vanilla/core/RequestQueue.d.ts +23 -0
  172. package/dist/cjs/vanilla/core/RequestQueue.d.ts.map +1 -0
  173. package/dist/cjs/vanilla/core/WindowManager.d.ts +24 -0
  174. package/dist/cjs/vanilla/core/WindowManager.d.ts.map +1 -0
  175. package/dist/cjs/vanilla/core/types.d.ts +28 -0
  176. package/dist/cjs/vanilla/core/types.d.ts.map +1 -0
  177. package/dist/cjs/vanilla/index.d.ts +23 -0
  178. package/dist/cjs/vanilla/index.d.ts.map +1 -0
  179. package/dist/cjs/vanilla/index.js +1670 -0
  180. package/dist/cjs/vanilla/index.js.map +1 -0
  181. package/dist/cjs/vanilla/platform/browser/ScrollObserver.d.ts +25 -0
  182. package/dist/cjs/vanilla/platform/browser/ScrollObserver.d.ts.map +1 -0
  183. package/dist/cjs/vanilla/utils/debounce.d.ts +5 -0
  184. package/dist/cjs/vanilla/utils/debounce.d.ts.map +1 -0
  185. package/dist/cjs/vanilla/utils/throttle.d.ts +5 -0
  186. package/dist/cjs/vanilla/utils/throttle.d.ts.map +1 -0
  187. package/dist/cjs/vue/adapters/angular/lazy-scroll.component.d.ts +28 -0
  188. package/dist/cjs/vue/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
  189. package/dist/cjs/vue/adapters/angular/lazy-scroll.directive.d.ts +21 -0
  190. package/dist/cjs/vue/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
  191. package/dist/cjs/vue/adapters/index.d.ts +7 -0
  192. package/dist/cjs/vue/adapters/index.d.ts.map +1 -0
  193. package/dist/cjs/vue/adapters/react/LazyList.d.ts +12 -0
  194. package/dist/cjs/vue/adapters/react/LazyList.d.ts.map +1 -0
  195. package/dist/cjs/vue/adapters/react/useLazyList.d.ts +22 -0
  196. package/dist/cjs/vue/adapters/react/useLazyList.d.ts.map +1 -0
  197. package/dist/cjs/vue/adapters/svelte/lazyScrollAction.d.ts +13 -0
  198. package/dist/cjs/vue/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
  199. package/dist/cjs/vue/adapters/vue/useLazyScroll.d.ts +13 -0
  200. package/dist/cjs/vue/adapters/vue/useLazyScroll.d.ts.map +1 -0
  201. package/dist/cjs/vue/core/AdaptiveBufferCalculator.d.ts +46 -0
  202. package/dist/cjs/vue/core/AdaptiveBufferCalculator.d.ts.map +1 -0
  203. package/dist/cjs/vue/core/ContentComplexityAnalyzer.d.ts +13 -0
  204. package/dist/cjs/vue/core/ContentComplexityAnalyzer.d.ts.map +1 -0
  205. package/dist/cjs/vue/core/DevicePerformanceMonitor.d.ts +22 -0
  206. package/dist/cjs/vue/core/DevicePerformanceMonitor.d.ts.map +1 -0
  207. package/dist/cjs/vue/core/Engine.d.ts +56 -0
  208. package/dist/cjs/vue/core/Engine.d.ts.map +1 -0
  209. package/dist/cjs/vue/core/GPUAccelerator.d.ts +23 -0
  210. package/dist/cjs/vue/core/GPUAccelerator.d.ts.map +1 -0
  211. package/dist/cjs/vue/core/IntelligentScrollDetector.d.ts +19 -0
  212. package/dist/cjs/vue/core/IntelligentScrollDetector.d.ts.map +1 -0
  213. package/dist/cjs/vue/core/MemoryManager.d.ts +33 -0
  214. package/dist/cjs/vue/core/MemoryManager.d.ts.map +1 -0
  215. package/dist/cjs/vue/core/NetworkAwarePrefetchManager.d.ts +10 -0
  216. package/dist/cjs/vue/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
  217. package/dist/cjs/vue/core/NetworkAwareRequestQueue.d.ts +20 -0
  218. package/dist/cjs/vue/core/NetworkAwareRequestQueue.d.ts.map +1 -0
  219. package/dist/cjs/vue/core/NetworkSpeedDetector.d.ts +16 -0
  220. package/dist/cjs/vue/core/NetworkSpeedDetector.d.ts.map +1 -0
  221. package/dist/cjs/vue/core/PerformanceOptimizer.d.ts +39 -0
  222. package/dist/cjs/vue/core/PerformanceOptimizer.d.ts.map +1 -0
  223. package/dist/cjs/vue/core/PrefetchManager.d.ts +16 -0
  224. package/dist/cjs/vue/core/PrefetchManager.d.ts.map +1 -0
  225. package/dist/cjs/vue/core/RequestQueue.d.ts +23 -0
  226. package/dist/cjs/vue/core/RequestQueue.d.ts.map +1 -0
  227. package/dist/cjs/vue/core/WindowManager.d.ts +24 -0
  228. package/dist/cjs/vue/core/WindowManager.d.ts.map +1 -0
  229. package/dist/cjs/vue/core/types.d.ts +28 -0
  230. package/dist/cjs/vue/core/types.d.ts.map +1 -0
  231. package/dist/cjs/vue/index.d.ts +23 -0
  232. package/dist/cjs/vue/index.d.ts.map +1 -0
  233. package/dist/cjs/vue/index.js +1443 -0
  234. package/dist/cjs/vue/index.js.map +1 -0
  235. package/dist/cjs/vue/platform/browser/ScrollObserver.d.ts +25 -0
  236. package/dist/cjs/vue/platform/browser/ScrollObserver.d.ts.map +1 -0
  237. package/dist/cjs/vue/utils/debounce.d.ts +5 -0
  238. package/dist/cjs/vue/utils/debounce.d.ts.map +1 -0
  239. package/dist/cjs/vue/utils/throttle.d.ts +5 -0
  240. package/dist/cjs/vue/utils/throttle.d.ts.map +1 -0
  241. package/dist/esm/adapters/angular/lazy-scroll.component.d.ts +28 -0
  242. package/dist/esm/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
  243. package/dist/esm/adapters/angular/lazy-scroll.directive.d.ts +21 -0
  244. package/dist/esm/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
  245. package/dist/esm/adapters/index.d.ts +7 -0
  246. package/dist/esm/adapters/index.d.ts.map +1 -0
  247. package/dist/esm/adapters/svelte/lazyScrollAction.d.ts +13 -0
  248. package/dist/esm/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
  249. package/dist/esm/adapters/vue/useLazyScroll.d.ts +13 -0
  250. package/dist/esm/adapters/vue/useLazyScroll.d.ts.map +1 -0
  251. package/dist/esm/angular/adapters/angular/lazy-scroll.component.d.ts +28 -0
  252. package/dist/esm/angular/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
  253. package/dist/esm/angular/adapters/angular/lazy-scroll.directive.d.ts +21 -0
  254. package/dist/esm/angular/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
  255. package/dist/esm/angular/adapters/index.d.ts +7 -0
  256. package/dist/esm/angular/adapters/index.d.ts.map +1 -0
  257. package/dist/esm/angular/adapters/react/LazyList.d.ts +12 -0
  258. package/dist/esm/angular/adapters/react/LazyList.d.ts.map +1 -0
  259. package/dist/esm/angular/adapters/react/useLazyList.d.ts +22 -0
  260. package/dist/esm/angular/adapters/react/useLazyList.d.ts.map +1 -0
  261. package/dist/esm/angular/adapters/svelte/lazyScrollAction.d.ts +13 -0
  262. package/dist/esm/angular/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
  263. package/dist/esm/angular/adapters/vue/useLazyScroll.d.ts +13 -0
  264. package/dist/esm/angular/adapters/vue/useLazyScroll.d.ts.map +1 -0
  265. package/dist/esm/angular/core/AdaptiveBufferCalculator.d.ts +46 -0
  266. package/dist/esm/angular/core/AdaptiveBufferCalculator.d.ts.map +1 -0
  267. package/dist/esm/angular/core/ContentComplexityAnalyzer.d.ts +13 -0
  268. package/dist/esm/angular/core/ContentComplexityAnalyzer.d.ts.map +1 -0
  269. package/dist/esm/angular/core/DevicePerformanceMonitor.d.ts +22 -0
  270. package/dist/esm/angular/core/DevicePerformanceMonitor.d.ts.map +1 -0
  271. package/dist/esm/angular/core/Engine.d.ts +56 -0
  272. package/dist/esm/angular/core/Engine.d.ts.map +1 -0
  273. package/dist/esm/angular/core/GPUAccelerator.d.ts +23 -0
  274. package/dist/esm/angular/core/GPUAccelerator.d.ts.map +1 -0
  275. package/dist/esm/angular/core/IntelligentScrollDetector.d.ts +19 -0
  276. package/dist/esm/angular/core/IntelligentScrollDetector.d.ts.map +1 -0
  277. package/dist/esm/angular/core/MemoryManager.d.ts +33 -0
  278. package/dist/esm/angular/core/MemoryManager.d.ts.map +1 -0
  279. package/dist/esm/angular/core/NetworkAwarePrefetchManager.d.ts +10 -0
  280. package/dist/esm/angular/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
  281. package/dist/esm/angular/core/NetworkAwareRequestQueue.d.ts +20 -0
  282. package/dist/esm/angular/core/NetworkAwareRequestQueue.d.ts.map +1 -0
  283. package/dist/esm/angular/core/NetworkSpeedDetector.d.ts +16 -0
  284. package/dist/esm/angular/core/NetworkSpeedDetector.d.ts.map +1 -0
  285. package/dist/esm/angular/core/PerformanceOptimizer.d.ts +39 -0
  286. package/dist/esm/angular/core/PerformanceOptimizer.d.ts.map +1 -0
  287. package/dist/esm/angular/core/PrefetchManager.d.ts +16 -0
  288. package/dist/esm/angular/core/PrefetchManager.d.ts.map +1 -0
  289. package/dist/esm/angular/core/RequestQueue.d.ts +23 -0
  290. package/dist/esm/angular/core/RequestQueue.d.ts.map +1 -0
  291. package/dist/esm/angular/core/WindowManager.d.ts +24 -0
  292. package/dist/esm/angular/core/WindowManager.d.ts.map +1 -0
  293. package/dist/esm/angular/core/types.d.ts +28 -0
  294. package/dist/esm/angular/core/types.d.ts.map +1 -0
  295. package/dist/esm/angular/index.d.ts +23 -0
  296. package/dist/esm/angular/index.d.ts.map +1 -0
  297. package/dist/esm/angular/index.js +1714 -0
  298. package/dist/esm/angular/index.js.map +1 -0
  299. package/dist/esm/angular/platform/browser/ScrollObserver.d.ts +25 -0
  300. package/dist/esm/angular/platform/browser/ScrollObserver.d.ts.map +1 -0
  301. package/dist/esm/angular/utils/debounce.d.ts +5 -0
  302. package/dist/esm/angular/utils/debounce.d.ts.map +1 -0
  303. package/dist/esm/angular/utils/throttle.d.ts +5 -0
  304. package/dist/esm/angular/utils/throttle.d.ts.map +1 -0
  305. package/dist/esm/core/Engine.d.ts +3 -0
  306. package/dist/esm/core/Engine.d.ts.map +1 -1
  307. package/dist/esm/core/GPUAccelerator.d.ts +23 -0
  308. package/dist/esm/core/GPUAccelerator.d.ts.map +1 -0
  309. package/dist/esm/core/MemoryManager.d.ts +33 -0
  310. package/dist/esm/core/MemoryManager.d.ts.map +1 -0
  311. package/dist/esm/core/PerformanceOptimizer.d.ts +39 -0
  312. package/dist/esm/core/PerformanceOptimizer.d.ts.map +1 -0
  313. package/dist/esm/index.d.ts +5 -0
  314. package/dist/esm/index.d.ts.map +1 -1
  315. package/dist/esm/index.js +806 -20
  316. package/dist/esm/index.js.map +1 -1
  317. package/dist/esm/svelte/adapters/angular/lazy-scroll.component.d.ts +28 -0
  318. package/dist/esm/svelte/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
  319. package/dist/esm/svelte/adapters/angular/lazy-scroll.directive.d.ts +21 -0
  320. package/dist/esm/svelte/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
  321. package/dist/esm/svelte/adapters/index.d.ts +7 -0
  322. package/dist/esm/svelte/adapters/index.d.ts.map +1 -0
  323. package/dist/esm/svelte/adapters/react/LazyList.d.ts +12 -0
  324. package/dist/esm/svelte/adapters/react/LazyList.d.ts.map +1 -0
  325. package/dist/esm/svelte/adapters/react/useLazyList.d.ts +22 -0
  326. package/dist/esm/svelte/adapters/react/useLazyList.d.ts.map +1 -0
  327. package/dist/esm/svelte/adapters/svelte/lazyScrollAction.d.ts +13 -0
  328. package/dist/esm/svelte/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
  329. package/dist/esm/svelte/adapters/vue/useLazyScroll.d.ts +13 -0
  330. package/dist/esm/svelte/adapters/vue/useLazyScroll.d.ts.map +1 -0
  331. package/dist/esm/svelte/core/AdaptiveBufferCalculator.d.ts +46 -0
  332. package/dist/esm/svelte/core/AdaptiveBufferCalculator.d.ts.map +1 -0
  333. package/dist/esm/svelte/core/ContentComplexityAnalyzer.d.ts +13 -0
  334. package/dist/esm/svelte/core/ContentComplexityAnalyzer.d.ts.map +1 -0
  335. package/dist/esm/svelte/core/DevicePerformanceMonitor.d.ts +22 -0
  336. package/dist/esm/svelte/core/DevicePerformanceMonitor.d.ts.map +1 -0
  337. package/dist/esm/svelte/core/Engine.d.ts +56 -0
  338. package/dist/esm/svelte/core/Engine.d.ts.map +1 -0
  339. package/dist/esm/svelte/core/GPUAccelerator.d.ts +23 -0
  340. package/dist/esm/svelte/core/GPUAccelerator.d.ts.map +1 -0
  341. package/dist/esm/svelte/core/IntelligentScrollDetector.d.ts +19 -0
  342. package/dist/esm/svelte/core/IntelligentScrollDetector.d.ts.map +1 -0
  343. package/dist/esm/svelte/core/MemoryManager.d.ts +33 -0
  344. package/dist/esm/svelte/core/MemoryManager.d.ts.map +1 -0
  345. package/dist/esm/svelte/core/NetworkAwarePrefetchManager.d.ts +10 -0
  346. package/dist/esm/svelte/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
  347. package/dist/esm/svelte/core/NetworkAwareRequestQueue.d.ts +20 -0
  348. package/dist/esm/svelte/core/NetworkAwareRequestQueue.d.ts.map +1 -0
  349. package/dist/esm/svelte/core/NetworkSpeedDetector.d.ts +16 -0
  350. package/dist/esm/svelte/core/NetworkSpeedDetector.d.ts.map +1 -0
  351. package/dist/esm/svelte/core/PerformanceOptimizer.d.ts +39 -0
  352. package/dist/esm/svelte/core/PerformanceOptimizer.d.ts.map +1 -0
  353. package/dist/esm/svelte/core/PrefetchManager.d.ts +16 -0
  354. package/dist/esm/svelte/core/PrefetchManager.d.ts.map +1 -0
  355. package/dist/esm/svelte/core/RequestQueue.d.ts +23 -0
  356. package/dist/esm/svelte/core/RequestQueue.d.ts.map +1 -0
  357. package/dist/esm/svelte/core/WindowManager.d.ts +24 -0
  358. package/dist/esm/svelte/core/WindowManager.d.ts.map +1 -0
  359. package/dist/esm/svelte/core/types.d.ts +28 -0
  360. package/dist/esm/svelte/core/types.d.ts.map +1 -0
  361. package/dist/esm/svelte/index.d.ts +23 -0
  362. package/dist/esm/svelte/index.d.ts.map +1 -0
  363. package/dist/esm/svelte/index.js +1421 -0
  364. package/dist/esm/svelte/index.js.map +1 -0
  365. package/dist/esm/svelte/platform/browser/ScrollObserver.d.ts +25 -0
  366. package/dist/esm/svelte/platform/browser/ScrollObserver.d.ts.map +1 -0
  367. package/dist/esm/svelte/utils/debounce.d.ts +5 -0
  368. package/dist/esm/svelte/utils/debounce.d.ts.map +1 -0
  369. package/dist/esm/svelte/utils/throttle.d.ts +5 -0
  370. package/dist/esm/svelte/utils/throttle.d.ts.map +1 -0
  371. package/dist/esm/vanilla/adapters/angular/lazy-scroll.component.d.ts +28 -0
  372. package/dist/esm/vanilla/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
  373. package/dist/esm/vanilla/adapters/angular/lazy-scroll.directive.d.ts +21 -0
  374. package/dist/esm/vanilla/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
  375. package/dist/esm/vanilla/adapters/index.d.ts +7 -0
  376. package/dist/esm/vanilla/adapters/index.d.ts.map +1 -0
  377. package/dist/esm/vanilla/adapters/react/LazyList.d.ts +12 -0
  378. package/dist/esm/vanilla/adapters/react/LazyList.d.ts.map +1 -0
  379. package/dist/esm/vanilla/adapters/react/useLazyList.d.ts +22 -0
  380. package/dist/esm/vanilla/adapters/react/useLazyList.d.ts.map +1 -0
  381. package/dist/esm/vanilla/adapters/svelte/lazyScrollAction.d.ts +13 -0
  382. package/dist/esm/vanilla/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
  383. package/dist/esm/vanilla/adapters/vue/useLazyScroll.d.ts +13 -0
  384. package/dist/esm/vanilla/adapters/vue/useLazyScroll.d.ts.map +1 -0
  385. package/dist/esm/vanilla/core/AdaptiveBufferCalculator.d.ts +46 -0
  386. package/dist/esm/vanilla/core/AdaptiveBufferCalculator.d.ts.map +1 -0
  387. package/dist/esm/vanilla/core/ContentComplexityAnalyzer.d.ts +13 -0
  388. package/dist/esm/vanilla/core/ContentComplexityAnalyzer.d.ts.map +1 -0
  389. package/dist/esm/vanilla/core/DevicePerformanceMonitor.d.ts +22 -0
  390. package/dist/esm/vanilla/core/DevicePerformanceMonitor.d.ts.map +1 -0
  391. package/dist/esm/vanilla/core/Engine.d.ts +56 -0
  392. package/dist/esm/vanilla/core/Engine.d.ts.map +1 -0
  393. package/dist/esm/vanilla/core/GPUAccelerator.d.ts +23 -0
  394. package/dist/esm/vanilla/core/GPUAccelerator.d.ts.map +1 -0
  395. package/dist/esm/vanilla/core/IntelligentScrollDetector.d.ts +19 -0
  396. package/dist/esm/vanilla/core/IntelligentScrollDetector.d.ts.map +1 -0
  397. package/dist/esm/vanilla/core/MemoryManager.d.ts +33 -0
  398. package/dist/esm/vanilla/core/MemoryManager.d.ts.map +1 -0
  399. package/dist/esm/vanilla/core/NetworkAwarePrefetchManager.d.ts +10 -0
  400. package/dist/esm/vanilla/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
  401. package/dist/esm/vanilla/core/NetworkAwareRequestQueue.d.ts +20 -0
  402. package/dist/esm/vanilla/core/NetworkAwareRequestQueue.d.ts.map +1 -0
  403. package/dist/esm/vanilla/core/NetworkSpeedDetector.d.ts +16 -0
  404. package/dist/esm/vanilla/core/NetworkSpeedDetector.d.ts.map +1 -0
  405. package/dist/esm/vanilla/core/PerformanceOptimizer.d.ts +39 -0
  406. package/dist/esm/vanilla/core/PerformanceOptimizer.d.ts.map +1 -0
  407. package/dist/esm/vanilla/core/PrefetchManager.d.ts +16 -0
  408. package/dist/esm/vanilla/core/PrefetchManager.d.ts.map +1 -0
  409. package/dist/esm/vanilla/core/RequestQueue.d.ts +23 -0
  410. package/dist/esm/vanilla/core/RequestQueue.d.ts.map +1 -0
  411. package/dist/esm/vanilla/core/WindowManager.d.ts +24 -0
  412. package/dist/esm/vanilla/core/WindowManager.d.ts.map +1 -0
  413. package/dist/esm/vanilla/core/types.d.ts +28 -0
  414. package/dist/esm/vanilla/core/types.d.ts.map +1 -0
  415. package/dist/esm/vanilla/index.d.ts +23 -0
  416. package/dist/esm/vanilla/index.d.ts.map +1 -0
  417. package/dist/esm/vanilla/index.js +1666 -0
  418. package/dist/esm/vanilla/index.js.map +1 -0
  419. package/dist/esm/vanilla/platform/browser/ScrollObserver.d.ts +25 -0
  420. package/dist/esm/vanilla/platform/browser/ScrollObserver.d.ts.map +1 -0
  421. package/dist/esm/vanilla/utils/debounce.d.ts +5 -0
  422. package/dist/esm/vanilla/utils/debounce.d.ts.map +1 -0
  423. package/dist/esm/vanilla/utils/throttle.d.ts +5 -0
  424. package/dist/esm/vanilla/utils/throttle.d.ts.map +1 -0
  425. package/dist/esm/vue/adapters/angular/lazy-scroll.component.d.ts +28 -0
  426. package/dist/esm/vue/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
  427. package/dist/esm/vue/adapters/angular/lazy-scroll.directive.d.ts +21 -0
  428. package/dist/esm/vue/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
  429. package/dist/esm/vue/adapters/index.d.ts +7 -0
  430. package/dist/esm/vue/adapters/index.d.ts.map +1 -0
  431. package/dist/esm/vue/adapters/react/LazyList.d.ts +12 -0
  432. package/dist/esm/vue/adapters/react/LazyList.d.ts.map +1 -0
  433. package/dist/esm/vue/adapters/react/useLazyList.d.ts +22 -0
  434. package/dist/esm/vue/adapters/react/useLazyList.d.ts.map +1 -0
  435. package/dist/esm/vue/adapters/svelte/lazyScrollAction.d.ts +13 -0
  436. package/dist/esm/vue/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
  437. package/dist/esm/vue/adapters/vue/useLazyScroll.d.ts +13 -0
  438. package/dist/esm/vue/adapters/vue/useLazyScroll.d.ts.map +1 -0
  439. package/dist/esm/vue/core/AdaptiveBufferCalculator.d.ts +46 -0
  440. package/dist/esm/vue/core/AdaptiveBufferCalculator.d.ts.map +1 -0
  441. package/dist/esm/vue/core/ContentComplexityAnalyzer.d.ts +13 -0
  442. package/dist/esm/vue/core/ContentComplexityAnalyzer.d.ts.map +1 -0
  443. package/dist/esm/vue/core/DevicePerformanceMonitor.d.ts +22 -0
  444. package/dist/esm/vue/core/DevicePerformanceMonitor.d.ts.map +1 -0
  445. package/dist/esm/vue/core/Engine.d.ts +56 -0
  446. package/dist/esm/vue/core/Engine.d.ts.map +1 -0
  447. package/dist/esm/vue/core/GPUAccelerator.d.ts +23 -0
  448. package/dist/esm/vue/core/GPUAccelerator.d.ts.map +1 -0
  449. package/dist/esm/vue/core/IntelligentScrollDetector.d.ts +19 -0
  450. package/dist/esm/vue/core/IntelligentScrollDetector.d.ts.map +1 -0
  451. package/dist/esm/vue/core/MemoryManager.d.ts +33 -0
  452. package/dist/esm/vue/core/MemoryManager.d.ts.map +1 -0
  453. package/dist/esm/vue/core/NetworkAwarePrefetchManager.d.ts +10 -0
  454. package/dist/esm/vue/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
  455. package/dist/esm/vue/core/NetworkAwareRequestQueue.d.ts +20 -0
  456. package/dist/esm/vue/core/NetworkAwareRequestQueue.d.ts.map +1 -0
  457. package/dist/esm/vue/core/NetworkSpeedDetector.d.ts +16 -0
  458. package/dist/esm/vue/core/NetworkSpeedDetector.d.ts.map +1 -0
  459. package/dist/esm/vue/core/PerformanceOptimizer.d.ts +39 -0
  460. package/dist/esm/vue/core/PerformanceOptimizer.d.ts.map +1 -0
  461. package/dist/esm/vue/core/PrefetchManager.d.ts +16 -0
  462. package/dist/esm/vue/core/PrefetchManager.d.ts.map +1 -0
  463. package/dist/esm/vue/core/RequestQueue.d.ts +23 -0
  464. package/dist/esm/vue/core/RequestQueue.d.ts.map +1 -0
  465. package/dist/esm/vue/core/WindowManager.d.ts +24 -0
  466. package/dist/esm/vue/core/WindowManager.d.ts.map +1 -0
  467. package/dist/esm/vue/core/types.d.ts +28 -0
  468. package/dist/esm/vue/core/types.d.ts.map +1 -0
  469. package/dist/esm/vue/index.d.ts +23 -0
  470. package/dist/esm/vue/index.d.ts.map +1 -0
  471. package/dist/esm/vue/index.js +1441 -0
  472. package/dist/esm/vue/index.js.map +1 -0
  473. package/dist/esm/vue/platform/browser/ScrollObserver.d.ts +25 -0
  474. package/dist/esm/vue/platform/browser/ScrollObserver.d.ts.map +1 -0
  475. package/dist/esm/vue/utils/debounce.d.ts +5 -0
  476. package/dist/esm/vue/utils/debounce.d.ts.map +1 -0
  477. package/dist/esm/vue/utils/throttle.d.ts +5 -0
  478. package/dist/esm/vue/utils/throttle.d.ts.map +1 -0
  479. package/dist/index.d.ts +379 -1
  480. package/dist/svelte/index.d.ts +16 -0
  481. package/dist/vanilla/index.d.ts +356 -0
  482. package/dist/vue/index.d.ts +22 -0
  483. package/package.json +28 -1
@@ -0,0 +1,1441 @@
1
+ import { ref, onMounted, onUnmounted, watch, computed } from 'vue';
2
+
3
+ class WindowManager {
4
+ constructor(itemHeight, viewportHeight, bufferSize = 5) {
5
+ this.itemHeight = itemHeight;
6
+ this.viewportHeight = viewportHeight;
7
+ this.bufferSize = bufferSize;
8
+ }
9
+ /**
10
+ * Calculate the visible range based on scroll position
11
+ */
12
+ calculateVisibleRange(scrollTop) {
13
+ // Calculate how many items fit in the viewport
14
+ const itemsPerViewport = Math.ceil(this.viewportHeight / this.itemHeight);
15
+ // Calculate the starting index based on scroll position
16
+ const startIndex = Math.floor(scrollTop / this.itemHeight);
17
+ // Calculate the ending index with buffer
18
+ const endIndex = Math.min(startIndex + itemsPerViewport + this.bufferSize, Number.MAX_SAFE_INTEGER // Will be limited by total items later
19
+ );
20
+ return {
21
+ start: Math.max(0, startIndex - this.bufferSize),
22
+ end: endIndex
23
+ };
24
+ }
25
+ /**
26
+ * Update viewport height if it changes
27
+ */
28
+ updateViewportHeight(height) {
29
+ this.viewportHeight = height;
30
+ }
31
+ /**
32
+ * Update item height if it changes
33
+ */
34
+ updateItemHeight(height) {
35
+ this.itemHeight = height;
36
+ }
37
+ /**
38
+ * Update buffer size if it changes
39
+ */
40
+ updateBufferSize(size) {
41
+ this.bufferSize = size;
42
+ }
43
+ }
44
+
45
+ class PrefetchManager {
46
+ /**
47
+ * This class is kept for backward compatibility
48
+ * Intelligent prefetching is now handled in the Engine class
49
+ */
50
+ constructor() { }
51
+ /**
52
+ * Legacy method - not used in intelligent mode
53
+ */
54
+ shouldPrefetch(visibleEnd, totalLoaded) {
55
+ // Simple rule: if visible end is approaching the loaded boundary, fetch more
56
+ return visibleEnd >= totalLoaded - 5; // Default buffer
57
+ }
58
+ /**
59
+ * Update buffer size if it changes (for backward compatibility)
60
+ */
61
+ updateBufferSize(size) {
62
+ // This method exists for backward compatibility
63
+ // Intelligent prefetching is now handled in the Engine class
64
+ }
65
+ }
66
+
67
+ class RequestQueue {
68
+ constructor(maxConcurrent = 1) {
69
+ this.queue = [];
70
+ this.processing = false;
71
+ this.maxConcurrent = maxConcurrent;
72
+ }
73
+ /**
74
+ * Add a request to the queue
75
+ */
76
+ add(requestFn) {
77
+ return new Promise((resolve, reject) => {
78
+ this.queue.push(() => requestFn().then(resolve).catch(reject));
79
+ // Start processing if not already processing
80
+ if (!this.processing) {
81
+ this.processQueue();
82
+ }
83
+ });
84
+ }
85
+ /**
86
+ * Process the queue
87
+ */
88
+ async processQueue() {
89
+ if (this.queue.length === 0) {
90
+ this.processing = false;
91
+ return;
92
+ }
93
+ this.processing = true;
94
+ // Process up to maxConcurrent requests
95
+ const concurrentRequests = [];
96
+ const count = Math.min(this.maxConcurrent, this.queue.length);
97
+ for (let i = 0; i < count; i++) {
98
+ const requestFn = this.queue.shift();
99
+ if (requestFn) {
100
+ concurrentRequests.push(requestFn());
101
+ }
102
+ }
103
+ try {
104
+ await Promise.all(concurrentRequests);
105
+ }
106
+ catch (error) {
107
+ console.error('Request queue error:', error);
108
+ }
109
+ // Process remaining items
110
+ await this.processQueue();
111
+ }
112
+ /**
113
+ * Clear the queue
114
+ */
115
+ clear() {
116
+ this.queue = [];
117
+ }
118
+ /**
119
+ * Get the current queue length
120
+ */
121
+ getLength() {
122
+ return this.queue.length;
123
+ }
124
+ }
125
+
126
+ class IntelligentScrollDetector {
127
+ constructor() {
128
+ this.lastScrollTop = 0;
129
+ this.lastTime = 0;
130
+ this.velocityHistory = [];
131
+ this.HISTORY_SIZE = 5;
132
+ this.scrollTimeout = null;
133
+ this.isIdle = true;
134
+ this.lastTime = performance.now();
135
+ }
136
+ // Calculate velocity from scroll event
137
+ calculateVelocity(scrollTop) {
138
+ const now = performance.now();
139
+ const deltaY = scrollTop - this.lastScrollTop;
140
+ const deltaTime = now - this.lastTime;
141
+ // Calculate velocity (pixels per millisecond)
142
+ const velocity = deltaTime > 0 ? deltaY / deltaTime : 0;
143
+ // Store in history for smoothing
144
+ this.velocityHistory.push(velocity);
145
+ if (this.velocityHistory.length > this.HISTORY_SIZE) {
146
+ this.velocityHistory.shift();
147
+ }
148
+ // Update for next calculation
149
+ this.lastScrollTop = scrollTop;
150
+ this.lastTime = now;
151
+ // Update idle state
152
+ this.isIdle = false;
153
+ this.resetIdleTimer();
154
+ // Return smoothed velocity (average of recent values)
155
+ return this.getAverageVelocity();
156
+ }
157
+ // Get smoothed velocity from history
158
+ getAverageVelocity() {
159
+ if (this.velocityHistory.length === 0)
160
+ return 0;
161
+ const sum = this.velocityHistory.reduce((acc, vel) => acc + vel, 0);
162
+ return sum / this.velocityHistory.length;
163
+ }
164
+ // Determine scroll direction from velocity
165
+ getDirection(velocity) {
166
+ if (Math.abs(velocity) < 0.1)
167
+ return 'stationary';
168
+ return velocity > 0 ? 'down' : 'up';
169
+ }
170
+ // Calculate buffer size based on scroll velocity
171
+ calculateBuffer(velocity) {
172
+ const absVelocity = Math.abs(velocity);
173
+ if (absVelocity > 1.5) {
174
+ return 20; // Large buffer for fast scrolling
175
+ }
176
+ else if (absVelocity > 1.0) {
177
+ return 10; // Medium buffer
178
+ }
179
+ else if (absVelocity > 0.3) {
180
+ return 7; // Small buffer for medium scrolling
181
+ }
182
+ else {
183
+ return 5; // Minimal buffer when nearly stationary
184
+ }
185
+ }
186
+ // Calculate prefetch distance based on velocity
187
+ calculatePrefetchDistance(velocity) {
188
+ const absVelocity = Math.abs(velocity);
189
+ if (absVelocity > 2.0)
190
+ return 1200; // Far ahead for fast scrolling
191
+ if (absVelocity > 1.0)
192
+ return 800; // Medium distance
193
+ if (absVelocity > 0.3)
194
+ return 400; // Close distance for slow scroll
195
+ return 200; // Minimal prefetch when nearly stationary
196
+ }
197
+ // Predict where user will be in X milliseconds
198
+ predictPosition(currentPosition, velocity, msAhead = 500) {
199
+ return currentPosition + (velocity * msAhead);
200
+ }
201
+ // Check if user is currently idle
202
+ getIsIdle() {
203
+ return this.isIdle;
204
+ }
205
+ // Reset idle timer
206
+ resetIdleTimer() {
207
+ if (this.scrollTimeout) {
208
+ clearTimeout(this.scrollTimeout);
209
+ }
210
+ this.scrollTimeout = window.setTimeout(() => {
211
+ this.isIdle = true;
212
+ }, 150); // 150ms after last scroll = idle
213
+ }
214
+ // Clean up resources
215
+ cleanup() {
216
+ if (this.scrollTimeout) {
217
+ clearTimeout(this.scrollTimeout);
218
+ }
219
+ }
220
+ }
221
+
222
+ class NetworkSpeedDetector {
223
+ constructor() {
224
+ this.bandwidthHistory = [];
225
+ this.latencyHistory = [];
226
+ this.HISTORY_SIZE = 5;
227
+ }
228
+ // Estimate available bandwidth
229
+ async estimateBandwidth() {
230
+ const startTime = performance.now();
231
+ const testData = new Array(10000).fill('test_data').join('');
232
+ try {
233
+ // Send test request to measure bandwidth
234
+ const response = await fetch('/api/network-test', {
235
+ method: 'POST',
236
+ body: testData
237
+ });
238
+ const endTime = performance.now();
239
+ const duration = (endTime - startTime) / 1000; // seconds
240
+ const dataSize = testData.length; // bytes
241
+ const bandwidth = dataSize / duration; // bytes per second
242
+ this.bandwidthHistory.push(bandwidth);
243
+ if (this.bandwidthHistory.length > this.HISTORY_SIZE) {
244
+ this.bandwidthHistory.shift();
245
+ }
246
+ return this.getAverageBandwidth();
247
+ }
248
+ catch (error) {
249
+ // If network test fails, return a conservative estimate
250
+ return 100000; // 100 KB/s as fallback
251
+ }
252
+ }
253
+ // Measure network latency
254
+ async measureLatency() {
255
+ try {
256
+ const startTime = performance.now();
257
+ await fetch('/api/ping');
258
+ const endTime = performance.now();
259
+ const latency = endTime - startTime;
260
+ this.latencyHistory.push(latency);
261
+ if (this.latencyHistory.length > this.HISTORY_SIZE) {
262
+ this.latencyHistory.shift();
263
+ }
264
+ return this.getAverageLatency();
265
+ }
266
+ catch (error) {
267
+ // If ping fails, return a high latency as fallback
268
+ return 1000; // 1 second as fallback
269
+ }
270
+ }
271
+ // Assess overall connection quality
272
+ async assessConnectionQuality() {
273
+ try {
274
+ const [bandwidth, latency] = await Promise.all([
275
+ this.estimateBandwidth(),
276
+ this.measureLatency()
277
+ ]);
278
+ if (latency > 1000)
279
+ return 'poor'; // High latency
280
+ if (bandwidth < 100000)
281
+ return 'poor'; // Low bandwidth (< 100 KB/s)
282
+ if (latency > 500 || bandwidth < 500000)
283
+ return 'good'; // Moderate
284
+ return 'excellent'; // Fast and responsive
285
+ }
286
+ catch (_a) {
287
+ return 'offline';
288
+ }
289
+ }
290
+ getAverageBandwidth() {
291
+ if (this.bandwidthHistory.length === 0)
292
+ return 0;
293
+ const sum = this.bandwidthHistory.reduce((a, b) => a + b, 0);
294
+ return sum / this.bandwidthHistory.length;
295
+ }
296
+ getAverageLatency() {
297
+ if (this.latencyHistory.length === 0)
298
+ return 0;
299
+ const sum = this.latencyHistory.reduce((a, b) => a + b, 0);
300
+ return sum / this.latencyHistory.length;
301
+ }
302
+ // Get current network statistics
303
+ getNetworkStats() {
304
+ return {
305
+ bandwidth: this.getAverageBandwidth(),
306
+ latency: this.getAverageLatency(),
307
+ history: [...this.bandwidthHistory]
308
+ };
309
+ }
310
+ }
311
+
312
+ class NetworkAwarePrefetchManager {
313
+ constructor(networkDetector) {
314
+ this.basePrefetchDistance = 400; // Base prefetch distance in pixels
315
+ this.networkDetector = networkDetector;
316
+ }
317
+ // Calculate prefetch distance based on network conditions
318
+ async calculateNetworkAdjustedPrefetch(velocity) {
319
+ const connectionQuality = await this.networkDetector.assessConnectionQuality();
320
+ // Base prefetch distance from scroll velocity
321
+ let baseDistance = this.basePrefetchDistance;
322
+ if (Math.abs(velocity) > 2.0)
323
+ baseDistance = 1200;
324
+ else if (Math.abs(velocity) > 1.0)
325
+ baseDistance = 800;
326
+ else if (Math.abs(velocity) > 0.3)
327
+ baseDistance = 400;
328
+ else
329
+ baseDistance = 200;
330
+ // Adjust based on network quality
331
+ switch (connectionQuality) {
332
+ case 'excellent':
333
+ return Math.round(baseDistance * 1.5); // Extra prefetch on fast networks
334
+ case 'good':
335
+ return Math.round(baseDistance * 1.2); // Slightly more prefetch
336
+ case 'poor':
337
+ return Math.round(baseDistance * 0.7); // Less prefetch on slow networks
338
+ case 'offline':
339
+ return Math.round(baseDistance * 0.3); // Minimal prefetch when offline
340
+ default:
341
+ return baseDistance;
342
+ }
343
+ }
344
+ // Calculate batch size based on network conditions
345
+ async calculateNetworkAdjustedBatchSize(velocity) {
346
+ const connectionQuality = await this.networkDetector.assessConnectionQuality();
347
+ // Base batch size from scroll velocity
348
+ let baseBatchSize = 10; // Default batch size
349
+ if (Math.abs(velocity) > 2.0)
350
+ baseBatchSize = 20; // Fast scroll needs more
351
+ else if (Math.abs(velocity) > 1.0)
352
+ baseBatchSize = 15;
353
+ else if (Math.abs(velocity) > 0.3)
354
+ baseBatchSize = 10;
355
+ else
356
+ baseBatchSize = 5; // Slow scroll needs less
357
+ // Adjust based on network quality
358
+ switch (connectionQuality) {
359
+ case 'excellent':
360
+ return Math.min(baseBatchSize * 2, 50); // Large batches on fast networks
361
+ case 'good':
362
+ return Math.min(baseBatchSize * 1.5, 30); // Medium batches
363
+ case 'poor':
364
+ return Math.max(Math.round(baseBatchSize * 0.5), 5); // Small batches on slow networks
365
+ case 'offline':
366
+ return Math.max(Math.round(baseBatchSize * 0.3), 3); // Minimal batches when offline
367
+ default:
368
+ return baseBatchSize;
369
+ }
370
+ }
371
+ // Determine if prefetch should be delayed based on network conditions
372
+ async shouldDelayPrefetch() {
373
+ const connectionQuality = await this.networkDetector.assessConnectionQuality();
374
+ return connectionQuality === 'poor';
375
+ }
376
+ }
377
+
378
+ class NetworkAwareRequestQueue {
379
+ constructor(networkDetector) {
380
+ this.queue = [];
381
+ this.processing = false;
382
+ this.maxConcurrent = 1;
383
+ this.offlineQueue = [];
384
+ this.networkDetector = networkDetector;
385
+ }
386
+ // Add request with network-aware concurrency
387
+ async add(requestFn) {
388
+ // Adjust concurrency based on network conditions
389
+ const connectionQuality = await this.networkDetector.assessConnectionQuality();
390
+ switch (connectionQuality) {
391
+ case 'excellent':
392
+ this.maxConcurrent = 3; // Allow more concurrent requests
393
+ break;
394
+ case 'good':
395
+ this.maxConcurrent = 2; // Moderate concurrency
396
+ break;
397
+ case 'poor':
398
+ this.maxConcurrent = 1; // Sequential requests on slow networks
399
+ break;
400
+ case 'offline':
401
+ // Queue for later when online
402
+ return this.handleOfflineRequest(requestFn);
403
+ default:
404
+ this.maxConcurrent = 1;
405
+ }
406
+ return new Promise((resolve, reject) => {
407
+ this.queue.push(() => requestFn().then(resolve).catch(reject));
408
+ if (!this.processing) {
409
+ this.processQueue();
410
+ }
411
+ });
412
+ }
413
+ // Process queue with network-aware concurrency
414
+ async processQueue() {
415
+ if (this.queue.length === 0) {
416
+ this.processing = false;
417
+ return;
418
+ }
419
+ this.processing = true;
420
+ // Process up to maxConcurrent requests
421
+ const concurrentRequests = [];
422
+ const count = Math.min(this.maxConcurrent, this.queue.length);
423
+ for (let i = 0; i < count; i++) {
424
+ const requestFn = this.queue.shift();
425
+ if (requestFn) {
426
+ concurrentRequests.push(requestFn());
427
+ }
428
+ }
429
+ try {
430
+ await Promise.all(concurrentRequests);
431
+ }
432
+ catch (error) {
433
+ console.error('Network-aware request queue error:', error);
434
+ }
435
+ // Process remaining items
436
+ await this.processQueue();
437
+ }
438
+ // Handle requests when offline
439
+ async handleOfflineRequest(requestFn) {
440
+ // Store request for later execution
441
+ return new Promise((resolve, reject) => {
442
+ // Add to offline queue
443
+ this.offlineQueue.push(() => requestFn().then(resolve).catch(reject));
444
+ // Check for network restoration periodically
445
+ const checkOnline = () => {
446
+ if (navigator.onLine) {
447
+ // Process offline queue
448
+ this.processOfflineQueue();
449
+ resolve(null); // Resolve with null since we can't return the actual result
450
+ }
451
+ else {
452
+ setTimeout(checkOnline, 5000); // Check again in 5 seconds
453
+ }
454
+ };
455
+ checkOnline();
456
+ });
457
+ }
458
+ // Process offline queue when back online
459
+ async processOfflineQueue() {
460
+ const offlineRequests = [...this.offlineQueue];
461
+ this.offlineQueue = [];
462
+ for (const requestFn of offlineRequests) {
463
+ try {
464
+ await requestFn();
465
+ }
466
+ catch (error) {
467
+ console.error('Offline request failed:', error);
468
+ // Add back to offline queue for retry
469
+ this.offlineQueue.push(requestFn);
470
+ }
471
+ }
472
+ }
473
+ // Get current queue status
474
+ getQueueStatus() {
475
+ return {
476
+ pending: this.queue.length,
477
+ offline: this.offlineQueue.length,
478
+ maxConcurrent: this.maxConcurrent
479
+ };
480
+ }
481
+ // Clear all queues
482
+ clear() {
483
+ this.queue = [];
484
+ this.offlineQueue = [];
485
+ this.processing = false;
486
+ }
487
+ }
488
+
489
+ class DevicePerformanceMonitor {
490
+ constructor() {
491
+ this.frameRateHistory = [];
492
+ this.memoryUsageHistory = [];
493
+ this.gcMonitoring = false;
494
+ this.HISTORY_SIZE = 10;
495
+ this.setupPerformanceMonitoring();
496
+ }
497
+ // Monitor frame rate
498
+ async getFrameRate() {
499
+ return new Promise(resolve => {
500
+ const start = performance.now();
501
+ let frames = 0;
502
+ const measure = () => {
503
+ frames++;
504
+ if (frames >= 60) { // Measure over 60 frames
505
+ const elapsed = performance.now() - start;
506
+ const fps = Math.round((frames / elapsed) * 1000);
507
+ this.frameRateHistory.push(fps);
508
+ if (this.frameRateHistory.length > this.HISTORY_SIZE) {
509
+ this.frameRateHistory.shift();
510
+ }
511
+ resolve(fps);
512
+ }
513
+ else {
514
+ requestAnimationFrame(measure);
515
+ }
516
+ };
517
+ requestAnimationFrame(measure);
518
+ });
519
+ }
520
+ // Get average frame rate
521
+ getAverageFrameRate() {
522
+ if (this.frameRateHistory.length === 0)
523
+ return 60;
524
+ const sum = this.frameRateHistory.reduce((a, b) => a + b, 0);
525
+ return sum / this.frameRateHistory.length;
526
+ }
527
+ // Monitor memory usage (where available)
528
+ getMemoryInfo() {
529
+ if ('memory' in performance) {
530
+ // @ts-ignore - memory property is non-standard
531
+ const mem = performance.memory;
532
+ if (mem) {
533
+ return {
534
+ used: mem.usedJSHeapSize,
535
+ total: mem.jsHeapSizeLimit
536
+ };
537
+ }
538
+ }
539
+ return null;
540
+ }
541
+ // Assess overall device performance
542
+ async assessPerformance() {
543
+ const frameRate = await this.getFrameRate();
544
+ const memoryInfo = this.getMemoryInfo();
545
+ // Normalize frame rate (60fps = excellent, 30fps = poor)
546
+ const frameRateScore = Math.min(frameRate / 60, 1);
547
+ // If we have memory info, factor it in
548
+ if (memoryInfo) {
549
+ const memoryScore = 1 - (memoryInfo.used / memoryInfo.total);
550
+ return (frameRateScore * 0.7) + (memoryScore * 0.3);
551
+ }
552
+ return frameRateScore;
553
+ }
554
+ setupPerformanceMonitoring() {
555
+ // Set up performance monitoring intervals
556
+ setInterval(() => {
557
+ this.getFrameRate(); // Update frame rate history
558
+ }, 5000); // Every 5 seconds
559
+ }
560
+ // Get performance insights
561
+ getPerformanceInsights() {
562
+ const frameRate = this.getAverageFrameRate();
563
+ const memoryInfo = this.getMemoryInfo();
564
+ // Calculate performance score based on frame rate
565
+ const performanceScore = Math.min(frameRate / 60, 1);
566
+ return {
567
+ frameRate,
568
+ performanceScore,
569
+ memoryUsed: (memoryInfo === null || memoryInfo === void 0 ? void 0 : memoryInfo.used) || null,
570
+ memoryTotal: (memoryInfo === null || memoryInfo === void 0 ? void 0 : memoryInfo.total) || null
571
+ };
572
+ }
573
+ }
574
+
575
+ class ContentComplexityAnalyzer {
576
+ // Analyze content complexity based on various factors
577
+ analyzeContentComplexity(items) {
578
+ if (items.length === 0)
579
+ return 0.1; // Minimal complexity for empty
580
+ let totalComplexity = 0;
581
+ for (const item of items) {
582
+ // Analyze different aspects of complexity
583
+ const textComplexity = this.analyzeTextComplexity(item);
584
+ const mediaComplexity = this.analyzeMediaComplexity(item);
585
+ const componentComplexity = this.analyzeComponentComplexity(item);
586
+ totalComplexity += (textComplexity + mediaComplexity + componentComplexity) / 3;
587
+ }
588
+ // Return average complexity normalized to 0-1 scale
589
+ return Math.min(totalComplexity / items.length, 1);
590
+ }
591
+ analyzeTextComplexity(item) {
592
+ let complexity = 0;
593
+ // Length of text content
594
+ if (typeof item.text === 'string') {
595
+ complexity += Math.min(item.text.length / 1000, 0.5); // Max 0.5 for text
596
+ }
597
+ // Number of text elements
598
+ if (Array.isArray(item.textElements)) {
599
+ complexity += Math.min(item.textElements.length / 10, 0.3); // Max 0.3 for elements
600
+ }
601
+ // Formatting complexity
602
+ if (item.hasRichText)
603
+ complexity += 0.2;
604
+ return Math.min(complexity, 1);
605
+ }
606
+ analyzeMediaComplexity(item) {
607
+ let complexity = 0;
608
+ // Number of media elements
609
+ if (Array.isArray(item.media)) {
610
+ complexity += Math.min(item.media.length * 0.2, 0.5);
611
+ }
612
+ // Media types (images, videos are more complex than icons)
613
+ if (item.hasVideo)
614
+ complexity += 0.3;
615
+ if (item.hasImage)
616
+ complexity += 0.15;
617
+ if (item.hasSVG)
618
+ complexity += 0.1;
619
+ return Math.min(complexity, 1);
620
+ }
621
+ analyzeComponentComplexity(item) {
622
+ let complexity = 0;
623
+ // Number of nested components
624
+ if (typeof item.componentDepth === 'number') {
625
+ complexity += Math.min(item.componentDepth * 0.1, 0.4);
626
+ }
627
+ // Interactivity
628
+ if (item.interactive)
629
+ complexity += 0.2;
630
+ if (item.hasAnimations)
631
+ complexity += 0.2;
632
+ if (item.hasState)
633
+ complexity += 0.1;
634
+ return Math.min(complexity, 1);
635
+ }
636
+ // Get complexity insights
637
+ getComplexityInsights(items) {
638
+ if (items.length === 0) {
639
+ return {
640
+ averageComplexity: 0.1,
641
+ textComplexity: 0,
642
+ mediaComplexity: 0,
643
+ componentComplexity: 0
644
+ };
645
+ }
646
+ let totalText = 0, totalMedia = 0, totalComponent = 0;
647
+ for (const item of items) {
648
+ totalText += this.analyzeTextComplexity(item);
649
+ totalMedia += this.analyzeMediaComplexity(item);
650
+ totalComponent += this.analyzeComponentComplexity(item);
651
+ }
652
+ return {
653
+ averageComplexity: this.analyzeContentComplexity(items),
654
+ textComplexity: totalText / items.length,
655
+ mediaComplexity: totalMedia / items.length,
656
+ componentComplexity: totalComponent / items.length
657
+ };
658
+ }
659
+ }
660
+
661
+ class AdaptiveBufferCalculator {
662
+ constructor() {
663
+ this.scrollFactor = 0.3; // Weight for scroll velocity
664
+ this.networkFactor = 0.3; // Weight for network quality
665
+ this.performanceFactor = 0.2; // Weight for device performance
666
+ this.contentFactor = 0.2; // Weight for content complexity
667
+ this.performanceMonitor = new DevicePerformanceMonitor();
668
+ this.contentAnalyzer = new ContentComplexityAnalyzer();
669
+ }
670
+ // Calculate optimal buffer size based on multiple factors
671
+ async calculateOptimalBuffer(params) {
672
+ // Calculate scroll-based buffer
673
+ const scrollBuffer = this.calculateScrollBuffer(params.scrollVelocity, params.baseBuffer);
674
+ // Calculate network-based adjustment
675
+ const networkAdjustment = this.calculateNetworkAdjustment(params.networkQuality);
676
+ // Calculate performance-based adjustment
677
+ const performanceScore = await this.performanceMonitor.assessPerformance();
678
+ const performanceAdjustment = this.calculatePerformanceAdjustment(performanceScore);
679
+ // Calculate content-based adjustment
680
+ const contentComplexity = this.contentAnalyzer.analyzeContentComplexity(params.visibleItems);
681
+ const contentAdjustment = this.calculateContentAdjustment(contentComplexity);
682
+ // Combine all factors
683
+ const weightedBuffer = (scrollBuffer * this.scrollFactor +
684
+ (params.baseBuffer * networkAdjustment) * this.networkFactor +
685
+ (params.baseBuffer * performanceAdjustment) * this.performanceFactor +
686
+ (params.baseBuffer * contentAdjustment) * this.contentFactor);
687
+ // Apply reasonable bounds
688
+ return Math.max(3, Math.min(50, Math.round(weightedBuffer)));
689
+ }
690
+ calculateScrollBuffer(velocity, baseBuffer) {
691
+ const absVelocity = Math.abs(velocity);
692
+ if (absVelocity > 2.0)
693
+ return baseBuffer * 4; // Very fast scroll
694
+ if (absVelocity > 1.0)
695
+ return baseBuffer * 2.5; // Fast scroll
696
+ if (absVelocity > 0.3)
697
+ return baseBuffer * 1.5; // Medium scroll
698
+ return baseBuffer * 0.8; // Slow scroll
699
+ }
700
+ calculateNetworkAdjustment(quality) {
701
+ switch (quality) {
702
+ case 'excellent': return 1.5; // More buffer on fast networks
703
+ case 'good': return 1.2; // Slightly more
704
+ case 'poor': return 0.7; // Less buffer on slow networks
705
+ case 'offline': return 0.5; // Minimal buffer when offline
706
+ default: return 1.0;
707
+ }
708
+ }
709
+ calculatePerformanceAdjustment(performance) {
710
+ // performance is 0-1 scale (0 = poor, 1 = excellent)
711
+ return 0.5 + (performance * 0.8); // Range from 0.5 to 1.3
712
+ }
713
+ calculateContentAdjustment(complexity) {
714
+ // complexity is 0-1 scale (0 = simple, 1 = complex)
715
+ return 1.5 - (complexity * 0.8); // Range from 0.7 to 1.5
716
+ }
717
+ // Get adaptive insights
718
+ async getAdaptiveInsights(params) {
719
+ const buffer = await this.calculateOptimalBuffer(params);
720
+ const perfInsights = this.performanceMonitor.getPerformanceInsights();
721
+ const complexityInsights = this.contentAnalyzer.getComplexityInsights(params.visibleItems);
722
+ return {
723
+ currentBuffer: buffer,
724
+ performance: {
725
+ frameRate: perfInsights.frameRate,
726
+ score: perfInsights.performanceScore
727
+ },
728
+ network: {
729
+ quality: params.networkQuality,
730
+ adjustment: this.calculateNetworkAdjustment(params.networkQuality)
731
+ },
732
+ complexity: {
733
+ score: this.contentAnalyzer.analyzeContentComplexity(params.visibleItems),
734
+ breakdown: complexityInsights
735
+ },
736
+ factors: {
737
+ scroll: this.calculateScrollBuffer(params.scrollVelocity, params.baseBuffer),
738
+ network: this.calculateNetworkAdjustment(params.networkQuality),
739
+ performance: this.calculatePerformanceAdjustment(perfInsights.performanceScore),
740
+ content: this.calculateContentAdjustment(complexityInsights.averageComplexity)
741
+ }
742
+ };
743
+ }
744
+ }
745
+
746
+ class PerformanceOptimizer {
747
+ constructor() {
748
+ this.frameBudget = 16; // Target for 60fps (16.67ms per frame)
749
+ this.lastFrameTime = 0;
750
+ this.animationFrameId = null;
751
+ this.isOptimizing = false;
752
+ // Frame rate limiter to prevent excessive updates
753
+ this.lastUpdate = 0;
754
+ this.minUpdateInterval = 16; // Minimum 16ms between updates (60fps)
755
+ // Batch updates to reduce DOM manipulations
756
+ this.updateQueue = [];
757
+ this.isProcessingQueue = false;
758
+ // Memory optimization
759
+ this.cleanupThreshold = 1000; // Clean up items beyond this threshold
760
+ this.gcInterval = null;
761
+ this.setupPerformanceMonitoring();
762
+ }
763
+ // Optimize rendering by limiting updates to frame budget
764
+ scheduleOptimizedUpdate(updateFn) {
765
+ const now = performance.now();
766
+ // Throttle updates based on frame rate
767
+ if (now - this.lastUpdate < this.minUpdateInterval) {
768
+ // Queue the update for later
769
+ this.updateQueue.push(updateFn);
770
+ if (!this.isProcessingQueue) {
771
+ this.processUpdateQueue();
772
+ }
773
+ return;
774
+ }
775
+ // Check if we have enough time in the current frame
776
+ if (this.getTimeRemaining() > 4) { // Leave 4ms buffer
777
+ updateFn();
778
+ this.lastUpdate = now;
779
+ }
780
+ else {
781
+ // Schedule for next frame
782
+ this.updateQueue.push(updateFn);
783
+ if (!this.isProcessingQueue) {
784
+ this.processUpdateQueue();
785
+ }
786
+ }
787
+ }
788
+ // Process queued updates efficiently
789
+ async processUpdateQueue() {
790
+ if (this.updateQueue.length === 0) {
791
+ this.isProcessingQueue = false;
792
+ return;
793
+ }
794
+ this.isProcessingQueue = true;
795
+ const currentTime = performance.now();
796
+ // Process as many updates as possible within frame budget
797
+ while (this.updateQueue.length > 0 && this.getTimeRemaining() > 2) {
798
+ const updateFn = this.updateQueue.shift();
799
+ if (updateFn) {
800
+ updateFn();
801
+ }
802
+ }
803
+ this.lastUpdate = currentTime;
804
+ if (this.updateQueue.length > 0) {
805
+ // Schedule remaining updates for next frame (only in browser environment)
806
+ if (typeof requestAnimationFrame !== 'undefined') {
807
+ requestAnimationFrame(() => this.processUpdateQueue());
808
+ }
809
+ else {
810
+ // In Node.js environment, use setTimeout as fallback
811
+ setTimeout(() => this.processUpdateQueue(), 0);
812
+ }
813
+ }
814
+ else {
815
+ this.isProcessingQueue = false;
816
+ }
817
+ }
818
+ // Get remaining time in current frame
819
+ getTimeRemaining() {
820
+ if (typeof performance === 'undefined' || !performance.now) {
821
+ return 16; // Fallback to 60fps
822
+ }
823
+ const currentTime = performance.now();
824
+ // Typically browsers target 10ms remaining time for smoothness
825
+ return Math.max(0, this.frameBudget - (currentTime - this.lastFrameTime));
826
+ }
827
+ // Memory optimization: cleanup off-screen items
828
+ optimizeMemory(cleanupFn, visibleRange) {
829
+ // Determine cleanup range (items far from visible range)
830
+ const cleanupStart = Math.max(0, visibleRange.end + this.cleanupThreshold);
831
+ const cleanupEnd = Math.max(0, visibleRange.start - this.cleanupThreshold);
832
+ if (cleanupStart > visibleRange.end) {
833
+ cleanupFn(visibleRange.end, cleanupStart);
834
+ }
835
+ if (cleanupEnd < visibleRange.start) {
836
+ cleanupFn(cleanupEnd, visibleRange.start);
837
+ }
838
+ }
839
+ // Enable GPU acceleration for smoother scrolling
840
+ enableGPUCssAcceleration(element) {
841
+ // Force hardware acceleration
842
+ element.style.willChange = 'transform';
843
+ element.style.transform = 'translateZ(0)';
844
+ element.style.backfaceVisibility = 'hidden';
845
+ }
846
+ // Disable GPU acceleration when not needed
847
+ disableGPUCssAcceleration(element) {
848
+ element.style.willChange = 'auto';
849
+ element.style.transform = '';
850
+ element.style.backfaceVisibility = '';
851
+ }
852
+ // Optimize for different device capabilities
853
+ getOptimizationProfile() {
854
+ // Simple profile detection based on common device characteristics
855
+ const userAgent = navigator.userAgent || navigator.vendor || window.opera;
856
+ // Detect low-end devices
857
+ if (this.isLowEndDevice(userAgent)) {
858
+ return {
859
+ frameRate: 30, // Lower target for low-end devices
860
+ batchSize: 5, // Smaller batches
861
+ bufferMultiplier: 0.5, // Smaller buffer
862
+ updateInterval: 32 // 30fps interval
863
+ };
864
+ }
865
+ // Default profile for capable devices
866
+ return {
867
+ frameRate: 60,
868
+ batchSize: 10,
869
+ bufferMultiplier: 1.0,
870
+ updateInterval: 16 // 60fps interval
871
+ };
872
+ }
873
+ isLowEndDevice(userAgent) {
874
+ // Simple heuristic for low-end devices
875
+ const lowEndPatterns = [
876
+ /Android.*Mobile/,
877
+ /iPhone.*OS [0-9]+_[0-9]+/,
878
+ /Opera Mini/,
879
+ /IEMobile/
880
+ ];
881
+ return lowEndPatterns.some(pattern => pattern.test(userAgent));
882
+ }
883
+ // Setup performance monitoring
884
+ setupPerformanceMonitoring() {
885
+ // Check if we're in a browser environment
886
+ if (typeof window === 'undefined' || typeof requestAnimationFrame === 'undefined') {
887
+ // In Node.js environment, skip browser-specific monitoring
888
+ return;
889
+ }
890
+ // Monitor frame rate
891
+ let frameCount = 0;
892
+ let lastTime = performance.now();
893
+ const monitorFrameRate = () => {
894
+ frameCount++;
895
+ const currentTime = performance.now();
896
+ if (currentTime - lastTime >= 1000) { // Every second
897
+ const fps = frameCount;
898
+ frameCount = 0;
899
+ lastTime = currentTime;
900
+ // Adjust optimization based on actual FPS
901
+ if (fps < 30) {
902
+ this.frameBudget = 32; // Target 30fps
903
+ }
904
+ else if (fps < 50) {
905
+ this.frameBudget = 20; // Target 50fps
906
+ }
907
+ else {
908
+ this.frameBudget = 16; // Target 60fps
909
+ }
910
+ }
911
+ this.animationFrameId = requestAnimationFrame(monitorFrameRate);
912
+ };
913
+ this.animationFrameId = requestAnimationFrame(monitorFrameRate);
914
+ // Setup garbage collection monitoring
915
+ this.gcInterval = window.setInterval(() => {
916
+ if ('gc' in window) {
917
+ // @ts-ignore - gc is non-standard
918
+ window.gc();
919
+ }
920
+ }, 30000); // GC every 30 seconds
921
+ }
922
+ // Get performance insights
923
+ getPerformanceInsights() {
924
+ return {
925
+ frameRate: 60, // Would be calculated from monitoring
926
+ memoryUsage: this.getMemoryUsage(),
927
+ updateFrequency: 1000 / this.minUpdateInterval,
928
+ optimizationActive: this.isOptimizing
929
+ };
930
+ }
931
+ getMemoryUsage() {
932
+ var _a;
933
+ if ('memory' in performance) {
934
+ // @ts-ignore - memory property is non-standard
935
+ return ((_a = performance.memory) === null || _a === void 0 ? void 0 : _a.usedJSHeapSize) || null;
936
+ }
937
+ return null;
938
+ }
939
+ // Cleanup resources
940
+ cleanup() {
941
+ if (this.animationFrameId && typeof cancelAnimationFrame !== 'undefined') {
942
+ cancelAnimationFrame(this.animationFrameId);
943
+ }
944
+ if (this.gcInterval && typeof clearInterval !== 'undefined') {
945
+ clearInterval(this.gcInterval);
946
+ }
947
+ this.updateQueue = [];
948
+ this.isProcessingQueue = false;
949
+ }
950
+ }
951
+
952
+ class MemoryManager {
953
+ constructor(maxCacheSize = 1000) {
954
+ this.itemCache = new Map();
955
+ this.maxCacheSize = 1000; // Maximum items to keep in cache
956
+ this.cleanupThreshold = 500; // Start cleanup when cache exceeds this
957
+ this.visibleRange = { start: 0, end: 0 };
958
+ this.totalItems = 0;
959
+ this.maxCacheSize = maxCacheSize;
960
+ }
961
+ // Set visible range to optimize cache
962
+ setVisibleRange(range) {
963
+ this.visibleRange = range;
964
+ }
965
+ // Set total number of items
966
+ setTotalItems(total) {
967
+ this.totalItems = total;
968
+ }
969
+ // Get item from cache
970
+ get(key) {
971
+ return this.itemCache.get(key) || null;
972
+ }
973
+ // Set item in cache
974
+ set(key, value) {
975
+ this.itemCache.set(key, value);
976
+ // Clean up if cache is too large
977
+ if (this.itemCache.size > this.maxCacheSize) {
978
+ this.cleanupCache();
979
+ }
980
+ }
981
+ // Check if item exists in cache
982
+ has(key) {
983
+ return this.itemCache.has(key);
984
+ }
985
+ // Remove item from cache
986
+ delete(key) {
987
+ return this.itemCache.delete(key);
988
+ }
989
+ // Clear entire cache
990
+ clear() {
991
+ this.itemCache.clear();
992
+ }
993
+ // Clean up cache based on visibility and distance from visible range
994
+ cleanupCache() {
995
+ if (this.itemCache.size <= this.cleanupThreshold) {
996
+ return; // No need to clean up
997
+ }
998
+ const itemsToRemove = [];
999
+ // Find items that are far from visible range
1000
+ for (const [key] of this.itemCache.entries()) {
1001
+ const distanceFromVisible = this.getDistanceFromVisible(key);
1002
+ // Remove items that are far from visible range
1003
+ if (distanceFromVisible > 100) { // Arbitrary threshold
1004
+ itemsToRemove.push(key);
1005
+ }
1006
+ }
1007
+ // If we still have too many items, remove oldest accessed items
1008
+ if (this.itemCache.size - itemsToRemove.length > this.cleanupThreshold) {
1009
+ const sortedKeys = Array.from(this.itemCache.keys())
1010
+ .sort((a, b) => a - b); // Sort by key (assuming they're indexes)
1011
+ // Remove items that are furthest from visible range
1012
+ for (const key of sortedKeys) {
1013
+ if (this.itemCache.size <= this.cleanupThreshold)
1014
+ break;
1015
+ const distance = this.getDistanceFromVisible(key);
1016
+ if (distance > 50) { // Remove items beyond 50 units from visible
1017
+ itemsToRemove.push(key);
1018
+ }
1019
+ }
1020
+ }
1021
+ // Actually remove items
1022
+ for (const key of itemsToRemove) {
1023
+ this.itemCache.delete(key);
1024
+ }
1025
+ }
1026
+ // Calculate distance from visible range
1027
+ getDistanceFromVisible(index) {
1028
+ if (index >= this.visibleRange.start && index <= this.visibleRange.end) {
1029
+ return 0; // Inside visible range
1030
+ }
1031
+ if (index < this.visibleRange.start) {
1032
+ return this.visibleRange.start - index;
1033
+ }
1034
+ return index - this.visibleRange.end;
1035
+ }
1036
+ // Get cache statistics
1037
+ getStats() {
1038
+ const visibleItems = Array.from(this.itemCache.keys())
1039
+ .filter(key => key >= this.visibleRange.start && key <= this.visibleRange.end)
1040
+ .length;
1041
+ const offScreenItems = this.itemCache.size - visibleItems;
1042
+ // Rough estimate of memory usage (in bytes)
1043
+ let memoryEstimate = 0;
1044
+ for (const [_, value] of this.itemCache.entries()) {
1045
+ memoryEstimate += this.estimateObjectSize(value);
1046
+ }
1047
+ return {
1048
+ size: this.itemCache.size,
1049
+ maxCacheSize: this.maxCacheSize,
1050
+ visibleItems,
1051
+ offScreenItems,
1052
+ memoryEstimate
1053
+ };
1054
+ }
1055
+ // Estimate object size in bytes
1056
+ estimateObjectSize(obj) {
1057
+ if (obj === null || obj === undefined)
1058
+ return 0;
1059
+ if (typeof obj === 'string')
1060
+ return obj.length * 2; // UTF-16 chars
1061
+ if (typeof obj === 'number')
1062
+ return 8; // 8 bytes for number
1063
+ if (typeof obj === 'boolean')
1064
+ return 4; // 4 bytes for boolean
1065
+ if (typeof obj === 'object') {
1066
+ let size = 0;
1067
+ for (const key in obj) {
1068
+ if (obj.hasOwnProperty(key)) {
1069
+ size += key.length * 2; // Key size
1070
+ size += this.estimateObjectSize(obj[key]); // Value size
1071
+ }
1072
+ }
1073
+ return size;
1074
+ }
1075
+ return 0; // Other types
1076
+ }
1077
+ // Prune cache to only keep essential items
1078
+ pruneEssential() {
1079
+ const essentialItems = [];
1080
+ // Keep items in visible range and nearby
1081
+ for (const [key, value] of this.itemCache.entries()) {
1082
+ if (this.isEssential(key)) {
1083
+ essentialItems.push([key, value]);
1084
+ }
1085
+ }
1086
+ // Clear cache and repopulate with essential items
1087
+ this.itemCache.clear();
1088
+ for (const [key, value] of essentialItems) {
1089
+ this.itemCache.set(key, value);
1090
+ }
1091
+ }
1092
+ // Check if item is essential (within buffer zone)
1093
+ isEssential(index) {
1094
+ const bufferZone = 20; // Keep items within 20 positions of visible range
1095
+ return index >= (this.visibleRange.start - bufferZone) &&
1096
+ index <= (this.visibleRange.end + bufferZone);
1097
+ }
1098
+ // Get cache size
1099
+ getSize() {
1100
+ return this.itemCache.size;
1101
+ }
1102
+ // Get cache keys
1103
+ getKeys() {
1104
+ return Array.from(this.itemCache.keys());
1105
+ }
1106
+ }
1107
+
1108
+ class GPUAccelerator {
1109
+ constructor() {
1110
+ this.gpuAccelerationEnabled = false;
1111
+ this.gpuElements = new WeakSet();
1112
+ this.animationFrameId = null;
1113
+ this.gpuAccelerationEnabled = this.isGPUSupported();
1114
+ }
1115
+ // Check if GPU acceleration is supported
1116
+ isGPUSupported() {
1117
+ // Check if we're in a browser environment
1118
+ if (typeof document === 'undefined') {
1119
+ return false; // Not supported in Node.js environment
1120
+ }
1121
+ // Check for 3D transform support
1122
+ const testEl = document.createElement('div');
1123
+ return testEl.style.webkitTransform !== undefined ||
1124
+ testEl.style.transform !== undefined;
1125
+ }
1126
+ // Enable GPU acceleration for an element
1127
+ enableForElement(element) {
1128
+ if (!this.gpuAccelerationEnabled)
1129
+ return;
1130
+ // Apply GPU-accelerated styles
1131
+ element.style.willChange = 'transform';
1132
+ element.style.transform = 'translateZ(0)';
1133
+ element.style.backfaceVisibility = 'hidden';
1134
+ element.style.perspective = '1000px';
1135
+ // Add to tracked elements
1136
+ this.gpuElements.add(element);
1137
+ }
1138
+ // Disable GPU acceleration for an element
1139
+ disableForElement(element) {
1140
+ if (!this.gpuAccelerationEnabled)
1141
+ return;
1142
+ // Remove GPU-accelerated styles
1143
+ element.style.willChange = 'auto';
1144
+ element.style.transform = '';
1145
+ element.style.backfaceVisibility = '';
1146
+ element.style.perspective = '';
1147
+ // Remove from tracked elements
1148
+ this.gpuElements.delete(element);
1149
+ }
1150
+ // Apply GPU acceleration to a list of elements
1151
+ enableForElements(elements) {
1152
+ elements.forEach(el => this.enableForElement(el));
1153
+ }
1154
+ // Batch update GPU acceleration
1155
+ batchUpdate(elements, enable) {
1156
+ if (!this.gpuAccelerationEnabled)
1157
+ return;
1158
+ if (enable) {
1159
+ this.enableForElements(elements);
1160
+ }
1161
+ else {
1162
+ elements.forEach(el => this.disableForElement(el));
1163
+ }
1164
+ }
1165
+ // Optimize scrolling container for GPU acceleration
1166
+ optimizeScrollContainer(container) {
1167
+ if (!this.gpuAccelerationEnabled)
1168
+ return;
1169
+ // Apply optimizations to container
1170
+ container.style.transform = 'translateZ(0)';
1171
+ container.style.willChange = 'scroll-position';
1172
+ container.style.webkitOverflowScrolling = 'touch'; // For iOS
1173
+ }
1174
+ // Optimize individual items for GPU acceleration
1175
+ optimizeItem(item) {
1176
+ if (!this.gpuAccelerationEnabled)
1177
+ return;
1178
+ // Apply lightweight GPU acceleration
1179
+ item.style.transform = 'translateZ(0)';
1180
+ item.style.willChange = 'transform';
1181
+ }
1182
+ // Get GPU acceleration status
1183
+ getStatus() {
1184
+ // Since WeakSet doesn't have a size property, we can't count directly
1185
+ // This is a limitation of WeakSet
1186
+ return {
1187
+ enabled: this.gpuAccelerationEnabled,
1188
+ supported: this.isGPUSupported(),
1189
+ elementCount: 0 // Placeholder - would need different tracking method
1190
+ };
1191
+ }
1192
+ // Optimize for different scenarios
1193
+ optimizeForScenario(scenario) {
1194
+ if (!this.gpuAccelerationEnabled)
1195
+ return;
1196
+ switch (scenario) {
1197
+ case 'scrolling':
1198
+ // Optimize for smooth scrolling
1199
+ document.body.style.willChange = 'transform';
1200
+ break;
1201
+ case 'animation':
1202
+ // Optimize for animations
1203
+ document.body.style.transform = 'translateZ(0)';
1204
+ break;
1205
+ case 'static':
1206
+ // Remove optimizations when not needed
1207
+ document.body.style.willChange = 'auto';
1208
+ document.body.style.transform = '';
1209
+ break;
1210
+ }
1211
+ }
1212
+ // Cleanup GPU acceleration resources
1213
+ cleanup() {
1214
+ if (this.animationFrameId) {
1215
+ cancelAnimationFrame(this.animationFrameId);
1216
+ }
1217
+ // Reset any applied styles (would need to track them)
1218
+ this.gpuElements = new WeakSet();
1219
+ }
1220
+ // Check if element has GPU acceleration enabled
1221
+ isAccelerated(element) {
1222
+ return this.gpuElements.has(element);
1223
+ }
1224
+ // Get optimization recommendations
1225
+ getRecommendations() {
1226
+ const recommendations = [];
1227
+ if (!this.gpuAccelerationEnabled) {
1228
+ recommendations.push('GPU acceleration not supported on this device');
1229
+ }
1230
+ else {
1231
+ recommendations.push('GPU acceleration enabled for smooth performance');
1232
+ recommendations.push('Using hardware-accelerated compositing');
1233
+ recommendations.push('Optimized for 60fps rendering');
1234
+ }
1235
+ return recommendations;
1236
+ }
1237
+ }
1238
+
1239
+ class Engine {
1240
+ constructor(config) {
1241
+ this.fetchMoreCallback = null;
1242
+ this.config = {
1243
+ ...config,
1244
+ bufferSize: config.bufferSize || 5
1245
+ };
1246
+ this.windowManager = new WindowManager(this.config.itemHeight, this.config.viewportHeight, this.config.bufferSize);
1247
+ this.prefetchManager = new PrefetchManager(this.config.bufferSize);
1248
+ this.requestQueue = new RequestQueue(1); // Single request at a time
1249
+ this.intelligentScrollDetector = new IntelligentScrollDetector();
1250
+ this.networkDetector = new NetworkSpeedDetector();
1251
+ this.networkAwarePrefetchManager = new NetworkAwarePrefetchManager(this.networkDetector);
1252
+ this.networkAwareRequestQueue = new NetworkAwareRequestQueue(this.networkDetector);
1253
+ this.adaptiveBufferCalculator = new AdaptiveBufferCalculator();
1254
+ this.performanceOptimizer = new PerformanceOptimizer();
1255
+ this.memoryManager = new MemoryManager(1000); // Cache up to 1000 items
1256
+ this.gpuAccelerator = new GPUAccelerator();
1257
+ this.totalItems = this.config.totalItems || Number.MAX_SAFE_INTEGER;
1258
+ this.state = {
1259
+ scrollTop: 0,
1260
+ visibleRange: { start: 0, end: 0 },
1261
+ loadedItems: 0,
1262
+ isLoading: false
1263
+ };
1264
+ }
1265
+ /**
1266
+ * Update scroll position and recalculate visible range with intelligent detection
1267
+ */
1268
+ async updateScrollPosition(scrollTop) {
1269
+ // Use performance optimizer to schedule updates efficiently
1270
+ this.performanceOptimizer.scheduleOptimizedUpdate(async () => {
1271
+ // Calculate velocity and other intelligent metrics
1272
+ const velocity = this.intelligentScrollDetector.calculateVelocity(scrollTop);
1273
+ this.intelligentScrollDetector.getDirection(velocity);
1274
+ // Get network quality for adaptive buffering
1275
+ const networkQuality = await this.networkDetector.assessConnectionQuality();
1276
+ // Calculate adaptive buffer considering all factors
1277
+ const adaptiveBuffer = await this.adaptiveBufferCalculator.calculateOptimalBuffer({
1278
+ scrollVelocity: velocity,
1279
+ networkQuality,
1280
+ baseBuffer: this.intelligentScrollDetector.calculateBuffer(velocity),
1281
+ visibleItems: [] // In a real implementation, this would be the actual visible items
1282
+ });
1283
+ // Update window manager with adaptive buffer
1284
+ this.windowManager.updateBufferSize(adaptiveBuffer);
1285
+ // Update memory manager with visible range
1286
+ this.memoryManager.setVisibleRange({
1287
+ start: Math.max(0, this.state.visibleRange.start - adaptiveBuffer),
1288
+ end: this.state.visibleRange.end + adaptiveBuffer
1289
+ });
1290
+ this.state.scrollTop = scrollTop;
1291
+ this.state.visibleRange = this.windowManager.calculateVisibleRange(scrollTop);
1292
+ // Check if we need to fetch more items
1293
+ if (await this.shouldFetchMore()) {
1294
+ await this.fetchMore();
1295
+ }
1296
+ });
1297
+ }
1298
+ /**
1299
+ * Get the current visible range
1300
+ */
1301
+ getVisibleRange() {
1302
+ return this.state.visibleRange;
1303
+ }
1304
+ /**
1305
+ * Check if more items should be fetched with intelligent and network-aware detection
1306
+ */
1307
+ async shouldFetchMore() {
1308
+ if (!this.fetchMoreCallback)
1309
+ return false;
1310
+ if (this.state.isLoading)
1311
+ return false;
1312
+ if (this.state.loadedItems >= this.totalItems)
1313
+ return false;
1314
+ // Get current velocity for intelligent prefetching
1315
+ const velocity = this.intelligentScrollDetector.calculateVelocity(this.state.scrollTop);
1316
+ // Get network quality for adaptive prefetching
1317
+ await this.networkDetector.assessConnectionQuality();
1318
+ // Calculate network-adjusted prefetch distance
1319
+ const prefetchDistance = await this.networkAwarePrefetchManager.calculateNetworkAdjustedPrefetch(velocity);
1320
+ // Use intelligent prefetch logic
1321
+ const visibleEnd = this.state.visibleRange.end;
1322
+ const totalLoaded = this.state.loadedItems;
1323
+ // Intelligent prefetch: if visible end is approaching the loaded boundary
1324
+ return visibleEnd >= totalLoaded - prefetchDistance;
1325
+ }
1326
+ /**
1327
+ * Fetch more items with network awareness
1328
+ */
1329
+ async fetchMore() {
1330
+ if (!this.fetchMoreCallback || this.state.isLoading)
1331
+ return;
1332
+ this.state.isLoading = true;
1333
+ try {
1334
+ // Use network-aware request queue
1335
+ const result = await this.networkAwareRequestQueue.add(this.fetchMoreCallback);
1336
+ // Assuming the result contains new items
1337
+ // In a real implementation, this would update the loaded items count
1338
+ this.state.loadedItems += Array.isArray(result) ? result.length : 1;
1339
+ }
1340
+ catch (error) {
1341
+ console.error('Error fetching more items:', error);
1342
+ }
1343
+ finally {
1344
+ this.state.isLoading = false;
1345
+ }
1346
+ }
1347
+ /**
1348
+ * Set the fetchMore callback function
1349
+ */
1350
+ setFetchMoreCallback(callback) {
1351
+ this.fetchMoreCallback = callback;
1352
+ }
1353
+ /**
1354
+ * Update total items count
1355
+ */
1356
+ updateTotalItems(count) {
1357
+ this.totalItems = count;
1358
+ }
1359
+ /**
1360
+ * Get current engine state
1361
+ */
1362
+ getState() {
1363
+ return { ...this.state };
1364
+ }
1365
+ /**
1366
+ * Update viewport dimensions
1367
+ */
1368
+ updateDimensions(viewportHeight, itemHeight) {
1369
+ this.windowManager.updateViewportHeight(viewportHeight);
1370
+ this.windowManager.updateItemHeight(itemHeight);
1371
+ // Recalculate visible range with new dimensions
1372
+ this.state.visibleRange = this.windowManager.calculateVisibleRange(this.state.scrollTop);
1373
+ }
1374
+ /**
1375
+ * Cleanup resources
1376
+ */
1377
+ cleanup() {
1378
+ this.requestQueue.clear();
1379
+ this.networkAwareRequestQueue.clear();
1380
+ this.fetchMoreCallback = null;
1381
+ this.intelligentScrollDetector.cleanup();
1382
+ this.performanceOptimizer.cleanup();
1383
+ this.memoryManager.clear();
1384
+ }
1385
+ }
1386
+
1387
+ const useLazyScroll = (config) => {
1388
+ const { fetchMore, ...engineConfig } = config;
1389
+ const engine = new Engine(engineConfig);
1390
+ engine.setFetchMoreCallback(fetchMore);
1391
+ const visibleRange = ref({ start: 0, end: 0 });
1392
+ const loadedItems = ref([]);
1393
+ const isLoading = ref(false);
1394
+ const containerRef = ref(null);
1395
+ const scrollTop = ref(0);
1396
+ // Initialize scroll listener
1397
+ let scrollHandler = null;
1398
+ onMounted(() => {
1399
+ if (containerRef.value) {
1400
+ scrollHandler = () => {
1401
+ if (containerRef.value) {
1402
+ scrollTop.value = containerRef.value.scrollTop;
1403
+ updateScrollPosition(scrollTop.value);
1404
+ }
1405
+ };
1406
+ containerRef.value.addEventListener('scroll', scrollHandler, { passive: true });
1407
+ }
1408
+ });
1409
+ onUnmounted(() => {
1410
+ if (containerRef.value && scrollHandler) {
1411
+ containerRef.value.removeEventListener('scroll', scrollHandler);
1412
+ }
1413
+ engine.cleanup();
1414
+ });
1415
+ // Watch for scroll position changes
1416
+ watch(scrollTop, (newScrollTop) => {
1417
+ updateScrollPosition(newScrollTop);
1418
+ });
1419
+ const updateScrollPosition = async (position) => {
1420
+ await engine.updateScrollPosition(position);
1421
+ const state = engine.getState();
1422
+ visibleRange.value = state.visibleRange;
1423
+ isLoading.value = state.isLoading;
1424
+ };
1425
+ // Refresh function
1426
+ const refresh = () => {
1427
+ if (containerRef.value) {
1428
+ updateScrollPosition(containerRef.value.scrollTop);
1429
+ }
1430
+ };
1431
+ return {
1432
+ visibleRange: computed(() => visibleRange.value),
1433
+ loadedItems: computed(() => loadedItems.value),
1434
+ isLoading: computed(() => isLoading.value),
1435
+ containerRef,
1436
+ refresh
1437
+ };
1438
+ };
1439
+
1440
+ export { useLazyScroll };
1441
+ //# sourceMappingURL=index.js.map