@floor/vlist 0.9.9 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -20
- package/dist/builder/scroll.d.ts +23 -1
- package/dist/constants.d.ts +1 -1
- package/dist/features/grid/renderer.d.ts +11 -1
- package/dist/features/masonry/feature.d.ts +65 -0
- package/dist/features/masonry/index.d.ts +9 -0
- package/dist/features/masonry/layout.d.ts +29 -0
- package/dist/features/masonry/renderer.d.ts +47 -0
- package/dist/features/masonry/types.d.ts +68 -0
- package/dist/features/selection/feature.d.ts +7 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -1
- package/dist/types.d.ts +15 -0
- package/dist/vlist.css +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,14 +4,14 @@ Lightweight, high-performance virtual list with zero dependencies and dimension-
|
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/@floor/vlist)
|
|
6
6
|
[](https://bundlephobia.com/package/@floor/vlist)
|
|
7
|
-
[](https://github.com/floor/vlist)
|
|
8
8
|
[](https://github.com/floor/vlist/blob/main/LICENSE)
|
|
9
9
|
|
|
10
10
|
- **Zero dependencies** — no external libraries
|
|
11
11
|
- **Ultra memory efficient** — ~0.1-0.2 MB constant overhead regardless of dataset size
|
|
12
12
|
- **8–12 KB gzipped** — pay only for features you use (vs 20 KB+ monolithic alternatives)
|
|
13
|
-
- **Builder API** — composable
|
|
14
|
-
- **Grid, sections, async, selection, scale** — all opt-in
|
|
13
|
+
- **Builder API** — composable features with perfect tree-shaking
|
|
14
|
+
- **Grid, masonry, sections, async, selection, scale** — all opt-in
|
|
15
15
|
- **Horizontal & vertical** — semantically correct orientation support
|
|
16
16
|
- **Reverse, page-scroll, wrap** — every layout mode
|
|
17
17
|
- **Accessible** — WAI-ARIA, keyboard navigation, screen-reader friendly
|
|
@@ -19,12 +19,13 @@ Lightweight, high-performance virtual list with zero dependencies and dimension-
|
|
|
19
19
|
|
|
20
20
|
**30+ interactive examples → [vlist.dev](https://vlist.dev)**
|
|
21
21
|
|
|
22
|
-
##
|
|
22
|
+
## v1.0.0 Highlights
|
|
23
23
|
|
|
24
|
+
- 🧱 **Masonry layout** — Pinterest-style shortest-lane placement via `withMasonry()`
|
|
25
|
+
- ⚡ **Performance optimized** — 13-pattern optimization playbook applied across the entire rendering pipeline
|
|
24
26
|
- ✨ **Dimension-agnostic API** — semantically correct terminology for both orientations
|
|
25
27
|
- 🎯 **Horizontal sections** — sticky headers work in horizontal carousels
|
|
26
28
|
- 🎨 **Horizontal grid layouts** — 2D grids work in both orientations
|
|
27
|
-
- 📐 **`orientation` not `direction`** — clearer, more intuitive configuration
|
|
28
29
|
|
|
29
30
|
## Installation
|
|
30
31
|
|
|
@@ -80,10 +81,11 @@ const list = vlist({
|
|
|
80
81
|
|
|
81
82
|
### Plugins
|
|
82
83
|
|
|
83
|
-
|
|
|
84
|
-
|
|
84
|
+
| Feature | Size | Description |
|
|
85
|
+
|---------|------|-------------|
|
|
85
86
|
| **Base** | 7.7 KB | Core virtualization |
|
|
86
87
|
| `withGrid()` | +4.0 KB | 2D grid layout |
|
|
88
|
+
| `withMasonry()` | +2.9 KB | Pinterest-style masonry layout |
|
|
87
89
|
| `withSections()` | +4.6 KB | Grouped lists with sticky/inline headers |
|
|
88
90
|
| `withAsync()` | +5.3 KB | Lazy loading with adapters |
|
|
89
91
|
| `withSelection()` | +2.3 KB | Single/multiple selection + keyboard nav |
|
|
@@ -177,6 +179,7 @@ const list = vlist({
|
|
|
177
179
|
| **Horizontal carousel** | `orientation: 'horizontal'`, `item.width` |
|
|
178
180
|
| **Horizontal sections** | `orientation: 'horizontal'` + `withSections()` |
|
|
179
181
|
| **Horizontal grid** | `orientation: 'horizontal'` + `withGrid()` |
|
|
182
|
+
| **Masonry** | `withMasonry({ columns: 4, gap: 16 })` |
|
|
180
183
|
| **Page-level scroll** | `withPage()` |
|
|
181
184
|
| **1M+ items** | `withScale()` — auto-compresses scroll space |
|
|
182
185
|
| **Wrap navigation** | `scroll: { wrap: true }` |
|
|
@@ -266,6 +269,7 @@ Each plugin's config is fully typed — hover in your IDE for details.
|
|
|
266
269
|
|
|
267
270
|
```typescript
|
|
268
271
|
withGrid({ columns: 4, gap: 16 })
|
|
272
|
+
withMasonry({ columns: 4, gap: 16 })
|
|
269
273
|
withSections({ getGroupForIndex, headerHeight, headerTemplate, sticky?: true })
|
|
270
274
|
withSelection({ mode: 'single' | 'multiple', initial?: [...ids] })
|
|
271
275
|
withAsync({ adapter: { read }, loading?: { cancelThreshold? } })
|
|
@@ -382,7 +386,7 @@ const list: VList<Photo> = vlist<Photo>({
|
|
|
382
386
|
## Contributing
|
|
383
387
|
|
|
384
388
|
1. Fork → branch → make changes → add tests → pull request
|
|
385
|
-
2. Run `bun test` (
|
|
389
|
+
2. Run `bun test` (2268 tests) and `bun run build` before submitting
|
|
386
390
|
|
|
387
391
|
## License
|
|
388
392
|
|
|
@@ -390,18 +394,7 @@ const list: VList<Photo> = vlist<Photo>({
|
|
|
390
394
|
|
|
391
395
|
## Changelog
|
|
392
396
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
**Breaking Changes:**
|
|
396
|
-
- Renamed `direction` → `orientation` for semantic clarity
|
|
397
|
-
- Renamed `HeightCache` → `SizeCache` and all related APIs
|
|
398
|
-
- Renamed `scrollTop` → `scrollPosition` in ViewportState and events
|
|
399
|
-
- See [Migration Guide](https://vlist.dev/docs/refactoring/v0.9.0-migration-guide.md)
|
|
400
|
-
|
|
401
|
-
**New Features:**
|
|
402
|
-
- Horizontal orientation support for grid and sections plugins
|
|
403
|
-
- Complete dimension-agnostic architecture
|
|
404
|
-
- Proper axis swapping for horizontal 2D grids
|
|
397
|
+
See [CHANGELOG.md](https://vlist.dev/docs/CHANGELOG.md) for the full release history. A simplified [changelog.txt](./changelog.txt) is also available.
|
|
405
398
|
|
|
406
399
|
## Links
|
|
407
400
|
|
package/dist/builder/scroll.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* vlist/builder — Scroll Utilities
|
|
3
|
-
* Easing
|
|
3
|
+
* Easing, scroll-argument resolution, and smooth scroll animation.
|
|
4
|
+
*
|
|
5
|
+
* Shared by builder/core.ts, grid feature, and sections feature to
|
|
6
|
+
* avoid duplicating ~70 lines of scroll helpers in each consumer.
|
|
4
7
|
*/
|
|
5
8
|
import type { ScrollToOptions } from "../types";
|
|
6
9
|
export declare const DEFAULT_SMOOTH_DURATION = 300;
|
|
@@ -10,4 +13,23 @@ export declare const resolveScrollArgs: (alignOrOptions?: "start" | "center" | "
|
|
|
10
13
|
behavior: "auto" | "smooth";
|
|
11
14
|
duration: number;
|
|
12
15
|
};
|
|
16
|
+
/** Scroll controller interface — minimal surface needed by the animation. */
|
|
17
|
+
export interface ScrollController {
|
|
18
|
+
scrollTo: (position: number) => void;
|
|
19
|
+
getScrollTop: () => number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create a smooth scroll animator with its own animation state.
|
|
23
|
+
*
|
|
24
|
+
* Each call returns an independent { animateScroll, cancelScroll } pair
|
|
25
|
+
* with a private animationFrameId — multiple consumers won't stomp each
|
|
26
|
+
* other's animations.
|
|
27
|
+
*
|
|
28
|
+
* @param scrollController - Object with scrollTo() method
|
|
29
|
+
* @param renderFn - Called after each scroll step to update the viewport
|
|
30
|
+
*/
|
|
31
|
+
export declare const createSmoothScroll: (scrollController: ScrollController, renderFn: () => void) => {
|
|
32
|
+
animateScroll: (from: number, to: number, duration: number) => void;
|
|
33
|
+
cancelScroll: () => void;
|
|
34
|
+
};
|
|
13
35
|
//# sourceMappingURL=scroll.d.ts.map
|
package/dist/constants.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ export declare const DEFAULT_PAGE_SIZE = 50;
|
|
|
18
18
|
* is likely scrolling quickly past content they don't want to see.
|
|
19
19
|
* Default: 25 px/ms (same as mtrl-addons viewport)
|
|
20
20
|
*/
|
|
21
|
-
export declare const CANCEL_LOAD_VELOCITY_THRESHOLD =
|
|
21
|
+
export declare const CANCEL_LOAD_VELOCITY_THRESHOLD = 5;
|
|
22
22
|
/**
|
|
23
23
|
* Velocity threshold for preloading (px/ms)
|
|
24
24
|
* When scrolling faster than this but slower than CANCEL_LOAD_VELOCITY_THRESHOLD,
|
|
@@ -12,6 +12,15 @@
|
|
|
12
12
|
* - The "index" in the rendered map is the FLAT ITEM INDEX (not row index)
|
|
13
13
|
* - Row offsets come from the size cache (which operates on row indices)
|
|
14
14
|
* - Column offsets are calculated from itemIndex % columns
|
|
15
|
+
*
|
|
16
|
+
* Performance:
|
|
17
|
+
* - Element pooling avoids createElement cost
|
|
18
|
+
* - Template re-evaluation skipped when item data + state unchanged (change tracking)
|
|
19
|
+
* - Position update skipped when coordinates unchanged (position tracking)
|
|
20
|
+
* - O(1) Set-based visibility diffing (not O(n) .some())
|
|
21
|
+
* - Release grace period prevents boundary thrashing (hover blink, transition replay)
|
|
22
|
+
* - Released elements removed from DOM immediately
|
|
23
|
+
* - DocumentFragment batched insertion for new elements
|
|
15
24
|
*/
|
|
16
25
|
import type { VListItem, ItemTemplate, Range } from "../../types";
|
|
17
26
|
import type { SizeCache } from "../../rendering/sizes";
|
|
@@ -23,7 +32,7 @@ export interface GridRenderer<T extends VListItem = VListItem> {
|
|
|
23
32
|
render: (items: T[], range: Range, selectedIds: Set<string | number>, focusedIndex: number, compressionCtx?: CompressionContext) => void;
|
|
24
33
|
/** Update item positions (for compressed scrolling) */
|
|
25
34
|
updatePositions: (compressionCtx: CompressionContext) => void;
|
|
26
|
-
/** Update a single item */
|
|
35
|
+
/** Update a single item (used by selection feature for focused item changes) */
|
|
27
36
|
updateItem: (index: number, item: T, isSelected: boolean, isFocused: boolean) => void;
|
|
28
37
|
/** Update only CSS classes on a rendered item (no template re-evaluation) */
|
|
29
38
|
updateItemClasses: (index: number, isSelected: boolean, isFocused: boolean) => void;
|
|
@@ -50,6 +59,7 @@ export interface GridRenderer<T extends VListItem = VListItem> {
|
|
|
50
59
|
* @param initialContainerWidth - Initial container width for column sizing
|
|
51
60
|
* @param totalItemsGetter - Optional getter for total item count (for aria-setsize)
|
|
52
61
|
* @param ariaIdPrefix - Optional unique prefix for element IDs (for aria-activedescendant)
|
|
62
|
+
* @param isHorizontal - Whether layout is horizontal (scrolls right)
|
|
53
63
|
*/
|
|
54
64
|
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
65
|
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist/masonry - Builder Feature
|
|
3
|
+
* Switches from list layout to masonry/Pinterest-style layout.
|
|
4
|
+
*
|
|
5
|
+
* Priority: 10 (runs first — replaces the renderer before anything else renders)
|
|
6
|
+
*
|
|
7
|
+
* What it does:
|
|
8
|
+
* - Replaces renderer — swaps the list renderer with a masonry renderer
|
|
9
|
+
* - Calculates item placements using shortest-lane algorithm
|
|
10
|
+
* - Positions items using absolute coordinates (no row alignment)
|
|
11
|
+
* - Renders only visible items based on scroll position
|
|
12
|
+
* - CSS class — adds .vlist--masonry to the root element
|
|
13
|
+
*
|
|
14
|
+
* Key differences from grid:
|
|
15
|
+
* - No row-based virtualization (items flow into shortest column/row)
|
|
16
|
+
* - O(n) layout calculation (must track lane heights)
|
|
17
|
+
* - Items positioned by cached x/y coordinates
|
|
18
|
+
* - Variable heights create organic, packed layout
|
|
19
|
+
*
|
|
20
|
+
* Restrictions:
|
|
21
|
+
* - Cannot be combined with reverse: true
|
|
22
|
+
* - Item sizes must be deterministic (no dynamic content sizing)
|
|
23
|
+
*
|
|
24
|
+
* Can be combined with withSelection for selectable masonry layouts.
|
|
25
|
+
*
|
|
26
|
+
* Performance:
|
|
27
|
+
* - Early exit when scroll position + container size unchanged (zero work per redundant frame)
|
|
28
|
+
* - Cached empty Set for no-selection case (zero allocation per frame)
|
|
29
|
+
* - Viewport state mutated in place (no object creation per frame)
|
|
30
|
+
* - Cached getItem closure (no closure allocation per frame)
|
|
31
|
+
* - Items passed to renderer via data manager reference (no sparse array)
|
|
32
|
+
* - All data mutation methods intercepted for layout recalculation
|
|
33
|
+
*/
|
|
34
|
+
import type { VListItem } from "../../types";
|
|
35
|
+
import type { VListFeature } from "../../builder/types";
|
|
36
|
+
/** Masonry feature configuration */
|
|
37
|
+
export interface MasonryFeatureConfig {
|
|
38
|
+
/** Number of cross-axis divisions (columns in vertical, rows in horizontal) */
|
|
39
|
+
columns: number;
|
|
40
|
+
/** Gap between items in pixels (default: 0) */
|
|
41
|
+
gap?: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create a masonry feature for the builder.
|
|
45
|
+
*
|
|
46
|
+
* Switches from list layout to masonry with shortest-lane placement.
|
|
47
|
+
*
|
|
48
|
+
* ```ts
|
|
49
|
+
* import { vlist } from 'vlist/builder'
|
|
50
|
+
* import { withMasonry } from 'vlist/masonry'
|
|
51
|
+
*
|
|
52
|
+
* const gallery = vlist({
|
|
53
|
+
* container: '#gallery',
|
|
54
|
+
* item: {
|
|
55
|
+
* height: (item) => item.height, // Variable heights
|
|
56
|
+
* template: renderPhoto,
|
|
57
|
+
* },
|
|
58
|
+
* items: photos,
|
|
59
|
+
* })
|
|
60
|
+
* .use(withMasonry({ columns: 4, gap: 8 }))
|
|
61
|
+
* .build()
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare const withMasonry: <T extends VListItem = VListItem>(config: MasonryFeatureConfig) => VListFeature<T>;
|
|
65
|
+
//# sourceMappingURL=feature.d.ts.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist - Masonry Domain
|
|
3
|
+
* Pinterest-style layout with shortest-lane placement
|
|
4
|
+
*/
|
|
5
|
+
export { withMasonry, type MasonryFeatureConfig } from "./feature";
|
|
6
|
+
export { createMasonryLayout } from "./layout";
|
|
7
|
+
export { createMasonryRenderer, type MasonryRenderer, type GetItemFn } from "./renderer";
|
|
8
|
+
export type { MasonryConfig, MasonryLayout, ItemPlacement, } from "./types";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist - Masonry Layout
|
|
3
|
+
* Shortest-lane placement algorithm for masonry/Pinterest-style layouts.
|
|
4
|
+
*
|
|
5
|
+
* Algorithm:
|
|
6
|
+
* 1. Track the size (height/width) of each lane (column/row)
|
|
7
|
+
* 2. For each item:
|
|
8
|
+
* - Find the shortest lane
|
|
9
|
+
* - Place item at the end of that lane
|
|
10
|
+
* - Update lane size
|
|
11
|
+
* 3. Cache all item positions for O(1) lookup during rendering
|
|
12
|
+
*
|
|
13
|
+
* Complexity:
|
|
14
|
+
* - Layout calculation: O(n) where n = total items
|
|
15
|
+
* - Position lookup: O(1) using cached placements
|
|
16
|
+
* - Visibility check: O(k * log(n/k)) using per-lane binary search
|
|
17
|
+
* where k = columns, n = total items
|
|
18
|
+
*/
|
|
19
|
+
import type { MasonryConfig, MasonryLayout } from "./types";
|
|
20
|
+
/**
|
|
21
|
+
* Create a MasonryLayout instance.
|
|
22
|
+
*
|
|
23
|
+
* @param config - Masonry configuration (columns, gap, containerSize)
|
|
24
|
+
* @returns MasonryLayout with placement algorithm
|
|
25
|
+
*/
|
|
26
|
+
export declare const createMasonryLayout: (config: MasonryConfig & {
|
|
27
|
+
containerSize: number;
|
|
28
|
+
}) => MasonryLayout;
|
|
29
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist - Masonry Renderer
|
|
3
|
+
* Renders items in a masonry/Pinterest-style layout with absolute positioning.
|
|
4
|
+
*
|
|
5
|
+
* Unlike grid renderer (which uses row-based positioning), masonry renderer
|
|
6
|
+
* positions each item using its pre-calculated coordinates from the layout phase.
|
|
7
|
+
*
|
|
8
|
+
* Key differences from grid:
|
|
9
|
+
* - Items positioned using cached x/y coordinates (not row/col calculations)
|
|
10
|
+
* - Each item can have different height/width
|
|
11
|
+
* - No row alignment - items flow into shortest column/row
|
|
12
|
+
* - Visibility determined by checking each item's absolute position
|
|
13
|
+
*
|
|
14
|
+
* Performance:
|
|
15
|
+
* - Element pooling avoids createElement cost
|
|
16
|
+
* - Template re-evaluation skipped when item data + state unchanged
|
|
17
|
+
* - O(1) Set-based visibility diffing (not O(n) .some())
|
|
18
|
+
* - Release grace period prevents boundary thrashing (hover blink, transition replay)
|
|
19
|
+
* - Released elements removed from DOM immediately
|
|
20
|
+
*/
|
|
21
|
+
import type { VListItem, ItemTemplate } from "../../types";
|
|
22
|
+
import type { ItemPlacement } from "./types";
|
|
23
|
+
/** Item lookup function — avoids sparse array allocation on every frame */
|
|
24
|
+
export type GetItemFn<T> = (index: number) => T | undefined;
|
|
25
|
+
/** Masonry renderer instance */
|
|
26
|
+
export interface MasonryRenderer<T extends VListItem = VListItem> {
|
|
27
|
+
/** Render visible items using pre-calculated placements */
|
|
28
|
+
render: (getItem: GetItemFn<T>, placements: ItemPlacement[], selectedIds: Set<string | number>, focusedIndex: number) => void;
|
|
29
|
+
/** Get rendered item element by flat item index */
|
|
30
|
+
getElement: (index: number) => HTMLElement | undefined;
|
|
31
|
+
/** Clear all rendered items */
|
|
32
|
+
clear: () => void;
|
|
33
|
+
/** Destroy renderer and cleanup */
|
|
34
|
+
destroy: () => void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a masonry renderer for managing DOM elements with absolute positioning.
|
|
38
|
+
*
|
|
39
|
+
* @param itemsContainer - The DOM element that holds rendered items
|
|
40
|
+
* @param template - Item template function
|
|
41
|
+
* @param classPrefix - CSS class prefix
|
|
42
|
+
* @param isHorizontal - Whether layout is horizontal (scrolls right)
|
|
43
|
+
* @param totalItemsGetter - Optional getter for total item count (for aria-setsize)
|
|
44
|
+
* @param ariaIdPrefix - Optional unique prefix for element IDs (for aria-activedescendant)
|
|
45
|
+
*/
|
|
46
|
+
export declare const createMasonryRenderer: <T extends VListItem = VListItem>(itemsContainer: HTMLElement, template: ItemTemplate<T>, classPrefix: string, isHorizontal?: boolean, totalItemsGetter?: () => number, ariaIdPrefix?: string) => MasonryRenderer<T>;
|
|
47
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vlist - Masonry Types
|
|
3
|
+
* Types for masonry/Pinterest-style layout mode
|
|
4
|
+
*
|
|
5
|
+
* Masonry layout arranges items in columns (vertical) or rows (horizontal)
|
|
6
|
+
* where items flow into the shortest column/row, creating a packed layout
|
|
7
|
+
* with no alignment across the cross-axis.
|
|
8
|
+
*/
|
|
9
|
+
import type { MasonryConfig } from "../../types";
|
|
10
|
+
export type { MasonryConfig };
|
|
11
|
+
/** Cached item placement — flat structure for minimal allocation and fast access */
|
|
12
|
+
export interface ItemPlacement {
|
|
13
|
+
/** Item index */
|
|
14
|
+
index: number;
|
|
15
|
+
/** X coordinate in pixels (cross-axis offset) */
|
|
16
|
+
x: number;
|
|
17
|
+
/** Y coordinate in pixels (main-axis offset) */
|
|
18
|
+
y: number;
|
|
19
|
+
/** Cross-axis division index (column in vertical, row in horizontal) */
|
|
20
|
+
lane: number;
|
|
21
|
+
/** Item size in main axis (height in vertical, width in horizontal) */
|
|
22
|
+
size: number;
|
|
23
|
+
/** Item size in cross axis (width in vertical, height in horizontal) */
|
|
24
|
+
crossSize: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* MasonryLayout — places items in the shortest column/row.
|
|
28
|
+
*
|
|
29
|
+
* Unlike grid (O(1) calculations), masonry requires O(n) layout calculation
|
|
30
|
+
* because each item's position depends on the accumulated sizes of items
|
|
31
|
+
* before it in the same column/row.
|
|
32
|
+
*
|
|
33
|
+
* The layout algorithm:
|
|
34
|
+
* 1. Track size of each column/row (cross-axis divisions)
|
|
35
|
+
* 2. For each item, find the shortest column/row
|
|
36
|
+
* 3. Place item at the end of that column/row
|
|
37
|
+
* 4. Update that column/row's size
|
|
38
|
+
* 5. Cache the item's position for rendering
|
|
39
|
+
*/
|
|
40
|
+
export interface MasonryLayout {
|
|
41
|
+
/** Number of cross-axis divisions (columns in vertical, rows in horizontal) */
|
|
42
|
+
readonly columns: number;
|
|
43
|
+
/** Gap between items in pixels */
|
|
44
|
+
readonly gap: number;
|
|
45
|
+
/** Container width (for vertical) or height (for horizontal) */
|
|
46
|
+
readonly containerSize: number;
|
|
47
|
+
/** Update masonry configuration */
|
|
48
|
+
update: (config: Partial<MasonryConfig & {
|
|
49
|
+
containerSize: number;
|
|
50
|
+
}>) => void;
|
|
51
|
+
/**
|
|
52
|
+
* Calculate layout for all items.
|
|
53
|
+
* Returns array of item placements with positions.
|
|
54
|
+
* This is O(n) where n = totalItems.
|
|
55
|
+
*/
|
|
56
|
+
calculateLayout: (totalItems: number, getSizeForItem: (index: number) => number) => ItemPlacement[];
|
|
57
|
+
/**
|
|
58
|
+
* Get the total size in the main axis (total height in vertical, total width in horizontal).
|
|
59
|
+
* This is the size of the tallest/widest column/row.
|
|
60
|
+
*/
|
|
61
|
+
getTotalSize: (placements: ItemPlacement[]) => number;
|
|
62
|
+
/**
|
|
63
|
+
* Get items visible in the viewport.
|
|
64
|
+
* mainAxisStart/End = scroll position range (scrollTop/scrollLeft + viewport size)
|
|
65
|
+
*/
|
|
66
|
+
getVisibleItems: (placements: ItemPlacement[], mainAxisStart: number, mainAxisEnd: number) => ItemPlacement[];
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -9,11 +9,17 @@
|
|
|
9
9
|
* - Keyboard handler on root — ArrowUp/Down for focus, Space/Enter for toggle
|
|
10
10
|
* - ARIA attributes — aria-selected on items, aria-activedescendant on root
|
|
11
11
|
* - Live region — announces selection changes to screen readers
|
|
12
|
-
* - Render integration —
|
|
12
|
+
* - Render integration — registers internal getters (_getSelectedIds,
|
|
13
|
+
* _getFocusedIndex) so renderers read real selection state directly,
|
|
14
|
+
* eliminating the previous querySelectorAll-based DOM bypass.
|
|
13
15
|
*
|
|
14
16
|
* Added methods: select, deselect, toggleSelect, selectAll, clearSelection,
|
|
15
17
|
* getSelected, getSelectedItems
|
|
16
18
|
*
|
|
19
|
+
* Internal methods (for renderer integration, not public API):
|
|
20
|
+
* _getSelectedIds — returns the live Set<string|number> of selected IDs
|
|
21
|
+
* _getFocusedIndex — returns the current focused index
|
|
22
|
+
*
|
|
17
23
|
* Added events: item:click, selection:change
|
|
18
24
|
*/
|
|
19
25
|
import type { VListItem, SelectionMode } from "../../types";
|
package/dist/index.d.ts
CHANGED
|
@@ -12,12 +12,14 @@ export { withScrollbar } from "./features/scrollbar";
|
|
|
12
12
|
export { withPage } from "./features/page";
|
|
13
13
|
export { withSections } from "./features/sections";
|
|
14
14
|
export { withGrid } from "./features/grid";
|
|
15
|
+
export { withMasonry } from "./features/masonry";
|
|
15
16
|
export { withSelection } from "./features/selection";
|
|
16
17
|
export { withSnapshots } from "./features/snapshots";
|
|
17
18
|
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
19
|
export type { VListBuilder, BuiltVList, BuilderConfig, VListFeature, BuilderContext, } from "./builder";
|
|
19
20
|
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
21
|
export { createGridLayout, createGridRenderer, type GridConfig, type GridLayout, type GridPosition, type GridRenderer, type ItemRange, } from "./features/grid";
|
|
22
|
+
export { createMasonryLayout, createMasonryRenderer, type MasonryConfig, type MasonryLayout, type MasonryRenderer, type GetItemFn, type ItemPlacement, } from "./features/masonry";
|
|
21
23
|
export { createSizeCache, type SizeCache, createMeasuredSizeCache, type MeasuredSizeCache, 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";
|
|
22
24
|
export { createSelectionState, selectItems, deselectItems, toggleSelection, selectAll, clearSelection, isSelected, getSelectedIds, getSelectedItems, } from "./features/selection";
|
|
23
25
|
export { createEmitter, type Emitter } from "./events";
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var{defineProperty:_2,getOwnPropertyNames:lj,getOwnPropertyDescriptor:aj}=Object,sj=Object.prototype.hasOwnProperty;var v2=new WeakMap,rj=(j)=>{var q=v2.get(j),J;if(q)return q;if(q=_2({},"__esModule",{value:!0}),j&&typeof j==="object"||typeof j==="function")lj(j).map((Q)=>!sj.call(q,Q)&&_2(q,Q,{get:()=>j[Q],enumerable:!(J=aj(j,Q))||J.enumerable}));return v2.set(j,q),q};var nj=(j,q)=>{for(var J in q)_2(j,J,{get:q[J],enumerable:!0,configurable:!0,set:(Q)=>q[J]=()=>Q})};var w2=(j,q)=>()=>(j&&(q=j(j=0)),q);var oj=(j,q)=>{let J=q;return{getOffset:(Q)=>Q*j,getSize:(Q)=>j,indexAtOffset:(Q)=>{if(J===0||j===0)return 0;return Math.max(0,Math.min(Math.floor(Q/j),J-1))},getTotalSize:()=>J*j,getTotal:()=>J,rebuild:(Q)=>{J=Q},isVariable:()=>!1}},ij=(j,q)=>{let J=q,Q=new Float64Array(0),K=(B)=>{J=B,Q=new Float64Array(B+1),Q[0]=0;for(let G=0;G<B;G++)Q[G+1]=Q[G]+j(G)};K(q);let X=(B)=>{if(J===0)return 0;if(B<=0)return 0;if(B>=Q[J])return J-1;let G=0,W=J-1;while(G<W){let Y=G+W+1>>>1;if(Q[Y]<=B)G=Y;else W=Y-1}return G};return{getOffset:(B)=>{if(B<=0)return 0;if(B>=J)return Q[J];return Q[B]},getSize:(B)=>j(B),indexAtOffset:(B)=>X(B),getTotalSize:()=>Q[J]??0,getTotal:()=>J,rebuild:(B)=>K(B),isVariable:()=>!0}},y0=(j,q)=>{if(typeof j==="number")return oj(j,q);return ij(j,q)},u0=(j,q,J,Q)=>{if(Q===0)return 0;if(!j.isVariable())return Math.ceil(J/j.getSize(0));let K=0,X=0,B=q;while(B<Q&&X<J)X+=j.getSize(B),K++,B++;return Math.max(1,K)},r0=(j,q,J)=>{if(J===0)return 0;if(!j.isVariable())return Math.floor(q/j.getSize(0));let Q=0,K=0;for(let X=J-1;X>=0;X--){let B=j.getSize(X);if(K+B>q)break;K+=B,Q++}return Math.max(Q,1)},M2=(j,q,J)=>{if(J===0)return 0;let Q=Math.floor(q),K=q-Q,X=Math.max(0,Math.min(Q,J-1));return j.getOffset(X)+K*j.getSize(X)};var F2=200,z0=50,n2=15,o2=2,i2=50,$0=16000000,t2="x",e2=20,A2="_isPlaceholder",jj="__placeholder_";var A0=(j,q)=>{let J=q.getTotalSize(),Q=J>$0,K=Q?$0:J,X=J>0?K/J:1;return{isCompressed:Q,actualSize:J,virtualSize:K,ratio:X}},i0=(j,q,J,Q,K,X)=>{if(Q===0||q===0)return X.start=0,X.end=-1,X;if(!K.isCompressed){let D=J.indexAtOffset(j),A=J.indexAtOffset(j+q);if(A<Q-1)A++;return X.start=Math.max(0,D),X.end=Math.min(Q-1,Math.max(0,A)),X}let{virtualSize:B}=K,W=j/B*Q,Y=Math.floor(W),N=u0(J,Math.max(0,Y),q,Q),F=Math.ceil(W)+N,b=B-q-j;if(b<=q&&b>=-1){let D=r0(J,q,Q),A=Math.max(0,Q-D),_=Math.max(0,Math.min(1,1-b/q));Y=Math.floor(Y+(A-Y)*_),F=b<=1?Q-1:Math.min(Q-1,Y+N)}return X.start=Math.max(0,Y),X.end=Math.min(Q-1,Math.max(0,F)),X},Jj=(j,q,J,Q)=>{if(J===0)return Q.start=0,Q.end=-1,Q;return Q.start=Math.max(0,j.start-q),Q.end=Math.min(J-1,j.end+q),Q},v0=(j,q,J,Q,K,X,B)=>{if(!X.isCompressed||Q===0)return J.getOffset(j);let{virtualSize:G}=X,W=G-K,Y=W-q;if(Y<=K&&Y>=-1){if(q>=W-1){let L=J.getTotalSize()-J.getOffset(j);return K-L}let b=r0(J,K,Q),D=Math.max(0,Q-b),_=q/G*Q,z=Math.max(0,Math.min(1,1-Y/K)),$=J.getOffset(j)-J.getOffset(D),v=J.getOffset(j)-M2(J,_,Q);return v+($-v)*z}let N=q/G,F=J.getTotalSize(),V=N*F;return J.getOffset(j)-V},t0=(j,q,J,Q,K,X="start")=>{if(Q===0)return 0;let B;if(K.isCompressed){if(X==="end"&&j===Q-1)return Math.max(0,K.virtualSize-J);B=j/Q*K.virtualSize}else B=q.getOffset(j);let G=q.getSize(j);switch(X){case"center":B-=(J-G)/2;break;case"end":B-=J-G;break}let W=K.virtualSize-J;return Math.max(0,Math.min(B,W))},Qj=(j,q,J,Q)=>{if(J===0)return 0;if(Q.isCompressed){let K=j/Q.virtualSize;return Math.floor(K*J)}return q.indexAtOffset(j)},qj=(j,q)=>{if(typeof q==="number")return j*q>$0;return q.getTotalSize()>$0},Xj=(j)=>{if(j<=0)return 0;return Math.floor($0/j)},Yj=(j,q)=>{let J=A0(j,q);if(!J.isCompressed)return`No compression needed (${j} items, ${(J.actualSize/1e6).toFixed(2)}M px)`;return`Compressed to ${(J.ratio*100).toFixed(1)}% (${j} items, ${(J.actualSize/1e6).toFixed(1)}M px → ${(J.virtualSize/1e6).toFixed(1)}M px virtual)`};var e0=()=>{};var R0=(j)=>{return j!==null&&typeof j==="object"&&j.__groupHeader===!0};var Hj={};nj(Hj,{createGridRenderer:()=>d0});var GJ=(j=200)=>{let q=[];return{acquire:()=>{let X=q.pop();if(X)return X;let B=document.createElement("div");return B.setAttribute("role","option"),B},release:(X)=>{if(q.length<j)X.className="",X.textContent="",X.removeAttribute("style"),X.removeAttribute("data-index"),X.removeAttribute("data-id"),X.removeAttribute("data-row"),X.removeAttribute("data-col"),q.push(X)},clear:()=>{q.length=0}}},d0=(j,q,J,Q,K,X,B,G,W=!1)=>{let Y=GJ(),N=new Map,F=X,V=!1,b=null,D=0,A="",_=(H)=>{if(b&&D===H)return b;return b=A0(H,J),D=H,b},z={selected:!1,focused:!1},$=(H,w)=>{return z.selected=H,z.focused=w,z},v=`${K}-item ${K}-grid-item`,L=`${K}-item--selected`,U=`${K}-item--focused`,y=(H,w)=>{if(typeof w==="string")H.innerHTML=w;else H.replaceChildren(w)},O=(H,w,c)=>{H.classList.toggle(L,w),H.classList.toggle(U,c)},T=(H,w)=>{let c=Q.getRow(H);if(w){let t=w.totalItems,r=_(t);if(r.isCompressed)return v0(c,w.scrollPosition,J,t,w.containerSize,r,w.rangeStart)}return J.getOffset(c)},M=(H,w,c)=>{let t=H.dataset.id?.startsWith("__group_header"),r=t?0:Q.getCol(w),o=t?0:Q.getColumnOffset(r,F),Q0;if(V){let l=Q.getRow(w),u=0,n=new Set;for(let K0=0;K0<w;K0++){let i=Q.getRow(K0);if(i<l&&!n.has(i)){let B0=J.getSize(K0);u+=B0,n.add(i)}}Q0=u}else Q0=T(w,c);if(W)H.style.transform=`translate(${Math.round(Q0)}px, ${Math.round(o)}px)`;else H.style.transform=`translate(${Math.round(o)}px, ${Math.round(Q0)}px)`},k=(H,w)=>{let c=H.dataset.id?.startsWith("__group_header"),t=c?F:Q.getColumnWidth(F),r;if(V||c)r=J.getSize(w)-Q.gap;else{let o=Q.getRow(w);r=J.getSize(o)-Q.gap}if(W)H.style.width=`${r}px`,H.style.height=`${t}px`;else H.style.width=`${t}px`,H.style.height=`${r}px`},s=(H,w,c,t,r)=>{let o=Y.acquire(),Q0=$(c,t);if(o.className=v,o.dataset.index=String(H),o.dataset.id=String(w.id),o.dataset.row=String(Q.getRow(H)),o.dataset.col=String(Q.getCol(H)),o.ariaSelected=String(c),G)o.id=`${G}-item-${H}`;if(B)A=String(B()),o.setAttribute("aria-setsize",A),o.setAttribute("aria-posinset",String(H+1));k(o,H);let l=q(w,H,Q0);return y(o,l),O(o,c,t),M(o,H,r),o},P=(H,w,c,t,r)=>{if(w.start===0&&H.length>0)V=R0(H[0]);for(let[u,n]of N)if(u<w.start||u>w.end)n.element.remove(),Y.release(n.element),N.delete(u);let o=!1;if(B){let u=String(B());o=u!==A,A=u}let Q0=document.createDocumentFragment(),l=[];for(let u=w.start;u<=w.end;u++){let n=u-w.start,K0=H[n];if(!K0){console.warn(`⚠️ RENDER: Missing item at index ${u} (range: ${w.start}-${w.end}, items.length: ${H.length})`);continue}let i=c.has(K0.id),B0=u===t,X0=N.get(u);if(X0){let f=X0.element.dataset.id,d=String(K0.id);if(f!==d){let a=$(i,B0),Z0=q(K0,u,a);y(X0.element,Z0),X0.element.dataset.id=d,X0.element.dataset.row=String(Q.getRow(u)),X0.element.dataset.col=String(Q.getCol(u)),k(X0.element,u)}if(O(X0.element,i,B0),X0.element.ariaSelected=String(i),M(X0.element,u,r),o)X0.element.setAttribute("aria-setsize",A)}else{let f=s(u,K0,i,B0,r);Q0.appendChild(f),l.push({index:u,element:f})}}if(l.length>0){j.appendChild(Q0);for(let{index:u,element:n}of l)N.set(u,{index:u,element:n})}},m=(H)=>{for(let[w,c]of N)M(c.element,w,H)},Z=(H,w,c,t)=>{let r=N.get(H);if(r){let o=$(c,t),Q0=q(w,H,o);y(r.element,Q0),O(r.element,c,t),r.element.dataset.id=String(w.id),r.element.ariaSelected=String(c),k(r.element,H)}},R=(H,w,c)=>{let t=N.get(H);if(t)O(t.element,w,c)},C=(H)=>{return N.get(H)?.element},h=(H)=>{if(Math.abs(H-F)<1)return;F=H;for(let[w,c]of N)k(c.element,w),M(c.element,w)},p=()=>{for(let[,H]of N)H.element.remove(),Y.release(H.element);N.clear()};return{render:P,updatePositions:m,updateItem:Z,updateItemClasses:R,getElement:C,updateContainerWidth:h,clear:p,destroy:()=>{p(),Y.clear()}}};var B2=w2(()=>{e0()});var S2=2,f2=(j=0)=>{let q=[,,,,,];for(let J=0;J<5;J++)q[J]={position:0,time:0};return{velocity:0,lastPosition:j,lastTime:performance.now(),samples:q,sampleIndex:0,sampleCount:0}},V2=(j,q)=>{let J=performance.now(),Q=J-j.lastTime;if(Q===0)return j;if(Q>100){j.sampleCount=0,j.sampleIndex=0,j.velocity=0;let X=j.samples[0];return X.position=q,X.time=J,j.sampleIndex=1,j.sampleCount=1,j.lastPosition=q,j.lastTime=J,j}let K=j.samples[j.sampleIndex];if(K.position=q,K.time=J,j.sampleIndex=(j.sampleIndex+1)%5,j.sampleCount=Math.min(j.sampleCount+1,5),j.sampleCount>=2){let X=(j.sampleIndex-j.sampleCount+5)%5,B=j.samples[X],G=q-B.position,W=J-B.time;j.velocity=W>0?Math.abs(G)/W:0}return j.lastPosition=q,j.lastTime=J,j};var n0=(j,q)=>{let J=new Map,Q=(X)=>{let B=J.get(X);return B!==void 0?B:j},K=y0(Q,q);return{getOffset(X){return K.getOffset(X)},getSize(X){return Q(X)},indexAtOffset(X){return K.indexAtOffset(X)},getTotalSize(){return K.getTotalSize()},getTotal(){return K.getTotal()},rebuild(X){if(X<K.getTotal()){for(let B of J.keys())if(B>=X)J.delete(B)}K=y0(Q,X)},isVariable(){return!0},setMeasuredSize(X,B){J.set(X,B)},isMeasured(X){return J.has(X)},getEstimatedSize(){return j},measuredCount(){return J.size}}};var o0=()=>{let j={},q=(G,W)=>{if(!j[G])j[G]=new Set;return j[G].add(W),()=>J(G,W)},J=(G,W)=>{j[G]?.delete(W)};return{on:q,off:J,emit:(G,W)=>{j[G]?.forEach((Y)=>{try{Y(W)}catch(N){console.error(`[vlist] Error in event handler for "${String(G)}":`,N)}})},once:(G,W)=>{let Y=(N)=>{J(G,Y),W(N)};return q(G,Y)},clear:(G)=>{if(G)delete j[G];else for(let W in j)delete j[W]},listenerCount:(G)=>{return j[G]?.size??0}}};var p2=(j)=>{if(typeof j==="string"){let q=document.querySelector(j);if(!q)throw Error(`[vlist/builder] Container not found: ${j}`);return q}return j},I2=(j,q,J,Q)=>{let K=document.createElement("div");if(K.className=q,Q)K.classList.add(`${q}--horizontal`);if(K.setAttribute("role","listbox"),K.setAttribute("tabindex","0"),J)K.setAttribute("aria-label",J);if(Q)K.setAttribute("aria-orientation","horizontal");let X=document.createElement("div");if(X.className=`${q}-viewport`,Q)X.style.overflowX="auto",X.style.overflowY="hidden";else X.style.overflow="auto";X.style.height="100%",X.style.width="100%";let B=document.createElement("div");if(B.className=`${q}-content`,B.style.position="relative",Q)B.style.height="100%";else B.style.width="100%";let G=document.createElement("div");if(G.className=`${q}-items`,G.style.position="relative",Q)G.style.height="100%";else G.style.width="100%";return B.appendChild(G),X.appendChild(B),K.appendChild(X),j.appendChild(K),{root:K,viewport:X,content:B,items:G}};var h2=(j=100)=>{let q=[];return{acquire:()=>{let J=q.pop();if(J)return J;let Q=document.createElement("div");return Q.setAttribute("role","option"),Q},release:(J)=>{if(q.length<j)J.className="",J.textContent="",J.removeAttribute("style"),J.removeAttribute("data-index"),J.removeAttribute("data-id"),q.push(J)},clear:()=>{q.length=0}}};var u2=(j,q,J,Q,K)=>{if(Q===0||q===0){K.start=0,K.end=0;return}let X=J.indexAtOffset(j),B=u0(J,X,q,Q),G=X+B;K.start=Math.max(0,X),K.end=Math.min(Q-1,Math.max(0,G))},g2=(j,q,J,Q)=>{if(J===0){Q.start=0,Q.end=0;return}Q.start=Math.max(0,j.start-q),Q.end=Math.min(J-1,j.end+q)},x2=(j,q,J,Q,K)=>{if(Q===0)return 0;let X=Math.max(0,Math.min(j,Q-1)),B=q.getOffset(X),G=q.getSize(X),W=Math.max(0,q.getTotalSize()-J),Y;switch(K){case"center":Y=B-(J-G)/2;break;case"end":Y=B-J+G;break;default:Y=B}return Math.max(0,Math.min(Y,W))};var m2=(j)=>j<0.5?2*j*j:-1+(4-2*j)*j,d2=(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 c2=(j,q)=>{let{dom:J,emitter:Q,resolvedConfig:K,rawConfig:X,rendered:B,pool:G,sharedState:W,isHorizontal:Y,classPrefix:N,contentSizeHandlers:F,afterScroll:V,clickHandlers:b,keydownHandlers:D,resizeHandlers:A,destroyHandlers:_,methods:z,onScrollFrame:$,resizeObserver:v,renderRange:L}=q;return{get dom(){return J},get sizeCache(){return j.hc},get emitter(){return Q},get config(){return K},get rawConfig(){return X},get renderer(){return{render:(U,y,O,T,M)=>{j.ss=O,j.fi=T,j.ffn()},updateItemClasses:(U,y,O)=>{let T=B.get(U);if(!T)return;T.classList.toggle(`${N}-item--selected`,y),T.classList.toggle(`${N}-item--focused`,O),T.ariaSelected=y?"true":"false"},updatePositions:()=>{},updateItem:()=>{},getElement:(U)=>B.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:W,getContainerWidth(){return j.cw},afterScroll:V,clickHandlers:b,keydownHandlers:D,resizeHandlers:A,contentSizeHandlers:F,destroyHandlers:_,methods:z,replaceTemplate(U){j.at=U},replaceRenderer(U){},replaceDataManager(U){j.dm=U},replaceScrollController(U){j.sc=U},getItemsForRange(U){let{dm:y,it:O}=j,T=[];for(let M=U.start;M<=U.end;M++){let k=y?y.getItem(M):O[M];if(k)T.push(k)}return T},getAllLoadedItems(){let U=j.dm;if(U){let y=U.getTotal(),O=[];for(let T=0;T<y;T++){let M=U.getItem(T);if(M)O.push(M)}return O}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:L.start}},renderIfNeeded(){j.rfn()},forceRender(){j.ffn()},invalidateRendered(){for(let[,U]of B)U.remove(),G.release(U);B.clear()},getRenderFns(){return{renderIfNeeded:j.rfn,forceRender:j.ffn}},setRenderFns(U,y){j.rfn=U,j.ffn=y},setVirtualTotalFn(U){j.vtf=U},rebuildSizeCache(U){j.hc.rebuild(U??j.vtf())},setSizeConfig(U){j.hc=y0(U,j.vtf())},updateContentSize(U){let y=`${U}px`;if(Y)J.content.style.width=y;else J.content.style.height=y},updateCompressionMode(){},setVisibleRangeFn(U){j.gvr=U},setScrollToPosFn(U){j.gsp=U},setPositionElementFn(U){j.pef=U},setScrollFns(U,y){j.sgt=U,j.sst=(O)=>{y(O),$()}},setScrollTarget(U){j.st.removeEventListener("scroll",$),j.st=U,j.st.addEventListener("scroll",$,{passive:!0})},getScrollTarget(){return j.st},setContainerDimensions(U){j.gcw=U.width,j.gch=U.height,j.cw=U.width(),j.ch=U.height(),W.viewportState.containerSize=Y?j.cw:j.ch},disableViewportResize(){if(j.vre)j.vre=!1,v.unobserve(J.viewport)},disableWheelHandler(){if(j.wh)J.viewport.removeEventListener("wheel",j.wh),j.wh=null}}},l2=(j,q,J)=>{let{rendered:Q,itemState:K,contentSizeHandlers:X,applyTemplate:B,updateContentSize:G}=q,W=()=>{j.hc.rebuild(j.vtf()),G(),J.updateCompressionMode();for(let Y=0;Y<X.length;Y++)X[Y]();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:(Y)=>j.it[Y],isItemLoaded:(Y)=>Y>=0&&Y<j.it.length&&j.it[Y]!==void 0,getItemsInRange:(Y,N)=>{let F=j.it,V=[],b=Math.max(0,Y),D=Math.min(N,F.length-1);for(let A=b;A<=D;A++)V.push(F[A]);return V},setTotal:(Y)=>{},setItems:(Y,N=0,F)=>{let V=j.it;if(N===0&&(F!==void 0||V.length===0))j.it=Y;else{let b=N+Y.length;if(V.length<b)V.length=b;for(let D=0;D<Y.length;D++)V[N+D]=Y[D]}if(j.ii)W()},updateItem:(Y,N)=>{let F=j.it;if(Y<0||Y>=F.length)return!1;let V=F[Y];if(!V)return!1;F[Y]={...V,...N};let b=Q.get(Y);if(b)B(b,j.at(F[Y],Y,K)),b.dataset.id=String(F[Y].id);return!0},removeItem:(Y)=>{if(Y<0||Y>=j.it.length)return!1;if(j.it.splice(Y,1),j.ii)W();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),G(),j.ffn()}}},a2=(j,q)=>{let{dom:J,classPrefix:Q}=q;return{getScrollTop:()=>j.sgt(),scrollTo:(K)=>{j.sst(K),j.ls=K,j.rfn()},scrollBy:(K)=>{let X=j.sgt()+K;j.sst(X),j.ls=X,j.rfn()},isAtTop:()=>j.ls<=2,isAtBottom:(K=2)=>j.sab(K),getScrollPercentage:()=>{let K=j.hc.getTotalSize(),X=Math.max(0,K-j.ch);return X>0?j.ls/X:0},getVelocity:()=>j.vt.velocity,isTracking:()=>j.vt.sampleCount>=2,isScrolling:()=>J.root.classList.contains(`${Q}--scrolling`),updateConfig:()=>{},enableCompression:()=>{j.sic=!0},disableCompression:()=>{j.sic=!1},isCompressed:()=>j.sic,isWindowMode:()=>!1,updateContainerHeight:(K)=>{j.ch=K},destroy:()=>{}}};var tj=3,ej="vlist",s2=150,jJ=0,r2=(j)=>{if(!j.container)throw Error("[vlist/builder] Container is required");if(!j.item)throw Error("[vlist/builder] item configuration is required");let q=j.orientation==="horizontal",J=q?"width":"height",Q=q?"estimatedWidth":"estimatedHeight",K=q?j.item.width:j.item.height,X=q?j.item.estimatedWidth:j.item.estimatedHeight;if(K==null&&X==null)throw Error(`[vlist/builder] item.${J} or item.${Q} is required${q?" when orientation is 'horizontal'":""}`);if(K!=null){if(typeof K==="number"&&K<=0)throw Error(`[vlist/builder] item.${J} must be a positive number`);if(typeof K!=="number"&&typeof K!=="function")throw Error(`[vlist/builder] item.${J} must be a number or a function (index) => number`)}else if(X!=null){if(typeof X!=="number"||X<=0)throw Error(`[vlist/builder] item.${Q} must be a positive number`)}if(!j.item.template)throw Error("[vlist/builder] item.template is required");if(q&&j.reverse)throw Error("[vlist/builder] horizontal direction cannot be combined with reverse mode");let B=new Map,G=!1,W={use(Y){if(G)throw Error("[vlist/builder] Cannot call .use() after .build()");return B.set(Y.name,Y),W},build(){if(G)throw Error("[vlist/builder] .build() can only be called once");return G=!0,JJ(j,B,q,K,X??null)}};return W};function JJ(j,q,J,Q,K){let{item:X,items:B,overscan:G=tj,classPrefix:W=ej,ariaLabel:Y,reverse:N=!1,scroll:F}=j,V=F,b=V?.wheel??!0,D=V?.wrap??!1,A=N,_=`${W}-${jJ++}`,z=Q??K,$=Q==null&&K!=null,v=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||navigator.maxTouchPoints&&navigator.maxTouchPoints>2,L=J?typeof X.height==="number"?X.height:void 0:typeof X.width==="number"?X.width:void 0,U={overscan:G,classPrefix:W,reverse:A,wrap:D,horizontal:J,ariaIdPrefix:_},y=Array.from(q.values()).sort((E,S)=>(E.priority??50)-(S.priority??50)),O=new Set(y.map((E)=>E.name));for(let E of y)if(E.conflicts){for(let S of E.conflicts)if(O.has(S))throw Error(`[vlist/builder] ${E.name} and ${S} cannot be combined`)}if(A){if(O.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with reverse: true")}let T=p2(j.container),M=I2(T,W,Y,J);if(V?.wheel===!1)if(J)M.viewport.style.overflowX="hidden";else M.viewport.style.overflow="hidden";if(V?.scrollbar==="none")M.viewport.classList.add(`${W}-viewport--no-scrollbar`);let k=o0(),s=B||[],P=$?n0(K,s.length):y0(z,s.length),m=h2(),Z={it:s,hc:P,ch:M.viewport.clientHeight,cw:M.viewport.clientWidth,id:!1,ii:!1,ls:0,vt:f2(0),ss:new Set,fi:-1,la:"",dm:null,sc:null,vtf:null,sgt:J?()=>M.viewport.scrollLeft:()=>M.viewport.scrollTop,sst:J?(E)=>{M.viewport.scrollLeft=E}:(E)=>{M.viewport.scrollTop=E},sab:(E=2)=>{let S=Z.hc.getTotalSize();return Z.ls+Z.ch>=S-E},sic:!1,rfn:null,ffn:null,gvr:(E,S,g,x,j0)=>{u2(E,S,g,x,j0)},gsp:(E,S,g,x,j0)=>{return x2(E,S,g,x,j0)},pef:null,at:X.template,vre:!0,st:M.viewport,wh:null,gcw:()=>Z.cw,gch:()=>Z.ch};Z.vtf=()=>Z.dm?Z.dm.getTotal():Z.it.length;let R=null,C=null,h=!1,p={start:0,end:0},I={start:0,end:0},H={start:-1,end:-1},w={viewportState:{scrollPosition:0,containerSize:J?Z.cw:Z.ch,totalSize:Z.hc.getTotalSize(),actualSize:Z.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},c=new Map,t=$?new WeakMap:null,r=$?P:null,o=null,Q0=0,l=!1,u=()=>{if(!$)return;if(l){let E=Z.sgt(),S=J?M.viewport.scrollWidth-M.viewport.clientWidth:M.viewport.scrollHeight-M.viewport.clientHeight,g=S>0&&E>=S-2;if(M0(),l=!1,g){let x=Math.max(0,Z.hc.getTotalSize()-(J?Z.cw:Z.ch));if(x>E)Z.sst(x),Z.ls=x,Z.rfn()}}};if($&&r&&t)o=new ResizeObserver((E)=>{if(Z.id)return;let S=!1,g=p.start;for(let x of E){let j0=t.get(x.target);if(j0===void 0)continue;let q0=J?x.borderBoxSize[0].inlineSize:x.borderBoxSize[0].blockSize;if(!r.isMeasured(j0)){let U0=r.getSize(j0);if(r.setMeasuredSize(j0,q0),S=!0,j0<g&&q0!==U0)Q0+=q0-U0;o.unobserve(x.target);let J0=x.target;if(J)J0.style.width=`${q0}px`;else J0.style.height=`${q0}px`}}if(!S)return;if(r.rebuild(Z.vtf()),Z.hc=r,Q0!==0){let x=Z.sgt();Z.sst(x+Q0),Z.ls=x+Q0,Q0=0}if(h)l=!0;else{let x=Z.sgt(),j0=J?M.viewport.scrollWidth-M.viewport.clientWidth:M.viewport.scrollHeight-M.viewport.clientHeight,q0=j0>0&&x>=j0-2;if(M0(),l=!1,q0){let U0=Math.max(0,Z.hc.getTotalSize()-(J?Z.cw:Z.ch));if(U0>x)Z.sst(U0),Z.ls=U0}}H.start=-1,H.end=-1,Z.rfn()});let n={selected:!1,focused:!1},K0=`${W}-item`,i=[],B0=[],X0=[],f=[],d=[],e=[],a=new Map,Z0=(E,S)=>{if(typeof S==="string")E.innerHTML=S;else E.replaceChildren(S)},W0=(E,S)=>{let g=Math.round(Z.hc.getOffset(S));if(J)E.style.transform=`translateX(${g}px)`;else E.style.transform=`translateY(${g}px)`};Z.pef=W0;let E0=(E,S)=>{let g=m.acquire();g.className=K0;let x=!$||r&&r.isMeasured(E);if(J){if(x)g.style.width=`${Z.hc.getSize(E)}px`;else g.style.width="";if(L!=null)g.style.height=`${L}px`}else if(x)g.style.height=`${Z.hc.getSize(E)}px`;else g.style.height="";if(g.dataset.index=String(E),g.dataset.id=String(S.id),g.ariaSelected="false",g.id=`${_}-item-${E}`,Z.la=String(Z.vtf()),g.setAttribute("aria-setsize",Z.la),g.setAttribute("aria-posinset",String(E+1)),String(S.id).startsWith("__placeholder_"))g.classList.add(`${W}-item--placeholder`);return Z0(g,Z.at(S,E,n)),Z.pef(g,E),g},M0=()=>{let E=`${Z.hc.getTotalSize()}px`;if(J)M.content.style.width=E;else M.content.style.height=E},G0=()=>{if(Z.id)return;let E=Z.vtf(),S=J?Z.cw:Z.ch;if(Z.gvr(Z.ls,S,Z.hc,E,p),g2(p,G,E,I),I.start===H.start&&I.end===H.end){if(Z.sic)for(let[J0,N0]of c)Z.pef(N0,J0);return}let g=String(E),x=g!==Z.la;Z.la=g;for(let[J0,N0]of c)if(J0<I.start||J0>I.end)N0.remove(),m.release(N0),c.delete(J0);let j0=document.createDocumentFragment(),q0=[],U0=[];for(let J0=I.start;J0<=I.end;J0++){let N0=Z.dm?Z.dm.getItem(J0):Z.it[J0];if(!N0)continue;let V0=c.get(J0);if(V0){let b0=V0.dataset.id,I0=String(N0.id);if(b0!==I0){let cj=b0?.startsWith("__placeholder_"),C2=I0.startsWith("__placeholder_");Z0(V0,Z.at(N0,J0,n)),V0.dataset.id=I0;let z2=!$||r&&r.isMeasured(J0);if(J)V0.style.width=z2?`${Z.hc.getSize(J0)}px`:"";else V0.style.height=z2?`${Z.hc.getSize(J0)}px`:"";if(C2)V0.classList.add(`${W}-item--placeholder`);else V0.classList.remove(`${W}-item--placeholder`);if(cj&&!C2)V0.classList.add(`${W}-item--replaced`),setTimeout(()=>{V0.classList.remove(`${W}-item--replaced`)},300)}Z.pef(V0,J0);let s0=Z.ss.has(N0.id),dj=J0===Z.fi;if(V0.classList.toggle(`${W}-item--selected`,s0),V0.classList.toggle(`${W}-item--focused`,dj),V0.ariaSelected=s0?"true":"false",x)V0.setAttribute("aria-setsize",Z.la)}else{let b0=E0(J0,N0);U0.push({index:J0,element:b0});let I0=Z.ss.has(N0.id),s0=J0===Z.fi;if(I0)b0.classList.add(`${W}-item--selected`),b0.ariaSelected="true";if(s0)b0.classList.add(`${W}-item--focused`);j0.appendChild(b0),q0.push({index:J0,element:b0})}}if(q0.length>0){M.items.appendChild(j0);for(let{index:J0,element:N0}of q0)c.set(J0,N0)}if($&&o&&r&&t){for(let{index:J0,element:N0}of U0)if(!r.isMeasured(J0))t.set(N0,J0),o.observe(N0)}H.start=I.start,H.end=I.end,w.lastRenderRange.start=I.start,w.lastRenderRange.end=I.end,w.viewportState.scrollPosition=Z.ls,w.viewportState.visibleRange.start=p.start,w.viewportState.visibleRange.end=p.end,w.viewportState.renderRange.start=I.start,w.viewportState.renderRange.end=I.end,k.emit("range:change",{range:{start:I.start,end:I.end}})},H0=()=>{H.start=-1,H.end=-1,Z.rfn()};Z.rfn=G0,Z.ffn=H0;let O0=()=>{if(Z.id)return;let E=Z.sgt(),S=E>=Z.ls?"down":"up";if(Z.vt=V2(Z.vt,E),!M.root.classList.contains(`${W}--scrolling`))M.root.classList.add(`${W}--scrolling`);h=!0,Z.ls=E,Z.rfn(),k.emit("scroll",{scrollPosition:E,direction:S}),k.emit("velocity:change",{velocity:Z.vt.velocity,reliable:Z.vt.sampleCount>=S2});for(let g=0;g<i.length;g++)i[g](E,S);if(C)clearTimeout(C);C=setTimeout(()=>{M.root.classList.remove(`${W}--scrolling`),h=!1,Z.vt.velocity=0,Z.vt.sampleCount=0,k.emit("velocity:change",{velocity:0,reliable:!1}),u()},V?.idleTimeout??s2)},Y0=null;if(Z.st.addEventListener("scroll",O0,{passive:!0}),b&&!J&&!v)Y0=(E)=>{E.preventDefault();let S=Z.sgt(),g=E.deltaY,x=Math.max(0,Math.min(S+g,Z.hc.getTotalSize()-Z.ch));Z.sst(x),Z.ls=x,Z.vt=V2(Z.vt,x),Z.rfn();let j0=x>=S?"down":"up";if(k.emit("scroll",{scrollPosition:x,direction:j0}),!M.root.classList.contains(`${W}--scrolling`))M.root.classList.add(`${W}--scrolling`);if(h=!0,C)clearTimeout(C);C=setTimeout(()=>{M.root.classList.remove(`${W}--scrolling`),h=!1,Z.vt.velocity=0,Z.vt.sampleCount=0,k.emit("velocity:change",{velocity:0,reliable:!1}),u()},V?.idleTimeout??s2)},Z.wh=Y0,M.viewport.addEventListener("wheel",Y0,{passive:!1});else if(J&&b)Y0=(E)=>{if(E.deltaX)return;E.preventDefault(),M.viewport.scrollLeft+=E.deltaY},Z.wh=Y0,M.viewport.addEventListener("wheel",Y0,{passive:!1});let F0=(E)=>{let g=E.target.closest("[data-index]");if(g){let x=parseInt(g.dataset.index??"-1",10);if(x>=0){let j0=Z.dm?.getItem(x)??Z.it[x];if(j0){if(j0.__groupHeader)return;k.emit("item:click",{item:j0,index:x,event:E})}}}for(let x=0;x<B0.length;x++)B0[x](E)},D0=(E)=>{let g=E.target.closest("[data-index]");if(g){let x=parseInt(g.dataset.index??"-1",10);if(x>=0){let j0=Z.dm?.getItem(x)??Z.it[x];if(j0){if(j0.__groupHeader)return;k.emit("item:dblclick",{item:j0,index:x,event:E})}}}},L0=(E)=>{for(let S=0;S<X0.length;S++)X0[S](E)};M.items.addEventListener("click",F0),M.items.addEventListener("dblclick",D0),M.root.addEventListener("keydown",L0);let P0=new ResizeObserver((E)=>{if(Z.id)return;for(let S of E){let g=S.contentRect.height,x=S.contentRect.width,j0=J?x:g,q0=J?Z.cw:Z.ch;if(Z.cw=x,Z.ch=g,Math.abs(j0-q0)>1){if(w.viewportState.containerSize=j0,Z.ii)M0(),Z.rfn(),k.emit("resize",{height:g,width:x})}if(Z.ii)for(let U0=0;U0<f.length;U0++)f[U0](x,g)}});if(Z.vre)P0.observe(M.viewport);let D2={dom:M,emitter:k,resolvedConfig:U,rawConfig:j,rendered:c,pool:m,itemState:n,sharedState:w,renderRange:I,isHorizontal:J,classPrefix:W,contentSizeHandlers:d,afterScroll:i,clickHandlers:B0,keydownHandlers:X0,resizeHandlers:f,destroyHandlers:e,methods:a,onScrollFrame:O0,resizeObserver:P0,applyTemplate:Z0,updateContentSize:M0},_0=c2(Z,D2);Z.dm=l2(Z,D2,_0),Z.sc=a2(Z,D2);let k2=new Map;for(let E of y)if(E.methods)for(let S of E.methods){let g=k2.get(S);if(g)throw Error(`[vlist/builder] Method "${S}" is registered by both "${g}" and "${E.name}"`);k2.set(S,E.name)}for(let E of y)E.setup(_0);if(Z.ii=!0,_0.state.isInitialized=!0,M0(),Z.rfn(),A&&Z.it.length>0){let E=Z.gsp(Z.it.length-1,Z.hc,Z.ch,Z.it.length,"end");Z.sst(E),Z.ls=E,Z.rfn()}let zj=(E)=>{_0.dataManager.setItems(E,0,E.length)},vj=A?(E)=>{let S=Z.sab(2),g=Z.it.length;if(_0.dataManager.setItems(E,g),S&&Z.it.length>0){let x=Z.gsp(Z.it.length-1,Z.hc,Z.ch,Z.it.length,"end");Z.sst(x),Z.ls=x,Z.rfn()}}:(E)=>{let S=Z.it.length;_0.dataManager.setItems(E,S)},wj=A?(E)=>{let S=Z.sgt(),g=Z.hc.getTotalSize(),x=[...Z.it];_0.dataManager.clear(),_0.dataManager.setItems([...E,...x],0);let q0=Z.hc.getTotalSize()-g;if(q0>0)Z.sst(S+q0),Z.ls=S+q0}:(E)=>{let S=[...Z.it];_0.dataManager.clear(),_0.dataManager.setItems([...E,...S],0)},Sj=(E,S)=>{_0.dataManager.updateItem(E,S)},fj=(E)=>{_0.dataManager.removeItem(E)},pj=async()=>{if(_0.dataManager.reload)await _0.dataManager.reload()},a0=()=>{if(R!==null)cancelAnimationFrame(R),R=null},Ij=(E,S,g)=>{if(a0(),Math.abs(S-E)<1){Z.sst(S),Z.ls=S,Z.rfn();return}let x=performance.now(),j0=(q0)=>{let U0=q0-x,J0=Math.min(U0/g,1),N0=E+(S-E)*m2(J0);if(Z.sst(N0),Z.ls=N0,Z.rfn(),J0<1)R=requestAnimationFrame(j0);else R=null};R=requestAnimationFrame(j0)},hj=(E,S)=>{let{align:g,behavior:x,duration:j0}=d2(S),q0=Z.vtf(),U0=E;if(D&&q0>0)U0=(U0%q0+q0)%q0;let J0=Z.gsp(U0,Z.hc,Z.ch,q0,g);if(x==="smooth")Ij(Z.sgt(),J0,j0);else a0(),Z.sst(J0)},uj=()=>Z.sgt(),gj=(E,S)=>{return k.on(E,S)},xj=(E,S)=>{k.off(E,S)},mj=()=>{if(Z.id)return;if(Z.id=!0,_0.state.isDestroyed=!0,M.items.removeEventListener("click",F0),M.root.removeEventListener("keydown",L0),Z.st.removeEventListener("scroll",O0),P0.disconnect(),o)o.disconnect(),o=null;if(Z.wh)M.viewport.removeEventListener("wheel",Z.wh);if(C)clearTimeout(C);for(let E=0;E<e.length;E++)e[E]();for(let E of y)if(E.destroy)E.destroy();a0();for(let[,E]of c)E.remove(),m.release(E);c.clear(),m.clear(),k.clear(),M.root.remove()},R2={get element(){return M.root},get items(){if(a.has("_getItems"))return a.get("_getItems")();return Z.it},get total(){if(a.has("_getTotal"))return a.get("_getTotal")();return Z.vtf()},setItems:a.has("setItems")?a.get("setItems"):zj,appendItems:a.has("appendItems")?a.get("appendItems"):vj,prependItems:a.has("prependItems")?a.get("prependItems"):wj,updateItem:a.has("updateItem")?a.get("updateItem"):Sj,removeItem:a.has("removeItem")?a.get("removeItem"):fj,reload:a.has("reload")?a.get("reload"):pj,scrollToIndex:a.has("scrollToIndex")?a.get("scrollToIndex"):hj,cancelScroll:a.has("cancelScroll")?a.get("cancelScroll"):a0,getScrollPosition:a.has("getScrollPosition")?a.get("getScrollPosition"):uj,on:gj,off:xj,destroy:mj};for(let[E,S]of a){if(E==="setItems"||E==="appendItems"||E==="prependItems"||E==="updateItem"||E==="removeItem"||E==="reload"||E==="scrollToIndex"||E==="scrollToItem"||E==="cancelScroll"||E==="getScrollPosition")continue;R2[E]=S}return R2}e0();var w0=(j,q,J={},Q="vlist",K=!1)=>{let{autoHide:X=!0,autoHideDelay:B=1000,minThumbSize:G=30,showOnHover:W=!0,hoverZoneWidth:Y=16,showOnViewportEnter:N=!0}=J,F=0,V=0,b=0,D=0,A=!1,_=!1,z=0,$=0,v=0,L=null,U=!1,y=null,O=null,T=K?"width":"height",M=K?"translateX":"translateY",k=K?(i)=>i.clientX:(i)=>i.clientY,s=K?"left":"top",P=document.createElement("div"),m=document.createElement("div"),Z=W?document.createElement("div"):null,R=()=>{if(P.className=`${Q}-scrollbar`,m.className=`${Q}-scrollbar-thumb`,K)P.classList.add(`${Q}-scrollbar--horizontal`);if(P.appendChild(m),j.appendChild(P),Z){if(Z.className=`${Q}-scrollbar-hover`,K)Z.classList.add(`${Q}-scrollbar-hover--horizontal`),Z.style.height=`${Y}px`;else Z.style.width=`${Y}px`;j.appendChild(Z)}},C=()=>{if(L)clearTimeout(L),L=null},h=()=>{if(!X)return;C(),L=setTimeout(I,B)},p=()=>{if(F<=V)return;if(C(),!U)P.classList.add(`${Q}-scrollbar--visible`),U=!0;if(X&&!A&&!_)h()},I=()=>{if(A||_)return;P.classList.remove(`${Q}-scrollbar--visible`),U=!1},H=(i,B0)=>{F=i,V=B0;let X0=F>V;if(P.style.display=X0?"":"none",!X0){I();return}let f=V/F;b=Math.max(G,f*V),m.style[T]=`${b}px`,D=V-b,w(v)},w=(i)=>{if(v=i,F<=V||D<=0)return;let B0=F-V,f=Math.min(1,Math.max(0,i/B0))*D;m.style.transform=`${M}(${f}px)`},c=(i)=>{if(i.target===m)return;let B0=P.getBoundingClientRect(),d=k(i)-B0[s]-b/2,a=Math.max(0,Math.min(d,D))/D,Z0=F-V,W0=a*Z0;q(W0),p()},t=(i)=>{i.preventDefault(),i.stopPropagation(),A=!0,z=k(i),$=v,C(),P.classList.add(`${Q}-scrollbar--dragging`),document.addEventListener("mousemove",r),document.addEventListener("mouseup",o)},r=(i)=>{if(!A)return;let B0=k(i)-z,X0=D>0?B0/D:0,f=F-V,d=X0*f,e=Math.max(0,Math.min($+d,f)),Z0=e/f*D;if(m.style.transform=`${M}(${Z0}px)`,O=e,y===null)y=requestAnimationFrame(()=>{if(O!==null)q(O);y=null})},o=()=>{if(A=!1,y!==null)cancelAnimationFrame(y),y=null;if(O!==null)q(O),O=null;if(P.classList.remove(`${Q}-scrollbar--dragging`),X&&!_)h();document.removeEventListener("mousemove",r),document.removeEventListener("mouseup",o)},Q0=()=>{if(N)p()},l=()=>{if(!A){if(_=!1,X)h()}},u=()=>{_=!0,C(),p()},n=()=>{if(_=!1,!A&&X)h()},K0=()=>{if(C(),y!==null)cancelAnimationFrame(y),y=null;if(P.removeEventListener("click",c),P.removeEventListener("mouseenter",u),P.removeEventListener("mouseleave",n),m.removeEventListener("mousedown",t),j.removeEventListener("mouseenter",Q0),j.removeEventListener("mouseleave",l),document.removeEventListener("mousemove",r),document.removeEventListener("mouseup",o),Z){if(Z.removeEventListener("mouseenter",u),Z.removeEventListener("mouseleave",n),Z.parentNode)Z.parentNode.removeChild(Z)}if(P.parentNode)P.parentNode.removeChild(P)};if(R(),P.addEventListener("click",c),P.addEventListener("mouseenter",u),P.addEventListener("mouseleave",n),m.addEventListener("mousedown",t),j.addEventListener("mouseenter",Q0),j.addEventListener("mouseleave",l),Z)Z.addEventListener("mouseenter",u),Z.addEventListener("mouseleave",n);return{show:p,hide:I,updateBounds:H,updatePosition:w,isVisible:()=>U,destroy:K0}};var Kj=(j)=>{let q=null;return{name:"withScrollbar",priority:30,setup(J){let{dom:Q,config:K}=J,{classPrefix:X,horizontal:B}=K;if(q=w0(Q.viewport,(Y)=>J.scrollController.scrollTo(Y),j??{},X,B),!Q.viewport.classList.contains(`${X}-viewport--custom-scrollbar`))Q.viewport.classList.add(`${X}-viewport--custom-scrollbar`);let G=J.getCachedCompression();q.updateBounds(G.virtualSize,J.state.viewportState.containerSize);let W=q;J.afterScroll.push((Y,N)=>{W.updatePosition(Y),W.show()}),J.resizeHandlers.push((Y,N)=>{if(W){let F=J.getCachedCompression();W.updateBounds(F.virtualSize,J.state.viewportState.containerSize)}}),J.contentSizeHandlers.push(()=>{if(W){let Y=J.getCachedCompression();W.updateBounds(Y.virtualSize,J.state.viewportState.containerSize)}}),J.destroyHandlers.push(()=>{if(W)W.destroy()})},destroy(){if(q)q.destroy(),q=null}}};var Zj=(j=0)=>{let q=[,,,,,,,,];for(let J=0;J<8;J++)q[J]={position:0,time:0};return{velocity:0,lastPosition:j,lastTime:performance.now(),samples:q,sampleIndex:0,sampleCount:0}},j2=(j,q)=>{let J=performance.now(),Q=J-j.lastTime;if(Q===0)return j;if(Q>100){j.sampleCount=0,j.sampleIndex=0,j.velocity=0;let X=j.samples[0];return X.position=q,X.time=J,j.sampleIndex=1,j.sampleCount=1,j.lastPosition=q,j.lastTime=J,j}let K=j.samples[j.sampleIndex];if(K.position=q,K.time=J,j.sampleIndex=(j.sampleIndex+1)%8,j.sampleCount=Math.min(j.sampleCount+1,8),j.sampleCount>=2){let X=(j.sampleIndex-j.sampleCount+8)%8,B=j.samples[X],G=q-B.position,W=J-B.time;j.velocity=W>0?G/W:0}return j.lastPosition=q,j.lastTime=J,j},QJ=(j)=>j.sampleCount>=3,Bj=(j,q={})=>{let{wheel:J=!0,sensitivity:Q=1,smoothing:K=!1,idleTimeout:X=150,onScroll:B,onIdle:G,scrollElement:W,horizontal:Y=!1}=q,N=!!W,F=0,V=0,b=N?Y?window.innerWidth:window.innerHeight:Y?j.clientWidth:j.clientHeight,D=q.compressed??!1,A=q.compression,_=Zj(),z=!1,$=null,L=J2(()=>{let l=Y?j.scrollLeft:j.scrollTop,u=l>=F?"down":"up";if(_=j2(_,l),F=l,B)B({scrollTop:F,direction:u,velocity:_.velocity});k()}),y=J2(()=>{let l=j.getBoundingClientRect(),u=Y?Math.max(0,-l.left):Math.max(0,-l.top),n=u>=F?"down":"up";if(_=j2(_,u),F=u,!z)z=!0;if(B)B({scrollTop:F,direction:n,velocity:_.velocity});k()}),O=(l)=>{l.preventDefault()},T=(l)=>{if(l.deltaX)return;l.preventDefault(),j.scrollLeft+=l.deltaY},M=(l)=>{if(!D)return;l.preventDefault();let u=(Y?l.deltaX||l.deltaY:l.deltaY)*Q,n=F+u;if(K)n=F+u*0.3;if(n=Math.max(0,Math.min(n,V)),n!==F){let i=n>=F?"down":"up";if(_=j2(_,n),F=n,!z)z=!0;if(B)B({scrollTop:F,direction:i,velocity:_.velocity});k()}},k=()=>{if($)clearTimeout($);$=setTimeout(()=>{if(z=!1,_=Zj(F),G)G()},X)},s=(l)=>{if(D)return;if(D=!0,A=l,V=l.virtualSize-b,N)return;if(L.cancel(),j.removeEventListener("scroll",L),!J)j.removeEventListener("wheel",O);else if(Y)j.removeEventListener("wheel",T);if(Y)j.style.overflowX="hidden";else j.style.overflow="hidden";if(J)j.addEventListener("wheel",M,{passive:!1});let u=Y?j.scrollLeft:j.scrollTop;if(u>0){let n=Y?A?.actualSize??j.scrollWidth:A?.actualSize??j.scrollHeight;F=u/n*V}if(Y)j.scrollLeft=0;else j.scrollTop=0},P=()=>{if(!D)return;if(D=!1,N){A=void 0;return}if(j.removeEventListener("wheel",M),Y)j.style.overflowX="auto";else j.style.overflow="auto";if(j.addEventListener("scroll",L,{passive:!0}),!J)j.addEventListener("wheel",O,{passive:!1});else if(Y)j.addEventListener("wheel",T,{passive:!1});if(A&&F>0){let u=F/V*(A.actualSize-b);if(Y)j.scrollLeft=u;else j.scrollTop=u}A=void 0},m=()=>{if(N||D)return F;return Y?j.scrollLeft:j.scrollTop},Z=(l,u=!1)=>{let n=Math.max(0,Math.min(l,V||1/0));if(N){let K0=j.getBoundingClientRect();if(Y){let i=K0.left+window.scrollX;window.scrollTo({left:i+n,behavior:u?"smooth":"auto"})}else{let i=K0.top+window.scrollY;window.scrollTo({top:i+n,behavior:u?"smooth":"auto"})}}else if(D){if(n===F)return;let i=n>=F?"down":"up";if(_=j2(_,n),F=n,!z)z=!0;if(B)B({scrollTop:F,direction:i,velocity:_.velocity});k()}else if(Y)j.scrollTo({left:n,behavior:u?"smooth":"auto"});else j.scrollTo({top:n,behavior:u?"smooth":"auto"})},R=(l)=>{Z(m()+l)},C=()=>{return m()<=0},h=(l=0)=>{let u=m(),n=N||D?V:Y?j.scrollWidth-j.clientWidth:j.scrollHeight-j.clientHeight;return u>=n-l},p=()=>{let l=m(),u=N||D?V:Y?j.scrollWidth-j.clientWidth:j.scrollHeight-j.clientHeight;if(u<=0)return 0;return Math.min(1,Math.max(0,l/u))},I=(l)=>{if(l.compression)A=l.compression,V=A.virtualSize-b},H=()=>D,w=()=>Math.abs(_.velocity),c=()=>QJ(_),t=()=>z,r=()=>N,o=(l)=>{if(b=l,A)V=A.virtualSize-b},Q0=()=>{if($)clearTimeout($);if(N)y.cancel(),window.removeEventListener("scroll",y);else L.cancel(),j.removeEventListener("scroll",L),j.removeEventListener("wheel",M),j.removeEventListener("wheel",O),j.removeEventListener("wheel",T)};if(N){if(D&&A)V=A.virtualSize-b;window.addEventListener("scroll",y,{passive:!0})}else if(D&&A){if(V=A.virtualSize-b,Y)j.style.overflowX="hidden";else j.style.overflow="hidden";if(J)j.addEventListener("wheel",M,{passive:!1})}else{if(Y)j.style.overflowX="auto",j.style.overflowY="hidden";else j.style.overflow="auto";if(j.addEventListener("scroll",L,{passive:!0}),!J)j.addEventListener("wheel",O,{passive:!1});else if(Y)j.addEventListener("wheel",T,{passive:!1})}return{getScrollTop:m,scrollTo:Z,scrollBy:R,isAtTop:C,isAtBottom:h,getScrollPercentage:p,getVelocity:w,isTracking:c,isScrolling:t,updateConfig:I,enableCompression:s,disableCompression:P,isCompressed:H,isWindowMode:r,updateContainerHeight:o,destroy:Q0}},J2=(j)=>{let q=null,J=null,Q=(...K)=>{if(J=K,q===null)q=requestAnimationFrame(()=>{if(q=null,J)j(...J)})};return Q.cancel=()=>{if(q!==null)cancelAnimationFrame(q),q=null},Q};var qJ=0.65,XJ=0.5,YJ=0.95,KJ=0.1,ZJ=5,BJ=100,Uj=()=>{let j=null,q=0,J=!1,Q=0,K=null,X=0,B=0,G=null,W=[];return{name:"withScale",priority:20,setup(Y){let{dom:N,config:F}=Y,{classPrefix:V,horizontal:b}=F,D=()=>{let $=Y.getVirtualTotal(),v=A0($,Y.sizeCache);if(v.isCompressed&&!J){J=!0,Y.scrollController.enableCompression(v),Y.updateContentSize(v.virtualSize),Y.setScrollFns(()=>q,(P)=>{if(q=P,Q=P,K!==null)cancelAnimationFrame(K),K=null});let L=()=>{let P=Q-q;if(Math.abs(P)<XJ)q=Q,K=null;else{q+=P*qJ;let Z=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize;q=Math.max(0,Math.min(q,Z)),K=requestAnimationFrame(L)}Y.scrollController.scrollTo(q)},U=N.viewport,y=(P)=>{P.preventDefault();let Z=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize;if(Q=Math.max(0,Math.min(Q+P.deltaY,Z)),K===null)K=requestAnimationFrame(L)};U.addEventListener("wheel",y,{passive:!1});let O=()=>{if(G!==null)cancelAnimationFrame(G),G=null},T=(P)=>{if(O(),K!==null)cancelAnimationFrame(K),K=null;let m=P.touches[0];if(!m)return;let Z=b?m.clientX:m.clientY;X=Z,B=q,W=[{time:performance.now(),y:Z}]},M=(P)=>{P.preventDefault();let m=P.touches[0];if(!m)return;let Z=b?m.clientX:m.clientY,R=performance.now();if(W.push({time:R,y:Z}),W.length>ZJ)W.shift();let C=X-Z,p=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize,I=Math.max(0,Math.min(B+C,p));q=I,Q=I,Y.scrollController.scrollTo(I)},k=(P)=>{let m=performance.now(),Z=W.filter((p)=>m-p.time<BJ),R=0;if(Z.length>=2){let p=Z[0],I=Z[Z.length-1],H=I.time-p.time;if(H>0)R=(p.y-I.y)/H}if(W=[],Math.abs(R)<KJ)return;let C=R*16,h=()=>{if(C*=YJ,Math.abs(C)<0.5){G=null;return}let I=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize,H=q+C;if(H=Math.max(0,Math.min(H,I)),H<=0&&C<0||H>=I&&C>0){q=H,Q=H,Y.scrollController.scrollTo(H),G=null;return}q=H,Q=H,Y.scrollController.scrollTo(H),G=requestAnimationFrame(h)};G=requestAnimationFrame(h)};if(U.addEventListener("touchstart",T,{passive:!0}),U.addEventListener("touchmove",M,{passive:!1}),U.addEventListener("touchend",k,{passive:!0}),U.addEventListener("touchcancel",k,{passive:!0}),Y.destroyHandlers.push(()=>{if(U.removeEventListener("wheel",y),U.removeEventListener("touchstart",T),U.removeEventListener("touchmove",M),U.removeEventListener("touchend",k),U.removeEventListener("touchcancel",k),O(),K!==null)cancelAnimationFrame(K),K=null}),!N.viewport.querySelector(`.${V}-scrollbar-track`)){if(j=w0(N.viewport,(m)=>Y.scrollController.scrollTo(m),{},V,b),!N.viewport.classList.contains(`${V}-viewport--custom-scrollbar`))N.viewport.classList.add(`${V}-viewport--custom-scrollbar`);j.updateBounds(v.virtualSize,Y.state.viewportState.containerSize);let P=j;Y.afterScroll.push((m,Z)=>{if(P)P.updatePosition(m),P.show()}),Y.resizeHandlers.push((m,Z)=>{if(P){let R=Y.getCachedCompression();P.updateBounds(R.virtualSize,Y.state.viewportState.containerSize)}})}}else if(!v.isCompressed&&J)J=!1,Y.scrollController.disableCompression(),Y.updateContentSize(v.actualSize);else if(v.isCompressed)Y.scrollController.updateConfig({compression:v}),Y.updateContentSize(v.virtualSize);if(j)j.updateBounds(v.virtualSize,Y.state.viewportState.containerSize);Y.state.cachedCompression={state:v,totalItems:$}};Y.updateCompressionMode=D;let A=Y.getCachedCompression.bind(Y);Y.getCachedCompression=()=>{if(Y.state.cachedCompression)return Y.state.cachedCompression.state;return A()},Y.setVisibleRangeFn(($,v,L,U,y)=>{_=null,z=null;let O=A0(U,L);i0($,v,L,U,O,y)}),Y.setScrollToPosFn(($,v,L,U,y)=>{let O=A0(U,v);return t0($,v,L,U,O,y)});let _=null,z=null;Y.setPositionElementFn(($,v)=>{let L=Y.getVirtualTotal(),U=A0(L,Y.sizeCache);if(U.isCompressed){let y=Y.scrollController.getScrollTop();if(_===null||v<z)z=v,_=Math.round(v0(v,y,Y.sizeCache,L,Y.state.viewportState.containerSize,U));let O=_+Y.sizeCache.getOffset(v)-Y.sizeCache.getOffset(z),T=Y.config.horizontal;$.style.transform=T?`translateX(${O}px)`:`translateY(${O}px)`}else{let y=Math.round(Y.sizeCache.getOffset(v)),O=Y.config.horizontal;$.style.transform=O?`translateX(${y}px)`:`translateY(${y}px)`}}),D(),Y.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(G!==null)cancelAnimationFrame(G),G=null}}};var Q2=(j={})=>{let{chunkSize:q=100,maxCachedItems:J=5000,evictionBuffer:Q=200,onEvict:K}=j,X=new Map,B=0,G=0,W=(R)=>{let C=X.get(R);if(!C)C={items:Array(q),count:0,lastAccess:Date.now()},X.set(R,C);else C.lastAccess=Date.now();return C},Y=(R)=>{return Math.floor(R/q)},N=(R)=>{return R%q},F=()=>B,V=(R)=>{B=R},b=(R)=>{if(R<0||R>=B)return;let C=Y(R),h=X.get(C);if(!h)return;return h.items[N(R)]},D=(R)=>{if(R<0||R>=B)return!1;let C=Y(R),h=X.get(C);if(!h)return!1;return h.items[N(R)]!==void 0},A=(R,C)=>{let h=Y(R),p=W(h),I=N(R),H=p.items[I]===void 0;if(p.items[I]=C,H)p.count++,G++;if(R>=B)B=R+1},_=(R,C)=>{for(let h=0;h<C.length;h++){let p=C[h];if(p!==void 0)A(R+h,p)}},z=(R)=>{if(R<0||R>=B)return!1;let C=Y(R),h=X.get(C);if(!h)return!1;let p=N(R);if(h.items[p]===void 0)return!1;if(h.items[p]=void 0,h.count--,G--,h.count===0)X.delete(C);return!0},$=(R,C)=>{let h=[];for(let p=R;p<=C&&p<B;p++)h.push(b(p));return h},v=(R,C)=>{for(let h=R;h<=C&&h<B;h++)if(!D(h))return!1;return!0},L=()=>{let R=[],C=null,h=Array.from(X.keys()).sort((p,I)=>p-I);for(let p of h){let I=X.get(p);if(!I)continue;let H=p*q;for(let w=0;w<q;w++){let c=H+w;if(c>=B)break;if(I.items[w]!==void 0)if(C===null)C={start:c,end:c};else if(c===C.end+1)C.end=c;else R.push(C),C={start:c,end:c};else if(C!==null)R.push(C),C=null}}if(C!==null)R.push(C);return R},U=(R,C)=>{let h=[],p=null;for(let I=R;I<=C&&I<B;I++)if(!D(I))if(p===null)p={start:I,end:I};else p.end=I;else if(p!==null)h.push(p),p=null;if(p!==null)h.push(p);return h},y=(R)=>{return X.has(R)},O=(R)=>{let C=X.get(R);if(C)C.lastAccess=Date.now()},T=(R,C)=>{if(R>C||X.size===0)return;let h=Date.now(),p=Y(Math.max(0,R)),I=Y(Math.min(B-1,C));for(let H=p;H<=I;H++){let w=X.get(H);if(w)w.lastAccess=h}},M=(R,C)=>{if(G<=J)return 0;let h=Math.max(0,R-Q),p=Math.min(B-1,C+Q),I=Y(h),H=Y(p),w=0,c=[];for(let[t,r]of X)if(t<I||t>H)w+=r.count,c.push(t),G-=r.count,X.delete(t);if(w>0&&K)K(w,c);return w},k=()=>{if(G<=J)return 0;let R=Array.from(X.entries()).sort(([,p],[,I])=>p.lastAccess-I.lastAccess),C=0,h=[];for(let[p,I]of R){if(G<=J)break;C+=I.count,G-=I.count,h.push(p),X.delete(p)}if(C>0&&K)K(C,h);return C},s=()=>{return{totalItems:B,cachedItems:G,cachedChunks:X.size,chunkSize:q,maxCachedItems:J,memoryEfficiency:B>0?1-G/B:1}},P=()=>G,m=()=>{X.clear(),G=0};return{chunkSize:q,maxCachedItems:J,getTotal:F,setTotal:V,get:b,has:D,set:A,setRange:_,delete:z,getRange:$,isRangeLoaded:v,getLoadedRanges:L,findUnloadedRanges:U,getChunkIndex:Y,isChunkLoaded:y,touchChunk:O,touchChunksForRange:T,evictDistant:M,evictToLimit:k,getStats:s,getCachedCount:P,clear:m,reset:()=>{m(),B=0}}},q2=(j)=>{if(j.length===0)return[];let q=[...j].sort((Q,K)=>Q.start-K.start),J=[{...q[0]}];for(let Q=1;Q<q.length;Q++){let K=q[Q],X=J[J.length-1];if(K.start<=X.end+1)X.end=Math.max(X.end,K.end);else J.push({...K})}return J},g0=(j,q,J)=>{let Q=Math.floor(j.start/J)*J,K=Math.ceil((j.end+1)/J)*J-1,X={start:Q,end:K};if(q.length===0)return[X];let B=[],G=q2(q),W=X.start;for(let Y of G){if(Y.end<W)continue;if(Y.start>X.end)break;if(Y.start>W)B.push({start:W,end:Math.min(Y.start-1,X.end)});if(W=Y.end+1,W>X.end)break}if(W<=X.end)B.push({start:W,end:X.end});return B};var X2=(j={})=>{let{maskCharacter:q=t2,maxSampleSize:J=e2}=j,Q=[],K=!1,X=0,B=(F)=>{if(K||F.length===0)return;let V=Math.min(F.length,J);for(let b=0;b<V;b++){let D=F[b];if(!D||typeof D!=="object")continue;let A={};for(let[_,z]of Object.entries(D)){if(_.startsWith("_")||_==="id")continue;A[_]=String(z??"").length}if(Object.keys(A).length>0)Q.push(A)}K=!0},G=()=>K,W=(F)=>{let V={id:`${jj}${X++}`,[A2]:!0,_index:F};if(Q.length===0)return V.label=q.repeat(12),V;let b=Q[F%Q.length];for(let[D,A]of Object.entries(b))V[D]=q.repeat(Math.max(1,A));return V};return{analyzeStructure:B,hasAnalyzedStructure:G,generate:W,generateRange:(F,V)=>{let b=[];for(let D=F;D<=V;D++)b.push(W(D));return b},clear:()=>{Q=[],K=!1,X=0}}},k0=(j)=>{if(!j||typeof j!=="object")return!1;return j[A2]===!0},E2=(j)=>{return j.filter((q)=>!k0(q))};var NJ=50,Y2=(j={})=>{let{adapter:q,initialItems:J,initialTotal:Q,storage:K,placeholder:X,pageSize:B=NJ,onStateChange:G,onItemsLoaded:W,onItemsEvicted:Y}=j,N=Q2({...K,onEvict:(f,d)=>{Y?.(f),U()}}),F=null,V=()=>{if(!F)F=X2(X);return F},b=new Map,D=!1,A,_=!0,z,$=[],v=0,L=new Map,U=()=>{G?.(Z())},y=()=>{b.clear();let f=N.getLoadedRanges();for(let d of f)for(let e=d.start;e<=d.end;e++){let a=N.get(e);if(a&&!k0(a))b.set(a.id,e)}},O=(f,d)=>{if(!k0(d))b.set(d.id,f)},T=(f)=>{b.delete(f)},M=(f,d)=>{return`${f}-${d}`},k=()=>N.getTotal(),s=()=>N.getCachedCount(),P=()=>D,m=()=>_,Z=()=>({total:N.getTotal(),cached:N.getCachedCount(),isLoading:D,pendingRanges:$,error:A,hasMore:_,cursor:z}),R=()=>N,C=()=>V(),h=(f)=>{let d=N.get(f);if(d!==void 0)return d;if(f>=0&&f<N.getTotal())return V().generate(f);return},p=(f)=>{let d=b.get(f);if(d===void 0)return;return N.get(d)},I=(f)=>{return b.get(f)??-1},H=(f)=>{let d=N.get(f);return d!==void 0&&!k0(d)},w=(f,d)=>{let e=[],a=N.getTotal(),Z0=0,W0=0;N.touchChunksForRange(f,Math.min(d,a-1));for(let E0=f;E0<=d&&E0<a;E0++){let M0=N.get(E0);if(M0!==void 0)e.push(M0),Z0++;else e.push(V().generate(E0)),W0++}return e},c=(f)=>{N.setTotal(f),_=N.getCachedCount()<f,U()},t=(f,d=0,e)=>{if(F&&!F.hasAnalyzedStructure()&&f.length>0)F.analyzeStructure(f);for(let a=0;a<f.length;a++){let Z0=f[a];if(Z0!==void 0){let W0=d+a;N.set(W0,Z0),O(W0,Z0)}}if(e!==void 0)N.setTotal(e);else if(d+f.length>N.getTotal())N.setTotal(d+f.length);if(N.getCachedCount()>=N.getTotal()&&N.getTotal()>0)_=!1;W?.(f,d,N.getTotal()),U()},r=(f,d)=>{let e=b.get(f);if(e===void 0)return!1;let a=N.get(e);if(!a)return!1;let Z0={...a,...d};if(N.set(e,Z0),d.id!==void 0&&d.id!==f)T(f),O(e,Z0);return U(),!0},o=(f)=>{let d=b.get(f);if(d===void 0)return!1;N.delete(d),T(f);let e=N.getTotal();if(e>0)N.setTotal(e-1);return U(),!0},Q0=async(f,d)=>{if(!q)return;let e=M(f,d);if(L.has(e))return;let a=N.getLoadedRanges(),Z0=g0({start:f,end:d},a,N.chunkSize);if(Z0.length===0)return;let W0=N.chunkSize,E0=[];for(let G0 of Z0){let H0=Math.floor(G0.start/W0),O0=Math.floor(G0.end/W0);for(let Y0=H0;Y0<=O0;Y0++){let F0=Y0*W0,D0=F0+W0-1,L0=M(F0,D0);if(!E0.some((P0)=>P0.start===F0)&&!L.has(L0))E0.push({start:F0,end:D0})}}let M0=[];for(let G0 of Z0){let H0=Math.floor(G0.start/W0),O0=Math.floor(G0.end/W0);for(let Y0=H0;Y0<=O0;Y0++){let F0=Y0*W0,D0=F0+W0-1,L0=M(F0,D0);if(L.has(L0)){let P0=L.get(L0);if(!M0.includes(P0))M0.push(P0)}}}for(let G0 of E0){let H0=M(G0.start,G0.end),O0=(async()=>{$.push(G0),D=!0,A=void 0,U();try{let Y0=G0.end-G0.start+1,F0={offset:G0.start,limit:Y0,cursor:void 0},D0=await q.read(F0);if(t(D0.items,G0.start,D0.total),D0.cursor)z=D0.cursor;let L0=G0.start+D0.items.length;if(L0>=v){if(v=L0,D0.hasMore!==void 0)_=D0.hasMore;else if(D0.total!==void 0)_=L0<D0.total}}catch(Y0){A=Y0 instanceof Error?Y0:Error(String(Y0))}finally{L.delete(H0),$=$.filter((Y0)=>Y0.start!==G0.start||Y0.end!==G0.end),D=L.size>0,U()}})();L.set(H0,O0),M0.push(O0)}await Promise.all(M0)},l=async(f,d)=>{if(N.isRangeLoaded(f,d))return;await Q0(f,d)},u=async()=>{if(!q)return;await Q0(0,B-1)},n=async()=>{if(!q||D||!_)return!1;let f=N.getCachedCount(),d=N.getTotal(),e=f,a=Math.min(e+B-1,d>0?d-1:e+B-1);if(e>=d&&d>0)return _=!1,!1;return await Q0(e,a),N.getCachedCount()>f},K0=async()=>{if(N.clear(),N.setTotal(0),b.clear(),F)F.clear();L.clear(),$=[],D=!1,z=void 0,_=!0,v=0,A=void 0,U()},i=(f,d)=>{if(N.evictDistant(f,d)>0)y()},B0=()=>{N.clear(),b.clear(),z=void 0,A=void 0,$=[],D=!1,U()},X0=()=>{if(N.reset(),b.clear(),F)F.clear();z=void 0,_=!0,v=0,A=void 0,$=[],D=!1,U()};if(J&&J.length>0)t(J,0,Q??J.length);else if(Q!==void 0)N.setTotal(Q),U();return{getState:Z,getTotal:k,getCached:s,getIsLoading:P,getHasMore:m,getStorage:R,getPlaceholders:C,getItem:h,getItemById:p,getIndexById:I,isItemLoaded:H,getItemsInRange:w,setTotal:c,setItems:t,updateItem:r,removeItem:o,loadRange:Q0,ensureRange:l,loadInitial:u,loadMore:n,reload:K0,evictDistant:i,clear:B0,reset:X0}};var Nj=(j)=>{let{adapter:q,loading:J,storage:Q,total:K,autoLoad:X=!0}=j,B=J?.cancelThreshold??n2,G=J?.preloadThreshold??o2,W=J?.preloadAhead??i2;return{name:"withAsync",priority:20,methods:["reload","loadVisibleRange"],setup(Y){let{emitter:N}=Y,F=Y.config.reverse,V=Y2({adapter:q,...K!==void 0&&{initialTotal:K},pageSize:Q?.chunkSize??z0,...Q&&{storage:{...Q.chunkSize!==void 0&&{chunkSize:Q.chunkSize},...Q.maxCachedItems!==void 0&&{maxCachedItems:Q.maxCachedItems}}},onStateChange:()=>{if(Y.state.isInitialized){let L=Y.getVirtualTotal();Y.sizeCache.rebuild(L),Y.updateCompressionMode();let U=Y.getCachedCompression();Y.state.viewportState.totalSize=U.virtualSize,Y.state.viewportState.actualSize=U.actualSize,Y.state.viewportState.isCompressed=U.isCompressed,Y.state.viewportState.compressionRatio=U.ratio,Y.updateContentSize(U.virtualSize),Y.renderIfNeeded()}},onItemsLoaded:(L,U,y)=>{if(Y.state.isInitialized)Y.forceRender(),N.emit("load:end",{items:L,total:y,offset:U})}});Y.replaceDataManager(V);let b=null,D=null,A=0,_=()=>{if(D){let L=D;D=null,Y.dataManager.ensureRange(L.start,L.end).catch((U)=>{N.emit("error",{error:U,context:"ensureRange"})})}};Y.afterScroll.push((L,U)=>{if(Y.state.isDestroyed)return;let y=Y.scrollController.getVelocity(),T=Y.scrollController.isTracking()&&y<=B;if(D&&A>B&&y<=B){let s=D;D=null,Y.dataManager.ensureRange(s.start,s.end).catch((P)=>{N.emit("error",{error:P,context:"ensureRange"})})}if(A=y,T&&!Y.dataManager.getIsLoading()&&Y.dataManager.getHasMore()){if(F){if(L<F2)N.emit("load:start",{offset:Y.dataManager.getCached(),limit:z0}),Y.dataManager.loadMore().catch((s)=>{N.emit("error",{error:s,context:"loadMore"})})}else if(Y.state.viewportState.totalSize-L-Y.state.viewportState.containerSize<F2)N.emit("load:start",{offset:Y.dataManager.getCached(),limit:z0}),Y.dataManager.loadMore().catch((P)=>{N.emit("error",{error:P,context:"loadMore"})})}let{renderRange:M}=Y.state.viewportState;if(!b||M.start!==b.start||M.end!==b.end)if(b={start:M.start,end:M.end},T){D=null;let{start:s,end:P}=M,m=Y.getVirtualTotal();if(y>G)if(U==="down")P=Math.min(M.end+W,m-1);else s=Math.max(M.start-W,0);Y.dataManager.ensureRange(s,P).catch((Z)=>{N.emit("error",{error:Z,context:"ensureRange"})})}else D={start:M.start,end:M.end}});let z=200,$=null;Y.afterScroll.push((L,U)=>{if($!==null)clearTimeout($);$=setTimeout(()=>{$=null,_()},z)}),Y.destroyHandlers.push(()=>{if($!==null)clearTimeout($),$=null});let v=()=>{if(Y.state.isDestroyed)return;b=null;let{renderRange:L}=Y.state.viewportState;if(L.end>0)Y.dataManager.ensureRange(L.start,L.end).catch((U)=>{N.emit("error",{error:U,context:"ensureRange"})});_()};if(window.addEventListener("online",v),Y.destroyHandlers.push(()=>{window.removeEventListener("online",v)}),N.on("load:start",()=>{Y.dom.root.setAttribute("aria-busy","true")}),N.on("load:end",()=>{Y.dom.root.removeAttribute("aria-busy")}),Y.methods.set("loadVisibleRange",async()=>{b=null,D=null,Y.forceRender();let{renderRange:L}=Y.state.viewportState;if(L.end>0)N.emit("load:start",{offset:L.start,limit:L.end-L.start+1}),await Y.dataManager.ensureRange(L.start,L.end)}),Y.methods.set("reload",async()=>{b=null,D=null,Y.invalidateRendered(),await Y.dataManager.reload(),N.emit("load:start",{offset:0,limit:z0}),await Y.dataManager.loadInitial(),Y.forceRender();let{renderRange:L}=Y.state.viewportState;if(L.end>0)await Y.dataManager.ensureRange(L.start,L.end)}),X)N.emit("load:start",{offset:0,limit:z0}),Y.dataManager.loadInitial().catch((L)=>{N.emit("error",{error:L,context:"loadInitial"})});else if(K!==void 0)Y.dataManager.setTotal(K)}}};var Gj=()=>{let j=null;return{name:"withPage",priority:5,setup(q){let{dom:J,state:Q,config:K,emitter:X}=q;if(J.root.style.overflow="visible",J.root.style.height="auto",K.horizontal)J.viewport.style.overflowX="visible",J.viewport.style.overflowY="visible";else J.viewport.style.overflow="visible";J.viewport.classList.remove(`${K.classPrefix}-viewport--custom-scrollbar`),q.disableViewportResize(),q.disableWheelHandler(),q.setScrollTarget(window),q.setScrollFns(()=>{let Y=J.viewport.getBoundingClientRect();if(K.horizontal)return Math.max(0,-Y.left);else return Math.max(0,-Y.top)},(Y)=>{let N=J.viewport.getBoundingClientRect();if(K.horizontal){let F=N.left+window.scrollX;window.scrollTo(F+Y,window.scrollY)}else{let F=N.top+window.scrollY;window.scrollTo(window.scrollX,F+Y)}}),q.setContainerDimensions({width:()=>window.innerWidth,height:()=>window.innerHeight}),Q.viewportState.containerSize=window.innerHeight;let{innerHeight:B,innerWidth:G}=window,W=()=>{let{innerWidth:Y,innerHeight:N}=window,F=K.horizontal?Y:N,V=K.horizontal?G:B;if(Math.abs(F-V)<=1)return;B=N,G=Y,Q.viewportState.containerSize=N,X.emit("resize",{width:Y,height:N});for(let b=0;b<q.resizeHandlers.length;b++)q.resizeHandlers[b](Y,N);q.renderIfNeeded()};window.addEventListener("resize",W,{passive:!0}),j=()=>{window.removeEventListener("resize",W)},q.destroyHandlers.push(j)},destroy(){if(j)j(),j=null}}};var L2=(j,q)=>{let J=0,Q=j.length-1;while(J<Q){let K=J+Q+1>>>1;if(j[K].headerLayoutIndex<=q)J=K;else Q=K-1}return J},Wj=(j,q)=>{let J=0,Q=j.length-1;while(J<Q){let K=J+Q+1>>>1;if(j[K].firstDataIndex<=q)J=K;else Q=K-1}return J},Dj=(j,q)=>{if(j===0)return[];let J=[],Q=q(0),K=0,X=0;for(let B=1;B<j;B++){let G=q(B);if(G!==Q){let W=B-K;J.push({key:Q,groupIndex:J.length,headerLayoutIndex:X,firstDataIndex:K,count:W}),X=X+1+W,Q=G,K=B}}return J.push({key:Q,groupIndex:J.length,headerLayoutIndex:X,firstDataIndex:K,count:j-K}),J},x0=(j,q)=>{if(j.length===0||q.length===0)return[];let J=j.length+q.length,Q=Array(J),K=0;for(let X of q){Q[K]={id:`__group_header_${X.groupIndex}`,__groupHeader:!0,groupKey:X.key,groupIndex:X.groupIndex},K++;for(let B=0;B<X.count;B++)Q[K]=j[X.firstDataIndex+B],K++}return Q},m0=(j,q)=>{let J=typeof q==="number"?(Q)=>q:q;return(Q)=>{let K=j.getEntry(Q);if(K.type==="header")return j.getHeaderHeight(K.group.groupIndex);return J(K.dataIndex)}},K2=(j,q)=>{let J=Dj(j,q.getGroupForIndex),Q=j+J.length,K=q.headerHeight;return{get totalEntries(){return Q},get groupCount(){return J.length},get groups(){return J},getEntry:(V)=>{if(J.length===0)return{type:"item",dataIndex:V,group:{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0}};let b=L2(J,V),D=J[b];if(V===D.headerLayoutIndex)return{type:"header",group:D};let A=V-D.headerLayoutIndex-1;return{type:"item",dataIndex:D.firstDataIndex+A,group:D}},layoutToDataIndex:(V)=>{if(J.length===0)return V;let b=L2(J,V),D=J[b];if(V===D.headerLayoutIndex)return-1;let A=V-D.headerLayoutIndex-1;return D.firstDataIndex+A},dataToLayoutIndex:(V)=>{if(J.length===0)return V;let b=Wj(J,V),D=J[b],A=V-D.firstDataIndex;return D.headerLayoutIndex+1+A},getGroupAtLayoutIndex:(V)=>{if(J.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let b=L2(J,V);return J[b]},getGroupAtDataIndex:(V)=>{if(J.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let b=Wj(J,V);return J[b]},getHeaderHeight:typeof K==="number"?(V)=>K:(V)=>{let b=J[V];if(!b)return 0;return K(b.key,V)},rebuild:(V)=>{J=Dj(V,q.getGroupForIndex),Q=V+J.length}}};var Z2=(j,q,J,Q,K,X=!1)=>{let B=document.createElement("div");if(B.className=`${K}-sticky-header`,B.setAttribute("role","presentation"),B.setAttribute("aria-hidden","true"),B.style.position="absolute",B.style.zIndex="5",B.style.pointerEvents="none",B.style.willChange="transform",B.style.overflow="hidden",X)B.style.top="0",B.style.bottom="0",B.style.left="0";else B.style.top="0",B.style.left="0",B.style.right="0";j.insertBefore(B,j.firstChild);let G=-1,W=!1,Y=0,N=(_)=>{if(_===G)return;G=_;let z=q.groups;if(_<0||_>=z.length){B.textContent="";return}let $=z[_],v=Q.headerTemplate($.key,$.groupIndex),L=q.getHeaderHeight(_);if(X)B.style.width=`${L}px`;else B.style.height=`${L}px`;if(typeof v==="string")B.innerHTML=v;else B.replaceChildren(v)},F=(_)=>{let z=q.groups;if(z.length===0){b();return}let $=0;for(let O=z.length-1;O>=0;O--)if(J.getOffset(z[O].headerLayoutIndex)<=_){$=O;break}let v=J.getOffset(z[0].headerLayoutIndex);if(_<v){b();return}if(!W)V();N($);let L=q.getHeaderHeight($),U=0,y=$+1;if(y<z.length){let T=J.getOffset(z[y].headerLayoutIndex)-_;if(T<L)U=T-L}if(U!==Y)if(Y=U,U===0)B.style.transform="";else{let O=Math.round(U);B.style.transform=X?`translateX(${O}px)`:`translateY(${O}px)`}},V=()=>{if(W)return;W=!0,B.style.display=""},b=()=>{if(!W)return;W=!1,B.style.display="none",G=-1,Y=0,B.style.transform=""},D=()=>{let _=G;if(G=-1,_>=0)N(_)},A=()=>{B.remove(),G=-1,W=!1};return B.style.display="none",{update:F,refresh:D,show:V,hide:b,destroy:A}};var _j=(j,q,J,Q,K,X)=>{if(Q===0||q===0)return X.start=0,X.end=-1,X;let B=J.indexAtOffset(j),G=J.indexAtOffset(j+q);if(G<Q-1)G++;return X.start=Math.max(0,B),X.end=Math.min(Q-1,Math.max(0,G)),X},Vj=(j,q,J,Q)=>{if(J===0)return Q.start=0,Q.end=-1,Q;return Q.start=Math.max(0,j.start-q),Q.end=Math.min(J-1,j.end+q),Q},Mj=(j,q,J,Q,K,X)=>{if(Q===0)return 0;let B=Math.max(0,Math.min(j,Q-1)),G=q.getOffset(B),W=q.getSize(B),Y=q.getTotalSize(),N=Math.max(0,Y-J),F;switch(X){case"center":F=G-J/2+W/2;break;case"end":F=G-J+W;break;case"start":default:F=G;break}return Math.max(0,Math.min(F,N))},Fj=(j,q,J)=>{if(J&&J.isCompressed)return J.virtualSize;return q.getTotalSize()},Aj=(j,q)=>{return q.getTotalSize()},Ej=(j,q)=>{return q.getOffset(j)},Lj=(j,q,J)=>{let Q=Math.max(0,q-J);return Math.max(0,Math.min(j,Q))};var C0=(j,q,J,Q,K="start",X,B=Mj)=>{return B(j,q,J,Q,X,K)},Oj=(j,q)=>{return j.start===q.start&&j.end===q.end},bj=(j,q)=>{return j>=q.start&&j<=q.end},yj=(j)=>{if(j.end<j.start)return 0;return j.end-j.start+1};var Tj=(j,q)=>{let J=[],Q=[];for(let K=j.start;K<=j.end;K++)if(K<q.start||K>q.end)Q.push(K);for(let K=q.start;K<=q.end;K++)if(K<j.start||K>j.end)J.push(K);return{add:J,remove:Q}};e0();var Pj=(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 q=null,J=null,Q=[],K=[];return{name:"withSections",priority:10,setup(X){let{dom:B,config:G,rawConfig:W}=X,{classPrefix:Y}=G,F=W.item.height;Q=W.items?[...W.items]:[];let V=Q.length,b={getGroupForIndex:j.getGroupForIndex,headerHeight:j.headerHeight,headerTemplate:j.headerTemplate,sticky:j.sticky??!1};q=K2(V,b),K=x0(Q,q.groups);let D=m0(q,F);X.setSizeConfig(D),X.rebuildSizeCache(K.length),X.dataManager.setItems(K,0,K.length);let A=W.item.template,{headerTemplate:_}=j,z=(T,M,k)=>{if(R0(T))return _(T.groupKey,T.groupIndex);return A(T,M,k)},$=X.methods.get("_getGridLayout"),v=X.methods.get("_replaceGridRenderer"),L=X.methods.get("_updateGridLayoutForGroups");if($&&v){if(L)L((s)=>{let P=K[s];return!!(P&&R0(P))});let{createGridRenderer:T}=(B2(),rj(Hj)),M=$(),k=T(B.items,z,X.sizeCache,M,Y,X.getContainerWidth(),()=>X.dataManager.getTotal(),G.ariaIdPrefix);v(k)}else X.replaceTemplate(z);if(B.root.classList.add(`${Y}--grouped`),j.sticky!==!1){J=Z2(B.root,q,X.sizeCache,{...b,sticky:b.sticky??!1},Y,G.horizontal);let T=J;X.afterScroll.push((M,k)=>{T.update(M)}),J.update(X.scrollController.getScrollTop())}let U=()=>{if(!q)return;q.rebuild(Q.length),K=x0(Q,q.groups);let T=m0(q,F);if(X.setSizeConfig(T),X.rebuildSizeCache(K.length),X.dataManager.setItems(K,0,K.length),J)J.refresh()};X.methods.set("setItems",(T)=>{Q=[...T],U()}),X.methods.set("appendItems",(T)=>{Q=[...Q,...T],U()}),X.methods.set("prependItems",(T)=>{Q=[...T,...Q],U()}),X.methods.set("removeItem",(T)=>{Q=Q.filter((M)=>M.id!==T),U()});let{animateScroll:y,cancelScroll:O}=DJ(X.scrollController,X.renderIfNeeded);X.methods.set("scrollToIndex",(T,M)=>{let k=q.dataToLayoutIndex(T),{align:s,behavior:P,duration:m}=_J(M),Z=X.dataManager.getTotal(),R=C0(k,X.sizeCache,X.state.viewportState.containerSize,Z,s,X.getCachedCompression());if(P==="smooth")y(X.scrollController.getScrollTop(),R,m);else O(),X.scrollController.scrollTo(R)}),X.methods.set("_getItems",()=>Q),X.methods.set("_getTotal",()=>Q.length),X.destroyHandlers.push(()=>{if(T0!==null)cancelAnimationFrame(T0),T0=null;if(J)J.destroy(),J=null;B.root.classList.remove(`${Y}--grouped`)})},destroy(){if(J)J.destroy(),J=null}}},O2=300,WJ=(j)=>j<0.5?2*j*j:-1+(4-2*j)*j,T0=null,DJ=(j,q)=>{let J=()=>{if(T0!==null)cancelAnimationFrame(T0),T0=null};return{animateScroll:(K,X,B)=>{if(J(),Math.abs(X-K)<1){j.scrollTo(X);return}let G=performance.now(),W=(Y)=>{let N=Y-G,F=Math.min(N/B,1),V=K+(X-K)*WJ(F);if(j.scrollTo(V),q(),F<1)T0=requestAnimationFrame(W);else T0=null};T0=requestAnimationFrame(W)},cancelScroll:J}},_J=(j)=>{if(typeof j==="string")return{align:j,behavior:"auto",duration:O2};if(j&&typeof j==="object")return{align:j.align??"start",behavior:j.behavior??"auto",duration:j.duration??O2};return{align:"start",behavior:"auto",duration:O2}};var U2=(j)=>{let q=Math.max(1,Math.floor(j.columns)),J=j.gap??0,Q=j.isHeaderFn,K={row:0,col:0},X=(D)=>{if(D<=0)return 0;if(!Q)return Math.ceil(D/q);let A=0,_=0,z=0;for(let $=0;$<D;$++)if(Q($)){if(z++,_>0)A++,_=0;A++,_=0}else if(_++,_>=q)A++,_=0;if(_>0)A++;return A},B=(D)=>{return K.row=G(D),K.col=W(D),K},G=(D)=>{if(!Q)return Math.floor(D/q);let A=0,_=0;for(let z=0;z<=D;z++)if(Q(z)){if(_>0)A++,_=0;if(z===D)return A;A++,_=0}else{if(z===D)return A;if(_++,_>=q)A++,_=0}return console.warn(`⚠️ getRow(${D}) fell through - returning ${A}`),A},W=(D)=>{if(!Q)return D%q;if(Q(D))return 0;let A=0;for(let _=0;_<=D;_++)if(Q(_))A=0;else{if(_===D)return A;if(A++,A>=q)A=0}return A},Y=(D,A,_)=>{if(_<=0)return{start:0,end:-1};if(!Q){let U=Math.max(0,D*q),y=Math.min(_-1,(A+1)*q-1);return{start:U,end:y}}let z=-1,$=-1,v=0,L=0;for(let U=0;U<_;U++){if(Q(U)){if(L>0)v++,L=0;if(v>=D&&v<=A){if(z===-1)z=U;$=U}v++,L=0}else{if(v>=D&&v<=A){if(z===-1)z=U;$=U}if(L++,L>=q)v++,L=0}if(v>A&&L===0)break}if(z===-1)return{start:0,end:-1};return{start:z,end:$}},N=(D,A,_)=>{if(A<0||A>=q)return-1;let z=D*q+A;if(z<0||z>=_)return-1;return z},F=(D)=>{let A=(q-1)*J;return Math.max(0,(D-A)/q)};return{get columns(){return q},get gap(){return J},update:(D)=>{if(D.columns!==void 0)q=Math.max(1,Math.floor(D.columns));if(D.gap!==void 0)J=D.gap;if(D.isHeaderFn!==void 0)Q=D.isHeaderFn},getTotalRows:X,getPosition:B,getRow:G,getCol:W,getItemRange:Y,getItemIndex:N,getColumnWidth:F,getColumnOffset:(D,A)=>{let _=F(A);return D*(_+J)}}};B2();var $j=(j)=>{if(!j.columns||j.columns<1)throw Error("[vlist/builder] withGrid: columns must be a positive integer >= 1");let q=null,J=null;return{name:"withGrid",priority:10,setup(Q){let{dom:K,emitter:X,config:B,rawConfig:G}=Q,{classPrefix:W}=B;if(B.reverse)throw Error("[vlist/builder] withGrid cannot be used with reverse: true");let Y=B.horizontal,N=()=>Y?K.viewport.clientHeight:Q.getContainerWidth(),F=G.items?.some((O)=>O.__groupHeader===!0),V={columns:j.columns,gap:j.gap??0};if(F)V.isHeaderFn=(O)=>{let T=Q.dataManager.getItem(O);return!!(T&&T.__groupHeader===!0)};q=U2(V);let b=q.gap;Q.setVirtualTotalFn(()=>{let O=Q.dataManager.getTotal();return q.getTotalRows(O)});let D=G.item,A=B.horizontal?D.width:D.height,_={containerWidth:N(),columns:q.columns,gap:q.gap};if(typeof A==="function")Q.setSizeConfig((O)=>{let T=_.containerWidth-2,M=(_.columns-1)*_.gap,k=(T-M)/_.columns,s={containerWidth:_.containerWidth,columns:_.columns,gap:_.gap,columnWidth:k,row:q.getRow(O),column:q.getCol(O),totalRows:q.getTotalRows(Q.dataManager.getTotal()),totalColumns:_.columns};return A(O,s)+_.gap});else if(b>0)Q.setSizeConfig(A+b);Q.rebuildSizeCache(),K.root.classList.add(`${W}--grid`);let z=N(),$=G.item.template,v=()=>{J=d0(K.items,$,Q.sizeCache,q,W,z,()=>Q.dataManager.getTotal(),B.ariaIdPrefix,B.horizontal),Q.replaceRenderer(J)};v(),Q.methods.set("_getGridLayout",()=>q),Q.methods.set("_getGridConfig",()=>V),Q.methods.set("_replaceGridRenderer",(O)=>{J=O}),Q.methods.set("_updateGridLayoutForGroups",(O)=>{q.update({isHeaderFn:O});let T=Q.dataManager.getTotal(),M=0;for(let k=0;k<T;k++)if(q.getCol(k)===0){let s=Q.sizeCache.getSize(k);M+=s}if(Q.sizeCache.getTotalSize=()=>M,B.horizontal)Q.dom.content.style.width=`${M}px`;else Q.dom.content.style.height=`${M}px`;v()}),Q.methods.set("updateGrid",(O)=>{if(O.columns!==void 0){if(!Number.isInteger(O.columns)||O.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");V.columns=O.columns}if(O.gap!==void 0){if(O.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");V.gap=O.gap}if(q)q.update(V);let T=N();if(_.containerWidth=T,_.columns=V.columns,_.gap=V.gap??0,J)J.updateContainerWidth(T);Q.rebuildSizeCache(),Q.updateContentSize(Q.sizeCache.getTotalSize()),Q.updateCompressionMode();for(let M=0;M<Q.contentSizeHandlers.length;M++)Q.contentSizeHandlers[M]();if(J)J.clear();Q.forceRender()});let L=()=>{if(Q.state.isDestroyed)return;let O=Q.scrollController.getScrollTop(),T=Q.state.viewportState.containerSize,M=Q.getVirtualTotal(),k={start:0,end:0};if(M===0||T===0)k.start=0,k.end=0;else{k.start=Math.max(0,Q.sizeCache.indexAtOffset(O));let I=Q.sizeCache.indexAtOffset(O+T);if(I<M-1)I++;k.end=Math.min(M-1,Math.max(0,I))}let s=B.overscan??3,P={start:Math.max(0,k.start-s),end:Math.min(M-1,k.end+s)};Q.state.viewportState.scrollPosition=O,Q.state.viewportState.visibleRange=k,Q.state.viewportState.renderRange=P;let m=Q.state.lastRenderRange,Z=Q.state.viewportState.isCompressed;if(P.start===m.start&&P.end===m.end){if(Z)J.updatePositions(Q.getCompressionContext());return}let R=Q.dataManager.getTotal(),C=q.getItemRange(P.start,P.end,R),h=Q.dataManager.getItemsInRange(C.start,C.end),p=Z?Q.getCompressionContext():void 0;J.render(h,C,new Set,-1,p),Q.state.lastRenderRange={...P},X.emit("range:change",{range:P})},U=()=>{if(Q.state.isDestroyed)return;Q.state.lastRenderRange={start:-1,end:-1},L()};Q.setRenderFns(L,U);let y=typeof A==="function";if(Q.resizeHandlers.push((O,T)=>{let M=Y?T:O;if(_.containerWidth=M,J)J.updateContainerWidth(M);if(y){Q.rebuildSizeCache(),Q.updateContentSize(Q.sizeCache.getTotalSize()),Q.updateCompressionMode();for(let k=0;k<Q.contentSizeHandlers.length;k++)Q.contentSizeHandlers[k]();if(J)J.clear();Q.forceRender()}}),Q.methods.set("scrollToIndex",(O,T)=>{let M=Math.floor(O/j.columns),{align:k,behavior:s}=VJ(T),P=Q.dataManager.getState(),m=q.getTotalRows(P.total),Z=Math.max(0,Math.min(M,m-1)),R=C0(Z,Q.sizeCache,Q.state.viewportState.containerSize,m,k,Q.getCachedCompression());if(s==="smooth")Q.scrollController.scrollTo(R);else Q.scrollController.scrollTo(R)}),!Q.methods.has("_getTotal"))Q.methods.set("_getTotal",()=>Q.dataManager.getTotal());Q.destroyHandlers.push(()=>{if(J)J.destroy(),J=null;K.root.classList.remove(`${W}--grid`)})},destroy(){if(J)J.destroy(),J=null}}},b2=300,VJ=(j)=>{if(typeof j==="string")return{align:j,behavior:"auto",duration:b2};if(j&&typeof j==="object")return{align:j.align??"start",behavior:j.behavior??"auto",duration:j.duration??b2};return{align:"start",behavior:"auto",duration:b2}};B2();var N2=(j)=>({selected:new Set(j??[]),focusedIndex:-1}),c0=(j,q,J)=>{if(J==="none")return j;let Q=new Set(j.selected);if(J==="single"){if(Q.clear(),q.length>0)Q.add(q[0])}else for(let K of q)Q.add(K);return{...j,selected:Q}},l0=(j,q)=>{let J=new Set(j.selected);for(let Q of q)J.delete(Q);return{...j,selected:J}},S0=(j,q,J)=>{if(J==="none")return j;if(j.selected.has(q))return l0(j,[q]);else return c0(j,[q],J)},G2=(j,q,J)=>{if(J!=="multiple")return j;return{...j,selected:new Set(q.map((Q)=>Q.id))}},W2=(j)=>({...j,selected:new Set}),y2=(j,q)=>{return j.focusedIndex=q,j},T2=(j,q,J=!0)=>{if(q===0)return j;let Q=j.focusedIndex-1;if(Q<0)Q=J?q-1:0;return j.focusedIndex=Q,j},H2=(j,q,J=!0)=>{if(q===0)return j;let Q=j.focusedIndex+1;if(Q>=q)Q=J?0:q-1;return j.focusedIndex=Q,j},P2=(j,q)=>{if(q===0)return j;return j.focusedIndex=0,j},$2=(j,q)=>{if(q===0)return j;return j.focusedIndex=q-1,j};var kj=(j,q)=>{return j.selected.has(q)},f0=(j)=>{return Array.from(j.selected)},p0=(j,q)=>{let J=[];for(let Q of j.selected){let K=q(Q);if(K)J.push(K)}return J};var Rj=(j)=>{let q=j?.mode??"single",J=j?.initial,Q=N2(J),K=null;return{name:"withSelection",priority:50,methods:["select","deselect","toggleSelect","selectAll","clearSelection","getSelected","getSelectedItems"],setup(X){let{dom:B,emitter:G,config:W}=X,{classPrefix:Y,ariaIdPrefix:N}=W;if(q==="none"){X.methods.set("select",()=>{}),X.methods.set("deselect",()=>{}),X.methods.set("toggleSelect",()=>{}),X.methods.set("selectAll",()=>{}),X.methods.set("clearSelection",()=>{}),X.methods.set("getSelected",()=>[]),X.methods.set("getSelectedItems",()=>[]),X.methods.set("setSelectionMode",()=>{});return}let F=new Map,V=()=>{F.clear();let L=X.dataManager.getTotal(),U=X.dataManager.getCached();if(U===0)return;if(U>=L){for(let O=0;O<L;O++){let T=X.dataManager.getItem(O);if(T)F.set(T.id,O)}return}let y=X.dataManager.getStorage();if(y&&typeof y.getLoadedRanges==="function"){let O=y.getLoadedRanges();for(let T of O)for(let M=T.start;M<=T.end;M++){let k=X.dataManager.getItem(M);if(k)F.set(k.id,M)}}};G.on("load:end",({items:L,offset:U})=>{if(!L||L.length===0)return;if(U!==void 0)for(let y=0;y<L.length;y++){let O=L[y];if(O&&O.id!==void 0)F.set(O.id,U+y)}else V()}),V();let{renderIfNeeded:b,forceRender:D}=X.getRenderFns(),A=()=>{X.dom.items.querySelectorAll("[data-index]").forEach((U)=>{let y=U,O=y.dataset.id;if(O!==void 0){let T=/^\d+$/.test(O)?parseInt(O,10):O,M=Q.selected.has(T),s=parseInt(y.dataset.index??"-1",10)===Q.focusedIndex;y.classList.toggle(`${Y}-item--selected`,M),y.classList.toggle(`${Y}-item--focused`,s),y.ariaSelected=M?"true":"false"}})},_=()=>{if(X.state.isDestroyed)return;b(),A()},z=()=>{if(X.state.isDestroyed)return;D(),A()};X.setRenderFns(_,z);let $=()=>{A();let L=(U)=>{let y=F.get(U);if(y===void 0)return;return X.dataManager.getItem(y)};G.emit("selection:change",{selected:f0(Q),items:p0(Q,L)})};K=document.createElement("div"),K.setAttribute("aria-live","polite"),K.setAttribute("aria-atomic","true"),K.className=`${Y}-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",B.root.appendChild(K);let v=K;G.on("selection:change",({selected:L})=>{let U=L.length;if(U===0)v.textContent="";else if(U===1)v.textContent="1 item selected";else v.textContent=`${U} items selected`}),X.clickHandlers.push((L)=>{if(X.state.isDestroyed)return;let y=L.target.closest("[data-index]");if(!y)return;let O=parseInt(y.dataset.index??"-1",10);if(O<0)return;let T=X.dataManager.getItem(O);if(!T)return;G.emit("item:click",{item:T,index:O,event:L}),Q=y2(Q,O),B.root.setAttribute("aria-activedescendant",`${N}-item-${O}`),Q=S0(Q,T.id,q),$()}),X.keydownHandlers.push((L)=>{if(X.state.isDestroyed)return;let U=X.dataManager.getTotal(),y=Q.focusedIndex,O=!1,T=!1,M=Q;switch(L.key){case"ArrowUp":M=T2(Q,U),O=!0,T=!0;break;case"ArrowDown":M=H2(Q,U),O=!0,T=!0;break;case"Home":M=P2(Q,U),O=!0,T=!0;break;case"End":M=$2(Q,U),O=!0,T=!0;break;case" ":case"Enter":if(Q.focusedIndex>=0){let k=X.dataManager.getItem(Q.focusedIndex);if(k)M=S0(Q,k.id,q);O=!0}break}if(O){L.preventDefault(),Q=M;let k=Q.focusedIndex;if(k>=0){let s=X.dataManager.getState(),P=C0(k,X.sizeCache,X.state.viewportState.containerSize,s.total,"center",X.getCachedCompression());X.scrollController.scrollTo(P),B.root.setAttribute("aria-activedescendant",`${N}-item-${k}`)}else B.root.removeAttribute("aria-activedescendant");if(T){let{selected:s}=Q;if(y>=0&&y!==k){let P=X.dataManager.getItem(y);if(P)X.renderer.updateItemClasses(y,s.has(P.id),!1)}if(k>=0){let P=X.dataManager.getItem(k);if(P)X.renderer.updateItemClasses(k,s.has(P.id),!0)}}else{z();let s=(P)=>{let m=F.get(P);if(m===void 0)return;return X.dataManager.getItem(m)};G.emit("selection:change",{selected:f0(Q),items:p0(Q,s)})}}}),X.methods.set("select",(...L)=>{Q=c0(Q,L,q),$()}),X.methods.set("deselect",(...L)=>{Q=l0(Q,L),$()}),X.methods.set("toggleSelect",(L)=>{Q=S0(Q,L,q),$()}),X.methods.set("selectAll",()=>{if(q!=="multiple")return;let L=X.getAllLoadedItems();Q=G2(Q,L,q),V(),$()}),X.methods.set("clearSelection",()=>{Q=W2(Q);let{renderRange:L,isCompressed:U}=X.state.viewportState,y=X.getItemsForRange(L),O=U?X.getCompressionContext():void 0;X.renderer.render(y,L,Q.selected,Q.focusedIndex,O),G.emit("selection:change",{selected:[],items:[]})}),X.methods.set("getSelected",()=>{return f0(Q)}),X.methods.set("getSelectedItems",()=>{return p0(Q,(U)=>{let y=F.get(U);if(y===void 0)return;return X.dataManager.getItem(y)})}),X.destroyHandlers.push(()=>{if(v&&v.parentNode)v.remove()})},destroy(){if(K&&K.parentNode)K.remove();K=null}}};var Cj=(j)=>{let q=j?.restore;return{name:"withSnapshots",priority:50,methods:["getScrollSnapshot","restoreScroll"],setup(J){J.methods.set("getScrollSnapshot",()=>{let K=J.scrollController.getScrollTop(),X=J.getCachedCompression(),B=J.getVirtualTotal(),G=J.methods.get("getSelected"),W=G&&G().length>0?G():void 0;if(B===0){let V={index:0,offsetInItem:0,total:0};if(W)V.selectedIds=W;return V}let Y,N;if(X.isCompressed){let b=K/X.virtualSize*B;Y=Math.max(0,Math.min(Math.floor(b),B-1)),N=(b-Y)*J.sizeCache.getSize(Y)}else Y=J.sizeCache.indexAtOffset(K),N=K-J.sizeCache.getOffset(Y);N=Math.max(0,N);let F={index:Y,offsetInItem:N,total:B};if(W)F.selectedIds=W;return F});let Q=(K)=>{let{index:X,offsetInItem:B,selectedIds:G}=K,W=J.getVirtualTotal();if(W===0)return;if(!Number.isFinite(X)||!Number.isFinite(B))return;if(J.sizeCache.getTotal()!==W){J.sizeCache.rebuild(W),J.updateCompressionMode();let _=J.getCachedCompression();J.updateContentSize(_.virtualSize)}let N=J.getCachedCompression(),F=Math.max(0,Math.min(X,W-1)),V;if(N.isCompressed){let _=J.sizeCache.getSize(F),z=_>0?B/_:0;V=(F+z)/W*N.virtualSize}else V=J.sizeCache.getOffset(F)+B;let b=J.state.viewportState.containerSize,D=Math.max(0,N.virtualSize-b);if(V=Math.max(0,Math.min(V,D)),J.scrollController.scrollTo(V),G&&G.length>0){let _=J.methods.get("select");if(_)_(...G)}let A=J.methods.get("loadVisibleRange");if(A)requestAnimationFrame(()=>{A()});else{let _=J.methods.get("reload");if(_)requestAnimationFrame(()=>{_()})}};if(J.methods.set("restoreScroll",Q),q)queueMicrotask(()=>{Q(q)})}}};export{Cj as withSnapshots,Rj as withSelection,Pj as withSections,Kj as withScrollbar,Uj as withScale,Gj as withPage,$j as withGrid,Nj as withAsync,r2 as vlist,S0 as toggleSelection,_j as simpleVisibleRange,c0 as selectItems,G2 as selectAll,Oj as rangesEqual,J2 as rafThrottle,qj as needsScaling,q2 as mergeRanges,kj as isSelected,R0 as isSectionHeader,k0 as isPlaceholderItem,bj as isInRange,p0 as getSelectedItems,f0 as getSelectedIds,A0 as getScaleState,Yj as getScaleInfo,A0 as getScale,yj as getRangeCount,Xj as getMaxItemsWithoutScaling,E2 as filterPlaceholders,Tj as diffRanges,l0 as deselectItems,Z2 as createStickyHeader,Q2 as createSparseStorage,y0 as createSizeCache,N2 as createSelectionState,m0 as createSectionedSizeFn,K2 as createSectionLayout,w0 as createScrollbar,Bj as createScrollController,X2 as createPlaceholderManager,n0 as createMeasuredSizeCache,d0 as createGridRenderer,U2 as createGridLayout,o0 as createEmitter,Y2 as createAsyncManager,W2 as clearSelection,Lj as clampScrollPosition,Fj as calculateTotalSize,C0 as calculateScrollToIndex,i0 as calculateScaledVisibleRange,t0 as calculateScaledScrollToIndex,Jj as calculateScaledRenderRange,v0 as calculateScaledItemPosition,Vj as calculateRenderRange,g0 as calculateMissingRanges,Ej as calculateItemOffset,Qj as calculateIndexFromScrollPosition,Aj as calculateActualSize,x0 as buildLayoutItems,$0 as MAX_VIRTUAL_HEIGHT};
|
|
1
|
+
var{defineProperty:F2,getOwnPropertyNames:tJ,getOwnPropertyDescriptor:eJ}=Object,J1=Object.prototype.hasOwnProperty;var h2=new WeakMap,Q1=(J)=>{var q=h2.get(J),Q;if(q)return q;if(q=F2({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function")tJ(J).map((j)=>!J1.call(q,j)&&F2(q,j,{get:()=>J[j],enumerable:!(Q=eJ(J,j))||Q.enumerable}));return h2.set(J,q),q};var j1=(J,q)=>{for(var Q in q)F2(J,Q,{get:q[Q],enumerable:!0,configurable:!0,set:(j)=>q[Q]=()=>j})};var u2=(J,q)=>()=>(J&&(q=J(J=0)),q);var q1=(J,q)=>{let Q=q;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}},X1=(J,q)=>{let Q=q,j=new Float64Array(0),K=(U)=>{Q=U,j=new Float64Array(U+1),j[0]=0;for(let N=0;N<U;N++)j[N+1]=j[N]+J(N)};K(q);let X=(U)=>{if(Q===0)return 0;if(U<=0)return 0;if(U>=j[Q])return Q-1;let N=0,D=Q-1;while(N<D){let Y=N+D+1>>>1;if(j[Y]<=U)N=Y;else D=Y-1}return N};return{getOffset:(U)=>{if(U<=0)return 0;if(U>=Q)return j[Q];return j[U]},getSize:(U)=>J(U),indexAtOffset:(U)=>X(U),getTotalSize:()=>j[Q]??0,getTotal:()=>Q,rebuild:(U)=>K(U),isVariable:()=>!0}},T0=(J,q)=>{if(typeof J==="number")return q1(J,q);return X1(J,q)},u0=(J,q,Q,j)=>{if(j===0)return 0;if(!J.isVariable())return Math.ceil(Q/J.getSize(0));let K=0,X=0,U=q;while(U<j&&X<Q)X+=J.getSize(U),K++,U++;return Math.max(1,K)},o0=(J,q,Q)=>{if(Q===0)return 0;if(!J.isVariable())return Math.floor(q/J.getSize(0));let j=0,K=0;for(let X=Q-1;X>=0;X--){let U=J.getSize(X);if(K+U>q)break;K+=U,j++}return Math.max(j,1)},L2=(J,q,Q)=>{if(Q===0)return 0;let j=Math.floor(q),K=q-j,X=Math.max(0,Math.min(j,Q-1));return J.getOffset(X)+K*J.getSize(X)};var y2=200,z0=50,JJ=5,QJ=2,jJ=50,k0=16000000,qJ="x",XJ=20,T2="_isPlaceholder",YJ="__placeholder_";var F0=(J,q)=>{let Q=q.getTotalSize(),j=Q>k0,K=j?k0:Q,X=Q>0?K/Q:1;return{isCompressed:j,actualSize:Q,virtualSize:K,ratio:X}},e0=(J,q,Q,j,K,X)=>{if(j===0||q===0)return X.start=0,X.end=-1,X;if(!K.isCompressed){let V=Q.indexAtOffset(J),A=Q.indexAtOffset(J+q);if(A<j-1)A++;return X.start=Math.max(0,V),X.end=Math.min(j-1,Math.max(0,A)),X}let{virtualSize:U}=K,D=J/U*j,Y=Math.floor(D),W=u0(Q,Math.max(0,Y),q,j),F=Math.ceil(D)+W,H=U-q-J;if(H<=q&&H>=-1){let V=o0(Q,q,j),A=Math.max(0,j-V),B=Math.max(0,Math.min(1,1-H/q));Y=Math.floor(Y+(A-Y)*B),F=H<=1?j-1:Math.min(j-1,Y+W)}return X.start=Math.max(0,Y),X.end=Math.min(j-1,Math.max(0,F)),X},KJ=(J,q,Q,j)=>{if(Q===0)return j.start=0,j.end=-1,j;return j.start=Math.max(0,J.start-q),j.end=Math.min(Q-1,J.end+q),j},w0=(J,q,Q,j,K,X,U)=>{if(!X.isCompressed||j===0)return Q.getOffset(J);let{virtualSize:N}=X,D=N-K,Y=D-q;if(Y<=K&&Y>=-1){if(q>=D-1){let O=Q.getTotalSize()-Q.getOffset(J);return K-O}let H=o0(Q,K,j),V=Math.max(0,j-H),B=q/N*j,y=Math.max(0,Math.min(1,1-Y/K)),L=Q.getOffset(J)-Q.getOffset(V),E=Q.getOffset(J)-L2(Q,B,j);return E+(L-E)*y}let W=q/N,F=Q.getTotalSize(),M=W*F;return Q.getOffset(J)-M},J2=(J,q,Q,j,K,X="start")=>{if(j===0)return 0;let U;if(K.isCompressed){if(X==="end"&&J===j-1)return Math.max(0,K.virtualSize-Q);U=J/j*K.virtualSize}else U=q.getOffset(J);let N=q.getSize(J);switch(X){case"center":U-=(Q-N)/2;break;case"end":U-=Q-N;break}let D=K.virtualSize-Q;return Math.max(0,Math.min(U,D))},ZJ=(J,q,Q,j)=>{if(Q===0)return 0;if(j.isCompressed){let K=J/j.virtualSize;return Math.floor(K*Q)}return q.indexAtOffset(J)},UJ=(J,q)=>{if(typeof q==="number")return J*q>k0;return q.getTotalSize()>k0},BJ=(J)=>{if(J<=0)return 0;return Math.floor(k0/J)},NJ=(J,q)=>{let Q=F0(J,q);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 Q2=()=>{};var R0=(J)=>{return J!==null&&typeof J==="object"&&J.__groupHeader===!0};var CJ={};j1(CJ,{createGridRenderer:()=>d0});var A1=(J=200)=>{let q=[];return{acquire:()=>{let X=q.pop();if(X)return X;let U=document.createElement("div");return U.setAttribute("role","option"),U},release:(X)=>{if(X.remove(),q.length<J)X.className="",X.textContent="",X.removeAttribute("style"),X.removeAttribute("data-index"),X.removeAttribute("data-id"),X.removeAttribute("data-row"),X.removeAttribute("data-col"),q.push(X)},clear:()=>{q.length=0}}},F1=2,d0=(J,q,Q,j,K,X,U,N,D=!1)=>{let Y=A1(),W=new Map,F=X,M=!1,H=null,V=0,A=0,B="",y=-1,L=(z)=>{if(H&&V===z)return H;return H=F0(z,Q),V=z,H},E={selected:!1,focused:!1},O=(z,S)=>{return E.selected=z,E.focused=S,E},_=`${K}-item ${K}-grid-item`,$=`${K}-item--selected`,h=`${K}-item--focused`,v=(z,S)=>{if(typeof S==="string")z.innerHTML=S;else z.replaceChildren(S)},G=(z,S,c)=>{z.classList.toggle($,S),z.classList.toggle(h,c)},p=(z,S)=>{let c=j.getRow(z);if(S){let a=S.totalItems,I=L(a);if(I.isCompressed)return w0(c,S.scrollPosition,Q,a,S.containerSize,I,S.rangeStart)}return Q.getOffset(c)},i=(z,S)=>{let c=M&&j.getCol(z)===0,a=c?0:j.getCol(z),I=c?0:j.getColumnOffset(a,F),m;if(M){let o=j.getRow(z),e=0,t=new Set;for(let q0=0;q0<z;q0++){let Y0=j.getRow(q0);if(Y0<o&&!t.has(Y0)){let g=Q.getSize(q0);e+=g,t.add(Y0)}}m=e}else m=p(z,S);if(D)return`translate(${Math.round(m)}px, ${Math.round(I)}px)`;return`translate(${Math.round(I)}px, ${Math.round(m)}px)`},w=(z,S)=>{z.style.transform=S},u=(z,S)=>{let c=z.dataset.id?.startsWith("__group_header"),a=c?F:j.getColumnWidth(F),I;if(M||c)I=Q.getSize(S)-j.gap;else{let m=j.getRow(S);I=Q.getSize(m)-j.gap}if(D)z.style.width=`${I}px`,z.style.height=`${a}px`;else z.style.width=`${a}px`,z.style.height=`${I}px`},Z=(z,S,c,a,I)=>{let m=Y.acquire(),o=O(c,a);if(m.className=_,m.dataset.index=String(z),m.dataset.id=String(S.id),m.dataset.row=String(j.getRow(z)),m.dataset.col=String(j.getCol(z)),m.ariaSelected=String(c),N)m.id=`${N}-item-${z}`;if(U){let t=U();if(t!==y)y=t,B=String(t);m.setAttribute("aria-setsize",B),m.setAttribute("aria-posinset",String(z+1))}u(m,z);let e=q(S,z,o);return v(m,e),G(m,c,a),w(m,I),{element:m,lastItemId:S.id,lastSelected:c,lastFocused:a,lastTransform:I,lastSeenFrame:A}},P=(z,S,c,a,I)=>{if(A++,S.start===0&&z.length>0)M=R0(z[0]);for(let[e,t]of W)if(e>=S.start&&e<=S.end)t.lastSeenFrame=A;else if(A-t.lastSeenFrame>F1)Y.release(t.element),W.delete(e);let m=!1;if(U){let e=U();if(e!==y)y=e,B=String(e),m=!0}let o=null;for(let e=S.start;e<=S.end;e++){let t=e-S.start,q0=z[t];if(!q0){console.warn(`⚠️ RENDER: Missing item at index ${e} (range: ${S.start}-${S.end}, items.length: ${z.length})`);continue}let Y0=c.has(q0.id),g=e===a,d=W.get(e);if(d){let J0=d.lastItemId!==q0.id,n=d.lastSelected!==Y0,U0=d.lastFocused!==g;if(J0||n||U0){if(J0){let M0=O(Y0,g),E0=q(q0,e,M0);v(d.element,E0),d.element.dataset.id=String(q0.id),d.element.dataset.row=String(j.getRow(e)),d.element.dataset.col=String(j.getCol(e)),u(d.element,e)}G(d.element,Y0,g),d.element.ariaSelected=String(Y0),d.lastItemId=q0.id,d.lastSelected=Y0,d.lastFocused=g}let K0=i(e,I);if(d.lastTransform!==K0)w(d.element,K0),d.lastTransform=K0;if(m)d.element.setAttribute("aria-setsize",B)}else{let J0=i(e,I),n=Z(e,q0,Y0,g,J0);if(!o)o=document.createDocumentFragment();o.appendChild(n.element),W.set(e,n)}}if(o)J.appendChild(o)},C=(z)=>{for(let[S,c]of W){let a=i(S,z);if(c.lastTransform!==a)w(c.element,a),c.lastTransform=a}},T=(z,S,c,a)=>{let I=W.get(z);if(!I)return;let m=I.lastItemId!==S.id,o=I.lastSelected!==c,e=I.lastFocused!==a;if(m||o||e){let t=O(c,a),q0=q(S,z,t);v(I.element,q0),G(I.element,c,a),I.element.dataset.id=String(S.id),I.element.ariaSelected=String(c),u(I.element,z),I.lastItemId=S.id,I.lastSelected=c,I.lastFocused=a}},k=(z,S,c)=>{let a=W.get(z);if(!a)return;let I=a.lastSelected!==S,m=a.lastFocused!==c;if(I||m)G(a.element,S,c),a.lastSelected=S,a.lastFocused=c},R=(z)=>{return W.get(z)?.element},f=(z)=>{if(Math.abs(z-F)<1)return;F=z;for(let[S,c]of W){u(c.element,S);let a=i(S);w(c.element,a),c.lastTransform=a}},r=()=>{for(let[,z]of W)Y.release(z.element);W.clear()};return{render:P,updatePositions:C,updateItem:T,updateItemClasses:k,getElement:R,updateContainerWidth:f,clear:r,destroy:()=>{r(),Y.clear()}}};var N2=u2(()=>{Q2()});var g2=2,x2=(J=0)=>{let q=[,,,,,];for(let Q=0;Q<5;Q++)q[Q]={position:0,time:0};return{velocity:0,lastPosition:J,lastTime:performance.now(),samples:q,sampleIndex:0,sampleCount:0}},E2=(J,q)=>{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 X=J.samples[0];return X.position=q,X.time=Q,J.sampleIndex=1,J.sampleCount=1,J.lastPosition=q,J.lastTime=Q,J}let K=J.samples[J.sampleIndex];if(K.position=q,K.time=Q,J.sampleIndex=(J.sampleIndex+1)%5,J.sampleCount=Math.min(J.sampleCount+1,5),J.sampleCount>=2){let X=(J.sampleIndex-J.sampleCount+5)%5,U=J.samples[X],N=q-U.position,D=Q-U.time;J.velocity=D>0?Math.abs(N)/D:0}return J.lastPosition=q,J.lastTime=Q,J};var i0=(J,q)=>{let Q=new Map,j=(X)=>{let U=Q.get(X);return U!==void 0?U:J},K=T0(j,q);return{getOffset(X){return K.getOffset(X)},getSize(X){return j(X)},indexAtOffset(X){return K.indexAtOffset(X)},getTotalSize(){return K.getTotalSize()},getTotal(){return K.getTotal()},rebuild(X){if(X<K.getTotal()){for(let U of Q.keys())if(U>=X)Q.delete(U)}K=T0(j,X)},isVariable(){return!0},setMeasuredSize(X,U){Q.set(X,U)},isMeasured(X){return Q.has(X)},getEstimatedSize(){return J},measuredCount(){return Q.size}}};var t0=()=>{let J={},q=(N,D)=>{if(!J[N])J[N]=new Set;return J[N].add(D),()=>Q(N,D)},Q=(N,D)=>{J[N]?.delete(D)};return{on:q,off:Q,emit:(N,D)=>{J[N]?.forEach((Y)=>{try{Y(D)}catch(W){console.error(`[vlist] Error in event handler for "${String(N)}":`,W)}})},once:(N,D)=>{let Y=(W)=>{Q(N,Y),D(W)};return q(N,Y)},clear:(N)=>{if(N)delete J[N];else for(let D in J)delete J[D]},listenerCount:(N)=>{return J[N]?.size??0}}};var m2=(J)=>{if(typeof J==="string"){let q=document.querySelector(J);if(!q)throw Error(`[vlist/builder] Container not found: ${J}`);return q}return J},d2=(J,q,Q,j)=>{let K=document.createElement("div");if(K.className=q,j)K.classList.add(`${q}--horizontal`);if(K.setAttribute("role","listbox"),K.setAttribute("tabindex","0"),Q)K.setAttribute("aria-label",Q);if(j)K.setAttribute("aria-orientation","horizontal");let X=document.createElement("div");if(X.className=`${q}-viewport`,j)X.style.overflowX="auto",X.style.overflowY="hidden";else X.style.overflow="auto";X.style.height="100%",X.style.width="100%";let U=document.createElement("div");if(U.className=`${q}-content`,U.style.position="relative",j)U.style.height="100%";else U.style.width="100%";let N=document.createElement("div");if(N.className=`${q}-items`,N.style.position="relative",j)N.style.height="100%";else N.style.width="100%";return U.appendChild(N),X.appendChild(U),K.appendChild(X),J.appendChild(K),{root:K,viewport:X,content:U,items:N}};var c2=(J=100)=>{let q=[];return{acquire:()=>{let Q=q.pop();if(Q)return Q;let j=document.createElement("div");return j.setAttribute("role","option"),j},release:(Q)=>{if(q.length<J)Q.className="",Q.textContent="",Q.removeAttribute("style"),Q.removeAttribute("data-index"),Q.removeAttribute("data-id"),q.push(Q)},clear:()=>{q.length=0}}};var l2=(J,q,Q,j,K)=>{if(j===0||q===0){K.start=0,K.end=0;return}let X=Q.indexAtOffset(J),U=u0(Q,X,q,j),N=X+U;K.start=Math.max(0,X),K.end=Math.min(j-1,Math.max(0,N))},r2=(J,q,Q,j)=>{if(Q===0){j.start=0,j.end=0;return}j.start=Math.max(0,J.start-q),j.end=Math.min(Q-1,J.end+q)},a2=(J,q,Q,j,K)=>{if(j===0)return 0;let X=Math.max(0,Math.min(J,j-1)),U=q.getOffset(X),N=q.getSize(X),D=Math.max(0,q.getTotalSize()-Q),Y;switch(K){case"center":Y=U-(Q-N)/2;break;case"end":Y=U-Q+N;break;default:Y=U}return Math.max(0,Math.min(Y,D))};var b2=(J)=>J<0.5?2*J*J:-1+(4-2*J)*J,v0=(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}},s2=(J,q)=>{let Q=null,j=()=>{if(Q!==null)cancelAnimationFrame(Q),Q=null};return{animateScroll:(X,U,N)=>{if(j(),Math.abs(U-X)<1){J.scrollTo(U);return}let D=performance.now(),Y=(W)=>{let F=W-D,M=Math.min(F/N,1),H=X+(U-X)*b2(M);if(J.scrollTo(H),q(),M<1)Q=requestAnimationFrame(Y);else Q=null};Q=requestAnimationFrame(Y)},cancelScroll:j}};var n2=(J,q)=>{let{dom:Q,emitter:j,resolvedConfig:K,rawConfig:X,rendered:U,pool:N,sharedState:D,isHorizontal:Y,classPrefix:W,contentSizeHandlers:F,afterScroll:M,clickHandlers:H,keydownHandlers:V,resizeHandlers:A,destroyHandlers:B,methods:y,onScrollFrame:L,resizeObserver:E,renderRange:O}=q;return{get dom(){return Q},get sizeCache(){return J.hc},get emitter(){return j},get config(){return K},get rawConfig(){return X},get renderer(){return{render:(_,$,h,v,G)=>{J.ss=h,J.fi=v,J.ffn()},updateItemClasses:(_,$,h)=>{let v=U.get(_);if(!v)return;v.classList.toggle(`${W}-item--selected`,$),v.classList.toggle(`${W}-item--focused`,h),v.ariaSelected=$?"true":"false"},updatePositions:()=>{},updateItem:()=>{},getElement:(_)=>U.get(_)??null,clear:()=>{},destroy:()=>{}}},set renderer(_){},get dataManager(){return J.dm},set dataManager(_){J.dm=_},get scrollController(){return J.sc},set scrollController(_){J.sc=_},state:D,getContainerWidth(){return J.cw},afterScroll:M,clickHandlers:H,keydownHandlers:V,resizeHandlers:A,contentSizeHandlers:F,destroyHandlers:B,methods:y,replaceTemplate(_){J.at=_},replaceRenderer(_){},replaceDataManager(_){J.dm=_},replaceScrollController(_){J.sc=_},getItemsForRange(_){let{dm:$,it:h}=J,v=[];for(let G=_.start;G<=_.end;G++){let p=$?$.getItem(G):h[G];if(p)v.push(p)}return v},getAllLoadedItems(){let _=J.dm;if(_){let $=_.getTotal(),h=[];for(let v=0;v<$;v++){let G=_.getItem(v);if(G)h.push(G)}return h}return[...J.it]},getVirtualTotal(){return J.vtf()},getCachedCompression(){let _=J.hc;return{isCompressed:!1,actualSize:_.getTotalSize(),virtualSize:_.getTotalSize(),ratio:1}},getCompressionContext(){return{scrollPosition:J.ls,totalItems:J.vtf(),containerSize:J.ch,rangeStart:O.start}},renderIfNeeded(){J.rfn()},forceRender(){J.ffn()},invalidateRendered(){for(let[,_]of U)_.remove(),N.release(_);U.clear()},getRenderFns(){return{renderIfNeeded:J.rfn,forceRender:J.ffn}},setRenderFns(_,$){J.rfn=_,J.ffn=$},setVirtualTotalFn(_){J.vtf=_},rebuildSizeCache(_){J.hc.rebuild(_??J.vtf())},setSizeConfig(_){J.hc=T0(_,J.vtf())},updateContentSize(_){let $=`${_}px`;if(Y)Q.content.style.width=$;else Q.content.style.height=$},updateCompressionMode(){},setVisibleRangeFn(_){J.gvr=_},setScrollToPosFn(_){J.gsp=_},setPositionElementFn(_){J.pef=_},setScrollFns(_,$){J.sgt=_,J.sst=(h)=>{$(h),L()}},setScrollTarget(_){J.st.removeEventListener("scroll",L),J.st=_,J.st.addEventListener("scroll",L,{passive:!0})},getScrollTarget(){return J.st},setContainerDimensions(_){J.gcw=_.width,J.gch=_.height,J.cw=_.width(),J.ch=_.height(),D.viewportState.containerSize=Y?J.cw:J.ch},disableViewportResize(){if(J.vre)J.vre=!1,E.unobserve(Q.viewport)},disableWheelHandler(){if(J.wh)Q.viewport.removeEventListener("wheel",J.wh),J.wh=null}}},o2=(J,q,Q)=>{let{rendered:j,itemState:K,contentSizeHandlers:X,applyTemplate:U,updateContentSize:N}=q,D=()=>{J.hc.rebuild(J.vtf()),N(),Q.updateCompressionMode();for(let Y=0;Y<X.length;Y++)X[Y]();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:(Y)=>J.it[Y],isItemLoaded:(Y)=>Y>=0&&Y<J.it.length&&J.it[Y]!==void 0,getItemsInRange:(Y,W)=>{let F=J.it,M=[],H=Math.max(0,Y),V=Math.min(W,F.length-1);for(let A=H;A<=V;A++)M.push(F[A]);return M},setTotal:(Y)=>{},setItems:(Y,W=0,F)=>{let M=J.it;if(W===0&&(F!==void 0||M.length===0))J.it=Y;else{let H=W+Y.length;if(M.length<H)M.length=H;for(let V=0;V<Y.length;V++)M[W+V]=Y[V]}if(J.ii)D()},updateItem:(Y,W)=>{let F=J.it;if(Y<0||Y>=F.length)return!1;let M=F[Y];if(!M)return!1;F[Y]={...M,...W};let H=j.get(Y);if(H)U(H,J.at(F[Y],Y,K)),H.dataset.id=String(F[Y].id);return!0},removeItem:(Y)=>{if(Y<0||Y>=J.it.length)return!1;if(J.it.splice(Y,1),J.ii)D();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),N(),J.ffn()}}},i2=(J,q)=>{let{dom:Q,classPrefix:j}=q;return{getScrollTop:()=>J.sgt(),scrollTo:(K)=>{J.sst(K),J.ls=K,J.rfn()},scrollBy:(K)=>{let X=J.sgt()+K;J.sst(X),J.ls=X,J.rfn()},isAtTop:()=>J.ls<=2,isAtBottom:(K=2)=>J.sab(K),getScrollPercentage:()=>{let K=J.hc.getTotalSize(),X=Math.max(0,K-J.ch);return X>0?J.ls/X: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 Y1=3,K1="vlist",t2=150,Z1=0,e2=(J)=>{if(!J.container)throw Error("[vlist/builder] Container is required");if(!J.item)throw Error("[vlist/builder] item configuration is required");let q=J.orientation==="horizontal",Q=q?"width":"height",j=q?"estimatedWidth":"estimatedHeight",K=q?J.item.width:J.item.height,X=q?J.item.estimatedWidth:J.item.estimatedHeight;if(K==null&&X==null)throw Error(`[vlist/builder] item.${Q} or item.${j} is required${q?" when orientation is 'horizontal'":""}`);if(K!=null){if(typeof K==="number"&&K<=0)throw Error(`[vlist/builder] item.${Q} must be a positive number`);if(typeof K!=="number"&&typeof K!=="function")throw Error(`[vlist/builder] item.${Q} must be a number or a function (index) => number`)}else if(X!=null){if(typeof X!=="number"||X<=0)throw Error(`[vlist/builder] item.${j} must be a positive number`)}if(!J.item.template)throw Error("[vlist/builder] item.template is required");if(q&&J.reverse)throw Error("[vlist/builder] horizontal direction cannot be combined with reverse mode");let U=new Map,N=!1,D={use(Y){if(N)throw Error("[vlist/builder] Cannot call .use() after .build()");return U.set(Y.name,Y),D},build(){if(N)throw Error("[vlist/builder] .build() can only be called once");return N=!0,U1(J,U,q,K,X??null)}};return D};function U1(J,q,Q,j,K){let{item:X,items:U,overscan:N=Y1,classPrefix:D=K1,ariaLabel:Y,reverse:W=!1,scroll:F}=J,M=F,H=M?.wheel??!0,V=M?.wrap??!1,A=W,B=`${D}-${Z1++}`,y=j??K,L=j==null&&K!=null,E=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||navigator.maxTouchPoints&&navigator.maxTouchPoints>2,O=Q?typeof X.height==="number"?X.height:void 0:typeof X.width==="number"?X.width:void 0,_={overscan:N,classPrefix:D,reverse:A,wrap:V,horizontal:Q,ariaIdPrefix:B},$=Array.from(q.values()).sort((b,x)=>(b.priority??50)-(x.priority??50)),h=new Set($.map((b)=>b.name));for(let b of $)if(b.conflicts){for(let x of b.conflicts)if(h.has(x))throw Error(`[vlist/builder] ${b.name} and ${x} cannot be combined`)}if(A){if(h.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with reverse: true")}let v=m2(J.container),G=d2(v,D,Y,Q);if(M?.wheel===!1)if(Q)G.viewport.style.overflowX="hidden";else G.viewport.style.overflow="hidden";if(M?.scrollbar==="none")G.viewport.classList.add(`${D}-viewport--no-scrollbar`);let p=t0(),i=U||[],w=L?i0(K,i.length):T0(y,i.length),u=c2(),Z={it:i,hc:w,ch:G.viewport.clientHeight,cw:G.viewport.clientWidth,id:!1,ii:!1,ls:0,vt:x2(0),ss:new Set,fi:-1,la:"",dm:null,sc:null,vtf:null,sgt:Q?()=>G.viewport.scrollLeft:()=>G.viewport.scrollTop,sst:Q?(b)=>{G.viewport.scrollLeft=b}:(b)=>{G.viewport.scrollTop=b},sab:(b=2)=>{let x=Z.hc.getTotalSize();return Z.ls+Z.ch>=x-b},sic:!1,rfn:null,ffn:null,gvr:(b,x,l,s,j0)=>{l2(b,x,l,s,j0)},gsp:(b,x,l,s,j0)=>{return a2(b,x,l,s,j0)},pef:null,at:X.template,vre:!0,st:G.viewport,wh:null,gcw:()=>Z.cw,gch:()=>Z.ch};Z.vtf=()=>Z.dm?Z.dm.getTotal():Z.it.length;let P=null,C=null,T=!1,k={start:0,end:0},R={start:0,end:0},f={start:-1,end:-1},r={viewportState:{scrollPosition:0,containerSize:Q?Z.cw:Z.ch,totalSize:Z.hc.getTotalSize(),actualSize:Z.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},Q0=new Map,z=L?new WeakMap:null,S=L?w:null,c=null,a=0,I=!1,m=()=>{if(!L)return;if(I){let b=Z.sgt(),x=Q?G.viewport.scrollWidth-G.viewport.clientWidth:G.viewport.scrollHeight-G.viewport.clientHeight,l=x>0&&b>=x-2;if(B0(),I=!1,l){let s=Math.max(0,Z.hc.getTotalSize()-(Q?Z.cw:Z.ch));if(s>b)Z.sst(s),Z.ls=s,Z.rfn()}}};if(L&&S&&z)c=new ResizeObserver((b)=>{if(Z.id)return;let x=!1,l=k.start;for(let s of b){let j0=z.get(s.target);if(j0===void 0)continue;let Z0=Q?s.borderBoxSize[0].inlineSize:s.borderBoxSize[0].blockSize;if(!S.isMeasured(j0)){let W0=S.getSize(j0);if(S.setMeasuredSize(j0,Z0),x=!0,j0<l&&Z0!==W0)a+=Z0-W0;c.unobserve(s.target);let A0=s.target;if(Q)A0.style.width=`${Z0}px`;else A0.style.height=`${Z0}px`}}if(!x)return;if(S.rebuild(Z.vtf()),Z.hc=S,a!==0){let s=Z.sgt();Z.sst(s+a),Z.ls=s+a,a=0}if(T)I=!0;else{let s=Z.sgt(),j0=Q?G.viewport.scrollWidth-G.viewport.clientWidth:G.viewport.scrollHeight-G.viewport.clientHeight,Z0=j0>0&&s>=j0-2;if(B0(),I=!1,Z0){let W0=Math.max(0,Z.hc.getTotalSize()-(Q?Z.cw:Z.ch));if(W0>s)Z.sst(W0),Z.ls=W0}}f.start=-1,f.end=-1,Z.rfn()});let o={selected:!1,focused:!1},e=`${D}-item`,t=[],q0=[],Y0=[],g=[],d=[],J0=[],n=new Map,U0=null,K0=null,M0=!1,E0=()=>{if(M0)return;M0=!0,U0=n.get("_getSelectedIds")??null,K0=n.get("_getFocusedIndex")??null},N0=(b,x)=>{if(typeof x==="string")b.innerHTML=x;else b.replaceChildren(x)},H0=(b,x)=>{let l=Math.round(Z.hc.getOffset(x));if(Q)b.style.transform=`translateX(${l}px)`;else b.style.transform=`translateY(${l}px)`};Z.pef=H0;let $0=(b,x)=>{let l=u.acquire();l.className=e;let s=!L||S&&S.isMeasured(b);if(Q){if(s)l.style.width=`${Z.hc.getSize(b)}px`;else l.style.width="";if(O!=null)l.style.height=`${O}px`}else if(s)l.style.height=`${Z.hc.getSize(b)}px`;else l.style.height="";if(l.dataset.index=String(b),l.dataset.id=String(x.id),l.ariaSelected="false",l.id=`${B}-item-${b}`,Z.la=String(Z.vtf()),l.setAttribute("aria-setsize",Z.la),l.setAttribute("aria-posinset",String(b+1)),String(x.id).startsWith("__placeholder_"))l.classList.add(`${D}-item--placeholder`);return N0(l,Z.at(x,b,o)),Z.pef(l,b),l},B0=()=>{let b=`${Z.hc.getTotalSize()}px`;if(Q)G.content.style.width=b;else G.content.style.height=b},L0=()=>{if(Z.id)return;E0();let b=U0?U0():Z.ss,x=K0?K0():Z.fi,l=Z.vtf(),s=Q?Z.cw:Z.ch;if(Z.gvr(Z.ls,s,Z.hc,l,k),r2(k,N,l,R),R.start===f.start&&R.end===f.end){if(Z.sic)for(let[X0,_0]of Q0)Z.pef(_0,X0);return}let j0=String(l),Z0=j0!==Z.la;Z.la=j0;for(let[X0,_0]of Q0)if(X0<R.start||X0>R.end)_0.remove(),u.release(_0),Q0.delete(X0);let W0=document.createDocumentFragment(),A0=[],I0=[];for(let X0=R.start;X0<=R.end;X0++){let _0=Z.dm?Z.dm.getItem(X0):Z.it[X0];if(!_0)continue;let G0=Q0.get(X0);if(G0){let y0=G0.dataset.id,p0=String(_0.id);if(y0!==p0){let iJ=y0?.startsWith("__placeholder_"),I2=p0.startsWith("__placeholder_");N0(G0,Z.at(_0,X0,o)),G0.dataset.id=p0;let p2=!L||S&&S.isMeasured(X0);if(Q)G0.style.width=p2?`${Z.hc.getSize(X0)}px`:"";else G0.style.height=p2?`${Z.hc.getSize(X0)}px`:"";if(I2)G0.classList.add(`${D}-item--placeholder`);else G0.classList.remove(`${D}-item--placeholder`);if(iJ&&!I2)G0.classList.add(`${D}-item--replaced`),setTimeout(()=>{G0.classList.remove(`${D}-item--replaced`)},300)}Z.pef(G0,X0);let n0=b.has(_0.id),oJ=X0===x;if(G0.classList.toggle(`${D}-item--selected`,n0),G0.classList.toggle(`${D}-item--focused`,oJ),G0.ariaSelected=n0?"true":"false",Z0)G0.setAttribute("aria-setsize",Z.la)}else{let y0=$0(X0,_0);I0.push({index:X0,element:y0});let p0=b.has(_0.id),n0=X0===x;if(p0)y0.classList.add(`${D}-item--selected`),y0.ariaSelected="true";if(n0)y0.classList.add(`${D}-item--focused`);W0.appendChild(y0),A0.push({index:X0,element:y0})}}if(A0.length>0){G.items.appendChild(W0);for(let{index:X0,element:_0}of A0)Q0.set(X0,_0)}if(L&&c&&S&&z){for(let{index:X0,element:_0}of I0)if(!S.isMeasured(X0))z.set(_0,X0),c.observe(_0)}f.start=R.start,f.end=R.end,r.lastRenderRange.start=R.start,r.lastRenderRange.end=R.end,r.viewportState.scrollPosition=Z.ls,r.viewportState.visibleRange.start=k.start,r.viewportState.visibleRange.end=k.end,r.viewportState.renderRange.start=R.start,r.viewportState.renderRange.end=R.end,p.emit("range:change",{range:{start:R.start,end:R.end}})},D0=()=>{f.start=-1,f.end=-1,Z.rfn()};Z.rfn=L0,Z.ffn=D0;let O0=()=>{if(Z.id)return;let b=Z.sgt(),x=b>=Z.ls?"down":"up";if(Z.vt=E2(Z.vt,b),!G.root.classList.contains(`${D}--scrolling`))G.root.classList.add(`${D}--scrolling`);T=!0,Z.ls=b,Z.rfn(),p.emit("scroll",{scrollPosition:b,direction:x}),p.emit("velocity:change",{velocity:Z.vt.velocity,reliable:Z.vt.sampleCount>=g2});for(let l=0;l<t.length;l++)t[l](b,x);if(C)clearTimeout(C);C=setTimeout(()=>{G.root.classList.remove(`${D}--scrolling`),T=!1,Z.vt.velocity=0,Z.vt.sampleCount=0,p.emit("velocity:change",{velocity:0,reliable:!1}),m()},M?.idleTimeout??t2)},b0=null;if(Z.st.addEventListener("scroll",O0,{passive:!0}),H&&!Q&&!E)b0=(b)=>{b.preventDefault();let x=Z.sgt(),l=b.deltaY,s=Math.max(0,Math.min(x+l,Z.hc.getTotalSize()-Z.ch));Z.sst(s),Z.ls=s,Z.vt=E2(Z.vt,s),Z.rfn();let j0=s>=x?"down":"up";if(p.emit("scroll",{scrollPosition:s,direction:j0}),!G.root.classList.contains(`${D}--scrolling`))G.root.classList.add(`${D}--scrolling`);if(T=!0,C)clearTimeout(C);C=setTimeout(()=>{G.root.classList.remove(`${D}--scrolling`),T=!1,Z.vt.velocity=0,Z.vt.sampleCount=0,p.emit("velocity:change",{velocity:0,reliable:!1}),m()},M?.idleTimeout??t2)},Z.wh=b0,G.viewport.addEventListener("wheel",b0,{passive:!1});else if(Q&&H)b0=(b)=>{if(b.deltaX)return;b.preventDefault(),G.viewport.scrollLeft+=b.deltaY},Z.wh=b0,G.viewport.addEventListener("wheel",b0,{passive:!1});let z2=(b)=>{let l=b.target.closest("[data-index]");if(l){let s=parseInt(l.dataset.index??"-1",10);if(s>=0){let j0=Z.dm?.getItem(s)??Z.it[s];if(j0){if(j0.__groupHeader)return;p.emit("item:click",{item:j0,index:s,event:b})}}}for(let s=0;s<q0.length;s++)q0[s](b)},pJ=(b)=>{let l=b.target.closest("[data-index]");if(l){let s=parseInt(l.dataset.index??"-1",10);if(s>=0){let j0=Z.dm?.getItem(s)??Z.it[s];if(j0){if(j0.__groupHeader)return;p.emit("item:dblclick",{item:j0,index:s,event:b})}}}},w2=(b)=>{for(let x=0;x<Y0.length;x++)Y0[x](b)};G.items.addEventListener("click",z2),G.items.addEventListener("dblclick",pJ),G.root.addEventListener("keydown",w2);let O2=new ResizeObserver((b)=>{if(Z.id)return;for(let x of b){let l=x.contentRect.height,s=x.contentRect.width,j0=Q?s:l,Z0=Q?Z.cw:Z.ch;if(Z.cw=s,Z.ch=l,Math.abs(j0-Z0)>1){if(r.viewportState.containerSize=j0,Z.ii)B0(),Z.rfn(),p.emit("resize",{height:l,width:s})}if(Z.ii)for(let W0=0;W0<g.length;W0++)g[W0](s,l)}});if(Z.vre)O2.observe(G.viewport);let A2={dom:G,emitter:p,resolvedConfig:_,rawConfig:J,rendered:Q0,pool:u,itemState:o,sharedState:r,renderRange:R,isHorizontal:Q,classPrefix:D,contentSizeHandlers:d,afterScroll:t,clickHandlers:q0,keydownHandlers:Y0,resizeHandlers:g,destroyHandlers:J0,methods:n,onScrollFrame:O0,resizeObserver:O2,applyTemplate:N0,updateContentSize:B0},V0=n2(Z,A2);Z.dm=o2(Z,A2,V0),Z.sc=i2(Z,A2);let S2=new Map;for(let b of $)if(b.methods)for(let x of b.methods){let l=S2.get(x);if(l)throw Error(`[vlist/builder] Method "${x}" is registered by both "${l}" and "${b.name}"`);S2.set(x,b.name)}for(let b of $)b.setup(V0);if(Z.ii=!0,V0.state.isInitialized=!0,B0(),Z.rfn(),A&&Z.it.length>0){let b=Z.gsp(Z.it.length-1,Z.hc,Z.ch,Z.it.length,"end");Z.sst(b),Z.ls=b,Z.rfn()}let hJ=(b)=>{V0.dataManager.setItems(b,0,b.length)},uJ=A?(b)=>{let x=Z.sab(2),l=Z.it.length;if(V0.dataManager.setItems(b,l),x&&Z.it.length>0){let s=Z.gsp(Z.it.length-1,Z.hc,Z.ch,Z.it.length,"end");Z.sst(s),Z.ls=s,Z.rfn()}}:(b)=>{let x=Z.it.length;V0.dataManager.setItems(b,x)},gJ=A?(b)=>{let x=Z.sgt(),l=Z.hc.getTotalSize(),s=[...Z.it];V0.dataManager.clear(),V0.dataManager.setItems([...b,...s],0);let Z0=Z.hc.getTotalSize()-l;if(Z0>0)Z.sst(x+Z0),Z.ls=x+Z0}:(b)=>{let x=[...Z.it];V0.dataManager.clear(),V0.dataManager.setItems([...b,...x],0)},xJ=(b,x)=>{V0.dataManager.updateItem(b,x)},mJ=(b)=>{V0.dataManager.removeItem(b)},dJ=async()=>{if(V0.dataManager.reload)await V0.dataManager.reload()},s0=()=>{if(P!==null)cancelAnimationFrame(P),P=null},cJ=(b,x,l)=>{if(s0(),Math.abs(x-b)<1){Z.sst(x),Z.ls=x,Z.rfn();return}let s=performance.now(),j0=(Z0)=>{let W0=Z0-s,A0=Math.min(W0/l,1),I0=b+(x-b)*b2(A0);if(Z.sst(I0),Z.ls=I0,Z.rfn(),A0<1)P=requestAnimationFrame(j0);else P=null};P=requestAnimationFrame(j0)},lJ=(b,x)=>{let{align:l,behavior:s,duration:j0}=v0(x),Z0=Z.vtf(),W0=b;if(V&&Z0>0)W0=(W0%Z0+Z0)%Z0;let A0=Z.gsp(W0,Z.hc,Z.ch,Z0,l);if(s==="smooth")cJ(Z.sgt(),A0,j0);else s0(),Z.sst(A0)},rJ=()=>Z.sgt(),aJ=(b,x)=>{return p.on(b,x)},sJ=(b,x)=>{p.off(b,x)},nJ=()=>{if(Z.id)return;if(Z.id=!0,V0.state.isDestroyed=!0,G.items.removeEventListener("click",z2),G.root.removeEventListener("keydown",w2),Z.st.removeEventListener("scroll",O0),O2.disconnect(),c)c.disconnect(),c=null;if(Z.wh)G.viewport.removeEventListener("wheel",Z.wh);if(C)clearTimeout(C);for(let b=0;b<J0.length;b++)J0[b]();for(let b of $)if(b.destroy)b.destroy();s0();for(let[,b]of Q0)b.remove(),u.release(b);Q0.clear(),u.clear(),p.clear(),G.root.remove()},f2={get element(){return G.root},get items(){if(n.has("_getItems"))return n.get("_getItems")();return Z.it},get total(){if(n.has("_getTotal"))return n.get("_getTotal")();return Z.vtf()},setItems:n.has("setItems")?n.get("setItems"):hJ,appendItems:n.has("appendItems")?n.get("appendItems"):uJ,prependItems:n.has("prependItems")?n.get("prependItems"):gJ,updateItem:n.has("updateItem")?n.get("updateItem"):xJ,removeItem:n.has("removeItem")?n.get("removeItem"):mJ,reload:n.has("reload")?n.get("reload"):dJ,scrollToIndex:n.has("scrollToIndex")?n.get("scrollToIndex"):lJ,cancelScroll:n.has("cancelScroll")?n.get("cancelScroll"):s0,getScrollPosition:n.has("getScrollPosition")?n.get("getScrollPosition"):rJ,on:aJ,off:sJ,destroy:nJ};for(let[b,x]of n){if(b.charCodeAt(0)===95||b==="setItems"||b==="appendItems"||b==="prependItems"||b==="updateItem"||b==="removeItem"||b==="reload"||b==="scrollToIndex"||b==="scrollToItem"||b==="cancelScroll"||b==="getScrollPosition")continue;f2[b]=x}return f2}Q2();var S0=(J,q,Q={},j="vlist",K=!1)=>{let{autoHide:X=!0,autoHideDelay:U=1000,minThumbSize:N=30,showOnHover:D=!0,hoverZoneWidth:Y=16,showOnViewportEnter:W=!0}=Q,F=0,M=0,H=0,V=0,A=!1,B=!1,y=0,L=0,E=0,O=null,_=!1,$=null,h=null,v=K?"width":"height",G=K?"translateX":"translateY",p=K?(t)=>t.clientX:(t)=>t.clientY,i=K?"left":"top",w=document.createElement("div"),u=document.createElement("div"),Z=D?document.createElement("div"):null,P=()=>{if(w.className=`${j}-scrollbar`,u.className=`${j}-scrollbar-thumb`,K)w.classList.add(`${j}-scrollbar--horizontal`);if(w.appendChild(u),J.appendChild(w),Z){if(Z.className=`${j}-scrollbar-hover`,K)Z.classList.add(`${j}-scrollbar-hover--horizontal`),Z.style.height=`${Y}px`;else Z.style.width=`${Y}px`;J.appendChild(Z)}},C=()=>{if(O)clearTimeout(O),O=null},T=()=>{if(!X)return;C(),O=setTimeout(R,U)},k=()=>{if(F<=M)return;if(C(),!_)w.classList.add(`${j}-scrollbar--visible`),_=!0;if(X&&!A&&!B)T()},R=()=>{if(A||B)return;w.classList.remove(`${j}-scrollbar--visible`),_=!1},f=(t,q0)=>{F=t,M=q0;let Y0=F>M;if(w.style.display=Y0?"":"none",!Y0){R();return}let g=M/F;H=Math.max(N,g*M),u.style[v]=`${H}px`,V=M-H,r(E)},r=(t)=>{if(E=t,F<=M||V<=0)return;let q0=F-M,g=Math.min(1,Math.max(0,t/q0))*V;u.style.transform=`${G}(${g}px)`},Q0=(t)=>{if(t.target===u)return;let q0=w.getBoundingClientRect(),d=p(t)-q0[i]-H/2,n=Math.max(0,Math.min(d,V))/V,U0=F-M,K0=n*U0;q(K0),k()},z=(t)=>{t.preventDefault(),t.stopPropagation(),A=!0,y=p(t),L=E,C(),w.classList.add(`${j}-scrollbar--dragging`),document.addEventListener("mousemove",S),document.addEventListener("mouseup",c)},S=(t)=>{if(!A)return;let q0=p(t)-y,Y0=V>0?q0/V:0,g=F-M,d=Y0*g,J0=Math.max(0,Math.min(L+d,g)),U0=J0/g*V;if(u.style.transform=`${G}(${U0}px)`,h=J0,$===null)$=requestAnimationFrame(()=>{if(h!==null)q(h);$=null})},c=()=>{if(A=!1,$!==null)cancelAnimationFrame($),$=null;if(h!==null)q(h),h=null;if(w.classList.remove(`${j}-scrollbar--dragging`),X&&!B)T();document.removeEventListener("mousemove",S),document.removeEventListener("mouseup",c)},a=()=>{if(W)k()},I=()=>{if(!A){if(B=!1,X)T()}},m=()=>{B=!0,C(),k()},o=()=>{if(B=!1,!A&&X)T()},e=()=>{if(C(),$!==null)cancelAnimationFrame($),$=null;if(w.removeEventListener("click",Q0),w.removeEventListener("mouseenter",m),w.removeEventListener("mouseleave",o),u.removeEventListener("mousedown",z),J.removeEventListener("mouseenter",a),J.removeEventListener("mouseleave",I),document.removeEventListener("mousemove",S),document.removeEventListener("mouseup",c),Z){if(Z.removeEventListener("mouseenter",m),Z.removeEventListener("mouseleave",o),Z.parentNode)Z.parentNode.removeChild(Z)}if(w.parentNode)w.parentNode.removeChild(w)};if(P(),w.addEventListener("click",Q0),w.addEventListener("mouseenter",m),w.addEventListener("mouseleave",o),u.addEventListener("mousedown",z),J.addEventListener("mouseenter",a),J.addEventListener("mouseleave",I),Z)Z.addEventListener("mouseenter",m),Z.addEventListener("mouseleave",o);return{show:k,hide:R,updateBounds:f,updatePosition:r,isVisible:()=>_,destroy:e}};var WJ=(J)=>{let q=null;return{name:"withScrollbar",priority:30,setup(Q){let{dom:j,config:K}=Q,{classPrefix:X,horizontal:U}=K;if(q=S0(j.viewport,(Y)=>Q.scrollController.scrollTo(Y),J??{},X,U),!j.viewport.classList.contains(`${X}-viewport--custom-scrollbar`))j.viewport.classList.add(`${X}-viewport--custom-scrollbar`);let N=Q.getCachedCompression();q.updateBounds(N.virtualSize,Q.state.viewportState.containerSize);let D=q;Q.afterScroll.push((Y,W)=>{D.updatePosition(Y),D.show()}),Q.resizeHandlers.push((Y,W)=>{if(D){let F=Q.getCachedCompression();D.updateBounds(F.virtualSize,Q.state.viewportState.containerSize)}}),Q.contentSizeHandlers.push(()=>{if(D){let Y=Q.getCachedCompression();D.updateBounds(Y.virtualSize,Q.state.viewportState.containerSize)}}),Q.destroyHandlers.push(()=>{if(D)D.destroy()})},destroy(){if(q)q.destroy(),q=null}}};var DJ=(J=0)=>{let q=[,,,,,,,,];for(let Q=0;Q<8;Q++)q[Q]={position:0,time:0};return{velocity:0,lastPosition:J,lastTime:performance.now(),samples:q,sampleIndex:0,sampleCount:0}},j2=(J,q)=>{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 X=J.samples[0];return X.position=q,X.time=Q,J.sampleIndex=1,J.sampleCount=1,J.lastPosition=q,J.lastTime=Q,J}let K=J.samples[J.sampleIndex];if(K.position=q,K.time=Q,J.sampleIndex=(J.sampleIndex+1)%8,J.sampleCount=Math.min(J.sampleCount+1,8),J.sampleCount>=2){let X=(J.sampleIndex-J.sampleCount+8)%8,U=J.samples[X],N=q-U.position,D=Q-U.time;J.velocity=D>0?N/D:0}return J.lastPosition=q,J.lastTime=Q,J},B1=(J)=>J.sampleCount>=3,_J=(J,q={})=>{let{wheel:Q=!0,sensitivity:j=1,smoothing:K=!1,idleTimeout:X=150,onScroll:U,onIdle:N,scrollElement:D,horizontal:Y=!1}=q,W=!!D,F=0,M=0,H=W?Y?window.innerWidth:window.innerHeight:Y?J.clientWidth:J.clientHeight,V=q.compressed??!1,A=q.compression,B=DJ(),y=!1,L=null,O=q2(()=>{let I=Y?J.scrollLeft:J.scrollTop,m=I>=F?"down":"up";if(B=j2(B,I),F=I,U)U({scrollTop:F,direction:m,velocity:B.velocity});p()}),$=q2(()=>{let I=J.getBoundingClientRect(),m=Y?Math.max(0,-I.left):Math.max(0,-I.top),o=m>=F?"down":"up";if(B=j2(B,m),F=m,!y)y=!0;if(U)U({scrollTop:F,direction:o,velocity:B.velocity});p()}),h=(I)=>{I.preventDefault()},v=(I)=>{if(I.deltaX)return;I.preventDefault(),J.scrollLeft+=I.deltaY},G=(I)=>{if(!V)return;I.preventDefault();let m=(Y?I.deltaX||I.deltaY:I.deltaY)*j,o=F+m;if(K)o=F+m*0.3;if(o=Math.max(0,Math.min(o,M)),o!==F){let t=o>=F?"down":"up";if(B=j2(B,o),F=o,!y)y=!0;if(U)U({scrollTop:F,direction:t,velocity:B.velocity});p()}},p=()=>{if(L)clearTimeout(L);L=setTimeout(()=>{if(y=!1,B=DJ(F),N)N()},X)},i=(I)=>{if(V)return;if(V=!0,A=I,M=I.virtualSize-H,W)return;if(O.cancel(),J.removeEventListener("scroll",O),!Q)J.removeEventListener("wheel",h);else if(Y)J.removeEventListener("wheel",v);if(Y)J.style.overflowX="hidden";else J.style.overflow="hidden";if(Q)J.addEventListener("wheel",G,{passive:!1});let m=Y?J.scrollLeft:J.scrollTop;if(m>0){let o=Y?A?.actualSize??J.scrollWidth:A?.actualSize??J.scrollHeight;F=m/o*M}if(Y)J.scrollLeft=0;else J.scrollTop=0},w=()=>{if(!V)return;if(V=!1,W){A=void 0;return}if(J.removeEventListener("wheel",G),Y)J.style.overflowX="auto";else J.style.overflow="auto";if(J.addEventListener("scroll",O,{passive:!0}),!Q)J.addEventListener("wheel",h,{passive:!1});else if(Y)J.addEventListener("wheel",v,{passive:!1});if(A&&F>0){let m=F/M*(A.actualSize-H);if(Y)J.scrollLeft=m;else J.scrollTop=m}A=void 0},u=()=>{if(W||V)return F;return Y?J.scrollLeft:J.scrollTop},Z=(I,m=!1)=>{let o=Math.max(0,Math.min(I,M||1/0));if(W){let e=J.getBoundingClientRect();if(Y){let t=e.left+window.scrollX;window.scrollTo({left:t+o,behavior:m?"smooth":"auto"})}else{let t=e.top+window.scrollY;window.scrollTo({top:t+o,behavior:m?"smooth":"auto"})}}else if(V){if(o===F)return;let t=o>=F?"down":"up";if(B=j2(B,o),F=o,!y)y=!0;if(U)U({scrollTop:F,direction:t,velocity:B.velocity});p()}else if(Y)J.scrollTo({left:o,behavior:m?"smooth":"auto"});else J.scrollTo({top:o,behavior:m?"smooth":"auto"})},P=(I)=>{Z(u()+I)},C=()=>{return u()<=0},T=(I=0)=>{let m=u(),o=W||V?M:Y?J.scrollWidth-J.clientWidth:J.scrollHeight-J.clientHeight;return m>=o-I},k=()=>{let I=u(),m=W||V?M:Y?J.scrollWidth-J.clientWidth:J.scrollHeight-J.clientHeight;if(m<=0)return 0;return Math.min(1,Math.max(0,I/m))},R=(I)=>{if(I.compression)A=I.compression,M=A.virtualSize-H},f=()=>V,r=()=>Math.abs(B.velocity),Q0=()=>B1(B),z=()=>y,S=()=>W,c=(I)=>{if(H=I,A)M=A.virtualSize-H},a=()=>{if(L)clearTimeout(L);if(W)$.cancel(),window.removeEventListener("scroll",$);else O.cancel(),J.removeEventListener("scroll",O),J.removeEventListener("wheel",G),J.removeEventListener("wheel",h),J.removeEventListener("wheel",v)};if(W){if(V&&A)M=A.virtualSize-H;window.addEventListener("scroll",$,{passive:!0})}else if(V&&A){if(M=A.virtualSize-H,Y)J.style.overflowX="hidden";else J.style.overflow="hidden";if(Q)J.addEventListener("wheel",G,{passive:!1})}else{if(Y)J.style.overflowX="auto",J.style.overflowY="hidden";else J.style.overflow="auto";if(J.addEventListener("scroll",O,{passive:!0}),!Q)J.addEventListener("wheel",h,{passive:!1});else if(Y)J.addEventListener("wheel",v,{passive:!1})}return{getScrollTop:u,scrollTo:Z,scrollBy:P,isAtTop:C,isAtBottom:T,getScrollPercentage:k,getVelocity:r,isTracking:Q0,isScrolling:z,updateConfig:R,enableCompression:i,disableCompression:w,isCompressed:f,isWindowMode:S,updateContainerHeight:c,destroy:a}},q2=(J)=>{let q=null,Q=null,j=(...K)=>{if(Q=K,q===null)q=requestAnimationFrame(()=>{if(q=null,Q)J(...Q)})};return j.cancel=()=>{if(q!==null)cancelAnimationFrame(q),q=null},j};var N1=0.65,W1=0.5,D1=0.95,_1=0.1,V1=5,G1=100,VJ=()=>{let J=null,q=0,Q=!1,j=0,K=null,X=0,U=0,N=null,D=[];return{name:"withScale",priority:20,setup(Y){let{dom:W,config:F}=Y,{classPrefix:M,horizontal:H}=F,V=()=>{let L=Y.getVirtualTotal(),E=F0(L,Y.sizeCache);if(E.isCompressed&&!Q){Q=!0,Y.scrollController.enableCompression(E),Y.updateContentSize(E.virtualSize),Y.setScrollFns(()=>q,(w)=>{if(q=w,j=w,K!==null)cancelAnimationFrame(K),K=null});let O=()=>{let w=j-q;if(Math.abs(w)<W1)q=j,K=null;else{q+=w*N1;let Z=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize;q=Math.max(0,Math.min(q,Z)),K=requestAnimationFrame(O)}Y.scrollController.scrollTo(q)},_=W.viewport,$=(w)=>{w.preventDefault();let Z=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize;if(j=Math.max(0,Math.min(j+w.deltaY,Z)),K===null)K=requestAnimationFrame(O)};_.addEventListener("wheel",$,{passive:!1});let h=()=>{if(N!==null)cancelAnimationFrame(N),N=null},v=(w)=>{if(h(),K!==null)cancelAnimationFrame(K),K=null;let u=w.touches[0];if(!u)return;let Z=H?u.clientX:u.clientY;X=Z,U=q,D=[{time:performance.now(),y:Z}]},G=(w)=>{w.preventDefault();let u=w.touches[0];if(!u)return;let Z=H?u.clientX:u.clientY,P=performance.now();if(D.push({time:P,y:Z}),D.length>V1)D.shift();let C=X-Z,k=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize,R=Math.max(0,Math.min(U+C,k));q=R,j=R,Y.scrollController.scrollTo(R)},p=(w)=>{let u=performance.now(),Z=D.filter((k)=>u-k.time<G1),P=0;if(Z.length>=2){let k=Z[0],R=Z[Z.length-1],f=R.time-k.time;if(f>0)P=(k.y-R.y)/f}if(D=[],Math.abs(P)<_1)return;let C=P*16,T=()=>{if(C*=D1,Math.abs(C)<0.5){N=null;return}let R=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize,f=q+C;if(f=Math.max(0,Math.min(f,R)),f<=0&&C<0||f>=R&&C>0){q=f,j=f,Y.scrollController.scrollTo(f),N=null;return}q=f,j=f,Y.scrollController.scrollTo(f),N=requestAnimationFrame(T)};N=requestAnimationFrame(T)};if(_.addEventListener("touchstart",v,{passive:!0}),_.addEventListener("touchmove",G,{passive:!1}),_.addEventListener("touchend",p,{passive:!0}),_.addEventListener("touchcancel",p,{passive:!0}),Y.destroyHandlers.push(()=>{if(_.removeEventListener("wheel",$),_.removeEventListener("touchstart",v),_.removeEventListener("touchmove",G),_.removeEventListener("touchend",p),_.removeEventListener("touchcancel",p),h(),K!==null)cancelAnimationFrame(K),K=null}),!W.viewport.querySelector(`.${M}-scrollbar`)){if(J=S0(W.viewport,(u)=>Y.scrollController.scrollTo(u),{},M,H),!W.viewport.classList.contains(`${M}-viewport--custom-scrollbar`))W.viewport.classList.add(`${M}-viewport--custom-scrollbar`);J.updateBounds(E.virtualSize,Y.state.viewportState.containerSize);let w=J;Y.afterScroll.push((u,Z)=>{if(w)w.updatePosition(u),w.show()}),Y.resizeHandlers.push((u,Z)=>{if(w){let P=Y.getCachedCompression();w.updateBounds(P.virtualSize,Y.state.viewportState.containerSize)}})}}else if(!E.isCompressed&&Q)Q=!1,Y.scrollController.disableCompression(),Y.updateContentSize(E.actualSize);else if(E.isCompressed)Y.scrollController.updateConfig({compression:E}),Y.updateContentSize(E.virtualSize);if(J)J.updateBounds(E.virtualSize,Y.state.viewportState.containerSize);Y.state.cachedCompression={state:E,totalItems:L}};Y.updateCompressionMode=V;let A=Y.getCachedCompression.bind(Y);Y.getCachedCompression=()=>{if(Y.state.cachedCompression)return Y.state.cachedCompression.state;return A()},Y.setVisibleRangeFn((L,E,O,_,$)=>{B=null,y=null;let h=F0(_,O);e0(L,E,O,_,h,$)}),Y.setScrollToPosFn((L,E,O,_,$)=>{let h=F0(_,E);return J2(L,E,O,_,h,$)});let B=null,y=null;Y.setPositionElementFn((L,E)=>{let O=Y.getVirtualTotal(),_=F0(O,Y.sizeCache);if(_.isCompressed){let $=Y.scrollController.getScrollTop();if(B===null||E<y)y=E,B=Math.round(w0(E,$,Y.sizeCache,O,Y.state.viewportState.containerSize,_));let h=B+Y.sizeCache.getOffset(E)-Y.sizeCache.getOffset(y),v=Y.config.horizontal;L.style.transform=v?`translateX(${h}px)`:`translateY(${h}px)`}else{let $=Math.round(Y.sizeCache.getOffset(E)),h=Y.config.horizontal;L.style.transform=h?`translateX(${$}px)`:`translateY(${$}px)`}}),V(),Y.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(N!==null)cancelAnimationFrame(N),N=null}}};var X2=(J={})=>{let{chunkSize:q=100,maxCachedItems:Q=5000,evictionBuffer:j=200,onEvict:K}=J,X=new Map,U=0,N=0,D=(P)=>{let C=X.get(P);if(!C)C={items:Array(q),count:0,lastAccess:Date.now()},X.set(P,C);else C.lastAccess=Date.now();return C},Y=(P)=>{return Math.floor(P/q)},W=(P)=>{return P%q},F=()=>U,M=(P)=>{U=P},H=(P)=>{if(P<0||P>=U)return;let C=Y(P),T=X.get(C);if(!T)return;return T.items[W(P)]},V=(P)=>{if(P<0||P>=U)return!1;let C=Y(P),T=X.get(C);if(!T)return!1;return T.items[W(P)]!==void 0},A=(P,C)=>{let T=Y(P),k=D(T),R=W(P),f=k.items[R]===void 0;if(k.items[R]=C,f)k.count++,N++;if(P>=U)U=P+1},B=(P,C)=>{for(let T=0;T<C.length;T++){let k=C[T];if(k!==void 0)A(P+T,k)}},y=(P)=>{if(P<0||P>=U)return!1;let C=Y(P),T=X.get(C);if(!T)return!1;let k=W(P);if(T.items[k]===void 0)return!1;if(T.items[k]=void 0,T.count--,N--,T.count===0)X.delete(C);return!0},L=(P,C)=>{let T=[];for(let k=P;k<=C&&k<U;k++)T.push(H(k));return T},E=(P,C)=>{for(let T=P;T<=C&&T<U;T++)if(!V(T))return!1;return!0},O=()=>{let P=[],C=null,T=Array.from(X.keys()).sort((k,R)=>k-R);for(let k of T){let R=X.get(k);if(!R)continue;let f=k*q;for(let r=0;r<q;r++){let Q0=f+r;if(Q0>=U)break;if(R.items[r]!==void 0)if(C===null)C={start:Q0,end:Q0};else if(Q0===C.end+1)C.end=Q0;else P.push(C),C={start:Q0,end:Q0};else if(C!==null)P.push(C),C=null}}if(C!==null)P.push(C);return P},_=(P,C)=>{let T=[],k=null;for(let R=P;R<=C&&R<U;R++)if(!V(R))if(k===null)k={start:R,end:R};else k.end=R;else if(k!==null)T.push(k),k=null;if(k!==null)T.push(k);return T},$=(P)=>{return X.has(P)},h=(P)=>{let C=X.get(P);if(C)C.lastAccess=Date.now()},v=(P,C)=>{if(P>C||X.size===0)return;let T=Date.now(),k=Y(Math.max(0,P)),R=Y(Math.min(U-1,C));for(let f=k;f<=R;f++){let r=X.get(f);if(r)r.lastAccess=T}},G=(P,C)=>{if(N<=Q)return 0;let T=Math.max(0,P-j),k=Math.min(U-1,C+j),R=Y(T),f=Y(k),r=0,Q0=[];for(let[z,S]of X)if(z<R||z>f)r+=S.count,Q0.push(z),N-=S.count,X.delete(z);if(r>0&&K)K(r,Q0);return r},p=()=>{if(N<=Q)return 0;let P=Array.from(X.entries()).sort(([,k],[,R])=>k.lastAccess-R.lastAccess),C=0,T=[];for(let[k,R]of P){if(N<=Q)break;C+=R.count,N-=R.count,T.push(k),X.delete(k)}if(C>0&&K)K(C,T);return C},i=()=>{return{totalItems:U,cachedItems:N,cachedChunks:X.size,chunkSize:q,maxCachedItems:Q,memoryEfficiency:U>0?1-N/U:1}},w=()=>N,u=()=>{X.clear(),N=0};return{chunkSize:q,maxCachedItems:Q,getTotal:F,setTotal:M,get:H,has:V,set:A,setRange:B,delete:y,getRange:L,isRangeLoaded:E,getLoadedRanges:O,findUnloadedRanges:_,getChunkIndex:Y,isChunkLoaded:$,touchChunk:h,touchChunksForRange:v,evictDistant:G,evictToLimit:p,getStats:i,getCachedCount:w,clear:u,reset:()=>{u(),U=0}}},Y2=(J)=>{if(J.length===0)return[];let q=[...J].sort((j,K)=>j.start-K.start),Q=[{...q[0]}];for(let j=1;j<q.length;j++){let K=q[j],X=Q[Q.length-1];if(K.start<=X.end+1)X.end=Math.max(X.end,K.end);else Q.push({...K})}return Q},g0=(J,q,Q)=>{let j=Math.floor(J.start/Q)*Q,K=Math.ceil((J.end+1)/Q)*Q-1,X={start:j,end:K};if(q.length===0)return[X];let U=[],N=Y2(q),D=X.start;for(let Y of N){if(Y.end<D)continue;if(Y.start>X.end)break;if(Y.start>D)U.push({start:D,end:Math.min(Y.start-1,X.end)});if(D=Y.end+1,D>X.end)break}if(D<=X.end)U.push({start:D,end:X.end});return U};var K2=(J={})=>{let{maskCharacter:q=qJ,maxSampleSize:Q=XJ}=J,j=[],K=!1,X=0,U=(F)=>{if(K||F.length===0)return;let M=Math.min(F.length,Q);for(let H=0;H<M;H++){let V=F[H];if(!V||typeof V!=="object")continue;let A={};for(let[B,y]of Object.entries(V)){if(B.startsWith("_")||B==="id")continue;A[B]=String(y??"").length}if(Object.keys(A).length>0)j.push(A)}K=!0},N=()=>K,D=(F)=>{let M={id:`${YJ}${X++}`,[T2]:!0,_index:F};if(j.length===0)return M.label=q.repeat(12),M;let H=j[F%j.length];for(let[V,A]of Object.entries(H))M[V]=q.repeat(Math.max(1,A));return M};return{analyzeStructure:U,hasAnalyzedStructure:N,generate:D,generateRange:(F,M)=>{let H=[];for(let V=F;V<=M;V++)H.push(D(V));return H},clear:()=>{j=[],K=!1,X=0}}},P0=(J)=>{if(!J||typeof J!=="object")return!1;return J[T2]===!0},H2=(J)=>{return J.filter((q)=>!P0(q))};var O1=50,Z2=(J={})=>{let{adapter:q,initialItems:Q,initialTotal:j,storage:K,placeholder:X,pageSize:U=O1,onStateChange:N,onItemsLoaded:D,onItemsEvicted:Y}=J,W=X2({...K,onEvict:(g,d)=>{Y?.(g),_()}}),F=null,M=()=>{if(!F)F=K2(X);return F},H=new Map,V=!1,A,B=!0,y,L=[],E=0,O=new Map,_=()=>{N?.(Z())},$=()=>{H.clear();let g=W.getLoadedRanges();for(let d of g)for(let J0=d.start;J0<=d.end;J0++){let n=W.get(J0);if(n&&!P0(n))H.set(n.id,J0)}},h=(g,d)=>{if(!P0(d))H.set(d.id,g)},v=(g)=>{H.delete(g)},G=(g,d)=>{return`${g}-${d}`},p=()=>W.getTotal(),i=()=>W.getCachedCount(),w=()=>V,u=()=>B,Z=()=>({total:W.getTotal(),cached:W.getCachedCount(),isLoading:V,pendingRanges:L,error:A,hasMore:B,cursor:y}),P=()=>W,C=()=>M(),T=(g)=>{let d=W.get(g);if(d!==void 0)return d;if(g>=0&&g<W.getTotal())return M().generate(g);return},k=(g)=>{let d=H.get(g);if(d===void 0)return;return W.get(d)},R=(g)=>{return H.get(g)??-1},f=(g)=>{let d=W.get(g);return d!==void 0&&!P0(d)},r=(g,d)=>{let J0=[],n=W.getTotal(),U0=0,K0=0;W.touchChunksForRange(g,Math.min(d,n-1));for(let M0=g;M0<=d&&M0<n;M0++){let E0=W.get(M0);if(E0!==void 0)J0.push(E0),U0++;else J0.push(M().generate(M0)),K0++}return J0},Q0=(g)=>{W.setTotal(g),B=W.getCachedCount()<g,_()},z=(g,d=0,J0)=>{if(F&&!F.hasAnalyzedStructure()&&g.length>0)F.analyzeStructure(g);for(let n=0;n<g.length;n++){let U0=g[n];if(U0!==void 0){let K0=d+n;W.set(K0,U0),h(K0,U0)}}if(J0!==void 0)W.setTotal(J0);else if(d+g.length>W.getTotal())W.setTotal(d+g.length);if(W.getCachedCount()>=W.getTotal()&&W.getTotal()>0)B=!1;D?.(g,d,W.getTotal()),_()},S=(g,d)=>{let J0=H.get(g);if(J0===void 0)return!1;let n=W.get(J0);if(!n)return!1;let U0={...n,...d};if(W.set(J0,U0),d.id!==void 0&&d.id!==g)v(g),h(J0,U0);return _(),!0},c=(g)=>{let d=H.get(g);if(d===void 0)return!1;W.delete(d),v(g);let J0=W.getTotal();if(J0>0)W.setTotal(J0-1);return _(),!0},a=async(g,d)=>{if(!q)return;let J0=G(g,d);if(O.has(J0))return;let n=W.getLoadedRanges(),U0=g0({start:g,end:d},n,W.chunkSize);if(U0.length===0)return;let K0=W.chunkSize,M0=[];for(let N0 of U0){let H0=Math.floor(N0.start/K0),$0=Math.floor(N0.end/K0);for(let B0=H0;B0<=$0;B0++){let L0=B0*K0,D0=L0+K0-1,O0=G(L0,D0);if(!M0.some((b0)=>b0.start===L0)&&!O.has(O0))M0.push({start:L0,end:D0})}}let E0=[];for(let N0 of U0){let H0=Math.floor(N0.start/K0),$0=Math.floor(N0.end/K0);for(let B0=H0;B0<=$0;B0++){let L0=B0*K0,D0=L0+K0-1,O0=G(L0,D0);if(O.has(O0)){let b0=O.get(O0);if(!E0.includes(b0))E0.push(b0)}}}for(let N0 of M0){let H0=G(N0.start,N0.end),$0=(async()=>{L.push(N0),V=!0,A=void 0,_();try{let B0=N0.end-N0.start+1,L0={offset:N0.start,limit:B0,cursor:void 0},D0=await q.read(L0);if(z(D0.items,N0.start,D0.total),D0.cursor)y=D0.cursor;let O0=N0.start+D0.items.length;if(O0>=E){if(E=O0,D0.hasMore!==void 0)B=D0.hasMore;else if(D0.total!==void 0)B=O0<D0.total}}catch(B0){A=B0 instanceof Error?B0:Error(String(B0))}finally{O.delete(H0),L=L.filter((B0)=>B0.start!==N0.start||B0.end!==N0.end),V=O.size>0,_()}})();O.set(H0,$0),E0.push($0)}await Promise.all(E0)},I=async(g,d)=>{if(W.isRangeLoaded(g,d))return;await a(g,d)},m=async()=>{if(!q)return;await a(0,U-1)},o=async()=>{if(!q||V||!B)return!1;let g=W.getCachedCount(),d=W.getTotal(),J0=g,n=Math.min(J0+U-1,d>0?d-1:J0+U-1);if(J0>=d&&d>0)return B=!1,!1;return await a(J0,n),W.getCachedCount()>g},e=async()=>{if(W.clear(),W.setTotal(0),H.clear(),F)F.clear();O.clear(),L=[],V=!1,y=void 0,B=!0,E=0,A=void 0,_()},t=(g,d)=>{if(W.evictDistant(g,d)>0)$()},q0=()=>{W.clear(),H.clear(),y=void 0,A=void 0,L=[],V=!1,_()},Y0=()=>{if(W.reset(),H.clear(),F)F.clear();y=void 0,B=!0,E=0,A=void 0,L=[],V=!1,_()};if(Q&&Q.length>0)z(Q,0,j??Q.length);else if(j!==void 0)W.setTotal(j),_();return{getState:Z,getTotal:p,getCached:i,getIsLoading:w,getHasMore:u,getStorage:P,getPlaceholders:C,getItem:T,getItemById:k,getIndexById:R,isItemLoaded:f,getItemsInRange:r,setTotal:Q0,setItems:z,updateItem:S,removeItem:c,loadRange:a,ensureRange:I,loadInitial:m,loadMore:o,reload:e,evictDistant:t,clear:q0,reset:Y0}};var GJ=(J)=>{let{adapter:q,loading:Q,storage:j,total:K,autoLoad:X=!0}=J,U=Q?.cancelThreshold??JJ,N=Q?.preloadThreshold??QJ,D=Q?.preloadAhead??jJ;return{name:"withAsync",priority:20,methods:["reload","loadVisibleRange"],setup(Y){let{emitter:W}=Y,F=Y.config.reverse,M=Z2({adapter:q,...K!==void 0&&{initialTotal:K},pageSize:j?.chunkSize??z0,...j&&{storage:{...j.chunkSize!==void 0&&{chunkSize:j.chunkSize},...j.maxCachedItems!==void 0&&{maxCachedItems:j.maxCachedItems}}},onStateChange:()=>{if(Y.state.isInitialized){let O=Y.getVirtualTotal();Y.sizeCache.rebuild(O),Y.updateCompressionMode();let _=Y.getCachedCompression();Y.state.viewportState.totalSize=_.virtualSize,Y.state.viewportState.actualSize=_.actualSize,Y.state.viewportState.isCompressed=_.isCompressed,Y.state.viewportState.compressionRatio=_.ratio,Y.updateContentSize(_.virtualSize),Y.renderIfNeeded()}},onItemsLoaded:(O,_,$)=>{if(Y.state.isInitialized)Y.forceRender(),W.emit("load:end",{items:O,total:$,offset:_})}});Y.replaceDataManager(M);let H=null,V=null,A=0,B=()=>{if(V){let O=V;V=null,Y.dataManager.ensureRange(O.start,O.end).catch((_)=>{W.emit("error",{error:_,context:"ensureRange"})})}};Y.afterScroll.push((O,_)=>{if(Y.state.isDestroyed)return;let $=Y.scrollController.getVelocity(),v=Y.scrollController.isTracking()&&$<=U;if(V&&A>U&&$<=U){let i=V;V=null,Y.dataManager.ensureRange(i.start,i.end).catch((w)=>{W.emit("error",{error:w,context:"ensureRange"})})}if(A=$,v&&!Y.dataManager.getIsLoading()&&Y.dataManager.getHasMore()){if(F){if(O<y2)W.emit("load:start",{offset:Y.dataManager.getCached(),limit:z0}),Y.dataManager.loadMore().catch((i)=>{W.emit("error",{error:i,context:"loadMore"})})}else if(Y.state.viewportState.totalSize-O-Y.state.viewportState.containerSize<y2)W.emit("load:start",{offset:Y.dataManager.getCached(),limit:z0}),Y.dataManager.loadMore().catch((w)=>{W.emit("error",{error:w,context:"loadMore"})})}let{renderRange:G}=Y.state.viewportState;if(!H||G.start!==H.start||G.end!==H.end)if(H={start:G.start,end:G.end},v){V=null;let{start:i,end:w}=G,u=Y.getVirtualTotal();if($>N)if(_==="down")w=Math.min(G.end+D,u-1);else i=Math.max(G.start-D,0);Y.dataManager.ensureRange(i,w).catch((Z)=>{W.emit("error",{error:Z,context:"ensureRange"})})}else V={start:G.start,end:G.end}});let y=200,L=null;Y.afterScroll.push((O,_)=>{if(L!==null)clearTimeout(L);L=setTimeout(()=>{L=null,B()},y)}),Y.destroyHandlers.push(()=>{if(L!==null)clearTimeout(L),L=null});let E=()=>{if(Y.state.isDestroyed)return;H=null;let{renderRange:O}=Y.state.viewportState;if(O.end>0)Y.dataManager.ensureRange(O.start,O.end).catch((_)=>{W.emit("error",{error:_,context:"ensureRange"})});B()};if(window.addEventListener("online",E),Y.destroyHandlers.push(()=>{window.removeEventListener("online",E)}),W.on("load:start",()=>{Y.dom.root.setAttribute("aria-busy","true")}),W.on("load:end",()=>{Y.dom.root.removeAttribute("aria-busy")}),Y.methods.set("loadVisibleRange",async()=>{H=null,V=null,Y.forceRender();let{renderRange:O}=Y.state.viewportState;if(O.end>0)W.emit("load:start",{offset:O.start,limit:O.end-O.start+1}),await Y.dataManager.ensureRange(O.start,O.end)}),Y.methods.set("reload",async()=>{H=null,V=null,Y.invalidateRendered(),await Y.dataManager.reload(),W.emit("load:start",{offset:0,limit:z0}),await Y.dataManager.loadInitial(),Y.forceRender();let{renderRange:O}=Y.state.viewportState;if(O.end>0)await Y.dataManager.ensureRange(O.start,O.end)}),X)W.emit("load:start",{offset:0,limit:z0}),Y.dataManager.loadInitial().catch((O)=>{W.emit("error",{error:O,context:"loadInitial"})});else if(K!==void 0)Y.dataManager.setTotal(K)}}};var MJ=()=>{let J=null;return{name:"withPage",priority:5,setup(q){let{dom:Q,state:j,config:K,emitter:X}=q;if(Q.root.style.overflow="visible",Q.root.style.height="auto",K.horizontal)Q.viewport.style.overflowX="visible",Q.viewport.style.overflowY="visible";else Q.viewport.style.overflow="visible";Q.viewport.classList.remove(`${K.classPrefix}-viewport--custom-scrollbar`),q.disableViewportResize(),q.disableWheelHandler(),q.setScrollTarget(window),q.setScrollFns(()=>{let Y=Q.viewport.getBoundingClientRect();if(K.horizontal)return Math.max(0,-Y.left);else return Math.max(0,-Y.top)},(Y)=>{let W=Q.viewport.getBoundingClientRect();if(K.horizontal){let F=W.left+window.scrollX;window.scrollTo(F+Y,window.scrollY)}else{let F=W.top+window.scrollY;window.scrollTo(window.scrollX,F+Y)}}),q.setContainerDimensions({width:()=>window.innerWidth,height:()=>window.innerHeight}),j.viewportState.containerSize=window.innerHeight;let{innerHeight:U,innerWidth:N}=window,D=()=>{let{innerWidth:Y,innerHeight:W}=window,F=K.horizontal?Y:W,M=K.horizontal?N:U;if(Math.abs(F-M)<=1)return;U=W,N=Y,j.viewportState.containerSize=W,X.emit("resize",{width:Y,height:W});for(let H=0;H<q.resizeHandlers.length;H++)q.resizeHandlers[H](Y,W);q.renderIfNeeded()};window.addEventListener("resize",D,{passive:!0}),J=()=>{window.removeEventListener("resize",D)},q.destroyHandlers.push(J)},destroy(){if(J)J(),J=null}}};var $2=(J,q)=>{let Q=0,j=J.length-1;while(Q<j){let K=Q+j+1>>>1;if(J[K].headerLayoutIndex<=q)Q=K;else j=K-1}return Q},OJ=(J,q)=>{let Q=0,j=J.length-1;while(Q<j){let K=Q+j+1>>>1;if(J[K].firstDataIndex<=q)Q=K;else j=K-1}return Q},AJ=(J,q)=>{if(J===0)return[];let Q=[],j=q(0),K=0,X=0;for(let U=1;U<J;U++){let N=q(U);if(N!==j){let D=U-K;Q.push({key:j,groupIndex:Q.length,headerLayoutIndex:X,firstDataIndex:K,count:D}),X=X+1+D,j=N,K=U}}return Q.push({key:j,groupIndex:Q.length,headerLayoutIndex:X,firstDataIndex:K,count:J-K}),Q},x0=(J,q)=>{if(J.length===0||q.length===0)return[];let Q=J.length+q.length,j=Array(Q),K=0;for(let X of q){j[K]={id:`__group_header_${X.groupIndex}`,__groupHeader:!0,groupKey:X.key,groupIndex:X.groupIndex},K++;for(let U=0;U<X.count;U++)j[K]=J[X.firstDataIndex+U],K++}return j},m0=(J,q)=>{let Q=typeof q==="number"?(j)=>q:q;return(j)=>{let K=J.getEntry(j);if(K.type==="header")return J.getHeaderHeight(K.group.groupIndex);return Q(K.dataIndex)}},U2=(J,q)=>{let Q=AJ(J,q.getGroupForIndex),j=J+Q.length,K=q.headerHeight;return{get totalEntries(){return j},get groupCount(){return Q.length},get groups(){return Q},getEntry:(M)=>{if(Q.length===0)return{type:"item",dataIndex:M,group:{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0}};let H=$2(Q,M),V=Q[H];if(M===V.headerLayoutIndex)return{type:"header",group:V};let A=M-V.headerLayoutIndex-1;return{type:"item",dataIndex:V.firstDataIndex+A,group:V}},layoutToDataIndex:(M)=>{if(Q.length===0)return M;let H=$2(Q,M),V=Q[H];if(M===V.headerLayoutIndex)return-1;let A=M-V.headerLayoutIndex-1;return V.firstDataIndex+A},dataToLayoutIndex:(M)=>{if(Q.length===0)return M;let H=OJ(Q,M),V=Q[H],A=M-V.firstDataIndex;return V.headerLayoutIndex+1+A},getGroupAtLayoutIndex:(M)=>{if(Q.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let H=$2(Q,M);return Q[H]},getGroupAtDataIndex:(M)=>{if(Q.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let H=OJ(Q,M);return Q[H]},getHeaderHeight:typeof K==="number"?(M)=>K:(M)=>{let H=Q[M];if(!H)return 0;return K(H.key,M)},rebuild:(M)=>{Q=AJ(M,q.getGroupForIndex),j=M+Q.length}}};var B2=(J,q,Q,j,K,X=!1)=>{let U=document.createElement("div");if(U.className=`${K}-sticky-header`,U.setAttribute("role","presentation"),U.setAttribute("aria-hidden","true"),U.style.position="absolute",U.style.zIndex="5",U.style.pointerEvents="none",U.style.willChange="transform",U.style.overflow="hidden",X)U.style.top="0",U.style.bottom="0",U.style.left="0";else U.style.top="0",U.style.left="0",U.style.right="0";J.insertBefore(U,J.firstChild);let N=-1,D=!1,Y=0,W=(B)=>{if(B===N)return;N=B;let y=q.groups;if(B<0||B>=y.length){U.textContent="";return}let L=y[B],E=j.headerTemplate(L.key,L.groupIndex),O=q.getHeaderHeight(B);if(X)U.style.width=`${O}px`;else U.style.height=`${O}px`;if(typeof E==="string")U.innerHTML=E;else U.replaceChildren(E)},F=(B)=>{let y=q.groups;if(y.length===0){H();return}let L=Q.getOffset(y[0].headerLayoutIndex);if(B<L){H();return}let E=0,O=y.length-1;while(E<O){let G=E+O+1>>>1;if(Q.getOffset(y[G].headerLayoutIndex)<=B)E=G;else O=G-1}let _=E;if(!D)M();W(_);let $=q.getHeaderHeight(_),h=0,v=_+1;if(v<y.length){let p=Q.getOffset(y[v].headerLayoutIndex)-B;if(p<$)h=p-$}if(h!==Y)if(Y=h,h===0)U.style.transform="";else{let G=Math.round(h);U.style.transform=X?`translateX(${G}px)`:`translateY(${G}px)`}},M=()=>{if(D)return;D=!0,U.style.display=""},H=()=>{if(!D)return;D=!1,U.style.display="none",N=-1,Y=0,U.style.transform=""},V=()=>{let B=N;if(N=-1,B>=0)W(B)},A=()=>{U.remove(),N=-1,D=!1};return U.style.display="none",{update:F,refresh:V,show:M,hide:H,destroy:A}};var FJ=(J,q,Q,j,K,X)=>{if(j===0||q===0)return X.start=0,X.end=-1,X;let U=Q.indexAtOffset(J),N=Q.indexAtOffset(J+q);if(N<j-1)N++;return X.start=Math.max(0,U),X.end=Math.min(j-1,Math.max(0,N)),X},EJ=(J,q,Q,j)=>{if(Q===0)return j.start=0,j.end=-1,j;return j.start=Math.max(0,J.start-q),j.end=Math.min(Q-1,J.end+q),j},LJ=(J,q,Q,j,K,X)=>{if(j===0)return 0;let U=Math.max(0,Math.min(J,j-1)),N=q.getOffset(U),D=q.getSize(U),Y=q.getTotalSize(),W=Math.max(0,Y-Q),F;switch(X){case"center":F=N-Q/2+D/2;break;case"end":F=N-Q+D;break;case"start":default:F=N;break}return Math.max(0,Math.min(F,W))},bJ=(J,q,Q)=>{if(Q&&Q.isCompressed)return Q.virtualSize;return q.getTotalSize()},yJ=(J,q)=>{return q.getTotalSize()},TJ=(J,q)=>{return q.getOffset(J)},HJ=(J,q,Q)=>{let j=Math.max(0,q-Q);return Math.max(0,Math.min(J,j))};var C0=(J,q,Q,j,K="start",X,U=LJ)=>{return U(J,q,Q,j,X,K)},$J=(J,q)=>{return J.start===q.start&&J.end===q.end},kJ=(J,q)=>{return J>=q.start&&J<=q.end},PJ=(J)=>{if(J.end<J.start)return 0;return J.end-J.start+1};var RJ=(J,q)=>{let Q=[],j=[];for(let K=J.start;K<=J.end;K++)if(K<q.start||K>q.end)j.push(K);for(let K=q.start;K<=q.end;K++)if(K<J.start||K>J.end)Q.push(K);return{add:Q,remove:j}};Q2();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 q=null,Q=null,j=[],K=[];return{name:"withSections",priority:10,setup(X){let{dom:U,config:N,rawConfig:D}=X,{classPrefix:Y}=N,F=D.item.height;j=D.items?[...D.items]:[];let M=j.length,H={getGroupForIndex:J.getGroupForIndex,headerHeight:J.headerHeight,headerTemplate:J.headerTemplate,sticky:J.sticky??!1};q=U2(M,H),K=x0(j,q.groups);let V=m0(q,F);X.setSizeConfig(V),X.rebuildSizeCache(K.length),X.dataManager.setItems(K,0,K.length);let A=D.item.template,{headerTemplate:B}=J,y=(v,G,p)=>{if(R0(v))return B(v.groupKey,v.groupIndex);return A(v,G,p)},L=X.methods.get("_getGridLayout"),E=X.methods.get("_replaceGridRenderer"),O=X.methods.get("_updateGridLayoutForGroups");if(L&&E){if(O)O((i)=>{let w=K[i];return!!(w&&R0(w))});let{createGridRenderer:v}=(N2(),Q1(CJ)),G=L(),p=v(U.items,y,X.sizeCache,G,Y,X.getContainerWidth(),()=>X.dataManager.getTotal(),N.ariaIdPrefix);E(p)}else X.replaceTemplate(y);if(U.root.classList.add(`${Y}--grouped`),J.sticky!==!1){Q=B2(U.root,q,X.sizeCache,{...H,sticky:H.sticky??!1},Y,N.horizontal);let v=Q;X.afterScroll.push((G,p)=>{v.update(G)}),Q.update(X.scrollController.getScrollTop())}let _=()=>{if(!q)return;q.rebuild(j.length),K=x0(j,q.groups);let v=m0(q,F);if(X.setSizeConfig(v),X.rebuildSizeCache(K.length),X.dataManager.setItems(K,0,K.length),Q)Q.refresh()};X.methods.set("setItems",(v)=>{j=v.slice(),_()}),X.methods.set("appendItems",(v)=>{j.push(...v),_()}),X.methods.set("prependItems",(v)=>{j.unshift(...v),_()}),X.methods.set("removeItem",(v)=>{j=j.filter((G)=>G.id!==v),_()});let{animateScroll:$,cancelScroll:h}=s2(X.scrollController,X.renderIfNeeded);X.methods.set("scrollToIndex",(v,G)=>{let p=q.dataToLayoutIndex(v),{align:i,behavior:w,duration:u}=v0(G),Z=X.dataManager.getTotal(),P=C0(p,X.sizeCache,X.state.viewportState.containerSize,Z,i,X.getCachedCompression());if(w==="smooth")$(X.scrollController.getScrollTop(),P,u);else h(),X.scrollController.scrollTo(P)}),X.methods.set("_getItems",()=>j),X.methods.set("_getTotal",()=>j.length),X.destroyHandlers.push(()=>{if(h(),Q)Q.destroy(),Q=null;U.root.classList.remove(`${Y}--grouped`)})},destroy(){if(Q)Q.destroy(),Q=null}}};var W2=(J)=>{let q=Math.max(1,Math.floor(J.columns)),Q=J.gap??0,j=J.isHeaderFn,K={row:0,col:0},X=(V)=>{if(V<=0)return 0;if(!j)return Math.ceil(V/q);let A=0,B=0,y=0;for(let L=0;L<V;L++)if(j(L)){if(y++,B>0)A++,B=0;A++,B=0}else if(B++,B>=q)A++,B=0;if(B>0)A++;return A},U=(V)=>{return K.row=N(V),K.col=D(V),K},N=(V)=>{if(!j)return Math.floor(V/q);let A=0,B=0;for(let y=0;y<=V;y++)if(j(y)){if(B>0)A++,B=0;if(y===V)return A;A++,B=0}else{if(y===V)return A;if(B++,B>=q)A++,B=0}return console.warn(`⚠️ getRow(${V}) fell through - returning ${A}`),A},D=(V)=>{if(!j)return V%q;if(j(V))return 0;let A=0;for(let B=0;B<=V;B++)if(j(B))A=0;else{if(B===V)return A;if(A++,A>=q)A=0}return A},Y=(V,A,B)=>{if(B<=0)return{start:0,end:-1};if(!j){let _=Math.max(0,V*q),$=Math.min(B-1,(A+1)*q-1);return{start:_,end:$}}let y=-1,L=-1,E=0,O=0;for(let _=0;_<B;_++){if(j(_)){if(O>0)E++,O=0;if(E>=V&&E<=A){if(y===-1)y=_;L=_}E++,O=0}else{if(E>=V&&E<=A){if(y===-1)y=_;L=_}if(O++,O>=q)E++,O=0}if(E>A&&O===0)break}if(y===-1)return{start:0,end:-1};return{start:y,end:L}},W=(V,A,B)=>{if(A<0||A>=q)return-1;let y=V*q+A;if(y<0||y>=B)return-1;return y},F=(V)=>{let A=(q-1)*Q;return Math.max(0,(V-A)/q)};return{get columns(){return q},get gap(){return Q},update:(V)=>{if(V.columns!==void 0)q=Math.max(1,Math.floor(V.columns));if(V.gap!==void 0)Q=V.gap;if(V.isHeaderFn!==void 0)j=V.isHeaderFn},getTotalRows:X,getPosition:U,getRow:N,getCol:D,getItemRange:Y,getItemIndex:W,getColumnWidth:F,getColumnOffset:(V,A)=>{let B=F(A);return V*(B+Q)}}};N2();var E1=new Set,zJ=(J)=>{if(!J.columns||J.columns<1)throw Error("[vlist/builder] withGrid: columns must be a positive integer >= 1");let q=null,Q=null;return{name:"withGrid",priority:10,setup(j){let{dom:K,emitter:X,config:U,rawConfig:N}=j,{classPrefix:D}=U;if(U.reverse)throw Error("[vlist/builder] withGrid cannot be used with reverse: true");let Y=U.horizontal,W=()=>Y?K.viewport.clientHeight:j.getContainerWidth(),F=N.items?.some((T)=>T.__groupHeader===!0),M={columns:J.columns,gap:J.gap??0};if(F)M.isHeaderFn=(T)=>{let k=j.dataManager.getItem(T);return!!(k&&k.__groupHeader===!0)};q=W2(M);let H=q.gap;j.setVirtualTotalFn(()=>{let T=j.dataManager.getTotal();return q.getTotalRows(T)});let V=N.item,A=U.horizontal?V.width:V.height,B={containerWidth:W(),columns:q.columns,gap:q.gap};if(typeof A==="function")j.setSizeConfig((T)=>{let k=B.containerWidth-2,R=(B.columns-1)*B.gap,f=(k-R)/B.columns,r={containerWidth:B.containerWidth,columns:B.columns,gap:B.gap,columnWidth:f,row:q.getRow(T),column:q.getCol(T),totalRows:q.getTotalRows(j.dataManager.getTotal()),totalColumns:B.columns};return A(T,r)+B.gap});else if(H>0)j.setSizeConfig(A+H);j.rebuildSizeCache(),K.root.classList.add(`${D}--grid`);let y=W(),L=N.item.template,E=()=>{Q=d0(K.items,L,j.sizeCache,q,D,y,()=>j.dataManager.getTotal(),U.ariaIdPrefix,U.horizontal),j.replaceRenderer(Q)};E(),j.methods.set("_getGridLayout",()=>q),j.methods.set("_getGridConfig",()=>M),j.methods.set("_replaceGridRenderer",(T)=>{Q=T}),j.methods.set("_updateGridLayoutForGroups",(T)=>{q.update({isHeaderFn:T});let k=j.dataManager.getTotal(),R=0;for(let f=0;f<k;f++)if(q.getCol(f)===0){let r=j.sizeCache.getSize(f);R+=r}if(j.sizeCache.getTotalSize=()=>R,U.horizontal)j.dom.content.style.width=`${R}px`;else j.dom.content.style.height=`${R}px`;E()}),j.methods.set("updateGrid",(T)=>{if(T.columns!==void 0){if(!Number.isInteger(T.columns)||T.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");M.columns=T.columns}if(T.gap!==void 0){if(T.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");M.gap=T.gap}if(q)q.update(M);let k=W();if(B.containerWidth=k,B.columns=M.columns,B.gap=M.gap??0,Q)Q.updateContainerWidth(k);j.rebuildSizeCache(),j.updateContentSize(j.sizeCache.getTotalSize()),j.updateCompressionMode();for(let R=0;R<j.contentSizeHandlers.length;R++)j.contentSizeHandlers[R]();if(Q)Q.clear();j.forceRender()});let O=null,_=null,$=!1,h=()=>{if($)return;$=!0,O=j.methods.get("_getSelectedIds")??null,_=j.methods.get("_getFocusedIndex")??null},v=-1,G=-1,p=!0,i=U.overscan??3,w={start:0,end:0},u={start:0,end:0},Z=()=>{if(j.state.isDestroyed)return;let T=j.scrollController.getScrollTop(),k=j.state.viewportState.containerSize;if(!p&&T===v&&k===G)return;v=T,G=k,p=!1;let R=j.getVirtualTotal();if(R===0||k===0)w.start=0,w.end=0;else{w.start=Math.max(0,j.sizeCache.indexAtOffset(T));let o=j.sizeCache.indexAtOffset(T+k);if(o<R-1)o++;w.end=Math.min(R-1,Math.max(0,o))}u.start=Math.max(0,w.start-i),u.end=Math.min(R-1,w.end+i);let f=j.state.viewportState;f.scrollPosition=T,f.visibleRange.start=w.start,f.visibleRange.end=w.end,f.renderRange.start=u.start,f.renderRange.end=u.end;let r=j.state.lastRenderRange,Q0=f.isCompressed,z=j.dataManager.getTotal(),S=q.getItemRange(u.start,u.end,z),c=j.dataManager.getItemsInRange(S.start,S.end),a=Q0?j.getCompressionContext():void 0;h();let I=O?O():E1,m=_?_():-1;if(Q.render(c,S,I,m,a),r.start!==u.start||r.end!==u.end)r.start=u.start,r.end=u.end,X.emit("range:change",{range:{start:u.start,end:u.end}})},P=()=>{if(j.state.isDestroyed)return;j.state.lastRenderRange.start=-1,j.state.lastRenderRange.end=-1,p=!0,Z()};j.setRenderFns(Z,P);let C=typeof A==="function";if(j.resizeHandlers.push((T,k)=>{let R=Y?k:T;if(B.containerWidth=R,Q)Q.updateContainerWidth(R);if(C){j.rebuildSizeCache(),j.updateContentSize(j.sizeCache.getTotalSize()),j.updateCompressionMode();for(let f=0;f<j.contentSizeHandlers.length;f++)j.contentSizeHandlers[f]();if(Q)Q.clear();j.forceRender()}}),j.methods.set("scrollToIndex",(T,k)=>{let R=Math.floor(T/J.columns),{align:f,behavior:r}=v0(k),Q0=j.dataManager.getState(),z=q.getTotalRows(Q0.total),S=Math.max(0,Math.min(R,z-1)),c=C0(S,j.sizeCache,j.state.viewportState.containerSize,z,f,j.getCachedCompression());if(r==="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(`${D}--grid`)})},destroy(){if(Q)Q.destroy(),Q=null}}};N2();var D2=(J)=>{let q=Math.max(1,Math.floor(J.columns)),Q=J.gap??0,j=J.containerSize,K=0,X=[],U=()=>{let B=(q-1)*Q;K=Math.max(0,(j-B)/q),X=Array(q);let y=K+Q;for(let L=0;L<q;L++)X[L]=L*y};U();let N=[],D=0,Y=[],W=(B)=>{let y=0,L=B[0];for(let E=1;E<B.length;E++){let O=B[E];if(O<L)L=O,y=E}return y},F=(B,y)=>{if(B<=0)return D=0,N=[],[];let L=Array(q).fill(0),E=Array(q);for(let $=0;$<q;$++)E[$]=[];let O=Array(B);for(let $=0;$<B;$++){let h=W(L),v=y($),G=L[h];O[$]={index:$,x:X[h],y:G,lane:h,size:v,crossSize:K},E[h].push($),L[h]=G+v+Q}N=E;let _=0;for(let $=0;$<q;$++){let h=L[$],v=h>0?h-Q:0;if(v>_)_=v}return D=_,O},M=(B)=>{if(B.length===0)return D>0?D:0;if(D>0)return D;let y=Array(q).fill(0);for(let E of B){let O=E.y+E.size,_=y[E.lane];if(O>_)y[E.lane]=O}let L=0;for(let E=0;E<q;E++)if(y[E]>L)L=y[E];return L},H=(B,y,L)=>{if(B.length===0||L<=y)return Y.length=0,Y;if(N.length===0||N.length!==q)return V(B,y,L);Y.length=0;for(let E=0;E<q;E++){let O=N[E],_=O.length;if(_===0)continue;let $=0,h=_;while($<h){let v=$+h>>>1,G=B[O[v]];if(G.y+G.size<=y)$=v+1;else h=v}for(let v=$;v<_;v++){let G=B[O[v]];if(G.y>=L)break;Y.push(G)}}return Y},V=(B,y,L)=>{let E=[];for(let O of B)if(O.y+O.size>y&&O.y<L)E.push(O);return E};return{get columns(){return q},get gap(){return Q},get containerSize(){return j},update:(B)=>{let y=!1;if(B.columns!==void 0){let L=Math.max(1,Math.floor(B.columns));if(L!==q)q=L,y=!0}if(B.gap!==void 0&&B.gap!==Q)Q=B.gap,y=!0;if(B.containerSize!==void 0&&B.containerSize!==j)j=B.containerSize,y=!0;if(y)U()},calculateLayout:F,getTotalSize:M,getVisibleItems:H}};var L1=(J=200)=>{let q=[];return{acquire:()=>{let X=q.pop();if(X)return X;let U=document.createElement("div");return U.setAttribute("role","option"),U},release:(X)=>{if(X.remove(),q.length<J)X.className="",X.textContent="",X.removeAttribute("style"),X.removeAttribute("data-index"),X.removeAttribute("data-id"),X.removeAttribute("data-lane"),q.push(X)},clear:()=>{q.length=0}}};var _2=(J,q,Q,j=!1,K,X)=>{let U=L1(),N=new Map,D=new Set,Y=0,W="",F=-1,M={selected:!1,focused:!1},H=(G,p)=>{return M.selected=G,M.focused=p,M},V=`${Q}-item ${Q}-masonry-item`,A=`${Q}-item--selected`,B=`${Q}-item--focused`,y=(G,p)=>{if(typeof p==="string")G.innerHTML=p;else G.replaceChildren(p)},L=(G,p,i)=>{G.classList.toggle(A,p),G.classList.toggle(B,i)},E=(G,p)=>{if(j)G.style.transform=`translate(${Math.round(p.y)}px, ${Math.round(p.x)}px)`;else G.style.transform=`translate(${Math.round(p.x)}px, ${Math.round(p.y)}px)`},O=(G,p)=>{if(j)G.style.width=`${p.size}px`,G.style.height=`${p.crossSize}px`;else G.style.width=`${p.crossSize}px`,G.style.height=`${p.size}px`},_=(G,p,i,w,u)=>{let Z=U.acquire(),P=H(w,u);if(Z.className=V,Z.dataset.index=String(G),Z.dataset.id=String(p.id),Z.dataset.lane=String(i.lane),Z.ariaSelected=String(w),X)Z.id=`${X}-item-${G}`;if(K){let T=K();if(T!==F)F=T,W=String(T);Z.setAttribute("aria-setsize",W),Z.setAttribute("aria-posinset",String(G+1))}O(Z,i);let C=q(p,G,P);return y(Z,C),L(Z,w,u),E(Z,i),{element:Z,lastItemId:p.id,lastSelected:w,lastFocused:u,lastY:i.y,lastX:i.x,lastSeenFrame:Y}},$=(G,p,i,w)=>{Y++,D.clear();for(let Z=0;Z<p.length;Z++)D.add(p[Z].index);for(let[Z,P]of N)if(D.has(Z))P.lastSeenFrame=Y;else if(Y-P.lastSeenFrame>2)U.release(P.element),N.delete(Z);let u=null;for(let Z=0;Z<p.length;Z++){let P=p[Z],C=P.index,T=G(C);if(!T)continue;let k=i.has(T.id),R=C===w,f=N.get(C);if(f){let r=f.lastItemId!==T.id,Q0=f.lastSelected!==k,z=f.lastFocused!==R,S=f.lastY!==P.y||f.lastX!==P.x;if(r||Q0||z){let c=H(k,R),a=q(T,C,c);y(f.element,a),L(f.element,k,R),f.element.dataset.id=String(T.id),f.element.ariaSelected=String(k),f.lastItemId=T.id,f.lastSelected=k,f.lastFocused=R}if(S)E(f.element,P),f.lastY=P.y,f.lastX=P.x}else{let r=_(C,T,P,k,R);if(!u)u=document.createDocumentFragment();u.appendChild(r.element),N.set(C,r)}}if(u)J.appendChild(u)},h=()=>{for(let{element:G}of N.values())U.release(G);N.clear(),J.innerHTML=""};return{render:$,getElement:(G)=>N.get(G)?.element,clear:h,destroy:()=>{h(),U.clear()}}};var b1=new Set,wJ=(J)=>{if(!J.columns||J.columns<1)throw Error("[vlist/builder] withMasonry: columns must be a positive integer >= 1");let q=null,Q=null,j=[];return{name:"withMasonry",priority:10,setup(K){let{dom:X,emitter:U,config:N,rawConfig:D}=K,Y=N.classPrefix,W=N.horizontal;if(N.reverse)throw Error("[vlist/builder] withMasonry: cannot be combined with reverse mode");X.root.classList.add(`${Y}--masonry`);let F=()=>{return W?X.viewport.clientHeight:X.viewport.clientWidth},M={columns:J.columns,gap:J.gap??0,containerSize:F()};q=D2(M);let H=D.item,V=typeof H.height==="function"?H.height:(T)=>H.height,A=W&&D.item.width?typeof D.item.width==="function"?D.item.width:(T)=>D.item.width:V,B=()=>{let T=K.dataManager.getTotal();j=q.calculateLayout(T,(R)=>{return A(R)});let k=q.getTotalSize(j);if(K.sizeCache.getTotalSize=()=>k,W)X.content.style.width=`${k}px`;else X.content.style.height=`${k}px`},y=D.item.template;Q=_2(X.items,y,Y,W,()=>K.dataManager.getTotal(),N.ariaIdPrefix);let L=null,E=null,O=!1,_=()=>{if(O)return;O=!0,L=K.methods.get("_getSelectedIds")??null,E=K.methods.get("_getFocusedIndex")??null},$=(T)=>K.dataManager.getItem(T),h=-1,v=-1,G=!0,p=(N.overscan??3)*100,i=()=>{if(K.state.isDestroyed)return;_();let T=K.scrollController.getScrollTop(),k=K.state.viewportState.containerSize;if(!G&&T===h&&k===v)return;h=T,v=k,G=!1;let R=Math.max(0,T-p),f=T+k+p,r=q.getVisibleItems(j,R,f),Q0=L?L():b1,z=E?E():-1;if(Q&&r.length>0)Q.render($,r,Q0,z);let S=K.state.viewportState;S.scrollPosition=T;let c=r.length,a=c>0?r[0].index:0,I=c>0?r[c-1].index:0;S.visibleRange.start=a,S.visibleRange.end=I,S.renderRange.start=a,S.renderRange.end=I;let m=K.state.lastRenderRange;if(m.start!==a||m.end!==I)m.start=a,m.end=I,U.emit("range:change",{range:{start:a,end:I}})},w=()=>{K.state.lastRenderRange.start=-1,K.state.lastRenderRange.end=-1,G=!0,i()};K.setRenderFns(i,w);let u=(T,k)=>{let R=W?k:T;if(q&&q.containerSize!==R)q.update({containerSize:R}),B(),w()};K.resizeHandlers.push(u);let Z=()=>{B(),w()},P=K.dataManager,C=(T)=>{if(typeof P[T]!=="function")return;let k=P[T].bind(P);P[T]=(...R)=>{k(...R),Z()}};C("setItems"),C("appendItems"),C("prependItems"),C("updateItem"),C("removeItem"),K.methods.set("scrollToIndex",(T,k,R)=>{let f=j[T];if(!f)return;let r=f.y,Q0=K.state.viewportState.containerSize,z=r;if(k==="center")z=r-Q0/2+f.size/2;else if(k==="end")z=r-Q0+f.size;z=Math.max(0,z),K.scrollController.scrollTo(z,R==="smooth")}),B(),K.destroyHandlers.push(()=>{if(Q)Q.destroy();X.root.classList.remove(`${Y}--masonry`)})}}};var V2=(J)=>({selected:new Set(J??[]),focusedIndex:-1}),c0=(J,q,Q)=>{if(Q==="none")return J;let j=new Set(J.selected);if(Q==="single"){if(j.clear(),q.length>0)j.add(q[0])}else for(let K of q)j.add(K);return{...J,selected:j}},l0=(J,q)=>{let Q=new Set(J.selected);for(let j of q)Q.delete(j);return{...J,selected:Q}},f0=(J,q,Q)=>{if(Q==="none")return J;if(J.selected.has(q))return l0(J,[q]);else return c0(J,[q],Q)},G2=(J,q,Q)=>{if(Q!=="multiple")return J;return{...J,selected:new Set(q.map((j)=>j.id))}},M2=(J)=>({...J,selected:new Set}),k2=(J,q)=>{return J.focusedIndex=q,J},P2=(J,q,Q=!0)=>{if(q===0)return J;let j=J.focusedIndex-1;if(j<0)j=Q?q-1:0;return J.focusedIndex=j,J},R2=(J,q,Q=!0)=>{if(q===0)return J;let j=J.focusedIndex+1;if(j>=q)j=Q?0:q-1;return J.focusedIndex=j,J},C2=(J,q)=>{if(q===0)return J;return J.focusedIndex=0,J},v2=(J,q)=>{if(q===0)return J;return J.focusedIndex=q-1,J};var SJ=(J,q)=>{return J.selected.has(q)},r0=(J)=>{return Array.from(J.selected)},a0=(J,q)=>{let Q=[];for(let j of J.selected){let K=q(j);if(K)Q.push(K)}return Q};var fJ=(J)=>{let q=J?.mode??"single",Q=J?.initial,j=V2(Q),K=null;return{name:"withSelection",priority:50,methods:["select","deselect","toggleSelect","selectAll","clearSelection","getSelected","getSelectedItems"],setup(X){let{dom:U,emitter:N,config:D}=X,{classPrefix:Y,ariaIdPrefix:W}=D;if(q==="none"){X.methods.set("select",()=>{}),X.methods.set("deselect",()=>{}),X.methods.set("toggleSelect",()=>{}),X.methods.set("selectAll",()=>{}),X.methods.set("clearSelection",()=>{}),X.methods.set("getSelected",()=>[]),X.methods.set("getSelectedItems",()=>[]),X.methods.set("setSelectionMode",()=>{});return}let F=new Map,M=()=>{F.clear();let B=X.dataManager.getTotal(),y=X.dataManager.getCached();if(y===0)return;if(y>=B){for(let E=0;E<B;E++){let O=X.dataManager.getItem(E);if(O)F.set(O.id,E)}return}let L=X.dataManager.getStorage();if(L&&typeof L.getLoadedRanges==="function"){let E=L.getLoadedRanges();for(let O of E)for(let _=O.start;_<=O.end;_++){let $=X.dataManager.getItem(_);if($)F.set($.id,_)}}};N.on("load:end",({items:B,offset:y})=>{if(!B||B.length===0)return;if(y!==void 0)for(let L=0;L<B.length;L++){let E=B[L];if(E&&E.id!==void 0)F.set(E.id,y+L)}else M()}),M(),X.methods.set("_getSelectedIds",()=>{return j.selected}),X.methods.set("_getFocusedIndex",()=>{return j.focusedIndex});let{forceRender:H}=X.getRenderFns(),V=()=>{H();let B=(y)=>{let L=F.get(y);if(L===void 0)return;return X.dataManager.getItem(L)};N.emit("selection:change",{selected:r0(j),items:a0(j,B)})};K=document.createElement("div"),K.setAttribute("aria-live","polite"),K.setAttribute("aria-atomic","true"),K.className=`${Y}-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",U.root.appendChild(K);let A=K;N.on("selection:change",({selected:B})=>{let y=B.length;if(y===0)A.textContent="";else if(y===1)A.textContent="1 item selected";else A.textContent=`${y} items selected`}),X.clickHandlers.push((B)=>{if(X.state.isDestroyed)return;let L=B.target.closest("[data-index]");if(!L)return;let E=parseInt(L.dataset.index??"-1",10);if(E<0)return;let O=X.dataManager.getItem(E);if(!O)return;N.emit("item:click",{item:O,index:E,event:B}),j=k2(j,E),U.root.setAttribute("aria-activedescendant",`${W}-item-${E}`),j=f0(j,O.id,q),V()}),X.keydownHandlers.push((B)=>{if(X.state.isDestroyed)return;let y=X.dataManager.getTotal(),L=j.focusedIndex,E=!1,O=!1,_=j;switch(B.key){case"ArrowUp":_=P2(j,y),E=!0,O=!0;break;case"ArrowDown":_=R2(j,y),E=!0,O=!0;break;case"Home":_=C2(j,y),E=!0,O=!0;break;case"End":_=v2(j,y),E=!0,O=!0;break;case" ":case"Enter":if(j.focusedIndex>=0){let $=X.dataManager.getItem(j.focusedIndex);if($)_=f0(j,$.id,q);E=!0}break}if(E){B.preventDefault(),j=_;let $=j.focusedIndex;if($>=0){let h=X.dataManager.getState(),v=C0($,X.sizeCache,X.state.viewportState.containerSize,h.total,"center",X.getCachedCompression());X.scrollController.scrollTo(v),U.root.setAttribute("aria-activedescendant",`${W}-item-${$}`)}else U.root.removeAttribute("aria-activedescendant");if(O){let{selected:h}=j;if(L>=0&&L!==$){let v=X.dataManager.getItem(L);if(v)X.renderer.updateItemClasses(L,h.has(v.id),!1)}if($>=0){let v=X.dataManager.getItem($);if(v)X.renderer.updateItemClasses($,h.has(v.id),!0)}}else V()}}),X.methods.set("select",(...B)=>{j=c0(j,B,q),V()}),X.methods.set("deselect",(...B)=>{j=l0(j,B),V()}),X.methods.set("toggleSelect",(B)=>{j=f0(j,B,q),V()}),X.methods.set("selectAll",()=>{if(q!=="multiple")return;let B=X.getAllLoadedItems();j=G2(j,B,q),M(),V()}),X.methods.set("clearSelection",()=>{j=M2(j),V()}),X.methods.set("getSelected",()=>{return r0(j)}),X.methods.set("getSelectedItems",()=>{return a0(j,(y)=>{let L=F.get(y);if(L===void 0)return;return X.dataManager.getItem(L)})}),X.destroyHandlers.push(()=>{if(A&&A.parentNode)A.remove()})},destroy(){if(K&&K.parentNode)K.remove();K=null}}};var IJ=(J)=>{let q=J?.restore;return{name:"withSnapshots",priority:50,methods:["getScrollSnapshot","restoreScroll"],setup(Q){Q.methods.set("getScrollSnapshot",()=>{let K=Q.scrollController.getScrollTop(),X=Q.getCachedCompression(),U=Q.getVirtualTotal(),N=Q.methods.get("getSelected"),D=N&&N().length>0?N():void 0;if(U===0){let M={index:0,offsetInItem:0,total:0};if(D)M.selectedIds=D;return M}let Y,W;if(X.isCompressed){let H=K/X.virtualSize*U;Y=Math.max(0,Math.min(Math.floor(H),U-1)),W=(H-Y)*Q.sizeCache.getSize(Y)}else Y=Q.sizeCache.indexAtOffset(K),W=K-Q.sizeCache.getOffset(Y);W=Math.max(0,W);let F={index:Y,offsetInItem:W,total:U};if(D)F.selectedIds=D;return F});let j=(K)=>{let{index:X,offsetInItem:U,selectedIds:N}=K,D=Q.getVirtualTotal();if(D===0)return;if(!Number.isFinite(X)||!Number.isFinite(U))return;if(Q.sizeCache.getTotal()!==D){Q.sizeCache.rebuild(D),Q.updateCompressionMode();let B=Q.getCachedCompression();Q.updateContentSize(B.virtualSize)}let W=Q.getCachedCompression(),F=Math.max(0,Math.min(X,D-1)),M;if(W.isCompressed){let B=Q.sizeCache.getSize(F),y=B>0?U/B:0;M=(F+y)/D*W.virtualSize}else M=Q.sizeCache.getOffset(F)+U;let H=Q.state.viewportState.containerSize,V=Math.max(0,W.virtualSize-H);if(M=Math.max(0,Math.min(M,V)),Q.scrollController.scrollTo(M),N&&N.length>0){let B=Q.methods.get("select");if(B)B(...N)}let A=Q.methods.get("loadVisibleRange");if(A)requestAnimationFrame(()=>{A()});else{let B=Q.methods.get("reload");if(B)requestAnimationFrame(()=>{B()})}};if(Q.methods.set("restoreScroll",j),q)queueMicrotask(()=>{j(q)})}}};export{IJ as withSnapshots,fJ as withSelection,vJ as withSections,WJ as withScrollbar,VJ as withScale,MJ as withPage,wJ as withMasonry,zJ as withGrid,GJ as withAsync,e2 as vlist,f0 as toggleSelection,FJ as simpleVisibleRange,c0 as selectItems,G2 as selectAll,$J as rangesEqual,q2 as rafThrottle,UJ as needsScaling,Y2 as mergeRanges,SJ as isSelected,R0 as isSectionHeader,P0 as isPlaceholderItem,kJ as isInRange,a0 as getSelectedItems,r0 as getSelectedIds,F0 as getScaleState,NJ as getScaleInfo,F0 as getScale,PJ as getRangeCount,BJ as getMaxItemsWithoutScaling,H2 as filterPlaceholders,RJ as diffRanges,l0 as deselectItems,B2 as createStickyHeader,X2 as createSparseStorage,T0 as createSizeCache,V2 as createSelectionState,m0 as createSectionedSizeFn,U2 as createSectionLayout,S0 as createScrollbar,_J as createScrollController,K2 as createPlaceholderManager,i0 as createMeasuredSizeCache,_2 as createMasonryRenderer,D2 as createMasonryLayout,d0 as createGridRenderer,W2 as createGridLayout,t0 as createEmitter,Z2 as createAsyncManager,M2 as clearSelection,HJ as clampScrollPosition,bJ as calculateTotalSize,C0 as calculateScrollToIndex,e0 as calculateScaledVisibleRange,J2 as calculateScaledScrollToIndex,KJ as calculateScaledRenderRange,w0 as calculateScaledItemPosition,EJ as calculateRenderRange,g0 as calculateMissingRanges,TJ as calculateItemOffset,ZJ as calculateIndexFromScrollPosition,yJ as calculateActualSize,x0 as buildLayoutItems,k0 as MAX_VIRTUAL_HEIGHT};
|
package/dist/types.d.ts
CHANGED
|
@@ -53,6 +53,21 @@ export interface GridConfig {
|
|
|
53
53
|
*/
|
|
54
54
|
gap?: number;
|
|
55
55
|
}
|
|
56
|
+
/** Masonry configuration for createVList */
|
|
57
|
+
export interface MasonryConfig {
|
|
58
|
+
/**
|
|
59
|
+
* Number of cross-axis divisions (columns in vertical, rows in horizontal).
|
|
60
|
+
* Items flow into the shortest column/row.
|
|
61
|
+
*
|
|
62
|
+
* Must be a positive integer ≥ 1.
|
|
63
|
+
*/
|
|
64
|
+
columns: number;
|
|
65
|
+
/**
|
|
66
|
+
* Gap between masonry items in pixels (default: 0).
|
|
67
|
+
* Applied both horizontally and vertically.
|
|
68
|
+
*/
|
|
69
|
+
gap?: number;
|
|
70
|
+
}
|
|
56
71
|
/** Item-specific configuration */
|
|
57
72
|
/** Context provided to height function in grid mode */
|
|
58
73
|
export interface GridHeightContext {
|
package/dist/vlist.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@keyframes vlist-fade-in{from{opacity:0.6}to{opacity:1}}@keyframes vlist-placeholder-pulse{0%,100%{opacity:0.6}50%{opacity:0.4}}
|
|
1
|
+
@keyframes vlist-fade-in{from{opacity:0.6}to{opacity:1}}@keyframes vlist-placeholder-pulse{0%,100%{opacity:0.6}50%{opacity:0.4}}[data-theme-mode="light"]{--vlist-bg:#ffffff;--vlist-bg-hover:#f9fafb;--vlist-bg-selected:#eff6ff;--vlist-bg-selected-hover:#dbeafe;--vlist-border:#e5e7eb;--vlist-border-selected:#3b82f6;--vlist-text:#111827;--vlist-text-muted:#6b7280;--vlist-focus-ring:#3b82f6;--vlist-scrollbar-thumb:#d1d5db;--vlist-scrollbar-thumb-hover:#9ca3af;--vlist-scrollbar-width:8px;--vlist-scrollbar-track-bg:transparent;--vlist-scrollbar-custom-thumb-bg:rgba(0,0,0,0.3);--vlist-scrollbar-custom-thumb-hover-bg:rgba(0,0,0,0.5);--vlist-scrollbar-custom-thumb-radius:4px;--vlist-item-padding-x:1rem;--vlist-item-padding-y:0.75rem;--vlist-border-radius:0.5rem;--vlist-transition-duration:150ms;--vlist-transition-timing:ease-in-out;--vlist-placeholder-bg:rgba(0,0,0,0.2)}[data-theme-mode="dark"]{--vlist-bg:#111827;--vlist-bg-hover:#1f2937;--vlist-bg-selected:rgba(59,130,246,0.2);--vlist-bg-selected-hover:rgba(59,130,246,0.3);--vlist-border:#374151;--vlist-border-selected:#3b82f6;--vlist-text:#f9fafb;--vlist-text-muted:#9ca3af;--vlist-scrollbar-width:8px;--vlist-scrollbar-thumb:#4b5563;--vlist-scrollbar-thumb-hover:#6b7280;--vlist-scrollbar-custom-thumb-bg:rgba(255,255,255,0.3);--vlist-scrollbar-custom-thumb-hover-bg:rgba(255,255,255,0.5);--vlist-scrollbar-custom-thumb-radius:4px;--vlist-placeholder-bg:rgba(255,255,255,0.3)}.vlist{position:relative;width:100%;height:100%;overflow:hidden;background-color:var(--vlist-bg);color:var(--vlist-text);border:1px solid var(--vlist-border);border-radius:var(--vlist-border-radius);outline:none}.vlist:focus{outline:none}.vlist:focus-visible{outline:2px solid var(--vlist-focus-ring);outline-offset:2px}.vlist-viewport{width:100%;height:100%;overflow:auto;scrollbar-width:thin;scrollbar-color:var(--vlist-scrollbar-thumb) transparent}.vlist-viewport::-webkit-scrollbar{width:6px;height:6px}.vlist-viewport::-webkit-scrollbar-track{background:transparent}.vlist-viewport::-webkit-scrollbar-thumb{background-color:var(--vlist-scrollbar-thumb);border-radius:3px}.vlist-viewport::-webkit-scrollbar-thumb:hover{background-color:var(--vlist-scrollbar-thumb-hover)}.vlist-content{position:relative;width:100%}.vlist-items{position:relative;width:100%;contain:layout style}.vlist-item{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;padding:var(--vlist-item-padding-y) var(--vlist-item-padding-x);border-bottom:1px solid var(--vlist-border);background-color:var(--vlist-bg);cursor:pointer;user-select:none;opacity:1;transition:background-color var(--vlist-transition-duration) var(--vlist-transition-timing),opacity var(--vlist-transition-duration) var(--vlist-transition-timing);contain:content;box-sizing:border-box;will-change:transform}.vlist--scrolling .vlist-item{transition:none}.vlist-item:hover{background-color:var(--vlist-bg-hover)}.vlist-item--selected{background-color:var(--vlist-bg-selected)}.vlist-item--selected:hover{background-color:var(--vlist-bg-selected-hover)}.vlist-item--focused-visible{outline:2px solid var(--vlist-focus-ring);outline-offset:-2px;z-index:1}.vlist-item--replaced{animation:fade-in 0.3s ease-out}.vlist-item--placeholder{opacity:0.6;animation:vlist-placeholder-pulse 2s ease-in-out infinite}.vlist-item--selected.vlist-item--focused{outline-color:var(--vlist-border-selected)}.vlist-scrollbar{position:absolute;top:0;right:0;width:var(--vlist-scrollbar-width);height:100%;background-color:var(--vlist-scrollbar-track-bg);opacity:0;transition:opacity 0.2s ease-out;z-index:10;pointer-events:none}.vlist-scrollbar-hover{position:absolute;top:0;right:0;height:100%;z-index:9;pointer-events:auto}.vlist-scrollbar-hover--horizontal{top:auto;right:auto;bottom:0;left:0;width:100%;height:auto}.vlist-scrollbar--visible{opacity:1;pointer-events:auto}.vlist-scrollbar-thumb{position:absolute;top:0;left:0;right:0;width:100%;background-color:var(--vlist-scrollbar-custom-thumb-bg);border-radius:var(--vlist-scrollbar-custom-thumb-radius);cursor:pointer;transition:background-color 0.15s ease-out}.vlist-scrollbar-thumb:hover{background-color:var(--vlist-scrollbar-custom-thumb-hover-bg)}.vlist-scrollbar--dragging{opacity:1;pointer-events:auto}.vlist-scrollbar--dragging .vlist-scrollbar-thumb{background-color:var(--vlist-scrollbar-custom-thumb-hover-bg)}.vlist--grouped .vlist-item[data-id^="__group_header_"]{cursor:default;background-color:var(--vlist-group-header-bg,#f3f4f6);border-bottom:1px solid var(--vlist-border);z-index:1}.vlist--grouped .vlist-item[data-id^="__group_header_"]:hover{background-color:var(--vlist-group-header-bg,#f3f4f6)}.vlist-sticky-header{background-color:var(--vlist-group-header-bg,#f3f4f6);border-bottom:1px solid var(--vlist-border);contain:content}@media (prefers-color-scheme:dark){:root{--vlist-group-header-bg:#1e2433}}.dark{--vlist-group-header-bg:#1e2433}.vlist--scrolling .vlist-sticky-header{transition:none}.vlist--grid .vlist-items{contain:layout style}.vlist-grid-item{position:absolute;top:0;left:0;display:flex;align-items:center;justify-content:center;padding:var(--vlist-item-padding-y) var(--vlist-item-padding-x);background-color:var(--vlist-bg);cursor:pointer;user-select:none;transition:background-color var(--vlist-transition-duration) var(--vlist-transition-timing);contain:content;box-sizing:border-box;overflow:hidden}.vlist--grid .vlist-item{right:auto;border-bottom:none}.vlist--scrolling .vlist-grid-item{transition:none}.vlist-grid-item:hover{background-color:var(--vlist-bg-hover)}.vlist-grid-item.vlist-item--selected{background-color:var(--vlist-bg-selected)}.vlist-grid-item.vlist-item--selected:hover{background-color:var(--vlist-bg-selected-hover)}.vlist-grid-item.vlist-item--focused-visible{outline:2px solid var(--vlist-focus-ring);outline-offset:-2px;z-index:1}.vlist--masonry .vlist-items{contain:layout style}.vlist-masonry-item{position:absolute;top:0;left:0;display:flex;align-items:center;justify-content:center;padding:var(--vlist-item-padding-y) var(--vlist-item-padding-x);background-color:var(--vlist-bg);cursor:pointer;user-select:none;transition:background-color var(--vlist-transition-duration) var(--vlist-transition-timing);contain:content;box-sizing:border-box;overflow:hidden}.vlist--masonry .vlist-item{right:auto;border-bottom:none}.vlist--scrolling .vlist-masonry-item{transition:none}.vlist-masonry-item:hover{background-color:var(--vlist-bg-hover)}.vlist-masonry-item.vlist-item--selected{background-color:var(--vlist-bg-selected)}.vlist-masonry-item.vlist-item--selected:hover{background-color:var(--vlist-bg-selected-hover)}.vlist-masonry-item.vlist-item--focused-visible{outline:2px solid var(--vlist-focus-ring);outline-offset:-2px;z-index:1}.vlist--horizontal{overflow:hidden}.vlist--horizontal .vlist-viewport{overflow-x:auto;overflow-y:hidden}.vlist--horizontal .vlist-content{height:100%;width:auto}.vlist--horizontal .vlist-items{height:100%;width:auto}.vlist--horizontal .vlist-item{position:absolute;top:0;bottom:0;left:0;right:auto;display:flex;align-items:center;justify-content:center;border-bottom:none;border-right:1px solid var(--vlist-border)}.vlist-scrollbar--horizontal{top:auto;right:auto;bottom:0;left:0;width:100%;height:var(--vlist-scrollbar-width)}.vlist-scrollbar--horizontal .vlist-scrollbar-thumb{top:0;left:0;width:auto;height:100%}.vlist-viewport--custom-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.vlist-viewport--custom-scrollbar::-webkit-scrollbar{display:none}.vlist-viewport--no-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.vlist-viewport--no-scrollbar::-webkit-scrollbar{display:none}
|