@floor/vlist 0.9.8 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,14 +4,14 @@ Lightweight, high-performance virtual list with zero dependencies and dimension-
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/%40floor%2Fvlist.svg)](https://www.npmjs.com/package/@floor/vlist)
6
6
  [![bundle size](https://img.shields.io/bundlephobia/minzip/@floor/vlist)](https://bundlephobia.com/package/@floor/vlist)
7
- [![tests](https://img.shields.io/badge/tests-1181%20passing-brightgreen)](https://github.com/floor/vlist)
7
+ [![tests](https://img.shields.io/badge/tests-2268%20passing-brightgreen)](https://github.com/floor/vlist)
8
8
  [![license](https://img.shields.io/npm/l/vlist.svg)](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 plugins with perfect tree-shaking
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
- ## v0.9.0 Highlights
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
- | Plugin | Size | Description |
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` (1739 tests) and `bun run build` before submitting
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
- ### v0.9.0 (January 2025)
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
 
@@ -12,5 +12,18 @@
12
12
  import type { VListItem } from "../types";
13
13
  import type { BuilderConfig, VListBuilder } from "./types";
14
14
  export type { CompressionState } from "../rendering/viewport";
15
+ export interface TrackedItem {
16
+ element: HTMLElement;
17
+ /** Item id at last render (to detect data changes / placeholder replacement) */
18
+ lastItemId: string | number;
19
+ /** Selected state at last render */
20
+ lastSelected: boolean;
21
+ /** Focused state at last render */
22
+ lastFocused: boolean;
23
+ /** Computed offset at last render (to detect position changes) */
24
+ lastOffset: number;
25
+ /** Render frame when this item was last in the render range */
26
+ lastSeenFrame: number;
27
+ }
15
28
  export declare const vlist: <T extends VListItem = VListItem>(config: BuilderConfig<T>) => VListBuilder<T>;
16
29
  //# sourceMappingURL=core.d.ts.map
@@ -17,6 +17,7 @@ import type { SizeCache } from "../rendering/sizes";
17
17
  import type { Emitter } from "../events/emitter";
18
18
  import type { DOMStructure } from "./dom";
19
19
  import type { createElementPool } from "./pool";
20
+ import type { TrackedItem } from "./core";
20
21
  import type { BuilderConfig, BuilderContext, BuilderState, ResolvedBuilderConfig } from "./types";
21
22
  /**
22
23
  * Mutable refs object shared between core.ts materialize() and context factories.
@@ -123,7 +124,7 @@ export interface MDeps<T extends VListItem = VListItem> {
123
124
  readonly emitter: Emitter<VListEvents<T>>;
124
125
  readonly resolvedConfig: ResolvedBuilderConfig;
125
126
  readonly rawConfig: BuilderConfig<T>;
126
- readonly rendered: Map<number, HTMLElement>;
127
+ readonly rendered: Map<number, TrackedItem>;
127
128
  readonly pool: ReturnType<typeof createElementPool>;
128
129
  readonly itemState: ItemState;
129
130
  readonly sharedState: BuilderState;
@@ -1,6 +1,9 @@
1
1
  /**
2
2
  * vlist/builder — Scroll Utilities
3
- * Easing function and scroll-argument resolution for smooth scrolling.
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
@@ -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 = 15;
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,
@@ -11,7 +11,7 @@
11
11
  import type { VListItem } from "../../types";
12
12
  /** Placeholder configuration */
13
13
  export interface PlaceholderConfig {
14
- /** Character used for masking text (default: '') */
14
+ /** Character used for masking text (default: 'x') */
15
15
  maskCharacter?: string;
16
16
  /** Maximum items to sample for length profiling (default: 20) */
17
17
  maxSampleSize?: number;
@@ -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 — passes selection state to render pipeline
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=(Z)=>{J=Z,Q=new Float64Array(Z+1),Q[0]=0;for(let N=0;N<Z;N++)Q[N+1]=Q[N]+j(N)};K(q);let X=(Z)=>{if(J===0)return 0;if(Z<=0)return 0;if(Z>=Q[J])return J-1;let N=0,W=J-1;while(N<W){let Y=N+W+1>>>1;if(Q[Y]<=Z)N=Y;else W=Y-1}return N};return{getOffset:(Z)=>{if(Z<=0)return 0;if(Z>=J)return Q[J];return Q[Z]},getSize:(Z)=>j(Z),indexAtOffset:(Z)=>X(Z),getTotalSize:()=>Q[J]??0,getTotal:()=>J,rebuild:(Z)=>K(Z),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,Z=q;while(Z<Q&&X<J)X+=j.getSize(Z),K++,Z++;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 Z=j.getSize(X);if(K+Z>q)break;K+=Z,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),M=J.indexAtOffset(j+q);if(M<Q-1)M++;return X.start=Math.max(0,D),X.end=Math.min(Q-1,Math.max(0,M)),X}let{virtualSize:Z}=K,W=j/Z*Q,Y=Math.floor(W),U=u0(J,Math.max(0,Y),q,Q),A=Math.ceil(W)+U,O=Z-q-j;if(O<=q&&O>=-1){let D=r0(J,q,Q),M=Math.max(0,Q-D),_=Math.max(0,Math.min(1,1-O/q));Y=Math.floor(Y+(M-Y)*_),A=O<=1?Q-1:Math.min(Q-1,Y+U)}return X.start=Math.max(0,Y),X.end=Math.min(Q-1,Math.max(0,A)),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,Z)=>{if(!X.isCompressed||Q===0)return J.getOffset(j);let{virtualSize:N}=X,W=N-K,Y=W-q;if(Y<=K&&Y>=-1){if(q>=W-1){let b=J.getTotalSize()-J.getOffset(j);return K-b}let O=r0(J,K,Q),D=Math.max(0,Q-O),_=q/N*Q,v=Math.max(0,Math.min(1,1-Y/K)),k=J.getOffset(j)-J.getOffset(D),T=J.getOffset(j)-M2(J,_,Q);return T+(k-T)*v}let U=q/N,A=J.getTotalSize(),V=U*A;return J.getOffset(j)-V},t0=(j,q,J,Q,K,X="start")=>{if(Q===0)return 0;let Z;if(K.isCompressed){if(X==="end"&&j===Q-1)return Math.max(0,K.virtualSize-J);Z=j/Q*K.virtualSize}else Z=q.getOffset(j);let N=q.getSize(j);switch(X){case"center":Z-=(J-N)/2;break;case"end":Z-=J-N;break}let W=K.virtualSize-J;return Math.max(0,Math.min(Z,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 Z=document.createElement("div");return Z.setAttribute("role","option"),Z},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,Z,N,W=!1)=>{let Y=GJ(),U=new Map,A=X,V=!1,O=null,D=0,M="",_=(H)=>{if(O&&D===H)return O;return O=A0(H,J),D=H,O},v={selected:!1,focused:!1},k=(H,w)=>{return v.selected=H,v.focused=w,v},T=`${K}-item ${K}-grid-item`,b=`${K}-item--selected`,G=`${K}-item--focused`,P=(H,w)=>{if(typeof w==="string")H.innerHTML=w;else H.replaceChildren(w)},L=(H,w,c)=>{H.classList.toggle(b,w),H.classList.toggle(G,c)},y=(H,w)=>{let c=Q.getRow(H);if(w){let t=w.totalItems,s=_(t);if(s.isCompressed)return v0(c,w.scrollPosition,J,t,w.containerSize,s,w.rangeStart)}return J.getOffset(c)},E=(H,w,c)=>{let t=H.dataset.id?.startsWith("__group_header"),s=t?0:Q.getCol(w),o=t?0:Q.getColumnOffset(s,A),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=y(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)`},$=(H,w)=>{let c=H.dataset.id?.startsWith("__group_header"),t=c?A:Q.getColumnWidth(A),s;if(V||c)s=J.getSize(w)-Q.gap;else{let o=Q.getRow(w);s=J.getSize(o)-Q.gap}if(W)H.style.width=`${s}px`,H.style.height=`${t}px`;else H.style.width=`${t}px`,H.style.height=`${s}px`},r=(H,w,c,t,s)=>{let o=Y.acquire(),Q0=k(c,t);if(o.className=T,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),N)o.id=`${N}-item-${H}`;if(Z)M=String(Z()),o.setAttribute("aria-setsize",M),o.setAttribute("aria-posinset",String(H+1));$(o,H);let l=q(w,H,Q0);return P(o,l),L(o,c,t),E(o,H,s),o},z=(H,w,c,t,s)=>{if(w.start===0&&H.length>0)V=R0(H[0]);for(let[u,n]of U)if(u<w.start||u>w.end)n.element.remove(),Y.release(n.element),U.delete(u);let o=!1;if(Z){let u=String(Z());o=u!==M,M=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=U.get(u);if(X0){let S=X0.element.dataset.id,d=String(K0.id);if(S!==d){let a=k(i,B0),Z0=q(K0,u,a);P(X0.element,Z0),X0.element.dataset.id=d,X0.element.dataset.row=String(Q.getRow(u)),X0.element.dataset.col=String(Q.getCol(u)),$(X0.element,u)}if(L(X0.element,i,B0),X0.element.ariaSelected=String(i),E(X0.element,u,s),o)X0.element.setAttribute("aria-setsize",M)}else{let S=r(u,K0,i,B0,s);Q0.appendChild(S),l.push({index:u,element:S})}}if(l.length>0){j.appendChild(Q0);for(let{index:u,element:n}of l)U.set(u,{index:u,element:n})}},m=(H)=>{for(let[w,c]of U)E(c.element,w,H)},B=(H,w,c,t)=>{let s=U.get(H);if(s){let o=k(c,t),Q0=q(w,H,o);P(s.element,Q0),L(s.element,c,t),s.element.dataset.id=String(w.id),s.element.ariaSelected=String(c),$(s.element,H)}},R=(H,w,c)=>{let t=U.get(H);if(t)L(t.element,w,c)},C=(H)=>{return U.get(H)?.element},h=(H)=>{if(Math.abs(H-A)<1)return;A=H;for(let[w,c]of U)$(c.element,w),E(c.element,w)},I=()=>{for(let[,H]of U)H.element.remove(),Y.release(H.element);U.clear()};return{render:z,updatePositions:m,updateItem:B,updateItemClasses:R,getElement:C,updateContainerWidth:h,clear:I,destroy:()=>{I(),Y.clear()}}};var B2=w2(()=>{e0()});var f2=2,S2=(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,Z=j.samples[X],N=q-Z.position,W=J-Z.time;j.velocity=W>0?Math.abs(N)/W:0}return j.lastPosition=q,j.lastTime=J,j};var n0=(j,q)=>{let J=new Map,Q=(X)=>{let Z=J.get(X);return Z!==void 0?Z: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 Z of J.keys())if(Z>=X)J.delete(Z)}K=y0(Q,X)},isVariable(){return!0},setMeasuredSize(X,Z){J.set(X,Z)},isMeasured(X){return J.has(X)},getEstimatedSize(){return j},measuredCount(){return J.size}}};var o0=()=>{let j={},q=(N,W)=>{if(!j[N])j[N]=new Set;return j[N].add(W),()=>J(N,W)},J=(N,W)=>{j[N]?.delete(W)};return{on:q,off:J,emit:(N,W)=>{j[N]?.forEach((Y)=>{try{Y(W)}catch(U){console.error(`[vlist] Error in event handler for "${String(N)}":`,U)}})},once:(N,W)=>{let Y=(U)=>{J(N,Y),W(U)};return q(N,Y)},clear:(N)=>{if(N)delete j[N];else for(let W in j)delete j[W]},listenerCount:(N)=>{return j[N]?.size??0}}};var I2=(j)=>{if(typeof j==="string"){let q=document.querySelector(j);if(!q)throw Error(`[vlist/builder] Container not found: ${j}`);return q}return j},p2=(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 Z=document.createElement("div");if(Z.className=`${q}-content`,Z.style.position="relative",Q)Z.style.height="100%";else Z.style.width="100%";let N=document.createElement("div");if(N.className=`${q}-items`,N.style.position="relative",Q)N.style.height="100%";else N.style.width="100%";return Z.appendChild(N),X.appendChild(Z),K.appendChild(X),j.appendChild(K),{root:K,viewport:X,content:Z,items:N}};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),Z=u0(J,X,q,Q),N=X+Z;K.start=Math.max(0,X),K.end=Math.min(Q-1,Math.max(0,N))},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)),Z=q.getOffset(X),N=q.getSize(X),W=Math.max(0,q.getTotalSize()-J),Y;switch(K){case"center":Y=Z-(J-N)/2;break;case"end":Y=Z-J+N;break;default:Y=Z}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:Z,pool:N,sharedState:W,isHorizontal:Y,classPrefix:U,contentSizeHandlers:A,afterScroll:V,clickHandlers:O,keydownHandlers:D,resizeHandlers:M,destroyHandlers:_,methods:v,onScrollFrame:k,resizeObserver:T,renderRange:b}=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:(G,P,L,y,E)=>{j.ss=L,j.fi=y,j.ffn()},updateItemClasses:(G,P,L)=>{let y=Z.get(G);if(!y)return;y.classList.toggle(`${U}-item--selected`,P),y.classList.toggle(`${U}-item--focused`,L),y.ariaSelected=P?"true":"false"},updatePositions:()=>{},updateItem:()=>{},getElement:(G)=>Z.get(G)??null,clear:()=>{},destroy:()=>{}}},set renderer(G){},get dataManager(){return j.dm},set dataManager(G){j.dm=G},get scrollController(){return j.sc},set scrollController(G){j.sc=G},state:W,getContainerWidth(){return j.cw},afterScroll:V,clickHandlers:O,keydownHandlers:D,resizeHandlers:M,contentSizeHandlers:A,destroyHandlers:_,methods:v,replaceTemplate(G){j.at=G},replaceRenderer(G){},replaceDataManager(G){j.dm=G},replaceScrollController(G){j.sc=G},getItemsForRange(G){let{dm:P,it:L}=j,y=[];for(let E=G.start;E<=G.end;E++){let $=P?P.getItem(E):L[E];if($)y.push($)}return y},getAllLoadedItems(){let G=j.dm;if(G){let P=G.getTotal(),L=[];for(let y=0;y<P;y++){let E=G.getItem(y);if(E)L.push(E)}return L}return[...j.it]},getVirtualTotal(){return j.vtf()},getCachedCompression(){let G=j.hc;return{isCompressed:!1,actualSize:G.getTotalSize(),virtualSize:G.getTotalSize(),ratio:1}},getCompressionContext(){return{scrollPosition:j.ls,totalItems:j.vtf(),containerSize:j.ch,rangeStart:b.start}},renderIfNeeded(){j.rfn()},forceRender(){j.ffn()},invalidateRendered(){for(let[,G]of Z)G.remove(),N.release(G);Z.clear()},getRenderFns(){return{renderIfNeeded:j.rfn,forceRender:j.ffn}},setRenderFns(G,P){j.rfn=G,j.ffn=P},setVirtualTotalFn(G){j.vtf=G},rebuildSizeCache(G){j.hc.rebuild(G??j.vtf())},setSizeConfig(G){j.hc=y0(G,j.vtf())},updateContentSize(G){let P=`${G}px`;if(Y)J.content.style.width=P;else J.content.style.height=P},updateCompressionMode(){},setVisibleRangeFn(G){j.gvr=G},setScrollToPosFn(G){j.gsp=G},setPositionElementFn(G){j.pef=G},setScrollFns(G,P){j.sgt=G,j.sst=(L)=>{P(L),k()}},setScrollTarget(G){j.st.removeEventListener("scroll",k),j.st=G,j.st.addEventListener("scroll",k,{passive:!0})},getScrollTarget(){return j.st},setContainerDimensions(G){j.gcw=G.width,j.gch=G.height,j.cw=G.width(),j.ch=G.height(),W.viewportState.containerSize=Y?j.cw:j.ch},disableViewportResize(){if(j.vre)j.vre=!1,T.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:Z,updateContentSize:N}=q,W=()=>{j.hc.rebuild(j.vtf()),N(),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,U)=>{let A=j.it,V=[],O=Math.max(0,Y),D=Math.min(U,A.length-1);for(let M=O;M<=D;M++)V.push(A[M]);return V},setTotal:(Y)=>{},setItems:(Y,U=0,A)=>{let V=j.it;if(U===0&&(A!==void 0||V.length===0))j.it=Y;else{let O=U+Y.length;if(V.length<O)V.length=O;for(let D=0;D<Y.length;D++)V[U+D]=Y[D]}if(j.ii)W()},updateItem:(Y,U)=>{let A=j.it;if(Y<0||Y>=A.length)return!1;let V=A[Y];if(!V)return!1;A[Y]={...V,...U};let O=Q.get(Y);if(O)Z(O,j.at(A[Y],Y,K)),O.dataset.id=String(A[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),N(),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 Z=new Map,N=!1,W={use(Y){if(N)throw Error("[vlist/builder] Cannot call .use() after .build()");return Z.set(Y.name,Y),W},build(){if(N)throw Error("[vlist/builder] .build() can only be called once");return N=!0,JJ(j,Z,q,K,X??null)}};return W};function JJ(j,q,J,Q,K){let{item:X,items:Z,overscan:N=tj,classPrefix:W=ej,ariaLabel:Y,reverse:U=!1,scroll:A}=j,V=A,O=V?.wheel??!0,D=V?.wrap??!1,M=U,_=`${W}-${jJ++}`,v=Q??K,k=Q==null&&K!=null,T=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||navigator.maxTouchPoints&&navigator.maxTouchPoints>2,b=J?typeof X.height==="number"?X.height:void 0:typeof X.width==="number"?X.width:void 0,G={overscan:N,classPrefix:W,reverse:M,wrap:D,horizontal:J,ariaIdPrefix:_},P=Array.from(q.values()).sort((F,f)=>(F.priority??50)-(f.priority??50)),L=new Set(P.map((F)=>F.name));for(let F of P)if(F.conflicts){for(let f of F.conflicts)if(L.has(f))throw Error(`[vlist/builder] ${F.name} and ${f} cannot be combined`)}if(M){if(L.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with reverse: true")}let y=I2(j.container),E=p2(y,W,Y,J);if(V?.wheel===!1)if(J)E.viewport.style.overflowX="hidden";else E.viewport.style.overflow="hidden";if(V?.scrollbar==="none")E.viewport.classList.add(`${W}-viewport--no-scrollbar`);let $=o0(),r=Z||[],z=k?n0(K,r.length):y0(v,r.length),m=h2(),B={it:r,hc:z,ch:E.viewport.clientHeight,cw:E.viewport.clientWidth,id:!1,ii:!1,ls:0,vt:S2(0),ss:new Set,fi:-1,la:"",dm:null,sc:null,vtf:null,sgt:J?()=>E.viewport.scrollLeft:()=>E.viewport.scrollTop,sst:J?(F)=>{E.viewport.scrollLeft=F}:(F)=>{E.viewport.scrollTop=F},sab:(F=2)=>{let f=B.hc.getTotalSize();return B.ls+B.ch>=f-F},sic:!1,rfn:null,ffn:null,gvr:(F,f,g,x,j0)=>{u2(F,f,g,x,j0)},gsp:(F,f,g,x,j0)=>{return x2(F,f,g,x,j0)},pef:null,at:X.template,vre:!0,st:E.viewport,wh:null,gcw:()=>B.cw,gch:()=>B.ch};B.vtf=()=>B.dm?B.dm.getTotal():B.it.length;let R=null,C=null,h=!1,I={start:0,end:0},p={start:0,end:0},H={start:-1,end:-1},w={viewportState:{scrollPosition:0,containerSize:J?B.cw:B.ch,totalSize:B.hc.getTotalSize(),actualSize:B.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=k?new WeakMap:null,s=k?z:null,o=null,Q0=0,l=!1,u=()=>{if(!k)return;if(l){let F=B.sgt(),f=J?E.viewport.scrollWidth-E.viewport.clientWidth:E.viewport.scrollHeight-E.viewport.clientHeight,g=f>0&&F>=f-2;if(M0(),l=!1,g){let x=Math.max(0,B.hc.getTotalSize()-(J?B.cw:B.ch));if(x>F)B.sst(x),B.ls=x,B.rfn()}}};if(k&&s&&t)o=new ResizeObserver((F)=>{if(B.id)return;let f=!1,g=I.start;for(let x of F){let j0=t.get(x.target);if(j0===void 0)continue;let q0=J?x.borderBoxSize[0].inlineSize:x.borderBoxSize[0].blockSize;if(!s.isMeasured(j0)){let U0=s.getSize(j0);if(s.setMeasuredSize(j0,q0),f=!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(!f)return;if(s.rebuild(B.vtf()),B.hc=s,Q0!==0){let x=B.sgt();B.sst(x+Q0),B.ls=x+Q0,Q0=0}if(h)l=!0;else{let x=B.sgt(),j0=J?E.viewport.scrollWidth-E.viewport.clientWidth:E.viewport.scrollHeight-E.viewport.clientHeight,q0=j0>0&&x>=j0-2;if(M0(),l=!1,q0){let U0=Math.max(0,B.hc.getTotalSize()-(J?B.cw:B.ch));if(U0>x)B.sst(U0),B.ls=U0}}H.start=-1,H.end=-1,B.rfn()});let n={selected:!1,focused:!1},K0=`${W}-item`,i=[],B0=[],X0=[],S=[],d=[],e=[],a=new Map,Z0=(F,f)=>{if(typeof f==="string")F.innerHTML=f;else F.replaceChildren(f)},W0=(F,f)=>{let g=Math.round(B.hc.getOffset(f));if(J)F.style.transform=`translateX(${g}px)`;else F.style.transform=`translateY(${g}px)`};B.pef=W0;let E0=(F,f)=>{let g=m.acquire();g.className=K0;let x=!k||s&&s.isMeasured(F);if(J){if(x)g.style.width=`${B.hc.getSize(F)}px`;else g.style.width="";if(b!=null)g.style.height=`${b}px`}else if(x)g.style.height=`${B.hc.getSize(F)}px`;else g.style.height="";if(g.dataset.index=String(F),g.dataset.id=String(f.id),g.ariaSelected="false",g.id=`${_}-item-${F}`,B.la=String(B.vtf()),g.setAttribute("aria-setsize",B.la),g.setAttribute("aria-posinset",String(F+1)),String(f.id).startsWith("__placeholder_"))g.classList.add(`${W}-item--placeholder`);return Z0(g,B.at(f,F,n)),B.pef(g,F),g},M0=()=>{let F=`${B.hc.getTotalSize()}px`;if(J)E.content.style.width=F;else E.content.style.height=F},G0=()=>{if(B.id)return;let F=B.vtf(),f=J?B.cw:B.ch;if(B.gvr(B.ls,f,B.hc,F,I),g2(I,N,F,p),p.start===H.start&&p.end===H.end){if(B.sic)for(let[J0,N0]of c)B.pef(N0,J0);return}let g=String(F),x=g!==B.la;B.la=g;for(let[J0,N0]of c)if(J0<p.start||J0>p.end)N0.remove(),m.release(N0),c.delete(J0);let j0=document.createDocumentFragment(),q0=[],U0=[];for(let J0=p.start;J0<=p.end;J0++){let N0=B.dm?B.dm.getItem(J0):B.it[J0];if(!N0)continue;let V0=c.get(J0);if(V0){let b0=V0.dataset.id,p0=String(N0.id);if(b0!==p0){let cj=b0?.startsWith("__placeholder_"),C2=p0.startsWith("__placeholder_");Z0(V0,B.at(N0,J0,n)),V0.dataset.id=p0;let z2=!k||s&&s.isMeasured(J0);if(J)V0.style.width=z2?`${B.hc.getSize(J0)}px`:"";else V0.style.height=z2?`${B.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)}B.pef(V0,J0);let s0=B.ss.has(N0.id),dj=J0===B.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",B.la)}else{let b0=E0(J0,N0);U0.push({index:J0,element:b0});let p0=B.ss.has(N0.id),s0=J0===B.fi;if(p0)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){E.items.appendChild(j0);for(let{index:J0,element:N0}of q0)c.set(J0,N0)}if(k&&o&&s&&t){for(let{index:J0,element:N0}of U0)if(!s.isMeasured(J0))t.set(N0,J0),o.observe(N0)}H.start=p.start,H.end=p.end,w.lastRenderRange.start=p.start,w.lastRenderRange.end=p.end,w.viewportState.scrollPosition=B.ls,w.viewportState.visibleRange.start=I.start,w.viewportState.visibleRange.end=I.end,w.viewportState.renderRange.start=p.start,w.viewportState.renderRange.end=p.end,$.emit("range:change",{range:{start:p.start,end:p.end}})},H0=()=>{H.start=-1,H.end=-1,B.rfn()};B.rfn=G0,B.ffn=H0;let O0=()=>{if(B.id)return;let F=B.sgt(),f=F>=B.ls?"down":"up";if(B.vt=V2(B.vt,F),!E.root.classList.contains(`${W}--scrolling`))E.root.classList.add(`${W}--scrolling`);h=!0,B.ls=F,B.rfn(),$.emit("scroll",{scrollPosition:F,direction:f}),$.emit("velocity:change",{velocity:B.vt.velocity,reliable:B.vt.sampleCount>=f2});for(let g=0;g<i.length;g++)i[g](F,f);if(C)clearTimeout(C);C=setTimeout(()=>{E.root.classList.remove(`${W}--scrolling`),h=!1,B.vt.velocity=0,B.vt.sampleCount=0,$.emit("velocity:change",{velocity:0,reliable:!1}),u()},V?.idleTimeout??s2)},Y0=null;if(B.st.addEventListener("scroll",O0,{passive:!0}),O&&!J&&!T)Y0=(F)=>{F.preventDefault();let f=B.sgt(),g=F.deltaY,x=Math.max(0,Math.min(f+g,B.hc.getTotalSize()-B.ch));B.sst(x),B.ls=x,B.vt=V2(B.vt,x),B.rfn();let j0=x>=f?"down":"up";if($.emit("scroll",{scrollPosition:x,direction:j0}),!E.root.classList.contains(`${W}--scrolling`))E.root.classList.add(`${W}--scrolling`);if(h=!0,C)clearTimeout(C);C=setTimeout(()=>{E.root.classList.remove(`${W}--scrolling`),h=!1,B.vt.velocity=0,B.vt.sampleCount=0,$.emit("velocity:change",{velocity:0,reliable:!1}),u()},V?.idleTimeout??s2)},B.wh=Y0,E.viewport.addEventListener("wheel",Y0,{passive:!1});else if(J&&O)Y0=(F)=>{if(F.deltaX)return;F.preventDefault(),E.viewport.scrollLeft+=F.deltaY},B.wh=Y0,E.viewport.addEventListener("wheel",Y0,{passive:!1});let F0=(F)=>{let g=F.target.closest("[data-index]");if(g){let x=parseInt(g.dataset.index??"-1",10);if(x>=0){let j0=B.dm?.getItem(x)??B.it[x];if(j0){if(j0.__groupHeader)return;$.emit("item:click",{item:j0,index:x,event:F})}}}for(let x=0;x<B0.length;x++)B0[x](F)},D0=(F)=>{let g=F.target.closest("[data-index]");if(g){let x=parseInt(g.dataset.index??"-1",10);if(x>=0){let j0=B.dm?.getItem(x)??B.it[x];if(j0){if(j0.__groupHeader)return;$.emit("item:dblclick",{item:j0,index:x,event:F})}}}},L0=(F)=>{for(let f=0;f<X0.length;f++)X0[f](F)};E.items.addEventListener("click",F0),E.items.addEventListener("dblclick",D0),E.root.addEventListener("keydown",L0);let P0=new ResizeObserver((F)=>{if(B.id)return;for(let f of F){let g=f.contentRect.height,x=f.contentRect.width,j0=J?x:g,q0=J?B.cw:B.ch;if(B.cw=x,B.ch=g,Math.abs(j0-q0)>1){if(w.viewportState.containerSize=j0,B.ii)M0(),B.rfn(),$.emit("resize",{height:g,width:x})}if(B.ii)for(let U0=0;U0<S.length;U0++)S[U0](x,g)}});if(B.vre)P0.observe(E.viewport);let D2={dom:E,emitter:$,resolvedConfig:G,rawConfig:j,rendered:c,pool:m,itemState:n,sharedState:w,renderRange:p,isHorizontal:J,classPrefix:W,contentSizeHandlers:d,afterScroll:i,clickHandlers:B0,keydownHandlers:X0,resizeHandlers:S,destroyHandlers:e,methods:a,onScrollFrame:O0,resizeObserver:P0,applyTemplate:Z0,updateContentSize:M0},_0=c2(B,D2);B.dm=l2(B,D2,_0),B.sc=a2(B,D2);let k2=new Map;for(let F of P)if(F.methods)for(let f of F.methods){let g=k2.get(f);if(g)throw Error(`[vlist/builder] Method "${f}" is registered by both "${g}" and "${F.name}"`);k2.set(f,F.name)}for(let F of P)F.setup(_0);if(B.ii=!0,_0.state.isInitialized=!0,M0(),B.rfn(),M&&B.it.length>0){let F=B.gsp(B.it.length-1,B.hc,B.ch,B.it.length,"end");B.sst(F),B.ls=F,B.rfn()}let zj=(F)=>{_0.dataManager.setItems(F,0,F.length)},vj=M?(F)=>{let f=B.sab(2),g=B.it.length;if(_0.dataManager.setItems(F,g),f&&B.it.length>0){let x=B.gsp(B.it.length-1,B.hc,B.ch,B.it.length,"end");B.sst(x),B.ls=x,B.rfn()}}:(F)=>{let f=B.it.length;_0.dataManager.setItems(F,f)},wj=M?(F)=>{let f=B.sgt(),g=B.hc.getTotalSize(),x=[...B.it];_0.dataManager.clear(),_0.dataManager.setItems([...F,...x],0);let q0=B.hc.getTotalSize()-g;if(q0>0)B.sst(f+q0),B.ls=f+q0}:(F)=>{let f=[...B.it];_0.dataManager.clear(),_0.dataManager.setItems([...F,...f],0)},fj=(F,f)=>{_0.dataManager.updateItem(F,f)},Sj=(F)=>{_0.dataManager.removeItem(F)},Ij=async()=>{if(_0.dataManager.reload)await _0.dataManager.reload()},a0=()=>{if(R!==null)cancelAnimationFrame(R),R=null},pj=(F,f,g)=>{if(a0(),Math.abs(f-F)<1){B.sst(f),B.ls=f,B.rfn();return}let x=performance.now(),j0=(q0)=>{let U0=q0-x,J0=Math.min(U0/g,1),N0=F+(f-F)*m2(J0);if(B.sst(N0),B.ls=N0,B.rfn(),J0<1)R=requestAnimationFrame(j0);else R=null};R=requestAnimationFrame(j0)},hj=(F,f)=>{let{align:g,behavior:x,duration:j0}=d2(f),q0=B.vtf(),U0=F;if(D&&q0>0)U0=(U0%q0+q0)%q0;let J0=B.gsp(U0,B.hc,B.ch,q0,g);if(x==="smooth")pj(B.sgt(),J0,j0);else a0(),B.sst(J0)},uj=()=>B.sgt(),gj=(F,f)=>{return $.on(F,f)},xj=(F,f)=>{$.off(F,f)},mj=()=>{if(B.id)return;if(B.id=!0,_0.state.isDestroyed=!0,E.items.removeEventListener("click",F0),E.root.removeEventListener("keydown",L0),B.st.removeEventListener("scroll",O0),P0.disconnect(),o)o.disconnect(),o=null;if(B.wh)E.viewport.removeEventListener("wheel",B.wh);if(C)clearTimeout(C);for(let F=0;F<e.length;F++)e[F]();for(let F of P)if(F.destroy)F.destroy();a0();for(let[,F]of c)F.remove(),m.release(F);c.clear(),m.clear(),$.clear(),E.root.remove()},R2={get element(){return E.root},get items(){if(a.has("_getItems"))return a.get("_getItems")();return B.it},get total(){if(a.has("_getTotal"))return a.get("_getTotal")();return B.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"):fj,removeItem:a.has("removeItem")?a.get("removeItem"):Sj,reload:a.has("reload")?a.get("reload"):Ij,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[F,f]of a){if(F==="setItems"||F==="appendItems"||F==="prependItems"||F==="updateItem"||F==="removeItem"||F==="reload"||F==="scrollToIndex"||F==="scrollToItem"||F==="cancelScroll"||F==="getScrollPosition")continue;R2[F]=f}return R2}e0();var w0=(j,q,J={},Q="vlist",K=!1)=>{let{autoHide:X=!0,autoHideDelay:Z=1000,minThumbSize:N=30,showOnHover:W=!0,hoverZoneWidth:Y=16,showOnViewportEnter:U=!0}=J,A=0,V=0,O=0,D=0,M=!1,_=!1,v=0,k=0,T=0,b=null,G=!1,P=null,L=null,y=K?"width":"height",E=K?"translateX":"translateY",$=K?(i)=>i.clientX:(i)=>i.clientY,r=K?"left":"top",z=document.createElement("div"),m=document.createElement("div"),B=W?document.createElement("div"):null,R=()=>{if(z.className=`${Q}-scrollbar`,m.className=`${Q}-scrollbar-thumb`,K)z.classList.add(`${Q}-scrollbar--horizontal`);if(z.appendChild(m),j.appendChild(z),B){if(B.className=`${Q}-scrollbar-hover`,K)B.classList.add(`${Q}-scrollbar-hover--horizontal`),B.style.height=`${Y}px`;else B.style.width=`${Y}px`;j.appendChild(B)}},C=()=>{if(b)clearTimeout(b),b=null},h=()=>{if(!X)return;C(),b=setTimeout(p,Z)},I=()=>{if(A<=V)return;if(C(),!G)z.classList.add(`${Q}-scrollbar--visible`),G=!0;if(X&&!M&&!_)h()},p=()=>{if(M||_)return;z.classList.remove(`${Q}-scrollbar--visible`),G=!1},H=(i,B0)=>{A=i,V=B0;let X0=A>V;if(z.style.display=X0?"":"none",!X0){p();return}let S=V/A;O=Math.max(N,S*V),m.style[y]=`${O}px`,D=V-O,w(T)},w=(i)=>{if(T=i,A<=V||D<=0)return;let B0=A-V,S=Math.min(1,Math.max(0,i/B0))*D;m.style.transform=`${E}(${S}px)`},c=(i)=>{if(i.target===m)return;let B0=z.getBoundingClientRect(),d=$(i)-B0[r]-O/2,a=Math.max(0,Math.min(d,D))/D,Z0=A-V,W0=a*Z0;q(W0),I()},t=(i)=>{i.preventDefault(),i.stopPropagation(),M=!0,v=$(i),k=T,C(),z.classList.add(`${Q}-scrollbar--dragging`),document.addEventListener("mousemove",s),document.addEventListener("mouseup",o)},s=(i)=>{if(!M)return;let B0=$(i)-v,X0=D>0?B0/D:0,S=A-V,d=X0*S,e=Math.max(0,Math.min(k+d,S)),Z0=e/S*D;if(m.style.transform=`${E}(${Z0}px)`,L=e,P===null)P=requestAnimationFrame(()=>{if(L!==null)q(L);P=null})},o=()=>{if(M=!1,P!==null)cancelAnimationFrame(P),P=null;if(L!==null)q(L),L=null;if(z.classList.remove(`${Q}-scrollbar--dragging`),X&&!_)h();document.removeEventListener("mousemove",s),document.removeEventListener("mouseup",o)},Q0=()=>{if(U)I()},l=()=>{if(!M){if(_=!1,X)h()}},u=()=>{_=!0,C(),I()},n=()=>{if(_=!1,!M&&X)h()},K0=()=>{if(C(),P!==null)cancelAnimationFrame(P),P=null;if(z.removeEventListener("click",c),z.removeEventListener("mouseenter",u),z.removeEventListener("mouseleave",n),m.removeEventListener("mousedown",t),j.removeEventListener("mouseenter",Q0),j.removeEventListener("mouseleave",l),document.removeEventListener("mousemove",s),document.removeEventListener("mouseup",o),B){if(B.removeEventListener("mouseenter",u),B.removeEventListener("mouseleave",n),B.parentNode)B.parentNode.removeChild(B)}if(z.parentNode)z.parentNode.removeChild(z)};if(R(),z.addEventListener("click",c),z.addEventListener("mouseenter",u),z.addEventListener("mouseleave",n),m.addEventListener("mousedown",t),j.addEventListener("mouseenter",Q0),j.addEventListener("mouseleave",l),B)B.addEventListener("mouseenter",u),B.addEventListener("mouseleave",n);return{show:I,hide:p,updateBounds:H,updatePosition:w,isVisible:()=>G,destroy:K0}};var Kj=(j)=>{let q=null;return{name:"withScrollbar",priority:30,setup(J){let{dom:Q,config:K}=J,{classPrefix:X,horizontal:Z}=K;if(q=w0(Q.viewport,(Y)=>J.scrollController.scrollTo(Y),j??{},X,Z),!Q.viewport.classList.contains(`${X}-viewport--custom-scrollbar`))Q.viewport.classList.add(`${X}-viewport--custom-scrollbar`);let N=J.getCachedCompression();q.updateBounds(N.virtualSize,J.state.viewportState.containerSize);let W=q;J.afterScroll.push((Y,U)=>{W.updatePosition(Y),W.show()}),J.resizeHandlers.push((Y,U)=>{if(W){let A=J.getCachedCompression();W.updateBounds(A.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,Z=j.samples[X],N=q-Z.position,W=J-Z.time;j.velocity=W>0?N/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:Z,onIdle:N,scrollElement:W,horizontal:Y=!1}=q,U=!!W,A=0,V=0,O=U?Y?window.innerWidth:window.innerHeight:Y?j.clientWidth:j.clientHeight,D=q.compressed??!1,M=q.compression,_=Zj(),v=!1,k=null,b=J2(()=>{let l=Y?j.scrollLeft:j.scrollTop,u=l>=A?"down":"up";if(_=j2(_,l),A=l,Z)Z({scrollTop:A,direction:u,velocity:_.velocity});$()}),P=J2(()=>{let l=j.getBoundingClientRect(),u=Y?Math.max(0,-l.left):Math.max(0,-l.top),n=u>=A?"down":"up";if(_=j2(_,u),A=u,!v)v=!0;if(Z)Z({scrollTop:A,direction:n,velocity:_.velocity});$()}),L=(l)=>{l.preventDefault()},y=(l)=>{if(l.deltaX)return;l.preventDefault(),j.scrollLeft+=l.deltaY},E=(l)=>{if(!D)return;l.preventDefault();let u=(Y?l.deltaX||l.deltaY:l.deltaY)*Q,n=A+u;if(K)n=A+u*0.3;if(n=Math.max(0,Math.min(n,V)),n!==A){let i=n>=A?"down":"up";if(_=j2(_,n),A=n,!v)v=!0;if(Z)Z({scrollTop:A,direction:i,velocity:_.velocity});$()}},$=()=>{if(k)clearTimeout(k);k=setTimeout(()=>{if(v=!1,_=Zj(A),N)N()},X)},r=(l)=>{if(D)return;if(D=!0,M=l,V=l.virtualSize-O,U)return;if(b.cancel(),j.removeEventListener("scroll",b),!J)j.removeEventListener("wheel",L);else if(Y)j.removeEventListener("wheel",y);if(Y)j.style.overflowX="hidden";else j.style.overflow="hidden";if(J)j.addEventListener("wheel",E,{passive:!1});let u=Y?j.scrollLeft:j.scrollTop;if(u>0){let n=Y?M?.actualSize??j.scrollWidth:M?.actualSize??j.scrollHeight;A=u/n*V}if(Y)j.scrollLeft=0;else j.scrollTop=0},z=()=>{if(!D)return;if(D=!1,U){M=void 0;return}if(j.removeEventListener("wheel",E),Y)j.style.overflowX="auto";else j.style.overflow="auto";if(j.addEventListener("scroll",b,{passive:!0}),!J)j.addEventListener("wheel",L,{passive:!1});else if(Y)j.addEventListener("wheel",y,{passive:!1});if(M&&A>0){let u=A/V*(M.actualSize-O);if(Y)j.scrollLeft=u;else j.scrollTop=u}M=void 0},m=()=>{if(U||D)return A;return Y?j.scrollLeft:j.scrollTop},B=(l,u=!1)=>{let n=Math.max(0,Math.min(l,V||1/0));if(U){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===A)return;let i=n>=A?"down":"up";if(_=j2(_,n),A=n,!v)v=!0;if(Z)Z({scrollTop:A,direction:i,velocity:_.velocity});$()}else if(Y)j.scrollTo({left:n,behavior:u?"smooth":"auto"});else j.scrollTo({top:n,behavior:u?"smooth":"auto"})},R=(l)=>{B(m()+l)},C=()=>{return m()<=0},h=(l=0)=>{let u=m(),n=U||D?V:Y?j.scrollWidth-j.clientWidth:j.scrollHeight-j.clientHeight;return u>=n-l},I=()=>{let l=m(),u=U||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))},p=(l)=>{if(l.compression)M=l.compression,V=M.virtualSize-O},H=()=>D,w=()=>Math.abs(_.velocity),c=()=>QJ(_),t=()=>v,s=()=>U,o=(l)=>{if(O=l,M)V=M.virtualSize-O},Q0=()=>{if(k)clearTimeout(k);if(U)P.cancel(),window.removeEventListener("scroll",P);else b.cancel(),j.removeEventListener("scroll",b),j.removeEventListener("wheel",E),j.removeEventListener("wheel",L),j.removeEventListener("wheel",y)};if(U){if(D&&M)V=M.virtualSize-O;window.addEventListener("scroll",P,{passive:!0})}else if(D&&M){if(V=M.virtualSize-O,Y)j.style.overflowX="hidden";else j.style.overflow="hidden";if(J)j.addEventListener("wheel",E,{passive:!1})}else{if(Y)j.style.overflowX="auto",j.style.overflowY="hidden";else j.style.overflow="auto";if(j.addEventListener("scroll",b,{passive:!0}),!J)j.addEventListener("wheel",L,{passive:!1});else if(Y)j.addEventListener("wheel",y,{passive:!1})}return{getScrollTop:m,scrollTo:B,scrollBy:R,isAtTop:C,isAtBottom:h,getScrollPercentage:I,getVelocity:w,isTracking:c,isScrolling:t,updateConfig:p,enableCompression:r,disableCompression:z,isCompressed:H,isWindowMode:s,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,Z=0,N=null,W=[];return{name:"withScale",priority:20,setup(Y){let{dom:U,config:A}=Y,{classPrefix:V,horizontal:O}=A,D=()=>{let k=Y.getVirtualTotal(),T=A0(k,Y.sizeCache);if(T.isCompressed&&!J){J=!0,Y.scrollController.enableCompression(T),Y.updateContentSize(T.virtualSize),Y.setScrollFns(()=>q,(z)=>{if(q=z,Q=z,K!==null)cancelAnimationFrame(K),K=null});let b=()=>{let z=Q-q;if(Math.abs(z)<XJ)q=Q,K=null;else{q+=z*qJ;let B=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize;q=Math.max(0,Math.min(q,B)),K=requestAnimationFrame(b)}Y.scrollController.scrollTo(q)},G=U.viewport,P=(z)=>{z.preventDefault();let B=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize;if(Q=Math.max(0,Math.min(Q+z.deltaY,B)),K===null)K=requestAnimationFrame(b)};G.addEventListener("wheel",P,{passive:!1});let L=()=>{if(N!==null)cancelAnimationFrame(N),N=null},y=(z)=>{if(L(),K!==null)cancelAnimationFrame(K),K=null;let m=z.touches[0];if(!m)return;let B=O?m.clientX:m.clientY;X=B,Z=q,W=[{time:performance.now(),y:B}]},E=(z)=>{z.preventDefault();let m=z.touches[0];if(!m)return;let B=O?m.clientX:m.clientY,R=performance.now();if(W.push({time:R,y:B}),W.length>ZJ)W.shift();let C=X-B,I=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize,p=Math.max(0,Math.min(Z+C,I));q=p,Q=p,Y.scrollController.scrollTo(p)},$=(z)=>{let m=performance.now(),B=W.filter((I)=>m-I.time<BJ),R=0;if(B.length>=2){let I=B[0],p=B[B.length-1],H=p.time-I.time;if(H>0)R=(I.y-p.y)/H}if(W=[],Math.abs(R)<KJ)return;let C=R*16,h=()=>{if(C*=YJ,Math.abs(C)<0.5){N=null;return}let p=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize,H=q+C;if(H=Math.max(0,Math.min(H,p)),H<=0&&C<0||H>=p&&C>0){q=H,Q=H,Y.scrollController.scrollTo(H),N=null;return}q=H,Q=H,Y.scrollController.scrollTo(H),N=requestAnimationFrame(h)};N=requestAnimationFrame(h)};if(G.addEventListener("touchstart",y,{passive:!0}),G.addEventListener("touchmove",E,{passive:!1}),G.addEventListener("touchend",$,{passive:!0}),G.addEventListener("touchcancel",$,{passive:!0}),Y.destroyHandlers.push(()=>{if(G.removeEventListener("wheel",P),G.removeEventListener("touchstart",y),G.removeEventListener("touchmove",E),G.removeEventListener("touchend",$),G.removeEventListener("touchcancel",$),L(),K!==null)cancelAnimationFrame(K),K=null}),!U.viewport.querySelector(`.${V}-scrollbar-track`)){if(j=w0(U.viewport,(m)=>Y.scrollController.scrollTo(m),{},V,O),!U.viewport.classList.contains(`${V}-viewport--custom-scrollbar`))U.viewport.classList.add(`${V}-viewport--custom-scrollbar`);j.updateBounds(T.virtualSize,Y.state.viewportState.containerSize);let z=j;Y.afterScroll.push((m,B)=>{if(z)z.updatePosition(m),z.show()}),Y.resizeHandlers.push((m,B)=>{if(z){let R=Y.getCachedCompression();z.updateBounds(R.virtualSize,Y.state.viewportState.containerSize)}})}}else if(!T.isCompressed&&J)J=!1,Y.scrollController.disableCompression(),Y.updateContentSize(T.actualSize);else if(T.isCompressed)Y.scrollController.updateConfig({compression:T}),Y.updateContentSize(T.virtualSize);if(j)j.updateBounds(T.virtualSize,Y.state.viewportState.containerSize);Y.state.cachedCompression={state:T,totalItems:k}};Y.updateCompressionMode=D;let M=Y.getCachedCompression.bind(Y);Y.getCachedCompression=()=>{if(Y.state.cachedCompression)return Y.state.cachedCompression.state;return M()},Y.setVisibleRangeFn((k,T,b,G,P)=>{_=null,v=null;let L=A0(G,b);i0(k,T,b,G,L,P)}),Y.setScrollToPosFn((k,T,b,G,P)=>{let L=A0(G,T);return t0(k,T,b,G,L,P)});let _=null,v=null;Y.setPositionElementFn((k,T)=>{let b=Y.getVirtualTotal(),G=A0(b,Y.sizeCache);if(G.isCompressed){let P=Y.scrollController.getScrollTop();if(_===null||T<v)v=T,_=Math.round(v0(T,P,Y.sizeCache,b,Y.state.viewportState.containerSize,G));let L=_+Y.sizeCache.getOffset(T)-Y.sizeCache.getOffset(v),y=Y.config.horizontal;k.style.transform=y?`translateX(${L}px)`:`translateY(${L}px)`}else{let P=Math.round(Y.sizeCache.getOffset(T)),L=Y.config.horizontal;k.style.transform=L?`translateX(${P}px)`:`translateY(${P}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(N!==null)cancelAnimationFrame(N),N=null}}};var Q2=(j={})=>{let{chunkSize:q=100,maxCachedItems:J=5000,evictionBuffer:Q=200,onEvict:K}=j,X=new Map,Z=0,N=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)},U=(R)=>{return R%q},A=()=>Z,V=(R)=>{Z=R},O=(R)=>{if(R<0||R>=Z)return;let C=Y(R),h=X.get(C);if(!h)return;return h.items[U(R)]},D=(R)=>{if(R<0||R>=Z)return!1;let C=Y(R),h=X.get(C);if(!h)return!1;return h.items[U(R)]!==void 0},M=(R,C)=>{let h=Y(R),I=W(h),p=U(R),H=I.items[p]===void 0;if(I.items[p]=C,H)I.count++,N++;if(R>=Z)Z=R+1},_=(R,C)=>{for(let h=0;h<C.length;h++){let I=C[h];if(I!==void 0)M(R+h,I)}},v=(R)=>{if(R<0||R>=Z)return!1;let C=Y(R),h=X.get(C);if(!h)return!1;let I=U(R);if(h.items[I]===void 0)return!1;if(h.items[I]=void 0,h.count--,N--,h.count===0)X.delete(C);return!0},k=(R,C)=>{let h=[];for(let I=R;I<=C&&I<Z;I++)h.push(O(I));return h},T=(R,C)=>{for(let h=R;h<=C&&h<Z;h++)if(!D(h))return!1;return!0},b=()=>{let R=[],C=null,h=Array.from(X.keys()).sort((I,p)=>I-p);for(let I of h){let p=X.get(I);if(!p)continue;let H=I*q;for(let w=0;w<q;w++){let c=H+w;if(c>=Z)break;if(p.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},G=(R,C)=>{let h=[],I=null;for(let p=R;p<=C&&p<Z;p++)if(!D(p))if(I===null)I={start:p,end:p};else I.end=p;else if(I!==null)h.push(I),I=null;if(I!==null)h.push(I);return h},P=(R)=>{return X.has(R)},L=(R)=>{let C=X.get(R);if(C)C.lastAccess=Date.now()},y=(R,C)=>{if(R>C||X.size===0)return;let h=Date.now(),I=Y(Math.max(0,R)),p=Y(Math.min(Z-1,C));for(let H=I;H<=p;H++){let w=X.get(H);if(w)w.lastAccess=h}},E=(R,C)=>{if(N<=J)return 0;let h=Math.max(0,R-Q),I=Math.min(Z-1,C+Q),p=Y(h),H=Y(I),w=0,c=[];for(let[t,s]of X)if(t<p||t>H)w+=s.count,c.push(t),N-=s.count,X.delete(t);if(w>0&&K)K(w,c);return w},$=()=>{if(N<=J)return 0;let R=Array.from(X.entries()).sort(([,I],[,p])=>I.lastAccess-p.lastAccess),C=0,h=[];for(let[I,p]of R){if(N<=J)break;C+=p.count,N-=p.count,h.push(I),X.delete(I)}if(C>0&&K)K(C,h);return C},r=()=>{return{totalItems:Z,cachedItems:N,cachedChunks:X.size,chunkSize:q,maxCachedItems:J,memoryEfficiency:Z>0?1-N/Z:1}},z=()=>N,m=()=>{X.clear(),N=0};return{chunkSize:q,maxCachedItems:J,getTotal:A,setTotal:V,get:O,has:D,set:M,setRange:_,delete:v,getRange:k,isRangeLoaded:T,getLoadedRanges:b,findUnloadedRanges:G,getChunkIndex:Y,isChunkLoaded:P,touchChunk:L,touchChunksForRange:y,evictDistant:E,evictToLimit:$,getStats:r,getCachedCount:z,clear:m,reset:()=>{m(),Z=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 Z=[],N=q2(q),W=X.start;for(let Y of N){if(Y.end<W)continue;if(Y.start>X.end)break;if(Y.start>W)Z.push({start:W,end:Math.min(Y.start-1,X.end)});if(W=Y.end+1,W>X.end)break}if(W<=X.end)Z.push({start:W,end:X.end});return Z};var X2=(j={})=>{let{maskCharacter:q=t2,maxSampleSize:J=e2}=j,Q=[],K=!1,X=0,Z=(A)=>{if(K||A.length===0)return;let V=Math.min(A.length,J);for(let O=0;O<V;O++){let D=A[O];if(!D||typeof D!=="object")continue;let M={};for(let[_,v]of Object.entries(D)){if(_.startsWith("_")||_==="id")continue;M[_]=String(v??"").length}if(Object.keys(M).length>0)Q.push(M)}K=!0},N=()=>K,W=(A)=>{let V={id:`${jj}${X++}`,[A2]:!0,_index:A};if(Q.length===0)return V.label=q.repeat(12),V;let O=Q[A%Q.length];for(let[D,M]of Object.entries(O))V[D]=q.repeat(Math.max(1,M));return V};return{analyzeStructure:Z,hasAnalyzedStructure:N,generate:W,generateRange:(A,V)=>{let O=[];for(let D=A;D<=V;D++)O.push(W(D));return O},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:Z=NJ,onStateChange:N,onItemsLoaded:W,onItemsEvicted:Y}=j,U=Q2({...K,onEvict:(S,d)=>{Y?.(S),G()}}),A=null,V=()=>{if(!A)A=X2(X);return A},O=new Map,D=!1,M,_=!0,v,k=[],T=0,b=new Map,G=()=>{N?.(B())},P=()=>{O.clear();let S=U.getLoadedRanges();for(let d of S)for(let e=d.start;e<=d.end;e++){let a=U.get(e);if(a&&!k0(a))O.set(a.id,e)}},L=(S,d)=>{if(!k0(d))O.set(d.id,S)},y=(S)=>{O.delete(S)},E=(S,d)=>{return`${S}-${d}`},$=()=>U.getTotal(),r=()=>U.getCachedCount(),z=()=>D,m=()=>_,B=()=>({total:U.getTotal(),cached:U.getCachedCount(),isLoading:D,pendingRanges:k,error:M,hasMore:_,cursor:v}),R=()=>U,C=()=>V(),h=(S)=>{let d=U.get(S);if(d!==void 0)return d;if(S>=0&&S<U.getTotal())return V().generate(S);return},I=(S)=>{let d=O.get(S);if(d===void 0)return;return U.get(d)},p=(S)=>{return O.get(S)??-1},H=(S)=>{let d=U.get(S);return d!==void 0&&!k0(d)},w=(S,d)=>{let e=[],a=U.getTotal(),Z0=0,W0=0;U.touchChunksForRange(S,Math.min(d,a-1));for(let E0=S;E0<=d&&E0<a;E0++){let M0=U.get(E0);if(M0!==void 0)e.push(M0),Z0++;else e.push(V().generate(E0)),W0++}return e},c=(S)=>{U.setTotal(S),_=U.getCachedCount()<S,G()},t=(S,d=0,e)=>{if(A&&!A.hasAnalyzedStructure()&&S.length>0)A.analyzeStructure(S);for(let a=0;a<S.length;a++){let Z0=S[a];if(Z0!==void 0){let W0=d+a;U.set(W0,Z0),L(W0,Z0)}}if(e!==void 0)U.setTotal(e);else if(d+S.length>U.getTotal())U.setTotal(d+S.length);if(U.getCachedCount()>=U.getTotal()&&U.getTotal()>0)_=!1;W?.(S,d,U.getTotal()),G()},s=(S,d)=>{let e=O.get(S);if(e===void 0)return!1;let a=U.get(e);if(!a)return!1;let Z0={...a,...d};if(U.set(e,Z0),d.id!==void 0&&d.id!==S)y(S),L(e,Z0);return G(),!0},o=(S)=>{let d=O.get(S);if(d===void 0)return!1;U.delete(d),y(S);let e=U.getTotal();if(e>0)U.setTotal(e-1);return G(),!0},Q0=async(S,d)=>{if(!q)return;let e=E(S,d);if(b.has(e))return;let a=U.getLoadedRanges(),Z0=g0({start:S,end:d},a,U.chunkSize);if(Z0.length===0)return;let W0=U.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=E(F0,D0);if(!E0.some((P0)=>P0.start===F0)&&!b.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=E(F0,D0);if(b.has(L0)){let P0=b.get(L0);if(!M0.includes(P0))M0.push(P0)}}}for(let G0 of E0){let H0=E(G0.start,G0.end),O0=(async()=>{k.push(G0),D=!0,M=void 0,G();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)v=D0.cursor;let L0=G0.start+D0.items.length;if(L0>=T){if(T=L0,D0.hasMore!==void 0)_=D0.hasMore;else if(D0.total!==void 0)_=L0<D0.total}}catch(Y0){M=Y0 instanceof Error?Y0:Error(String(Y0))}finally{b.delete(H0),k=k.filter((Y0)=>Y0.start!==G0.start||Y0.end!==G0.end),D=b.size>0,G()}})();b.set(H0,O0),M0.push(O0)}await Promise.all(M0)},l=async(S,d)=>{if(U.isRangeLoaded(S,d))return;await Q0(S,d)},u=async()=>{if(!q)return;await Q0(0,Z-1)},n=async()=>{if(!q||D||!_)return!1;let S=U.getCachedCount(),d=U.getTotal(),e=S,a=Math.min(e+Z-1,d>0?d-1:e+Z-1);if(e>=d&&d>0)return _=!1,!1;return await Q0(e,a),U.getCachedCount()>S},K0=async()=>{if(U.clear(),U.setTotal(0),O.clear(),A)A.clear();b.clear(),k=[],D=!1,v=void 0,_=!0,T=0,M=void 0,G()},i=(S,d)=>{if(U.evictDistant(S,d)>0)P()},B0=()=>{U.clear(),O.clear(),v=void 0,M=void 0,k=[],D=!1,G()},X0=()=>{if(U.reset(),O.clear(),A)A.clear();v=void 0,_=!0,T=0,M=void 0,k=[],D=!1,G()};if(J&&J.length>0)t(J,0,Q??J.length);else if(Q!==void 0)U.setTotal(Q),G();return{getState:B,getTotal:$,getCached:r,getIsLoading:z,getHasMore:m,getStorage:R,getPlaceholders:C,getItem:h,getItemById:I,getIndexById:p,isItemLoaded:H,getItemsInRange:w,setTotal:c,setItems:t,updateItem:s,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,Z=J?.cancelThreshold??n2,N=J?.preloadThreshold??o2,W=J?.preloadAhead??i2;return{name:"withAsync",priority:20,methods:["reload","loadVisibleRange"],setup(Y){let{emitter:U}=Y,A=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 T=Y.getVirtualTotal();Y.sizeCache.rebuild(T),Y.updateCompressionMode();let b=Y.getCachedCompression();Y.state.viewportState.totalSize=b.virtualSize,Y.state.viewportState.actualSize=b.actualSize,Y.state.viewportState.isCompressed=b.isCompressed,Y.state.viewportState.compressionRatio=b.ratio,Y.updateContentSize(b.virtualSize),Y.renderIfNeeded()}},onItemsLoaded:(T,b,G)=>{if(Y.state.isInitialized)Y.forceRender(),U.emit("load:end",{items:T,total:G})}});Y.replaceDataManager(V);let O=null,D=null,M=0,_=()=>{if(D){let T=D;D=null,Y.dataManager.ensureRange(T.start,T.end).catch((b)=>{U.emit("error",{error:b,context:"ensureRange"})})}};Y.afterScroll.push((T,b)=>{if(Y.state.isDestroyed)return;let G=Y.scrollController.getVelocity(),L=Y.scrollController.isTracking()&&G<=Z;if(D&&M>Z&&G<=Z){let $=D;D=null,Y.dataManager.ensureRange($.start,$.end).catch((r)=>{U.emit("error",{error:r,context:"ensureRange"})})}if(M=G,L&&!Y.dataManager.getIsLoading()&&Y.dataManager.getHasMore()){if(A){if(T<F2)U.emit("load:start",{offset:Y.dataManager.getCached(),limit:z0}),Y.dataManager.loadMore().catch(($)=>{U.emit("error",{error:$,context:"loadMore"})})}else if(Y.state.viewportState.totalSize-T-Y.state.viewportState.containerSize<F2)U.emit("load:start",{offset:Y.dataManager.getCached(),limit:z0}),Y.dataManager.loadMore().catch((r)=>{U.emit("error",{error:r,context:"loadMore"})})}let{renderRange:y}=Y.state.viewportState;if(!O||y.start!==O.start||y.end!==O.end)if(O={start:y.start,end:y.end},L){D=null;let{start:$,end:r}=y,z=Y.getVirtualTotal();if(G>N)if(b==="down")r=Math.min(y.end+W,z-1);else $=Math.max(y.start-W,0);Y.dataManager.ensureRange($,r).catch((m)=>{U.emit("error",{error:m,context:"ensureRange"})})}else D={start:y.start,end:y.end}});let v=200,k=null;if(Y.afterScroll.push((T,b)=>{if(k!==null)clearTimeout(k);k=setTimeout(()=>{k=null,_()},v)}),Y.destroyHandlers.push(()=>{if(k!==null)clearTimeout(k),k=null}),U.on("load:start",()=>{Y.dom.root.setAttribute("aria-busy","true")}),U.on("load:end",()=>{Y.dom.root.removeAttribute("aria-busy")}),Y.methods.set("loadVisibleRange",async()=>{O=null,D=null,Y.forceRender();let{renderRange:T}=Y.state.viewportState;if(T.end>0)U.emit("load:start",{offset:T.start,limit:T.end-T.start+1}),await Y.dataManager.ensureRange(T.start,T.end)}),Y.methods.set("reload",async()=>{O=null,D=null,Y.invalidateRendered(),await Y.dataManager.reload(),U.emit("load:start",{offset:0,limit:z0}),await Y.dataManager.loadInitial(),Y.forceRender();let{renderRange:T}=Y.state.viewportState;if(T.end>0)await Y.dataManager.ensureRange(T.start,T.end)}),X)U.emit("load:start",{offset:0,limit:z0}),Y.dataManager.loadInitial().catch((T)=>{U.emit("error",{error:T,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 U=J.viewport.getBoundingClientRect();if(K.horizontal){let A=U.left+window.scrollX;window.scrollTo(A+Y,window.scrollY)}else{let A=U.top+window.scrollY;window.scrollTo(window.scrollX,A+Y)}}),q.setContainerDimensions({width:()=>window.innerWidth,height:()=>window.innerHeight}),Q.viewportState.containerSize=window.innerHeight;let{innerHeight:Z,innerWidth:N}=window,W=()=>{let{innerWidth:Y,innerHeight:U}=window,A=K.horizontal?Y:U,V=K.horizontal?N:Z;if(Math.abs(A-V)<=1)return;Z=U,N=Y,Q.viewportState.containerSize=U,X.emit("resize",{width:Y,height:U});for(let O=0;O<q.resizeHandlers.length;O++)q.resizeHandlers[O](Y,U);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 Z=1;Z<j;Z++){let N=q(Z);if(N!==Q){let W=Z-K;J.push({key:Q,groupIndex:J.length,headerLayoutIndex:X,firstDataIndex:K,count:W}),X=X+1+W,Q=N,K=Z}}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 Z=0;Z<X.count;Z++)Q[K]=j[X.firstDataIndex+Z],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 O=L2(J,V),D=J[O];if(V===D.headerLayoutIndex)return{type:"header",group:D};let M=V-D.headerLayoutIndex-1;return{type:"item",dataIndex:D.firstDataIndex+M,group:D}},layoutToDataIndex:(V)=>{if(J.length===0)return V;let O=L2(J,V),D=J[O];if(V===D.headerLayoutIndex)return-1;let M=V-D.headerLayoutIndex-1;return D.firstDataIndex+M},dataToLayoutIndex:(V)=>{if(J.length===0)return V;let O=Wj(J,V),D=J[O],M=V-D.firstDataIndex;return D.headerLayoutIndex+1+M},getGroupAtLayoutIndex:(V)=>{if(J.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let O=L2(J,V);return J[O]},getGroupAtDataIndex:(V)=>{if(J.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let O=Wj(J,V);return J[O]},getHeaderHeight:typeof K==="number"?(V)=>K:(V)=>{let O=J[V];if(!O)return 0;return K(O.key,V)},rebuild:(V)=>{J=Dj(V,q.getGroupForIndex),Q=V+J.length}}};var Z2=(j,q,J,Q,K,X=!1)=>{let Z=document.createElement("div");if(Z.className=`${K}-sticky-header`,Z.setAttribute("role","presentation"),Z.setAttribute("aria-hidden","true"),Z.style.position="absolute",Z.style.zIndex="5",Z.style.pointerEvents="none",Z.style.willChange="transform",Z.style.overflow="hidden",X)Z.style.top="0",Z.style.bottom="0",Z.style.left="0";else Z.style.top="0",Z.style.left="0",Z.style.right="0";j.insertBefore(Z,j.firstChild);let N=-1,W=!1,Y=0,U=(_)=>{if(_===N)return;N=_;let v=q.groups;if(_<0||_>=v.length){Z.textContent="";return}let k=v[_],T=Q.headerTemplate(k.key,k.groupIndex),b=q.getHeaderHeight(_);if(X)Z.style.width=`${b}px`;else Z.style.height=`${b}px`;if(typeof T==="string")Z.innerHTML=T;else Z.replaceChildren(T)},A=(_)=>{let v=q.groups;if(v.length===0){O();return}let k=0;for(let L=v.length-1;L>=0;L--)if(J.getOffset(v[L].headerLayoutIndex)<=_){k=L;break}let T=J.getOffset(v[0].headerLayoutIndex);if(_<T){O();return}if(!W)V();U(k);let b=q.getHeaderHeight(k),G=0,P=k+1;if(P<v.length){let y=J.getOffset(v[P].headerLayoutIndex)-_;if(y<b)G=y-b}if(G!==Y)if(Y=G,G===0)Z.style.transform="";else{let L=Math.round(G);Z.style.transform=X?`translateX(${L}px)`:`translateY(${L}px)`}},V=()=>{if(W)return;W=!0,Z.style.display=""},O=()=>{if(!W)return;W=!1,Z.style.display="none",N=-1,Y=0,Z.style.transform=""},D=()=>{let _=N;if(N=-1,_>=0)U(_)},M=()=>{Z.remove(),N=-1,W=!1};return Z.style.display="none",{update:A,refresh:D,show:V,hide:O,destroy:M}};var _j=(j,q,J,Q,K,X)=>{if(Q===0||q===0)return X.start=0,X.end=-1,X;let Z=J.indexAtOffset(j),N=J.indexAtOffset(j+q);if(N<Q-1)N++;return X.start=Math.max(0,Z),X.end=Math.min(Q-1,Math.max(0,N)),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 Z=Math.max(0,Math.min(j,Q-1)),N=q.getOffset(Z),W=q.getSize(Z),Y=q.getTotalSize(),U=Math.max(0,Y-J),A;switch(X){case"center":A=N-J/2+W/2;break;case"end":A=N-J+W;break;case"start":default:A=N;break}return Math.max(0,Math.min(A,U))},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,Z=Mj)=>{return Z(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:Z,config:N,rawConfig:W}=X,{classPrefix:Y}=N,A=W.item.height;Q=W.items?[...W.items]:[];let V=Q.length,O={getGroupForIndex:j.getGroupForIndex,headerHeight:j.headerHeight,headerTemplate:j.headerTemplate,sticky:j.sticky??!1};q=K2(V,O),K=x0(Q,q.groups);let D=m0(q,A);X.setSizeConfig(D),X.rebuildSizeCache(K.length),X.dataManager.setItems(K,0,K.length);let M=W.item.template,{headerTemplate:_}=j,v=(y,E,$)=>{if(R0(y))return _(y.groupKey,y.groupIndex);return M(y,E,$)},k=X.methods.get("_getGridLayout"),T=X.methods.get("_replaceGridRenderer"),b=X.methods.get("_updateGridLayoutForGroups");if(k&&T){if(b)b((r)=>{let z=K[r];return!!(z&&R0(z))});let{createGridRenderer:y}=(B2(),rj(Hj)),E=k(),$=y(Z.items,v,X.sizeCache,E,Y,X.getContainerWidth(),()=>X.dataManager.getTotal(),N.ariaIdPrefix);T($)}else X.replaceTemplate(v);if(Z.root.classList.add(`${Y}--grouped`),j.sticky!==!1){J=Z2(Z.root,q,X.sizeCache,{...O,sticky:O.sticky??!1},Y,N.horizontal);let y=J;X.afterScroll.push((E,$)=>{y.update(E)}),J.update(X.scrollController.getScrollTop())}let G=()=>{if(!q)return;q.rebuild(Q.length),K=x0(Q,q.groups);let y=m0(q,A);if(X.setSizeConfig(y),X.rebuildSizeCache(K.length),X.dataManager.setItems(K,0,K.length),J)J.refresh()};X.methods.set("setItems",(y)=>{Q=[...y],G()}),X.methods.set("appendItems",(y)=>{Q=[...Q,...y],G()}),X.methods.set("prependItems",(y)=>{Q=[...y,...Q],G()}),X.methods.set("removeItem",(y)=>{Q=Q.filter((E)=>E.id!==y),G()});let{animateScroll:P,cancelScroll:L}=DJ(X.scrollController,X.renderIfNeeded);X.methods.set("scrollToIndex",(y,E)=>{let $=q.dataToLayoutIndex(y),{align:r,behavior:z,duration:m}=_J(E),B=X.dataManager.getTotal(),R=C0($,X.sizeCache,X.state.viewportState.containerSize,B,r,X.getCachedCompression());if(z==="smooth")P(X.scrollController.getScrollTop(),R,m);else L(),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;Z.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,Z)=>{if(J(),Math.abs(X-K)<1){j.scrollTo(X);return}let N=performance.now(),W=(Y)=>{let U=Y-N,A=Math.min(U/Z,1),V=K+(X-K)*WJ(A);if(j.scrollTo(V),q(),A<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 M=0,_=0,v=0;for(let k=0;k<D;k++)if(Q(k)){if(v++,_>0)M++,_=0;M++,_=0}else if(_++,_>=q)M++,_=0;if(_>0)M++;return M},Z=(D)=>{return K.row=N(D),K.col=W(D),K},N=(D)=>{if(!Q)return Math.floor(D/q);let M=0,_=0;for(let v=0;v<=D;v++)if(Q(v)){if(_>0)M++,_=0;if(v===D)return M;M++,_=0}else{if(v===D)return M;if(_++,_>=q)M++,_=0}return console.warn(`⚠️ getRow(${D}) fell through - returning ${M}`),M},W=(D)=>{if(!Q)return D%q;if(Q(D))return 0;let M=0;for(let _=0;_<=D;_++)if(Q(_))M=0;else{if(_===D)return M;if(M++,M>=q)M=0}return M},Y=(D,M,_)=>{if(_<=0)return{start:0,end:-1};if(!Q){let G=Math.max(0,D*q),P=Math.min(_-1,(M+1)*q-1);return{start:G,end:P}}let v=-1,k=-1,T=0,b=0;for(let G=0;G<_;G++){if(Q(G)){if(b>0)T++,b=0;if(T>=D&&T<=M){if(v===-1)v=G;k=G}T++,b=0}else{if(T>=D&&T<=M){if(v===-1)v=G;k=G}if(b++,b>=q)T++,b=0}if(T>M&&b===0)break}if(v===-1)return{start:0,end:-1};return{start:v,end:k}},U=(D,M,_)=>{if(M<0||M>=q)return-1;let v=D*q+M;if(v<0||v>=_)return-1;return v},A=(D)=>{let M=(q-1)*J;return Math.max(0,(D-M)/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:Z,getRow:N,getCol:W,getItemRange:Y,getItemIndex:U,getColumnWidth:A,getColumnOffset:(D,M)=>{let _=A(M);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:Z,rawConfig:N}=Q,{classPrefix:W}=Z;if(Z.reverse)throw Error("[vlist/builder] withGrid cannot be used with reverse: true");let Y=Z.horizontal,U=()=>Y?K.viewport.clientHeight:Q.getContainerWidth(),A=N.items?.some((L)=>L.__groupHeader===!0),V={columns:j.columns,gap:j.gap??0};if(A)V.isHeaderFn=(L)=>{let y=Q.dataManager.getItem(L);return!!(y&&y.__groupHeader===!0)};q=U2(V);let O=q.gap;Q.setVirtualTotalFn(()=>{let L=Q.dataManager.getTotal();return q.getTotalRows(L)});let D=N.item,M=Z.horizontal?D.width:D.height,_={containerWidth:U(),columns:q.columns,gap:q.gap};if(typeof M==="function")Q.setSizeConfig((L)=>{let y=_.containerWidth-2,E=(_.columns-1)*_.gap,$=(y-E)/_.columns,r={containerWidth:_.containerWidth,columns:_.columns,gap:_.gap,columnWidth:$,row:q.getRow(L),column:q.getCol(L),totalRows:q.getTotalRows(Q.dataManager.getTotal()),totalColumns:_.columns};return M(L,r)+_.gap});else if(O>0)Q.setSizeConfig(M+O);Q.rebuildSizeCache(),K.root.classList.add(`${W}--grid`);let v=U(),k=N.item.template,T=()=>{J=d0(K.items,k,Q.sizeCache,q,W,v,()=>Q.dataManager.getTotal(),Z.ariaIdPrefix,Z.horizontal),Q.replaceRenderer(J)};T(),Q.methods.set("_getGridLayout",()=>q),Q.methods.set("_getGridConfig",()=>V),Q.methods.set("_replaceGridRenderer",(L)=>{J=L}),Q.methods.set("_updateGridLayoutForGroups",(L)=>{q.update({isHeaderFn:L});let y=Q.dataManager.getTotal(),E=0;for(let $=0;$<y;$++)if(q.getCol($)===0){let r=Q.sizeCache.getSize($);E+=r}if(Q.sizeCache.getTotalSize=()=>E,Z.horizontal)Q.dom.content.style.width=`${E}px`;else Q.dom.content.style.height=`${E}px`;T()}),Q.methods.set("updateGrid",(L)=>{if(L.columns!==void 0){if(!Number.isInteger(L.columns)||L.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");V.columns=L.columns}if(L.gap!==void 0){if(L.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");V.gap=L.gap}if(q)q.update(V);let y=U();if(_.containerWidth=y,_.columns=V.columns,_.gap=V.gap??0,J)J.updateContainerWidth(y);Q.rebuildSizeCache(),Q.updateContentSize(Q.sizeCache.getTotalSize()),Q.updateCompressionMode();for(let E=0;E<Q.contentSizeHandlers.length;E++)Q.contentSizeHandlers[E]();if(J)J.clear();Q.forceRender()});let b=()=>{if(Q.state.isDestroyed)return;let L=Q.scrollController.getScrollTop(),y=Q.state.viewportState.containerSize,E=Q.getVirtualTotal(),$={start:0,end:0};if(E===0||y===0)$.start=0,$.end=0;else{$.start=Math.max(0,Q.sizeCache.indexAtOffset(L));let p=Q.sizeCache.indexAtOffset(L+y);if(p<E-1)p++;$.end=Math.min(E-1,Math.max(0,p))}let r=Z.overscan??3,z={start:Math.max(0,$.start-r),end:Math.min(E-1,$.end+r)};Q.state.viewportState.scrollPosition=L,Q.state.viewportState.visibleRange=$,Q.state.viewportState.renderRange=z;let m=Q.state.lastRenderRange,B=Q.state.viewportState.isCompressed;if(z.start===m.start&&z.end===m.end){if(B)J.updatePositions(Q.getCompressionContext());return}let R=Q.dataManager.getTotal(),C=q.getItemRange(z.start,z.end,R),h=Q.dataManager.getItemsInRange(C.start,C.end),I=B?Q.getCompressionContext():void 0;J.render(h,C,new Set,-1,I),Q.state.lastRenderRange={...z},X.emit("range:change",{range:z})},G=()=>{if(Q.state.isDestroyed)return;Q.state.lastRenderRange={start:-1,end:-1},b()};Q.setRenderFns(b,G);let P=typeof M==="function";if(Q.resizeHandlers.push((L,y)=>{let E=Y?y:L;if(_.containerWidth=E,J)J.updateContainerWidth(E);if(P){Q.rebuildSizeCache(),Q.updateContentSize(Q.sizeCache.getTotalSize()),Q.updateCompressionMode();for(let $=0;$<Q.contentSizeHandlers.length;$++)Q.contentSizeHandlers[$]();if(J)J.clear();Q.forceRender()}}),Q.methods.set("scrollToIndex",(L,y)=>{let E=Math.floor(L/j.columns),{align:$,behavior:r}=VJ(y),z=Q.dataManager.getState(),m=q.getTotalRows(z.total),B=Math.max(0,Math.min(E,m-1)),R=C0(B,Q.sizeCache,Q.state.viewportState.containerSize,m,$,Q.getCachedCompression());if(r==="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}},f0=(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)},S0=(j)=>{return Array.from(j.selected)},I0=(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:Z,emitter:N,config:W}=X,{classPrefix:Y,ariaIdPrefix:U}=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 A=new Map,V=()=>{A.clear();let b=X.dataManager.getTotal();for(let G=0;G<b;G++){let P=X.dataManager.getItem(G);if(P)A.set(P.id,G)}};V();let{renderIfNeeded:O,forceRender:D}=X.getRenderFns(),M=()=>{X.dom.items.querySelectorAll("[data-index]").forEach((G)=>{let P=G,L=P.dataset.id;if(L!==void 0){let y=/^\d+$/.test(L)?parseInt(L,10):L,E=Q.selected.has(y),r=parseInt(P.dataset.index??"-1",10)===Q.focusedIndex;P.classList.toggle(`${Y}-item--selected`,E),P.classList.toggle(`${Y}-item--focused`,r),P.ariaSelected=E?"true":"false"}})},_=()=>{if(X.state.isDestroyed)return;O(),M()},v=()=>{if(X.state.isDestroyed)return;D(),M()};X.setRenderFns(_,v);let k=()=>{M();let b=(G)=>{let P=A.get(G);if(P===void 0)return;return X.dataManager.getItem(P)};N.emit("selection:change",{selected:S0(Q),items:I0(Q,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",Z.root.appendChild(K);let T=K;N.on("selection:change",({selected:b})=>{let G=b.length;if(G===0)T.textContent="";else if(G===1)T.textContent="1 item selected";else T.textContent=`${G} items selected`}),X.clickHandlers.push((b)=>{if(X.state.isDestroyed)return;let P=b.target.closest("[data-index]");if(!P)return;let L=parseInt(P.dataset.index??"-1",10);if(L<0)return;let y=X.dataManager.getItem(L);if(!y)return;N.emit("item:click",{item:y,index:L,event:b}),Q=y2(Q,L),Z.root.setAttribute("aria-activedescendant",`${U}-item-${L}`),Q=f0(Q,y.id,q),k()}),X.keydownHandlers.push((b)=>{if(X.state.isDestroyed)return;let G=X.dataManager.getTotal(),P=Q.focusedIndex,L=!1,y=!1,E=Q;switch(b.key){case"ArrowUp":E=T2(Q,G),L=!0,y=!0;break;case"ArrowDown":E=H2(Q,G),L=!0,y=!0;break;case"Home":E=P2(Q,G),L=!0,y=!0;break;case"End":E=$2(Q,G),L=!0,y=!0;break;case" ":case"Enter":if(Q.focusedIndex>=0){let $=X.dataManager.getItem(Q.focusedIndex);if($)E=f0(Q,$.id,q);L=!0}break}if(L){b.preventDefault(),Q=E;let $=Q.focusedIndex;if($>=0){let r=X.dataManager.getState(),z=C0($,X.sizeCache,X.state.viewportState.containerSize,r.total,"center",X.getCachedCompression());X.scrollController.scrollTo(z),Z.root.setAttribute("aria-activedescendant",`${U}-item-${$}`)}else Z.root.removeAttribute("aria-activedescendant");if(y){let{selected:r}=Q;if(P>=0&&P!==$){let z=X.dataManager.getItem(P);if(z)X.renderer.updateItemClasses(P,r.has(z.id),!1)}if($>=0){let z=X.dataManager.getItem($);if(z)X.renderer.updateItemClasses($,r.has(z.id),!0)}}else{v();let r=(z)=>{let m=A.get(z);if(m===void 0)return;return X.dataManager.getItem(m)};N.emit("selection:change",{selected:S0(Q),items:I0(Q,r)})}}}),X.methods.set("select",(...b)=>{Q=c0(Q,b,q),k()}),X.methods.set("deselect",(...b)=>{Q=l0(Q,b),k()}),X.methods.set("toggleSelect",(b)=>{Q=f0(Q,b,q),k()}),X.methods.set("selectAll",()=>{if(q!=="multiple")return;let b=X.getAllLoadedItems();Q=G2(Q,b,q),V(),k()}),X.methods.set("clearSelection",()=>{Q=W2(Q);let{renderRange:b,isCompressed:G}=X.state.viewportState,P=X.getItemsForRange(b),L=G?X.getCompressionContext():void 0;X.renderer.render(P,b,Q.selected,Q.focusedIndex,L),N.emit("selection:change",{selected:[],items:[]})}),X.methods.set("getSelected",()=>{return S0(Q)}),X.methods.set("getSelectedItems",()=>{return I0(Q,(G)=>{let P=A.get(G);if(P===void 0)return;return X.dataManager.getItem(P)})}),X.destroyHandlers.push(()=>{if(T&&T.parentNode)T.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(),Z=J.getVirtualTotal(),N=J.methods.get("getSelected"),W=N&&N().length>0?N():void 0;if(Z===0){let V={index:0,offsetInItem:0,total:0};if(W)V.selectedIds=W;return V}let Y,U;if(X.isCompressed){let O=K/X.virtualSize*Z;Y=Math.max(0,Math.min(Math.floor(O),Z-1)),U=(O-Y)*J.sizeCache.getSize(Y)}else Y=J.sizeCache.indexAtOffset(K),U=K-J.sizeCache.getOffset(Y);U=Math.max(0,U);let A={index:Y,offsetInItem:U,total:Z};if(W)A.selectedIds=W;return A});let Q=(K)=>{let{index:X,offsetInItem:Z,selectedIds:N}=K,W=J.getVirtualTotal();if(W===0)return;if(!Number.isFinite(X)||!Number.isFinite(Z))return;if(J.sizeCache.getTotal()!==W){J.sizeCache.rebuild(W),J.updateCompressionMode();let _=J.getCachedCompression();J.updateContentSize(_.virtualSize)}let U=J.getCachedCompression(),A=Math.max(0,Math.min(X,W-1)),V;if(U.isCompressed){let _=J.sizeCache.getSize(A),v=_>0?Z/_:0;V=(A+v)/W*U.virtualSize}else V=J.sizeCache.getOffset(A)+Z;let O=J.state.viewportState.containerSize,D=Math.max(0,U.virtualSize-O);if(V=Math.max(0,Math.min(V,D)),J.scrollController.scrollTo(V),N&&N.length>0){let _=J.methods.get("select");if(_)_(...N)}let M=J.methods.get("loadVisibleRange");if(M)requestAnimationFrame(()=>{M()});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,f0 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,I0 as getSelectedItems,S0 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:Z1,getOwnPropertyDescriptor:U1}=Object,B1=Object.prototype.hasOwnProperty;var x2=new WeakMap,N1=(J)=>{var q=x2.get(J),Q;if(q)return q;if(q=F2({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function")Z1(J).map((j)=>!B1.call(q,j)&&F2(q,j,{get:()=>J[j],enumerable:!(Q=U1(J,j))||Q.enumerable}));return x2.set(J,q),q};var W1=(J,q)=>{for(var Q in q)F2(J,Q,{get:q[Q],enumerable:!0,configurable:!0,set:(j)=>q[Q]=()=>j})};var m2=(J,q)=>()=>(J&&(q=J(J=0)),q);var D1=(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}},_1=(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,_=Q-1;while(N<_){let Y=N+_+1>>>1;if(j[Y]<=U)N=Y;else _=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}},y0=(J,q)=>{if(typeof J==="number")return D1(J,q);return _1(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)},b2=(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 T2=200,w0=50,XJ=5,YJ=2,KJ=50,H0=16000000,ZJ="x",UJ=20,H2="_isPlaceholder",BJ="__placeholder_";var L0=(J,q)=>{let Q=q.getTotalSize(),j=Q>H0,K=j?H0: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,_=J/U*j,Y=Math.floor(_),W=u0(Q,Math.max(0,Y),q,j),E=Math.ceil(_)+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),E=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,E)),X},NJ=(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},S0=(J,q,Q,j,K,X,U)=>{if(!X.isCompressed||j===0)return Q.getOffset(J);let{virtualSize:N}=X,_=N-K,Y=_-q;if(Y<=K&&Y>=-1){if(q>=_-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),F=Q.getOffset(J)-b2(Q,B,j);return F+(L-F)*y}let W=q/N,E=Q.getTotalSize(),M=W*E;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 _=K.virtualSize-Q;return Math.max(0,Math.min(U,_))},WJ=(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)},DJ=(J,q)=>{if(typeof q==="number")return J*q>H0;return q.getTotalSize()>H0},_J=(J)=>{if(J<=0)return 0;return Math.floor(H0/J)},VJ=(J,q)=>{let Q=L0(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 P0=(J)=>{return J!==null&&typeof J==="object"&&J.__groupHeader===!0};var SJ={};W1(SJ,{createGridRenderer:()=>d0});var P1=(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}}},k1=2,d0=(J,q,Q,j,K,X,U,N,_=!1)=>{let Y=P1(),W=new Map,E=X,M=!1,H=null,V=0,A=0,B="",y=-1,L=(z)=>{if(H&&V===z)return H;return H=L0(z,Q),V=z,H},F={selected:!1,focused:!1},O=(z,u)=>{return F.selected=z,F.focused=u,F},D=`${K}-item ${K}-grid-item`,$=`${K}-item--selected`,I=`${K}-item--focused`,C=(z,u)=>{if(typeof u==="string")z.innerHTML=u;else z.replaceChildren(u)},G=(z,u,a)=>{z.classList.toggle($,u),z.classList.toggle(I,a)},p=(z,u)=>{let a=j.getRow(z);if(u){let n=u.totalItems,f=L(n);if(f.isCompressed)return S0(a,u.scrollPosition,Q,n,u.containerSize,f,u.rangeStart)}return Q.getOffset(a)},t=(z,u)=>{let a=M&&j.getCol(z)===0,n=a?0:j.getCol(z),f=a?0:j.getColumnOffset(n,E),x;if(M){let l=j.getRow(z),i=0,o=new Set;for(let Y0=0;Y0<z;Y0++){let U0=j.getRow(Y0);if(U0<l&&!o.has(U0)){let g=Q.getSize(Y0);i+=g,o.add(U0)}}x=i}else x=p(z,u);if(_)return`translate(${Math.round(x)}px, ${Math.round(f)}px)`;return`translate(${Math.round(f)}px, ${Math.round(x)}px)`},w=(z,u)=>{z.style.transform=u},h=(z,u)=>{let a=z.dataset.id?.startsWith("__group_header"),n=a?E:j.getColumnWidth(E),f;if(M||a)f=Q.getSize(u)-j.gap;else{let x=j.getRow(u);f=Q.getSize(x)-j.gap}if(_)z.style.width=`${f}px`,z.style.height=`${n}px`;else z.style.width=`${n}px`,z.style.height=`${f}px`},Z=(z,u,a,n,f)=>{let x=Y.acquire(),l=O(a,n);if(x.className=D,x.dataset.index=String(z),x.dataset.id=String(u.id),x.dataset.row=String(j.getRow(z)),x.dataset.col=String(j.getCol(z)),x.ariaSelected=String(a),N)x.id=`${N}-item-${z}`;if(U){let o=U();if(o!==y)y=o,B=String(o);x.setAttribute("aria-setsize",B),x.setAttribute("aria-posinset",String(z+1))}h(x,z);let i=q(u,z,l);return C(x,i),G(x,a,n),w(x,f),{element:x,lastItemId:u.id,lastSelected:a,lastFocused:n,lastTransform:f,lastSeenFrame:A}},R=(z,u,a,n,f)=>{if(A++,u.start===0&&z.length>0)M=P0(z[0]);for(let[i,o]of W)if(i>=u.start&&i<=u.end)o.lastSeenFrame=A;else if(A-o.lastSeenFrame>k1)Y.release(o.element),W.delete(i);let x=!1;if(U){let i=U();if(i!==y)y=i,B=String(i),x=!0}let l=null;for(let i=u.start;i<=u.end;i++){let o=i-u.start,Y0=z[o];if(!Y0){console.warn(`⚠️ RENDER: Missing item at index ${i} (range: ${u.start}-${u.end}, items.length: ${z.length})`);continue}let U0=a.has(Y0.id),g=i===n,d=W.get(i);if(d){let Q0=d.lastItemId!==Y0.id,q0=d.lastSelected!==U0,B0=d.lastFocused!==g;if(Q0||q0||B0){if(Q0){let A0=O(U0,g),E0=q(Y0,i,A0);C(d.element,E0),d.element.dataset.id=String(Y0.id),d.element.dataset.row=String(j.getRow(i)),d.element.dataset.col=String(j.getCol(i)),h(d.element,i)}G(d.element,U0,g),d.element.ariaSelected=String(U0),d.lastItemId=Y0.id,d.lastSelected=U0,d.lastFocused=g}let Z0=t(i,f);if(d.lastTransform!==Z0)w(d.element,Z0),d.lastTransform=Z0;if(x)d.element.setAttribute("aria-setsize",B)}else{let Q0=t(i,f),q0=Z(i,Y0,U0,g,Q0);if(!l)l=document.createDocumentFragment();l.appendChild(q0.element),W.set(i,q0)}}if(l)J.appendChild(l)},v=(z)=>{for(let[u,a]of W){let n=t(u,z);if(a.lastTransform!==n)w(a.element,n),a.lastTransform=n}},T=(z,u,a,n)=>{let f=W.get(z);if(!f)return;let x=f.lastItemId!==u.id,l=f.lastSelected!==a,i=f.lastFocused!==n;if(x||l||i){let o=O(a,n),Y0=q(u,z,o);C(f.element,Y0),G(f.element,a,n),f.element.dataset.id=String(u.id),f.element.ariaSelected=String(a),h(f.element,z),f.lastItemId=u.id,f.lastSelected=a,f.lastFocused=n}},P=(z,u,a)=>{let n=W.get(z);if(!n)return;let f=n.lastSelected!==u,x=n.lastFocused!==a;if(f||x)G(n.element,u,a),n.lastSelected=u,n.lastFocused=a},k=(z)=>{return W.get(z)?.element},S=(z)=>{if(Math.abs(z-E)<1)return;E=z;for(let[u,a]of W){h(a.element,u);let n=t(u);w(a.element,n),a.lastTransform=n}},c=()=>{for(let[,z]of W)Y.release(z.element);W.clear()};return{render:R,updatePositions:v,updateItem:T,updateItemClasses:P,getElement:k,updateContainerWidth:S,clear:c,destroy:()=>{c(),Y.clear()}}};var N2=m2(()=>{Q2()});var d2=2,c2=(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}},L2=(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,_=Q-U.time;J.velocity=_>0?Math.abs(N)/_: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=y0(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=y0(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,_)=>{if(!J[N])J[N]=new Set;return J[N].add(_),()=>Q(N,_)},Q=(N,_)=>{J[N]?.delete(_)};return{on:q,off:Q,emit:(N,_)=>{J[N]?.forEach((Y)=>{try{Y(_)}catch(W){console.error(`[vlist] Error in event handler for "${String(N)}":`,W)}})},once:(N,_)=>{let Y=(W)=>{Q(N,Y),_(W)};return q(N,Y)},clear:(N)=>{if(N)delete J[N];else for(let _ in J)delete J[_]},listenerCount:(N)=>{return J[N]?.size??0}}};var l2=(J)=>{if(typeof J==="string"){let q=document.querySelector(J);if(!q)throw Error(`[vlist/builder] Container not found: ${J}`);return q}return J},r2=(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 a2=(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 s2=(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))},n2=(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)},o2=(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),_=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,_))};var y2=(J)=>J<0.5?2*J*J:-1+(4-2*J)*J,z0=(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}},i2=(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 _=performance.now(),Y=(W)=>{let E=W-_,M=Math.min(E/N,1),H=X+(U-X)*y2(M);if(J.scrollTo(H),q(),M<1)Q=requestAnimationFrame(Y);else Q=null};Q=requestAnimationFrame(Y)},cancelScroll:j}};var t2=(J,q)=>{let{dom:Q,emitter:j,resolvedConfig:K,rawConfig:X,rendered:U,pool:N,sharedState:_,isHorizontal:Y,classPrefix:W,contentSizeHandlers:E,afterScroll:M,clickHandlers:H,keydownHandlers:V,resizeHandlers:A,destroyHandlers:B,methods:y,onScrollFrame:L,resizeObserver:F,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:(D,$,I,C,G)=>{J.ss=I,J.fi=C,J.ffn()},updateItemClasses:(D,$,I)=>{let C=U.get(D);if(!C)return;C.element.classList.toggle(`${W}-item--selected`,$),C.element.classList.toggle(`${W}-item--focused`,I),C.element.ariaSelected=$?"true":"false",C.lastSelected=$,C.lastFocused=I},updatePositions:()=>{},updateItem:()=>{},getElement:(D)=>U.get(D)?.element??null,clear:()=>{},destroy:()=>{}}},set renderer(D){},get dataManager(){return J.dm},set dataManager(D){J.dm=D},get scrollController(){return J.sc},set scrollController(D){J.sc=D},state:_,getContainerWidth(){return J.cw},afterScroll:M,clickHandlers:H,keydownHandlers:V,resizeHandlers:A,contentSizeHandlers:E,destroyHandlers:B,methods:y,replaceTemplate(D){J.at=D},replaceRenderer(D){},replaceDataManager(D){J.dm=D},replaceScrollController(D){J.sc=D},getItemsForRange(D){let{dm:$,it:I}=J,C=[];for(let G=D.start;G<=D.end;G++){let p=$?$.getItem(G):I[G];if(p)C.push(p)}return C},getAllLoadedItems(){let D=J.dm;if(D){let $=D.getTotal(),I=[];for(let C=0;C<$;C++){let G=D.getItem(C);if(G)I.push(G)}return I}return[...J.it]},getVirtualTotal(){return J.vtf()},getCachedCompression(){let D=J.hc;return{isCompressed:!1,actualSize:D.getTotalSize(),virtualSize:D.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[,D]of U)D.element.remove(),N.release(D.element);U.clear()},getRenderFns(){return{renderIfNeeded:J.rfn,forceRender:J.ffn}},setRenderFns(D,$){J.rfn=D,J.ffn=$},setVirtualTotalFn(D){J.vtf=D},rebuildSizeCache(D){J.hc.rebuild(D??J.vtf())},setSizeConfig(D){J.hc=y0(D,J.vtf())},updateContentSize(D){let $=`${D}px`;if(Y)Q.content.style.width=$;else Q.content.style.height=$},updateCompressionMode(){},setVisibleRangeFn(D){J.gvr=D},setScrollToPosFn(D){J.gsp=D},setPositionElementFn(D){J.pef=D},setScrollFns(D,$){J.sgt=D,J.sst=(I)=>{$(I),L()}},setScrollTarget(D){J.st.removeEventListener("scroll",L),J.st=D,J.st.addEventListener("scroll",L,{passive:!0})},getScrollTarget(){return J.st},setContainerDimensions(D){J.gcw=D.width,J.gch=D.height,J.cw=D.width(),J.ch=D.height(),_.viewportState.containerSize=Y?J.cw:J.ch},disableViewportResize(){if(J.vre)J.vre=!1,F.unobserve(Q.viewport)},disableWheelHandler(){if(J.wh)Q.viewport.removeEventListener("wheel",J.wh),J.wh=null}}},e2=(J,q,Q)=>{let{rendered:j,itemState:K,contentSizeHandlers:X,applyTemplate:U,updateContentSize:N}=q,_=()=>{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 E=J.it,M=[],H=Math.max(0,Y),V=Math.min(W,E.length-1);for(let A=H;A<=V;A++)M.push(E[A]);return M},setTotal:(Y)=>{},setItems:(Y,W=0,E)=>{let M=J.it;if(W===0&&(E!==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)_()},updateItem:(Y,W)=>{let E=J.it;if(Y<0||Y>=E.length)return!1;let M=E[Y];if(!M)return!1;E[Y]={...M,...W};let H=j.get(Y);if(H)U(H.element,J.at(E[Y],Y,K)),H.element.dataset.id=String(E[Y].id),H.lastItemId=E[Y].id;return!0},removeItem:(Y)=>{if(Y<0||Y>=J.it.length)return!1;if(J.it.splice(Y,1),J.ii)_();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()}}},JJ=(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 V1=3,G1="vlist",QJ=150,jJ=2,M1=0,qJ=(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,_={use(Y){if(N)throw Error("[vlist/builder] Cannot call .use() after .build()");return U.set(Y.name,Y),_},build(){if(N)throw Error("[vlist/builder] .build() can only be called once");return N=!0,O1(J,U,q,K,X??null)}};return _};function O1(J,q,Q,j,K){let{item:X,items:U,overscan:N=V1,classPrefix:_=G1,ariaLabel:Y,reverse:W=!1,scroll:E}=J,M=E,H=M?.wheel??!0,V=M?.wrap??!1,A=W,B=`${_}-${M1++}`,y=j??K,L=j==null&&K!=null,F=/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,D={overscan:N,classPrefix:_,reverse:A,wrap:V,horizontal:Q,ariaIdPrefix:B},$=Array.from(q.values()).sort((b,m)=>(b.priority??50)-(m.priority??50)),I=new Set($.map((b)=>b.name));for(let b of $)if(b.conflicts){for(let m of b.conflicts)if(I.has(m))throw Error(`[vlist/builder] ${b.name} and ${m} cannot be combined`)}if(A){if(I.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with reverse: true")}let C=l2(J.container),G=r2(C,_,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(`${_}-viewport--no-scrollbar`);let p=t0(),t=U||[],w=L?i0(K,t.length):y0(y,t.length),h=a2(),Z={it:t,hc:w,ch:G.viewport.clientHeight,cw:G.viewport.clientWidth,id:!1,ii:!1,ls:0,vt:c2(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 m=Z.hc.getTotalSize();return Z.ls+Z.ch>=m-b},sic:!1,rfn:null,ffn:null,gvr:(b,m,e,r,s)=>{s2(b,m,e,r,s)},gsp:(b,m,e,r,s)=>{return o2(b,m,e,r,s)},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 R=null,v=null,T=!1,P={start:0,end:0},k={start:0,end:0},S={start:-1,end:-1},c={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},j0=new Map,z=0,u=`${_}-item--selected`,a=`${_}-item--focused`,n=`${_}-item--placeholder`,f=`${_}-item--replaced`,x=L?new WeakMap:null,l=L?w:null,i=null,o=0,Y0=!1,U0=()=>{if(!L)return;if(Y0){let b=Z.sgt(),m=Q?G.viewport.scrollWidth-G.viewport.clientWidth:G.viewport.scrollHeight-G.viewport.clientHeight,e=m>0&&b>=m-2;if(G0(),Y0=!1,e){let r=Math.max(0,Z.hc.getTotalSize()-(Q?Z.cw:Z.ch));if(r>b)Z.sst(r),Z.ls=r,Z.rfn()}}};if(L&&l&&x)i=new ResizeObserver((b)=>{if(Z.id)return;let m=!1,e=P.start;for(let r of b){let s=x.get(r.target);if(s===void 0)continue;let X0=Q?r.borderBoxSize[0].inlineSize:r.borderBoxSize[0].blockSize;if(!l.isMeasured(s)){let W0=l.getSize(s);if(l.setMeasuredSize(s,X0),m=!0,s<e&&X0!==W0)o+=X0-W0;i.unobserve(r.target);let O0=r.target;if(Q)O0.style.width=`${X0}px`;else O0.style.height=`${X0}px`}}if(!m)return;if(l.rebuild(Z.vtf()),Z.hc=l,o!==0){let r=Z.sgt();Z.sst(r+o),Z.ls=r+o,o=0}if(T)Y0=!0;else{let r=Z.sgt(),s=Q?G.viewport.scrollWidth-G.viewport.clientWidth:G.viewport.scrollHeight-G.viewport.clientHeight,X0=s>0&&r>=s-2;if(G0(),Y0=!1,X0){let W0=Math.max(0,Z.hc.getTotalSize()-(Q?Z.cw:Z.ch));if(W0>r)Z.sst(W0),Z.ls=W0}}S.start=-1,S.end=-1,Z.rfn()});let g={selected:!1,focused:!1},d=`${_}-item`,Q0=[],q0=[],B0=[],Z0=[],A0=[],E0=[],J0=new Map,b0=(b,m)=>{if(typeof m==="string")b.innerHTML=m;else b.replaceChildren(m)},T0=(b,m)=>{let e=Math.round(Z.hc.getOffset(m));if(Q)b.style.transform=`translateX(${e}px)`;else b.style.transform=`translateY(${e}px)`};Z.pef=T0;let D0=(b,m,e,r)=>{let s=h.acquire();s.className=d;let X0=!L||l&&l.isMeasured(b);if(Q){if(X0)s.style.width=`${Z.hc.getSize(b)}px`;else s.style.width="";if(O!=null)s.style.height=`${O}px`}else if(X0)s.style.height=`${Z.hc.getSize(b)}px`;else s.style.height="";if(s.dataset.index=String(b),s.dataset.id=String(m.id),s.ariaSelected=e?"true":"false",s.id=`${B}-item-${b}`,Z.la=String(Z.vtf()),s.setAttribute("aria-setsize",Z.la),s.setAttribute("aria-posinset",String(b+1)),String(m.id).startsWith("__placeholder_"))s.classList.add(n);if(e)s.classList.add(u);if(r)s.classList.add(a);b0(s,Z.at(m,b,g));let O0=Math.round(Z.hc.getOffset(b));if(Q)s.style.transform=`translateX(${O0}px)`;else s.style.transform=`translateY(${O0}px)`;return{element:s,lastItemId:m.id,lastSelected:e,lastFocused:r,lastOffset:O0,lastSeenFrame:z}},G0=()=>{let b=`${Z.hc.getTotalSize()}px`;if(Q)G.content.style.width=b;else G.content.style.height=b},_0=null,F0=null,R0=!1,xJ=()=>{if(R0)return;R0=!0,_0=J0.get("_getSelectedIds")??null,F0=J0.get("_getFocusedIndex")??null},mJ=()=>{if(Z.id)return;z++;let b=Z.vtf(),m=Q?Z.cw:Z.ch;Z.gvr(Z.ls,m,Z.hc,b,P),n2(P,N,b,k);for(let[K0,V0]of j0)if(K0>=k.start&&K0<=k.end)V0.lastSeenFrame=z;else if(z-V0.lastSeenFrame>jJ)V0.element.remove(),h.release(V0.element),j0.delete(K0);if(k.start===S.start&&k.end===S.end){if(Z.sic){for(let[K0,V0]of j0)if(K0>=k.start&&K0<=k.end)Z.pef(V0.element,K0)}return}let e=String(b),r=e!==Z.la;Z.la=e;let s=null,X0=null;xJ();let W0=_0?_0():Z.ss,O0=F0?F0():Z.fi;for(let K0=k.start;K0<=k.end;K0++){let V0=Z.dm?Z.dm.getItem(K0):Z.it[K0];if(!V0)continue;let p0=W0.has(V0.id),n0=K0===O0,N0=j0.get(K0);if(N0){let v0=N0.lastItemId!==V0.id,q1=N0.lastSelected!==p0,X1=N0.lastFocused!==n0;if(v0){let Y1=String(N0.lastItemId),h2=String(V0.id),K1=Y1.startsWith("__placeholder_"),u2=h2.startsWith("__placeholder_");b0(N0.element,Z.at(V0,K0,g)),N0.element.dataset.id=h2;let g2=!L||l&&l.isMeasured(K0);if(Q)N0.element.style.width=g2?`${Z.hc.getSize(K0)}px`:"";else N0.element.style.height=g2?`${Z.hc.getSize(K0)}px`:"";if(N0.element.classList.toggle(n,u2),K1&&!u2)N0.element.classList.add(f),setTimeout(()=>{N0.element.classList.remove(f)},300);N0.lastItemId=V0.id}if(v0||q1||X1)N0.element.classList.toggle(u,p0),N0.element.classList.toggle(a,n0),N0.element.ariaSelected=p0?"true":"false",N0.lastSelected=p0,N0.lastFocused=n0;let p2=Math.round(Z.hc.getOffset(K0));if(N0.lastOffset!==p2)Z.pef(N0.element,K0),N0.lastOffset=p2;if(r)N0.element.setAttribute("aria-setsize",Z.la)}else{let v0=D0(K0,V0,p0,n0);if(L){if(!X0)X0=[];X0.push({index:K0,element:v0.element})}if(!s)s=document.createDocumentFragment();s.appendChild(v0.element),j0.set(K0,v0)}}if(s)G.items.appendChild(s);if(X0&&i&&l&&x){for(let{index:K0,element:V0}of X0)if(!l.isMeasured(K0))x.set(V0,K0),i.observe(V0)}S.start=k.start,S.end=k.end,c.lastRenderRange.start=k.start,c.lastRenderRange.end=k.end,c.viewportState.scrollPosition=Z.ls,c.viewportState.visibleRange.start=P.start,c.viewportState.visibleRange.end=P.end,c.viewportState.renderRange.start=k.start,c.viewportState.renderRange.end=k.end,p.emit("range:change",{range:{start:k.start,end:k.end}})},dJ=()=>{S.start=-1,S.end=-1,z+=jJ+1,Z.rfn()};Z.rfn=mJ,Z.ffn=dJ;let O2=()=>{if(Z.id)return;let b=Z.sgt(),m=b>=Z.ls?"down":"up";if(Z.vt=L2(Z.vt,b),!G.root.classList.contains(`${_}--scrolling`))G.root.classList.add(`${_}--scrolling`);T=!0,Z.ls=b,Z.rfn(),p.emit("scroll",{scrollPosition:b,direction:m}),p.emit("velocity:change",{velocity:Z.vt.velocity,reliable:Z.vt.sampleCount>=d2});for(let e=0;e<Q0.length;e++)Q0[e](b,m);if(v)clearTimeout(v);v=setTimeout(()=>{G.root.classList.remove(`${_}--scrolling`),T=!1,Z.vt.velocity=0,Z.vt.sampleCount=0,p.emit("velocity:change",{velocity:0,reliable:!1}),U0()},M?.idleTimeout??QJ)},C0=null;if(Z.st.addEventListener("scroll",O2,{passive:!0}),H&&!Q&&!F)C0=(b)=>{b.preventDefault();let m=Z.sgt(),e=b.deltaY,r=Math.max(0,Math.min(m+e,Z.hc.getTotalSize()-Z.ch));Z.sst(r),Z.ls=r,Z.vt=L2(Z.vt,r),Z.rfn();let s=r>=m?"down":"up";if(p.emit("scroll",{scrollPosition:r,direction:s}),!G.root.classList.contains(`${_}--scrolling`))G.root.classList.add(`${_}--scrolling`);if(T=!0,v)clearTimeout(v);v=setTimeout(()=>{G.root.classList.remove(`${_}--scrolling`),T=!1,Z.vt.velocity=0,Z.vt.sampleCount=0,p.emit("velocity:change",{velocity:0,reliable:!1}),U0()},M?.idleTimeout??QJ)},Z.wh=C0,G.viewport.addEventListener("wheel",C0,{passive:!1});else if(Q&&H)C0=(b)=>{if(b.deltaX)return;b.preventDefault(),G.viewport.scrollLeft+=b.deltaY},Z.wh=C0,G.viewport.addEventListener("wheel",C0,{passive:!1});let w2=(b)=>{let e=b.target.closest("[data-index]");if(e){let r=parseInt(e.dataset.index??"-1",10);if(r>=0){let s=Z.dm?.getItem(r)??Z.it[r];if(s){if(s.__groupHeader)return;p.emit("item:click",{item:s,index:r,event:b})}}}for(let r=0;r<q0.length;r++)q0[r](b)},cJ=(b)=>{let e=b.target.closest("[data-index]");if(e){let r=parseInt(e.dataset.index??"-1",10);if(r>=0){let s=Z.dm?.getItem(r)??Z.it[r];if(s){if(s.__groupHeader)return;p.emit("item:dblclick",{item:s,index:r,event:b})}}}},S2=(b)=>{for(let m=0;m<B0.length;m++)B0[m](b)};G.items.addEventListener("click",w2),G.items.addEventListener("dblclick",cJ),G.root.addEventListener("keydown",S2);let A2=new ResizeObserver((b)=>{if(Z.id)return;for(let m of b){let e=m.contentRect.height,r=m.contentRect.width,s=Q?r:e,X0=Q?Z.cw:Z.ch;if(Z.cw=r,Z.ch=e,Math.abs(s-X0)>1){if(c.viewportState.containerSize=s,Z.ii)G0(),Z.rfn(),p.emit("resize",{height:e,width:r})}if(Z.ii)for(let W0=0;W0<Z0.length;W0++)Z0[W0](r,e)}});if(Z.vre)A2.observe(G.viewport);let E2={dom:G,emitter:p,resolvedConfig:D,rawConfig:J,rendered:j0,pool:h,itemState:g,sharedState:c,renderRange:k,isHorizontal:Q,classPrefix:_,contentSizeHandlers:A0,afterScroll:Q0,clickHandlers:q0,keydownHandlers:B0,resizeHandlers:Z0,destroyHandlers:E0,methods:J0,onScrollFrame:O2,resizeObserver:A2,applyTemplate:b0,updateContentSize:G0},M0=t2(Z,E2);Z.dm=e2(Z,E2,M0),Z.sc=JJ(Z,E2);let f2=new Map;for(let b of $)if(b.methods)for(let m of b.methods){let e=f2.get(m);if(e)throw Error(`[vlist/builder] Method "${m}" is registered by both "${e}" and "${b.name}"`);f2.set(m,b.name)}for(let b of $)b.setup(M0);if(Z.ii=!0,M0.state.isInitialized=!0,G0(),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 lJ=(b)=>{M0.dataManager.setItems(b,0,b.length)},rJ=A?(b)=>{let m=Z.sab(2),e=Z.it.length;if(M0.dataManager.setItems(b,e),m&&Z.it.length>0){let r=Z.gsp(Z.it.length-1,Z.hc,Z.ch,Z.it.length,"end");Z.sst(r),Z.ls=r,Z.rfn()}}:(b)=>{let m=Z.it.length;M0.dataManager.setItems(b,m)},aJ=A?(b)=>{let m=Z.sgt(),e=Z.hc.getTotalSize(),r=[...Z.it];M0.dataManager.clear(),M0.dataManager.setItems([...b,...r],0);let X0=Z.hc.getTotalSize()-e;if(X0>0)Z.sst(m+X0),Z.ls=m+X0}:(b)=>{let m=[...Z.it];M0.dataManager.clear(),M0.dataManager.setItems([...b,...m],0)},sJ=(b,m)=>{M0.dataManager.updateItem(b,m)},nJ=(b)=>{M0.dataManager.removeItem(b)},oJ=async()=>{if(M0.dataManager.reload)await M0.dataManager.reload()},s0=()=>{if(R!==null)cancelAnimationFrame(R),R=null},iJ=(b,m,e)=>{if(s0(),Math.abs(m-b)<1){Z.sst(m),Z.ls=m,Z.rfn();return}let r=performance.now(),s=(X0)=>{let W0=X0-r,O0=Math.min(W0/e,1),K0=b+(m-b)*y2(O0);if(Z.sst(K0),Z.ls=K0,Z.rfn(),O0<1)R=requestAnimationFrame(s);else R=null};R=requestAnimationFrame(s)},tJ=(b,m)=>{let{align:e,behavior:r,duration:s}=z0(m),X0=Z.vtf(),W0=b;if(V&&X0>0)W0=(W0%X0+X0)%X0;let O0=Z.gsp(W0,Z.hc,Z.ch,X0,e);if(r==="smooth")iJ(Z.sgt(),O0,s);else s0(),Z.sst(O0)},eJ=()=>Z.sgt(),J1=(b,m)=>{return p.on(b,m)},Q1=(b,m)=>{p.off(b,m)},j1=()=>{if(Z.id)return;if(Z.id=!0,M0.state.isDestroyed=!0,G.items.removeEventListener("click",w2),G.root.removeEventListener("keydown",S2),Z.st.removeEventListener("scroll",O2),A2.disconnect(),i)i.disconnect(),i=null;if(Z.wh)G.viewport.removeEventListener("wheel",Z.wh);if(v)clearTimeout(v);for(let b=0;b<E0.length;b++)E0[b]();for(let b of $)if(b.destroy)b.destroy();s0();for(let[,b]of j0)b.element.remove(),h.release(b.element);j0.clear(),h.clear(),p.clear(),G.root.remove()},I2={get element(){return G.root},get items(){if(J0.has("_getItems"))return J0.get("_getItems")();return Z.it},get total(){if(J0.has("_getTotal"))return J0.get("_getTotal")();return Z.vtf()},setItems:J0.has("setItems")?J0.get("setItems"):lJ,appendItems:J0.has("appendItems")?J0.get("appendItems"):rJ,prependItems:J0.has("prependItems")?J0.get("prependItems"):aJ,updateItem:J0.has("updateItem")?J0.get("updateItem"):sJ,removeItem:J0.has("removeItem")?J0.get("removeItem"):nJ,reload:J0.has("reload")?J0.get("reload"):oJ,scrollToIndex:J0.has("scrollToIndex")?J0.get("scrollToIndex"):tJ,cancelScroll:J0.has("cancelScroll")?J0.get("cancelScroll"):s0,getScrollPosition:J0.has("getScrollPosition")?J0.get("getScrollPosition"):eJ,on:J1,off:Q1,destroy:j1};for(let[b,m]of J0){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;I2[b]=m}return I2}Q2();var f0=(J,q,Q={},j="vlist",K=!1)=>{let{autoHide:X=!0,autoHideDelay:U=1000,minThumbSize:N=30,showOnHover:_=!0,hoverZoneWidth:Y=16,showOnViewportEnter:W=!0}=Q,E=0,M=0,H=0,V=0,A=!1,B=!1,y=0,L=0,F=0,O=null,D=!1,$=null,I=null,C=K?"width":"height",G=K?"translateX":"translateY",p=K?(o)=>o.clientX:(o)=>o.clientY,t=K?"left":"top",w=document.createElement("div"),h=document.createElement("div"),Z=_?document.createElement("div"):null,R=()=>{if(w.className=`${j}-scrollbar`,h.className=`${j}-scrollbar-thumb`,K)w.classList.add(`${j}-scrollbar--horizontal`);if(w.appendChild(h),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)}},v=()=>{if(O)clearTimeout(O),O=null},T=()=>{if(!X)return;v(),O=setTimeout(k,U)},P=()=>{if(E<=M)return;if(v(),!D)w.classList.add(`${j}-scrollbar--visible`),D=!0;if(X&&!A&&!B)T()},k=()=>{if(A||B)return;w.classList.remove(`${j}-scrollbar--visible`),D=!1},S=(o,Y0)=>{E=o,M=Y0;let U0=E>M;if(w.style.display=U0?"":"none",!U0){k();return}let g=M/E;H=Math.max(N,g*M),h.style[C]=`${H}px`,V=M-H,c(F)},c=(o)=>{if(F=o,E<=M||V<=0)return;let Y0=E-M,g=Math.min(1,Math.max(0,o/Y0))*V;h.style.transform=`${G}(${g}px)`},j0=(o)=>{if(o.target===h)return;let Y0=w.getBoundingClientRect(),d=p(o)-Y0[t]-H/2,q0=Math.max(0,Math.min(d,V))/V,B0=E-M,Z0=q0*B0;q(Z0),P()},z=(o)=>{o.preventDefault(),o.stopPropagation(),A=!0,y=p(o),L=F,v(),w.classList.add(`${j}-scrollbar--dragging`),document.addEventListener("mousemove",u),document.addEventListener("mouseup",a)},u=(o)=>{if(!A)return;let Y0=p(o)-y,U0=V>0?Y0/V:0,g=E-M,d=U0*g,Q0=Math.max(0,Math.min(L+d,g)),B0=Q0/g*V;if(h.style.transform=`${G}(${B0}px)`,I=Q0,$===null)$=requestAnimationFrame(()=>{if(I!==null)q(I);$=null})},a=()=>{if(A=!1,$!==null)cancelAnimationFrame($),$=null;if(I!==null)q(I),I=null;if(w.classList.remove(`${j}-scrollbar--dragging`),X&&!B)T();document.removeEventListener("mousemove",u),document.removeEventListener("mouseup",a)},n=()=>{if(W)P()},f=()=>{if(!A){if(B=!1,X)T()}},x=()=>{B=!0,v(),P()},l=()=>{if(B=!1,!A&&X)T()},i=()=>{if(v(),$!==null)cancelAnimationFrame($),$=null;if(w.removeEventListener("click",j0),w.removeEventListener("mouseenter",x),w.removeEventListener("mouseleave",l),h.removeEventListener("mousedown",z),J.removeEventListener("mouseenter",n),J.removeEventListener("mouseleave",f),document.removeEventListener("mousemove",u),document.removeEventListener("mouseup",a),Z){if(Z.removeEventListener("mouseenter",x),Z.removeEventListener("mouseleave",l),Z.parentNode)Z.parentNode.removeChild(Z)}if(w.parentNode)w.parentNode.removeChild(w)};if(R(),w.addEventListener("click",j0),w.addEventListener("mouseenter",x),w.addEventListener("mouseleave",l),h.addEventListener("mousedown",z),J.addEventListener("mouseenter",n),J.addEventListener("mouseleave",f),Z)Z.addEventListener("mouseenter",x),Z.addEventListener("mouseleave",l);return{show:P,hide:k,updateBounds:S,updatePosition:c,isVisible:()=>D,destroy:i}};var GJ=(J)=>{let q=null;return{name:"withScrollbar",priority:30,setup(Q){let{dom:j,config:K}=Q,{classPrefix:X,horizontal:U}=K;if(q=f0(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 _=q;Q.afterScroll.push((Y,W)=>{_.updatePosition(Y),_.show()}),Q.resizeHandlers.push((Y,W)=>{if(_){let E=Q.getCachedCompression();_.updateBounds(E.virtualSize,Q.state.viewportState.containerSize)}}),Q.contentSizeHandlers.push(()=>{if(_){let Y=Q.getCachedCompression();_.updateBounds(Y.virtualSize,Q.state.viewportState.containerSize)}}),Q.destroyHandlers.push(()=>{if(_)_.destroy()})},destroy(){if(q)q.destroy(),q=null}}};var MJ=(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,_=Q-U.time;J.velocity=_>0?N/_:0}return J.lastPosition=q,J.lastTime=Q,J},A1=(J)=>J.sampleCount>=3,OJ=(J,q={})=>{let{wheel:Q=!0,sensitivity:j=1,smoothing:K=!1,idleTimeout:X=150,onScroll:U,onIdle:N,scrollElement:_,horizontal:Y=!1}=q,W=!!_,E=0,M=0,H=W?Y?window.innerWidth:window.innerHeight:Y?J.clientWidth:J.clientHeight,V=q.compressed??!1,A=q.compression,B=MJ(),y=!1,L=null,O=q2(()=>{let f=Y?J.scrollLeft:J.scrollTop,x=f>=E?"down":"up";if(B=j2(B,f),E=f,U)U({scrollTop:E,direction:x,velocity:B.velocity});p()}),$=q2(()=>{let f=J.getBoundingClientRect(),x=Y?Math.max(0,-f.left):Math.max(0,-f.top),l=x>=E?"down":"up";if(B=j2(B,x),E=x,!y)y=!0;if(U)U({scrollTop:E,direction:l,velocity:B.velocity});p()}),I=(f)=>{f.preventDefault()},C=(f)=>{if(f.deltaX)return;f.preventDefault(),J.scrollLeft+=f.deltaY},G=(f)=>{if(!V)return;f.preventDefault();let x=(Y?f.deltaX||f.deltaY:f.deltaY)*j,l=E+x;if(K)l=E+x*0.3;if(l=Math.max(0,Math.min(l,M)),l!==E){let o=l>=E?"down":"up";if(B=j2(B,l),E=l,!y)y=!0;if(U)U({scrollTop:E,direction:o,velocity:B.velocity});p()}},p=()=>{if(L)clearTimeout(L);L=setTimeout(()=>{if(y=!1,B=MJ(E),N)N()},X)},t=(f)=>{if(V)return;if(V=!0,A=f,M=f.virtualSize-H,W)return;if(O.cancel(),J.removeEventListener("scroll",O),!Q)J.removeEventListener("wheel",I);else if(Y)J.removeEventListener("wheel",C);if(Y)J.style.overflowX="hidden";else J.style.overflow="hidden";if(Q)J.addEventListener("wheel",G,{passive:!1});let x=Y?J.scrollLeft:J.scrollTop;if(x>0){let l=Y?A?.actualSize??J.scrollWidth:A?.actualSize??J.scrollHeight;E=x/l*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",I,{passive:!1});else if(Y)J.addEventListener("wheel",C,{passive:!1});if(A&&E>0){let x=E/M*(A.actualSize-H);if(Y)J.scrollLeft=x;else J.scrollTop=x}A=void 0},h=()=>{if(W||V)return E;return Y?J.scrollLeft:J.scrollTop},Z=(f,x=!1)=>{let l=Math.max(0,Math.min(f,M||1/0));if(W){let i=J.getBoundingClientRect();if(Y){let o=i.left+window.scrollX;window.scrollTo({left:o+l,behavior:x?"smooth":"auto"})}else{let o=i.top+window.scrollY;window.scrollTo({top:o+l,behavior:x?"smooth":"auto"})}}else if(V){if(l===E)return;let o=l>=E?"down":"up";if(B=j2(B,l),E=l,!y)y=!0;if(U)U({scrollTop:E,direction:o,velocity:B.velocity});p()}else if(Y)J.scrollTo({left:l,behavior:x?"smooth":"auto"});else J.scrollTo({top:l,behavior:x?"smooth":"auto"})},R=(f)=>{Z(h()+f)},v=()=>{return h()<=0},T=(f=0)=>{let x=h(),l=W||V?M:Y?J.scrollWidth-J.clientWidth:J.scrollHeight-J.clientHeight;return x>=l-f},P=()=>{let f=h(),x=W||V?M:Y?J.scrollWidth-J.clientWidth:J.scrollHeight-J.clientHeight;if(x<=0)return 0;return Math.min(1,Math.max(0,f/x))},k=(f)=>{if(f.compression)A=f.compression,M=A.virtualSize-H},S=()=>V,c=()=>Math.abs(B.velocity),j0=()=>A1(B),z=()=>y,u=()=>W,a=(f)=>{if(H=f,A)M=A.virtualSize-H},n=()=>{if(L)clearTimeout(L);if(W)$.cancel(),window.removeEventListener("scroll",$);else O.cancel(),J.removeEventListener("scroll",O),J.removeEventListener("wheel",G),J.removeEventListener("wheel",I),J.removeEventListener("wheel",C)};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",I,{passive:!1});else if(Y)J.addEventListener("wheel",C,{passive:!1})}return{getScrollTop:h,scrollTo:Z,scrollBy:R,isAtTop:v,isAtBottom:T,getScrollPercentage:P,getVelocity:c,isTracking:j0,isScrolling:z,updateConfig:k,enableCompression:t,disableCompression:w,isCompressed:S,isWindowMode:u,updateContainerHeight:a,destroy:n}},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 E1=0.65,F1=0.5,L1=0.95,b1=0.1,y1=5,T1=100,AJ=()=>{let J=null,q=0,Q=!1,j=0,K=null,X=0,U=0,N=null,_=[];return{name:"withScale",priority:20,setup(Y){let{dom:W,config:E}=Y,{classPrefix:M,horizontal:H}=E,V=()=>{let L=Y.getVirtualTotal(),F=L0(L,Y.sizeCache);if(F.isCompressed&&!Q){Q=!0,Y.scrollController.enableCompression(F),Y.updateContentSize(F.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)<F1)q=j,K=null;else{q+=w*E1;let Z=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize;q=Math.max(0,Math.min(q,Z)),K=requestAnimationFrame(O)}Y.scrollController.scrollTo(q)},D=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)};D.addEventListener("wheel",$,{passive:!1});let I=()=>{if(N!==null)cancelAnimationFrame(N),N=null},C=(w)=>{if(I(),K!==null)cancelAnimationFrame(K),K=null;let h=w.touches[0];if(!h)return;let Z=H?h.clientX:h.clientY;X=Z,U=q,_=[{time:performance.now(),y:Z}]},G=(w)=>{w.preventDefault();let h=w.touches[0];if(!h)return;let Z=H?h.clientX:h.clientY,R=performance.now();if(_.push({time:R,y:Z}),_.length>y1)_.shift();let v=X-Z,P=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize,k=Math.max(0,Math.min(U+v,P));q=k,j=k,Y.scrollController.scrollTo(k)},p=(w)=>{let h=performance.now(),Z=_.filter((P)=>h-P.time<T1),R=0;if(Z.length>=2){let P=Z[0],k=Z[Z.length-1],S=k.time-P.time;if(S>0)R=(P.y-k.y)/S}if(_=[],Math.abs(R)<b1)return;let v=R*16,T=()=>{if(v*=L1,Math.abs(v)<0.5){N=null;return}let k=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize,S=q+v;if(S=Math.max(0,Math.min(S,k)),S<=0&&v<0||S>=k&&v>0){q=S,j=S,Y.scrollController.scrollTo(S),N=null;return}q=S,j=S,Y.scrollController.scrollTo(S),N=requestAnimationFrame(T)};N=requestAnimationFrame(T)};if(D.addEventListener("touchstart",C,{passive:!0}),D.addEventListener("touchmove",G,{passive:!1}),D.addEventListener("touchend",p,{passive:!0}),D.addEventListener("touchcancel",p,{passive:!0}),Y.destroyHandlers.push(()=>{if(D.removeEventListener("wheel",$),D.removeEventListener("touchstart",C),D.removeEventListener("touchmove",G),D.removeEventListener("touchend",p),D.removeEventListener("touchcancel",p),I(),K!==null)cancelAnimationFrame(K),K=null}),!W.viewport.querySelector(`.${M}-scrollbar`)){if(J=f0(W.viewport,(h)=>Y.scrollController.scrollTo(h),{},M,H),!W.viewport.classList.contains(`${M}-viewport--custom-scrollbar`))W.viewport.classList.add(`${M}-viewport--custom-scrollbar`);J.updateBounds(F.virtualSize,Y.state.viewportState.containerSize);let w=J;Y.afterScroll.push((h,Z)=>{if(w)w.updatePosition(h),w.show()}),Y.resizeHandlers.push((h,Z)=>{if(w){let R=Y.getCachedCompression();w.updateBounds(R.virtualSize,Y.state.viewportState.containerSize)}})}}else if(!F.isCompressed&&Q)Q=!1,Y.scrollController.disableCompression(),Y.updateContentSize(F.actualSize);else if(F.isCompressed)Y.scrollController.updateConfig({compression:F}),Y.updateContentSize(F.virtualSize);if(J)J.updateBounds(F.virtualSize,Y.state.viewportState.containerSize);Y.state.cachedCompression={state:F,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,F,O,D,$)=>{B=null,y=null;let I=L0(D,O);e0(L,F,O,D,I,$)}),Y.setScrollToPosFn((L,F,O,D,$)=>{let I=L0(D,F);return J2(L,F,O,D,I,$)});let B=null,y=null;Y.setPositionElementFn((L,F)=>{let O=Y.getVirtualTotal(),D=L0(O,Y.sizeCache);if(D.isCompressed){let $=Y.scrollController.getScrollTop();if(B===null||F<y)y=F,B=Math.round(S0(F,$,Y.sizeCache,O,Y.state.viewportState.containerSize,D));let I=B+Y.sizeCache.getOffset(F)-Y.sizeCache.getOffset(y),C=Y.config.horizontal;L.style.transform=C?`translateX(${I}px)`:`translateY(${I}px)`}else{let $=Math.round(Y.sizeCache.getOffset(F)),I=Y.config.horizontal;L.style.transform=I?`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,_=(R)=>{let v=X.get(R);if(!v)v={items:Array(q),count:0,lastAccess:Date.now()},X.set(R,v);else v.lastAccess=Date.now();return v},Y=(R)=>{return Math.floor(R/q)},W=(R)=>{return R%q},E=()=>U,M=(R)=>{U=R},H=(R)=>{if(R<0||R>=U)return;let v=Y(R),T=X.get(v);if(!T)return;return T.items[W(R)]},V=(R)=>{if(R<0||R>=U)return!1;let v=Y(R),T=X.get(v);if(!T)return!1;return T.items[W(R)]!==void 0},A=(R,v)=>{let T=Y(R),P=_(T),k=W(R),S=P.items[k]===void 0;if(P.items[k]=v,S)P.count++,N++;if(R>=U)U=R+1},B=(R,v)=>{for(let T=0;T<v.length;T++){let P=v[T];if(P!==void 0)A(R+T,P)}},y=(R)=>{if(R<0||R>=U)return!1;let v=Y(R),T=X.get(v);if(!T)return!1;let P=W(R);if(T.items[P]===void 0)return!1;if(T.items[P]=void 0,T.count--,N--,T.count===0)X.delete(v);return!0},L=(R,v)=>{let T=[];for(let P=R;P<=v&&P<U;P++)T.push(H(P));return T},F=(R,v)=>{for(let T=R;T<=v&&T<U;T++)if(!V(T))return!1;return!0},O=()=>{let R=[],v=null,T=Array.from(X.keys()).sort((P,k)=>P-k);for(let P of T){let k=X.get(P);if(!k)continue;let S=P*q;for(let c=0;c<q;c++){let j0=S+c;if(j0>=U)break;if(k.items[c]!==void 0)if(v===null)v={start:j0,end:j0};else if(j0===v.end+1)v.end=j0;else R.push(v),v={start:j0,end:j0};else if(v!==null)R.push(v),v=null}}if(v!==null)R.push(v);return R},D=(R,v)=>{let T=[],P=null;for(let k=R;k<=v&&k<U;k++)if(!V(k))if(P===null)P={start:k,end:k};else P.end=k;else if(P!==null)T.push(P),P=null;if(P!==null)T.push(P);return T},$=(R)=>{return X.has(R)},I=(R)=>{let v=X.get(R);if(v)v.lastAccess=Date.now()},C=(R,v)=>{if(R>v||X.size===0)return;let T=Date.now(),P=Y(Math.max(0,R)),k=Y(Math.min(U-1,v));for(let S=P;S<=k;S++){let c=X.get(S);if(c)c.lastAccess=T}},G=(R,v)=>{if(N<=Q)return 0;let T=Math.max(0,R-j),P=Math.min(U-1,v+j),k=Y(T),S=Y(P),c=0,j0=[];for(let[z,u]of X)if(z<k||z>S)c+=u.count,j0.push(z),N-=u.count,X.delete(z);if(c>0&&K)K(c,j0);return c},p=()=>{if(N<=Q)return 0;let R=Array.from(X.entries()).sort(([,P],[,k])=>P.lastAccess-k.lastAccess),v=0,T=[];for(let[P,k]of R){if(N<=Q)break;v+=k.count,N-=k.count,T.push(P),X.delete(P)}if(v>0&&K)K(v,T);return v},t=()=>{return{totalItems:U,cachedItems:N,cachedChunks:X.size,chunkSize:q,maxCachedItems:Q,memoryEfficiency:U>0?1-N/U:1}},w=()=>N,h=()=>{X.clear(),N=0};return{chunkSize:q,maxCachedItems:Q,getTotal:E,setTotal:M,get:H,has:V,set:A,setRange:B,delete:y,getRange:L,isRangeLoaded:F,getLoadedRanges:O,findUnloadedRanges:D,getChunkIndex:Y,isChunkLoaded:$,touchChunk:I,touchChunksForRange:C,evictDistant:G,evictToLimit:p,getStats:t,getCachedCount:w,clear:h,reset:()=>{h(),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),_=X.start;for(let Y of N){if(Y.end<_)continue;if(Y.start>X.end)break;if(Y.start>_)U.push({start:_,end:Math.min(Y.start-1,X.end)});if(_=Y.end+1,_>X.end)break}if(_<=X.end)U.push({start:_,end:X.end});return U};var K2=(J={})=>{let{maskCharacter:q=ZJ,maxSampleSize:Q=UJ}=J,j=[],K=!1,X=0,U=(E)=>{if(K||E.length===0)return;let M=Math.min(E.length,Q);for(let H=0;H<M;H++){let V=E[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,_=(E)=>{let M={id:`${BJ}${X++}`,[H2]:!0,_index:E};if(j.length===0)return M.label=q.repeat(12),M;let H=j[E%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:_,generateRange:(E,M)=>{let H=[];for(let V=E;V<=M;V++)H.push(_(V));return H},clear:()=>{j=[],K=!1,X=0}}},$0=(J)=>{if(!J||typeof J!=="object")return!1;return J[H2]===!0},$2=(J)=>{return J.filter((q)=>!$0(q))};var $1=50,Z2=(J={})=>{let{adapter:q,initialItems:Q,initialTotal:j,storage:K,placeholder:X,pageSize:U=$1,onStateChange:N,onItemsLoaded:_,onItemsEvicted:Y}=J,W=X2({...K,onEvict:(g,d)=>{Y?.(g),D()}}),E=null,M=()=>{if(!E)E=K2(X);return E},H=new Map,V=!1,A,B=!0,y,L=[],F=0,O=new Map,D=()=>{N?.(Z())},$=()=>{H.clear();let g=W.getLoadedRanges();for(let d of g)for(let Q0=d.start;Q0<=d.end;Q0++){let q0=W.get(Q0);if(q0&&!$0(q0))H.set(q0.id,Q0)}},I=(g,d)=>{if(!$0(d))H.set(d.id,g)},C=(g)=>{H.delete(g)},G=(g,d)=>{return`${g}-${d}`},p=()=>W.getTotal(),t=()=>W.getCachedCount(),w=()=>V,h=()=>B,Z=()=>({total:W.getTotal(),cached:W.getCachedCount(),isLoading:V,pendingRanges:L,error:A,hasMore:B,cursor:y}),R=()=>W,v=()=>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},P=(g)=>{let d=H.get(g);if(d===void 0)return;return W.get(d)},k=(g)=>{return H.get(g)??-1},S=(g)=>{let d=W.get(g);return d!==void 0&&!$0(d)},c=(g,d)=>{let Q0=[],q0=W.getTotal(),B0=0,Z0=0;W.touchChunksForRange(g,Math.min(d,q0-1));for(let A0=g;A0<=d&&A0<q0;A0++){let E0=W.get(A0);if(E0!==void 0)Q0.push(E0),B0++;else Q0.push(M().generate(A0)),Z0++}return Q0},j0=(g)=>{W.setTotal(g),B=W.getCachedCount()<g,D()},z=(g,d=0,Q0)=>{if(E&&!E.hasAnalyzedStructure()&&g.length>0)E.analyzeStructure(g);for(let q0=0;q0<g.length;q0++){let B0=g[q0];if(B0!==void 0){let Z0=d+q0;W.set(Z0,B0),I(Z0,B0)}}if(Q0!==void 0)W.setTotal(Q0);else if(d+g.length>W.getTotal())W.setTotal(d+g.length);if(W.getCachedCount()>=W.getTotal()&&W.getTotal()>0)B=!1;_?.(g,d,W.getTotal()),D()},u=(g,d)=>{let Q0=H.get(g);if(Q0===void 0)return!1;let q0=W.get(Q0);if(!q0)return!1;let B0={...q0,...d};if(W.set(Q0,B0),d.id!==void 0&&d.id!==g)C(g),I(Q0,B0);return D(),!0},a=(g)=>{let d=H.get(g);if(d===void 0)return!1;W.delete(d),C(g);let Q0=W.getTotal();if(Q0>0)W.setTotal(Q0-1);return D(),!0},n=async(g,d)=>{if(!q)return;let Q0=G(g,d);if(O.has(Q0))return;let q0=W.getLoadedRanges(),B0=g0({start:g,end:d},q0,W.chunkSize);if(B0.length===0)return;let Z0=W.chunkSize,A0=[];for(let J0 of B0){let b0=Math.floor(J0.start/Z0),T0=Math.floor(J0.end/Z0);for(let D0=b0;D0<=T0;D0++){let G0=D0*Z0,_0=G0+Z0-1,F0=G(G0,_0);if(!A0.some((R0)=>R0.start===G0)&&!O.has(F0))A0.push({start:G0,end:_0})}}let E0=[];for(let J0 of B0){let b0=Math.floor(J0.start/Z0),T0=Math.floor(J0.end/Z0);for(let D0=b0;D0<=T0;D0++){let G0=D0*Z0,_0=G0+Z0-1,F0=G(G0,_0);if(O.has(F0)){let R0=O.get(F0);if(!E0.includes(R0))E0.push(R0)}}}for(let J0 of A0){let b0=G(J0.start,J0.end),T0=(async()=>{L.push(J0),V=!0,A=void 0,D();try{let D0=J0.end-J0.start+1,G0={offset:J0.start,limit:D0,cursor:void 0},_0=await q.read(G0);if(z(_0.items,J0.start,_0.total),_0.cursor)y=_0.cursor;let F0=J0.start+_0.items.length;if(F0>=F){if(F=F0,_0.hasMore!==void 0)B=_0.hasMore;else if(_0.total!==void 0)B=F0<_0.total}}catch(D0){A=D0 instanceof Error?D0:Error(String(D0))}finally{O.delete(b0),L=L.filter((D0)=>D0.start!==J0.start||D0.end!==J0.end),V=O.size>0,D()}})();O.set(b0,T0),E0.push(T0)}await Promise.all(E0)},f=async(g,d)=>{if(W.isRangeLoaded(g,d))return;await n(g,d)},x=async()=>{if(!q)return;await n(0,U-1)},l=async()=>{if(!q||V||!B)return!1;let g=W.getCachedCount(),d=W.getTotal(),Q0=g,q0=Math.min(Q0+U-1,d>0?d-1:Q0+U-1);if(Q0>=d&&d>0)return B=!1,!1;return await n(Q0,q0),W.getCachedCount()>g},i=async()=>{if(W.clear(),W.setTotal(0),H.clear(),E)E.clear();O.clear(),L=[],V=!1,y=void 0,B=!0,F=0,A=void 0,D()},o=(g,d)=>{if(W.evictDistant(g,d)>0)$()},Y0=()=>{W.clear(),H.clear(),y=void 0,A=void 0,L=[],V=!1,D()},U0=()=>{if(W.reset(),H.clear(),E)E.clear();y=void 0,B=!0,F=0,A=void 0,L=[],V=!1,D()};if(Q&&Q.length>0)z(Q,0,j??Q.length);else if(j!==void 0)W.setTotal(j),D();return{getState:Z,getTotal:p,getCached:t,getIsLoading:w,getHasMore:h,getStorage:R,getPlaceholders:v,getItem:T,getItemById:P,getIndexById:k,isItemLoaded:S,getItemsInRange:c,setTotal:j0,setItems:z,updateItem:u,removeItem:a,loadRange:n,ensureRange:f,loadInitial:x,loadMore:l,reload:i,evictDistant:o,clear:Y0,reset:U0}};var EJ=(J)=>{let{adapter:q,loading:Q,storage:j,total:K,autoLoad:X=!0}=J,U=Q?.cancelThreshold??XJ,N=Q?.preloadThreshold??YJ,_=Q?.preloadAhead??KJ;return{name:"withAsync",priority:20,methods:["reload","loadVisibleRange"],setup(Y){let{emitter:W}=Y,E=Y.config.reverse,M=Z2({adapter:q,...K!==void 0&&{initialTotal:K},pageSize:j?.chunkSize??w0,...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 D=Y.getCachedCompression();Y.state.viewportState.totalSize=D.virtualSize,Y.state.viewportState.actualSize=D.actualSize,Y.state.viewportState.isCompressed=D.isCompressed,Y.state.viewportState.compressionRatio=D.ratio,Y.updateContentSize(D.virtualSize),Y.renderIfNeeded()}},onItemsLoaded:(O,D,$)=>{if(Y.state.isInitialized)Y.forceRender(),W.emit("load:end",{items:O,total:$,offset:D})}});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((D)=>{W.emit("error",{error:D,context:"ensureRange"})})}};Y.afterScroll.push((O,D)=>{if(Y.state.isDestroyed)return;let $=Y.scrollController.getVelocity(),C=Y.scrollController.isTracking()&&$<=U;if(V&&A>U&&$<=U){let t=V;V=null,Y.dataManager.ensureRange(t.start,t.end).catch((w)=>{W.emit("error",{error:w,context:"ensureRange"})})}if(A=$,C&&!Y.dataManager.getIsLoading()&&Y.dataManager.getHasMore()){if(E){if(O<T2)W.emit("load:start",{offset:Y.dataManager.getCached(),limit:w0}),Y.dataManager.loadMore().catch((t)=>{W.emit("error",{error:t,context:"loadMore"})})}else if(Y.state.viewportState.totalSize-O-Y.state.viewportState.containerSize<T2)W.emit("load:start",{offset:Y.dataManager.getCached(),limit:w0}),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},C){V=null;let{start:t,end:w}=G,h=Y.getVirtualTotal();if($>N)if(D==="down")w=Math.min(G.end+_,h-1);else t=Math.max(G.start-_,0);Y.dataManager.ensureRange(t,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,D)=>{if(L!==null)clearTimeout(L);L=setTimeout(()=>{L=null,B()},y)}),Y.destroyHandlers.push(()=>{if(L!==null)clearTimeout(L),L=null});let F=()=>{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((D)=>{W.emit("error",{error:D,context:"ensureRange"})});B()};if(window.addEventListener("online",F),Y.destroyHandlers.push(()=>{window.removeEventListener("online",F)}),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:w0}),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:w0}),Y.dataManager.loadInitial().catch((O)=>{W.emit("error",{error:O,context:"loadInitial"})});else if(K!==void 0)Y.dataManager.setTotal(K)}}};var FJ=()=>{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 E=W.left+window.scrollX;window.scrollTo(E+Y,window.scrollY)}else{let E=W.top+window.scrollY;window.scrollTo(window.scrollX,E+Y)}}),q.setContainerDimensions({width:()=>window.innerWidth,height:()=>window.innerHeight}),j.viewportState.containerSize=window.innerHeight;let{innerHeight:U,innerWidth:N}=window,_=()=>{let{innerWidth:Y,innerHeight:W}=window,E=K.horizontal?Y:W,M=K.horizontal?N:U;if(Math.abs(E-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",_,{passive:!0}),J=()=>{window.removeEventListener("resize",_)},q.destroyHandlers.push(J)},destroy(){if(J)J(),J=null}}};var P2=(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},LJ=(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},bJ=(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 _=U-K;Q.push({key:j,groupIndex:Q.length,headerLayoutIndex:X,firstDataIndex:K,count:_}),X=X+1+_,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=bJ(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=P2(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=P2(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=LJ(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=P2(Q,M);return Q[H]},getGroupAtDataIndex:(M)=>{if(Q.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let H=LJ(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=bJ(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,_=!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],F=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 F==="string")U.innerHTML=F;else U.replaceChildren(F)},E=(B)=>{let y=q.groups;if(y.length===0){H();return}let L=Q.getOffset(y[0].headerLayoutIndex);if(B<L){H();return}let F=0,O=y.length-1;while(F<O){let G=F+O+1>>>1;if(Q.getOffset(y[G].headerLayoutIndex)<=B)F=G;else O=G-1}let D=F;if(!_)M();W(D);let $=q.getHeaderHeight(D),I=0,C=D+1;if(C<y.length){let p=Q.getOffset(y[C].headerLayoutIndex)-B;if(p<$)I=p-$}if(I!==Y)if(Y=I,I===0)U.style.transform="";else{let G=Math.round(I);U.style.transform=X?`translateX(${G}px)`:`translateY(${G}px)`}},M=()=>{if(_)return;_=!0,U.style.display=""},H=()=>{if(!_)return;_=!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,_=!1};return U.style.display="none",{update:E,refresh:V,show:M,hide:H,destroy:A}};var yJ=(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},TJ=(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},HJ=(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),_=q.getSize(U),Y=q.getTotalSize(),W=Math.max(0,Y-Q),E;switch(X){case"center":E=N-Q/2+_/2;break;case"end":E=N-Q+_;break;case"start":default:E=N;break}return Math.max(0,Math.min(E,W))},$J=(J,q,Q)=>{if(Q&&Q.isCompressed)return Q.virtualSize;return q.getTotalSize()},PJ=(J,q)=>{return q.getTotalSize()},kJ=(J,q)=>{return q.getOffset(J)},RJ=(J,q,Q)=>{let j=Math.max(0,q-Q);return Math.max(0,Math.min(J,j))};var k0=(J,q,Q,j,K="start",X,U=HJ)=>{return U(J,q,Q,j,X,K)},CJ=(J,q)=>{return J.start===q.start&&J.end===q.end},vJ=(J,q)=>{return J>=q.start&&J<=q.end},zJ=(J)=>{if(J.end<J.start)return 0;return J.end-J.start+1};var wJ=(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 fJ=(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:_}=X,{classPrefix:Y}=N,E=_.item.height;j=_.items?[..._.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,E);X.setSizeConfig(V),X.rebuildSizeCache(K.length),X.dataManager.setItems(K,0,K.length);let A=_.item.template,{headerTemplate:B}=J,y=(C,G,p)=>{if(P0(C))return B(C.groupKey,C.groupIndex);return A(C,G,p)},L=X.methods.get("_getGridLayout"),F=X.methods.get("_replaceGridRenderer"),O=X.methods.get("_updateGridLayoutForGroups");if(L&&F){if(O)O((t)=>{let w=K[t];return!!(w&&P0(w))});let{createGridRenderer:C}=(N2(),N1(SJ)),G=L(),p=C(U.items,y,X.sizeCache,G,Y,X.getContainerWidth(),()=>X.dataManager.getTotal(),N.ariaIdPrefix);F(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 C=Q;X.afterScroll.push((G,p)=>{C.update(G)}),Q.update(X.scrollController.getScrollTop())}let D=()=>{if(!q)return;q.rebuild(j.length),K=x0(j,q.groups);let C=m0(q,E);if(X.setSizeConfig(C),X.rebuildSizeCache(K.length),X.dataManager.setItems(K,0,K.length),Q)Q.refresh()};X.methods.set("setItems",(C)=>{j=C.slice(),D()}),X.methods.set("appendItems",(C)=>{j.push(...C),D()}),X.methods.set("prependItems",(C)=>{j.unshift(...C),D()}),X.methods.set("removeItem",(C)=>{j=j.filter((G)=>G.id!==C),D()});let{animateScroll:$,cancelScroll:I}=i2(X.scrollController,X.renderIfNeeded);X.methods.set("scrollToIndex",(C,G)=>{let p=q.dataToLayoutIndex(C),{align:t,behavior:w,duration:h}=z0(G),Z=X.dataManager.getTotal(),R=k0(p,X.sizeCache,X.state.viewportState.containerSize,Z,t,X.getCachedCompression());if(w==="smooth")$(X.scrollController.getScrollTop(),R,h);else I(),X.scrollController.scrollTo(R)}),X.methods.set("_getItems",()=>j),X.methods.set("_getTotal",()=>j.length),X.destroyHandlers.push(()=>{if(I(),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=_(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},_=(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 D=Math.max(0,V*q),$=Math.min(B-1,(A+1)*q-1);return{start:D,end:$}}let y=-1,L=-1,F=0,O=0;for(let D=0;D<B;D++){if(j(D)){if(O>0)F++,O=0;if(F>=V&&F<=A){if(y===-1)y=D;L=D}F++,O=0}else{if(F>=V&&F<=A){if(y===-1)y=D;L=D}if(O++,O>=q)F++,O=0}if(F>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},E=(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:_,getItemRange:Y,getItemIndex:W,getColumnWidth:E,getColumnOffset:(V,A)=>{let B=E(A);return V*(B+Q)}}};N2();var R1=new Set,IJ=(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:_}=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(),E=N.items?.some((T)=>T.__groupHeader===!0),M={columns:J.columns,gap:J.gap??0};if(E)M.isHeaderFn=(T)=>{let P=j.dataManager.getItem(T);return!!(P&&P.__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 P=B.containerWidth-2,k=(B.columns-1)*B.gap,S=(P-k)/B.columns,c={containerWidth:B.containerWidth,columns:B.columns,gap:B.gap,columnWidth:S,row:q.getRow(T),column:q.getCol(T),totalRows:q.getTotalRows(j.dataManager.getTotal()),totalColumns:B.columns};return A(T,c)+B.gap});else if(H>0)j.setSizeConfig(A+H);j.rebuildSizeCache(),K.root.classList.add(`${_}--grid`);let y=W(),L=N.item.template,F=()=>{Q=d0(K.items,L,j.sizeCache,q,_,y,()=>j.dataManager.getTotal(),U.ariaIdPrefix,U.horizontal),j.replaceRenderer(Q)};F(),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 P=j.dataManager.getTotal(),k=0;for(let S=0;S<P;S++)if(q.getCol(S)===0){let c=j.sizeCache.getSize(S);k+=c}if(j.sizeCache.getTotalSize=()=>k,U.horizontal)j.dom.content.style.width=`${k}px`;else j.dom.content.style.height=`${k}px`;F()}),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 P=W();if(B.containerWidth=P,B.columns=M.columns,B.gap=M.gap??0,Q)Q.updateContainerWidth(P);j.rebuildSizeCache(),j.updateContentSize(j.sizeCache.getTotalSize()),j.updateCompressionMode();for(let k=0;k<j.contentSizeHandlers.length;k++)j.contentSizeHandlers[k]();if(Q)Q.clear();j.forceRender()});let O=null,D=null,$=!1,I=()=>{if($)return;$=!0,O=j.methods.get("_getSelectedIds")??null,D=j.methods.get("_getFocusedIndex")??null},C=-1,G=-1,p=!0,t=U.overscan??3,w={start:0,end:0},h={start:0,end:0},Z=()=>{if(j.state.isDestroyed)return;let T=j.scrollController.getScrollTop(),P=j.state.viewportState.containerSize;if(!p&&T===C&&P===G)return;C=T,G=P,p=!1;let k=j.getVirtualTotal();if(k===0||P===0)w.start=0,w.end=0;else{w.start=Math.max(0,j.sizeCache.indexAtOffset(T));let l=j.sizeCache.indexAtOffset(T+P);if(l<k-1)l++;w.end=Math.min(k-1,Math.max(0,l))}h.start=Math.max(0,w.start-t),h.end=Math.min(k-1,w.end+t);let S=j.state.viewportState;S.scrollPosition=T,S.visibleRange.start=w.start,S.visibleRange.end=w.end,S.renderRange.start=h.start,S.renderRange.end=h.end;let c=j.state.lastRenderRange,j0=S.isCompressed,z=j.dataManager.getTotal(),u=q.getItemRange(h.start,h.end,z),a=j.dataManager.getItemsInRange(u.start,u.end),n=j0?j.getCompressionContext():void 0;I();let f=O?O():R1,x=D?D():-1;if(Q.render(a,u,f,x,n),c.start!==h.start||c.end!==h.end)c.start=h.start,c.end=h.end,X.emit("range:change",{range:{start:h.start,end:h.end}})},R=()=>{if(j.state.isDestroyed)return;j.state.lastRenderRange.start=-1,j.state.lastRenderRange.end=-1,p=!0,Z()};j.setRenderFns(Z,R);let v=typeof A==="function";if(j.resizeHandlers.push((T,P)=>{let k=Y?P:T;if(B.containerWidth=k,Q)Q.updateContainerWidth(k);if(v){j.rebuildSizeCache(),j.updateContentSize(j.sizeCache.getTotalSize()),j.updateCompressionMode();for(let S=0;S<j.contentSizeHandlers.length;S++)j.contentSizeHandlers[S]();if(Q)Q.clear();j.forceRender()}}),j.methods.set("scrollToIndex",(T,P)=>{let k=Math.floor(T/J.columns),{align:S,behavior:c}=z0(P),j0=j.dataManager.getState(),z=q.getTotalRows(j0.total),u=Math.max(0,Math.min(k,z-1)),a=k0(u,j.sizeCache,j.state.viewportState.containerSize,z,S,j.getCachedCompression());if(c==="smooth")j.scrollController.scrollTo(a);else j.scrollController.scrollTo(a)}),!j.methods.has("_getTotal"))j.methods.set("_getTotal",()=>j.dataManager.getTotal());j.destroyHandlers.push(()=>{if(Q)Q.destroy(),Q=null;K.root.classList.remove(`${_}--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=[],_=0,Y=[],W=(B)=>{let y=0,L=B[0];for(let F=1;F<B.length;F++){let O=B[F];if(O<L)L=O,y=F}return y},E=(B,y)=>{if(B<=0)return _=0,N=[],[];let L=Array(q).fill(0),F=Array(q);for(let $=0;$<q;$++)F[$]=[];let O=Array(B);for(let $=0;$<B;$++){let I=W(L),C=y($),G=L[I];O[$]={index:$,x:X[I],y:G,lane:I,size:C,crossSize:K},F[I].push($),L[I]=G+C+Q}N=F;let D=0;for(let $=0;$<q;$++){let I=L[$],C=I>0?I-Q:0;if(C>D)D=C}return _=D,O},M=(B)=>{if(B.length===0)return _>0?_:0;if(_>0)return _;let y=Array(q).fill(0);for(let F of B){let O=F.y+F.size,D=y[F.lane];if(O>D)y[F.lane]=O}let L=0;for(let F=0;F<q;F++)if(y[F]>L)L=y[F];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 F=0;F<q;F++){let O=N[F],D=O.length;if(D===0)continue;let $=0,I=D;while($<I){let C=$+I>>>1,G=B[O[C]];if(G.y+G.size<=y)$=C+1;else I=C}for(let C=$;C<D;C++){let G=B[O[C]];if(G.y>=L)break;Y.push(G)}}return Y},V=(B,y,L)=>{let F=[];for(let O of B)if(O.y+O.size>y&&O.y<L)F.push(O);return F};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:E,getTotalSize:M,getVisibleItems:H}};var C1=(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=C1(),N=new Map,_=new Set,Y=0,W="",E=-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,t)=>{G.classList.toggle(A,p),G.classList.toggle(B,t)},F=(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`},D=(G,p,t,w,h)=>{let Z=U.acquire(),R=H(w,h);if(Z.className=V,Z.dataset.index=String(G),Z.dataset.id=String(p.id),Z.dataset.lane=String(t.lane),Z.ariaSelected=String(w),X)Z.id=`${X}-item-${G}`;if(K){let T=K();if(T!==E)E=T,W=String(T);Z.setAttribute("aria-setsize",W),Z.setAttribute("aria-posinset",String(G+1))}O(Z,t);let v=q(p,G,R);return y(Z,v),L(Z,w,h),F(Z,t),{element:Z,lastItemId:p.id,lastSelected:w,lastFocused:h,lastY:t.y,lastX:t.x,lastSeenFrame:Y}},$=(G,p,t,w)=>{Y++,_.clear();for(let Z=0;Z<p.length;Z++)_.add(p[Z].index);for(let[Z,R]of N)if(_.has(Z))R.lastSeenFrame=Y;else if(Y-R.lastSeenFrame>2)U.release(R.element),N.delete(Z);let h=null;for(let Z=0;Z<p.length;Z++){let R=p[Z],v=R.index,T=G(v);if(!T)continue;let P=t.has(T.id),k=v===w,S=N.get(v);if(S){let c=S.lastItemId!==T.id,j0=S.lastSelected!==P,z=S.lastFocused!==k,u=S.lastY!==R.y||S.lastX!==R.x;if(c||j0||z){let a=H(P,k),n=q(T,v,a);y(S.element,n),L(S.element,P,k),S.element.dataset.id=String(T.id),S.element.ariaSelected=String(P),S.lastItemId=T.id,S.lastSelected=P,S.lastFocused=k}if(u)F(S.element,R),S.lastY=R.y,S.lastX=R.x}else{let c=D(v,T,R,P,k);if(!h)h=document.createDocumentFragment();h.appendChild(c.element),N.set(v,c)}}if(h)J.appendChild(h)},I=()=>{for(let{element:G}of N.values())U.release(G);N.clear(),J.innerHTML=""};return{render:$,getElement:(G)=>N.get(G)?.element,clear:I,destroy:()=>{I(),U.clear()}}};var v1=new Set,pJ=(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:_}=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 E=()=>{return W?X.viewport.clientHeight:X.viewport.clientWidth},M={columns:J.columns,gap:J.gap??0,containerSize:E()};q=D2(M);let H=_.item,V=typeof H.height==="function"?H.height:(T)=>H.height,A=W&&_.item.width?typeof _.item.width==="function"?_.item.width:(T)=>_.item.width:V,B=()=>{let T=K.dataManager.getTotal();j=q.calculateLayout(T,(k)=>{return A(k)});let P=q.getTotalSize(j);if(K.sizeCache.getTotalSize=()=>P,W)X.content.style.width=`${P}px`;else X.content.style.height=`${P}px`},y=_.item.template;Q=_2(X.items,y,Y,W,()=>K.dataManager.getTotal(),N.ariaIdPrefix);let L=null,F=null,O=!1,D=()=>{if(O)return;O=!0,L=K.methods.get("_getSelectedIds")??null,F=K.methods.get("_getFocusedIndex")??null},$=(T)=>K.dataManager.getItem(T),I=-1,C=-1,G=!0,p=(N.overscan??3)*100,t=()=>{if(K.state.isDestroyed)return;D();let T=K.scrollController.getScrollTop(),P=K.state.viewportState.containerSize;if(!G&&T===I&&P===C)return;I=T,C=P,G=!1;let k=Math.max(0,T-p),S=T+P+p,c=q.getVisibleItems(j,k,S),j0=L?L():v1,z=F?F():-1;if(Q&&c.length>0)Q.render($,c,j0,z);let u=K.state.viewportState;u.scrollPosition=T;let a=c.length,n=a>0?c[0].index:0,f=a>0?c[a-1].index:0;u.visibleRange.start=n,u.visibleRange.end=f,u.renderRange.start=n,u.renderRange.end=f;let x=K.state.lastRenderRange;if(x.start!==n||x.end!==f)x.start=n,x.end=f,U.emit("range:change",{range:{start:n,end:f}})},w=()=>{K.state.lastRenderRange.start=-1,K.state.lastRenderRange.end=-1,G=!0,t()};K.setRenderFns(t,w);let h=(T,P)=>{let k=W?P:T;if(q&&q.containerSize!==k)q.update({containerSize:k}),B(),w()};K.resizeHandlers.push(h);let Z=()=>{B(),w()},R=K.dataManager,v=(T)=>{if(typeof R[T]!=="function")return;let P=R[T].bind(R);R[T]=(...k)=>{P(...k),Z()}};v("setItems"),v("appendItems"),v("prependItems"),v("updateItem"),v("removeItem"),K.methods.set("scrollToIndex",(T,P,k)=>{let S=j[T];if(!S)return;let c=S.y,j0=K.state.viewportState.containerSize,z=c;if(P==="center")z=c-j0/2+S.size/2;else if(P==="end")z=c-j0+S.size;z=Math.max(0,z),K.scrollController.scrollTo(z,k==="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}},I0=(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},R2=(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},C2=(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},v2=(J,q)=>{if(q===0)return J;return J.focusedIndex=0,J},z2=(J,q)=>{if(q===0)return J;return J.focusedIndex=q-1,J};var hJ=(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 uJ=(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:_}=X,{classPrefix:Y,ariaIdPrefix: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 E=new Map,M=()=>{E.clear();let B=X.dataManager.getTotal(),y=X.dataManager.getCached();if(y===0)return;if(y>=B){for(let F=0;F<B;F++){let O=X.dataManager.getItem(F);if(O)E.set(O.id,F)}return}let L=X.dataManager.getStorage();if(L&&typeof L.getLoadedRanges==="function"){let F=L.getLoadedRanges();for(let O of F)for(let D=O.start;D<=O.end;D++){let $=X.dataManager.getItem(D);if($)E.set($.id,D)}}};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 F=B[L];if(F&&F.id!==void 0)E.set(F.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=E.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 F=parseInt(L.dataset.index??"-1",10);if(F<0)return;let O=X.dataManager.getItem(F);if(!O)return;N.emit("item:click",{item:O,index:F,event:B}),j=k2(j,F),U.root.setAttribute("aria-activedescendant",`${W}-item-${F}`),j=I0(j,O.id,q),V()}),X.keydownHandlers.push((B)=>{if(X.state.isDestroyed)return;let y=X.dataManager.getTotal(),L=j.focusedIndex,F=!1,O=!1,D=j;switch(B.key){case"ArrowUp":D=R2(j,y),F=!0,O=!0;break;case"ArrowDown":D=C2(j,y),F=!0,O=!0;break;case"Home":D=v2(j,y),F=!0,O=!0;break;case"End":D=z2(j,y),F=!0,O=!0;break;case" ":case"Enter":if(j.focusedIndex>=0){let $=X.dataManager.getItem(j.focusedIndex);if($)D=I0(j,$.id,q);F=!0}break}if(F){B.preventDefault(),j=D;let $=j.focusedIndex;if($>=0){let I=X.dataManager.getState(),C=k0($,X.sizeCache,X.state.viewportState.containerSize,I.total,"center",X.getCachedCompression());X.scrollController.scrollTo(C),U.root.setAttribute("aria-activedescendant",`${W}-item-${$}`)}else U.root.removeAttribute("aria-activedescendant");if(O){let{selected:I}=j;if(L>=0&&L!==$){let C=X.dataManager.getItem(L);if(C)X.renderer.updateItemClasses(L,I.has(C.id),!1)}if($>=0){let C=X.dataManager.getItem($);if(C)X.renderer.updateItemClasses($,I.has(C.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=I0(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=E.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 gJ=(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"),_=N&&N().length>0?N():void 0;if(U===0){let M={index:0,offsetInItem:0,total:0};if(_)M.selectedIds=_;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 E={index:Y,offsetInItem:W,total:U};if(_)E.selectedIds=_;return E});let j=(K)=>{let{index:X,offsetInItem:U,selectedIds:N}=K,_=Q.getVirtualTotal();if(_===0)return;if(!Number.isFinite(X)||!Number.isFinite(U))return;if(Q.sizeCache.getTotal()!==_){Q.sizeCache.rebuild(_),Q.updateCompressionMode();let B=Q.getCachedCompression();Q.updateContentSize(B.virtualSize)}let W=Q.getCachedCompression(),E=Math.max(0,Math.min(X,_-1)),M;if(W.isCompressed){let B=Q.sizeCache.getSize(E),y=B>0?U/B:0;M=(E+y)/_*W.virtualSize}else M=Q.sizeCache.getOffset(E)+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{gJ as withSnapshots,uJ as withSelection,fJ as withSections,GJ as withScrollbar,AJ as withScale,FJ as withPage,pJ as withMasonry,IJ as withGrid,EJ as withAsync,qJ as vlist,I0 as toggleSelection,yJ as simpleVisibleRange,c0 as selectItems,G2 as selectAll,CJ as rangesEqual,q2 as rafThrottle,DJ as needsScaling,Y2 as mergeRanges,hJ as isSelected,P0 as isSectionHeader,$0 as isPlaceholderItem,vJ as isInRange,a0 as getSelectedItems,r0 as getSelectedIds,L0 as getScaleState,VJ as getScaleInfo,L0 as getScale,zJ as getRangeCount,_J as getMaxItemsWithoutScaling,$2 as filterPlaceholders,wJ as diffRanges,l0 as deselectItems,B2 as createStickyHeader,X2 as createSparseStorage,y0 as createSizeCache,V2 as createSelectionState,m0 as createSectionedSizeFn,U2 as createSectionLayout,f0 as createScrollbar,OJ 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,RJ as clampScrollPosition,$J as calculateTotalSize,k0 as calculateScrollToIndex,e0 as calculateScaledVisibleRange,J2 as calculateScaledScrollToIndex,NJ as calculateScaledRenderRange,S0 as calculateScaledItemPosition,TJ as calculateRenderRange,g0 as calculateMissingRanges,kJ as calculateItemOffset,WJ as calculateIndexFromScrollPosition,PJ as calculateActualSize,x0 as buildLayoutItems,H0 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 {
@@ -501,6 +516,7 @@ export interface VListEvents<T extends VListItem = VListItem> extends EventMap {
501
516
  "load:end": {
502
517
  items: T[];
503
518
  total?: number;
519
+ offset?: number;
504
520
  };
505
521
  /** Error occurred */
506
522
  error: {
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}}:root{--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}@media (prefers-color-scheme:dark){:root{--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-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)}}.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-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{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--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}
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}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floor/vlist",
3
- "version": "0.9.8",
3
+ "version": "1.0.0",
4
4
  "description": "Lightweight, high-performance virtual list with zero dependencies",
5
5
  "author": {
6
6
  "name": "Floor IO",