lazy-render-virtual-scroll 2.0.0 → 2.1.2
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 +172 -87
- package/dist/cjs/adapters/react/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/cjs/adapters/react/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/cjs/adapters/react/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/cjs/adapters/react/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/cjs/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/cjs/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/cjs/adapters/react/core/GlobalScrollManager.d.ts +61 -0
- package/dist/cjs/adapters/react/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/cjs/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/cjs/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/cjs/adapters/react/index.d.ts +5 -0
- package/dist/cjs/adapters/react/index.d.ts.map +1 -1
- package/dist/cjs/angular/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/cjs/angular/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/cjs/angular/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/cjs/angular/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/cjs/angular/core/GlobalScrollManager.d.ts +61 -0
- package/dist/cjs/angular/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/cjs/angular/index.d.ts +5 -0
- package/dist/cjs/angular/index.d.ts.map +1 -1
- package/dist/cjs/core/GlobalScrollManager.d.ts +61 -0
- package/dist/cjs/core/GlobalScrollManager.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 +269 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/svelte/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/cjs/svelte/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/cjs/svelte/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/cjs/svelte/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/cjs/svelte/core/GlobalScrollManager.d.ts +61 -0
- package/dist/cjs/svelte/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/cjs/svelte/index.d.ts +5 -0
- package/dist/cjs/svelte/index.d.ts.map +1 -1
- package/dist/cjs/vue/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/cjs/vue/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/cjs/vue/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/cjs/vue/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/cjs/vue/core/GlobalScrollManager.d.ts +61 -0
- package/dist/cjs/vue/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/cjs/vue/index.d.ts +5 -0
- package/dist/cjs/vue/index.d.ts.map +1 -1
- package/dist/esm/adapters/react/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/esm/adapters/react/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/esm/adapters/react/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/esm/adapters/react/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/esm/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/esm/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/esm/adapters/react/core/GlobalScrollManager.d.ts +61 -0
- package/dist/esm/adapters/react/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/esm/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/esm/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/esm/adapters/react/index.d.ts +5 -0
- package/dist/esm/adapters/react/index.d.ts.map +1 -1
- package/dist/esm/angular/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/esm/angular/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/esm/angular/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/esm/angular/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/esm/angular/core/GlobalScrollManager.d.ts +61 -0
- package/dist/esm/angular/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/esm/angular/index.d.ts +5 -0
- package/dist/esm/angular/index.d.ts.map +1 -1
- package/dist/esm/core/GlobalScrollManager.d.ts +61 -0
- package/dist/esm/core/GlobalScrollManager.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 +266 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/svelte/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/esm/svelte/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/esm/svelte/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/esm/svelte/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/esm/svelte/core/GlobalScrollManager.d.ts +61 -0
- package/dist/esm/svelte/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/esm/svelte/index.d.ts +5 -0
- package/dist/esm/svelte/index.d.ts.map +1 -1
- package/dist/esm/vue/adapters/react/components/withLazyRender.d.ts +22 -0
- package/dist/esm/vue/adapters/react/components/withLazyRender.d.ts.map +1 -0
- package/dist/esm/vue/adapters/react/hooks/useLazyComponent.d.ts +38 -0
- package/dist/esm/vue/adapters/react/hooks/useLazyComponent.d.ts.map +1 -0
- package/dist/esm/vue/core/GlobalScrollManager.d.ts +61 -0
- package/dist/esm/vue/core/GlobalScrollManager.d.ts.map +1 -0
- package/dist/esm/vue/index.d.ts +5 -0
- package/dist/esm/vue/index.d.ts.map +1 -1
- package/dist/index.d.ts +113 -2
- package/package.json +3 -3
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global Scroll Manager
|
|
3
|
+
* Singleton that manages scroll events for all lazy-render components
|
|
4
|
+
* Uses only 2 event listeners for ALL components (scroll + resize)
|
|
5
|
+
*/
|
|
6
|
+
export interface ScrollManagerConfig {
|
|
7
|
+
scrollThrottle?: number;
|
|
8
|
+
resizeDebounce?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ScrollListener {
|
|
11
|
+
id: string;
|
|
12
|
+
callback: (scrollTop: number, container: HTMLElement) => void;
|
|
13
|
+
container: HTMLElement;
|
|
14
|
+
}
|
|
15
|
+
declare class GlobalScrollManagerClass {
|
|
16
|
+
private static instance;
|
|
17
|
+
private listeners;
|
|
18
|
+
private scrollThrottle;
|
|
19
|
+
private resizeDebounce;
|
|
20
|
+
private scrollHandler;
|
|
21
|
+
private resizeHandler;
|
|
22
|
+
private isInitialized;
|
|
23
|
+
private constructor();
|
|
24
|
+
static getInstance(config?: ScrollManagerConfig): GlobalScrollManagerClass;
|
|
25
|
+
/**
|
|
26
|
+
* Register a scroll listener
|
|
27
|
+
* Only 2 event listeners total (scroll + resize) for ALL components
|
|
28
|
+
*/
|
|
29
|
+
register(id: string, container: HTMLElement, callback: (scrollTop: number, container: HTMLElement) => void): void;
|
|
30
|
+
/**
|
|
31
|
+
* Unregister a scroll listener
|
|
32
|
+
*/
|
|
33
|
+
unregister(id: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* Initialize global event listeners
|
|
36
|
+
* Only called once, regardless of how many components
|
|
37
|
+
*/
|
|
38
|
+
private initialize;
|
|
39
|
+
/**
|
|
40
|
+
* Cleanup event listeners
|
|
41
|
+
*/
|
|
42
|
+
private cleanup;
|
|
43
|
+
/**
|
|
44
|
+
* Throttle helper
|
|
45
|
+
*/
|
|
46
|
+
private throttle;
|
|
47
|
+
/**
|
|
48
|
+
* Debounce helper
|
|
49
|
+
*/
|
|
50
|
+
private debounce;
|
|
51
|
+
/**
|
|
52
|
+
* Get stats
|
|
53
|
+
*/
|
|
54
|
+
getStats(): {
|
|
55
|
+
listenerCount: number;
|
|
56
|
+
isInitialized: boolean;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export declare const GlobalScrollManager: GlobalScrollManagerClass;
|
|
60
|
+
export default GlobalScrollManager;
|
|
61
|
+
//# sourceMappingURL=GlobalScrollManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GlobalScrollManager.d.ts","sourceRoot":"","sources":["../../src/core/GlobalScrollManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,KAAK,IAAI,CAAC;IAC9D,SAAS,EAAE,WAAW,CAAC;CACxB;AAED,cAAM,wBAAwB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2B;IAClD,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,aAAa,CAAkB;IAEvC,OAAO;IAKP,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,wBAAwB;IAO1E;;;OAGG;IACH,QAAQ,CACN,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,WAAW,EACtB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,KAAK,IAAI,GAC5D,IAAI;IAQP;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQ5B;;;OAGG;IACH,OAAO,CAAC,UAAU;IAwBlB;;OAEG;IACH,OAAO,CAAC,OAAO;IAcf;;OAEG;IACH,OAAO,CAAC,QAAQ;IAWhB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAQhB;;OAEG;IACH,QAAQ,IAAI;QACV,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,OAAO,CAAC;KACxB;CAMF;AAGD,eAAO,MAAM,mBAAmB,0BAAyC,CAAC;AAC1E,eAAe,mBAAmB,CAAC"}
|
|
@@ -25,10 +25,15 @@ export { PerformanceAnalytics } from './core/PerformanceAnalytics';
|
|
|
25
25
|
export { PerformanceDashboard } from './core/PerformanceDashboard';
|
|
26
26
|
export { AccessibilityManager } from './core/AccessibilityManager';
|
|
27
27
|
export { AnimationManager } from './core/AnimationManager';
|
|
28
|
+
export { GlobalScrollManager } from './core/GlobalScrollManager';
|
|
28
29
|
export type { EngineConfig, VisibleRange, FetchMoreCallback, EngineState, ScrollAnalysis } from './core/types';
|
|
29
30
|
export { ScrollObserver } from './platform/browser/ScrollObserver';
|
|
30
31
|
export { useLazyList } from './adapters/react/useLazyList';
|
|
31
32
|
export { LazyList } from './adapters/react/LazyList';
|
|
33
|
+
export { useLazyComponent } from './adapters/react/hooks/useLazyComponent';
|
|
34
|
+
export { withLazyRender } from './adapters/react/hooks/useLazyComponent';
|
|
35
|
+
export { createLazyComponent } from './adapters/react/components/withLazyRender';
|
|
36
|
+
export type { LazyMode } from './adapters/react/hooks/useLazyComponent';
|
|
32
37
|
export { LazyScroll, createLazyScroll } from './adapters/vanilla/lazyScroll';
|
|
33
38
|
declare class LazyScrollElementClass {
|
|
34
39
|
constructor();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG/G,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG/G,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,YAAY,EAAE,QAAQ,EAAE,MAAM,yCAAyC,CAAC;AAGxE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAK7E,cAAM,sBAAsB;;IAE1B,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;IACrB,OAAO;IACP,eAAe;;;;IACf,MAAM,CAAC,eAAe;CACvB;AAGD,QAAA,MAAM,iBAAiB,+BAEG,CAAC;AAE3B,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAG7B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global Scroll Manager
|
|
3
|
+
* Singleton that manages scroll events for all lazy-render components
|
|
4
|
+
* Uses only 2 event listeners for ALL components (scroll + resize)
|
|
5
|
+
*/
|
|
6
|
+
export interface ScrollManagerConfig {
|
|
7
|
+
scrollThrottle?: number;
|
|
8
|
+
resizeDebounce?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ScrollListener {
|
|
11
|
+
id: string;
|
|
12
|
+
callback: (scrollTop: number, container: HTMLElement) => void;
|
|
13
|
+
container: HTMLElement;
|
|
14
|
+
}
|
|
15
|
+
declare class GlobalScrollManagerClass {
|
|
16
|
+
private static instance;
|
|
17
|
+
private listeners;
|
|
18
|
+
private scrollThrottle;
|
|
19
|
+
private resizeDebounce;
|
|
20
|
+
private scrollHandler;
|
|
21
|
+
private resizeHandler;
|
|
22
|
+
private isInitialized;
|
|
23
|
+
private constructor();
|
|
24
|
+
static getInstance(config?: ScrollManagerConfig): GlobalScrollManagerClass;
|
|
25
|
+
/**
|
|
26
|
+
* Register a scroll listener
|
|
27
|
+
* Only 2 event listeners total (scroll + resize) for ALL components
|
|
28
|
+
*/
|
|
29
|
+
register(id: string, container: HTMLElement, callback: (scrollTop: number, container: HTMLElement) => void): void;
|
|
30
|
+
/**
|
|
31
|
+
* Unregister a scroll listener
|
|
32
|
+
*/
|
|
33
|
+
unregister(id: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* Initialize global event listeners
|
|
36
|
+
* Only called once, regardless of how many components
|
|
37
|
+
*/
|
|
38
|
+
private initialize;
|
|
39
|
+
/**
|
|
40
|
+
* Cleanup event listeners
|
|
41
|
+
*/
|
|
42
|
+
private cleanup;
|
|
43
|
+
/**
|
|
44
|
+
* Throttle helper
|
|
45
|
+
*/
|
|
46
|
+
private throttle;
|
|
47
|
+
/**
|
|
48
|
+
* Debounce helper
|
|
49
|
+
*/
|
|
50
|
+
private debounce;
|
|
51
|
+
/**
|
|
52
|
+
* Get stats
|
|
53
|
+
*/
|
|
54
|
+
getStats(): {
|
|
55
|
+
listenerCount: number;
|
|
56
|
+
isInitialized: boolean;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export declare const GlobalScrollManager: GlobalScrollManagerClass;
|
|
60
|
+
export default GlobalScrollManager;
|
|
61
|
+
//# sourceMappingURL=GlobalScrollManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GlobalScrollManager.d.ts","sourceRoot":"","sources":["../../src/core/GlobalScrollManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,KAAK,IAAI,CAAC;IAC9D,SAAS,EAAE,WAAW,CAAC;CACxB;AAED,cAAM,wBAAwB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2B;IAClD,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,aAAa,CAAkB;IAEvC,OAAO;IAKP,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,wBAAwB;IAO1E;;;OAGG;IACH,QAAQ,CACN,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,WAAW,EACtB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,KAAK,IAAI,GAC5D,IAAI;IAQP;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQ5B;;;OAGG;IACH,OAAO,CAAC,UAAU;IAwBlB;;OAEG;IACH,OAAO,CAAC,OAAO;IAcf;;OAEG;IACH,OAAO,CAAC,QAAQ;IAWhB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAQhB;;OAEG;IACH,QAAQ,IAAI;QACV,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,OAAO,CAAC;KACxB;CAMF;AAGD,eAAO,MAAM,mBAAmB,0BAAyC,CAAC;AAC1E,eAAe,mBAAmB,CAAC"}
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -25,10 +25,15 @@ export { PerformanceAnalytics } from './core/PerformanceAnalytics';
|
|
|
25
25
|
export { PerformanceDashboard } from './core/PerformanceDashboard';
|
|
26
26
|
export { AccessibilityManager } from './core/AccessibilityManager';
|
|
27
27
|
export { AnimationManager } from './core/AnimationManager';
|
|
28
|
+
export { GlobalScrollManager } from './core/GlobalScrollManager';
|
|
28
29
|
export type { EngineConfig, VisibleRange, FetchMoreCallback, EngineState, ScrollAnalysis } from './core/types';
|
|
29
30
|
export { ScrollObserver } from './platform/browser/ScrollObserver';
|
|
30
31
|
export { useLazyList } from './adapters/react/useLazyList';
|
|
31
32
|
export { LazyList } from './adapters/react/LazyList';
|
|
33
|
+
export { useLazyComponent } from './adapters/react/hooks/useLazyComponent';
|
|
34
|
+
export { withLazyRender } from './adapters/react/hooks/useLazyComponent';
|
|
35
|
+
export { createLazyComponent } from './adapters/react/components/withLazyRender';
|
|
36
|
+
export type { LazyMode } from './adapters/react/hooks/useLazyComponent';
|
|
32
37
|
export { LazyScroll, createLazyScroll } from './adapters/vanilla/lazyScroll';
|
|
33
38
|
declare class LazyScrollElementClass {
|
|
34
39
|
constructor();
|
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG/G,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG/G,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4CAA4C,CAAC;AACjF,YAAY,EAAE,QAAQ,EAAE,MAAM,yCAAyC,CAAC;AAGxE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAK7E,cAAM,sBAAsB;;IAE1B,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;IACrB,OAAO;IACP,eAAe;;;;IACf,MAAM,CAAC,eAAe;CACvB;AAGD,QAAA,MAAM,iBAAiB,+BAEG,CAAC;AAE3B,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAG7B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -3674,6 +3674,120 @@ class AnimationManager {
|
|
|
3674
3674
|
}
|
|
3675
3675
|
}
|
|
3676
3676
|
|
|
3677
|
+
/**
|
|
3678
|
+
* Global Scroll Manager
|
|
3679
|
+
* Singleton that manages scroll events for all lazy-render components
|
|
3680
|
+
* Uses only 2 event listeners for ALL components (scroll + resize)
|
|
3681
|
+
*/
|
|
3682
|
+
class GlobalScrollManagerClass {
|
|
3683
|
+
constructor(config = {}) {
|
|
3684
|
+
this.listeners = new Map();
|
|
3685
|
+
this.scrollHandler = null;
|
|
3686
|
+
this.resizeHandler = null;
|
|
3687
|
+
this.isInitialized = false;
|
|
3688
|
+
this.scrollThrottle = config.scrollThrottle || 16;
|
|
3689
|
+
this.resizeDebounce = config.resizeDebounce || 100;
|
|
3690
|
+
}
|
|
3691
|
+
static getInstance(config) {
|
|
3692
|
+
if (!GlobalScrollManagerClass.instance) {
|
|
3693
|
+
GlobalScrollManagerClass.instance = new GlobalScrollManagerClass(config);
|
|
3694
|
+
}
|
|
3695
|
+
return GlobalScrollManagerClass.instance;
|
|
3696
|
+
}
|
|
3697
|
+
/**
|
|
3698
|
+
* Register a scroll listener
|
|
3699
|
+
* Only 2 event listeners total (scroll + resize) for ALL components
|
|
3700
|
+
*/
|
|
3701
|
+
register(id, container, callback) {
|
|
3702
|
+
this.listeners.set(id, { id, callback, container });
|
|
3703
|
+
if (!this.isInitialized) {
|
|
3704
|
+
this.initialize();
|
|
3705
|
+
}
|
|
3706
|
+
}
|
|
3707
|
+
/**
|
|
3708
|
+
* Unregister a scroll listener
|
|
3709
|
+
*/
|
|
3710
|
+
unregister(id) {
|
|
3711
|
+
this.listeners.delete(id);
|
|
3712
|
+
if (this.listeners.size === 0) {
|
|
3713
|
+
this.cleanup();
|
|
3714
|
+
}
|
|
3715
|
+
}
|
|
3716
|
+
/**
|
|
3717
|
+
* Initialize global event listeners
|
|
3718
|
+
* Only called once, regardless of how many components
|
|
3719
|
+
*/
|
|
3720
|
+
initialize() {
|
|
3721
|
+
this.isInitialized = true;
|
|
3722
|
+
// Single scroll handler for ALL components
|
|
3723
|
+
this.scrollHandler = this.throttle(() => {
|
|
3724
|
+
this.listeners.forEach((listener) => {
|
|
3725
|
+
const scrollTop = listener.container.scrollTop;
|
|
3726
|
+
listener.callback(scrollTop, listener.container);
|
|
3727
|
+
});
|
|
3728
|
+
}, this.scrollThrottle);
|
|
3729
|
+
// Single resize handler for ALL components
|
|
3730
|
+
this.resizeHandler = this.debounce(() => {
|
|
3731
|
+
this.listeners.forEach((listener) => {
|
|
3732
|
+
const scrollTop = listener.container.scrollTop;
|
|
3733
|
+
listener.callback(scrollTop, listener.container);
|
|
3734
|
+
});
|
|
3735
|
+
}, this.resizeDebounce);
|
|
3736
|
+
// Attach to document (global)
|
|
3737
|
+
document.addEventListener('scroll', this.scrollHandler, { passive: true, capture: true });
|
|
3738
|
+
window.addEventListener('resize', this.resizeHandler);
|
|
3739
|
+
}
|
|
3740
|
+
/**
|
|
3741
|
+
* Cleanup event listeners
|
|
3742
|
+
*/
|
|
3743
|
+
cleanup() {
|
|
3744
|
+
if (this.scrollHandler) {
|
|
3745
|
+
document.removeEventListener('scroll', this.scrollHandler, { capture: true });
|
|
3746
|
+
this.scrollHandler = null;
|
|
3747
|
+
}
|
|
3748
|
+
if (this.resizeHandler) {
|
|
3749
|
+
window.removeEventListener('resize', this.resizeHandler);
|
|
3750
|
+
this.resizeHandler = null;
|
|
3751
|
+
}
|
|
3752
|
+
this.isInitialized = false;
|
|
3753
|
+
}
|
|
3754
|
+
/**
|
|
3755
|
+
* Throttle helper
|
|
3756
|
+
*/
|
|
3757
|
+
throttle(func, limit) {
|
|
3758
|
+
let inThrottle;
|
|
3759
|
+
return ((...args) => {
|
|
3760
|
+
if (!inThrottle) {
|
|
3761
|
+
func.apply(this, args);
|
|
3762
|
+
inThrottle = true;
|
|
3763
|
+
setTimeout(() => (inThrottle = false), limit);
|
|
3764
|
+
}
|
|
3765
|
+
});
|
|
3766
|
+
}
|
|
3767
|
+
/**
|
|
3768
|
+
* Debounce helper
|
|
3769
|
+
*/
|
|
3770
|
+
debounce(func, wait) {
|
|
3771
|
+
let timeout;
|
|
3772
|
+
return ((...args) => {
|
|
3773
|
+
if (timeout)
|
|
3774
|
+
clearTimeout(timeout);
|
|
3775
|
+
timeout = setTimeout(() => func.apply(this, args), wait);
|
|
3776
|
+
});
|
|
3777
|
+
}
|
|
3778
|
+
/**
|
|
3779
|
+
* Get stats
|
|
3780
|
+
*/
|
|
3781
|
+
getStats() {
|
|
3782
|
+
return {
|
|
3783
|
+
listenerCount: this.listeners.size,
|
|
3784
|
+
isInitialized: this.isInitialized
|
|
3785
|
+
};
|
|
3786
|
+
}
|
|
3787
|
+
}
|
|
3788
|
+
// Export singleton
|
|
3789
|
+
const GlobalScrollManager = GlobalScrollManagerClass.getInstance();
|
|
3790
|
+
|
|
3677
3791
|
class ScrollObserver {
|
|
3678
3792
|
constructor(container, callback, options) {
|
|
3679
3793
|
this.observer = null;
|
|
@@ -3872,6 +3986,157 @@ const LazyList = React.forwardRef((props, ref) => {
|
|
|
3872
3986
|
});
|
|
3873
3987
|
LazyList.displayName = 'LazyList';
|
|
3874
3988
|
|
|
3989
|
+
/**
|
|
3990
|
+
* Hook for lazy component rendering with multiple modes
|
|
3991
|
+
*
|
|
3992
|
+
* Modes:
|
|
3993
|
+
* - virtual: Traditional virtual scrolling (render all, show visible)
|
|
3994
|
+
* - visibility: Intersection Observer (mount only when visible)
|
|
3995
|
+
* - hybrid: Combine both (best performance)
|
|
3996
|
+
*/
|
|
3997
|
+
function useLazyComponent(props = {}) {
|
|
3998
|
+
const { mode = 'hybrid', threshold = 0, rootMargin = '0px', onVisible, onHidden } = props;
|
|
3999
|
+
const ref = React.useRef(null);
|
|
4000
|
+
const [isVisible, setIsVisible] = React.useState(false);
|
|
4001
|
+
const [isInView, setIsInView] = React.useState(false);
|
|
4002
|
+
const [hasMounted, setHasMounted] = React.useState(false);
|
|
4003
|
+
// Visibility API (Intersection Observer)
|
|
4004
|
+
React.useEffect(() => {
|
|
4005
|
+
if (mode === 'visibility' || mode === 'hybrid') {
|
|
4006
|
+
const observer = new IntersectionObserver(([entry]) => {
|
|
4007
|
+
const visible = entry.isIntersecting;
|
|
4008
|
+
setIsVisible(visible);
|
|
4009
|
+
setIsInView(visible);
|
|
4010
|
+
if (visible) {
|
|
4011
|
+
onVisible === null || onVisible === void 0 ? void 0 : onVisible();
|
|
4012
|
+
setHasMounted(true); // Keep mounted once visible
|
|
4013
|
+
}
|
|
4014
|
+
else {
|
|
4015
|
+
onHidden === null || onHidden === void 0 ? void 0 : onHidden();
|
|
4016
|
+
if (mode === 'visibility') {
|
|
4017
|
+
setHasMounted(false); // Unmount when not visible
|
|
4018
|
+
}
|
|
4019
|
+
}
|
|
4020
|
+
}, { threshold, rootMargin });
|
|
4021
|
+
if (ref.current) {
|
|
4022
|
+
observer.observe(ref.current);
|
|
4023
|
+
}
|
|
4024
|
+
return () => observer.disconnect();
|
|
4025
|
+
}
|
|
4026
|
+
}, [mode, threshold, rootMargin, onVisible, onHidden]);
|
|
4027
|
+
// Determine if should render based on mode
|
|
4028
|
+
const shouldRender = React.useCallback(() => {
|
|
4029
|
+
switch (mode) {
|
|
4030
|
+
case 'virtual':
|
|
4031
|
+
return true; // Always render, control visibility with CSS
|
|
4032
|
+
case 'visibility':
|
|
4033
|
+
return hasMounted; // Mount when visible, keep mounted
|
|
4034
|
+
case 'hybrid':
|
|
4035
|
+
return hasMounted; // Mount when visible, keep mounted
|
|
4036
|
+
default:
|
|
4037
|
+
return true;
|
|
4038
|
+
}
|
|
4039
|
+
}, [mode, hasMounted]);
|
|
4040
|
+
// Determine if should mount based on mode
|
|
4041
|
+
const shouldMount = React.useCallback(() => {
|
|
4042
|
+
switch (mode) {
|
|
4043
|
+
case 'virtual':
|
|
4044
|
+
return true; // Always mount
|
|
4045
|
+
case 'visibility':
|
|
4046
|
+
return isVisible; // Mount only when visible
|
|
4047
|
+
case 'hybrid':
|
|
4048
|
+
return isVisible; // Mount only when visible
|
|
4049
|
+
default:
|
|
4050
|
+
return true;
|
|
4051
|
+
}
|
|
4052
|
+
}, [mode, isVisible]);
|
|
4053
|
+
return {
|
|
4054
|
+
isVisible,
|
|
4055
|
+
isInView,
|
|
4056
|
+
ref,
|
|
4057
|
+
shouldRender: shouldRender(),
|
|
4058
|
+
shouldMount: shouldMount()
|
|
4059
|
+
};
|
|
4060
|
+
}
|
|
4061
|
+
/**
|
|
4062
|
+
* HOC for lazy rendering components
|
|
4063
|
+
*
|
|
4064
|
+
* Usage:
|
|
4065
|
+
* const LazyCard = withLazyRender(Card);
|
|
4066
|
+
*
|
|
4067
|
+
* <LazyCard mode="hybrid" />
|
|
4068
|
+
*/
|
|
4069
|
+
function withLazyRender(WrappedComponent) {
|
|
4070
|
+
return function LazyComponent(props) {
|
|
4071
|
+
const { isVisible, ref, shouldMount } = useLazyComponent({
|
|
4072
|
+
mode: props.mode || 'hybrid'
|
|
4073
|
+
});
|
|
4074
|
+
if (!shouldMount) {
|
|
4075
|
+
return React.createElement("div", { ref: ref, style: { height: '100px', background: '#f0f0f0' } }, "Loading...");
|
|
4076
|
+
}
|
|
4077
|
+
return (React.createElement("div", { ref: ref, style: { opacity: isVisible ? 1 : 0, transition: 'opacity 0.3s' } },
|
|
4078
|
+
React.createElement(WrappedComponent, { ...props })));
|
|
4079
|
+
};
|
|
4080
|
+
}
|
|
4081
|
+
|
|
4082
|
+
/**
|
|
4083
|
+
* Higher-Order Component for lazy rendering
|
|
4084
|
+
*
|
|
4085
|
+
* Usage:
|
|
4086
|
+
* const LazyCard = withLazyRender(Card);
|
|
4087
|
+
*
|
|
4088
|
+
* <LazyCard mode="hybrid" placeholder={<div>Loading...</div>} />
|
|
4089
|
+
*/
|
|
4090
|
+
function createLazyComponent(WrappedComponent, options = {}) {
|
|
4091
|
+
return function LazyComponent(props) {
|
|
4092
|
+
const { mode = options.mode || 'hybrid', placeholder = options.placeholder || React.createElement("div", null, "Loading..."), onVisible, onHidden, ...rest } = props;
|
|
4093
|
+
const [isVisible, setIsVisible] = React.useState(false);
|
|
4094
|
+
const [hasMounted, setHasMounted] = React.useState(false);
|
|
4095
|
+
const ref = React.useRef(null);
|
|
4096
|
+
React.useEffect(() => {
|
|
4097
|
+
if (mode === 'visibility' || mode === 'hybrid') {
|
|
4098
|
+
const observer = new IntersectionObserver(([entry]) => {
|
|
4099
|
+
const visible = entry.isIntersecting;
|
|
4100
|
+
setIsVisible(visible);
|
|
4101
|
+
if (visible) {
|
|
4102
|
+
onVisible === null || onVisible === void 0 ? void 0 : onVisible();
|
|
4103
|
+
setHasMounted(true);
|
|
4104
|
+
}
|
|
4105
|
+
else {
|
|
4106
|
+
onHidden === null || onHidden === void 0 ? void 0 : onHidden();
|
|
4107
|
+
if (mode === 'visibility') {
|
|
4108
|
+
setHasMounted(false);
|
|
4109
|
+
}
|
|
4110
|
+
}
|
|
4111
|
+
}, { threshold: 0, rootMargin: '0px' });
|
|
4112
|
+
if (ref.current) {
|
|
4113
|
+
observer.observe(ref.current);
|
|
4114
|
+
}
|
|
4115
|
+
return () => observer.disconnect();
|
|
4116
|
+
}
|
|
4117
|
+
}, [mode, onVisible, onHidden]);
|
|
4118
|
+
const shouldRender = React.useCallback(() => {
|
|
4119
|
+
switch (mode) {
|
|
4120
|
+
case 'virtual':
|
|
4121
|
+
return true;
|
|
4122
|
+
case 'visibility':
|
|
4123
|
+
case 'hybrid':
|
|
4124
|
+
return hasMounted;
|
|
4125
|
+
default:
|
|
4126
|
+
return true;
|
|
4127
|
+
}
|
|
4128
|
+
}, [mode, hasMounted]);
|
|
4129
|
+
if (!shouldRender()) {
|
|
4130
|
+
return React.createElement("div", { ref: ref }, placeholder);
|
|
4131
|
+
}
|
|
4132
|
+
return (React.createElement("div", { ref: ref, style: {
|
|
4133
|
+
opacity: isVisible ? 1 : 0,
|
|
4134
|
+
transition: 'opacity 0.3s ease-in-out'
|
|
4135
|
+
} },
|
|
4136
|
+
React.createElement(WrappedComponent, { ...rest })));
|
|
4137
|
+
};
|
|
4138
|
+
}
|
|
4139
|
+
|
|
3875
4140
|
class LazyScroll {
|
|
3876
4141
|
constructor(container, config) {
|
|
3877
4142
|
this.container = container;
|
|
@@ -4052,6 +4317,7 @@ exports.DevicePerformanceMonitor = DevicePerformanceMonitor;
|
|
|
4052
4317
|
exports.DynamicHeightEngine = DynamicHeightEngine;
|
|
4053
4318
|
exports.Engine = Engine;
|
|
4054
4319
|
exports.GPUAccelerator = GPUAccelerator;
|
|
4320
|
+
exports.GlobalScrollManager = GlobalScrollManager;
|
|
4055
4321
|
exports.HeightMeasurementCache = HeightMeasurementCache;
|
|
4056
4322
|
exports.IntelligentPagination = IntelligentPagination;
|
|
4057
4323
|
exports.IntelligentScrollDetector = IntelligentScrollDetector;
|
|
@@ -4074,8 +4340,11 @@ exports.ScrollObserver = ScrollObserver;
|
|
|
4074
4340
|
exports.SmartPrefetchAlgorithm = SmartPrefetchAlgorithm;
|
|
4075
4341
|
exports.VariableHeightManager = VariableHeightManager;
|
|
4076
4342
|
exports.WindowManager = WindowManager;
|
|
4343
|
+
exports.createLazyComponent = createLazyComponent;
|
|
4077
4344
|
exports.createLazyScroll = createLazyScroll;
|
|
4078
4345
|
exports.debounce = debounce;
|
|
4079
4346
|
exports.throttle = throttle;
|
|
4347
|
+
exports.useLazyComponent = useLazyComponent;
|
|
4080
4348
|
exports.useLazyList = useLazyList;
|
|
4349
|
+
exports.withLazyRender = withLazyRender;
|
|
4081
4350
|
//# sourceMappingURL=index.js.map
|