lazy-render-virtual-scroll 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/README.md +32 -319
  2. package/dist/adapters/react/index.d.ts +187 -1
  3. package/dist/cjs/adapters/react/LazyList.js +377 -0
  4. package/dist/cjs/adapters/react/LazyList.js.map +1 -1
  5. package/dist/cjs/adapters/react/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
  6. package/dist/cjs/adapters/react/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
  7. package/dist/cjs/adapters/react/adapters/react/components/IntelligentLazyList.d.ts +16 -0
  8. package/dist/cjs/adapters/react/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
  9. package/dist/cjs/adapters/react/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
  10. package/dist/cjs/adapters/react/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
  11. package/dist/cjs/adapters/react/adapters/react/components/index.d.ts +7 -0
  12. package/dist/cjs/adapters/react/adapters/react/components/index.d.ts.map +1 -0
  13. package/dist/cjs/adapters/react/adapters/react/hooks/index.d.ts +7 -0
  14. package/dist/cjs/adapters/react/adapters/react/hooks/index.d.ts.map +1 -0
  15. package/dist/cjs/adapters/react/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
  16. package/dist/cjs/adapters/react/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
  17. package/dist/cjs/adapters/react/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
  18. package/dist/cjs/adapters/react/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
  19. package/dist/cjs/adapters/react/adapters/react/hooks/useSmartPagination.d.ts +57 -0
  20. package/dist/cjs/adapters/react/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
  21. package/dist/cjs/adapters/react/adapters/react/index.d.ts +2 -0
  22. package/dist/cjs/adapters/react/adapters/react/index.d.ts.map +1 -1
  23. package/dist/cjs/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
  24. package/dist/cjs/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
  25. package/dist/cjs/adapters/react/components/IntelligentLazyList.d.ts +16 -0
  26. package/dist/cjs/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
  27. package/dist/cjs/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
  28. package/dist/cjs/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
  29. package/dist/cjs/adapters/react/components/index.d.ts +7 -0
  30. package/dist/cjs/adapters/react/components/index.d.ts.map +1 -0
  31. package/dist/cjs/adapters/react/core/BatchSizeOptimizer.d.ts +84 -0
  32. package/dist/cjs/adapters/react/core/BatchSizeOptimizer.d.ts.map +1 -0
  33. package/dist/cjs/adapters/react/core/DynamicHeightEngine.d.ts +107 -0
  34. package/dist/cjs/adapters/react/core/DynamicHeightEngine.d.ts.map +1 -0
  35. package/dist/cjs/adapters/react/core/Engine.d.ts +3 -0
  36. package/dist/cjs/adapters/react/core/Engine.d.ts.map +1 -1
  37. package/dist/cjs/adapters/react/core/HeightMeasurementCache.d.ts +92 -0
  38. package/dist/cjs/adapters/react/core/HeightMeasurementCache.d.ts.map +1 -0
  39. package/dist/cjs/adapters/react/core/IntelligentPagination.d.ts +113 -0
  40. package/dist/cjs/adapters/react/core/IntelligentPagination.d.ts.map +1 -0
  41. package/dist/cjs/adapters/react/core/PreemptiveCache.d.ts +83 -0
  42. package/dist/cjs/adapters/react/core/PreemptiveCache.d.ts.map +1 -0
  43. package/dist/cjs/adapters/react/core/PriorityRequestQueue.d.ts +56 -0
  44. package/dist/cjs/adapters/react/core/PriorityRequestQueue.d.ts.map +1 -0
  45. package/dist/cjs/adapters/react/core/RequestDeduplicator.d.ts +35 -0
  46. package/dist/cjs/adapters/react/core/RequestDeduplicator.d.ts.map +1 -0
  47. package/dist/cjs/adapters/react/core/SmartPrefetchAlgorithm.d.ts +63 -0
  48. package/dist/cjs/adapters/react/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
  49. package/dist/cjs/adapters/react/core/VariableHeightManager.d.ts +84 -0
  50. package/dist/cjs/adapters/react/core/VariableHeightManager.d.ts.map +1 -0
  51. package/dist/cjs/adapters/react/hooks/index.d.ts +7 -0
  52. package/dist/cjs/adapters/react/hooks/index.d.ts.map +1 -0
  53. package/dist/cjs/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
  54. package/dist/cjs/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
  55. package/dist/cjs/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
  56. package/dist/cjs/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
  57. package/dist/cjs/adapters/react/hooks/useSmartPagination.d.ts +57 -0
  58. package/dist/cjs/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
  59. package/dist/cjs/adapters/react/index.d.ts +9 -0
  60. package/dist/cjs/adapters/react/index.d.ts.map +1 -1
  61. package/dist/cjs/adapters/react/index.js +1738 -0
  62. package/dist/cjs/adapters/react/index.js.map +1 -1
  63. package/dist/cjs/adapters/react/useLazyList.js +377 -0
  64. package/dist/cjs/adapters/react/useLazyList.js.map +1 -1
  65. package/dist/cjs/angular/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
  66. package/dist/cjs/angular/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
  67. package/dist/cjs/angular/adapters/react/components/IntelligentLazyList.d.ts +16 -0
  68. package/dist/cjs/angular/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
  69. package/dist/cjs/angular/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
  70. package/dist/cjs/angular/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
  71. package/dist/cjs/angular/adapters/react/components/index.d.ts +7 -0
  72. package/dist/cjs/angular/adapters/react/components/index.d.ts.map +1 -0
  73. package/dist/cjs/angular/adapters/react/hooks/index.d.ts +7 -0
  74. package/dist/cjs/angular/adapters/react/hooks/index.d.ts.map +1 -0
  75. package/dist/cjs/angular/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
  76. package/dist/cjs/angular/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
  77. package/dist/cjs/angular/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
  78. package/dist/cjs/angular/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
  79. package/dist/cjs/angular/adapters/react/hooks/useSmartPagination.d.ts +57 -0
  80. package/dist/cjs/angular/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
  81. package/dist/cjs/angular/adapters/react/index.d.ts +2 -0
  82. package/dist/cjs/angular/adapters/react/index.d.ts.map +1 -1
  83. package/dist/cjs/angular/core/BatchSizeOptimizer.d.ts +84 -0
  84. package/dist/cjs/angular/core/BatchSizeOptimizer.d.ts.map +1 -0
  85. package/dist/cjs/angular/core/DynamicHeightEngine.d.ts +107 -0
  86. package/dist/cjs/angular/core/DynamicHeightEngine.d.ts.map +1 -0
  87. package/dist/cjs/angular/core/Engine.d.ts +3 -0
  88. package/dist/cjs/angular/core/Engine.d.ts.map +1 -1
  89. package/dist/cjs/angular/core/HeightMeasurementCache.d.ts +92 -0
  90. package/dist/cjs/angular/core/HeightMeasurementCache.d.ts.map +1 -0
  91. package/dist/cjs/angular/core/IntelligentPagination.d.ts +113 -0
  92. package/dist/cjs/angular/core/IntelligentPagination.d.ts.map +1 -0
  93. package/dist/cjs/angular/core/PreemptiveCache.d.ts +83 -0
  94. package/dist/cjs/angular/core/PreemptiveCache.d.ts.map +1 -0
  95. package/dist/cjs/angular/core/PriorityRequestQueue.d.ts +56 -0
  96. package/dist/cjs/angular/core/PriorityRequestQueue.d.ts.map +1 -0
  97. package/dist/cjs/angular/core/RequestDeduplicator.d.ts +35 -0
  98. package/dist/cjs/angular/core/RequestDeduplicator.d.ts.map +1 -0
  99. package/dist/cjs/angular/core/SmartPrefetchAlgorithm.d.ts +63 -0
  100. package/dist/cjs/angular/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
  101. package/dist/cjs/angular/core/VariableHeightManager.d.ts +84 -0
  102. package/dist/cjs/angular/core/VariableHeightManager.d.ts.map +1 -0
  103. package/dist/cjs/angular/index.d.ts +9 -0
  104. package/dist/cjs/angular/index.d.ts.map +1 -1
  105. package/dist/cjs/angular/index.js +377 -0
  106. package/dist/cjs/angular/index.js.map +1 -1
  107. package/dist/cjs/core/BatchSizeOptimizer.d.ts +84 -0
  108. package/dist/cjs/core/BatchSizeOptimizer.d.ts.map +1 -0
  109. package/dist/cjs/core/DynamicHeightEngine.d.ts +107 -0
  110. package/dist/cjs/core/DynamicHeightEngine.d.ts.map +1 -0
  111. package/dist/cjs/core/Engine.d.ts +3 -0
  112. package/dist/cjs/core/Engine.d.ts.map +1 -1
  113. package/dist/cjs/core/HeightMeasurementCache.d.ts +92 -0
  114. package/dist/cjs/core/HeightMeasurementCache.d.ts.map +1 -0
  115. package/dist/cjs/core/IntelligentPagination.d.ts +113 -0
  116. package/dist/cjs/core/IntelligentPagination.d.ts.map +1 -0
  117. package/dist/cjs/core/PreemptiveCache.d.ts +83 -0
  118. package/dist/cjs/core/PreemptiveCache.d.ts.map +1 -0
  119. package/dist/cjs/core/PriorityRequestQueue.d.ts +56 -0
  120. package/dist/cjs/core/PriorityRequestQueue.d.ts.map +1 -0
  121. package/dist/cjs/core/RequestDeduplicator.d.ts +35 -0
  122. package/dist/cjs/core/RequestDeduplicator.d.ts.map +1 -0
  123. package/dist/cjs/core/SmartPrefetchAlgorithm.d.ts +63 -0
  124. package/dist/cjs/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
  125. package/dist/cjs/core/VariableHeightManager.d.ts +84 -0
  126. package/dist/cjs/core/VariableHeightManager.d.ts.map +1 -0
  127. package/dist/cjs/index.d.ts +9 -0
  128. package/dist/cjs/index.d.ts.map +1 -1
  129. package/dist/cjs/index.js +1545 -0
  130. package/dist/cjs/index.js.map +1 -1
  131. package/dist/cjs/svelte/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
  132. package/dist/cjs/svelte/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
  133. package/dist/cjs/svelte/adapters/react/components/IntelligentLazyList.d.ts +16 -0
  134. package/dist/cjs/svelte/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
  135. package/dist/cjs/svelte/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
  136. package/dist/cjs/svelte/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
  137. package/dist/cjs/svelte/adapters/react/components/index.d.ts +7 -0
  138. package/dist/cjs/svelte/adapters/react/components/index.d.ts.map +1 -0
  139. package/dist/cjs/svelte/adapters/react/hooks/index.d.ts +7 -0
  140. package/dist/cjs/svelte/adapters/react/hooks/index.d.ts.map +1 -0
  141. package/dist/cjs/svelte/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
  142. package/dist/cjs/svelte/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
  143. package/dist/cjs/svelte/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
  144. package/dist/cjs/svelte/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
  145. package/dist/cjs/svelte/adapters/react/hooks/useSmartPagination.d.ts +57 -0
  146. package/dist/cjs/svelte/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
  147. package/dist/cjs/svelte/adapters/react/index.d.ts +2 -0
  148. package/dist/cjs/svelte/adapters/react/index.d.ts.map +1 -1
  149. package/dist/cjs/svelte/core/BatchSizeOptimizer.d.ts +84 -0
  150. package/dist/cjs/svelte/core/BatchSizeOptimizer.d.ts.map +1 -0
  151. package/dist/cjs/svelte/core/DynamicHeightEngine.d.ts +107 -0
  152. package/dist/cjs/svelte/core/DynamicHeightEngine.d.ts.map +1 -0
  153. package/dist/cjs/svelte/core/Engine.d.ts +3 -0
  154. package/dist/cjs/svelte/core/Engine.d.ts.map +1 -1
  155. package/dist/cjs/svelte/core/HeightMeasurementCache.d.ts +92 -0
  156. package/dist/cjs/svelte/core/HeightMeasurementCache.d.ts.map +1 -0
  157. package/dist/cjs/svelte/core/IntelligentPagination.d.ts +113 -0
  158. package/dist/cjs/svelte/core/IntelligentPagination.d.ts.map +1 -0
  159. package/dist/cjs/svelte/core/PreemptiveCache.d.ts +83 -0
  160. package/dist/cjs/svelte/core/PreemptiveCache.d.ts.map +1 -0
  161. package/dist/cjs/svelte/core/PriorityRequestQueue.d.ts +56 -0
  162. package/dist/cjs/svelte/core/PriorityRequestQueue.d.ts.map +1 -0
  163. package/dist/cjs/svelte/core/RequestDeduplicator.d.ts +35 -0
  164. package/dist/cjs/svelte/core/RequestDeduplicator.d.ts.map +1 -0
  165. package/dist/cjs/svelte/core/SmartPrefetchAlgorithm.d.ts +63 -0
  166. package/dist/cjs/svelte/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
  167. package/dist/cjs/svelte/core/VariableHeightManager.d.ts +84 -0
  168. package/dist/cjs/svelte/core/VariableHeightManager.d.ts.map +1 -0
  169. package/dist/cjs/svelte/index.d.ts +9 -0
  170. package/dist/cjs/svelte/index.d.ts.map +1 -1
  171. package/dist/cjs/svelte/index.js +377 -0
  172. package/dist/cjs/svelte/index.js.map +1 -1
  173. package/dist/cjs/vue/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
  174. package/dist/cjs/vue/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
  175. package/dist/cjs/vue/adapters/react/components/IntelligentLazyList.d.ts +16 -0
  176. package/dist/cjs/vue/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
  177. package/dist/cjs/vue/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
  178. package/dist/cjs/vue/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
  179. package/dist/cjs/vue/adapters/react/components/index.d.ts +7 -0
  180. package/dist/cjs/vue/adapters/react/components/index.d.ts.map +1 -0
  181. package/dist/cjs/vue/adapters/react/hooks/index.d.ts +7 -0
  182. package/dist/cjs/vue/adapters/react/hooks/index.d.ts.map +1 -0
  183. package/dist/cjs/vue/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
  184. package/dist/cjs/vue/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
  185. package/dist/cjs/vue/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
  186. package/dist/cjs/vue/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
  187. package/dist/cjs/vue/adapters/react/hooks/useSmartPagination.d.ts +57 -0
  188. package/dist/cjs/vue/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
  189. package/dist/cjs/vue/adapters/react/index.d.ts +2 -0
  190. package/dist/cjs/vue/adapters/react/index.d.ts.map +1 -1
  191. package/dist/cjs/vue/core/BatchSizeOptimizer.d.ts +84 -0
  192. package/dist/cjs/vue/core/BatchSizeOptimizer.d.ts.map +1 -0
  193. package/dist/cjs/vue/core/DynamicHeightEngine.d.ts +107 -0
  194. package/dist/cjs/vue/core/DynamicHeightEngine.d.ts.map +1 -0
  195. package/dist/cjs/vue/core/Engine.d.ts +3 -0
  196. package/dist/cjs/vue/core/Engine.d.ts.map +1 -1
  197. package/dist/cjs/vue/core/HeightMeasurementCache.d.ts +92 -0
  198. package/dist/cjs/vue/core/HeightMeasurementCache.d.ts.map +1 -0
  199. package/dist/cjs/vue/core/IntelligentPagination.d.ts +113 -0
  200. package/dist/cjs/vue/core/IntelligentPagination.d.ts.map +1 -0
  201. package/dist/cjs/vue/core/PreemptiveCache.d.ts +83 -0
  202. package/dist/cjs/vue/core/PreemptiveCache.d.ts.map +1 -0
  203. package/dist/cjs/vue/core/PriorityRequestQueue.d.ts +56 -0
  204. package/dist/cjs/vue/core/PriorityRequestQueue.d.ts.map +1 -0
  205. package/dist/cjs/vue/core/RequestDeduplicator.d.ts +35 -0
  206. package/dist/cjs/vue/core/RequestDeduplicator.d.ts.map +1 -0
  207. package/dist/cjs/vue/core/SmartPrefetchAlgorithm.d.ts +63 -0
  208. package/dist/cjs/vue/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
  209. package/dist/cjs/vue/core/VariableHeightManager.d.ts +84 -0
  210. package/dist/cjs/vue/core/VariableHeightManager.d.ts.map +1 -0
  211. package/dist/cjs/vue/index.d.ts +9 -0
  212. package/dist/cjs/vue/index.d.ts.map +1 -1
  213. package/dist/cjs/vue/index.js +377 -0
  214. package/dist/cjs/vue/index.js.map +1 -1
  215. package/dist/esm/adapters/react/LazyList.js +377 -0
  216. package/dist/esm/adapters/react/LazyList.js.map +1 -1
  217. package/dist/esm/adapters/react/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
  218. package/dist/esm/adapters/react/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
  219. package/dist/esm/adapters/react/adapters/react/components/IntelligentLazyList.d.ts +16 -0
  220. package/dist/esm/adapters/react/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
  221. package/dist/esm/adapters/react/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
  222. package/dist/esm/adapters/react/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
  223. package/dist/esm/adapters/react/adapters/react/components/index.d.ts +7 -0
  224. package/dist/esm/adapters/react/adapters/react/components/index.d.ts.map +1 -0
  225. package/dist/esm/adapters/react/adapters/react/hooks/index.d.ts +7 -0
  226. package/dist/esm/adapters/react/adapters/react/hooks/index.d.ts.map +1 -0
  227. package/dist/esm/adapters/react/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
  228. package/dist/esm/adapters/react/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
  229. package/dist/esm/adapters/react/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
  230. package/dist/esm/adapters/react/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
  231. package/dist/esm/adapters/react/adapters/react/hooks/useSmartPagination.d.ts +57 -0
  232. package/dist/esm/adapters/react/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
  233. package/dist/esm/adapters/react/adapters/react/index.d.ts +2 -0
  234. package/dist/esm/adapters/react/adapters/react/index.d.ts.map +1 -1
  235. package/dist/esm/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
  236. package/dist/esm/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
  237. package/dist/esm/adapters/react/components/IntelligentLazyList.d.ts +16 -0
  238. package/dist/esm/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
  239. package/dist/esm/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
  240. package/dist/esm/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
  241. package/dist/esm/adapters/react/components/index.d.ts +7 -0
  242. package/dist/esm/adapters/react/components/index.d.ts.map +1 -0
  243. package/dist/esm/adapters/react/core/BatchSizeOptimizer.d.ts +84 -0
  244. package/dist/esm/adapters/react/core/BatchSizeOptimizer.d.ts.map +1 -0
  245. package/dist/esm/adapters/react/core/DynamicHeightEngine.d.ts +107 -0
  246. package/dist/esm/adapters/react/core/DynamicHeightEngine.d.ts.map +1 -0
  247. package/dist/esm/adapters/react/core/Engine.d.ts +3 -0
  248. package/dist/esm/adapters/react/core/Engine.d.ts.map +1 -1
  249. package/dist/esm/adapters/react/core/HeightMeasurementCache.d.ts +92 -0
  250. package/dist/esm/adapters/react/core/HeightMeasurementCache.d.ts.map +1 -0
  251. package/dist/esm/adapters/react/core/IntelligentPagination.d.ts +113 -0
  252. package/dist/esm/adapters/react/core/IntelligentPagination.d.ts.map +1 -0
  253. package/dist/esm/adapters/react/core/PreemptiveCache.d.ts +83 -0
  254. package/dist/esm/adapters/react/core/PreemptiveCache.d.ts.map +1 -0
  255. package/dist/esm/adapters/react/core/PriorityRequestQueue.d.ts +56 -0
  256. package/dist/esm/adapters/react/core/PriorityRequestQueue.d.ts.map +1 -0
  257. package/dist/esm/adapters/react/core/RequestDeduplicator.d.ts +35 -0
  258. package/dist/esm/adapters/react/core/RequestDeduplicator.d.ts.map +1 -0
  259. package/dist/esm/adapters/react/core/SmartPrefetchAlgorithm.d.ts +63 -0
  260. package/dist/esm/adapters/react/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
  261. package/dist/esm/adapters/react/core/VariableHeightManager.d.ts +84 -0
  262. package/dist/esm/adapters/react/core/VariableHeightManager.d.ts.map +1 -0
  263. package/dist/esm/adapters/react/hooks/index.d.ts +7 -0
  264. package/dist/esm/adapters/react/hooks/index.d.ts.map +1 -0
  265. package/dist/esm/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
  266. package/dist/esm/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
  267. package/dist/esm/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
  268. package/dist/esm/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
  269. package/dist/esm/adapters/react/hooks/useSmartPagination.d.ts +57 -0
  270. package/dist/esm/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
  271. package/dist/esm/adapters/react/index.d.ts +9 -0
  272. package/dist/esm/adapters/react/index.d.ts.map +1 -1
  273. package/dist/esm/adapters/react/index.js +1733 -1
  274. package/dist/esm/adapters/react/index.js.map +1 -1
  275. package/dist/esm/adapters/react/useLazyList.js +377 -0
  276. package/dist/esm/adapters/react/useLazyList.js.map +1 -1
  277. package/dist/esm/angular/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
  278. package/dist/esm/angular/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
  279. package/dist/esm/angular/adapters/react/components/IntelligentLazyList.d.ts +16 -0
  280. package/dist/esm/angular/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
  281. package/dist/esm/angular/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
  282. package/dist/esm/angular/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
  283. package/dist/esm/angular/adapters/react/components/index.d.ts +7 -0
  284. package/dist/esm/angular/adapters/react/components/index.d.ts.map +1 -0
  285. package/dist/esm/angular/adapters/react/hooks/index.d.ts +7 -0
  286. package/dist/esm/angular/adapters/react/hooks/index.d.ts.map +1 -0
  287. package/dist/esm/angular/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
  288. package/dist/esm/angular/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
  289. package/dist/esm/angular/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
  290. package/dist/esm/angular/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
  291. package/dist/esm/angular/adapters/react/hooks/useSmartPagination.d.ts +57 -0
  292. package/dist/esm/angular/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
  293. package/dist/esm/angular/adapters/react/index.d.ts +2 -0
  294. package/dist/esm/angular/adapters/react/index.d.ts.map +1 -1
  295. package/dist/esm/angular/core/BatchSizeOptimizer.d.ts +84 -0
  296. package/dist/esm/angular/core/BatchSizeOptimizer.d.ts.map +1 -0
  297. package/dist/esm/angular/core/DynamicHeightEngine.d.ts +107 -0
  298. package/dist/esm/angular/core/DynamicHeightEngine.d.ts.map +1 -0
  299. package/dist/esm/angular/core/Engine.d.ts +3 -0
  300. package/dist/esm/angular/core/Engine.d.ts.map +1 -1
  301. package/dist/esm/angular/core/HeightMeasurementCache.d.ts +92 -0
  302. package/dist/esm/angular/core/HeightMeasurementCache.d.ts.map +1 -0
  303. package/dist/esm/angular/core/IntelligentPagination.d.ts +113 -0
  304. package/dist/esm/angular/core/IntelligentPagination.d.ts.map +1 -0
  305. package/dist/esm/angular/core/PreemptiveCache.d.ts +83 -0
  306. package/dist/esm/angular/core/PreemptiveCache.d.ts.map +1 -0
  307. package/dist/esm/angular/core/PriorityRequestQueue.d.ts +56 -0
  308. package/dist/esm/angular/core/PriorityRequestQueue.d.ts.map +1 -0
  309. package/dist/esm/angular/core/RequestDeduplicator.d.ts +35 -0
  310. package/dist/esm/angular/core/RequestDeduplicator.d.ts.map +1 -0
  311. package/dist/esm/angular/core/SmartPrefetchAlgorithm.d.ts +63 -0
  312. package/dist/esm/angular/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
  313. package/dist/esm/angular/core/VariableHeightManager.d.ts +84 -0
  314. package/dist/esm/angular/core/VariableHeightManager.d.ts.map +1 -0
  315. package/dist/esm/angular/index.d.ts +9 -0
  316. package/dist/esm/angular/index.d.ts.map +1 -1
  317. package/dist/esm/angular/index.js +377 -0
  318. package/dist/esm/angular/index.js.map +1 -1
  319. package/dist/esm/core/BatchSizeOptimizer.d.ts +84 -0
  320. package/dist/esm/core/BatchSizeOptimizer.d.ts.map +1 -0
  321. package/dist/esm/core/DynamicHeightEngine.d.ts +107 -0
  322. package/dist/esm/core/DynamicHeightEngine.d.ts.map +1 -0
  323. package/dist/esm/core/Engine.d.ts +3 -0
  324. package/dist/esm/core/Engine.d.ts.map +1 -1
  325. package/dist/esm/core/HeightMeasurementCache.d.ts +92 -0
  326. package/dist/esm/core/HeightMeasurementCache.d.ts.map +1 -0
  327. package/dist/esm/core/IntelligentPagination.d.ts +113 -0
  328. package/dist/esm/core/IntelligentPagination.d.ts.map +1 -0
  329. package/dist/esm/core/PreemptiveCache.d.ts +83 -0
  330. package/dist/esm/core/PreemptiveCache.d.ts.map +1 -0
  331. package/dist/esm/core/PriorityRequestQueue.d.ts +56 -0
  332. package/dist/esm/core/PriorityRequestQueue.d.ts.map +1 -0
  333. package/dist/esm/core/RequestDeduplicator.d.ts +35 -0
  334. package/dist/esm/core/RequestDeduplicator.d.ts.map +1 -0
  335. package/dist/esm/core/SmartPrefetchAlgorithm.d.ts +63 -0
  336. package/dist/esm/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
  337. package/dist/esm/core/VariableHeightManager.d.ts +84 -0
  338. package/dist/esm/core/VariableHeightManager.d.ts.map +1 -0
  339. package/dist/esm/index.d.ts +9 -0
  340. package/dist/esm/index.d.ts.map +1 -1
  341. package/dist/esm/index.js +1537 -1
  342. package/dist/esm/index.js.map +1 -1
  343. package/dist/esm/svelte/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
  344. package/dist/esm/svelte/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
  345. package/dist/esm/svelte/adapters/react/components/IntelligentLazyList.d.ts +16 -0
  346. package/dist/esm/svelte/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
  347. package/dist/esm/svelte/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
  348. package/dist/esm/svelte/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
  349. package/dist/esm/svelte/adapters/react/components/index.d.ts +7 -0
  350. package/dist/esm/svelte/adapters/react/components/index.d.ts.map +1 -0
  351. package/dist/esm/svelte/adapters/react/hooks/index.d.ts +7 -0
  352. package/dist/esm/svelte/adapters/react/hooks/index.d.ts.map +1 -0
  353. package/dist/esm/svelte/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
  354. package/dist/esm/svelte/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
  355. package/dist/esm/svelte/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
  356. package/dist/esm/svelte/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
  357. package/dist/esm/svelte/adapters/react/hooks/useSmartPagination.d.ts +57 -0
  358. package/dist/esm/svelte/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
  359. package/dist/esm/svelte/adapters/react/index.d.ts +2 -0
  360. package/dist/esm/svelte/adapters/react/index.d.ts.map +1 -1
  361. package/dist/esm/svelte/core/BatchSizeOptimizer.d.ts +84 -0
  362. package/dist/esm/svelte/core/BatchSizeOptimizer.d.ts.map +1 -0
  363. package/dist/esm/svelte/core/DynamicHeightEngine.d.ts +107 -0
  364. package/dist/esm/svelte/core/DynamicHeightEngine.d.ts.map +1 -0
  365. package/dist/esm/svelte/core/Engine.d.ts +3 -0
  366. package/dist/esm/svelte/core/Engine.d.ts.map +1 -1
  367. package/dist/esm/svelte/core/HeightMeasurementCache.d.ts +92 -0
  368. package/dist/esm/svelte/core/HeightMeasurementCache.d.ts.map +1 -0
  369. package/dist/esm/svelte/core/IntelligentPagination.d.ts +113 -0
  370. package/dist/esm/svelte/core/IntelligentPagination.d.ts.map +1 -0
  371. package/dist/esm/svelte/core/PreemptiveCache.d.ts +83 -0
  372. package/dist/esm/svelte/core/PreemptiveCache.d.ts.map +1 -0
  373. package/dist/esm/svelte/core/PriorityRequestQueue.d.ts +56 -0
  374. package/dist/esm/svelte/core/PriorityRequestQueue.d.ts.map +1 -0
  375. package/dist/esm/svelte/core/RequestDeduplicator.d.ts +35 -0
  376. package/dist/esm/svelte/core/RequestDeduplicator.d.ts.map +1 -0
  377. package/dist/esm/svelte/core/SmartPrefetchAlgorithm.d.ts +63 -0
  378. package/dist/esm/svelte/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
  379. package/dist/esm/svelte/core/VariableHeightManager.d.ts +84 -0
  380. package/dist/esm/svelte/core/VariableHeightManager.d.ts.map +1 -0
  381. package/dist/esm/svelte/index.d.ts +9 -0
  382. package/dist/esm/svelte/index.d.ts.map +1 -1
  383. package/dist/esm/svelte/index.js +377 -0
  384. package/dist/esm/svelte/index.js.map +1 -1
  385. package/dist/esm/vue/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
  386. package/dist/esm/vue/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
  387. package/dist/esm/vue/adapters/react/components/IntelligentLazyList.d.ts +16 -0
  388. package/dist/esm/vue/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
  389. package/dist/esm/vue/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
  390. package/dist/esm/vue/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
  391. package/dist/esm/vue/adapters/react/components/index.d.ts +7 -0
  392. package/dist/esm/vue/adapters/react/components/index.d.ts.map +1 -0
  393. package/dist/esm/vue/adapters/react/hooks/index.d.ts +7 -0
  394. package/dist/esm/vue/adapters/react/hooks/index.d.ts.map +1 -0
  395. package/dist/esm/vue/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
  396. package/dist/esm/vue/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
  397. package/dist/esm/vue/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
  398. package/dist/esm/vue/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
  399. package/dist/esm/vue/adapters/react/hooks/useSmartPagination.d.ts +57 -0
  400. package/dist/esm/vue/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
  401. package/dist/esm/vue/adapters/react/index.d.ts +2 -0
  402. package/dist/esm/vue/adapters/react/index.d.ts.map +1 -1
  403. package/dist/esm/vue/core/BatchSizeOptimizer.d.ts +84 -0
  404. package/dist/esm/vue/core/BatchSizeOptimizer.d.ts.map +1 -0
  405. package/dist/esm/vue/core/DynamicHeightEngine.d.ts +107 -0
  406. package/dist/esm/vue/core/DynamicHeightEngine.d.ts.map +1 -0
  407. package/dist/esm/vue/core/Engine.d.ts +3 -0
  408. package/dist/esm/vue/core/Engine.d.ts.map +1 -1
  409. package/dist/esm/vue/core/HeightMeasurementCache.d.ts +92 -0
  410. package/dist/esm/vue/core/HeightMeasurementCache.d.ts.map +1 -0
  411. package/dist/esm/vue/core/IntelligentPagination.d.ts +113 -0
  412. package/dist/esm/vue/core/IntelligentPagination.d.ts.map +1 -0
  413. package/dist/esm/vue/core/PreemptiveCache.d.ts +83 -0
  414. package/dist/esm/vue/core/PreemptiveCache.d.ts.map +1 -0
  415. package/dist/esm/vue/core/PriorityRequestQueue.d.ts +56 -0
  416. package/dist/esm/vue/core/PriorityRequestQueue.d.ts.map +1 -0
  417. package/dist/esm/vue/core/RequestDeduplicator.d.ts +35 -0
  418. package/dist/esm/vue/core/RequestDeduplicator.d.ts.map +1 -0
  419. package/dist/esm/vue/core/SmartPrefetchAlgorithm.d.ts +63 -0
  420. package/dist/esm/vue/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
  421. package/dist/esm/vue/core/VariableHeightManager.d.ts +84 -0
  422. package/dist/esm/vue/core/VariableHeightManager.d.ts.map +1 -0
  423. package/dist/esm/vue/index.d.ts +9 -0
  424. package/dist/esm/vue/index.d.ts.map +1 -1
  425. package/dist/esm/vue/index.js +377 -0
  426. package/dist/esm/vue/index.js.map +1 -1
  427. package/dist/index.d.ts +681 -1
  428. package/package.json +1 -1
