@floor/vlist 1.0.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -9,7 +9,7 @@ Lightweight, high-performance virtual list with zero dependencies and dimension-
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
- - **8–12 KB gzipped** — pay only for features you use (vs 20 KB+ monolithic alternatives)
12
+ - **~8 KB gzipped** — pay only for features you use (vs 20 KB+ monolithic alternatives)
13
13
  - **Builder API** — composable features with perfect tree-shaking
14
14
  - **Grid, masonry, sections, async, selection, scale** — all opt-in
15
15
  - **Horizontal & vertical** — semantically correct orientation support
@@ -19,13 +19,14 @@ 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
- ## v1.0.0 Highlights
22
+ ## 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
26
- - **Dimension-agnostic API** — semantically correct terminology for both orientations
27
- - 🎯 **Horizontal sections** — sticky headers work in horizontal carousels
28
- - 🎨 **Horizontal grid layouts** — 2D grids work in both orientations
24
+
25
+ - **Dimension-agnostic API** — semantically correct terminology for both orientations
26
+ - **Performance optimized** — 13-pattern optimization playbook applied across the entire rendering pipeline
27
+ - **Horizontal sections** — sticky headers work in horizontal carousels
28
+ - **Horizontal grid layouts** — 2D grids work in both orientations
29
+ - **Masonry** — shortest-lane placement via `withMasonry()`
29
30
 
30
31
  ## Installation
31
32
 
