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