@@ -1238,6 +1238,380 @@ class GPUAccelerator {
1238
1238
  }
1239
1239
  }
1240
1240
 
1241
+ /**
1242
+ * Batch Size Optimizer
1243
+ * Dynamically adjusts batch size based on scroll speed, network, and performance
1244
+ */
1245
+ class BatchSizeOptimizer {
1246
+ constructor(config, networkDetector, performanceMonitor) {
1247
+ this.scrollSpeedHistory = [];
1248
+ this.renderTimeHistory = [];
1249
+ this.HISTORY_SIZE = 10;
1250
+ this.config = {
1251
+ minBatchSize: (config === null || config === void 0 ? void 0 : config.minBatchSize) || 10,
1252
+ maxBatchSize: (config === null || config === void 0 ? void 0 : config.maxBatchSize) || 100,
1253
+ baseBatchSize: (config === null || config === void 0 ? void 0 : config.baseBatchSize) || 50,
1254
+ scrollSpeedThreshold: (config === null || config === void 0 ? void 0 : config.scrollSpeedThreshold) || 1.0
1255
+ };
1256
+ this.currentBatchSize = this.config.baseBatchSize;
1257
+ this.networkDetector = networkDetector || new NetworkSpeedDetector();
1258
+ this.performanceMonitor = performanceMonitor || new DevicePerformanceMonitor();
1259
+ }
1260
+ /**
1261
+ * Calculate optimal batch size based on all factors
1262
+ */
1263
+ async calculateOptimalBatchSize(scrollSpeed) {
1264
+ // Track scroll speed history
1265
+ this.trackScrollSpeed(scrollSpeed);
1266
+ // Get network quality
1267
+ const networkQuality = await this.networkDetector.assessConnectionQuality();
1268
+ // Get performance score
1269
+ const performanceScore = await this.performanceMonitor.assessPerformance();
1270
+ // Calculate batch size based on scroll speed
1271
+ const speedMultiplier = this.calculateSpeedMultiplier(scrollSpeed);
1272
+ // Calculate batch size based on network
1273
+ const networkMultiplier = this.calculateNetworkMultiplier(networkQuality);
1274
+ // Calculate batch size based on performance
1275
+ const performanceMultiplier = this.calculatePerformanceMultiplier(performanceScore);
1276
+ // Calculate final batch size
1277
+ const optimalBatchSize = Math.round(this.config.baseBatchSize * speedMultiplier * networkMultiplier * performanceMultiplier);
1278
+ // Apply min/max bounds
1279
+ this.currentBatchSize = Math.max(this.config.minBatchSize, Math.min(this.config.maxBatchSize, optimalBatchSize));
1280
+ return this.currentBatchSize;
1281
+ }
1282
+ /**
1283
+ * Calculate multiplier based on scroll speed
1284
+ */
1285
+ calculateSpeedMultiplier(scrollSpeed) {
1286
+ const avgScrollSpeed = this.getAverageScrollSpeed();
1287
+ // Fast scrolling = larger batches (preload more)
1288
+ if (Math.abs(avgScrollSpeed) > this.config.scrollSpeedThreshold * 2) {
1289
+ return 1.5; // 50% more items
1290
+ }
1291
+ else if (Math.abs(avgScrollSpeed) > this.config.scrollSpeedThreshold) {
1292
+ return 1.2; // 20% more items
1293
+ }
1294
+ else if (Math.abs(avgScrollSpeed) < 0.3) {
1295
+ return 0.8; // 20% fewer items (user reading carefully)
1296
+ }
1297
+ return 1.0; // Normal batch size
1298
+ }
1299
+ /**
1300
+ * Calculate multiplier based on network quality
1301
+ */
1302
+ calculateNetworkMultiplier(quality) {
1303
+ switch (quality) {
1304
+ case 'excellent':
1305
+ return 1.3; // Load more on fast network
1306
+ case 'good':
1307
+ return 1.1; // Slightly more
1308
+ case 'poor':
1309
+ return 0.6; // Load less on slow network
1310
+ case 'offline':
1311
+ return 0.3; // Minimal loading when offline
1312
+ default:
1313
+ return 1.0;
1314
+ }
1315
+ }
1316
+ /**
1317
+ * Calculate multiplier based on device performance
1318
+ */
1319
+ calculatePerformanceMultiplier(score) {
1320
+ // score is 0-1 (0 = poor, 1 = excellent)
1321
+ if (score > 0.8) {
1322
+ return 1.2; // High-performance device
1323
+ }
1324
+ else if (score > 0.5) {
1325
+ return 1.0; // Average device
1326
+ }
1327
+ else {
1328
+ return 0.7; // Low-performance device
1329
+ }
1330
+ }
1331
+ /**
1332
+ * Track scroll speed for averaging
1333
+ */
1334
+ trackScrollSpeed(speed) {
1335
+ this.scrollSpeedHistory.push(speed);
1336
+ if (this.scrollSpeedHistory.length > this.HISTORY_SIZE) {
1337
+ this.scrollSpeedHistory.shift();
1338
+ }
1339
+ }
1340
+ /**
1341
+ * Get average scroll speed
1342
+ */
1343
+ getAverageScrollSpeed() {
1344
+ if (this.scrollSpeedHistory.length === 0)
1345
+ return 0;
1346
+ const sum = this.scrollSpeedHistory.reduce((a, b) => a + b, 0);
1347
+ return sum / this.scrollSpeedHistory.length;
1348
+ }
1349
+ /**
1350
+ * Track render time for performance monitoring
1351
+ */
1352
+ trackRenderTime(renderTime) {
1353
+ this.renderTimeHistory.push(renderTime);
1354
+ if (this.renderTimeHistory.length > this.HISTORY_SIZE) {
1355
+ this.renderTimeHistory.shift();
1356
+ }
1357
+ }
1358
+ /**
1359
+ * Get average render time
1360
+ */
1361
+ getAverageRenderTime() {
1362
+ if (this.renderTimeHistory.length === 0)
1363
+ return 0;
1364
+ const sum = this.renderTimeHistory.reduce((a, b) => a + b, 0);
1365
+ return sum / this.renderTimeHistory.length;
1366
+ }
1367
+ /**
1368
+ * Get current batch metrics
1369
+ */
1370
+ getMetrics() {
1371
+ return {
1372
+ currentBatchSize: this.currentBatchSize,
1373
+ scrollSpeed: this.getAverageScrollSpeed(),
1374
+ networkQuality: 'good', // Would need to cache this
1375
+ performanceScore: 0.8, // Would need to cache this
1376
+ avgRenderTime: this.getAverageRenderTime()
1377
+ };
1378
+ }
1379
+ /**
1380
+ * Get current batch size
1381
+ */
1382
+ getCurrentBatchSize() {
1383
+ return this.currentBatchSize;
1384
+ }
1385
+ /**
1386
+ * Reset optimizer
1387
+ */
1388
+ reset() {
1389
+ this.scrollSpeedHistory = [];
1390
+ this.renderTimeHistory = [];
1391
+ this.currentBatchSize = this.config.baseBatchSize;
1392
+ }
1393
+ /**
1394
+ * Get optimization statistics
1395
+ */
1396
+ getStats() {
1397
+ return {
1398
+ avgScrollSpeed: this.getAverageScrollSpeed(),
1399
+ avgRenderTime: this.getAverageRenderTime(),
1400
+ currentBatchSize: this.currentBatchSize,
1401
+ totalAdjustments: this.scrollSpeedHistory.length
1402
+ };
1403
+ }
1404
+ }
1405
+
1406
+ /**
1407
+ * Request Deduplication
1408
+ * Prevents duplicate requests from being sent
1409
+ */
1410
+ class RequestDeduplicator {
1411
+ constructor() {
1412
+ this.pendingRequests = new Map();
1413
+ this.requestCount = new Map();
1414
+ }
1415
+ /**
1416
+ * Execute request with deduplication
1417
+ * If same request is already pending, return existing promise
1418
+ */
1419
+ async request(key, requestFn, ttl = 5000 // Time to live in ms
1420
+ ) {
1421
+ // Check if same request is already pending
1422
+ if (this.pendingRequests.has(key)) {
1423
+ console.log(`[RequestDeduplicator] Deduplicating request: ${key}`);
1424
+ return this.pendingRequests.get(key);
1425
+ }
1426
+ // Create new request
1427
+ const promise = requestFn()
1428
+ .then(result => {
1429
+ this.pendingRequests.delete(key);
1430
+ this.requestCount.delete(key);
1431
+ return result;
1432
+ })
1433
+ .catch(error => {
1434
+ this.pendingRequests.delete(key);
1435
+ this.requestCount.delete(key);
1436
+ throw error;
1437
+ });
1438
+ // Store pending request
1439
+ this.pendingRequests.set(key, promise);
1440
+ // Track request count for analytics
1441
+ const count = this.requestCount.get(key) || 0;
1442
+ this.requestCount.set(key, count + 1);
1443
+ // Auto cleanup after TTL
1444
+ setTimeout(() => {
1445
+ if (this.pendingRequests.has(key)) {
1446
+ this.pendingRequests.delete(key);
1447
+ }
1448
+ }, ttl);
1449
+ return promise;
1450
+ }
1451
+ /**
1452
+ * Clear specific request
1453
+ */
1454
+ clear(key) {
1455
+ this.pendingRequests.delete(key);
1456
+ this.requestCount.delete(key);
1457
+ }
1458
+ /**
1459
+ * Clear all requests
1460
+ */
1461
+ clearAll() {
1462
+ this.pendingRequests.clear();
1463
+ this.requestCount.clear();
1464
+ }
1465
+ /**
1466
+ * Get pending request count
1467
+ */
1468
+ getPendingCount() {
1469
+ return this.pendingRequests.size;
1470
+ }
1471
+ /**
1472
+ * Get request statistics
1473
+ */
1474
+ getStats() {
1475
+ const totalRequests = Array.from(this.requestCount.values()).reduce((a, b) => a + b, 0);
1476
+ const deduplicated = totalRequests - this.pendingRequests.size;
1477
+ return {
1478
+ pending: this.pendingRequests.size,
1479
+ totalRequests,
1480
+ deduplicationRate: totalRequests > 0 ? deduplicated / totalRequests : 0
1481
+ };
1482
+ }
1483
+ }
1484
+
1485
+ /**
1486
+ * Priority-based Request Queue
1487
+ * Processes high-priority requests first
1488
+ */
1489
+ var Priority;
1490
+ (function (Priority) {
1491
+ Priority[Priority["LOW"] = 0] = "LOW";
1492
+ Priority[Priority["NORMAL"] = 1] = "NORMAL";
1493
+ Priority[Priority["HIGH"] = 2] = "HIGH";
1494
+ Priority[Priority["CRITICAL"] = 3] = "CRITICAL";
1495
+ })(Priority || (Priority = {}));
1496
+ class PriorityRequestQueue {
1497
+ constructor(maxConcurrent = 2) {
1498
+ this.queues = new Map();
1499
+ this.processing = false;
1500
+ this.maxConcurrent = 2;
1501
+ this.activeRequests = 0;
1502
+ this.maxConcurrent = maxConcurrent;
1503
+ // Initialize priority queues
1504
+ Object.values(Priority).forEach(priority => {
1505
+ if (typeof priority === 'number') {
1506
+ this.queues.set(priority, []);
1507
+ }
1508
+ });
1509
+ }
1510
+ /**
1511
+ * Add request with priority
1512
+ */
1513
+ add(requestFn, priority = Priority.NORMAL) {
1514
+ return new Promise((resolve, reject) => {
1515
+ const request = {
1516
+ priority,
1517
+ requestFn: () => requestFn(),
1518
+ resolve,
1519
+ reject,
1520
+ timestamp: Date.now()
1521
+ };
1522
+ // Add to appropriate priority queue
1523
+ const queue = this.queues.get(priority) || [];
1524
+ queue.push(request);
1525
+ this.queues.set(priority, queue);
1526
+ // Start processing if not already processing
1527
+ if (!this.processing) {
1528
+ this.processQueue();
1529
+ }
1530
+ });
1531
+ }
1532
+ /**
1533
+ * Process queue by priority
1534
+ */
1535
+ async processQueue() {
1536
+ if (this.processing)
1537
+ return;
1538
+ this.processing = true;
1539
+ while (this.hasPendingRequests() && this.activeRequests < this.maxConcurrent) {
1540
+ // Get highest priority request
1541
+ const request = this.getNextRequest();
1542
+ if (!request)
1543
+ break;
1544
+ this.activeRequests++;
1545
+ // Execute request
1546
+ request.requestFn()
1547
+ .then(request.resolve)
1548
+ .catch(request.reject)
1549
+ .finally(() => {
1550
+ this.activeRequests--;
1551
+ this.processQueue();
1552
+ });
1553
+ }
1554
+ this.processing = false;
1555
+ }
1556
+ /**
1557
+ * Get next request by priority
1558
+ */
1559
+ getNextRequest() {
1560
+ // Process from highest priority to lowest
1561
+ for (let priority = Priority.CRITICAL; priority >= Priority.LOW; priority--) {
1562
+ const queue = this.queues.get(priority);
1563
+ if (queue && queue.length > 0) {
1564
+ return queue.shift() || null;
1565
+ }
1566
+ }
1567
+ return null;
1568
+ }
1569
+ /**
1570
+ * Check if there are pending requests
1571
+ */
1572
+ hasPendingRequests() {
1573
+ for (const queue of this.queues.values()) {
1574
+ if (queue.length > 0)
1575
+ return true;
1576
+ }
1577
+ return false;
1578
+ }
1579
+ /**
1580
+ * Get queue statistics
1581
+ */
1582
+ getStats() {
1583
+ var _a, _b, _c, _d;
1584
+ const byPriority = {
1585
+ critical: ((_a = this.queues.get(Priority.CRITICAL)) === null || _a === void 0 ? void 0 : _a.length) || 0,
1586
+ high: ((_b = this.queues.get(Priority.HIGH)) === null || _b === void 0 ? void 0 : _b.length) || 0,
1587
+ normal: ((_c = this.queues.get(Priority.NORMAL)) === null || _c === void 0 ? void 0 : _c.length) || 0,
1588
+ low: ((_d = this.queues.get(Priority.LOW)) === null || _d === void 0 ? void 0 : _d.length) || 0
1589
+ };
1590
+ return {
1591
+ totalPending: Object.values(byPriority).reduce((a, b) => a + b, 0),
1592
+ byPriority,
1593
+ activeRequests: this.activeRequests
1594
+ };
1595
+ }
1596
+ /**
1597
+ * Clear all queues
1598
+ */
1599
+ clear() {
1600
+ this.queues.forEach(queue => queue.length = 0);
1601
+ this.processing = false;
1602
+ this.activeRequests = 0;
1603
+ }
1604
+ /**
1605
+ * Clear specific priority queue
1606
+ */
1607
+ clearPriority(priority) {
1608
+ const queue = this.queues.get(priority);
1609
+ if (queue) {
1610
+ queue.length = 0;
1611
+ }
1612
+ }
1613
+ }
1614
+
1241
1615
  class Engine {
1242
1616
  constructor(config) {
1243
1617
  this.fetchMoreCallback = null;
@@ -1256,6 +1630,9 @@ class Engine {
1256
1630
  this.performanceOptimizer = new PerformanceOptimizer();
1257
1631
  this.memoryManager = new MemoryManager(1000); // Cache up to 1000 items
1258
1632
  this.gpuAccelerator = new GPUAccelerator();
1633
+ this.batchSizeOptimizer = new BatchSizeOptimizer();
1634
+ this.requestDeduplicator = new RequestDeduplicator();
1635
+ this.priorityRequestQueue = new PriorityRequestQueue(2);
1259
1636
  this.totalItems = this.config.totalItems || Number.MAX_SAFE_INTEGER;
1260
1637
  this.state = {
1261
1638
  scrollTop: 0,
@@ -1516,6 +1893,1367 @@ const LazyList = React.forwardRef((props, ref) => {
1516
1893
  });
1517
1894
  LazyList.displayName = 'LazyList';
1518
1895
 
1896
+ /**
1897
+ * Smart Prefetch Algorithm
1898
+ * Recognizes scroll patterns and predicts data loading needs
1899
+ */
1900
+ class SmartPrefetchAlgorithm {
1901
+ constructor() {
1902
+ this.velocityHistory = [];
1903
+ this.directionHistory = [];
1904
+ this.HISTORY_SIZE = 20;
1905
+ this.lastPrefetchTime = 0;
1906
+ this.prefetchCooldown = 500; // ms
1907
+ }
1908
+ /**
1909
+ * Analyze scroll pattern
1910
+ */
1911
+ analyzeScrollPattern(velocity, acceleration, direction) {
1912
+ this.trackVelocity(velocity);
1913
+ this.trackDirection(direction);
1914
+ const avgVelocity = this.getAverageVelocity();
1915
+ const velocityVariance = this.getVelocityVariance();
1916
+ const directionChanges = this.countDirectionChanges();
1917
+ // Determine pattern type
1918
+ let pattern;
1919
+ if (Math.abs(avgVelocity) > 2.0) {
1920
+ pattern = {
1921
+ type: 'fast-scroll',
1922
+ velocity: avgVelocity,
1923
+ acceleration,
1924
+ direction,
1925
+ confidence: 0.9
1926
+ };
1927
+ }
1928
+ else if (Math.abs(avgVelocity) < 0.3) {
1929
+ pattern = {
1930
+ type: 'paused',
1931
+ velocity: avgVelocity,
1932
+ acceleration,
1933
+ direction: 'stationary',
1934
+ confidence: 0.95
1935
+ };
1936
+ }
1937
+ else if (directionChanges > 5) {
1938
+ pattern = {
1939
+ type: 'oscillating',
1940
+ velocity: avgVelocity,
1941
+ acceleration,
1942
+ direction,
1943
+ confidence: 0.85
1944
+ };
1945
+ }
1946
+ else if (velocityVariance < 0.5) {
1947
+ pattern = {
1948
+ type: 'steady',
1949
+ velocity: avgVelocity,
1950
+ acceleration,
1951
+ direction,
1952
+ confidence: 0.9
1953
+ };
1954
+ }
1955
+ else {
1956
+ pattern = {
1957
+ type: 'slow-scroll',
1958
+ velocity: avgVelocity,
1959
+ acceleration,
1960
+ direction,
1961
+ confidence: 0.8
1962
+ };
1963
+ }
1964
+ return pattern;
1965
+ }
1966
+ /**
1967
+ * Predict prefetch needs based on scroll pattern
1968
+ */
1969
+ predictPrefetchNeeds(pattern, visibleEnd, totalLoaded) {
1970
+ const now = Date.now();
1971
+ // Check cooldown
1972
+ if (now - this.lastPrefetchTime < this.prefetchCooldown) {
1973
+ return {
1974
+ shouldPrefetch: false,
1975
+ prefetchDistance: 0,
1976
+ batchSize: 0,
1977
+ priority: 'low',
1978
+ confidence: 1.0
1979
+ };
1980
+ }
1981
+ let prediction;
1982
+ switch (pattern.type) {
1983
+ case 'fast-scroll':
1984
+ prediction = {
1985
+ shouldPrefetch: true,
1986
+ prefetchDistance: 1500, // Far ahead for fast scrolling
1987
+ batchSize: 30, // Large batch
1988
+ priority: 'critical',
1989
+ confidence: pattern.confidence
1990
+ };
1991
+ break;
1992
+ case 'steady':
1993
+ prediction = {
1994
+ shouldPrefetch: visibleEnd >= totalLoaded - 800,
1995
+ prefetchDistance: 800,
1996
+ batchSize: 20,
1997
+ priority: 'high',
1998
+ confidence: pattern.confidence
1999
+ };
2000
+ break;
2001
+ case 'slow-scroll':
2002
+ prediction = {
2003
+ shouldPrefetch: visibleEnd >= totalLoaded - 400,
2004
+ prefetchDistance: 400,
2005
+ batchSize: 10,
2006
+ priority: 'normal',
2007
+ confidence: pattern.confidence
2008
+ };
2009
+ break;
2010
+ case 'oscillating':
2011
+ prediction = {
2012
+ shouldPrefetch: visibleEnd >= totalLoaded - 600,
2013
+ prefetchDistance: 600,
2014
+ batchSize: 15,
2015
+ priority: 'normal',
2016
+ confidence: pattern.confidence * 0.8 // Lower confidence for oscillating
2017
+ };
2018
+ break;
2019
+ case 'paused':
2020
+ prediction = {
2021
+ shouldPrefetch: false, // User paused, no need to prefetch
2022
+ prefetchDistance: 0,
2023
+ batchSize: 0,
2024
+ priority: 'low',
2025
+ confidence: pattern.confidence
2026
+ };
2027
+ break;
2028
+ default:
2029
+ prediction = {
2030
+ shouldPrefetch: visibleEnd >= totalLoaded - 500,
2031
+ prefetchDistance: 500,
2032
+ batchSize: 15,
2033
+ priority: 'normal',
2034
+ confidence: 0.7
2035
+ };
2036
+ }
2037
+ // Update last prefetch time if prefetching
2038
+ if (prediction.shouldPrefetch) {
2039
+ this.lastPrefetchTime = now;
2040
+ }
2041
+ return prediction;
2042
+ }
2043
+ /**
2044
+ * Track velocity history
2045
+ */
2046
+ trackVelocity(velocity) {
2047
+ this.velocityHistory.push(velocity);
2048
+ if (this.velocityHistory.length > this.HISTORY_SIZE) {
2049
+ this.velocityHistory.shift();
2050
+ }
2051
+ }
2052
+ /**
2053
+ * Track direction history
2054
+ */
2055
+ trackDirection(direction) {
2056
+ this.directionHistory.push(direction);
2057
+ if (this.directionHistory.length > this.HISTORY_SIZE) {
2058
+ this.directionHistory.shift();
2059
+ }
2060
+ }
2061
+ /**
2062
+ * Get average velocity
2063
+ */
2064
+ getAverageVelocity() {
2065
+ if (this.velocityHistory.length === 0)
2066
+ return 0;
2067
+ const sum = this.velocityHistory.reduce((a, b) => a + b, 0);
2068
+ return sum / this.velocityHistory.length;
2069
+ }
2070
+ /**
2071
+ * Get velocity variance
2072
+ */
2073
+ getVelocityVariance() {
2074
+ if (this.velocityHistory.length < 2)
2075
+ return 0;
2076
+ const avg = this.getAverageVelocity();
2077
+ const squaredDiffs = this.velocityHistory.map(v => Math.pow(v - avg, 2));
2078
+ const avgSquaredDiff = squaredDiffs.reduce((a, b) => a + b, 0) / squaredDiffs.length;
2079
+ return Math.sqrt(avgSquaredDiff);
2080
+ }
2081
+ /**
2082
+ * Count direction changes
2083
+ */
2084
+ countDirectionChanges() {
2085
+ if (this.directionHistory.length < 2)
2086
+ return 0;
2087
+ let changes = 0;
2088
+ for (let i = 1; i < this.directionHistory.length; i++) {
2089
+ if (this.directionHistory[i] !== this.directionHistory[i - 1] &&
2090
+ this.directionHistory[i] !== 'stationary' &&
2091
+ this.directionHistory[i - 1] !== 'stationary') {
2092
+ changes++;
2093
+ }
2094
+ }
2095
+ return changes;
2096
+ }
2097
+ /**
2098
+ * Reset history
2099
+ */
2100
+ reset() {
2101
+ this.velocityHistory = [];
2102
+ this.directionHistory = [];
2103
+ this.lastPrefetchTime = 0;
2104
+ }
2105
+ /**
2106
+ * Get prediction confidence
2107
+ */
2108
+ getConfidence() {
2109
+ if (this.velocityHistory.length < 5)
2110
+ return 0.5; // Not enough data
2111
+ return Math.min(this.velocityHistory.length / this.HISTORY_SIZE, 1.0);
2112
+ }
2113
+ }
2114
+
2115
+ /**
2116
+ * Preemptive Caching
2117
+ * Caches data before it's needed based on predictions
2118
+ */
2119
+ class PreemptiveCache {
2120
+ constructor(config) {
2121
+ this.cache = new Map();
2122
+ this.accessHistory = [];
2123
+ this.config = {
2124
+ maxSize: (config === null || config === void 0 ? void 0 : config.maxSize) || 1000,
2125
+ defaultTTL: (config === null || config === void 0 ? void 0 : config.defaultTTL) || 300000, // 5 minutes
2126
+ cleanupThreshold: (config === null || config === void 0 ? void 0 : config.cleanupThreshold) || 800
2127
+ };
2128
+ }
2129
+ /**
2130
+ * Preemptively cache data with priority
2131
+ */
2132
+ preemptiveCache(index, data, priority = 'normal') {
2133
+ // Check if we need to cleanup
2134
+ if (this.cache.size >= this.config.cleanupThreshold) {
2135
+ this.cleanup();
2136
+ }
2137
+ const entry = {
2138
+ data,
2139
+ timestamp: Date.now(),
2140
+ priority,
2141
+ accessCount: 0,
2142
+ expiry: Date.now() + this.config.defaultTTL
2143
+ };
2144
+ this.cache.set(index, entry);
2145
+ }
2146
+ /**
2147
+ * Get cached data
2148
+ */
2149
+ get(index) {
2150
+ const entry = this.cache.get(index);
2151
+ if (!entry) {
2152
+ return null;
2153
+ }
2154
+ // Check expiry
2155
+ if (Date.now() > entry.expiry) {
2156
+ this.cache.delete(index);
2157
+ return null;
2158
+ }
2159
+ // Update access count
2160
+ entry.accessCount++;
2161
+ this.trackAccess(index);
2162
+ return entry.data;
2163
+ }
2164
+ /**
2165
+ * Check if data is cached
2166
+ */
2167
+ has(index) {
2168
+ const entry = this.cache.get(index);
2169
+ if (!entry)
2170
+ return false;
2171
+ // Check expiry
2172
+ if (Date.now() > entry.expiry) {
2173
+ this.cache.delete(index);
2174
+ return false;
2175
+ }
2176
+ return true;
2177
+ }
2178
+ /**
2179
+ * Get cached data for range
2180
+ */
2181
+ getRange(startIndex, endIndex) {
2182
+ const results = [];
2183
+ for (let i = startIndex; i <= endIndex; i++) {
2184
+ const data = this.get(i);
2185
+ if (data !== null) {
2186
+ results.push(data);
2187
+ }
2188
+ }
2189
+ return results;
2190
+ }
2191
+ /**
2192
+ * Delete cached data
2193
+ */
2194
+ delete(index) {
2195
+ return this.cache.delete(index);
2196
+ }
2197
+ /**
2198
+ * Clear cache
2199
+ */
2200
+ clear() {
2201
+ this.cache.clear();
2202
+ this.accessHistory = [];
2203
+ }
2204
+ /**
2205
+ * Cleanup old/low-priority entries
2206
+ */
2207
+ cleanup() {
2208
+ const now = Date.now();
2209
+ const toDelete = [];
2210
+ // First pass: remove expired entries
2211
+ this.cache.forEach((entry, index) => {
2212
+ if (now > entry.expiry) {
2213
+ toDelete.push(index);
2214
+ }
2215
+ });
2216
+ // Second pass: remove low-priority entries if still over limit
2217
+ if (this.cache.size - toDelete.length > this.config.maxSize) {
2218
+ const sortedByPriority = Array.from(this.cache.entries())
2219
+ .filter(([index]) => !toDelete.includes(index))
2220
+ .sort((a, b) => {
2221
+ const priorityOrder = { critical: 4, high: 3, normal: 2, low: 1 };
2222
+ return priorityOrder[a[1].priority] - priorityOrder[b[1].priority];
2223
+ });
2224
+ // Remove lowest priority entries
2225
+ const toRemove = Math.ceil(sortedByPriority.length * 0.2); // Remove 20%
2226
+ for (let i = 0; i < toRemove; i++) {
2227
+ toDelete.push(sortedByPriority[i][0]);
2228
+ }
2229
+ }
2230
+ // Delete marked entries
2231
+ toDelete.forEach(index => this.cache.delete(index));
2232
+ }
2233
+ /**
2234
+ * Track access for analytics
2235
+ */
2236
+ trackAccess(index) {
2237
+ this.accessHistory.push(index);
2238
+ if (this.accessHistory.length > 100) {
2239
+ this.accessHistory.shift();
2240
+ }
2241
+ }
2242
+ /**
2243
+ * Get cache statistics
2244
+ */
2245
+ getStats() {
2246
+ const byPriority = {
2247
+ critical: 0,
2248
+ high: 0,
2249
+ normal: 0,
2250
+ low: 0
2251
+ };
2252
+ let totalAccessCount = 0;
2253
+ this.cache.forEach(entry => {
2254
+ byPriority[entry.priority]++;
2255
+ totalAccessCount += entry.accessCount;
2256
+ });
2257
+ return {
2258
+ size: this.cache.size,
2259
+ maxSize: this.config.maxSize,
2260
+ hitRate: this.accessHistory.length > 0 ?
2261
+ this.accessHistory.filter(i => this.has(i)).length / this.accessHistory.length : 0,
2262
+ avgAccessCount: this.cache.size > 0 ? totalAccessCount / this.cache.size : 0,
2263
+ byPriority
2264
+ };
2265
+ }
2266
+ /**
2267
+ * Get all cached indices
2268
+ */
2269
+ getCachedIndices() {
2270
+ return Array.from(this.cache.keys());
2271
+ }
2272
+ /**
2273
+ * Preemptively cache range
2274
+ */
2275
+ cacheRange(startIndex, endIndex, dataFetcher, priority) {
2276
+ for (let i = startIndex; i <= endIndex; i++) {
2277
+ if (!this.has(i)) {
2278
+ const data = dataFetcher(i);
2279
+ this.preemptiveCache(i, data, priority);
2280
+ }
2281
+ }
2282
+ }
2283
+ /**
2284
+ * Get memory usage estimate
2285
+ */
2286
+ getMemoryUsage() {
2287
+ // Rough estimate based on cache size
2288
+ return this.cache.size * 1024; // Assume ~1KB per entry
2289
+ }
2290
+ }
2291
+
2292
+ /**
2293
+ * Intelligent Pagination
2294
+ * Adaptive page size with cursor-based pagination
2295
+ */
2296
+ class IntelligentPagination {
2297
+ constructor() {
2298
+ this.currentPage = 1;
2299
+ this.basePageSize = 50;
2300
+ this.adaptivePageSize = 50;
2301
+ this.totalItems = 0;
2302
+ this.loadHistory = [];
2303
+ this.MIN_PAGE_SIZE = 20;
2304
+ this.MAX_PAGE_SIZE = 200;
2305
+ }
2306
+ /**
2307
+ * Get current pagination state
2308
+ */
2309
+ getState() {
2310
+ const totalPages = Math.ceil(this.totalItems / this.adaptivePageSize);
2311
+ const hasMore = this.currentPage < totalPages;
2312
+ return {
2313
+ currentPage: this.currentPage,
2314
+ pageSize: this.adaptivePageSize,
2315
+ totalItems: this.totalItems,
2316
+ totalPages,
2317
+ hasMore,
2318
+ cursor: this.createCursor(this.currentPage),
2319
+ nextCursor: hasMore ? this.createCursor(this.currentPage + 1) : undefined,
2320
+ prevCursor: this.currentPage > 1 ? this.createCursor(this.currentPage - 1) : undefined
2321
+ };
2322
+ }
2323
+ /**
2324
+ * Set total items
2325
+ */
2326
+ setTotalItems(total) {
2327
+ this.totalItems = total;
2328
+ }
2329
+ /**
2330
+ * Go to next page
2331
+ */
2332
+ nextPage() {
2333
+ const state = this.getState();
2334
+ if (state.hasMore) {
2335
+ this.currentPage++;
2336
+ }
2337
+ return this.getState();
2338
+ }
2339
+ /**
2340
+ * Go to previous page
2341
+ */
2342
+ prevPage() {
2343
+ if (this.currentPage > 1) {
2344
+ this.currentPage--;
2345
+ }
2346
+ return this.getState();
2347
+ }
2348
+ /**
2349
+ * Go to specific page
2350
+ */
2351
+ goToPage(page) {
2352
+ const totalPages = Math.ceil(this.totalItems / this.adaptivePageSize);
2353
+ this.currentPage = Math.max(1, Math.min(page, totalPages));
2354
+ return this.getState();
2355
+ }
2356
+ /**
2357
+ * Record load time for adaptive sizing
2358
+ */
2359
+ recordLoadTime(page, loadTimeMs) {
2360
+ this.loadHistory.push({ page, loadTime: loadTimeMs });
2361
+ // Keep last 10 load times
2362
+ if (this.loadHistory.length > 10) {
2363
+ this.loadHistory.shift();
2364
+ }
2365
+ // Adjust page size based on load time
2366
+ this.adaptPageSize();
2367
+ }
2368
+ /**
2369
+ * Adapt page size based on performance
2370
+ */
2371
+ adaptPageSize() {
2372
+ if (this.loadHistory.length < 3)
2373
+ return;
2374
+ const avgLoadTime = this.loadHistory.reduce((a, b) => a.loadTime + b.loadTime, 0) / this.loadHistory.length;
2375
+ // Target: 100-300ms load time
2376
+ if (avgLoadTime < 100) {
2377
+ // Fast loads - increase page size
2378
+ this.adaptivePageSize = Math.min(this.MAX_PAGE_SIZE, Math.round(this.adaptivePageSize * 1.2));
2379
+ }
2380
+ else if (avgLoadTime > 300) {
2381
+ // Slow loads - decrease page size
2382
+ this.adaptivePageSize = Math.max(this.MIN_PAGE_SIZE, Math.round(this.adaptivePageSize * 0.8));
2383
+ }
2384
+ // Optimal load time - keep current size
2385
+ }
2386
+ /**
2387
+ * Create cursor for page
2388
+ */
2389
+ createCursor(page) {
2390
+ const cursorData = {
2391
+ page,
2392
+ limit: this.adaptivePageSize,
2393
+ timestamp: Date.now()
2394
+ };
2395
+ // Add checksum for validation
2396
+ cursorData.checksum = this.calculateChecksum(cursorData);
2397
+ return Buffer.from(JSON.stringify(cursorData)).toString('base64');
2398
+ }
2399
+ /**
2400
+ * Decode cursor
2401
+ */
2402
+ decodeCursor(cursor) {
2403
+ try {
2404
+ const decoded = JSON.parse(Buffer.from(cursor, 'base64').toString('utf-8'));
2405
+ // Validate checksum
2406
+ if (decoded.checksum && !this.validateChecksum(decoded)) {
2407
+ return null;
2408
+ }
2409
+ return decoded;
2410
+ }
2411
+ catch (_a) {
2412
+ return null;
2413
+ }
2414
+ }
2415
+ /**
2416
+ * Go to page from cursor
2417
+ */
2418
+ goToCursor(cursor) {
2419
+ const decoded = this.decodeCursor(cursor);
2420
+ if (decoded) {
2421
+ this.currentPage = decoded.page;
2422
+ this.adaptivePageSize = decoded.limit;
2423
+ }
2424
+ return this.getState();
2425
+ }
2426
+ /**
2427
+ * Calculate checksum for cursor validation
2428
+ */
2429
+ calculateChecksum(data) {
2430
+ const str = `${data.page}-${data.limit}-${data.timestamp}`;
2431
+ let hash = 0;
2432
+ for (let i = 0; i < str.length; i++) {
2433
+ const char = str.charCodeAt(i);
2434
+ hash = ((hash << 5) - hash) + char;
2435
+ hash = hash & hash; // Convert to 32-bit integer
2436
+ }
2437
+ return hash.toString(36);
2438
+ }
2439
+ /**
2440
+ * Validate cursor checksum
2441
+ */
2442
+ validateChecksum(data) {
2443
+ if (!data.checksum)
2444
+ return false;
2445
+ const { checksum, ...rest } = data;
2446
+ return this.calculateChecksum(rest) === checksum;
2447
+ }
2448
+ /**
2449
+ * Get items to fetch for current page
2450
+ */
2451
+ getFetchRange() {
2452
+ return {
2453
+ skip: (this.currentPage - 1) * this.adaptivePageSize,
2454
+ limit: this.adaptivePageSize
2455
+ };
2456
+ }
2457
+ /**
2458
+ * Reset pagination
2459
+ */
2460
+ reset() {
2461
+ this.currentPage = 1;
2462
+ this.adaptivePageSize = this.basePageSize;
2463
+ this.loadHistory = [];
2464
+ }
2465
+ /**
2466
+ * Get load history for analytics
2467
+ */
2468
+ getLoadHistory() {
2469
+ return [...this.loadHistory];
2470
+ }
2471
+ /**
2472
+ * Get average load time
2473
+ */
2474
+ getAverageLoadTime() {
2475
+ if (this.loadHistory.length === 0)
2476
+ return 0;
2477
+ return this.loadHistory.reduce((a, b) => a + b.loadTime, 0) / this.loadHistory.length;
2478
+ }
2479
+ /**
2480
+ * Set base page size
2481
+ */
2482
+ setBasePageSize(size) {
2483
+ this.basePageSize = Math.max(this.MIN_PAGE_SIZE, Math.min(this.MAX_PAGE_SIZE, size));
2484
+ this.adaptivePageSize = this.basePageSize;
2485
+ }
2486
+ /**
2487
+ * Get current page size
2488
+ */
2489
+ getPageSize() {
2490
+ return this.adaptivePageSize;
2491
+ }
2492
+ /**
2493
+ * Get current page number
2494
+ */
2495
+ getCurrentPage() {
2496
+ return this.currentPage;
2497
+ }
2498
+ }
2499
+
2500
+ const useIntelligentScroll = (config) => {
2501
+ const { itemHeight = 50, viewportHeight = 400, bufferSize = 5, fetchMore, enablePrefetch = true, enableCache = true, cacheSize = 1000 } = config;
2502
+ const engineRef = React.useRef(null);
2503
+ const prefetchAlgoRef = React.useRef(null);
2504
+ const cacheRef = React.useRef(null);
2505
+ const paginationRef = React.useRef(null);
2506
+ const containerRef = React.useRef(null);
2507
+ const [state, setState] = React.useState({
2508
+ visibleRange: { start: 0, end: 0 },
2509
+ isLoading: false,
2510
+ scrollVelocity: 0,
2511
+ scrollDirection: 'stationary',
2512
+ scrollPattern: 'paused',
2513
+ prefetchConfidence: 0,
2514
+ cacheHitRate: 0,
2515
+ totalItems: 0
2516
+ });
2517
+ // Initialize intelligent scroll system
2518
+ React.useEffect(() => {
2519
+ engineRef.current = new Engine({
2520
+ itemHeight,
2521
+ viewportHeight,
2522
+ bufferSize
2523
+ });
2524
+ engineRef.current.setFetchMoreCallback(fetchMore);
2525
+ prefetchAlgoRef.current = new SmartPrefetchAlgorithm();
2526
+ if (enableCache) {
2527
+ cacheRef.current = new PreemptiveCache({ maxSize: cacheSize });
2528
+ }
2529
+ paginationRef.current = new IntelligentPagination();
2530
+ return () => {
2531
+ if (engineRef.current) {
2532
+ engineRef.current.cleanup();
2533
+ }
2534
+ if (cacheRef.current) {
2535
+ cacheRef.current.clear();
2536
+ }
2537
+ };
2538
+ }, []);
2539
+ // Handle scroll events with intelligent analysis
2540
+ const handleScroll = React.useCallback((scrollTop) => {
2541
+ if (!engineRef.current || !prefetchAlgoRef.current)
2542
+ return;
2543
+ // Update engine
2544
+ engineRef.current.updateScrollPosition(scrollTop);
2545
+ const engineState = engineRef.current.getState();
2546
+ // Analyze scroll pattern
2547
+ const velocity = scrollTop - (engineState.scrollTop || 0);
2548
+ const direction = velocity > 0 ? 'down' : velocity < 0 ? 'up' : 'stationary';
2549
+ const pattern = prefetchAlgoRef.current.analyzeScrollPattern(velocity, 0, // acceleration (would need more tracking)
2550
+ direction);
2551
+ // Update cache stats
2552
+ let cacheHitRate = 0;
2553
+ if (cacheRef.current) {
2554
+ const stats = cacheRef.current.getStats();
2555
+ cacheHitRate = stats.hitRate;
2556
+ }
2557
+ // Update state
2558
+ setState(prev => ({
2559
+ ...prev,
2560
+ visibleRange: engineState.visibleRange,
2561
+ isLoading: engineState.isLoading,
2562
+ scrollVelocity: velocity,
2563
+ scrollDirection: direction,
2564
+ scrollPattern: pattern.type,
2565
+ prefetchConfidence: pattern.confidence,
2566
+ cacheHitRate
2567
+ }));
2568
+ // Predict and prefetch if needed
2569
+ if (enablePrefetch && prefetchAlgoRef.current) {
2570
+ const prediction = prefetchAlgoRef.current.predictPrefetchNeeds(pattern, engineState.visibleRange.end, engineState.loadedItems);
2571
+ if (prediction.shouldPrefetch && cacheRef.current) {
2572
+ // Preemptive caching would happen here
2573
+ console.log('Prefetching with priority:', prediction.priority);
2574
+ }
2575
+ }
2576
+ }, [enablePrefetch]);
2577
+ // Set container reference
2578
+ const setContainerRef = React.useCallback((element) => {
2579
+ containerRef.current = element;
2580
+ if (element) {
2581
+ const scrollHandler = () => {
2582
+ handleScroll(element.scrollTop);
2583
+ };
2584
+ element.addEventListener('scroll', scrollHandler, { passive: true });
2585
+ return () => {
2586
+ element.removeEventListener('scroll', scrollHandler);
2587
+ };
2588
+ }
2589
+ }, [handleScroll]);
2590
+ // Get cached data
2591
+ const getCachedData = React.useCallback((index) => {
2592
+ if (cacheRef.current) {
2593
+ return cacheRef.current.get(index);
2594
+ }
2595
+ return null;
2596
+ }, []);
2597
+ // Cache data
2598
+ const cacheData = React.useCallback((index, data, priority = 'normal') => {
2599
+ if (cacheRef.current) {
2600
+ cacheRef.current.preemptiveCache(index, data, priority);
2601
+ }
2602
+ }, []);
2603
+ // Get pagination state
2604
+ const getPaginationState = React.useCallback(() => {
2605
+ if (paginationRef.current) {
2606
+ return paginationRef.current.getState();
2607
+ }
2608
+ return null;
2609
+ }, []);
2610
+ return {
2611
+ visibleRange: state.visibleRange,
2612
+ isLoading: state.isLoading,
2613
+ scrollVelocity: state.scrollVelocity,
2614
+ scrollDirection: state.scrollDirection,
2615
+ scrollPattern: state.scrollPattern,
2616
+ prefetchConfidence: state.prefetchConfidence,
2617
+ cacheHitRate: state.cacheHitRate,
2618
+ totalItems: state.totalItems,
2619
+ setContainerRef,
2620
+ getCachedData,
2621
+ cacheData,
2622
+ getPaginationState,
2623
+ refresh: () => {
2624
+ if (containerRef.current) {
2625
+ handleScroll(containerRef.current.scrollTop);
2626
+ }
2627
+ }
2628
+ };
2629
+ };
2630
+
2631
+ const useAdaptiveLoading = (config) => {
2632
+ const { initialBatchSize = 50, minBatchSize = 20, maxBatchSize = 200, fetchMore, enableNetworkAdaptation = true, enablePerformanceAdaptation = true } = config;
2633
+ const batchSizeOptimizerRef = React.useRef(null);
2634
+ const networkDetectorRef = React.useRef(null);
2635
+ const performanceMonitorRef = React.useRef(null);
2636
+ const [state, setState] = React.useState({
2637
+ currentBatchSize: initialBatchSize,
2638
+ networkQuality: 'good',
2639
+ performanceScore: 0.8,
2640
+ isLoading: false,
2641
+ loadedItems: 0,
2642
+ avgLoadTime: 0,
2643
+ adaptationCount: 0
2644
+ });
2645
+ const loadTimeHistoryRef = React.useRef([]);
2646
+ // Initialize adaptive loading system
2647
+ React.useEffect(() => {
2648
+ if (enableNetworkAdaptation) {
2649
+ networkDetectorRef.current = new NetworkSpeedDetector();
2650
+ }
2651
+ if (enablePerformanceAdaptation) {
2652
+ performanceMonitorRef.current = new DevicePerformanceMonitor();
2653
+ }
2654
+ batchSizeOptimizerRef.current = new BatchSizeOptimizer({
2655
+ minBatchSize,
2656
+ maxBatchSize,
2657
+ baseBatchSize: initialBatchSize
2658
+ });
2659
+ return () => {
2660
+ batchSizeOptimizerRef.current = null;
2661
+ networkDetectorRef.current = null;
2662
+ performanceMonitorRef.current = null;
2663
+ };
2664
+ }, []);
2665
+ // Load data with adaptive batch size
2666
+ const loadMore = React.useCallback(async () => {
2667
+ if (!batchSizeOptimizerRef.current || state.isLoading)
2668
+ return [];
2669
+ const startTime = performance.now();
2670
+ setState(prev => ({ ...prev, isLoading: true }));
2671
+ try {
2672
+ // Calculate optimal batch size
2673
+ let optimalBatchSize = state.currentBatchSize;
2674
+ if (enableNetworkAdaptation && networkDetectorRef.current) {
2675
+ const networkQuality = await networkDetectorRef.current.assessConnectionQuality();
2676
+ setState(prev => ({ ...prev, networkQuality }));
2677
+ }
2678
+ if (enablePerformanceAdaptation && performanceMonitorRef.current) {
2679
+ const perfScore = await performanceMonitorRef.current.assessPerformance();
2680
+ setState(prev => ({ ...prev, performanceScore: perfScore }));
2681
+ }
2682
+ // Get optimized batch size
2683
+ optimalBatchSize = await batchSizeOptimizerRef.current.calculateOptimalBatchSize(state.loadedItems / 1000 // Rough scroll speed estimate
2684
+ );
2685
+ // Fetch data
2686
+ const newData = await fetchMore();
2687
+ const loadTime = performance.now() - startTime;
2688
+ loadTimeHistoryRef.current.push(loadTime);
2689
+ // Keep last 10 load times
2690
+ if (loadTimeHistoryRef.current.length > 10) {
2691
+ loadTimeHistoryRef.current.shift();
2692
+ }
2693
+ const avgLoadTime = loadTimeHistoryRef.current.reduce((a, b) => a + b, 0) / loadTimeHistoryRef.current.length;
2694
+ // Record load time for future optimization
2695
+ batchSizeOptimizerRef.current.trackRenderTime(loadTime);
2696
+ setState(prev => ({
2697
+ ...prev,
2698
+ isLoading: false,
2699
+ loadedItems: prev.loadedItems + newData.length,
2700
+ avgLoadTime,
2701
+ adaptationCount: prev.adaptationCount + 1
2702
+ }));
2703
+ return newData;
2704
+ }
2705
+ catch (error) {
2706
+ console.error('Adaptive loading error:', error);
2707
+ setState(prev => ({ ...prev, isLoading: false }));
2708
+ return [];
2709
+ }
2710
+ }, [state.isLoading, state.currentBatchSize, state.loadedItems, enableNetworkAdaptation, enablePerformanceAdaptation]);
2711
+ // Get current batch size
2712
+ const getCurrentBatchSize = React.useCallback(() => {
2713
+ if (batchSizeOptimizerRef.current) {
2714
+ return batchSizeOptimizerRef.current.getCurrentBatchSize();
2715
+ }
2716
+ return state.currentBatchSize;
2717
+ }, [state.currentBatchSize]);
2718
+ // Get loading statistics
2719
+ const getStats = React.useCallback(() => {
2720
+ return {
2721
+ currentBatchSize: state.currentBatchSize,
2722
+ networkQuality: state.networkQuality,
2723
+ performanceScore: state.performanceScore,
2724
+ avgLoadTime: state.avgLoadTime,
2725
+ adaptationCount: state.adaptationCount,
2726
+ loadedItems: state.loadedItems
2727
+ };
2728
+ }, [state]);
2729
+ // Reset adaptive loading
2730
+ const reset = React.useCallback(() => {
2731
+ loadTimeHistoryRef.current = [];
2732
+ setState(prev => ({
2733
+ ...prev,
2734
+ currentBatchSize: initialBatchSize,
2735
+ loadedItems: 0,
2736
+ avgLoadTime: 0,
2737
+ adaptationCount: 0
2738
+ }));
2739
+ if (batchSizeOptimizerRef.current) {
2740
+ batchSizeOptimizerRef.current.reset();
2741
+ }
2742
+ }, [initialBatchSize]);
2743
+ return {
2744
+ ...state,
2745
+ loadMore,
2746
+ getCurrentBatchSize,
2747
+ getStats,
2748
+ reset
2749
+ };
2750
+ };
2751
+
2752
+ const useSmartPagination = (config = {}) => {
2753
+ const { initialPage = 1, initialPageSize = 50, minPageSize = 20, maxPageSize = 200, enableAdaptation = true } = config;
2754
+ const paginationRef = React.useRef(null);
2755
+ const [state, setState] = React.useState({
2756
+ currentPage: initialPage,
2757
+ pageSize: initialPageSize,
2758
+ totalItems: 0,
2759
+ totalPages: 0,
2760
+ hasMore: false,
2761
+ cursor: undefined,
2762
+ nextCursor: undefined,
2763
+ prevCursor: undefined,
2764
+ avgLoadTime: 0,
2765
+ isAdapting: false
2766
+ });
2767
+ const loadTimeHistoryRef = React.useRef([]);
2768
+ // Initialize pagination
2769
+ React.useEffect(() => {
2770
+ paginationRef.current = new IntelligentPagination();
2771
+ if (initialPageSize) {
2772
+ paginationRef.current.setBasePageSize(initialPageSize);
2773
+ }
2774
+ return () => {
2775
+ paginationRef.current = null;
2776
+ };
2777
+ }, []);
2778
+ // Update pagination state
2779
+ const updateState = React.useCallback(() => {
2780
+ if (!paginationRef.current)
2781
+ return;
2782
+ const paginationState = paginationRef.current.getState();
2783
+ setState(prev => ({
2784
+ ...prev,
2785
+ currentPage: paginationState.currentPage,
2786
+ pageSize: paginationState.pageSize,
2787
+ totalItems: paginationState.totalItems,
2788
+ totalPages: paginationState.totalPages,
2789
+ hasMore: paginationState.hasMore,
2790
+ cursor: paginationState.cursor,
2791
+ nextCursor: paginationState.nextCursor,
2792
+ prevCursor: paginationState.prevCursor
2793
+ }));
2794
+ }, []);
2795
+ // Set total items
2796
+ const setTotalItems = React.useCallback((total) => {
2797
+ if (paginationRef.current) {
2798
+ paginationRef.current.setTotalItems(total);
2799
+ updateState();
2800
+ }
2801
+ }, [updateState]);
2802
+ // Go to next page
2803
+ const nextPage = React.useCallback(async (loadDataFn) => {
2804
+ if (!paginationRef.current || !state.hasMore)
2805
+ return;
2806
+ const startTime = performance.now();
2807
+ setState(prev => ({ ...prev, isAdapting: true }));
2808
+ try {
2809
+ paginationRef.current.nextPage();
2810
+ if (loadDataFn) {
2811
+ await loadDataFn();
2812
+ }
2813
+ const loadTime = performance.now() - startTime;
2814
+ // Record load time for adaptation
2815
+ if (enableAdaptation && paginationRef.current) {
2816
+ paginationRef.current.recordLoadTime(state.currentPage, loadTime);
2817
+ loadTimeHistoryRef.current.push({ page: state.currentPage, time: loadTime });
2818
+ // Keep last 10 load times
2819
+ if (loadTimeHistoryRef.current.length > 10) {
2820
+ loadTimeHistoryRef.current.shift();
2821
+ }
2822
+ const avgLoadTime = loadTimeHistoryRef.current.reduce((a, b) => a + b.time, 0) / loadTimeHistoryRef.current.length;
2823
+ setState(prev => ({
2824
+ ...prev,
2825
+ avgLoadTime,
2826
+ isAdapting: false
2827
+ }));
2828
+ }
2829
+ updateState();
2830
+ }
2831
+ catch (error) {
2832
+ console.error('Next page error:', error);
2833
+ setState(prev => ({ ...prev, isAdapting: false }));
2834
+ }
2835
+ }, [state.hasMore, state.currentPage, enableAdaptation, updateState]);
2836
+ // Go to previous page
2837
+ const prevPage = React.useCallback(() => {
2838
+ if (!paginationRef.current)
2839
+ return;
2840
+ paginationRef.current.prevPage();
2841
+ updateState();
2842
+ }, [updateState]);
2843
+ // Go to specific page
2844
+ const goToPage = React.useCallback((page) => {
2845
+ if (!paginationRef.current)
2846
+ return;
2847
+ paginationRef.current.goToPage(page);
2848
+ updateState();
2849
+ }, [updateState]);
2850
+ // Go to cursor
2851
+ const goToCursor = React.useCallback((cursor) => {
2852
+ if (!paginationRef.current)
2853
+ return;
2854
+ paginationRef.current.goToCursor(cursor);
2855
+ updateState();
2856
+ }, [updateState]);
2857
+ // Get fetch range
2858
+ const getFetchRange = React.useCallback(() => {
2859
+ if (!paginationRef.current)
2860
+ return { skip: 0, limit: state.pageSize };
2861
+ return paginationRef.current.getFetchRange();
2862
+ }, [state.pageSize]);
2863
+ // Get current cursor
2864
+ const getCurrentCursor = React.useCallback(() => {
2865
+ if (!paginationRef.current)
2866
+ return state.cursor;
2867
+ return paginationRef.current.getState().cursor;
2868
+ }, [state.cursor]);
2869
+ // Get pagination statistics
2870
+ const getStats = React.useCallback(() => {
2871
+ if (!paginationRef.current)
2872
+ return null;
2873
+ return {
2874
+ currentPage: state.currentPage,
2875
+ pageSize: state.pageSize,
2876
+ totalItems: state.totalItems,
2877
+ totalPages: state.totalPages,
2878
+ hasMore: state.hasMore,
2879
+ avgLoadTime: state.avgLoadTime,
2880
+ currentCursor: state.cursor,
2881
+ loadHistory: loadTimeHistoryRef.current
2882
+ };
2883
+ }, [state]);
2884
+ // Reset pagination
2885
+ const reset = React.useCallback(() => {
2886
+ if (paginationRef.current) {
2887
+ paginationRef.current.reset();
2888
+ loadTimeHistoryRef.current = [];
2889
+ updateState();
2890
+ }
2891
+ }, [updateState]);
2892
+ return {
2893
+ ...state,
2894
+ nextPage,
2895
+ prevPage,
2896
+ goToPage,
2897
+ goToCursor,
2898
+ setTotalItems,
2899
+ getFetchRange,
2900
+ getCurrentCursor,
2901
+ getStats,
2902
+ reset
2903
+ };
2904
+ };
2905
+
2906
+ const IntelligentLazyList = ({ items, itemHeight, viewportHeight, fetchMore, renderItem, bufferSize = 5, enablePrefetch = true, enableCache = true, className = '', style = {} }) => {
2907
+ const containerRef = React.useRef(null);
2908
+ const { visibleRange, isLoading, scrollVelocity, scrollDirection, scrollPattern, prefetchConfidence, cacheHitRate, setContainerRef, getCachedData, cacheData } = useIntelligentScroll({
2909
+ itemHeight,
2910
+ viewportHeight,
2911
+ bufferSize,
2912
+ fetchMore,
2913
+ enablePrefetch,
2914
+ enableCache
2915
+ });
2916
+ // Cache items as they load
2917
+ React.useEffect(() => {
2918
+ if (enableCache) {
2919
+ items.forEach((item, index) => {
2920
+ if (index >= visibleRange.start && index <= visibleRange.end) {
2921
+ cacheData(index, item, 'high');
2922
+ }
2923
+ });
2924
+ }
2925
+ }, [items, visibleRange, enableCache, cacheData]);
2926
+ // Calculate total height
2927
+ const totalHeight = items.length * itemHeight;
2928
+ const topPadding = visibleRange.start * itemHeight;
2929
+ const bottomPadding = Math.max(0, totalHeight - ((visibleRange.end + 1) * itemHeight));
2930
+ // Get visible items
2931
+ const visibleItems = items.slice(visibleRange.start, visibleRange.end + 1);
2932
+ return (React.createElement("div", { ref: (el) => {
2933
+ containerRef.current = el;
2934
+ setContainerRef(el);
2935
+ }, className: `intelligent-lazy-list ${className}`, style: {
2936
+ height: `${viewportHeight}px`,
2937
+ overflowY: 'auto',
2938
+ position: 'relative',
2939
+ ...style
2940
+ } },
2941
+ React.createElement("div", { style: { height: `${topPadding}px` } }),
2942
+ visibleItems.map((item, index) => {
2943
+ const cachedData = getCachedData(visibleRange.start + index);
2944
+ return (React.createElement("div", { key: visibleRange.start + index, style: {
2945
+ height: `${itemHeight}px`,
2946
+ position: 'relative'
2947
+ }, className: "intelligent-lazy-item" }, renderItem(cachedData || item, visibleRange.start + index)));
2948
+ }),
2949
+ React.createElement("div", { style: { height: `${bottomPadding}px` } }),
2950
+ isLoading && (React.createElement("div", { className: "intelligent-lazy-loading", style: {
2951
+ position: 'absolute',
2952
+ bottom: '10px',
2953
+ left: '50%',
2954
+ transform: 'translateX(-50%)',
2955
+ background: 'rgba(0, 0, 0, 0.7)',
2956
+ color: 'white',
2957
+ padding: '8px 16px',
2958
+ borderRadius: '4px',
2959
+ fontSize: '12px'
2960
+ } },
2961
+ "Loading... (Pattern: ",
2962
+ scrollPattern,
2963
+ ", Confidence: ",
2964
+ (prefetchConfidence * 100).toFixed(0),
2965
+ "%)")),
2966
+ React.createElement("div", { className: "intelligent-lazy-debug", style: {
2967
+ position: 'absolute',
2968
+ top: '10px',
2969
+ right: '10px',
2970
+ background: 'rgba(0, 0, 0, 0.7)',
2971
+ color: 'white',
2972
+ padding: '8px',
2973
+ borderRadius: '4px',
2974
+ fontSize: '11px',
2975
+ pointerEvents: 'none'
2976
+ } },
2977
+ React.createElement("div", null,
2978
+ "Velocity: ",
2979
+ scrollVelocity.toFixed(2)),
2980
+ React.createElement("div", null,
2981
+ "Direction: ",
2982
+ scrollDirection),
2983
+ React.createElement("div", null,
2984
+ "Pattern: ",
2985
+ scrollPattern),
2986
+ React.createElement("div", null,
2987
+ "Cache Hit: ",
2988
+ (cacheHitRate * 100).toFixed(0),
2989
+ "%"),
2990
+ React.createElement("div", null,
2991
+ "Visible: ",
2992
+ visibleRange.start,
2993
+ "-",
2994
+ visibleRange.end))));
2995
+ };
2996
+
2997
+ const AdaptiveScrollView = ({ children, fetchMore, initialBatchSize = 50, minBatchSize = 20, maxBatchSize = 200, enableNetworkAdaptation = true, enablePerformanceAdaptation = true, className = '', style = {}, onLoadMore }) => {
2998
+ const containerRef = React.useRef(null);
2999
+ const loadMoreRef = React.useRef(null);
3000
+ const observerRef = React.useRef(null);
3001
+ const { currentBatchSize, networkQuality, performanceScore, isLoading, loadedItems, avgLoadTime, adaptationCount, loadMore, getStats } = useAdaptiveLoading({
3002
+ initialBatchSize,
3003
+ minBatchSize,
3004
+ maxBatchSize,
3005
+ fetchMore,
3006
+ enableNetworkAdaptation,
3007
+ enablePerformanceAdaptation
3008
+ });
3009
+ // Setup intersection observer for infinite scroll
3010
+ React.useEffect(() => {
3011
+ const options = {
3012
+ root: containerRef.current,
3013
+ rootMargin: '100px',
3014
+ threshold: 0
3015
+ };
3016
+ observerRef.current = new IntersectionObserver((entries) => {
3017
+ const entry = entries[0];
3018
+ if (entry.isIntersecting && !isLoading) {
3019
+ loadMore().then((items) => {
3020
+ if (onLoadMore) {
3021
+ onLoadMore(items);
3022
+ }
3023
+ });
3024
+ }
3025
+ }, options);
3026
+ if (loadMoreRef.current) {
3027
+ observerRef.current.observe(loadMoreRef.current);
3028
+ }
3029
+ return () => {
3030
+ if (observerRef.current) {
3031
+ observerRef.current.disconnect();
3032
+ }
3033
+ };
3034
+ }, [isLoading, loadMore, onLoadMore]);
3035
+ // Get network quality color
3036
+ const getNetworkQualityColor = () => {
3037
+ switch (networkQuality) {
3038
+ case 'excellent': return '#4CAF50';
3039
+ case 'good': return '#8BC34A';
3040
+ case 'poor': return '#FF9800';
3041
+ case 'offline': return '#F44336';
3042
+ default: return '#9E9E9E';
3043
+ }
3044
+ };
3045
+ return (React.createElement("div", { ref: containerRef, className: `adaptive-scroll-view ${className}`, style: {
3046
+ overflowY: 'auto',
3047
+ height: '100%',
3048
+ ...style
3049
+ } },
3050
+ React.createElement("div", { className: "adaptive-scroll-content" }, children),
3051
+ React.createElement("div", { ref: loadMoreRef, style: {
3052
+ padding: '20px',
3053
+ textAlign: 'center',
3054
+ opacity: isLoading ? 0.5 : 1
3055
+ } }, isLoading ? (React.createElement("div", { className: "adaptive-loading" },
3056
+ React.createElement("div", { style: {
3057
+ display: 'inline-block',
3058
+ width: '20px',
3059
+ height: '20px',
3060
+ border: '2px solid #f3f3f3',
3061
+ borderTop: '2px solid #3498db',
3062
+ borderRadius: '50%',
3063
+ animation: 'spin 1s linear infinite'
3064
+ } }),
3065
+ React.createElement("span", { style: { marginLeft: '8px' } },
3066
+ "Loading ",
3067
+ currentBatchSize,
3068
+ " items..."))) : (React.createElement("div", { className: "adaptive-ready" }, "Scroll for more"))),
3069
+ React.createElement("div", { style: {
3070
+ position: 'fixed',
3071
+ bottom: '10px',
3072
+ right: '10px',
3073
+ background: 'rgba(0, 0, 0, 0.8)',
3074
+ color: 'white',
3075
+ padding: '12px',
3076
+ borderRadius: '8px',
3077
+ fontSize: '11px',
3078
+ fontFamily: 'monospace',
3079
+ zIndex: 1000
3080
+ } },
3081
+ React.createElement("div", { style: { marginBottom: '8px', fontWeight: 'bold' } }, "Adaptive Loading Stats"),
3082
+ React.createElement("div", { style: { display: 'grid', gridTemplateColumns: 'auto auto', gap: '4px' } },
3083
+ React.createElement("span", null, "Batch Size:"),
3084
+ React.createElement("span", null, currentBatchSize),
3085
+ React.createElement("span", null, "Network:"),
3086
+ React.createElement("span", { style: { color: getNetworkQualityColor() } }, networkQuality.toUpperCase()),
3087
+ React.createElement("span", null, "Performance:"),
3088
+ React.createElement("span", null,
3089
+ (performanceScore * 100).toFixed(0),
3090
+ "%"),
3091
+ React.createElement("span", null, "Loaded:"),
3092
+ React.createElement("span", null,
3093
+ loadedItems,
3094
+ " items"),
3095
+ React.createElement("span", null, "Avg Load:"),
3096
+ React.createElement("span", null,
3097
+ avgLoadTime.toFixed(0),
3098
+ "ms"),
3099
+ React.createElement("span", null, "Adaptations:"),
3100
+ React.createElement("span", null, adaptationCount))),
3101
+ React.createElement("style", null, `
3102
+ @keyframes spin {
3103
+ 0% { transform: rotate(0deg); }
3104
+ 100% { transform: rotate(360deg); }
3105
+ }
3106
+ `)));
3107
+ };
3108
+
3109
+ const SmartInfiniteScroll = ({ fetchMore, renderItem, initialPageSize = 50, minPageSize = 20, maxPageSize = 200, enableAdaptation = true, className = '', style = {}, emptyMessage = 'No more items' }) => {
3110
+ const containerRef = React.useRef(null);
3111
+ const loadMoreRef = React.useRef(null);
3112
+ const observerRef = React.useRef(null);
3113
+ const { currentPage, pageSize, totalItems, totalPages, hasMore, cursor, nextPage, setTotalItems, getFetchRange } = useSmartPagination({
3114
+ initialPage: 1,
3115
+ initialPageSize,
3116
+ minPageSize,
3117
+ maxPageSize,
3118
+ enableAdaptation
3119
+ });
3120
+ const { isLoading, loadedItems, avgLoadTime, loadMore, getStats } = useAdaptiveLoading({
3121
+ initialBatchSize: pageSize,
3122
+ minBatchSize: minPageSize,
3123
+ maxBatchSize: maxPageSize,
3124
+ fetchMore: async () => {
3125
+ const range = getFetchRange();
3126
+ const items = await fetchMore(currentPage, range.limit);
3127
+ setTotalItems(totalItems + items.length);
3128
+ return items;
3129
+ },
3130
+ enableNetworkAdaptation: enableAdaptation,
3131
+ enablePerformanceAdaptation: enableAdaptation
3132
+ });
3133
+ // Setup intersection observer
3134
+ React.useEffect(() => {
3135
+ const options = {
3136
+ root: containerRef.current,
3137
+ rootMargin: '200px',
3138
+ threshold: 0
3139
+ };
3140
+ observerRef.current = new IntersectionObserver((entries) => {
3141
+ const entry = entries[0];
3142
+ if (entry.isIntersecting && !isLoading && hasMore) {
3143
+ nextPage(async () => {
3144
+ await loadMore();
3145
+ });
3146
+ }
3147
+ }, options);
3148
+ if (loadMoreRef.current) {
3149
+ observerRef.current.observe(loadMoreRef.current);
3150
+ }
3151
+ return () => {
3152
+ if (observerRef.current) {
3153
+ observerRef.current.disconnect();
3154
+ }
3155
+ };
3156
+ }, [isLoading, hasMore, nextPage, loadMore]);
3157
+ // Get pagination stats
3158
+ getStats();
3159
+ return (React.createElement("div", { ref: containerRef, className: `smart-infinite-scroll ${className}`, style: {
3160
+ overflowY: 'auto',
3161
+ height: '100%',
3162
+ ...style
3163
+ } },
3164
+ React.createElement("div", { className: "smart-infinite-content" }, loadedItems === 0 && (React.createElement("div", { className: "smart-infinite-empty", style: {
3165
+ padding: '40px',
3166
+ textAlign: 'center',
3167
+ color: '#999'
3168
+ } }, emptyMessage))),
3169
+ React.createElement("div", { ref: loadMoreRef, style: {
3170
+ padding: '30px',
3171
+ textAlign: 'center'
3172
+ } }, isLoading ? (React.createElement("div", { className: "smart-infinite-loading" },
3173
+ React.createElement("div", { style: {
3174
+ display: 'inline-block',
3175
+ width: '24px',
3176
+ height: '24px',
3177
+ border: '3px solid #f3f3f3',
3178
+ borderTop: '3px solid #3498db',
3179
+ borderRadius: '50%',
3180
+ animation: 'smart-spin 1s linear infinite'
3181
+ } }),
3182
+ React.createElement("div", { style: { marginTop: '12px', color: '#666' } },
3183
+ "Loading page ",
3184
+ currentPage + 1,
3185
+ " of ",
3186
+ totalPages,
3187
+ "..."),
3188
+ React.createElement("div", { style: { fontSize: '11px', color: '#999', marginTop: '4px' } },
3189
+ "Batch size: ",
3190
+ pageSize,
3191
+ " \u2022 Avg: ",
3192
+ avgLoadTime.toFixed(0),
3193
+ "ms"))) : hasMore ? (React.createElement("div", { className: "smart-infinite-ready", style: {
3194
+ color: '#999',
3195
+ fontSize: '13px'
3196
+ } }, "Scroll for more items")) : (React.createElement("div", { className: "smart-infinite-end", style: {
3197
+ color: '#999',
3198
+ fontSize: '13px'
3199
+ } }, emptyMessage))),
3200
+ React.createElement("div", { style: {
3201
+ position: 'fixed',
3202
+ bottom: '10px',
3203
+ right: '10px',
3204
+ background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
3205
+ color: 'white',
3206
+ padding: '16px',
3207
+ borderRadius: '12px',
3208
+ fontSize: '11px',
3209
+ fontFamily: 'monospace',
3210
+ boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)',
3211
+ zIndex: 1000,
3212
+ minWidth: '200px'
3213
+ } },
3214
+ React.createElement("div", { style: { marginBottom: '8px', fontWeight: 'bold', fontSize: '13px' } }, "\uD83D\uDE80 Smart Infinite Scroll"),
3215
+ React.createElement("div", { style: { display: 'grid', gridTemplateColumns: 'auto auto', gap: '6px' } },
3216
+ React.createElement("span", null, "Page:"),
3217
+ React.createElement("span", null,
3218
+ currentPage,
3219
+ " / ",
3220
+ totalPages),
3221
+ React.createElement("span", null, "Page Size:"),
3222
+ React.createElement("span", null,
3223
+ pageSize,
3224
+ " (adaptive)"),
3225
+ React.createElement("span", null, "Loaded:"),
3226
+ React.createElement("span", null,
3227
+ loadedItems,
3228
+ " items"),
3229
+ React.createElement("span", null, "Avg Load:"),
3230
+ React.createElement("span", null,
3231
+ avgLoadTime.toFixed(0),
3232
+ "ms"),
3233
+ React.createElement("span", null, "Cursor:"),
3234
+ React.createElement("span", { style: {
3235
+ fontSize: '9px',
3236
+ wordBreak: 'break-all',
3237
+ maxWidth: '120px',
3238
+ overflow: 'hidden',
3239
+ textOverflow: 'ellipsis'
3240
+ } }, cursor ? cursor.substring(0, 20) + '...' : 'N/A'),
3241
+ React.createElement("span", null, "Has More:"),
3242
+ React.createElement("span", { style: { color: hasMore ? '#4CAF50' : '#F44336' } }, hasMore ? 'Yes' : 'No'))),
3243
+ React.createElement("style", null, `
3244
+ @keyframes smart-spin {
3245
+ 0% { transform: rotate(0deg); }
3246
+ 100% { transform: rotate(360deg); }
3247
+ }
3248
+ `)));
3249
+ };
3250
+
3251
+ exports.AdaptiveScrollView = AdaptiveScrollView;
3252
+ exports.IntelligentLazyList = IntelligentLazyList;
1519
3253
  exports.LazyList = LazyList;
3254
+ exports.SmartInfiniteScroll = SmartInfiniteScroll;
3255
+ exports.useAdaptiveLoading = useAdaptiveLoading;
3256
+ exports.useIntelligentScroll = useIntelligentScroll;
1520
3257
  exports.useLazyList = useLazyList;
3258
+ exports.useSmartPagination = useSmartPagination;
1521
3259
  //# sourceMappingURL=index.js.map