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