lazy-render-virtual-scroll 1.4.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.
- package/README.md +32 -288
- package/backend-helpers/README.md +233 -0
- package/backend-helpers/example.ts +114 -0
- package/backend-helpers/frontend-example.tsx +122 -0
- package/backend-helpers/pagination.ts +159 -0
- package/dist/adapters/react/index.d.ts +187 -1
- package/dist/cjs/adapters/react/LazyList.js +377 -0
- package/dist/cjs/adapters/react/LazyList.js.map +1 -1
- package/dist/cjs/adapters/react/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
- package/dist/cjs/adapters/react/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
- package/dist/cjs/adapters/react/adapters/react/components/IntelligentLazyList.d.ts +16 -0
- package/dist/cjs/adapters/react/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
- package/dist/cjs/adapters/react/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
- package/dist/cjs/adapters/react/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
- package/dist/cjs/adapters/react/adapters/react/components/index.d.ts +7 -0
- package/dist/cjs/adapters/react/adapters/react/components/index.d.ts.map +1 -0
- package/dist/cjs/adapters/react/adapters/react/hooks/index.d.ts +7 -0
- package/dist/cjs/adapters/react/adapters/react/hooks/index.d.ts.map +1 -0
- package/dist/cjs/adapters/react/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
- package/dist/cjs/adapters/react/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
- package/dist/cjs/adapters/react/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
- package/dist/cjs/adapters/react/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
- package/dist/cjs/adapters/react/adapters/react/hooks/useSmartPagination.d.ts +57 -0
- package/dist/cjs/adapters/react/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
- package/dist/cjs/adapters/react/adapters/react/index.d.ts +2 -0
- package/dist/cjs/adapters/react/adapters/react/index.d.ts.map +1 -1
- package/dist/cjs/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
- package/dist/cjs/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
- package/dist/cjs/adapters/react/components/IntelligentLazyList.d.ts +16 -0
- package/dist/cjs/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
- package/dist/cjs/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
- package/dist/cjs/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
- package/dist/cjs/adapters/react/components/index.d.ts +7 -0
- package/dist/cjs/adapters/react/components/index.d.ts.map +1 -0
- package/dist/cjs/adapters/react/core/BatchSizeOptimizer.d.ts +84 -0
- package/dist/cjs/adapters/react/core/BatchSizeOptimizer.d.ts.map +1 -0
- package/dist/cjs/adapters/react/core/DynamicHeightEngine.d.ts +107 -0
- package/dist/cjs/adapters/react/core/DynamicHeightEngine.d.ts.map +1 -0
- package/dist/cjs/adapters/react/core/Engine.d.ts +3 -0
- package/dist/cjs/adapters/react/core/Engine.d.ts.map +1 -1
- package/dist/cjs/adapters/react/core/HeightMeasurementCache.d.ts +92 -0
- package/dist/cjs/adapters/react/core/HeightMeasurementCache.d.ts.map +1 -0
- package/dist/cjs/adapters/react/core/IntelligentPagination.d.ts +113 -0
- package/dist/cjs/adapters/react/core/IntelligentPagination.d.ts.map +1 -0
- package/dist/cjs/adapters/react/core/PreemptiveCache.d.ts +83 -0
- package/dist/cjs/adapters/react/core/PreemptiveCache.d.ts.map +1 -0
- package/dist/cjs/adapters/react/core/PriorityRequestQueue.d.ts +56 -0
- package/dist/cjs/adapters/react/core/PriorityRequestQueue.d.ts.map +1 -0
- package/dist/cjs/adapters/react/core/RequestDeduplicator.d.ts +35 -0
- package/dist/cjs/adapters/react/core/RequestDeduplicator.d.ts.map +1 -0
- package/dist/cjs/adapters/react/core/SmartPrefetchAlgorithm.d.ts +63 -0
- package/dist/cjs/adapters/react/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
- package/dist/cjs/adapters/react/core/VariableHeightManager.d.ts +84 -0
- package/dist/cjs/adapters/react/core/VariableHeightManager.d.ts.map +1 -0
- package/dist/cjs/adapters/react/hooks/index.d.ts +7 -0
- package/dist/cjs/adapters/react/hooks/index.d.ts.map +1 -0
- package/dist/cjs/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
- package/dist/cjs/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
- package/dist/cjs/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
- package/dist/cjs/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
- package/dist/cjs/adapters/react/hooks/useSmartPagination.d.ts +57 -0
- package/dist/cjs/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
- package/dist/cjs/adapters/react/index.d.ts +9 -0
- package/dist/cjs/adapters/react/index.d.ts.map +1 -1
- package/dist/cjs/adapters/react/index.js +1738 -0
- package/dist/cjs/adapters/react/index.js.map +1 -1
- package/dist/cjs/adapters/react/useLazyList.js +377 -0
- package/dist/cjs/adapters/react/useLazyList.js.map +1 -1
- package/dist/cjs/angular/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
- package/dist/cjs/angular/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/react/components/IntelligentLazyList.d.ts +16 -0
- package/dist/cjs/angular/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
- package/dist/cjs/angular/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/react/components/index.d.ts +7 -0
- package/dist/cjs/angular/adapters/react/components/index.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/react/hooks/index.d.ts +7 -0
- package/dist/cjs/angular/adapters/react/hooks/index.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
- package/dist/cjs/angular/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
- package/dist/cjs/angular/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/react/hooks/useSmartPagination.d.ts +57 -0
- package/dist/cjs/angular/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/react/index.d.ts +2 -0
- package/dist/cjs/angular/adapters/react/index.d.ts.map +1 -1
- package/dist/cjs/angular/core/BatchSizeOptimizer.d.ts +84 -0
- package/dist/cjs/angular/core/BatchSizeOptimizer.d.ts.map +1 -0
- package/dist/cjs/angular/core/DynamicHeightEngine.d.ts +107 -0
- package/dist/cjs/angular/core/DynamicHeightEngine.d.ts.map +1 -0
- package/dist/cjs/angular/core/Engine.d.ts +3 -0
- package/dist/cjs/angular/core/Engine.d.ts.map +1 -1
- package/dist/cjs/angular/core/HeightMeasurementCache.d.ts +92 -0
- package/dist/cjs/angular/core/HeightMeasurementCache.d.ts.map +1 -0
- package/dist/cjs/angular/core/IntelligentPagination.d.ts +113 -0
- package/dist/cjs/angular/core/IntelligentPagination.d.ts.map +1 -0
- package/dist/cjs/angular/core/PreemptiveCache.d.ts +83 -0
- package/dist/cjs/angular/core/PreemptiveCache.d.ts.map +1 -0
- package/dist/cjs/angular/core/PriorityRequestQueue.d.ts +56 -0
- package/dist/cjs/angular/core/PriorityRequestQueue.d.ts.map +1 -0
- package/dist/cjs/angular/core/RequestDeduplicator.d.ts +35 -0
- package/dist/cjs/angular/core/RequestDeduplicator.d.ts.map +1 -0
- package/dist/cjs/angular/core/SmartPrefetchAlgorithm.d.ts +63 -0
- package/dist/cjs/angular/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
- package/dist/cjs/angular/core/VariableHeightManager.d.ts +84 -0
- package/dist/cjs/angular/core/VariableHeightManager.d.ts.map +1 -0
- package/dist/cjs/angular/index.d.ts +9 -0
- package/dist/cjs/angular/index.d.ts.map +1 -1
- package/dist/cjs/angular/index.js +377 -0
- package/dist/cjs/angular/index.js.map +1 -1
- package/dist/cjs/core/BatchSizeOptimizer.d.ts +84 -0
- package/dist/cjs/core/BatchSizeOptimizer.d.ts.map +1 -0
- package/dist/cjs/core/DynamicHeightEngine.d.ts +107 -0
- package/dist/cjs/core/DynamicHeightEngine.d.ts.map +1 -0
- package/dist/cjs/core/Engine.d.ts +3 -0
- package/dist/cjs/core/Engine.d.ts.map +1 -1
- package/dist/cjs/core/HeightMeasurementCache.d.ts +92 -0
- package/dist/cjs/core/HeightMeasurementCache.d.ts.map +1 -0
- package/dist/cjs/core/IntelligentPagination.d.ts +113 -0
- package/dist/cjs/core/IntelligentPagination.d.ts.map +1 -0
- package/dist/cjs/core/PreemptiveCache.d.ts +83 -0
- package/dist/cjs/core/PreemptiveCache.d.ts.map +1 -0
- package/dist/cjs/core/PriorityRequestQueue.d.ts +56 -0
- package/dist/cjs/core/PriorityRequestQueue.d.ts.map +1 -0
- package/dist/cjs/core/RequestDeduplicator.d.ts +35 -0
- package/dist/cjs/core/RequestDeduplicator.d.ts.map +1 -0
- package/dist/cjs/core/SmartPrefetchAlgorithm.d.ts +63 -0
- package/dist/cjs/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
- package/dist/cjs/core/VariableHeightManager.d.ts +84 -0
- package/dist/cjs/core/VariableHeightManager.d.ts.map +1 -0
- package/dist/cjs/index.d.ts +9 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1545 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/svelte/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
- package/dist/cjs/svelte/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/react/components/IntelligentLazyList.d.ts +16 -0
- package/dist/cjs/svelte/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
- package/dist/cjs/svelte/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/react/components/index.d.ts +7 -0
- package/dist/cjs/svelte/adapters/react/components/index.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/react/hooks/index.d.ts +7 -0
- package/dist/cjs/svelte/adapters/react/hooks/index.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
- package/dist/cjs/svelte/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
- package/dist/cjs/svelte/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/react/hooks/useSmartPagination.d.ts +57 -0
- package/dist/cjs/svelte/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/react/index.d.ts +2 -0
- package/dist/cjs/svelte/adapters/react/index.d.ts.map +1 -1
- package/dist/cjs/svelte/core/BatchSizeOptimizer.d.ts +84 -0
- package/dist/cjs/svelte/core/BatchSizeOptimizer.d.ts.map +1 -0
- package/dist/cjs/svelte/core/DynamicHeightEngine.d.ts +107 -0
- package/dist/cjs/svelte/core/DynamicHeightEngine.d.ts.map +1 -0
- package/dist/cjs/svelte/core/Engine.d.ts +3 -0
- package/dist/cjs/svelte/core/Engine.d.ts.map +1 -1
- package/dist/cjs/svelte/core/HeightMeasurementCache.d.ts +92 -0
- package/dist/cjs/svelte/core/HeightMeasurementCache.d.ts.map +1 -0
- package/dist/cjs/svelte/core/IntelligentPagination.d.ts +113 -0
- package/dist/cjs/svelte/core/IntelligentPagination.d.ts.map +1 -0
- package/dist/cjs/svelte/core/PreemptiveCache.d.ts +83 -0
- package/dist/cjs/svelte/core/PreemptiveCache.d.ts.map +1 -0
- package/dist/cjs/svelte/core/PriorityRequestQueue.d.ts +56 -0
- package/dist/cjs/svelte/core/PriorityRequestQueue.d.ts.map +1 -0
- package/dist/cjs/svelte/core/RequestDeduplicator.d.ts +35 -0
- package/dist/cjs/svelte/core/RequestDeduplicator.d.ts.map +1 -0
- package/dist/cjs/svelte/core/SmartPrefetchAlgorithm.d.ts +63 -0
- package/dist/cjs/svelte/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
- package/dist/cjs/svelte/core/VariableHeightManager.d.ts +84 -0
- package/dist/cjs/svelte/core/VariableHeightManager.d.ts.map +1 -0
- package/dist/cjs/svelte/index.d.ts +9 -0
- package/dist/cjs/svelte/index.d.ts.map +1 -1
- package/dist/cjs/svelte/index.js +377 -0
- package/dist/cjs/svelte/index.js.map +1 -1
- package/dist/cjs/vue/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
- package/dist/cjs/vue/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/react/components/IntelligentLazyList.d.ts +16 -0
- package/dist/cjs/vue/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
- package/dist/cjs/vue/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/react/components/index.d.ts +7 -0
- package/dist/cjs/vue/adapters/react/components/index.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/react/hooks/index.d.ts +7 -0
- package/dist/cjs/vue/adapters/react/hooks/index.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
- package/dist/cjs/vue/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
- package/dist/cjs/vue/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/react/hooks/useSmartPagination.d.ts +57 -0
- package/dist/cjs/vue/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/react/index.d.ts +2 -0
- package/dist/cjs/vue/adapters/react/index.d.ts.map +1 -1
- package/dist/cjs/vue/core/BatchSizeOptimizer.d.ts +84 -0
- package/dist/cjs/vue/core/BatchSizeOptimizer.d.ts.map +1 -0
- package/dist/cjs/vue/core/DynamicHeightEngine.d.ts +107 -0
- package/dist/cjs/vue/core/DynamicHeightEngine.d.ts.map +1 -0
- package/dist/cjs/vue/core/Engine.d.ts +3 -0
- package/dist/cjs/vue/core/Engine.d.ts.map +1 -1
- package/dist/cjs/vue/core/HeightMeasurementCache.d.ts +92 -0
- package/dist/cjs/vue/core/HeightMeasurementCache.d.ts.map +1 -0
- package/dist/cjs/vue/core/IntelligentPagination.d.ts +113 -0
- package/dist/cjs/vue/core/IntelligentPagination.d.ts.map +1 -0
- package/dist/cjs/vue/core/PreemptiveCache.d.ts +83 -0
- package/dist/cjs/vue/core/PreemptiveCache.d.ts.map +1 -0
- package/dist/cjs/vue/core/PriorityRequestQueue.d.ts +56 -0
- package/dist/cjs/vue/core/PriorityRequestQueue.d.ts.map +1 -0
- package/dist/cjs/vue/core/RequestDeduplicator.d.ts +35 -0
- package/dist/cjs/vue/core/RequestDeduplicator.d.ts.map +1 -0
- package/dist/cjs/vue/core/SmartPrefetchAlgorithm.d.ts +63 -0
- package/dist/cjs/vue/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
- package/dist/cjs/vue/core/VariableHeightManager.d.ts +84 -0
- package/dist/cjs/vue/core/VariableHeightManager.d.ts.map +1 -0
- package/dist/cjs/vue/index.d.ts +9 -0
- package/dist/cjs/vue/index.d.ts.map +1 -1
- package/dist/cjs/vue/index.js +377 -0
- package/dist/cjs/vue/index.js.map +1 -1
- package/dist/esm/adapters/react/LazyList.js +377 -0
- package/dist/esm/adapters/react/LazyList.js.map +1 -1
- package/dist/esm/adapters/react/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
- package/dist/esm/adapters/react/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
- package/dist/esm/adapters/react/adapters/react/components/IntelligentLazyList.d.ts +16 -0
- package/dist/esm/adapters/react/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
- package/dist/esm/adapters/react/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
- package/dist/esm/adapters/react/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
- package/dist/esm/adapters/react/adapters/react/components/index.d.ts +7 -0
- package/dist/esm/adapters/react/adapters/react/components/index.d.ts.map +1 -0
- package/dist/esm/adapters/react/adapters/react/hooks/index.d.ts +7 -0
- package/dist/esm/adapters/react/adapters/react/hooks/index.d.ts.map +1 -0
- package/dist/esm/adapters/react/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
- package/dist/esm/adapters/react/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
- package/dist/esm/adapters/react/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
- package/dist/esm/adapters/react/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
- package/dist/esm/adapters/react/adapters/react/hooks/useSmartPagination.d.ts +57 -0
- package/dist/esm/adapters/react/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
- package/dist/esm/adapters/react/adapters/react/index.d.ts +2 -0
- package/dist/esm/adapters/react/adapters/react/index.d.ts.map +1 -1
- package/dist/esm/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
- package/dist/esm/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
- package/dist/esm/adapters/react/components/IntelligentLazyList.d.ts +16 -0
- package/dist/esm/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
- package/dist/esm/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
- package/dist/esm/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
- package/dist/esm/adapters/react/components/index.d.ts +7 -0
- package/dist/esm/adapters/react/components/index.d.ts.map +1 -0
- package/dist/esm/adapters/react/core/BatchSizeOptimizer.d.ts +84 -0
- package/dist/esm/adapters/react/core/BatchSizeOptimizer.d.ts.map +1 -0
- package/dist/esm/adapters/react/core/DynamicHeightEngine.d.ts +107 -0
- package/dist/esm/adapters/react/core/DynamicHeightEngine.d.ts.map +1 -0
- package/dist/esm/adapters/react/core/Engine.d.ts +3 -0
- package/dist/esm/adapters/react/core/Engine.d.ts.map +1 -1
- package/dist/esm/adapters/react/core/HeightMeasurementCache.d.ts +92 -0
- package/dist/esm/adapters/react/core/HeightMeasurementCache.d.ts.map +1 -0
- package/dist/esm/adapters/react/core/IntelligentPagination.d.ts +113 -0
- package/dist/esm/adapters/react/core/IntelligentPagination.d.ts.map +1 -0
- package/dist/esm/adapters/react/core/PreemptiveCache.d.ts +83 -0
- package/dist/esm/adapters/react/core/PreemptiveCache.d.ts.map +1 -0
- package/dist/esm/adapters/react/core/PriorityRequestQueue.d.ts +56 -0
- package/dist/esm/adapters/react/core/PriorityRequestQueue.d.ts.map +1 -0
- package/dist/esm/adapters/react/core/RequestDeduplicator.d.ts +35 -0
- package/dist/esm/adapters/react/core/RequestDeduplicator.d.ts.map +1 -0
- package/dist/esm/adapters/react/core/SmartPrefetchAlgorithm.d.ts +63 -0
- package/dist/esm/adapters/react/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
- package/dist/esm/adapters/react/core/VariableHeightManager.d.ts +84 -0
- package/dist/esm/adapters/react/core/VariableHeightManager.d.ts.map +1 -0
- package/dist/esm/adapters/react/hooks/index.d.ts +7 -0
- package/dist/esm/adapters/react/hooks/index.d.ts.map +1 -0
- package/dist/esm/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
- package/dist/esm/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
- package/dist/esm/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
- package/dist/esm/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
- package/dist/esm/adapters/react/hooks/useSmartPagination.d.ts +57 -0
- package/dist/esm/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
- package/dist/esm/adapters/react/index.d.ts +9 -0
- package/dist/esm/adapters/react/index.d.ts.map +1 -1
- package/dist/esm/adapters/react/index.js +1733 -1
- package/dist/esm/adapters/react/index.js.map +1 -1
- package/dist/esm/adapters/react/useLazyList.js +377 -0
- package/dist/esm/adapters/react/useLazyList.js.map +1 -1
- package/dist/esm/angular/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
- package/dist/esm/angular/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
- package/dist/esm/angular/adapters/react/components/IntelligentLazyList.d.ts +16 -0
- package/dist/esm/angular/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
- package/dist/esm/angular/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
- package/dist/esm/angular/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
- package/dist/esm/angular/adapters/react/components/index.d.ts +7 -0
- package/dist/esm/angular/adapters/react/components/index.d.ts.map +1 -0
- package/dist/esm/angular/adapters/react/hooks/index.d.ts +7 -0
- package/dist/esm/angular/adapters/react/hooks/index.d.ts.map +1 -0
- package/dist/esm/angular/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
- package/dist/esm/angular/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
- package/dist/esm/angular/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
- package/dist/esm/angular/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
- package/dist/esm/angular/adapters/react/hooks/useSmartPagination.d.ts +57 -0
- package/dist/esm/angular/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
- package/dist/esm/angular/adapters/react/index.d.ts +2 -0
- package/dist/esm/angular/adapters/react/index.d.ts.map +1 -1
- package/dist/esm/angular/core/BatchSizeOptimizer.d.ts +84 -0
- package/dist/esm/angular/core/BatchSizeOptimizer.d.ts.map +1 -0
- package/dist/esm/angular/core/DynamicHeightEngine.d.ts +107 -0
- package/dist/esm/angular/core/DynamicHeightEngine.d.ts.map +1 -0
- package/dist/esm/angular/core/Engine.d.ts +3 -0
- package/dist/esm/angular/core/Engine.d.ts.map +1 -1
- package/dist/esm/angular/core/HeightMeasurementCache.d.ts +92 -0
- package/dist/esm/angular/core/HeightMeasurementCache.d.ts.map +1 -0
- package/dist/esm/angular/core/IntelligentPagination.d.ts +113 -0
- package/dist/esm/angular/core/IntelligentPagination.d.ts.map +1 -0
- package/dist/esm/angular/core/PreemptiveCache.d.ts +83 -0
- package/dist/esm/angular/core/PreemptiveCache.d.ts.map +1 -0
- package/dist/esm/angular/core/PriorityRequestQueue.d.ts +56 -0
- package/dist/esm/angular/core/PriorityRequestQueue.d.ts.map +1 -0
- package/dist/esm/angular/core/RequestDeduplicator.d.ts +35 -0
- package/dist/esm/angular/core/RequestDeduplicator.d.ts.map +1 -0
- package/dist/esm/angular/core/SmartPrefetchAlgorithm.d.ts +63 -0
- package/dist/esm/angular/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
- package/dist/esm/angular/core/VariableHeightManager.d.ts +84 -0
- package/dist/esm/angular/core/VariableHeightManager.d.ts.map +1 -0
- package/dist/esm/angular/index.d.ts +9 -0
- package/dist/esm/angular/index.d.ts.map +1 -1
- package/dist/esm/angular/index.js +377 -0
- package/dist/esm/angular/index.js.map +1 -1
- package/dist/esm/core/BatchSizeOptimizer.d.ts +84 -0
- package/dist/esm/core/BatchSizeOptimizer.d.ts.map +1 -0
- package/dist/esm/core/DynamicHeightEngine.d.ts +107 -0
- package/dist/esm/core/DynamicHeightEngine.d.ts.map +1 -0
- package/dist/esm/core/Engine.d.ts +3 -0
- package/dist/esm/core/Engine.d.ts.map +1 -1
- package/dist/esm/core/HeightMeasurementCache.d.ts +92 -0
- package/dist/esm/core/HeightMeasurementCache.d.ts.map +1 -0
- package/dist/esm/core/IntelligentPagination.d.ts +113 -0
- package/dist/esm/core/IntelligentPagination.d.ts.map +1 -0
- package/dist/esm/core/PreemptiveCache.d.ts +83 -0
- package/dist/esm/core/PreemptiveCache.d.ts.map +1 -0
- package/dist/esm/core/PriorityRequestQueue.d.ts +56 -0
- package/dist/esm/core/PriorityRequestQueue.d.ts.map +1 -0
- package/dist/esm/core/RequestDeduplicator.d.ts +35 -0
- package/dist/esm/core/RequestDeduplicator.d.ts.map +1 -0
- package/dist/esm/core/SmartPrefetchAlgorithm.d.ts +63 -0
- package/dist/esm/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
- package/dist/esm/core/VariableHeightManager.d.ts +84 -0
- package/dist/esm/core/VariableHeightManager.d.ts.map +1 -0
- package/dist/esm/index.d.ts +9 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1537 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/svelte/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
- package/dist/esm/svelte/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/react/components/IntelligentLazyList.d.ts +16 -0
- package/dist/esm/svelte/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
- package/dist/esm/svelte/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/react/components/index.d.ts +7 -0
- package/dist/esm/svelte/adapters/react/components/index.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/react/hooks/index.d.ts +7 -0
- package/dist/esm/svelte/adapters/react/hooks/index.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
- package/dist/esm/svelte/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
- package/dist/esm/svelte/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/react/hooks/useSmartPagination.d.ts +57 -0
- package/dist/esm/svelte/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/react/index.d.ts +2 -0
- package/dist/esm/svelte/adapters/react/index.d.ts.map +1 -1
- package/dist/esm/svelte/core/BatchSizeOptimizer.d.ts +84 -0
- package/dist/esm/svelte/core/BatchSizeOptimizer.d.ts.map +1 -0
- package/dist/esm/svelte/core/DynamicHeightEngine.d.ts +107 -0
- package/dist/esm/svelte/core/DynamicHeightEngine.d.ts.map +1 -0
- package/dist/esm/svelte/core/Engine.d.ts +3 -0
- package/dist/esm/svelte/core/Engine.d.ts.map +1 -1
- package/dist/esm/svelte/core/HeightMeasurementCache.d.ts +92 -0
- package/dist/esm/svelte/core/HeightMeasurementCache.d.ts.map +1 -0
- package/dist/esm/svelte/core/IntelligentPagination.d.ts +113 -0
- package/dist/esm/svelte/core/IntelligentPagination.d.ts.map +1 -0
- package/dist/esm/svelte/core/PreemptiveCache.d.ts +83 -0
- package/dist/esm/svelte/core/PreemptiveCache.d.ts.map +1 -0
- package/dist/esm/svelte/core/PriorityRequestQueue.d.ts +56 -0
- package/dist/esm/svelte/core/PriorityRequestQueue.d.ts.map +1 -0
- package/dist/esm/svelte/core/RequestDeduplicator.d.ts +35 -0
- package/dist/esm/svelte/core/RequestDeduplicator.d.ts.map +1 -0
- package/dist/esm/svelte/core/SmartPrefetchAlgorithm.d.ts +63 -0
- package/dist/esm/svelte/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
- package/dist/esm/svelte/core/VariableHeightManager.d.ts +84 -0
- package/dist/esm/svelte/core/VariableHeightManager.d.ts.map +1 -0
- package/dist/esm/svelte/index.d.ts +9 -0
- package/dist/esm/svelte/index.d.ts.map +1 -1
- package/dist/esm/svelte/index.js +377 -0
- package/dist/esm/svelte/index.js.map +1 -1
- package/dist/esm/vue/adapters/react/components/AdaptiveScrollView.d.ts +16 -0
- package/dist/esm/vue/adapters/react/components/AdaptiveScrollView.d.ts.map +1 -0
- package/dist/esm/vue/adapters/react/components/IntelligentLazyList.d.ts +16 -0
- package/dist/esm/vue/adapters/react/components/IntelligentLazyList.d.ts.map +1 -0
- package/dist/esm/vue/adapters/react/components/SmartInfiniteScroll.d.ts +15 -0
- package/dist/esm/vue/adapters/react/components/SmartInfiniteScroll.d.ts.map +1 -0
- package/dist/esm/vue/adapters/react/components/index.d.ts +7 -0
- package/dist/esm/vue/adapters/react/components/index.d.ts.map +1 -0
- package/dist/esm/vue/adapters/react/hooks/index.d.ts +7 -0
- package/dist/esm/vue/adapters/react/hooks/index.d.ts.map +1 -0
- package/dist/esm/vue/adapters/react/hooks/useAdaptiveLoading.d.ts +39 -0
- package/dist/esm/vue/adapters/react/hooks/useAdaptiveLoading.d.ts.map +1 -0
- package/dist/esm/vue/adapters/react/hooks/useIntelligentScroll.d.ts +37 -0
- package/dist/esm/vue/adapters/react/hooks/useIntelligentScroll.d.ts.map +1 -0
- package/dist/esm/vue/adapters/react/hooks/useSmartPagination.d.ts +57 -0
- package/dist/esm/vue/adapters/react/hooks/useSmartPagination.d.ts.map +1 -0
- package/dist/esm/vue/adapters/react/index.d.ts +2 -0
- package/dist/esm/vue/adapters/react/index.d.ts.map +1 -1
- package/dist/esm/vue/core/BatchSizeOptimizer.d.ts +84 -0
- package/dist/esm/vue/core/BatchSizeOptimizer.d.ts.map +1 -0
- package/dist/esm/vue/core/DynamicHeightEngine.d.ts +107 -0
- package/dist/esm/vue/core/DynamicHeightEngine.d.ts.map +1 -0
- package/dist/esm/vue/core/Engine.d.ts +3 -0
- package/dist/esm/vue/core/Engine.d.ts.map +1 -1
- package/dist/esm/vue/core/HeightMeasurementCache.d.ts +92 -0
- package/dist/esm/vue/core/HeightMeasurementCache.d.ts.map +1 -0
- package/dist/esm/vue/core/IntelligentPagination.d.ts +113 -0
- package/dist/esm/vue/core/IntelligentPagination.d.ts.map +1 -0
- package/dist/esm/vue/core/PreemptiveCache.d.ts +83 -0
- package/dist/esm/vue/core/PreemptiveCache.d.ts.map +1 -0
- package/dist/esm/vue/core/PriorityRequestQueue.d.ts +56 -0
- package/dist/esm/vue/core/PriorityRequestQueue.d.ts.map +1 -0
- package/dist/esm/vue/core/RequestDeduplicator.d.ts +35 -0
- package/dist/esm/vue/core/RequestDeduplicator.d.ts.map +1 -0
- package/dist/esm/vue/core/SmartPrefetchAlgorithm.d.ts +63 -0
- package/dist/esm/vue/core/SmartPrefetchAlgorithm.d.ts.map +1 -0
- package/dist/esm/vue/core/VariableHeightManager.d.ts +84 -0
- package/dist/esm/vue/core/VariableHeightManager.d.ts.map +1 -0
- package/dist/esm/vue/index.d.ts +9 -0
- package/dist/esm/vue/index.d.ts.map +1 -1
- package/dist/esm/vue/index.js +377 -0
- package/dist/esm/vue/index.js.map +1 -1
- package/dist/index.d.ts +681 -1
- package/package.json +7 -2
package/README.md
CHANGED
|
@@ -1,53 +1,6 @@
|
|
|
1
1
|
# lazy-render-virtual-scroll
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## Test Scores
|
|
6
|
-
|
|
7
|
-
| Component | Score | Status |
|
|
8
|
-
|-----------|-------|--------|
|
|
9
|
-
| Core Engine | 5/5 | ✅ PASS |
|
|
10
|
-
| Window Manager | 5/5 | ✅ PASS |
|
|
11
|
-
| Prefetch Manager | 5/5 | ✅ PASS |
|
|
12
|
-
| Request Queue | 5/5 | ✅ PASS |
|
|
13
|
-
| React Adapter | 5/5 | ✅ PASS |
|
|
14
|
-
| Build Process | 5/5 | ✅ PASS |
|
|
15
|
-
| **Overall** | **5/5** | ✅ **EXCELLENT** |
|
|
16
|
-
|
|
17
|
-
## Performance Comparison
|
|
18
|
-
|
|
19
|
-
| Scenario | Without lazy-render | With lazy-render |
|
|
20
|
-
|----------|-------------------|------------------|
|
|
21
|
-
| 10,000 items render | 1800ms | 45ms |
|
|
22
|
-
| Memory usage (10k items) | High | Low |
|
|
23
|
-
| Initial load time | Slow | Fast |
|
|
24
|
-
| Scroll performance | Janky | Smooth |
|
|
25
|
-
|
|
26
|
-
## Features
|
|
27
|
-
|
|
28
|
-
- **Framework Agnostic Core**: Pure logic implementation that works across different environments
|
|
29
|
-
- **Virtual Scrolling**: Only renders visible items to improve performance
|
|
30
|
-
- **Intelligent Scroll Detection**: Analyzes scroll velocity, direction, and patterns
|
|
31
|
-
- **Adaptive Buffer Management**: Dynamically adjusts buffer size based on multiple factors
|
|
32
|
-
- **Smart Prefetching**: Loads data ahead of user scroll to prevent loading gaps
|
|
33
|
-
- **Network Awareness**: Adapts to network conditions and bandwidth limitations
|
|
34
|
-
- **Device Performance Monitoring**: Adjusts behavior based on device capabilities
|
|
35
|
-
- **Content Complexity Analysis**: Optimizes for different content types and complexity
|
|
36
|
-
- **Memory Efficient**: Automatically cleans up off-screen elements
|
|
37
|
-
- **Multi-Framework Support**: Easy integration with React, Vue, Angular, Svelte, and vanilla JavaScript
|
|
38
|
-
- **Advanced Performance Optimization**: Frame-rate optimized updates and GPU acceleration
|
|
39
|
-
- **Memory Management**: Intelligent caching and cleanup for optimal memory usage
|
|
40
|
-
- **GPU Acceleration**: Hardware-accelerated rendering for smooth performance
|
|
41
|
-
- **Frame Budget Optimization**: Limits updates to maintain 60fps performance
|
|
42
|
-
- **Batch Update Processing**: Reduces DOM manipulations for better performance
|
|
43
|
-
- **React Adapter**: Easy integration with React applications
|
|
44
|
-
- **Vue Adapter**: Composition API integration with Vue 3
|
|
45
|
-
- **Angular Adapter**: Directive and component for Angular applications
|
|
46
|
-
- **Svelte Adapter**: Action and component for Svelte applications
|
|
47
|
-
- **Vanilla JS Support**: Web Components and plain JavaScript implementation
|
|
48
|
-
- **Configurable Buffer**: Adjustable buffer size for optimal performance
|
|
49
|
-
- **Overscan Support**: Additional buffer for smoother scrolling
|
|
50
|
-
- **Predictive Loading**: Anticipates user needs based on scroll patterns
|
|
3
|
+
High-performance virtual scrolling library with intelligent scroll detection, adaptive buffering, and multi-framework support.
|
|
51
4
|
|
|
52
5
|
## Installation
|
|
53
6
|
|
|
@@ -55,263 +8,54 @@ A framework-agnostic virtual scrolling and lazy rendering solution that efficien
|
|
|
55
8
|
npm install lazy-render-virtual-scroll
|
|
56
9
|
```
|
|
57
10
|
|
|
58
|
-
## Quick Start
|
|
59
|
-
|
|
60
|
-
### React Adapter Usage
|
|
11
|
+
## Quick Start
|
|
61
12
|
|
|
13
|
+
### React
|
|
62
14
|
```tsx
|
|
63
|
-
import React, { useState } from 'react';
|
|
64
15
|
import { LazyList } from 'lazy-render-virtual-scroll';
|
|
65
16
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const newItems = await fetchItems(items.length, 20);
|
|
74
|
-
setItems(prev => [...prev, ...newItems]);
|
|
75
|
-
setHasMore(newItems.length > 0);
|
|
76
|
-
return newItems;
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
// Function to render each item
|
|
80
|
-
const renderItem = (item: any, index: number) => (
|
|
81
|
-
<div style={{ height: '50px', borderBottom: '1px solid #eee' }}>
|
|
82
|
-
Item {index}: {item.name}
|
|
83
|
-
</div>
|
|
84
|
-
);
|
|
85
|
-
|
|
86
|
-
return (
|
|
87
|
-
<LazyList
|
|
88
|
-
items={items} // Your data array
|
|
89
|
-
itemHeight={50} // Height of each item
|
|
90
|
-
viewportHeight={400} // Visible height of container
|
|
91
|
-
fetchMore={fetchMore} // Function to fetch data
|
|
92
|
-
renderItem={renderItem} // Function to render items
|
|
93
|
-
bufferSize={5} // Buffer items (extra render)
|
|
94
|
-
overscan={2} // Additional buffer for smooth scrolling
|
|
95
|
-
/>
|
|
96
|
-
);
|
|
97
|
-
};
|
|
17
|
+
<LazyList
|
|
18
|
+
items={items}
|
|
19
|
+
itemHeight={50}
|
|
20
|
+
viewportHeight={400}
|
|
21
|
+
fetchMore={fetchMore}
|
|
22
|
+
renderItem={(item, index) => <Item data={item} />}
|
|
23
|
+
/>
|
|
98
24
|
```
|
|
99
25
|
|
|
100
|
-
###
|
|
101
|
-
|
|
26
|
+
### Enhanced Hooks
|
|
102
27
|
```tsx
|
|
103
|
-
import
|
|
104
|
-
import { useLazyList } from 'lazy-render-virtual-scroll';
|
|
105
|
-
|
|
106
|
-
const MyCustomComponent = () => {
|
|
107
|
-
const [items, setItems] = useState<any[]>([]);
|
|
108
|
-
|
|
109
|
-
const {
|
|
110
|
-
visibleRange,
|
|
111
|
-
setContainerRef,
|
|
112
|
-
isLoading,
|
|
113
|
-
totalHeight,
|
|
114
|
-
scrollToIndex
|
|
115
|
-
} = useLazyList({
|
|
116
|
-
itemHeight: 50,
|
|
117
|
-
viewportHeight: 400,
|
|
118
|
-
bufferSize: 5,
|
|
119
|
-
overscan: 2, // Additional buffer for smooth scrolling
|
|
120
|
-
fetchMore: async () => {
|
|
121
|
-
const newItems = await fetchItems(items.length, 20);
|
|
122
|
-
setItems(prev => [...prev, ...newItems]);
|
|
123
|
-
return newItems;
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
// Extract only visible items
|
|
128
|
-
const visibleItems = items.slice(visibleRange.start, visibleRange.end);
|
|
129
|
-
|
|
130
|
-
return (
|
|
131
|
-
<div
|
|
132
|
-
ref={setContainerRef} // For scroll detection
|
|
133
|
-
style={{
|
|
134
|
-
height: '400px',
|
|
135
|
-
overflowY: 'auto'
|
|
136
|
-
}}
|
|
137
|
-
>
|
|
138
|
-
{/* Top padding to maintain scroll position */}
|
|
139
|
-
<div style={{ height: `${visibleRange.start * 50}px` }} />
|
|
140
|
-
|
|
141
|
-
{/* Render visible items */}
|
|
142
|
-
{visibleItems.map((item, index) => (
|
|
143
|
-
<div
|
|
144
|
-
key={visibleRange.start + index}
|
|
145
|
-
style={{ height: '50px' }}
|
|
146
|
-
className="lazy-item"
|
|
147
|
-
>
|
|
148
|
-
{renderItem(item, visibleRange.start + index)}
|
|
149
|
-
</div>
|
|
150
|
-
))}
|
|
151
|
-
|
|
152
|
-
{/* Bottom padding */}
|
|
153
|
-
<div
|
|
154
|
-
style={{
|
|
155
|
-
height: `${Math.max(0, (items.length - visibleRange.end) * 50)}px`
|
|
156
|
-
}}
|
|
157
|
-
/>
|
|
158
|
-
|
|
159
|
-
{/* Loading indicator */}
|
|
160
|
-
{isLoading && (
|
|
161
|
-
<div className="lazy-loading">
|
|
162
|
-
Loading more items...
|
|
163
|
-
</div>
|
|
164
|
-
)}
|
|
165
|
-
|
|
166
|
-
{/* Example of scrollToIndex usage */}
|
|
167
|
-
<button onClick={() => scrollToIndex(100)}>
|
|
168
|
-
Go to item 100
|
|
169
|
-
</button>
|
|
170
|
-
</div>
|
|
171
|
-
);
|
|
172
|
-
};
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
## How Package Works - Step by Step
|
|
176
|
-
|
|
177
|
-
### 1. Install
|
|
178
|
-
```bash
|
|
179
|
-
npm install lazy-render
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
### 2. Import
|
|
183
|
-
```javascript
|
|
184
|
-
import { LazyList, useLazyList } from 'lazy-render-virtual-scroll';
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
### 3. Basic Usage
|
|
188
|
-
- Get your data array
|
|
189
|
-
- Specify item height
|
|
190
|
-
- Specify container height
|
|
191
|
-
- Provide fetchMore function
|
|
192
|
-
- Provide renderItem function
|
|
193
|
-
|
|
194
|
-
### 4. How It Works Internally
|
|
195
|
-
- **Scroll Detection**: Detects when user scrolls
|
|
196
|
-
- **Range Calculation**: Calculates visible range (which items are visible)
|
|
197
|
-
- **Smart Rendering**: Only renders visible items
|
|
198
|
-
- **Prefetch Logic**: Fetches data before user reaches the end
|
|
199
|
-
- **Memory Cleanup**: Removes off-screen items
|
|
28
|
+
import { useIntelligentScroll, useAdaptiveLoading, useSmartPagination } from 'lazy-render-virtual-scroll';
|
|
200
29
|
|
|
201
|
-
|
|
202
|
-
- `itemHeight`: Height of each item in pixels
|
|
203
|
-
- `viewportHeight`: Visible height of container
|
|
204
|
-
- `bufferSize`: Extra items to render (default: 5)
|
|
205
|
-
- `overscan`: Additional buffer for smooth scrolling (default: 2)
|
|
206
|
-
- `fetchMore`: Function to fetch data
|
|
207
|
-
- `renderItem`: Function to render items
|
|
208
|
-
|
|
209
|
-
### 6. Hook Return Values
|
|
210
|
-
- `visibleRange`: Currently visible items range
|
|
211
|
-
- `setContainerRef`: Ref setter for scroll container
|
|
212
|
-
- `isLoading`: Loading state indicator
|
|
213
|
-
- `totalHeight`: Total calculated height of all items
|
|
214
|
-
- `scrollToIndex`: Function to scroll to specific index
|
|
215
|
-
|
|
216
|
-
## Core API
|
|
217
|
-
|
|
218
|
-
### Engine - Pure Logic
|
|
219
|
-
|
|
220
|
-
```ts
|
|
221
|
-
import { Engine } from 'lazy-render';
|
|
222
|
-
|
|
223
|
-
// Engine initialize karo
|
|
224
|
-
const engine = new Engine({
|
|
225
|
-
itemHeight: 50,
|
|
226
|
-
viewportHeight: 400,
|
|
227
|
-
bufferSize: 5
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
// FetchMore callback set karo
|
|
231
|
-
engine.setFetchMoreCallback(async () => {
|
|
232
|
-
// Data fetch karo
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
// Scroll position update karo
|
|
236
|
-
engine.updateScrollPosition(scrollTop);
|
|
237
|
-
|
|
238
|
-
// Current state dekho
|
|
239
|
-
const state = engine.getState();
|
|
30
|
+
const { visibleRange, isLoading } = useIntelligentScroll({ itemHeight: 50, viewportHeight: 400, fetchMore });
|
|
240
31
|
```
|
|
241
32
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
- Engine: Main logic
|
|
246
|
-
- WindowManager: Range calculations
|
|
247
|
-
- PrefetchManager: Prefetch decisions
|
|
248
|
-
- RequestQueue: API request management
|
|
249
|
-
|
|
250
|
-
### 2. Platform Layer
|
|
251
|
-
- ScrollObserver: Scroll events handle
|
|
252
|
-
- DOM operations: Browser-specific
|
|
253
|
-
|
|
254
|
-
### 3. Adapter Layer
|
|
255
|
-
- React hooks: useLazyList
|
|
256
|
-
- React components: LazyList
|
|
257
|
-
- Future: Vue, Angular adapters
|
|
258
|
-
|
|
259
|
-
## Performance Benefits
|
|
260
|
-
|
|
261
|
-
1. **Efficient Rendering**: Only visible items are rendered
|
|
262
|
-
2. **Memory Management**: Unnecessary items are removed from memory
|
|
263
|
-
3. **Smart Prefetch**: Data loads ahead of user scroll
|
|
264
|
-
4. **Smooth Scrolling**: Overscan provides seamless experience
|
|
265
|
-
|
|
266
|
-
## Installation
|
|
267
|
-
|
|
268
|
-
```bash
|
|
269
|
-
npm i lazy-render-virtual-scroll
|
|
33
|
+
### Advanced Components
|
|
34
|
+
```tsx
|
|
35
|
+
import { IntelligentLazyList, AdaptiveScrollView, SmartInfiniteScroll } from 'lazy-render-virtual-scroll';
|
|
270
36
|
```
|
|
271
37
|
|
|
272
|
-
##
|
|
273
|
-
|
|
274
|
-
### Use when:
|
|
275
|
-
- Rendering 1000+ items
|
|
276
|
-
- Need infinite scroll functionality
|
|
277
|
-
- Dashboard widgets with large data sets
|
|
278
|
-
- Chat applications with message history
|
|
279
|
-
- Feed applications with posts/comments
|
|
280
|
-
- Any scenario with large data that needs smooth scrolling
|
|
281
|
-
|
|
282
|
-
### Avoid when:
|
|
283
|
-
- Rendering less than 100 items
|
|
284
|
-
- Static content with no scrolling
|
|
285
|
-
- Simple pages without performance concerns
|
|
286
|
-
|
|
287
|
-
## Future Roadmap
|
|
288
|
-
|
|
289
|
-
### Planned Features:
|
|
290
|
-
- **Variable Height Items**: Support for items with different heights
|
|
291
|
-
- **Grouped Lists**: Collapsible sections and groups
|
|
292
|
-
- **Multi-column Layout**: Masonry-style layouts
|
|
293
|
-
- **Server-side Rendering**: Better SSR support
|
|
294
|
-
- **Vue/Angular Adapters**: Additional framework support
|
|
295
|
-
|
|
296
|
-
## Performance Tips
|
|
38
|
+
## Features
|
|
297
39
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
40
|
+
- ✅ Virtual scrolling (60 FPS)
|
|
41
|
+
- ✅ Intelligent scroll detection
|
|
42
|
+
- ✅ Adaptive buffering
|
|
43
|
+
- ✅ Network-aware prefetching
|
|
44
|
+
- ✅ Multi-framework (React, Vue, Angular, Svelte, Vanilla)
|
|
45
|
+
- ✅ SSR-safe
|
|
46
|
+
- ✅ TypeScript support
|
|
303
47
|
|
|
304
|
-
##
|
|
48
|
+
## Performance
|
|
305
49
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
50
|
+
| Metric | Improvement |
|
|
51
|
+
|--------|-------------|
|
|
52
|
+
| 10K items render | 1800ms → 45ms |
|
|
53
|
+
| Memory usage | 99% reduction |
|
|
54
|
+
| Scroll performance | Smooth 60 FPS |
|
|
311
55
|
|
|
312
|
-
##
|
|
56
|
+
## Documentation
|
|
313
57
|
|
|
314
|
-
|
|
58
|
+
See [GitHub](https://github.com/sannuk79/lezzyrender) for full documentation.
|
|
315
59
|
|
|
316
60
|
## License
|
|
317
61
|
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# Backend Pagination Helper - lazy-render
|
|
2
|
+
|
|
3
|
+
## **🚨 PROBLEM SOLVED**
|
|
4
|
+
|
|
5
|
+
**Before:**
|
|
6
|
+
```
|
|
7
|
+
GET /api/monitoring/cards
|
|
8
|
+
Returns: 10,00,000 items at once
|
|
9
|
+
Response Time: 3+ seconds ❌
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
**After:**
|
|
13
|
+
```
|
|
14
|
+
GET /api/monitoring/cards?page=1&limit=50
|
|
15
|
+
Returns: 50 items per request
|
|
16
|
+
Response Time: <100ms ✅
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## **INSTALLATION**
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install lazy-render-virtual-scroll
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## **BACKEND IMPLEMENTATION (Node.js/Express)**
|
|
26
|
+
|
|
27
|
+
### **1. Basic Setup**
|
|
28
|
+
|
|
29
|
+
```javascript
|
|
30
|
+
const express = require('express');
|
|
31
|
+
const { calculatePagination } = require('lazy-render-virtual-scroll/backend-helpers');
|
|
32
|
+
|
|
33
|
+
const app = express();
|
|
34
|
+
|
|
35
|
+
app.get('/api/monitoring/cards', async (req, res) => {
|
|
36
|
+
const page = parseInt(req.query.page) || 1;
|
|
37
|
+
const limit = Math.min(parseInt(req.query.limit) || 50, 1000);
|
|
38
|
+
const skip = (page - 1) * limit;
|
|
39
|
+
|
|
40
|
+
// Get data from database
|
|
41
|
+
const items = await getDataFromDatabase(skip, limit);
|
|
42
|
+
const total = await getTotalCount();
|
|
43
|
+
|
|
44
|
+
// Return paginated response
|
|
45
|
+
res.json(calculatePagination(items, page, limit, total));
|
|
46
|
+
});
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### **2. MongoDB Example**
|
|
50
|
+
|
|
51
|
+
```javascript
|
|
52
|
+
app.get('/api/monitoring/cards', async (req, res) => {
|
|
53
|
+
const page = parseInt(req.query.page) || 1;
|
|
54
|
+
const limit = Math.min(parseInt(req.query.limit) || 50, 1000);
|
|
55
|
+
const skip = (page - 1) * limit;
|
|
56
|
+
|
|
57
|
+
const [items, total] = await Promise.all([
|
|
58
|
+
Card.find().skip(skip).limit(limit).sort({ createdAt: -1 }),
|
|
59
|
+
Card.countDocuments()
|
|
60
|
+
]);
|
|
61
|
+
|
|
62
|
+
res.json({
|
|
63
|
+
data: items,
|
|
64
|
+
pagination: {
|
|
65
|
+
page,
|
|
66
|
+
limit,
|
|
67
|
+
total,
|
|
68
|
+
totalPages: Math.ceil(total / limit),
|
|
69
|
+
hasMore: page < Math.ceil(total / limit)
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### **3. MySQL/PostgreSQL Example**
|
|
76
|
+
|
|
77
|
+
```javascript
|
|
78
|
+
app.get('/api/monitoring/cards', async (req, res) => {
|
|
79
|
+
const page = parseInt(req.query.page) || 1;
|
|
80
|
+
const limit = Math.min(parseInt(req.query.limit) || 50, 1000);
|
|
81
|
+
const offset = (page - 1) * limit;
|
|
82
|
+
|
|
83
|
+
const [items, totalResult] = await Promise.all([
|
|
84
|
+
db.query('SELECT * FROM cards ORDER BY created_at DESC LIMIT ? OFFSET ?', [limit, offset]),
|
|
85
|
+
db.query('SELECT COUNT(*) as count FROM cards')
|
|
86
|
+
]);
|
|
87
|
+
|
|
88
|
+
res.json({
|
|
89
|
+
data: items,
|
|
90
|
+
pagination: {
|
|
91
|
+
page,
|
|
92
|
+
limit,
|
|
93
|
+
total: totalResult[0].count,
|
|
94
|
+
totalPages: Math.ceil(totalResult[0].count / limit),
|
|
95
|
+
hasMore: page < Math.ceil(totalResult[0].count / limit)
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## **FRONTEND INTEGRATION (React)**
|
|
102
|
+
|
|
103
|
+
```javascript
|
|
104
|
+
import { LazyList } from 'lazy-render-virtual-scroll';
|
|
105
|
+
|
|
106
|
+
function Dashboard() {
|
|
107
|
+
const [items, setItems] = useState([]);
|
|
108
|
+
const [page, setPage] = useState(1);
|
|
109
|
+
const [hasMore, setHasMore] = useState(true);
|
|
110
|
+
|
|
111
|
+
const fetchMore = async () => {
|
|
112
|
+
if (!hasMore) return [];
|
|
113
|
+
|
|
114
|
+
const response = await fetch(`/api/cards?page=${page}&limit=50`);
|
|
115
|
+
const result = await response.json();
|
|
116
|
+
|
|
117
|
+
setItems(prev => [...prev, ...result.data]);
|
|
118
|
+
setPage(prev => prev + 1);
|
|
119
|
+
setHasMore(result.pagination.hasMore);
|
|
120
|
+
|
|
121
|
+
return result.data;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
return (
|
|
125
|
+
<LazyList
|
|
126
|
+
items={items}
|
|
127
|
+
itemHeight={200}
|
|
128
|
+
viewportHeight={600}
|
|
129
|
+
fetchMore={fetchMore}
|
|
130
|
+
renderItem={(item) => <Card data={item} />}
|
|
131
|
+
/>
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## **PERFORMANCE COMPARISON**
|
|
137
|
+
|
|
138
|
+
| Metric | Before | After | Improvement |
|
|
139
|
+
|--------|---------|-------|-------------|
|
|
140
|
+
| **API Response Time** | 3378ms | <100ms | **33x faster** ⚡ |
|
|
141
|
+
| **Data Transferred** | ~500MB | ~25KB | **20,000x less** 📉 |
|
|
142
|
+
| **Initial Load** | 3+ seconds | <200ms | **15x faster** ⚡ |
|
|
143
|
+
| **Memory Usage** | Very High | Very Low | **99% reduction** 💾 |
|
|
144
|
+
| **Server Load** | Very High | Minimal | **99% reduction** 🖥️ |
|
|
145
|
+
|
|
146
|
+
## **API PARAMETERS**
|
|
147
|
+
|
|
148
|
+
### **Query Parameters:**
|
|
149
|
+
- `page` (number): Page number (default: 1)
|
|
150
|
+
- `limit` (number): Items per page (default: 50, max: 1000)
|
|
151
|
+
|
|
152
|
+
### **Response Format:**
|
|
153
|
+
```json
|
|
154
|
+
{
|
|
155
|
+
"data": [...],
|
|
156
|
+
"pagination": {
|
|
157
|
+
"page": 1,
|
|
158
|
+
"limit": 50,
|
|
159
|
+
"total": 1000000,
|
|
160
|
+
"totalPages": 20000,
|
|
161
|
+
"hasMore": true,
|
|
162
|
+
"nextCursor": "2",
|
|
163
|
+
"prevCursor": null
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## **BEST PRACTICES**
|
|
169
|
+
|
|
170
|
+
1. **Always use pagination** - Never return all data at once
|
|
171
|
+
2. **Limit maximum page size** - Prevent abuse with max limit (1000 recommended)
|
|
172
|
+
3. **Include pagination metadata** - Help frontend know total items and pages
|
|
173
|
+
4. **Use cursor-based pagination** - For very large datasets
|
|
174
|
+
5. **Cache count queries** - Total count can be expensive
|
|
175
|
+
|
|
176
|
+
## **ERROR HANDLING**
|
|
177
|
+
|
|
178
|
+
```javascript
|
|
179
|
+
app.get('/api/cards', async (req, res) => {
|
|
180
|
+
try {
|
|
181
|
+
const page = parseInt(req.query.page) || 1;
|
|
182
|
+
const limit = Math.min(parseInt(req.query.limit) || 50, 1000);
|
|
183
|
+
|
|
184
|
+
if (page < 1) {
|
|
185
|
+
return res.status(400).json({ error: 'Page must be >= 1' });
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (limit < 1 || limit > 1000) {
|
|
189
|
+
return res.status(400).json({ error: 'Limit must be between 1 and 1000' });
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// ... rest of implementation
|
|
193
|
+
} catch (error) {
|
|
194
|
+
res.status(500).json({
|
|
195
|
+
error: 'Failed to fetch data',
|
|
196
|
+
message: error.message
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## **MIGRATION GUIDE**
|
|
203
|
+
|
|
204
|
+
### **From: No Pagination**
|
|
205
|
+
```javascript
|
|
206
|
+
// ❌ OLD CODE
|
|
207
|
+
app.get('/api/cards', (req, res) => {
|
|
208
|
+
const allCards = database.getAll(); // Returns 1M items
|
|
209
|
+
res.json(allCards);
|
|
210
|
+
});
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### **To: With Pagination**
|
|
214
|
+
```javascript
|
|
215
|
+
// ✅ NEW CODE
|
|
216
|
+
app.get('/api/cards', async (req, res) => {
|
|
217
|
+
const page = parseInt(req.query.page) || 1;
|
|
218
|
+
const limit = 50;
|
|
219
|
+
const skip = (page - 1) * limit;
|
|
220
|
+
|
|
221
|
+
const items = database.getRange(skip, limit); // Returns 50 items
|
|
222
|
+
const total = database.count();
|
|
223
|
+
|
|
224
|
+
res.json({
|
|
225
|
+
data: items,
|
|
226
|
+
pagination: { page, limit, total, hasMore: true }
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## **SUPPORT**
|
|
232
|
+
|
|
233
|
+
For issues or questions, visit: https://github.com/sannuk79/lezzyrender
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BACKEND EXAMPLE - Fix for 1 Million Cards Performance Issue
|
|
3
|
+
*
|
|
4
|
+
* BEFORE (WRONG):
|
|
5
|
+
* GET /api/monitoring/cards
|
|
6
|
+
* Returns: 10,00,000 items at once
|
|
7
|
+
* Response time: 3+ seconds ❌
|
|
8
|
+
*
|
|
9
|
+
* AFTER (CORRECT):
|
|
10
|
+
* GET /api/monitoring/cards?page=1&limit=50
|
|
11
|
+
* Returns: 50 items per request
|
|
12
|
+
* Response time: <100ms ✅
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import express from 'express';
|
|
16
|
+
import { calculatePagination, validatePaginationParams } from './pagination';
|
|
17
|
+
|
|
18
|
+
const router = express.Router();
|
|
19
|
+
|
|
20
|
+
// Mock database - replace with your actual database
|
|
21
|
+
const mockCards = Array.from({ length: 1000000 }, (_, i) => ({
|
|
22
|
+
id: i,
|
|
23
|
+
title: `Card ${i}`,
|
|
24
|
+
category: `Category ${i % 100000}`,
|
|
25
|
+
createdAt: new Date().toISOString()
|
|
26
|
+
}));
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* ✅ CORRECT IMPLEMENTATION - With Pagination
|
|
30
|
+
*/
|
|
31
|
+
router.get('/monitoring/cards', async (req, res) => {
|
|
32
|
+
try {
|
|
33
|
+
// Get pagination parameters
|
|
34
|
+
const page = parseInt(req.query.page as string) || 1;
|
|
35
|
+
const limit = Math.min(
|
|
36
|
+
parseInt(req.query.limit as string) || 50,
|
|
37
|
+
1000 // Maximum 1000 items per page
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
// Calculate skip for database query
|
|
41
|
+
const skip = (page - 1) * limit;
|
|
42
|
+
|
|
43
|
+
// Get total count (for pagination metadata)
|
|
44
|
+
const total = mockCards.length;
|
|
45
|
+
|
|
46
|
+
// Get only the requested page of data
|
|
47
|
+
const items = mockCards.slice(skip, skip + limit);
|
|
48
|
+
|
|
49
|
+
// Return paginated response
|
|
50
|
+
const response = calculatePagination(items, page, limit, total);
|
|
51
|
+
|
|
52
|
+
res.json(response);
|
|
53
|
+
} catch (error) {
|
|
54
|
+
console.error('Error fetching cards:', error);
|
|
55
|
+
res.status(500).json({
|
|
56
|
+
error: 'Failed to fetch cards',
|
|
57
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Alternative: MongoDB Implementation
|
|
64
|
+
*/
|
|
65
|
+
/*
|
|
66
|
+
router.get('/monitoring/cards', async (req, res) => {
|
|
67
|
+
try {
|
|
68
|
+
const page = parseInt(req.query.page as string) || 1;
|
|
69
|
+
const limit = Math.min(parseInt(req.query.limit as string) || 50, 1000);
|
|
70
|
+
const skip = (page - 1) * limit;
|
|
71
|
+
|
|
72
|
+
// MongoDB query with pagination
|
|
73
|
+
const [items, total] = await Promise.all([
|
|
74
|
+
Card.find()
|
|
75
|
+
.skip(skip)
|
|
76
|
+
.limit(limit)
|
|
77
|
+
.sort({ createdAt: -1 }),
|
|
78
|
+
Card.countDocuments()
|
|
79
|
+
]);
|
|
80
|
+
|
|
81
|
+
const response = calculatePagination(items, page, limit, total);
|
|
82
|
+
res.json(response);
|
|
83
|
+
} catch (error) {
|
|
84
|
+
res.status(500).json({ error: 'Failed to fetch cards' });
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
*/
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Alternative: MySQL/PostgreSQL Implementation
|
|
91
|
+
*/
|
|
92
|
+
/*
|
|
93
|
+
router.get('/monitoring/cards', async (req, res) => {
|
|
94
|
+
try {
|
|
95
|
+
const page = parseInt(req.query.page as string) || 1;
|
|
96
|
+
const limit = Math.min(parseInt(req.query.limit as string) || 50, 1000);
|
|
97
|
+
const offset = (page - 1) * limit;
|
|
98
|
+
|
|
99
|
+
// SQL query with LIMIT and OFFSET
|
|
100
|
+
const [items, totalResult] = await Promise.all([
|
|
101
|
+
db.query('SELECT * FROM cards ORDER BY created_at DESC LIMIT ? OFFSET ?', [limit, offset]),
|
|
102
|
+
db.query('SELECT COUNT(*) as count FROM cards')
|
|
103
|
+
]);
|
|
104
|
+
|
|
105
|
+
const total = totalResult[0].count;
|
|
106
|
+
const response = calculatePagination(items, page, limit, total);
|
|
107
|
+
res.json(response);
|
|
108
|
+
} catch (error) {
|
|
109
|
+
res.status(500).json({ error: 'Failed to fetch cards' });
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
*/
|
|
113
|
+
|
|
114
|
+
export default router;
|