lazy-render-virtual-scroll 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/angular/index.d.ts +57 -0
- package/dist/cjs/adapters/angular/lazy-scroll.component.d.ts +28 -0
- package/dist/cjs/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
- package/dist/cjs/adapters/angular/lazy-scroll.directive.d.ts +21 -0
- package/dist/cjs/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
- package/dist/cjs/adapters/index.d.ts +7 -0
- package/dist/cjs/adapters/index.d.ts.map +1 -0
- package/dist/cjs/adapters/svelte/lazyScrollAction.d.ts +13 -0
- package/dist/cjs/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
- package/dist/cjs/adapters/vue/useLazyScroll.d.ts +13 -0
- package/dist/cjs/adapters/vue/useLazyScroll.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/angular/lazy-scroll.component.d.ts +28 -0
- package/dist/cjs/angular/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/angular/lazy-scroll.directive.d.ts +21 -0
- package/dist/cjs/angular/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/index.d.ts +7 -0
- package/dist/cjs/angular/adapters/index.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/react/LazyList.d.ts +12 -0
- package/dist/cjs/angular/adapters/react/LazyList.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/react/useLazyList.d.ts +22 -0
- package/dist/cjs/angular/adapters/react/useLazyList.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/svelte/lazyScrollAction.d.ts +13 -0
- package/dist/cjs/angular/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/vue/useLazyScroll.d.ts +13 -0
- package/dist/cjs/angular/adapters/vue/useLazyScroll.d.ts.map +1 -0
- package/dist/cjs/angular/core/AdaptiveBufferCalculator.d.ts +46 -0
- package/dist/cjs/angular/core/AdaptiveBufferCalculator.d.ts.map +1 -0
- package/dist/cjs/angular/core/ContentComplexityAnalyzer.d.ts +13 -0
- package/dist/cjs/angular/core/ContentComplexityAnalyzer.d.ts.map +1 -0
- package/dist/cjs/angular/core/DevicePerformanceMonitor.d.ts +22 -0
- package/dist/cjs/angular/core/DevicePerformanceMonitor.d.ts.map +1 -0
- package/dist/cjs/angular/core/Engine.d.ts +56 -0
- package/dist/cjs/angular/core/Engine.d.ts.map +1 -0
- package/dist/cjs/angular/core/GPUAccelerator.d.ts +23 -0
- package/dist/cjs/angular/core/GPUAccelerator.d.ts.map +1 -0
- package/dist/cjs/angular/core/IntelligentScrollDetector.d.ts +19 -0
- package/dist/cjs/angular/core/IntelligentScrollDetector.d.ts.map +1 -0
- package/dist/cjs/angular/core/MemoryManager.d.ts +33 -0
- package/dist/cjs/angular/core/MemoryManager.d.ts.map +1 -0
- package/dist/cjs/angular/core/NetworkAwarePrefetchManager.d.ts +10 -0
- package/dist/cjs/angular/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
- package/dist/cjs/angular/core/NetworkAwareRequestQueue.d.ts +20 -0
- package/dist/cjs/angular/core/NetworkAwareRequestQueue.d.ts.map +1 -0
- package/dist/cjs/angular/core/NetworkSpeedDetector.d.ts +16 -0
- package/dist/cjs/angular/core/NetworkSpeedDetector.d.ts.map +1 -0
- package/dist/cjs/angular/core/PerformanceOptimizer.d.ts +39 -0
- package/dist/cjs/angular/core/PerformanceOptimizer.d.ts.map +1 -0
- package/dist/cjs/angular/core/PrefetchManager.d.ts +16 -0
- package/dist/cjs/angular/core/PrefetchManager.d.ts.map +1 -0
- package/dist/cjs/angular/core/RequestQueue.d.ts +23 -0
- package/dist/cjs/angular/core/RequestQueue.d.ts.map +1 -0
- package/dist/cjs/angular/core/WindowManager.d.ts +24 -0
- package/dist/cjs/angular/core/WindowManager.d.ts.map +1 -0
- package/dist/cjs/angular/core/types.d.ts +28 -0
- package/dist/cjs/angular/core/types.d.ts.map +1 -0
- package/dist/cjs/angular/index.d.ts +23 -0
- package/dist/cjs/angular/index.d.ts.map +1 -0
- package/dist/cjs/angular/index.js +1717 -0
- package/dist/cjs/angular/index.js.map +1 -0
- package/dist/cjs/angular/platform/browser/ScrollObserver.d.ts +25 -0
- package/dist/cjs/angular/platform/browser/ScrollObserver.d.ts.map +1 -0
- package/dist/cjs/angular/utils/debounce.d.ts +5 -0
- package/dist/cjs/angular/utils/debounce.d.ts.map +1 -0
- package/dist/cjs/angular/utils/throttle.d.ts +5 -0
- package/dist/cjs/angular/utils/throttle.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/GPUAccelerator.d.ts +23 -0
- package/dist/cjs/core/GPUAccelerator.d.ts.map +1 -0
- package/dist/cjs/core/MemoryManager.d.ts +33 -0
- package/dist/cjs/core/MemoryManager.d.ts.map +1 -0
- package/dist/cjs/core/PerformanceOptimizer.d.ts +39 -0
- package/dist/cjs/core/PerformanceOptimizer.d.ts.map +1 -0
- package/dist/cjs/index.d.ts +5 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +811 -19
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/svelte/adapters/angular/lazy-scroll.component.d.ts +28 -0
- package/dist/cjs/svelte/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/angular/lazy-scroll.directive.d.ts +21 -0
- package/dist/cjs/svelte/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/index.d.ts +7 -0
- package/dist/cjs/svelte/adapters/index.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/react/LazyList.d.ts +12 -0
- package/dist/cjs/svelte/adapters/react/LazyList.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/react/useLazyList.d.ts +22 -0
- package/dist/cjs/svelte/adapters/react/useLazyList.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/svelte/lazyScrollAction.d.ts +13 -0
- package/dist/cjs/svelte/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/vue/useLazyScroll.d.ts +13 -0
- package/dist/cjs/svelte/adapters/vue/useLazyScroll.d.ts.map +1 -0
- package/dist/cjs/svelte/core/AdaptiveBufferCalculator.d.ts +46 -0
- package/dist/cjs/svelte/core/AdaptiveBufferCalculator.d.ts.map +1 -0
- package/dist/cjs/svelte/core/ContentComplexityAnalyzer.d.ts +13 -0
- package/dist/cjs/svelte/core/ContentComplexityAnalyzer.d.ts.map +1 -0
- package/dist/cjs/svelte/core/DevicePerformanceMonitor.d.ts +22 -0
- package/dist/cjs/svelte/core/DevicePerformanceMonitor.d.ts.map +1 -0
- package/dist/cjs/svelte/core/Engine.d.ts +56 -0
- package/dist/cjs/svelte/core/Engine.d.ts.map +1 -0
- package/dist/cjs/svelte/core/GPUAccelerator.d.ts +23 -0
- package/dist/cjs/svelte/core/GPUAccelerator.d.ts.map +1 -0
- package/dist/cjs/svelte/core/IntelligentScrollDetector.d.ts +19 -0
- package/dist/cjs/svelte/core/IntelligentScrollDetector.d.ts.map +1 -0
- package/dist/cjs/svelte/core/MemoryManager.d.ts +33 -0
- package/dist/cjs/svelte/core/MemoryManager.d.ts.map +1 -0
- package/dist/cjs/svelte/core/NetworkAwarePrefetchManager.d.ts +10 -0
- package/dist/cjs/svelte/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
- package/dist/cjs/svelte/core/NetworkAwareRequestQueue.d.ts +20 -0
- package/dist/cjs/svelte/core/NetworkAwareRequestQueue.d.ts.map +1 -0
- package/dist/cjs/svelte/core/NetworkSpeedDetector.d.ts +16 -0
- package/dist/cjs/svelte/core/NetworkSpeedDetector.d.ts.map +1 -0
- package/dist/cjs/svelte/core/PerformanceOptimizer.d.ts +39 -0
- package/dist/cjs/svelte/core/PerformanceOptimizer.d.ts.map +1 -0
- package/dist/cjs/svelte/core/PrefetchManager.d.ts +16 -0
- package/dist/cjs/svelte/core/PrefetchManager.d.ts.map +1 -0
- package/dist/cjs/svelte/core/RequestQueue.d.ts +23 -0
- package/dist/cjs/svelte/core/RequestQueue.d.ts.map +1 -0
- package/dist/cjs/svelte/core/WindowManager.d.ts +24 -0
- package/dist/cjs/svelte/core/WindowManager.d.ts.map +1 -0
- package/dist/cjs/svelte/core/types.d.ts +28 -0
- package/dist/cjs/svelte/core/types.d.ts.map +1 -0
- package/dist/cjs/svelte/index.d.ts +23 -0
- package/dist/cjs/svelte/index.d.ts.map +1 -0
- package/dist/cjs/svelte/index.js +1423 -0
- package/dist/cjs/svelte/index.js.map +1 -0
- package/dist/cjs/svelte/platform/browser/ScrollObserver.d.ts +25 -0
- package/dist/cjs/svelte/platform/browser/ScrollObserver.d.ts.map +1 -0
- package/dist/cjs/svelte/utils/debounce.d.ts +5 -0
- package/dist/cjs/svelte/utils/debounce.d.ts.map +1 -0
- package/dist/cjs/svelte/utils/throttle.d.ts +5 -0
- package/dist/cjs/svelte/utils/throttle.d.ts.map +1 -0
- package/dist/cjs/vanilla/adapters/angular/lazy-scroll.component.d.ts +28 -0
- package/dist/cjs/vanilla/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
- package/dist/cjs/vanilla/adapters/angular/lazy-scroll.directive.d.ts +21 -0
- package/dist/cjs/vanilla/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
- package/dist/cjs/vanilla/adapters/index.d.ts +7 -0
- package/dist/cjs/vanilla/adapters/index.d.ts.map +1 -0
- package/dist/cjs/vanilla/adapters/react/LazyList.d.ts +12 -0
- package/dist/cjs/vanilla/adapters/react/LazyList.d.ts.map +1 -0
- package/dist/cjs/vanilla/adapters/react/useLazyList.d.ts +22 -0
- package/dist/cjs/vanilla/adapters/react/useLazyList.d.ts.map +1 -0
- package/dist/cjs/vanilla/adapters/svelte/lazyScrollAction.d.ts +13 -0
- package/dist/cjs/vanilla/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
- package/dist/cjs/vanilla/adapters/vue/useLazyScroll.d.ts +13 -0
- package/dist/cjs/vanilla/adapters/vue/useLazyScroll.d.ts.map +1 -0
- package/dist/cjs/vanilla/core/AdaptiveBufferCalculator.d.ts +46 -0
- package/dist/cjs/vanilla/core/AdaptiveBufferCalculator.d.ts.map +1 -0
- package/dist/cjs/vanilla/core/ContentComplexityAnalyzer.d.ts +13 -0
- package/dist/cjs/vanilla/core/ContentComplexityAnalyzer.d.ts.map +1 -0
- package/dist/cjs/vanilla/core/DevicePerformanceMonitor.d.ts +22 -0
- package/dist/cjs/vanilla/core/DevicePerformanceMonitor.d.ts.map +1 -0
- package/dist/cjs/vanilla/core/Engine.d.ts +56 -0
- package/dist/cjs/vanilla/core/Engine.d.ts.map +1 -0
- package/dist/cjs/vanilla/core/GPUAccelerator.d.ts +23 -0
- package/dist/cjs/vanilla/core/GPUAccelerator.d.ts.map +1 -0
- package/dist/cjs/vanilla/core/IntelligentScrollDetector.d.ts +19 -0
- package/dist/cjs/vanilla/core/IntelligentScrollDetector.d.ts.map +1 -0
- package/dist/cjs/vanilla/core/MemoryManager.d.ts +33 -0
- package/dist/cjs/vanilla/core/MemoryManager.d.ts.map +1 -0
- package/dist/cjs/vanilla/core/NetworkAwarePrefetchManager.d.ts +10 -0
- package/dist/cjs/vanilla/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
- package/dist/cjs/vanilla/core/NetworkAwareRequestQueue.d.ts +20 -0
- package/dist/cjs/vanilla/core/NetworkAwareRequestQueue.d.ts.map +1 -0
- package/dist/cjs/vanilla/core/NetworkSpeedDetector.d.ts +16 -0
- package/dist/cjs/vanilla/core/NetworkSpeedDetector.d.ts.map +1 -0
- package/dist/cjs/vanilla/core/PerformanceOptimizer.d.ts +39 -0
- package/dist/cjs/vanilla/core/PerformanceOptimizer.d.ts.map +1 -0
- package/dist/cjs/vanilla/core/PrefetchManager.d.ts +16 -0
- package/dist/cjs/vanilla/core/PrefetchManager.d.ts.map +1 -0
- package/dist/cjs/vanilla/core/RequestQueue.d.ts +23 -0
- package/dist/cjs/vanilla/core/RequestQueue.d.ts.map +1 -0
- package/dist/cjs/vanilla/core/WindowManager.d.ts +24 -0
- package/dist/cjs/vanilla/core/WindowManager.d.ts.map +1 -0
- package/dist/cjs/vanilla/core/types.d.ts +28 -0
- package/dist/cjs/vanilla/core/types.d.ts.map +1 -0
- package/dist/cjs/vanilla/index.d.ts +23 -0
- package/dist/cjs/vanilla/index.d.ts.map +1 -0
- package/dist/cjs/vanilla/index.js +1670 -0
- package/dist/cjs/vanilla/index.js.map +1 -0
- package/dist/cjs/vanilla/platform/browser/ScrollObserver.d.ts +25 -0
- package/dist/cjs/vanilla/platform/browser/ScrollObserver.d.ts.map +1 -0
- package/dist/cjs/vanilla/utils/debounce.d.ts +5 -0
- package/dist/cjs/vanilla/utils/debounce.d.ts.map +1 -0
- package/dist/cjs/vanilla/utils/throttle.d.ts +5 -0
- package/dist/cjs/vanilla/utils/throttle.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/angular/lazy-scroll.component.d.ts +28 -0
- package/dist/cjs/vue/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/angular/lazy-scroll.directive.d.ts +21 -0
- package/dist/cjs/vue/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/index.d.ts +7 -0
- package/dist/cjs/vue/adapters/index.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/react/LazyList.d.ts +12 -0
- package/dist/cjs/vue/adapters/react/LazyList.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/react/useLazyList.d.ts +22 -0
- package/dist/cjs/vue/adapters/react/useLazyList.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/svelte/lazyScrollAction.d.ts +13 -0
- package/dist/cjs/vue/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/vue/useLazyScroll.d.ts +13 -0
- package/dist/cjs/vue/adapters/vue/useLazyScroll.d.ts.map +1 -0
- package/dist/cjs/vue/core/AdaptiveBufferCalculator.d.ts +46 -0
- package/dist/cjs/vue/core/AdaptiveBufferCalculator.d.ts.map +1 -0
- package/dist/cjs/vue/core/ContentComplexityAnalyzer.d.ts +13 -0
- package/dist/cjs/vue/core/ContentComplexityAnalyzer.d.ts.map +1 -0
- package/dist/cjs/vue/core/DevicePerformanceMonitor.d.ts +22 -0
- package/dist/cjs/vue/core/DevicePerformanceMonitor.d.ts.map +1 -0
- package/dist/cjs/vue/core/Engine.d.ts +56 -0
- package/dist/cjs/vue/core/Engine.d.ts.map +1 -0
- package/dist/cjs/vue/core/GPUAccelerator.d.ts +23 -0
- package/dist/cjs/vue/core/GPUAccelerator.d.ts.map +1 -0
- package/dist/cjs/vue/core/IntelligentScrollDetector.d.ts +19 -0
- package/dist/cjs/vue/core/IntelligentScrollDetector.d.ts.map +1 -0
- package/dist/cjs/vue/core/MemoryManager.d.ts +33 -0
- package/dist/cjs/vue/core/MemoryManager.d.ts.map +1 -0
- package/dist/cjs/vue/core/NetworkAwarePrefetchManager.d.ts +10 -0
- package/dist/cjs/vue/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
- package/dist/cjs/vue/core/NetworkAwareRequestQueue.d.ts +20 -0
- package/dist/cjs/vue/core/NetworkAwareRequestQueue.d.ts.map +1 -0
- package/dist/cjs/vue/core/NetworkSpeedDetector.d.ts +16 -0
- package/dist/cjs/vue/core/NetworkSpeedDetector.d.ts.map +1 -0
- package/dist/cjs/vue/core/PerformanceOptimizer.d.ts +39 -0
- package/dist/cjs/vue/core/PerformanceOptimizer.d.ts.map +1 -0
- package/dist/cjs/vue/core/PrefetchManager.d.ts +16 -0
- package/dist/cjs/vue/core/PrefetchManager.d.ts.map +1 -0
- package/dist/cjs/vue/core/RequestQueue.d.ts +23 -0
- package/dist/cjs/vue/core/RequestQueue.d.ts.map +1 -0
- package/dist/cjs/vue/core/WindowManager.d.ts +24 -0
- package/dist/cjs/vue/core/WindowManager.d.ts.map +1 -0
- package/dist/cjs/vue/core/types.d.ts +28 -0
- package/dist/cjs/vue/core/types.d.ts.map +1 -0
- package/dist/cjs/vue/index.d.ts +23 -0
- package/dist/cjs/vue/index.d.ts.map +1 -0
- package/dist/cjs/vue/index.js +1443 -0
- package/dist/cjs/vue/index.js.map +1 -0
- package/dist/cjs/vue/platform/browser/ScrollObserver.d.ts +25 -0
- package/dist/cjs/vue/platform/browser/ScrollObserver.d.ts.map +1 -0
- package/dist/cjs/vue/utils/debounce.d.ts +5 -0
- package/dist/cjs/vue/utils/debounce.d.ts.map +1 -0
- package/dist/cjs/vue/utils/throttle.d.ts +5 -0
- package/dist/cjs/vue/utils/throttle.d.ts.map +1 -0
- package/dist/esm/adapters/angular/lazy-scroll.component.d.ts +28 -0
- package/dist/esm/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
- package/dist/esm/adapters/angular/lazy-scroll.directive.d.ts +21 -0
- package/dist/esm/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
- package/dist/esm/adapters/index.d.ts +7 -0
- package/dist/esm/adapters/index.d.ts.map +1 -0
- package/dist/esm/adapters/svelte/lazyScrollAction.d.ts +13 -0
- package/dist/esm/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
- package/dist/esm/adapters/vue/useLazyScroll.d.ts +13 -0
- package/dist/esm/adapters/vue/useLazyScroll.d.ts.map +1 -0
- package/dist/esm/angular/adapters/angular/lazy-scroll.component.d.ts +28 -0
- package/dist/esm/angular/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
- package/dist/esm/angular/adapters/angular/lazy-scroll.directive.d.ts +21 -0
- package/dist/esm/angular/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
- package/dist/esm/angular/adapters/index.d.ts +7 -0
- package/dist/esm/angular/adapters/index.d.ts.map +1 -0
- package/dist/esm/angular/adapters/react/LazyList.d.ts +12 -0
- package/dist/esm/angular/adapters/react/LazyList.d.ts.map +1 -0
- package/dist/esm/angular/adapters/react/useLazyList.d.ts +22 -0
- package/dist/esm/angular/adapters/react/useLazyList.d.ts.map +1 -0
- package/dist/esm/angular/adapters/svelte/lazyScrollAction.d.ts +13 -0
- package/dist/esm/angular/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
- package/dist/esm/angular/adapters/vue/useLazyScroll.d.ts +13 -0
- package/dist/esm/angular/adapters/vue/useLazyScroll.d.ts.map +1 -0
- package/dist/esm/angular/core/AdaptiveBufferCalculator.d.ts +46 -0
- package/dist/esm/angular/core/AdaptiveBufferCalculator.d.ts.map +1 -0
- package/dist/esm/angular/core/ContentComplexityAnalyzer.d.ts +13 -0
- package/dist/esm/angular/core/ContentComplexityAnalyzer.d.ts.map +1 -0
- package/dist/esm/angular/core/DevicePerformanceMonitor.d.ts +22 -0
- package/dist/esm/angular/core/DevicePerformanceMonitor.d.ts.map +1 -0
- package/dist/esm/angular/core/Engine.d.ts +56 -0
- package/dist/esm/angular/core/Engine.d.ts.map +1 -0
- package/dist/esm/angular/core/GPUAccelerator.d.ts +23 -0
- package/dist/esm/angular/core/GPUAccelerator.d.ts.map +1 -0
- package/dist/esm/angular/core/IntelligentScrollDetector.d.ts +19 -0
- package/dist/esm/angular/core/IntelligentScrollDetector.d.ts.map +1 -0
- package/dist/esm/angular/core/MemoryManager.d.ts +33 -0
- package/dist/esm/angular/core/MemoryManager.d.ts.map +1 -0
- package/dist/esm/angular/core/NetworkAwarePrefetchManager.d.ts +10 -0
- package/dist/esm/angular/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
- package/dist/esm/angular/core/NetworkAwareRequestQueue.d.ts +20 -0
- package/dist/esm/angular/core/NetworkAwareRequestQueue.d.ts.map +1 -0
- package/dist/esm/angular/core/NetworkSpeedDetector.d.ts +16 -0
- package/dist/esm/angular/core/NetworkSpeedDetector.d.ts.map +1 -0
- package/dist/esm/angular/core/PerformanceOptimizer.d.ts +39 -0
- package/dist/esm/angular/core/PerformanceOptimizer.d.ts.map +1 -0
- package/dist/esm/angular/core/PrefetchManager.d.ts +16 -0
- package/dist/esm/angular/core/PrefetchManager.d.ts.map +1 -0
- package/dist/esm/angular/core/RequestQueue.d.ts +23 -0
- package/dist/esm/angular/core/RequestQueue.d.ts.map +1 -0
- package/dist/esm/angular/core/WindowManager.d.ts +24 -0
- package/dist/esm/angular/core/WindowManager.d.ts.map +1 -0
- package/dist/esm/angular/core/types.d.ts +28 -0
- package/dist/esm/angular/core/types.d.ts.map +1 -0
- package/dist/esm/angular/index.d.ts +23 -0
- package/dist/esm/angular/index.d.ts.map +1 -0
- package/dist/esm/angular/index.js +1714 -0
- package/dist/esm/angular/index.js.map +1 -0
- package/dist/esm/angular/platform/browser/ScrollObserver.d.ts +25 -0
- package/dist/esm/angular/platform/browser/ScrollObserver.d.ts.map +1 -0
- package/dist/esm/angular/utils/debounce.d.ts +5 -0
- package/dist/esm/angular/utils/debounce.d.ts.map +1 -0
- package/dist/esm/angular/utils/throttle.d.ts +5 -0
- package/dist/esm/angular/utils/throttle.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/GPUAccelerator.d.ts +23 -0
- package/dist/esm/core/GPUAccelerator.d.ts.map +1 -0
- package/dist/esm/core/MemoryManager.d.ts +33 -0
- package/dist/esm/core/MemoryManager.d.ts.map +1 -0
- package/dist/esm/core/PerformanceOptimizer.d.ts +39 -0
- package/dist/esm/core/PerformanceOptimizer.d.ts.map +1 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +806 -20
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/svelte/adapters/angular/lazy-scroll.component.d.ts +28 -0
- package/dist/esm/svelte/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/angular/lazy-scroll.directive.d.ts +21 -0
- package/dist/esm/svelte/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/index.d.ts +7 -0
- package/dist/esm/svelte/adapters/index.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/react/LazyList.d.ts +12 -0
- package/dist/esm/svelte/adapters/react/LazyList.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/react/useLazyList.d.ts +22 -0
- package/dist/esm/svelte/adapters/react/useLazyList.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/svelte/lazyScrollAction.d.ts +13 -0
- package/dist/esm/svelte/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/vue/useLazyScroll.d.ts +13 -0
- package/dist/esm/svelte/adapters/vue/useLazyScroll.d.ts.map +1 -0
- package/dist/esm/svelte/core/AdaptiveBufferCalculator.d.ts +46 -0
- package/dist/esm/svelte/core/AdaptiveBufferCalculator.d.ts.map +1 -0
- package/dist/esm/svelte/core/ContentComplexityAnalyzer.d.ts +13 -0
- package/dist/esm/svelte/core/ContentComplexityAnalyzer.d.ts.map +1 -0
- package/dist/esm/svelte/core/DevicePerformanceMonitor.d.ts +22 -0
- package/dist/esm/svelte/core/DevicePerformanceMonitor.d.ts.map +1 -0
- package/dist/esm/svelte/core/Engine.d.ts +56 -0
- package/dist/esm/svelte/core/Engine.d.ts.map +1 -0
- package/dist/esm/svelte/core/GPUAccelerator.d.ts +23 -0
- package/dist/esm/svelte/core/GPUAccelerator.d.ts.map +1 -0
- package/dist/esm/svelte/core/IntelligentScrollDetector.d.ts +19 -0
- package/dist/esm/svelte/core/IntelligentScrollDetector.d.ts.map +1 -0
- package/dist/esm/svelte/core/MemoryManager.d.ts +33 -0
- package/dist/esm/svelte/core/MemoryManager.d.ts.map +1 -0
- package/dist/esm/svelte/core/NetworkAwarePrefetchManager.d.ts +10 -0
- package/dist/esm/svelte/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
- package/dist/esm/svelte/core/NetworkAwareRequestQueue.d.ts +20 -0
- package/dist/esm/svelte/core/NetworkAwareRequestQueue.d.ts.map +1 -0
- package/dist/esm/svelte/core/NetworkSpeedDetector.d.ts +16 -0
- package/dist/esm/svelte/core/NetworkSpeedDetector.d.ts.map +1 -0
- package/dist/esm/svelte/core/PerformanceOptimizer.d.ts +39 -0
- package/dist/esm/svelte/core/PerformanceOptimizer.d.ts.map +1 -0
- package/dist/esm/svelte/core/PrefetchManager.d.ts +16 -0
- package/dist/esm/svelte/core/PrefetchManager.d.ts.map +1 -0
- package/dist/esm/svelte/core/RequestQueue.d.ts +23 -0
- package/dist/esm/svelte/core/RequestQueue.d.ts.map +1 -0
- package/dist/esm/svelte/core/WindowManager.d.ts +24 -0
- package/dist/esm/svelte/core/WindowManager.d.ts.map +1 -0
- package/dist/esm/svelte/core/types.d.ts +28 -0
- package/dist/esm/svelte/core/types.d.ts.map +1 -0
- package/dist/esm/svelte/index.d.ts +23 -0
- package/dist/esm/svelte/index.d.ts.map +1 -0
- package/dist/esm/svelte/index.js +1421 -0
- package/dist/esm/svelte/index.js.map +1 -0
- package/dist/esm/svelte/platform/browser/ScrollObserver.d.ts +25 -0
- package/dist/esm/svelte/platform/browser/ScrollObserver.d.ts.map +1 -0
- package/dist/esm/svelte/utils/debounce.d.ts +5 -0
- package/dist/esm/svelte/utils/debounce.d.ts.map +1 -0
- package/dist/esm/svelte/utils/throttle.d.ts +5 -0
- package/dist/esm/svelte/utils/throttle.d.ts.map +1 -0
- package/dist/esm/vanilla/adapters/angular/lazy-scroll.component.d.ts +28 -0
- package/dist/esm/vanilla/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
- package/dist/esm/vanilla/adapters/angular/lazy-scroll.directive.d.ts +21 -0
- package/dist/esm/vanilla/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
- package/dist/esm/vanilla/adapters/index.d.ts +7 -0
- package/dist/esm/vanilla/adapters/index.d.ts.map +1 -0
- package/dist/esm/vanilla/adapters/react/LazyList.d.ts +12 -0
- package/dist/esm/vanilla/adapters/react/LazyList.d.ts.map +1 -0
- package/dist/esm/vanilla/adapters/react/useLazyList.d.ts +22 -0
- package/dist/esm/vanilla/adapters/react/useLazyList.d.ts.map +1 -0
- package/dist/esm/vanilla/adapters/svelte/lazyScrollAction.d.ts +13 -0
- package/dist/esm/vanilla/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
- package/dist/esm/vanilla/adapters/vue/useLazyScroll.d.ts +13 -0
- package/dist/esm/vanilla/adapters/vue/useLazyScroll.d.ts.map +1 -0
- package/dist/esm/vanilla/core/AdaptiveBufferCalculator.d.ts +46 -0
- package/dist/esm/vanilla/core/AdaptiveBufferCalculator.d.ts.map +1 -0
- package/dist/esm/vanilla/core/ContentComplexityAnalyzer.d.ts +13 -0
- package/dist/esm/vanilla/core/ContentComplexityAnalyzer.d.ts.map +1 -0
- package/dist/esm/vanilla/core/DevicePerformanceMonitor.d.ts +22 -0
- package/dist/esm/vanilla/core/DevicePerformanceMonitor.d.ts.map +1 -0
- package/dist/esm/vanilla/core/Engine.d.ts +56 -0
- package/dist/esm/vanilla/core/Engine.d.ts.map +1 -0
- package/dist/esm/vanilla/core/GPUAccelerator.d.ts +23 -0
- package/dist/esm/vanilla/core/GPUAccelerator.d.ts.map +1 -0
- package/dist/esm/vanilla/core/IntelligentScrollDetector.d.ts +19 -0
- package/dist/esm/vanilla/core/IntelligentScrollDetector.d.ts.map +1 -0
- package/dist/esm/vanilla/core/MemoryManager.d.ts +33 -0
- package/dist/esm/vanilla/core/MemoryManager.d.ts.map +1 -0
- package/dist/esm/vanilla/core/NetworkAwarePrefetchManager.d.ts +10 -0
- package/dist/esm/vanilla/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
- package/dist/esm/vanilla/core/NetworkAwareRequestQueue.d.ts +20 -0
- package/dist/esm/vanilla/core/NetworkAwareRequestQueue.d.ts.map +1 -0
- package/dist/esm/vanilla/core/NetworkSpeedDetector.d.ts +16 -0
- package/dist/esm/vanilla/core/NetworkSpeedDetector.d.ts.map +1 -0
- package/dist/esm/vanilla/core/PerformanceOptimizer.d.ts +39 -0
- package/dist/esm/vanilla/core/PerformanceOptimizer.d.ts.map +1 -0
- package/dist/esm/vanilla/core/PrefetchManager.d.ts +16 -0
- package/dist/esm/vanilla/core/PrefetchManager.d.ts.map +1 -0
- package/dist/esm/vanilla/core/RequestQueue.d.ts +23 -0
- package/dist/esm/vanilla/core/RequestQueue.d.ts.map +1 -0
- package/dist/esm/vanilla/core/WindowManager.d.ts +24 -0
- package/dist/esm/vanilla/core/WindowManager.d.ts.map +1 -0
- package/dist/esm/vanilla/core/types.d.ts +28 -0
- package/dist/esm/vanilla/core/types.d.ts.map +1 -0
- package/dist/esm/vanilla/index.d.ts +23 -0
- package/dist/esm/vanilla/index.d.ts.map +1 -0
- package/dist/esm/vanilla/index.js +1666 -0
- package/dist/esm/vanilla/index.js.map +1 -0
- package/dist/esm/vanilla/platform/browser/ScrollObserver.d.ts +25 -0
- package/dist/esm/vanilla/platform/browser/ScrollObserver.d.ts.map +1 -0
- package/dist/esm/vanilla/utils/debounce.d.ts +5 -0
- package/dist/esm/vanilla/utils/debounce.d.ts.map +1 -0
- package/dist/esm/vanilla/utils/throttle.d.ts +5 -0
- package/dist/esm/vanilla/utils/throttle.d.ts.map +1 -0
- package/dist/esm/vue/adapters/angular/lazy-scroll.component.d.ts +28 -0
- package/dist/esm/vue/adapters/angular/lazy-scroll.component.d.ts.map +1 -0
- package/dist/esm/vue/adapters/angular/lazy-scroll.directive.d.ts +21 -0
- package/dist/esm/vue/adapters/angular/lazy-scroll.directive.d.ts.map +1 -0
- package/dist/esm/vue/adapters/index.d.ts +7 -0
- package/dist/esm/vue/adapters/index.d.ts.map +1 -0
- package/dist/esm/vue/adapters/react/LazyList.d.ts +12 -0
- package/dist/esm/vue/adapters/react/LazyList.d.ts.map +1 -0
- package/dist/esm/vue/adapters/react/useLazyList.d.ts +22 -0
- package/dist/esm/vue/adapters/react/useLazyList.d.ts.map +1 -0
- package/dist/esm/vue/adapters/svelte/lazyScrollAction.d.ts +13 -0
- package/dist/esm/vue/adapters/svelte/lazyScrollAction.d.ts.map +1 -0
- package/dist/esm/vue/adapters/vue/useLazyScroll.d.ts +13 -0
- package/dist/esm/vue/adapters/vue/useLazyScroll.d.ts.map +1 -0
- package/dist/esm/vue/core/AdaptiveBufferCalculator.d.ts +46 -0
- package/dist/esm/vue/core/AdaptiveBufferCalculator.d.ts.map +1 -0
- package/dist/esm/vue/core/ContentComplexityAnalyzer.d.ts +13 -0
- package/dist/esm/vue/core/ContentComplexityAnalyzer.d.ts.map +1 -0
- package/dist/esm/vue/core/DevicePerformanceMonitor.d.ts +22 -0
- package/dist/esm/vue/core/DevicePerformanceMonitor.d.ts.map +1 -0
- package/dist/esm/vue/core/Engine.d.ts +56 -0
- package/dist/esm/vue/core/Engine.d.ts.map +1 -0
- package/dist/esm/vue/core/GPUAccelerator.d.ts +23 -0
- package/dist/esm/vue/core/GPUAccelerator.d.ts.map +1 -0
- package/dist/esm/vue/core/IntelligentScrollDetector.d.ts +19 -0
- package/dist/esm/vue/core/IntelligentScrollDetector.d.ts.map +1 -0
- package/dist/esm/vue/core/MemoryManager.d.ts +33 -0
- package/dist/esm/vue/core/MemoryManager.d.ts.map +1 -0
- package/dist/esm/vue/core/NetworkAwarePrefetchManager.d.ts +10 -0
- package/dist/esm/vue/core/NetworkAwarePrefetchManager.d.ts.map +1 -0
- package/dist/esm/vue/core/NetworkAwareRequestQueue.d.ts +20 -0
- package/dist/esm/vue/core/NetworkAwareRequestQueue.d.ts.map +1 -0
- package/dist/esm/vue/core/NetworkSpeedDetector.d.ts +16 -0
- package/dist/esm/vue/core/NetworkSpeedDetector.d.ts.map +1 -0
- package/dist/esm/vue/core/PerformanceOptimizer.d.ts +39 -0
- package/dist/esm/vue/core/PerformanceOptimizer.d.ts.map +1 -0
- package/dist/esm/vue/core/PrefetchManager.d.ts +16 -0
- package/dist/esm/vue/core/PrefetchManager.d.ts.map +1 -0
- package/dist/esm/vue/core/RequestQueue.d.ts +23 -0
- package/dist/esm/vue/core/RequestQueue.d.ts.map +1 -0
- package/dist/esm/vue/core/WindowManager.d.ts +24 -0
- package/dist/esm/vue/core/WindowManager.d.ts.map +1 -0
- package/dist/esm/vue/core/types.d.ts +28 -0
- package/dist/esm/vue/core/types.d.ts.map +1 -0
- package/dist/esm/vue/index.d.ts +23 -0
- package/dist/esm/vue/index.d.ts.map +1 -0
- package/dist/esm/vue/index.js +1441 -0
- package/dist/esm/vue/index.js.map +1 -0
- package/dist/esm/vue/platform/browser/ScrollObserver.d.ts +25 -0
- package/dist/esm/vue/platform/browser/ScrollObserver.d.ts.map +1 -0
- package/dist/esm/vue/utils/debounce.d.ts +5 -0
- package/dist/esm/vue/utils/debounce.d.ts.map +1 -0
- package/dist/esm/vue/utils/throttle.d.ts +5 -0
- package/dist/esm/vue/utils/throttle.d.ts.map +1 -0
- package/dist/index.d.ts +379 -1
- package/dist/svelte/index.d.ts +16 -0
- package/dist/vanilla/index.d.ts +356 -0
- package/dist/vue/index.d.ts +22 -0
- package/package.json +28 -1
package/dist/esm/index.js
CHANGED
|
@@ -743,6 +743,499 @@ class AdaptiveBufferCalculator {
|
|
|
743
743
|
}
|
|
744
744
|
}
|
|
745
745
|
|
|
746
|
+
class PerformanceOptimizer {
|
|
747
|
+
constructor() {
|
|
748
|
+
this.frameBudget = 16; // Target for 60fps (16.67ms per frame)
|
|
749
|
+
this.lastFrameTime = 0;
|
|
750
|
+
this.animationFrameId = null;
|
|
751
|
+
this.isOptimizing = false;
|
|
752
|
+
// Frame rate limiter to prevent excessive updates
|
|
753
|
+
this.lastUpdate = 0;
|
|
754
|
+
this.minUpdateInterval = 16; // Minimum 16ms between updates (60fps)
|
|
755
|
+
// Batch updates to reduce DOM manipulations
|
|
756
|
+
this.updateQueue = [];
|
|
757
|
+
this.isProcessingQueue = false;
|
|
758
|
+
// Memory optimization
|
|
759
|
+
this.cleanupThreshold = 1000; // Clean up items beyond this threshold
|
|
760
|
+
this.gcInterval = null;
|
|
761
|
+
this.setupPerformanceMonitoring();
|
|
762
|
+
}
|
|
763
|
+
// Optimize rendering by limiting updates to frame budget
|
|
764
|
+
scheduleOptimizedUpdate(updateFn) {
|
|
765
|
+
const now = performance.now();
|
|
766
|
+
// Throttle updates based on frame rate
|
|
767
|
+
if (now - this.lastUpdate < this.minUpdateInterval) {
|
|
768
|
+
// Queue the update for later
|
|
769
|
+
this.updateQueue.push(updateFn);
|
|
770
|
+
if (!this.isProcessingQueue) {
|
|
771
|
+
this.processUpdateQueue();
|
|
772
|
+
}
|
|
773
|
+
return;
|
|
774
|
+
}
|
|
775
|
+
// Check if we have enough time in the current frame
|
|
776
|
+
if (this.getTimeRemaining() > 4) { // Leave 4ms buffer
|
|
777
|
+
updateFn();
|
|
778
|
+
this.lastUpdate = now;
|
|
779
|
+
}
|
|
780
|
+
else {
|
|
781
|
+
// Schedule for next frame
|
|
782
|
+
this.updateQueue.push(updateFn);
|
|
783
|
+
if (!this.isProcessingQueue) {
|
|
784
|
+
this.processUpdateQueue();
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
// Process queued updates efficiently
|
|
789
|
+
async processUpdateQueue() {
|
|
790
|
+
if (this.updateQueue.length === 0) {
|
|
791
|
+
this.isProcessingQueue = false;
|
|
792
|
+
return;
|
|
793
|
+
}
|
|
794
|
+
this.isProcessingQueue = true;
|
|
795
|
+
const currentTime = performance.now();
|
|
796
|
+
// Process as many updates as possible within frame budget
|
|
797
|
+
while (this.updateQueue.length > 0 && this.getTimeRemaining() > 2) {
|
|
798
|
+
const updateFn = this.updateQueue.shift();
|
|
799
|
+
if (updateFn) {
|
|
800
|
+
updateFn();
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
this.lastUpdate = currentTime;
|
|
804
|
+
if (this.updateQueue.length > 0) {
|
|
805
|
+
// Schedule remaining updates for next frame (only in browser environment)
|
|
806
|
+
if (typeof requestAnimationFrame !== 'undefined') {
|
|
807
|
+
requestAnimationFrame(() => this.processUpdateQueue());
|
|
808
|
+
}
|
|
809
|
+
else {
|
|
810
|
+
// In Node.js environment, use setTimeout as fallback
|
|
811
|
+
setTimeout(() => this.processUpdateQueue(), 0);
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
else {
|
|
815
|
+
this.isProcessingQueue = false;
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
// Get remaining time in current frame
|
|
819
|
+
getTimeRemaining() {
|
|
820
|
+
if (typeof performance === 'undefined' || !performance.now) {
|
|
821
|
+
return 16; // Fallback to 60fps
|
|
822
|
+
}
|
|
823
|
+
const currentTime = performance.now();
|
|
824
|
+
// Typically browsers target 10ms remaining time for smoothness
|
|
825
|
+
return Math.max(0, this.frameBudget - (currentTime - this.lastFrameTime));
|
|
826
|
+
}
|
|
827
|
+
// Memory optimization: cleanup off-screen items
|
|
828
|
+
optimizeMemory(cleanupFn, visibleRange) {
|
|
829
|
+
// Determine cleanup range (items far from visible range)
|
|
830
|
+
const cleanupStart = Math.max(0, visibleRange.end + this.cleanupThreshold);
|
|
831
|
+
const cleanupEnd = Math.max(0, visibleRange.start - this.cleanupThreshold);
|
|
832
|
+
if (cleanupStart > visibleRange.end) {
|
|
833
|
+
cleanupFn(visibleRange.end, cleanupStart);
|
|
834
|
+
}
|
|
835
|
+
if (cleanupEnd < visibleRange.start) {
|
|
836
|
+
cleanupFn(cleanupEnd, visibleRange.start);
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
// Enable GPU acceleration for smoother scrolling
|
|
840
|
+
enableGPUCssAcceleration(element) {
|
|
841
|
+
// Force hardware acceleration
|
|
842
|
+
element.style.willChange = 'transform';
|
|
843
|
+
element.style.transform = 'translateZ(0)';
|
|
844
|
+
element.style.backfaceVisibility = 'hidden';
|
|
845
|
+
}
|
|
846
|
+
// Disable GPU acceleration when not needed
|
|
847
|
+
disableGPUCssAcceleration(element) {
|
|
848
|
+
element.style.willChange = 'auto';
|
|
849
|
+
element.style.transform = '';
|
|
850
|
+
element.style.backfaceVisibility = '';
|
|
851
|
+
}
|
|
852
|
+
// Optimize for different device capabilities
|
|
853
|
+
getOptimizationProfile() {
|
|
854
|
+
// Simple profile detection based on common device characteristics
|
|
855
|
+
const userAgent = navigator.userAgent || navigator.vendor || window.opera;
|
|
856
|
+
// Detect low-end devices
|
|
857
|
+
if (this.isLowEndDevice(userAgent)) {
|
|
858
|
+
return {
|
|
859
|
+
frameRate: 30, // Lower target for low-end devices
|
|
860
|
+
batchSize: 5, // Smaller batches
|
|
861
|
+
bufferMultiplier: 0.5, // Smaller buffer
|
|
862
|
+
updateInterval: 32 // 30fps interval
|
|
863
|
+
};
|
|
864
|
+
}
|
|
865
|
+
// Default profile for capable devices
|
|
866
|
+
return {
|
|
867
|
+
frameRate: 60,
|
|
868
|
+
batchSize: 10,
|
|
869
|
+
bufferMultiplier: 1.0,
|
|
870
|
+
updateInterval: 16 // 60fps interval
|
|
871
|
+
};
|
|
872
|
+
}
|
|
873
|
+
isLowEndDevice(userAgent) {
|
|
874
|
+
// Simple heuristic for low-end devices
|
|
875
|
+
const lowEndPatterns = [
|
|
876
|
+
/Android.*Mobile/,
|
|
877
|
+
/iPhone.*OS [0-9]+_[0-9]+/,
|
|
878
|
+
/Opera Mini/,
|
|
879
|
+
/IEMobile/
|
|
880
|
+
];
|
|
881
|
+
return lowEndPatterns.some(pattern => pattern.test(userAgent));
|
|
882
|
+
}
|
|
883
|
+
// Setup performance monitoring
|
|
884
|
+
setupPerformanceMonitoring() {
|
|
885
|
+
// Check if we're in a browser environment
|
|
886
|
+
if (typeof window === 'undefined' || typeof requestAnimationFrame === 'undefined') {
|
|
887
|
+
// In Node.js environment, skip browser-specific monitoring
|
|
888
|
+
return;
|
|
889
|
+
}
|
|
890
|
+
// Monitor frame rate
|
|
891
|
+
let frameCount = 0;
|
|
892
|
+
let lastTime = performance.now();
|
|
893
|
+
const monitorFrameRate = () => {
|
|
894
|
+
frameCount++;
|
|
895
|
+
const currentTime = performance.now();
|
|
896
|
+
if (currentTime - lastTime >= 1000) { // Every second
|
|
897
|
+
const fps = frameCount;
|
|
898
|
+
frameCount = 0;
|
|
899
|
+
lastTime = currentTime;
|
|
900
|
+
// Adjust optimization based on actual FPS
|
|
901
|
+
if (fps < 30) {
|
|
902
|
+
this.frameBudget = 32; // Target 30fps
|
|
903
|
+
}
|
|
904
|
+
else if (fps < 50) {
|
|
905
|
+
this.frameBudget = 20; // Target 50fps
|
|
906
|
+
}
|
|
907
|
+
else {
|
|
908
|
+
this.frameBudget = 16; // Target 60fps
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
this.animationFrameId = requestAnimationFrame(monitorFrameRate);
|
|
912
|
+
};
|
|
913
|
+
this.animationFrameId = requestAnimationFrame(monitorFrameRate);
|
|
914
|
+
// Setup garbage collection monitoring
|
|
915
|
+
this.gcInterval = window.setInterval(() => {
|
|
916
|
+
if ('gc' in window) {
|
|
917
|
+
// @ts-ignore - gc is non-standard
|
|
918
|
+
window.gc();
|
|
919
|
+
}
|
|
920
|
+
}, 30000); // GC every 30 seconds
|
|
921
|
+
}
|
|
922
|
+
// Get performance insights
|
|
923
|
+
getPerformanceInsights() {
|
|
924
|
+
return {
|
|
925
|
+
frameRate: 60, // Would be calculated from monitoring
|
|
926
|
+
memoryUsage: this.getMemoryUsage(),
|
|
927
|
+
updateFrequency: 1000 / this.minUpdateInterval,
|
|
928
|
+
optimizationActive: this.isOptimizing
|
|
929
|
+
};
|
|
930
|
+
}
|
|
931
|
+
getMemoryUsage() {
|
|
932
|
+
var _a;
|
|
933
|
+
if ('memory' in performance) {
|
|
934
|
+
// @ts-ignore - memory property is non-standard
|
|
935
|
+
return ((_a = performance.memory) === null || _a === void 0 ? void 0 : _a.usedJSHeapSize) || null;
|
|
936
|
+
}
|
|
937
|
+
return null;
|
|
938
|
+
}
|
|
939
|
+
// Cleanup resources
|
|
940
|
+
cleanup() {
|
|
941
|
+
if (this.animationFrameId && typeof cancelAnimationFrame !== 'undefined') {
|
|
942
|
+
cancelAnimationFrame(this.animationFrameId);
|
|
943
|
+
}
|
|
944
|
+
if (this.gcInterval && typeof clearInterval !== 'undefined') {
|
|
945
|
+
clearInterval(this.gcInterval);
|
|
946
|
+
}
|
|
947
|
+
this.updateQueue = [];
|
|
948
|
+
this.isProcessingQueue = false;
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
class MemoryManager {
|
|
953
|
+
constructor(maxCacheSize = 1000) {
|
|
954
|
+
this.itemCache = new Map();
|
|
955
|
+
this.maxCacheSize = 1000; // Maximum items to keep in cache
|
|
956
|
+
this.cleanupThreshold = 500; // Start cleanup when cache exceeds this
|
|
957
|
+
this.visibleRange = { start: 0, end: 0 };
|
|
958
|
+
this.totalItems = 0;
|
|
959
|
+
this.maxCacheSize = maxCacheSize;
|
|
960
|
+
}
|
|
961
|
+
// Set visible range to optimize cache
|
|
962
|
+
setVisibleRange(range) {
|
|
963
|
+
this.visibleRange = range;
|
|
964
|
+
}
|
|
965
|
+
// Set total number of items
|
|
966
|
+
setTotalItems(total) {
|
|
967
|
+
this.totalItems = total;
|
|
968
|
+
}
|
|
969
|
+
// Get item from cache
|
|
970
|
+
get(key) {
|
|
971
|
+
return this.itemCache.get(key) || null;
|
|
972
|
+
}
|
|
973
|
+
// Set item in cache
|
|
974
|
+
set(key, value) {
|
|
975
|
+
this.itemCache.set(key, value);
|
|
976
|
+
// Clean up if cache is too large
|
|
977
|
+
if (this.itemCache.size > this.maxCacheSize) {
|
|
978
|
+
this.cleanupCache();
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
// Check if item exists in cache
|
|
982
|
+
has(key) {
|
|
983
|
+
return this.itemCache.has(key);
|
|
984
|
+
}
|
|
985
|
+
// Remove item from cache
|
|
986
|
+
delete(key) {
|
|
987
|
+
return this.itemCache.delete(key);
|
|
988
|
+
}
|
|
989
|
+
// Clear entire cache
|
|
990
|
+
clear() {
|
|
991
|
+
this.itemCache.clear();
|
|
992
|
+
}
|
|
993
|
+
// Clean up cache based on visibility and distance from visible range
|
|
994
|
+
cleanupCache() {
|
|
995
|
+
if (this.itemCache.size <= this.cleanupThreshold) {
|
|
996
|
+
return; // No need to clean up
|
|
997
|
+
}
|
|
998
|
+
const itemsToRemove = [];
|
|
999
|
+
// Find items that are far from visible range
|
|
1000
|
+
for (const [key] of this.itemCache.entries()) {
|
|
1001
|
+
const distanceFromVisible = this.getDistanceFromVisible(key);
|
|
1002
|
+
// Remove items that are far from visible range
|
|
1003
|
+
if (distanceFromVisible > 100) { // Arbitrary threshold
|
|
1004
|
+
itemsToRemove.push(key);
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
// If we still have too many items, remove oldest accessed items
|
|
1008
|
+
if (this.itemCache.size - itemsToRemove.length > this.cleanupThreshold) {
|
|
1009
|
+
const sortedKeys = Array.from(this.itemCache.keys())
|
|
1010
|
+
.sort((a, b) => a - b); // Sort by key (assuming they're indexes)
|
|
1011
|
+
// Remove items that are furthest from visible range
|
|
1012
|
+
for (const key of sortedKeys) {
|
|
1013
|
+
if (this.itemCache.size <= this.cleanupThreshold)
|
|
1014
|
+
break;
|
|
1015
|
+
const distance = this.getDistanceFromVisible(key);
|
|
1016
|
+
if (distance > 50) { // Remove items beyond 50 units from visible
|
|
1017
|
+
itemsToRemove.push(key);
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
// Actually remove items
|
|
1022
|
+
for (const key of itemsToRemove) {
|
|
1023
|
+
this.itemCache.delete(key);
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
// Calculate distance from visible range
|
|
1027
|
+
getDistanceFromVisible(index) {
|
|
1028
|
+
if (index >= this.visibleRange.start && index <= this.visibleRange.end) {
|
|
1029
|
+
return 0; // Inside visible range
|
|
1030
|
+
}
|
|
1031
|
+
if (index < this.visibleRange.start) {
|
|
1032
|
+
return this.visibleRange.start - index;
|
|
1033
|
+
}
|
|
1034
|
+
return index - this.visibleRange.end;
|
|
1035
|
+
}
|
|
1036
|
+
// Get cache statistics
|
|
1037
|
+
getStats() {
|
|
1038
|
+
const visibleItems = Array.from(this.itemCache.keys())
|
|
1039
|
+
.filter(key => key >= this.visibleRange.start && key <= this.visibleRange.end)
|
|
1040
|
+
.length;
|
|
1041
|
+
const offScreenItems = this.itemCache.size - visibleItems;
|
|
1042
|
+
// Rough estimate of memory usage (in bytes)
|
|
1043
|
+
let memoryEstimate = 0;
|
|
1044
|
+
for (const [_, value] of this.itemCache.entries()) {
|
|
1045
|
+
memoryEstimate += this.estimateObjectSize(value);
|
|
1046
|
+
}
|
|
1047
|
+
return {
|
|
1048
|
+
size: this.itemCache.size,
|
|
1049
|
+
maxCacheSize: this.maxCacheSize,
|
|
1050
|
+
visibleItems,
|
|
1051
|
+
offScreenItems,
|
|
1052
|
+
memoryEstimate
|
|
1053
|
+
};
|
|
1054
|
+
}
|
|
1055
|
+
// Estimate object size in bytes
|
|
1056
|
+
estimateObjectSize(obj) {
|
|
1057
|
+
if (obj === null || obj === undefined)
|
|
1058
|
+
return 0;
|
|
1059
|
+
if (typeof obj === 'string')
|
|
1060
|
+
return obj.length * 2; // UTF-16 chars
|
|
1061
|
+
if (typeof obj === 'number')
|
|
1062
|
+
return 8; // 8 bytes for number
|
|
1063
|
+
if (typeof obj === 'boolean')
|
|
1064
|
+
return 4; // 4 bytes for boolean
|
|
1065
|
+
if (typeof obj === 'object') {
|
|
1066
|
+
let size = 0;
|
|
1067
|
+
for (const key in obj) {
|
|
1068
|
+
if (obj.hasOwnProperty(key)) {
|
|
1069
|
+
size += key.length * 2; // Key size
|
|
1070
|
+
size += this.estimateObjectSize(obj[key]); // Value size
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
return size;
|
|
1074
|
+
}
|
|
1075
|
+
return 0; // Other types
|
|
1076
|
+
}
|
|
1077
|
+
// Prune cache to only keep essential items
|
|
1078
|
+
pruneEssential() {
|
|
1079
|
+
const essentialItems = [];
|
|
1080
|
+
// Keep items in visible range and nearby
|
|
1081
|
+
for (const [key, value] of this.itemCache.entries()) {
|
|
1082
|
+
if (this.isEssential(key)) {
|
|
1083
|
+
essentialItems.push([key, value]);
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
// Clear cache and repopulate with essential items
|
|
1087
|
+
this.itemCache.clear();
|
|
1088
|
+
for (const [key, value] of essentialItems) {
|
|
1089
|
+
this.itemCache.set(key, value);
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
// Check if item is essential (within buffer zone)
|
|
1093
|
+
isEssential(index) {
|
|
1094
|
+
const bufferZone = 20; // Keep items within 20 positions of visible range
|
|
1095
|
+
return index >= (this.visibleRange.start - bufferZone) &&
|
|
1096
|
+
index <= (this.visibleRange.end + bufferZone);
|
|
1097
|
+
}
|
|
1098
|
+
// Get cache size
|
|
1099
|
+
getSize() {
|
|
1100
|
+
return this.itemCache.size;
|
|
1101
|
+
}
|
|
1102
|
+
// Get cache keys
|
|
1103
|
+
getKeys() {
|
|
1104
|
+
return Array.from(this.itemCache.keys());
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
class GPUAccelerator {
|
|
1109
|
+
constructor() {
|
|
1110
|
+
this.gpuAccelerationEnabled = false;
|
|
1111
|
+
this.gpuElements = new WeakSet();
|
|
1112
|
+
this.animationFrameId = null;
|
|
1113
|
+
this.gpuAccelerationEnabled = this.isGPUSupported();
|
|
1114
|
+
}
|
|
1115
|
+
// Check if GPU acceleration is supported
|
|
1116
|
+
isGPUSupported() {
|
|
1117
|
+
// Check if we're in a browser environment
|
|
1118
|
+
if (typeof document === 'undefined') {
|
|
1119
|
+
return false; // Not supported in Node.js environment
|
|
1120
|
+
}
|
|
1121
|
+
// Check for 3D transform support
|
|
1122
|
+
const testEl = document.createElement('div');
|
|
1123
|
+
return testEl.style.webkitTransform !== undefined ||
|
|
1124
|
+
testEl.style.transform !== undefined;
|
|
1125
|
+
}
|
|
1126
|
+
// Enable GPU acceleration for an element
|
|
1127
|
+
enableForElement(element) {
|
|
1128
|
+
if (!this.gpuAccelerationEnabled)
|
|
1129
|
+
return;
|
|
1130
|
+
// Apply GPU-accelerated styles
|
|
1131
|
+
element.style.willChange = 'transform';
|
|
1132
|
+
element.style.transform = 'translateZ(0)';
|
|
1133
|
+
element.style.backfaceVisibility = 'hidden';
|
|
1134
|
+
element.style.perspective = '1000px';
|
|
1135
|
+
// Add to tracked elements
|
|
1136
|
+
this.gpuElements.add(element);
|
|
1137
|
+
}
|
|
1138
|
+
// Disable GPU acceleration for an element
|
|
1139
|
+
disableForElement(element) {
|
|
1140
|
+
if (!this.gpuAccelerationEnabled)
|
|
1141
|
+
return;
|
|
1142
|
+
// Remove GPU-accelerated styles
|
|
1143
|
+
element.style.willChange = 'auto';
|
|
1144
|
+
element.style.transform = '';
|
|
1145
|
+
element.style.backfaceVisibility = '';
|
|
1146
|
+
element.style.perspective = '';
|
|
1147
|
+
// Remove from tracked elements
|
|
1148
|
+
this.gpuElements.delete(element);
|
|
1149
|
+
}
|
|
1150
|
+
// Apply GPU acceleration to a list of elements
|
|
1151
|
+
enableForElements(elements) {
|
|
1152
|
+
elements.forEach(el => this.enableForElement(el));
|
|
1153
|
+
}
|
|
1154
|
+
// Batch update GPU acceleration
|
|
1155
|
+
batchUpdate(elements, enable) {
|
|
1156
|
+
if (!this.gpuAccelerationEnabled)
|
|
1157
|
+
return;
|
|
1158
|
+
if (enable) {
|
|
1159
|
+
this.enableForElements(elements);
|
|
1160
|
+
}
|
|
1161
|
+
else {
|
|
1162
|
+
elements.forEach(el => this.disableForElement(el));
|
|
1163
|
+
}
|
|
1164
|
+
}
|
|
1165
|
+
// Optimize scrolling container for GPU acceleration
|
|
1166
|
+
optimizeScrollContainer(container) {
|
|
1167
|
+
if (!this.gpuAccelerationEnabled)
|
|
1168
|
+
return;
|
|
1169
|
+
// Apply optimizations to container
|
|
1170
|
+
container.style.transform = 'translateZ(0)';
|
|
1171
|
+
container.style.willChange = 'scroll-position';
|
|
1172
|
+
container.style.webkitOverflowScrolling = 'touch'; // For iOS
|
|
1173
|
+
}
|
|
1174
|
+
// Optimize individual items for GPU acceleration
|
|
1175
|
+
optimizeItem(item) {
|
|
1176
|
+
if (!this.gpuAccelerationEnabled)
|
|
1177
|
+
return;
|
|
1178
|
+
// Apply lightweight GPU acceleration
|
|
1179
|
+
item.style.transform = 'translateZ(0)';
|
|
1180
|
+
item.style.willChange = 'transform';
|
|
1181
|
+
}
|
|
1182
|
+
// Get GPU acceleration status
|
|
1183
|
+
getStatus() {
|
|
1184
|
+
// Since WeakSet doesn't have a size property, we can't count directly
|
|
1185
|
+
// This is a limitation of WeakSet
|
|
1186
|
+
return {
|
|
1187
|
+
enabled: this.gpuAccelerationEnabled,
|
|
1188
|
+
supported: this.isGPUSupported(),
|
|
1189
|
+
elementCount: 0 // Placeholder - would need different tracking method
|
|
1190
|
+
};
|
|
1191
|
+
}
|
|
1192
|
+
// Optimize for different scenarios
|
|
1193
|
+
optimizeForScenario(scenario) {
|
|
1194
|
+
if (!this.gpuAccelerationEnabled)
|
|
1195
|
+
return;
|
|
1196
|
+
switch (scenario) {
|
|
1197
|
+
case 'scrolling':
|
|
1198
|
+
// Optimize for smooth scrolling
|
|
1199
|
+
document.body.style.willChange = 'transform';
|
|
1200
|
+
break;
|
|
1201
|
+
case 'animation':
|
|
1202
|
+
// Optimize for animations
|
|
1203
|
+
document.body.style.transform = 'translateZ(0)';
|
|
1204
|
+
break;
|
|
1205
|
+
case 'static':
|
|
1206
|
+
// Remove optimizations when not needed
|
|
1207
|
+
document.body.style.willChange = 'auto';
|
|
1208
|
+
document.body.style.transform = '';
|
|
1209
|
+
break;
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
// Cleanup GPU acceleration resources
|
|
1213
|
+
cleanup() {
|
|
1214
|
+
if (this.animationFrameId) {
|
|
1215
|
+
cancelAnimationFrame(this.animationFrameId);
|
|
1216
|
+
}
|
|
1217
|
+
// Reset any applied styles (would need to track them)
|
|
1218
|
+
this.gpuElements = new WeakSet();
|
|
1219
|
+
}
|
|
1220
|
+
// Check if element has GPU acceleration enabled
|
|
1221
|
+
isAccelerated(element) {
|
|
1222
|
+
return this.gpuElements.has(element);
|
|
1223
|
+
}
|
|
1224
|
+
// Get optimization recommendations
|
|
1225
|
+
getRecommendations() {
|
|
1226
|
+
const recommendations = [];
|
|
1227
|
+
if (!this.gpuAccelerationEnabled) {
|
|
1228
|
+
recommendations.push('GPU acceleration not supported on this device');
|
|
1229
|
+
}
|
|
1230
|
+
else {
|
|
1231
|
+
recommendations.push('GPU acceleration enabled for smooth performance');
|
|
1232
|
+
recommendations.push('Using hardware-accelerated compositing');
|
|
1233
|
+
recommendations.push('Optimized for 60fps rendering');
|
|
1234
|
+
}
|
|
1235
|
+
return recommendations;
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
|
|
746
1239
|
class Engine {
|
|
747
1240
|
constructor(config) {
|
|
748
1241
|
this.fetchMoreCallback = null;
|
|
@@ -758,6 +1251,9 @@ class Engine {
|
|
|
758
1251
|
this.networkAwarePrefetchManager = new NetworkAwarePrefetchManager(this.networkDetector);
|
|
759
1252
|
this.networkAwareRequestQueue = new NetworkAwareRequestQueue(this.networkDetector);
|
|
760
1253
|
this.adaptiveBufferCalculator = new AdaptiveBufferCalculator();
|
|
1254
|
+
this.performanceOptimizer = new PerformanceOptimizer();
|
|
1255
|
+
this.memoryManager = new MemoryManager(1000); // Cache up to 1000 items
|
|
1256
|
+
this.gpuAccelerator = new GPUAccelerator();
|
|
761
1257
|
this.totalItems = this.config.totalItems || Number.MAX_SAFE_INTEGER;
|
|
762
1258
|
this.state = {
|
|
763
1259
|
scrollTop: 0,
|
|
@@ -770,26 +1266,34 @@ class Engine {
|
|
|
770
1266
|
* Update scroll position and recalculate visible range with intelligent detection
|
|
771
1267
|
*/
|
|
772
1268
|
async updateScrollPosition(scrollTop) {
|
|
773
|
-
//
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
1269
|
+
// Use performance optimizer to schedule updates efficiently
|
|
1270
|
+
this.performanceOptimizer.scheduleOptimizedUpdate(async () => {
|
|
1271
|
+
// Calculate velocity and other intelligent metrics
|
|
1272
|
+
const velocity = this.intelligentScrollDetector.calculateVelocity(scrollTop);
|
|
1273
|
+
this.intelligentScrollDetector.getDirection(velocity);
|
|
1274
|
+
// Get network quality for adaptive buffering
|
|
1275
|
+
const networkQuality = await this.networkDetector.assessConnectionQuality();
|
|
1276
|
+
// Calculate adaptive buffer considering all factors
|
|
1277
|
+
const adaptiveBuffer = await this.adaptiveBufferCalculator.calculateOptimalBuffer({
|
|
1278
|
+
scrollVelocity: velocity,
|
|
1279
|
+
networkQuality,
|
|
1280
|
+
baseBuffer: this.intelligentScrollDetector.calculateBuffer(velocity),
|
|
1281
|
+
visibleItems: [] // In a real implementation, this would be the actual visible items
|
|
1282
|
+
});
|
|
1283
|
+
// Update window manager with adaptive buffer
|
|
1284
|
+
this.windowManager.updateBufferSize(adaptiveBuffer);
|
|
1285
|
+
// Update memory manager with visible range
|
|
1286
|
+
this.memoryManager.setVisibleRange({
|
|
1287
|
+
start: Math.max(0, this.state.visibleRange.start - adaptiveBuffer),
|
|
1288
|
+
end: this.state.visibleRange.end + adaptiveBuffer
|
|
1289
|
+
});
|
|
1290
|
+
this.state.scrollTop = scrollTop;
|
|
1291
|
+
this.state.visibleRange = this.windowManager.calculateVisibleRange(scrollTop);
|
|
1292
|
+
// Check if we need to fetch more items
|
|
1293
|
+
if (await this.shouldFetchMore()) {
|
|
1294
|
+
await this.fetchMore();
|
|
1295
|
+
}
|
|
784
1296
|
});
|
|
785
|
-
// Update window manager with adaptive buffer
|
|
786
|
-
this.windowManager.updateBufferSize(adaptiveBuffer);
|
|
787
|
-
this.state.scrollTop = scrollTop;
|
|
788
|
-
this.state.visibleRange = this.windowManager.calculateVisibleRange(scrollTop);
|
|
789
|
-
// Check if we need to fetch more items
|
|
790
|
-
if (await this.shouldFetchMore()) {
|
|
791
|
-
await this.fetchMore();
|
|
792
|
-
}
|
|
793
1297
|
}
|
|
794
1298
|
/**
|
|
795
1299
|
* Get the current visible range
|
|
@@ -875,6 +1379,8 @@ class Engine {
|
|
|
875
1379
|
this.networkAwareRequestQueue.clear();
|
|
876
1380
|
this.fetchMoreCallback = null;
|
|
877
1381
|
this.intelligentScrollDetector.cleanup();
|
|
1382
|
+
this.performanceOptimizer.cleanup();
|
|
1383
|
+
this.memoryManager.clear();
|
|
878
1384
|
}
|
|
879
1385
|
}
|
|
880
1386
|
|
|
@@ -1076,6 +1582,286 @@ const LazyList = forwardRef((props, ref) => {
|
|
|
1076
1582
|
});
|
|
1077
1583
|
LazyList.displayName = 'LazyList';
|
|
1078
1584
|
|
|
1585
|
+
class LazyScroll {
|
|
1586
|
+
constructor(container, config) {
|
|
1587
|
+
this.container = container;
|
|
1588
|
+
this.config = {
|
|
1589
|
+
itemHeight: config.itemHeight || 50,
|
|
1590
|
+
viewportHeight: config.viewportHeight || 400,
|
|
1591
|
+
bufferSize: config.bufferSize || 5,
|
|
1592
|
+
fetchMore: config.fetchMore || (() => Promise.resolve([]))
|
|
1593
|
+
};
|
|
1594
|
+
|
|
1595
|
+
this.engine = new Engine(this.config);
|
|
1596
|
+
this.engine.setFetchMoreCallback(this.config.fetchMore);
|
|
1597
|
+
|
|
1598
|
+
this.visibleRange = { start: 0, end: 0 };
|
|
1599
|
+
this.isLoading = false;
|
|
1600
|
+
this.items = [];
|
|
1601
|
+
this.visibleItems = [];
|
|
1602
|
+
|
|
1603
|
+
this.scrollHandler = this.onScroll.bind(this);
|
|
1604
|
+
this.container.addEventListener('scroll', this.scrollHandler, { passive: true });
|
|
1605
|
+
}
|
|
1606
|
+
|
|
1607
|
+
onScroll() {
|
|
1608
|
+
const scrollTop = this.container.scrollTop;
|
|
1609
|
+
this.engine.updateScrollPosition(scrollTop);
|
|
1610
|
+
|
|
1611
|
+
const state = this.engine.getState();
|
|
1612
|
+
this.visibleRange = state.visibleRange;
|
|
1613
|
+
this.isLoading = state.isLoading;
|
|
1614
|
+
|
|
1615
|
+
this.render();
|
|
1616
|
+
}
|
|
1617
|
+
|
|
1618
|
+
setItems(items) {
|
|
1619
|
+
this.items = items;
|
|
1620
|
+
this.render();
|
|
1621
|
+
}
|
|
1622
|
+
|
|
1623
|
+
render() {
|
|
1624
|
+
// Calculate paddings
|
|
1625
|
+
const topPadding = this.visibleRange.start * this.config.itemHeight;
|
|
1626
|
+
const bottomPadding = Math.max(0, (this.items.length - this.visibleRange.end) * this.config.itemHeight);
|
|
1627
|
+
|
|
1628
|
+
// Get visible items
|
|
1629
|
+
this.visibleItems = this.items.slice(this.visibleRange.start, this.visibleRange.end);
|
|
1630
|
+
|
|
1631
|
+
// Clear container except for paddings and content
|
|
1632
|
+
const existingContent = this.container.querySelector('.lazy-scroll-content');
|
|
1633
|
+
if (existingContent) {
|
|
1634
|
+
existingContent.remove();
|
|
1635
|
+
}
|
|
1636
|
+
|
|
1637
|
+
// Create content wrapper
|
|
1638
|
+
const contentWrapper = document.createElement('div');
|
|
1639
|
+
contentWrapper.className = 'lazy-scroll-content';
|
|
1640
|
+
|
|
1641
|
+
// Add top padding
|
|
1642
|
+
const topPaddingDiv = document.createElement('div');
|
|
1643
|
+
topPaddingDiv.style.height = `${topPadding}px`;
|
|
1644
|
+
contentWrapper.appendChild(topPaddingDiv);
|
|
1645
|
+
|
|
1646
|
+
// Add visible items
|
|
1647
|
+
this.visibleItems.forEach((item, index) => {
|
|
1648
|
+
const itemElement = this.createItemElement(item, this.visibleRange.start + index);
|
|
1649
|
+
contentWrapper.appendChild(itemElement);
|
|
1650
|
+
});
|
|
1651
|
+
|
|
1652
|
+
// Add bottom padding
|
|
1653
|
+
const bottomPaddingDiv = document.createElement('div');
|
|
1654
|
+
bottomPaddingDiv.style.height = `${bottomPadding}px`;
|
|
1655
|
+
contentWrapper.appendChild(bottomPaddingDiv);
|
|
1656
|
+
|
|
1657
|
+
// Add loading indicator if needed
|
|
1658
|
+
if (this.isLoading) {
|
|
1659
|
+
const loadingElement = document.createElement('div');
|
|
1660
|
+
loadingElement.className = 'lazy-loading';
|
|
1661
|
+
loadingElement.textContent = 'Loading more items...';
|
|
1662
|
+
contentWrapper.appendChild(loadingElement);
|
|
1663
|
+
}
|
|
1664
|
+
|
|
1665
|
+
this.container.appendChild(contentWrapper);
|
|
1666
|
+
}
|
|
1667
|
+
|
|
1668
|
+
createItemElement(item, index) {
|
|
1669
|
+
const itemElement = document.createElement('div');
|
|
1670
|
+
itemElement.style.height = `${this.config.itemHeight}px`;
|
|
1671
|
+
itemElement.className = 'lazy-item';
|
|
1672
|
+
|
|
1673
|
+
// Default content - can be customized
|
|
1674
|
+
itemElement.textContent = `Item ${index}: ${item.text || item.id || 'Content'}`;
|
|
1675
|
+
|
|
1676
|
+
return itemElement;
|
|
1677
|
+
}
|
|
1678
|
+
|
|
1679
|
+
updateConfig(newConfig) {
|
|
1680
|
+
if (newConfig.itemHeight !== undefined) this.config.itemHeight = newConfig.itemHeight;
|
|
1681
|
+
if (newConfig.viewportHeight !== undefined) this.config.viewportHeight = newConfig.viewportHeight;
|
|
1682
|
+
if (newConfig.bufferSize !== undefined) this.config.bufferSize = newConfig.bufferSize;
|
|
1683
|
+
if (newConfig.fetchMore !== undefined) {
|
|
1684
|
+
this.config.fetchMore = newConfig.fetchMore;
|
|
1685
|
+
this.engine.setFetchMoreCallback(newConfig.fetchMore);
|
|
1686
|
+
}
|
|
1687
|
+
|
|
1688
|
+
// Re-render with new config
|
|
1689
|
+
this.render();
|
|
1690
|
+
}
|
|
1691
|
+
|
|
1692
|
+
destroy() {
|
|
1693
|
+
this.container.removeEventListener('scroll', this.scrollHandler);
|
|
1694
|
+
this.engine.cleanup();
|
|
1695
|
+
}
|
|
1696
|
+
|
|
1697
|
+
// Public methods
|
|
1698
|
+
getVisibleRange() {
|
|
1699
|
+
return { ...this.visibleRange };
|
|
1700
|
+
}
|
|
1701
|
+
|
|
1702
|
+
refresh() {
|
|
1703
|
+
this.onScroll();
|
|
1704
|
+
}
|
|
1705
|
+
}
|
|
1706
|
+
|
|
1707
|
+
// Factory function for easier usage
|
|
1708
|
+
function createLazyScroll(container, config) {
|
|
1709
|
+
return new LazyScroll(container, config);
|
|
1710
|
+
}
|
|
1711
|
+
|
|
1712
|
+
class LazyScrollElement extends HTMLElement {
|
|
1713
|
+
constructor() {
|
|
1714
|
+
super();
|
|
1715
|
+
this.shadow = this.attachShadow({ mode: 'open' });
|
|
1716
|
+
|
|
1717
|
+
// Default values
|
|
1718
|
+
this.itemHeight = 50;
|
|
1719
|
+
this.viewportHeight = 400;
|
|
1720
|
+
this.bufferSize = 5;
|
|
1721
|
+
this.items = [];
|
|
1722
|
+
|
|
1723
|
+
// Styles
|
|
1724
|
+
const style = document.createElement('style');
|
|
1725
|
+
style.textContent = `
|
|
1726
|
+
:host {
|
|
1727
|
+
display: block;
|
|
1728
|
+
}
|
|
1729
|
+
|
|
1730
|
+
.lazy-scroll-container {
|
|
1731
|
+
position: relative;
|
|
1732
|
+
overflow-y: auto;
|
|
1733
|
+
}
|
|
1734
|
+
|
|
1735
|
+
.lazy-item {
|
|
1736
|
+
width: 100%;
|
|
1737
|
+
}
|
|
1738
|
+
|
|
1739
|
+
.lazy-loading {
|
|
1740
|
+
text-align: center;
|
|
1741
|
+
padding: 20px;
|
|
1742
|
+
color: #666;
|
|
1743
|
+
}
|
|
1744
|
+
`;
|
|
1745
|
+
|
|
1746
|
+
this.shadow.appendChild(style);
|
|
1747
|
+
}
|
|
1748
|
+
|
|
1749
|
+
static get observedAttributes() {
|
|
1750
|
+
return ['item-height', 'viewport-height', 'buffer-size'];
|
|
1751
|
+
}
|
|
1752
|
+
|
|
1753
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
1754
|
+
switch (name) {
|
|
1755
|
+
case 'item-height':
|
|
1756
|
+
this.itemHeight = parseInt(newValue) || 50;
|
|
1757
|
+
break;
|
|
1758
|
+
case 'viewport-height':
|
|
1759
|
+
this.viewportHeight = parseInt(newValue) || 400;
|
|
1760
|
+
break;
|
|
1761
|
+
case 'buffer-size':
|
|
1762
|
+
this.bufferSize = parseInt(newValue) || 5;
|
|
1763
|
+
break;
|
|
1764
|
+
}
|
|
1765
|
+
|
|
1766
|
+
if (this.lazyScrollInstance) {
|
|
1767
|
+
this.lazyScrollInstance.updateConfig({
|
|
1768
|
+
itemHeight: this.itemHeight,
|
|
1769
|
+
viewportHeight: this.viewportHeight,
|
|
1770
|
+
bufferSize: this.bufferSize
|
|
1771
|
+
});
|
|
1772
|
+
}
|
|
1773
|
+
}
|
|
1774
|
+
|
|
1775
|
+
connectedCallback() {
|
|
1776
|
+
// Create container
|
|
1777
|
+
this.container = document.createElement('div');
|
|
1778
|
+
this.container.className = 'lazy-scroll-container';
|
|
1779
|
+
this.container.style.height = `${this.viewportHeight}px`;
|
|
1780
|
+
this.container.style.overflowY = 'auto';
|
|
1781
|
+
|
|
1782
|
+
this.shadow.appendChild(this.container);
|
|
1783
|
+
|
|
1784
|
+
// Get fetchMore function from attribute or slot
|
|
1785
|
+
const fetchMoreAttr = this.getAttribute('fetch-more');
|
|
1786
|
+
let fetchMoreFn = () => Promise.resolve([]);
|
|
1787
|
+
|
|
1788
|
+
if (fetchMoreAttr) {
|
|
1789
|
+
try {
|
|
1790
|
+
// If fetchMore is a function name in global scope
|
|
1791
|
+
fetchMoreFn = window[fetchMoreAttr] || (() => Promise.resolve([]));
|
|
1792
|
+
} catch (e) {
|
|
1793
|
+
console.warn('Could not find fetchMore function:', fetchMoreAttr);
|
|
1794
|
+
}
|
|
1795
|
+
}
|
|
1796
|
+
|
|
1797
|
+
// Initialize lazy scroll
|
|
1798
|
+
this.lazyScrollInstance = createLazyScroll(this.container, {
|
|
1799
|
+
itemHeight: this.itemHeight,
|
|
1800
|
+
viewportHeight: this.viewportHeight,
|
|
1801
|
+
bufferSize: this.bufferSize,
|
|
1802
|
+
fetchMore: fetchMoreFn
|
|
1803
|
+
});
|
|
1804
|
+
|
|
1805
|
+
// Handle items from light DOM
|
|
1806
|
+
this.updateItemsFromSlot();
|
|
1807
|
+
|
|
1808
|
+
// Observe child changes
|
|
1809
|
+
this.mutationObserver = new MutationObserver(() => {
|
|
1810
|
+
this.updateItemsFromSlot();
|
|
1811
|
+
});
|
|
1812
|
+
|
|
1813
|
+
this.mutationObserver.observe(this, { childList: true, subtree: true });
|
|
1814
|
+
}
|
|
1815
|
+
|
|
1816
|
+
disconnectedCallback() {
|
|
1817
|
+
if (this.lazyScrollInstance) {
|
|
1818
|
+
this.lazyScrollInstance.destroy();
|
|
1819
|
+
}
|
|
1820
|
+
|
|
1821
|
+
if (this.mutationObserver) {
|
|
1822
|
+
this.mutationObserver.disconnect();
|
|
1823
|
+
}
|
|
1824
|
+
}
|
|
1825
|
+
|
|
1826
|
+
updateItemsFromSlot() {
|
|
1827
|
+
// Get items from light DOM or data attribute
|
|
1828
|
+
const itemsData = this.getAttribute('items');
|
|
1829
|
+
if (itemsData) {
|
|
1830
|
+
try {
|
|
1831
|
+
const items = JSON.parse(itemsData);
|
|
1832
|
+
if (this.lazyScrollInstance) {
|
|
1833
|
+
this.lazyScrollInstance.setItems(items);
|
|
1834
|
+
}
|
|
1835
|
+
} catch (e) {
|
|
1836
|
+
console.warn('Could not parse items data:', itemsData);
|
|
1837
|
+
}
|
|
1838
|
+
}
|
|
1839
|
+
}
|
|
1840
|
+
|
|
1841
|
+
// Public methods
|
|
1842
|
+
setItems(items) {
|
|
1843
|
+
if (this.lazyScrollInstance) {
|
|
1844
|
+
this.lazyScrollInstance.setItems(items);
|
|
1845
|
+
}
|
|
1846
|
+
}
|
|
1847
|
+
|
|
1848
|
+
refresh() {
|
|
1849
|
+
if (this.lazyScrollInstance) {
|
|
1850
|
+
this.lazyScrollInstance.refresh();
|
|
1851
|
+
}
|
|
1852
|
+
}
|
|
1853
|
+
|
|
1854
|
+
getVisibleRange() {
|
|
1855
|
+
if (this.lazyScrollInstance) {
|
|
1856
|
+
return this.lazyScrollInstance.getVisibleRange();
|
|
1857
|
+
}
|
|
1858
|
+
return { start: 0, end: 0 };
|
|
1859
|
+
}
|
|
1860
|
+
}
|
|
1861
|
+
|
|
1862
|
+
// Register the custom element
|
|
1863
|
+
customElements.define('lazy-scroll-element', LazyScrollElement);
|
|
1864
|
+
|
|
1079
1865
|
/**
|
|
1080
1866
|
* Debounce function to limit the rate at which a function is called
|
|
1081
1867
|
*/
|
|
@@ -1107,5 +1893,5 @@ function throttle(func, limit) {
|
|
|
1107
1893
|
};
|
|
1108
1894
|
}
|
|
1109
1895
|
|
|
1110
|
-
export { AdaptiveBufferCalculator, ContentComplexityAnalyzer, DevicePerformanceMonitor, Engine, IntelligentScrollDetector, LazyList, NetworkAwarePrefetchManager, NetworkAwareRequestQueue, NetworkSpeedDetector, PrefetchManager, RequestQueue, ScrollObserver, WindowManager, debounce, throttle, useLazyList };
|
|
1896
|
+
export { AdaptiveBufferCalculator, ContentComplexityAnalyzer, DevicePerformanceMonitor, Engine, GPUAccelerator, IntelligentScrollDetector, LazyList, LazyScroll, LazyScrollElement, MemoryManager, NetworkAwarePrefetchManager, NetworkAwareRequestQueue, NetworkSpeedDetector, PerformanceOptimizer, PrefetchManager, RequestQueue, ScrollObserver, WindowManager, createLazyScroll, debounce, throttle, useLazyList };
|
|
1111
1897
|
//# sourceMappingURL=index.js.map
|