@@ -79,20 +80,20 @@ const list = vlist({
79
80
  .build()
80
81
  ```
81
82
 
82
- ### Plugins
83
+ ### Features
83
84
 
84
85
  | Feature | Size | Description |
85
86
  |---------|------|-------------|
86
- | **Base** | 7.7 KB | Core virtualization |
87
- | `withGrid()` | +4.0 KB | 2D grid layout |
88
- | `withMasonry()` | +2.9 KB | Pinterest-style masonry layout |
89
- | `withSections()` | +4.6 KB | Grouped lists with sticky/inline headers |
90
- | `withAsync()` | +5.3 KB | Lazy loading with adapters |
91
- | `withSelection()` | +2.3 KB | Single/multiple selection + keyboard nav |
92
- | `withScale()` | +2.2 KB | 1M+ items via scroll compression |
93
- | `withScrollbar()` | +1.0 KB | Custom scrollbar UI |
94
- | `withPage()` | +0.9 KB | Document-level scrolling |
95
- | `withSnapshots()` | included | Scroll save/restore |
87
+ | **Base** | 8.1 KB | Core virtualization |
88
+ | `withGrid()` | +3.8 KB | 2D grid layout |
89
+ | `withMasonry()` | +2.3 KB | Pinterest-style masonry layout |
90
+ | `withSections()` | +4.1 KB | Grouped lists with sticky/inline headers |
91
+ | `withAsync()` | +3.9 KB | Lazy loading with adapters |
92
+ | `withSelection()` | +1.6 KB | Single/multiple selection + keyboard nav |
93
+ | `withScale()` | +2.6 KB | 1M+ items via scroll compression |
94
+ | `withScrollbar()` | +1.2 KB | Custom scrollbar UI |
95
+ | `withPage()` | +0.4 KB | Document-level scrolling |
96
+ | `withSnapshots()` | +0.5 KB | Scroll save/restore |
96
97
 
97
98
  ## Examples
98
99
 
@@ -190,7 +191,7 @@ See **[vlist.dev](https://vlist.dev)** for live demos of each.
190
191
  ## API
191
192
 
192
193
  ```typescript
193
- const list = vlist(config).use(...plugins).build()
194
+ const list = vlist(config).use(...features).build()
194
195
  ```
195
196
 
196
197
  ### Data
@@ -212,7 +213,11 @@ const list = vlist(config).use(...plugins).build()
212
213
  | `list.scrollToIndex(i, opts?)` | With `{ align, behavior: 'smooth', duration }` |
213
214
  | `list.cancelScroll()` | Cancel smooth scroll animation |
214
215
  | `list.getScrollPosition()` | Current scroll offset |
215
- | `list.getVisibleRange()` | `{ start, end }` of visible indices |
216
+
217
+ ### Snapshots (with `withSnapshots()`)
218
+
219
+ | Method | Description |
220
+ |--------|-------------|
216
221
  | `list.getScrollSnapshot()` | Save scroll state (for SPA navigation) |
217
222
  | `list.restoreScroll(snapshot)` | Restore saved scroll state |
218
223
 
@@ -220,11 +225,11 @@ const list = vlist(config).use(...plugins).build()
220
225
 
221
226
  | Method | Description |
222
227
  |--------|-------------|
223
- | `list.selectItem(id)` | Select item |
224
- | `list.deselectItem(id)` | Deselect item |
225
- | `list.toggleSelection(id)` | Toggle |
228
+ | `list.select(...ids)` | Select item(s) |
229
+ | `list.deselect(...ids)` | Deselect item(s) |
230
+ | `list.toggleSelect(id)` | Toggle |
226
231
  | `list.selectAll()` / `list.clearSelection()` | Bulk operations |
227
- | `list.getSelectedIds()` | Array of selected IDs |
232
+ | `list.getSelected()` | Array of selected IDs |
228
233
  | `list.getSelectedItems()` | Array of selected items |
229
234
 
230
235
  ### Grid (with `withGrid()`)
@@ -263,9 +268,9 @@ list.on('velocity:change', ({ velocity, reliable }) => {})
263
268
  list.destroy()
264
269
  ```
265
270
 
266
- ## Plugin Configuration
271
+ ## Feature Configuration
267
272
 
268
- Each plugin's config is fully typed — hover in your IDE for details.
273
+ Each feature's config is fully typed — hover in your IDE for details.
269
274
 
270
275
  ```typescript
271
276
  withGrid({ columns: 4, gap: 16 })
@@ -288,9 +293,10 @@ Full configuration reference → **[vlist.dev](https://vlist.dev)**
288
293
  | React | [`vlist-react`](https://github.com/floor/vlist-react) | 0.6 KB gzip |
289
294
  | Vue | [`vlist-vue`](https://github.com/floor/vlist-vue) | 0.6 KB gzip |
290
295
  | Svelte | [`vlist-svelte`](https://github.com/floor/vlist-svelte) | 0.5 KB gzip |
296
+ | SolidJS | [`vlist-solidjs`](https://github.com/floor/vlist-solidjs) | 0.5 KB gzip |
291
297
 
292
298
  ```bash
293
- npm install @floor/vlist vlist-react # or vlist-vue / vlist-svelte
299
+ npm install @floor/vlist vlist-react # or vlist-vue / vlist-svelte / vlist-solidjs
294
300
  ```
295
301
 
296
302
  Each adapter README has setup examples and API docs.
@@ -331,11 +337,10 @@ This makes the codebase clearer and eliminates semantic confusion when working w
331
337
 
332
338
  | Configuration | Gzipped |
333
339
  |---------------|---------|
334
- | Base only | 7.7 KB |
335
- | + Grid | 11.7 KB |
336
- | + Sections | 12.3 KB |
337
- | + Async | 13.5 KB |
338
- | All plugins | ~16 KB |
340
+ | Base only | 8.1 KB |
341
+ | + Grid | 11.9 KB |
342
+ | + Sections | 12.2 KB |
343
+ | + Async | 12.0 KB |
339
344
 
340
345
  ### Memory Efficiency
341
346
 
@@ -406,4 +411,4 @@ See [CHANGELOG.md](https://vlist.dev/docs/CHANGELOG.md) for the full release his
406
411
 
407
412
  ---
408
413
 
409
- Built by [Floor IO](https://floor.io)
414
+ Built by [Floor IO](https://floor.io)
@@ -21,5 +21,5 @@
21
21
  * @packageDocumentation
22
22
  */
23
23
  export { vlist } from "./core";
24
- export type { VListBuilder, BuiltVList, BuilderConfig, VListFeature, FeatureFactory, BuilderContext, BuilderState, ResolvedBuilderConfig, } from "./types";
24
+ export type { VListBuilder, VList, BuilderConfig, VListConfig, VListFeature, FeatureFactory, BuilderContext, BuilderState, ResolvedBuilderConfig, } from "./types";
25
25
  //# sourceMappingURL=index.d.ts.map
@@ -2,7 +2,7 @@
2
2
  * vlist/builder - Types
3
3
  * Feature interface, builder config, builder context, and return types
4
4
  */
5
- import type { VListItem, VListEvents, ItemConfig, ItemTemplate, Range, ViewportState, EventHandler, Unsubscribe, ScrollToOptions, ScrollSnapshot } from "../types";
5
+ import type { VListItem, VListEvents, ItemConfig, ItemTemplate, Range, ViewportState, EventHandler, Unsubscribe, ScrollToOptions, ScrollSnapshot, VListAdapter, GridConfig, GroupsConfig, SelectionConfig, ScrollbarOptions } from "../types";
6
6
  import type { DOMStructure, Renderer, SizeCache, CompressionContext } from "../rendering";
7
7
  import type { CompressionState } from "../rendering/viewport";
8
8
  import type { SimpleDataManager } from "./data";
@@ -42,6 +42,40 @@ export interface BuilderConfig<T extends VListItem = VListItem> {
42
42
  element?: Window;
43
43
  };
44
44
  }
45
+ /**
46
+ * Extended configuration accepted by framework adapters (React, Vue, Svelte, SolidJS).
47
+ *
48
+ * Adds convenience fields that adapters translate into `.use(withX())` calls
49
+ * automatically. For the core builder, use `BuilderConfig` directly.
50
+ */
51
+ export interface VListConfig<T extends VListItem = VListItem> extends Omit<BuilderConfig<T>, "scroll"> {
52
+ /** Scroll behavior configuration — extends core scroll config with scrollbar shorthand. */
53
+ scroll?: BuilderConfig["scroll"] & {
54
+ /** Scrollbar mode (shorthand — same as top-level `scrollbar`). */
55
+ scrollbar?: "native" | "none" | ScrollbarOptions;
56
+ };
57
+ /** Layout mode (default: list). Set to `'grid'` with `grid` config to enable `withGrid()`. */
58
+ layout?: "list" | "grid";
59
+ /** Grid configuration — used when `layout` is `'grid'`. */
60
+ grid?: GridConfig;
61
+ /** Async data adapter — enables `withAsync()`. Omit `items` when using an adapter. */
62
+ adapter?: VListAdapter<T>;
63
+ /** Loading behavior for async adapter. */
64
+ loading?: {
65
+ /** Velocity threshold above which data loading is skipped (px/ms). Default: 5 */
66
+ cancelThreshold?: number;
67
+ /** Velocity threshold for preloading (px/ms). Default: 2 */
68
+ preloadThreshold?: number;
69
+ /** Number of items to preload in scroll direction. Default: 50 */
70
+ preloadAhead?: number;
71
+ };
72
+ /** Section grouping configuration — enables `withSections()`. */
73
+ groups?: GroupsConfig;
74
+ /** Selection configuration — enables `withSelection()`. */
75
+ selection?: SelectionConfig;
76
+ /** Top-level scrollbar shorthand (alternative to `scroll.scrollbar`). */
77
+ scrollbar?: "native" | "none" | ScrollbarOptions;
78
+ }
45
79
  /** Resolved configuration stored inside BuilderContext */
46
80
  export interface ResolvedBuilderConfig {
47
81
  readonly overscan: number;
@@ -243,10 +277,17 @@ export interface VListBuilder<T extends VListItem = VListItem> {
243
277
  /** Register a feature. Chainable. */
244
278
  use(feature: VListFeature<T>): VListBuilder<T>;
245
279
  /** Materialize the virtual list. Creates DOM, initializes features, returns API. */
246
- build(): BuiltVList<T>;
280
+ build(): VList<T>;
247
281
  }
248
- /** Base API always available from builder (data methods, scroll methods, events, lifecycle) */
249
- export interface BuiltVList<T extends VListItem = VListItem> {
282
+ /**
283
+ * VList instance API returned by `vlist(config).build()`.
284
+ *
285
+ * Always-available methods (data, scroll, events, lifecycle) are required.
286
+ * Feature methods (selection, snapshots, grid, etc.) are optional —
287
+ * they exist on the instance only when the corresponding feature is
288
+ * registered via `.use()`.
289
+ */
290
+ export interface VList<T extends VListItem = VListItem> {
250
291
  /** The root DOM element */
251
292
  readonly element: HTMLElement;
252
293
  /** Current items */
@@ -16,7 +16,7 @@ export declare const DEFAULT_PAGE_SIZE = 50;
16
16
  * Velocity threshold above which data loading is cancelled (px/ms)
17
17
  * When scrolling faster than this, we skip loading data since the user
18
18
  * is likely scrolling quickly past content they don't want to see.
19
- * Default: 25 px/ms (same as mtrl-addons viewport)
19
+ * Default: 5 px/ms
20
20
  */
21
21
  export declare const CANCEL_LOAD_VELOCITY_THRESHOLD = 5;
22
22
  /**
@@ -34,9 +34,11 @@ export declare const PRELOAD_VELOCITY_THRESHOLD = 2;
34
34
  */
35
35
  export declare const PRELOAD_ITEMS_AHEAD = 50;
36
36
  /**
37
- * Maximum virtual height in pixels
37
+ * Maximum virtual size in pixels along the main axis
38
38
  * Most browsers support ~16.7M pixels, we use 16M for safety margin
39
39
  */
40
+ export declare const MAX_VIRTUAL_SIZE = 16000000;
41
+ /** @deprecated Use MAX_VIRTUAL_SIZE instead */
40
42
  export declare const MAX_VIRTUAL_HEIGHT = 16000000;
41
43
  /** Default auto-hide behavior */
42
44
  export declare const DEFAULT_SCROLLBAR_AUTO_HIDE = true;
@@ -34,7 +34,7 @@ export interface DataFeatureConfig<T extends VListItem = VListItem> {
34
34
  };
35
35
  /** Loading behavior configuration */
36
36
  loading?: {
37
- /** Velocity threshold above which data loading is skipped (px/ms). Default: 25 */
37
+ /** Velocity threshold above which data loading is skipped (px/ms). Default: 5 */
38
38
  cancelThreshold?: number;
39
39
  /** Velocity threshold for preloading (px/ms). Default: 2 */
40
40
  preloadThreshold?: number;
@@ -5,6 +5,6 @@
5
5
  * Usage: import { getCompressionInfo } from 'vlist/compression'
6
6
  * Usage: import { withScale } from 'vlist/compression'
7
7
  */
8
- export { MAX_VIRTUAL_HEIGHT, getCompressionState, needsCompression, getMaxItemsWithoutCompression, getCompressionInfo, calculateCompressedVisibleRange, calculateCompressedRenderRange, calculateCompressedItemPosition, calculateCompressedScrollToIndex, calculateIndexFromScrollPosition, type CompressionState, } from "../../rendering/scale";
8
+ export { MAX_VIRTUAL_SIZE, MAX_VIRTUAL_HEIGHT, getCompressionState, needsCompression, getMaxItemsWithoutCompression, getCompressionInfo, calculateCompressedVisibleRange, calculateCompressedRenderRange, calculateCompressedItemPosition, calculateCompressedScrollToIndex, calculateIndexFromScrollPosition, type CompressionState, } from "../../rendering/scale";
9
9
  export { withScale } from "./feature";
10
10
  //# sourceMappingURL=index.d.ts.map
package/dist/index.d.ts CHANGED
@@ -15,12 +15,12 @@ export { withGrid } from "./features/grid";
15
15
  export { withMasonry } from "./features/masonry";
16
16
  export { withSelection } from "./features/selection";
17
17
  export { withSnapshots } from "./features/snapshots";
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";
19
- export type { VListBuilder, BuiltVList, BuilderConfig, VListFeature, BuilderContext, } from "./builder";
18
+ export type { VListItem, VListEvents, ItemTemplate, ItemState, SelectionMode, SelectionConfig, SelectionState, ScrollbarConfig, ScrollbarOptions, ScrollConfig, ScrollToOptions, ScrollSnapshot, VListAdapter, AdapterParams, AdapterResponse, Range, ViewportState, EventHandler, Unsubscribe, GridSizeContext, GridHeightContext, } from "./types";
19
+ export type { VListBuilder, VList, BuilderConfig, VListConfig, VListFeature, BuilderContext, } from "./builder";
20
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";
21
21
  export { createGridLayout, createGridRenderer, type GridConfig, type GridLayout, type GridPosition, type GridRenderer, type ItemRange, } from "./features/grid";
22
22
  export { createMasonryLayout, createMasonryRenderer, type MasonryConfig, type MasonryLayout, type MasonryRenderer, type GetItemFn, type ItemPlacement, } from "./features/masonry";
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";
23
+ export { createSizeCache, type SizeCache, createMeasuredSizeCache, type MeasuredSizeCache, simpleVisibleRange, calculateRenderRange, calculateTotalSize, calculateActualSize, calculateItemOffset, calculateScrollToIndex, clampScrollPosition, rangesEqual, isInRange, getRangeCount, diffRanges, MAX_VIRTUAL_SIZE, 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";
24
24
  export { createSelectionState, selectItems, deselectItems, toggleSelection, selectAll, clearSelection, isSelected, getSelectedIds, getSelectedItems, } from "./features/selection";
25
25
  export { createEmitter, type Emitter } from "./events";
26
26
  export { createDataManager as createAsyncManager, createSparseStorage, createPlaceholderManager, isPlaceholderItem, filterPlaceholders, mergeRanges, calculateMissingRanges, type DataManager as AsyncManager, type SparseStorage, type PlaceholderManager, } from "./features/async";
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- var{defineProperty:F2,getOwnPropertyNames:tJ,getOwnPropertyDescriptor:eJ}=Object,J1=Object.prototype.hasOwnProperty;var h2=new WeakMap,Q1=(J)=>{var q=h2.get(J),Q;if(q)return q;if(q=F2({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function")tJ(J).map((j)=>!J1.call(q,j)&&F2(q,j,{get:()=>J[j],enumerable:!(Q=eJ(J,j))||Q.enumerable}));return h2.set(J,q),q};var j1=(J,q)=>{for(var Q in q)F2(J,Q,{get:q[Q],enumerable:!0,configurable:!0,set:(j)=>q[Q]=()=>j})};var u2=(J,q)=>()=>(J&&(q=J(J=0)),q);var q1=(J,q)=>{let Q=q;return{getOffset:(j)=>j*J,getSize:(j)=>J,indexAtOffset:(j)=>{if(Q===0||J===0)return 0;return Math.max(0,Math.min(Math.floor(j/J),Q-1))},getTotalSize:()=>Q*J,getTotal:()=>Q,rebuild:(j)=>{Q=j},isVariable:()=>!1}},X1=(J,q)=>{let Q=q,j=new Float64Array(0),K=(U)=>{Q=U,j=new Float64Array(U+1),j[0]=0;for(let N=0;N<U;N++)j[N+1]=j[N]+J(N)};K(q);let X=(U)=>{if(Q===0)return 0;if(U<=0)return 0;if(U>=j[Q])return Q-1;let N=0,D=Q-1;while(N<D){let Y=N+D+1>>>1;if(j[Y]<=U)N=Y;else D=Y-1}return N};return{getOffset:(U)=>{if(U<=0)return 0;if(U>=Q)return j[Q];return j[U]},getSize:(U)=>J(U),indexAtOffset:(U)=>X(U),getTotalSize:()=>j[Q]??0,getTotal:()=>Q,rebuild:(U)=>K(U),isVariable:()=>!0}},T0=(J,q)=>{if(typeof J==="number")return q1(J,q);return X1(J,q)},u0=(J,q,Q,j)=>{if(j===0)return 0;if(!J.isVariable())return Math.ceil(Q/J.getSize(0));let K=0,X=0,U=q;while(U<j&&X<Q)X+=J.getSize(U),K++,U++;return Math.max(1,K)},o0=(J,q,Q)=>{if(Q===0)return 0;if(!J.isVariable())return Math.floor(q/J.getSize(0));let j=0,K=0;for(let X=Q-1;X>=0;X--){let U=J.getSize(X);if(K+U>q)break;K+=U,j++}return Math.max(j,1)},L2=(J,q,Q)=>{if(Q===0)return 0;let j=Math.floor(q),K=q-j,X=Math.max(0,Math.min(j,Q-1));return J.getOffset(X)+K*J.getSize(X)};var y2=200,z0=50,JJ=5,QJ=2,jJ=50,k0=16000000,qJ="x",XJ=20,T2="_isPlaceholder",YJ="__placeholder_";var F0=(J,q)=>{let Q=q.getTotalSize(),j=Q>k0,K=j?k0:Q,X=Q>0?K/Q:1;return{isCompressed:j,actualSize:Q,virtualSize:K,ratio:X}},e0=(J,q,Q,j,K,X)=>{if(j===0||q===0)return X.start=0,X.end=-1,X;if(!K.isCompressed){let V=Q.indexAtOffset(J),A=Q.indexAtOffset(J+q);if(A<j-1)A++;return X.start=Math.max(0,V),X.end=Math.min(j-1,Math.max(0,A)),X}let{virtualSize:U}=K,D=J/U*j,Y=Math.floor(D),W=u0(Q,Math.max(0,Y),q,j),F=Math.ceil(D)+W,H=U-q-J;if(H<=q&&H>=-1){let V=o0(Q,q,j),A=Math.max(0,j-V),B=Math.max(0,Math.min(1,1-H/q));Y=Math.floor(Y+(A-Y)*B),F=H<=1?j-1:Math.min(j-1,Y+W)}return X.start=Math.max(0,Y),X.end=Math.min(j-1,Math.max(0,F)),X},KJ=(J,q,Q,j)=>{if(Q===0)return j.start=0,j.end=-1,j;return j.start=Math.max(0,J.start-q),j.end=Math.min(Q-1,J.end+q),j},w0=(J,q,Q,j,K,X,U)=>{if(!X.isCompressed||j===0)return Q.getOffset(J);let{virtualSize:N}=X,D=N-K,Y=D-q;if(Y<=K&&Y>=-1){if(q>=D-1){let O=Q.getTotalSize()-Q.getOffset(J);return K-O}let H=o0(Q,K,j),V=Math.max(0,j-H),B=q/N*j,y=Math.max(0,Math.min(1,1-Y/K)),L=Q.getOffset(J)-Q.getOffset(V),E=Q.getOffset(J)-L2(Q,B,j);return E+(L-E)*y}let W=q/N,F=Q.getTotalSize(),M=W*F;return Q.getOffset(J)-M},J2=(J,q,Q,j,K,X="start")=>{if(j===0)return 0;let U;if(K.isCompressed){if(X==="end"&&J===j-1)return Math.max(0,K.virtualSize-Q);U=J/j*K.virtualSize}else U=q.getOffset(J);let N=q.getSize(J);switch(X){case"center":U-=(Q-N)/2;break;case"end":U-=Q-N;break}let D=K.virtualSize-Q;return Math.max(0,Math.min(U,D))},ZJ=(J,q,Q,j)=>{if(Q===0)return 0;if(j.isCompressed){let K=J/j.virtualSize;return Math.floor(K*Q)}return q.indexAtOffset(J)},UJ=(J,q)=>{if(typeof q==="number")return J*q>k0;return q.getTotalSize()>k0},BJ=(J)=>{if(J<=0)return 0;return Math.floor(k0/J)},NJ=(J,q)=>{let Q=F0(J,q);if(!Q.isCompressed)return`No compression needed (${J} items, ${(Q.actualSize/1e6).toFixed(2)}M px)`;return`Compressed to ${(Q.ratio*100).toFixed(1)}% (${J} items, ${(Q.actualSize/1e6).toFixed(1)}M px → ${(Q.virtualSize/1e6).toFixed(1)}M px virtual)`};var Q2=()=>{};var R0=(J)=>{return J!==null&&typeof J==="object"&&J.__groupHeader===!0};var CJ={};j1(CJ,{createGridRenderer:()=>d0});var A1=(J=200)=>{let q=[];return{acquire:()=>{let X=q.pop();if(X)return X;let U=document.createElement("div");return U.setAttribute("role","option"),U},release:(X)=>{if(X.remove(),q.length<J)X.className="",X.textContent="",X.removeAttribute("style"),X.removeAttribute("data-index"),X.removeAttribute("data-id"),X.removeAttribute("data-row"),X.removeAttribute("data-col"),q.push(X)},clear:()=>{q.length=0}}},F1=2,d0=(J,q,Q,j,K,X,U,N,D=!1)=>{let Y=A1(),W=new Map,F=X,M=!1,H=null,V=0,A=0,B="",y=-1,L=(z)=>{if(H&&V===z)return H;return H=F0(z,Q),V=z,H},E={selected:!1,focused:!1},O=(z,S)=>{return E.selected=z,E.focused=S,E},_=`${K}-item ${K}-grid-item`,$=`${K}-item--selected`,h=`${K}-item--focused`,v=(z,S)=>{if(typeof S==="string")z.innerHTML=S;else z.replaceChildren(S)},G=(z,S,c)=>{z.classList.toggle($,S),z.classList.toggle(h,c)},p=(z,S)=>{let c=j.getRow(z);if(S){let a=S.totalItems,I=L(a);if(I.isCompressed)return w0(c,S.scrollPosition,Q,a,S.containerSize,I,S.rangeStart)}return Q.getOffset(c)},i=(z,S)=>{let c=M&&j.getCol(z)===0,a=c?0:j.getCol(z),I=c?0:j.getColumnOffset(a,F),m;if(M){let o=j.getRow(z),e=0,t=new Set;for(let q0=0;q0<z;q0++){let Y0=j.getRow(q0);if(Y0<o&&!t.has(Y0)){let g=Q.getSize(q0);e+=g,t.add(Y0)}}m=e}else m=p(z,S);if(D)return`translate(${Math.round(m)}px, ${Math.round(I)}px)`;return`translate(${Math.round(I)}px, ${Math.round(m)}px)`},w=(z,S)=>{z.style.transform=S},u=(z,S)=>{let c=z.dataset.id?.startsWith("__group_header"),a=c?F:j.getColumnWidth(F),I;if(M||c)I=Q.getSize(S)-j.gap;else{let m=j.getRow(S);I=Q.getSize(m)-j.gap}if(D)z.style.width=`${I}px`,z.style.height=`${a}px`;else z.style.width=`${a}px`,z.style.height=`${I}px`},Z=(z,S,c,a,I)=>{let m=Y.acquire(),o=O(c,a);if(m.className=_,m.dataset.index=String(z),m.dataset.id=String(S.id),m.dataset.row=String(j.getRow(z)),m.dataset.col=String(j.getCol(z)),m.ariaSelected=String(c),N)m.id=`${N}-item-${z}`;if(U){let t=U();if(t!==y)y=t,B=String(t);m.setAttribute("aria-setsize",B),m.setAttribute("aria-posinset",String(z+1))}u(m,z);let e=q(S,z,o);return v(m,e),G(m,c,a),w(m,I),{element:m,lastItemId:S.id,lastSelected:c,lastFocused:a,lastTransform:I,lastSeenFrame:A}},P=(z,S,c,a,I)=>{if(A++,S.start===0&&z.length>0)M=R0(z[0]);for(let[e,t]of W)if(e>=S.start&&e<=S.end)t.lastSeenFrame=A;else if(A-t.lastSeenFrame>F1)Y.release(t.element),W.delete(e);let m=!1;if(U){let e=U();if(e!==y)y=e,B=String(e),m=!0}let o=null;for(let e=S.start;e<=S.end;e++){let t=e-S.start,q0=z[t];if(!q0){console.warn(`⚠️ RENDER: Missing item at index ${e} (range: ${S.start}-${S.end}, items.length: ${z.length})`);continue}let Y0=c.has(q0.id),g=e===a,d=W.get(e);if(d){let J0=d.lastItemId!==q0.id,n=d.lastSelected!==Y0,U0=d.lastFocused!==g;if(J0||n||U0){if(J0){let M0=O(Y0,g),E0=q(q0,e,M0);v(d.element,E0),d.element.dataset.id=String(q0.id),d.element.dataset.row=String(j.getRow(e)),d.element.dataset.col=String(j.getCol(e)),u(d.element,e)}G(d.element,Y0,g),d.element.ariaSelected=String(Y0),d.lastItemId=q0.id,d.lastSelected=Y0,d.lastFocused=g}let K0=i(e,I);if(d.lastTransform!==K0)w(d.element,K0),d.lastTransform=K0;if(m)d.element.setAttribute("aria-setsize",B)}else{let J0=i(e,I),n=Z(e,q0,Y0,g,J0);if(!o)o=document.createDocumentFragment();o.appendChild(n.element),W.set(e,n)}}if(o)J.appendChild(o)},C=(z)=>{for(let[S,c]of W){let a=i(S,z);if(c.lastTransform!==a)w(c.element,a),c.lastTransform=a}},T=(z,S,c,a)=>{let I=W.get(z);if(!I)return;let m=I.lastItemId!==S.id,o=I.lastSelected!==c,e=I.lastFocused!==a;if(m||o||e){let t=O(c,a),q0=q(S,z,t);v(I.element,q0),G(I.element,c,a),I.element.dataset.id=String(S.id),I.element.ariaSelected=String(c),u(I.element,z),I.lastItemId=S.id,I.lastSelected=c,I.lastFocused=a}},k=(z,S,c)=>{let a=W.get(z);if(!a)return;let I=a.lastSelected!==S,m=a.lastFocused!==c;if(I||m)G(a.element,S,c),a.lastSelected=S,a.lastFocused=c},R=(z)=>{return W.get(z)?.element},f=(z)=>{if(Math.abs(z-F)<1)return;F=z;for(let[S,c]of W){u(c.element,S);let a=i(S);w(c.element,a),c.lastTransform=a}},r=()=>{for(let[,z]of W)Y.release(z.element);W.clear()};return{render:P,updatePositions:C,updateItem:T,updateItemClasses:k,getElement:R,updateContainerWidth:f,clear:r,destroy:()=>{r(),Y.clear()}}};var N2=u2(()=>{Q2()});var g2=2,x2=(J=0)=>{let q=[,,,,,];for(let Q=0;Q<5;Q++)q[Q]={position:0,time:0};return{velocity:0,lastPosition:J,lastTime:performance.now(),samples:q,sampleIndex:0,sampleCount:0}},E2=(J,q)=>{let Q=performance.now(),j=Q-J.lastTime;if(j===0)return J;if(j>100){J.sampleCount=0,J.sampleIndex=0,J.velocity=0;let X=J.samples[0];return X.position=q,X.time=Q,J.sampleIndex=1,J.sampleCount=1,J.lastPosition=q,J.lastTime=Q,J}let K=J.samples[J.sampleIndex];if(K.position=q,K.time=Q,J.sampleIndex=(J.sampleIndex+1)%5,J.sampleCount=Math.min(J.sampleCount+1,5),J.sampleCount>=2){let X=(J.sampleIndex-J.sampleCount+5)%5,U=J.samples[X],N=q-U.position,D=Q-U.time;J.velocity=D>0?Math.abs(N)/D:0}return J.lastPosition=q,J.lastTime=Q,J};var i0=(J,q)=>{let Q=new Map,j=(X)=>{let U=Q.get(X);return U!==void 0?U:J},K=T0(j,q);return{getOffset(X){return K.getOffset(X)},getSize(X){return j(X)},indexAtOffset(X){return K.indexAtOffset(X)},getTotalSize(){return K.getTotalSize()},getTotal(){return K.getTotal()},rebuild(X){if(X<K.getTotal()){for(let U of Q.keys())if(U>=X)Q.delete(U)}K=T0(j,X)},isVariable(){return!0},setMeasuredSize(X,U){Q.set(X,U)},isMeasured(X){return Q.has(X)},getEstimatedSize(){return J},measuredCount(){return Q.size}}};var t0=()=>{let J={},q=(N,D)=>{if(!J[N])J[N]=new Set;return J[N].add(D),()=>Q(N,D)},Q=(N,D)=>{J[N]?.delete(D)};return{on:q,off:Q,emit:(N,D)=>{J[N]?.forEach((Y)=>{try{Y(D)}catch(W){console.error(`[vlist] Error in event handler for "${String(N)}":`,W)}})},once:(N,D)=>{let Y=(W)=>{Q(N,Y),D(W)};return q(N,Y)},clear:(N)=>{if(N)delete J[N];else for(let D in J)delete J[D]},listenerCount:(N)=>{return J[N]?.size??0}}};var m2=(J)=>{if(typeof J==="string"){let q=document.querySelector(J);if(!q)throw Error(`[vlist/builder] Container not found: ${J}`);return q}return J},d2=(J,q,Q,j)=>{let K=document.createElement("div");if(K.className=q,j)K.classList.add(`${q}--horizontal`);if(K.setAttribute("role","listbox"),K.setAttribute("tabindex","0"),Q)K.setAttribute("aria-label",Q);if(j)K.setAttribute("aria-orientation","horizontal");let X=document.createElement("div");if(X.className=`${q}-viewport`,j)X.style.overflowX="auto",X.style.overflowY="hidden";else X.style.overflow="auto";X.style.height="100%",X.style.width="100%";let U=document.createElement("div");if(U.className=`${q}-content`,U.style.position="relative",j)U.style.height="100%";else U.style.width="100%";let N=document.createElement("div");if(N.className=`${q}-items`,N.style.position="relative",j)N.style.height="100%";else N.style.width="100%";return U.appendChild(N),X.appendChild(U),K.appendChild(X),J.appendChild(K),{root:K,viewport:X,content:U,items:N}};var c2=(J=100)=>{let q=[];return{acquire:()=>{let Q=q.pop();if(Q)return Q;let j=document.createElement("div");return j.setAttribute("role","option"),j},release:(Q)=>{if(q.length<J)Q.className="",Q.textContent="",Q.removeAttribute("style"),Q.removeAttribute("data-index"),Q.removeAttribute("data-id"),q.push(Q)},clear:()=>{q.length=0}}};var l2=(J,q,Q,j,K)=>{if(j===0||q===0){K.start=0,K.end=0;return}let X=Q.indexAtOffset(J),U=u0(Q,X,q,j),N=X+U;K.start=Math.max(0,X),K.end=Math.min(j-1,Math.max(0,N))},r2=(J,q,Q,j)=>{if(Q===0){j.start=0,j.end=0;return}j.start=Math.max(0,J.start-q),j.end=Math.min(Q-1,J.end+q)},a2=(J,q,Q,j,K)=>{if(j===0)return 0;let X=Math.max(0,Math.min(J,j-1)),U=q.getOffset(X),N=q.getSize(X),D=Math.max(0,q.getTotalSize()-Q),Y;switch(K){case"center":Y=U-(Q-N)/2;break;case"end":Y=U-Q+N;break;default:Y=U}return Math.max(0,Math.min(Y,D))};var b2=(J)=>J<0.5?2*J*J:-1+(4-2*J)*J,v0=(J)=>{if(typeof J==="string")return{align:J,behavior:"auto",duration:300};if(J&&typeof J==="object")return{align:J.align??"start",behavior:J.behavior??"auto",duration:J.duration??300};return{align:"start",behavior:"auto",duration:300}},s2=(J,q)=>{let Q=null,j=()=>{if(Q!==null)cancelAnimationFrame(Q),Q=null};return{animateScroll:(X,U,N)=>{if(j(),Math.abs(U-X)<1){J.scrollTo(U);return}let D=performance.now(),Y=(W)=>{let F=W-D,M=Math.min(F/N,1),H=X+(U-X)*b2(M);if(J.scrollTo(H),q(),M<1)Q=requestAnimationFrame(Y);else Q=null};Q=requestAnimationFrame(Y)},cancelScroll:j}};var n2=(J,q)=>{let{dom:Q,emitter:j,resolvedConfig:K,rawConfig:X,rendered:U,pool:N,sharedState:D,isHorizontal:Y,classPrefix:W,contentSizeHandlers:F,afterScroll:M,clickHandlers:H,keydownHandlers:V,resizeHandlers:A,destroyHandlers:B,methods:y,onScrollFrame:L,resizeObserver:E,renderRange:O}=q;return{get dom(){return Q},get sizeCache(){return J.hc},get emitter(){return j},get config(){return K},get rawConfig(){return X},get renderer(){return{render:(_,$,h,v,G)=>{J.ss=h,J.fi=v,J.ffn()},updateItemClasses:(_,$,h)=>{let v=U.get(_);if(!v)return;v.classList.toggle(`${W}-item--selected`,$),v.classList.toggle(`${W}-item--focused`,h),v.ariaSelected=$?"true":"false"},updatePositions:()=>{},updateItem:()=>{},getElement:(_)=>U.get(_)??null,clear:()=>{},destroy:()=>{}}},set renderer(_){},get dataManager(){return J.dm},set dataManager(_){J.dm=_},get scrollController(){return J.sc},set scrollController(_){J.sc=_},state:D,getContainerWidth(){return J.cw},afterScroll:M,clickHandlers:H,keydownHandlers:V,resizeHandlers:A,contentSizeHandlers:F,destroyHandlers:B,methods:y,replaceTemplate(_){J.at=_},replaceRenderer(_){},replaceDataManager(_){J.dm=_},replaceScrollController(_){J.sc=_},getItemsForRange(_){let{dm:$,it:h}=J,v=[];for(let G=_.start;G<=_.end;G++){let p=$?$.getItem(G):h[G];if(p)v.push(p)}return v},getAllLoadedItems(){let _=J.dm;if(_){let $=_.getTotal(),h=[];for(let v=0;v<$;v++){let G=_.getItem(v);if(G)h.push(G)}return h}return[...J.it]},getVirtualTotal(){return J.vtf()},getCachedCompression(){let _=J.hc;return{isCompressed:!1,actualSize:_.getTotalSize(),virtualSize:_.getTotalSize(),ratio:1}},getCompressionContext(){return{scrollPosition:J.ls,totalItems:J.vtf(),containerSize:J.ch,rangeStart:O.start}},renderIfNeeded(){J.rfn()},forceRender(){J.ffn()},invalidateRendered(){for(let[,_]of U)_.remove(),N.release(_);U.clear()},getRenderFns(){return{renderIfNeeded:J.rfn,forceRender:J.ffn}},setRenderFns(_,$){J.rfn=_,J.ffn=$},setVirtualTotalFn(_){J.vtf=_},rebuildSizeCache(_){J.hc.rebuild(_??J.vtf())},setSizeConfig(_){J.hc=T0(_,J.vtf())},updateContentSize(_){let $=`${_}px`;if(Y)Q.content.style.width=$;else Q.content.style.height=$},updateCompressionMode(){},setVisibleRangeFn(_){J.gvr=_},setScrollToPosFn(_){J.gsp=_},setPositionElementFn(_){J.pef=_},setScrollFns(_,$){J.sgt=_,J.sst=(h)=>{$(h),L()}},setScrollTarget(_){J.st.removeEventListener("scroll",L),J.st=_,J.st.addEventListener("scroll",L,{passive:!0})},getScrollTarget(){return J.st},setContainerDimensions(_){J.gcw=_.width,J.gch=_.height,J.cw=_.width(),J.ch=_.height(),D.viewportState.containerSize=Y?J.cw:J.ch},disableViewportResize(){if(J.vre)J.vre=!1,E.unobserve(Q.viewport)},disableWheelHandler(){if(J.wh)Q.viewport.removeEventListener("wheel",J.wh),J.wh=null}}},o2=(J,q,Q)=>{let{rendered:j,itemState:K,contentSizeHandlers:X,applyTemplate:U,updateContentSize:N}=q,D=()=>{J.hc.rebuild(J.vtf()),N(),Q.updateCompressionMode();for(let Y=0;Y<X.length;Y++)X[Y]();J.ffn()};return{getState:()=>({total:J.it.length,cached:J.it.length,isLoading:!1,pendingRanges:[],error:void 0,hasMore:!1,cursor:void 0}),getTotal:()=>J.it.length,getCached:()=>J.it.length,getIsLoading:()=>!1,getHasMore:()=>!1,getStorage:()=>null,getPlaceholders:()=>null,getItem:(Y)=>J.it[Y],isItemLoaded:(Y)=>Y>=0&&Y<J.it.length&&J.it[Y]!==void 0,getItemsInRange:(Y,W)=>{let F=J.it,M=[],H=Math.max(0,Y),V=Math.min(W,F.length-1);for(let A=H;A<=V;A++)M.push(F[A]);return M},setTotal:(Y)=>{},setItems:(Y,W=0,F)=>{let M=J.it;if(W===0&&(F!==void 0||M.length===0))J.it=Y;else{let H=W+Y.length;if(M.length<H)M.length=H;for(let V=0;V<Y.length;V++)M[W+V]=Y[V]}if(J.ii)D()},updateItem:(Y,W)=>{let F=J.it;if(Y<0||Y>=F.length)return!1;let M=F[Y];if(!M)return!1;F[Y]={...M,...W};let H=j.get(Y);if(H)U(H,J.at(F[Y],Y,K)),H.dataset.id=String(F[Y].id);return!0},removeItem:(Y)=>{if(Y<0||Y>=J.it.length)return!1;if(J.it.splice(Y,1),J.ii)D();return!0},loadRange:async()=>{},ensureRange:async()=>{},loadInitial:async()=>{},loadMore:async()=>!1,reload:async()=>{},evictDistant:()=>{},clear:()=>{J.it=[]},reset:()=>{if(J.it=[],J.ii)J.hc.rebuild(0),N(),J.ffn()}}},i2=(J,q)=>{let{dom:Q,classPrefix:j}=q;return{getScrollTop:()=>J.sgt(),scrollTo:(K)=>{J.sst(K),J.ls=K,J.rfn()},scrollBy:(K)=>{let X=J.sgt()+K;J.sst(X),J.ls=X,J.rfn()},isAtTop:()=>J.ls<=2,isAtBottom:(K=2)=>J.sab(K),getScrollPercentage:()=>{let K=J.hc.getTotalSize(),X=Math.max(0,K-J.ch);return X>0?J.ls/X:0},getVelocity:()=>J.vt.velocity,isTracking:()=>J.vt.sampleCount>=2,isScrolling:()=>Q.root.classList.contains(`${j}--scrolling`),updateConfig:()=>{},enableCompression:()=>{J.sic=!0},disableCompression:()=>{J.sic=!1},isCompressed:()=>J.sic,isWindowMode:()=>!1,updateContainerHeight:(K)=>{J.ch=K},destroy:()=>{}}};var Y1=3,K1="vlist",t2=150,Z1=0,e2=(J)=>{if(!J.container)throw Error("[vlist/builder] Container is required");if(!J.item)throw Error("[vlist/builder] item configuration is required");let q=J.orientation==="horizontal",Q=q?"width":"height",j=q?"estimatedWidth":"estimatedHeight",K=q?J.item.width:J.item.height,X=q?J.item.estimatedWidth:J.item.estimatedHeight;if(K==null&&X==null)throw Error(`[vlist/builder] item.${Q} or item.${j} is required${q?" when orientation is 'horizontal'":""}`);if(K!=null){if(typeof K==="number"&&K<=0)throw Error(`[vlist/builder] item.${Q} must be a positive number`);if(typeof K!=="number"&&typeof K!=="function")throw Error(`[vlist/builder] item.${Q} must be a number or a function (index) => number`)}else if(X!=null){if(typeof X!=="number"||X<=0)throw Error(`[vlist/builder] item.${j} must be a positive number`)}if(!J.item.template)throw Error("[vlist/builder] item.template is required");if(q&&J.reverse)throw Error("[vlist/builder] horizontal direction cannot be combined with reverse mode");let U=new Map,N=!1,D={use(Y){if(N)throw Error("[vlist/builder] Cannot call .use() after .build()");return U.set(Y.name,Y),D},build(){if(N)throw Error("[vlist/builder] .build() can only be called once");return N=!0,U1(J,U,q,K,X??null)}};return D};function U1(J,q,Q,j,K){let{item:X,items:U,overscan:N=Y1,classPrefix:D=K1,ariaLabel:Y,reverse:W=!1,scroll:F}=J,M=F,H=M?.wheel??!0,V=M?.wrap??!1,A=W,B=`${D}-${Z1++}`,y=j??K,L=j==null&&K!=null,E=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||navigator.maxTouchPoints&&navigator.maxTouchPoints>2,O=Q?typeof X.height==="number"?X.height:void 0:typeof X.width==="number"?X.width:void 0,_={overscan:N,classPrefix:D,reverse:A,wrap:V,horizontal:Q,ariaIdPrefix:B},$=Array.from(q.values()).sort((b,x)=>(b.priority??50)-(x.priority??50)),h=new Set($.map((b)=>b.name));for(let b of $)if(b.conflicts){for(let x of b.conflicts)if(h.has(x))throw Error(`[vlist/builder] ${b.name} and ${x} cannot be combined`)}if(A){if(h.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with reverse: true")}let v=m2(J.container),G=d2(v,D,Y,Q);if(M?.wheel===!1)if(Q)G.viewport.style.overflowX="hidden";else G.viewport.style.overflow="hidden";if(M?.scrollbar==="none")G.viewport.classList.add(`${D}-viewport--no-scrollbar`);let p=t0(),i=U||[],w=L?i0(K,i.length):T0(y,i.length),u=c2(),Z={it:i,hc:w,ch:G.viewport.clientHeight,cw:G.viewport.clientWidth,id:!1,ii:!1,ls:0,vt:x2(0),ss:new Set,fi:-1,la:"",dm:null,sc:null,vtf:null,sgt:Q?()=>G.viewport.scrollLeft:()=>G.viewport.scrollTop,sst:Q?(b)=>{G.viewport.scrollLeft=b}:(b)=>{G.viewport.scrollTop=b},sab:(b=2)=>{let x=Z.hc.getTotalSize();return Z.ls+Z.ch>=x-b},sic:!1,rfn:null,ffn:null,gvr:(b,x,l,s,j0)=>{l2(b,x,l,s,j0)},gsp:(b,x,l,s,j0)=>{return a2(b,x,l,s,j0)},pef:null,at:X.template,vre:!0,st:G.viewport,wh:null,gcw:()=>Z.cw,gch:()=>Z.ch};Z.vtf=()=>Z.dm?Z.dm.getTotal():Z.it.length;let P=null,C=null,T=!1,k={start:0,end:0},R={start:0,end:0},f={start:-1,end:-1},r={viewportState:{scrollPosition:0,containerSize:Q?Z.cw:Z.ch,totalSize:Z.hc.getTotalSize(),actualSize:Z.hc.getTotalSize(),isCompressed:!1,compressionRatio:1,visibleRange:{start:0,end:0},renderRange:{start:0,end:0}},lastRenderRange:{start:-1,end:-1},isInitialized:!1,isDestroyed:!1,cachedCompression:null},Q0=new Map,z=L?new WeakMap:null,S=L?w:null,c=null,a=0,I=!1,m=()=>{if(!L)return;if(I){let b=Z.sgt(),x=Q?G.viewport.scrollWidth-G.viewport.clientWidth:G.viewport.scrollHeight-G.viewport.clientHeight,l=x>0&&b>=x-2;if(B0(),I=!1,l){let s=Math.max(0,Z.hc.getTotalSize()-(Q?Z.cw:Z.ch));if(s>b)Z.sst(s),Z.ls=s,Z.rfn()}}};if(L&&S&&z)c=new ResizeObserver((b)=>{if(Z.id)return;let x=!1,l=k.start;for(let s of b){let j0=z.get(s.target);if(j0===void 0)continue;let Z0=Q?s.borderBoxSize[0].inlineSize:s.borderBoxSize[0].blockSize;if(!S.isMeasured(j0)){let W0=S.getSize(j0);if(S.setMeasuredSize(j0,Z0),x=!0,j0<l&&Z0!==W0)a+=Z0-W0;c.unobserve(s.target);let A0=s.target;if(Q)A0.style.width=`${Z0}px`;else A0.style.height=`${Z0}px`}}if(!x)return;if(S.rebuild(Z.vtf()),Z.hc=S,a!==0){let s=Z.sgt();Z.sst(s+a),Z.ls=s+a,a=0}if(T)I=!0;else{let s=Z.sgt(),j0=Q?G.viewport.scrollWidth-G.viewport.clientWidth:G.viewport.scrollHeight-G.viewport.clientHeight,Z0=j0>0&&s>=j0-2;if(B0(),I=!1,Z0){let W0=Math.max(0,Z.hc.getTotalSize()-(Q?Z.cw:Z.ch));if(W0>s)Z.sst(W0),Z.ls=W0}}f.start=-1,f.end=-1,Z.rfn()});let o={selected:!1,focused:!1},e=`${D}-item`,t=[],q0=[],Y0=[],g=[],d=[],J0=[],n=new Map,U0=null,K0=null,M0=!1,E0=()=>{if(M0)return;M0=!0,U0=n.get("_getSelectedIds")??null,K0=n.get("_getFocusedIndex")??null},N0=(b,x)=>{if(typeof x==="string")b.innerHTML=x;else b.replaceChildren(x)},H0=(b,x)=>{let l=Math.round(Z.hc.getOffset(x));if(Q)b.style.transform=`translateX(${l}px)`;else b.style.transform=`translateY(${l}px)`};Z.pef=H0;let $0=(b,x)=>{let l=u.acquire();l.className=e;let s=!L||S&&S.isMeasured(b);if(Q){if(s)l.style.width=`${Z.hc.getSize(b)}px`;else l.style.width="";if(O!=null)l.style.height=`${O}px`}else if(s)l.style.height=`${Z.hc.getSize(b)}px`;else l.style.height="";if(l.dataset.index=String(b),l.dataset.id=String(x.id),l.ariaSelected="false",l.id=`${B}-item-${b}`,Z.la=String(Z.vtf()),l.setAttribute("aria-setsize",Z.la),l.setAttribute("aria-posinset",String(b+1)),String(x.id).startsWith("__placeholder_"))l.classList.add(`${D}-item--placeholder`);return N0(l,Z.at(x,b,o)),Z.pef(l,b),l},B0=()=>{let b=`${Z.hc.getTotalSize()}px`;if(Q)G.content.style.width=b;else G.content.style.height=b},L0=()=>{if(Z.id)return;E0();let b=U0?U0():Z.ss,x=K0?K0():Z.fi,l=Z.vtf(),s=Q?Z.cw:Z.ch;if(Z.gvr(Z.ls,s,Z.hc,l,k),r2(k,N,l,R),R.start===f.start&&R.end===f.end){if(Z.sic)for(let[X0,_0]of Q0)Z.pef(_0,X0);return}let j0=String(l),Z0=j0!==Z.la;Z.la=j0;for(let[X0,_0]of Q0)if(X0<R.start||X0>R.end)_0.remove(),u.release(_0),Q0.delete(X0);let W0=document.createDocumentFragment(),A0=[],I0=[];for(let X0=R.start;X0<=R.end;X0++){let _0=Z.dm?Z.dm.getItem(X0):Z.it[X0];if(!_0)continue;let G0=Q0.get(X0);if(G0){let y0=G0.dataset.id,p0=String(_0.id);if(y0!==p0){let iJ=y0?.startsWith("__placeholder_"),I2=p0.startsWith("__placeholder_");N0(G0,Z.at(_0,X0,o)),G0.dataset.id=p0;let p2=!L||S&&S.isMeasured(X0);if(Q)G0.style.width=p2?`${Z.hc.getSize(X0)}px`:"";else G0.style.height=p2?`${Z.hc.getSize(X0)}px`:"";if(I2)G0.classList.add(`${D}-item--placeholder`);else G0.classList.remove(`${D}-item--placeholder`);if(iJ&&!I2)G0.classList.add(`${D}-item--replaced`),setTimeout(()=>{G0.classList.remove(`${D}-item--replaced`)},300)}Z.pef(G0,X0);let n0=b.has(_0.id),oJ=X0===x;if(G0.classList.toggle(`${D}-item--selected`,n0),G0.classList.toggle(`${D}-item--focused`,oJ),G0.ariaSelected=n0?"true":"false",Z0)G0.setAttribute("aria-setsize",Z.la)}else{let y0=$0(X0,_0);I0.push({index:X0,element:y0});let p0=b.has(_0.id),n0=X0===x;if(p0)y0.classList.add(`${D}-item--selected`),y0.ariaSelected="true";if(n0)y0.classList.add(`${D}-item--focused`);W0.appendChild(y0),A0.push({index:X0,element:y0})}}if(A0.length>0){G.items.appendChild(W0);for(let{index:X0,element:_0}of A0)Q0.set(X0,_0)}if(L&&c&&S&&z){for(let{index:X0,element:_0}of I0)if(!S.isMeasured(X0))z.set(_0,X0),c.observe(_0)}f.start=R.start,f.end=R.end,r.lastRenderRange.start=R.start,r.lastRenderRange.end=R.end,r.viewportState.scrollPosition=Z.ls,r.viewportState.visibleRange.start=k.start,r.viewportState.visibleRange.end=k.end,r.viewportState.renderRange.start=R.start,r.viewportState.renderRange.end=R.end,p.emit("range:change",{range:{start:R.start,end:R.end}})},D0=()=>{f.start=-1,f.end=-1,Z.rfn()};Z.rfn=L0,Z.ffn=D0;let O0=()=>{if(Z.id)return;let b=Z.sgt(),x=b>=Z.ls?"down":"up";if(Z.vt=E2(Z.vt,b),!G.root.classList.contains(`${D}--scrolling`))G.root.classList.add(`${D}--scrolling`);T=!0,Z.ls=b,Z.rfn(),p.emit("scroll",{scrollPosition:b,direction:x}),p.emit("velocity:change",{velocity:Z.vt.velocity,reliable:Z.vt.sampleCount>=g2});for(let l=0;l<t.length;l++)t[l](b,x);if(C)clearTimeout(C);C=setTimeout(()=>{G.root.classList.remove(`${D}--scrolling`),T=!1,Z.vt.velocity=0,Z.vt.sampleCount=0,p.emit("velocity:change",{velocity:0,reliable:!1}),m()},M?.idleTimeout??t2)},b0=null;if(Z.st.addEventListener("scroll",O0,{passive:!0}),H&&!Q&&!E)b0=(b)=>{b.preventDefault();let x=Z.sgt(),l=b.deltaY,s=Math.max(0,Math.min(x+l,Z.hc.getTotalSize()-Z.ch));Z.sst(s),Z.ls=s,Z.vt=E2(Z.vt,s),Z.rfn();let j0=s>=x?"down":"up";if(p.emit("scroll",{scrollPosition:s,direction:j0}),!G.root.classList.contains(`${D}--scrolling`))G.root.classList.add(`${D}--scrolling`);if(T=!0,C)clearTimeout(C);C=setTimeout(()=>{G.root.classList.remove(`${D}--scrolling`),T=!1,Z.vt.velocity=0,Z.vt.sampleCount=0,p.emit("velocity:change",{velocity:0,reliable:!1}),m()},M?.idleTimeout??t2)},Z.wh=b0,G.viewport.addEventListener("wheel",b0,{passive:!1});else if(Q&&H)b0=(b)=>{if(b.deltaX)return;b.preventDefault(),G.viewport.scrollLeft+=b.deltaY},Z.wh=b0,G.viewport.addEventListener("wheel",b0,{passive:!1});let z2=(b)=>{let l=b.target.closest("[data-index]");if(l){let s=parseInt(l.dataset.index??"-1",10);if(s>=0){let j0=Z.dm?.getItem(s)??Z.it[s];if(j0){if(j0.__groupHeader)return;p.emit("item:click",{item:j0,index:s,event:b})}}}for(let s=0;s<q0.length;s++)q0[s](b)},pJ=(b)=>{let l=b.target.closest("[data-index]");if(l){let s=parseInt(l.dataset.index??"-1",10);if(s>=0){let j0=Z.dm?.getItem(s)??Z.it[s];if(j0){if(j0.__groupHeader)return;p.emit("item:dblclick",{item:j0,index:s,event:b})}}}},w2=(b)=>{for(let x=0;x<Y0.length;x++)Y0[x](b)};G.items.addEventListener("click",z2),G.items.addEventListener("dblclick",pJ),G.root.addEventListener("keydown",w2);let O2=new ResizeObserver((b)=>{if(Z.id)return;for(let x of b){let l=x.contentRect.height,s=x.contentRect.width,j0=Q?s:l,Z0=Q?Z.cw:Z.ch;if(Z.cw=s,Z.ch=l,Math.abs(j0-Z0)>1){if(r.viewportState.containerSize=j0,Z.ii)B0(),Z.rfn(),p.emit("resize",{height:l,width:s})}if(Z.ii)for(let W0=0;W0<g.length;W0++)g[W0](s,l)}});if(Z.vre)O2.observe(G.viewport);let A2={dom:G,emitter:p,resolvedConfig:_,rawConfig:J,rendered:Q0,pool:u,itemState:o,sharedState:r,renderRange:R,isHorizontal:Q,classPrefix:D,contentSizeHandlers:d,afterScroll:t,clickHandlers:q0,keydownHandlers:Y0,resizeHandlers:g,destroyHandlers:J0,methods:n,onScrollFrame:O0,resizeObserver:O2,applyTemplate:N0,updateContentSize:B0},V0=n2(Z,A2);Z.dm=o2(Z,A2,V0),Z.sc=i2(Z,A2);let S2=new Map;for(let b of $)if(b.methods)for(let x of b.methods){let l=S2.get(x);if(l)throw Error(`[vlist/builder] Method "${x}" is registered by both "${l}" and "${b.name}"`);S2.set(x,b.name)}for(let b of $)b.setup(V0);if(Z.ii=!0,V0.state.isInitialized=!0,B0(),Z.rfn(),A&&Z.it.length>0){let b=Z.gsp(Z.it.length-1,Z.hc,Z.ch,Z.it.length,"end");Z.sst(b),Z.ls=b,Z.rfn()}let hJ=(b)=>{V0.dataManager.setItems(b,0,b.length)},uJ=A?(b)=>{let x=Z.sab(2),l=Z.it.length;if(V0.dataManager.setItems(b,l),x&&Z.it.length>0){let s=Z.gsp(Z.it.length-1,Z.hc,Z.ch,Z.it.length,"end");Z.sst(s),Z.ls=s,Z.rfn()}}:(b)=>{let x=Z.it.length;V0.dataManager.setItems(b,x)},gJ=A?(b)=>{let x=Z.sgt(),l=Z.hc.getTotalSize(),s=[...Z.it];V0.dataManager.clear(),V0.dataManager.setItems([...b,...s],0);let Z0=Z.hc.getTotalSize()-l;if(Z0>0)Z.sst(x+Z0),Z.ls=x+Z0}:(b)=>{let x=[...Z.it];V0.dataManager.clear(),V0.dataManager.setItems([...b,...x],0)},xJ=(b,x)=>{V0.dataManager.updateItem(b,x)},mJ=(b)=>{V0.dataManager.removeItem(b)},dJ=async()=>{if(V0.dataManager.reload)await V0.dataManager.reload()},s0=()=>{if(P!==null)cancelAnimationFrame(P),P=null},cJ=(b,x,l)=>{if(s0(),Math.abs(x-b)<1){Z.sst(x),Z.ls=x,Z.rfn();return}let s=performance.now(),j0=(Z0)=>{let W0=Z0-s,A0=Math.min(W0/l,1),I0=b+(x-b)*b2(A0);if(Z.sst(I0),Z.ls=I0,Z.rfn(),A0<1)P=requestAnimationFrame(j0);else P=null};P=requestAnimationFrame(j0)},lJ=(b,x)=>{let{align:l,behavior:s,duration:j0}=v0(x),Z0=Z.vtf(),W0=b;if(V&&Z0>0)W0=(W0%Z0+Z0)%Z0;let A0=Z.gsp(W0,Z.hc,Z.ch,Z0,l);if(s==="smooth")cJ(Z.sgt(),A0,j0);else s0(),Z.sst(A0)},rJ=()=>Z.sgt(),aJ=(b,x)=>{return p.on(b,x)},sJ=(b,x)=>{p.off(b,x)},nJ=()=>{if(Z.id)return;if(Z.id=!0,V0.state.isDestroyed=!0,G.items.removeEventListener("click",z2),G.root.removeEventListener("keydown",w2),Z.st.removeEventListener("scroll",O0),O2.disconnect(),c)c.disconnect(),c=null;if(Z.wh)G.viewport.removeEventListener("wheel",Z.wh);if(C)clearTimeout(C);for(let b=0;b<J0.length;b++)J0[b]();for(let b of $)if(b.destroy)b.destroy();s0();for(let[,b]of Q0)b.remove(),u.release(b);Q0.clear(),u.clear(),p.clear(),G.root.remove()},f2={get element(){return G.root},get items(){if(n.has("_getItems"))return n.get("_getItems")();return Z.it},get total(){if(n.has("_getTotal"))return n.get("_getTotal")();return Z.vtf()},setItems:n.has("setItems")?n.get("setItems"):hJ,appendItems:n.has("appendItems")?n.get("appendItems"):uJ,prependItems:n.has("prependItems")?n.get("prependItems"):gJ,updateItem:n.has("updateItem")?n.get("updateItem"):xJ,removeItem:n.has("removeItem")?n.get("removeItem"):mJ,reload:n.has("reload")?n.get("reload"):dJ,scrollToIndex:n.has("scrollToIndex")?n.get("scrollToIndex"):lJ,cancelScroll:n.has("cancelScroll")?n.get("cancelScroll"):s0,getScrollPosition:n.has("getScrollPosition")?n.get("getScrollPosition"):rJ,on:aJ,off:sJ,destroy:nJ};for(let[b,x]of n){if(b.charCodeAt(0)===95||b==="setItems"||b==="appendItems"||b==="prependItems"||b==="updateItem"||b==="removeItem"||b==="reload"||b==="scrollToIndex"||b==="scrollToItem"||b==="cancelScroll"||b==="getScrollPosition")continue;f2[b]=x}return f2}Q2();var S0=(J,q,Q={},j="vlist",K=!1)=>{let{autoHide:X=!0,autoHideDelay:U=1000,minThumbSize:N=30,showOnHover:D=!0,hoverZoneWidth:Y=16,showOnViewportEnter:W=!0}=Q,F=0,M=0,H=0,V=0,A=!1,B=!1,y=0,L=0,E=0,O=null,_=!1,$=null,h=null,v=K?"width":"height",G=K?"translateX":"translateY",p=K?(t)=>t.clientX:(t)=>t.clientY,i=K?"left":"top",w=document.createElement("div"),u=document.createElement("div"),Z=D?document.createElement("div"):null,P=()=>{if(w.className=`${j}-scrollbar`,u.className=`${j}-scrollbar-thumb`,K)w.classList.add(`${j}-scrollbar--horizontal`);if(w.appendChild(u),J.appendChild(w),Z){if(Z.className=`${j}-scrollbar-hover`,K)Z.classList.add(`${j}-scrollbar-hover--horizontal`),Z.style.height=`${Y}px`;else Z.style.width=`${Y}px`;J.appendChild(Z)}},C=()=>{if(O)clearTimeout(O),O=null},T=()=>{if(!X)return;C(),O=setTimeout(R,U)},k=()=>{if(F<=M)return;if(C(),!_)w.classList.add(`${j}-scrollbar--visible`),_=!0;if(X&&!A&&!B)T()},R=()=>{if(A||B)return;w.classList.remove(`${j}-scrollbar--visible`),_=!1},f=(t,q0)=>{F=t,M=q0;let Y0=F>M;if(w.style.display=Y0?"":"none",!Y0){R();return}let g=M/F;H=Math.max(N,g*M),u.style[v]=`${H}px`,V=M-H,r(E)},r=(t)=>{if(E=t,F<=M||V<=0)return;let q0=F-M,g=Math.min(1,Math.max(0,t/q0))*V;u.style.transform=`${G}(${g}px)`},Q0=(t)=>{if(t.target===u)return;let q0=w.getBoundingClientRect(),d=p(t)-q0[i]-H/2,n=Math.max(0,Math.min(d,V))/V,U0=F-M,K0=n*U0;q(K0),k()},z=(t)=>{t.preventDefault(),t.stopPropagation(),A=!0,y=p(t),L=E,C(),w.classList.add(`${j}-scrollbar--dragging`),document.addEventListener("mousemove",S),document.addEventListener("mouseup",c)},S=(t)=>{if(!A)return;let q0=p(t)-y,Y0=V>0?q0/V:0,g=F-M,d=Y0*g,J0=Math.max(0,Math.min(L+d,g)),U0=J0/g*V;if(u.style.transform=`${G}(${U0}px)`,h=J0,$===null)$=requestAnimationFrame(()=>{if(h!==null)q(h);$=null})},c=()=>{if(A=!1,$!==null)cancelAnimationFrame($),$=null;if(h!==null)q(h),h=null;if(w.classList.remove(`${j}-scrollbar--dragging`),X&&!B)T();document.removeEventListener("mousemove",S),document.removeEventListener("mouseup",c)},a=()=>{if(W)k()},I=()=>{if(!A){if(B=!1,X)T()}},m=()=>{B=!0,C(),k()},o=()=>{if(B=!1,!A&&X)T()},e=()=>{if(C(),$!==null)cancelAnimationFrame($),$=null;if(w.removeEventListener("click",Q0),w.removeEventListener("mouseenter",m),w.removeEventListener("mouseleave",o),u.removeEventListener("mousedown",z),J.removeEventListener("mouseenter",a),J.removeEventListener("mouseleave",I),document.removeEventListener("mousemove",S),document.removeEventListener("mouseup",c),Z){if(Z.removeEventListener("mouseenter",m),Z.removeEventListener("mouseleave",o),Z.parentNode)Z.parentNode.removeChild(Z)}if(w.parentNode)w.parentNode.removeChild(w)};if(P(),w.addEventListener("click",Q0),w.addEventListener("mouseenter",m),w.addEventListener("mouseleave",o),u.addEventListener("mousedown",z),J.addEventListener("mouseenter",a),J.addEventListener("mouseleave",I),Z)Z.addEventListener("mouseenter",m),Z.addEventListener("mouseleave",o);return{show:k,hide:R,updateBounds:f,updatePosition:r,isVisible:()=>_,destroy:e}};var WJ=(J)=>{let q=null;return{name:"withScrollbar",priority:30,setup(Q){let{dom:j,config:K}=Q,{classPrefix:X,horizontal:U}=K;if(q=S0(j.viewport,(Y)=>Q.scrollController.scrollTo(Y),J??{},X,U),!j.viewport.classList.contains(`${X}-viewport--custom-scrollbar`))j.viewport.classList.add(`${X}-viewport--custom-scrollbar`);let N=Q.getCachedCompression();q.updateBounds(N.virtualSize,Q.state.viewportState.containerSize);let D=q;Q.afterScroll.push((Y,W)=>{D.updatePosition(Y),D.show()}),Q.resizeHandlers.push((Y,W)=>{if(D){let F=Q.getCachedCompression();D.updateBounds(F.virtualSize,Q.state.viewportState.containerSize)}}),Q.contentSizeHandlers.push(()=>{if(D){let Y=Q.getCachedCompression();D.updateBounds(Y.virtualSize,Q.state.viewportState.containerSize)}}),Q.destroyHandlers.push(()=>{if(D)D.destroy()})},destroy(){if(q)q.destroy(),q=null}}};var DJ=(J=0)=>{let q=[,,,,,,,,];for(let Q=0;Q<8;Q++)q[Q]={position:0,time:0};return{velocity:0,lastPosition:J,lastTime:performance.now(),samples:q,sampleIndex:0,sampleCount:0}},j2=(J,q)=>{let Q=performance.now(),j=Q-J.lastTime;if(j===0)return J;if(j>100){J.sampleCount=0,J.sampleIndex=0,J.velocity=0;let X=J.samples[0];return X.position=q,X.time=Q,J.sampleIndex=1,J.sampleCount=1,J.lastPosition=q,J.lastTime=Q,J}let K=J.samples[J.sampleIndex];if(K.position=q,K.time=Q,J.sampleIndex=(J.sampleIndex+1)%8,J.sampleCount=Math.min(J.sampleCount+1,8),J.sampleCount>=2){let X=(J.sampleIndex-J.sampleCount+8)%8,U=J.samples[X],N=q-U.position,D=Q-U.time;J.velocity=D>0?N/D:0}return J.lastPosition=q,J.lastTime=Q,J},B1=(J)=>J.sampleCount>=3,_J=(J,q={})=>{let{wheel:Q=!0,sensitivity:j=1,smoothing:K=!1,idleTimeout:X=150,onScroll:U,onIdle:N,scrollElement:D,horizontal:Y=!1}=q,W=!!D,F=0,M=0,H=W?Y?window.innerWidth:window.innerHeight:Y?J.clientWidth:J.clientHeight,V=q.compressed??!1,A=q.compression,B=DJ(),y=!1,L=null,O=q2(()=>{let I=Y?J.scrollLeft:J.scrollTop,m=I>=F?"down":"up";if(B=j2(B,I),F=I,U)U({scrollTop:F,direction:m,velocity:B.velocity});p()}),$=q2(()=>{let I=J.getBoundingClientRect(),m=Y?Math.max(0,-I.left):Math.max(0,-I.top),o=m>=F?"down":"up";if(B=j2(B,m),F=m,!y)y=!0;if(U)U({scrollTop:F,direction:o,velocity:B.velocity});p()}),h=(I)=>{I.preventDefault()},v=(I)=>{if(I.deltaX)return;I.preventDefault(),J.scrollLeft+=I.deltaY},G=(I)=>{if(!V)return;I.preventDefault();let m=(Y?I.deltaX||I.deltaY:I.deltaY)*j,o=F+m;if(K)o=F+m*0.3;if(o=Math.max(0,Math.min(o,M)),o!==F){let t=o>=F?"down":"up";if(B=j2(B,o),F=o,!y)y=!0;if(U)U({scrollTop:F,direction:t,velocity:B.velocity});p()}},p=()=>{if(L)clearTimeout(L);L=setTimeout(()=>{if(y=!1,B=DJ(F),N)N()},X)},i=(I)=>{if(V)return;if(V=!0,A=I,M=I.virtualSize-H,W)return;if(O.cancel(),J.removeEventListener("scroll",O),!Q)J.removeEventListener("wheel",h);else if(Y)J.removeEventListener("wheel",v);if(Y)J.style.overflowX="hidden";else J.style.overflow="hidden";if(Q)J.addEventListener("wheel",G,{passive:!1});let m=Y?J.scrollLeft:J.scrollTop;if(m>0){let o=Y?A?.actualSize??J.scrollWidth:A?.actualSize??J.scrollHeight;F=m/o*M}if(Y)J.scrollLeft=0;else J.scrollTop=0},w=()=>{if(!V)return;if(V=!1,W){A=void 0;return}if(J.removeEventListener("wheel",G),Y)J.style.overflowX="auto";else J.style.overflow="auto";if(J.addEventListener("scroll",O,{passive:!0}),!Q)J.addEventListener("wheel",h,{passive:!1});else if(Y)J.addEventListener("wheel",v,{passive:!1});if(A&&F>0){let m=F/M*(A.actualSize-H);if(Y)J.scrollLeft=m;else J.scrollTop=m}A=void 0},u=()=>{if(W||V)return F;return Y?J.scrollLeft:J.scrollTop},Z=(I,m=!1)=>{let o=Math.max(0,Math.min(I,M||1/0));if(W){let e=J.getBoundingClientRect();if(Y){let t=e.left+window.scrollX;window.scrollTo({left:t+o,behavior:m?"smooth":"auto"})}else{let t=e.top+window.scrollY;window.scrollTo({top:t+o,behavior:m?"smooth":"auto"})}}else if(V){if(o===F)return;let t=o>=F?"down":"up";if(B=j2(B,o),F=o,!y)y=!0;if(U)U({scrollTop:F,direction:t,velocity:B.velocity});p()}else if(Y)J.scrollTo({left:o,behavior:m?"smooth":"auto"});else J.scrollTo({top:o,behavior:m?"smooth":"auto"})},P=(I)=>{Z(u()+I)},C=()=>{return u()<=0},T=(I=0)=>{let m=u(),o=W||V?M:Y?J.scrollWidth-J.clientWidth:J.scrollHeight-J.clientHeight;return m>=o-I},k=()=>{let I=u(),m=W||V?M:Y?J.scrollWidth-J.clientWidth:J.scrollHeight-J.clientHeight;if(m<=0)return 0;return Math.min(1,Math.max(0,I/m))},R=(I)=>{if(I.compression)A=I.compression,M=A.virtualSize-H},f=()=>V,r=()=>Math.abs(B.velocity),Q0=()=>B1(B),z=()=>y,S=()=>W,c=(I)=>{if(H=I,A)M=A.virtualSize-H},a=()=>{if(L)clearTimeout(L);if(W)$.cancel(),window.removeEventListener("scroll",$);else O.cancel(),J.removeEventListener("scroll",O),J.removeEventListener("wheel",G),J.removeEventListener("wheel",h),J.removeEventListener("wheel",v)};if(W){if(V&&A)M=A.virtualSize-H;window.addEventListener("scroll",$,{passive:!0})}else if(V&&A){if(M=A.virtualSize-H,Y)J.style.overflowX="hidden";else J.style.overflow="hidden";if(Q)J.addEventListener("wheel",G,{passive:!1})}else{if(Y)J.style.overflowX="auto",J.style.overflowY="hidden";else J.style.overflow="auto";if(J.addEventListener("scroll",O,{passive:!0}),!Q)J.addEventListener("wheel",h,{passive:!1});else if(Y)J.addEventListener("wheel",v,{passive:!1})}return{getScrollTop:u,scrollTo:Z,scrollBy:P,isAtTop:C,isAtBottom:T,getScrollPercentage:k,getVelocity:r,isTracking:Q0,isScrolling:z,updateConfig:R,enableCompression:i,disableCompression:w,isCompressed:f,isWindowMode:S,updateContainerHeight:c,destroy:a}},q2=(J)=>{let q=null,Q=null,j=(...K)=>{if(Q=K,q===null)q=requestAnimationFrame(()=>{if(q=null,Q)J(...Q)})};return j.cancel=()=>{if(q!==null)cancelAnimationFrame(q),q=null},j};var N1=0.65,W1=0.5,D1=0.95,_1=0.1,V1=5,G1=100,VJ=()=>{let J=null,q=0,Q=!1,j=0,K=null,X=0,U=0,N=null,D=[];return{name:"withScale",priority:20,setup(Y){let{dom:W,config:F}=Y,{classPrefix:M,horizontal:H}=F,V=()=>{let L=Y.getVirtualTotal(),E=F0(L,Y.sizeCache);if(E.isCompressed&&!Q){Q=!0,Y.scrollController.enableCompression(E),Y.updateContentSize(E.virtualSize),Y.setScrollFns(()=>q,(w)=>{if(q=w,j=w,K!==null)cancelAnimationFrame(K),K=null});let O=()=>{let w=j-q;if(Math.abs(w)<W1)q=j,K=null;else{q+=w*N1;let Z=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize;q=Math.max(0,Math.min(q,Z)),K=requestAnimationFrame(O)}Y.scrollController.scrollTo(q)},_=W.viewport,$=(w)=>{w.preventDefault();let Z=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize;if(j=Math.max(0,Math.min(j+w.deltaY,Z)),K===null)K=requestAnimationFrame(O)};_.addEventListener("wheel",$,{passive:!1});let h=()=>{if(N!==null)cancelAnimationFrame(N),N=null},v=(w)=>{if(h(),K!==null)cancelAnimationFrame(K),K=null;let u=w.touches[0];if(!u)return;let Z=H?u.clientX:u.clientY;X=Z,U=q,D=[{time:performance.now(),y:Z}]},G=(w)=>{w.preventDefault();let u=w.touches[0];if(!u)return;let Z=H?u.clientX:u.clientY,P=performance.now();if(D.push({time:P,y:Z}),D.length>V1)D.shift();let C=X-Z,k=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize,R=Math.max(0,Math.min(U+C,k));q=R,j=R,Y.scrollController.scrollTo(R)},p=(w)=>{let u=performance.now(),Z=D.filter((k)=>u-k.time<G1),P=0;if(Z.length>=2){let k=Z[0],R=Z[Z.length-1],f=R.time-k.time;if(f>0)P=(k.y-R.y)/f}if(D=[],Math.abs(P)<_1)return;let C=P*16,T=()=>{if(C*=D1,Math.abs(C)<0.5){N=null;return}let R=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize,f=q+C;if(f=Math.max(0,Math.min(f,R)),f<=0&&C<0||f>=R&&C>0){q=f,j=f,Y.scrollController.scrollTo(f),N=null;return}q=f,j=f,Y.scrollController.scrollTo(f),N=requestAnimationFrame(T)};N=requestAnimationFrame(T)};if(_.addEventListener("touchstart",v,{passive:!0}),_.addEventListener("touchmove",G,{passive:!1}),_.addEventListener("touchend",p,{passive:!0}),_.addEventListener("touchcancel",p,{passive:!0}),Y.destroyHandlers.push(()=>{if(_.removeEventListener("wheel",$),_.removeEventListener("touchstart",v),_.removeEventListener("touchmove",G),_.removeEventListener("touchend",p),_.removeEventListener("touchcancel",p),h(),K!==null)cancelAnimationFrame(K),K=null}),!W.viewport.querySelector(`.${M}-scrollbar`)){if(J=S0(W.viewport,(u)=>Y.scrollController.scrollTo(u),{},M,H),!W.viewport.classList.contains(`${M}-viewport--custom-scrollbar`))W.viewport.classList.add(`${M}-viewport--custom-scrollbar`);J.updateBounds(E.virtualSize,Y.state.viewportState.containerSize);let w=J;Y.afterScroll.push((u,Z)=>{if(w)w.updatePosition(u),w.show()}),Y.resizeHandlers.push((u,Z)=>{if(w){let P=Y.getCachedCompression();w.updateBounds(P.virtualSize,Y.state.viewportState.containerSize)}})}}else if(!E.isCompressed&&Q)Q=!1,Y.scrollController.disableCompression(),Y.updateContentSize(E.actualSize);else if(E.isCompressed)Y.scrollController.updateConfig({compression:E}),Y.updateContentSize(E.virtualSize);if(J)J.updateBounds(E.virtualSize,Y.state.viewportState.containerSize);Y.state.cachedCompression={state:E,totalItems:L}};Y.updateCompressionMode=V;let A=Y.getCachedCompression.bind(Y);Y.getCachedCompression=()=>{if(Y.state.cachedCompression)return Y.state.cachedCompression.state;return A()},Y.setVisibleRangeFn((L,E,O,_,$)=>{B=null,y=null;let h=F0(_,O);e0(L,E,O,_,h,$)}),Y.setScrollToPosFn((L,E,O,_,$)=>{let h=F0(_,E);return J2(L,E,O,_,h,$)});let B=null,y=null;Y.setPositionElementFn((L,E)=>{let O=Y.getVirtualTotal(),_=F0(O,Y.sizeCache);if(_.isCompressed){let $=Y.scrollController.getScrollTop();if(B===null||E<y)y=E,B=Math.round(w0(E,$,Y.sizeCache,O,Y.state.viewportState.containerSize,_));let h=B+Y.sizeCache.getOffset(E)-Y.sizeCache.getOffset(y),v=Y.config.horizontal;L.style.transform=v?`translateX(${h}px)`:`translateY(${h}px)`}else{let $=Math.round(Y.sizeCache.getOffset(E)),h=Y.config.horizontal;L.style.transform=h?`translateX(${$}px)`:`translateY(${$}px)`}}),V(),Y.destroyHandlers.push(()=>{if(J)J.destroy(),J=null;if(K!==null)cancelAnimationFrame(K),K=null})},destroy(){if(J)J.destroy(),J=null;if(K!==null)cancelAnimationFrame(K),K=null;if(N!==null)cancelAnimationFrame(N),N=null}}};var X2=(J={})=>{let{chunkSize:q=100,maxCachedItems:Q=5000,evictionBuffer:j=200,onEvict:K}=J,X=new Map,U=0,N=0,D=(P)=>{let C=X.get(P);if(!C)C={items:Array(q),count:0,lastAccess:Date.now()},X.set(P,C);else C.lastAccess=Date.now();return C},Y=(P)=>{return Math.floor(P/q)},W=(P)=>{return P%q},F=()=>U,M=(P)=>{U=P},H=(P)=>{if(P<0||P>=U)return;let C=Y(P),T=X.get(C);if(!T)return;return T.items[W(P)]},V=(P)=>{if(P<0||P>=U)return!1;let C=Y(P),T=X.get(C);if(!T)return!1;return T.items[W(P)]!==void 0},A=(P,C)=>{let T=Y(P),k=D(T),R=W(P),f=k.items[R]===void 0;if(k.items[R]=C,f)k.count++,N++;if(P>=U)U=P+1},B=(P,C)=>{for(let T=0;T<C.length;T++){let k=C[T];if(k!==void 0)A(P+T,k)}},y=(P)=>{if(P<0||P>=U)return!1;let C=Y(P),T=X.get(C);if(!T)return!1;let k=W(P);if(T.items[k]===void 0)return!1;if(T.items[k]=void 0,T.count--,N--,T.count===0)X.delete(C);return!0},L=(P,C)=>{let T=[];for(let k=P;k<=C&&k<U;k++)T.push(H(k));return T},E=(P,C)=>{for(let T=P;T<=C&&T<U;T++)if(!V(T))return!1;return!0},O=()=>{let P=[],C=null,T=Array.from(X.keys()).sort((k,R)=>k-R);for(let k of T){let R=X.get(k);if(!R)continue;let f=k*q;for(let r=0;r<q;r++){let Q0=f+r;if(Q0>=U)break;if(R.items[r]!==void 0)if(C===null)C={start:Q0,end:Q0};else if(Q0===C.end+1)C.end=Q0;else P.push(C),C={start:Q0,end:Q0};else if(C!==null)P.push(C),C=null}}if(C!==null)P.push(C);return P},_=(P,C)=>{let T=[],k=null;for(let R=P;R<=C&&R<U;R++)if(!V(R))if(k===null)k={start:R,end:R};else k.end=R;else if(k!==null)T.push(k),k=null;if(k!==null)T.push(k);return T},$=(P)=>{return X.has(P)},h=(P)=>{let C=X.get(P);if(C)C.lastAccess=Date.now()},v=(P,C)=>{if(P>C||X.size===0)return;let T=Date.now(),k=Y(Math.max(0,P)),R=Y(Math.min(U-1,C));for(let f=k;f<=R;f++){let r=X.get(f);if(r)r.lastAccess=T}},G=(P,C)=>{if(N<=Q)return 0;let T=Math.max(0,P-j),k=Math.min(U-1,C+j),R=Y(T),f=Y(k),r=0,Q0=[];for(let[z,S]of X)if(z<R||z>f)r+=S.count,Q0.push(z),N-=S.count,X.delete(z);if(r>0&&K)K(r,Q0);return r},p=()=>{if(N<=Q)return 0;let P=Array.from(X.entries()).sort(([,k],[,R])=>k.lastAccess-R.lastAccess),C=0,T=[];for(let[k,R]of P){if(N<=Q)break;C+=R.count,N-=R.count,T.push(k),X.delete(k)}if(C>0&&K)K(C,T);return C},i=()=>{return{totalItems:U,cachedItems:N,cachedChunks:X.size,chunkSize:q,maxCachedItems:Q,memoryEfficiency:U>0?1-N/U:1}},w=()=>N,u=()=>{X.clear(),N=0};return{chunkSize:q,maxCachedItems:Q,getTotal:F,setTotal:M,get:H,has:V,set:A,setRange:B,delete:y,getRange:L,isRangeLoaded:E,getLoadedRanges:O,findUnloadedRanges:_,getChunkIndex:Y,isChunkLoaded:$,touchChunk:h,touchChunksForRange:v,evictDistant:G,evictToLimit:p,getStats:i,getCachedCount:w,clear:u,reset:()=>{u(),U=0}}},Y2=(J)=>{if(J.length===0)return[];let q=[...J].sort((j,K)=>j.start-K.start),Q=[{...q[0]}];for(let j=1;j<q.length;j++){let K=q[j],X=Q[Q.length-1];if(K.start<=X.end+1)X.end=Math.max(X.end,K.end);else Q.push({...K})}return Q},g0=(J,q,Q)=>{let j=Math.floor(J.start/Q)*Q,K=Math.ceil((J.end+1)/Q)*Q-1,X={start:j,end:K};if(q.length===0)return[X];let U=[],N=Y2(q),D=X.start;for(let Y of N){if(Y.end<D)continue;if(Y.start>X.end)break;if(Y.start>D)U.push({start:D,end:Math.min(Y.start-1,X.end)});if(D=Y.end+1,D>X.end)break}if(D<=X.end)U.push({start:D,end:X.end});return U};var K2=(J={})=>{let{maskCharacter:q=qJ,maxSampleSize:Q=XJ}=J,j=[],K=!1,X=0,U=(F)=>{if(K||F.length===0)return;let M=Math.min(F.length,Q);for(let H=0;H<M;H++){let V=F[H];if(!V||typeof V!=="object")continue;let A={};for(let[B,y]of Object.entries(V)){if(B.startsWith("_")||B==="id")continue;A[B]=String(y??"").length}if(Object.keys(A).length>0)j.push(A)}K=!0},N=()=>K,D=(F)=>{let M={id:`${YJ}${X++}`,[T2]:!0,_index:F};if(j.length===0)return M.label=q.repeat(12),M;let H=j[F%j.length];for(let[V,A]of Object.entries(H))M[V]=q.repeat(Math.max(1,A));return M};return{analyzeStructure:U,hasAnalyzedStructure:N,generate:D,generateRange:(F,M)=>{let H=[];for(let V=F;V<=M;V++)H.push(D(V));return H},clear:()=>{j=[],K=!1,X=0}}},P0=(J)=>{if(!J||typeof J!=="object")return!1;return J[T2]===!0},H2=(J)=>{return J.filter((q)=>!P0(q))};var O1=50,Z2=(J={})=>{let{adapter:q,initialItems:Q,initialTotal:j,storage:K,placeholder:X,pageSize:U=O1,onStateChange:N,onItemsLoaded:D,onItemsEvicted:Y}=J,W=X2({...K,onEvict:(g,d)=>{Y?.(g),_()}}),F=null,M=()=>{if(!F)F=K2(X);return F},H=new Map,V=!1,A,B=!0,y,L=[],E=0,O=new Map,_=()=>{N?.(Z())},$=()=>{H.clear();let g=W.getLoadedRanges();for(let d of g)for(let J0=d.start;J0<=d.end;J0++){let n=W.get(J0);if(n&&!P0(n))H.set(n.id,J0)}},h=(g,d)=>{if(!P0(d))H.set(d.id,g)},v=(g)=>{H.delete(g)},G=(g,d)=>{return`${g}-${d}`},p=()=>W.getTotal(),i=()=>W.getCachedCount(),w=()=>V,u=()=>B,Z=()=>({total:W.getTotal(),cached:W.getCachedCount(),isLoading:V,pendingRanges:L,error:A,hasMore:B,cursor:y}),P=()=>W,C=()=>M(),T=(g)=>{let d=W.get(g);if(d!==void 0)return d;if(g>=0&&g<W.getTotal())return M().generate(g);return},k=(g)=>{let d=H.get(g);if(d===void 0)return;return W.get(d)},R=(g)=>{return H.get(g)??-1},f=(g)=>{let d=W.get(g);return d!==void 0&&!P0(d)},r=(g,d)=>{let J0=[],n=W.getTotal(),U0=0,K0=0;W.touchChunksForRange(g,Math.min(d,n-1));for(let M0=g;M0<=d&&M0<n;M0++){let E0=W.get(M0);if(E0!==void 0)J0.push(E0),U0++;else J0.push(M().generate(M0)),K0++}return J0},Q0=(g)=>{W.setTotal(g),B=W.getCachedCount()<g,_()},z=(g,d=0,J0)=>{if(F&&!F.hasAnalyzedStructure()&&g.length>0)F.analyzeStructure(g);for(let n=0;n<g.length;n++){let U0=g[n];if(U0!==void 0){let K0=d+n;W.set(K0,U0),h(K0,U0)}}if(J0!==void 0)W.setTotal(J0);else if(d+g.length>W.getTotal())W.setTotal(d+g.length);if(W.getCachedCount()>=W.getTotal()&&W.getTotal()>0)B=!1;D?.(g,d,W.getTotal()),_()},S=(g,d)=>{let J0=H.get(g);if(J0===void 0)return!1;let n=W.get(J0);if(!n)return!1;let U0={...n,...d};if(W.set(J0,U0),d.id!==void 0&&d.id!==g)v(g),h(J0,U0);return _(),!0},c=(g)=>{let d=H.get(g);if(d===void 0)return!1;W.delete(d),v(g);let J0=W.getTotal();if(J0>0)W.setTotal(J0-1);return _(),!0},a=async(g,d)=>{if(!q)return;let J0=G(g,d);if(O.has(J0))return;let n=W.getLoadedRanges(),U0=g0({start:g,end:d},n,W.chunkSize);if(U0.length===0)return;let K0=W.chunkSize,M0=[];for(let N0 of U0){let H0=Math.floor(N0.start/K0),$0=Math.floor(N0.end/K0);for(let B0=H0;B0<=$0;B0++){let L0=B0*K0,D0=L0+K0-1,O0=G(L0,D0);if(!M0.some((b0)=>b0.start===L0)&&!O.has(O0))M0.push({start:L0,end:D0})}}let E0=[];for(let N0 of U0){let H0=Math.floor(N0.start/K0),$0=Math.floor(N0.end/K0);for(let B0=H0;B0<=$0;B0++){let L0=B0*K0,D0=L0+K0-1,O0=G(L0,D0);if(O.has(O0)){let b0=O.get(O0);if(!E0.includes(b0))E0.push(b0)}}}for(let N0 of M0){let H0=G(N0.start,N0.end),$0=(async()=>{L.push(N0),V=!0,A=void 0,_();try{let B0=N0.end-N0.start+1,L0={offset:N0.start,limit:B0,cursor:void 0},D0=await q.read(L0);if(z(D0.items,N0.start,D0.total),D0.cursor)y=D0.cursor;let O0=N0.start+D0.items.length;if(O0>=E){if(E=O0,D0.hasMore!==void 0)B=D0.hasMore;else if(D0.total!==void 0)B=O0<D0.total}}catch(B0){A=B0 instanceof Error?B0:Error(String(B0))}finally{O.delete(H0),L=L.filter((B0)=>B0.start!==N0.start||B0.end!==N0.end),V=O.size>0,_()}})();O.set(H0,$0),E0.push($0)}await Promise.all(E0)},I=async(g,d)=>{if(W.isRangeLoaded(g,d))return;await a(g,d)},m=async()=>{if(!q)return;await a(0,U-1)},o=async()=>{if(!q||V||!B)return!1;let g=W.getCachedCount(),d=W.getTotal(),J0=g,n=Math.min(J0+U-1,d>0?d-1:J0+U-1);if(J0>=d&&d>0)return B=!1,!1;return await a(J0,n),W.getCachedCount()>g},e=async()=>{if(W.clear(),W.setTotal(0),H.clear(),F)F.clear();O.clear(),L=[],V=!1,y=void 0,B=!0,E=0,A=void 0,_()},t=(g,d)=>{if(W.evictDistant(g,d)>0)$()},q0=()=>{W.clear(),H.clear(),y=void 0,A=void 0,L=[],V=!1,_()},Y0=()=>{if(W.reset(),H.clear(),F)F.clear();y=void 0,B=!0,E=0,A=void 0,L=[],V=!1,_()};if(Q&&Q.length>0)z(Q,0,j??Q.length);else if(j!==void 0)W.setTotal(j),_();return{getState:Z,getTotal:p,getCached:i,getIsLoading:w,getHasMore:u,getStorage:P,getPlaceholders:C,getItem:T,getItemById:k,getIndexById:R,isItemLoaded:f,getItemsInRange:r,setTotal:Q0,setItems:z,updateItem:S,removeItem:c,loadRange:a,ensureRange:I,loadInitial:m,loadMore:o,reload:e,evictDistant:t,clear:q0,reset:Y0}};var GJ=(J)=>{let{adapter:q,loading:Q,storage:j,total:K,autoLoad:X=!0}=J,U=Q?.cancelThreshold??JJ,N=Q?.preloadThreshold??QJ,D=Q?.preloadAhead??jJ;return{name:"withAsync",priority:20,methods:["reload","loadVisibleRange"],setup(Y){let{emitter:W}=Y,F=Y.config.reverse,M=Z2({adapter:q,...K!==void 0&&{initialTotal:K},pageSize:j?.chunkSize??z0,...j&&{storage:{...j.chunkSize!==void 0&&{chunkSize:j.chunkSize},...j.maxCachedItems!==void 0&&{maxCachedItems:j.maxCachedItems}}},onStateChange:()=>{if(Y.state.isInitialized){let O=Y.getVirtualTotal();Y.sizeCache.rebuild(O),Y.updateCompressionMode();let _=Y.getCachedCompression();Y.state.viewportState.totalSize=_.virtualSize,Y.state.viewportState.actualSize=_.actualSize,Y.state.viewportState.isCompressed=_.isCompressed,Y.state.viewportState.compressionRatio=_.ratio,Y.updateContentSize(_.virtualSize),Y.renderIfNeeded()}},onItemsLoaded:(O,_,$)=>{if(Y.state.isInitialized)Y.forceRender(),W.emit("load:end",{items:O,total:$,offset:_})}});Y.replaceDataManager(M);let H=null,V=null,A=0,B=()=>{if(V){let O=V;V=null,Y.dataManager.ensureRange(O.start,O.end).catch((_)=>{W.emit("error",{error:_,context:"ensureRange"})})}};Y.afterScroll.push((O,_)=>{if(Y.state.isDestroyed)return;let $=Y.scrollController.getVelocity(),v=Y.scrollController.isTracking()&&$<=U;if(V&&A>U&&$<=U){let i=V;V=null,Y.dataManager.ensureRange(i.start,i.end).catch((w)=>{W.emit("error",{error:w,context:"ensureRange"})})}if(A=$,v&&!Y.dataManager.getIsLoading()&&Y.dataManager.getHasMore()){if(F){if(O<y2)W.emit("load:start",{offset:Y.dataManager.getCached(),limit:z0}),Y.dataManager.loadMore().catch((i)=>{W.emit("error",{error:i,context:"loadMore"})})}else if(Y.state.viewportState.totalSize-O-Y.state.viewportState.containerSize<y2)W.emit("load:start",{offset:Y.dataManager.getCached(),limit:z0}),Y.dataManager.loadMore().catch((w)=>{W.emit("error",{error:w,context:"loadMore"})})}let{renderRange:G}=Y.state.viewportState;if(!H||G.start!==H.start||G.end!==H.end)if(H={start:G.start,end:G.end},v){V=null;let{start:i,end:w}=G,u=Y.getVirtualTotal();if($>N)if(_==="down")w=Math.min(G.end+D,u-1);else i=Math.max(G.start-D,0);Y.dataManager.ensureRange(i,w).catch((Z)=>{W.emit("error",{error:Z,context:"ensureRange"})})}else V={start:G.start,end:G.end}});let y=200,L=null;Y.afterScroll.push((O,_)=>{if(L!==null)clearTimeout(L);L=setTimeout(()=>{L=null,B()},y)}),Y.destroyHandlers.push(()=>{if(L!==null)clearTimeout(L),L=null});let E=()=>{if(Y.state.isDestroyed)return;H=null;let{renderRange:O}=Y.state.viewportState;if(O.end>0)Y.dataManager.ensureRange(O.start,O.end).catch((_)=>{W.emit("error",{error:_,context:"ensureRange"})});B()};if(window.addEventListener("online",E),Y.destroyHandlers.push(()=>{window.removeEventListener("online",E)}),W.on("load:start",()=>{Y.dom.root.setAttribute("aria-busy","true")}),W.on("load:end",()=>{Y.dom.root.removeAttribute("aria-busy")}),Y.methods.set("loadVisibleRange",async()=>{H=null,V=null,Y.forceRender();let{renderRange:O}=Y.state.viewportState;if(O.end>0)W.emit("load:start",{offset:O.start,limit:O.end-O.start+1}),await Y.dataManager.ensureRange(O.start,O.end)}),Y.methods.set("reload",async()=>{H=null,V=null,Y.invalidateRendered(),await Y.dataManager.reload(),W.emit("load:start",{offset:0,limit:z0}),await Y.dataManager.loadInitial(),Y.forceRender();let{renderRange:O}=Y.state.viewportState;if(O.end>0)await Y.dataManager.ensureRange(O.start,O.end)}),X)W.emit("load:start",{offset:0,limit:z0}),Y.dataManager.loadInitial().catch((O)=>{W.emit("error",{error:O,context:"loadInitial"})});else if(K!==void 0)Y.dataManager.setTotal(K)}}};var MJ=()=>{let J=null;return{name:"withPage",priority:5,setup(q){let{dom:Q,state:j,config:K,emitter:X}=q;if(Q.root.style.overflow="visible",Q.root.style.height="auto",K.horizontal)Q.viewport.style.overflowX="visible",Q.viewport.style.overflowY="visible";else Q.viewport.style.overflow="visible";Q.viewport.classList.remove(`${K.classPrefix}-viewport--custom-scrollbar`),q.disableViewportResize(),q.disableWheelHandler(),q.setScrollTarget(window),q.setScrollFns(()=>{let Y=Q.viewport.getBoundingClientRect();if(K.horizontal)return Math.max(0,-Y.left);else return Math.max(0,-Y.top)},(Y)=>{let W=Q.viewport.getBoundingClientRect();if(K.horizontal){let F=W.left+window.scrollX;window.scrollTo(F+Y,window.scrollY)}else{let F=W.top+window.scrollY;window.scrollTo(window.scrollX,F+Y)}}),q.setContainerDimensions({width:()=>window.innerWidth,height:()=>window.innerHeight}),j.viewportState.containerSize=window.innerHeight;let{innerHeight:U,innerWidth:N}=window,D=()=>{let{innerWidth:Y,innerHeight:W}=window,F=K.horizontal?Y:W,M=K.horizontal?N:U;if(Math.abs(F-M)<=1)return;U=W,N=Y,j.viewportState.containerSize=W,X.emit("resize",{width:Y,height:W});for(let H=0;H<q.resizeHandlers.length;H++)q.resizeHandlers[H](Y,W);q.renderIfNeeded()};window.addEventListener("resize",D,{passive:!0}),J=()=>{window.removeEventListener("resize",D)},q.destroyHandlers.push(J)},destroy(){if(J)J(),J=null}}};var $2=(J,q)=>{let Q=0,j=J.length-1;while(Q<j){let K=Q+j+1>>>1;if(J[K].headerLayoutIndex<=q)Q=K;else j=K-1}return Q},OJ=(J,q)=>{let Q=0,j=J.length-1;while(Q<j){let K=Q+j+1>>>1;if(J[K].firstDataIndex<=q)Q=K;else j=K-1}return Q},AJ=(J,q)=>{if(J===0)return[];let Q=[],j=q(0),K=0,X=0;for(let U=1;U<J;U++){let N=q(U);if(N!==j){let D=U-K;Q.push({key:j,groupIndex:Q.length,headerLayoutIndex:X,firstDataIndex:K,count:D}),X=X+1+D,j=N,K=U}}return Q.push({key:j,groupIndex:Q.length,headerLayoutIndex:X,firstDataIndex:K,count:J-K}),Q},x0=(J,q)=>{if(J.length===0||q.length===0)return[];let Q=J.length+q.length,j=Array(Q),K=0;for(let X of q){j[K]={id:`__group_header_${X.groupIndex}`,__groupHeader:!0,groupKey:X.key,groupIndex:X.groupIndex},K++;for(let U=0;U<X.count;U++)j[K]=J[X.firstDataIndex+U],K++}return j},m0=(J,q)=>{let Q=typeof q==="number"?(j)=>q:q;return(j)=>{let K=J.getEntry(j);if(K.type==="header")return J.getHeaderHeight(K.group.groupIndex);return Q(K.dataIndex)}},U2=(J,q)=>{let Q=AJ(J,q.getGroupForIndex),j=J+Q.length,K=q.headerHeight;return{get totalEntries(){return j},get groupCount(){return Q.length},get groups(){return Q},getEntry:(M)=>{if(Q.length===0)return{type:"item",dataIndex:M,group:{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0}};let H=$2(Q,M),V=Q[H];if(M===V.headerLayoutIndex)return{type:"header",group:V};let A=M-V.headerLayoutIndex-1;return{type:"item",dataIndex:V.firstDataIndex+A,group:V}},layoutToDataIndex:(M)=>{if(Q.length===0)return M;let H=$2(Q,M),V=Q[H];if(M===V.headerLayoutIndex)return-1;let A=M-V.headerLayoutIndex-1;return V.firstDataIndex+A},dataToLayoutIndex:(M)=>{if(Q.length===0)return M;let H=OJ(Q,M),V=Q[H],A=M-V.firstDataIndex;return V.headerLayoutIndex+1+A},getGroupAtLayoutIndex:(M)=>{if(Q.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let H=$2(Q,M);return Q[H]},getGroupAtDataIndex:(M)=>{if(Q.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let H=OJ(Q,M);return Q[H]},getHeaderHeight:typeof K==="number"?(M)=>K:(M)=>{let H=Q[M];if(!H)return 0;return K(H.key,M)},rebuild:(M)=>{Q=AJ(M,q.getGroupForIndex),j=M+Q.length}}};var B2=(J,q,Q,j,K,X=!1)=>{let U=document.createElement("div");if(U.className=`${K}-sticky-header`,U.setAttribute("role","presentation"),U.setAttribute("aria-hidden","true"),U.style.position="absolute",U.style.zIndex="5",U.style.pointerEvents="none",U.style.willChange="transform",U.style.overflow="hidden",X)U.style.top="0",U.style.bottom="0",U.style.left="0";else U.style.top="0",U.style.left="0",U.style.right="0";J.insertBefore(U,J.firstChild);let N=-1,D=!1,Y=0,W=(B)=>{if(B===N)return;N=B;let y=q.groups;if(B<0||B>=y.length){U.textContent="";return}let L=y[B],E=j.headerTemplate(L.key,L.groupIndex),O=q.getHeaderHeight(B);if(X)U.style.width=`${O}px`;else U.style.height=`${O}px`;if(typeof E==="string")U.innerHTML=E;else U.replaceChildren(E)},F=(B)=>{let y=q.groups;if(y.length===0){H();return}let L=Q.getOffset(y[0].headerLayoutIndex);if(B<L){H();return}let E=0,O=y.length-1;while(E<O){let G=E+O+1>>>1;if(Q.getOffset(y[G].headerLayoutIndex)<=B)E=G;else O=G-1}let _=E;if(!D)M();W(_);let $=q.getHeaderHeight(_),h=0,v=_+1;if(v<y.length){let p=Q.getOffset(y[v].headerLayoutIndex)-B;if(p<$)h=p-$}if(h!==Y)if(Y=h,h===0)U.style.transform="";else{let G=Math.round(h);U.style.transform=X?`translateX(${G}px)`:`translateY(${G}px)`}},M=()=>{if(D)return;D=!0,U.style.display=""},H=()=>{if(!D)return;D=!1,U.style.display="none",N=-1,Y=0,U.style.transform=""},V=()=>{let B=N;if(N=-1,B>=0)W(B)},A=()=>{U.remove(),N=-1,D=!1};return U.style.display="none",{update:F,refresh:V,show:M,hide:H,destroy:A}};var FJ=(J,q,Q,j,K,X)=>{if(j===0||q===0)return X.start=0,X.end=-1,X;let U=Q.indexAtOffset(J),N=Q.indexAtOffset(J+q);if(N<j-1)N++;return X.start=Math.max(0,U),X.end=Math.min(j-1,Math.max(0,N)),X},EJ=(J,q,Q,j)=>{if(Q===0)return j.start=0,j.end=-1,j;return j.start=Math.max(0,J.start-q),j.end=Math.min(Q-1,J.end+q),j},LJ=(J,q,Q,j,K,X)=>{if(j===0)return 0;let U=Math.max(0,Math.min(J,j-1)),N=q.getOffset(U),D=q.getSize(U),Y=q.getTotalSize(),W=Math.max(0,Y-Q),F;switch(X){case"center":F=N-Q/2+D/2;break;case"end":F=N-Q+D;break;case"start":default:F=N;break}return Math.max(0,Math.min(F,W))},bJ=(J,q,Q)=>{if(Q&&Q.isCompressed)return Q.virtualSize;return q.getTotalSize()},yJ=(J,q)=>{return q.getTotalSize()},TJ=(J,q)=>{return q.getOffset(J)},HJ=(J,q,Q)=>{let j=Math.max(0,q-Q);return Math.max(0,Math.min(J,j))};var C0=(J,q,Q,j,K="start",X,U=LJ)=>{return U(J,q,Q,j,X,K)},$J=(J,q)=>{return J.start===q.start&&J.end===q.end},kJ=(J,q)=>{return J>=q.start&&J<=q.end},PJ=(J)=>{if(J.end<J.start)return 0;return J.end-J.start+1};var RJ=(J,q)=>{let Q=[],j=[];for(let K=J.start;K<=J.end;K++)if(K<q.start||K>q.end)j.push(K);for(let K=q.start;K<=q.end;K++)if(K<J.start||K>J.end)Q.push(K);return{add:Q,remove:j}};Q2();var vJ=(J)=>{if(!J.getGroupForIndex)throw Error("[vlist/builder] withGroups: getGroupForIndex is required");if(J.headerHeight==null||J.headerHeight<=0)throw Error("[vlist/builder] withGroups: headerHeight must be a positive number");if(!J.headerTemplate)throw Error("[vlist/builder] withGroups: headerTemplate is required");let q=null,Q=null,j=[],K=[];return{name:"withSections",priority:10,setup(X){let{dom:U,config:N,rawConfig:D}=X,{classPrefix:Y}=N,F=D.item.height;j=D.items?[...D.items]:[];let M=j.length,H={getGroupForIndex:J.getGroupForIndex,headerHeight:J.headerHeight,headerTemplate:J.headerTemplate,sticky:J.sticky??!1};q=U2(M,H),K=x0(j,q.groups);let V=m0(q,F);X.setSizeConfig(V),X.rebuildSizeCache(K.length),X.dataManager.setItems(K,0,K.length);let A=D.item.template,{headerTemplate:B}=J,y=(v,G,p)=>{if(R0(v))return B(v.groupKey,v.groupIndex);return A(v,G,p)},L=X.methods.get("_getGridLayout"),E=X.methods.get("_replaceGridRenderer"),O=X.methods.get("_updateGridLayoutForGroups");if(L&&E){if(O)O((i)=>{let w=K[i];return!!(w&&R0(w))});let{createGridRenderer:v}=(N2(),Q1(CJ)),G=L(),p=v(U.items,y,X.sizeCache,G,Y,X.getContainerWidth(),()=>X.dataManager.getTotal(),N.ariaIdPrefix);E(p)}else X.replaceTemplate(y);if(U.root.classList.add(`${Y}--grouped`),J.sticky!==!1){Q=B2(U.root,q,X.sizeCache,{...H,sticky:H.sticky??!1},Y,N.horizontal);let v=Q;X.afterScroll.push((G,p)=>{v.update(G)}),Q.update(X.scrollController.getScrollTop())}let _=()=>{if(!q)return;q.rebuild(j.length),K=x0(j,q.groups);let v=m0(q,F);if(X.setSizeConfig(v),X.rebuildSizeCache(K.length),X.dataManager.setItems(K,0,K.length),Q)Q.refresh()};X.methods.set("setItems",(v)=>{j=v.slice(),_()}),X.methods.set("appendItems",(v)=>{j.push(...v),_()}),X.methods.set("prependItems",(v)=>{j.unshift(...v),_()}),X.methods.set("removeItem",(v)=>{j=j.filter((G)=>G.id!==v),_()});let{animateScroll:$,cancelScroll:h}=s2(X.scrollController,X.renderIfNeeded);X.methods.set("scrollToIndex",(v,G)=>{let p=q.dataToLayoutIndex(v),{align:i,behavior:w,duration:u}=v0(G),Z=X.dataManager.getTotal(),P=C0(p,X.sizeCache,X.state.viewportState.containerSize,Z,i,X.getCachedCompression());if(w==="smooth")$(X.scrollController.getScrollTop(),P,u);else h(),X.scrollController.scrollTo(P)}),X.methods.set("_getItems",()=>j),X.methods.set("_getTotal",()=>j.length),X.destroyHandlers.push(()=>{if(h(),Q)Q.destroy(),Q=null;U.root.classList.remove(`${Y}--grouped`)})},destroy(){if(Q)Q.destroy(),Q=null}}};var W2=(J)=>{let q=Math.max(1,Math.floor(J.columns)),Q=J.gap??0,j=J.isHeaderFn,K={row:0,col:0},X=(V)=>{if(V<=0)return 0;if(!j)return Math.ceil(V/q);let A=0,B=0,y=0;for(let L=0;L<V;L++)if(j(L)){if(y++,B>0)A++,B=0;A++,B=0}else if(B++,B>=q)A++,B=0;if(B>0)A++;return A},U=(V)=>{return K.row=N(V),K.col=D(V),K},N=(V)=>{if(!j)return Math.floor(V/q);let A=0,B=0;for(let y=0;y<=V;y++)if(j(y)){if(B>0)A++,B=0;if(y===V)return A;A++,B=0}else{if(y===V)return A;if(B++,B>=q)A++,B=0}return console.warn(`⚠️ getRow(${V}) fell through - returning ${A}`),A},D=(V)=>{if(!j)return V%q;if(j(V))return 0;let A=0;for(let B=0;B<=V;B++)if(j(B))A=0;else{if(B===V)return A;if(A++,A>=q)A=0}return A},Y=(V,A,B)=>{if(B<=0)return{start:0,end:-1};if(!j){let _=Math.max(0,V*q),$=Math.min(B-1,(A+1)*q-1);return{start:_,end:$}}let y=-1,L=-1,E=0,O=0;for(let _=0;_<B;_++){if(j(_)){if(O>0)E++,O=0;if(E>=V&&E<=A){if(y===-1)y=_;L=_}E++,O=0}else{if(E>=V&&E<=A){if(y===-1)y=_;L=_}if(O++,O>=q)E++,O=0}if(E>A&&O===0)break}if(y===-1)return{start:0,end:-1};return{start:y,end:L}},W=(V,A,B)=>{if(A<0||A>=q)return-1;let y=V*q+A;if(y<0||y>=B)return-1;return y},F=(V)=>{let A=(q-1)*Q;return Math.max(0,(V-A)/q)};return{get columns(){return q},get gap(){return Q},update:(V)=>{if(V.columns!==void 0)q=Math.max(1,Math.floor(V.columns));if(V.gap!==void 0)Q=V.gap;if(V.isHeaderFn!==void 0)j=V.isHeaderFn},getTotalRows:X,getPosition:U,getRow:N,getCol:D,getItemRange:Y,getItemIndex:W,getColumnWidth:F,getColumnOffset:(V,A)=>{let B=F(A);return V*(B+Q)}}};N2();var E1=new Set,zJ=(J)=>{if(!J.columns||J.columns<1)throw Error("[vlist/builder] withGrid: columns must be a positive integer >= 1");let q=null,Q=null;return{name:"withGrid",priority:10,setup(j){let{dom:K,emitter:X,config:U,rawConfig:N}=j,{classPrefix:D}=U;if(U.reverse)throw Error("[vlist/builder] withGrid cannot be used with reverse: true");let Y=U.horizontal,W=()=>Y?K.viewport.clientHeight:j.getContainerWidth(),F=N.items?.some((T)=>T.__groupHeader===!0),M={columns:J.columns,gap:J.gap??0};if(F)M.isHeaderFn=(T)=>{let k=j.dataManager.getItem(T);return!!(k&&k.__groupHeader===!0)};q=W2(M);let H=q.gap;j.setVirtualTotalFn(()=>{let T=j.dataManager.getTotal();return q.getTotalRows(T)});let V=N.item,A=U.horizontal?V.width:V.height,B={containerWidth:W(),columns:q.columns,gap:q.gap};if(typeof A==="function")j.setSizeConfig((T)=>{let k=B.containerWidth-2,R=(B.columns-1)*B.gap,f=(k-R)/B.columns,r={containerWidth:B.containerWidth,columns:B.columns,gap:B.gap,columnWidth:f,row:q.getRow(T),column:q.getCol(T),totalRows:q.getTotalRows(j.dataManager.getTotal()),totalColumns:B.columns};return A(T,r)+B.gap});else if(H>0)j.setSizeConfig(A+H);j.rebuildSizeCache(),K.root.classList.add(`${D}--grid`);let y=W(),L=N.item.template,E=()=>{Q=d0(K.items,L,j.sizeCache,q,D,y,()=>j.dataManager.getTotal(),U.ariaIdPrefix,U.horizontal),j.replaceRenderer(Q)};E(),j.methods.set("_getGridLayout",()=>q),j.methods.set("_getGridConfig",()=>M),j.methods.set("_replaceGridRenderer",(T)=>{Q=T}),j.methods.set("_updateGridLayoutForGroups",(T)=>{q.update({isHeaderFn:T});let k=j.dataManager.getTotal(),R=0;for(let f=0;f<k;f++)if(q.getCol(f)===0){let r=j.sizeCache.getSize(f);R+=r}if(j.sizeCache.getTotalSize=()=>R,U.horizontal)j.dom.content.style.width=`${R}px`;else j.dom.content.style.height=`${R}px`;E()}),j.methods.set("updateGrid",(T)=>{if(T.columns!==void 0){if(!Number.isInteger(T.columns)||T.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");M.columns=T.columns}if(T.gap!==void 0){if(T.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");M.gap=T.gap}if(q)q.update(M);let k=W();if(B.containerWidth=k,B.columns=M.columns,B.gap=M.gap??0,Q)Q.updateContainerWidth(k);j.rebuildSizeCache(),j.updateContentSize(j.sizeCache.getTotalSize()),j.updateCompressionMode();for(let R=0;R<j.contentSizeHandlers.length;R++)j.contentSizeHandlers[R]();if(Q)Q.clear();j.forceRender()});let O=null,_=null,$=!1,h=()=>{if($)return;$=!0,O=j.methods.get("_getSelectedIds")??null,_=j.methods.get("_getFocusedIndex")??null},v=-1,G=-1,p=!0,i=U.overscan??3,w={start:0,end:0},u={start:0,end:0},Z=()=>{if(j.state.isDestroyed)return;let T=j.scrollController.getScrollTop(),k=j.state.viewportState.containerSize;if(!p&&T===v&&k===G)return;v=T,G=k,p=!1;let R=j.getVirtualTotal();if(R===0||k===0)w.start=0,w.end=0;else{w.start=Math.max(0,j.sizeCache.indexAtOffset(T));let o=j.sizeCache.indexAtOffset(T+k);if(o<R-1)o++;w.end=Math.min(R-1,Math.max(0,o))}u.start=Math.max(0,w.start-i),u.end=Math.min(R-1,w.end+i);let f=j.state.viewportState;f.scrollPosition=T,f.visibleRange.start=w.start,f.visibleRange.end=w.end,f.renderRange.start=u.start,f.renderRange.end=u.end;let r=j.state.lastRenderRange,Q0=f.isCompressed,z=j.dataManager.getTotal(),S=q.getItemRange(u.start,u.end,z),c=j.dataManager.getItemsInRange(S.start,S.end),a=Q0?j.getCompressionContext():void 0;h();let I=O?O():E1,m=_?_():-1;if(Q.render(c,S,I,m,a),r.start!==u.start||r.end!==u.end)r.start=u.start,r.end=u.end,X.emit("range:change",{range:{start:u.start,end:u.end}})},P=()=>{if(j.state.isDestroyed)return;j.state.lastRenderRange.start=-1,j.state.lastRenderRange.end=-1,p=!0,Z()};j.setRenderFns(Z,P);let C=typeof A==="function";if(j.resizeHandlers.push((T,k)=>{let R=Y?k:T;if(B.containerWidth=R,Q)Q.updateContainerWidth(R);if(C){j.rebuildSizeCache(),j.updateContentSize(j.sizeCache.getTotalSize()),j.updateCompressionMode();for(let f=0;f<j.contentSizeHandlers.length;f++)j.contentSizeHandlers[f]();if(Q)Q.clear();j.forceRender()}}),j.methods.set("scrollToIndex",(T,k)=>{let R=Math.floor(T/J.columns),{align:f,behavior:r}=v0(k),Q0=j.dataManager.getState(),z=q.getTotalRows(Q0.total),S=Math.max(0,Math.min(R,z-1)),c=C0(S,j.sizeCache,j.state.viewportState.containerSize,z,f,j.getCachedCompression());if(r==="smooth")j.scrollController.scrollTo(c);else j.scrollController.scrollTo(c)}),!j.methods.has("_getTotal"))j.methods.set("_getTotal",()=>j.dataManager.getTotal());j.destroyHandlers.push(()=>{if(Q)Q.destroy(),Q=null;K.root.classList.remove(`${D}--grid`)})},destroy(){if(Q)Q.destroy(),Q=null}}};N2();var D2=(J)=>{let q=Math.max(1,Math.floor(J.columns)),Q=J.gap??0,j=J.containerSize,K=0,X=[],U=()=>{let B=(q-1)*Q;K=Math.max(0,(j-B)/q),X=Array(q);let y=K+Q;for(let L=0;L<q;L++)X[L]=L*y};U();let N=[],D=0,Y=[],W=(B)=>{let y=0,L=B[0];for(let E=1;E<B.length;E++){let O=B[E];if(O<L)L=O,y=E}return y},F=(B,y)=>{if(B<=0)return D=0,N=[],[];let L=Array(q).fill(0),E=Array(q);for(let $=0;$<q;$++)E[$]=[];let O=Array(B);for(let $=0;$<B;$++){let h=W(L),v=y($),G=L[h];O[$]={index:$,x:X[h],y:G,lane:h,size:v,crossSize:K},E[h].push($),L[h]=G+v+Q}N=E;let _=0;for(let $=0;$<q;$++){let h=L[$],v=h>0?h-Q:0;if(v>_)_=v}return D=_,O},M=(B)=>{if(B.length===0)return D>0?D:0;if(D>0)return D;let y=Array(q).fill(0);for(let E of B){let O=E.y+E.size,_=y[E.lane];if(O>_)y[E.lane]=O}let L=0;for(let E=0;E<q;E++)if(y[E]>L)L=y[E];return L},H=(B,y,L)=>{if(B.length===0||L<=y)return Y.length=0,Y;if(N.length===0||N.length!==q)return V(B,y,L);Y.length=0;for(let E=0;E<q;E++){let O=N[E],_=O.length;if(_===0)continue;let $=0,h=_;while($<h){let v=$+h>>>1,G=B[O[v]];if(G.y+G.size<=y)$=v+1;else h=v}for(let v=$;v<_;v++){let G=B[O[v]];if(G.y>=L)break;Y.push(G)}}return Y},V=(B,y,L)=>{let E=[];for(let O of B)if(O.y+O.size>y&&O.y<L)E.push(O);return E};return{get columns(){return q},get gap(){return Q},get containerSize(){return j},update:(B)=>{let y=!1;if(B.columns!==void 0){let L=Math.max(1,Math.floor(B.columns));if(L!==q)q=L,y=!0}if(B.gap!==void 0&&B.gap!==Q)Q=B.gap,y=!0;if(B.containerSize!==void 0&&B.containerSize!==j)j=B.containerSize,y=!0;if(y)U()},calculateLayout:F,getTotalSize:M,getVisibleItems:H}};var L1=(J=200)=>{let q=[];return{acquire:()=>{let X=q.pop();if(X)return X;let U=document.createElement("div");return U.setAttribute("role","option"),U},release:(X)=>{if(X.remove(),q.length<J)X.className="",X.textContent="",X.removeAttribute("style"),X.removeAttribute("data-index"),X.removeAttribute("data-id"),X.removeAttribute("data-lane"),q.push(X)},clear:()=>{q.length=0}}};var _2=(J,q,Q,j=!1,K,X)=>{let U=L1(),N=new Map,D=new Set,Y=0,W="",F=-1,M={selected:!1,focused:!1},H=(G,p)=>{return M.selected=G,M.focused=p,M},V=`${Q}-item ${Q}-masonry-item`,A=`${Q}-item--selected`,B=`${Q}-item--focused`,y=(G,p)=>{if(typeof p==="string")G.innerHTML=p;else G.replaceChildren(p)},L=(G,p,i)=>{G.classList.toggle(A,p),G.classList.toggle(B,i)},E=(G,p)=>{if(j)G.style.transform=`translate(${Math.round(p.y)}px, ${Math.round(p.x)}px)`;else G.style.transform=`translate(${Math.round(p.x)}px, ${Math.round(p.y)}px)`},O=(G,p)=>{if(j)G.style.width=`${p.size}px`,G.style.height=`${p.crossSize}px`;else G.style.width=`${p.crossSize}px`,G.style.height=`${p.size}px`},_=(G,p,i,w,u)=>{let Z=U.acquire(),P=H(w,u);if(Z.className=V,Z.dataset.index=String(G),Z.dataset.id=String(p.id),Z.dataset.lane=String(i.lane),Z.ariaSelected=String(w),X)Z.id=`${X}-item-${G}`;if(K){let T=K();if(T!==F)F=T,W=String(T);Z.setAttribute("aria-setsize",W),Z.setAttribute("aria-posinset",String(G+1))}O(Z,i);let C=q(p,G,P);return y(Z,C),L(Z,w,u),E(Z,i),{element:Z,lastItemId:p.id,lastSelected:w,lastFocused:u,lastY:i.y,lastX:i.x,lastSeenFrame:Y}},$=(G,p,i,w)=>{Y++,D.clear();for(let Z=0;Z<p.length;Z++)D.add(p[Z].index);for(let[Z,P]of N)if(D.has(Z))P.lastSeenFrame=Y;else if(Y-P.lastSeenFrame>2)U.release(P.element),N.delete(Z);let u=null;for(let Z=0;Z<p.length;Z++){let P=p[Z],C=P.index,T=G(C);if(!T)continue;let k=i.has(T.id),R=C===w,f=N.get(C);if(f){let r=f.lastItemId!==T.id,Q0=f.lastSelected!==k,z=f.lastFocused!==R,S=f.lastY!==P.y||f.lastX!==P.x;if(r||Q0||z){let c=H(k,R),a=q(T,C,c);y(f.element,a),L(f.element,k,R),f.element.dataset.id=String(T.id),f.element.ariaSelected=String(k),f.lastItemId=T.id,f.lastSelected=k,f.lastFocused=R}if(S)E(f.element,P),f.lastY=P.y,f.lastX=P.x}else{let r=_(C,T,P,k,R);if(!u)u=document.createDocumentFragment();u.appendChild(r.element),N.set(C,r)}}if(u)J.appendChild(u)},h=()=>{for(let{element:G}of N.values())U.release(G);N.clear(),J.innerHTML=""};return{render:$,getElement:(G)=>N.get(G)?.element,clear:h,destroy:()=>{h(),U.clear()}}};var b1=new Set,wJ=(J)=>{if(!J.columns||J.columns<1)throw Error("[vlist/builder] withMasonry: columns must be a positive integer >= 1");let q=null,Q=null,j=[];return{name:"withMasonry",priority:10,setup(K){let{dom:X,emitter:U,config:N,rawConfig:D}=K,Y=N.classPrefix,W=N.horizontal;if(N.reverse)throw Error("[vlist/builder] withMasonry: cannot be combined with reverse mode");X.root.classList.add(`${Y}--masonry`);let F=()=>{return W?X.viewport.clientHeight:X.viewport.clientWidth},M={columns:J.columns,gap:J.gap??0,containerSize:F()};q=D2(M);let H=D.item,V=typeof H.height==="function"?H.height:(T)=>H.height,A=W&&D.item.width?typeof D.item.width==="function"?D.item.width:(T)=>D.item.width:V,B=()=>{let T=K.dataManager.getTotal();j=q.calculateLayout(T,(R)=>{return A(R)});let k=q.getTotalSize(j);if(K.sizeCache.getTotalSize=()=>k,W)X.content.style.width=`${k}px`;else X.content.style.height=`${k}px`},y=D.item.template;Q=_2(X.items,y,Y,W,()=>K.dataManager.getTotal(),N.ariaIdPrefix);let L=null,E=null,O=!1,_=()=>{if(O)return;O=!0,L=K.methods.get("_getSelectedIds")??null,E=K.methods.get("_getFocusedIndex")??null},$=(T)=>K.dataManager.getItem(T),h=-1,v=-1,G=!0,p=(N.overscan??3)*100,i=()=>{if(K.state.isDestroyed)return;_();let T=K.scrollController.getScrollTop(),k=K.state.viewportState.containerSize;if(!G&&T===h&&k===v)return;h=T,v=k,G=!1;let R=Math.max(0,T-p),f=T+k+p,r=q.getVisibleItems(j,R,f),Q0=L?L():b1,z=E?E():-1;if(Q&&r.length>0)Q.render($,r,Q0,z);let S=K.state.viewportState;S.scrollPosition=T;let c=r.length,a=c>0?r[0].index:0,I=c>0?r[c-1].index:0;S.visibleRange.start=a,S.visibleRange.end=I,S.renderRange.start=a,S.renderRange.end=I;let m=K.state.lastRenderRange;if(m.start!==a||m.end!==I)m.start=a,m.end=I,U.emit("range:change",{range:{start:a,end:I}})},w=()=>{K.state.lastRenderRange.start=-1,K.state.lastRenderRange.end=-1,G=!0,i()};K.setRenderFns(i,w);let u=(T,k)=>{let R=W?k:T;if(q&&q.containerSize!==R)q.update({containerSize:R}),B(),w()};K.resizeHandlers.push(u);let Z=()=>{B(),w()},P=K.dataManager,C=(T)=>{if(typeof P[T]!=="function")return;let k=P[T].bind(P);P[T]=(...R)=>{k(...R),Z()}};C("setItems"),C("appendItems"),C("prependItems"),C("updateItem"),C("removeItem"),K.methods.set("scrollToIndex",(T,k,R)=>{let f=j[T];if(!f)return;let r=f.y,Q0=K.state.viewportState.containerSize,z=r;if(k==="center")z=r-Q0/2+f.size/2;else if(k==="end")z=r-Q0+f.size;z=Math.max(0,z),K.scrollController.scrollTo(z,R==="smooth")}),B(),K.destroyHandlers.push(()=>{if(Q)Q.destroy();X.root.classList.remove(`${Y}--masonry`)})}}};var V2=(J)=>({selected:new Set(J??[]),focusedIndex:-1}),c0=(J,q,Q)=>{if(Q==="none")return J;let j=new Set(J.selected);if(Q==="single"){if(j.clear(),q.length>0)j.add(q[0])}else for(let K of q)j.add(K);return{...J,selected:j}},l0=(J,q)=>{let Q=new Set(J.selected);for(let j of q)Q.delete(j);return{...J,selected:Q}},f0=(J,q,Q)=>{if(Q==="none")return J;if(J.selected.has(q))return l0(J,[q]);else return c0(J,[q],Q)},G2=(J,q,Q)=>{if(Q!=="multiple")return J;return{...J,selected:new Set(q.map((j)=>j.id))}},M2=(J)=>({...J,selected:new Set}),k2=(J,q)=>{return J.focusedIndex=q,J},P2=(J,q,Q=!0)=>{if(q===0)return J;let j=J.focusedIndex-1;if(j<0)j=Q?q-1:0;return J.focusedIndex=j,J},R2=(J,q,Q=!0)=>{if(q===0)return J;let j=J.focusedIndex+1;if(j>=q)j=Q?0:q-1;return J.focusedIndex=j,J},C2=(J,q)=>{if(q===0)return J;return J.focusedIndex=0,J},v2=(J,q)=>{if(q===0)return J;return J.focusedIndex=q-1,J};var SJ=(J,q)=>{return J.selected.has(q)},r0=(J)=>{return Array.from(J.selected)},a0=(J,q)=>{let Q=[];for(let j of J.selected){let K=q(j);if(K)Q.push(K)}return Q};var fJ=(J)=>{let q=J?.mode??"single",Q=J?.initial,j=V2(Q),K=null;return{name:"withSelection",priority:50,methods:["select","deselect","toggleSelect","selectAll","clearSelection","getSelected","getSelectedItems"],setup(X){let{dom:U,emitter:N,config:D}=X,{classPrefix:Y,ariaIdPrefix:W}=D;if(q==="none"){X.methods.set("select",()=>{}),X.methods.set("deselect",()=>{}),X.methods.set("toggleSelect",()=>{}),X.methods.set("selectAll",()=>{}),X.methods.set("clearSelection",()=>{}),X.methods.set("getSelected",()=>[]),X.methods.set("getSelectedItems",()=>[]),X.methods.set("setSelectionMode",()=>{});return}let F=new Map,M=()=>{F.clear();let B=X.dataManager.getTotal(),y=X.dataManager.getCached();if(y===0)return;if(y>=B){for(let E=0;E<B;E++){let O=X.dataManager.getItem(E);if(O)F.set(O.id,E)}return}let L=X.dataManager.getStorage();if(L&&typeof L.getLoadedRanges==="function"){let E=L.getLoadedRanges();for(let O of E)for(let _=O.start;_<=O.end;_++){let $=X.dataManager.getItem(_);if($)F.set($.id,_)}}};N.on("load:end",({items:B,offset:y})=>{if(!B||B.length===0)return;if(y!==void 0)for(let L=0;L<B.length;L++){let E=B[L];if(E&&E.id!==void 0)F.set(E.id,y+L)}else M()}),M(),X.methods.set("_getSelectedIds",()=>{return j.selected}),X.methods.set("_getFocusedIndex",()=>{return j.focusedIndex});let{forceRender:H}=X.getRenderFns(),V=()=>{H();let B=(y)=>{let L=F.get(y);if(L===void 0)return;return X.dataManager.getItem(L)};N.emit("selection:change",{selected:r0(j),items:a0(j,B)})};K=document.createElement("div"),K.setAttribute("aria-live","polite"),K.setAttribute("aria-atomic","true"),K.className=`${Y}-live-region`,K.style.cssText="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0",U.root.appendChild(K);let A=K;N.on("selection:change",({selected:B})=>{let y=B.length;if(y===0)A.textContent="";else if(y===1)A.textContent="1 item selected";else A.textContent=`${y} items selected`}),X.clickHandlers.push((B)=>{if(X.state.isDestroyed)return;let L=B.target.closest("[data-index]");if(!L)return;let E=parseInt(L.dataset.index??"-1",10);if(E<0)return;let O=X.dataManager.getItem(E);if(!O)return;N.emit("item:click",{item:O,index:E,event:B}),j=k2(j,E),U.root.setAttribute("aria-activedescendant",`${W}-item-${E}`),j=f0(j,O.id,q),V()}),X.keydownHandlers.push((B)=>{if(X.state.isDestroyed)return;let y=X.dataManager.getTotal(),L=j.focusedIndex,E=!1,O=!1,_=j;switch(B.key){case"ArrowUp":_=P2(j,y),E=!0,O=!0;break;case"ArrowDown":_=R2(j,y),E=!0,O=!0;break;case"Home":_=C2(j,y),E=!0,O=!0;break;case"End":_=v2(j,y),E=!0,O=!0;break;case" ":case"Enter":if(j.focusedIndex>=0){let $=X.dataManager.getItem(j.focusedIndex);if($)_=f0(j,$.id,q);E=!0}break}if(E){B.preventDefault(),j=_;let $=j.focusedIndex;if($>=0){let h=X.dataManager.getState(),v=C0($,X.sizeCache,X.state.viewportState.containerSize,h.total,"center",X.getCachedCompression());X.scrollController.scrollTo(v),U.root.setAttribute("aria-activedescendant",`${W}-item-${$}`)}else U.root.removeAttribute("aria-activedescendant");if(O){let{selected:h}=j;if(L>=0&&L!==$){let v=X.dataManager.getItem(L);if(v)X.renderer.updateItemClasses(L,h.has(v.id),!1)}if($>=0){let v=X.dataManager.getItem($);if(v)X.renderer.updateItemClasses($,h.has(v.id),!0)}}else V()}}),X.methods.set("select",(...B)=>{j=c0(j,B,q),V()}),X.methods.set("deselect",(...B)=>{j=l0(j,B),V()}),X.methods.set("toggleSelect",(B)=>{j=f0(j,B,q),V()}),X.methods.set("selectAll",()=>{if(q!=="multiple")return;let B=X.getAllLoadedItems();j=G2(j,B,q),M(),V()}),X.methods.set("clearSelection",()=>{j=M2(j),V()}),X.methods.set("getSelected",()=>{return r0(j)}),X.methods.set("getSelectedItems",()=>{return a0(j,(y)=>{let L=F.get(y);if(L===void 0)return;return X.dataManager.getItem(L)})}),X.destroyHandlers.push(()=>{if(A&&A.parentNode)A.remove()})},destroy(){if(K&&K.parentNode)K.remove();K=null}}};var IJ=(J)=>{let q=J?.restore;return{name:"withSnapshots",priority:50,methods:["getScrollSnapshot","restoreScroll"],setup(Q){Q.methods.set("getScrollSnapshot",()=>{let K=Q.scrollController.getScrollTop(),X=Q.getCachedCompression(),U=Q.getVirtualTotal(),N=Q.methods.get("getSelected"),D=N&&N().length>0?N():void 0;if(U===0){let M={index:0,offsetInItem:0,total:0};if(D)M.selectedIds=D;return M}let Y,W;if(X.isCompressed){let H=K/X.virtualSize*U;Y=Math.max(0,Math.min(Math.floor(H),U-1)),W=(H-Y)*Q.sizeCache.getSize(Y)}else Y=Q.sizeCache.indexAtOffset(K),W=K-Q.sizeCache.getOffset(Y);W=Math.max(0,W);let F={index:Y,offsetInItem:W,total:U};if(D)F.selectedIds=D;return F});let j=(K)=>{let{index:X,offsetInItem:U,selectedIds:N}=K,D=Q.getVirtualTotal();if(D===0)return;if(!Number.isFinite(X)||!Number.isFinite(U))return;if(Q.sizeCache.getTotal()!==D){Q.sizeCache.rebuild(D),Q.updateCompressionMode();let B=Q.getCachedCompression();Q.updateContentSize(B.virtualSize)}let W=Q.getCachedCompression(),F=Math.max(0,Math.min(X,D-1)),M;if(W.isCompressed){let B=Q.sizeCache.getSize(F),y=B>0?U/B:0;M=(F+y)/D*W.virtualSize}else M=Q.sizeCache.getOffset(F)+U;let H=Q.state.viewportState.containerSize,V=Math.max(0,W.virtualSize-H);if(M=Math.max(0,Math.min(M,V)),Q.scrollController.scrollTo(M),N&&N.length>0){let B=Q.methods.get("select");if(B)B(...N)}let A=Q.methods.get("loadVisibleRange");if(A)requestAnimationFrame(()=>{A()});else{let B=Q.methods.get("reload");if(B)requestAnimationFrame(()=>{B()})}};if(Q.methods.set("restoreScroll",j),q)queueMicrotask(()=>{j(q)})}}};export{IJ as withSnapshots,fJ as withSelection,vJ as withSections,WJ as withScrollbar,VJ as withScale,MJ as withPage,wJ as withMasonry,zJ as withGrid,GJ as withAsync,e2 as vlist,f0 as toggleSelection,FJ as simpleVisibleRange,c0 as selectItems,G2 as selectAll,$J as rangesEqual,q2 as rafThrottle,UJ as needsScaling,Y2 as mergeRanges,SJ as isSelected,R0 as isSectionHeader,P0 as isPlaceholderItem,kJ as isInRange,a0 as getSelectedItems,r0 as getSelectedIds,F0 as getScaleState,NJ as getScaleInfo,F0 as getScale,PJ as getRangeCount,BJ as getMaxItemsWithoutScaling,H2 as filterPlaceholders,RJ as diffRanges,l0 as deselectItems,B2 as createStickyHeader,X2 as createSparseStorage,T0 as createSizeCache,V2 as createSelectionState,m0 as createSectionedSizeFn,U2 as createSectionLayout,S0 as createScrollbar,_J as createScrollController,K2 as createPlaceholderManager,i0 as createMeasuredSizeCache,_2 as createMasonryRenderer,D2 as createMasonryLayout,d0 as createGridRenderer,W2 as createGridLayout,t0 as createEmitter,Z2 as createAsyncManager,M2 as clearSelection,HJ as clampScrollPosition,bJ as calculateTotalSize,C0 as calculateScrollToIndex,e0 as calculateScaledVisibleRange,J2 as calculateScaledScrollToIndex,KJ as calculateScaledRenderRange,w0 as calculateScaledItemPosition,EJ as calculateRenderRange,g0 as calculateMissingRanges,TJ as calculateItemOffset,ZJ as calculateIndexFromScrollPosition,yJ as calculateActualSize,x0 as buildLayoutItems,k0 as MAX_VIRTUAL_HEIGHT};
1
+ var{defineProperty:F2,getOwnPropertyNames:eJ,getOwnPropertyDescriptor:J1}=Object,Q1=Object.prototype.hasOwnProperty;var h2=new WeakMap,j1=(J)=>{var q=h2.get(J),Q;if(q)return q;if(q=F2({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function")eJ(J).map((j)=>!Q1.call(q,j)&&F2(q,j,{get:()=>J[j],enumerable:!(Q=J1(J,j))||Q.enumerable}));return h2.set(J,q),q};var q1=(J,q)=>{for(var Q in q)F2(J,Q,{get:q[Q],enumerable:!0,configurable:!0,set:(j)=>q[Q]=()=>j})};var u2=(J,q)=>()=>(J&&(q=J(J=0)),q);var X1=(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}},Y1=(J,q)=>{let Q=q,j=new Float64Array(0),K=(B)=>{Q=B,j=new Float64Array(B+1),j[0]=0;for(let N=0;N<B;N++)j[N+1]=j[N]+J(N)};K(q);let X=(B)=>{if(Q===0)return 0;if(B<=0)return 0;if(B>=j[Q])return Q-1;let N=0,D=Q-1;while(N<D){let Y=N+D+1>>>1;if(j[Y]<=B)N=Y;else D=Y-1}return N};return{getOffset:(B)=>{if(B<=0)return 0;if(B>=Q)return j[Q];return j[B]},getSize:(B)=>J(B),indexAtOffset:(B)=>X(B),getTotalSize:()=>j[Q]??0,getTotal:()=>Q,rebuild:(B)=>K(B),isVariable:()=>!0}},y0=(J,q)=>{if(typeof J==="number")return X1(J,q);return Y1(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,B=q;while(B<j&&X<Q)X+=J.getSize(B),K++,B++;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 B=J.getSize(X);if(K+B>q)break;K+=B,j++}return Math.max(j,1)},L2=(J,q,Q)=>{if(Q===0)return 0;let j=Math.floor(q),K=q-j,X=Math.max(0,Math.min(j,Q-1));return J.getOffset(X)+K*J.getSize(X)};var T2=200,z0=50,JJ=5,QJ=2,jJ=50,H0=16000000,qJ="x",XJ=20,y2="_isPlaceholder",YJ="__placeholder_";var KJ,F0=(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:B}=K,D=J/B*j,Y=Math.floor(D),W=u0(Q,Math.max(0,Y),q,j),F=Math.ceil(D)+W,H=B-q-J;if(H<=q&&H>=-1){let V=o0(Q,q,j),A=Math.max(0,j-V),Z=Math.max(0,Math.min(1,1-H/q));Y=Math.floor(Y+(A-Y)*Z),F=H<=1?j-1:Math.min(j-1,Y+W)}return X.start=Math.max(0,Y),X.end=Math.min(j-1,Math.max(0,F)),X},UJ=(J,q,Q,j)=>{if(Q===0)return j.start=0,j.end=-1,j;return j.start=Math.max(0,J.start-q),j.end=Math.min(Q-1,J.end+q),j},w0=(J,q,Q,j,K,X,B)=>{if(!X.isCompressed||j===0)return Q.getOffset(J);let{virtualSize:N}=X,D=N-K,Y=D-q;if(Y<=K&&Y>=-1){if(q>=D-1){let O=Q.getTotalSize()-Q.getOffset(J);return K-O}let H=o0(Q,K,j),V=Math.max(0,j-H),Z=q/N*j,T=Math.max(0,Math.min(1,1-Y/K)),L=Q.getOffset(J)-Q.getOffset(V),E=Q.getOffset(J)-L2(Q,Z,j);return E+(L-E)*T}let W=q/N,F=Q.getTotalSize(),M=W*F;return Q.getOffset(J)-M},J2=(J,q,Q,j,K,X="start")=>{if(j===0)return 0;let B;if(K.isCompressed){if(X==="end"&&J===j-1)return Math.max(0,K.virtualSize-Q);B=J/j*K.virtualSize}else B=q.getOffset(J);let N=q.getSize(J);switch(X){case"center":B-=(Q-N)/2;break;case"end":B-=Q-N;break}let D=K.virtualSize-Q;return Math.max(0,Math.min(B,D))},BJ=(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)},ZJ=(J,q)=>{if(typeof q==="number")return J*q>H0;return q.getTotalSize()>H0},NJ=(J)=>{if(J<=0)return 0;return Math.floor(H0/J)},WJ=(J,q)=>{let Q=F0(J,q);if(!Q.isCompressed)return`No compression needed (${J} items, ${(Q.actualSize/1e6).toFixed(2)}M px)`;return`Compressed to ${(Q.ratio*100).toFixed(1)}% (${J} items, ${(Q.actualSize/1e6).toFixed(1)}M px → ${(Q.virtualSize/1e6).toFixed(1)}M px virtual)`};var Q2=u2(()=>{KJ=H0});var R0=(J)=>{return J!==null&&typeof J==="object"&&J.__groupHeader===!0};var vJ={};q1(vJ,{createGridRenderer:()=>d0});var F1=(J=200)=>{let q=[];return{acquire:()=>{let X=q.pop();if(X)return X;let B=document.createElement("div");return B.setAttribute("role","option"),B},release:(X)=>{if(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}}},E1=2,d0=(J,q,Q,j,K,X,B,N,D=!1)=>{let Y=F1(),W=new Map,F=X,M=!1,H=null,V=0,A=0,Z="",T=-1,L=(z)=>{if(H&&V===z)return H;return H=F0(z,Q),V=z,H},E={selected:!1,focused:!1},O=(z,S)=>{return E.selected=z,E.focused=S,E},_=`${K}-item ${K}-grid-item`,$=`${K}-item--selected`,h=`${K}-item--focused`,v=(z,S)=>{if(typeof S==="string")z.innerHTML=S;else z.replaceChildren(S)},G=(z,S,c)=>{z.classList.toggle($,S),z.classList.toggle(h,c)},p=(z,S)=>{let c=j.getRow(z);if(S){let a=S.totalItems,I=L(a);if(I.isCompressed)return w0(c,S.scrollPosition,Q,a,S.containerSize,I,S.rangeStart)}return Q.getOffset(c)},i=(z,S)=>{let c=M&&j.getCol(z)===0,a=c?0:j.getCol(z),I=c?0:j.getColumnOffset(a,F),m;if(M){let o=j.getRow(z),e=0,t=new Set;for(let q0=0;q0<z;q0++){let Y0=j.getRow(q0);if(Y0<o&&!t.has(Y0)){let g=Q.getSize(q0);e+=g,t.add(Y0)}}m=e}else m=p(z,S);if(D)return`translate(${Math.round(m)}px, ${Math.round(I)}px)`;return`translate(${Math.round(I)}px, ${Math.round(m)}px)`},w=(z,S)=>{z.style.transform=S},u=(z,S)=>{let c=z.dataset.id?.startsWith("__group_header"),a=c?F:j.getColumnWidth(F),I;if(M||c)I=Q.getSize(S)-j.gap;else{let m=j.getRow(S);I=Q.getSize(m)-j.gap}if(D)z.style.width=`${I}px`,z.style.height=`${a}px`;else z.style.width=`${a}px`,z.style.height=`${I}px`},U=(z,S,c,a,I)=>{let m=Y.acquire(),o=O(c,a);if(m.className=_,m.dataset.index=String(z),m.dataset.id=String(S.id),m.dataset.row=String(j.getRow(z)),m.dataset.col=String(j.getCol(z)),m.ariaSelected=String(c),N)m.id=`${N}-item-${z}`;if(B){let t=B();if(t!==T)T=t,Z=String(t);m.setAttribute("aria-setsize",Z),m.setAttribute("aria-posinset",String(z+1))}u(m,z);let e=q(S,z,o);return v(m,e),G(m,c,a),w(m,I),{element:m,lastItemId:S.id,lastSelected:c,lastFocused:a,lastTransform:I,lastSeenFrame:A}},P=(z,S,c,a,I)=>{if(A++,S.start===0&&z.length>0)M=R0(z[0]);for(let[e,t]of W)if(e>=S.start&&e<=S.end)t.lastSeenFrame=A;else if(A-t.lastSeenFrame>E1)Y.release(t.element),W.delete(e);let m=!1;if(B){let e=B();if(e!==T)T=e,Z=String(e),m=!0}let o=null;for(let e=S.start;e<=S.end;e++){let t=e-S.start,q0=z[t];if(!q0){console.warn(`⚠️ RENDER: Missing item at index ${e} (range: ${S.start}-${S.end}, items.length: ${z.length})`);continue}let Y0=c.has(q0.id),g=e===a,d=W.get(e);if(d){let J0=d.lastItemId!==q0.id,n=d.lastSelected!==Y0,B0=d.lastFocused!==g;if(J0||n||B0){if(J0){let M0=O(Y0,g),E0=q(q0,e,M0);v(d.element,E0),d.element.dataset.id=String(q0.id),d.element.dataset.row=String(j.getRow(e)),d.element.dataset.col=String(j.getCol(e)),u(d.element,e)}G(d.element,Y0,g),d.element.ariaSelected=String(Y0),d.lastItemId=q0.id,d.lastSelected=Y0,d.lastFocused=g}let K0=i(e,I);if(d.lastTransform!==K0)w(d.element,K0),d.lastTransform=K0;if(m)d.element.setAttribute("aria-setsize",Z)}else{let J0=i(e,I),n=U(e,q0,Y0,g,J0);if(!o)o=document.createDocumentFragment();o.appendChild(n.element),W.set(e,n)}}if(o)J.appendChild(o)},C=(z)=>{for(let[S,c]of W){let a=i(S,z);if(c.lastTransform!==a)w(c.element,a),c.lastTransform=a}},y=(z,S,c,a)=>{let I=W.get(z);if(!I)return;let m=I.lastItemId!==S.id,o=I.lastSelected!==c,e=I.lastFocused!==a;if(m||o||e){let t=O(c,a),q0=q(S,z,t);v(I.element,q0),G(I.element,c,a),I.element.dataset.id=String(S.id),I.element.ariaSelected=String(c),u(I.element,z),I.lastItemId=S.id,I.lastSelected=c,I.lastFocused=a}},k=(z,S,c)=>{let a=W.get(z);if(!a)return;let I=a.lastSelected!==S,m=a.lastFocused!==c;if(I||m)G(a.element,S,c),a.lastSelected=S,a.lastFocused=c},R=(z)=>{return W.get(z)?.element},f=(z)=>{if(Math.abs(z-F)<1)return;F=z;for(let[S,c]of W){u(c.element,S);let a=i(S);w(c.element,a),c.lastTransform=a}},r=()=>{for(let[,z]of W)Y.release(z.element);W.clear()};return{render:P,updatePositions:C,updateItem:y,updateItemClasses:k,getElement:R,updateContainerWidth:f,clear:r,destroy:()=>{r(),Y.clear()}}};var N2=u2(()=>{Q2()});var g2=2,x2=(J=0)=>{let q=[,,,,,];for(let Q=0;Q<5;Q++)q[Q]={position:0,time:0};return{velocity:0,lastPosition:J,lastTime:performance.now(),samples:q,sampleIndex:0,sampleCount:0}},E2=(J,q)=>{let Q=performance.now(),j=Q-J.lastTime;if(j===0)return J;if(j>100){J.sampleCount=0,J.sampleIndex=0,J.velocity=0;let X=J.samples[0];return X.position=q,X.time=Q,J.sampleIndex=1,J.sampleCount=1,J.lastPosition=q,J.lastTime=Q,J}let K=J.samples[J.sampleIndex];if(K.position=q,K.time=Q,J.sampleIndex=(J.sampleIndex+1)%5,J.sampleCount=Math.min(J.sampleCount+1,5),J.sampleCount>=2){let X=(J.sampleIndex-J.sampleCount+5)%5,B=J.samples[X],N=q-B.position,D=Q-B.time;J.velocity=D>0?Math.abs(N)/D:0}return J.lastPosition=q,J.lastTime=Q,J};var i0=(J,q)=>{let Q=new Map,j=(X)=>{let B=Q.get(X);return B!==void 0?B: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 B of Q.keys())if(B>=X)Q.delete(B)}K=y0(j,X)},isVariable(){return!0},setMeasuredSize(X,B){Q.set(X,B)},isMeasured(X){return Q.has(X)},getEstimatedSize(){return J},measuredCount(){return Q.size}}};var t0=()=>{let J={},q=(N,D)=>{if(!J[N])J[N]=new Set;return J[N].add(D),()=>Q(N,D)},Q=(N,D)=>{J[N]?.delete(D)};return{on:q,off:Q,emit:(N,D)=>{J[N]?.forEach((Y)=>{try{Y(D)}catch(W){console.error(`[vlist] Error in event handler for "${String(N)}":`,W)}})},once:(N,D)=>{let Y=(W)=>{Q(N,Y),D(W)};return q(N,Y)},clear:(N)=>{if(N)delete J[N];else for(let D in J)delete J[D]},listenerCount:(N)=>{return J[N]?.size??0}}};var m2=(J)=>{if(typeof J==="string"){let q=document.querySelector(J);if(!q)throw Error(`[vlist/builder] Container not found: ${J}`);return q}return J},d2=(J,q,Q,j)=>{let K=document.createElement("div");if(K.className=q,j)K.classList.add(`${q}--horizontal`);if(K.setAttribute("role","listbox"),K.setAttribute("tabindex","0"),Q)K.setAttribute("aria-label",Q);if(j)K.setAttribute("aria-orientation","horizontal");let X=document.createElement("div");if(X.className=`${q}-viewport`,j)X.style.overflowX="auto",X.style.overflowY="hidden";else X.style.overflow="auto";X.style.height="100%",X.style.width="100%";let B=document.createElement("div");if(B.className=`${q}-content`,B.style.position="relative",j)B.style.height="100%";else B.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 B.appendChild(N),X.appendChild(B),K.appendChild(X),J.appendChild(K),{root:K,viewport:X,content:B,items:N}};var c2=(J=100)=>{let q=[];return{acquire:()=>{let Q=q.pop();if(Q)return Q;let j=document.createElement("div");return j.setAttribute("role","option"),j},release:(Q)=>{if(q.length<J)Q.className="",Q.textContent="",Q.removeAttribute("style"),Q.removeAttribute("data-index"),Q.removeAttribute("data-id"),q.push(Q)},clear:()=>{q.length=0}}};var l2=(J,q,Q,j,K)=>{if(j===0||q===0){K.start=0,K.end=0;return}let X=Q.indexAtOffset(J),B=u0(Q,X,q,j),N=X+B;K.start=Math.max(0,X),K.end=Math.min(j-1,Math.max(0,N))},r2=(J,q,Q,j)=>{if(Q===0){j.start=0,j.end=0;return}j.start=Math.max(0,J.start-q),j.end=Math.min(Q-1,J.end+q)},a2=(J,q,Q,j,K)=>{if(j===0)return 0;let X=Math.max(0,Math.min(J,j-1)),B=q.getOffset(X),N=q.getSize(X),D=Math.max(0,q.getTotalSize()-Q),Y;switch(K){case"center":Y=B-(Q-N)/2;break;case"end":Y=B-Q+N;break;default:Y=B}return Math.max(0,Math.min(Y,D))};var b2=(J)=>J<0.5?2*J*J:-1+(4-2*J)*J,v0=(J)=>{if(typeof J==="string")return{align:J,behavior:"auto",duration:300};if(J&&typeof J==="object")return{align:J.align??"start",behavior:J.behavior??"auto",duration:J.duration??300};return{align:"start",behavior:"auto",duration:300}},s2=(J,q)=>{let Q=null,j=()=>{if(Q!==null)cancelAnimationFrame(Q),Q=null};return{animateScroll:(X,B,N)=>{if(j(),Math.abs(B-X)<1){J.scrollTo(B);return}let D=performance.now(),Y=(W)=>{let F=W-D,M=Math.min(F/N,1),H=X+(B-X)*b2(M);if(J.scrollTo(H),q(),M<1)Q=requestAnimationFrame(Y);else Q=null};Q=requestAnimationFrame(Y)},cancelScroll:j}};var n2=(J,q)=>{let{dom:Q,emitter:j,resolvedConfig:K,rawConfig:X,rendered:B,pool:N,sharedState:D,isHorizontal:Y,classPrefix:W,contentSizeHandlers:F,afterScroll:M,clickHandlers:H,keydownHandlers:V,resizeHandlers:A,destroyHandlers:Z,methods:T,onScrollFrame:L,resizeObserver:E,renderRange:O}=q;return{get dom(){return Q},get sizeCache(){return J.hc},get emitter(){return j},get config(){return K},get rawConfig(){return X},get renderer(){return{render:(_,$,h,v,G)=>{J.ss=h,J.fi=v,J.ffn()},updateItemClasses:(_,$,h)=>{let v=B.get(_);if(!v)return;v.classList.toggle(`${W}-item--selected`,$),v.classList.toggle(`${W}-item--focused`,h),v.ariaSelected=$?"true":"false"},updatePositions:()=>{},updateItem:()=>{},getElement:(_)=>B.get(_)??null,clear:()=>{},destroy:()=>{}}},set renderer(_){},get dataManager(){return J.dm},set dataManager(_){J.dm=_},get scrollController(){return J.sc},set scrollController(_){J.sc=_},state:D,getContainerWidth(){return J.cw},afterScroll:M,clickHandlers:H,keydownHandlers:V,resizeHandlers:A,contentSizeHandlers:F,destroyHandlers:Z,methods:T,replaceTemplate(_){J.at=_},replaceRenderer(_){},replaceDataManager(_){J.dm=_},replaceScrollController(_){J.sc=_},getItemsForRange(_){let{dm:$,it:h}=J,v=[];for(let G=_.start;G<=_.end;G++){let p=$?$.getItem(G):h[G];if(p)v.push(p)}return v},getAllLoadedItems(){let _=J.dm;if(_){let $=_.getTotal(),h=[];for(let v=0;v<$;v++){let G=_.getItem(v);if(G)h.push(G)}return h}return[...J.it]},getVirtualTotal(){return J.vtf()},getCachedCompression(){let _=J.hc;return{isCompressed:!1,actualSize:_.getTotalSize(),virtualSize:_.getTotalSize(),ratio:1}},getCompressionContext(){return{scrollPosition:J.ls,totalItems:J.vtf(),containerSize:J.ch,rangeStart:O.start}},renderIfNeeded(){J.rfn()},forceRender(){J.ffn()},invalidateRendered(){for(let[,_]of B)_.remove(),N.release(_);B.clear()},getRenderFns(){return{renderIfNeeded:J.rfn,forceRender:J.ffn}},setRenderFns(_,$){J.rfn=_,J.ffn=$},setVirtualTotalFn(_){J.vtf=_},rebuildSizeCache(_){J.hc.rebuild(_??J.vtf())},setSizeConfig(_){J.hc=y0(_,J.vtf())},updateContentSize(_){let $=`${_}px`;if(Y)Q.content.style.width=$;else Q.content.style.height=$},updateCompressionMode(){},setVisibleRangeFn(_){J.gvr=_},setScrollToPosFn(_){J.gsp=_},setPositionElementFn(_){J.pef=_},setScrollFns(_,$){J.sgt=_,J.sst=(h)=>{$(h),L()}},setScrollTarget(_){J.st.removeEventListener("scroll",L),J.st=_,J.st.addEventListener("scroll",L,{passive:!0})},getScrollTarget(){return J.st},setContainerDimensions(_){J.gcw=_.width,J.gch=_.height,J.cw=_.width(),J.ch=_.height(),D.viewportState.containerSize=Y?J.cw:J.ch},disableViewportResize(){if(J.vre)J.vre=!1,E.unobserve(Q.viewport)},disableWheelHandler(){if(J.wh)Q.viewport.removeEventListener("wheel",J.wh),J.wh=null}}},o2=(J,q,Q)=>{let{rendered:j,itemState:K,contentSizeHandlers:X,applyTemplate:B,updateContentSize:N}=q,D=()=>{J.hc.rebuild(J.vtf()),N(),Q.updateCompressionMode();for(let Y=0;Y<X.length;Y++)X[Y]();J.ffn()};return{getState:()=>({total:J.it.length,cached:J.it.length,isLoading:!1,pendingRanges:[],error:void 0,hasMore:!1,cursor:void 0}),getTotal:()=>J.it.length,getCached:()=>J.it.length,getIsLoading:()=>!1,getHasMore:()=>!1,getStorage:()=>null,getPlaceholders:()=>null,getItem:(Y)=>J.it[Y],isItemLoaded:(Y)=>Y>=0&&Y<J.it.length&&J.it[Y]!==void 0,getItemsInRange:(Y,W)=>{let F=J.it,M=[],H=Math.max(0,Y),V=Math.min(W,F.length-1);for(let A=H;A<=V;A++)M.push(F[A]);return M},setTotal:(Y)=>{},setItems:(Y,W=0,F)=>{let M=J.it;if(W===0&&(F!==void 0||M.length===0))J.it=Y;else{let H=W+Y.length;if(M.length<H)M.length=H;for(let V=0;V<Y.length;V++)M[W+V]=Y[V]}if(J.ii)D()},updateItem:(Y,W)=>{let F=J.it;if(Y<0||Y>=F.length)return!1;let M=F[Y];if(!M)return!1;F[Y]={...M,...W};let H=j.get(Y);if(H)B(H,J.at(F[Y],Y,K)),H.dataset.id=String(F[Y].id);return!0},removeItem:(Y)=>{if(Y<0||Y>=J.it.length)return!1;if(J.it.splice(Y,1),J.ii)D();return!0},loadRange:async()=>{},ensureRange:async()=>{},loadInitial:async()=>{},loadMore:async()=>!1,reload:async()=>{},evictDistant:()=>{},clear:()=>{J.it=[]},reset:()=>{if(J.it=[],J.ii)J.hc.rebuild(0),N(),J.ffn()}}},i2=(J,q)=>{let{dom:Q,classPrefix:j}=q;return{getScrollTop:()=>J.sgt(),scrollTo:(K)=>{J.sst(K),J.ls=K,J.rfn()},scrollBy:(K)=>{let X=J.sgt()+K;J.sst(X),J.ls=X,J.rfn()},isAtTop:()=>J.ls<=2,isAtBottom:(K=2)=>J.sab(K),getScrollPercentage:()=>{let K=J.hc.getTotalSize(),X=Math.max(0,K-J.ch);return X>0?J.ls/X:0},getVelocity:()=>J.vt.velocity,isTracking:()=>J.vt.sampleCount>=2,isScrolling:()=>Q.root.classList.contains(`${j}--scrolling`),updateConfig:()=>{},enableCompression:()=>{J.sic=!0},disableCompression:()=>{J.sic=!1},isCompressed:()=>J.sic,isWindowMode:()=>!1,updateContainerHeight:(K)=>{J.ch=K},destroy:()=>{}}};var K1=3,U1="vlist",t2=150,B1=0,e2=(J)=>{if(!J.container)throw Error("[vlist/builder] Container is required");if(!J.item)throw Error("[vlist/builder] item configuration is required");let q=J.orientation==="horizontal",Q=q?"width":"height",j=q?"estimatedWidth":"estimatedHeight",K=q?J.item.width:J.item.height,X=q?J.item.estimatedWidth:J.item.estimatedHeight;if(K==null&&X==null)throw Error(`[vlist/builder] item.${Q} or item.${j} is required${q?" when orientation is 'horizontal'":""}`);if(K!=null){if(typeof K==="number"&&K<=0)throw Error(`[vlist/builder] item.${Q} must be a positive number`);if(typeof K!=="number"&&typeof K!=="function")throw Error(`[vlist/builder] item.${Q} must be a number or a function (index) => number`)}else if(X!=null){if(typeof X!=="number"||X<=0)throw Error(`[vlist/builder] item.${j} must be a positive number`)}if(!J.item.template)throw Error("[vlist/builder] item.template is required");if(q&&J.reverse)throw Error("[vlist/builder] horizontal direction cannot be combined with reverse mode");let B=new Map,N=!1,D={use(Y){if(N)throw Error("[vlist/builder] Cannot call .use() after .build()");return B.set(Y.name,Y),D},build(){if(N)throw Error("[vlist/builder] .build() can only be called once");return N=!0,Z1(J,B,q,K,X??null)}};return D};function Z1(J,q,Q,j,K){let{item:X,items:B,overscan:N=K1,classPrefix:D=U1,ariaLabel:Y,reverse:W=!1,scroll:F}=J,M=F,H=M?.wheel??!0,V=M?.wrap??!1,A=W,Z=`${D}-${B1++}`,T=j??K,L=j==null&&K!=null,E=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||navigator.maxTouchPoints&&navigator.maxTouchPoints>2,O=Q?typeof X.height==="number"?X.height:void 0:typeof X.width==="number"?X.width:void 0,_={overscan:N,classPrefix:D,reverse:A,wrap:V,horizontal:Q,ariaIdPrefix:Z},$=Array.from(q.values()).sort((b,x)=>(b.priority??50)-(x.priority??50)),h=new Set($.map((b)=>b.name));for(let b of $)if(b.conflicts){for(let x of b.conflicts)if(h.has(x))throw Error(`[vlist/builder] ${b.name} and ${x} cannot be combined`)}if(A){if(h.has("withGrid"))throw Error("[vlist/builder] withGrid cannot be used with reverse: true")}let v=m2(J.container),G=d2(v,D,Y,Q);if(M?.wheel===!1)if(Q)G.viewport.style.overflowX="hidden";else G.viewport.style.overflow="hidden";if(M?.scrollbar==="none")G.viewport.classList.add(`${D}-viewport--no-scrollbar`);let p=t0(),i=B||[],w=L?i0(K,i.length):y0(T,i.length),u=c2(),U={it:i,hc:w,ch:G.viewport.clientHeight,cw:G.viewport.clientWidth,id:!1,ii:!1,ls:0,vt:x2(0),ss:new Set,fi:-1,la:"",dm:null,sc:null,vtf:null,sgt:Q?()=>G.viewport.scrollLeft:()=>G.viewport.scrollTop,sst:Q?(b)=>{G.viewport.scrollLeft=b}:(b)=>{G.viewport.scrollTop=b},sab:(b=2)=>{let x=U.hc.getTotalSize();return U.ls+U.ch>=x-b},sic:!1,rfn:null,ffn:null,gvr:(b,x,l,s,j0)=>{l2(b,x,l,s,j0)},gsp:(b,x,l,s,j0)=>{return a2(b,x,l,s,j0)},pef:null,at:X.template,vre:!0,st:G.viewport,wh:null,gcw:()=>U.cw,gch:()=>U.ch};U.vtf=()=>U.dm?U.dm.getTotal():U.it.length;let P=null,C=null,y=!1,k={start:0,end:0},R={start:0,end:0},f={start:-1,end:-1},r={viewportState:{scrollPosition:0,containerSize:Q?U.cw:U.ch,totalSize:U.hc.getTotalSize(),actualSize:U.hc.getTotalSize(),isCompressed:!1,compressionRatio:1,visibleRange:{start:0,end:0},renderRange:{start:0,end:0}},lastRenderRange:{start:-1,end:-1},isInitialized:!1,isDestroyed:!1,cachedCompression:null},Q0=new Map,z=L?new WeakMap:null,S=L?w:null,c=null,a=0,I=!1,m=()=>{if(!L)return;if(I){let b=U.sgt(),x=Q?G.viewport.scrollWidth-G.viewport.clientWidth:G.viewport.scrollHeight-G.viewport.clientHeight,l=x>0&&b>=x-2;if(Z0(),I=!1,l){let s=Math.max(0,U.hc.getTotalSize()-(Q?U.cw:U.ch));if(s>b)U.sst(s),U.ls=s,U.rfn()}}};if(L&&S&&z)c=new ResizeObserver((b)=>{if(U.id)return;let x=!1,l=k.start;for(let s of b){let j0=z.get(s.target);if(j0===void 0)continue;let U0=Q?s.borderBoxSize[0].inlineSize:s.borderBoxSize[0].blockSize;if(!S.isMeasured(j0)){let W0=S.getSize(j0);if(S.setMeasuredSize(j0,U0),x=!0,j0<l&&U0!==W0)a+=U0-W0;c.unobserve(s.target);let A0=s.target;if(Q)A0.style.width=`${U0}px`;else A0.style.height=`${U0}px`}}if(!x)return;if(S.rebuild(U.vtf()),U.hc=S,a!==0){let s=U.sgt();U.sst(s+a),U.ls=s+a,a=0}if(y)I=!0;else{let s=U.sgt(),j0=Q?G.viewport.scrollWidth-G.viewport.clientWidth:G.viewport.scrollHeight-G.viewport.clientHeight,U0=j0>0&&s>=j0-2;if(Z0(),I=!1,U0){let W0=Math.max(0,U.hc.getTotalSize()-(Q?U.cw:U.ch));if(W0>s)U.sst(W0),U.ls=W0}}f.start=-1,f.end=-1,U.rfn()});let o={selected:!1,focused:!1},e=`${D}-item`,t=[],q0=[],Y0=[],g=[],d=[],J0=[],n=new Map,B0=null,K0=null,M0=!1,E0=()=>{if(M0)return;M0=!0,B0=n.get("_getSelectedIds")??null,K0=n.get("_getFocusedIndex")??null},N0=(b,x)=>{if(typeof x==="string")b.innerHTML=x;else b.replaceChildren(x)},$0=(b,x)=>{let l=Math.round(U.hc.getOffset(x));if(Q)b.style.transform=`translateX(${l}px)`;else b.style.transform=`translateY(${l}px)`};U.pef=$0;let k0=(b,x)=>{let l=u.acquire();l.className=e;let s=!L||S&&S.isMeasured(b);if(Q){if(s)l.style.width=`${U.hc.getSize(b)}px`;else l.style.width="";if(O!=null)l.style.height=`${O}px`}else if(s)l.style.height=`${U.hc.getSize(b)}px`;else l.style.height="";if(l.dataset.index=String(b),l.dataset.id=String(x.id),l.ariaSelected="false",l.id=`${Z}-item-${b}`,U.la=String(U.vtf()),l.setAttribute("aria-setsize",U.la),l.setAttribute("aria-posinset",String(b+1)),String(x.id).startsWith("__placeholder_"))l.classList.add(`${D}-item--placeholder`);return N0(l,U.at(x,b,o)),U.pef(l,b),l},Z0=()=>{let b=`${U.hc.getTotalSize()}px`;if(Q)G.content.style.width=b;else G.content.style.height=b},L0=()=>{if(U.id)return;E0();let b=B0?B0():U.ss,x=K0?K0():U.fi,l=U.vtf(),s=Q?U.cw:U.ch;if(U.gvr(U.ls,s,U.hc,l,k),r2(k,N,l,R),R.start===f.start&&R.end===f.end){if(U.sic)for(let[X0,_0]of Q0)U.pef(_0,X0);return}let j0=String(l),U0=j0!==U.la;U.la=j0;for(let[X0,_0]of Q0)if(X0<R.start||X0>R.end)_0.remove(),u.release(_0),Q0.delete(X0);let W0=document.createDocumentFragment(),A0=[],I0=[];for(let X0=R.start;X0<=R.end;X0++){let _0=U.dm?U.dm.getItem(X0):U.it[X0];if(!_0)continue;let G0=Q0.get(X0);if(G0){let T0=G0.dataset.id,p0=String(_0.id);if(T0!==p0){let tJ=T0?.startsWith("__placeholder_"),I2=p0.startsWith("__placeholder_");N0(G0,U.at(_0,X0,o)),G0.dataset.id=p0;let p2=!L||S&&S.isMeasured(X0);if(Q)G0.style.width=p2?`${U.hc.getSize(X0)}px`:"";else G0.style.height=p2?`${U.hc.getSize(X0)}px`:"";if(I2)G0.classList.add(`${D}-item--placeholder`);else G0.classList.remove(`${D}-item--placeholder`);if(tJ&&!I2)G0.classList.add(`${D}-item--replaced`),setTimeout(()=>{G0.classList.remove(`${D}-item--replaced`)},300)}U.pef(G0,X0);let n0=b.has(_0.id),iJ=X0===x;if(G0.classList.toggle(`${D}-item--selected`,n0),G0.classList.toggle(`${D}-item--focused`,iJ),G0.ariaSelected=n0?"true":"false",U0)G0.setAttribute("aria-setsize",U.la)}else{let T0=k0(X0,_0);I0.push({index:X0,element:T0});let p0=b.has(_0.id),n0=X0===x;if(p0)T0.classList.add(`${D}-item--selected`),T0.ariaSelected="true";if(n0)T0.classList.add(`${D}-item--focused`);W0.appendChild(T0),A0.push({index:X0,element:T0})}}if(A0.length>0){G.items.appendChild(W0);for(let{index:X0,element:_0}of A0)Q0.set(X0,_0)}if(L&&c&&S&&z){for(let{index:X0,element:_0}of I0)if(!S.isMeasured(X0))z.set(_0,X0),c.observe(_0)}f.start=R.start,f.end=R.end,r.lastRenderRange.start=R.start,r.lastRenderRange.end=R.end,r.viewportState.scrollPosition=U.ls,r.viewportState.visibleRange.start=k.start,r.viewportState.visibleRange.end=k.end,r.viewportState.renderRange.start=R.start,r.viewportState.renderRange.end=R.end,p.emit("range:change",{range:{start:R.start,end:R.end}})},D0=()=>{f.start=-1,f.end=-1,U.rfn()};U.rfn=L0,U.ffn=D0;let O0=()=>{if(U.id)return;let b=U.sgt(),x=b>=U.ls?"down":"up";if(U.vt=E2(U.vt,b),!G.root.classList.contains(`${D}--scrolling`))G.root.classList.add(`${D}--scrolling`);y=!0,U.ls=b,U.rfn(),p.emit("scroll",{scrollPosition:b,direction:x}),p.emit("velocity:change",{velocity:U.vt.velocity,reliable:U.vt.sampleCount>=g2});for(let l=0;l<t.length;l++)t[l](b,x);if(C)clearTimeout(C);C=setTimeout(()=>{G.root.classList.remove(`${D}--scrolling`),y=!1,U.vt.velocity=0,U.vt.sampleCount=0,p.emit("velocity:change",{velocity:0,reliable:!1}),m()},M?.idleTimeout??t2)},b0=null;if(U.st.addEventListener("scroll",O0,{passive:!0}),H&&!Q&&!E)b0=(b)=>{b.preventDefault();let x=U.sgt(),l=b.deltaY,s=Math.max(0,Math.min(x+l,U.hc.getTotalSize()-U.ch));U.sst(s),U.ls=s,U.vt=E2(U.vt,s),U.rfn();let j0=s>=x?"down":"up";if(p.emit("scroll",{scrollPosition:s,direction:j0}),!G.root.classList.contains(`${D}--scrolling`))G.root.classList.add(`${D}--scrolling`);if(y=!0,C)clearTimeout(C);C=setTimeout(()=>{G.root.classList.remove(`${D}--scrolling`),y=!1,U.vt.velocity=0,U.vt.sampleCount=0,p.emit("velocity:change",{velocity:0,reliable:!1}),m()},M?.idleTimeout??t2)},U.wh=b0,G.viewport.addEventListener("wheel",b0,{passive:!1});else if(Q&&H)b0=(b)=>{if(b.deltaX)return;b.preventDefault(),G.viewport.scrollLeft+=b.deltaY},U.wh=b0,G.viewport.addEventListener("wheel",b0,{passive:!1});let z2=(b)=>{let l=b.target.closest("[data-index]");if(l){let s=parseInt(l.dataset.index??"-1",10);if(s>=0){let j0=U.dm?.getItem(s)??U.it[s];if(j0){if(j0.__groupHeader)return;p.emit("item:click",{item:j0,index:s,event:b})}}}for(let s=0;s<q0.length;s++)q0[s](b)},hJ=(b)=>{let l=b.target.closest("[data-index]");if(l){let s=parseInt(l.dataset.index??"-1",10);if(s>=0){let j0=U.dm?.getItem(s)??U.it[s];if(j0){if(j0.__groupHeader)return;p.emit("item:dblclick",{item:j0,index:s,event:b})}}}},w2=(b)=>{for(let x=0;x<Y0.length;x++)Y0[x](b)};G.items.addEventListener("click",z2),G.items.addEventListener("dblclick",hJ),G.root.addEventListener("keydown",w2);let O2=new ResizeObserver((b)=>{if(U.id)return;for(let x of b){let l=x.contentRect.height,s=x.contentRect.width,j0=Q?s:l,U0=Q?U.cw:U.ch;if(U.cw=s,U.ch=l,Math.abs(j0-U0)>1){if(r.viewportState.containerSize=j0,U.ii)Z0(),U.rfn(),p.emit("resize",{height:l,width:s})}if(U.ii)for(let W0=0;W0<g.length;W0++)g[W0](s,l)}});if(U.vre)O2.observe(G.viewport);let A2={dom:G,emitter:p,resolvedConfig:_,rawConfig:J,rendered:Q0,pool:u,itemState:o,sharedState:r,renderRange:R,isHorizontal:Q,classPrefix:D,contentSizeHandlers:d,afterScroll:t,clickHandlers:q0,keydownHandlers:Y0,resizeHandlers:g,destroyHandlers:J0,methods:n,onScrollFrame:O0,resizeObserver:O2,applyTemplate:N0,updateContentSize:Z0},V0=n2(U,A2);U.dm=o2(U,A2,V0),U.sc=i2(U,A2);let S2=new Map;for(let b of $)if(b.methods)for(let x of b.methods){let l=S2.get(x);if(l)throw Error(`[vlist/builder] Method "${x}" is registered by both "${l}" and "${b.name}"`);S2.set(x,b.name)}for(let b of $)b.setup(V0);if(U.ii=!0,V0.state.isInitialized=!0,Z0(),U.rfn(),A&&U.it.length>0){let b=U.gsp(U.it.length-1,U.hc,U.ch,U.it.length,"end");U.sst(b),U.ls=b,U.rfn()}let uJ=(b)=>{V0.dataManager.setItems(b,0,b.length)},gJ=A?(b)=>{let x=U.sab(2),l=U.it.length;if(V0.dataManager.setItems(b,l),x&&U.it.length>0){let s=U.gsp(U.it.length-1,U.hc,U.ch,U.it.length,"end");U.sst(s),U.ls=s,U.rfn()}}:(b)=>{let x=U.it.length;V0.dataManager.setItems(b,x)},xJ=A?(b)=>{let x=U.sgt(),l=U.hc.getTotalSize(),s=[...U.it];V0.dataManager.clear(),V0.dataManager.setItems([...b,...s],0);let U0=U.hc.getTotalSize()-l;if(U0>0)U.sst(x+U0),U.ls=x+U0}:(b)=>{let x=[...U.it];V0.dataManager.clear(),V0.dataManager.setItems([...b,...x],0)},mJ=(b,x)=>{V0.dataManager.updateItem(b,x)},dJ=(b)=>{V0.dataManager.removeItem(b)},cJ=async()=>{if(V0.dataManager.reload)await V0.dataManager.reload()},s0=()=>{if(P!==null)cancelAnimationFrame(P),P=null},lJ=(b,x,l)=>{if(s0(),Math.abs(x-b)<1){U.sst(x),U.ls=x,U.rfn();return}let s=performance.now(),j0=(U0)=>{let W0=U0-s,A0=Math.min(W0/l,1),I0=b+(x-b)*b2(A0);if(U.sst(I0),U.ls=I0,U.rfn(),A0<1)P=requestAnimationFrame(j0);else P=null};P=requestAnimationFrame(j0)},rJ=(b,x)=>{let{align:l,behavior:s,duration:j0}=v0(x),U0=U.vtf(),W0=b;if(V&&U0>0)W0=(W0%U0+U0)%U0;let A0=U.gsp(W0,U.hc,U.ch,U0,l);if(s==="smooth")lJ(U.sgt(),A0,j0);else s0(),U.sst(A0)},aJ=()=>U.sgt(),sJ=(b,x)=>{return p.on(b,x)},nJ=(b,x)=>{p.off(b,x)},oJ=()=>{if(U.id)return;if(U.id=!0,V0.state.isDestroyed=!0,G.items.removeEventListener("click",z2),G.root.removeEventListener("keydown",w2),U.st.removeEventListener("scroll",O0),O2.disconnect(),c)c.disconnect(),c=null;if(U.wh)G.viewport.removeEventListener("wheel",U.wh);if(C)clearTimeout(C);for(let b=0;b<J0.length;b++)J0[b]();for(let b of $)if(b.destroy)b.destroy();s0();for(let[,b]of Q0)b.remove(),u.release(b);Q0.clear(),u.clear(),p.clear(),G.root.remove()},f2={get element(){return G.root},get items(){if(n.has("_getItems"))return n.get("_getItems")();return U.it},get total(){if(n.has("_getTotal"))return n.get("_getTotal")();return U.vtf()},setItems:n.has("setItems")?n.get("setItems"):uJ,appendItems:n.has("appendItems")?n.get("appendItems"):gJ,prependItems:n.has("prependItems")?n.get("prependItems"):xJ,updateItem:n.has("updateItem")?n.get("updateItem"):mJ,removeItem:n.has("removeItem")?n.get("removeItem"):dJ,reload:n.has("reload")?n.get("reload"):cJ,scrollToIndex:n.has("scrollToIndex")?n.get("scrollToIndex"):rJ,cancelScroll:n.has("cancelScroll")?n.get("cancelScroll"):s0,getScrollPosition:n.has("getScrollPosition")?n.get("getScrollPosition"):aJ,on:sJ,off:nJ,destroy:oJ};for(let[b,x]of n){if(b.charCodeAt(0)===95||b==="setItems"||b==="appendItems"||b==="prependItems"||b==="updateItem"||b==="removeItem"||b==="reload"||b==="scrollToIndex"||b==="scrollToItem"||b==="cancelScroll"||b==="getScrollPosition")continue;f2[b]=x}return f2}Q2();var S0=(J,q,Q={},j="vlist",K=!1)=>{let{autoHide:X=!0,autoHideDelay:B=1000,minThumbSize:N=30,showOnHover:D=!0,hoverZoneWidth:Y=16,showOnViewportEnter:W=!0}=Q,F=0,M=0,H=0,V=0,A=!1,Z=!1,T=0,L=0,E=0,O=null,_=!1,$=null,h=null,v=K?"width":"height",G=K?"translateX":"translateY",p=K?(t)=>t.clientX:(t)=>t.clientY,i=K?"left":"top",w=document.createElement("div"),u=document.createElement("div"),U=D?document.createElement("div"):null,P=()=>{if(w.className=`${j}-scrollbar`,u.className=`${j}-scrollbar-thumb`,K)w.classList.add(`${j}-scrollbar--horizontal`);if(w.appendChild(u),J.appendChild(w),U){if(U.className=`${j}-scrollbar-hover`,K)U.classList.add(`${j}-scrollbar-hover--horizontal`),U.style.height=`${Y}px`;else U.style.width=`${Y}px`;J.appendChild(U)}},C=()=>{if(O)clearTimeout(O),O=null},y=()=>{if(!X)return;C(),O=setTimeout(R,B)},k=()=>{if(F<=M)return;if(C(),!_)w.classList.add(`${j}-scrollbar--visible`),_=!0;if(X&&!A&&!Z)y()},R=()=>{if(A||Z)return;w.classList.remove(`${j}-scrollbar--visible`),_=!1},f=(t,q0)=>{F=t,M=q0;let Y0=F>M;if(w.style.display=Y0?"":"none",!Y0){R();return}let g=M/F;H=Math.max(N,g*M),u.style[v]=`${H}px`,V=M-H,r(E)},r=(t)=>{if(E=t,F<=M||V<=0)return;let q0=F-M,g=Math.min(1,Math.max(0,t/q0))*V;u.style.transform=`${G}(${g}px)`},Q0=(t)=>{if(t.target===u)return;let q0=w.getBoundingClientRect(),d=p(t)-q0[i]-H/2,n=Math.max(0,Math.min(d,V))/V,B0=F-M,K0=n*B0;q(K0),k()},z=(t)=>{t.preventDefault(),t.stopPropagation(),A=!0,T=p(t),L=E,C(),w.classList.add(`${j}-scrollbar--dragging`),document.addEventListener("mousemove",S),document.addEventListener("mouseup",c)},S=(t)=>{if(!A)return;let q0=p(t)-T,Y0=V>0?q0/V:0,g=F-M,d=Y0*g,J0=Math.max(0,Math.min(L+d,g)),B0=J0/g*V;if(u.style.transform=`${G}(${B0}px)`,h=J0,$===null)$=requestAnimationFrame(()=>{if(h!==null)q(h);$=null})},c=()=>{if(A=!1,$!==null)cancelAnimationFrame($),$=null;if(h!==null)q(h),h=null;if(w.classList.remove(`${j}-scrollbar--dragging`),X&&!Z)y();document.removeEventListener("mousemove",S),document.removeEventListener("mouseup",c)},a=()=>{if(W)k()},I=()=>{if(!A){if(Z=!1,X)y()}},m=()=>{Z=!0,C(),k()},o=()=>{if(Z=!1,!A&&X)y()},e=()=>{if(C(),$!==null)cancelAnimationFrame($),$=null;if(w.removeEventListener("click",Q0),w.removeEventListener("mouseenter",m),w.removeEventListener("mouseleave",o),u.removeEventListener("mousedown",z),J.removeEventListener("mouseenter",a),J.removeEventListener("mouseleave",I),document.removeEventListener("mousemove",S),document.removeEventListener("mouseup",c),U){if(U.removeEventListener("mouseenter",m),U.removeEventListener("mouseleave",o),U.parentNode)U.parentNode.removeChild(U)}if(w.parentNode)w.parentNode.removeChild(w)};if(P(),w.addEventListener("click",Q0),w.addEventListener("mouseenter",m),w.addEventListener("mouseleave",o),u.addEventListener("mousedown",z),J.addEventListener("mouseenter",a),J.addEventListener("mouseleave",I),U)U.addEventListener("mouseenter",m),U.addEventListener("mouseleave",o);return{show:k,hide:R,updateBounds:f,updatePosition:r,isVisible:()=>_,destroy:e}};var DJ=(J)=>{let q=null;return{name:"withScrollbar",priority:30,setup(Q){let{dom:j,config:K}=Q,{classPrefix:X,horizontal:B}=K;if(q=S0(j.viewport,(Y)=>Q.scrollController.scrollTo(Y),J??{},X,B),!j.viewport.classList.contains(`${X}-viewport--custom-scrollbar`))j.viewport.classList.add(`${X}-viewport--custom-scrollbar`);let N=Q.getCachedCompression();q.updateBounds(N.virtualSize,Q.state.viewportState.containerSize);let D=q;Q.afterScroll.push((Y,W)=>{D.updatePosition(Y),D.show()}),Q.resizeHandlers.push((Y,W)=>{if(D){let F=Q.getCachedCompression();D.updateBounds(F.virtualSize,Q.state.viewportState.containerSize)}}),Q.contentSizeHandlers.push(()=>{if(D){let Y=Q.getCachedCompression();D.updateBounds(Y.virtualSize,Q.state.viewportState.containerSize)}}),Q.destroyHandlers.push(()=>{if(D)D.destroy()})},destroy(){if(q)q.destroy(),q=null}}};var _J=(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,B=J.samples[X],N=q-B.position,D=Q-B.time;J.velocity=D>0?N/D:0}return J.lastPosition=q,J.lastTime=Q,J},N1=(J)=>J.sampleCount>=3,VJ=(J,q={})=>{let{wheel:Q=!0,sensitivity:j=1,smoothing:K=!1,idleTimeout:X=150,onScroll:B,onIdle:N,scrollElement:D,horizontal:Y=!1}=q,W=!!D,F=0,M=0,H=W?Y?window.innerWidth:window.innerHeight:Y?J.clientWidth:J.clientHeight,V=q.compressed??!1,A=q.compression,Z=_J(),T=!1,L=null,O=q2(()=>{let I=Y?J.scrollLeft:J.scrollTop,m=I>=F?"down":"up";if(Z=j2(Z,I),F=I,B)B({scrollTop:F,direction:m,velocity:Z.velocity});p()}),$=q2(()=>{let I=J.getBoundingClientRect(),m=Y?Math.max(0,-I.left):Math.max(0,-I.top),o=m>=F?"down":"up";if(Z=j2(Z,m),F=m,!T)T=!0;if(B)B({scrollTop:F,direction:o,velocity:Z.velocity});p()}),h=(I)=>{I.preventDefault()},v=(I)=>{if(I.deltaX)return;I.preventDefault(),J.scrollLeft+=I.deltaY},G=(I)=>{if(!V)return;I.preventDefault();let m=(Y?I.deltaX||I.deltaY:I.deltaY)*j,o=F+m;if(K)o=F+m*0.3;if(o=Math.max(0,Math.min(o,M)),o!==F){let t=o>=F?"down":"up";if(Z=j2(Z,o),F=o,!T)T=!0;if(B)B({scrollTop:F,direction:t,velocity:Z.velocity});p()}},p=()=>{if(L)clearTimeout(L);L=setTimeout(()=>{if(T=!1,Z=_J(F),N)N()},X)},i=(I)=>{if(V)return;if(V=!0,A=I,M=I.virtualSize-H,W)return;if(O.cancel(),J.removeEventListener("scroll",O),!Q)J.removeEventListener("wheel",h);else if(Y)J.removeEventListener("wheel",v);if(Y)J.style.overflowX="hidden";else J.style.overflow="hidden";if(Q)J.addEventListener("wheel",G,{passive:!1});let m=Y?J.scrollLeft:J.scrollTop;if(m>0){let o=Y?A?.actualSize??J.scrollWidth:A?.actualSize??J.scrollHeight;F=m/o*M}if(Y)J.scrollLeft=0;else J.scrollTop=0},w=()=>{if(!V)return;if(V=!1,W){A=void 0;return}if(J.removeEventListener("wheel",G),Y)J.style.overflowX="auto";else J.style.overflow="auto";if(J.addEventListener("scroll",O,{passive:!0}),!Q)J.addEventListener("wheel",h,{passive:!1});else if(Y)J.addEventListener("wheel",v,{passive:!1});if(A&&F>0){let m=F/M*(A.actualSize-H);if(Y)J.scrollLeft=m;else J.scrollTop=m}A=void 0},u=()=>{if(W||V)return F;return Y?J.scrollLeft:J.scrollTop},U=(I,m=!1)=>{let o=Math.max(0,Math.min(I,M||1/0));if(W){let e=J.getBoundingClientRect();if(Y){let t=e.left+window.scrollX;window.scrollTo({left:t+o,behavior:m?"smooth":"auto"})}else{let t=e.top+window.scrollY;window.scrollTo({top:t+o,behavior:m?"smooth":"auto"})}}else if(V){if(o===F)return;let t=o>=F?"down":"up";if(Z=j2(Z,o),F=o,!T)T=!0;if(B)B({scrollTop:F,direction:t,velocity:Z.velocity});p()}else if(Y)J.scrollTo({left:o,behavior:m?"smooth":"auto"});else J.scrollTo({top:o,behavior:m?"smooth":"auto"})},P=(I)=>{U(u()+I)},C=()=>{return u()<=0},y=(I=0)=>{let m=u(),o=W||V?M:Y?J.scrollWidth-J.clientWidth:J.scrollHeight-J.clientHeight;return m>=o-I},k=()=>{let I=u(),m=W||V?M:Y?J.scrollWidth-J.clientWidth:J.scrollHeight-J.clientHeight;if(m<=0)return 0;return Math.min(1,Math.max(0,I/m))},R=(I)=>{if(I.compression)A=I.compression,M=A.virtualSize-H},f=()=>V,r=()=>Math.abs(Z.velocity),Q0=()=>N1(Z),z=()=>T,S=()=>W,c=(I)=>{if(H=I,A)M=A.virtualSize-H},a=()=>{if(L)clearTimeout(L);if(W)$.cancel(),window.removeEventListener("scroll",$);else O.cancel(),J.removeEventListener("scroll",O),J.removeEventListener("wheel",G),J.removeEventListener("wheel",h),J.removeEventListener("wheel",v)};if(W){if(V&&A)M=A.virtualSize-H;window.addEventListener("scroll",$,{passive:!0})}else if(V&&A){if(M=A.virtualSize-H,Y)J.style.overflowX="hidden";else J.style.overflow="hidden";if(Q)J.addEventListener("wheel",G,{passive:!1})}else{if(Y)J.style.overflowX="auto",J.style.overflowY="hidden";else J.style.overflow="auto";if(J.addEventListener("scroll",O,{passive:!0}),!Q)J.addEventListener("wheel",h,{passive:!1});else if(Y)J.addEventListener("wheel",v,{passive:!1})}return{getScrollTop:u,scrollTo:U,scrollBy:P,isAtTop:C,isAtBottom:y,getScrollPercentage:k,getVelocity:r,isTracking:Q0,isScrolling:z,updateConfig:R,enableCompression:i,disableCompression:w,isCompressed:f,isWindowMode:S,updateContainerHeight:c,destroy:a}},q2=(J)=>{let q=null,Q=null,j=(...K)=>{if(Q=K,q===null)q=requestAnimationFrame(()=>{if(q=null,Q)J(...Q)})};return j.cancel=()=>{if(q!==null)cancelAnimationFrame(q),q=null},j};var W1=0.65,D1=0.5,_1=0.95,V1=0.1,G1=5,M1=100,GJ=()=>{let J=null,q=0,Q=!1,j=0,K=null,X=0,B=0,N=null,D=[];return{name:"withScale",priority:20,setup(Y){let{dom:W,config:F}=Y,{classPrefix:M,horizontal:H}=F,V=()=>{let L=Y.getVirtualTotal(),E=F0(L,Y.sizeCache);if(E.isCompressed&&!Q){Q=!0,Y.scrollController.enableCompression(E),Y.updateContentSize(E.virtualSize),Y.setScrollFns(()=>q,(w)=>{if(q=w,j=w,K!==null)cancelAnimationFrame(K),K=null});let O=()=>{let w=j-q;if(Math.abs(w)<D1)q=j,K=null;else{q+=w*W1;let U=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize;q=Math.max(0,Math.min(q,U)),K=requestAnimationFrame(O)}Y.scrollController.scrollTo(q)},_=W.viewport,$=(w)=>{w.preventDefault();let U=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize;if(j=Math.max(0,Math.min(j+w.deltaY,U)),K===null)K=requestAnimationFrame(O)};_.addEventListener("wheel",$,{passive:!1});let h=()=>{if(N!==null)cancelAnimationFrame(N),N=null},v=(w)=>{if(h(),K!==null)cancelAnimationFrame(K),K=null;let u=w.touches[0];if(!u)return;let U=H?u.clientX:u.clientY;X=U,B=q,D=[{time:performance.now(),y:U}]},G=(w)=>{w.preventDefault();let u=w.touches[0];if(!u)return;let U=H?u.clientX:u.clientY,P=performance.now();if(D.push({time:P,y:U}),D.length>G1)D.shift();let C=X-U,k=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize,R=Math.max(0,Math.min(B+C,k));q=R,j=R,Y.scrollController.scrollTo(R)},p=(w)=>{let u=performance.now(),U=D.filter((k)=>u-k.time<M1),P=0;if(U.length>=2){let k=U[0],R=U[U.length-1],f=R.time-k.time;if(f>0)P=(k.y-R.y)/f}if(D=[],Math.abs(P)<V1)return;let C=P*16,y=()=>{if(C*=_1,Math.abs(C)<0.5){N=null;return}let R=Y.getCachedCompression().virtualSize-Y.state.viewportState.containerSize,f=q+C;if(f=Math.max(0,Math.min(f,R)),f<=0&&C<0||f>=R&&C>0){q=f,j=f,Y.scrollController.scrollTo(f),N=null;return}q=f,j=f,Y.scrollController.scrollTo(f),N=requestAnimationFrame(y)};N=requestAnimationFrame(y)};if(_.addEventListener("touchstart",v,{passive:!0}),_.addEventListener("touchmove",G,{passive:!1}),_.addEventListener("touchend",p,{passive:!0}),_.addEventListener("touchcancel",p,{passive:!0}),Y.destroyHandlers.push(()=>{if(_.removeEventListener("wheel",$),_.removeEventListener("touchstart",v),_.removeEventListener("touchmove",G),_.removeEventListener("touchend",p),_.removeEventListener("touchcancel",p),h(),K!==null)cancelAnimationFrame(K),K=null}),!W.viewport.querySelector(`.${M}-scrollbar`)){if(J=S0(W.viewport,(u)=>Y.scrollController.scrollTo(u),{},M,H),!W.viewport.classList.contains(`${M}-viewport--custom-scrollbar`))W.viewport.classList.add(`${M}-viewport--custom-scrollbar`);J.updateBounds(E.virtualSize,Y.state.viewportState.containerSize);let w=J;Y.afterScroll.push((u,U)=>{if(w)w.updatePosition(u),w.show()}),Y.resizeHandlers.push((u,U)=>{if(w){let P=Y.getCachedCompression();w.updateBounds(P.virtualSize,Y.state.viewportState.containerSize)}})}}else if(!E.isCompressed&&Q)Q=!1,Y.scrollController.disableCompression(),Y.updateContentSize(E.actualSize);else if(E.isCompressed)Y.scrollController.updateConfig({compression:E}),Y.updateContentSize(E.virtualSize);if(J)J.updateBounds(E.virtualSize,Y.state.viewportState.containerSize);Y.state.cachedCompression={state:E,totalItems:L}};Y.updateCompressionMode=V;let A=Y.getCachedCompression.bind(Y);Y.getCachedCompression=()=>{if(Y.state.cachedCompression)return Y.state.cachedCompression.state;return A()},Y.setVisibleRangeFn((L,E,O,_,$)=>{Z=null,T=null;let h=F0(_,O);e0(L,E,O,_,h,$)}),Y.setScrollToPosFn((L,E,O,_,$)=>{let h=F0(_,E);return J2(L,E,O,_,h,$)});let Z=null,T=null;Y.setPositionElementFn((L,E)=>{let O=Y.getVirtualTotal(),_=F0(O,Y.sizeCache);if(_.isCompressed){let $=Y.scrollController.getScrollTop();if(Z===null||E<T)T=E,Z=Math.round(w0(E,$,Y.sizeCache,O,Y.state.viewportState.containerSize,_));let h=Z+Y.sizeCache.getOffset(E)-Y.sizeCache.getOffset(T),v=Y.config.horizontal;L.style.transform=v?`translateX(${h}px)`:`translateY(${h}px)`}else{let $=Math.round(Y.sizeCache.getOffset(E)),h=Y.config.horizontal;L.style.transform=h?`translateX(${$}px)`:`translateY(${$}px)`}}),V(),Y.destroyHandlers.push(()=>{if(J)J.destroy(),J=null;if(K!==null)cancelAnimationFrame(K),K=null})},destroy(){if(J)J.destroy(),J=null;if(K!==null)cancelAnimationFrame(K),K=null;if(N!==null)cancelAnimationFrame(N),N=null}}};var X2=(J={})=>{let{chunkSize:q=100,maxCachedItems:Q=5000,evictionBuffer:j=200,onEvict:K}=J,X=new Map,B=0,N=0,D=(P)=>{let C=X.get(P);if(!C)C={items:Array(q),count:0,lastAccess:Date.now()},X.set(P,C);else C.lastAccess=Date.now();return C},Y=(P)=>{return Math.floor(P/q)},W=(P)=>{return P%q},F=()=>B,M=(P)=>{B=P},H=(P)=>{if(P<0||P>=B)return;let C=Y(P),y=X.get(C);if(!y)return;return y.items[W(P)]},V=(P)=>{if(P<0||P>=B)return!1;let C=Y(P),y=X.get(C);if(!y)return!1;return y.items[W(P)]!==void 0},A=(P,C)=>{let y=Y(P),k=D(y),R=W(P),f=k.items[R]===void 0;if(k.items[R]=C,f)k.count++,N++;if(P>=B)B=P+1},Z=(P,C)=>{for(let y=0;y<C.length;y++){let k=C[y];if(k!==void 0)A(P+y,k)}},T=(P)=>{if(P<0||P>=B)return!1;let C=Y(P),y=X.get(C);if(!y)return!1;let k=W(P);if(y.items[k]===void 0)return!1;if(y.items[k]=void 0,y.count--,N--,y.count===0)X.delete(C);return!0},L=(P,C)=>{let y=[];for(let k=P;k<=C&&k<B;k++)y.push(H(k));return y},E=(P,C)=>{for(let y=P;y<=C&&y<B;y++)if(!V(y))return!1;return!0},O=()=>{let P=[],C=null,y=Array.from(X.keys()).sort((k,R)=>k-R);for(let k of y){let R=X.get(k);if(!R)continue;let f=k*q;for(let r=0;r<q;r++){let Q0=f+r;if(Q0>=B)break;if(R.items[r]!==void 0)if(C===null)C={start:Q0,end:Q0};else if(Q0===C.end+1)C.end=Q0;else P.push(C),C={start:Q0,end:Q0};else if(C!==null)P.push(C),C=null}}if(C!==null)P.push(C);return P},_=(P,C)=>{let y=[],k=null;for(let R=P;R<=C&&R<B;R++)if(!V(R))if(k===null)k={start:R,end:R};else k.end=R;else if(k!==null)y.push(k),k=null;if(k!==null)y.push(k);return y},$=(P)=>{return X.has(P)},h=(P)=>{let C=X.get(P);if(C)C.lastAccess=Date.now()},v=(P,C)=>{if(P>C||X.size===0)return;let y=Date.now(),k=Y(Math.max(0,P)),R=Y(Math.min(B-1,C));for(let f=k;f<=R;f++){let r=X.get(f);if(r)r.lastAccess=y}},G=(P,C)=>{if(N<=Q)return 0;let y=Math.max(0,P-j),k=Math.min(B-1,C+j),R=Y(y),f=Y(k),r=0,Q0=[];for(let[z,S]of X)if(z<R||z>f)r+=S.count,Q0.push(z),N-=S.count,X.delete(z);if(r>0&&K)K(r,Q0);return r},p=()=>{if(N<=Q)return 0;let P=Array.from(X.entries()).sort(([,k],[,R])=>k.lastAccess-R.lastAccess),C=0,y=[];for(let[k,R]of P){if(N<=Q)break;C+=R.count,N-=R.count,y.push(k),X.delete(k)}if(C>0&&K)K(C,y);return C},i=()=>{return{totalItems:B,cachedItems:N,cachedChunks:X.size,chunkSize:q,maxCachedItems:Q,memoryEfficiency:B>0?1-N/B:1}},w=()=>N,u=()=>{X.clear(),N=0};return{chunkSize:q,maxCachedItems:Q,getTotal:F,setTotal:M,get:H,has:V,set:A,setRange:Z,delete:T,getRange:L,isRangeLoaded:E,getLoadedRanges:O,findUnloadedRanges:_,getChunkIndex:Y,isChunkLoaded:$,touchChunk:h,touchChunksForRange:v,evictDistant:G,evictToLimit:p,getStats:i,getCachedCount:w,clear:u,reset:()=>{u(),B=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 B=[],N=Y2(q),D=X.start;for(let Y of N){if(Y.end<D)continue;if(Y.start>X.end)break;if(Y.start>D)B.push({start:D,end:Math.min(Y.start-1,X.end)});if(D=Y.end+1,D>X.end)break}if(D<=X.end)B.push({start:D,end:X.end});return B};var K2=(J={})=>{let{maskCharacter:q=qJ,maxSampleSize:Q=XJ}=J,j=[],K=!1,X=0,B=(F)=>{if(K||F.length===0)return;let M=Math.min(F.length,Q);for(let H=0;H<M;H++){let V=F[H];if(!V||typeof V!=="object")continue;let A={};for(let[Z,T]of Object.entries(V)){if(Z.startsWith("_")||Z==="id")continue;A[Z]=String(T??"").length}if(Object.keys(A).length>0)j.push(A)}K=!0},N=()=>K,D=(F)=>{let M={id:`${YJ}${X++}`,[y2]:!0,_index:F};if(j.length===0)return M.label=q.repeat(12),M;let H=j[F%j.length];for(let[V,A]of Object.entries(H))M[V]=q.repeat(Math.max(1,A));return M};return{analyzeStructure:B,hasAnalyzedStructure:N,generate:D,generateRange:(F,M)=>{let H=[];for(let V=F;V<=M;V++)H.push(D(V));return H},clear:()=>{j=[],K=!1,X=0}}},P0=(J)=>{if(!J||typeof J!=="object")return!1;return J[y2]===!0},H2=(J)=>{return J.filter((q)=>!P0(q))};var A1=50,U2=(J={})=>{let{adapter:q,initialItems:Q,initialTotal:j,storage:K,placeholder:X,pageSize:B=A1,onStateChange:N,onItemsLoaded:D,onItemsEvicted:Y}=J,W=X2({...K,onEvict:(g,d)=>{Y?.(g),_()}}),F=null,M=()=>{if(!F)F=K2(X);return F},H=new Map,V=!1,A,Z=!0,T,L=[],E=0,O=new Map,_=()=>{N?.(U())},$=()=>{H.clear();let g=W.getLoadedRanges();for(let d of g)for(let J0=d.start;J0<=d.end;J0++){let n=W.get(J0);if(n&&!P0(n))H.set(n.id,J0)}},h=(g,d)=>{if(!P0(d))H.set(d.id,g)},v=(g)=>{H.delete(g)},G=(g,d)=>{return`${g}-${d}`},p=()=>W.getTotal(),i=()=>W.getCachedCount(),w=()=>V,u=()=>Z,U=()=>({total:W.getTotal(),cached:W.getCachedCount(),isLoading:V,pendingRanges:L,error:A,hasMore:Z,cursor:T}),P=()=>W,C=()=>M(),y=(g)=>{let d=W.get(g);if(d!==void 0)return d;if(g>=0&&g<W.getTotal())return M().generate(g);return},k=(g)=>{let d=H.get(g);if(d===void 0)return;return W.get(d)},R=(g)=>{return H.get(g)??-1},f=(g)=>{let d=W.get(g);return d!==void 0&&!P0(d)},r=(g,d)=>{let J0=[],n=W.getTotal(),B0=0,K0=0;W.touchChunksForRange(g,Math.min(d,n-1));for(let M0=g;M0<=d&&M0<n;M0++){let E0=W.get(M0);if(E0!==void 0)J0.push(E0),B0++;else J0.push(M().generate(M0)),K0++}return J0},Q0=(g)=>{W.setTotal(g),Z=W.getCachedCount()<g,_()},z=(g,d=0,J0)=>{if(F&&!F.hasAnalyzedStructure()&&g.length>0)F.analyzeStructure(g);for(let n=0;n<g.length;n++){let B0=g[n];if(B0!==void 0){let K0=d+n;W.set(K0,B0),h(K0,B0)}}if(J0!==void 0)W.setTotal(J0);else if(d+g.length>W.getTotal())W.setTotal(d+g.length);if(W.getCachedCount()>=W.getTotal()&&W.getTotal()>0)Z=!1;D?.(g,d,W.getTotal()),_()},S=(g,d)=>{let J0=H.get(g);if(J0===void 0)return!1;let n=W.get(J0);if(!n)return!1;let B0={...n,...d};if(W.set(J0,B0),d.id!==void 0&&d.id!==g)v(g),h(J0,B0);return _(),!0},c=(g)=>{let d=H.get(g);if(d===void 0)return!1;W.delete(d),v(g);let J0=W.getTotal();if(J0>0)W.setTotal(J0-1);return _(),!0},a=async(g,d)=>{if(!q)return;let J0=G(g,d);if(O.has(J0))return;let n=W.getLoadedRanges(),B0=g0({start:g,end:d},n,W.chunkSize);if(B0.length===0)return;let K0=W.chunkSize,M0=[];for(let N0 of B0){let $0=Math.floor(N0.start/K0),k0=Math.floor(N0.end/K0);for(let Z0=$0;Z0<=k0;Z0++){let L0=Z0*K0,D0=L0+K0-1,O0=G(L0,D0);if(!M0.some((b0)=>b0.start===L0)&&!O.has(O0))M0.push({start:L0,end:D0})}}let E0=[];for(let N0 of B0){let $0=Math.floor(N0.start/K0),k0=Math.floor(N0.end/K0);for(let Z0=$0;Z0<=k0;Z0++){let L0=Z0*K0,D0=L0+K0-1,O0=G(L0,D0);if(O.has(O0)){let b0=O.get(O0);if(!E0.includes(b0))E0.push(b0)}}}for(let N0 of M0){let $0=G(N0.start,N0.end),k0=(async()=>{L.push(N0),V=!0,A=void 0,_();try{let Z0=N0.end-N0.start+1,L0={offset:N0.start,limit:Z0,cursor:void 0},D0=await q.read(L0);if(z(D0.items,N0.start,D0.total),D0.cursor)T=D0.cursor;let O0=N0.start+D0.items.length;if(O0>=E){if(E=O0,D0.hasMore!==void 0)Z=D0.hasMore;else if(D0.total!==void 0)Z=O0<D0.total}}catch(Z0){A=Z0 instanceof Error?Z0:Error(String(Z0))}finally{O.delete($0),L=L.filter((Z0)=>Z0.start!==N0.start||Z0.end!==N0.end),V=O.size>0,_()}})();O.set($0,k0),E0.push(k0)}await Promise.all(E0)},I=async(g,d)=>{if(W.isRangeLoaded(g,d))return;await a(g,d)},m=async()=>{if(!q)return;await a(0,B-1)},o=async()=>{if(!q||V||!Z)return!1;let g=W.getCachedCount(),d=W.getTotal(),J0=g,n=Math.min(J0+B-1,d>0?d-1:J0+B-1);if(J0>=d&&d>0)return Z=!1,!1;return await a(J0,n),W.getCachedCount()>g},e=async()=>{if(W.clear(),W.setTotal(0),H.clear(),F)F.clear();O.clear(),L=[],V=!1,T=void 0,Z=!0,E=0,A=void 0,_()},t=(g,d)=>{if(W.evictDistant(g,d)>0)$()},q0=()=>{W.clear(),H.clear(),T=void 0,A=void 0,L=[],V=!1,_()},Y0=()=>{if(W.reset(),H.clear(),F)F.clear();T=void 0,Z=!0,E=0,A=void 0,L=[],V=!1,_()};if(Q&&Q.length>0)z(Q,0,j??Q.length);else if(j!==void 0)W.setTotal(j),_();return{getState:U,getTotal:p,getCached:i,getIsLoading:w,getHasMore:u,getStorage:P,getPlaceholders:C,getItem:y,getItemById:k,getIndexById:R,isItemLoaded:f,getItemsInRange:r,setTotal:Q0,setItems:z,updateItem:S,removeItem:c,loadRange:a,ensureRange:I,loadInitial:m,loadMore:o,reload:e,evictDistant:t,clear:q0,reset:Y0}};var MJ=(J)=>{let{adapter:q,loading:Q,storage:j,total:K,autoLoad:X=!0}=J,B=Q?.cancelThreshold??JJ,N=Q?.preloadThreshold??QJ,D=Q?.preloadAhead??jJ;return{name:"withAsync",priority:20,methods:["reload","loadVisibleRange"],setup(Y){let{emitter:W}=Y,F=Y.config.reverse,M=U2({adapter:q,...K!==void 0&&{initialTotal:K},pageSize:j?.chunkSize??z0,...j&&{storage:{...j.chunkSize!==void 0&&{chunkSize:j.chunkSize},...j.maxCachedItems!==void 0&&{maxCachedItems:j.maxCachedItems}}},onStateChange:()=>{if(Y.state.isInitialized){let O=Y.getVirtualTotal();Y.sizeCache.rebuild(O),Y.updateCompressionMode();let _=Y.getCachedCompression();Y.state.viewportState.totalSize=_.virtualSize,Y.state.viewportState.actualSize=_.actualSize,Y.state.viewportState.isCompressed=_.isCompressed,Y.state.viewportState.compressionRatio=_.ratio,Y.updateContentSize(_.virtualSize),Y.renderIfNeeded()}},onItemsLoaded:(O,_,$)=>{if(Y.state.isInitialized)Y.forceRender(),W.emit("load:end",{items:O,total:$,offset:_})}});Y.replaceDataManager(M);let H=null,V=null,A=0,Z=()=>{if(V){let O=V;V=null,Y.dataManager.ensureRange(O.start,O.end).catch((_)=>{W.emit("error",{error:_,context:"ensureRange"})})}};Y.afterScroll.push((O,_)=>{if(Y.state.isDestroyed)return;let $=Y.scrollController.getVelocity(),v=Y.scrollController.isTracking()&&$<=B;if(V&&A>B&&$<=B){let i=V;V=null,Y.dataManager.ensureRange(i.start,i.end).catch((w)=>{W.emit("error",{error:w,context:"ensureRange"})})}if(A=$,v&&!Y.dataManager.getIsLoading()&&Y.dataManager.getHasMore()){if(F){if(O<T2)W.emit("load:start",{offset:Y.dataManager.getCached(),limit:z0}),Y.dataManager.loadMore().catch((i)=>{W.emit("error",{error:i,context:"loadMore"})})}else if(Y.state.viewportState.totalSize-O-Y.state.viewportState.containerSize<T2)W.emit("load:start",{offset:Y.dataManager.getCached(),limit:z0}),Y.dataManager.loadMore().catch((w)=>{W.emit("error",{error:w,context:"loadMore"})})}let{renderRange:G}=Y.state.viewportState;if(!H||G.start!==H.start||G.end!==H.end)if(H={start:G.start,end:G.end},v){V=null;let{start:i,end:w}=G,u=Y.getVirtualTotal();if($>N)if(_==="down")w=Math.min(G.end+D,u-1);else i=Math.max(G.start-D,0);Y.dataManager.ensureRange(i,w).catch((U)=>{W.emit("error",{error:U,context:"ensureRange"})})}else V={start:G.start,end:G.end}});let T=200,L=null;Y.afterScroll.push((O,_)=>{if(L!==null)clearTimeout(L);L=setTimeout(()=>{L=null,Z()},T)}),Y.destroyHandlers.push(()=>{if(L!==null)clearTimeout(L),L=null});let E=()=>{if(Y.state.isDestroyed)return;H=null;let{renderRange:O}=Y.state.viewportState;if(O.end>0)Y.dataManager.ensureRange(O.start,O.end).catch((_)=>{W.emit("error",{error:_,context:"ensureRange"})});Z()};if(window.addEventListener("online",E),Y.destroyHandlers.push(()=>{window.removeEventListener("online",E)}),W.on("load:start",()=>{Y.dom.root.setAttribute("aria-busy","true")}),W.on("load:end",()=>{Y.dom.root.removeAttribute("aria-busy")}),Y.methods.set("loadVisibleRange",async()=>{H=null,V=null,Y.forceRender();let{renderRange:O}=Y.state.viewportState;if(O.end>0)W.emit("load:start",{offset:O.start,limit:O.end-O.start+1}),await Y.dataManager.ensureRange(O.start,O.end)}),Y.methods.set("reload",async()=>{H=null,V=null,Y.invalidateRendered(),await Y.dataManager.reload(),W.emit("load:start",{offset:0,limit:z0}),await Y.dataManager.loadInitial(),Y.forceRender();let{renderRange:O}=Y.state.viewportState;if(O.end>0)await Y.dataManager.ensureRange(O.start,O.end)}),X)W.emit("load:start",{offset:0,limit:z0}),Y.dataManager.loadInitial().catch((O)=>{W.emit("error",{error:O,context:"loadInitial"})});else if(K!==void 0)Y.dataManager.setTotal(K)}}};var OJ=()=>{let J=null;return{name:"withPage",priority:5,setup(q){let{dom:Q,state:j,config:K,emitter:X}=q;if(Q.root.style.overflow="visible",Q.root.style.height="auto",K.horizontal)Q.viewport.style.overflowX="visible",Q.viewport.style.overflowY="visible";else Q.viewport.style.overflow="visible";Q.viewport.classList.remove(`${K.classPrefix}-viewport--custom-scrollbar`),q.disableViewportResize(),q.disableWheelHandler(),q.setScrollTarget(window),q.setScrollFns(()=>{let Y=Q.viewport.getBoundingClientRect();if(K.horizontal)return Math.max(0,-Y.left);else return Math.max(0,-Y.top)},(Y)=>{let W=Q.viewport.getBoundingClientRect();if(K.horizontal){let F=W.left+window.scrollX;window.scrollTo(F+Y,window.scrollY)}else{let F=W.top+window.scrollY;window.scrollTo(window.scrollX,F+Y)}}),q.setContainerDimensions({width:()=>window.innerWidth,height:()=>window.innerHeight}),j.viewportState.containerSize=window.innerHeight;let{innerHeight:B,innerWidth:N}=window,D=()=>{let{innerWidth:Y,innerHeight:W}=window,F=K.horizontal?Y:W,M=K.horizontal?N:B;if(Math.abs(F-M)<=1)return;B=W,N=Y,j.viewportState.containerSize=W,X.emit("resize",{width:Y,height:W});for(let H=0;H<q.resizeHandlers.length;H++)q.resizeHandlers[H](Y,W);q.renderIfNeeded()};window.addEventListener("resize",D,{passive:!0}),J=()=>{window.removeEventListener("resize",D)},q.destroyHandlers.push(J)},destroy(){if(J)J(),J=null}}};var $2=(J,q)=>{let Q=0,j=J.length-1;while(Q<j){let K=Q+j+1>>>1;if(J[K].headerLayoutIndex<=q)Q=K;else j=K-1}return Q},AJ=(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},FJ=(J,q)=>{if(J===0)return[];let Q=[],j=q(0),K=0,X=0;for(let B=1;B<J;B++){let N=q(B);if(N!==j){let D=B-K;Q.push({key:j,groupIndex:Q.length,headerLayoutIndex:X,firstDataIndex:K,count:D}),X=X+1+D,j=N,K=B}}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 B=0;B<X.count;B++)j[K]=J[X.firstDataIndex+B],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)}},B2=(J,q)=>{let Q=FJ(J,q.getGroupForIndex),j=J+Q.length,K=q.headerHeight;return{get totalEntries(){return j},get groupCount(){return Q.length},get groups(){return Q},getEntry:(M)=>{if(Q.length===0)return{type:"item",dataIndex:M,group:{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0}};let H=$2(Q,M),V=Q[H];if(M===V.headerLayoutIndex)return{type:"header",group:V};let A=M-V.headerLayoutIndex-1;return{type:"item",dataIndex:V.firstDataIndex+A,group:V}},layoutToDataIndex:(M)=>{if(Q.length===0)return M;let H=$2(Q,M),V=Q[H];if(M===V.headerLayoutIndex)return-1;let A=M-V.headerLayoutIndex-1;return V.firstDataIndex+A},dataToLayoutIndex:(M)=>{if(Q.length===0)return M;let H=AJ(Q,M),V=Q[H],A=M-V.firstDataIndex;return V.headerLayoutIndex+1+A},getGroupAtLayoutIndex:(M)=>{if(Q.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let H=$2(Q,M);return Q[H]},getGroupAtDataIndex:(M)=>{if(Q.length===0)return{key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0};let H=AJ(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=FJ(M,q.getGroupForIndex),j=M+Q.length}}};var Z2=(J,q,Q,j,K,X=!1)=>{let B=document.createElement("div");if(B.className=`${K}-sticky-header`,B.setAttribute("role","presentation"),B.setAttribute("aria-hidden","true"),B.style.position="absolute",B.style.zIndex="5",B.style.pointerEvents="none",B.style.willChange="transform",B.style.overflow="hidden",X)B.style.top="0",B.style.bottom="0",B.style.left="0";else B.style.top="0",B.style.left="0",B.style.right="0";J.insertBefore(B,J.firstChild);let N=-1,D=!1,Y=0,W=(Z)=>{if(Z===N)return;N=Z;let T=q.groups;if(Z<0||Z>=T.length){B.textContent="";return}let L=T[Z],E=j.headerTemplate(L.key,L.groupIndex),O=q.getHeaderHeight(Z);if(X)B.style.width=`${O}px`;else B.style.height=`${O}px`;if(typeof E==="string")B.innerHTML=E;else B.replaceChildren(E)},F=(Z)=>{let T=q.groups;if(T.length===0){H();return}let L=Q.getOffset(T[0].headerLayoutIndex);if(Z<L){H();return}let E=0,O=T.length-1;while(E<O){let G=E+O+1>>>1;if(Q.getOffset(T[G].headerLayoutIndex)<=Z)E=G;else O=G-1}let _=E;if(!D)M();W(_);let $=q.getHeaderHeight(_),h=0,v=_+1;if(v<T.length){let p=Q.getOffset(T[v].headerLayoutIndex)-Z;if(p<$)h=p-$}if(h!==Y)if(Y=h,h===0)B.style.transform="";else{let G=Math.round(h);B.style.transform=X?`translateX(${G}px)`:`translateY(${G}px)`}},M=()=>{if(D)return;D=!0,B.style.display=""},H=()=>{if(!D)return;D=!1,B.style.display="none",N=-1,Y=0,B.style.transform=""},V=()=>{let Z=N;if(N=-1,Z>=0)W(Z)},A=()=>{B.remove(),N=-1,D=!1};return B.style.display="none",{update:F,refresh:V,show:M,hide:H,destroy:A}};var EJ=(J,q,Q,j,K,X)=>{if(j===0||q===0)return X.start=0,X.end=-1,X;let B=Q.indexAtOffset(J),N=Q.indexAtOffset(J+q);if(N<j-1)N++;return X.start=Math.max(0,B),X.end=Math.min(j-1,Math.max(0,N)),X},LJ=(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},bJ=(J,q,Q,j,K,X)=>{if(j===0)return 0;let B=Math.max(0,Math.min(J,j-1)),N=q.getOffset(B),D=q.getSize(B),Y=q.getTotalSize(),W=Math.max(0,Y-Q),F;switch(X){case"center":F=N-Q/2+D/2;break;case"end":F=N-Q+D;break;case"start":default:F=N;break}return Math.max(0,Math.min(F,W))},TJ=(J,q,Q)=>{if(Q&&Q.isCompressed)return Q.virtualSize;return q.getTotalSize()},yJ=(J,q)=>{return q.getTotalSize()},HJ=(J,q)=>{return q.getOffset(J)},$J=(J,q,Q)=>{let j=Math.max(0,q-Q);return Math.max(0,Math.min(J,j))};var C0=(J,q,Q,j,K="start",X,B=bJ)=>{return B(J,q,Q,j,X,K)},kJ=(J,q)=>{return J.start===q.start&&J.end===q.end},PJ=(J,q)=>{return J>=q.start&&J<=q.end},RJ=(J)=>{if(J.end<J.start)return 0;return J.end-J.start+1};var CJ=(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 zJ=(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:B,config:N,rawConfig:D}=X,{classPrefix:Y}=N,F=D.item.height;j=D.items?[...D.items]:[];let M=j.length,H={getGroupForIndex:J.getGroupForIndex,headerHeight:J.headerHeight,headerTemplate:J.headerTemplate,sticky:J.sticky??!1};q=B2(M,H),K=x0(j,q.groups);let V=m0(q,F);X.setSizeConfig(V),X.rebuildSizeCache(K.length),X.dataManager.setItems(K,0,K.length);let A=D.item.template,{headerTemplate:Z}=J,T=(v,G,p)=>{if(R0(v))return Z(v.groupKey,v.groupIndex);return A(v,G,p)},L=X.methods.get("_getGridLayout"),E=X.methods.get("_replaceGridRenderer"),O=X.methods.get("_updateGridLayoutForGroups");if(L&&E){if(O)O((i)=>{let w=K[i];return!!(w&&R0(w))});let{createGridRenderer:v}=(N2(),j1(vJ)),G=L(),p=v(B.items,T,X.sizeCache,G,Y,X.getContainerWidth(),()=>X.dataManager.getTotal(),N.ariaIdPrefix);E(p)}else X.replaceTemplate(T);if(B.root.classList.add(`${Y}--grouped`),J.sticky!==!1){Q=Z2(B.root,q,X.sizeCache,{...H,sticky:H.sticky??!1},Y,N.horizontal);let v=Q;X.afterScroll.push((G,p)=>{v.update(G)}),Q.update(X.scrollController.getScrollTop())}let _=()=>{if(!q)return;q.rebuild(j.length),K=x0(j,q.groups);let v=m0(q,F);if(X.setSizeConfig(v),X.rebuildSizeCache(K.length),X.dataManager.setItems(K,0,K.length),Q)Q.refresh()};X.methods.set("setItems",(v)=>{j=v.slice(),_()}),X.methods.set("appendItems",(v)=>{j.push(...v),_()}),X.methods.set("prependItems",(v)=>{j.unshift(...v),_()}),X.methods.set("removeItem",(v)=>{j=j.filter((G)=>G.id!==v),_()});let{animateScroll:$,cancelScroll:h}=s2(X.scrollController,X.renderIfNeeded);X.methods.set("scrollToIndex",(v,G)=>{let p=q.dataToLayoutIndex(v),{align:i,behavior:w,duration:u}=v0(G),U=X.dataManager.getTotal(),P=C0(p,X.sizeCache,X.state.viewportState.containerSize,U,i,X.getCachedCompression());if(w==="smooth")$(X.scrollController.getScrollTop(),P,u);else h(),X.scrollController.scrollTo(P)}),X.methods.set("_getItems",()=>j),X.methods.set("_getTotal",()=>j.length),X.destroyHandlers.push(()=>{if(h(),Q)Q.destroy(),Q=null;B.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,Z=0,T=0;for(let L=0;L<V;L++)if(j(L)){if(T++,Z>0)A++,Z=0;A++,Z=0}else if(Z++,Z>=q)A++,Z=0;if(Z>0)A++;return A},B=(V)=>{return K.row=N(V),K.col=D(V),K},N=(V)=>{if(!j)return Math.floor(V/q);let A=0,Z=0;for(let T=0;T<=V;T++)if(j(T)){if(Z>0)A++,Z=0;if(T===V)return A;A++,Z=0}else{if(T===V)return A;if(Z++,Z>=q)A++,Z=0}return console.warn(`⚠️ getRow(${V}) fell through - returning ${A}`),A},D=(V)=>{if(!j)return V%q;if(j(V))return 0;let A=0;for(let Z=0;Z<=V;Z++)if(j(Z))A=0;else{if(Z===V)return A;if(A++,A>=q)A=0}return A},Y=(V,A,Z)=>{if(Z<=0)return{start:0,end:-1};if(!j){let _=Math.max(0,V*q),$=Math.min(Z-1,(A+1)*q-1);return{start:_,end:$}}let T=-1,L=-1,E=0,O=0;for(let _=0;_<Z;_++){if(j(_)){if(O>0)E++,O=0;if(E>=V&&E<=A){if(T===-1)T=_;L=_}E++,O=0}else{if(E>=V&&E<=A){if(T===-1)T=_;L=_}if(O++,O>=q)E++,O=0}if(E>A&&O===0)break}if(T===-1)return{start:0,end:-1};return{start:T,end:L}},W=(V,A,Z)=>{if(A<0||A>=q)return-1;let T=V*q+A;if(T<0||T>=Z)return-1;return T},F=(V)=>{let A=(q-1)*Q;return Math.max(0,(V-A)/q)};return{get columns(){return q},get gap(){return Q},update:(V)=>{if(V.columns!==void 0)q=Math.max(1,Math.floor(V.columns));if(V.gap!==void 0)Q=V.gap;if(V.isHeaderFn!==void 0)j=V.isHeaderFn},getTotalRows:X,getPosition:B,getRow:N,getCol:D,getItemRange:Y,getItemIndex:W,getColumnWidth:F,getColumnOffset:(V,A)=>{let Z=F(A);return V*(Z+Q)}}};N2();var L1=new Set,wJ=(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:B,rawConfig:N}=j,{classPrefix:D}=B;if(B.reverse)throw Error("[vlist/builder] withGrid cannot be used with reverse: true");let Y=B.horizontal,W=()=>Y?K.viewport.clientHeight:j.getContainerWidth(),F=N.items?.some((y)=>y.__groupHeader===!0),M={columns:J.columns,gap:J.gap??0};if(F)M.isHeaderFn=(y)=>{let k=j.dataManager.getItem(y);return!!(k&&k.__groupHeader===!0)};q=W2(M);let H=q.gap;j.setVirtualTotalFn(()=>{let y=j.dataManager.getTotal();return q.getTotalRows(y)});let V=N.item,A=B.horizontal?V.width:V.height,Z={containerWidth:W(),columns:q.columns,gap:q.gap};if(typeof A==="function")j.setSizeConfig((y)=>{let k=Z.containerWidth-2,R=(Z.columns-1)*Z.gap,f=(k-R)/Z.columns,r={containerWidth:Z.containerWidth,columns:Z.columns,gap:Z.gap,columnWidth:f,row:q.getRow(y),column:q.getCol(y),totalRows:q.getTotalRows(j.dataManager.getTotal()),totalColumns:Z.columns};return A(y,r)+Z.gap});else if(H>0)j.setSizeConfig(A+H);j.rebuildSizeCache(),K.root.classList.add(`${D}--grid`);let T=W(),L=N.item.template,E=()=>{Q=d0(K.items,L,j.sizeCache,q,D,T,()=>j.dataManager.getTotal(),B.ariaIdPrefix,B.horizontal),j.replaceRenderer(Q)};E(),j.methods.set("_getGridLayout",()=>q),j.methods.set("_getGridConfig",()=>M),j.methods.set("_replaceGridRenderer",(y)=>{Q=y}),j.methods.set("_updateGridLayoutForGroups",(y)=>{q.update({isHeaderFn:y});let k=j.dataManager.getTotal(),R=0;for(let f=0;f<k;f++)if(q.getCol(f)===0){let r=j.sizeCache.getSize(f);R+=r}if(j.sizeCache.getTotalSize=()=>R,B.horizontal)j.dom.content.style.width=`${R}px`;else j.dom.content.style.height=`${R}px`;E()}),j.methods.set("updateGrid",(y)=>{if(y.columns!==void 0){if(!Number.isInteger(y.columns)||y.columns<1)throw Error("[vlist/builder] updateGrid: columns must be a positive integer >= 1");M.columns=y.columns}if(y.gap!==void 0){if(y.gap<0)throw Error("[vlist/builder] updateGrid: gap must be non-negative");M.gap=y.gap}if(q)q.update(M);let k=W();if(Z.containerWidth=k,Z.columns=M.columns,Z.gap=M.gap??0,Q)Q.updateContainerWidth(k);j.rebuildSizeCache(),j.updateContentSize(j.sizeCache.getTotalSize()),j.updateCompressionMode();for(let R=0;R<j.contentSizeHandlers.length;R++)j.contentSizeHandlers[R]();if(Q)Q.clear();j.forceRender()});let O=null,_=null,$=!1,h=()=>{if($)return;$=!0,O=j.methods.get("_getSelectedIds")??null,_=j.methods.get("_getFocusedIndex")??null},v=-1,G=-1,p=!0,i=B.overscan??3,w={start:0,end:0},u={start:0,end:0},U=()=>{if(j.state.isDestroyed)return;let y=j.scrollController.getScrollTop(),k=j.state.viewportState.containerSize;if(!p&&y===v&&k===G)return;v=y,G=k,p=!1;let R=j.getVirtualTotal();if(R===0||k===0)w.start=0,w.end=0;else{w.start=Math.max(0,j.sizeCache.indexAtOffset(y));let o=j.sizeCache.indexAtOffset(y+k);if(o<R-1)o++;w.end=Math.min(R-1,Math.max(0,o))}u.start=Math.max(0,w.start-i),u.end=Math.min(R-1,w.end+i);let f=j.state.viewportState;f.scrollPosition=y,f.visibleRange.start=w.start,f.visibleRange.end=w.end,f.renderRange.start=u.start,f.renderRange.end=u.end;let r=j.state.lastRenderRange,Q0=f.isCompressed,z=j.dataManager.getTotal(),S=q.getItemRange(u.start,u.end,z),c=j.dataManager.getItemsInRange(S.start,S.end),a=Q0?j.getCompressionContext():void 0;h();let I=O?O():L1,m=_?_():-1;if(Q.render(c,S,I,m,a),r.start!==u.start||r.end!==u.end)r.start=u.start,r.end=u.end,X.emit("range:change",{range:{start:u.start,end:u.end}})},P=()=>{if(j.state.isDestroyed)return;j.state.lastRenderRange.start=-1,j.state.lastRenderRange.end=-1,p=!0,U()};j.setRenderFns(U,P);let C=typeof A==="function";if(j.resizeHandlers.push((y,k)=>{let R=Y?k:y;if(Z.containerWidth=R,Q)Q.updateContainerWidth(R);if(C){j.rebuildSizeCache(),j.updateContentSize(j.sizeCache.getTotalSize()),j.updateCompressionMode();for(let f=0;f<j.contentSizeHandlers.length;f++)j.contentSizeHandlers[f]();if(Q)Q.clear();j.forceRender()}}),j.methods.set("scrollToIndex",(y,k)=>{let R=Math.floor(y/J.columns),{align:f,behavior:r}=v0(k),Q0=j.dataManager.getState(),z=q.getTotalRows(Q0.total),S=Math.max(0,Math.min(R,z-1)),c=C0(S,j.sizeCache,j.state.viewportState.containerSize,z,f,j.getCachedCompression());if(r==="smooth")j.scrollController.scrollTo(c);else j.scrollController.scrollTo(c)}),!j.methods.has("_getTotal"))j.methods.set("_getTotal",()=>j.dataManager.getTotal());j.destroyHandlers.push(()=>{if(Q)Q.destroy(),Q=null;K.root.classList.remove(`${D}--grid`)})},destroy(){if(Q)Q.destroy(),Q=null}}};N2();var D2=(J)=>{let q=Math.max(1,Math.floor(J.columns)),Q=J.gap??0,j=J.containerSize,K=0,X=[],B=()=>{let Z=(q-1)*Q;K=Math.max(0,(j-Z)/q),X=Array(q);let T=K+Q;for(let L=0;L<q;L++)X[L]=L*T};B();let N=[],D=0,Y=[],W=(Z)=>{let T=0,L=Z[0];for(let E=1;E<Z.length;E++){let O=Z[E];if(O<L)L=O,T=E}return T},F=(Z,T)=>{if(Z<=0)return D=0,N=[],[];let L=Array(q).fill(0),E=Array(q);for(let $=0;$<q;$++)E[$]=[];let O=Array(Z);for(let $=0;$<Z;$++){let h=W(L),v=T($),G=L[h];O[$]={index:$,x:X[h],y:G,lane:h,size:v,crossSize:K},E[h].push($),L[h]=G+v+Q}N=E;let _=0;for(let $=0;$<q;$++){let h=L[$],v=h>0?h-Q:0;if(v>_)_=v}return D=_,O},M=(Z)=>{if(Z.length===0)return D>0?D:0;if(D>0)return D;let T=Array(q).fill(0);for(let E of Z){let O=E.y+E.size,_=T[E.lane];if(O>_)T[E.lane]=O}let L=0;for(let E=0;E<q;E++)if(T[E]>L)L=T[E];return L},H=(Z,T,L)=>{if(Z.length===0||L<=T)return Y.length=0,Y;if(N.length===0||N.length!==q)return V(Z,T,L);Y.length=0;for(let E=0;E<q;E++){let O=N[E],_=O.length;if(_===0)continue;let $=0,h=_;while($<h){let v=$+h>>>1,G=Z[O[v]];if(G.y+G.size<=T)$=v+1;else h=v}for(let v=$;v<_;v++){let G=Z[O[v]];if(G.y>=L)break;Y.push(G)}}return Y},V=(Z,T,L)=>{let E=[];for(let O of Z)if(O.y+O.size>T&&O.y<L)E.push(O);return E};return{get columns(){return q},get gap(){return Q},get containerSize(){return j},update:(Z)=>{let T=!1;if(Z.columns!==void 0){let L=Math.max(1,Math.floor(Z.columns));if(L!==q)q=L,T=!0}if(Z.gap!==void 0&&Z.gap!==Q)Q=Z.gap,T=!0;if(Z.containerSize!==void 0&&Z.containerSize!==j)j=Z.containerSize,T=!0;if(T)B()},calculateLayout:F,getTotalSize:M,getVisibleItems:H}};var b1=(J=200)=>{let q=[];return{acquire:()=>{let X=q.pop();if(X)return X;let B=document.createElement("div");return B.setAttribute("role","option"),B},release:(X)=>{if(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 B=b1(),N=new Map,D=new Set,Y=0,W="",F=-1,M={selected:!1,focused:!1},H=(G,p)=>{return M.selected=G,M.focused=p,M},V=`${Q}-item ${Q}-masonry-item`,A=`${Q}-item--selected`,Z=`${Q}-item--focused`,T=(G,p)=>{if(typeof p==="string")G.innerHTML=p;else G.replaceChildren(p)},L=(G,p,i)=>{G.classList.toggle(A,p),G.classList.toggle(Z,i)},E=(G,p)=>{if(j)G.style.transform=`translate(${Math.round(p.y)}px, ${Math.round(p.x)}px)`;else G.style.transform=`translate(${Math.round(p.x)}px, ${Math.round(p.y)}px)`},O=(G,p)=>{if(j)G.style.width=`${p.size}px`,G.style.height=`${p.crossSize}px`;else G.style.width=`${p.crossSize}px`,G.style.height=`${p.size}px`},_=(G,p,i,w,u)=>{let U=B.acquire(),P=H(w,u);if(U.className=V,U.dataset.index=String(G),U.dataset.id=String(p.id),U.dataset.lane=String(i.lane),U.ariaSelected=String(w),X)U.id=`${X}-item-${G}`;if(K){let y=K();if(y!==F)F=y,W=String(y);U.setAttribute("aria-setsize",W),U.setAttribute("aria-posinset",String(G+1))}O(U,i);let C=q(p,G,P);return T(U,C),L(U,w,u),E(U,i),{element:U,lastItemId:p.id,lastSelected:w,lastFocused:u,lastY:i.y,lastX:i.x,lastSeenFrame:Y}},$=(G,p,i,w)=>{Y++,D.clear();for(let U=0;U<p.length;U++)D.add(p[U].index);for(let[U,P]of N)if(D.has(U))P.lastSeenFrame=Y;else if(Y-P.lastSeenFrame>2)B.release(P.element),N.delete(U);let u=null;for(let U=0;U<p.length;U++){let P=p[U],C=P.index,y=G(C);if(!y)continue;let k=i.has(y.id),R=C===w,f=N.get(C);if(f){let r=f.lastItemId!==y.id,Q0=f.lastSelected!==k,z=f.lastFocused!==R,S=f.lastY!==P.y||f.lastX!==P.x;if(r||Q0||z){let c=H(k,R),a=q(y,C,c);T(f.element,a),L(f.element,k,R),f.element.dataset.id=String(y.id),f.element.ariaSelected=String(k),f.lastItemId=y.id,f.lastSelected=k,f.lastFocused=R}if(S)E(f.element,P),f.lastY=P.y,f.lastX=P.x}else{let r=_(C,y,P,k,R);if(!u)u=document.createDocumentFragment();u.appendChild(r.element),N.set(C,r)}}if(u)J.appendChild(u)},h=()=>{for(let{element:G}of N.values())B.release(G);N.clear(),J.innerHTML=""};return{render:$,getElement:(G)=>N.get(G)?.element,clear:h,destroy:()=>{h(),B.clear()}}};var T1=new Set,SJ=(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:B,config:N,rawConfig:D}=K,Y=N.classPrefix,W=N.horizontal;if(N.reverse)throw Error("[vlist/builder] withMasonry: cannot be combined with reverse mode");X.root.classList.add(`${Y}--masonry`);let F=()=>{return W?X.viewport.clientHeight:X.viewport.clientWidth},M={columns:J.columns,gap:J.gap??0,containerSize:F()};q=D2(M);let H=D.item,V=typeof H.height==="function"?H.height:(y)=>H.height,A=W&&D.item.width?typeof D.item.width==="function"?D.item.width:(y)=>D.item.width:V,Z=()=>{let y=K.dataManager.getTotal();j=q.calculateLayout(y,(R)=>{return A(R)});let k=q.getTotalSize(j);if(K.sizeCache.getTotalSize=()=>k,W)X.content.style.width=`${k}px`;else X.content.style.height=`${k}px`},T=D.item.template;Q=_2(X.items,T,Y,W,()=>K.dataManager.getTotal(),N.ariaIdPrefix);let L=null,E=null,O=!1,_=()=>{if(O)return;O=!0,L=K.methods.get("_getSelectedIds")??null,E=K.methods.get("_getFocusedIndex")??null},$=(y)=>K.dataManager.getItem(y),h=-1,v=-1,G=!0,p=(N.overscan??3)*100,i=()=>{if(K.state.isDestroyed)return;_();let y=K.scrollController.getScrollTop(),k=K.state.viewportState.containerSize;if(!G&&y===h&&k===v)return;h=y,v=k,G=!1;let R=Math.max(0,y-p),f=y+k+p,r=q.getVisibleItems(j,R,f),Q0=L?L():T1,z=E?E():-1;if(Q&&r.length>0)Q.render($,r,Q0,z);let S=K.state.viewportState;S.scrollPosition=y;let c=r.length,a=c>0?r[0].index:0,I=c>0?r[c-1].index:0;S.visibleRange.start=a,S.visibleRange.end=I,S.renderRange.start=a,S.renderRange.end=I;let m=K.state.lastRenderRange;if(m.start!==a||m.end!==I)m.start=a,m.end=I,B.emit("range:change",{range:{start:a,end:I}})},w=()=>{K.state.lastRenderRange.start=-1,K.state.lastRenderRange.end=-1,G=!0,i()};K.setRenderFns(i,w);let u=(y,k)=>{let R=W?k:y;if(q&&q.containerSize!==R)q.update({containerSize:R}),Z(),w()};K.resizeHandlers.push(u);let U=()=>{Z(),w()},P=K.dataManager,C=(y)=>{if(typeof P[y]!=="function")return;let k=P[y].bind(P);P[y]=(...R)=>{k(...R),U()}};C("setItems"),C("appendItems"),C("prependItems"),C("updateItem"),C("removeItem"),K.methods.set("scrollToIndex",(y,k,R)=>{let f=j[y];if(!f)return;let r=f.y,Q0=K.state.viewportState.containerSize,z=r;if(k==="center")z=r-Q0/2+f.size/2;else if(k==="end")z=r-Q0+f.size;z=Math.max(0,z),K.scrollController.scrollTo(z,R==="smooth")}),Z(),K.destroyHandlers.push(()=>{if(Q)Q.destroy();X.root.classList.remove(`${Y}--masonry`)})}}};var V2=(J)=>({selected:new Set(J??[]),focusedIndex:-1}),c0=(J,q,Q)=>{if(Q==="none")return J;let j=new Set(J.selected);if(Q==="single"){if(j.clear(),q.length>0)j.add(q[0])}else for(let K of q)j.add(K);return{...J,selected:j}},l0=(J,q)=>{let Q=new Set(J.selected);for(let j of q)Q.delete(j);return{...J,selected:Q}},f0=(J,q,Q)=>{if(Q==="none")return J;if(J.selected.has(q))return l0(J,[q]);else return c0(J,[q],Q)},G2=(J,q,Q)=>{if(Q!=="multiple")return J;return{...J,selected:new Set(q.map((j)=>j.id))}},M2=(J)=>({...J,selected:new Set}),k2=(J,q)=>{return J.focusedIndex=q,J},P2=(J,q,Q=!0)=>{if(q===0)return J;let j=J.focusedIndex-1;if(j<0)j=Q?q-1:0;return J.focusedIndex=j,J},R2=(J,q,Q=!0)=>{if(q===0)return J;let j=J.focusedIndex+1;if(j>=q)j=Q?0:q-1;return J.focusedIndex=j,J},C2=(J,q)=>{if(q===0)return J;return J.focusedIndex=0,J},v2=(J,q)=>{if(q===0)return J;return J.focusedIndex=q-1,J};var fJ=(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 IJ=(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:B,emitter:N,config:D}=X,{classPrefix:Y,ariaIdPrefix:W}=D;if(q==="none"){X.methods.set("select",()=>{}),X.methods.set("deselect",()=>{}),X.methods.set("toggleSelect",()=>{}),X.methods.set("selectAll",()=>{}),X.methods.set("clearSelection",()=>{}),X.methods.set("getSelected",()=>[]),X.methods.set("getSelectedItems",()=>[]),X.methods.set("setSelectionMode",()=>{});return}let F=new Map,M=()=>{F.clear();let Z=X.dataManager.getTotal(),T=X.dataManager.getCached();if(T===0)return;if(T>=Z){for(let E=0;E<Z;E++){let O=X.dataManager.getItem(E);if(O)F.set(O.id,E)}return}let L=X.dataManager.getStorage();if(L&&typeof L.getLoadedRanges==="function"){let E=L.getLoadedRanges();for(let O of E)for(let _=O.start;_<=O.end;_++){let $=X.dataManager.getItem(_);if($)F.set($.id,_)}}};N.on("load:end",({items:Z,offset:T})=>{if(!Z||Z.length===0)return;if(T!==void 0)for(let L=0;L<Z.length;L++){let E=Z[L];if(E&&E.id!==void 0)F.set(E.id,T+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 Z=(T)=>{let L=F.get(T);if(L===void 0)return;return X.dataManager.getItem(L)};N.emit("selection:change",{selected:r0(j),items:a0(j,Z)})};K=document.createElement("div"),K.setAttribute("aria-live","polite"),K.setAttribute("aria-atomic","true"),K.className=`${Y}-live-region`,K.style.cssText="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0",B.root.appendChild(K);let A=K;N.on("selection:change",({selected:Z})=>{let T=Z.length;if(T===0)A.textContent="";else if(T===1)A.textContent="1 item selected";else A.textContent=`${T} items selected`}),X.clickHandlers.push((Z)=>{if(X.state.isDestroyed)return;let L=Z.target.closest("[data-index]");if(!L)return;let E=parseInt(L.dataset.index??"-1",10);if(E<0)return;let O=X.dataManager.getItem(E);if(!O)return;N.emit("item:click",{item:O,index:E,event:Z}),j=k2(j,E),B.root.setAttribute("aria-activedescendant",`${W}-item-${E}`),j=f0(j,O.id,q),V()}),X.keydownHandlers.push((Z)=>{if(X.state.isDestroyed)return;let T=X.dataManager.getTotal(),L=j.focusedIndex,E=!1,O=!1,_=j;switch(Z.key){case"ArrowUp":_=P2(j,T),E=!0,O=!0;break;case"ArrowDown":_=R2(j,T),E=!0,O=!0;break;case"Home":_=C2(j,T),E=!0,O=!0;break;case"End":_=v2(j,T),E=!0,O=!0;break;case" ":case"Enter":if(j.focusedIndex>=0){let $=X.dataManager.getItem(j.focusedIndex);if($)_=f0(j,$.id,q);E=!0}break}if(E){Z.preventDefault(),j=_;let $=j.focusedIndex;if($>=0){let h=X.dataManager.getState(),v=C0($,X.sizeCache,X.state.viewportState.containerSize,h.total,"center",X.getCachedCompression());X.scrollController.scrollTo(v),B.root.setAttribute("aria-activedescendant",`${W}-item-${$}`)}else B.root.removeAttribute("aria-activedescendant");if(O){let{selected:h}=j;if(L>=0&&L!==$){let v=X.dataManager.getItem(L);if(v)X.renderer.updateItemClasses(L,h.has(v.id),!1)}if($>=0){let v=X.dataManager.getItem($);if(v)X.renderer.updateItemClasses($,h.has(v.id),!0)}}else V()}}),X.methods.set("select",(...Z)=>{j=c0(j,Z,q),V()}),X.methods.set("deselect",(...Z)=>{j=l0(j,Z),V()}),X.methods.set("toggleSelect",(Z)=>{j=f0(j,Z,q),V()}),X.methods.set("selectAll",()=>{if(q!=="multiple")return;let Z=X.getAllLoadedItems();j=G2(j,Z,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,(T)=>{let L=F.get(T);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 pJ=(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(),B=Q.getVirtualTotal(),N=Q.methods.get("getSelected"),D=N&&N().length>0?N():void 0;if(B===0){let M={index:0,offsetInItem:0,total:0};if(D)M.selectedIds=D;return M}let Y,W;if(X.isCompressed){let H=K/X.virtualSize*B;Y=Math.max(0,Math.min(Math.floor(H),B-1)),W=(H-Y)*Q.sizeCache.getSize(Y)}else Y=Q.sizeCache.indexAtOffset(K),W=K-Q.sizeCache.getOffset(Y);W=Math.max(0,W);let F={index:Y,offsetInItem:W,total:B};if(D)F.selectedIds=D;return F});let j=(K)=>{let{index:X,offsetInItem:B,selectedIds:N}=K,D=Q.getVirtualTotal();if(D===0)return;if(!Number.isFinite(X)||!Number.isFinite(B))return;if(Q.sizeCache.getTotal()!==D){Q.sizeCache.rebuild(D),Q.updateCompressionMode();let Z=Q.getCachedCompression();Q.updateContentSize(Z.virtualSize)}let W=Q.getCachedCompression(),F=Math.max(0,Math.min(X,D-1)),M;if(W.isCompressed){let Z=Q.sizeCache.getSize(F),T=Z>0?B/Z:0;M=(F+T)/D*W.virtualSize}else M=Q.sizeCache.getOffset(F)+B;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 Z=Q.methods.get("select");if(Z)Z(...N)}let A=Q.methods.get("loadVisibleRange");if(A)requestAnimationFrame(()=>{A()});else{let Z=Q.methods.get("reload");if(Z)requestAnimationFrame(()=>{Z()})}};if(Q.methods.set("restoreScroll",j),q)queueMicrotask(()=>{j(q)})}}};export{pJ as withSnapshots,IJ as withSelection,zJ as withSections,DJ as withScrollbar,GJ as withScale,OJ as withPage,SJ as withMasonry,wJ as withGrid,MJ as withAsync,e2 as vlist,f0 as toggleSelection,EJ as simpleVisibleRange,c0 as selectItems,G2 as selectAll,kJ as rangesEqual,q2 as rafThrottle,ZJ as needsScaling,Y2 as mergeRanges,fJ as isSelected,R0 as isSectionHeader,P0 as isPlaceholderItem,PJ as isInRange,a0 as getSelectedItems,r0 as getSelectedIds,F0 as getScaleState,WJ as getScaleInfo,F0 as getScale,RJ as getRangeCount,NJ as getMaxItemsWithoutScaling,H2 as filterPlaceholders,CJ as diffRanges,l0 as deselectItems,Z2 as createStickyHeader,X2 as createSparseStorage,y0 as createSizeCache,V2 as createSelectionState,m0 as createSectionedSizeFn,B2 as createSectionLayout,S0 as createScrollbar,VJ as createScrollController,K2 as createPlaceholderManager,i0 as createMeasuredSizeCache,_2 as createMasonryRenderer,D2 as createMasonryLayout,d0 as createGridRenderer,W2 as createGridLayout,t0 as createEmitter,U2 as createAsyncManager,M2 as clearSelection,$J as clampScrollPosition,TJ as calculateTotalSize,C0 as calculateScrollToIndex,e0 as calculateScaledVisibleRange,J2 as calculateScaledScrollToIndex,UJ as calculateScaledRenderRange,w0 as calculateScaledItemPosition,LJ as calculateRenderRange,g0 as calculateMissingRanges,HJ as calculateItemOffset,BJ as calculateIndexFromScrollPosition,yJ as calculateActualSize,x0 as buildLayoutItems,H0 as MAX_VIRTUAL_SIZE,KJ as MAX_VIRTUAL_HEIGHT};
@@ -6,5 +6,5 @@ export { createSizeCache, countVisibleItems, countItemsFittingFromBottom, getOff
6
6
  export { createMeasuredSizeCache, type MeasuredSizeCache, } from "./measured";
7
7
  export { createRenderer, createDOMStructure, updateContentHeight, updateContentWidth, resolveContainer, getContainerDimensions, type Renderer, type DOMStructure, type CompressionContext, type CompressedPositionFn, type CompressionStateFn, } from "./renderer";
8
8
  export { createViewportState, updateViewportState, updateViewportSize, updateViewportItems, calculateRenderRange, calculateTotalSize, calculateActualSize, calculateItemOffset, calculateScrollToIndex, clampScrollPosition, getScrollDirection, rangesEqual, isInRange, getRangeCount, rangeToIndices, diffRanges, getSimpleCompressionState, simpleVisibleRange, simpleScrollToIndex, NO_COMPRESSION, type CompressionState, type VisibleRangeFn, type ScrollToIndexFn, } from "./viewport";
9
- export { MAX_VIRTUAL_HEIGHT, getCompressionState, getCompressionState as getCompression, needsCompression, getMaxItemsWithoutCompression, getCompressionInfo, calculateCompressedVisibleRange, calculateCompressedRenderRange, calculateCompressedItemPosition, calculateCompressedScrollToIndex, calculateIndexFromScrollPosition, } from "./scale";
9
+ export { MAX_VIRTUAL_SIZE, MAX_VIRTUAL_HEIGHT, getCompressionState, getCompressionState as getCompression, needsCompression, getMaxItemsWithoutCompression, getCompressionInfo, calculateCompressedVisibleRange, calculateCompressedRenderRange, calculateCompressedItemPosition, calculateCompressedScrollToIndex, calculateIndexFromScrollPosition, } from "./scale";
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * vlist - Compression Module
3
- * Pure functions for handling large lists that exceed browser height limits
3
+ * Pure functions for handling large lists that exceed browser size limits
4
4
  *
5
- * When a list's total height (totalItems × itemHeight) exceeds the browser's
6
- * maximum element height (~16.7M pixels), we "compress" the virtual scroll space.
5
+ * When a list's total size (sum of all item sizes) exceeds the browser's
6
+ * maximum element size (~16.7M pixels), we "compress" the virtual scroll space.
7
7
  *
8
8
  * Key concepts:
9
- * - actualSize: The true height if all items were rendered
10
- * - virtualSize: The capped height used for the scroll container (≤ MAX_VIRTUAL_HEIGHT)
9
+ * - actualSize: The true size if all items were rendered
10
+ * - virtualSize: The capped size used for the scroll container (≤ MAX_VIRTUAL_SIZE)
11
11
  * - compressionRatio: virtualSize / actualSize (1 = no compression, <1 = compressed)
12
12
  *
13
13
  * When compressed:
@@ -16,16 +16,18 @@
16
16
  * - Near-bottom interpolation ensures the last items are reachable
17
17
  */
18
18
  import type { Range } from "../types";
19
- import { MAX_VIRTUAL_HEIGHT } from "../constants";
19
+ import { MAX_VIRTUAL_SIZE } from "../constants";
20
20
  import type { SizeCache } from "./sizes";
21
- export { MAX_VIRTUAL_HEIGHT };
21
+ export { MAX_VIRTUAL_SIZE };
22
+ /** @deprecated Use MAX_VIRTUAL_SIZE instead */
23
+ export declare const MAX_VIRTUAL_HEIGHT = 16000000;
22
24
  /** Compression calculation result */
23
25
  export interface CompressionState {
24
26
  /** Whether compression is active */
25
27
  isCompressed: boolean;
26
- /** The actual total height */
28
+ /** The actual total size (uncompressed) */
27
29
  actualSize: number;
28
- /** The virtual height (capped at MAX_VIRTUAL_HEIGHT) */
30
+ /** The virtual size (capped at MAX_VIRTUAL_SIZE) */
29
31
  virtualSize: number;
30
32
  /** Compression ratio (1 = no compression, <1 = compressed) */
31
33
  ratio: number;
@@ -19,7 +19,7 @@ export interface CompressionState {
19
19
  isCompressed: boolean;
20
20
  /** The actual total size (uncompressed) */
21
21
  actualSize: number;
22
- /** The virtual size (capped at MAX_VIRTUAL_HEIGHT) */
22
+ /** The virtual size (capped at MAX_VIRTUAL_SIZE) */
23
23
  virtualSize: number;
24
24
  /** Compression ratio (1 = no compression, <1 = compressed) */
25
25
  ratio: number;
package/dist/types.d.ts CHANGED
@@ -69,8 +69,8 @@ export interface MasonryConfig {
69
69
  gap?: number;
70
70
  }
71
71
  /** Item-specific configuration */
72
- /** Context provided to height function in grid mode */
73
- export interface GridHeightContext {
72
+ /** Context provided to size function in grid mode */
73
+ export interface GridSizeContext {
74
74
  /** Current container width */
75
75
  containerWidth: number;
76
76
  /** Number of columns */
@@ -80,16 +80,18 @@ export interface GridHeightContext {
80
80
  /** Calculated column width */
81
81
  columnWidth: number;
82
82
  }
83
+ /** @deprecated Use GridSizeContext instead */
84
+ export type GridHeightContext = GridSizeContext;
83
85
  export interface ItemConfig<T extends VListItem = VListItem> {
84
86
  /**
85
- * Item height in pixels (required for vertical scrolling, cross-axis size for horizontal)
87
+ * Item size in pixels along the main axis (required for vertical scrolling, cross-axis size for horizontal)
86
88
  *
87
- * - `number` — Fixed height for all items (fast path, zero overhead)
88
- * - `(index: number) => number` — Variable height per item (prefix-sum based lookups)
89
- * - `(index: number, context?: GridHeightContext) => number` — Dynamic height based on grid state
89
+ * - `number` — Fixed size for all items (fast path, zero overhead)
90
+ * - `(index: number) => number` — Variable size per item (prefix-sum based lookups)
91
+ * - `(index: number, context?: GridSizeContext) => number` — Dynamic size based on grid state
90
92
  *
91
- * In grid mode, the height function receives grid context as a second parameter,
92
- * allowing you to calculate height based on column width to maintain aspect ratios:
93
+ * In grid mode, the size function receives grid context as a second parameter,
94
+ * allowing you to calculate size based on column width to maintain aspect ratios:
93
95
  *
94
96
  * ```ts
95
97
  * height: (index, context) => {
@@ -103,7 +105,7 @@ export interface ItemConfig<T extends VListItem = VListItem> {
103
105
  * Required when `orientation` is `'vertical'` (default).
104
106
  * Optional when `orientation` is `'horizontal'` (used as cross-axis size).
105
107
  */
106
- height?: number | ((index: number, context?: GridHeightContext) => number);
108
+ height?: number | ((index: number, context?: GridSizeContext) => number);
107
109
  /**
108
110
  * Item width in pixels (required for horizontal scrolling)
109
111
  *
@@ -146,171 +148,6 @@ export interface ItemConfig<T extends VListItem = VListItem> {
146
148
  /** Template function to render each item */
147
149
  template: ItemTemplate<T>;
148
150
  }
149
- /** Main configuration for createVList */
150
- export interface VListConfig<T extends VListItem = VListItem> {
151
- /** Container element or selector */
152
- container: HTMLElement | string;
153
- /**
154
- * Layout orientation (default: 'vertical').
155
- *
156
- * - `'vertical'` — Standard top-to-bottom scrolling (default)
157
- * - `'horizontal'` — Left-to-right scrolling (carousel, timeline, etc.)
158
- *
159
- * When `'horizontal'`:
160
- * - `item.width` is required (main-axis size for virtualization)
161
- * - `item.height` is optional (cross-axis size, can be set via CSS)
162
- * - Items are positioned with `translateX` instead of `translateY`
163
- * - The viewport scrolls on the X axis
164
- *
165
- * Cannot be combined with `groups`, `grid`, or `reverse`.
166
- */
167
- orientation?: "vertical" | "horizontal";
168
- /** Item configuration (height and template) */
169
- item: ItemConfig<T>;
170
- /** Static items array (optional if using adapter) */
171
- items?: T[];
172
- /** Async data adapter for infinite scroll */
173
- adapter?: VListAdapter<T>;
174
- /** Number of extra items to render outside viewport (default: 3) */
175
- overscan?: number;
176
- /** Selection configuration */
177
- selection?: SelectionConfig;
178
- /**
179
- * External scroll element for document/window scrolling.
180
- * @deprecated Use `scroll.element` instead.
181
- */
182
- scrollElement?: Window;
183
- /** Scroll behavior configuration */
184
- scroll?: ScrollConfig;
185
- /**
186
- * Custom scrollbar configuration.
187
- * @deprecated Use `scroll.scrollbar` instead.
188
- */
189
- scrollbar?: ScrollbarConfig;
190
- /** Loading behavior configuration */
191
- loading?: LoadingConfig;
192
- /**
193
- * Scroll idle detection timeout in ms (default: 150).
194
- * @deprecated Use `scroll.idleTimeout` instead.
195
- */
196
- idleTimeout?: number;
197
- /** Custom CSS class prefix (default: 'vlist') */
198
- classPrefix?: string;
199
- /** Accessible label for the listbox (sets aria-label on the root element) */
200
- ariaLabel?: string;
201
- /**
202
- * Groups configuration for sticky headers / grouped lists.
203
- * When set, items are automatically grouped and section headers
204
- * are inserted at group boundaries.
205
- *
206
- * Items MUST be pre-sorted by group — a new header is inserted
207
- * whenever `getGroupForIndex` returns a different value.
208
- */
209
- groups?: GroupsConfig;
210
- /**
211
- * Layout mode (default: 'list').
212
- * - `'list'` — Standard vertical list (one item per row)
213
- * - `'grid'` — 2D grid layout (multiple items per row, requires `grid` config)
214
- *
215
- * In grid mode:
216
- * - Virtualization operates on ROWS, not individual items
217
- * - Each row contains `grid.columns` items side by side
218
- * - Item width is automatically calculated: (containerWidth - gaps) / columns
219
- * - Compression applies to row count, not item count
220
- */
221
- layout?: "list" | "grid";
222
- /**
223
- * Grid configuration (required when `layout: 'grid'`).
224
- *
225
- * ```ts
226
- * createVList({
227
- * container: '#gallery',
228
- * layout: 'grid',
229
- * grid: { columns: 4, gap: 8 },
230
- * item: {
231
- * height: 200,
232
- * template: (item) => `<img src="${item.thumbnail}" />`,
233
- * },
234
- * items: photos,
235
- * });
236
- * ```
237
- */
238
- grid?: GridConfig;
239
- /**
240
- * Reverse mode for chat-style UIs.
241
- * When enabled:
242
- * - The list starts scrolled to the bottom (newest items visible)
243
- * - `appendItems()` auto-scrolls to bottom if the user was already at bottom
244
- * - `prependItems()` preserves scroll position (older messages load above without jumping)
245
- * - With an adapter, "load more" triggers near the TOP (loading older content)
246
- *
247
- * Items stay in chronological order (oldest = index 0, newest = last).
248
- * Cannot be combined with `groups` or `grid` layout.
249
- *
250
- * ```ts
251
- * const chat = createVList({
252
- * container: '#messages',
253
- * reverse: true,
254
- * item: { height: 60, template: messageTemplate },
255
- * items: messages,
256
- * });
257
- *
258
- * chat.appendItems([newMessage]); // auto-scrolls to bottom
259
- * chat.prependItems(olderMessages); // scroll position preserved
260
- * ```
261
- */
262
- reverse?: boolean;
263
- }
264
- /**
265
- * Configuration options that can be updated dynamically without recreating the instance.
266
- * Used by the update() method.
267
- */
268
- export interface VListUpdateConfig {
269
- /**
270
- * Grid configuration (columns and gap).
271
- * Only applicable when layout is 'grid'.
272
- */
273
- grid?: {
274
- columns?: number;
275
- gap?: number;
276
- };
277
- /**
278
- * Item height (for variable height updates).
279
- * Can be a number or a function.
280
- */
281
- itemHeight?: number | ((index: number) => number);
282
- /**
283
- * Selection mode.
284
- * Changes selection behavior without recreating the list.
285
- */
286
- selectionMode?: SelectionMode;
287
- /**
288
- * Overscan value (number of items to render outside viewport).
289
- */
290
- overscan?: number;
291
- }
292
- /** Loading behavior configuration */
293
- export interface LoadingConfig {
294
- /**
295
- * Velocity threshold above which data loading is skipped (px/ms)
296
- * When scrolling faster than this, loading is deferred until scroll stops.
297
- * Default: 25 px/ms
298
- */
299
- cancelThreshold?: number;
300
- /**
301
- * Velocity threshold for preloading (px/ms)
302
- * When scrolling faster than this but slower than cancelThreshold,
303
- * extra items are preloaded in the scroll direction.
304
- * Default: 2 px/ms
305
- */
306
- preloadThreshold?: number;
307
- /**
308
- * Number of extra items to preload ahead of scroll direction
309
- * Only applies when velocity is between preloadThreshold and cancelThreshold.
310
- * Default: 50 items
311
- */
312
- preloadAhead?: number;
313
- }
314
151
  /** Scroll position snapshot for save/restore */
315
152
  export interface ScrollSnapshot {
316
153
  /** First visible item index */
@@ -533,76 +370,4 @@ export interface VListEvents<T extends VListItem = VListItem> extends EventMap {
533
370
  export type EventHandler<T> = (payload: T) => void;
534
371
  /** Unsubscribe function */
535
372
  export type Unsubscribe = () => void;
536
- /** VList instance API */
537
- export interface VList<T extends VListItem = VListItem> {
538
- /** The root DOM element */
539
- readonly element: HTMLElement;
540
- /** Current items */
541
- readonly items: readonly T[];
542
- /** Total item count */
543
- readonly total: number;
544
- /** Set items (replaces all) */
545
- setItems: (items: T[]) => void;
546
- /** Append items */
547
- appendItems: (items: T[]) => void;
548
- /** Prepend items */
549
- prependItems: (items: T[]) => void;
550
- /** Update a single item by ID */
551
- updateItem: (id: string | number, updates: Partial<T>) => void;
552
- /** Remove item by ID */
553
- removeItem: (id: string | number) => void;
554
- /** Reload data (clears and re-fetches if using adapter) */
555
- reload: () => Promise<void>;
556
- /** Load data for the currently visible range without resetting (used by restoreScroll) */
557
- loadVisibleRange: () => Promise<void>;
558
- /** Update configuration without recreating the instance */
559
- update: (config: Partial<VListUpdateConfig>) => void;
560
- /** Scroll to specific index */
561
- scrollToIndex: (index: number, alignOrOptions?: "start" | "center" | "end" | ScrollToOptions) => void;
562
- /** Scroll to specific item by ID */
563
- scrollToItem: (id: string | number, alignOrOptions?: "start" | "center" | "end" | ScrollToOptions) => void;
564
- /** Cancel any in-progress smooth scroll animation */
565
- cancelScroll: () => void;
566
- /** Get current scroll position */
567
- getScrollPosition: () => number;
568
- /** Get a snapshot of the current scroll position for save/restore */
569
- getScrollSnapshot: () => ScrollSnapshot;
570
- /** Restore scroll position (and optionally selection) from a snapshot */
571
- restoreScroll: (snapshot: ScrollSnapshot) => void;
572
- /** Select item(s) by ID */
573
- select: (...ids: Array<string | number>) => void;
574
- /** Deselect item(s) by ID */
575
- deselect: (...ids: Array<string | number>) => void;
576
- /** Toggle selection */
577
- toggleSelect: (id: string | number) => void;
578
- /** Select all items */
579
- selectAll: () => void;
580
- /** Clear selection */
581
- clearSelection: () => void;
582
- /** Get selected item IDs */
583
- getSelected: () => Array<string | number>;
584
- /** Get selected items */
585
- getSelectedItems: () => T[];
586
- /** Subscribe to an event */
587
- on: <K extends keyof VListEvents<T>>(event: K, handler: EventHandler<VListEvents<T>[K]>) => Unsubscribe;
588
- /** Unsubscribe from an event */
589
- off: <K extends keyof VListEvents<T>>(event: K, handler: EventHandler<VListEvents<T>[K]>) => void;
590
- /** Destroy the instance and cleanup */
591
- destroy: () => void;
592
- }
593
- /** Internal state */
594
- export interface InternalState<T extends VListItem = VListItem> {
595
- items: T[];
596
- total: number;
597
- viewport: ViewportState;
598
- selection: SelectionState;
599
- isLoading: boolean;
600
- cursor?: string;
601
- hasMore: boolean;
602
- }
603
- /** Rendered item tracking */
604
- export interface RenderedItem {
605
- index: number;
606
- element: HTMLElement;
607
- }
608
373
  //# sourceMappingURL=types.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floor/vlist",
3
- "version": "1.0.1",
3
+ "version": "1.1.2",
4
4
  "description": "Lightweight, high-performance virtual list with zero dependencies",
5
5
  "author": {
6
6
  "name": "Floor IO",
@@ -52,6 +52,7 @@
52
52
  "dev": "bun run build.ts --watch",
53
53
  "test": "bun test",
54
54
  "typecheck": "tsc --noEmit",
55
+ "size": "bun run scripts/measure-size.ts",
55
56
  "prepublishOnly": "bun run build --types"
56
57
  },
57
58
  "bugs": {