@floor/vlist 0.5.8 → 0.6.1
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 +787 -611
- package/dist/async/index.js +1 -0
- package/dist/builder/context.d.ts +3 -3
- package/dist/builder/context.d.ts.map +1 -1
- package/dist/builder/core.d.ts +1 -1
- package/dist/builder/core.d.ts.map +1 -1
- package/dist/builder/types.d.ts +3 -3
- package/dist/builder/types.d.ts.map +1 -1
- package/dist/core/full.d.ts +22 -0
- package/dist/core/full.d.ts.map +1 -0
- package/dist/core/lite.d.ts +129 -0
- package/dist/core/lite.d.ts.map +1 -0
- package/dist/core/minimal.d.ts +104 -0
- package/dist/core/minimal.d.ts.map +1 -0
- package/dist/features/async/index.d.ts +9 -0
- package/dist/features/async/index.d.ts.map +1 -0
- package/dist/features/async/manager.d.ts +103 -0
- package/dist/features/async/manager.d.ts.map +1 -0
- package/dist/features/async/placeholder.d.ts +62 -0
- package/dist/features/async/placeholder.d.ts.map +1 -0
- package/dist/features/async/plugin.d.ts +60 -0
- package/dist/features/async/plugin.d.ts.map +1 -0
- package/dist/features/async/sparse.d.ts +91 -0
- package/dist/features/async/sparse.d.ts.map +1 -0
- package/dist/features/grid/index.d.ts +9 -0
- package/dist/features/grid/index.d.ts.map +1 -0
- package/dist/features/grid/layout.d.ts +29 -0
- package/dist/features/grid/layout.d.ts.map +1 -0
- package/dist/features/grid/plugin.d.ts +48 -0
- package/dist/features/grid/plugin.d.ts.map +1 -0
- package/dist/features/grid/renderer.d.ts +55 -0
- package/dist/features/grid/renderer.d.ts.map +1 -0
- package/dist/features/grid/types.d.ts +71 -0
- package/dist/features/grid/types.d.ts.map +1 -0
- package/dist/features/page/index.d.ts +8 -0
- package/dist/features/page/index.d.ts.map +1 -0
- package/dist/features/page/plugin.d.ts +53 -0
- package/dist/features/page/plugin.d.ts.map +1 -0
- package/dist/features/scale/index.d.ts +10 -0
- package/dist/features/scale/index.d.ts.map +1 -0
- package/dist/features/scale/plugin.d.ts +42 -0
- package/dist/features/scale/plugin.d.ts.map +1 -0
- package/dist/features/scrollbar/controller.d.ts +121 -0
- package/dist/features/scrollbar/controller.d.ts.map +1 -0
- package/dist/features/scrollbar/index.d.ts +8 -0
- package/dist/features/scrollbar/index.d.ts.map +1 -0
- package/dist/features/scrollbar/plugin.d.ts +60 -0
- package/dist/features/scrollbar/plugin.d.ts.map +1 -0
- package/dist/features/scrollbar/scrollbar.d.ts +73 -0
- package/dist/features/scrollbar/scrollbar.d.ts.map +1 -0
- package/dist/features/sections/index.d.ts +10 -0
- package/dist/features/sections/index.d.ts.map +1 -0
- package/dist/features/sections/layout.d.ts +46 -0
- package/dist/features/sections/layout.d.ts.map +1 -0
- package/dist/features/sections/plugin.d.ts +64 -0
- package/dist/features/sections/plugin.d.ts.map +1 -0
- package/dist/features/sections/sticky.d.ts +33 -0
- package/dist/features/sections/sticky.d.ts.map +1 -0
- package/dist/features/sections/types.d.ts +86 -0
- package/dist/features/sections/types.d.ts.map +1 -0
- package/dist/features/selection/index.d.ts +7 -0
- package/dist/features/selection/index.d.ts.map +1 -0
- package/dist/features/selection/plugin.d.ts +44 -0
- package/dist/features/selection/plugin.d.ts.map +1 -0
- package/dist/features/selection/state.d.ts +102 -0
- package/dist/features/selection/state.d.ts.map +1 -0
- package/dist/features/snapshots/index.d.ts +8 -0
- package/dist/features/snapshots/index.d.ts.map +1 -0
- package/dist/features/snapshots/plugin.d.ts +44 -0
- package/dist/features/snapshots/plugin.d.ts.map +1 -0
- package/dist/grid/index.js +1 -1
- package/dist/index.d.ts +17 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/page/index.js +1 -0
- package/dist/react/index.js +1 -1
- package/dist/rendering/heights.d.ts +63 -0
- package/dist/rendering/heights.d.ts.map +1 -0
- package/dist/rendering/index.d.ts +9 -0
- package/dist/rendering/index.d.ts.map +1 -0
- package/dist/rendering/renderer.d.ts +103 -0
- package/dist/rendering/renderer.d.ts.map +1 -0
- package/dist/rendering/scale.d.ts +116 -0
- package/dist/rendering/scale.d.ts.map +1 -0
- package/dist/rendering/viewport.d.ts +139 -0
- package/dist/rendering/viewport.d.ts.map +1 -0
- package/dist/scale/index.js +1 -0
- package/dist/scrollbar/index.js +1 -0
- package/dist/sections/index.js +1 -0
- package/dist/selection/index.js +1 -1
- package/dist/svelte/index.js +1 -1
- package/dist/vue/index.js +1 -1
- package/package.json +1 -51
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist - Compression Module
|
|
3
|
+
* Pure functions for handling large lists that exceed browser height limits
|
|
4
|
+
*
|
|
5
|
+
* When a list's total height (totalItems × itemHeight) exceeds the browser's
|
|
6
|
+
* maximum element height (~16.7M pixels), we "compress" the virtual scroll space.
|
|
7
|
+
*
|
|
8
|
+
* Key concepts:
|
|
9
|
+
* - actualHeight: The true height if all items were rendered
|
|
10
|
+
* - virtualHeight: The capped height used for the scroll container (≤ MAX_VIRTUAL_HEIGHT)
|
|
11
|
+
* - compressionRatio: virtualHeight / actualHeight (1 = no compression, <1 = compressed)
|
|
12
|
+
*
|
|
13
|
+
* When compressed:
|
|
14
|
+
* - Scroll position maps to item index via ratio, not pixel math
|
|
15
|
+
* - Item positions are calculated relative to a "virtual index" at current scroll
|
|
16
|
+
* - Near-bottom interpolation ensures the last items are reachable
|
|
17
|
+
*/
|
|
18
|
+
import type { Range } from "../types";
|
|
19
|
+
import { MAX_VIRTUAL_HEIGHT } from "../constants";
|
|
20
|
+
import type { HeightCache } from "./heights";
|
|
21
|
+
export { MAX_VIRTUAL_HEIGHT };
|
|
22
|
+
/** Compression calculation result */
|
|
23
|
+
export interface CompressionState {
|
|
24
|
+
/** Whether compression is active */
|
|
25
|
+
isCompressed: boolean;
|
|
26
|
+
/** The actual total height */
|
|
27
|
+
actualHeight: number;
|
|
28
|
+
/** The virtual height (capped at MAX_VIRTUAL_HEIGHT) */
|
|
29
|
+
virtualHeight: number;
|
|
30
|
+
/** Compression ratio (1 = no compression, <1 = compressed) */
|
|
31
|
+
ratio: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Calculate compression state for a list
|
|
35
|
+
* Pure function - no side effects
|
|
36
|
+
*/
|
|
37
|
+
export declare const getCompressionState: (_totalItems: number, heightCache: HeightCache) => CompressionState;
|
|
38
|
+
/**
|
|
39
|
+
* Calculate visible range with compression support
|
|
40
|
+
* Pure function - no side effects
|
|
41
|
+
*
|
|
42
|
+
* @param scrollTop - Current scroll position
|
|
43
|
+
* @param containerHeight - Viewport container height
|
|
44
|
+
* @param heightCache - Height cache for item heights/offsets
|
|
45
|
+
* @param totalItems - Total number of items
|
|
46
|
+
* @param compression - Compression state
|
|
47
|
+
* @param out - Output range to mutate (avoids allocation on hot path)
|
|
48
|
+
*/
|
|
49
|
+
export declare const calculateCompressedVisibleRange: (scrollTop: number, containerHeight: number, heightCache: HeightCache, totalItems: number, compression: CompressionState, out: Range) => Range;
|
|
50
|
+
/**
|
|
51
|
+
* Calculate render range with compression support (adds overscan)
|
|
52
|
+
* Pure function - no side effects
|
|
53
|
+
*
|
|
54
|
+
* @param out - Output range to mutate (avoids allocation on hot path)
|
|
55
|
+
*/
|
|
56
|
+
export declare const calculateCompressedRenderRange: (visibleRange: Range, overscan: number, totalItems: number, out: Range) => Range;
|
|
57
|
+
/**
|
|
58
|
+
* Calculate item position (translateY) with compression support
|
|
59
|
+
* Pure function - no side effects
|
|
60
|
+
*
|
|
61
|
+
* In compressed mode (manual wheel scrolling, overflow: hidden), items are
|
|
62
|
+
* positioned RELATIVE TO THE VIEWPORT. The scroll container doesn't actually
|
|
63
|
+
* scroll - we intercept wheel events and manually position items.
|
|
64
|
+
*
|
|
65
|
+
* Key insight:
|
|
66
|
+
* - Calculate a "virtual scroll index" from the scroll ratio
|
|
67
|
+
* - Items are positioned relative to this virtual index using actual heights
|
|
68
|
+
* - Each item keeps its full height for proper rendering
|
|
69
|
+
*
|
|
70
|
+
* @param index - Item index
|
|
71
|
+
* @param scrollTop - Current (virtual) scroll position
|
|
72
|
+
* @param heightCache - Height cache for item heights/offsets
|
|
73
|
+
* @param totalItems - Total number of items
|
|
74
|
+
* @param containerHeight - Viewport container height
|
|
75
|
+
* @param compression - Compression state
|
|
76
|
+
* @param _rangeStart - (unused, kept for API compatibility)
|
|
77
|
+
*/
|
|
78
|
+
export declare const calculateCompressedItemPosition: (index: number, scrollTop: number, heightCache: HeightCache, totalItems: number, containerHeight: number, compression: CompressionState, _rangeStart?: number) => number;
|
|
79
|
+
/**
|
|
80
|
+
* Calculate scroll position to bring an index into view (with compression)
|
|
81
|
+
* Pure function - no side effects
|
|
82
|
+
*
|
|
83
|
+
* @param index - Target item index
|
|
84
|
+
* @param heightCache - Height cache for item heights/offsets
|
|
85
|
+
* @param containerHeight - Viewport container height
|
|
86
|
+
* @param totalItems - Total number of items
|
|
87
|
+
* @param compression - Compression state
|
|
88
|
+
* @param align - Alignment within viewport
|
|
89
|
+
*/
|
|
90
|
+
export declare const calculateCompressedScrollToIndex: (index: number, heightCache: HeightCache, containerHeight: number, totalItems: number, compression: CompressionState, align?: "start" | "center" | "end") => number;
|
|
91
|
+
/**
|
|
92
|
+
* Calculate the approximate item index at a given scroll position
|
|
93
|
+
* Useful for debugging and scroll position restoration
|
|
94
|
+
* Pure function - no side effects
|
|
95
|
+
*/
|
|
96
|
+
export declare const calculateIndexFromScrollPosition: (scrollTop: number, heightCache: HeightCache, totalItems: number, compression: CompressionState) => number;
|
|
97
|
+
/**
|
|
98
|
+
* Check if compression is needed for a list configuration
|
|
99
|
+
* Pure function - no side effects
|
|
100
|
+
*
|
|
101
|
+
* Note: This overload accepts a HeightCache for variable heights.
|
|
102
|
+
* For simple fixed-height checks, use needsCompressionFixed().
|
|
103
|
+
*/
|
|
104
|
+
export declare const needsCompression: (totalItems: number, heightOrCache: number | HeightCache) => boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Calculate maximum items supported without compression
|
|
107
|
+
* Only meaningful for fixed-height items
|
|
108
|
+
* Pure function - no side effects
|
|
109
|
+
*/
|
|
110
|
+
export declare const getMaxItemsWithoutCompression: (itemHeight: number) => number;
|
|
111
|
+
/**
|
|
112
|
+
* Get human-readable compression info for debugging
|
|
113
|
+
* Pure function - no side effects
|
|
114
|
+
*/
|
|
115
|
+
export declare const getCompressionInfo: (totalItems: number, heightCache: HeightCache) => string;
|
|
116
|
+
//# sourceMappingURL=scale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scale.d.ts","sourceRoot":"","sources":["../../src/rendering/scale.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAQ7C,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAM9B,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,YAAY,EAAE,OAAO,CAAC;IAEtB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IAErB,wDAAwD;IACxD,aAAa,EAAE,MAAM,CAAC;IAEtB,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,aAAa,MAAM,EACnB,aAAa,WAAW,KACvB,gBAYF,CAAC;AAMF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,+BAA+B,GAC1C,WAAW,MAAM,EACjB,iBAAiB,MAAM,EACvB,aAAa,WAAW,EACxB,YAAY,MAAM,EAClB,aAAa,gBAAgB,EAC7B,KAAK,KAAK,KACT,KAmEF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,GACzC,cAAc,KAAK,EACnB,UAAU,MAAM,EAChB,YAAY,MAAM,EAClB,KAAK,KAAK,KACT,KAUF,CAAC;AAMF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,+BAA+B,GAC1C,OAAO,MAAM,EACb,WAAW,MAAM,EACjB,aAAa,WAAW,EACxB,YAAY,MAAM,EAClB,iBAAiB,MAAM,EACvB,aAAa,gBAAgB,EAC7B,cAAc,MAAM,KACnB,MAyDF,CAAC;AAMF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gCAAgC,GAC3C,OAAO,MAAM,EACb,aAAa,WAAW,EACxB,iBAAiB,MAAM,EACvB,YAAY,MAAM,EAClB,aAAa,gBAAgB,EAC7B,QAAO,OAAO,GAAG,QAAQ,GAAG,KAAe,KAC1C,MAmCF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,GAC3C,WAAW,MAAM,EACjB,aAAa,WAAW,EACxB,YAAY,MAAM,EAClB,aAAa,gBAAgB,KAC5B,MASF,CAAC;AAMF;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC3B,YAAY,MAAM,EAClB,eAAe,MAAM,GAAG,WAAW,KAClC,OAKF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,GAAI,YAAY,MAAM,KAAG,MAGlE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,YAAY,MAAM,EAClB,aAAa,WAAW,KACvB,MASF,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist - Virtual Scrolling Core
|
|
3
|
+
* Pure functions for virtual scroll calculations
|
|
4
|
+
*
|
|
5
|
+
* Compression support is NOT imported here — it's injected via
|
|
6
|
+
* CompressionState parameters. When compression is inactive
|
|
7
|
+
* (the common case), all calculations use simple height-cache math
|
|
8
|
+
* with zero dependency on the compression module.
|
|
9
|
+
*
|
|
10
|
+
* This keeps the builder core lightweight. The withCompression plugin
|
|
11
|
+
* and the monolithic createVList entry point import compression
|
|
12
|
+
* separately and pass the state in.
|
|
13
|
+
*/
|
|
14
|
+
import type { Range, ViewportState } from "../types";
|
|
15
|
+
import type { HeightCache } from "./heights";
|
|
16
|
+
/** Compression calculation result */
|
|
17
|
+
export interface CompressionState {
|
|
18
|
+
/** Whether compression is active */
|
|
19
|
+
isCompressed: boolean;
|
|
20
|
+
/** The actual total height */
|
|
21
|
+
actualHeight: number;
|
|
22
|
+
/** The virtual height (capped at MAX_VIRTUAL_HEIGHT) */
|
|
23
|
+
virtualHeight: number;
|
|
24
|
+
/** Compression ratio (1 = no compression, <1 = compressed) */
|
|
25
|
+
ratio: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A "no compression" state for lists that don't need it.
|
|
29
|
+
* Used by the builder core when withCompression is not installed.
|
|
30
|
+
*/
|
|
31
|
+
export declare const NO_COMPRESSION: CompressionState;
|
|
32
|
+
/**
|
|
33
|
+
* Create a trivial compression state from a height cache.
|
|
34
|
+
* No compression logic — just reads the total height.
|
|
35
|
+
* For use when the full compression module is not loaded.
|
|
36
|
+
*/
|
|
37
|
+
export declare const getSimpleCompressionState: (_totalItems: number, heightCache: HeightCache) => CompressionState;
|
|
38
|
+
/**
|
|
39
|
+
* Signature for the function that calculates the visible item range.
|
|
40
|
+
* The compression module provides a version that handles compressed scroll;
|
|
41
|
+
* virtual.ts provides a simple fallback for non-compressed lists.
|
|
42
|
+
*/
|
|
43
|
+
export type VisibleRangeFn = (scrollTop: number, containerHeight: number, heightCache: HeightCache, totalItems: number, compression: CompressionState, out: Range) => Range;
|
|
44
|
+
/**
|
|
45
|
+
* Signature for the scroll-to-index calculator.
|
|
46
|
+
*/
|
|
47
|
+
export type ScrollToIndexFn = (index: number, heightCache: HeightCache, containerHeight: number, totalItems: number, compression: CompressionState, align: "start" | "center" | "end") => number;
|
|
48
|
+
/**
|
|
49
|
+
* Calculate visible range using height cache lookups.
|
|
50
|
+
* Fast path for lists that don't need compression (< ~350 000 items at 48px).
|
|
51
|
+
* Mutates `out` to avoid allocation on the scroll hot path.
|
|
52
|
+
*/
|
|
53
|
+
export declare const simpleVisibleRange: VisibleRangeFn;
|
|
54
|
+
/**
|
|
55
|
+
* Calculate render range (adds overscan around visible range).
|
|
56
|
+
* This function is compression-agnostic — works for both paths.
|
|
57
|
+
* Mutates `out` to avoid allocation on the scroll hot path.
|
|
58
|
+
*/
|
|
59
|
+
export declare const calculateRenderRange: (visibleRange: Range, overscan: number, totalItems: number, out: Range) => Range;
|
|
60
|
+
/**
|
|
61
|
+
* Simple scroll-to-index calculation (non-compressed).
|
|
62
|
+
* Uses height cache offsets directly.
|
|
63
|
+
*/
|
|
64
|
+
export declare const simpleScrollToIndex: ScrollToIndexFn;
|
|
65
|
+
/**
|
|
66
|
+
* Calculate total content height.
|
|
67
|
+
* Uses compression's virtualHeight when compressed, raw height otherwise.
|
|
68
|
+
*/
|
|
69
|
+
export declare const calculateTotalHeight: (_totalItems: number, heightCache: HeightCache, compression?: CompressionState | null) => number;
|
|
70
|
+
/**
|
|
71
|
+
* Calculate actual total height (without compression cap)
|
|
72
|
+
*/
|
|
73
|
+
export declare const calculateActualHeight: (_totalItems: number, heightCache: HeightCache) => number;
|
|
74
|
+
/**
|
|
75
|
+
* Calculate the offset (translateY) for an item
|
|
76
|
+
* For non-compressed lists only
|
|
77
|
+
*/
|
|
78
|
+
export declare const calculateItemOffset: (index: number, heightCache: HeightCache) => number;
|
|
79
|
+
/**
|
|
80
|
+
* Clamp scroll position to valid range
|
|
81
|
+
*/
|
|
82
|
+
export declare const clampScrollPosition: (scrollTop: number, totalHeight: number, containerHeight: number) => number;
|
|
83
|
+
/**
|
|
84
|
+
* Determine scroll direction
|
|
85
|
+
*/
|
|
86
|
+
export declare const getScrollDirection: (currentScrollTop: number, previousScrollTop: number) => "up" | "down";
|
|
87
|
+
/**
|
|
88
|
+
* Create initial viewport state.
|
|
89
|
+
*
|
|
90
|
+
* Accepts an optional `visibleRangeFn` so that compression-aware callers
|
|
91
|
+
* can inject the compressed version. Defaults to `simpleVisibleRange`.
|
|
92
|
+
*/
|
|
93
|
+
export declare const createViewportState: (containerHeight: number, heightCache: HeightCache, totalItems: number, overscan: number, compression: CompressionState, visibleRangeFn?: VisibleRangeFn) => ViewportState;
|
|
94
|
+
/**
|
|
95
|
+
* Update viewport state after scroll.
|
|
96
|
+
* Mutates state in place for performance on the scroll hot path.
|
|
97
|
+
*/
|
|
98
|
+
export declare const updateViewportState: (state: ViewportState, scrollTop: number, heightCache: HeightCache, totalItems: number, overscan: number, compression: CompressionState, visibleRangeFn?: VisibleRangeFn) => ViewportState;
|
|
99
|
+
/**
|
|
100
|
+
* Update viewport state when container resizes.
|
|
101
|
+
* Mutates state in place for performance.
|
|
102
|
+
*/
|
|
103
|
+
export declare const updateViewportSize: (state: ViewportState, containerHeight: number, heightCache: HeightCache, totalItems: number, overscan: number, compression: CompressionState, visibleRangeFn?: VisibleRangeFn) => ViewportState;
|
|
104
|
+
/**
|
|
105
|
+
* Update viewport state when total items changes.
|
|
106
|
+
* Mutates state in place for performance.
|
|
107
|
+
*/
|
|
108
|
+
export declare const updateViewportItems: (state: ViewportState, heightCache: HeightCache, totalItems: number, overscan: number, compression: CompressionState, visibleRangeFn?: VisibleRangeFn) => ViewportState;
|
|
109
|
+
/**
|
|
110
|
+
* Calculate scroll position to bring an index into view.
|
|
111
|
+
*
|
|
112
|
+
* Accepts an optional `scrollToIndexFn` so that compression-aware callers
|
|
113
|
+
* can inject the compressed version. Defaults to `simpleScrollToIndex`.
|
|
114
|
+
*/
|
|
115
|
+
export declare const calculateScrollToIndex: (index: number, heightCache: HeightCache, containerHeight: number, totalItems: number, align: "start" | "center" | "end" | undefined, compression: CompressionState, scrollToIndexFn?: ScrollToIndexFn) => number;
|
|
116
|
+
/**
|
|
117
|
+
* Check if two ranges are equal
|
|
118
|
+
*/
|
|
119
|
+
export declare const rangesEqual: (a: Range, b: Range) => boolean;
|
|
120
|
+
/**
|
|
121
|
+
* Check if an index is within a range
|
|
122
|
+
*/
|
|
123
|
+
export declare const isInRange: (index: number, range: Range) => boolean;
|
|
124
|
+
/**
|
|
125
|
+
* Get the count of items in a range
|
|
126
|
+
*/
|
|
127
|
+
export declare const getRangeCount: (range: Range) => number;
|
|
128
|
+
/**
|
|
129
|
+
* Create an array of indices from a range
|
|
130
|
+
*/
|
|
131
|
+
export declare const rangeToIndices: (range: Range) => number[];
|
|
132
|
+
/**
|
|
133
|
+
* Calculate which indices need to be added/removed when range changes
|
|
134
|
+
*/
|
|
135
|
+
export declare const diffRanges: (oldRange: Range, newRange: Range) => {
|
|
136
|
+
add: number[];
|
|
137
|
+
remove: number[];
|
|
138
|
+
};
|
|
139
|
+
//# sourceMappingURL=viewport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../../src/rendering/viewport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var F=16000000;var Ny=(j,K,J,y)=>{if(y===0)return 0;if(!j.isVariable())return Math.ceil(J/j.getHeight(0));let N=0,Q=0,q=K;while(q<y&&Q<J)Q+=j.getHeight(q),N++,q++;return Math.max(1,N)},l=(j,K,J)=>{if(J===0)return 0;if(!j.isVariable())return Math.floor(K/j.getHeight(0));let y=0,N=0;for(let Q=J-1;Q>=0;Q--){let q=j.getHeight(Q);if(N+q>K)break;N+=q,y++}return Math.max(y,1)},n=(j,K,J)=>{if(J===0)return 0;let y=Math.floor(K),N=K-y,Q=Math.max(0,Math.min(y,J-1));return j.getOffset(Q)+N*j.getHeight(Q)};var w=(j,K)=>{let J=K.getTotalHeight(),y=J>F,N=y?F:J,Q=J>0?N/J:1;return{isCompressed:y,actualHeight:J,virtualHeight:N,ratio:Q}},c=(j,K,J,y,N,Q)=>{if(y===0||K===0)return Q.start=0,Q.end=-1,Q;if(!N.isCompressed){let X=J.indexAtOffset(j),$=J.indexAtOffset(j+K);if($<y-1)$++;return Q.start=Math.max(0,X),Q.end=Math.min(y-1,Math.max(0,$)),Q}let{virtualHeight:q}=N,B=j/q*y,E=Math.floor(B),L=Ny(J,Math.max(0,E),K,y),Y=Math.ceil(B)+L,G=q-K-j;if(G<=K&&G>=-1){let X=l(J,K,y),$=Math.max(0,y-X),D=Math.max(0,Math.min(1,1-G/K));E=Math.floor(E+($-E)*D),Y=G<=1?y-1:Math.min(y-1,E+L)}return Q.start=Math.max(0,E),Q.end=Math.min(y-1,Math.max(0,Y)),Q},Gy=(j,K,J,y)=>{if(J===0)return y.start=0,y.end=-1,y;return y.start=Math.max(0,j.start-K),y.end=Math.min(J-1,j.end+K),y},r=(j,K,J,y,N,Q,q)=>{if(!Q.isCompressed||y===0)return J.getOffset(j);let{virtualHeight:V}=Q,B=V-N,E=B-K;if(E<=N&&E>=-1){if(K>=B-1){let b=J.getTotalHeight()-J.getOffset(j);return N-b}let W=l(J,N,y),G=Math.max(0,y-W),$=K/V*y,D=Math.max(0,Math.min(1,1-E/N)),z=J.getOffset(j)-J.getOffset(G),M=J.getOffset(j)-n(J,$,y);return M+(z-M)*D}let Y=K/V*y;return J.getOffset(j)-n(J,Y,y)},a=(j,K,J,y,N,Q="start")=>{if(y===0)return 0;let q;if(N.isCompressed){if(Q==="end"&&j===y-1)return Math.max(0,N.virtualHeight-J);q=j/y*N.virtualHeight}else q=K.getOffset(j);let V=K.getHeight(j);switch(Q){case"center":q-=(J-V)/2;break;case"end":q-=J-V;break}let B=N.virtualHeight-J;return Math.max(0,Math.min(q,B))},Uy=(j,K,J,y)=>{if(J===0)return 0;if(y.isCompressed){let N=j/y.virtualHeight;return Math.floor(N*J)}return K.indexAtOffset(j)},Dy=(j,K)=>{if(typeof K==="number")return j*K>F;return K.getTotalHeight()>F},_y=(j)=>{if(j<=0)return 0;return Math.floor(F/j)},Ey=(j,K)=>{let J=w(j,K);if(!J.isCompressed)return`No compression needed (${j} items, ${(J.actualHeight/1e6).toFixed(2)}M px)`;return`Compressed to ${(J.ratio*100).toFixed(1)}% (${j} items, ${(J.actualHeight/1e6).toFixed(1)}M px → ${(J.virtualHeight/1e6).toFixed(1)}M px virtual)`};var i=(j,K,J={},y="vlist",N=!1)=>{let{autoHide:Q=!0,autoHideDelay:q=1000,minThumbSize:V=30,showOnHover:B=!0,hoverZoneWidth:E=16,showOnViewportEnter:L=!0}=J,Y=0,W=0,G=0,X=0,$=!1,D=!1,z=0,M=0,b=0,f=null,T=!1,Z=null,P=null,Qy=N?"width":"height",o=N?"translateX":"translateY",u=N?(_)=>_.clientX:(_)=>_.clientY,Yy=N?"left":"top",U=document.createElement("div"),R=document.createElement("div"),O=B?document.createElement("div"):null,$y=()=>{if(U.className=`${y}-scrollbar`,R.className=`${y}-scrollbar-thumb`,N)U.classList.add(`${y}-scrollbar--horizontal`);if(U.appendChild(R),j.appendChild(U),O){if(O.className=`${y}-scrollbar-hover`,N)O.classList.add(`${y}-scrollbar-hover--horizontal`),O.style.height=`${E}px`;else O.style.width=`${E}px`;j.appendChild(O)}},S=()=>{if(f)clearTimeout(f),f=null},v=()=>{if(!Q)return;S(),f=setTimeout(d,q)},H=()=>{if(Y<=W)return;if(S(),!T)U.classList.add(`${y}-scrollbar--visible`),T=!0;if(Q&&!$&&!D)v()},d=()=>{if($||D)return;U.classList.remove(`${y}-scrollbar--visible`),T=!1},Wy=(_,A)=>{Y=_,W=A;let C=Y>W;if(U.style.display=C?"":"none",!C){d();return}let k=W/Y;G=Math.max(V,k*W),R.style[Qy]=`${G}px`,X=W-G,e(b)},e=(_)=>{if(b=_,Y<=W||X<=0)return;let A=Y-W,k=Math.min(1,Math.max(0,_/A))*X;R.style.transform=`${o}(${k}px)`},t=(_)=>{if(_.target===R)return;let A=U.getBoundingClientRect(),m=u(_)-A[Yy]-G/2,Ky=Math.max(0,Math.min(m,X))/X,s=Y-W,qy=Ky*s;K(qy),H()},yy=(_)=>{_.preventDefault(),_.stopPropagation(),$=!0,z=u(_),M=b,S(),U.classList.add(`${y}-scrollbar--dragging`),document.addEventListener("mousemove",x),document.addEventListener("mouseup",g)},x=(_)=>{if(!$)return;let A=u(_)-z,C=X>0?A/X:0,k=Y-W,m=C*k,h=Math.max(0,Math.min(M+m,k)),s=h/k*X;if(R.style.transform=`${o}(${s}px)`,P=h,Z===null)Z=requestAnimationFrame(()=>{if(P!==null)K(P);Z=null})},g=()=>{if($=!1,Z!==null)cancelAnimationFrame(Z),Z=null;if(P!==null)K(P),P=null;if(U.classList.remove(`${y}-scrollbar--dragging`),Q&&!D)v();document.removeEventListener("mousemove",x),document.removeEventListener("mouseup",g)},jy=()=>{if(L)H()},Jy=()=>{if(!$){if(D=!1,Q)v()}},I=()=>{D=!0,S(),H()},p=()=>{if(D=!1,!$&&Q)v()},Xy=()=>{if(S(),Z!==null)cancelAnimationFrame(Z),Z=null;if(U.removeEventListener("click",t),U.removeEventListener("mouseenter",I),U.removeEventListener("mouseleave",p),R.removeEventListener("mousedown",yy),j.removeEventListener("mouseenter",jy),j.removeEventListener("mouseleave",Jy),document.removeEventListener("mousemove",x),document.removeEventListener("mouseup",g),O){if(O.removeEventListener("mouseenter",I),O.removeEventListener("mouseleave",p),O.parentNode)O.parentNode.removeChild(O)}if(U.parentNode)U.parentNode.removeChild(U)};if($y(),U.addEventListener("click",t),U.addEventListener("mouseenter",I),U.addEventListener("mouseleave",p),R.addEventListener("mousedown",yy),j.addEventListener("mouseenter",jy),j.addEventListener("mouseleave",Jy),O)O.addEventListener("mouseenter",I),O.addEventListener("mouseleave",p);return{show:H,hide:d,updateBounds:Wy,updatePosition:e,isVisible:()=>T,destroy:Xy}};var Ly=()=>{let j=null,K=0,J=!1;return{name:"withScale",priority:20,setup(y){let{dom:N,config:Q}=y,{classPrefix:q,horizontal:V}=Q,B=()=>{let L=y.getVirtualTotal(),Y=w(L,y.heightCache);if(Y.isCompressed&&!J){J=!0,y.scrollController.enableCompression(Y),y.updateContentSize(Y.virtualHeight),y.setScrollFns(()=>K,($)=>{K=$});let W=N.viewport,G=($)=>{$.preventDefault();let D=Y.virtualHeight-y.state.viewportState.containerHeight;K=Math.max(0,Math.min(K+$.deltaY,D)),y.scrollController.scrollTo(K)};if(W.addEventListener("wheel",G,{passive:!1}),y.destroyHandlers.push(()=>{W.removeEventListener("wheel",G)}),!N.viewport.querySelector(`.${q}-scrollbar-track`)){if(j=i(N.viewport,(D)=>y.scrollController.scrollTo(D),{},q,V),!N.viewport.classList.contains(`${q}-viewport--custom-scrollbar`))N.viewport.classList.add(`${q}-viewport--custom-scrollbar`);j.updateBounds(Y.virtualHeight,y.state.viewportState.containerHeight);let $=j;y.afterScroll.push((D,z)=>{if($)$.updatePosition(D),$.show()}),y.resizeHandlers.push((D,z)=>{if($){let M=y.getCachedCompression();$.updateBounds(M.virtualHeight,y.state.viewportState.containerHeight)}})}}else if(!Y.isCompressed&&J)J=!1,y.scrollController.disableCompression(),y.updateContentSize(Y.actualHeight);else if(Y.isCompressed)y.scrollController.updateConfig({compression:Y}),y.updateContentSize(Y.virtualHeight);if(j)j.updateBounds(Y.virtualHeight,y.state.viewportState.containerHeight);y.state.cachedCompression={state:Y,totalItems:L}};y.updateCompressionMode=B;let E=y.getCachedCompression.bind(y);y.getCachedCompression=()=>{if(y.state.cachedCompression)return y.state.cachedCompression.state;return E()},y.setVisibleRangeFn((L,Y,W,G,X)=>{let $=w(G,W);c(L,Y,W,G,$,X)}),y.setScrollToPosFn((L,Y,W,G,X)=>{let $=w(G,Y);return a(L,Y,W,G,$,X)}),y.setPositionElementFn((L,Y)=>{let W=y.getVirtualTotal(),G=w(W,y.heightCache);if(G.isCompressed){let X=Math.round(r(Y,y.scrollController.getScrollTop(),y.heightCache,W,y.state.viewportState.containerHeight,G)),$=y.config.horizontal;L.style.transform=$?`translateX(${X}px)`:`translateY(${X}px)`}else{let X=Math.round(y.heightCache.getOffset(Y)),$=y.config.horizontal;L.style.transform=$?`translateX(${X}px)`:`translateY(${X}px)`}}),B(),y.destroyHandlers.push(()=>{if(j)j.destroy(),j=null})},destroy(){if(j)j.destroy(),j=null}}};export{Ly as withScale,Dy as needsCompression,_y as getMaxItemsWithoutCompression,w as getCompressionState,Ey as getCompressionInfo,Uy as calculateIndexFromScrollPosition,c as calculateCompressedVisibleRange,a as calculateCompressedScrollToIndex,Gy as calculateCompressedRenderRange,r as calculateCompressedItemPosition,F as MAX_VIRTUAL_HEIGHT};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var Gj=(j,J,G={},_="vlist",F=!1)=>{let{autoHide:E=!0,autoHideDelay:D=1000,minThumbSize:H=30,showOnHover:V=!0,hoverZoneWidth:X=16,showOnViewportEnter:Z=!0}=G,Q=0,U=0,W=0,N=0,O=!1,q=!1,y=0,f=0,h=0,I=null,p=!1,R=null,M=null,S=F?"width":"height",x=F?"translateX":"translateY",b=F?(B)=>B.clientX:(B)=>B.clientY,t=F?"left":"top",L=document.createElement("div"),C=document.createElement("div"),A=V?document.createElement("div"):null,i=()=>{if(L.className=`${_}-scrollbar`,C.className=`${_}-scrollbar-thumb`,F)L.classList.add(`${_}-scrollbar--horizontal`);if(L.appendChild(C),j.appendChild(L),A){if(A.className=`${_}-scrollbar-hover`,F)A.classList.add(`${_}-scrollbar-hover--horizontal`),A.style.height=`${X}px`;else A.style.width=`${X}px`;j.appendChild(A)}},T=()=>{if(I)clearTimeout(I),I=null},P=()=>{if(!E)return;T(),I=setTimeout(d,D)},k=()=>{if(Q<=U)return;if(T(),!p)L.classList.add(`${_}-scrollbar--visible`),p=!0;if(E&&!O&&!q)P()},d=()=>{if(O||q)return;L.classList.remove(`${_}-scrollbar--visible`),p=!1},r=(B,g)=>{Q=B,U=g;let m=Q>U;if(L.style.display=m?"":"none",!m){d();return}let z=U/Q;W=Math.max(H,z*U),C.style[S]=`${W}px`,N=U-W,s(h)},s=(B)=>{if(h=B,Q<=U||N<=0)return;let g=Q-U,z=Math.min(1,Math.max(0,B/g))*N;C.style.transform=`${x}(${z}px)`},c=(B)=>{if(B.target===C)return;let g=L.getBoundingClientRect(),o=b(B)-g[t]-W/2,Kj=Math.max(0,Math.min(o,N))/N,jj=Q-U,Xj=Kj*jj;J(Xj),k()},n=(B)=>{B.preventDefault(),B.stopPropagation(),O=!0,y=b(B),f=h,T(),L.classList.add(`${_}-scrollbar--dragging`),document.addEventListener("mousemove",w),document.addEventListener("mouseup",v)},w=(B)=>{if(!O)return;let g=b(B)-y,m=N>0?g/N:0,z=Q-U,o=m*z,e=Math.max(0,Math.min(f+o,z)),jj=e/z*N;if(C.style.transform=`${x}(${jj}px)`,M=e,R===null)R=requestAnimationFrame(()=>{if(M!==null)J(M);R=null})},v=()=>{if(O=!1,R!==null)cancelAnimationFrame(R),R=null;if(M!==null)J(M),M=null;if(L.classList.remove(`${_}-scrollbar--dragging`),E&&!q)P();document.removeEventListener("mousemove",w),document.removeEventListener("mouseup",v)},a=()=>{if(Z)k()},K=()=>{if(!O){if(q=!1,E)P()}},Y=()=>{q=!0,T(),k()},$=()=>{if(q=!1,!O&&E)P()},u=()=>{if(T(),R!==null)cancelAnimationFrame(R),R=null;if(L.removeEventListener("click",c),L.removeEventListener("mouseenter",Y),L.removeEventListener("mouseleave",$),C.removeEventListener("mousedown",n),j.removeEventListener("mouseenter",a),j.removeEventListener("mouseleave",K),document.removeEventListener("mousemove",w),document.removeEventListener("mouseup",v),A){if(A.removeEventListener("mouseenter",Y),A.removeEventListener("mouseleave",$),A.parentNode)A.parentNode.removeChild(A)}if(L.parentNode)L.parentNode.removeChild(L)};if(i(),L.addEventListener("click",c),L.addEventListener("mouseenter",Y),L.addEventListener("mouseleave",$),C.addEventListener("mousedown",n),j.addEventListener("mouseenter",a),j.addEventListener("mouseleave",K),A)A.addEventListener("mouseenter",Y),A.addEventListener("mouseleave",$);return{show:k,hide:d,updateBounds:r,updatePosition:s,isVisible:()=>p,destroy:u}};var Yj=(j)=>{let J=null;return{name:"withScrollbar",priority:30,setup(G){let{dom:_,config:F}=G,{classPrefix:E,horizontal:D}=F;if(J=Gj(_.viewport,(X)=>G.scrollController.scrollTo(X),j??{},E,D),!_.viewport.classList.contains(`${E}-viewport--custom-scrollbar`))_.viewport.classList.add(`${E}-viewport--custom-scrollbar`);let H=G.getCachedCompression();J.updateBounds(H.virtualHeight,G.state.viewportState.containerHeight);let V=J;G.afterScroll.push((X,Z)=>{V.updatePosition(X),V.show()}),G.resizeHandlers.push((X,Z)=>{if(V){let Q=G.getCachedCompression();V.updateBounds(Q.virtualHeight,G.state.viewportState.containerHeight)}}),G.contentSizeHandlers.push(()=>{if(V){let X=G.getCachedCompression();V.updateBounds(X.virtualHeight,G.state.viewportState.containerHeight)}}),G.destroyHandlers.push(()=>{if(V)V.destroy()})},destroy(){if(J)J.destroy(),J=null}}};var Qj=(j=0)=>{let J=[,,,,,,,,];for(let G=0;G<8;G++)J[G]={position:0,time:0};return{velocity:0,lastPosition:j,lastTime:performance.now(),samples:J,sampleIndex:0,sampleCount:0}},l=(j,J)=>{let G=performance.now(),_=G-j.lastTime;if(_===0)return j;if(_>100){j.sampleCount=0,j.sampleIndex=0,j.velocity=0;let E=j.samples[0];return E.position=J,E.time=G,j.sampleIndex=1,j.sampleCount=1,j.lastPosition=J,j.lastTime=G,j}let F=j.samples[j.sampleIndex];if(F.position=J,F.time=G,j.sampleIndex=(j.sampleIndex+1)%8,j.sampleCount=Math.min(j.sampleCount+1,8),j.sampleCount>=2){let E=(j.sampleIndex-j.sampleCount+8)%8,D=j.samples[E],H=J-D.position,V=G-D.time;j.velocity=V>0?H/V:0}return j.lastPosition=J,j.lastTime=G,j},_j=(j)=>j.sampleCount>=3,$j=(j,J={})=>{let{wheel:G=!0,sensitivity:_=1,smoothing:F=!1,idleTimeout:E=150,onScroll:D,onIdle:H,scrollElement:V,horizontal:X=!1}=J,Z=!!V,Q=0,U=0,W=Z?X?window.innerWidth:window.innerHeight:X?j.clientWidth:j.clientHeight,N=J.compressed??!1,O=J.compression,q=Qj(),y=!1,f=null,I=Jj(()=>{let K=X?j.scrollLeft:j.scrollTop,Y=K>=Q?"down":"up";if(q=l(q,K),Q=K,D)D({scrollTop:Q,direction:Y,velocity:q.velocity});b()}),R=Jj(()=>{let K=j.getBoundingClientRect(),Y=X?Math.max(0,-K.left):Math.max(0,-K.top),$=Y>=Q?"down":"up";if(q=l(q,Y),Q=Y,!y)y=!0;if(D)D({scrollTop:Q,direction:$,velocity:q.velocity});b()}),M=(K)=>{K.preventDefault()},S=(K)=>{if(K.deltaX)return;K.preventDefault(),j.scrollLeft+=K.deltaY},x=(K)=>{if(!N)return;K.preventDefault();let Y=(X?K.deltaX||K.deltaY:K.deltaY)*_,$=Q+Y;if(F)$=Q+Y*0.3;if($=Math.max(0,Math.min($,U)),$!==Q){let B=$>=Q?"down":"up";if(q=l(q,$),Q=$,!y)y=!0;if(D)D({scrollTop:Q,direction:B,velocity:q.velocity});b()}},b=()=>{if(f)clearTimeout(f);f=setTimeout(()=>{if(y=!1,q=Qj(Q),H)H()},E)},t=(K)=>{if(N)return;if(N=!0,O=K,U=K.virtualHeight-W,Z)return;if(I.cancel(),j.removeEventListener("scroll",I),!G)j.removeEventListener("wheel",M);else if(X)j.removeEventListener("wheel",S);if(X)j.style.overflowX="hidden";else j.style.overflow="hidden";if(G)j.addEventListener("wheel",x,{passive:!1});let Y=X?j.scrollLeft:j.scrollTop;if(Y>0){let $=X?O?.actualHeight??j.scrollWidth:O?.actualHeight??j.scrollHeight;Q=Y/$*U}if(X)j.scrollLeft=0;else j.scrollTop=0},L=()=>{if(!N)return;if(N=!1,Z){O=void 0;return}if(j.removeEventListener("wheel",x),X)j.style.overflowX="auto";else j.style.overflow="auto";if(j.addEventListener("scroll",I,{passive:!0}),!G)j.addEventListener("wheel",M,{passive:!1});else if(X)j.addEventListener("wheel",S,{passive:!1});if(O&&Q>0){let Y=Q/U*(O.actualHeight-W);if(X)j.scrollLeft=Y;else j.scrollTop=Y}O=void 0},C=()=>{if(Z||N)return Q;return X?j.scrollLeft:j.scrollTop},A=(K,Y=!1)=>{let $=Math.max(0,Math.min(K,U||1/0));if(Z){let u=j.getBoundingClientRect();if(X){let B=u.left+window.scrollX;window.scrollTo({left:B+$,behavior:Y?"smooth":"auto"})}else{let B=u.top+window.scrollY;window.scrollTo({top:B+$,behavior:Y?"smooth":"auto"})}}else if(N){if($===Q)return;let B=$>=Q?"down":"up";if(q=l(q,$),Q=$,!y)y=!0;if(D)D({scrollTop:Q,direction:B,velocity:q.velocity});b()}else if(X)j.scrollTo({left:$,behavior:Y?"smooth":"auto"});else j.scrollTo({top:$,behavior:Y?"smooth":"auto"})},i=(K)=>{A(C()+K)},T=()=>{return C()<=0},P=(K=0)=>{let Y=C(),$=Z||N?U:X?j.scrollWidth-j.clientWidth:j.scrollHeight-j.clientHeight;return Y>=$-K},k=()=>{let K=C(),Y=Z||N?U:X?j.scrollWidth-j.clientWidth:j.scrollHeight-j.clientHeight;if(Y<=0)return 0;return Math.min(1,Math.max(0,K/Y))},d=(K)=>{if(K.compression)O=K.compression,U=O.virtualHeight-W},r=()=>N,s=()=>Math.abs(q.velocity),c=()=>_j(q),n=()=>y,w=()=>Z,v=(K)=>{if(W=K,O)U=O.virtualHeight-W},a=()=>{if(f)clearTimeout(f);if(Z)R.cancel(),window.removeEventListener("scroll",R);else I.cancel(),j.removeEventListener("scroll",I),j.removeEventListener("wheel",x),j.removeEventListener("wheel",M),j.removeEventListener("wheel",S)};if(Z){if(N&&O)U=O.virtualHeight-W;window.addEventListener("scroll",R,{passive:!0})}else if(N&&O){if(U=O.virtualHeight-W,X)j.style.overflowX="hidden";else j.style.overflow="hidden";if(G)j.addEventListener("wheel",x,{passive:!1})}else{if(X)j.style.overflowX="auto",j.style.overflowY="hidden";else j.style.overflow="auto";if(j.addEventListener("scroll",I,{passive:!0}),!G)j.addEventListener("wheel",M,{passive:!1});else if(X)j.addEventListener("wheel",S,{passive:!1})}return{getScrollTop:C,scrollTo:A,scrollBy:i,isAtTop:T,isAtBottom:P,getScrollPercentage:k,getVelocity:s,isTracking:c,isScrolling:n,updateConfig:d,enableCompression:t,disableCompression:L,isCompressed:r,isWindowMode:w,updateContainerHeight:v,destroy:a}},Jj=(j)=>{let J=null,G=null,_=(...F)=>{if(G=F,J===null)J=requestAnimationFrame(()=>{if(J=null,G)j(...G)})};return _.cancel=()=>{if(J!==null)cancelAnimationFrame(J),J=null},_},Bj=(j,J,G,_=0)=>{return j+G>=J-_},Oj=(j,J=0)=>{return j<=J},Uj=(j,J,G)=>{let _=J-G;if(_<=0)return 0;return Math.min(1,Math.max(0,j/_))},qj=(j,J,G,_)=>{return j<=_&&J>=G};export{Yj as withScrollbar,Jj as rafThrottle,qj as isRangeVisible,Oj as isAtTop,Bj as isAtBottom,Uj as getScrollPercentage,Gj as createScrollbar,$j as createScrollController};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var{defineProperty:t,getOwnPropertyNames:Gj,getOwnPropertyDescriptor:Lj}=Object,Oj=Object.prototype.hasOwnProperty;var Xj=new WeakMap,Fj=(J)=>{var $=Xj.get(J),j;if($)return $;if($=t({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function")Gj(J).map((Z)=>!Oj.call($,Z)&&t($,Z,{get:()=>J[Z],enumerable:!(j=Lj(J,Z))||j.enumerable}));return Xj.set(J,$),$};var bj=(J,$)=>{for(var j in $)t(J,j,{get:$[j],enumerable:!0,configurable:!0,set:(Z)=>$[j]=()=>Z})};var Yj=(J,$)=>()=>(J&&($=J(J=0)),$);var h=(J)=>{return J!==null&&typeof J==="object"&&J.__groupHeader===!0};var Dj=(J,$,j)=>{if(j===0)return 0;if(!J.isVariable())return Math.floor($/J.getHeight(0));let Z=0,Q=0;for(let q=j-1;q>=0;q--){let X=J.getHeight(q);if(Q+X>$)break;Q+=X,Z++}return Math.max(Z,1)},Jj=(J,$,j)=>{if(j===0)return 0;let Z=Math.floor($),Q=$-Z,q=Math.max(0,Math.min(Z,j-1));return J.getOffset(q)+Q*J.getHeight(q)};var $j=16000000;var zj=(J,$)=>{let j=$.getTotalHeight(),Z=j>$j,Q=Z?$j:j,q=j>0?Q/j:1;return{isCompressed:Z,actualHeight:j,virtualHeight:Q,ratio:q}},kj=(J,$,j,Z,Q,q,X)=>{if(!q.isCompressed||Z===0)return j.getOffset(J);let{virtualHeight:M}=q,D=M-Q,W=D-$;if(W<=Q&&W>=-1){if($>=D-1){let R=j.getTotalHeight()-j.getOffset(J);return Q-R}let Y=Dj(j,Q,Z),_=Math.max(0,Z-Y),k=$/M*Z,G=Math.max(0,Math.min(1,1-W/Q)),O=j.getOffset(J)-j.getOffset(_),w=j.getOffset(J)-Jj(j,k,Z);return w+(O-w)*G}let P=$/M*Z;return j.getOffset(J)-Jj(j,P,Z)};var Bj=()=>{};var _j={};bj(_j,{createGridRenderer:()=>vj});var wj=(J=200)=>{let $=[];return{acquire:()=>{let q=$.pop();if(q)return q;let X=document.createElement("div");return X.setAttribute("role","option"),X},release:(q)=>{if($.length<J)q.className="",q.textContent="",q.removeAttribute("style"),q.removeAttribute("data-index"),q.removeAttribute("data-id"),q.removeAttribute("data-row"),q.removeAttribute("data-col"),$.push(q)},clear:()=>{$.length=0}}},vj=(J,$,j,Z,Q,q,X,M)=>{let D=wj(),W=new Map,F=q,P=!1,Y=null,_=0,E="",k=(N)=>{if(Y&&_===N)return Y;return Y=zj(N,j),_=N,Y},G={selected:!1,focused:!1},O=(N,K)=>{return G.selected=N,G.focused=K,G},w=`${Q}-item ${Q}-grid-item`,R=`${Q}-item--selected`,H=`${Q}-item--focused`,T=(N,K)=>{if(typeof K==="string")N.innerHTML=K;else N.replaceChildren(K)},v=(N,K,U)=>{N.classList.toggle(R,K),N.classList.toggle(H,U)},u=(N,K)=>{let U=Z.getRow(N);if(K){let L=K.totalItems,A=k(L);if(A.isCompressed)return kj(U,K.scrollTop,j,L,K.containerHeight,A,K.rangeStart)}return j.getOffset(U)},B=(N,K,U)=>{let L=N.dataset.id?.startsWith("__group_header"),A=L?0:Z.getCol(K),V=L?0:Z.getColumnOffset(A,F),y;if(P){let d=Z.getRow(K),z=0,C=new Set;for(let f=0;f<K;f++){let p=Z.getRow(f);if(p<d&&!C.has(p)){let c=j.getHeight(f);z+=c,C.add(p)}}y=z}else y=u(K,U);N.style.transform=`translate(${Math.round(V)}px, ${Math.round(y)}px)`},b=(N,K)=>{let U=N.dataset.id?.startsWith("__group_header"),L=U?F:Z.getColumnWidth(F),A;if(P||U)A=j.getHeight(K)-Z.gap;else{let V=Z.getRow(K);A=j.getHeight(V)-Z.gap}N.style.width=`${L}px`,N.style.height=`${A}px`},x=(N,K,U,L,A)=>{let V=D.acquire(),y=O(U,L);if(V.className=w,V.dataset.index=String(N),V.dataset.id=String(K.id),V.dataset.row=String(Z.getRow(N)),V.dataset.col=String(Z.getCol(N)),V.ariaSelected=String(U),M)V.id=`${M}-item-${N}`;if(X)E=String(X()),V.setAttribute("aria-setsize",E),V.setAttribute("aria-posinset",String(N+1));b(V,N);let d=$(K,N,y);return T(V,d),v(V,U,L),B(V,N,A),V},g=(N,K,U,L,A)=>{if(K.start===0&&N.length>0)P=h(N[0]);for(let[z,C]of W)if(z<K.start||z>K.end)C.element.remove(),D.release(C.element),W.delete(z);let V=!1;if(X){let z=String(X());V=z!==E,E=z}let y=document.createDocumentFragment(),d=[];for(let z=K.start;z<=K.end;z++){let C=z-K.start,f=N[C];if(!f){console.warn(`⚠️ RENDER: Missing item at index ${z} (range: ${K.start}-${K.end}, items.length: ${N.length})`);continue}let p=U.has(f.id),c=z===L,S=W.get(z);if(S){let s=S.element.dataset.id,Kj=String(f.id);if(s!==Kj){let Pj=O(p,c),Aj=$(f,z,Pj);T(S.element,Aj),S.element.dataset.id=Kj,S.element.dataset.row=String(Z.getRow(z)),S.element.dataset.col=String(Z.getCol(z)),b(S.element,z)}if(v(S.element,p,c),S.element.ariaSelected=String(p),B(S.element,z,A),V)S.element.setAttribute("aria-setsize",E)}else{let s=x(z,f,p,c,A);y.appendChild(s),d.push({index:z,element:s})}}if(d.length>0){J.appendChild(y);for(let{index:z,element:C}of d)W.set(z,{index:z,element:C})}},m=(N)=>{for(let[K,U]of W)B(U.element,K,N)},o=(N,K,U,L)=>{let A=W.get(N);if(A){let V=O(U,L),y=$(K,N,V);T(A.element,y),v(A.element,U,L),A.element.dataset.id=String(K.id),A.element.ariaSelected=String(U),b(A.element,N)}},i=(N,K,U)=>{let L=W.get(N);if(L)v(L.element,K,U)},r=(N)=>{return W.get(N)?.element},Vj=(N)=>{if(Math.abs(N-F)<1)return;F=N;for(let[K,U]of W)b(U.element,K),B(U.element,K)},Nj=()=>{for(let[,N]of W)N.element.remove(),D.release(N.element);W.clear()};return{render:g,updatePositions:m,updateItem:o,updateItemClasses:i,getElement:r,updateContainerWidth:Vj,clear:Nj,destroy:()=>{Nj(),D.clear()}}};var Ej=Yj(()=>{Bj()});var e=(J,$)=>{let j=0,Z=J.length-1;while(j<Z){let Q=j+Z+1>>>1;if(J[Q].headerLayoutIndex<=$)j=Q;else Z=Q-1}return j},Wj=(J,$)=>{let j=0,Z=J.length-1;while(j<Z){let Q=j+Z+1>>>1;if(J[Q].firstDataIndex<=$)j=Q;else Z=Q-1}return j},Mj=(J,$)=>{if(J===0)return[];let j=[],Z=$(0),Q=0,q=0;for(let X=1;X<J;X++){let M=$(X);if(M!==Z){let D=X-Q;j.push({key:Z,groupIndex:j.length,headerLayoutIndex:q,firstDataIndex:Q,count:D}),q=q+1+D,Z=M,Q=X}}return j.push({key:Z,groupIndex:j.length,headerLayoutIndex:q,firstDataIndex:Q,count:J-Q}),j},a=(J,$)=>{if(J.length===0||$.length===0)return[];let j=J.length+$.length,Z=Array(j),Q=0;for(let q of $){Z[Q]={id:`__group_header_${q.groupIndex}`,__groupHeader:!0,groupKey:q.key,groupIndex:q.groupIndex},Q++;for(let X=0;X<q.count;X++)Z[Q]=J[q.firstDataIndex+X],Q++}return Z},n=(J,$)=>{let j=typeof $==="number"?(Z)=>$:$;return(Z)=>{let Q=J.getEntry(Z);if(Q.type==="header")return J.getHeaderHeight(Q.group.groupIndex);return j(Q.dataIndex)}},jj=(J,$)=>{let j=Mj(J,$.getGroupForIndex),Z=J+j.length,Q=$.headerHeight;return{get totalEntries(){return Z},get groupCount(){return j.length},get groups(){return j},getEntry:(Y)=>{if(j.length===0)return{type:"item",dataIndex:Y,group:{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0}};let _=e(j,Y),E=j[_];if(Y===E.headerLayoutIndex)return{type:"header",group:E};let k=Y-E.headerLayoutIndex-1;return{type:"item",dataIndex:E.firstDataIndex+k,group:E}},layoutToDataIndex:(Y)=>{if(j.length===0)return Y;let _=e(j,Y),E=j[_];if(Y===E.headerLayoutIndex)return-1;let k=Y-E.headerLayoutIndex-1;return E.firstDataIndex+k},dataToLayoutIndex:(Y)=>{if(j.length===0)return Y;let _=Wj(j,Y),E=j[_],k=Y-E.firstDataIndex;return E.headerLayoutIndex+1+k},getGroupAtLayoutIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let _=e(j,Y);return j[_]},getGroupAtDataIndex:(Y)=>{if(j.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let _=Wj(j,Y);return j[_]},getHeaderHeight:typeof Q==="number"?(Y)=>Q:(Y)=>{let _=j[Y];if(!_)return 0;return Q(_.key,Y)},rebuild:(Y)=>{j=Mj(Y,$.getGroupForIndex),Z=Y+j.length}}};var qj=(J,$,j,Z,Q)=>{let q=document.createElement("div");q.className=`${Q}-sticky-header`,q.setAttribute("role","presentation"),q.setAttribute("aria-hidden","true"),q.style.position="absolute",q.style.top="0",q.style.left="0",q.style.right="0",q.style.zIndex="5",q.style.pointerEvents="none",q.style.willChange="transform",q.style.overflow="hidden",J.insertBefore(q,J.firstChild);let X=-1,M=!1,D=0,W=(k)=>{if(k===X)return;X=k;let G=$.groups;if(k<0||k>=G.length){q.textContent="";return}let O=G[k],w=Z.headerTemplate(O.key,O.groupIndex),R=$.getHeaderHeight(k);if(q.style.height=`${R}px`,typeof w==="string")q.innerHTML=w;else q.replaceChildren(w)},F=(k)=>{let G=$.groups;if(G.length===0){Y();return}let O=0;for(let v=G.length-1;v>=0;v--)if(j.getOffset(G[v].headerLayoutIndex)<=k){O=v;break}let w=j.getOffset(G[0].headerLayoutIndex);if(k<w){Y();return}if(!M)P();W(O);let R=$.getHeaderHeight(O),H=0,T=O+1;if(T<G.length){let u=j.getOffset(G[T].headerLayoutIndex)-k;if(u<R)H=u-R}if(H!==D)D=H,q.style.transform=H===0?"":`translateY(${Math.round(H)}px)`},P=()=>{if(M)return;M=!0,q.style.display=""},Y=()=>{if(!M)return;M=!1,q.style.display="none",X=-1,D=0,q.style.transform=""},_=()=>{let k=X;if(X=-1,k>=0)W(k)},E=()=>{q.remove(),X=-1,M=!1};return q.style.display="none",{update:F,refresh:_,show:P,hide:Y,destroy:E}};var Uj=(J,$,j,Z,Q,q)=>{if(Z===0)return 0;let X=Math.max(0,Math.min(J,Z-1)),M=$.getOffset(X),D=$.getHeight(X),W=$.getTotalHeight(),F=Math.max(0,W-j),P;switch(q){case"center":P=M-j/2+D/2;break;case"end":P=M-j+D;break;case"start":default:P=M;break}return Math.max(0,Math.min(P,F))};var Zj=(J,$,j,Z,Q="start",q,X=Uj)=>{return X(J,$,j,Z,q,Q)};var Rj=(J)=>{if(!J.getGroupForIndex)throw Error("[vlist/builder] withGroups: getGroupForIndex is required");if(J.headerHeight==null||J.headerHeight<=0)throw Error("[vlist/builder] withGroups: headerHeight must be a positive number");if(!J.headerTemplate)throw Error("[vlist/builder] withGroups: headerTemplate is required");let $=null,j=null,Z=[],Q=[];return{name:"withSections",priority:10,setup(q){let{dom:X,config:M,rawConfig:D}=q,{classPrefix:W}=M;if(M.horizontal)throw Error("[vlist/builder] withGroups cannot be used with direction: 'horizontal'");let P=D.item.height;Z=D.items?[...D.items]:[];let Y=Z.length,_={getGroupForIndex:J.getGroupForIndex,headerHeight:J.headerHeight,headerTemplate:J.headerTemplate,sticky:J.sticky??!1};$=jj(Y,_),Q=a(Z,$.groups);let E=n($,P);q.setHeightConfig(E),q.rebuildHeightCache(Q.length),q.dataManager.setItems(Q,0,Q.length);let k=D.item.template,{headerTemplate:G}=J,O=(B,b,x)=>{if(h(B))return G(B.groupKey,B.groupIndex);return k(B,b,x)},w=q.methods.get("_getGridLayout"),R=q.methods.get("_replaceGridRenderer"),H=q.methods.get("_updateGridLayoutForGroups");if(w&&R){if(H)H((g)=>{let m=Q[g];return!!(m&&h(m))});let{createGridRenderer:B}=(Ej(),Fj(_j)),b=w(),x=B(X.items,O,q.heightCache,b,W,q.getContainerWidth(),()=>q.dataManager.getTotal(),M.ariaIdPrefix);R(x)}else q.replaceTemplate(O);if(X.root.classList.add(`${W}--grouped`),J.sticky!==!1){j=qj(X.root,$,q.heightCache,{..._,sticky:_.sticky??!1},W);let B=j;q.afterScroll.push((b,x)=>{B.update(b)}),j.update(q.scrollController.getScrollTop())}let T=()=>{if(!$)return;$.rebuild(Z.length),Q=a(Z,$.groups);let B=n($,P);if(q.setHeightConfig(B),q.rebuildHeightCache(Q.length),q.dataManager.setItems(Q,0,Q.length),j)j.refresh()};q.methods.set("setItems",(B)=>{Z=[...B],T()}),q.methods.set("appendItems",(B)=>{Z=[...Z,...B],T()}),q.methods.set("prependItems",(B)=>{Z=[...B,...Z],T()}),q.methods.set("removeItem",(B)=>{Z=Z.filter((b)=>b.id!==B),T()});let{animateScroll:v,cancelScroll:u}=Sj(q.scrollController,q.renderIfNeeded);q.methods.set("scrollToIndex",(B,b)=>{let x=$.dataToLayoutIndex(B),{align:g,behavior:m,duration:o}=Hj(b),i=q.dataManager.getTotal(),r=Zj(x,q.heightCache,q.state.viewportState.containerHeight,i,g,q.getCachedCompression());if(m==="smooth")v(q.scrollController.getScrollTop(),r,o);else u(),q.scrollController.scrollTo(r)}),q.methods.set("_getItems",()=>Z),q.methods.set("_getTotal",()=>Z.length),q.destroyHandlers.push(()=>{if(I!==null)cancelAnimationFrame(I),I=null;if(j)j.destroy(),j=null;X.root.classList.remove(`${W}--grouped`)})},destroy(){if(j)j.destroy(),j=null}}},Qj=300,Tj=(J)=>J<0.5?2*J*J:-1+(4-2*J)*J,I=null,Sj=(J,$)=>{let j=()=>{if(I!==null)cancelAnimationFrame(I),I=null};return{animateScroll:(Q,q,X)=>{if(j(),Math.abs(q-Q)<1){J.scrollTo(q);return}let M=performance.now(),D=(W)=>{let F=W-M,P=Math.min(F/X,1),Y=Q+(q-Q)*Tj(P);if(J.scrollTo(Y),$(),P<1)I=requestAnimationFrame(D);else I=null};I=requestAnimationFrame(D)},cancelScroll:j}},Hj=(J)=>{if(typeof J==="string")return{align:J,behavior:"auto",duration:Qj};if(J&&typeof J==="object")return{align:J.align??"start",behavior:J.behavior??"auto",duration:J.duration??Qj};return{align:"start",behavior:"auto",duration:Qj}};export{Rj as withSections,h as isSectionHeader,h as isGroupHeader,qj as createStickyHeader,n as createGroupedHeightFn,jj as createGroupLayout,a as buildLayoutItems};
|
package/dist/selection/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var H=(D)=>({selected:new Set(D??[]),focusedIndex:-1}),E=(D,B,G)=>{if(G==="none")return D;let j=new Set(D.selected);if(G==="single"){if(j.clear(),B.length>0)j.add(B[0])}else for(let J of B)j.add(J);return{...D,selected:j}},F=(D,B)=>{let G=new Set(D.selected);for(let j of B)G.delete(j);return{...D,selected:G}},V=(D,B,G)=>{if(G==="none")return D;if(D.selected.has(B))return F(D,[B]);else return E(D,[B],G)},C=(D,B,G)=>{if(G!=="multiple")return D;return{...D,selected:new Set(B.map((j)=>j.id))}},f=(D)=>({...D,selected:new Set}),w=(D,B)=>{return D.focusedIndex=B,D},u=(D,B,G=!0)=>{if(B===0)return D;let j=D.focusedIndex-1;if(j<0)j=G?B-1:0;return D.focusedIndex=j,D},v=(D,B,G=!0)=>{if(B===0)return D;let j=D.focusedIndex+1;if(j>=B)j=G?0:B-1;return D.focusedIndex=j,D},R=(D,B)=>{if(B===0)return D;return D.focusedIndex=0,D},S=(D,B)=>{if(B===0)return D;return D.focusedIndex=B-1,D},r=(D,B,G,j)=>{if(B===0)return D;let J=j==="up"?D.focusedIndex-G:D.focusedIndex+G;return J=Math.max(0,Math.min(B-1,J)),D.focusedIndex=J,D},m=(D,B)=>{return D.selected.has(B)},y=(D)=>{return Array.from(D.selected)},O=(D,B)=>{let G=[];for(let j of D.selected){let J=B(j);if(J)G.push(J)}return G},d=(D)=>{return D.selected.size},l=(D)=>{return D.selected.size===0},c=(D,B,G)=>{if(G==="none"||D.focusedIndex<0||D.focusedIndex>=B.length)return D;let j=B[D.focusedIndex];if(!j)return D;return V(D,j.id,G)},o=(D,B,G,j,J)=>{if(J!=="multiple")return D;let q=Math.min(G,j),X=Math.max(G,j),U=[];for(let $=q;$<=X;$++){let k=B[$];if(k)U.push(k.id)}return E(D,U,J)};var h=(D,B,G,j,J,q)=>{if(j===0)return 0;let X=Math.max(0,Math.min(D,j-1)),U=B.getOffset(X),$=B.getHeight(X),k=B.getTotalHeight(),T=Math.max(0,k-G),W;switch(q){case"center":W=U-G/2+$/2;break;case"end":W=U-G+$;break;case"start":default:W=U;break}return Math.max(0,Math.min(W,T))};var p=(D,B,G,j,J="start",q,X=h)=>{return X(D,B,G,j,q,J)};var n=(D)=>{let B=D?.mode??"single",G=D?.initial,j=H(G),J=null;return{name:"withSelection",priority:50,methods:["select","deselect","toggleSelect","selectAll","clearSelection","getSelected","getSelectedItems"],setup(q){let{dom:X,emitter:U,config:$}=q,{classPrefix:k,ariaIdPrefix:T}=$;if(B==="none"){q.methods.set("select",()=>{}),q.methods.set("deselect",()=>{}),q.methods.set("toggleSelect",()=>{}),q.methods.set("selectAll",()=>{}),q.methods.set("clearSelection",()=>{}),q.methods.set("getSelected",()=>[]),q.methods.set("getSelectedItems",()=>[]),q.methods.set("setSelectionMode",()=>{});return}let{renderIfNeeded:W,forceRender:
|
|
1
|
+
var H=(D)=>({selected:new Set(D??[]),focusedIndex:-1}),E=(D,B,G)=>{if(G==="none")return D;let j=new Set(D.selected);if(G==="single"){if(j.clear(),B.length>0)j.add(B[0])}else for(let J of B)j.add(J);return{...D,selected:j}},F=(D,B)=>{let G=new Set(D.selected);for(let j of B)G.delete(j);return{...D,selected:G}},V=(D,B,G)=>{if(G==="none")return D;if(D.selected.has(B))return F(D,[B]);else return E(D,[B],G)},C=(D,B,G)=>{if(G!=="multiple")return D;return{...D,selected:new Set(B.map((j)=>j.id))}},f=(D)=>({...D,selected:new Set}),w=(D,B)=>{return D.focusedIndex=B,D},u=(D,B,G=!0)=>{if(B===0)return D;let j=D.focusedIndex-1;if(j<0)j=G?B-1:0;return D.focusedIndex=j,D},v=(D,B,G=!0)=>{if(B===0)return D;let j=D.focusedIndex+1;if(j>=B)j=G?0:B-1;return D.focusedIndex=j,D},R=(D,B)=>{if(B===0)return D;return D.focusedIndex=0,D},S=(D,B)=>{if(B===0)return D;return D.focusedIndex=B-1,D},r=(D,B,G,j)=>{if(B===0)return D;let J=j==="up"?D.focusedIndex-G:D.focusedIndex+G;return J=Math.max(0,Math.min(B-1,J)),D.focusedIndex=J,D},m=(D,B)=>{return D.selected.has(B)},y=(D)=>{return Array.from(D.selected)},O=(D,B)=>{let G=[];for(let j of D.selected){let J=B(j);if(J)G.push(J)}return G},d=(D)=>{return D.selected.size},l=(D)=>{return D.selected.size===0},c=(D,B,G)=>{if(G==="none"||D.focusedIndex<0||D.focusedIndex>=B.length)return D;let j=B[D.focusedIndex];if(!j)return D;return V(D,j.id,G)},o=(D,B,G,j,J)=>{if(J!=="multiple")return D;let q=Math.min(G,j),X=Math.max(G,j),U=[];for(let $=q;$<=X;$++){let k=B[$];if(k)U.push(k.id)}return E(D,U,J)};var h=(D,B,G,j,J,q)=>{if(j===0)return 0;let X=Math.max(0,Math.min(D,j-1)),U=B.getOffset(X),$=B.getHeight(X),k=B.getTotalHeight(),T=Math.max(0,k-G),W;switch(q){case"center":W=U-G/2+$/2;break;case"end":W=U-G+$;break;case"start":default:W=U;break}return Math.max(0,Math.min(W,T))};var p=(D,B,G,j,J="start",q,X=h)=>{return X(D,B,G,j,q,J)};var n=(D)=>{let B=D?.mode??"single",G=D?.initial,j=H(G),J=null;return{name:"withSelection",priority:50,methods:["select","deselect","toggleSelect","selectAll","clearSelection","getSelected","getSelectedItems"],setup(q){let{dom:X,emitter:U,config:$}=q,{classPrefix:k,ariaIdPrefix:T}=$;if(B==="none"){q.methods.set("select",()=>{}),q.methods.set("deselect",()=>{}),q.methods.set("toggleSelect",()=>{}),q.methods.set("selectAll",()=>{}),q.methods.set("clearSelection",()=>{}),q.methods.set("getSelected",()=>[]),q.methods.set("getSelectedItems",()=>[]),q.methods.set("setSelectionMode",()=>{});return}let{renderIfNeeded:W,forceRender:x}=q.getRenderFns(),b=()=>{q.dom.items.querySelectorAll("[data-index]").forEach((Q)=>{let M=Q,L=M.dataset.id;if(L!==void 0){let Y=/^\d+$/.test(L)?parseInt(L,10):L,_=j.selected.has(Y),N=parseInt(M.dataset.index??"-1",10)===j.focusedIndex;M.classList.toggle(`${k}-item--selected`,_),M.classList.toggle(`${k}-item--focused`,N),M.ariaSelected=_?"true":"false"}})},g=()=>{if(q.state.isDestroyed)return;W(),b()},I=()=>{if(q.state.isDestroyed)return;x(),b()};q.setRenderFns(g,I);let A=()=>{b(),U.emit("selection:change",{selected:y(j),items:O(j,(K)=>q.dataManager.getItemById(K))})};J=document.createElement("div"),J.setAttribute("aria-live","polite"),J.setAttribute("aria-atomic","true"),J.className=`${k}-live-region`,J.style.cssText="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0",X.root.appendChild(J);let z=J;U.on("selection:change",({selected:K})=>{let Q=K.length;if(Q===0)z.textContent="";else if(Q===1)z.textContent="1 item selected";else z.textContent=`${Q} items selected`}),q.clickHandlers.push((K)=>{if(q.state.isDestroyed)return;let M=K.target.closest("[data-index]");if(!M)return;let L=parseInt(M.dataset.index??"-1",10);if(L<0)return;let Y=q.dataManager.getItem(L);if(!Y)return;U.emit("item:click",{item:Y,index:L,event:K}),j=w(j,L),X.root.setAttribute("aria-activedescendant",`${T}-item-${L}`),j=V(j,Y.id,B),A()}),q.keydownHandlers.push((K)=>{if(q.state.isDestroyed)return;let Q=q.dataManager.getTotal(),M=j.focusedIndex,L=!1,Y=!1,_=j;switch(K.key){case"ArrowUp":_=u(j,Q),L=!0,Y=!0;break;case"ArrowDown":_=v(j,Q),L=!0,Y=!0;break;case"Home":_=R(j,Q),L=!0,Y=!0;break;case"End":_=S(j,Q),L=!0,Y=!0;break;case" ":case"Enter":if(j.focusedIndex>=0){let Z=q.dataManager.getItem(j.focusedIndex);if(Z)_=V(j,Z.id,B);L=!0}break}if(L){K.preventDefault(),j=_;let Z=j.focusedIndex;if(Z>=0){let N=q.dataManager.getState(),P=p(Z,q.heightCache,q.state.viewportState.containerHeight,N.total,"center",q.getCachedCompression());q.scrollController.scrollTo(P),X.root.setAttribute("aria-activedescendant",`${T}-item-${Z}`)}else X.root.removeAttribute("aria-activedescendant");if(Y){let{selected:N}=j;if(M>=0&&M!==Z){let P=q.dataManager.getItem(M);if(P)q.renderer.updateItemClasses(M,N.has(P.id),!1)}if(Z>=0){let P=q.dataManager.getItem(Z);if(P)q.renderer.updateItemClasses(Z,N.has(P.id),!0)}}else I(),U.emit("selection:change",{selected:y(j),items:O(j,(N)=>q.dataManager.getItemById(N))})}}),q.methods.set("select",(...K)=>{j=E(j,K,B),A()}),q.methods.set("deselect",(...K)=>{j=F(j,K),A()}),q.methods.set("toggleSelect",(K)=>{j=V(j,K,B),A()}),q.methods.set("selectAll",()=>{if(B!=="multiple")return;let K=q.getAllLoadedItems();j=C(j,K,B),A()}),q.methods.set("clearSelection",()=>{j=f(j);let{renderRange:K,isCompressed:Q}=q.state.viewportState,M=q.getItemsForRange(K),L=Q?q.getCompressionContext():void 0;q.renderer.render(M,K,j.selected,j.focusedIndex,L),U.emit("selection:change",{selected:[],items:[]})}),q.methods.set("getSelected",()=>{return y(j)}),q.methods.set("getSelectedItems",()=>{return O(j,(K)=>q.dataManager.getItemById(K))}),q.destroyHandlers.push(()=>{if(z&&z.parentNode)z.remove()})},destroy(){if(J&&J.parentNode)J.remove();J=null}}};export{n as withSelection,V as toggleSelection,w as setFocusedIndex,o as selectRange,E as selectItems,c as selectFocused,C as selectAll,u as moveFocusUp,S as moveFocusToLast,R as moveFocusToFirst,v as moveFocusDown,r as moveFocusByPage,l as isSelectionEmpty,m as isSelected,d as getSelectionCount,O as getSelectedItems,y as getSelectedIds,F as deselectItems,H as createSelectionState,f as clearSelection};
|