@floor/vlist 0.9.0 → 0.9.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 +4 -1
- package/dist/builder/context.d.ts +3 -3
- package/dist/builder/core.d.ts +1 -1
- package/dist/builder/data.d.ts +2 -2
- package/dist/builder/index.d.ts +1 -1
- package/dist/builder/{materializectx.d.ts → materialize.d.ts} +1 -1
- package/dist/builder/types.d.ts +29 -29
- package/dist/features/async/{plugin.d.ts → feature.d.ts} +8 -8
- package/dist/features/async/index.d.ts +1 -1
- package/dist/features/grid/{plugin.d.ts → feature.d.ts} +7 -7
- package/dist/features/grid/index.d.ts +1 -1
- package/dist/features/grid/renderer.d.ts +1 -1
- package/dist/features/page/{plugin.d.ts → feature.d.ts} +6 -6
- package/dist/features/page/index.d.ts +4 -4
- package/dist/features/scale/{plugin.d.ts → feature.d.ts} +5 -5
- package/dist/features/scale/index.d.ts +1 -1
- package/dist/features/scrollbar/{plugin.d.ts → feature.d.ts} +8 -8
- package/dist/features/scrollbar/index.d.ts +1 -1
- package/dist/features/sections/{plugin.d.ts → feature.d.ts} +7 -7
- package/dist/features/sections/index.d.ts +1 -1
- package/dist/features/selection/{plugin.d.ts → feature.d.ts} +8 -8
- package/dist/features/selection/index.d.ts +1 -1
- package/dist/features/snapshots/{plugin.d.ts → feature.d.ts} +6 -6
- package/dist/features/snapshots/index.d.ts +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/rendering/index.d.ts +1 -1
- package/dist/rendering/renderer.d.ts +2 -2
- package/dist/rendering/viewport.d.ts +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,6 +23,7 @@ Lightweight, high-performance virtual list with zero dependencies and dimension-
|
|
|
23
23
|
|
|
24
24
|
- ✨ **Dimension-agnostic API** — semantically correct terminology for both orientations
|
|
25
25
|
- 🎯 **Horizontal sections** — sticky headers work in horizontal carousels
|
|
26
|
+
- 🎨 **Horizontal grid layouts** — 2D grids work in both orientations
|
|
26
27
|
- 📐 **`orientation` not `direction`** — clearer, more intuitive configuration
|
|
27
28
|
|
|
28
29
|
## Installation
|
|
@@ -175,6 +176,7 @@ const list = vlist({
|
|
|
175
176
|
| **Chat UI** | `reverse: true` + `withSections({ sticky: false })` |
|
|
176
177
|
| **Horizontal carousel** | `orientation: 'horizontal'`, `item.width` |
|
|
177
178
|
| **Horizontal sections** | `orientation: 'horizontal'` + `withSections()` |
|
|
179
|
+
| **Horizontal grid** | `orientation: 'horizontal'` + `withGrid()` |
|
|
178
180
|
| **Page-level scroll** | `withPage()` |
|
|
179
181
|
| **1M+ items** | `withScale()` — auto-compresses scroll space |
|
|
180
182
|
| **Wrap navigation** | `scroll: { wrap: true }` |
|
|
@@ -397,8 +399,9 @@ const list: VList<Photo> = vlist<Photo>({
|
|
|
397
399
|
- See [Migration Guide](https://vlist.dev/docs/refactoring/v0.9.0-migration-guide.md)
|
|
398
400
|
|
|
399
401
|
**New Features:**
|
|
400
|
-
- Horizontal orientation support for sections
|
|
402
|
+
- Horizontal orientation support for grid and sections plugins
|
|
401
403
|
- Complete dimension-agnostic architecture
|
|
404
|
+
- Proper axis swapping for horizontal 2D grids
|
|
402
405
|
|
|
403
406
|
## Links
|
|
404
407
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* vlist/builder - BuilderContext Factory
|
|
3
|
-
* Central state container that
|
|
3
|
+
* Central state container that features receive during setup.
|
|
4
4
|
*
|
|
5
5
|
* The BuilderContext provides access to all core components plus
|
|
6
6
|
* registration points for handlers, methods, and cleanup callbacks.
|
|
@@ -28,9 +28,9 @@ export interface CreateBuilderContextOptions<T extends VListItem = VListItem> {
|
|
|
28
28
|
/**
|
|
29
29
|
* Create a BuilderContext from individual components.
|
|
30
30
|
*
|
|
31
|
-
* The context acts as the central hub that
|
|
31
|
+
* The context acts as the central hub that features wire into.
|
|
32
32
|
* Unlike VListContext (used by the monolithic factory), BuilderContext
|
|
33
|
-
* exposes registration arrays and replacement methods for
|
|
33
|
+
* exposes registration arrays and replacement methods for features.
|
|
34
34
|
*/
|
|
35
35
|
export declare const createBuilderContext: <T extends VListItem = VListItem>(options: CreateBuilderContextOptions<T>) => BuilderContext<T>;
|
|
36
36
|
//# sourceMappingURL=context.d.ts.map
|
package/dist/builder/core.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Size cache and emitter are reused from rendering/ and events/ modules.
|
|
6
6
|
* Bun.build inlines everything into a single bundle automatically.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* Features compose functionality *around* the hot path via extension points:
|
|
9
9
|
* afterScroll, clickHandlers, keydownHandlers, resizeHandlers, destroyHandlers,
|
|
10
10
|
* and the methods Map for public API extension.
|
|
11
11
|
*/
|
package/dist/builder/data.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* No sparse storage, no placeholders, no async adapter support.
|
|
6
6
|
*
|
|
7
7
|
* This keeps the builder core small (~12 KB). When the user installs
|
|
8
|
-
* withData(), that
|
|
8
|
+
* withData(), that feature replaces this manager with the full
|
|
9
9
|
* adapter-backed data manager from src/data/manager.ts.
|
|
10
10
|
*/
|
|
11
11
|
import type { VListItem, Range } from "../types";
|
|
@@ -23,7 +23,7 @@ export interface SimpleDataState<_T extends VListItem = VListItem> {
|
|
|
23
23
|
* SimpleDataManager — the same interface as the full DataManager,
|
|
24
24
|
* but backed by a plain array instead of sparse storage + placeholders.
|
|
25
25
|
*
|
|
26
|
-
* Only the methods used by the builder core and
|
|
26
|
+
* Only the methods used by the builder core and features are implemented.
|
|
27
27
|
* Adapter-related methods (loadRange, ensureRange, loadInitial, loadMore,
|
|
28
28
|
* reload, evictDistant) are no-ops or stubs.
|
|
29
29
|
*/
|
package/dist/builder/index.d.ts
CHANGED
|
@@ -21,5 +21,5 @@
|
|
|
21
21
|
* @packageDocumentation
|
|
22
22
|
*/
|
|
23
23
|
export { vlist } from "./core";
|
|
24
|
-
export type { VListBuilder, BuiltVList, BuilderConfig,
|
|
24
|
+
export type { VListBuilder, BuiltVList, BuilderConfig, VListFeature, FeatureFactory, BuilderContext, BuilderState, ResolvedBuilderConfig, } from "./types";
|
|
25
25
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -143,4 +143,4 @@ export interface MDeps<T extends VListItem = VListItem> {
|
|
|
143
143
|
export declare const createMaterializeCtx: <T extends VListItem = VListItem>($: MRefs<T>, deps: MDeps<T>) => BuilderContext<T>;
|
|
144
144
|
export declare const createDefaultDataProxy: <T extends VListItem = VListItem>($: MRefs<T>, deps: Pick<MDeps<T>, "rendered" | "itemState" | "contentSizeHandlers" | "applyTemplate" | "updateContentSize">, ctx: BuilderContext<T>) => any;
|
|
145
145
|
export declare const createDefaultScrollProxy: <T extends VListItem = VListItem>($: MRefs<T>, deps: Pick<MDeps<T>, "dom" | "classPrefix">) => any;
|
|
146
|
-
//# sourceMappingURL=
|
|
146
|
+
//# sourceMappingURL=materialize.d.ts.map
|
package/dist/builder/types.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* vlist/builder - Types
|
|
3
|
-
*
|
|
3
|
+
* Feature interface, builder config, builder context, and return types
|
|
4
4
|
*/
|
|
5
5
|
import type { VListItem, VListEvents, ItemConfig, ItemTemplate, Range, ViewportState, EventHandler, Unsubscribe, ScrollToOptions, ScrollSnapshot } from "../types";
|
|
6
6
|
import type { DOMStructure, Renderer, SizeCache, CompressionContext } from "../rendering";
|
|
@@ -14,7 +14,7 @@ export interface BuilderConfig<T extends VListItem = VListItem> {
|
|
|
14
14
|
container: HTMLElement | string;
|
|
15
15
|
/** Item configuration (height/width and template) */
|
|
16
16
|
item: ItemConfig<T>;
|
|
17
|
-
/** Static items array (optional if using adapter via
|
|
17
|
+
/** Static items array (optional if using adapter via feature) */
|
|
18
18
|
items?: T[];
|
|
19
19
|
/** Number of extra items to render outside viewport (default: 3) */
|
|
20
20
|
overscan?: number;
|
|
@@ -65,7 +65,7 @@ export interface BuilderState {
|
|
|
65
65
|
cachedCompression: CachedCompression | null;
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
68
|
-
* BuilderContext — the internal interface that
|
|
68
|
+
* BuilderContext — the internal interface that features receive during setup.
|
|
69
69
|
*
|
|
70
70
|
* Provides access to all core components plus registration points for
|
|
71
71
|
* handlers, methods, and cleanup callbacks.
|
|
@@ -75,20 +75,20 @@ export interface BuilderContext<T extends VListItem = VListItem> {
|
|
|
75
75
|
readonly sizeCache: SizeCache;
|
|
76
76
|
readonly emitter: Emitter<VListEvents<T>>;
|
|
77
77
|
readonly config: ResolvedBuilderConfig;
|
|
78
|
-
/** The raw user-provided builder config (for
|
|
78
|
+
/** The raw user-provided builder config (for features that need original values) */
|
|
79
79
|
readonly rawConfig: BuilderConfig<T>;
|
|
80
80
|
renderer: Renderer<T>;
|
|
81
81
|
dataManager: SimpleDataManager<T>;
|
|
82
82
|
scrollController: ScrollController;
|
|
83
83
|
state: BuilderState;
|
|
84
84
|
/**
|
|
85
|
-
*
|
|
85
|
+
* Features register lightweight callbacks that run after each
|
|
86
86
|
* scroll-triggered render. These are NOT on the hot path —
|
|
87
87
|
* they run after DOM updates are complete.
|
|
88
88
|
*/
|
|
89
89
|
afterScroll: Array<(scrollPosition: number, direction: string) => void>;
|
|
90
90
|
/**
|
|
91
|
-
*
|
|
91
|
+
* Features register handlers for user interaction events.
|
|
92
92
|
* These are attached as DOM event listeners during .build().
|
|
93
93
|
*/
|
|
94
94
|
clickHandlers: Array<(event: MouseEvent) => void>;
|
|
@@ -96,7 +96,7 @@ export interface BuilderContext<T extends VListItem = VListItem> {
|
|
|
96
96
|
resizeHandlers: Array<(width: number, height: number) => void>;
|
|
97
97
|
contentSizeHandlers: Array<() => void>;
|
|
98
98
|
destroyHandlers: Array<() => void>;
|
|
99
|
-
/**
|
|
99
|
+
/** Features register public methods by name. Exposed on the returned API. */
|
|
100
100
|
methods: Map<string, Function>;
|
|
101
101
|
replaceTemplate(template: ItemTemplate<T>): void;
|
|
102
102
|
replaceRenderer(renderer: Renderer<T>): void;
|
|
@@ -116,7 +116,7 @@ export interface BuilderContext<T extends VListItem = VListItem> {
|
|
|
116
116
|
*/
|
|
117
117
|
invalidateRendered(): void;
|
|
118
118
|
/**
|
|
119
|
-
* Get current render functions (for wrapping by selection/other
|
|
119
|
+
* Get current render functions (for wrapping by selection/other features).
|
|
120
120
|
* Call this BEFORE setRenderFns to capture the current functions.
|
|
121
121
|
*/
|
|
122
122
|
getRenderFns(): {
|
|
@@ -124,24 +124,24 @@ export interface BuilderContext<T extends VListItem = VListItem> {
|
|
|
124
124
|
forceRender: () => void;
|
|
125
125
|
};
|
|
126
126
|
/**
|
|
127
|
-
* Get current container width (for grid
|
|
127
|
+
* Get current container width (for grid feature).
|
|
128
128
|
* This returns the width detected by ResizeObserver, which is more reliable
|
|
129
129
|
* than viewport.clientWidth in test environments.
|
|
130
130
|
*/
|
|
131
131
|
getContainerWidth(): number;
|
|
132
132
|
/**
|
|
133
133
|
* Replace the virtual-total function.
|
|
134
|
-
* Used by grid/groups
|
|
134
|
+
* Used by grid/groups features that change what "total" means
|
|
135
135
|
* (e.g. row count instead of item count).
|
|
136
136
|
*/
|
|
137
137
|
setVirtualTotalFn(fn: () => number): void;
|
|
138
138
|
/**
|
|
139
|
-
* Used by groups
|
|
139
|
+
* Used by groups feature to inject grouped size function and by grid to add gap.
|
|
140
140
|
*/
|
|
141
141
|
rebuildSizeCache(total?: number): void;
|
|
142
142
|
/**
|
|
143
143
|
* Set a new effective size config function/value.
|
|
144
|
-
*
|
|
144
|
+
* Features that change sizes (groups, grid) call this before rebuildSizeCache.
|
|
145
145
|
*/
|
|
146
146
|
setSizeConfig(config: number | ((index: number) => number)): void;
|
|
147
147
|
/**
|
|
@@ -150,7 +150,7 @@ export interface BuilderContext<T extends VListItem = VListItem> {
|
|
|
150
150
|
updateContentSize(totalSize: number): void;
|
|
151
151
|
/**
|
|
152
152
|
* Update compression mode when total items changes.
|
|
153
|
-
* Called by the core after data changes and by
|
|
153
|
+
* Called by the core after data changes and by features that alter totals.
|
|
154
154
|
*/
|
|
155
155
|
updateCompressionMode(): void;
|
|
156
156
|
/**
|
|
@@ -170,7 +170,7 @@ export interface BuilderContext<T extends VListItem = VListItem> {
|
|
|
170
170
|
setPositionElementFn(fn: (element: HTMLElement, index: number) => void): void;
|
|
171
171
|
/**
|
|
172
172
|
* Replace the render functions.
|
|
173
|
-
* Used by grid/groups
|
|
173
|
+
* Used by grid/groups features that need to completely replace the render logic
|
|
174
174
|
* (e.g., to convert row ranges to item ranges for grid rendering).
|
|
175
175
|
*/
|
|
176
176
|
setRenderFns(renderIfNeeded: () => void, forceRender: () => void): void;
|
|
@@ -182,7 +182,7 @@ export interface BuilderContext<T extends VListItem = VListItem> {
|
|
|
182
182
|
setScrollFns(getTop: () => number, setTop: (pos: number) => void): void;
|
|
183
183
|
/**
|
|
184
184
|
* Set the scroll target element (default: viewport).
|
|
185
|
-
* Used by window mode
|
|
185
|
+
* Used by window mode feature to use window instead of viewport for scroll events.
|
|
186
186
|
*/
|
|
187
187
|
setScrollTarget(target: HTMLElement | Window): void;
|
|
188
188
|
/**
|
|
@@ -192,7 +192,7 @@ export interface BuilderContext<T extends VListItem = VListItem> {
|
|
|
192
192
|
getScrollTarget(): HTMLElement | Window;
|
|
193
193
|
/**
|
|
194
194
|
* Override container dimension getters.
|
|
195
|
-
* Used by window mode
|
|
195
|
+
* Used by window mode feature to use window.innerWidth/innerHeight instead
|
|
196
196
|
* of viewport.clientWidth/clientHeight.
|
|
197
197
|
*/
|
|
198
198
|
setContainerDimensions(getter: {
|
|
@@ -201,23 +201,23 @@ export interface BuilderContext<T extends VListItem = VListItem> {
|
|
|
201
201
|
}): void;
|
|
202
202
|
/**
|
|
203
203
|
* Disable the ResizeObserver on the viewport element.
|
|
204
|
-
* Used by window mode
|
|
204
|
+
* Used by window mode feature where the viewport doesn't need observation
|
|
205
205
|
* (window resize is used instead).
|
|
206
206
|
*/
|
|
207
207
|
disableViewportResize(): void;
|
|
208
208
|
}
|
|
209
209
|
/**
|
|
210
|
-
*
|
|
210
|
+
* VListFeature — the interface for builder features.
|
|
211
211
|
*
|
|
212
|
-
* Each
|
|
212
|
+
* Each feature:
|
|
213
213
|
* - Has a unique name (used for deduplication and error messages)
|
|
214
214
|
* - Optionally declares a priority (lower runs first, default: 50)
|
|
215
215
|
* - Implements setup() which receives BuilderContext and wires in handlers/methods
|
|
216
216
|
* - Optionally implements destroy() for cleanup
|
|
217
|
-
* - Optionally declares methods it adds and
|
|
217
|
+
* - Optionally declares methods it adds and features it conflicts with
|
|
218
218
|
*/
|
|
219
|
-
export interface
|
|
220
|
-
/** Unique
|
|
219
|
+
export interface VListFeature<T extends VListItem = VListItem> {
|
|
220
|
+
/** Unique feature name (used for deduplication and error messages) */
|
|
221
221
|
readonly name: string;
|
|
222
222
|
/** Execution priority — lower runs first (default: 50) */
|
|
223
223
|
readonly priority?: number;
|
|
@@ -225,18 +225,18 @@ export interface VListPlugin<T extends VListItem = VListItem> {
|
|
|
225
225
|
setup(ctx: BuilderContext<T>): void;
|
|
226
226
|
/** Cleanup function — called on destroy */
|
|
227
227
|
destroy?(): void;
|
|
228
|
-
/** Methods this
|
|
228
|
+
/** Methods this feature adds to the public API */
|
|
229
229
|
readonly methods?: readonly string[];
|
|
230
|
-
/**
|
|
230
|
+
/** Features this feature conflicts with (cannot be combined) */
|
|
231
231
|
readonly conflicts?: readonly string[];
|
|
232
232
|
}
|
|
233
|
-
/** Factory function that returns a
|
|
234
|
-
export type
|
|
233
|
+
/** Factory function that returns a feature */
|
|
234
|
+
export type FeatureFactory<T extends VListItem = VListItem> = VListFeature<T>;
|
|
235
235
|
/** Chainable builder interface */
|
|
236
236
|
export interface VListBuilder<T extends VListItem = VListItem> {
|
|
237
|
-
/** Register a feature
|
|
238
|
-
use(
|
|
239
|
-
/** Materialize the virtual list. Creates DOM, initializes
|
|
237
|
+
/** Register a feature. Chainable. */
|
|
238
|
+
use(feature: VListFeature<T>): VListBuilder<T>;
|
|
239
|
+
/** Materialize the virtual list. Creates DOM, initializes features, returns API. */
|
|
240
240
|
build(): BuiltVList<T>;
|
|
241
241
|
}
|
|
242
242
|
/** Base API always available from builder (data methods, scroll methods, events, lifecycle) */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* vlist/data - Builder
|
|
3
|
-
* Wraps async data loading with sparse storage into a
|
|
2
|
+
* vlist/data - Builder Feature
|
|
3
|
+
* Wraps async data loading with sparse storage into a VListFeature for the composable builder.
|
|
4
4
|
*
|
|
5
5
|
* Priority: 20 (runs before scrollbar and selection, after grid/groups)
|
|
6
6
|
*
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
* Added events: load:start, load:end, error
|
|
17
17
|
*/
|
|
18
18
|
import type { VListItem, VListAdapter } from "../../types";
|
|
19
|
-
import type {
|
|
20
|
-
/** Data
|
|
21
|
-
export interface
|
|
19
|
+
import type { VListFeature } from "../../builder/types";
|
|
20
|
+
/** Data feature configuration */
|
|
21
|
+
export interface DataFeatureConfig<T extends VListItem = VListItem> {
|
|
22
22
|
/** Async data source (required) */
|
|
23
23
|
adapter: VListAdapter<T>;
|
|
24
24
|
/** Loading behavior configuration */
|
|
@@ -32,7 +32,7 @@ export interface DataPluginConfig<T extends VListItem = VListItem> {
|
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
35
|
-
* Create a data
|
|
35
|
+
* Create a data feature for the builder.
|
|
36
36
|
*
|
|
37
37
|
* Adds async data loading with sparse storage, placeholders, and infinite scroll.
|
|
38
38
|
*
|
|
@@ -56,5 +56,5 @@ export interface DataPluginConfig<T extends VListItem = VListItem> {
|
|
|
56
56
|
* .build()
|
|
57
57
|
* ```
|
|
58
58
|
*/
|
|
59
|
-
export declare const withAsync: <T extends VListItem = VListItem>(config:
|
|
60
|
-
//# sourceMappingURL=
|
|
59
|
+
export declare const withAsync: <T extends VListItem = VListItem>(config: DataFeatureConfig<T>) => VListFeature<T>;
|
|
60
|
+
//# sourceMappingURL=feature.d.ts.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* vlist - Data Domain
|
|
3
3
|
* Data management, sparse storage, and placeholder generation
|
|
4
4
|
*/
|
|
5
|
-
export { withAsync, type
|
|
5
|
+
export { withAsync, type DataFeatureConfig } from "./feature";
|
|
6
6
|
export { createDataManager, mergeRanges, calculateMissingRanges, isPlaceholderItem, filterPlaceholders, countRealItems, type DataManager, type DataManagerConfig, type DataState, } from "./manager";
|
|
7
7
|
export { createSparseStorage, type SparseStorage, type SparseStorageConfig, type SparseStorageStats, } from "./sparse";
|
|
8
8
|
export { createPlaceholderManager, replacePlaceholders, type PlaceholderManager, type PlaceholderConfig, } from "./placeholder";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* vlist/grid - Builder
|
|
2
|
+
* vlist/grid - Builder Feature
|
|
3
3
|
* Switches from list layout to a 2D grid with configurable columns and gap.
|
|
4
4
|
*
|
|
5
5
|
* Priority: 10 (runs first — replaces the renderer before anything else renders)
|
|
@@ -18,16 +18,16 @@
|
|
|
18
18
|
* Can be combined with withGroups for grouped 2D layouts.
|
|
19
19
|
*/
|
|
20
20
|
import type { VListItem } from "../../types";
|
|
21
|
-
import type {
|
|
22
|
-
/** Grid
|
|
23
|
-
export interface
|
|
21
|
+
import type { VListFeature } from "../../builder/types";
|
|
22
|
+
/** Grid feature configuration */
|
|
23
|
+
export interface GridFeatureConfig {
|
|
24
24
|
/** Number of columns (required, >= 1) */
|
|
25
25
|
columns: number;
|
|
26
26
|
/** Gap between items in pixels (default: 0) */
|
|
27
27
|
gap?: number;
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
|
-
* Create a grid
|
|
30
|
+
* Create a grid feature for the builder.
|
|
31
31
|
*
|
|
32
32
|
* Switches from list layout to a 2D grid with configurable columns and gap.
|
|
33
33
|
*
|
|
@@ -44,5 +44,5 @@ export interface GridPluginConfig {
|
|
|
44
44
|
* .build()
|
|
45
45
|
* ```
|
|
46
46
|
*/
|
|
47
|
-
export declare const withGrid: <T extends VListItem = VListItem>(config:
|
|
48
|
-
//# sourceMappingURL=
|
|
47
|
+
export declare const withGrid: <T extends VListItem = VListItem>(config: GridFeatureConfig) => VListFeature<T>;
|
|
48
|
+
//# sourceMappingURL=feature.d.ts.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* vlist - Grid Domain
|
|
3
3
|
* 2D grid/card layout with virtualized rows
|
|
4
4
|
*/
|
|
5
|
-
export { withGrid, type
|
|
5
|
+
export { withGrid, type GridFeatureConfig } from "./feature";
|
|
6
6
|
export { createGridLayout } from "./layout";
|
|
7
7
|
export { createGridRenderer, type GridRenderer } from "./renderer";
|
|
8
8
|
export type { GridConfig, GridLayout, GridPosition, ItemRange } from "./types";
|
|
@@ -51,5 +51,5 @@ export interface GridRenderer<T extends VListItem = VListItem> {
|
|
|
51
51
|
* @param totalItemsGetter - Optional getter for total item count (for aria-setsize)
|
|
52
52
|
* @param ariaIdPrefix - Optional unique prefix for element IDs (for aria-activedescendant)
|
|
53
53
|
*/
|
|
54
|
-
export declare const createGridRenderer: <T extends VListItem = VListItem>(itemsContainer: HTMLElement, template: ItemTemplate<T>, sizeCache: SizeCache, gridLayout: GridLayout, classPrefix: string, initialContainerWidth: number, totalItemsGetter?: () => number, ariaIdPrefix?: string) => GridRenderer<T>;
|
|
54
|
+
export declare const createGridRenderer: <T extends VListItem = VListItem>(itemsContainer: HTMLElement, template: ItemTemplate<T>, sizeCache: SizeCache, gridLayout: GridLayout, classPrefix: string, initialContainerWidth: number, totalItemsGetter?: () => number, ariaIdPrefix?: string, isHorizontal?: boolean) => GridRenderer<T>;
|
|
55
55
|
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* vlist/window - Window Scroll Mode
|
|
2
|
+
* vlist/window - Window Scroll Mode Feature
|
|
3
3
|
*
|
|
4
4
|
* Enables the list to scroll with the page instead of in its own container.
|
|
5
5
|
* Useful for infinite feeds, full-page lists, and chat UIs that integrate
|
|
6
6
|
* with page scroll.
|
|
7
7
|
*
|
|
8
|
-
* Priority: 5 (runs early, before other
|
|
8
|
+
* Priority: 5 (runs early, before other features that depend on scroll)
|
|
9
9
|
*
|
|
10
10
|
* What it does:
|
|
11
11
|
* - Uses window as scroll target instead of viewport element
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
* Bundle impact: ~0.3 KB gzipped when used
|
|
18
18
|
*/
|
|
19
19
|
import type { VListItem } from "../../types";
|
|
20
|
-
import type {
|
|
20
|
+
import type { VListFeature } from "../../builder/types";
|
|
21
21
|
/**
|
|
22
|
-
* Create a window scroll mode
|
|
22
|
+
* Create a window scroll mode feature.
|
|
23
23
|
*
|
|
24
24
|
* Use this when you want your list to scroll with the page instead of
|
|
25
25
|
* in a fixed-height container.
|
|
@@ -49,5 +49,5 @@ import type { VListPlugin } from "../../builder/types";
|
|
|
49
49
|
* .build()
|
|
50
50
|
* ```
|
|
51
51
|
*/
|
|
52
|
-
export declare const withPage: <T extends VListItem = VListItem>() =>
|
|
53
|
-
//# sourceMappingURL=
|
|
52
|
+
export declare const withPage: <T extends VListItem = VListItem>() => VListFeature<T>;
|
|
53
|
+
//# sourceMappingURL=feature.d.ts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* vlist/window - Window Scroll Mode
|
|
2
|
+
* vlist/window - Window Scroll Mode Feature
|
|
3
3
|
*
|
|
4
|
-
* Entry point for the window scroll
|
|
4
|
+
* Entry point for the window scroll feature.
|
|
5
5
|
*/
|
|
6
|
-
export { withPage } from "./
|
|
7
|
-
export type {
|
|
6
|
+
export { withPage } from "./feature";
|
|
7
|
+
export type { VListFeature } from "../../builder/types";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* vlist/compression - Builder
|
|
2
|
+
* vlist/compression - Builder Feature
|
|
3
3
|
* Enables support for lists with 1M+ items by compressing the scroll space
|
|
4
4
|
* when the total height exceeds the browser's ~16.7M pixel limit.
|
|
5
5
|
*
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
* height exceeds the browser limit, and deactivates when items are removed.
|
|
20
20
|
*/
|
|
21
21
|
import type { VListItem } from "../../types";
|
|
22
|
-
import type {
|
|
22
|
+
import type { VListFeature } from "../../builder/types";
|
|
23
23
|
/**
|
|
24
|
-
* Create a compression
|
|
24
|
+
* Create a compression feature for the builder.
|
|
25
25
|
*
|
|
26
26
|
* Enables support for lists with 1M+ items. No configuration needed —
|
|
27
27
|
* compression activates automatically when the total height exceeds
|
|
@@ -40,5 +40,5 @@ import type { VListPlugin } from "../../builder/types";
|
|
|
40
40
|
* .build()
|
|
41
41
|
* ```
|
|
42
42
|
*/
|
|
43
|
-
export declare const withScale: <T extends VListItem = VListItem>() =>
|
|
44
|
-
//# sourceMappingURL=
|
|
43
|
+
export declare const withScale: <T extends VListItem = VListItem>() => VListFeature<T>;
|
|
44
|
+
//# sourceMappingURL=feature.d.ts.map
|
|
@@ -6,5 +6,5 @@
|
|
|
6
6
|
* Usage: import { withScale } from 'vlist/compression'
|
|
7
7
|
*/
|
|
8
8
|
export { MAX_VIRTUAL_HEIGHT, getCompressionState, needsCompression, getMaxItemsWithoutCompression, getCompressionInfo, calculateCompressedVisibleRange, calculateCompressedRenderRange, calculateCompressedItemPosition, calculateCompressedScrollToIndex, calculateIndexFromScrollPosition, type CompressionState, } from "../../rendering/scale";
|
|
9
|
-
export { withScale } from "./
|
|
9
|
+
export { withScale } from "./feature";
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* vlist/scroll - Builder
|
|
3
|
-
* Wraps the custom scrollbar into a
|
|
2
|
+
* vlist/scroll - Builder Feature
|
|
3
|
+
* Wraps the custom scrollbar into a VListFeature for the composable builder.
|
|
4
4
|
*
|
|
5
5
|
* Priority: 30 (runs after renderer/data setup but before selection)
|
|
6
6
|
*
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
* No public methods are added — the scrollbar is entirely automatic.
|
|
17
17
|
*/
|
|
18
18
|
import type { VListItem } from "../../types";
|
|
19
|
-
import type {
|
|
20
|
-
/** Scrollbar
|
|
21
|
-
export interface
|
|
19
|
+
import type { VListFeature } from "../../builder/types";
|
|
20
|
+
/** Scrollbar feature configuration */
|
|
21
|
+
export interface ScrollbarFeatureConfig {
|
|
22
22
|
/** Auto-hide scrollbar after idle (default: true) */
|
|
23
23
|
autoHide?: boolean;
|
|
24
24
|
/** Auto-hide delay in milliseconds (default: 1000) */
|
|
@@ -42,7 +42,7 @@ export interface ScrollbarPluginConfig {
|
|
|
42
42
|
showOnViewportEnter?: boolean;
|
|
43
43
|
}
|
|
44
44
|
/**
|
|
45
|
-
* Create a scrollbar
|
|
45
|
+
* Create a scrollbar feature for the builder.
|
|
46
46
|
*
|
|
47
47
|
* Replaces the native browser scrollbar with a custom, cross-browser
|
|
48
48
|
* consistent scrollbar.
|
|
@@ -56,5 +56,5 @@ export interface ScrollbarPluginConfig {
|
|
|
56
56
|
* .build()
|
|
57
57
|
* ```
|
|
58
58
|
*/
|
|
59
|
-
export declare const withScrollbar: <T extends VListItem = VListItem>(config?:
|
|
60
|
-
//# sourceMappingURL=
|
|
59
|
+
export declare const withScrollbar: <T extends VListItem = VListItem>(config?: ScrollbarFeatureConfig) => VListFeature<T>;
|
|
60
|
+
//# sourceMappingURL=feature.d.ts.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* vlist - Scroll Domain
|
|
3
3
|
* Scroll controller and custom scrollbar
|
|
4
4
|
*/
|
|
5
|
-
export { withScrollbar, type
|
|
5
|
+
export { withScrollbar, type ScrollbarFeatureConfig } from "./feature";
|
|
6
6
|
export { createScrollController, rafThrottle, isAtBottom, isAtTop, getScrollPercentage, isRangeVisible, type ScrollController, type ScrollControllerConfig, type ScrollEventData, type ScrollDirection, } from "./controller";
|
|
7
7
|
export { createScrollbar, type Scrollbar, type ScrollbarConfig, type ScrollCallback, } from "./scrollbar";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* vlist/groups - Builder
|
|
2
|
+
* vlist/groups - Builder Feature
|
|
3
3
|
* Adds grouped lists with sticky section headers.
|
|
4
4
|
*
|
|
5
5
|
* Priority: 10 (runs first — transforms item list and height function before rendering)
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
* - orientation: 'horizontal' (sticky headers stick to left edge, push left when next header approaches)
|
|
22
22
|
*/
|
|
23
23
|
import type { VListItem } from "../../types";
|
|
24
|
-
import type {
|
|
25
|
-
/** Groups
|
|
26
|
-
export interface
|
|
24
|
+
import type { VListFeature } from "../../builder/types";
|
|
25
|
+
/** Groups feature configuration */
|
|
26
|
+
export interface GroupsFeatureConfig {
|
|
27
27
|
/** Returns group key for item at index (required) */
|
|
28
28
|
getGroupForIndex: (index: number) => string;
|
|
29
29
|
/** Height of group headers in pixels (required) */
|
|
@@ -34,7 +34,7 @@ export interface GroupsPluginConfig {
|
|
|
34
34
|
sticky?: boolean;
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
|
-
* Create a groups
|
|
37
|
+
* Create a groups feature for the builder.
|
|
38
38
|
*
|
|
39
39
|
* Adds grouped lists with sticky section headers.
|
|
40
40
|
*
|
|
@@ -60,5 +60,5 @@ export interface GroupsPluginConfig {
|
|
|
60
60
|
* .build()
|
|
61
61
|
* ```
|
|
62
62
|
*/
|
|
63
|
-
export declare const withSections: <T extends VListItem = VListItem>(config:
|
|
64
|
-
//# sourceMappingURL=
|
|
63
|
+
export declare const withSections: <T extends VListItem = VListItem>(config: GroupsFeatureConfig) => VListFeature<T>;
|
|
64
|
+
//# sourceMappingURL=feature.d.ts.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* vlist - Groups Domain
|
|
3
3
|
* Sticky headers and grouped lists
|
|
4
4
|
*/
|
|
5
|
-
export { withSections, type
|
|
5
|
+
export { withSections, type GroupsFeatureConfig } from "./feature";
|
|
6
6
|
export type { GroupsConfig, GroupBoundary, LayoutEntry, GroupHeaderItem, GroupLayout, StickyHeader, } from "./types";
|
|
7
7
|
export { isGroupHeader, isGroupHeader as isSectionHeader } from "./types";
|
|
8
8
|
export { createGroupLayout, buildLayoutItems, createGroupedSizeFn, } from "./layout";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* vlist/selection - Builder
|
|
3
|
-
* Wraps the selection domain into a
|
|
2
|
+
* vlist/selection - Builder Feature
|
|
3
|
+
* Wraps the selection domain into a VListFeature for the composable builder.
|
|
4
4
|
*
|
|
5
5
|
* Priority: 50 (runs after renderer and data are ready)
|
|
6
6
|
*
|
|
@@ -17,16 +17,16 @@
|
|
|
17
17
|
* Added events: item:click, selection:change
|
|
18
18
|
*/
|
|
19
19
|
import type { VListItem, SelectionMode } from "../../types";
|
|
20
|
-
import type {
|
|
21
|
-
/** Selection
|
|
22
|
-
export interface
|
|
20
|
+
import type { VListFeature } from "../../builder/types";
|
|
21
|
+
/** Selection feature configuration */
|
|
22
|
+
export interface SelectionFeatureConfig {
|
|
23
23
|
/** Selection mode (default: 'single') */
|
|
24
24
|
mode?: SelectionMode;
|
|
25
25
|
/** Initially selected item IDs */
|
|
26
26
|
initial?: Array<string | number>;
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
|
-
* Create a selection
|
|
29
|
+
* Create a selection feature for the builder.
|
|
30
30
|
*
|
|
31
31
|
* ```ts
|
|
32
32
|
* import { vlist } from 'vlist/builder'
|
|
@@ -40,5 +40,5 @@ export interface SelectionPluginConfig {
|
|
|
40
40
|
* list.getSelected() // ['id-1', 'id-2']
|
|
41
41
|
* ```
|
|
42
42
|
*/
|
|
43
|
-
export declare const withSelection: <T extends VListItem = VListItem>(config?:
|
|
44
|
-
//# sourceMappingURL=
|
|
43
|
+
export declare const withSelection: <T extends VListItem = VListItem>(config?: SelectionFeatureConfig) => VListFeature<T>;
|
|
44
|
+
//# sourceMappingURL=feature.d.ts.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
* vlist - Selection Domain
|
|
3
3
|
* Selection state management
|
|
4
4
|
*/
|
|
5
|
-
export { withSelection, type
|
|
5
|
+
export { withSelection, type SelectionFeatureConfig } from "./feature";
|
|
6
6
|
export { createSelectionState, selectItems, deselectItems, toggleSelection, selectAll, clearSelection, setFocusedIndex, moveFocusUp, moveFocusDown, moveFocusToFirst, moveFocusToLast, moveFocusByPage, selectFocused, selectRange, getSelectedIds, getSelectedItems, getSelectionCount, isSelected, isSelectionEmpty, type SelectionState, } from "./state";
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* vlist/snapshots - Builder
|
|
2
|
+
* vlist/snapshots - Builder Feature
|
|
3
3
|
* Adds scroll save/restore for SPA navigation and tab switching.
|
|
4
4
|
*
|
|
5
|
-
* Priority: 50 (runs last — needs all other
|
|
5
|
+
* Priority: 50 (runs last — needs all other features initialized)
|
|
6
6
|
*
|
|
7
7
|
* What it wires:
|
|
8
8
|
* - getScrollSnapshot() — captures current scroll position (item index + sub-pixel offset)
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
* Added methods: getScrollSnapshot, restoreScroll
|
|
18
18
|
*/
|
|
19
19
|
import type { VListItem } from "../../types";
|
|
20
|
-
import type {
|
|
20
|
+
import type { VListFeature } from "../../builder/types";
|
|
21
21
|
/**
|
|
22
|
-
* Create a snapshots
|
|
22
|
+
* Create a snapshots feature for the builder.
|
|
23
23
|
*
|
|
24
24
|
* Adds scroll save/restore for SPA navigation and tab switching.
|
|
25
25
|
*
|
|
@@ -40,5 +40,5 @@ import type { VListPlugin } from "../../builder/types";
|
|
|
40
40
|
* if (saved) list.restoreScroll(saved)
|
|
41
41
|
* ```
|
|
42
42
|
*/
|
|
43
|
-
export declare const withSnapshots: <T extends VListItem = VListItem>() =>
|
|
44
|
-
//# sourceMappingURL=
|
|
43
|
+
export declare const withSnapshots: <T extends VListItem = VListItem>() => VListFeature<T>;
|
|
44
|
+
//# sourceMappingURL=feature.d.ts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* vlist/snapshots - Scroll Save/Restore
|
|
3
|
-
*
|
|
3
|
+
* Feature for SPA navigation and tab switching
|
|
4
4
|
*
|
|
5
5
|
* Usage: import { withSnapshots } from 'vlist/snapshots'
|
|
6
6
|
*/
|
|
7
|
-
export { withSnapshots } from "./
|
|
7
|
+
export { withSnapshots } from "./feature";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ export { withGrid } from "./features/grid";
|
|
|
15
15
|
export { withSelection } from "./features/selection";
|
|
16
16
|
export { withSnapshots } from "./features/snapshots";
|
|
17
17
|
export type { VList, VListConfig, VListItem, VListEvents, ItemTemplate, ItemState, SelectionMode, SelectionConfig, SelectionState, ScrollbarConfig, ScrollbarOptions, ScrollConfig, ScrollToOptions, ScrollSnapshot, VListAdapter, AdapterParams, AdapterResponse, Range, ViewportState, EventHandler, Unsubscribe, } from "./types";
|
|
18
|
-
export type { VListBuilder, BuiltVList, BuilderConfig,
|
|
18
|
+
export type { VListBuilder, BuiltVList, BuilderConfig, VListFeature, BuilderContext, } from "./builder";
|
|
19
19
|
export { createGroupLayout as createSectionLayout, buildLayoutItems, createGroupedSizeFn as createSectionedSizeFn, createStickyHeader, isGroupHeader as isSectionHeader, type GroupsConfig as SectionsConfig, type GroupBoundary as SectionBoundary, type LayoutEntry, type GroupHeaderItem as SectionHeaderItem, type GroupLayout as SectionLayout, type StickyHeader, } from "./features/sections";
|
|
20
20
|
export { createGridLayout, createGridRenderer, type GridConfig, type GridLayout, type GridPosition, type GridRenderer, type ItemRange, } from "./features/grid";
|
|
21
21
|
export { createSizeCache, type SizeCache, simpleVisibleRange, calculateRenderRange, calculateTotalSize, calculateActualSize, calculateItemOffset, calculateScrollToIndex, clampScrollPosition, rangesEqual, isInRange, getRangeCount, diffRanges, MAX_VIRTUAL_HEIGHT, getCompressionState as getScaleState, getCompression as getScale, needsCompression as needsScaling, getMaxItemsWithoutCompression as getMaxItemsWithoutScaling, getCompressionInfo as getScaleInfo, calculateCompressedVisibleRange as calculateScaledVisibleRange, calculateCompressedRenderRange as calculateScaledRenderRange, calculateCompressedItemPosition as calculateScaledItemPosition, calculateCompressedScrollToIndex as calculateScaledScrollToIndex, calculateIndexFromScrollPosition, type CompressionState as ScaleState, } from "./rendering";
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var{defineProperty:B2,getOwnPropertyNames:$j,getOwnPropertyDescriptor:Rj}=Object,kj=Object.prototype.hasOwnProperty;var y2=new WeakMap,Cj=(j)=>{var X=y2.get(j),Q;if(X)return X;if(X=B2({},"__esModule",{value:!0}),j&&typeof j==="object"||typeof j==="function")$j(j).map((J)=>!kj.call(X,J)&&B2(X,J,{get:()=>j[J],enumerable:!(Q=Rj(j,J))||Q.enumerable}));return y2.set(j,X),X};var zj=(j,X)=>{for(var Q in X)B2(j,Q,{get:X[Q],enumerable:!0,configurable:!0,set:(J)=>X[Q]=()=>J})};var H2=(j,X)=>()=>(j&&(X=j(j=0)),X);var vj=(j,X)=>{let Q=X;return{getOffset:(J)=>J*j,getSize:(J)=>j,indexAtOffset:(J)=>{if(Q===0||j===0)return 0;return Math.max(0,Math.min(Math.floor(J/j),Q-1))},getTotalSize:()=>Q*j,getTotal:()=>Q,rebuild:(J)=>{Q=J},isVariable:()=>!1}},wj=(j,X)=>{let Q=X,J=new Float64Array(0),K=(Y)=>{Q=Y,J=new Float64Array(Y+1),J[0]=0;for(let B=0;B<Y;B++)J[B+1]=J[B]+j(B)};K(X);let q=(Y)=>{if(Q===0)return 0;if(Y<=0)return 0;if(Y>=J[Q])return Q-1;let B=0,V=Q-1;while(B<V){let Z=B+V+1>>>1;if(J[Z]<=Y)B=Z;else V=Z-1}return B};return{getOffset:(Y)=>{if(Y<=0)return 0;if(Y>=Q)return J[Q];return J[Y]},getSize:(Y)=>j(Y),indexAtOffset:(Y)=>q(Y),getTotalSize:()=>J[Q]??0,getTotal:()=>Q,rebuild:(Y)=>K(Y),isVariable:()=>!0}},$0=(j,X)=>{if(typeof j==="number")return vj(j,X);return wj(j,X)},f0=(j,X,Q,J)=>{if(J===0)return 0;if(!j.isVariable())return Math.ceil(Q/j.getSize(0));let K=0,q=0,Y=X;while(Y<J&&q<Q)q+=j.getSize(Y),K++,Y++;return Math.max(1,K)},c0=(j,X,Q)=>{if(Q===0)return 0;if(!j.isVariable())return Math.floor(X/j.getSize(0));let J=0,K=0;for(let q=Q-1;q>=0;q--){let Y=j.getSize(q);if(K+Y>X)break;K+=Y,J++}return Math.max(J,1)},N2=(j,X,Q)=>{if(Q===0)return 0;let J=Math.floor(X),K=X-J,q=Math.max(0,Math.min(J,Q-1));return j.getOffset(q)+K*j.getSize(q)};var D2=200,I0=50,g2=15,x2=2,m2=50,y0=16000000;var V0=(j,X)=>{let Q=X.getTotalSize(),J=Q>y0,K=J?y0:Q,q=Q>0?K/Q:1;return{isCompressed:J,actualSize:Q,virtualSize:K,ratio:q}},a0=(j,X,Q,J,K,q)=>{if(J===0||X===0)return q.start=0,q.end=-1,q;if(!K.isCompressed){let G=Q.indexAtOffset(j),L=Q.indexAtOffset(j+X);if(L<J-1)L++;return q.start=Math.max(0,G),q.end=Math.min(J-1,Math.max(0,L)),q}let{virtualSize:Y}=K,V=j/Y*J,Z=Math.floor(V),D=f0(Q,Math.max(0,Z),X,J),A=Math.ceil(V)+D,T=Y-X-j;if(T<=X&&T>=-1){let G=c0(Q,X,J),L=Math.max(0,J-G),M=Math.max(0,Math.min(1,1-T/X));Z=Math.floor(Z+(L-Z)*M),A=T<=1?J-1:Math.min(J-1,Z+D)}return q.start=Math.max(0,Z),q.end=Math.min(J-1,Math.max(0,A)),q},d2=(j,X,Q,J)=>{if(Q===0)return J.start=0,J.end=-1,J;return J.start=Math.max(0,j.start-X),J.end=Math.min(Q-1,j.end+X),J},R0=(j,X,Q,J,K,q,Y)=>{if(!q.isCompressed||J===0)return Q.getOffset(j);let{virtualSize:B}=q,V=B-K,Z=V-X;if(Z<=K&&Z>=-1){if(X>=V-1){let _=Q.getTotalSize()-Q.getOffset(j);return K-_}let T=c0(Q,K,J),G=Math.max(0,J-T),M=X/B*J,y=Math.max(0,Math.min(1,1-Z/K)),P=Q.getOffset(j)-Q.getOffset(G),$=Q.getOffset(j)-N2(Q,M,J);return $+(P-$)*y}let D=X/B,A=Q.getTotalSize(),O=D*A;return Q.getOffset(j)-O},s0=(j,X,Q,J,K,q="start")=>{if(J===0)return 0;let Y;if(K.isCompressed){if(q==="end"&&j===J-1)return Math.max(0,K.virtualSize-Q);Y=j/J*K.virtualSize}else Y=X.getOffset(j);let B=X.getSize(j);switch(q){case"center":Y-=(Q-B)/2;break;case"end":Y-=Q-B;break}let V=K.virtualSize-Q;return Math.max(0,Math.min(Y,V))},c2=(j,X,Q,J)=>{if(Q===0)return 0;if(J.isCompressed){let K=j/J.virtualSize;return Math.floor(K*Q)}return X.indexAtOffset(j)},l2=(j,X)=>{if(typeof X==="number")return j*X>y0;return X.getTotalSize()>y0},a2=(j)=>{if(j<=0)return 0;return Math.floor(y0/j)},s2=(j,X)=>{let Q=V0(j,X);if(!Q.isCompressed)return`No compression needed (${j} items, ${(Q.actualSize/1e6).toFixed(2)}M px)`;return`Compressed to ${(Q.ratio*100).toFixed(1)}% (${j} items, ${(Q.actualSize/1e6).toFixed(1)}M px → ${(Q.virtualSize/1e6).toFixed(1)}M px virtual)`};var r0=()=>{};var P0=(j)=>{return j!==null&&typeof j==="object"&&j.__groupHeader===!0};var Gj={};zj(Gj,{createGridRenderer:()=>g0});var sj=(j=200)=>{let X=[];return{acquire:()=>{let q=X.pop();if(q)return q;let Y=document.createElement("div");return Y.setAttribute("role","option"),Y},release:(q)=>{if(X.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"),X.push(q)},clear:()=>{X.length=0}}},g0=(j,X,Q,J,K,q,Y,B)=>{let V=sj(),Z=new Map,D=q,A=!1,O=null,T=0,G="",L=(H)=>{if(O&&T===H)return O;return O=V0(H,Q),T=H,O},M={selected:!1,focused:!1},y=(H,v)=>{return M.selected=H,M.focused=v,M},P=`${K}-item ${K}-grid-item`,$=`${K}-item--selected`,_=`${K}-item--focused`,U=(H,v)=>{if(typeof v==="string")H.innerHTML=v;else H.replaceChildren(v)},W=(H,v,x)=>{H.classList.toggle($,v),H.classList.toggle(_,x)},E=(H,v)=>{let x=J.getRow(H);if(v){let s=v.totalItems,r=L(s);if(r.isCompressed)return R0(x,v.scrollPosition,Q,s,v.containerSize,r,v.rangeStart)}return Q.getOffset(x)},b=(H,v,x)=>{let s=H.dataset.id?.startsWith("__group_header"),r=s?0:J.getCol(v),n=s?0:J.getColumnOffset(r,D),Y0;if(A){let X0=J.getRow(v),R=0,c=new Set;for(let l=0;l<v;l++){let K0=J.getRow(l);if(K0<X0&&!c.has(K0)){let o=Q.getSize(l);R+=o,c.add(K0)}}Y0=R}else Y0=E(v,x);H.style.transform=`translate(${Math.round(n)}px, ${Math.round(Y0)}px)`},w=(H,v)=>{let x=H.dataset.id?.startsWith("__group_header"),s=x?D:J.getColumnWidth(D),r;if(A||x)r=Q.getSize(v)-J.gap;else{let n=J.getRow(v);r=Q.getSize(n)-J.gap}H.style.width=`${s}px`,H.style.height=`${r}px`},h=(H,v,x,s,r)=>{let n=V.acquire(),Y0=y(x,s);if(n.className=P,n.dataset.index=String(H),n.dataset.id=String(v.id),n.dataset.row=String(J.getRow(H)),n.dataset.col=String(J.getCol(H)),n.ariaSelected=String(x),B)n.id=`${B}-item-${H}`;if(Y)G=String(Y()),n.setAttribute("aria-setsize",G),n.setAttribute("aria-posinset",String(H+1));w(n,H);let X0=X(v,H,Y0);return U(n,X0),W(n,x,s),b(n,H,r),n},N=(H,v,x,s,r)=>{if(v.start===0&&H.length>0)A=P0(H[0]);for(let[R,c]of Z)if(R<v.start||R>v.end)c.element.remove(),V.release(c.element),Z.delete(R);let n=!1;if(Y){let R=String(Y());n=R!==G,G=R}let Y0=document.createDocumentFragment(),X0=[];for(let R=v.start;R<=v.end;R++){let c=R-v.start,l=H[c];if(!l){console.warn(`⚠️ RENDER: Missing item at index ${R} (range: ${v.start}-${v.end}, items.length: ${H.length})`);continue}let K0=x.has(l.id),o=R===s,J0=Z.get(R);if(J0){let G0=J0.element.dataset.id,S=String(l.id);if(G0!==S){let t=y(K0,o),j0=X(l,R,t);U(J0.element,j0),J0.element.dataset.id=S,J0.element.dataset.row=String(J.getRow(R)),J0.element.dataset.col=String(J.getCol(R)),w(J0.element,R)}if(W(J0.element,K0,o),J0.element.ariaSelected=String(K0),b(J0.element,R,r),n)J0.element.setAttribute("aria-setsize",G)}else{let G0=h(R,l,K0,o,r);Y0.appendChild(G0),X0.push({index:R,element:G0})}}if(X0.length>0){j.appendChild(Y0);for(let{index:R,element:c}of X0)Z.set(R,{index:R,element:c})}},z=(H)=>{for(let[v,x]of Z)b(x.element,v,H)},g=(H,v,x,s)=>{let r=Z.get(H);if(r){let n=y(x,s),Y0=X(v,H,n);U(r.element,Y0),W(r.element,x,s),r.element.dataset.id=String(v.id),r.element.ariaSelected=String(x),w(r.element,H)}},d=(H,v,x)=>{let s=Z.get(H);if(s)W(s.element,v,x)},k=(H)=>{return Z.get(H)?.element},C=(H)=>{if(Math.abs(H-D)<1)return;D=H;for(let[v,x]of Z)w(x.element,v),b(x.element,v)},I=()=>{for(let[,H]of Z)H.element.remove(),V.release(H.element);Z.clear()};return{render:N,updatePositions:z,updateItem:g,updateItemClasses:d,getElement:k,updateContainerWidth:C,clear:I,destroy:()=>{I(),V.clear()}}};var X2=H2(()=>{r0()});var P2=2,T2=(j=0)=>{let X=[,,,,,];for(let Q=0;Q<5;Q++)X[Q]={position:0,time:0};return{velocity:0,lastPosition:j,lastTime:performance.now(),samples:X,sampleIndex:0,sampleCount:0}},U2=(j,X)=>{let Q=performance.now(),J=Q-j.lastTime;if(J===0)return j;if(J>100){j.sampleCount=0,j.sampleIndex=0,j.velocity=0;let q=j.samples[0];return q.position=X,q.time=Q,j.sampleIndex=1,j.sampleCount=1,j.lastPosition=X,j.lastTime=Q,j}let K=j.samples[j.sampleIndex];if(K.position=X,K.time=Q,j.sampleIndex=(j.sampleIndex+1)%5,j.sampleCount=Math.min(j.sampleCount+1,5),j.sampleCount>=2){let q=(j.sampleIndex-j.sampleCount+5)%5,Y=j.samples[q],B=X-Y.position,V=Q-Y.time;j.velocity=V>0?Math.abs(B)/V:0}return j.lastPosition=X,j.lastTime=Q,j};var l0=()=>{let j={},X=(B,V)=>{if(!j[B])j[B]=new Set;return j[B].add(V),()=>Q(B,V)},Q=(B,V)=>{j[B]?.delete(V)};return{on:X,off:Q,emit:(B,V)=>{j[B]?.forEach((Z)=>{try{Z(V)}catch(D){console.error(`[vlist] Error in event handler for "${String(B)}":`,D)}})},once:(B,V)=>{let Z=(D)=>{Q(B,Z),V(D)};return X(B,Z)},clear:(B)=>{if(B)delete j[B];else for(let V in j)delete j[V]},listenerCount:(B)=>{return j[B]?.size??0}}};var $2=(j)=>{if(typeof j==="string"){let X=document.querySelector(j);if(!X)throw Error(`[vlist/builder] Container not found: ${j}`);return X}return j},R2=(j,X,Q,J)=>{let K=document.createElement("div");if(K.className=X,J)K.classList.add(`${X}--horizontal`);if(K.setAttribute("role","listbox"),K.setAttribute("tabindex","0"),Q)K.setAttribute("aria-label",Q);if(J)K.setAttribute("aria-orientation","horizontal");let q=document.createElement("div");if(q.className=`${X}-viewport`,J)q.style.overflowX="auto",q.style.overflowY="hidden";else q.style.overflow="auto";q.style.height="100%",q.style.width="100%";let Y=document.createElement("div");if(Y.className=`${X}-content`,Y.style.position="relative",J)Y.style.height="100%";else Y.style.width="100%";let B=document.createElement("div");if(B.className=`${X}-items`,B.style.position="relative",J)B.style.height="100%";else B.style.width="100%";return Y.appendChild(B),q.appendChild(Y),K.appendChild(q),j.appendChild(K),{root:K,viewport:q,content:Y,items:B}};var k2=(j=100)=>{let X=[];return{acquire:()=>{let Q=X.pop();if(Q)return Q;let J=document.createElement("div");return J.setAttribute("role","option"),J},release:(Q)=>{if(X.length<j)Q.className="",Q.textContent="",Q.removeAttribute("style"),Q.removeAttribute("data-index"),Q.removeAttribute("data-id"),X.push(Q)},clear:()=>{X.length=0}}};var C2=(j,X,Q,J,K)=>{if(J===0||X===0){K.start=0,K.end=0;return}let q=Q.indexAtOffset(j),Y=f0(Q,q,X,J),B=q+Y;K.start=Math.max(0,q),K.end=Math.min(J-1,Math.max(0,B))},z2=(j,X,Q,J)=>{if(Q===0){J.start=0,J.end=0;return}J.start=Math.max(0,j.start-X),J.end=Math.min(Q-1,j.end+X)},v2=(j,X,Q,J,K)=>{if(J===0)return 0;let q=Math.max(0,Math.min(j,J-1)),Y=X.getOffset(q),B=X.getSize(q),V=Math.max(0,X.getTotalSize()-Q),Z;switch(K){case"center":Z=Y-(Q-B)/2;break;case"end":Z=Y-Q+B;break;default:Z=Y}return Math.max(0,Math.min(Z,V))};var w2=(j)=>j<0.5?2*j*j:-1+(4-2*j)*j,S2=(j)=>{if(typeof j==="string")return{align:j,behavior:"auto",duration:300};if(j&&typeof j==="object")return{align:j.align??"start",behavior:j.behavior??"auto",duration:j.duration??300};return{align:"start",behavior:"auto",duration:300}};var f2=(j,X)=>{let{dom:Q,emitter:J,resolvedConfig:K,rawConfig:q,rendered:Y,pool:B,sharedState:V,isHorizontal:Z,classPrefix:D,contentSizeHandlers:A,afterScroll:O,clickHandlers:T,keydownHandlers:G,resizeHandlers:L,destroyHandlers:M,methods:y,onScrollFrame:P,resizeObserver:$,renderRange:_}=X;return{get dom(){return Q},get sizeCache(){return j.hc},get emitter(){return J},get config(){return K},get rawConfig(){return q},get renderer(){return{render:(U,W,E,b,w)=>{j.ss=E,j.fi=b,j.ffn()},updateItemClasses:(U,W,E)=>{let b=Y.get(U);if(!b)return;b.classList.toggle(`${D}-item--selected`,W),b.classList.toggle(`${D}-item--focused`,E),b.ariaSelected=W?"true":"false"},updatePositions:()=>{},updateItem:()=>{},getElement:(U)=>Y.get(U)??null,clear:()=>{},destroy:()=>{}}},set renderer(U){},get dataManager(){return j.dm},set dataManager(U){j.dm=U},get scrollController(){return j.sc},set scrollController(U){j.sc=U},state:V,getContainerWidth(){return j.cw},afterScroll:O,clickHandlers:T,keydownHandlers:G,resizeHandlers:L,contentSizeHandlers:A,destroyHandlers:M,methods:y,replaceTemplate(U){j.at=U},replaceRenderer(U){},replaceDataManager(U){j.dm=U},replaceScrollController(U){j.sc=U},getItemsForRange(U){let{dm:W,it:E}=j,b=[];for(let w=U.start;w<=U.end;w++){let h=W?W.getItem(w):E[w];if(h)b.push(h)}return b},getAllLoadedItems(){let U=j.dm;if(U){let W=U.getTotal(),E=[];for(let b=0;b<W;b++){let w=U.getItem(b);if(w)E.push(w)}return E}return[...j.it]},getVirtualTotal(){return j.vtf()},getCachedCompression(){let U=j.hc;return{isCompressed:!1,actualSize:U.getTotalSize(),virtualSize:U.getTotalSize(),ratio:1}},getCompressionContext(){return{scrollPosition:j.ls,totalItems:j.vtf(),containerSize:j.ch,rangeStart:_.start}},renderIfNeeded(){j.rfn()},forceRender(){j.ffn()},invalidateRendered(){for(let[,U]of Y)U.remove(),B.release(U);Y.clear()},getRenderFns(){return{renderIfNeeded:j.rfn,forceRender:j.ffn}},setRenderFns(U,W){j.rfn=U,j.ffn=W},setVirtualTotalFn(U){j.vtf=U},rebuildSizeCache(U){j.hc.rebuild(U??j.vtf())},setSizeConfig(U){j.hc=$0(U,j.vtf())},updateContentSize(U){let W=`${U}px`;if(Z)Q.content.style.width=W;else Q.content.style.height=W},updateCompressionMode(){},setVisibleRangeFn(U){j.gvr=U},setScrollToPosFn(U){j.gsp=U},setPositionElementFn(U){j.pef=U},setScrollFns(U,W){j.sgt=U,j.sst=(E)=>{W(E),P()}},setScrollTarget(U){j.st.removeEventListener("scroll",P),j.st=U,j.st.addEventListener("scroll",P,{passive:!0})},getScrollTarget(){return j.st},setContainerDimensions(U){j.gcw=U.width,j.gch=U.height,j.cw=U.width(),j.ch=U.height(),V.viewportState.containerSize=j.ch},disableViewportResize(){if(j.vre)j.vre=!1,$.unobserve(Q.viewport)}}},I2=(j,X,Q)=>{let{rendered:J,itemState:K,contentSizeHandlers:q,applyTemplate:Y,updateContentSize:B}=X,V=()=>{j.hc.rebuild(j.vtf()),B(),Q.updateCompressionMode();for(let Z=0;Z<q.length;Z++)q[Z]();j.ffn()};return{getState:()=>({total:j.it.length,cached:j.it.length,isLoading:!1,pendingRanges:[],error:void 0,hasMore:!1,cursor:void 0}),getTotal:()=>j.it.length,getCached:()=>j.it.length,getIsLoading:()=>!1,getHasMore:()=>!1,getStorage:()=>null,getPlaceholders:()=>null,getItem:(Z)=>j.it[Z],isItemLoaded:(Z)=>Z>=0&&Z<j.it.length&&j.it[Z]!==void 0,getItemsInRange:(Z,D)=>{let A=j.it,O=[],T=Math.max(0,Z),G=Math.min(D,A.length-1);for(let L=T;L<=G;L++)O.push(A[L]);return O},setTotal:(Z)=>{},setItems:(Z,D=0,A)=>{let O=j.it;if(D===0&&(A!==void 0||O.length===0))j.it=Z;else{let T=D+Z.length;if(O.length<T)O.length=T;for(let G=0;G<Z.length;G++)O[D+G]=Z[G]}if(j.ii)V()},updateItem:(Z,D)=>{let A=j.it;if(Z<0||Z>=A.length)return!1;let O=A[Z];if(!O)return!1;A[Z]={...O,...D};let T=J.get(Z);if(T)Y(T,j.at(A[Z],Z,K)),T.dataset.id=String(A[Z].id);return!0},removeItem:(Z)=>{if(Z<0||Z>=j.it.length)return!1;if(j.it.splice(Z,1),j.ii)V();return!0},loadRange:async()=>{},ensureRange:async()=>{},loadInitial:async()=>{},loadMore:async()=>!1,reload:async()=>{},evictDistant:()=>{},clear:()=>{j.it=[]},reset:()=>{if(j.it=[],j.ii)j.hc.rebuild(0),B(),j.ffn()}}},p2=(j,X)=>{let{dom:Q,classPrefix:J}=X;return{getScrollTop:()=>j.sgt(),scrollTo:(K)=>{j.sst(K),j.ls=K,j.rfn()},scrollBy:(K)=>{let q=j.sgt()+K;j.sst(q),j.ls=q,j.rfn()},isAtTop:()=>j.ls<=2,isAtBottom:(K=2)=>j.sab(K),getScrollPercentage:()=>{let K=j.hc.getTotalSize(),q=Math.max(0,K-j.ch);return q>0?j.ls/q:0},getVelocity:()=>j.vt.velocity,isTracking:()=>j.vt.sampleCount>=2,isScrolling:()=>Q.root.classList.contains(`${J}--scrolling`),updateConfig:()=>{},enableCompression:()=>{j.sic=!0},disableCompression:()=>{j.sic=!1},isCompressed:()=>j.sic,isWindowMode:()=>!1,updateContainerHeight:(K)=>{j.ch=K},destroy:()=>{}}};var Sj=3,fj="vlist",h2=150,Ij=0,u2=(j)=>{if(!j.container)throw Error("[vlist/builder] Container is required");if(!j.item)throw Error("[vlist/builder] item configuration is required");let X=j.orientation==="horizontal",Q=X?"width":"height",J=X?j.item.width:j.item.height;if(J==null)throw Error(`[vlist/builder] item.${Q} is required${X?" when orientation is 'horizontal'":""}`);if(typeof J==="number"&&J<=0)throw Error(`[vlist/builder] item.${Q} must be a positive number`);if(typeof J!=="number"&&typeof J!=="function")throw Error(`[vlist/builder] item.${Q} must be a number or a function (index) => number`);if(!j.item.template)throw Error("[vlist/builder] item.template is required");if(X&&j.reverse)throw Error("[vlist/builder] horizontal direction cannot be combined with reverse mode");let K=new Map,q=!1,Y={use(B){if(q)throw Error("[vlist/builder] Cannot call .use() after .build()");return K.set(B.name,B),Y},build(){if(q)throw Error("[vlist/builder] .build() can only be called once");return q=!0,pj(j,K,X,J)}};return Y};function pj(j,X,Q,J){let{item:K,items:q,overscan:Y=Sj,classPrefix:B=fj,ariaLabel:V,reverse:Z=!1,scroll:D}=j,A=D?.wheel??!0,O=D?.wrap??!1,T=Z,G=`${B}-${Ij++}`,L=J,M=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||navigator.maxTouchPoints&&navigator.maxTouchPoints>2,y=Q?typeof K.height==="number"?K.height:void 0:typeof K.width==="number"?K.width:void 0,P={overscan:Y,classPrefix:B,reverse:T,wrap:O,horizontal:Q,ariaIdPrefix:G},$=Array.from(X.values()).sort((F,f)=>(F.priority??50)-(f.priority??50)),_=new Set($.map((F)=>F.name));for(let F of $)if(F.conflicts){for(let f of F.conflicts)if(_.has(f))throw Error(`[vlist/builder] ${F.name} and ${f} cannot be combined`)}if(Q){if(_.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with orientation: 'horizontal'");if(_.has("withGroups"))throw Error("[vlist/builder] withGroups cannot be used with orientation: 'horizontal'")}if(T){if(_.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with reverse: true")}let U=$2(j.container),W=R2(U,B,V,Q),E=l0(),b=q||[],w=$0(L,b.length),h=k2(),N={it:b,hc:w,ch:W.viewport.clientHeight,cw:W.viewport.clientWidth,id:!1,ii:!1,ls:0,vt:T2(0),ss:new Set,fi:-1,la:"",dm:null,sc:null,vtf:null,sgt:Q?()=>W.viewport.scrollLeft:()=>W.viewport.scrollTop,sst:Q?(F)=>{W.viewport.scrollLeft=F}:(F)=>{W.viewport.scrollTop=F},sab:(F=2)=>{let f=N.hc.getTotalSize();return N.ls+N.ch>=f-F},sic:!1,rfn:null,ffn:null,gvr:(F,f,m,a,e)=>{C2(F,f,m,a,e)},gsp:(F,f,m,a,e)=>{return v2(F,f,m,a,e)},pef:null,at:K.template,vre:!0,st:W.viewport,gcw:()=>N.cw,gch:()=>N.ch};N.vtf=()=>N.dm?N.dm.getTotal():N.it.length;let z=null,g=null,d={start:0,end:0},k={start:0,end:0},C={start:-1,end:-1},I={viewportState:{scrollPosition:0,containerSize:N.ch,totalSize:N.hc.getTotalSize(),actualSize:N.hc.getTotalSize(),isCompressed:!1,compressionRatio:1,visibleRange:{start:0,end:0},renderRange:{start:0,end:0}},lastRenderRange:{start:-1,end:-1},isInitialized:!1,isDestroyed:!1,cachedCompression:null},p=new Map,H={selected:!1,focused:!1},v=`${B}-item`,x=[],s=[],r=[],n=[],Y0=[],X0=[],R=new Map,c=(F,f)=>{if(typeof f==="string")F.innerHTML=f;else F.replaceChildren(f)},l=(F,f)=>{let m=Math.round(N.hc.getOffset(f));if(Q)F.style.transform=`translateX(${m}px)`;else F.style.transform=`translateY(${m}px)`};N.pef=l;let K0=(F,f)=>{let m=h.acquire();if(m.className=v,Q){if(m.style.width=`${N.hc.getSize(F)}px`,y!=null)m.style.height=`${y}px`}else m.style.height=`${N.hc.getSize(F)}px`;if(m.dataset.index=String(F),m.dataset.id=String(f.id),m.ariaSelected="false",m.id=`${G}-item-${F}`,N.la=String(N.vtf()),m.setAttribute("aria-setsize",N.la),m.setAttribute("aria-posinset",String(F+1)),String(f.id).startsWith("__placeholder_"))m.classList.add(`${B}-item--placeholder`);return c(m,N.at(f,F,H)),N.pef(m,F),m},o=()=>{let F=`${N.hc.getTotalSize()}px`;if(Q)W.content.style.width=F;else W.content.style.height=F},J0=()=>{if(N.id)return;let F=N.vtf();if(N.gvr(N.ls,N.ch,N.hc,F,d),z2(d,Y,F,k),k.start===C.start&&k.end===C.end){if(N.sic)for(let[i,N0]of p)N.pef(N0,i);return}let f=String(F),m=f!==N.la;N.la=f;for(let[i,N0]of p)if(i<k.start||i>k.end)N0.remove(),h.release(N0),p.delete(i);let a=document.createDocumentFragment(),e=[];for(let i=k.start;i<=k.end;i++){let N0=N.dm?N.dm.getItem(i):N.it[i];if(!N0)continue;let q0=p.get(i);if(q0){let A0=q0.dataset.id,w0=String(N0.id);if(A0!==w0){let Tj=A0?.startsWith("__placeholder_"),b2=w0.startsWith("__placeholder_");if(c(q0,N.at(N0,i,H)),q0.dataset.id=w0,Q)q0.style.width=`${N.hc.getSize(i)}px`;else q0.style.height=`${N.hc.getSize(i)}px`;if(b2)q0.classList.add(`${B}-item--placeholder`);else q0.classList.remove(`${B}-item--placeholder`);if(Tj&&!b2)q0.classList.add(`${B}-item--replaced`),setTimeout(()=>{q0.classList.remove(`${B}-item--replaced`)},300)}N.pef(q0,i);let d0=N.ss.has(N0.id),Pj=i===N.fi;if(q0.classList.toggle(`${B}-item--selected`,d0),q0.classList.toggle(`${B}-item--focused`,Pj),q0.ariaSelected=d0?"true":"false",m)q0.setAttribute("aria-setsize",N.la)}else{let A0=K0(i,N0),w0=N.ss.has(N0.id),d0=i===N.fi;if(w0)A0.classList.add(`${B}-item--selected`),A0.ariaSelected="true";if(d0)A0.classList.add(`${B}-item--focused`);a.appendChild(A0),e.push({index:i,element:A0})}}if(e.length>0){W.items.appendChild(a);for(let{index:i,element:N0}of e)p.set(i,N0)}C.start=k.start,C.end=k.end,I.lastRenderRange.start=k.start,I.lastRenderRange.end=k.end,I.viewportState.scrollPosition=N.ls,I.viewportState.visibleRange.start=d.start,I.viewportState.visibleRange.end=d.end,I.viewportState.renderRange.start=k.start,I.viewportState.renderRange.end=k.end,E.emit("range:change",{range:{start:k.start,end:k.end}})},G0=()=>{C.start=-1,C.end=-1,N.rfn()};N.rfn=J0,N.ffn=G0;let S=()=>{if(N.id)return;let F=N.sgt(),f=F>=N.ls?"down":"up";if(N.vt=U2(N.vt,F),!W.root.classList.contains(`${B}--scrolling`))W.root.classList.add(`${B}--scrolling`);N.ls=F,N.rfn(),E.emit("scroll",{scrollPosition:F,direction:f}),E.emit("velocity:change",{velocity:N.vt.velocity,reliable:N.vt.sampleCount>=P2});for(let m=0;m<x.length;m++)x[m](F,f);if(g)clearTimeout(g);g=setTimeout(()=>{W.root.classList.remove(`${B}--scrolling`),N.vt.velocity=0,N.vt.sampleCount=0,E.emit("velocity:change",{velocity:0,reliable:!1})},D?.idleTimeout??h2)},u=null;if(N.st.addEventListener("scroll",S,{passive:!0}),A&&!Q&&!M)u=(F)=>{F.preventDefault();let f=N.sgt(),m=F.deltaY,a=Math.max(0,Math.min(f+m,N.hc.getTotalSize()-N.ch));N.sst(a),N.ls=a,N.vt=U2(N.vt,a),N.rfn();let e=a>=f?"down":"up";if(E.emit("scroll",{scrollPosition:a,direction:e}),!W.root.classList.contains(`${B}--scrolling`))W.root.classList.add(`${B}--scrolling`);if(g)clearTimeout(g);g=setTimeout(()=>{W.root.classList.remove(`${B}--scrolling`),N.vt.velocity=0,N.vt.sampleCount=0,E.emit("velocity:change",{velocity:0,reliable:!1})},D?.idleTimeout??h2)},W.viewport.addEventListener("wheel",u,{passive:!1});else if(Q&&A)u=(F)=>{if(F.deltaX)return;F.preventDefault(),W.viewport.scrollLeft+=F.deltaY},W.viewport.addEventListener("wheel",u,{passive:!1});let t=(F)=>{let m=F.target.closest("[data-index]");if(m){let a=parseInt(m.dataset.index??"-1",10);if(a>=0){let e=N.dm?.getItem(a)??N.it[a];if(e){if(e.__groupHeader)return;E.emit("item:click",{item:e,index:a,event:F})}}}for(let a=0;a<s.length;a++)s[a](F)},j0=(F)=>{let m=F.target.closest("[data-index]");if(m){let a=parseInt(m.dataset.index??"-1",10);if(a>=0){let e=N.dm?.getItem(a)??N.it[a];if(e){if(e.__groupHeader)return;E.emit("item:dblclick",{item:e,index:a,event:F})}}}},Z0=(F)=>{for(let f=0;f<r.length;f++)r[f](F)};W.items.addEventListener("click",t),W.items.addEventListener("dblclick",j0),W.root.addEventListener("keydown",Z0);let B0=new ResizeObserver((F)=>{if(N.id)return;for(let f of F){let m=f.contentRect.height,a=f.contentRect.width,e=Q?a:m;if(N.cw=a,Math.abs(e-N.ch)>1){if(N.ch=e,I.viewportState.containerSize=e,N.ii)o(),N.rfn(),E.emit("resize",{height:m,width:a})}if(N.ii)for(let i=0;i<n.length;i++)n[i](a,m)}});if(N.vre)B0.observe(W.viewport);let _0={dom:W,emitter:E,resolvedConfig:P,rawConfig:j,rendered:p,pool:h,itemState:H,sharedState:I,renderRange:k,isHorizontal:Q,classPrefix:B,contentSizeHandlers:Y0,afterScroll:x,clickHandlers:s,keydownHandlers:r,resizeHandlers:n,destroyHandlers:X0,methods:R,onScrollFrame:S,resizeObserver:B0,applyTemplate:c,updateContentSize:o},Q0=f2(N,_0);N.dm=I2(N,_0,Q0),N.sc=p2(N,_0);let U0=new Map;for(let F of $)if(F.methods)for(let f of F.methods){let m=U0.get(f);if(m)throw Error(`[vlist/builder] Method "${f}" is registered by both "${m}" and "${F.name}"`);U0.set(f,F.name)}for(let F of $)F.setup(Q0);if(N.ii=!0,Q0.state.isInitialized=!0,o(),N.rfn(),T&&N.it.length>0){let F=N.gsp(N.it.length-1,N.hc,N.ch,N.it.length,"end");N.sst(F),N.ls=F,N.rfn()}let O0=(F)=>{Q0.dataManager.setItems(F,0,F.length)},b0=T?(F)=>{let f=N.sab(2),m=N.it.length;if(Q0.dataManager.setItems(F,m),f&&N.it.length>0){let a=N.gsp(N.it.length-1,N.hc,N.ch,N.it.length,"end");N.sst(a),N.ls=a,N.rfn()}}:(F)=>{let f=N.it.length;Q0.dataManager.setItems(F,f)},D0=T?(F)=>{let f=N.sgt(),m=N.hc.getTotalSize(),a=[...N.it];Q0.dataManager.clear(),Q0.dataManager.setItems([...F,...a],0);let i=N.hc.getTotalSize()-m;if(i>0)N.sst(f+i),N.ls=f+i}:(F)=>{let f=[...N.it];Q0.dataManager.clear(),Q0.dataManager.setItems([...F,...f],0)},M0=(F,f)=>{Q0.dataManager.updateItem(F,f)},W0=(F)=>{Q0.dataManager.removeItem(F)},E0=async()=>{if(Q0.dataManager.reload)await Q0.dataManager.reload()},F0=()=>{if(z!==null)cancelAnimationFrame(z),z=null},Fj=(F,f,m)=>{if(F0(),Math.abs(f-F)<1){N.sst(f),N.ls=f,N.rfn();return}let a=performance.now(),e=(i)=>{let N0=i-a,q0=Math.min(N0/m,1),A0=F+(f-F)*w2(q0);if(N.sst(A0),N.ls=A0,N.rfn(),q0<1)z=requestAnimationFrame(e);else z=null};z=requestAnimationFrame(e)},Lj=(F,f)=>{let{align:m,behavior:a,duration:e}=S2(f),i=N.vtf(),N0=F;if(O&&i>0)N0=(N0%i+i)%i;let q0=N.gsp(N0,N.hc,N.ch,i,m);if(a==="smooth")Fj(N.sgt(),q0,e);else F0(),N.sst(q0)},Oj=()=>N.sgt(),bj=(F,f)=>{return E.on(F,f)},yj=(F,f)=>{E.off(F,f)},Hj=()=>{if(N.id)return;if(N.id=!0,Q0.state.isDestroyed=!0,W.items.removeEventListener("click",t),W.root.removeEventListener("keydown",Z0),N.st.removeEventListener("scroll",S),B0.disconnect(),u)W.viewport.removeEventListener("wheel",u);if(g)clearTimeout(g);for(let F=0;F<X0.length;F++)X0[F]();for(let F of $)if(F.destroy)F.destroy();F0();for(let[,F]of p)F.remove(),h.release(F);p.clear(),h.clear(),E.clear(),W.root.remove()},O2={get element(){return W.root},get items(){if(R.has("_getItems"))return R.get("_getItems")();return N.it},get total(){if(R.has("_getTotal"))return R.get("_getTotal")();return N.vtf()},setItems:R.has("setItems")?R.get("setItems"):O0,appendItems:R.has("appendItems")?R.get("appendItems"):b0,prependItems:R.has("prependItems")?R.get("prependItems"):D0,updateItem:R.has("updateItem")?R.get("updateItem"):M0,removeItem:R.has("removeItem")?R.get("removeItem"):W0,reload:R.has("reload")?R.get("reload"):E0,scrollToIndex:R.has("scrollToIndex")?R.get("scrollToIndex"):Lj,cancelScroll:R.has("cancelScroll")?R.get("cancelScroll"):F0,getScrollPosition:R.has("getScrollPosition")?R.get("getScrollPosition"):Oj,on:bj,off:yj,destroy:Hj};for(let[F,f]of R){if(F==="setItems"||F==="appendItems"||F==="prependItems"||F==="updateItem"||F==="removeItem"||F==="reload"||F==="scrollToIndex"||F==="scrollToItem"||F==="cancelScroll"||F==="getScrollPosition")continue;O2[F]=f}return O2}r0();var k0=(j,X,Q={},J="vlist",K=!1)=>{let{autoHide:q=!0,autoHideDelay:Y=1000,minThumbSize:B=30,showOnHover:V=!0,hoverZoneWidth:Z=16,showOnViewportEnter:D=!0}=Q,A=0,O=0,T=0,G=0,L=!1,M=!1,y=0,P=0,$=0,_=null,U=!1,W=null,E=null,b=K?"width":"height",w=K?"translateX":"translateY",h=K?(o)=>o.clientX:(o)=>o.clientY,N=K?"left":"top",z=document.createElement("div"),g=document.createElement("div"),d=V?document.createElement("div"):null,k=()=>{if(z.className=`${J}-scrollbar`,g.className=`${J}-scrollbar-thumb`,K)z.classList.add(`${J}-scrollbar--horizontal`);if(z.appendChild(g),j.appendChild(z),d){if(d.className=`${J}-scrollbar-hover`,K)d.classList.add(`${J}-scrollbar-hover--horizontal`),d.style.height=`${Z}px`;else d.style.width=`${Z}px`;j.appendChild(d)}},C=()=>{if(_)clearTimeout(_),_=null},I=()=>{if(!q)return;C(),_=setTimeout(H,Y)},p=()=>{if(A<=O)return;if(C(),!U)z.classList.add(`${J}-scrollbar--visible`),U=!0;if(q&&!L&&!M)I()},H=()=>{if(L||M)return;z.classList.remove(`${J}-scrollbar--visible`),U=!1},v=(o,J0)=>{A=o,O=J0;let G0=A>O;if(z.style.display=G0?"":"none",!G0){H();return}let S=O/A;T=Math.max(B,S*O),g.style[b]=`${T}px`,G=O-T,x($)},x=(o)=>{if($=o,A<=O||G<=0)return;let J0=A-O,S=Math.min(1,Math.max(0,o/J0))*G;g.style.transform=`${w}(${S}px)`},s=(o)=>{if(o.target===g)return;let J0=z.getBoundingClientRect(),u=h(o)-J0[N]-T/2,j0=Math.max(0,Math.min(u,G))/G,Z0=A-O,B0=j0*Z0;X(B0),p()},r=(o)=>{o.preventDefault(),o.stopPropagation(),L=!0,y=h(o),P=$,C(),z.classList.add(`${J}-scrollbar--dragging`),document.addEventListener("mousemove",n),document.addEventListener("mouseup",Y0)},n=(o)=>{if(!L)return;let J0=h(o)-y,G0=G>0?J0/G:0,S=A-O,u=G0*S,t=Math.max(0,Math.min(P+u,S)),Z0=t/S*G;if(g.style.transform=`${w}(${Z0}px)`,E=t,W===null)W=requestAnimationFrame(()=>{if(E!==null)X(E);W=null})},Y0=()=>{if(L=!1,W!==null)cancelAnimationFrame(W),W=null;if(E!==null)X(E),E=null;if(z.classList.remove(`${J}-scrollbar--dragging`),q&&!M)I();document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",Y0)},X0=()=>{if(D)p()},R=()=>{if(!L){if(M=!1,q)I()}},c=()=>{M=!0,C(),p()},l=()=>{if(M=!1,!L&&q)I()},K0=()=>{if(C(),W!==null)cancelAnimationFrame(W),W=null;if(z.removeEventListener("click",s),z.removeEventListener("mouseenter",c),z.removeEventListener("mouseleave",l),g.removeEventListener("mousedown",r),j.removeEventListener("mouseenter",X0),j.removeEventListener("mouseleave",R),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",Y0),d){if(d.removeEventListener("mouseenter",c),d.removeEventListener("mouseleave",l),d.parentNode)d.parentNode.removeChild(d)}if(z.parentNode)z.parentNode.removeChild(z)};if(k(),z.addEventListener("click",s),z.addEventListener("mouseenter",c),z.addEventListener("mouseleave",l),g.addEventListener("mousedown",r),j.addEventListener("mouseenter",X0),j.addEventListener("mouseleave",R),d)d.addEventListener("mouseenter",c),d.addEventListener("mouseleave",l);return{show:p,hide:H,updateBounds:v,updatePosition:x,isVisible:()=>U,destroy:K0}};var r2=(j)=>{let X=null;return{name:"withScrollbar",priority:30,setup(Q){let{dom:J,config:K}=Q,{classPrefix:q,horizontal:Y}=K;if(X=k0(J.viewport,(Z)=>Q.scrollController.scrollTo(Z),j??{},q,Y),!J.viewport.classList.contains(`${q}-viewport--custom-scrollbar`))J.viewport.classList.add(`${q}-viewport--custom-scrollbar`);let B=Q.getCachedCompression();X.updateBounds(B.virtualSize,Q.state.viewportState.containerSize);let V=X;Q.afterScroll.push((Z,D)=>{V.updatePosition(Z),V.show()}),Q.resizeHandlers.push((Z,D)=>{if(V){let A=Q.getCachedCompression();V.updateBounds(A.virtualSize,Q.state.viewportState.containerSize)}}),Q.contentSizeHandlers.push(()=>{if(V){let Z=Q.getCachedCompression();V.updateBounds(Z.virtualSize,Q.state.viewportState.containerSize)}}),Q.destroyHandlers.push(()=>{if(V)V.destroy()})},destroy(){if(X)X.destroy(),X=null}}};var n2=(j=0)=>{let X=[,,,,,,,,];for(let Q=0;Q<8;Q++)X[Q]={position:0,time:0};return{velocity:0,lastPosition:j,lastTime:performance.now(),samples:X,sampleIndex:0,sampleCount:0}},n0=(j,X)=>{let Q=performance.now(),J=Q-j.lastTime;if(J===0)return j;if(J>100){j.sampleCount=0,j.sampleIndex=0,j.velocity=0;let q=j.samples[0];return q.position=X,q.time=Q,j.sampleIndex=1,j.sampleCount=1,j.lastPosition=X,j.lastTime=Q,j}let K=j.samples[j.sampleIndex];if(K.position=X,K.time=Q,j.sampleIndex=(j.sampleIndex+1)%8,j.sampleCount=Math.min(j.sampleCount+1,8),j.sampleCount>=2){let q=(j.sampleIndex-j.sampleCount+8)%8,Y=j.samples[q],B=X-Y.position,V=Q-Y.time;j.velocity=V>0?B/V:0}return j.lastPosition=X,j.lastTime=Q,j},hj=(j)=>j.sampleCount>=3,o2=(j,X={})=>{let{wheel:Q=!0,sensitivity:J=1,smoothing:K=!1,idleTimeout:q=150,onScroll:Y,onIdle:B,scrollElement:V,horizontal:Z=!1}=X,D=!!V,A=0,O=0,T=D?Z?window.innerWidth:window.innerHeight:Z?j.clientWidth:j.clientHeight,G=X.compressed??!1,L=X.compression,M=n2(),y=!1,P=null,_=o0(()=>{let R=Z?j.scrollLeft:j.scrollTop,c=R>=A?"down":"up";if(M=n0(M,R),A=R,Y)Y({scrollTop:A,direction:c,velocity:M.velocity});h()}),W=o0(()=>{let R=j.getBoundingClientRect(),c=Z?Math.max(0,-R.left):Math.max(0,-R.top),l=c>=A?"down":"up";if(M=n0(M,c),A=c,!y)y=!0;if(Y)Y({scrollTop:A,direction:l,velocity:M.velocity});h()}),E=(R)=>{R.preventDefault()},b=(R)=>{if(R.deltaX)return;R.preventDefault(),j.scrollLeft+=R.deltaY},w=(R)=>{if(!G)return;R.preventDefault();let c=(Z?R.deltaX||R.deltaY:R.deltaY)*J,l=A+c;if(K)l=A+c*0.3;if(l=Math.max(0,Math.min(l,O)),l!==A){let o=l>=A?"down":"up";if(M=n0(M,l),A=l,!y)y=!0;if(Y)Y({scrollTop:A,direction:o,velocity:M.velocity});h()}},h=()=>{if(P)clearTimeout(P);P=setTimeout(()=>{if(y=!1,M=n2(A),B)B()},q)},N=(R)=>{if(G)return;if(G=!0,L=R,O=R.virtualSize-T,D)return;if(_.cancel(),j.removeEventListener("scroll",_),!Q)j.removeEventListener("wheel",E);else if(Z)j.removeEventListener("wheel",b);if(Z)j.style.overflowX="hidden";else j.style.overflow="hidden";if(Q)j.addEventListener("wheel",w,{passive:!1});let c=Z?j.scrollLeft:j.scrollTop;if(c>0){let l=Z?L?.actualSize??j.scrollWidth:L?.actualSize??j.scrollHeight;A=c/l*O}if(Z)j.scrollLeft=0;else j.scrollTop=0},z=()=>{if(!G)return;if(G=!1,D){L=void 0;return}if(j.removeEventListener("wheel",w),Z)j.style.overflowX="auto";else j.style.overflow="auto";if(j.addEventListener("scroll",_,{passive:!0}),!Q)j.addEventListener("wheel",E,{passive:!1});else if(Z)j.addEventListener("wheel",b,{passive:!1});if(L&&A>0){let c=A/O*(L.actualSize-T);if(Z)j.scrollLeft=c;else j.scrollTop=c}L=void 0},g=()=>{if(D||G)return A;return Z?j.scrollLeft:j.scrollTop},d=(R,c=!1)=>{let l=Math.max(0,Math.min(R,O||1/0));if(D){let K0=j.getBoundingClientRect();if(Z){let o=K0.left+window.scrollX;window.scrollTo({left:o+l,behavior:c?"smooth":"auto"})}else{let o=K0.top+window.scrollY;window.scrollTo({top:o+l,behavior:c?"smooth":"auto"})}}else if(G){if(l===A)return;let o=l>=A?"down":"up";if(M=n0(M,l),A=l,!y)y=!0;if(Y)Y({scrollTop:A,direction:o,velocity:M.velocity});h()}else if(Z)j.scrollTo({left:l,behavior:c?"smooth":"auto"});else j.scrollTo({top:l,behavior:c?"smooth":"auto"})},k=(R)=>{d(g()+R)},C=()=>{return g()<=0},I=(R=0)=>{let c=g(),l=D||G?O:Z?j.scrollWidth-j.clientWidth:j.scrollHeight-j.clientHeight;return c>=l-R},p=()=>{let R=g(),c=D||G?O:Z?j.scrollWidth-j.clientWidth:j.scrollHeight-j.clientHeight;if(c<=0)return 0;return Math.min(1,Math.max(0,R/c))},H=(R)=>{if(R.compression)L=R.compression,O=L.virtualSize-T},v=()=>G,x=()=>Math.abs(M.velocity),s=()=>hj(M),r=()=>y,n=()=>D,Y0=(R)=>{if(T=R,L)O=L.virtualSize-T},X0=()=>{if(P)clearTimeout(P);if(D)W.cancel(),window.removeEventListener("scroll",W);else _.cancel(),j.removeEventListener("scroll",_),j.removeEventListener("wheel",w),j.removeEventListener("wheel",E),j.removeEventListener("wheel",b)};if(D){if(G&&L)O=L.virtualSize-T;window.addEventListener("scroll",W,{passive:!0})}else if(G&&L){if(O=L.virtualSize-T,Z)j.style.overflowX="hidden";else j.style.overflow="hidden";if(Q)j.addEventListener("wheel",w,{passive:!1})}else{if(Z)j.style.overflowX="auto",j.style.overflowY="hidden";else j.style.overflow="auto";if(j.addEventListener("scroll",_,{passive:!0}),!Q)j.addEventListener("wheel",E,{passive:!1});else if(Z)j.addEventListener("wheel",b,{passive:!1})}return{getScrollTop:g,scrollTo:d,scrollBy:k,isAtTop:C,isAtBottom:I,getScrollPercentage:p,getVelocity:x,isTracking:s,isScrolling:r,updateConfig:H,enableCompression:N,disableCompression:z,isCompressed:v,isWindowMode:n,updateContainerHeight:Y0,destroy:X0}},o0=(j)=>{let X=null,Q=null,J=(...K)=>{if(Q=K,X===null)X=requestAnimationFrame(()=>{if(X=null,Q)j(...Q)})};return J.cancel=()=>{if(X!==null)cancelAnimationFrame(X),X=null},J};var uj=0.65,gj=0.5,xj=0.95,mj=0.1,dj=5,cj=100,i2=()=>{let j=null,X=0,Q=!1,J=0,K=null,q=0,Y=0,B=null,V=[];return{name:"withScale",priority:20,setup(Z){let{dom:D,config:A}=Z,{classPrefix:O,horizontal:T}=A,G=()=>{let P=Z.getVirtualTotal(),$=V0(P,Z.sizeCache);if($.isCompressed&&!Q){Q=!0,Z.scrollController.enableCompression($),Z.updateContentSize($.virtualSize),Z.setScrollFns(()=>X,(z)=>{if(X=z,J=z,K!==null)cancelAnimationFrame(K),K=null});let _=()=>{let z=J-X;if(Math.abs(z)<gj)X=J,K=null;else X+=z*uj,K=requestAnimationFrame(_);Z.scrollController.scrollTo(X)},U=D.viewport,W=(z)=>{z.preventDefault();let d=Z.getCachedCompression().virtualSize-Z.state.viewportState.containerSize;if(J=Math.max(0,Math.min(J+z.deltaY,d)),K===null)K=requestAnimationFrame(_)};U.addEventListener("wheel",W,{passive:!1});let E=()=>{if(B!==null)cancelAnimationFrame(B),B=null},b=(z)=>{if(E(),K!==null)cancelAnimationFrame(K),K=null;let g=z.touches[0];if(!g)return;let d=T?g.clientX:g.clientY;q=d,Y=X,V=[{time:performance.now(),y:d}]},w=(z)=>{z.preventDefault();let g=z.touches[0];if(!g)return;let d=T?g.clientX:g.clientY,k=performance.now();if(V.push({time:k,y:d}),V.length>dj)V.shift();let C=q-d,p=Z.getCachedCompression().virtualSize-Z.state.viewportState.containerSize,H=Math.max(0,Math.min(Y+C,p));X=H,J=H,Z.scrollController.scrollTo(H)},h=(z)=>{let g=performance.now(),d=V.filter((p)=>g-p.time<cj),k=0;if(d.length>=2){let p=d[0],H=d[d.length-1],v=H.time-p.time;if(v>0)k=(p.y-H.y)/v}if(V=[],Math.abs(k)<mj)return;let C=k*16,I=()=>{if(C*=xj,Math.abs(C)<0.5){B=null;return}let H=Z.getCachedCompression().virtualSize-Z.state.viewportState.containerSize,v=X+C;if(v=Math.max(0,Math.min(v,H)),v<=0&&C<0||v>=H&&C>0){X=v,J=v,Z.scrollController.scrollTo(v),B=null;return}X=v,J=v,Z.scrollController.scrollTo(v),B=requestAnimationFrame(I)};B=requestAnimationFrame(I)};if(U.addEventListener("touchstart",b,{passive:!0}),U.addEventListener("touchmove",w,{passive:!1}),U.addEventListener("touchend",h,{passive:!0}),U.addEventListener("touchcancel",h,{passive:!0}),Z.destroyHandlers.push(()=>{if(U.removeEventListener("wheel",W),U.removeEventListener("touchstart",b),U.removeEventListener("touchmove",w),U.removeEventListener("touchend",h),U.removeEventListener("touchcancel",h),E(),K!==null)cancelAnimationFrame(K),K=null}),!D.viewport.querySelector(`.${O}-scrollbar-track`)){if(j=k0(D.viewport,(g)=>Z.scrollController.scrollTo(g),{},O,T),!D.viewport.classList.contains(`${O}-viewport--custom-scrollbar`))D.viewport.classList.add(`${O}-viewport--custom-scrollbar`);j.updateBounds($.virtualSize,Z.state.viewportState.containerSize);let z=j;Z.afterScroll.push((g,d)=>{if(z)z.updatePosition(g),z.show()}),Z.resizeHandlers.push((g,d)=>{if(z){let k=Z.getCachedCompression();z.updateBounds(k.virtualSize,Z.state.viewportState.containerSize)}})}}else if(!$.isCompressed&&Q)Q=!1,Z.scrollController.disableCompression(),Z.updateContentSize($.actualSize);else if($.isCompressed)Z.scrollController.updateConfig({compression:$}),Z.updateContentSize($.virtualSize);if(j)j.updateBounds($.virtualSize,Z.state.viewportState.containerSize);Z.state.cachedCompression={state:$,totalItems:P}};Z.updateCompressionMode=G;let L=Z.getCachedCompression.bind(Z);Z.getCachedCompression=()=>{if(Z.state.cachedCompression)return Z.state.cachedCompression.state;return L()},Z.setVisibleRangeFn((P,$,_,U,W)=>{M=null,y=null;let E=V0(U,_);a0(P,$,_,U,E,W)}),Z.setScrollToPosFn((P,$,_,U,W)=>{let E=V0(U,$);return s0(P,$,_,U,E,W)});let M=null,y=null;Z.setPositionElementFn((P,$)=>{let _=Z.getVirtualTotal(),U=V0(_,Z.sizeCache);if(U.isCompressed){let W=Z.scrollController.getScrollTop();if(M===null||$<y)y=$,M=Math.round(R0($,W,Z.sizeCache,_,Z.state.viewportState.containerSize,U));let E=M+Z.sizeCache.getOffset($)-Z.sizeCache.getOffset(y),b=Z.config.horizontal;P.style.transform=b?`translateX(${E}px)`:`translateY(${E}px)`}else{let W=Math.round(Z.sizeCache.getOffset($)),E=Z.config.horizontal;P.style.transform=E?`translateX(${W}px)`:`translateY(${W}px)`}}),G(),Z.destroyHandlers.push(()=>{if(j)j.destroy(),j=null;if(K!==null)cancelAnimationFrame(K),K=null})},destroy(){if(j)j.destroy(),j=null;if(K!==null)cancelAnimationFrame(K),K=null;if(B!==null)cancelAnimationFrame(B),B=null}}};var i0=(j={})=>{let{chunkSize:X=100,maxCachedItems:Q=5000,evictionBuffer:J=200,onEvict:K}=j,q=new Map,Y=0,B=0,V=(k)=>{let C=q.get(k);if(!C)C={items:Array(X),count:0,lastAccess:Date.now()},q.set(k,C);else C.lastAccess=Date.now();return C},Z=(k)=>{return Math.floor(k/X)},D=(k)=>{return k%X},A=()=>Y,O=(k)=>{Y=k},T=(k)=>{if(k<0||k>=Y)return;let C=Z(k),I=q.get(C);if(!I)return;return I.items[D(k)]},G=(k)=>{if(k<0||k>=Y)return!1;let C=Z(k),I=q.get(C);if(!I)return!1;return I.items[D(k)]!==void 0},L=(k,C)=>{let I=Z(k),p=V(I),H=D(k),v=p.items[H]===void 0;if(p.items[H]=C,v)p.count++,B++;if(k>=Y)Y=k+1},M=(k,C)=>{for(let I=0;I<C.length;I++){let p=C[I];if(p!==void 0)L(k+I,p)}},y=(k)=>{if(k<0||k>=Y)return!1;let C=Z(k),I=q.get(C);if(!I)return!1;let p=D(k);if(I.items[p]===void 0)return!1;if(I.items[p]=void 0,I.count--,B--,I.count===0)q.delete(C);return!0},P=(k,C)=>{let I=[];for(let p=k;p<=C&&p<Y;p++)I.push(T(p));return I},$=(k,C)=>{for(let I=k;I<=C&&I<Y;I++)if(!G(I))return!1;return!0},_=()=>{let k=[],C=null,I=Array.from(q.keys()).sort((p,H)=>p-H);for(let p of I){let H=q.get(p);if(!H)continue;let v=p*X;for(let x=0;x<X;x++){let s=v+x;if(s>=Y)break;if(H.items[x]!==void 0)if(C===null)C={start:s,end:s};else if(s===C.end+1)C.end=s;else k.push(C),C={start:s,end:s};else if(C!==null)k.push(C),C=null}}if(C!==null)k.push(C);return k},U=(k,C)=>{let I=[],p=null;for(let H=k;H<=C&&H<Y;H++)if(!G(H))if(p===null)p={start:H,end:H};else p.end=H;else if(p!==null)I.push(p),p=null;if(p!==null)I.push(p);return I},W=(k)=>{return q.has(k)},E=(k)=>{let C=q.get(k);if(C)C.lastAccess=Date.now()},b=(k,C)=>{if(k>C||q.size===0)return;let I=Date.now(),p=Z(Math.max(0,k)),H=Z(Math.min(Y-1,C));for(let v=p;v<=H;v++){let x=q.get(v);if(x)x.lastAccess=I}},w=(k,C)=>{if(B<=Q)return 0;let I=Math.max(0,k-J),p=Math.min(Y-1,C+J),H=Z(I),v=Z(p),x=0,s=[];for(let[r,n]of q)if(r<H||r>v)x+=n.count,s.push(r),B-=n.count,q.delete(r);if(x>0&&K)K(x,s);return x},h=()=>{if(B<=Q)return 0;let k=Array.from(q.entries()).sort(([,p],[,H])=>p.lastAccess-H.lastAccess),C=0,I=[];for(let[p,H]of k){if(B<=Q)break;C+=H.count,B-=H.count,I.push(p),q.delete(p)}if(C>0&&K)K(C,I);return C},N=()=>{return{totalItems:Y,cachedItems:B,cachedChunks:q.size,chunkSize:X,maxCachedItems:Q,memoryEfficiency:Y>0?1-B/Y:1}},z=()=>B,g=()=>{q.clear(),B=0};return{chunkSize:X,maxCachedItems:Q,getTotal:A,setTotal:O,get:T,has:G,set:L,setRange:M,delete:y,getRange:P,isRangeLoaded:$,getLoadedRanges:_,findUnloadedRanges:U,getChunkIndex:Z,isChunkLoaded:W,touchChunk:E,touchChunksForRange:b,evictDistant:w,evictToLimit:h,getStats:N,getCachedCount:z,clear:g,reset:()=>{g(),Y=0}}},t0=(j)=>{if(j.length===0)return[];let X=[...j].sort((J,K)=>J.start-K.start),Q=[{...X[0]}];for(let J=1;J<X.length;J++){let K=X[J],q=Q[Q.length-1];if(K.start<=q.end+1)q.end=Math.max(q.end,K.end);else Q.push({...K})}return Q},p0=(j,X,Q)=>{let J=Math.floor(j.start/Q)*Q,K=Math.ceil((j.end+1)/Q)*Q-1,q={start:J,end:K};if(X.length===0)return[q];let Y=[],B=t0(X),V=q.start;for(let Z of B){if(Z.end<V)continue;if(Z.start>q.end)break;if(Z.start>V)Y.push({start:V,end:Math.min(Z.start-1,q.end)});if(V=Z.end+1,V>q.end)break}if(V<=q.end)Y.push({start:V,end:q.end});return Y};var e0=(j={})=>{let{enabled:X=!0,maskCharacter:Q="█",randomVariance:J=!0,maxSampleSize:K=20,customGenerator:q}=j,Y=null,B=!1,V=0,Z=(y)=>{if(!X||B||y.length===0)return;let P=new Map,$=new Map,_=Math.min(y.length,K);for(let U=0;U<_;U++){let W=y[U];if(!W||typeof W!=="object")continue;for(let[E,b]of Object.entries(W)){if(E.startsWith("_")||E==="id")continue;if(!$.has(E))$.set(E,{lengths:[],types:new Set});let w=$.get(E),h=Array.isArray(b)?"array":typeof b;if(w.types.add(h),typeof b==="string")w.lengths.push(b.length);else if(b!==null&&b!==void 0)w.lengths.push(String(b).length)}}for(let[U,W]of $){if(W.lengths.length===0)continue;let E=Math.min(...W.lengths),b=Math.max(...W.lengths),w=Math.round(W.lengths.reduce((N,z)=>N+z,0)/W.lengths.length),h="string";if(W.types.has("number")&&W.types.size===1)h="number";else if(W.types.has("boolean")&&W.types.size===1)h="boolean";else if(W.types.has("array"))h="array";else if(W.types.has("object")&&!W.types.has("string"))h="object";P.set(U,{minLength:E,maxLength:b,avgLength:w,type:h})}Y=P,B=!0},D=()=>B,A=(y)=>{let P=y.avgLength;if(J&&y.minLength!==y.maxLength){if(P=Math.floor(Math.random()*(y.maxLength-y.minLength+1)+y.minLength),Math.random()<0.3)P=Math.max(1,P+Math.floor(Math.random()*3)-1)}return Q.repeat(Math.max(1,P))},O=(y)=>{if(q)return{...q(y),["_isPlaceholder"]:!0};let P={id:`__placeholder_${V++}`,["_isPlaceholder"]:!0,_index:y};if(!Y||Y.size===0)return P.label=Q.repeat(12),P;for(let[$,_]of Y)switch(_.type){case"string":P[$]=A(_);break;case"number":P[$]=0;break;case"boolean":P[$]=!1;break;case"array":P[$]=[];break;case"object":P[$]={};break;default:P[$]=A(_)}return P};return{analyzeStructure:Z,hasAnalyzedStructure:D,generate:O,generateRange:(y,P)=>{let $=[];for(let _=y;_<=P;_++)$.push(O(_));return $},isPlaceholder:(y)=>{if(!y||typeof y!=="object")return!1;return y._isPlaceholder===!0},getPlaceholderKey:()=>"_isPlaceholder",clear:()=>{Y=null,B=!1,V=0}}},H0=(j)=>{if(!j||typeof j!=="object")return!1;return j._isPlaceholder===!0},W2=(j)=>{return j.filter((X)=>!H0(X))};var aj=50,j2=(j={})=>{let{adapter:X,initialItems:Q,initialTotal:J,storage:K,placeholder:q,pageSize:Y=aj,onStateChange:B,onItemsLoaded:V,onItemsEvicted:Z}=j,D=i0({...K,onEvict:(S,u)=>{Z?.(S),U()}}),A=null,O=()=>{if(!A)A=e0(q);return A},T=new Map,G=!1,L,M=!0,y,P=[],$=0,_=new Map,U=()=>{B?.(d())},W=()=>{T.clear();let S=D.getLoadedRanges();for(let u of S)for(let t=u.start;t<=u.end;t++){let j0=D.get(t);if(j0&&!H0(j0))T.set(j0.id,t)}},E=(S,u)=>{if(!H0(u))T.set(u.id,S)},b=(S)=>{T.delete(S)},w=(S,u)=>{return`${S}-${u}`},h=()=>D.getTotal(),N=()=>D.getCachedCount(),z=()=>G,g=()=>M,d=()=>({total:D.getTotal(),cached:D.getCachedCount(),isLoading:G,pendingRanges:P,error:L,hasMore:M,cursor:y}),k=()=>D,C=()=>O(),I=(S)=>{let u=D.get(S);if(u!==void 0)return u;if(S>=0&&S<D.getTotal())return O().generate(S);return},p=(S)=>{let u=T.get(S);if(u===void 0)return;return D.get(u)},H=(S)=>{return T.get(S)??-1},v=(S)=>{let u=D.get(S);return u!==void 0&&!H0(u)},x=(S,u)=>{let t=[],j0=D.getTotal(),Z0=0,B0=0;D.touchChunksForRange(S,Math.min(u,j0-1));for(let _0=S;_0<=u&&_0<j0;_0++){let Q0=D.get(_0);if(Q0!==void 0)t.push(Q0),Z0++;else t.push(O().generate(_0)),B0++}return t},s=(S)=>{D.setTotal(S),M=D.getCachedCount()<S,U()},r=(S,u=0,t)=>{if(A&&!A.hasAnalyzedStructure()&&S.length>0)A.analyzeStructure(S);for(let j0=0;j0<S.length;j0++){let Z0=S[j0];if(Z0!==void 0){let B0=u+j0;D.set(B0,Z0),E(B0,Z0)}}if(t!==void 0)D.setTotal(t);else if(u+S.length>D.getTotal())D.setTotal(u+S.length);if(D.getCachedCount()>=D.getTotal()&&D.getTotal()>0)M=!1;V?.(S,u,D.getTotal()),U()},n=(S,u)=>{let t=T.get(S);if(t===void 0)return!1;let j0=D.get(t);if(!j0)return!1;let Z0={...j0,...u};if(D.set(t,Z0),u.id!==void 0&&u.id!==S)b(S),E(t,Z0);return U(),!0},Y0=(S)=>{let u=T.get(S);if(u===void 0)return!1;D.delete(u),b(S);let t=D.getTotal();if(t>0)D.setTotal(t-1);return U(),!0},X0=async(S,u)=>{if(!X)return;let t=w(S,u);if(_.has(t))return;let j0=D.getLoadedRanges(),Z0=p0({start:S,end:u},j0,D.chunkSize);if(Z0.length===0)return;let B0=D.chunkSize,_0=[];for(let U0 of Z0){let O0=Math.floor(U0.start/B0),b0=Math.floor(U0.end/B0);for(let D0=O0;D0<=b0;D0++){let M0=D0*B0,W0=M0+B0-1,E0=w(M0,W0);if(!_0.some((F0)=>F0.start===M0)&&!_.has(E0))_0.push({start:M0,end:W0})}}let Q0=[];for(let U0 of Z0){let O0=Math.floor(U0.start/B0),b0=Math.floor(U0.end/B0);for(let D0=O0;D0<=b0;D0++){let M0=D0*B0,W0=M0+B0-1,E0=w(M0,W0);if(_.has(E0)){let F0=_.get(E0);if(!Q0.includes(F0))Q0.push(F0)}}}for(let U0 of _0){let O0=w(U0.start,U0.end),b0=(async()=>{P.push(U0),G=!0,L=void 0,U();try{let D0=U0.end-U0.start+1,M0={offset:U0.start,limit:D0,cursor:void 0},W0=await X.read(M0);if(r(W0.items,U0.start,W0.total),W0.cursor)y=W0.cursor;let E0=U0.start+W0.items.length;if(E0>=$){if($=E0,W0.hasMore!==void 0)M=W0.hasMore;else if(W0.total!==void 0)M=E0<W0.total}}catch(D0){L=D0 instanceof Error?D0:Error(String(D0))}finally{_.delete(O0),P=P.filter((D0)=>D0.start!==U0.start||D0.end!==U0.end),G=_.size>0,U()}})();_.set(O0,b0),Q0.push(b0)}await Promise.all(Q0)},R=async(S,u)=>{if(D.isRangeLoaded(S,u))return;await X0(S,u)},c=async()=>{if(!X)return;await X0(0,Y-1)},l=async()=>{if(!X||G||!M)return!1;let S=D.getCachedCount(),u=D.getTotal(),t=S,j0=Math.min(t+Y-1,u>0?u-1:t+Y-1);if(t>=u&&u>0)return M=!1,!1;return await X0(t,j0),D.getCachedCount()>S},K0=async()=>{if(D.clear(),T.clear(),A)A.clear();_.clear(),P=[],G=!1,y=void 0,M=!0,$=0,L=void 0,U()},o=(S,u)=>{if(D.evictDistant(S,u)>0)W()},J0=()=>{D.clear(),T.clear(),y=void 0,L=void 0,P=[],G=!1,U()},G0=()=>{if(D.reset(),T.clear(),A)A.clear();y=void 0,M=!0,$=0,L=void 0,P=[],G=!1,U()};if(Q&&Q.length>0)r(Q,0,J??Q.length);else if(J!==void 0)D.setTotal(J);return{getState:d,getTotal:h,getCached:N,getIsLoading:z,getHasMore:g,getStorage:k,getPlaceholders:C,getItem:I,getItemById:p,getIndexById:H,isItemLoaded:v,getItemsInRange:x,setTotal:s,setItems:r,updateItem:n,removeItem:Y0,loadRange:X0,ensureRange:R,loadInitial:c,loadMore:l,reload:K0,evictDistant:o,clear:J0,reset:G0}};var t2=(j)=>{let{adapter:X,loading:Q}=j,J=Q?.cancelThreshold??g2,K=Q?.preloadThreshold??x2,q=Q?.preloadAhead??m2;return{name:"withAsync",priority:20,methods:["reload"],setup(Y){let{emitter:B}=Y,V=Y.config.reverse,Z=j2({adapter:X,pageSize:I0,onStateChange:()=>{if(Y.state.isInitialized){Y.sizeCache.rebuild(Y.getVirtualTotal()),Y.updateCompressionMode();let M=Y.getCachedCompression();Y.state.viewportState.totalSize=M.virtualSize,Y.state.viewportState.actualSize=M.actualSize,Y.state.viewportState.isCompressed=M.isCompressed,Y.state.viewportState.compressionRatio=M.ratio,Y.updateContentSize(M.virtualSize),Y.renderIfNeeded()}},onItemsLoaded:(M,y,P)=>{if(Y.state.isInitialized)Y.sizeCache.rebuild(Y.getVirtualTotal()),Y.forceRender(),B.emit("load:end",{items:M,total:P})}});Y.replaceDataManager(Z);let D=null,A=null,O=0,T=()=>{if(A){let M=A;A=null,Y.dataManager.ensureRange(M.start,M.end).catch((y)=>{B.emit("error",{error:y,context:"ensureRange"})})}};Y.afterScroll.push((M,y)=>{if(Y.state.isDestroyed)return;let P=Y.scrollController.getVelocity(),_=Y.scrollController.isTracking()&&P<=J;if(A&&O>J&&P<=J){let E=A;A=null,Y.dataManager.ensureRange(E.start,E.end).catch((b)=>{B.emit("error",{error:b,context:"ensureRange"})})}if(O=P,_&&!Y.dataManager.getIsLoading()&&Y.dataManager.getHasMore()){if(V){if(M<D2)B.emit("load:start",{offset:Y.dataManager.getCached(),limit:I0}),Y.dataManager.loadMore().catch((E)=>{B.emit("error",{error:E,context:"loadMore"})})}else if(Y.state.viewportState.totalSize-M-Y.state.viewportState.containerSize<D2)B.emit("load:start",{offset:Y.dataManager.getCached(),limit:I0}),Y.dataManager.loadMore().catch((b)=>{B.emit("error",{error:b,context:"loadMore"})})}let{renderRange:U}=Y.state.viewportState;if(!D||U.start!==D.start||U.end!==D.end)if(D={start:U.start,end:U.end},_){A=null;let{start:E,end:b}=U,w=Y.getVirtualTotal();if(P>K)if(y==="down")b=Math.min(U.end+q,w-1);else E=Math.max(U.start-q,0);Y.dataManager.ensureRange(E,b).catch((h)=>{B.emit("error",{error:h,context:"ensureRange"})})}else A={start:U.start,end:U.end}});let G=200,L=null;Y.afterScroll.push((M,y)=>{if(L!==null)clearTimeout(L);L=setTimeout(()=>{L=null,T()},G)}),Y.destroyHandlers.push(()=>{if(L!==null)clearTimeout(L),L=null}),B.on("load:start",()=>{Y.dom.root.setAttribute("aria-busy","true")}),B.on("load:end",()=>{Y.dom.root.removeAttribute("aria-busy")}),Y.methods.set("reload",async()=>{D=null,A=null,Y.invalidateRendered(),await Y.dataManager.reload(),Y.forceRender();let{renderRange:M}=Y.state.viewportState;if(M.end>0)await Y.dataManager.ensureRange(M.start,M.end)}),B.emit("load:start",{offset:0,limit:I0}),Y.dataManager.loadInitial().catch((M)=>{B.emit("error",{error:M,context:"loadInitial"})})}}};var e2=()=>{let j=null;return{name:"withPage",priority:5,setup(X){let{dom:Q,state:J,config:K,emitter:q}=X;Q.root.style.overflow="visible",Q.root.style.height="auto",Q.viewport.classList.remove(`${K.classPrefix}-viewport--custom-scrollbar`),X.disableViewportResize(),X.setScrollTarget(window),X.setScrollFns(()=>{let Z=Q.viewport.getBoundingClientRect();if(K.horizontal)return Math.max(0,-Z.left);else return Math.max(0,-Z.top)},(Z)=>{let D=Q.viewport.getBoundingClientRect();if(K.horizontal){let A=D.left+window.scrollX;window.scrollTo(A+Z,window.scrollY)}else{let A=D.top+window.scrollY;window.scrollTo(window.scrollX,A+Z)}}),X.setContainerDimensions({width:()=>window.innerWidth,height:()=>window.innerHeight}),J.viewportState.containerSize=window.innerHeight;let{innerHeight:Y,innerWidth:B}=window,V=()=>{let{innerWidth:Z,innerHeight:D}=window,A=K.horizontal?Z:D,O=K.horizontal?B:Y;if(Math.abs(A-O)<=1)return;Y=D,B=Z,J.viewportState.containerSize=D,q.emit("resize",{width:Z,height:D});for(let T=0;T<X.resizeHandlers.length;T++)X.resizeHandlers[T](Z,D);X.renderIfNeeded()};window.addEventListener("resize",V,{passive:!0}),j=()=>{window.removeEventListener("resize",V)},X.destroyHandlers.push(j)},destroy(){if(j)j(),j=null}}};var G2=(j,X)=>{let Q=0,J=j.length-1;while(Q<J){let K=Q+J+1>>>1;if(j[K].headerLayoutIndex<=X)Q=K;else J=K-1}return Q},jj=(j,X)=>{let Q=0,J=j.length-1;while(Q<J){let K=Q+J+1>>>1;if(j[K].firstDataIndex<=X)Q=K;else J=K-1}return Q},Jj=(j,X)=>{if(j===0)return[];let Q=[],J=X(0),K=0,q=0;for(let Y=1;Y<j;Y++){let B=X(Y);if(B!==J){let V=Y-K;Q.push({key:J,groupIndex:Q.length,headerLayoutIndex:q,firstDataIndex:K,count:V}),q=q+1+V,J=B,K=Y}}return Q.push({key:J,groupIndex:Q.length,headerLayoutIndex:q,firstDataIndex:K,count:j-K}),Q},h0=(j,X)=>{if(j.length===0||X.length===0)return[];let Q=j.length+X.length,J=Array(Q),K=0;for(let q of X){J[K]={id:`__group_header_${q.groupIndex}`,__groupHeader:!0,groupKey:q.key,groupIndex:q.groupIndex},K++;for(let Y=0;Y<q.count;Y++)J[K]=j[q.firstDataIndex+Y],K++}return J},u0=(j,X)=>{let Q=typeof X==="number"?(J)=>X:X;return(J)=>{let K=j.getEntry(J);if(K.type==="header")return j.getHeaderHeight(K.group.groupIndex);return Q(K.dataIndex)}},J2=(j,X)=>{let Q=Jj(j,X.getGroupForIndex),J=j+Q.length,K=X.headerHeight;return{get totalEntries(){return J},get groupCount(){return Q.length},get groups(){return Q},getEntry:(O)=>{if(Q.length===0)return{type:"item",dataIndex:O,group:{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0}};let T=G2(Q,O),G=Q[T];if(O===G.headerLayoutIndex)return{type:"header",group:G};let L=O-G.headerLayoutIndex-1;return{type:"item",dataIndex:G.firstDataIndex+L,group:G}},layoutToDataIndex:(O)=>{if(Q.length===0)return O;let T=G2(Q,O),G=Q[T];if(O===G.headerLayoutIndex)return-1;let L=O-G.headerLayoutIndex-1;return G.firstDataIndex+L},dataToLayoutIndex:(O)=>{if(Q.length===0)return O;let T=jj(Q,O),G=Q[T],L=O-G.firstDataIndex;return G.headerLayoutIndex+1+L},getGroupAtLayoutIndex:(O)=>{if(Q.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let T=G2(Q,O);return Q[T]},getGroupAtDataIndex:(O)=>{if(Q.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let T=jj(Q,O);return Q[T]},getHeaderHeight:typeof K==="number"?(O)=>K:(O)=>{let T=Q[O];if(!T)return 0;return K(T.key,O)},rebuild:(O)=>{Q=Jj(O,X.getGroupForIndex),J=O+Q.length}}};var Q2=(j,X,Q,J,K,q=!1)=>{let Y=document.createElement("div");if(Y.className=`${K}-sticky-header`,Y.setAttribute("role","presentation"),Y.setAttribute("aria-hidden","true"),Y.style.position="absolute",Y.style.zIndex="5",Y.style.pointerEvents="none",Y.style.willChange="transform",Y.style.overflow="hidden",q)Y.style.top="0",Y.style.bottom="0",Y.style.left="0";else Y.style.top="0",Y.style.left="0",Y.style.right="0";j.insertBefore(Y,j.firstChild);let B=-1,V=!1,Z=0,D=(M)=>{if(M===B)return;B=M;let y=X.groups;if(M<0||M>=y.length){Y.textContent="";return}let P=y[M],$=J.headerTemplate(P.key,P.groupIndex),_=X.getHeaderHeight(M);if(q)Y.style.width=`${_}px`;else Y.style.height=`${_}px`;if(typeof $==="string")Y.innerHTML=$;else Y.replaceChildren($)},A=(M)=>{let y=X.groups;if(y.length===0){T();return}let P=0;for(let E=y.length-1;E>=0;E--)if(Q.getOffset(y[E].headerLayoutIndex)<=M){P=E;break}let $=Q.getOffset(y[0].headerLayoutIndex);if(M<$){T();return}if(!V)O();D(P);let _=X.getHeaderHeight(P),U=0,W=P+1;if(W<y.length){let b=Q.getOffset(y[W].headerLayoutIndex)-M;if(b<_)U=b-_}if(U!==Z)if(Z=U,U===0)Y.style.transform="";else{let E=Math.round(U);Y.style.transform=q?`translateX(${E}px)`:`translateY(${E}px)`}},O=()=>{if(V)return;V=!0,Y.style.display=""},T=()=>{if(!V)return;V=!1,Y.style.display="none",B=-1,Z=0,Y.style.transform=""},G=()=>{let M=B;if(B=-1,M>=0)D(M)},L=()=>{Y.remove(),B=-1,V=!1};return Y.style.display="none",{update:A,refresh:G,show:O,hide:T,destroy:L}};var Qj=(j,X,Q,J,K,q)=>{if(J===0||X===0)return q.start=0,q.end=-1,q;let Y=Q.indexAtOffset(j),B=Q.indexAtOffset(j+X);if(B<J-1)B++;return q.start=Math.max(0,Y),q.end=Math.min(J-1,Math.max(0,B)),q},Xj=(j,X,Q,J)=>{if(Q===0)return J.start=0,J.end=-1,J;return J.start=Math.max(0,j.start-X),J.end=Math.min(Q-1,j.end+X),J},qj=(j,X,Q,J,K,q)=>{if(J===0)return 0;let Y=Math.max(0,Math.min(j,J-1)),B=X.getOffset(Y),V=X.getSize(Y),Z=X.getTotalSize(),D=Math.max(0,Z-Q),A;switch(q){case"center":A=B-Q/2+V/2;break;case"end":A=B-Q+V;break;case"start":default:A=B;break}return Math.max(0,Math.min(A,D))},Yj=(j,X,Q)=>{if(Q&&Q.isCompressed)return Q.virtualSize;return X.getTotalSize()},Kj=(j,X)=>{return X.getTotalSize()},Zj=(j,X)=>{return X.getOffset(j)},Bj=(j,X,Q)=>{let J=Math.max(0,X-Q);return Math.max(0,Math.min(j,J))};var T0=(j,X,Q,J,K="start",q,Y=qj)=>{return Y(j,X,Q,J,q,K)},Uj=(j,X)=>{return j.start===X.start&&j.end===X.end},Nj=(j,X)=>{return j>=X.start&&j<=X.end},Dj=(j)=>{if(j.end<j.start)return 0;return j.end-j.start+1};var Wj=(j,X)=>{let Q=[],J=[];for(let K=j.start;K<=j.end;K++)if(K<X.start||K>X.end)J.push(K);for(let K=X.start;K<=X.end;K++)if(K<j.start||K>j.end)Q.push(K);return{add:Q,remove:J}};r0();var _j=(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 X=null,Q=null,J=[],K=[];return{name:"withSections",priority:10,setup(q){let{dom:Y,config:B,rawConfig:V}=q,{classPrefix:Z}=B,A=V.item.height;J=V.items?[...V.items]:[];let O=J.length,T={getGroupForIndex:j.getGroupForIndex,headerHeight:j.headerHeight,headerTemplate:j.headerTemplate,sticky:j.sticky??!1};X=J2(O,T),K=h0(J,X.groups);let G=u0(X,A);q.setSizeConfig(G),q.rebuildSizeCache(K.length),q.dataManager.setItems(K,0,K.length);let L=V.item.template,{headerTemplate:M}=j,y=(b,w,h)=>{if(P0(b))return M(b.groupKey,b.groupIndex);return L(b,w,h)},P=q.methods.get("_getGridLayout"),$=q.methods.get("_replaceGridRenderer"),_=q.methods.get("_updateGridLayoutForGroups");if(P&&$){if(_)_((N)=>{let z=K[N];return!!(z&&P0(z))});let{createGridRenderer:b}=(X2(),Cj(Gj)),w=P(),h=b(Y.items,y,q.sizeCache,w,Z,q.getContainerWidth(),()=>q.dataManager.getTotal(),B.ariaIdPrefix);$(h)}else q.replaceTemplate(y);if(Y.root.classList.add(`${Z}--grouped`),j.sticky!==!1){Q=Q2(Y.root,X,q.sizeCache,{...T,sticky:T.sticky??!1},Z,B.horizontal);let b=Q;q.afterScroll.push((w,h)=>{b.update(w)}),Q.update(q.scrollController.getScrollTop())}let U=()=>{if(!X)return;X.rebuild(J.length),K=h0(J,X.groups);let b=u0(X,A);if(q.setSizeConfig(b),q.rebuildSizeCache(K.length),q.dataManager.setItems(K,0,K.length),Q)Q.refresh()};q.methods.set("setItems",(b)=>{J=[...b],U()}),q.methods.set("appendItems",(b)=>{J=[...J,...b],U()}),q.methods.set("prependItems",(b)=>{J=[...b,...J],U()}),q.methods.set("removeItem",(b)=>{J=J.filter((w)=>w.id!==b),U()});let{animateScroll:W,cancelScroll:E}=nj(q.scrollController,q.renderIfNeeded);q.methods.set("scrollToIndex",(b,w)=>{let h=X.dataToLayoutIndex(b),{align:N,behavior:z,duration:g}=oj(w),d=q.dataManager.getTotal(),k=T0(h,q.sizeCache,q.state.viewportState.containerSize,d,N,q.getCachedCompression());if(z==="smooth")W(q.scrollController.getScrollTop(),k,g);else E(),q.scrollController.scrollTo(k)}),q.methods.set("_getItems",()=>J),q.methods.set("_getTotal",()=>J.length),q.destroyHandlers.push(()=>{if(L0!==null)cancelAnimationFrame(L0),L0=null;if(Q)Q.destroy(),Q=null;Y.root.classList.remove(`${Z}--grouped`)})},destroy(){if(Q)Q.destroy(),Q=null}}},_2=300,rj=(j)=>j<0.5?2*j*j:-1+(4-2*j)*j,L0=null,nj=(j,X)=>{let Q=()=>{if(L0!==null)cancelAnimationFrame(L0),L0=null};return{animateScroll:(K,q,Y)=>{if(Q(),Math.abs(q-K)<1){j.scrollTo(q);return}let B=performance.now(),V=(Z)=>{let D=Z-B,A=Math.min(D/Y,1),O=K+(q-K)*rj(A);if(j.scrollTo(O),X(),A<1)L0=requestAnimationFrame(V);else L0=null};L0=requestAnimationFrame(V)},cancelScroll:Q}},oj=(j)=>{if(typeof j==="string")return{align:j,behavior:"auto",duration:_2};if(j&&typeof j==="object")return{align:j.align??"start",behavior:j.behavior??"auto",duration:j.duration??_2};return{align:"start",behavior:"auto",duration:_2}};var q2=(j)=>{let X=Math.max(1,Math.floor(j.columns)),Q=j.gap??0,J=j.isHeaderFn,K={row:0,col:0},q=(G)=>{if(G<=0)return 0;if(!J)return Math.ceil(G/X);let L=0,M=0,y=0;for(let P=0;P<G;P++)if(J(P)){if(y++,M>0)L++,M=0;L++,M=0}else if(M++,M>=X)L++,M=0;if(M>0)L++;return L},Y=(G)=>{return K.row=B(G),K.col=V(G),K},B=(G)=>{if(!J)return Math.floor(G/X);let L=0,M=0;for(let y=0;y<=G;y++)if(J(y)){if(M>0)L++,M=0;if(y===G)return L;L++,M=0}else{if(y===G)return L;if(M++,M>=X)L++,M=0}return console.warn(`⚠️ getRow(${G}) fell through - returning ${L}`),L},V=(G)=>{if(!J)return G%X;if(J(G))return 0;let L=0;for(let M=0;M<=G;M++)if(J(M))L=0;else{if(M===G)return L;if(L++,L>=X)L=0}return L},Z=(G,L,M)=>{if(M<=0)return{start:0,end:-1};if(!J){let U=Math.max(0,G*X),W=Math.min(M-1,(L+1)*X-1);return{start:U,end:W}}let y=-1,P=-1,$=0,_=0;for(let U=0;U<M;U++){if(J(U)){if(_>0)$++,_=0;if($>=G&&$<=L){if(y===-1)y=U;P=U}$++,_=0}else{if($>=G&&$<=L){if(y===-1)y=U;P=U}if(_++,_>=X)$++,_=0}if($>L&&_===0)break}if(y===-1)return{start:0,end:-1};return{start:y,end:P}},D=(G,L,M)=>{if(L<0||L>=X)return-1;let y=G*X+L;if(y<0||y>=M)return-1;return y},A=(G)=>{let L=(X-1)*Q;return Math.max(0,(G-L)/X)};return{get columns(){return X},get gap(){return Q},update:(G)=>{if(G.columns!==void 0)X=Math.max(1,Math.floor(G.columns));if(G.gap!==void 0)Q=G.gap;if(G.isHeaderFn!==void 0)J=G.isHeaderFn},getTotalRows:q,getPosition:Y,getRow:B,getCol:V,getItemRange:Z,getItemIndex:D,getColumnWidth:A,getColumnOffset:(G,L)=>{let M=A(L);return G*(M+Q)}}};X2();var Vj=(j)=>{if(!j.columns||j.columns<1)throw Error("[vlist/builder] withGrid: columns must be a positive integer >= 1");let X=null,Q=null;return{name:"withGrid",priority:10,setup(J){let{dom:K,emitter:q,config:Y,rawConfig:B}=J,{classPrefix:V}=Y;if(Y.horizontal)throw Error("[vlist/builder] withGrid cannot be used with orientation: 'horizontal'");if(Y.reverse)throw Error("[vlist/builder] withGrid cannot be used with reverse: true");let Z=B.items?.some((_)=>_.__groupHeader===!0),D={columns:j.columns,gap:j.gap??0};if(Z)D.isHeaderFn=(_)=>{let U=J.dataManager.getItem(_);return!!(U&&U.__groupHeader===!0)};X=q2(D);let A=X.gap;J.setVirtualTotalFn(()=>{let _=J.dataManager.getTotal();return X.getTotalRows(_)});let O=B.item,T=Y.horizontal?O.width:O.height,G={containerWidth:J.getContainerWidth(),columns:X.columns,gap:X.gap};if(typeof T==="function")J.setSizeConfig((_)=>{let U=G.containerWidth-2,W=(G.columns-1)*G.gap,E=(U-W)/G.columns,b={containerWidth:G.containerWidth,columns:G.columns,gap:G.gap,columnWidth:E,row:X.getRow(_),column:X.getCol(_),totalRows:X.getTotalRows(J.dataManager.getTotal()),totalColumns:G.columns};return T(_,b)+G.gap});else if(A>0)J.setSizeConfig(T+A);J.rebuildSizeCache(),K.root.classList.add(`${V}--grid`);let L=J.getContainerWidth(),M=B.item.template,y=()=>{Q=g0(K.items,M,J.sizeCache,X,V,L,()=>J.dataManager.getTotal(),Y.ariaIdPrefix),J.replaceRenderer(Q)};y(),J.methods.set("_getGridLayout",()=>X),J.methods.set("_getGridConfig",()=>D),J.methods.set("_replaceGridRenderer",(_)=>{Q=_}),J.methods.set("_updateGridLayoutForGroups",(_)=>{X.update({isHeaderFn:_});let U=J.dataManager.getTotal(),W=0;for(let E=0;E<U;E++)if(X.getCol(E)===0){let b=J.sizeCache.getSize(E);W+=b}J.sizeCache.getTotalSize=()=>W,J.dom.content.style.height=`${W}px`,y()}),J.methods.set("updateGrid",(_)=>{if(_.columns!==void 0){if(!Number.isInteger(_.columns)||_.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");D.columns=_.columns}if(_.gap!==void 0){if(_.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");D.gap=_.gap}if(X)X.update(D);let U=J.getContainerWidth();if(G.containerWidth=U,G.columns=D.columns,G.gap=D.gap??0,Q)Q.updateContainerWidth(U);J.rebuildSizeCache(),J.updateContentSize(J.sizeCache.getTotalSize()),J.updateCompressionMode();for(let W=0;W<J.contentSizeHandlers.length;W++)J.contentSizeHandlers[W]();if(Q)Q.clear();J.forceRender()});let P=()=>{if(J.state.isDestroyed)return;let _=J.scrollController.getScrollTop(),U=J.state.viewportState.containerSize,W=J.getVirtualTotal(),E={start:0,end:0};if(W===0||U===0)E.start=0,E.end=0;else{E.start=Math.max(0,J.sizeCache.indexAtOffset(_));let C=J.sizeCache.indexAtOffset(_+U);if(C<W-1)C++;E.end=Math.min(W-1,Math.max(0,C))}let b=Y.overscan??3,w={start:Math.max(0,E.start-b),end:Math.min(W-1,E.end+b)};J.state.viewportState.scrollPosition=_,J.state.viewportState.visibleRange=E,J.state.viewportState.renderRange=w;let h=J.state.lastRenderRange,N=J.state.viewportState.isCompressed;if(w.start===h.start&&w.end===h.end){if(N)Q.updatePositions(J.getCompressionContext());return}let z=J.dataManager.getTotal(),g=X.getItemRange(w.start,w.end,z),d=J.dataManager.getItemsInRange(g.start,g.end),k=N?J.getCompressionContext():void 0;Q.render(d,g,new Set,-1,k),J.state.lastRenderRange={...w},q.emit("range:change",{range:w})},$=()=>{if(J.state.isDestroyed)return;J.state.lastRenderRange={start:-1,end:-1},P()};if(J.setRenderFns(P,$),J.resizeHandlers.push((_,U)=>{if(Q)Q.updateContainerWidth(_)}),J.methods.set("scrollToIndex",(_,U)=>{let W=Math.floor(_/j.columns),{align:E,behavior:b}=ij(U),w=J.dataManager.getState(),h=X.getTotalRows(w.total),N=Math.max(0,Math.min(W,h-1)),z=T0(N,J.sizeCache,J.state.viewportState.containerSize,h,E,J.getCachedCompression());if(b==="smooth")J.scrollController.scrollTo(z);else J.scrollController.scrollTo(z)}),!J.methods.has("_getTotal"))J.methods.set("_getTotal",()=>J.dataManager.getTotal());J.destroyHandlers.push(()=>{if(Q)Q.destroy(),Q=null;K.root.classList.remove(`${V}--grid`)})},destroy(){if(Q)Q.destroy(),Q=null}}},V2=300,ij=(j)=>{if(typeof j==="string")return{align:j,behavior:"auto",duration:V2};if(j&&typeof j==="object")return{align:j.align??"start",behavior:j.behavior??"auto",duration:j.duration??V2};return{align:"start",behavior:"auto",duration:V2}};X2();var Y2=(j)=>({selected:new Set(j??[]),focusedIndex:-1}),x0=(j,X,Q)=>{if(Q==="none")return j;let J=new Set(j.selected);if(Q==="single"){if(J.clear(),X.length>0)J.add(X[0])}else for(let K of X)J.add(K);return{...j,selected:J}},m0=(j,X)=>{let Q=new Set(j.selected);for(let J of X)Q.delete(J);return{...j,selected:Q}},C0=(j,X,Q)=>{if(Q==="none")return j;if(j.selected.has(X))return m0(j,[X]);else return x0(j,[X],Q)},K2=(j,X,Q)=>{if(Q!=="multiple")return j;return{...j,selected:new Set(X.map((J)=>J.id))}},Z2=(j)=>({...j,selected:new Set}),M2=(j,X)=>{return j.focusedIndex=X,j},A2=(j,X,Q=!0)=>{if(X===0)return j;let J=j.focusedIndex-1;if(J<0)J=Q?X-1:0;return j.focusedIndex=J,j},E2=(j,X,Q=!0)=>{if(X===0)return j;let J=j.focusedIndex+1;if(J>=X)J=Q?0:X-1;return j.focusedIndex=J,j},F2=(j,X)=>{if(X===0)return j;return j.focusedIndex=0,j},L2=(j,X)=>{if(X===0)return j;return j.focusedIndex=X-1,j};var Mj=(j,X)=>{return j.selected.has(X)},z0=(j)=>{return Array.from(j.selected)},v0=(j,X)=>{let Q=[];for(let J of j.selected){let K=X(J);if(K)Q.push(K)}return Q};var Aj=(j)=>{let X=j?.mode??"single",Q=j?.initial,J=Y2(Q),K=null;return{name:"withSelection",priority:50,methods:["select","deselect","toggleSelect","selectAll","clearSelection","getSelected","getSelectedItems"],setup(q){let{dom:Y,emitter:B,config:V}=q,{classPrefix:Z,ariaIdPrefix:D}=V;if(X==="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 A=new Map,O=()=>{A.clear();let _=q.dataManager.getTotal();for(let U=0;U<_;U++){let W=q.dataManager.getItem(U);if(W)A.set(W.id,U)}};O();let{renderIfNeeded:T,forceRender:G}=q.getRenderFns(),L=()=>{q.dom.items.querySelectorAll("[data-index]").forEach((U)=>{let W=U,E=W.dataset.id;if(E!==void 0){let b=/^\d+$/.test(E)?parseInt(E,10):E,w=J.selected.has(b),N=parseInt(W.dataset.index??"-1",10)===J.focusedIndex;W.classList.toggle(`${Z}-item--selected`,w),W.classList.toggle(`${Z}-item--focused`,N),W.ariaSelected=w?"true":"false"}})},M=()=>{if(q.state.isDestroyed)return;T(),L()},y=()=>{if(q.state.isDestroyed)return;G(),L()};q.setRenderFns(M,y);let P=()=>{L();let _=(U)=>{let W=A.get(U);if(W===void 0)return;return q.dataManager.getItem(W)};B.emit("selection:change",{selected:z0(J),items:v0(J,_)})};K=document.createElement("div"),K.setAttribute("aria-live","polite"),K.setAttribute("aria-atomic","true"),K.className=`${Z}-live-region`,K.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",Y.root.appendChild(K);let $=K;B.on("selection:change",({selected:_})=>{let U=_.length;if(U===0)$.textContent="";else if(U===1)$.textContent="1 item selected";else $.textContent=`${U} items selected`}),q.clickHandlers.push((_)=>{if(q.state.isDestroyed)return;let W=_.target.closest("[data-index]");if(!W)return;let E=parseInt(W.dataset.index??"-1",10);if(E<0)return;let b=q.dataManager.getItem(E);if(!b)return;B.emit("item:click",{item:b,index:E,event:_}),J=M2(J,E),Y.root.setAttribute("aria-activedescendant",`${D}-item-${E}`),J=C0(J,b.id,X),P()}),q.keydownHandlers.push((_)=>{if(q.state.isDestroyed)return;let U=q.dataManager.getTotal(),W=J.focusedIndex,E=!1,b=!1,w=J;switch(_.key){case"ArrowUp":w=A2(J,U),E=!0,b=!0;break;case"ArrowDown":w=E2(J,U),E=!0,b=!0;break;case"Home":w=F2(J,U),E=!0,b=!0;break;case"End":w=L2(J,U),E=!0,b=!0;break;case" ":case"Enter":if(J.focusedIndex>=0){let h=q.dataManager.getItem(J.focusedIndex);if(h)w=C0(J,h.id,X);E=!0}break}if(E){_.preventDefault(),J=w;let h=J.focusedIndex;if(h>=0){let N=q.dataManager.getState(),z=T0(h,q.sizeCache,q.state.viewportState.containerSize,N.total,"center",q.getCachedCompression());q.scrollController.scrollTo(z),Y.root.setAttribute("aria-activedescendant",`${D}-item-${h}`)}else Y.root.removeAttribute("aria-activedescendant");if(b){let{selected:N}=J;if(W>=0&&W!==h){let z=q.dataManager.getItem(W);if(z)q.renderer.updateItemClasses(W,N.has(z.id),!1)}if(h>=0){let z=q.dataManager.getItem(h);if(z)q.renderer.updateItemClasses(h,N.has(z.id),!0)}}else{y();let N=(z)=>{let g=A.get(z);if(g===void 0)return;return q.dataManager.getItem(g)};B.emit("selection:change",{selected:z0(J),items:v0(J,N)})}}}),q.methods.set("select",(..._)=>{J=x0(J,_,X),P()}),q.methods.set("deselect",(..._)=>{J=m0(J,_),P()}),q.methods.set("toggleSelect",(_)=>{J=C0(J,_,X),P()}),q.methods.set("selectAll",()=>{if(X!=="multiple")return;let _=q.getAllLoadedItems();J=K2(J,_,X),O(),P()}),q.methods.set("clearSelection",()=>{J=Z2(J);let{renderRange:_,isCompressed:U}=q.state.viewportState,W=q.getItemsForRange(_),E=U?q.getCompressionContext():void 0;q.renderer.render(W,_,J.selected,J.focusedIndex,E),B.emit("selection:change",{selected:[],items:[]})}),q.methods.set("getSelected",()=>{return z0(J)}),q.methods.set("getSelectedItems",()=>{return v0(J,(U)=>{let W=A.get(U);if(W===void 0)return;return q.dataManager.getItem(W)})}),q.destroyHandlers.push(()=>{if($&&$.parentNode)$.remove()})},destroy(){if(K&&K.parentNode)K.remove();K=null}}};var Ej=()=>{return{name:"withSnapshots",priority:50,methods:["getScrollSnapshot","restoreScroll"],setup(j){j.methods.set("getScrollSnapshot",()=>{let X=j.scrollController.getScrollTop(),Q=j.getCachedCompression(),J=j.getVirtualTotal(),K=j.methods.get("getSelected"),q=K&&K().length>0?K():void 0;if(J===0){let Z={index:0,offsetInItem:0};if(q)Z.selectedIds=q;return Z}let Y,B;if(Q.isCompressed){let D=X/Q.virtualSize*J;Y=Math.max(0,Math.min(Math.floor(D),J-1)),B=(D-Y)*j.sizeCache.getSize(Y)}else Y=j.sizeCache.indexAtOffset(X),B=X-j.sizeCache.getOffset(Y);B=Math.max(0,B);let V={index:Y,offsetInItem:B};if(q)V.selectedIds=q;return V}),j.methods.set("restoreScroll",(X)=>{let{index:Q,offsetInItem:J,selectedIds:K}=X,q=j.getCachedCompression(),Y=j.getVirtualTotal();if(Y===0)return;let B=Math.max(0,Math.min(Q,Y-1)),V;if(q.isCompressed){let D=j.sizeCache.getSize(B),A=D>0?J/D:0;V=(B+A)/Y*q.virtualSize}else V=j.sizeCache.getOffset(B)+J;let Z=Math.max(0,q.virtualSize-j.state.viewportState.containerSize);if(V=Math.max(0,Math.min(V,Z)),j.scrollController.scrollTo(V),K&&K.length>0){let D=j.methods.get("select");if(D)D(...K)}})}}};export{Ej as withSnapshots,Aj as withSelection,_j as withSections,r2 as withScrollbar,i2 as withScale,e2 as withPage,Vj as withGrid,t2 as withAsync,u2 as vlist,C0 as toggleSelection,Qj as simpleVisibleRange,x0 as selectItems,K2 as selectAll,Uj as rangesEqual,o0 as rafThrottle,l2 as needsScaling,t0 as mergeRanges,Mj as isSelected,P0 as isSectionHeader,H0 as isPlaceholderItem,Nj as isInRange,v0 as getSelectedItems,z0 as getSelectedIds,V0 as getScaleState,s2 as getScaleInfo,V0 as getScale,Dj as getRangeCount,a2 as getMaxItemsWithoutScaling,W2 as filterPlaceholders,Wj as diffRanges,m0 as deselectItems,Q2 as createStickyHeader,i0 as createSparseStorage,$0 as createSizeCache,Y2 as createSelectionState,u0 as createSectionedSizeFn,J2 as createSectionLayout,k0 as createScrollbar,o2 as createScrollController,e0 as createPlaceholderManager,g0 as createGridRenderer,q2 as createGridLayout,l0 as createEmitter,j2 as createAsyncManager,Z2 as clearSelection,Bj as clampScrollPosition,Yj as calculateTotalSize,T0 as calculateScrollToIndex,a0 as calculateScaledVisibleRange,s0 as calculateScaledScrollToIndex,d2 as calculateScaledRenderRange,R0 as calculateScaledItemPosition,Xj as calculateRenderRange,p0 as calculateMissingRanges,Zj as calculateItemOffset,c2 as calculateIndexFromScrollPosition,Kj as calculateActualSize,h0 as buildLayoutItems,y0 as MAX_VIRTUAL_HEIGHT};
|
|
1
|
+
var{defineProperty:U2,getOwnPropertyNames:Rj,getOwnPropertyDescriptor:kj}=Object,Cj=Object.prototype.hasOwnProperty;var H2=new WeakMap,zj=(j)=>{var X=H2.get(j),Q;if(X)return X;if(X=U2({},"__esModule",{value:!0}),j&&typeof j==="object"||typeof j==="function")Rj(j).map((J)=>!Cj.call(X,J)&&U2(X,J,{get:()=>j[J],enumerable:!(Q=kj(j,J))||Q.enumerable}));return H2.set(j,X),X};var vj=(j,X)=>{for(var Q in X)U2(j,Q,{get:X[Q],enumerable:!0,configurable:!0,set:(J)=>X[Q]=()=>J})};var P2=(j,X)=>()=>(j&&(X=j(j=0)),X);var wj=(j,X)=>{let Q=X;return{getOffset:(J)=>J*j,getSize:(J)=>j,indexAtOffset:(J)=>{if(Q===0||j===0)return 0;return Math.max(0,Math.min(Math.floor(J/j),Q-1))},getTotalSize:()=>Q*j,getTotal:()=>Q,rebuild:(J)=>{Q=J},isVariable:()=>!1}},Sj=(j,X)=>{let Q=X,J=new Float64Array(0),K=(Y)=>{Q=Y,J=new Float64Array(Y+1),J[0]=0;for(let B=0;B<Y;B++)J[B+1]=J[B]+j(B)};K(X);let q=(Y)=>{if(Q===0)return 0;if(Y<=0)return 0;if(Y>=J[Q])return Q-1;let B=0,E=Q-1;while(B<E){let Z=B+E+1>>>1;if(J[Z]<=Y)B=Z;else E=Z-1}return B};return{getOffset:(Y)=>{if(Y<=0)return 0;if(Y>=Q)return J[Q];return J[Y]},getSize:(Y)=>j(Y),indexAtOffset:(Y)=>q(Y),getTotalSize:()=>J[Q]??0,getTotal:()=>Q,rebuild:(Y)=>K(Y),isVariable:()=>!0}},R0=(j,X)=>{if(typeof j==="number")return wj(j,X);return Sj(j,X)},I0=(j,X,Q,J)=>{if(J===0)return 0;if(!j.isVariable())return Math.ceil(Q/j.getSize(0));let K=0,q=0,Y=X;while(Y<J&&q<Q)q+=j.getSize(Y),K++,Y++;return Math.max(1,K)},l0=(j,X,Q)=>{if(Q===0)return 0;if(!j.isVariable())return Math.floor(X/j.getSize(0));let J=0,K=0;for(let q=Q-1;q>=0;q--){let Y=j.getSize(q);if(K+Y>X)break;K+=Y,J++}return Math.max(J,1)},D2=(j,X,Q)=>{if(Q===0)return 0;let J=Math.floor(X),K=X-J,q=Math.max(0,Math.min(J,Q-1));return j.getOffset(q)+K*j.getSize(q)};var W2=200,p0=50,x2=15,m2=2,d2=50,H0=16000000;var M0=(j,X)=>{let Q=X.getTotalSize(),J=Q>H0,K=J?H0:Q,q=Q>0?K/Q:1;return{isCompressed:J,actualSize:Q,virtualSize:K,ratio:q}},s0=(j,X,Q,J,K,q)=>{if(J===0||X===0)return q.start=0,q.end=-1,q;if(!K.isCompressed){let G=Q.indexAtOffset(j),L=Q.indexAtOffset(j+X);if(L<J-1)L++;return q.start=Math.max(0,G),q.end=Math.min(J-1,Math.max(0,L)),q}let{virtualSize:Y}=K,E=j/Y*J,Z=Math.floor(E),D=I0(Q,Math.max(0,Z),X,J),V=Math.ceil(E)+D,P=Y-X-j;if(P<=X&&P>=-1){let G=l0(Q,X,J),L=Math.max(0,J-G),A=Math.max(0,Math.min(1,1-P/X));Z=Math.floor(Z+(L-Z)*A),V=P<=1?J-1:Math.min(J-1,Z+D)}return q.start=Math.max(0,Z),q.end=Math.min(J-1,Math.max(0,V)),q},c2=(j,X,Q,J)=>{if(Q===0)return J.start=0,J.end=-1,J;return J.start=Math.max(0,j.start-X),J.end=Math.min(Q-1,j.end+X),J},k0=(j,X,Q,J,K,q,Y)=>{if(!q.isCompressed||J===0)return Q.getOffset(j);let{virtualSize:B}=q,E=B-K,Z=E-X;if(Z<=K&&Z>=-1){if(X>=E-1){let _=Q.getTotalSize()-Q.getOffset(j);return K-_}let P=l0(Q,K,J),G=Math.max(0,J-P),A=X/B*J,b=Math.max(0,Math.min(1,1-Z/K)),H=Q.getOffset(j)-Q.getOffset(G),T=Q.getOffset(j)-D2(Q,A,J);return T+(H-T)*b}let D=X/B,V=Q.getTotalSize(),O=D*V;return Q.getOffset(j)-O},r0=(j,X,Q,J,K,q="start")=>{if(J===0)return 0;let Y;if(K.isCompressed){if(q==="end"&&j===J-1)return Math.max(0,K.virtualSize-Q);Y=j/J*K.virtualSize}else Y=X.getOffset(j);let B=X.getSize(j);switch(q){case"center":Y-=(Q-B)/2;break;case"end":Y-=Q-B;break}let E=K.virtualSize-Q;return Math.max(0,Math.min(Y,E))},l2=(j,X,Q,J)=>{if(Q===0)return 0;if(J.isCompressed){let K=j/J.virtualSize;return Math.floor(K*Q)}return X.indexAtOffset(j)},a2=(j,X)=>{if(typeof X==="number")return j*X>H0;return X.getTotalSize()>H0},s2=(j)=>{if(j<=0)return 0;return Math.floor(H0/j)},r2=(j,X)=>{let Q=M0(j,X);if(!Q.isCompressed)return`No compression needed (${j} items, ${(Q.actualSize/1e6).toFixed(2)}M px)`;return`Compressed to ${(Q.ratio*100).toFixed(1)}% (${j} items, ${(Q.actualSize/1e6).toFixed(1)}M px → ${(Q.virtualSize/1e6).toFixed(1)}M px virtual)`};var n0=()=>{};var T0=(j)=>{return j!==null&&typeof j==="object"&&j.__groupHeader===!0};var _j={};vj(_j,{createGridRenderer:()=>x0});var rj=(j=200)=>{let X=[];return{acquire:()=>{let q=X.pop();if(q)return q;let Y=document.createElement("div");return Y.setAttribute("role","option"),Y},release:(q)=>{if(X.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"),X.push(q)},clear:()=>{X.length=0}}},x0=(j,X,Q,J,K,q,Y,B,E=!1)=>{let Z=rj(),D=new Map,V=q,O=!1,P=null,G=0,L="",A=(R)=>{if(P&&G===R)return P;return P=M0(R,Q),G=R,P},b={selected:!1,focused:!1},H=(R,S)=>{return b.selected=R,b.focused=S,b},T=`${K}-item ${K}-grid-item`,_=`${K}-item--selected`,U=`${K}-item--focused`,W=(R,S)=>{if(typeof S==="string")R.innerHTML=S;else R.replaceChildren(S)},M=(R,S,c)=>{R.classList.toggle(_,S),R.classList.toggle(U,c)},y=(R,S)=>{let c=J.getRow(R);if(S){let n=S.totalItems,o=A(n);if(o.isCompressed)return k0(c,S.scrollPosition,Q,n,S.containerSize,o,S.rangeStart)}return Q.getOffset(c)},z=(R,S,c)=>{let n=R.dataset.id?.startsWith("__group_header"),o=n?0:J.getCol(S),t=n?0:J.getColumnOffset(o,V),j0;if(O){let v=J.getRow(S),u=0,a=new Set;for(let q0=0;q0<S;q0++){let s=J.getRow(q0);if(s<v&&!a.has(s)){let W0=Q.getSize(q0);u+=W0,a.add(s)}}j0=u}else j0=y(S,c);if(E)R.style.transform=`translate(${Math.round(j0)}px, ${Math.round(t)}px)`;else R.style.transform=`translate(${Math.round(t)}px, ${Math.round(j0)}px)`},f=(R,S)=>{let c=R.dataset.id?.startsWith("__group_header"),n=c?V:J.getColumnWidth(V),o;if(O||c)o=Q.getSize(S)-J.gap;else{let t=J.getRow(S);o=Q.getSize(t)-J.gap}R.style.width=`${n}px`,R.style.height=`${o}px`},N=(R,S,c,n,o)=>{let t=Z.acquire(),j0=H(c,n);if(t.className=T,t.dataset.index=String(R),t.dataset.id=String(S.id),t.dataset.row=String(J.getRow(R)),t.dataset.col=String(J.getCol(R)),t.ariaSelected=String(c),B)t.id=`${B}-item-${R}`;if(Y)L=String(Y()),t.setAttribute("aria-setsize",L),t.setAttribute("aria-posinset",String(R+1));f(t,R);let v=X(S,R,j0);return W(t,v),M(t,c,n),z(t,R,o),t},C=(R,S,c,n,o)=>{if(S.start===0&&R.length>0)O=T0(R[0]);for(let[u,a]of D)if(u<S.start||u>S.end)a.element.remove(),Z.release(a.element),D.delete(u);let t=!1;if(Y){let u=String(Y());t=u!==L,L=u}let j0=document.createDocumentFragment(),v=[];for(let u=S.start;u<=S.end;u++){let a=u-S.start,q0=R[a];if(!q0){console.warn(`⚠️ RENDER: Missing item at index ${u} (range: ${S.start}-${S.end}, items.length: ${R.length})`);continue}let s=c.has(q0.id),W0=u===n,Y0=D.get(u);if(Y0){let w=Y0.element.dataset.id,g=String(q0.id);if(w!==g){let J0=H(s,W0),K0=X(q0,u,J0);W(Y0.element,K0),Y0.element.dataset.id=g,Y0.element.dataset.row=String(J.getRow(u)),Y0.element.dataset.col=String(J.getCol(u)),f(Y0.element,u)}if(M(Y0.element,s,W0),Y0.element.ariaSelected=String(s),z(Y0.element,u,o),t)Y0.element.setAttribute("aria-setsize",L)}else{let w=N(u,q0,s,W0,o);j0.appendChild(w),v.push({index:u,element:w})}}if(v.length>0){j.appendChild(j0);for(let{index:u,element:a}of v)D.set(u,{index:u,element:a})}},x=(R)=>{for(let[S,c]of D)z(c.element,S,R)},d=(R,S,c,n)=>{let o=D.get(R);if(o){let t=H(c,n),j0=X(S,R,t);W(o.element,j0),M(o.element,c,n),o.element.dataset.id=String(S.id),o.element.ariaSelected=String(c),f(o.element,R)}},$=(R,S,c)=>{let n=D.get(R);if(n)M(n.element,S,c)},k=(R)=>{return D.get(R)?.element},h=(R)=>{if(Math.abs(R-V)<1)return;V=R;for(let[S,c]of D)f(c.element,S),z(c.element,S)},I=()=>{for(let[,R]of D)R.element.remove(),Z.release(R.element);D.clear()};return{render:C,updatePositions:x,updateItem:d,updateItemClasses:$,getElement:k,updateContainerWidth:h,clear:I,destroy:()=>{I(),Z.clear()}}};var q2=P2(()=>{n0()});var T2=2,$2=(j=0)=>{let X=[,,,,,];for(let Q=0;Q<5;Q++)X[Q]={position:0,time:0};return{velocity:0,lastPosition:j,lastTime:performance.now(),samples:X,sampleIndex:0,sampleCount:0}},N2=(j,X)=>{let Q=performance.now(),J=Q-j.lastTime;if(J===0)return j;if(J>100){j.sampleCount=0,j.sampleIndex=0,j.velocity=0;let q=j.samples[0];return q.position=X,q.time=Q,j.sampleIndex=1,j.sampleCount=1,j.lastPosition=X,j.lastTime=Q,j}let K=j.samples[j.sampleIndex];if(K.position=X,K.time=Q,j.sampleIndex=(j.sampleIndex+1)%5,j.sampleCount=Math.min(j.sampleCount+1,5),j.sampleCount>=2){let q=(j.sampleIndex-j.sampleCount+5)%5,Y=j.samples[q],B=X-Y.position,E=Q-Y.time;j.velocity=E>0?Math.abs(B)/E:0}return j.lastPosition=X,j.lastTime=Q,j};var a0=()=>{let j={},X=(B,E)=>{if(!j[B])j[B]=new Set;return j[B].add(E),()=>Q(B,E)},Q=(B,E)=>{j[B]?.delete(E)};return{on:X,off:Q,emit:(B,E)=>{j[B]?.forEach((Z)=>{try{Z(E)}catch(D){console.error(`[vlist] Error in event handler for "${String(B)}":`,D)}})},once:(B,E)=>{let Z=(D)=>{Q(B,Z),E(D)};return X(B,Z)},clear:(B)=>{if(B)delete j[B];else for(let E in j)delete j[E]},listenerCount:(B)=>{return j[B]?.size??0}}};var R2=(j)=>{if(typeof j==="string"){let X=document.querySelector(j);if(!X)throw Error(`[vlist/builder] Container not found: ${j}`);return X}return j},k2=(j,X,Q,J)=>{let K=document.createElement("div");if(K.className=X,J)K.classList.add(`${X}--horizontal`);if(K.setAttribute("role","listbox"),K.setAttribute("tabindex","0"),Q)K.setAttribute("aria-label",Q);if(J)K.setAttribute("aria-orientation","horizontal");let q=document.createElement("div");if(q.className=`${X}-viewport`,J)q.style.overflowX="auto",q.style.overflowY="hidden";else q.style.overflow="auto";q.style.height="100%",q.style.width="100%";let Y=document.createElement("div");if(Y.className=`${X}-content`,Y.style.position="relative",J)Y.style.height="100%";else Y.style.width="100%";let B=document.createElement("div");if(B.className=`${X}-items`,B.style.position="relative",J)B.style.height="100%";else B.style.width="100%";return Y.appendChild(B),q.appendChild(Y),K.appendChild(q),j.appendChild(K),{root:K,viewport:q,content:Y,items:B}};var C2=(j=100)=>{let X=[];return{acquire:()=>{let Q=X.pop();if(Q)return Q;let J=document.createElement("div");return J.setAttribute("role","option"),J},release:(Q)=>{if(X.length<j)Q.className="",Q.textContent="",Q.removeAttribute("style"),Q.removeAttribute("data-index"),Q.removeAttribute("data-id"),X.push(Q)},clear:()=>{X.length=0}}};var z2=(j,X,Q,J,K)=>{if(J===0||X===0){K.start=0,K.end=0;return}let q=Q.indexAtOffset(j),Y=I0(Q,q,X,J),B=q+Y;K.start=Math.max(0,q),K.end=Math.min(J-1,Math.max(0,B))},v2=(j,X,Q,J)=>{if(Q===0){J.start=0,J.end=0;return}J.start=Math.max(0,j.start-X),J.end=Math.min(Q-1,j.end+X)},w2=(j,X,Q,J,K)=>{if(J===0)return 0;let q=Math.max(0,Math.min(j,J-1)),Y=X.getOffset(q),B=X.getSize(q),E=Math.max(0,X.getTotalSize()-Q),Z;switch(K){case"center":Z=Y-(Q-B)/2;break;case"end":Z=Y-Q+B;break;default:Z=Y}return Math.max(0,Math.min(Z,E))};var S2=(j)=>j<0.5?2*j*j:-1+(4-2*j)*j,f2=(j)=>{if(typeof j==="string")return{align:j,behavior:"auto",duration:300};if(j&&typeof j==="object")return{align:j.align??"start",behavior:j.behavior??"auto",duration:j.duration??300};return{align:"start",behavior:"auto",duration:300}};var I2=(j,X)=>{let{dom:Q,emitter:J,resolvedConfig:K,rawConfig:q,rendered:Y,pool:B,sharedState:E,isHorizontal:Z,classPrefix:D,contentSizeHandlers:V,afterScroll:O,clickHandlers:P,keydownHandlers:G,resizeHandlers:L,destroyHandlers:A,methods:b,onScrollFrame:H,resizeObserver:T,renderRange:_}=X;return{get dom(){return Q},get sizeCache(){return j.hc},get emitter(){return J},get config(){return K},get rawConfig(){return q},get renderer(){return{render:(U,W,M,y,z)=>{j.ss=M,j.fi=y,j.ffn()},updateItemClasses:(U,W,M)=>{let y=Y.get(U);if(!y)return;y.classList.toggle(`${D}-item--selected`,W),y.classList.toggle(`${D}-item--focused`,M),y.ariaSelected=W?"true":"false"},updatePositions:()=>{},updateItem:()=>{},getElement:(U)=>Y.get(U)??null,clear:()=>{},destroy:()=>{}}},set renderer(U){},get dataManager(){return j.dm},set dataManager(U){j.dm=U},get scrollController(){return j.sc},set scrollController(U){j.sc=U},state:E,getContainerWidth(){return j.cw},afterScroll:O,clickHandlers:P,keydownHandlers:G,resizeHandlers:L,contentSizeHandlers:V,destroyHandlers:A,methods:b,replaceTemplate(U){j.at=U},replaceRenderer(U){},replaceDataManager(U){j.dm=U},replaceScrollController(U){j.sc=U},getItemsForRange(U){let{dm:W,it:M}=j,y=[];for(let z=U.start;z<=U.end;z++){let f=W?W.getItem(z):M[z];if(f)y.push(f)}return y},getAllLoadedItems(){let U=j.dm;if(U){let W=U.getTotal(),M=[];for(let y=0;y<W;y++){let z=U.getItem(y);if(z)M.push(z)}return M}return[...j.it]},getVirtualTotal(){return j.vtf()},getCachedCompression(){let U=j.hc;return{isCompressed:!1,actualSize:U.getTotalSize(),virtualSize:U.getTotalSize(),ratio:1}},getCompressionContext(){return{scrollPosition:j.ls,totalItems:j.vtf(),containerSize:j.ch,rangeStart:_.start}},renderIfNeeded(){j.rfn()},forceRender(){j.ffn()},invalidateRendered(){for(let[,U]of Y)U.remove(),B.release(U);Y.clear()},getRenderFns(){return{renderIfNeeded:j.rfn,forceRender:j.ffn}},setRenderFns(U,W){j.rfn=U,j.ffn=W},setVirtualTotalFn(U){j.vtf=U},rebuildSizeCache(U){j.hc.rebuild(U??j.vtf())},setSizeConfig(U){j.hc=R0(U,j.vtf())},updateContentSize(U){let W=`${U}px`;if(Z)Q.content.style.width=W;else Q.content.style.height=W},updateCompressionMode(){},setVisibleRangeFn(U){j.gvr=U},setScrollToPosFn(U){j.gsp=U},setPositionElementFn(U){j.pef=U},setScrollFns(U,W){j.sgt=U,j.sst=(M)=>{W(M),H()}},setScrollTarget(U){j.st.removeEventListener("scroll",H),j.st=U,j.st.addEventListener("scroll",H,{passive:!0})},getScrollTarget(){return j.st},setContainerDimensions(U){j.gcw=U.width,j.gch=U.height,j.cw=U.width(),j.ch=U.height(),E.viewportState.containerSize=j.ch},disableViewportResize(){if(j.vre)j.vre=!1,T.unobserve(Q.viewport)}}},p2=(j,X,Q)=>{let{rendered:J,itemState:K,contentSizeHandlers:q,applyTemplate:Y,updateContentSize:B}=X,E=()=>{j.hc.rebuild(j.vtf()),B(),Q.updateCompressionMode();for(let Z=0;Z<q.length;Z++)q[Z]();j.ffn()};return{getState:()=>({total:j.it.length,cached:j.it.length,isLoading:!1,pendingRanges:[],error:void 0,hasMore:!1,cursor:void 0}),getTotal:()=>j.it.length,getCached:()=>j.it.length,getIsLoading:()=>!1,getHasMore:()=>!1,getStorage:()=>null,getPlaceholders:()=>null,getItem:(Z)=>j.it[Z],isItemLoaded:(Z)=>Z>=0&&Z<j.it.length&&j.it[Z]!==void 0,getItemsInRange:(Z,D)=>{let V=j.it,O=[],P=Math.max(0,Z),G=Math.min(D,V.length-1);for(let L=P;L<=G;L++)O.push(V[L]);return O},setTotal:(Z)=>{},setItems:(Z,D=0,V)=>{let O=j.it;if(D===0&&(V!==void 0||O.length===0))j.it=Z;else{let P=D+Z.length;if(O.length<P)O.length=P;for(let G=0;G<Z.length;G++)O[D+G]=Z[G]}if(j.ii)E()},updateItem:(Z,D)=>{let V=j.it;if(Z<0||Z>=V.length)return!1;let O=V[Z];if(!O)return!1;V[Z]={...O,...D};let P=J.get(Z);if(P)Y(P,j.at(V[Z],Z,K)),P.dataset.id=String(V[Z].id);return!0},removeItem:(Z)=>{if(Z<0||Z>=j.it.length)return!1;if(j.it.splice(Z,1),j.ii)E();return!0},loadRange:async()=>{},ensureRange:async()=>{},loadInitial:async()=>{},loadMore:async()=>!1,reload:async()=>{},evictDistant:()=>{},clear:()=>{j.it=[]},reset:()=>{if(j.it=[],j.ii)j.hc.rebuild(0),B(),j.ffn()}}},h2=(j,X)=>{let{dom:Q,classPrefix:J}=X;return{getScrollTop:()=>j.sgt(),scrollTo:(K)=>{j.sst(K),j.ls=K,j.rfn()},scrollBy:(K)=>{let q=j.sgt()+K;j.sst(q),j.ls=q,j.rfn()},isAtTop:()=>j.ls<=2,isAtBottom:(K=2)=>j.sab(K),getScrollPercentage:()=>{let K=j.hc.getTotalSize(),q=Math.max(0,K-j.ch);return q>0?j.ls/q:0},getVelocity:()=>j.vt.velocity,isTracking:()=>j.vt.sampleCount>=2,isScrolling:()=>Q.root.classList.contains(`${J}--scrolling`),updateConfig:()=>{},enableCompression:()=>{j.sic=!0},disableCompression:()=>{j.sic=!1},isCompressed:()=>j.sic,isWindowMode:()=>!1,updateContainerHeight:(K)=>{j.ch=K},destroy:()=>{}}};var fj=3,Ij="vlist",u2=150,pj=0,g2=(j)=>{if(!j.container)throw Error("[vlist/builder] Container is required");if(!j.item)throw Error("[vlist/builder] item configuration is required");let X=j.orientation==="horizontal",Q=X?"width":"height",J=X?j.item.width:j.item.height;if(J==null)throw Error(`[vlist/builder] item.${Q} is required${X?" when orientation is 'horizontal'":""}`);if(typeof J==="number"&&J<=0)throw Error(`[vlist/builder] item.${Q} must be a positive number`);if(typeof J!=="number"&&typeof J!=="function")throw Error(`[vlist/builder] item.${Q} must be a number or a function (index) => number`);if(!j.item.template)throw Error("[vlist/builder] item.template is required");if(X&&j.reverse)throw Error("[vlist/builder] horizontal direction cannot be combined with reverse mode");let K=new Map,q=!1,Y={use(B){if(q)throw Error("[vlist/builder] Cannot call .use() after .build()");return K.set(B.name,B),Y},build(){if(q)throw Error("[vlist/builder] .build() can only be called once");return q=!0,hj(j,K,X,J)}};return Y};function hj(j,X,Q,J){let{item:K,items:q,overscan:Y=fj,classPrefix:B=Ij,ariaLabel:E,reverse:Z=!1,scroll:D}=j,V=D?.wheel??!0,O=D?.wrap??!1,P=Z,G=`${B}-${pj++}`,L=J,A=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||navigator.maxTouchPoints&&navigator.maxTouchPoints>2,b=Q?typeof K.height==="number"?K.height:void 0:typeof K.width==="number"?K.width:void 0,H={overscan:Y,classPrefix:B,reverse:P,wrap:O,horizontal:Q,ariaIdPrefix:G},T=Array.from(X.values()).sort((F,p)=>(F.priority??50)-(p.priority??50)),_=new Set(T.map((F)=>F.name));for(let F of T)if(F.conflicts){for(let p of F.conflicts)if(_.has(p))throw Error(`[vlist/builder] ${F.name} and ${p} cannot be combined`)}if(P){if(_.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with reverse: true")}let U=R2(j.container),W=k2(U,B,E,Q),M=a0(),y=q||[],z=R0(L,y.length),f=C2(),N={it:y,hc:z,ch:W.viewport.clientHeight,cw:W.viewport.clientWidth,id:!1,ii:!1,ls:0,vt:$2(0),ss:new Set,fi:-1,la:"",dm:null,sc:null,vtf:null,sgt:Q?()=>W.viewport.scrollLeft:()=>W.viewport.scrollTop,sst:Q?(F)=>{W.viewport.scrollLeft=F}:(F)=>{W.viewport.scrollTop=F},sab:(F=2)=>{let p=N.hc.getTotalSize();return N.ls+N.ch>=p-F},sic:!1,rfn:null,ffn:null,gvr:(F,p,m,r,Q0)=>{z2(F,p,m,r,Q0)},gsp:(F,p,m,r,Q0)=>{return w2(F,p,m,r,Q0)},pef:null,at:K.template,vre:!0,st:W.viewport,gcw:()=>N.cw,gch:()=>N.ch};N.vtf=()=>N.dm?N.dm.getTotal():N.it.length;let C=null,x=null,d={start:0,end:0},$={start:0,end:0},k={start:-1,end:-1},h={viewportState:{scrollPosition:0,containerSize:N.ch,totalSize:N.hc.getTotalSize(),actualSize:N.hc.getTotalSize(),isCompressed:!1,compressionRatio:1,visibleRange:{start:0,end:0},renderRange:{start:0,end:0}},lastRenderRange:{start:-1,end:-1},isInitialized:!1,isDestroyed:!1,cachedCompression:null},I=new Map,l={selected:!1,focused:!1},R=`${B}-item`,S=[],c=[],n=[],o=[],t=[],j0=[],v=new Map,u=(F,p)=>{if(typeof p==="string")F.innerHTML=p;else F.replaceChildren(p)},a=(F,p)=>{let m=Math.round(N.hc.getOffset(p));if(Q)F.style.transform=`translateX(${m}px)`;else F.style.transform=`translateY(${m}px)`};N.pef=a;let q0=(F,p)=>{let m=f.acquire();if(m.className=R,Q){if(m.style.width=`${N.hc.getSize(F)}px`,b!=null)m.style.height=`${b}px`}else m.style.height=`${N.hc.getSize(F)}px`;if(m.dataset.index=String(F),m.dataset.id=String(p.id),m.ariaSelected="false",m.id=`${G}-item-${F}`,N.la=String(N.vtf()),m.setAttribute("aria-setsize",N.la),m.setAttribute("aria-posinset",String(F+1)),String(p.id).startsWith("__placeholder_"))m.classList.add(`${B}-item--placeholder`);return u(m,N.at(p,F,l)),N.pef(m,F),m},s=()=>{let F=`${N.hc.getTotalSize()}px`;if(Q)W.content.style.width=F;else W.content.style.height=F},W0=()=>{if(N.id)return;let F=N.vtf(),p=Q?N.cw:N.ch;if(N.gvr(N.ls,p,N.hc,F,d),v2(d,Y,F,$),$.start===k.start&&$.end===k.end){if(N.sic)for(let[e,U0]of I)N.pef(U0,e);return}let m=String(F),r=m!==N.la;N.la=m;for(let[e,U0]of I)if(e<$.start||e>$.end)U0.remove(),f.release(U0),I.delete(e);let Q0=document.createDocumentFragment(),G0=[];for(let e=$.start;e<=$.end;e++){let U0=N.dm?N.dm.getItem(e):N.it[e];if(!U0)continue;let D0=I.get(e);if(D0){let y0=D0.dataset.id,S0=String(U0.id);if(y0!==S0){let $j=y0?.startsWith("__placeholder_"),y2=S0.startsWith("__placeholder_");if(u(D0,N.at(U0,e,l)),D0.dataset.id=S0,Q)D0.style.width=`${N.hc.getSize(e)}px`;else D0.style.height=`${N.hc.getSize(e)}px`;if(y2)D0.classList.add(`${B}-item--placeholder`);else D0.classList.remove(`${B}-item--placeholder`);if($j&&!y2)D0.classList.add(`${B}-item--replaced`),setTimeout(()=>{D0.classList.remove(`${B}-item--replaced`)},300)}N.pef(D0,e);let c0=N.ss.has(U0.id),Tj=e===N.fi;if(D0.classList.toggle(`${B}-item--selected`,c0),D0.classList.toggle(`${B}-item--focused`,Tj),D0.ariaSelected=c0?"true":"false",r)D0.setAttribute("aria-setsize",N.la)}else{let y0=q0(e,U0),S0=N.ss.has(U0.id),c0=e===N.fi;if(S0)y0.classList.add(`${B}-item--selected`),y0.ariaSelected="true";if(c0)y0.classList.add(`${B}-item--focused`);Q0.appendChild(y0),G0.push({index:e,element:y0})}}if(G0.length>0){W.items.appendChild(Q0);for(let{index:e,element:U0}of G0)I.set(e,U0)}k.start=$.start,k.end=$.end,h.lastRenderRange.start=$.start,h.lastRenderRange.end=$.end,h.viewportState.scrollPosition=N.ls,h.viewportState.visibleRange.start=d.start,h.viewportState.visibleRange.end=d.end,h.viewportState.renderRange.start=$.start,h.viewportState.renderRange.end=$.end,M.emit("range:change",{range:{start:$.start,end:$.end}})},Y0=()=>{k.start=-1,k.end=-1,N.rfn()};N.rfn=W0,N.ffn=Y0;let w=()=>{if(N.id)return;let F=N.sgt(),p=F>=N.ls?"down":"up";if(N.vt=N2(N.vt,F),!W.root.classList.contains(`${B}--scrolling`))W.root.classList.add(`${B}--scrolling`);N.ls=F,N.rfn(),M.emit("scroll",{scrollPosition:F,direction:p}),M.emit("velocity:change",{velocity:N.vt.velocity,reliable:N.vt.sampleCount>=T2});for(let m=0;m<S.length;m++)S[m](F,p);if(x)clearTimeout(x);x=setTimeout(()=>{W.root.classList.remove(`${B}--scrolling`),N.vt.velocity=0,N.vt.sampleCount=0,M.emit("velocity:change",{velocity:0,reliable:!1})},D?.idleTimeout??u2)},g=null;if(N.st.addEventListener("scroll",w,{passive:!0}),V&&!Q&&!A)g=(F)=>{F.preventDefault();let p=N.sgt(),m=F.deltaY,r=Math.max(0,Math.min(p+m,N.hc.getTotalSize()-N.ch));N.sst(r),N.ls=r,N.vt=N2(N.vt,r),N.rfn();let Q0=r>=p?"down":"up";if(M.emit("scroll",{scrollPosition:r,direction:Q0}),!W.root.classList.contains(`${B}--scrolling`))W.root.classList.add(`${B}--scrolling`);if(x)clearTimeout(x);x=setTimeout(()=>{W.root.classList.remove(`${B}--scrolling`),N.vt.velocity=0,N.vt.sampleCount=0,M.emit("velocity:change",{velocity:0,reliable:!1})},D?.idleTimeout??u2)},W.viewport.addEventListener("wheel",g,{passive:!1});else if(Q&&V)g=(F)=>{if(F.deltaX)return;F.preventDefault(),W.viewport.scrollLeft+=F.deltaY},W.viewport.addEventListener("wheel",g,{passive:!1});let i=(F)=>{let m=F.target.closest("[data-index]");if(m){let r=parseInt(m.dataset.index??"-1",10);if(r>=0){let Q0=N.dm?.getItem(r)??N.it[r];if(Q0){if(Q0.__groupHeader)return;M.emit("item:click",{item:Q0,index:r,event:F})}}}for(let r=0;r<c.length;r++)c[r](F)},J0=(F)=>{let m=F.target.closest("[data-index]");if(m){let r=parseInt(m.dataset.index??"-1",10);if(r>=0){let Q0=N.dm?.getItem(r)??N.it[r];if(Q0){if(Q0.__groupHeader)return;M.emit("item:dblclick",{item:Q0,index:r,event:F})}}}},K0=(F)=>{for(let p=0;p<n.length;p++)n[p](F)};W.items.addEventListener("click",i),W.items.addEventListener("dblclick",J0),W.root.addEventListener("keydown",K0);let Z0=new ResizeObserver((F)=>{if(N.id)return;for(let p of F){let m=p.contentRect.height,r=p.contentRect.width,Q0=Q?r:m,G0=Q?N.cw:N.ch;if(N.cw=r,N.ch=m,Math.abs(Q0-G0)>1){if(h.viewportState.containerSize=Q0,N.ii)s(),N.rfn(),M.emit("resize",{height:m,width:r})}if(N.ii)for(let e=0;e<o.length;e++)o[e](r,m)}});if(N.vre)Z0.observe(W.viewport);let V0={dom:W,emitter:M,resolvedConfig:H,rawConfig:j,rendered:I,pool:f,itemState:l,sharedState:h,renderRange:$,isHorizontal:Q,classPrefix:B,contentSizeHandlers:t,afterScroll:S,clickHandlers:c,keydownHandlers:n,resizeHandlers:o,destroyHandlers:j0,methods:v,onScrollFrame:w,resizeObserver:Z0,applyTemplate:u,updateContentSize:s},X0=I2(N,V0);N.dm=p2(N,V0,X0),N.sc=h2(N,V0);let B0=new Map;for(let F of T)if(F.methods)for(let p of F.methods){let m=B0.get(p);if(m)throw Error(`[vlist/builder] Method "${p}" is registered by both "${m}" and "${F.name}"`);B0.set(p,F.name)}for(let F of T)F.setup(X0);if(N.ii=!0,X0.state.isInitialized=!0,s(),N.rfn(),P&&N.it.length>0){let F=N.gsp(N.it.length-1,N.hc,N.ch,N.it.length,"end");N.sst(F),N.ls=F,N.rfn()}let O0=(F)=>{X0.dataManager.setItems(F,0,F.length)},b0=P?(F)=>{let p=N.sab(2),m=N.it.length;if(X0.dataManager.setItems(F,m),p&&N.it.length>0){let r=N.gsp(N.it.length-1,N.hc,N.ch,N.it.length,"end");N.sst(r),N.ls=r,N.rfn()}}:(F)=>{let p=N.it.length;X0.dataManager.setItems(F,p)},N0=P?(F)=>{let p=N.sgt(),m=N.hc.getTotalSize(),r=[...N.it];X0.dataManager.clear(),X0.dataManager.setItems([...F,...r],0);let G0=N.hc.getTotalSize()-m;if(G0>0)N.sst(p+G0),N.ls=p+G0}:(F)=>{let p=[...N.it];X0.dataManager.clear(),X0.dataManager.setItems([...F,...p],0)},A0=(F,p)=>{X0.dataManager.updateItem(F,p)},_0=(F)=>{X0.dataManager.removeItem(F)},E0=async()=>{if(X0.dataManager.reload)await X0.dataManager.reload()},F0=()=>{if(C!==null)cancelAnimationFrame(C),C=null},Lj=(F,p,m)=>{if(F0(),Math.abs(p-F)<1){N.sst(p),N.ls=p,N.rfn();return}let r=performance.now(),Q0=(G0)=>{let e=G0-r,U0=Math.min(e/m,1),D0=F+(p-F)*S2(U0);if(N.sst(D0),N.ls=D0,N.rfn(),U0<1)C=requestAnimationFrame(Q0);else C=null};C=requestAnimationFrame(Q0)},Oj=(F,p)=>{let{align:m,behavior:r,duration:Q0}=f2(p),G0=N.vtf(),e=F;if(O&&G0>0)e=(e%G0+G0)%G0;let U0=N.gsp(e,N.hc,N.ch,G0,m);if(r==="smooth")Lj(N.sgt(),U0,Q0);else F0(),N.sst(U0)},bj=()=>N.sgt(),yj=(F,p)=>{return M.on(F,p)},Hj=(F,p)=>{M.off(F,p)},Pj=()=>{if(N.id)return;if(N.id=!0,X0.state.isDestroyed=!0,W.items.removeEventListener("click",i),W.root.removeEventListener("keydown",K0),N.st.removeEventListener("scroll",w),Z0.disconnect(),g)W.viewport.removeEventListener("wheel",g);if(x)clearTimeout(x);for(let F=0;F<j0.length;F++)j0[F]();for(let F of T)if(F.destroy)F.destroy();F0();for(let[,F]of I)F.remove(),f.release(F);I.clear(),f.clear(),M.clear(),W.root.remove()},b2={get element(){return W.root},get items(){if(v.has("_getItems"))return v.get("_getItems")();return N.it},get total(){if(v.has("_getTotal"))return v.get("_getTotal")();return N.vtf()},setItems:v.has("setItems")?v.get("setItems"):O0,appendItems:v.has("appendItems")?v.get("appendItems"):b0,prependItems:v.has("prependItems")?v.get("prependItems"):N0,updateItem:v.has("updateItem")?v.get("updateItem"):A0,removeItem:v.has("removeItem")?v.get("removeItem"):_0,reload:v.has("reload")?v.get("reload"):E0,scrollToIndex:v.has("scrollToIndex")?v.get("scrollToIndex"):Oj,cancelScroll:v.has("cancelScroll")?v.get("cancelScroll"):F0,getScrollPosition:v.has("getScrollPosition")?v.get("getScrollPosition"):bj,on:yj,off:Hj,destroy:Pj};for(let[F,p]of v){if(F==="setItems"||F==="appendItems"||F==="prependItems"||F==="updateItem"||F==="removeItem"||F==="reload"||F==="scrollToIndex"||F==="scrollToItem"||F==="cancelScroll"||F==="getScrollPosition")continue;b2[F]=p}return b2}n0();var C0=(j,X,Q={},J="vlist",K=!1)=>{let{autoHide:q=!0,autoHideDelay:Y=1000,minThumbSize:B=30,showOnHover:E=!0,hoverZoneWidth:Z=16,showOnViewportEnter:D=!0}=Q,V=0,O=0,P=0,G=0,L=!1,A=!1,b=0,H=0,T=0,_=null,U=!1,W=null,M=null,y=K?"width":"height",z=K?"translateX":"translateY",f=K?(s)=>s.clientX:(s)=>s.clientY,N=K?"left":"top",C=document.createElement("div"),x=document.createElement("div"),d=E?document.createElement("div"):null,$=()=>{if(C.className=`${J}-scrollbar`,x.className=`${J}-scrollbar-thumb`,K)C.classList.add(`${J}-scrollbar--horizontal`);if(C.appendChild(x),j.appendChild(C),d){if(d.className=`${J}-scrollbar-hover`,K)d.classList.add(`${J}-scrollbar-hover--horizontal`),d.style.height=`${Z}px`;else d.style.width=`${Z}px`;j.appendChild(d)}},k=()=>{if(_)clearTimeout(_),_=null},h=()=>{if(!q)return;k(),_=setTimeout(l,Y)},I=()=>{if(V<=O)return;if(k(),!U)C.classList.add(`${J}-scrollbar--visible`),U=!0;if(q&&!L&&!A)h()},l=()=>{if(L||A)return;C.classList.remove(`${J}-scrollbar--visible`),U=!1},R=(s,W0)=>{V=s,O=W0;let Y0=V>O;if(C.style.display=Y0?"":"none",!Y0){l();return}let w=O/V;P=Math.max(B,w*O),x.style[y]=`${P}px`,G=O-P,S(T)},S=(s)=>{if(T=s,V<=O||G<=0)return;let W0=V-O,w=Math.min(1,Math.max(0,s/W0))*G;x.style.transform=`${z}(${w}px)`},c=(s)=>{if(s.target===x)return;let W0=C.getBoundingClientRect(),g=f(s)-W0[N]-P/2,J0=Math.max(0,Math.min(g,G))/G,K0=V-O,Z0=J0*K0;X(Z0),I()},n=(s)=>{s.preventDefault(),s.stopPropagation(),L=!0,b=f(s),H=T,k(),C.classList.add(`${J}-scrollbar--dragging`),document.addEventListener("mousemove",o),document.addEventListener("mouseup",t)},o=(s)=>{if(!L)return;let W0=f(s)-b,Y0=G>0?W0/G:0,w=V-O,g=Y0*w,i=Math.max(0,Math.min(H+g,w)),K0=i/w*G;if(x.style.transform=`${z}(${K0}px)`,M=i,W===null)W=requestAnimationFrame(()=>{if(M!==null)X(M);W=null})},t=()=>{if(L=!1,W!==null)cancelAnimationFrame(W),W=null;if(M!==null)X(M),M=null;if(C.classList.remove(`${J}-scrollbar--dragging`),q&&!A)h();document.removeEventListener("mousemove",o),document.removeEventListener("mouseup",t)},j0=()=>{if(D)I()},v=()=>{if(!L){if(A=!1,q)h()}},u=()=>{A=!0,k(),I()},a=()=>{if(A=!1,!L&&q)h()},q0=()=>{if(k(),W!==null)cancelAnimationFrame(W),W=null;if(C.removeEventListener("click",c),C.removeEventListener("mouseenter",u),C.removeEventListener("mouseleave",a),x.removeEventListener("mousedown",n),j.removeEventListener("mouseenter",j0),j.removeEventListener("mouseleave",v),document.removeEventListener("mousemove",o),document.removeEventListener("mouseup",t),d){if(d.removeEventListener("mouseenter",u),d.removeEventListener("mouseleave",a),d.parentNode)d.parentNode.removeChild(d)}if(C.parentNode)C.parentNode.removeChild(C)};if($(),C.addEventListener("click",c),C.addEventListener("mouseenter",u),C.addEventListener("mouseleave",a),x.addEventListener("mousedown",n),j.addEventListener("mouseenter",j0),j.addEventListener("mouseleave",v),d)d.addEventListener("mouseenter",u),d.addEventListener("mouseleave",a);return{show:I,hide:l,updateBounds:R,updatePosition:S,isVisible:()=>U,destroy:q0}};var n2=(j)=>{let X=null;return{name:"withScrollbar",priority:30,setup(Q){let{dom:J,config:K}=Q,{classPrefix:q,horizontal:Y}=K;if(X=C0(J.viewport,(Z)=>Q.scrollController.scrollTo(Z),j??{},q,Y),!J.viewport.classList.contains(`${q}-viewport--custom-scrollbar`))J.viewport.classList.add(`${q}-viewport--custom-scrollbar`);let B=Q.getCachedCompression();X.updateBounds(B.virtualSize,Q.state.viewportState.containerSize);let E=X;Q.afterScroll.push((Z,D)=>{E.updatePosition(Z),E.show()}),Q.resizeHandlers.push((Z,D)=>{if(E){let V=Q.getCachedCompression();E.updateBounds(V.virtualSize,Q.state.viewportState.containerSize)}}),Q.contentSizeHandlers.push(()=>{if(E){let Z=Q.getCachedCompression();E.updateBounds(Z.virtualSize,Q.state.viewportState.containerSize)}}),Q.destroyHandlers.push(()=>{if(E)E.destroy()})},destroy(){if(X)X.destroy(),X=null}}};var o2=(j=0)=>{let X=[,,,,,,,,];for(let Q=0;Q<8;Q++)X[Q]={position:0,time:0};return{velocity:0,lastPosition:j,lastTime:performance.now(),samples:X,sampleIndex:0,sampleCount:0}},o0=(j,X)=>{let Q=performance.now(),J=Q-j.lastTime;if(J===0)return j;if(J>100){j.sampleCount=0,j.sampleIndex=0,j.velocity=0;let q=j.samples[0];return q.position=X,q.time=Q,j.sampleIndex=1,j.sampleCount=1,j.lastPosition=X,j.lastTime=Q,j}let K=j.samples[j.sampleIndex];if(K.position=X,K.time=Q,j.sampleIndex=(j.sampleIndex+1)%8,j.sampleCount=Math.min(j.sampleCount+1,8),j.sampleCount>=2){let q=(j.sampleIndex-j.sampleCount+8)%8,Y=j.samples[q],B=X-Y.position,E=Q-Y.time;j.velocity=E>0?B/E:0}return j.lastPosition=X,j.lastTime=Q,j},uj=(j)=>j.sampleCount>=3,i2=(j,X={})=>{let{wheel:Q=!0,sensitivity:J=1,smoothing:K=!1,idleTimeout:q=150,onScroll:Y,onIdle:B,scrollElement:E,horizontal:Z=!1}=X,D=!!E,V=0,O=0,P=D?Z?window.innerWidth:window.innerHeight:Z?j.clientWidth:j.clientHeight,G=X.compressed??!1,L=X.compression,A=o2(),b=!1,H=null,_=i0(()=>{let v=Z?j.scrollLeft:j.scrollTop,u=v>=V?"down":"up";if(A=o0(A,v),V=v,Y)Y({scrollTop:V,direction:u,velocity:A.velocity});f()}),W=i0(()=>{let v=j.getBoundingClientRect(),u=Z?Math.max(0,-v.left):Math.max(0,-v.top),a=u>=V?"down":"up";if(A=o0(A,u),V=u,!b)b=!0;if(Y)Y({scrollTop:V,direction:a,velocity:A.velocity});f()}),M=(v)=>{v.preventDefault()},y=(v)=>{if(v.deltaX)return;v.preventDefault(),j.scrollLeft+=v.deltaY},z=(v)=>{if(!G)return;v.preventDefault();let u=(Z?v.deltaX||v.deltaY:v.deltaY)*J,a=V+u;if(K)a=V+u*0.3;if(a=Math.max(0,Math.min(a,O)),a!==V){let s=a>=V?"down":"up";if(A=o0(A,a),V=a,!b)b=!0;if(Y)Y({scrollTop:V,direction:s,velocity:A.velocity});f()}},f=()=>{if(H)clearTimeout(H);H=setTimeout(()=>{if(b=!1,A=o2(V),B)B()},q)},N=(v)=>{if(G)return;if(G=!0,L=v,O=v.virtualSize-P,D)return;if(_.cancel(),j.removeEventListener("scroll",_),!Q)j.removeEventListener("wheel",M);else if(Z)j.removeEventListener("wheel",y);if(Z)j.style.overflowX="hidden";else j.style.overflow="hidden";if(Q)j.addEventListener("wheel",z,{passive:!1});let u=Z?j.scrollLeft:j.scrollTop;if(u>0){let a=Z?L?.actualSize??j.scrollWidth:L?.actualSize??j.scrollHeight;V=u/a*O}if(Z)j.scrollLeft=0;else j.scrollTop=0},C=()=>{if(!G)return;if(G=!1,D){L=void 0;return}if(j.removeEventListener("wheel",z),Z)j.style.overflowX="auto";else j.style.overflow="auto";if(j.addEventListener("scroll",_,{passive:!0}),!Q)j.addEventListener("wheel",M,{passive:!1});else if(Z)j.addEventListener("wheel",y,{passive:!1});if(L&&V>0){let u=V/O*(L.actualSize-P);if(Z)j.scrollLeft=u;else j.scrollTop=u}L=void 0},x=()=>{if(D||G)return V;return Z?j.scrollLeft:j.scrollTop},d=(v,u=!1)=>{let a=Math.max(0,Math.min(v,O||1/0));if(D){let q0=j.getBoundingClientRect();if(Z){let s=q0.left+window.scrollX;window.scrollTo({left:s+a,behavior:u?"smooth":"auto"})}else{let s=q0.top+window.scrollY;window.scrollTo({top:s+a,behavior:u?"smooth":"auto"})}}else if(G){if(a===V)return;let s=a>=V?"down":"up";if(A=o0(A,a),V=a,!b)b=!0;if(Y)Y({scrollTop:V,direction:s,velocity:A.velocity});f()}else if(Z)j.scrollTo({left:a,behavior:u?"smooth":"auto"});else j.scrollTo({top:a,behavior:u?"smooth":"auto"})},$=(v)=>{d(x()+v)},k=()=>{return x()<=0},h=(v=0)=>{let u=x(),a=D||G?O:Z?j.scrollWidth-j.clientWidth:j.scrollHeight-j.clientHeight;return u>=a-v},I=()=>{let v=x(),u=D||G?O:Z?j.scrollWidth-j.clientWidth:j.scrollHeight-j.clientHeight;if(u<=0)return 0;return Math.min(1,Math.max(0,v/u))},l=(v)=>{if(v.compression)L=v.compression,O=L.virtualSize-P},R=()=>G,S=()=>Math.abs(A.velocity),c=()=>uj(A),n=()=>b,o=()=>D,t=(v)=>{if(P=v,L)O=L.virtualSize-P},j0=()=>{if(H)clearTimeout(H);if(D)W.cancel(),window.removeEventListener("scroll",W);else _.cancel(),j.removeEventListener("scroll",_),j.removeEventListener("wheel",z),j.removeEventListener("wheel",M),j.removeEventListener("wheel",y)};if(D){if(G&&L)O=L.virtualSize-P;window.addEventListener("scroll",W,{passive:!0})}else if(G&&L){if(O=L.virtualSize-P,Z)j.style.overflowX="hidden";else j.style.overflow="hidden";if(Q)j.addEventListener("wheel",z,{passive:!1})}else{if(Z)j.style.overflowX="auto",j.style.overflowY="hidden";else j.style.overflow="auto";if(j.addEventListener("scroll",_,{passive:!0}),!Q)j.addEventListener("wheel",M,{passive:!1});else if(Z)j.addEventListener("wheel",y,{passive:!1})}return{getScrollTop:x,scrollTo:d,scrollBy:$,isAtTop:k,isAtBottom:h,getScrollPercentage:I,getVelocity:S,isTracking:c,isScrolling:n,updateConfig:l,enableCompression:N,disableCompression:C,isCompressed:R,isWindowMode:o,updateContainerHeight:t,destroy:j0}},i0=(j)=>{let X=null,Q=null,J=(...K)=>{if(Q=K,X===null)X=requestAnimationFrame(()=>{if(X=null,Q)j(...Q)})};return J.cancel=()=>{if(X!==null)cancelAnimationFrame(X),X=null},J};var gj=0.65,xj=0.5,mj=0.95,dj=0.1,cj=5,lj=100,t2=()=>{let j=null,X=0,Q=!1,J=0,K=null,q=0,Y=0,B=null,E=[];return{name:"withScale",priority:20,setup(Z){let{dom:D,config:V}=Z,{classPrefix:O,horizontal:P}=V,G=()=>{let H=Z.getVirtualTotal(),T=M0(H,Z.sizeCache);if(T.isCompressed&&!Q){Q=!0,Z.scrollController.enableCompression(T),Z.updateContentSize(T.virtualSize),Z.setScrollFns(()=>X,(C)=>{if(X=C,J=C,K!==null)cancelAnimationFrame(K),K=null});let _=()=>{let C=J-X;if(Math.abs(C)<xj)X=J,K=null;else X+=C*gj,K=requestAnimationFrame(_);Z.scrollController.scrollTo(X)},U=D.viewport,W=(C)=>{C.preventDefault();let d=Z.getCachedCompression().virtualSize-Z.state.viewportState.containerSize;if(J=Math.max(0,Math.min(J+C.deltaY,d)),K===null)K=requestAnimationFrame(_)};U.addEventListener("wheel",W,{passive:!1});let M=()=>{if(B!==null)cancelAnimationFrame(B),B=null},y=(C)=>{if(M(),K!==null)cancelAnimationFrame(K),K=null;let x=C.touches[0];if(!x)return;let d=P?x.clientX:x.clientY;q=d,Y=X,E=[{time:performance.now(),y:d}]},z=(C)=>{C.preventDefault();let x=C.touches[0];if(!x)return;let d=P?x.clientX:x.clientY,$=performance.now();if(E.push({time:$,y:d}),E.length>cj)E.shift();let k=q-d,I=Z.getCachedCompression().virtualSize-Z.state.viewportState.containerSize,l=Math.max(0,Math.min(Y+k,I));X=l,J=l,Z.scrollController.scrollTo(l)},f=(C)=>{let x=performance.now(),d=E.filter((I)=>x-I.time<lj),$=0;if(d.length>=2){let I=d[0],l=d[d.length-1],R=l.time-I.time;if(R>0)$=(I.y-l.y)/R}if(E=[],Math.abs($)<dj)return;let k=$*16,h=()=>{if(k*=mj,Math.abs(k)<0.5){B=null;return}let l=Z.getCachedCompression().virtualSize-Z.state.viewportState.containerSize,R=X+k;if(R=Math.max(0,Math.min(R,l)),R<=0&&k<0||R>=l&&k>0){X=R,J=R,Z.scrollController.scrollTo(R),B=null;return}X=R,J=R,Z.scrollController.scrollTo(R),B=requestAnimationFrame(h)};B=requestAnimationFrame(h)};if(U.addEventListener("touchstart",y,{passive:!0}),U.addEventListener("touchmove",z,{passive:!1}),U.addEventListener("touchend",f,{passive:!0}),U.addEventListener("touchcancel",f,{passive:!0}),Z.destroyHandlers.push(()=>{if(U.removeEventListener("wheel",W),U.removeEventListener("touchstart",y),U.removeEventListener("touchmove",z),U.removeEventListener("touchend",f),U.removeEventListener("touchcancel",f),M(),K!==null)cancelAnimationFrame(K),K=null}),!D.viewport.querySelector(`.${O}-scrollbar-track`)){if(j=C0(D.viewport,(x)=>Z.scrollController.scrollTo(x),{},O,P),!D.viewport.classList.contains(`${O}-viewport--custom-scrollbar`))D.viewport.classList.add(`${O}-viewport--custom-scrollbar`);j.updateBounds(T.virtualSize,Z.state.viewportState.containerSize);let C=j;Z.afterScroll.push((x,d)=>{if(C)C.updatePosition(x),C.show()}),Z.resizeHandlers.push((x,d)=>{if(C){let $=Z.getCachedCompression();C.updateBounds($.virtualSize,Z.state.viewportState.containerSize)}})}}else if(!T.isCompressed&&Q)Q=!1,Z.scrollController.disableCompression(),Z.updateContentSize(T.actualSize);else if(T.isCompressed)Z.scrollController.updateConfig({compression:T}),Z.updateContentSize(T.virtualSize);if(j)j.updateBounds(T.virtualSize,Z.state.viewportState.containerSize);Z.state.cachedCompression={state:T,totalItems:H}};Z.updateCompressionMode=G;let L=Z.getCachedCompression.bind(Z);Z.getCachedCompression=()=>{if(Z.state.cachedCompression)return Z.state.cachedCompression.state;return L()},Z.setVisibleRangeFn((H,T,_,U,W)=>{A=null,b=null;let M=M0(U,_);s0(H,T,_,U,M,W)}),Z.setScrollToPosFn((H,T,_,U,W)=>{let M=M0(U,T);return r0(H,T,_,U,M,W)});let A=null,b=null;Z.setPositionElementFn((H,T)=>{let _=Z.getVirtualTotal(),U=M0(_,Z.sizeCache);if(U.isCompressed){let W=Z.scrollController.getScrollTop();if(A===null||T<b)b=T,A=Math.round(k0(T,W,Z.sizeCache,_,Z.state.viewportState.containerSize,U));let M=A+Z.sizeCache.getOffset(T)-Z.sizeCache.getOffset(b),y=Z.config.horizontal;H.style.transform=y?`translateX(${M}px)`:`translateY(${M}px)`}else{let W=Math.round(Z.sizeCache.getOffset(T)),M=Z.config.horizontal;H.style.transform=M?`translateX(${W}px)`:`translateY(${W}px)`}}),G(),Z.destroyHandlers.push(()=>{if(j)j.destroy(),j=null;if(K!==null)cancelAnimationFrame(K),K=null})},destroy(){if(j)j.destroy(),j=null;if(K!==null)cancelAnimationFrame(K),K=null;if(B!==null)cancelAnimationFrame(B),B=null}}};var t0=(j={})=>{let{chunkSize:X=100,maxCachedItems:Q=5000,evictionBuffer:J=200,onEvict:K}=j,q=new Map,Y=0,B=0,E=($)=>{let k=q.get($);if(!k)k={items:Array(X),count:0,lastAccess:Date.now()},q.set($,k);else k.lastAccess=Date.now();return k},Z=($)=>{return Math.floor($/X)},D=($)=>{return $%X},V=()=>Y,O=($)=>{Y=$},P=($)=>{if($<0||$>=Y)return;let k=Z($),h=q.get(k);if(!h)return;return h.items[D($)]},G=($)=>{if($<0||$>=Y)return!1;let k=Z($),h=q.get(k);if(!h)return!1;return h.items[D($)]!==void 0},L=($,k)=>{let h=Z($),I=E(h),l=D($),R=I.items[l]===void 0;if(I.items[l]=k,R)I.count++,B++;if($>=Y)Y=$+1},A=($,k)=>{for(let h=0;h<k.length;h++){let I=k[h];if(I!==void 0)L($+h,I)}},b=($)=>{if($<0||$>=Y)return!1;let k=Z($),h=q.get(k);if(!h)return!1;let I=D($);if(h.items[I]===void 0)return!1;if(h.items[I]=void 0,h.count--,B--,h.count===0)q.delete(k);return!0},H=($,k)=>{let h=[];for(let I=$;I<=k&&I<Y;I++)h.push(P(I));return h},T=($,k)=>{for(let h=$;h<=k&&h<Y;h++)if(!G(h))return!1;return!0},_=()=>{let $=[],k=null,h=Array.from(q.keys()).sort((I,l)=>I-l);for(let I of h){let l=q.get(I);if(!l)continue;let R=I*X;for(let S=0;S<X;S++){let c=R+S;if(c>=Y)break;if(l.items[S]!==void 0)if(k===null)k={start:c,end:c};else if(c===k.end+1)k.end=c;else $.push(k),k={start:c,end:c};else if(k!==null)$.push(k),k=null}}if(k!==null)$.push(k);return $},U=($,k)=>{let h=[],I=null;for(let l=$;l<=k&&l<Y;l++)if(!G(l))if(I===null)I={start:l,end:l};else I.end=l;else if(I!==null)h.push(I),I=null;if(I!==null)h.push(I);return h},W=($)=>{return q.has($)},M=($)=>{let k=q.get($);if(k)k.lastAccess=Date.now()},y=($,k)=>{if($>k||q.size===0)return;let h=Date.now(),I=Z(Math.max(0,$)),l=Z(Math.min(Y-1,k));for(let R=I;R<=l;R++){let S=q.get(R);if(S)S.lastAccess=h}},z=($,k)=>{if(B<=Q)return 0;let h=Math.max(0,$-J),I=Math.min(Y-1,k+J),l=Z(h),R=Z(I),S=0,c=[];for(let[n,o]of q)if(n<l||n>R)S+=o.count,c.push(n),B-=o.count,q.delete(n);if(S>0&&K)K(S,c);return S},f=()=>{if(B<=Q)return 0;let $=Array.from(q.entries()).sort(([,I],[,l])=>I.lastAccess-l.lastAccess),k=0,h=[];for(let[I,l]of $){if(B<=Q)break;k+=l.count,B-=l.count,h.push(I),q.delete(I)}if(k>0&&K)K(k,h);return k},N=()=>{return{totalItems:Y,cachedItems:B,cachedChunks:q.size,chunkSize:X,maxCachedItems:Q,memoryEfficiency:Y>0?1-B/Y:1}},C=()=>B,x=()=>{q.clear(),B=0};return{chunkSize:X,maxCachedItems:Q,getTotal:V,setTotal:O,get:P,has:G,set:L,setRange:A,delete:b,getRange:H,isRangeLoaded:T,getLoadedRanges:_,findUnloadedRanges:U,getChunkIndex:Z,isChunkLoaded:W,touchChunk:M,touchChunksForRange:y,evictDistant:z,evictToLimit:f,getStats:N,getCachedCount:C,clear:x,reset:()=>{x(),Y=0}}},e0=(j)=>{if(j.length===0)return[];let X=[...j].sort((J,K)=>J.start-K.start),Q=[{...X[0]}];for(let J=1;J<X.length;J++){let K=X[J],q=Q[Q.length-1];if(K.start<=q.end+1)q.end=Math.max(q.end,K.end);else Q.push({...K})}return Q},h0=(j,X,Q)=>{let J=Math.floor(j.start/Q)*Q,K=Math.ceil((j.end+1)/Q)*Q-1,q={start:J,end:K};if(X.length===0)return[q];let Y=[],B=e0(X),E=q.start;for(let Z of B){if(Z.end<E)continue;if(Z.start>q.end)break;if(Z.start>E)Y.push({start:E,end:Math.min(Z.start-1,q.end)});if(E=Z.end+1,E>q.end)break}if(E<=q.end)Y.push({start:E,end:q.end});return Y};var j2=(j={})=>{let{enabled:X=!0,maskCharacter:Q="█",randomVariance:J=!0,maxSampleSize:K=20,customGenerator:q}=j,Y=null,B=!1,E=0,Z=(b)=>{if(!X||B||b.length===0)return;let H=new Map,T=new Map,_=Math.min(b.length,K);for(let U=0;U<_;U++){let W=b[U];if(!W||typeof W!=="object")continue;for(let[M,y]of Object.entries(W)){if(M.startsWith("_")||M==="id")continue;if(!T.has(M))T.set(M,{lengths:[],types:new Set});let z=T.get(M),f=Array.isArray(y)?"array":typeof y;if(z.types.add(f),typeof y==="string")z.lengths.push(y.length);else if(y!==null&&y!==void 0)z.lengths.push(String(y).length)}}for(let[U,W]of T){if(W.lengths.length===0)continue;let M=Math.min(...W.lengths),y=Math.max(...W.lengths),z=Math.round(W.lengths.reduce((N,C)=>N+C,0)/W.lengths.length),f="string";if(W.types.has("number")&&W.types.size===1)f="number";else if(W.types.has("boolean")&&W.types.size===1)f="boolean";else if(W.types.has("array"))f="array";else if(W.types.has("object")&&!W.types.has("string"))f="object";H.set(U,{minLength:M,maxLength:y,avgLength:z,type:f})}Y=H,B=!0},D=()=>B,V=(b)=>{let H=b.avgLength;if(J&&b.minLength!==b.maxLength){if(H=Math.floor(Math.random()*(b.maxLength-b.minLength+1)+b.minLength),Math.random()<0.3)H=Math.max(1,H+Math.floor(Math.random()*3)-1)}return Q.repeat(Math.max(1,H))},O=(b)=>{if(q)return{...q(b),["_isPlaceholder"]:!0};let H={id:`__placeholder_${E++}`,["_isPlaceholder"]:!0,_index:b};if(!Y||Y.size===0)return H.label=Q.repeat(12),H;for(let[T,_]of Y)switch(_.type){case"string":H[T]=V(_);break;case"number":H[T]=0;break;case"boolean":H[T]=!1;break;case"array":H[T]=[];break;case"object":H[T]={};break;default:H[T]=V(_)}return H};return{analyzeStructure:Z,hasAnalyzedStructure:D,generate:O,generateRange:(b,H)=>{let T=[];for(let _=b;_<=H;_++)T.push(O(_));return T},isPlaceholder:(b)=>{if(!b||typeof b!=="object")return!1;return b._isPlaceholder===!0},getPlaceholderKey:()=>"_isPlaceholder",clear:()=>{Y=null,B=!1,E=0}}},P0=(j)=>{if(!j||typeof j!=="object")return!1;return j._isPlaceholder===!0},G2=(j)=>{return j.filter((X)=>!P0(X))};var sj=50,J2=(j={})=>{let{adapter:X,initialItems:Q,initialTotal:J,storage:K,placeholder:q,pageSize:Y=sj,onStateChange:B,onItemsLoaded:E,onItemsEvicted:Z}=j,D=t0({...K,onEvict:(w,g)=>{Z?.(w),U()}}),V=null,O=()=>{if(!V)V=j2(q);return V},P=new Map,G=!1,L,A=!0,b,H=[],T=0,_=new Map,U=()=>{B?.(d())},W=()=>{P.clear();let w=D.getLoadedRanges();for(let g of w)for(let i=g.start;i<=g.end;i++){let J0=D.get(i);if(J0&&!P0(J0))P.set(J0.id,i)}},M=(w,g)=>{if(!P0(g))P.set(g.id,w)},y=(w)=>{P.delete(w)},z=(w,g)=>{return`${w}-${g}`},f=()=>D.getTotal(),N=()=>D.getCachedCount(),C=()=>G,x=()=>A,d=()=>({total:D.getTotal(),cached:D.getCachedCount(),isLoading:G,pendingRanges:H,error:L,hasMore:A,cursor:b}),$=()=>D,k=()=>O(),h=(w)=>{let g=D.get(w);if(g!==void 0)return g;if(w>=0&&w<D.getTotal())return O().generate(w);return},I=(w)=>{let g=P.get(w);if(g===void 0)return;return D.get(g)},l=(w)=>{return P.get(w)??-1},R=(w)=>{let g=D.get(w);return g!==void 0&&!P0(g)},S=(w,g)=>{let i=[],J0=D.getTotal(),K0=0,Z0=0;D.touchChunksForRange(w,Math.min(g,J0-1));for(let V0=w;V0<=g&&V0<J0;V0++){let X0=D.get(V0);if(X0!==void 0)i.push(X0),K0++;else i.push(O().generate(V0)),Z0++}return i},c=(w)=>{D.setTotal(w),A=D.getCachedCount()<w,U()},n=(w,g=0,i)=>{if(V&&!V.hasAnalyzedStructure()&&w.length>0)V.analyzeStructure(w);for(let J0=0;J0<w.length;J0++){let K0=w[J0];if(K0!==void 0){let Z0=g+J0;D.set(Z0,K0),M(Z0,K0)}}if(i!==void 0)D.setTotal(i);else if(g+w.length>D.getTotal())D.setTotal(g+w.length);if(D.getCachedCount()>=D.getTotal()&&D.getTotal()>0)A=!1;E?.(w,g,D.getTotal()),U()},o=(w,g)=>{let i=P.get(w);if(i===void 0)return!1;let J0=D.get(i);if(!J0)return!1;let K0={...J0,...g};if(D.set(i,K0),g.id!==void 0&&g.id!==w)y(w),M(i,K0);return U(),!0},t=(w)=>{let g=P.get(w);if(g===void 0)return!1;D.delete(g),y(w);let i=D.getTotal();if(i>0)D.setTotal(i-1);return U(),!0},j0=async(w,g)=>{if(!X)return;let i=z(w,g);if(_.has(i))return;let J0=D.getLoadedRanges(),K0=h0({start:w,end:g},J0,D.chunkSize);if(K0.length===0)return;let Z0=D.chunkSize,V0=[];for(let B0 of K0){let O0=Math.floor(B0.start/Z0),b0=Math.floor(B0.end/Z0);for(let N0=O0;N0<=b0;N0++){let A0=N0*Z0,_0=A0+Z0-1,E0=z(A0,_0);if(!V0.some((F0)=>F0.start===A0)&&!_.has(E0))V0.push({start:A0,end:_0})}}let X0=[];for(let B0 of K0){let O0=Math.floor(B0.start/Z0),b0=Math.floor(B0.end/Z0);for(let N0=O0;N0<=b0;N0++){let A0=N0*Z0,_0=A0+Z0-1,E0=z(A0,_0);if(_.has(E0)){let F0=_.get(E0);if(!X0.includes(F0))X0.push(F0)}}}for(let B0 of V0){let O0=z(B0.start,B0.end),b0=(async()=>{H.push(B0),G=!0,L=void 0,U();try{let N0=B0.end-B0.start+1,A0={offset:B0.start,limit:N0,cursor:void 0},_0=await X.read(A0);if(n(_0.items,B0.start,_0.total),_0.cursor)b=_0.cursor;let E0=B0.start+_0.items.length;if(E0>=T){if(T=E0,_0.hasMore!==void 0)A=_0.hasMore;else if(_0.total!==void 0)A=E0<_0.total}}catch(N0){L=N0 instanceof Error?N0:Error(String(N0))}finally{_.delete(O0),H=H.filter((N0)=>N0.start!==B0.start||N0.end!==B0.end),G=_.size>0,U()}})();_.set(O0,b0),X0.push(b0)}await Promise.all(X0)},v=async(w,g)=>{if(D.isRangeLoaded(w,g))return;await j0(w,g)},u=async()=>{if(!X)return;await j0(0,Y-1)},a=async()=>{if(!X||G||!A)return!1;let w=D.getCachedCount(),g=D.getTotal(),i=w,J0=Math.min(i+Y-1,g>0?g-1:i+Y-1);if(i>=g&&g>0)return A=!1,!1;return await j0(i,J0),D.getCachedCount()>w},q0=async()=>{if(D.clear(),P.clear(),V)V.clear();_.clear(),H=[],G=!1,b=void 0,A=!0,T=0,L=void 0,U()},s=(w,g)=>{if(D.evictDistant(w,g)>0)W()},W0=()=>{D.clear(),P.clear(),b=void 0,L=void 0,H=[],G=!1,U()},Y0=()=>{if(D.reset(),P.clear(),V)V.clear();b=void 0,A=!0,T=0,L=void 0,H=[],G=!1,U()};if(Q&&Q.length>0)n(Q,0,J??Q.length);else if(J!==void 0)D.setTotal(J);return{getState:d,getTotal:f,getCached:N,getIsLoading:C,getHasMore:x,getStorage:$,getPlaceholders:k,getItem:h,getItemById:I,getIndexById:l,isItemLoaded:R,getItemsInRange:S,setTotal:c,setItems:n,updateItem:o,removeItem:t,loadRange:j0,ensureRange:v,loadInitial:u,loadMore:a,reload:q0,evictDistant:s,clear:W0,reset:Y0}};var e2=(j)=>{let{adapter:X,loading:Q}=j,J=Q?.cancelThreshold??x2,K=Q?.preloadThreshold??m2,q=Q?.preloadAhead??d2;return{name:"withAsync",priority:20,methods:["reload"],setup(Y){let{emitter:B}=Y,E=Y.config.reverse,Z=J2({adapter:X,pageSize:p0,onStateChange:()=>{if(Y.state.isInitialized){Y.sizeCache.rebuild(Y.getVirtualTotal()),Y.updateCompressionMode();let A=Y.getCachedCompression();Y.state.viewportState.totalSize=A.virtualSize,Y.state.viewportState.actualSize=A.actualSize,Y.state.viewportState.isCompressed=A.isCompressed,Y.state.viewportState.compressionRatio=A.ratio,Y.updateContentSize(A.virtualSize),Y.renderIfNeeded()}},onItemsLoaded:(A,b,H)=>{if(Y.state.isInitialized)Y.sizeCache.rebuild(Y.getVirtualTotal()),Y.forceRender(),B.emit("load:end",{items:A,total:H})}});Y.replaceDataManager(Z);let D=null,V=null,O=0,P=()=>{if(V){let A=V;V=null,Y.dataManager.ensureRange(A.start,A.end).catch((b)=>{B.emit("error",{error:b,context:"ensureRange"})})}};Y.afterScroll.push((A,b)=>{if(Y.state.isDestroyed)return;let H=Y.scrollController.getVelocity(),_=Y.scrollController.isTracking()&&H<=J;if(V&&O>J&&H<=J){let M=V;V=null,Y.dataManager.ensureRange(M.start,M.end).catch((y)=>{B.emit("error",{error:y,context:"ensureRange"})})}if(O=H,_&&!Y.dataManager.getIsLoading()&&Y.dataManager.getHasMore()){if(E){if(A<W2)B.emit("load:start",{offset:Y.dataManager.getCached(),limit:p0}),Y.dataManager.loadMore().catch((M)=>{B.emit("error",{error:M,context:"loadMore"})})}else if(Y.state.viewportState.totalSize-A-Y.state.viewportState.containerSize<W2)B.emit("load:start",{offset:Y.dataManager.getCached(),limit:p0}),Y.dataManager.loadMore().catch((y)=>{B.emit("error",{error:y,context:"loadMore"})})}let{renderRange:U}=Y.state.viewportState;if(!D||U.start!==D.start||U.end!==D.end)if(D={start:U.start,end:U.end},_){V=null;let{start:M,end:y}=U,z=Y.getVirtualTotal();if(H>K)if(b==="down")y=Math.min(U.end+q,z-1);else M=Math.max(U.start-q,0);Y.dataManager.ensureRange(M,y).catch((f)=>{B.emit("error",{error:f,context:"ensureRange"})})}else V={start:U.start,end:U.end}});let G=200,L=null;Y.afterScroll.push((A,b)=>{if(L!==null)clearTimeout(L);L=setTimeout(()=>{L=null,P()},G)}),Y.destroyHandlers.push(()=>{if(L!==null)clearTimeout(L),L=null}),B.on("load:start",()=>{Y.dom.root.setAttribute("aria-busy","true")}),B.on("load:end",()=>{Y.dom.root.removeAttribute("aria-busy")}),Y.methods.set("reload",async()=>{D=null,V=null,Y.invalidateRendered(),await Y.dataManager.reload(),Y.forceRender();let{renderRange:A}=Y.state.viewportState;if(A.end>0)await Y.dataManager.ensureRange(A.start,A.end)}),B.emit("load:start",{offset:0,limit:p0}),Y.dataManager.loadInitial().catch((A)=>{B.emit("error",{error:A,context:"loadInitial"})})}}};var jj=()=>{let j=null;return{name:"withPage",priority:5,setup(X){let{dom:Q,state:J,config:K,emitter:q}=X;Q.root.style.overflow="visible",Q.root.style.height="auto",Q.viewport.classList.remove(`${K.classPrefix}-viewport--custom-scrollbar`),X.disableViewportResize(),X.setScrollTarget(window),X.setScrollFns(()=>{let Z=Q.viewport.getBoundingClientRect();if(K.horizontal)return Math.max(0,-Z.left);else return Math.max(0,-Z.top)},(Z)=>{let D=Q.viewport.getBoundingClientRect();if(K.horizontal){let V=D.left+window.scrollX;window.scrollTo(V+Z,window.scrollY)}else{let V=D.top+window.scrollY;window.scrollTo(window.scrollX,V+Z)}}),X.setContainerDimensions({width:()=>window.innerWidth,height:()=>window.innerHeight}),J.viewportState.containerSize=window.innerHeight;let{innerHeight:Y,innerWidth:B}=window,E=()=>{let{innerWidth:Z,innerHeight:D}=window,V=K.horizontal?Z:D,O=K.horizontal?B:Y;if(Math.abs(V-O)<=1)return;Y=D,B=Z,J.viewportState.containerSize=D,q.emit("resize",{width:Z,height:D});for(let P=0;P<X.resizeHandlers.length;P++)X.resizeHandlers[P](Z,D);X.renderIfNeeded()};window.addEventListener("resize",E,{passive:!0}),j=()=>{window.removeEventListener("resize",E)},X.destroyHandlers.push(j)},destroy(){if(j)j(),j=null}}};var _2=(j,X)=>{let Q=0,J=j.length-1;while(Q<J){let K=Q+J+1>>>1;if(j[K].headerLayoutIndex<=X)Q=K;else J=K-1}return Q},Jj=(j,X)=>{let Q=0,J=j.length-1;while(Q<J){let K=Q+J+1>>>1;if(j[K].firstDataIndex<=X)Q=K;else J=K-1}return Q},Qj=(j,X)=>{if(j===0)return[];let Q=[],J=X(0),K=0,q=0;for(let Y=1;Y<j;Y++){let B=X(Y);if(B!==J){let E=Y-K;Q.push({key:J,groupIndex:Q.length,headerLayoutIndex:q,firstDataIndex:K,count:E}),q=q+1+E,J=B,K=Y}}return Q.push({key:J,groupIndex:Q.length,headerLayoutIndex:q,firstDataIndex:K,count:j-K}),Q},u0=(j,X)=>{if(j.length===0||X.length===0)return[];let Q=j.length+X.length,J=Array(Q),K=0;for(let q of X){J[K]={id:`__group_header_${q.groupIndex}`,__groupHeader:!0,groupKey:q.key,groupIndex:q.groupIndex},K++;for(let Y=0;Y<q.count;Y++)J[K]=j[q.firstDataIndex+Y],K++}return J},g0=(j,X)=>{let Q=typeof X==="number"?(J)=>X:X;return(J)=>{let K=j.getEntry(J);if(K.type==="header")return j.getHeaderHeight(K.group.groupIndex);return Q(K.dataIndex)}},Q2=(j,X)=>{let Q=Qj(j,X.getGroupForIndex),J=j+Q.length,K=X.headerHeight;return{get totalEntries(){return J},get groupCount(){return Q.length},get groups(){return Q},getEntry:(O)=>{if(Q.length===0)return{type:"item",dataIndex:O,group:{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0}};let P=_2(Q,O),G=Q[P];if(O===G.headerLayoutIndex)return{type:"header",group:G};let L=O-G.headerLayoutIndex-1;return{type:"item",dataIndex:G.firstDataIndex+L,group:G}},layoutToDataIndex:(O)=>{if(Q.length===0)return O;let P=_2(Q,O),G=Q[P];if(O===G.headerLayoutIndex)return-1;let L=O-G.headerLayoutIndex-1;return G.firstDataIndex+L},dataToLayoutIndex:(O)=>{if(Q.length===0)return O;let P=Jj(Q,O),G=Q[P],L=O-G.firstDataIndex;return G.headerLayoutIndex+1+L},getGroupAtLayoutIndex:(O)=>{if(Q.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let P=_2(Q,O);return Q[P]},getGroupAtDataIndex:(O)=>{if(Q.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let P=Jj(Q,O);return Q[P]},getHeaderHeight:typeof K==="number"?(O)=>K:(O)=>{let P=Q[O];if(!P)return 0;return K(P.key,O)},rebuild:(O)=>{Q=Qj(O,X.getGroupForIndex),J=O+Q.length}}};var X2=(j,X,Q,J,K,q=!1)=>{let Y=document.createElement("div");if(Y.className=`${K}-sticky-header`,Y.setAttribute("role","presentation"),Y.setAttribute("aria-hidden","true"),Y.style.position="absolute",Y.style.zIndex="5",Y.style.pointerEvents="none",Y.style.willChange="transform",Y.style.overflow="hidden",q)Y.style.top="0",Y.style.bottom="0",Y.style.left="0";else Y.style.top="0",Y.style.left="0",Y.style.right="0";j.insertBefore(Y,j.firstChild);let B=-1,E=!1,Z=0,D=(A)=>{if(A===B)return;B=A;let b=X.groups;if(A<0||A>=b.length){Y.textContent="";return}let H=b[A],T=J.headerTemplate(H.key,H.groupIndex),_=X.getHeaderHeight(A);if(q)Y.style.width=`${_}px`;else Y.style.height=`${_}px`;if(typeof T==="string")Y.innerHTML=T;else Y.replaceChildren(T)},V=(A)=>{let b=X.groups;if(b.length===0){P();return}let H=0;for(let M=b.length-1;M>=0;M--)if(Q.getOffset(b[M].headerLayoutIndex)<=A){H=M;break}let T=Q.getOffset(b[0].headerLayoutIndex);if(A<T){P();return}if(!E)O();D(H);let _=X.getHeaderHeight(H),U=0,W=H+1;if(W<b.length){let y=Q.getOffset(b[W].headerLayoutIndex)-A;if(y<_)U=y-_}if(U!==Z)if(Z=U,U===0)Y.style.transform="";else{let M=Math.round(U);Y.style.transform=q?`translateX(${M}px)`:`translateY(${M}px)`}},O=()=>{if(E)return;E=!0,Y.style.display=""},P=()=>{if(!E)return;E=!1,Y.style.display="none",B=-1,Z=0,Y.style.transform=""},G=()=>{let A=B;if(B=-1,A>=0)D(A)},L=()=>{Y.remove(),B=-1,E=!1};return Y.style.display="none",{update:V,refresh:G,show:O,hide:P,destroy:L}};var Xj=(j,X,Q,J,K,q)=>{if(J===0||X===0)return q.start=0,q.end=-1,q;let Y=Q.indexAtOffset(j),B=Q.indexAtOffset(j+X);if(B<J-1)B++;return q.start=Math.max(0,Y),q.end=Math.min(J-1,Math.max(0,B)),q},qj=(j,X,Q,J)=>{if(Q===0)return J.start=0,J.end=-1,J;return J.start=Math.max(0,j.start-X),J.end=Math.min(Q-1,j.end+X),J},Yj=(j,X,Q,J,K,q)=>{if(J===0)return 0;let Y=Math.max(0,Math.min(j,J-1)),B=X.getOffset(Y),E=X.getSize(Y),Z=X.getTotalSize(),D=Math.max(0,Z-Q),V;switch(q){case"center":V=B-Q/2+E/2;break;case"end":V=B-Q+E;break;case"start":default:V=B;break}return Math.max(0,Math.min(V,D))},Kj=(j,X,Q)=>{if(Q&&Q.isCompressed)return Q.virtualSize;return X.getTotalSize()},Zj=(j,X)=>{return X.getTotalSize()},Bj=(j,X)=>{return X.getOffset(j)},Uj=(j,X,Q)=>{let J=Math.max(0,X-Q);return Math.max(0,Math.min(j,J))};var $0=(j,X,Q,J,K="start",q,Y=Yj)=>{return Y(j,X,Q,J,q,K)},Nj=(j,X)=>{return j.start===X.start&&j.end===X.end},Dj=(j,X)=>{return j>=X.start&&j<=X.end},Wj=(j)=>{if(j.end<j.start)return 0;return j.end-j.start+1};var Gj=(j,X)=>{let Q=[],J=[];for(let K=j.start;K<=j.end;K++)if(K<X.start||K>X.end)J.push(K);for(let K=X.start;K<=X.end;K++)if(K<j.start||K>j.end)Q.push(K);return{add:Q,remove:J}};n0();var Vj=(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 X=null,Q=null,J=[],K=[];return{name:"withSections",priority:10,setup(q){let{dom:Y,config:B,rawConfig:E}=q,{classPrefix:Z}=B,V=E.item.height;J=E.items?[...E.items]:[];let O=J.length,P={getGroupForIndex:j.getGroupForIndex,headerHeight:j.headerHeight,headerTemplate:j.headerTemplate,sticky:j.sticky??!1};X=Q2(O,P),K=u0(J,X.groups);let G=g0(X,V);q.setSizeConfig(G),q.rebuildSizeCache(K.length),q.dataManager.setItems(K,0,K.length);let L=E.item.template,{headerTemplate:A}=j,b=(y,z,f)=>{if(T0(y))return A(y.groupKey,y.groupIndex);return L(y,z,f)},H=q.methods.get("_getGridLayout"),T=q.methods.get("_replaceGridRenderer"),_=q.methods.get("_updateGridLayoutForGroups");if(H&&T){if(_)_((N)=>{let C=K[N];return!!(C&&T0(C))});let{createGridRenderer:y}=(q2(),zj(_j)),z=H(),f=y(Y.items,b,q.sizeCache,z,Z,q.getContainerWidth(),()=>q.dataManager.getTotal(),B.ariaIdPrefix);T(f)}else q.replaceTemplate(b);if(Y.root.classList.add(`${Z}--grouped`),j.sticky!==!1){Q=X2(Y.root,X,q.sizeCache,{...P,sticky:P.sticky??!1},Z,B.horizontal);let y=Q;q.afterScroll.push((z,f)=>{y.update(z)}),Q.update(q.scrollController.getScrollTop())}let U=()=>{if(!X)return;X.rebuild(J.length),K=u0(J,X.groups);let y=g0(X,V);if(q.setSizeConfig(y),q.rebuildSizeCache(K.length),q.dataManager.setItems(K,0,K.length),Q)Q.refresh()};q.methods.set("setItems",(y)=>{J=[...y],U()}),q.methods.set("appendItems",(y)=>{J=[...J,...y],U()}),q.methods.set("prependItems",(y)=>{J=[...y,...J],U()}),q.methods.set("removeItem",(y)=>{J=J.filter((z)=>z.id!==y),U()});let{animateScroll:W,cancelScroll:M}=oj(q.scrollController,q.renderIfNeeded);q.methods.set("scrollToIndex",(y,z)=>{let f=X.dataToLayoutIndex(y),{align:N,behavior:C,duration:x}=ij(z),d=q.dataManager.getTotal(),$=$0(f,q.sizeCache,q.state.viewportState.containerSize,d,N,q.getCachedCompression());if(C==="smooth")W(q.scrollController.getScrollTop(),$,x);else M(),q.scrollController.scrollTo($)}),q.methods.set("_getItems",()=>J),q.methods.set("_getTotal",()=>J.length),q.destroyHandlers.push(()=>{if(L0!==null)cancelAnimationFrame(L0),L0=null;if(Q)Q.destroy(),Q=null;Y.root.classList.remove(`${Z}--grouped`)})},destroy(){if(Q)Q.destroy(),Q=null}}},V2=300,nj=(j)=>j<0.5?2*j*j:-1+(4-2*j)*j,L0=null,oj=(j,X)=>{let Q=()=>{if(L0!==null)cancelAnimationFrame(L0),L0=null};return{animateScroll:(K,q,Y)=>{if(Q(),Math.abs(q-K)<1){j.scrollTo(q);return}let B=performance.now(),E=(Z)=>{let D=Z-B,V=Math.min(D/Y,1),O=K+(q-K)*nj(V);if(j.scrollTo(O),X(),V<1)L0=requestAnimationFrame(E);else L0=null};L0=requestAnimationFrame(E)},cancelScroll:Q}},ij=(j)=>{if(typeof j==="string")return{align:j,behavior:"auto",duration:V2};if(j&&typeof j==="object")return{align:j.align??"start",behavior:j.behavior??"auto",duration:j.duration??V2};return{align:"start",behavior:"auto",duration:V2}};var Y2=(j)=>{let X=Math.max(1,Math.floor(j.columns)),Q=j.gap??0,J=j.isHeaderFn,K={row:0,col:0},q=(G)=>{if(G<=0)return 0;if(!J)return Math.ceil(G/X);let L=0,A=0,b=0;for(let H=0;H<G;H++)if(J(H)){if(b++,A>0)L++,A=0;L++,A=0}else if(A++,A>=X)L++,A=0;if(A>0)L++;return L},Y=(G)=>{return K.row=B(G),K.col=E(G),K},B=(G)=>{if(!J)return Math.floor(G/X);let L=0,A=0;for(let b=0;b<=G;b++)if(J(b)){if(A>0)L++,A=0;if(b===G)return L;L++,A=0}else{if(b===G)return L;if(A++,A>=X)L++,A=0}return console.warn(`⚠️ getRow(${G}) fell through - returning ${L}`),L},E=(G)=>{if(!J)return G%X;if(J(G))return 0;let L=0;for(let A=0;A<=G;A++)if(J(A))L=0;else{if(A===G)return L;if(L++,L>=X)L=0}return L},Z=(G,L,A)=>{if(A<=0)return{start:0,end:-1};if(!J){let U=Math.max(0,G*X),W=Math.min(A-1,(L+1)*X-1);return{start:U,end:W}}let b=-1,H=-1,T=0,_=0;for(let U=0;U<A;U++){if(J(U)){if(_>0)T++,_=0;if(T>=G&&T<=L){if(b===-1)b=U;H=U}T++,_=0}else{if(T>=G&&T<=L){if(b===-1)b=U;H=U}if(_++,_>=X)T++,_=0}if(T>L&&_===0)break}if(b===-1)return{start:0,end:-1};return{start:b,end:H}},D=(G,L,A)=>{if(L<0||L>=X)return-1;let b=G*X+L;if(b<0||b>=A)return-1;return b},V=(G)=>{let L=(X-1)*Q;return Math.max(0,(G-L)/X)};return{get columns(){return X},get gap(){return Q},update:(G)=>{if(G.columns!==void 0)X=Math.max(1,Math.floor(G.columns));if(G.gap!==void 0)Q=G.gap;if(G.isHeaderFn!==void 0)J=G.isHeaderFn},getTotalRows:q,getPosition:Y,getRow:B,getCol:E,getItemRange:Z,getItemIndex:D,getColumnWidth:V,getColumnOffset:(G,L)=>{let A=V(L);return G*(A+Q)}}};q2();var Mj=(j)=>{if(!j.columns||j.columns<1)throw Error("[vlist/builder] withGrid: columns must be a positive integer >= 1");let X=null,Q=null;return{name:"withGrid",priority:10,setup(J){let{dom:K,emitter:q,config:Y,rawConfig:B}=J,{classPrefix:E}=Y;if(Y.reverse)throw Error("[vlist/builder] withGrid cannot be used with reverse: true");let Z=B.items?.some((_)=>_.__groupHeader===!0),D={columns:j.columns,gap:j.gap??0};if(Z)D.isHeaderFn=(_)=>{let U=J.dataManager.getItem(_);return!!(U&&U.__groupHeader===!0)};X=Y2(D);let V=X.gap;J.setVirtualTotalFn(()=>{let _=J.dataManager.getTotal();return X.getTotalRows(_)});let O=B.item,P=Y.horizontal?O.width:O.height,G={containerWidth:J.getContainerWidth(),columns:X.columns,gap:X.gap};if(typeof P==="function")J.setSizeConfig((_)=>{let U=G.containerWidth-2,W=(G.columns-1)*G.gap,M=(U-W)/G.columns,y={containerWidth:G.containerWidth,columns:G.columns,gap:G.gap,columnWidth:M,row:X.getRow(_),column:X.getCol(_),totalRows:X.getTotalRows(J.dataManager.getTotal()),totalColumns:G.columns};return P(_,y)+G.gap});else if(V>0)J.setSizeConfig(P+V);J.rebuildSizeCache(),K.root.classList.add(`${E}--grid`);let L=J.getContainerWidth(),A=B.item.template,b=()=>{Q=x0(K.items,A,J.sizeCache,X,E,L,()=>J.dataManager.getTotal(),Y.ariaIdPrefix,Y.horizontal),J.replaceRenderer(Q)};b(),J.methods.set("_getGridLayout",()=>X),J.methods.set("_getGridConfig",()=>D),J.methods.set("_replaceGridRenderer",(_)=>{Q=_}),J.methods.set("_updateGridLayoutForGroups",(_)=>{X.update({isHeaderFn:_});let U=J.dataManager.getTotal(),W=0;for(let M=0;M<U;M++)if(X.getCol(M)===0){let y=J.sizeCache.getSize(M);W+=y}if(J.sizeCache.getTotalSize=()=>W,Y.horizontal)J.dom.content.style.width=`${W}px`;else J.dom.content.style.height=`${W}px`;b()}),J.methods.set("updateGrid",(_)=>{if(_.columns!==void 0){if(!Number.isInteger(_.columns)||_.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");D.columns=_.columns}if(_.gap!==void 0){if(_.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");D.gap=_.gap}if(X)X.update(D);let U=J.getContainerWidth();if(G.containerWidth=U,G.columns=D.columns,G.gap=D.gap??0,Q)Q.updateContainerWidth(U);J.rebuildSizeCache(),J.updateContentSize(J.sizeCache.getTotalSize()),J.updateCompressionMode();for(let W=0;W<J.contentSizeHandlers.length;W++)J.contentSizeHandlers[W]();if(Q)Q.clear();J.forceRender()});let H=()=>{if(J.state.isDestroyed)return;let _=J.scrollController.getScrollTop(),U=J.state.viewportState.containerSize,W=J.getVirtualTotal(),M={start:0,end:0};if(W===0||U===0)M.start=0,M.end=0;else{M.start=Math.max(0,J.sizeCache.indexAtOffset(_));let k=J.sizeCache.indexAtOffset(_+U);if(k<W-1)k++;M.end=Math.min(W-1,Math.max(0,k))}let y=Y.overscan??3,z={start:Math.max(0,M.start-y),end:Math.min(W-1,M.end+y)};J.state.viewportState.scrollPosition=_,J.state.viewportState.visibleRange=M,J.state.viewportState.renderRange=z;let f=J.state.lastRenderRange,N=J.state.viewportState.isCompressed;if(z.start===f.start&&z.end===f.end){if(N)Q.updatePositions(J.getCompressionContext());return}let C=J.dataManager.getTotal(),x=X.getItemRange(z.start,z.end,C),d=J.dataManager.getItemsInRange(x.start,x.end),$=N?J.getCompressionContext():void 0;Q.render(d,x,new Set,-1,$),J.state.lastRenderRange={...z},q.emit("range:change",{range:z})},T=()=>{if(J.state.isDestroyed)return;J.state.lastRenderRange={start:-1,end:-1},H()};if(J.setRenderFns(H,T),J.resizeHandlers.push((_,U)=>{if(Q)Q.updateContainerWidth(_)}),J.methods.set("scrollToIndex",(_,U)=>{let W=Math.floor(_/j.columns),{align:M,behavior:y}=tj(U),z=J.dataManager.getState(),f=X.getTotalRows(z.total),N=Math.max(0,Math.min(W,f-1)),C=$0(N,J.sizeCache,J.state.viewportState.containerSize,f,M,J.getCachedCompression());if(y==="smooth")J.scrollController.scrollTo(C);else J.scrollController.scrollTo(C)}),!J.methods.has("_getTotal"))J.methods.set("_getTotal",()=>J.dataManager.getTotal());J.destroyHandlers.push(()=>{if(Q)Q.destroy(),Q=null;K.root.classList.remove(`${E}--grid`)})},destroy(){if(Q)Q.destroy(),Q=null}}},M2=300,tj=(j)=>{if(typeof j==="string")return{align:j,behavior:"auto",duration:M2};if(j&&typeof j==="object")return{align:j.align??"start",behavior:j.behavior??"auto",duration:j.duration??M2};return{align:"start",behavior:"auto",duration:M2}};q2();var K2=(j)=>({selected:new Set(j??[]),focusedIndex:-1}),m0=(j,X,Q)=>{if(Q==="none")return j;let J=new Set(j.selected);if(Q==="single"){if(J.clear(),X.length>0)J.add(X[0])}else for(let K of X)J.add(K);return{...j,selected:J}},d0=(j,X)=>{let Q=new Set(j.selected);for(let J of X)Q.delete(J);return{...j,selected:Q}},z0=(j,X,Q)=>{if(Q==="none")return j;if(j.selected.has(X))return d0(j,[X]);else return m0(j,[X],Q)},Z2=(j,X,Q)=>{if(Q!=="multiple")return j;return{...j,selected:new Set(X.map((J)=>J.id))}},B2=(j)=>({...j,selected:new Set}),A2=(j,X)=>{return j.focusedIndex=X,j},E2=(j,X,Q=!0)=>{if(X===0)return j;let J=j.focusedIndex-1;if(J<0)J=Q?X-1:0;return j.focusedIndex=J,j},F2=(j,X,Q=!0)=>{if(X===0)return j;let J=j.focusedIndex+1;if(J>=X)J=Q?0:X-1;return j.focusedIndex=J,j},L2=(j,X)=>{if(X===0)return j;return j.focusedIndex=0,j},O2=(j,X)=>{if(X===0)return j;return j.focusedIndex=X-1,j};var Aj=(j,X)=>{return j.selected.has(X)},v0=(j)=>{return Array.from(j.selected)},w0=(j,X)=>{let Q=[];for(let J of j.selected){let K=X(J);if(K)Q.push(K)}return Q};var Ej=(j)=>{let X=j?.mode??"single",Q=j?.initial,J=K2(Q),K=null;return{name:"withSelection",priority:50,methods:["select","deselect","toggleSelect","selectAll","clearSelection","getSelected","getSelectedItems"],setup(q){let{dom:Y,emitter:B,config:E}=q,{classPrefix:Z,ariaIdPrefix:D}=E;if(X==="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 V=new Map,O=()=>{V.clear();let _=q.dataManager.getTotal();for(let U=0;U<_;U++){let W=q.dataManager.getItem(U);if(W)V.set(W.id,U)}};O();let{renderIfNeeded:P,forceRender:G}=q.getRenderFns(),L=()=>{q.dom.items.querySelectorAll("[data-index]").forEach((U)=>{let W=U,M=W.dataset.id;if(M!==void 0){let y=/^\d+$/.test(M)?parseInt(M,10):M,z=J.selected.has(y),N=parseInt(W.dataset.index??"-1",10)===J.focusedIndex;W.classList.toggle(`${Z}-item--selected`,z),W.classList.toggle(`${Z}-item--focused`,N),W.ariaSelected=z?"true":"false"}})},A=()=>{if(q.state.isDestroyed)return;P(),L()},b=()=>{if(q.state.isDestroyed)return;G(),L()};q.setRenderFns(A,b);let H=()=>{L();let _=(U)=>{let W=V.get(U);if(W===void 0)return;return q.dataManager.getItem(W)};B.emit("selection:change",{selected:v0(J),items:w0(J,_)})};K=document.createElement("div"),K.setAttribute("aria-live","polite"),K.setAttribute("aria-atomic","true"),K.className=`${Z}-live-region`,K.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",Y.root.appendChild(K);let T=K;B.on("selection:change",({selected:_})=>{let U=_.length;if(U===0)T.textContent="";else if(U===1)T.textContent="1 item selected";else T.textContent=`${U} items selected`}),q.clickHandlers.push((_)=>{if(q.state.isDestroyed)return;let W=_.target.closest("[data-index]");if(!W)return;let M=parseInt(W.dataset.index??"-1",10);if(M<0)return;let y=q.dataManager.getItem(M);if(!y)return;B.emit("item:click",{item:y,index:M,event:_}),J=A2(J,M),Y.root.setAttribute("aria-activedescendant",`${D}-item-${M}`),J=z0(J,y.id,X),H()}),q.keydownHandlers.push((_)=>{if(q.state.isDestroyed)return;let U=q.dataManager.getTotal(),W=J.focusedIndex,M=!1,y=!1,z=J;switch(_.key){case"ArrowUp":z=E2(J,U),M=!0,y=!0;break;case"ArrowDown":z=F2(J,U),M=!0,y=!0;break;case"Home":z=L2(J,U),M=!0,y=!0;break;case"End":z=O2(J,U),M=!0,y=!0;break;case" ":case"Enter":if(J.focusedIndex>=0){let f=q.dataManager.getItem(J.focusedIndex);if(f)z=z0(J,f.id,X);M=!0}break}if(M){_.preventDefault(),J=z;let f=J.focusedIndex;if(f>=0){let N=q.dataManager.getState(),C=$0(f,q.sizeCache,q.state.viewportState.containerSize,N.total,"center",q.getCachedCompression());q.scrollController.scrollTo(C),Y.root.setAttribute("aria-activedescendant",`${D}-item-${f}`)}else Y.root.removeAttribute("aria-activedescendant");if(y){let{selected:N}=J;if(W>=0&&W!==f){let C=q.dataManager.getItem(W);if(C)q.renderer.updateItemClasses(W,N.has(C.id),!1)}if(f>=0){let C=q.dataManager.getItem(f);if(C)q.renderer.updateItemClasses(f,N.has(C.id),!0)}}else{b();let N=(C)=>{let x=V.get(C);if(x===void 0)return;return q.dataManager.getItem(x)};B.emit("selection:change",{selected:v0(J),items:w0(J,N)})}}}),q.methods.set("select",(..._)=>{J=m0(J,_,X),H()}),q.methods.set("deselect",(..._)=>{J=d0(J,_),H()}),q.methods.set("toggleSelect",(_)=>{J=z0(J,_,X),H()}),q.methods.set("selectAll",()=>{if(X!=="multiple")return;let _=q.getAllLoadedItems();J=Z2(J,_,X),O(),H()}),q.methods.set("clearSelection",()=>{J=B2(J);let{renderRange:_,isCompressed:U}=q.state.viewportState,W=q.getItemsForRange(_),M=U?q.getCompressionContext():void 0;q.renderer.render(W,_,J.selected,J.focusedIndex,M),B.emit("selection:change",{selected:[],items:[]})}),q.methods.set("getSelected",()=>{return v0(J)}),q.methods.set("getSelectedItems",()=>{return w0(J,(U)=>{let W=V.get(U);if(W===void 0)return;return q.dataManager.getItem(W)})}),q.destroyHandlers.push(()=>{if(T&&T.parentNode)T.remove()})},destroy(){if(K&&K.parentNode)K.remove();K=null}}};var Fj=()=>{return{name:"withSnapshots",priority:50,methods:["getScrollSnapshot","restoreScroll"],setup(j){j.methods.set("getScrollSnapshot",()=>{let X=j.scrollController.getScrollTop(),Q=j.getCachedCompression(),J=j.getVirtualTotal(),K=j.methods.get("getSelected"),q=K&&K().length>0?K():void 0;if(J===0){let Z={index:0,offsetInItem:0};if(q)Z.selectedIds=q;return Z}let Y,B;if(Q.isCompressed){let D=X/Q.virtualSize*J;Y=Math.max(0,Math.min(Math.floor(D),J-1)),B=(D-Y)*j.sizeCache.getSize(Y)}else Y=j.sizeCache.indexAtOffset(X),B=X-j.sizeCache.getOffset(Y);B=Math.max(0,B);let E={index:Y,offsetInItem:B};if(q)E.selectedIds=q;return E}),j.methods.set("restoreScroll",(X)=>{let{index:Q,offsetInItem:J,selectedIds:K}=X,q=j.getCachedCompression(),Y=j.getVirtualTotal();if(Y===0)return;let B=Math.max(0,Math.min(Q,Y-1)),E;if(q.isCompressed){let D=j.sizeCache.getSize(B),V=D>0?J/D:0;E=(B+V)/Y*q.virtualSize}else E=j.sizeCache.getOffset(B)+J;let Z=Math.max(0,q.virtualSize-j.state.viewportState.containerSize);if(E=Math.max(0,Math.min(E,Z)),j.scrollController.scrollTo(E),K&&K.length>0){let D=j.methods.get("select");if(D)D(...K)}})}}};export{Fj as withSnapshots,Ej as withSelection,Vj as withSections,n2 as withScrollbar,t2 as withScale,jj as withPage,Mj as withGrid,e2 as withAsync,g2 as vlist,z0 as toggleSelection,Xj as simpleVisibleRange,m0 as selectItems,Z2 as selectAll,Nj as rangesEqual,i0 as rafThrottle,a2 as needsScaling,e0 as mergeRanges,Aj as isSelected,T0 as isSectionHeader,P0 as isPlaceholderItem,Dj as isInRange,w0 as getSelectedItems,v0 as getSelectedIds,M0 as getScaleState,r2 as getScaleInfo,M0 as getScale,Wj as getRangeCount,s2 as getMaxItemsWithoutScaling,G2 as filterPlaceholders,Gj as diffRanges,d0 as deselectItems,X2 as createStickyHeader,t0 as createSparseStorage,R0 as createSizeCache,K2 as createSelectionState,g0 as createSectionedSizeFn,Q2 as createSectionLayout,C0 as createScrollbar,i2 as createScrollController,j2 as createPlaceholderManager,x0 as createGridRenderer,Y2 as createGridLayout,a0 as createEmitter,J2 as createAsyncManager,B2 as clearSelection,Uj as clampScrollPosition,Kj as calculateTotalSize,$0 as calculateScrollToIndex,s0 as calculateScaledVisibleRange,r0 as calculateScaledScrollToIndex,c2 as calculateScaledRenderRange,k0 as calculateScaledItemPosition,qj as calculateRenderRange,h0 as calculateMissingRanges,Bj as calculateItemOffset,l2 as calculateIndexFromScrollPosition,Zj as calculateActualSize,u0 as buildLayoutItems,H0 as MAX_VIRTUAL_HEIGHT};
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export { createSizeCache, countVisibleItems, countItemsFittingFromBottom, getOffsetForVirtualIndex, type SizeCache, } from "./sizes";
|
|
6
6
|
export { createRenderer, createDOMStructure, updateContentHeight, updateContentWidth, resolveContainer, getContainerDimensions, type Renderer, type DOMStructure, type CompressionContext, type CompressedPositionFn, type CompressionStateFn, } from "./renderer";
|
|
7
|
-
export { createViewportState, updateViewportState, updateViewportSize, updateViewportItems, calculateRenderRange, calculateTotalSize, calculateActualSize, calculateItemOffset, calculateScrollToIndex, clampScrollPosition, getScrollDirection, rangesEqual, isInRange, getRangeCount, diffRanges, getSimpleCompressionState, simpleVisibleRange, simpleScrollToIndex, NO_COMPRESSION, type CompressionState, type VisibleRangeFn, type ScrollToIndexFn, } from "./viewport";
|
|
7
|
+
export { createViewportState, updateViewportState, updateViewportSize, updateViewportItems, calculateRenderRange, calculateTotalSize, calculateActualSize, calculateItemOffset, calculateScrollToIndex, clampScrollPosition, getScrollDirection, rangesEqual, isInRange, getRangeCount, rangeToIndices, diffRanges, getSimpleCompressionState, simpleVisibleRange, simpleScrollToIndex, NO_COMPRESSION, type CompressionState, type VisibleRangeFn, type ScrollToIndexFn, } from "./viewport";
|
|
8
8
|
export { MAX_VIRTUAL_HEIGHT, getCompressionState, getCompressionState as getCompression, needsCompression, getMaxItemsWithoutCompression, getCompressionInfo, calculateCompressedVisibleRange, calculateCompressedRenderRange, calculateCompressedItemPosition, calculateCompressedScrollToIndex, calculateIndexFromScrollPosition, } from "./scale";
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -8,13 +8,13 @@ import type { CompressionState } from "./viewport";
|
|
|
8
8
|
import type { SizeCache } from "./sizes";
|
|
9
9
|
/**
|
|
10
10
|
* Optional compression position calculator.
|
|
11
|
-
* Injected by the monolithic factory or the withCompression
|
|
11
|
+
* Injected by the monolithic factory or the withCompression feature.
|
|
12
12
|
* When not provided, the renderer uses simple sizeCache offsets.
|
|
13
13
|
*/
|
|
14
14
|
export type CompressedPositionFn = (index: number, scrollTop: number, sizeCache: SizeCache, totalItems: number, containerHeight: number, compression: CompressionState, rangeStart?: number) => number;
|
|
15
15
|
/**
|
|
16
16
|
* Optional compression state getter.
|
|
17
|
-
* Injected by the monolithic factory or the withCompression
|
|
17
|
+
* Injected by the monolithic factory or the withCompression feature.
|
|
18
18
|
* When not provided, the renderer assumes no compression.
|
|
19
19
|
*/
|
|
20
20
|
export type CompressionStateFn = (totalItems: number, sizeCache: SizeCache) => CompressionState;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* (the common case), all calculations use simple size-cache math
|
|
8
8
|
* with zero dependency on the compression module.
|
|
9
9
|
*
|
|
10
|
-
* This keeps the builder core lightweight. The withCompression
|
|
10
|
+
* This keeps the builder core lightweight. The withCompression feature
|
|
11
11
|
* and the monolithic createVList entry point import compression
|
|
12
12
|
* separately and pass the state in.
|
|
13
13
|
*/
|