@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 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 plugin
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 plugins receive during setup.
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 plugins wire into.
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 plugins.
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
@@ -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
- * Plugins compose features *around* the hot path via extension points:
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
  */
@@ -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 plugin replaces this manager with the full
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 plugins are implemented.
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
  */
@@ -21,5 +21,5 @@
21
21
  * @packageDocumentation
22
22
  */
23
23
  export { vlist } from "./core";
24
- export type { VListBuilder, BuiltVList, BuilderConfig, VListPlugin, BuilderContext, ResolvedBuilderConfig, BuilderState, CachedCompression, } from "./types";
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=materializectx.d.ts.map
146
+ //# sourceMappingURL=materialize.d.ts.map
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * vlist/builder - Types
3
- * Plugin interface, builder config, builder context, and return types
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 plugin) */
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 plugins receive during setup.
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 plugins that need original values) */
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
- * Plugins register lightweight callbacks that run after each
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
- * Plugins register handlers for user interaction events.
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
- /** Plugins register public methods by name. Exposed on the returned API. */
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 plugins).
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 plugin).
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 plugins that change what "total" means
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 plugin to inject grouped size function and by grid to add gap.
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
- * Plugins that change sizes (groups, grid) call this before rebuildSizeCache.
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 plugins that alter totals.
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 plugins that need to completely replace the render logic
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 plugin to use window instead of viewport for scroll events.
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 plugin to use window.innerWidth/innerHeight instead
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 plugin where the viewport doesn't need observation
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
- * VListPlugin — the interface for builder plugins.
210
+ * VListFeature — the interface for builder features.
211
211
  *
212
- * Each plugin:
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 plugins it conflicts with
217
+ * - Optionally declares methods it adds and features it conflicts with
218
218
  */
219
- export interface VListPlugin<T extends VListItem = VListItem> {
220
- /** Unique plugin name (used for deduplication and error messages) */
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 plugin adds to the public API */
228
+ /** Methods this feature adds to the public API */
229
229
  readonly methods?: readonly string[];
230
- /** Plugins this plugin conflicts with (cannot be combined) */
230
+ /** Features this feature conflicts with (cannot be combined) */
231
231
  readonly conflicts?: readonly string[];
232
232
  }
233
- /** Factory function that returns a plugin */
234
- export type PluginFactory<T extends VListItem = VListItem> = VListPlugin<T>;
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 plugin. Chainable. */
238
- use(plugin: VListPlugin<T>): VListBuilder<T>;
239
- /** Materialize the virtual list. Creates DOM, initializes plugins, returns API. */
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 Plugin
3
- * Wraps async data loading with sparse storage into a VListPlugin for the composable builder.
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 { VListPlugin } from "../../builder/types";
20
- /** Data plugin configuration */
21
- export interface DataPluginConfig<T extends VListItem = VListItem> {
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 plugin for the builder.
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: DataPluginConfig<T>) => VListPlugin<T>;
60
- //# sourceMappingURL=plugin.d.ts.map
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 DataPluginConfig } from "./plugin";
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 Plugin
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 { VListPlugin } from "../../builder/types";
22
- /** Grid plugin configuration */
23
- export interface GridPluginConfig {
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 plugin for the builder.
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: GridPluginConfig) => VListPlugin<T>;
48
- //# sourceMappingURL=plugin.d.ts.map
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 GridPluginConfig } from "./plugin";
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 Plugin
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 plugins that depend on scroll)
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 { VListPlugin } from "../../builder/types";
20
+ import type { VListFeature } from "../../builder/types";
21
21
  /**
22
- * Create a window scroll mode plugin.
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>() => VListPlugin<T>;
53
- //# sourceMappingURL=plugin.d.ts.map
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 Plugin
2
+ * vlist/window - Window Scroll Mode Feature
3
3
  *
4
- * Entry point for the window scroll plugin.
4
+ * Entry point for the window scroll feature.
5
5
  */
6
- export { withPage } from "./plugin";
7
- export type { VListPlugin } from "../../builder/types";
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 Plugin
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 { VListPlugin } from "../../builder/types";
22
+ import type { VListFeature } from "../../builder/types";
23
23
  /**
24
- * Create a compression plugin for the builder.
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>() => VListPlugin<T>;
44
- //# sourceMappingURL=plugin.d.ts.map
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 "./plugin";
9
+ export { withScale } from "./feature";
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -1,6 +1,6 @@
1
1
  /**
2
- * vlist/scroll - Builder Plugin
3
- * Wraps the custom scrollbar into a VListPlugin for the composable builder.
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 { VListPlugin } from "../../builder/types";
20
- /** Scrollbar plugin configuration */
21
- export interface ScrollbarPluginConfig {
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 plugin for the builder.
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?: ScrollbarPluginConfig) => VListPlugin<T>;
60
- //# sourceMappingURL=plugin.d.ts.map
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 ScrollbarPluginConfig } from "./plugin";
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 Plugin
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 { VListPlugin } from "../../builder/types";
25
- /** Groups plugin configuration */
26
- export interface GroupsPluginConfig {
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 plugin for the builder.
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: GroupsPluginConfig) => VListPlugin<T>;
64
- //# sourceMappingURL=plugin.d.ts.map
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 GroupsPluginConfig } from "./plugin";
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 Plugin
3
- * Wraps the selection domain into a VListPlugin for the composable builder.
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 { VListPlugin } from "../../builder/types";
21
- /** Selection plugin configuration */
22
- export interface SelectionPluginConfig {
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 plugin for the builder.
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?: SelectionPluginConfig) => VListPlugin<T>;
44
- //# sourceMappingURL=plugin.d.ts.map
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 SelectionPluginConfig } from "./plugin";
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 Plugin
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 plugins initialized)
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 { VListPlugin } from "../../builder/types";
20
+ import type { VListFeature } from "../../builder/types";
21
21
  /**
22
- * Create a snapshots plugin for the builder.
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>() => VListPlugin<T>;
44
- //# sourceMappingURL=plugin.d.ts.map
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
- * Plugin for SPA navigation and tab switching
3
+ * Feature for SPA navigation and tab switching
4
4
  *
5
5
  * Usage: import { withSnapshots } from 'vlist/snapshots'
6
6
  */
7
- export { withSnapshots } from "./plugin";
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, VListPlugin, BuilderContext, } from "./builder";
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 plugin.
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 plugin.
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 plugin
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
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floor/vlist",
3
- "version": "0.9.0",
3
+ "version": "0.9.2",
4
4
  "description": "Lightweight, high-performance virtual list with zero dependencies",
5
5
  "author": {
6
6
  "name": "Floor IO",