vlist 3.1.0-next.2 → 3.1.0-next.3

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.github.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  The virtual list library for every framework. Ultra efficient, batteries-included, and accessible with composable plugins.
4
4
 
5
- **v3.1.0-next.2** (prerelease on the npm `next` tag) — `scroll.mode` on the one `vlist` entry: the default, `"auto"`, scrolls natively and hands a list past the browser's size limit to synthetic input, which draws its own scrollbar; carousels honour `"synthetic"`; `vlist/synthetic` is deprecated. See the [changelog](https://github.com/floor/vlist/blob/next/CHANGELOG.md).
5
+ **v3.1.0-next.3** (prerelease on the npm `next` tag) — Vue, Svelte, Solid and React entries in the package itself: `vlist/vue`, `vlist/svelte`, `vlist/solid` and `vlist/react`, feature-first and tree-shaken like the vanilla builder; the separate adapter packages are deprecated. With `scroll.mode` from 3.1.0-next.2: the default, `"auto"`, scrolls natively and hands a list past the browser's size limit to synthetic input. See the [changelog](https://github.com/floor/vlist/blob/next/CHANGELOG.md).
6
6
 
7
7
  [![npm version](https://img.shields.io/npm/v/vlist.svg)](https://www.npmjs.com/package/vlist)
8
8
  [![bundle size](https://img.shields.io/bundlephobia/minzip/vlist)](https://bundlephobia.com/package/vlist)
@@ -10,7 +10,7 @@ The virtual list library for every framework. Ultra efficient, batteries-include
10
10
  [![license](https://img.shields.io/npm/l/vlist.svg)](https://github.com/floor/vlist/blob/main/LICENSE)
11
11
 
12
12
  - **Accessible** — `a11y()` or a selection mode adds WAI-ARIA, 2D keyboard navigation, focus recovery, screen-reader DOM ordering
13
- - **Zero dependencies** — framework-agnostic core with tiny adapters for Vue, Svelte, Solid, React
13
+ - **Zero dependencies** — framework-agnostic core, with Vue, Svelte, Solid and React entries in the same package
14
14
  - **10.3 KB gzipped** — composable plugins with perfect tree-shaking
15
15
  - **Constant memory** — ~0.1 MB overhead at any scale, from 10K to 1M+ items
16
16
  - **Tree, grid, masonry, carousel, table, groups, data, selection, search, sortable, transition** — all opt-in
@@ -24,41 +24,121 @@ The virtual list library for every framework. Ultra efficient, batteries-include
24
24
  |---|---|---|---|---|---|
25
25
  | **A11y** | WAI-ARIA + 2D keyboard, one plugin | None (DIY) | Partial | Minimal | None |
26
26
  | **Grid + Masonry + Table** | All | Grid only | Grid + Table | Grid only | None |
27
- | **Vue** | 0.6 KB adapter | Yes | — | Yes | 11.8 KB |
28
- | **Svelte** | 0.5 KB adapter | Yes | — | Yes | — |
29
- | **Solid** | 0.5 KB adapter | Yes | — | Yes | — |
27
+ | **Vue** | `vlist/vue`, 0.4 KB | Yes | — | Yes | 11.8 KB |
28
+ | **Svelte** | `vlist/svelte`, 0.3 KB | Yes | — | Yes | — |
29
+ | **Solid** | `vlist/solid`, 0.3 KB | Yes | — | Yes | — |
30
30
  | **Vanilla JS** | Native | Yes | — | — | — |
31
31
  | **Constant memory** | ~0.1 MB at 1M | No | No | No | No |
32
32
 
33
- ## Framework Adapters
33
+ ## Frameworks
34
34
 
35
- | Framework | Package | Size |
36
- |-----------|---------|------|
37
- | Vanilla JS | `vlist` | Native — no adapter needed |
38
- | Vue | [`vlist-vue`](https://github.com/floor/vlist-vue) | 0.6 KB gzip |
39
- | Svelte | [`vlist-svelte`](https://github.com/floor/vlist-svelte) | 0.5 KB gzip |
40
- | SolidJS | [`vlist-solidjs`](https://github.com/floor/vlist-solidjs) | 0.5 KB gzip |
41
- | React | [`vlist-react`](https://github.com/floor/vlist-react) | 0.6 KB gzip |
35
+ Vue, Svelte, Solid and React each have an entry in the `vlist` package itself. Like the vanilla builder, they are feature-first: you pass plugins from `vlist`, so an app only bundles the features it uses. Every entry imports the core from `vlist`, and none carries a copy of its own.
36
+
37
+ | Framework | Import | Entry size |
38
+ |-----------|--------|------------|
39
+ | Vue 3 | `vlist/vue` | 0.4 KB gzip |
40
+ | Svelte 4 and 5 | `vlist/svelte` | 0.3 KB gzip |
41
+ | SolidJS | `vlist/solid` | 0.3 KB gzip |
42
+ | Vanilla JS | `vlist` | — |
43
+ | React 17+ | `vlist/react` | 0.4 KB gzip |
42
44
 
43
45
  ```bash
44
- npm install vlist # vanilla JS
45
- npm install vlist@2 # the 2.x line, still maintained
46
- npm install vlist vlist-vue # or vlist-svelte / vlist-solidjs / vlist-react
46
+ npm install vlist
47
+ ```
48
+
49
+ Frameworks are optional peer dependencies, so install only the one you use.
50
+
51
+ **Vue**
52
+
53
+ ```vue
54
+ <script setup lang="ts">
55
+ import { useVList } from "vlist/vue";
56
+ import { grid } from "vlist";
57
+
58
+ const { containerRef, instance } = useVList(
59
+ { items, item: { height: 200, template: renderPhoto } },
60
+ [grid({ columns: 4, gap: 16 })],
61
+ );
62
+ </script>
63
+
64
+ <template><div ref="containerRef" style="height: 600px" /></template>
65
+ ```
66
+
67
+ If you pass a `ref` as the config, the list updates when its `items` change. `useVListEvent(instance, "item:click", handler)` subscribes to an event for the component's lifetime.
68
+
69
+ **Svelte**
70
+
71
+ ```svelte
72
+ <script>
73
+ import { vlist } from "vlist/svelte";
74
+ import { grid } from "vlist";
75
+ </script>
76
+
77
+ <div
78
+ style="height: 600px"
79
+ use:vlist={{
80
+ config: { items, item: { height: 200, template: renderPhoto } },
81
+ plugins: [grid({ columns: 4, gap: 16 })],
82
+ onInstance: (list) => (instance = list),
83
+ }}
84
+ />
85
+ ```
86
+
87
+ **Solid**
88
+
89
+ ```tsx
90
+ import { createVList } from "vlist/solid";
91
+ import { grid } from "vlist";
92
+
93
+ const { setRef, instance } = createVList(
94
+ () => ({ items: items(), item: { height: 200, template: renderPhoto } }),
95
+ [grid({ columns: 4, gap: 16 })],
96
+ );
97
+
98
+ return <div ref={setRef} style={{ height: "600px" }} />;
47
99
  ```
48
100
 
49
- Adapters forward `scroll` unchanged, so `scroll.mode` works through them too (adapters `3.1.0-next.2` and later):
101
+ `createVList` keeps the Solid primitive idiom. In a file that also uses the core builder, alias one of the two: `import { createVList as createSolidVList } from "vlist/solid"`.
102
+
103
+ **React**
104
+
105
+ ```tsx
106
+ import { useVList, useVListEvent } from "vlist/react";
107
+ import { grid } from "vlist";
108
+
109
+ function Photos({ items }) {
110
+ const { containerRef, instanceRef } = useVList(
111
+ { items, item: { height: 200, template: renderPhoto } },
112
+ [grid({ columns: 4, gap: 16 })],
113
+ );
114
+ useVListEvent(instanceRef, "item:click", ({ item }) => open(item));
115
+ return <div ref={containerRef} style={{ height: 600 }} />;
116
+ }
117
+ ```
118
+
119
+ Plugins are read once, at mount; changing them means remounting the list (in React, with a `key`). An `items` change updates the list in place. `scroll.mode` and other structural options also take effect only at mount.
120
+
121
+ **Migrating from `vlist-vue`, `vlist-svelte`, `vlist-solidjs` or `vlist-react`.** Those packages are deprecated. Change the import path, and pass features as plugins instead of config fields:
122
+
123
+ | Deprecated package | Use |
124
+ |---|---|
125
+ | `vlist-vue` | `vlist/vue` |
126
+ | `vlist-svelte` | `vlist/svelte` |
127
+ | `vlist-solidjs` | `vlist/solid` |
128
+ | `vlist-react` | `vlist/react` |
50
129
 
51
130
  ```ts
131
+ // before
52
132
  import { useVList } from "vlist-react";
133
+ useVList({ items, item, selection: { mode: "single" } });
53
134
 
54
- useVList({
55
- items,
56
- item: { height: 48, template: item => String(item.id) },
57
- scroll: { mode: "synthetic" }, // "auto" by default
58
- });
135
+ // after
136
+ import { useVList } from "vlist/react";
137
+ import { selection } from "vlist";
138
+ useVList({ items, item }, [selection({ mode: "single" })]);
59
139
  ```
60
140
 
61
- The mode is structural configuration: changing it requires recreating the list.
141
+ Their 3.1 releases will be built on these entries and keep the config-based API, so existing code keeps working while you migrate.
62
142
 
63
143
  ## Quick Start
64
144
 
@@ -188,7 +268,7 @@ The touch-only `.vlist-item--touch-sort` class suppresses selection and callouts
188
268
  | `vlist/synthetic` (deprecated) | 34.2 KB | 12.9 KB |
189
269
  | `vlist/native` (alias) | 27.3 KB | 10.3 KB |
190
270
  | `a11y()` | 31.2 KB | 11.7 KB |
191
- | `selection()` | 36.9 KB | 13.2 KB |
271
+ | `selection()` | 36.9 KB | 13.3 KB |
192
272
  | `data()` | 41.0 KB | 15.1 KB |
193
273
  | `scrollbar()` | 35.5 KB | 13.2 KB |
194
274
  | `sortable()` | 39.2 KB | 13.9 KB |
@@ -197,16 +277,21 @@ The touch-only `.vlist-item--touch-sort` class suppresses selection and callouts
197
277
  | `snapshots()` | 30.6 KB | 11.4 KB |
198
278
  | `transition()` | 34.1 KB | 12.3 KB |
199
279
  | `autosize()` | 30.6 KB | 11.5 KB |
200
- | `grid()` | 34.8 KB | 12.9 KB |
280
+ | `grid()` | 34.7 KB | 12.9 KB |
201
281
  | `table()` | 45.8 KB | 16.2 KB |
202
282
  | `masonry()` | 39.4 KB | 14.7 KB |
203
- | `tree()` | 43.6 KB | 15.7 KB |
283
+ | `tree()` | 43.5 KB | 15.7 KB |
204
284
  | `search()` | 36.9 KB | 13.6 KB |
205
- | `carousel()` | 43.1 KB | 15.7 KB |
206
- | `vlist/synthetic` + `carousel()` | 49.2 KB | 18.0 KB |
285
+ | `carousel()` | 43.2 KB | 15.8 KB |
286
+ | `vlist/synthetic` + `carousel()` | 49.3 KB | 18.1 KB |
207
287
  | `vlist/synthetic` + `sortable()` | 46.1 KB | 16.5 KB |
288
+ | `vlist/vue` `useVList` | 27.7 KB | 10.5 KB |
289
+ | `vlist/svelte` `vlist` | 27.5 KB | 10.4 KB |
290
+ | `vlist/solid` `createVList` | 27.6 KB | 10.4 KB |
291
+ | `vlist/react` `useVList` | 27.8 KB | 10.5 KB |
292
+ | `vlist/react` + `grid()` | 35.2 KB | 13.1 KB |
208
293
 
209
- Sizes are tree-shaken totals from `bun run size`, not additive plugin costs. Plugin rows include the native default factory plus that plugin. The base is **10,541 bytes gzipped**, within the 10.3 KB budget (10,547 bytes). `bun run size` fails if a scenario fails to build, an unused plugin leaks into a bundle, or any published size exceeds its gzip budget. Synthetic input is **13,183 bytes** before plugins; with `scroll.mode`, a `vlist` list downloads the driver and its scrollbar as `synthetic-driver.js` (6.2 KB gzipped) only when it goes synthetic. The alias row measures the same source factory; the distributed alias re-exports it without duplicating the implementation.
294
+ Sizes are tree-shaken totals from `bun run size`, not additive plugin costs. Plugin rows include the native default factory plus that plugin; framework rows add the entry, with the framework itself external. The base is **10,539 bytes gzipped**, within the 10.3 KB budget (10,547 bytes). `bun run size` fails if a scenario fails to build, an unused plugin leaks into a bundle, or any published size exceeds its gzip budget. Synthetic input is **13,192 bytes** before plugins; with `scroll.mode`, a `vlist` list downloads the driver and its scrollbar as `synthetic-driver.js` (6.2 KB gzipped) only when it goes synthetic. The alias row measures the same source factory; the distributed alias re-exports it without duplicating the implementation.
210
295
 
211
296
  ## Examples
212
297
 
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  The virtual list library for every framework. Ultra efficient, batteries-included, and accessible with composable plugins.
4
4
 
5
- **v3.1.0-next.2** (prerelease on the npm `next` tag) — `scroll.mode` on the one `vlist` entry: the default, `"auto"`, scrolls natively and hands a list past the browser's size limit to synthetic input, which draws its own scrollbar; carousels honour `"synthetic"`; `vlist/synthetic` is deprecated. See the [changelog](https://github.com/floor/vlist/blob/next/CHANGELOG.md).
5
+ **v3.1.0-next.3** (prerelease on the npm `next` tag) — Vue, Svelte, Solid and React entries in the package itself: `vlist/vue`, `vlist/svelte`, `vlist/solid` and `vlist/react`, feature-first and tree-shaken like the vanilla builder; the separate adapter packages are deprecated. With `scroll.mode` from 3.1.0-next.2: the default, `"auto"`, scrolls natively and hands a list past the browser's size limit to synthetic input. See the [changelog](https://github.com/floor/vlist/blob/next/CHANGELOG.md).
6
6
 
7
7
  [![npm version](https://img.shields.io/npm/v/vlist.svg)](https://www.npmjs.com/package/vlist)
8
8
  [![bundle size](https://img.shields.io/bundlephobia/minzip/vlist)](https://bundlephobia.com/package/vlist)
@@ -10,7 +10,7 @@ The virtual list library for every framework. Ultra efficient, batteries-include
10
10
  [![license](https://img.shields.io/npm/l/vlist.svg)](https://github.com/floor/vlist/blob/main/LICENSE)
11
11
 
12
12
  - **Accessible** — `a11y()` or a selection mode adds WAI-ARIA, 2D keyboard navigation, focus recovery, screen-reader DOM ordering
13
- - **Zero dependencies** — framework-agnostic core, tiny adapters for Vue, Svelte, Solid, React
13
+ - **Zero dependencies** — framework-agnostic core, with Vue, Svelte, Solid and React entries in the same package
14
14
  - **10.3 KB gzipped** — composable plugins with perfect tree-shaking
15
15
  - **Constant memory** — ~0.1 MB overhead at any scale, from 10K to 1M+ items
16
16
  - **Axis-neutral** — vertical and horizontal scrolling through a single code path, all plugins work in both orientations
@@ -135,7 +135,7 @@ The touch-only `.vlist-item--touch-sort` class suppresses selection and callouts
135
135
  | `vlist/synthetic` (deprecated) | 34.2 KB | 12.9 KB |
136
136
  | `vlist/native` (alias) | 27.3 KB | 10.3 KB |
137
137
  | `a11y()` | 31.2 KB | 11.7 KB |
138
- | `selection()` | 36.9 KB | 13.2 KB |
138
+ | `selection()` | 36.9 KB | 13.3 KB |
139
139
  | `data()` | 41.0 KB | 15.1 KB |
140
140
  | `scrollbar()` | 35.5 KB | 13.2 KB |
141
141
  | `sortable()` | 39.2 KB | 13.9 KB |
@@ -144,39 +144,131 @@ The touch-only `.vlist-item--touch-sort` class suppresses selection and callouts
144
144
  | `snapshots()` | 30.6 KB | 11.4 KB |
145
145
  | `transition()` | 34.1 KB | 12.3 KB |
146
146
  | `autosize()` | 30.6 KB | 11.5 KB |
147
- | `grid()` | 34.8 KB | 12.9 KB |
147
+ | `grid()` | 34.7 KB | 12.9 KB |
148
148
  | `table()` | 45.8 KB | 16.2 KB |
149
149
  | `masonry()` | 39.4 KB | 14.7 KB |
150
- | `tree()` | 43.6 KB | 15.7 KB |
150
+ | `tree()` | 43.5 KB | 15.7 KB |
151
151
  | `search()` | 36.9 KB | 13.6 KB |
152
- | `carousel()` | 43.1 KB | 15.7 KB |
153
- | `vlist/synthetic` + `carousel()` | 49.2 KB | 18.0 KB |
152
+ | `carousel()` | 43.2 KB | 15.8 KB |
153
+ | `vlist/synthetic` + `carousel()` | 49.3 KB | 18.1 KB |
154
154
  | `vlist/synthetic` + `sortable()` | 46.1 KB | 16.5 KB |
155
+ | `vlist/vue` `useVList` | 27.7 KB | 10.5 KB |
156
+ | `vlist/svelte` `vlist` | 27.5 KB | 10.4 KB |
157
+ | `vlist/solid` `createVList` | 27.6 KB | 10.4 KB |
158
+ | `vlist/react` `useVList` | 27.8 KB | 10.5 KB |
159
+ | `vlist/react` + `grid()` | 35.2 KB | 13.1 KB |
155
160
 
156
- Sizes are tree-shaken totals from `bun run size`, not additive plugin costs. Plugin rows include the native default factory plus that plugin. The base is **10,541 bytes gzipped**, within the 10.3 KB budget (10,547 bytes). `bun run size` fails if a scenario fails to build, an unused plugin leaks into a bundle, or any published size exceeds its gzip budget. Synthetic input is **13,183 bytes** before plugins; with `scroll.mode`, a `vlist` list downloads the driver and its scrollbar as `synthetic-driver.js` (6.2 KB gzipped) only when it goes synthetic. The alias row measures the same source factory; the distributed alias re-exports it without duplicating the implementation.
161
+ Sizes are tree-shaken totals from `bun run size`, not additive plugin costs. Plugin rows include the native default factory plus that plugin; framework rows add the entry, with the framework itself external. The base is **10,539 bytes gzipped**, within the 10.3 KB budget (10,547 bytes). `bun run size` fails if a scenario fails to build, an unused plugin leaks into a bundle, or any published size exceeds its gzip budget. Synthetic input is **13,192 bytes** before plugins; with `scroll.mode`, a `vlist` list downloads the driver and its scrollbar as `synthetic-driver.js` (6.2 KB gzipped) only when it goes synthetic. The alias row measures the same source factory; the distributed alias re-exports it without duplicating the implementation.
157
162
 
158
- ## Framework Adapters
163
+ ## Frameworks
159
164
 
160
- | Framework | Package | Size |
161
- |-----------|---------|------|
162
- | Vue | [`vlist-vue`](https://github.com/floor/vlist-vue) | 0.6 KB |
163
- | Svelte | [`vlist-svelte`](https://github.com/floor/vlist-svelte) | 0.5 KB |
164
- | SolidJS | [`vlist-solidjs`](https://github.com/floor/vlist-solidjs) | 0.5 KB |
165
- | React | [`vlist-react`](https://github.com/floor/vlist-react) | 0.6 KB |
165
+ Vue, Svelte, Solid and React each have an entry in the `vlist` package itself. Like the vanilla builder, they are feature-first: you pass plugins from `vlist`, so an app only bundles the features it uses. Every entry imports the core from `vlist`, and none carries a copy of its own.
166
166
 
167
- Adapters forward `scroll` unchanged, so `scroll.mode` works through them too (adapters `3.1.0-next.2` and later):
167
+ | Framework | Import | Entry size |
168
+ |-----------|--------|------------|
169
+ | Vue 3 | `vlist/vue` | 0.4 KB gzip |
170
+ | Svelte 4 and 5 | `vlist/svelte` | 0.3 KB gzip |
171
+ | SolidJS | `vlist/solid` | 0.3 KB gzip |
172
+ | Vanilla JS | `vlist` | — |
173
+ | React 17+ | `vlist/react` | 0.4 KB gzip |
174
+
175
+ ```bash
176
+ npm install vlist
177
+ ```
178
+
179
+ Frameworks are optional peer dependencies, so install only the one you use.
180
+
181
+ **Vue**
182
+
183
+ ```vue
184
+ <script setup lang="ts">
185
+ import { useVList } from "vlist/vue";
186
+ import { grid } from "vlist";
187
+
188
+ const { containerRef, instance } = useVList(
189
+ { items, item: { height: 200, template: renderPhoto } },
190
+ [grid({ columns: 4, gap: 16 })],
191
+ );
192
+ </script>
193
+
194
+ <template><div ref="containerRef" style="height: 600px" /></template>
195
+ ```
196
+
197
+ If you pass a `ref` as the config, the list updates when its `items` change. `useVListEvent(instance, "item:click", handler)` subscribes to an event for the component's lifetime.
198
+
199
+ **Svelte**
200
+
201
+ ```svelte
202
+ <script>
203
+ import { vlist } from "vlist/svelte";
204
+ import { grid } from "vlist";
205
+ </script>
206
+
207
+ <div
208
+ style="height: 600px"
209
+ use:vlist={{
210
+ config: { items, item: { height: 200, template: renderPhoto } },
211
+ plugins: [grid({ columns: 4, gap: 16 })],
212
+ onInstance: (list) => (instance = list),
213
+ }}
214
+ />
215
+ ```
216
+
217
+ **Solid**
218
+
219
+ ```tsx
220
+ import { createVList } from "vlist/solid";
221
+ import { grid } from "vlist";
222
+
223
+ const { setRef, instance } = createVList(
224
+ () => ({ items: items(), item: { height: 200, template: renderPhoto } }),
225
+ [grid({ columns: 4, gap: 16 })],
226
+ );
227
+
228
+ return <div ref={setRef} style={{ height: "600px" }} />;
229
+ ```
230
+
231
+ `createVList` keeps the Solid primitive idiom. In a file that also uses the core builder, alias one of the two: `import { createVList as createSolidVList } from "vlist/solid"`.
232
+
233
+ **React**
234
+
235
+ ```tsx
236
+ import { useVList, useVListEvent } from "vlist/react";
237
+ import { grid } from "vlist";
238
+
239
+ function Photos({ items }) {
240
+ const { containerRef, instanceRef } = useVList(
241
+ { items, item: { height: 200, template: renderPhoto } },
242
+ [grid({ columns: 4, gap: 16 })],
243
+ );
244
+ useVListEvent(instanceRef, "item:click", ({ item }) => open(item));
245
+ return <div ref={containerRef} style={{ height: 600 }} />;
246
+ }
247
+ ```
248
+
249
+ Plugins are read once, at mount; changing them means remounting the list (in React, with a `key`). An `items` change updates the list in place. `scroll.mode` and other structural options also take effect only at mount.
250
+
251
+ **Migrating from `vlist-vue`, `vlist-svelte`, `vlist-solidjs` or `vlist-react`.** Those packages are deprecated. Change the import path, and pass features as plugins instead of config fields:
252
+
253
+ | Deprecated package | Use |
254
+ |---|---|
255
+ | `vlist-vue` | `vlist/vue` |
256
+ | `vlist-svelte` | `vlist/svelte` |
257
+ | `vlist-solidjs` | `vlist/solid` |
258
+ | `vlist-react` | `vlist/react` |
168
259
 
169
260
  ```ts
261
+ // before
170
262
  import { useVList } from "vlist-react";
263
+ useVList({ items, item, selection: { mode: "single" } });
171
264
 
172
- useVList({
173
- items,
174
- item: { height: 48, template: item => String(item.id) },
175
- scroll: { mode: "synthetic" }, // "auto" by default
176
- });
265
+ // after
266
+ import { useVList } from "vlist/react";
267
+ import { selection } from "vlist";
268
+ useVList({ items, item }, [selection({ mode: "single" })]);
177
269
  ```
178
270
 
179
- The mode is structural configuration: changing it requires recreating the list.
271
+ Their 3.1 releases will be built on these entries and keep the config-based API, so existing code keeps working while you migrate.
180
272
 
181
273
  ## Docs & Examples
182
274
 
package/dist/config.d.ts CHANGED
@@ -16,7 +16,7 @@
16
16
  * config (the adapters) pull in this module and, with it, every plugin it wires.
17
17
  */
18
18
  import type { VListItem, GroupsConfig, VListAdapter, ScrollConfig } from "./types";
19
- import { createVList } from "./core/create";
19
+ import { createVList } from "./index";
20
20
  import type { CreateVListConfig, VList, VListPlugin, PluginMethods } from "./core/types";
21
21
  import type { AutosizeMethods } from "./plugins/autosize/plugin";
22
22
  import type { DataMethods } from "./plugins/data/plugin";
package/dist/config.js CHANGED
@@ -1 +1 @@
1
- var zt=16777216,gt=3,Jt="vlist";var pt=50;var Qt=50,en=2,tn=15,nn=6,At=2000,on=30000,at=16000000,bt=150,wt=1,rn=(e)=>e<0.5?2*e*e:1-(-2*e+2)**2/2,ht=300;var sn="x",ln=20,kt="_isPlaceholder",Ke="__placeholder_";function vt(e){let{state:n,viewport:o,isX:i,onFrame:r,onIdle:t}=e,s=e.idleTimeout||bt,a=null,A=null;function y(g=i?o.scrollLeft:o.scrollTop){n.prevScrollPosition=n.scrollPosition,n.scrollPosition=g,n.scrollDirection=g>n.prevScrollPosition?1:g<n.prevScrollPosition?-1:0,r(),l()}function l(){if(a!==null)clearTimeout(a);a=setTimeout(()=>{a=null,n.scrollDirection=0,t()},s)}function M(){if(A!==null)cancelAnimationFrame(A),A=null}function W(g,V,S,I=rn,d){M();let T=n.scrollPosition,p=typeof g==="function"?g:()=>g,_=p();if(Math.abs(_-T)<1){if(S)S(_);else if(i)o.scrollLeft=_;else o.scrollTop=_;d?.();return}let te=performance.now();function m(x){_=p();let L=x-te,F=Math.min(L/V,1),u=T+(_-T)*I(F);if(S)S(u);else{if(i)o.scrollLeft=u;else o.scrollTop=u;let E=i?o.scrollLeft:o.scrollTop;y(Math.abs(E-u)>1?E:u)}if(F<1)A=requestAnimationFrame(m);else A=null,d?.()}A=requestAnimationFrame(m)}return{attach(){},detach(){if(M(),a!==null)clearTimeout(a),a=null},cancelScroll:M,smoothScrollTo:W,commitScroll:y}}function an(e){let{state:n,viewport:o,isX:i,wheelEnabled:r}=e,t=e.scrollTarget??o,s=vt(e),a=s.commitScroll;function A(){let l=i?o.scrollLeft:o.scrollTop;if(Math.abs(l-n.scrollPosition)<0.5)return;a(l)}function y(l){let M;if(i){if(Math.abs(l.deltaX)>Math.abs(l.deltaY))return;let W=o.scrollLeft,g=o.scrollWidth-o.clientWidth;if(M=Math.max(0,Math.min(W+l.deltaY*wt,g)),Math.abs(M-W)<1)return;l.preventDefault(),o.scrollLeft=M}else{let W=o.scrollWidth>o.clientWidth;if(W&&Math.abs(l.deltaX)>Math.abs(l.deltaY))return;if(W&&l.deltaX!==0)l.preventDefault(),o.scrollLeft+=l.deltaX;let g=o.scrollTop,V=o.scrollHeight-o.clientHeight;if(M=Math.max(0,Math.min(g+l.deltaY*wt,V)),Math.abs(M-g)<1)return;l.preventDefault(),o.scrollTop=M}a(M)}return{...s,attach(){if(t.addEventListener("scroll",A,{passive:!0}),r)t.addEventListener("wheel",y,{passive:!1})},detach(){if(t.removeEventListener("scroll",A),r)t.removeEventListener("wheel",y);s.detach()}}}var yt={top:0,right:0,bottom:0,left:0},dn=(e)=>{if(e==null)return yt;if(typeof e==="number")return e===0?yt:{top:e,right:e,bottom:e,left:e};if(e.length===2){let[t,s]=e;return t===0&&s===0?yt:{top:t,right:s,bottom:t,left:s}}let[n,o,i,r]=e;return n===0&&o===0&&i===0&&r===0?yt:{top:n,right:o,bottom:i,left:r}},un=(e,n)=>n?e.left+e.right:e.top+e.bottom,cn=(e,n)=>n?e.top+e.bottom:e.left+e.right;function mn(e){let n={visibleIndices:new Int32Array(e),visibleOffsets:new Float64Array(e),visibleSizes:new Float64Array(e),visibleCount:0,startIndex:0,totalSize:0,capacity:e,scrollPosition:0,prevScrollPosition:0,scrollDirection:0,baseOffset:0,prevBaseOffset:0,containerSize:0,crossSize:0,totalItems:0,prevRangeStart:0,prevRangeEnd:-1,renderPending:!1,initialized:!1,destroyed:!1,windowClamped:!1,windowClampReported:!1,prevAriaTotal:-1,ensureCapacity(o){if(o<=n.capacity)return;let i=o+8,r=new Int32Array(i),t=new Float64Array(i),s=new Float64Array(i);r.set(n.visibleIndices),t.set(n.visibleOffsets),s.set(n.visibleSizes),n.visibleIndices=r,n.visibleOffsets=t,n.visibleSizes=s,n.capacity=i},resizeCapacity(o,i,r=gt){if(i<=0||o<=0)return;n.ensureCapacity(Math.ceil(o/i)+r*2)},clear(){n.visibleCount=0,n.startIndex=0}};return n}var Kn=(e,n,o)=>{let i=n;return{getOffset:(r)=>r*e,getSize:(r)=>e,indexAtOffset:(r)=>{if(i===0||e===0)return 0;return Math.max(0,Math.min(Math.floor(r/e),i-1))},getTotalSize:()=>{let r=i*e;return r>0?r-o:0},getTotal:()=>i,rebuild:(r)=>{i=r},invalidate:()=>{},isVariable:()=>!1}};var fn=(e,n,o,i)=>{while(n<o){let r=n+o+1>>>1;if(e[r]<=i)n=r;else o=r-1}return n},Yn=(e,n,o)=>{let i=0,r=0,t=new Float64Array(0),s=new Float64Array(0),a=new Float64Array(1),A=(l,M)=>{for(let W=l;W<r;W++){if(W<=M){let g=W<<9,V=Math.min(g+512,i),S=0;for(let I=g;I<V;I++)t[I]=S,S+=e(I);s[W]=S}a[W+1]=a[W]+s[W]}},y=(l)=>{i=l,r=Math.ceil(l/512),t=new Float64Array(l),s=new Float64Array(r),a=new Float64Array(r+1),A(0,r-1)};return y(n),{getOffset:(l)=>{if(l<=0)return 0;if(l>=i)return a[r];return a[l>>>9]+t[l]},getSize:(l)=>e(l),indexAtOffset:(l)=>{if(i===0||l<=0)return 0;if(l>=a[r])return i-1;let M=fn(a,0,r-1,l),W=M<<9;return fn(t,W,Math.min(W+512,i)-1,l-a[M])},getTotalSize:()=>{let l=a[r];return l>0?l-o:0},getTotal:()=>i,rebuild:(l)=>y(l),invalidate:(l,M=l)=>{if(l>=0&&M<i)A(l>>>9,M>>>9)},isVariable:()=>!0}},St=(e,n,o=0)=>{if(typeof e==="number")return Kn(e,n,o);return Yn(e,n,o)};function gn(e){let n=[],o=`${e}-item`,i=document.createElement("div");return i.className=o,{acquire(){if(n.length>0)return n.pop();return i.cloneNode(!1)},release(r){r.className=o,r.removeAttribute("style"),r.removeAttribute("id"),r.removeAttribute("role"),r.removeAttribute("aria-selected"),r.removeAttribute("aria-posinset"),r.removeAttribute("aria-setsize"),r.removeAttribute("data-index"),r.removeAttribute("data-id"),r.textContent="",n.push(r)},get size(){return n.length},trim(r){let t=r>0?r:0;if(n.length>t)n.length=t},clear(){n.length=0}}}function Xe(e){let n=e.querySelectorAll("a[href],button,input,select,textarea,[tabindex]");for(let o=0;o<n.length;o++)n[o].setAttribute("tabindex","-1");e._stamp=0}function Rt(e){if(typeof e==="string"){let n=document.querySelector(e);if(!n)throw Error(`[vlist] Container not found: ${e}`);return n}return e}function pn(e,n,o,i){let r=o?`${n} ${n}--horizontal`:n,t=o?"overflow-x:auto;overflow-y:hidden;height:100%;width:100%":"overflow:auto;height:100%;width:100%",s=o?"position:relative;height:100%;overflow-anchor:none":"position:relative;width:100%;overflow-anchor:none",a=' role="list"';if(i)a+=` aria-label="${i.replace(/"/g,"&quot;")}"`;if(o)a+=' aria-orientation="horizontal"';e.insertAdjacentHTML("beforeend",`<div class="${r}"><div class="${n}-viewport" style="${t}" tabindex="-1"><div class="${n}-content" style="${s}"${a}></div></div></div>`);let A=e.lastElementChild,y=A.firstElementChild,l=y.firstElementChild,M=document.createElement("div");return M.className=`${n}-live`,M.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",M.setAttribute("aria-live","polite"),M.setAttribute("aria-atomic","true"),M.setAttribute("role","status"),A.appendChild(M),{root:A,viewport:y,content:l,liveRegion:M}}function qn(e,n){if(e.getTotal()<=0)return{index:0,offsetPx:0};let i=n<=0?0:n,r=e.indexAtOffset(i),t=i-e.getOffset(r);return{index:r,offsetPx:t>0?t:0}}function Un(e,n){let o=Xn(e,n);return e.getOffset(o.index)+o.offsetPx}function Xn(e,n){let o=e.getTotal();if(o<=0)return{index:0,offsetPx:0};let{index:i,offsetPx:r}=n;if(i<0)return{index:0,offsetPx:0};if(i>o-1)i=o-1;while(r>0&&i<o-1){let t=e.getSize(i);if(r<t)break;r-=t,i++}while(r<0&&i>0)i--,r+=e.getSize(i);if(r<0)r=0;return{index:i,offsetPx:r}}function bn(e){let{sizeCache:n,getPixel:o,setPixel:i,getContainerSize:r}=e;function t(){let a=n.getTotalSize()+e.padding-r();return a>0?a:0}function s(a){if(a<=0)return 0;let A=t();return a>A?A:a}return{getLogical(){return qn(n,o())},setLogical(a){i(s(Un(n,a)))},getPixelEquivalent(){return o()},setPixelEquivalent(a){i(s(a))},getMaxPixelEquivalent:t,getRenderOrigin:e.getRenderOrigin,scrollByPx(a){i(s(o()+a))}}}var dt=[],Zn={calculate:dt,commit:dt,afterScroll:dt,idle:dt,resize:dt};function hn(e){if(e.length===0)return Zn;let n=[],o=[],i=[],r=[],t=[];for(let s=0;s<e.length;s++){let a=e[s].hooks;if(a===void 0)continue;if(a.onCalculate!==void 0)n.push(a.onCalculate);if(a.onCommit!==void 0)o.push(a.onCommit);if(a.onAfterScroll!==void 0)i.push(a.onAfterScroll);if(a.onIdle!==void 0)r.push(a.onIdle);if(a.onResize!==void 0)t.push(a.onResize)}return{calculate:n,commit:o,afterScroll:i,idle:r,resize:t}}function vn(e,n){for(let o=0;o<e.length;o++)e[o](n)}function ut(e,n){for(let o=0;o<e.length;o++)e[o](n)}function _t(e,n,o){for(let i=0;i<e.length;i++)e[i](n,o)}function yn(e){for(let n=0;n<e.length;n++)e[n]()}function Sn(e,n,o){for(let i=0;i<e.length;i++)e[i](n,o)}function In(e,n,o,i,r,t,s,a){let A=i!==0||r!==0;return{prefix:e,selectedClass:`${e}-item--selected`,focusedClass:`${e}-item--focused`,placeholderClass:`${e}-item--placeholder`,replacedClass:`${e}-item--replaced`,translateProp:n?"translateX(":"translateY(",sizeProp:n?"width":"height",itemRole:"listitem",interactive:!1,startPadding:o,gap:s,hasCrossPad:A,crossStartProp:A?n?"top":"left":"",crossEndProp:A?n?"bottom":"right":"",crossStartVal:A?i+"px":"",crossEndVal:A?r+"px":"",oddClass:t,emitter:a??null,indexMap:null,ariaTotalFn:null}}function jn(e,n,o,i,r){if(e.containerSize<=0||e.totalItems===0)return e.clear(),!0;let{scrollPosition:t,containerSize:s,totalItems:a}=e,A=r??0;e.totalSize=n.getTotalSize();let y=n.indexAtOffset(A>0?Math.max(0,t-A):t),l=n.indexAtOffset(t+s);if(l<a-1)l++;y=Math.max(0,y),l=Math.min(a-1,Math.max(0,l));let M=Math.max(0,y-o),W=Math.min(a-1,l+o),g=Math.ceil(s)+o*2;if(W-M+1>g)W=M+g-1,e.windowClamped=!0;let V=W-M+1;if(V>e.capacity)e.ensureCapacity(V);let S=Math.min(V,e.capacity);if(M===e.prevRangeStart&&W===e.prevRangeEnd&&!e.renderPending&&e.baseOffset===e.prevBaseOffset)return!1;e.visibleCount=S,e.startIndex=M;for(let I=0;I<S;I++){let d=M+I;e.visibleIndices[I]=d,e.visibleOffsets[I]=n.getOffset(d),e.visibleSizes[I]=n.getSize(d)}return vn(i.calculate,e),e.prevRangeStart=M,e.prevRangeEnd=W,e.prevBaseOffset=e.baseOffset,e.renderPending=!1,!0}var $e={selected:!1,focused:!1};function Jn(e,n,o){for(let i=0;i<n;i++)if(e[i]===o)return!0;return!1}function Qn(e,n){if(n<=1)return!0;let o=e[0];for(let i=1;i<n;i++){let r=e[i];if(r!==o+1)return!1;o=r}return!0}function eo(e,n,o,i,r,t,s,a,A,y){let l=A?null:r(),{visibleCount:M,visibleIndices:W}=e,g=s.ariaTotalFn?s.ariaTotalFn():e.totalItems,V=s.interactive?String(g):"",S=s.interactive&&g!==e.prevAriaTotal,I=null,d=s.indexMap;for(let T=0;T<M;T++){let p=W[T],_=d?d(p):p,te=e.visibleOffsets[T],m=e.visibleSizes[T],x=A?A(p):l[p];if(y)y(_,$e);else $e.selected=!1,$e.focused=!1;let L=t.get(p),F=L;if(L===void 0){let u=n.acquire();if(x!==void 0){let R;try{R=i(x,_,$e)}catch(ie){if(s.emitter)s.emitter.emit("error",{error:ie instanceof Error?ie:Error(String(ie)),context:`template:render:${_}`});n.release(u);continue}if(typeof R==="string")u.innerHTML=R;else u.textContent="",u.appendChild(R);Xe(u)}if(u.setAttribute("role",s.itemRole),u.setAttribute("data-index",String(_)),s.interactive)u.id=s.prefix+"-item-"+p,u.setAttribute("aria-posinset",String(_+1)),u.setAttribute("aria-setsize",V);if(x!==void 0){let R=String(x.id);if(u.setAttribute("data-id",R),R.startsWith(Ke))u.classList.add(s.placeholderClass)}if(s.hasCrossPad)u.style.setProperty(s.crossStartProp,s.crossStartVal),u.style.setProperty(s.crossEndProp,s.crossEndVal);if(y){if(u.classList.toggle(s.selectedClass,$e.selected),u.classList.toggle(s.focusedClass,$e.focused),$e.selected)u.setAttribute("aria-selected","true");else u.removeAttribute("aria-selected");u._lastSelected=$e.selected,u._lastFocused=$e.focused}if(s.oddClass)u.classList.toggle(s.oddClass,(p&1)===1);let E=te-e.baseOffset+s.startPadding;u.style.transform=s.translateProp+E+"px)",u._lastOffset=E;let H=m-s.gap;if(u.style[s.sizeProp]=H+"px",u._lastSize=H,u._lastItem=x,t.set(p,u),I===null)I=document.createDocumentFragment();I.appendChild(u)}else{if(S)L.setAttribute("aria-setsize",V);if(x!==void 0&&F._lastItem!==x){let H=L.getAttribute("data-id"),R=String(x.id),ie;try{ie=i(x,_,$e)}catch(ce){if(s.emitter)s.emitter.emit("error",{error:ce instanceof Error?ce:Error(String(ce)),context:`template:render:${_}`});continue}if(typeof ie==="string")L.innerHTML=ie;else L.textContent="",L.appendChild(ie);if(Xe(L),L.setAttribute("data-id",R),F._lastItem=x,H!==R){let ce=H!==null&&H.startsWith(Ke),de=R.startsWith(Ke);if(ce!==de)L.classList.toggle(s.placeholderClass,de);if(ce&&!de)L.classList.add(s.replacedClass),setTimeout(()=>{L.classList.remove(s.replacedClass)},300)}}if(y){if(F._lastSelected!==$e.selected){if(L.classList.toggle(s.selectedClass,$e.selected),$e.selected)L.setAttribute("aria-selected","true");else L.removeAttribute("aria-selected");F._lastSelected=$e.selected}if(F._lastFocused!==$e.focused)L.classList.toggle(s.focusedClass,$e.focused),F._lastFocused=$e.focused}let u=te-e.baseOffset+s.startPadding;if(F._lastOffset!==u)L.style.transform=s.translateProp+u+"px)",F._lastOffset=u;let E=m-s.gap;if(F._lastSize!==E)L.style[s.sizeProp]=E+"px",F._lastSize=E}}if(I!==null)o.appendChild(I);if(M>0&&Qn(W,M)){let T=W[0],p=W[M-1];for(let[_,te]of t)if(_<T||_>p)te.remove(),n.release(te),t.delete(_)}else for(let[T,p]of t)if(!Jn(W,M,T))p.remove(),n.release(p),t.delete(T);if(s.interactive)e.prevAriaTotal=e.totalItems;ut(a.commit,e)}function Ht(e,n,o,i,r,t,s,a,A,y,l,M){let W=jn(e,n,o,y,A.startPadding);if(e.windowClamped&&!e.windowClampReported)e.windowClampReported=!0,queueMicrotask(()=>{if(e.destroyed)return;A.emitter?.emit("error",{error:Error("[vlist] render window capped to the viewport: the item size spec reports sizes below 1px"),context:"render:window-ceiling"})});if(W)eo(e,i,r,t,s,a,A,y,l,M)}var Vt=()=>{let e={},n=(t,s)=>{if(!e[t])e[t]=new Set;return e[t].add(s),()=>o(t,s)},o=(t,s)=>{e[t]?.delete(s)};return{on:n,off:o,emit:(t,s)=>{e[t]?.forEach((a)=>{try{a(s)}catch(A){}})},clear:(t)=>{if(t)delete e[t];else for(let s in e)delete e[s]}}};var Tn=2,xn=(e=0)=>({velocity:0,sampleCount:0}),Ln=(e,n)=>{let o=performance.now(),i=e._lt??o,r=e._lp??n,t=o-i;if(e._lp=n,e._lt=o,t===0)return e.sampleCount=Math.min(e.sampleCount+1,5),e;if(t>100)return e.velocity=0,e.sampleCount=1,e;return e.velocity=Math.abs(n-r)/t,e.sampleCount=Math.min(e.sampleCount+1,5),e};function ot(e,n,o=!1){if(n===void 0)return;if(typeof n!=="number"||!Number.isFinite(n)||n<0||n===0&&!o)throw Error(`vlist: ${e} must be a ${o?"non-negative":"positive"} number, got ${n}`)}function to(e){let{item:n}=e;if(typeof n.height==="number")ot("item.height",n.height);if(typeof n.width==="number")ot("item.width",n.width);ot("item.estimatedHeight",n.estimatedHeight),ot("item.estimatedWidth",n.estimatedWidth),ot("item.gap",n.gap,!0),ot("overscan",e.overscan,!0);let o=e.scroll;if(o?.runway!==void 0||!/^(auto|native|synthetic)?$/.test(o?.mode??""))throw Error('vlist: scroll.mode is "auto", "native" or "synthetic" (bounded mode and scroll.runway were removed in 3.0)')}function no(e,n){let o=e==="horizontal"?"x":"y";if(n.some((r)=>r.name==="grid"))return{primary:o,cross:o==="x"?"y":"x"};return{primary:o}}function oo(e,n,o){let i=no(e.orientation,n),r=i.primary==="x",t=dn(e.padding);return{axis:i,hasCrossAxis:i.cross!==void 0,overscan:e.overscan??gt,reverse:e.reverse??!1,classPrefix:e.classPrefix??Jt,mainAxisPadding:un(t,r),crossAxisPadding:cn(t,r),startPadding:r?t.left:t.top,endPadding:r?t.right:t.bottom,crossPadStart:r?t.top:t.left,crossPadEnd:r?t.bottom:t.right,striped:e.item.striped||!1,gap:e.item.gap??0,scrollMode:o}}function ro(e,n){if(n)return e.item.width??e.item.estimatedWidth??100;return e.item.height??e.item.estimatedHeight??40}function io(e){let n=[...e];return n.sort((o,i)=>(o.priority??50)-(i.priority??50)),n}function so(e){let n=new Set;for(let o of e){if(n.has(o.name))throw Error(`[vlist] Duplicate plugin: ${o.name}`);n.add(o.name)}for(let o of e)if(o.conflicts){for(let i of o.conflicts)if(n.has(i))throw Error(`[vlist] Plugin "${o.name}" conflicts with "${i}"`)}}function lo(e,n){for(let o of e)o.validateConfig?.(n)}var It=null;function Cn(e,n=[]){let o=!1;return ao(e,n,void 0,{native:an,load:()=>import("./synthetic-driver.js"),onContentSize(i,r){if(!o&&i>at)o=!0,r.emit("error",{error:Error(`Content size (${i}px) exceeds browser limit (${at}px). Use scroll.mode "auto".`),context:"content:size:overflow"})}})}function ao(e,n=[],o,i){to(e);let r=o?"synthetic":e.scroll?.mode??"auto";if(r==="synthetic"&&e.scroll?.scrollbar==="native")throw Error('vlist: scroll.scrollbar "native" needs native scrolling');if(e.orientation==="horizontal"&&getComputedStyle(Rt(e.container)).direction==="rtl")throw Error("vlist: horizontal RTL lists are not supported; use a vertical list, or an LTR container");let t=oo(e,n,r),s=t.axis.primary==="x",a=ro(e,s),A=t.gap,y=A>0?typeof a==="function"?(oe)=>a(oe)+A:a+A:a,l=typeof a==="number"?a:20,M=e.items?.length??0,W=t.striped?`${t.classPrefix}-item--odd`:"",g=Vt(),V=In(t.classPrefix,s,t.startPadding,t.crossPadStart,t.crossPadEnd,W,A,g),S=n.length>0?io(n):n;if(n.length>0)so(S),lo(S,t);let I=Rt(e.container),d=pn(I,t.classPrefix,s,e.ariaLabel);if(e.scroll?.scrollbar==="none")d.viewport.classList.add(`${t.classPrefix}-viewport--no-scrollbar`);if(e.scroll?.gutter==="stable")d.viewport.classList.add(`${t.classPrefix}-viewport--gutter-stable`);let p=St(y,M,A),_=gn(t.classPrefix),te=Math.ceil(4096/l)+t.overscan*2+8,m=mn(te);m.totalItems=M;let x=e.items?[...e.items]:[],L=()=>x,F=new Map,u=xn(),E={velocity:0,reliable:!1},H={range:{start:0,end:-1}},R={scrollPosition:0,direction:"down"},ie={scrollPosition:0},ce=-1,de=-1,b=-1,C=null,w=hn(S),h=new Map,Q=[],f=[],P=[],Y=(oe)=>{let v=(ge)=>{oe.push(ge instanceof Error?ge:Error(String(ge)))};for(let ge of P)try{ge()}catch(ze){v(ze)}for(let ge of S)if(ge.destroy)try{ge.destroy()}catch(ze){v(ze)}},G=null,ee=null,pe,be,O=null,fe=null,j=null,B=null,D=null,se=null,Ie=null,Z=null,k=!1,ae=!1,J=null,ne=0,z=0,N=null,le=null,c=null,re=null,q=null,K=null,he=null,U=null,X=null,me=null,Le=(oe)=>me.setLogical(oe),Ce=!1,Te=!1,Pe=null,Re=null,ve=null,xe=null;m.containerSize=s?d.viewport.clientWidth:d.viewport.clientHeight,m.crossSize=s?d.viewport.clientHeight:d.viewport.clientWidth;function _e(oe){if(ee)ee(oe);else{if(s)d.viewport.scrollLeft=oe;else d.viewport.scrollTop=oe;if(be?.(),Te&&Math.abs(m.scrollPosition-oe)>1)Pe=oe}}let ye=bn({sizeCache:p,getPixel:()=>m.scrollPosition,setPixel:_e,getRenderOrigin:()=>m.baseOffset,getContainerSize:()=>m.containerSize,padding:t.mainAxisPadding});if(n.length>0){let oe={pool:_,config:t,emitter:g,template:e.item.template,getState(){return m},dom:{...d,renderedElement(v){let ge=h.get("_getRenderedElement");if(ge)return ge(v);return F.get(v)??null},enableListbox(){let v=d.content.getAttribute("role");if(!v||v==="list")d.content.setAttribute("role","listbox"),d.content.setAttribute("tabindex","0");V.itemRole="option",V.interactive=!0}},scroll:{...ye,to:_e,shiftBy(v){if(me?.shiftBy)me.shiftBy(v);else oe.scroll.to(m.scrollPosition+v)},smoothTo(v,ge,ze,De){if(U)U.smoothScrollTo(v,ge,ee??void 0,ze,De);else oe.scroll.to(typeof v==="function"?v():v)},cancel(){U?.cancelScroll()},commit(v){be(v)},setSource(v){ee=v.write,pe=v.onContentSize,k=!0},setTarget(v){J=v},setWrap(v,ge){ve=v,xe=ge},setBoundedWrap(v,ge){oe.scroll.setWrap(v,ge)},setToPosFn(v){q=v},setToIndexFn(v){K=v},onFrame:He,onIdle:Ve,disableResize(){ae=!0}},items:{all:L,at(v){return j?j(v):x[v]},removeById(v){if(D)return D(v);let ge=x.findIndex((ze)=>ze.id===v);if(ge===-1)return-1;return x.splice(ge,1),m.totalItems=x.length,p.rebuild(m.totalItems),Fe(),ge},insertAt(v,ge){if(se){se(v,ge);return}x.splice(ge,0,v),m.totalItems=x.length,p.rebuild(m.totalItems),Fe()},setGetFn(v){j=v},setRemoveFn(v){D=v},setInsertFn(v){se=v},setUpdateFn(v){Ie=v},setIndexByIdFn(v){Z=v},setTotalFn(v){G=v,V.ariaTotalFn=v},setIndexMapFn(v){V.indexMap=v}},sizes:{cache:p,get rawSpec(){return a},setConfig(v,ge=0){let ze=St(v,m.totalItems,ge),De=h.get("_setSizeCacheBase");if(De){let Be=p.rebuild;Object.assign(p,ze),p.rebuild=Be,De(ze.rebuild)}else Object.assign(p,ze)},rebuild(){p.rebuild(m.totalItems)}},render:{force(){ke()},ifNeeded(){Ne()},contentSize:Ge,setFn(v,ge){O=()=>{let{prevRangeStart:ze,prevRangeEnd:De}=m;if(v(),m.prevRangeStart!==ze||m.prevRangeEnd!==De)ut(w.commit,m)},fe=()=>{ge(),ut(w.commit,m)}},setStateFn(v){B=v},getStateFn(){return B}},hooks:{method(v,ge){if(!v.startsWith("_")&&h.has(v))throw Error(`[vlist] duplicate method "${v}"; rename it or use a set*Fn hook`);h.set(v,ge)},get(v){return h.get(v)},onClick(v){Q.push(v)},onKeydown(v){f.push(v)},onDestroy(v){P.push(v)}},nav:{set(v){if(v.ud!==void 0)ne=v.ud;if(v.lr!==void 0)z=v.lr;if(v.scrollIndex)N=v.scrollIndex;if(v.navigate)le=v.navigate;if(v.total)c=v.total;if(v.reveal)re=v.reveal},get:(()=>{let v={ud:0,lr:0,scrollIndex:null,navigate:null,total:null,reveal:null};return()=>(v.ud=ne,v.lr=z,v.scrollIndex=N,v.navigate=le,v.total=c,v.reveal=re,v)})()}};for(let v of S)if(v.setup)try{v.setup(oe)}catch(ge){let ze=ge instanceof Error?ge:Error(String(ge));g.emit("error",{error:ze,context:`plugin:setup:${v.name}`})}}let Se=t.classPrefix+"--scrolling",Me=!1,Ae=e.scroll?.idleTimeout??bt;function Oe(){if(R.scrollPosition=m.scrollPosition,s)R.direction=m.scrollDirection>0?"right":"left";else R.direction=m.scrollDirection>0?"down":"up";if(g.emit("scroll",R),Ln(u,m.scrollPosition),E.velocity=u.velocity,E.reliable=u.sampleCount>=Tn,g.emit("velocity:change",E),m.startIndex!==ce||m.prevRangeEnd!==de)ce=m.startIndex,de=m.prevRangeEnd,H.range.start=m.startIndex,H.range.end=m.prevRangeEnd,g.emit("range:change",H)}function Ge(oe,v=!0){let ge=oe+t.mainAxisPadding;if(Ce)Ee(ge);if(me){if(v)me.refresh(oe);return}if(m.totalSize=oe,pe?.(ge),v)d.content.style[s?"width":"height"]=Math.min(ge,at)+"px"}function Fe(){let oe=O?m.totalSize:p.getTotalSize();if(Ge(oe,!O),me||O||Ce)return;i?.onContentSize(oe,g)}function qe(){if(!he)return;if((G?G():x.length)===0)return;let v=he;he=null,Mt.scrollToIndex(v.index,v.alignOrOptions)}function Ne(){if(O)O();else Ht(m,p,t.overscan,_,d.content,e.item.template,L,F,V,w,j,B);qe()}function He(){if(Pe=null,!Me)Me=!0,d.root.classList.add(Se);if(Ne(),_t(w.afterScroll,m.scrollPosition,m.scrollDirection),Re?.sync(),m.scrollPosition!==b)b=m.scrollPosition,Oe()}function ue(){_.trim(F.size)}function Ee(oe){let v=!!me;if(Te=(r==="synthetic"||oe>at*(v?0.75:1))!==v,!Te)return;if(!It)i.load().then((ze)=>{if(It=ze,!m.destroyed)Fe()},(ze)=>g.emit("error",{error:ze,context:"scroll:mode"}));else if(!Me)we(oe)}function we(oe){let v=Pe??m.scrollPosition;if(Te=!1,U.detach(),Re?.destroy(),Re=null,me)U=X,me=ee=null,m.baseOffset=0,d.content.style[s?"width":"height"]=oe+"px",U.attach(),_e(v);else if(d.viewport[s?"scrollLeft":"scrollTop"]=0,U=me=Ye(It.createSyntheticScrollHandler),ee=Le,me.refresh(oe-t.mainAxisPadding),(Re=It.attachScrollbar(m,d,t,p,_e,e.scroll?.scrollbar))?.sync(),m.initialized)U.attach(),me.setLogical(v);g.emit("scroll:mode",{mode:me?"synthetic":"native"})}function Ve(){if(Me)Me=!1,d.root.classList.remove(Se);if(m.scrollDirection=0,ue(),yn(w.idle),E.velocity=0,E.reliable=!1,g.emit("velocity:change",E),ie.scrollPosition=m.scrollPosition,g.emit("scroll:idle",ie),Te)Fe()}function ke(){if(m.renderPending=!0,fe)fe();else Ht(m,p,t.overscan,_,d.content,e.item.template,L,F,V,w,j,B);if(qe(),_t(w.afterScroll,m.scrollPosition,m.scrollDirection),Re?.sync(),m.scrollPosition!==b){if(b=m.scrollPosition,Oe(),C!==null)clearTimeout(C);C=setTimeout(Ve,Ae)}else if(!Me)ue()}let We=k?!1:e.scroll?.wheel!==!1;if(k&&ve)throw Y([]),d.root.remove(),Error("vlist: page() is not compatible with the carousel plugin — document scrolling cannot wrap.");function Ye(oe){return oe({state:m,sizeCache:p,viewport:d.viewport,content:d.content,isX:s,wheelEnabled:We,idleTimeout:Ae,...J?{scrollTarget:J}:{},mainAxisPadding:t.mainAxisPadding,...ve?{wrap:ve,rendered:F,classPrefix:t.classPrefix,oddClass:W,onFold(v){let ge=u;if(ge._lp!==void 0)ge._lp-=v;b-=v}}:{},onFrame:He,onIdle:Ve})}if(!k&&(o||ve))U=me=Ye(o??xe),ee=Le;else X=(k?vt:i.native)({state:m,viewport:d.viewport,isX:s,wheelEnabled:We,idleTimeout:Ae,...J?{scrollTarget:J}:{},onFrame:He,onIdle:Ve}),U=X,be=X.commitScroll,Ce=!k&&r!=="native";function tt(oe){let ge=oe.target.closest("[data-index]");if(!ge)return null;let ze=parseInt(ge.getAttribute("data-index"),10);if(Number.isNaN(ze))return null;let De=h.get("_layoutToDataIndex"),Be,Ze=ze;if(De){let Ue=De(ze);if(Ue<0)return null;let nt=h.get("_getItemAtLayout"),lt=h.get("_getItem");Be=nt?nt(ze):lt?lt(Ue):j?j(Ue):x[Ue],Ze=Ue}else Be=j?j(ze):x[ze];if(Be===void 0)return null;return{item:Be,index:Ze}}function qt(oe){for(let ge=0;ge<Q.length;ge++)Q[ge](oe);let v=tt(oe);if(v)g.emit("item:click",{item:v.item,index:v.index,event:oe})}function Ut(oe){let v=tt(oe);if(v)g.emit("item:dblclick",{item:v.item,index:v.index,event:oe})}function Xt(oe){let v=tt(oe);if(v)g.emit("item:contextmenu",{item:v.item,index:v.index,event:oe})}function Zt(oe){let v=oe.target?.tagName;if((v==="INPUT"||v==="TEXTAREA"||v==="SELECT")&&!((oe.ctrlKey||oe.metaKey)&&(oe.key==="f"||oe.key==="F")))return;for(let ge=0;ge<f.length;ge++)f[ge](oe)}if(d.content.addEventListener("click",qt),d.content.addEventListener("dblclick",Ut),d.content.addEventListener("contextmenu",Xt),f.length>0)d.root.addEventListener("keydown",Zt);let Pt=null;if(!ae)setTimeout(()=>{if(m.destroyed)return;Pt=new ResizeObserver((v)=>{for(let ge of v){let{width:ze,height:De}=ge.contentRect,Be=s?ze:De,Ze=s?De:ze;if(Math.abs(Be-m.containerSize)<1&&Math.abs(Ze-m.crossSize)<1)continue;if(m.containerSize=Be,m.crossSize=Ze,m.resizeCapacity(Be,l,t.overscan),me)me.refresh(p.getTotalSize());ke(),Sn(w.resize,ze,De),g.emit("resize",{width:ze,height:De})}}),Pt.observe(d.viewport)},0);m.resizeCapacity(m.containerSize,l,t.overscan),Fe(),m.initialized=!0;let st=null;if(e.defer)st=requestAnimationFrame(()=>{if(st=null,!m.destroyed)Ne()});else Ne();if(!k)U.attach();let Mt={get element(){return d.root},get items(){return x},get total(){return G?G():x.length},setItems(oe){x=[...oe],m.totalItems=x.length,p.rebuild(m.totalItems),Fe(),ke()},appendItems(oe){let v=()=>Math.max(0,p.getTotalSize()+t.mainAxisPadding-m.containerSize),ge=t.reverse&&m.scrollPosition>=v()-1;if(x.push(...oe),m.totalItems=x.length,p.rebuild(m.totalItems),Fe(),ke(),ge)_e(v())},prependItems(oe){let v=m.totalItems>0,ge=p.getTotalSize();if(x.unshift(...oe),m.totalItems=x.length,p.rebuild(m.totalItems),Fe(),ke(),!t.reverse||!v)return;let ze=p.getTotalSize()-ge;if(ze<=0)return;let De=Math.max(0,p.getTotalSize()+t.mainAxisPadding-m.containerSize);_e(Math.min(m.scrollPosition+ze,De))},updateItem(oe,v){if(Ie){if(!Ie(oe,v))return}else{let ge=x.findIndex((ze)=>ze.id===oe);if(ge===-1)return;x[ge]={...x[ge],...v}}ke()},insertItem(oe,v){if(se)se(oe,v??m.totalItems);else{if(v===void 0)x.push(oe);else x.splice(v,0,oe);m.totalItems=x.length,p.rebuild(m.totalItems),Fe()}ke()},removeItem(oe){if(D){if(D(oe)<0)return}else{let v=x.findIndex((ge)=>ge.id===oe);if(v===-1)return;x.splice(v,1),m.totalItems=x.length,p.rebuild(m.totalItems),Fe()}ke()},removeItems(oe){if(D){let De=0;for(let Be of oe)if(D(Be)>=0)De++;if(De>0)ke();return De}let v=new Set(oe),ge=x.length;x=x.filter((De)=>!v.has(De.id));let ze=ge-x.length;if(ze>0)m.totalItems=x.length,p.rebuild(m.totalItems),Fe(),m.renderPending=!0,Ne();return ze},getItemAt(oe){if(V.indexMap){let ge=h.get("_getLoadedItem");return ge?ge(oe):x[oe]}let v=h.get("_getItemAtLayout");if(v){let ge=h.get("_dataToLayoutIndex");return v(ge?ge(oe):oe)}return j?j(oe):x[oe]},getIndexById(oe){if(Z)return Z(oe);return x.findIndex((v)=>v.id===oe)},scrollToIndex(oe,v="start"){let ge=G?G():x.length;if(ge===0){he={index:oe,alignOrOptions:v};return}let ze=typeof v==="string"?v:v.align??"start",De=typeof v==="object"?v.behavior:void 0,Be=typeof v==="object"?v.duration:void 0,Ze=typeof v==="object"?v.easing:void 0;if(K&&K(oe,ze,De,Be,Ze)!==!1)return;let Ue=Math.max(0,Math.min(oe,ge-1)),nt=p.getOffset(Ue),lt=p.getSize(Ue),ft=m.containerSize,Bn=p.getTotalSize(),jt=t.mainAxisPadding,Nn=Math.max(0,Bn+jt-ft),je;if(q)je=q(Ue,p,ft,ge,ze);else{let Wn=t.startPadding;switch(ze){case"center":je=Wn+nt-(ft-lt)/2;break;case"end":je=nt+lt+jt-ft;break;default:je=nt}je=Math.max(0,Math.min(je,Nn))}if(De==="smooth"&&!Te)U.smoothScrollTo(je,Be??ht,ee??void 0,Ze);else _e(je)},getScrollPosition(){return ye.getPixelEquivalent()},on:g.on.bind(g),off:g.off.bind(g),destroy(){if(m.destroyed)return;if(m.destroyed=!0,Me)Me=!1,d.root.classList.remove(Se);if(st!==null)cancelAnimationFrame(st),st=null;if(C!==null)clearTimeout(C),C=null;U.detach(),Re?.destroy(),Pt?.disconnect(),d.content.removeEventListener("click",qt),d.content.removeEventListener("dblclick",Ut),d.content.removeEventListener("contextmenu",Xt),d.root.removeEventListener("keydown",Zt);let oe=[];Y(oe);for(let[,v]of F)v.remove();if(F.clear(),_.clear(),d.root.remove(),g.emit("destroy",void 0),g.clear(),oe.length>0)for(let v of oe)console.error("vlist: error during destroy:",v)}};for(let[oe,v]of h){if(oe.startsWith("_"))continue;Mt[oe]=v}return Mt}var En="_getScrollPadding",uo={start:0,end:0};function Tt(e){let n;return()=>{if(n===void 0)n=e.hooks.get("_getScrollPadding")??null;return n?n():uo}}var Pn=(e)=>e==null?0:typeof e==="function"?e():e;function Ft(e){let n=e?.scrollPadding,o,i;return{name:"page",priority:5,setup(r){let{dom:t,config:s,emitter:a}=r,A=r.sizes.cache,y=s.axis.primary==="x",l=window,M=r.getState();if(r.scroll.disableResize(),t.root.style.overflow="visible",t.root.style.height="auto",y)t.viewport.style.overflowX="visible",t.viewport.style.overflowY="visible";else t.viewport.style.overflow="visible";t.viewport.classList.remove(`${s.classPrefix}-viewport--custom-scrollbar`);let W=!1,g=!1;r.scroll.setSource({onContentSize(T){if(T>zt&&!g){let p=`vlist: page() native document size ${T}px exceeds the ${zt}px limit. Use the viewport-scrolled default for larger lists. See https://vlist.io/docs/rfcs/RFC-014-Scroll-Input-Model`;if(!W)throw i?.(),o?.(),t.root.remove(),Error(p);g=!0,console.warn(p)}W=!0},write(T){let p=t.viewport.getBoundingClientRect(),_=(y?p.left+l.scrollX:p.top+l.scrollY)+T;if(y)l.scrollTo({left:_,top:l.scrollY,behavior:"instant"});else l.scrollTo({left:l.scrollX,top:_,behavior:"instant"});r.scroll.commit(T)}}),M.containerSize=y?l.innerWidth:l.innerHeight,M.crossSize=y?l.innerHeight:l.innerWidth;let V=()=>{let T=t.viewport.getBoundingClientRect(),p=Math.max(0,y?-T.left:-T.top);if(Math.abs(p-r.scroll.getPixelEquivalent())<0.5)return;r.scroll.commit(p)};l.addEventListener("scroll",V,{passive:!0}),i=()=>l.removeEventListener("scroll",V);let{innerWidth:S,innerHeight:I}=l,d=()=>{let{innerWidth:T,innerHeight:p}=l;if((y?Math.abs(T-S):Math.abs(p-I))<1)return;S=T,I=p,M.containerSize=y?T:p,M.crossSize=y?p:T,r.render.force(),a.emit("resize",{width:T,height:p})};if(l.addEventListener("resize",d),o=()=>l.removeEventListener("resize",d),n){let T=()=>({start:Pn(y?n.left:n.top),end:Pn(y?n.right:n.bottom)});r.hooks.method(En,T),r.scroll.setToPosFn((p,_,te,m,x)=>{let{start:L,end:F}=T();if(m===0)return 0;let u=Math.max(0,Math.min(p,m-1)),E=_.getOffset(u),H=_.getSize(u),R=_.getTotalSize(),ie=Math.max(0,R-te+F),ce;switch(x){case"center":ce=E-L-(te-L-F-H)/2;break;case"end":ce=E-te+H+F;break;default:ce=E-L}return Math.max(-L,Math.min(ce,ie))}),r.hooks.method("_scrollItemIntoView",(p)=>{let _=y?l.innerWidth:l.innerHeight,{start:te,end:m}=T(),x=t.viewport.getBoundingClientRect(),L=y?l.scrollX:l.scrollY,F=y?x.left:x.top,u=F+L,E=A.getOffset(p),H=A.getSize(p),R=F+E,ie=_-m,ce=L;if(R<te)ce=u+E-te;else if(R+H>ie)ce=u+E+H-ie;if(ce!==L)if(y)l.scrollTo({left:ce,top:l.scrollY,behavior:"instant"});else l.scrollTo({left:l.scrollX,top:ce,behavior:"instant"})})}r.hooks.onDestroy(()=>{i?.(),o?.()})},destroy(){i?.(),o?.(),i=void 0,o=void 0}}}function Ot(e){let n=e?.gap??0,o=null,i=0,r=null,t,s,a,A,y,l=new Map,M=new Set,W=new WeakMap,g=0,V=!1,S=!1,I=!1,d=2;function T(u){return l.get(u)??y}function p(u){return l.has(u)&&!M.has(u)}function _(u){if(!r||t.destroyed)return;if(u===void 0){if(l.size===0)return;l.clear(),M.clear(),r.sizes.rebuild(),L()}else{if(!l.has(u))return;M.add(u)}r.render.force()}function te(){return Math.max(0,r.sizes.cache.getTotalSize()+r.config.mainAxisPadding-t.containerSize)}function m(){let u=te();return u>0&&s.getPixelEquivalent()>=u-d}function x(){let u=te();if(u>s.getPixelEquivalent())r.scroll.to(u)}function L(){r.render.contentSize(r.sizes.cache.getTotalSize())}function F(u,E){let H=r;if(H.hooks.get("_setSizeCacheBase"))H.sizes.rebuild();else H.sizes.cache.invalidate(u,E)}return{name:"autosize",priority:5,setup(u){if(i++,s=u.scroll,r=u,t=u.getState(),a=u.config.axis.primary==="x",A=a?"width":"height",n===0)n=u.config.gap;y=typeof u.sizes.rawSpec==="function"?u.sizes.rawSpec(0)+n:u.sizes.rawSpec+n,u.sizes.setConfig(T,n);let E=new ResizeObserver((de)=>{if(t.destroyed||!r)return;let b=!1,C=-1,w=-1,h=u.sizes.cache.indexAtOffset(s.getPixelEquivalent());for(let G of de){let ee=G.target,pe=W.get(ee);if(pe===void 0)continue;if(ee.getAttribute("data-index")!==String(pe)){E.unobserve(ee);continue}if(p(pe))continue;let be=G.borderBoxSize?.[0],O;if(be)O=a?be.inlineSize:be.blockSize;else{let D=ee.getBoundingClientRect();O=a?D.width:D.height}if(O<=0)continue;let fe=O+n,j=l.has(pe),B=l.get(pe)??y;if(l.set(pe,fe),M.delete(pe),!j||fe!==B){if(b=!0,C<0||pe<C)C=pe;if(pe>w)w=pe}if(pe<h&&fe!==B)g+=fe-B;E.unobserve(ee),ee.style[A]=`${O}px`}if(!b)return;let Q=m();if(F(C,w),g)u.scroll.shiftBy(g),g=0;let f=t.scrollDirection!==0,P=t.totalItems>0&&t.prevRangeEnd>=t.totalItems-1,Y=S&&!I;if(Y||Q||P||I||!f){if(L(),V=!1,Y||Q)x()}else V=!0;u.render.force()});o=E,u.scroll.setToIndexFn((de,b,C,w,h)=>{let Q=de>=t.totalItems-1&&b==="end";if(S=Q,I=!1,!Q)return!1;let f=u.config.mainAxisPadding,P=()=>{let Y=u.sizes.cache.getTotalSize();return Math.max(0,Y+f-t.containerSize)};if(C==="smooth")I=!0,u.scroll.smoothTo(P,w??300,h,()=>{if(I=!1,V)L(),V=!1;x()});else u.scroll.to(P())});let H=()=>{S=!1},R=u.dom.viewport;R.addEventListener("wheel",H,{passive:!0}),R.addEventListener("touchstart",H,{passive:!0}),u.hooks.onDestroy(()=>{R.removeEventListener("wheel",H),R.removeEventListener("touchstart",H)});let ie=u.dom.content,ce=(de)=>{let b=de.target;if(!b||b===ie)return;let C=b.closest("[data-index]");if(!C||C.parentNode!==ie)return;let w=Number(C.getAttribute("data-index"));if(p(w))_(w)};ie.addEventListener("load",ce,!0),ie.addEventListener("error",ce,!0),u.hooks.onDestroy(()=>{ie.removeEventListener("load",ce,!0),ie.removeEventListener("error",ce,!0)}),u.hooks.method("isMeasured",p),u.hooks.method("remeasure",_),u.hooks.method("setMeasuredSize",(de,b)=>{l.set(de,b),F(de,de)}),u.hooks.method("getMeasuredCount",()=>l.size),u.hooks.onDestroy(()=>{if(E.disconnect(),o===E)o=null})},hooks:{onCommit(u){if(!o||!r)return;for(let E=0;E<u.visibleCount;E++){let H=u.visibleIndices[E];if(p(H))continue;let R=r.dom.renderedElement(H);if(!R)continue;R.style[A]="",W.set(R,H),o.observe(R)}},onIdle(){if(!r||!V)return;let u=m();if(L(),V=!1,u)x(),r.render.force()}},destroy(){if(i=Math.max(0,i-1),i>0)return;if(o)o.disconnect(),o=null;l.clear(),M.clear(),S=!1,I=!1,r=null}}}var Mn=(e={})=>{let{chunkSize:n=100,maxCachedItems:o=5000,evictionBuffer:i=200,onEvict:r}=e,t=new Map,s=0,a=0,A=(b)=>{let C=t.get(b);if(!C)C={items:Array(n),count:0,lastAccess:Date.now()},t.set(b,C);else C.lastAccess=Date.now();return C},y=(b)=>Math.floor(b/n),l=(b)=>b%n,M=()=>s,W=(b)=>{s=b},g=(b)=>{if(b<0||b>=s)return;let C=y(b),w=t.get(C);if(!w)return;return w.items[l(b)]},V=(b)=>{if(b<0||b>=s)return!1;let C=y(b),w=t.get(C);if(!w)return!1;return w.items[l(b)]!==void 0},S=(b,C)=>{let w=y(b),h=A(w),Q=l(b),f=h.items[Q]===void 0;if(h.items[Q]=C,f)h.count++,a++;if(b>=s)s=b+1},I=(b,C)=>{for(let w=0;w<C.length;w++){let h=C[w];if(h!==void 0)S(b+w,h)}},d=(b,C)=>{if(b<0||b>s)return;let w=y(b),h=Array.from(t.keys()).filter((G)=>G>=w).sort((G,ee)=>G-ee),Q=[];for(let G of h){let ee=t.get(G),pe=G*n;for(let be=0;be<n;be++){if(ee.items[be]===void 0)continue;let O=pe+be;if(O<b)continue;Q.push({oldIndex:O,item:ee.items[be]})}}for(let{oldIndex:G}of Q){let ee=y(G),pe=t.get(ee);if(!pe)continue;let be=l(G);if(pe.items[be]!==void 0){if(pe.items[be]=void 0,pe.count--,a--,pe.count===0)t.delete(ee)}}s++;for(let{oldIndex:G,item:ee}of Q){let pe=G+1,be=y(pe),O=A(be),fe=l(pe);O.items[fe]=ee,O.count++,a++}let f=y(b),P=A(f),Y=l(b);P.items[Y]=C,P.count++,a++},T=(b)=>{if(b<0||b>=s)return!1;let C=y(b),w=t.get(C),h=l(b);if(!(w!==void 0&&w.items[h]!==void 0))return!1;let f=C,P=Array.from(t.keys()).filter((G)=>G>=f).sort((G,ee)=>G-ee),Y=[];for(let G of P){let ee=t.get(G),pe=G*n;for(let be=0;be<n;be++){if(ee.items[be]===void 0)continue;let O=pe+be;if(O<=b)continue;Y.push({oldIndex:O,item:ee.items[be]})}}if(w.items[h]=void 0,w.count--,a--,w.count===0)t.delete(C);for(let{oldIndex:G}of Y){let ee=y(G),pe=t.get(ee);if(!pe)continue;let be=l(G);if(pe.items[be]!==void 0){if(pe.items[be]=void 0,pe.count--,a--,pe.count===0)t.delete(ee)}}for(let{oldIndex:G,item:ee}of Y){let pe=G-1,be=y(pe),O=A(be),fe=l(pe);O.items[fe]=ee,O.count++,a++}return s--,!0},p=(b,C)=>{let w=[];for(let h=b;h<=C&&h<s;h++)w.push(g(h));return w},_=(b,C)=>{for(let w=b;w<=C&&w<s;w++)if(!V(w))return!1;return!0},te=()=>{let b=[],C=null,w=Array.from(t.keys()).sort((h,Q)=>h-Q);for(let h of w){let Q=t.get(h);if(!Q)continue;let f=h*n;for(let P=0;P<n;P++){let Y=f+P;if(Y>=s)break;if(Q.items[P]!==void 0)if(C===null)C={start:Y,end:Y};else if(Y===C.end+1)C.end=Y;else b.push(C),C={start:Y,end:Y};else if(C!==null)b.push(C),C=null}}if(C!==null)b.push(C);return b},m=(b,C)=>{let w=[],h=null;for(let Q=b;Q<=C&&Q<s;Q++)if(!V(Q))if(h===null)h={start:Q,end:Q};else h.end=Q;else if(h!==null)w.push(h),h=null;if(h!==null)w.push(h);return w},x=(b)=>t.has(b),L=(b)=>{let C=t.get(b);if(!C)return!1;let w=b*n,h=Math.min(n,s-w);return C.count>=h},F=(b)=>{let C=t.get(b);if(C)C.lastAccess=Date.now()},u=(b,C)=>{if(b>C||t.size===0)return;let w=Date.now(),h=y(Math.max(0,b)),Q=y(Math.min(s-1,C));for(let f=h;f<=Q;f++){let P=t.get(f);if(P)P.lastAccess=w}},E=(b,C)=>{if(a<=o)return 0;let w=Math.max(0,b-i),h=Math.min(s-1,C+i),Q=y(w),f=y(h),P=0,Y=[];for(let[G,ee]of t)if(G<Q||G>f)P+=ee.count,Y.push(G),a-=ee.count,t.delete(G);if(P>0&&r)r(P,Y);return P},H=()=>{if(a<=o)return 0;let b=Array.from(t.entries()).sort(([,h],[,Q])=>h.lastAccess-Q.lastAccess),C=0,w=[];for(let[h,Q]of b){if(a<=o)break;C+=Q.count,a-=Q.count,w.push(h),t.delete(h)}if(C>0&&r)r(C,w);return C},R=()=>({totalItems:s,cachedItems:a,cachedChunks:t.size,chunkSize:n,maxCachedItems:o,memoryEfficiency:s>0?1-a/s:1}),ie=()=>a,ce=()=>{t.clear(),a=0};return{chunkSize:n,maxCachedItems:o,getTotal:M,setTotal:W,get:g,has:V,set:S,setRange:I,insert:d,delete:T,getRange:p,isRangeLoaded:_,getLoadedRanges:te,findUnloadedRanges:m,getChunkIndex:y,isChunkLoaded:x,isChunkFullyLoaded:L,touchChunk:F,touchChunksForRange:u,evictDistant:E,evictToLimit:H,getStats:R,getCachedCount:ie,clear:ce,reset:()=>{ce(),s=0}}};var zn=(e={})=>{let{maskCharacter:n=sn,maxSampleSize:o=ln}=e,i=[],r=!1,t=(l)=>{if(r||l.length===0)return;let M=Math.min(l.length,o);for(let W=0;W<M;W++){let g=l[W];if(!g||typeof g!=="object")continue;let V={},S=!1;for(let[I,d]of Object.entries(g)){if(I.startsWith("_")||I==="id")continue;V[I]=String(d??"").length,S=!0}if(S)i.push(V)}r=!0},s=()=>r,a=(l)=>{let M={id:`${Ke}${l}`,[kt]:!0,_index:l};if(i.length===0)return M.label=n.repeat(12),M;let W=i[l%i.length];for(let[g,V]of Object.entries(W))M[g]=n.repeat(Math.max(1,V));return M};return{analyzeStructure:t,hasAnalyzedStructure:s,generate:a,generateRange:(l,M)=>{let W=[];for(let g=l;g<=M;g++)W.push(a(g));return W},clear:()=>{i=[],r=!1}}},xt=(e)=>{if(!e||typeof e!=="object")return!1;return e[kt]===!0};var co=50,An=(e={})=>{let{adapter:n,initialItems:o,initialTotal:i,storage:r,placeholder:t,pageSize:s=co,maxConcurrent:a=0,onStateChange:A,onDataChange:y,onItemsLoaded:l,onItemsEvicted:M,onLoadError:W}=e,g=Mn({...r,onEvict:(z,N)=>{M?.(z),E(),u()}}),V=null,S=()=>{if(!V)V=zn(t);return V},I=new Map,d=!1,T,p=!0,_,te,m=[],x=0,L=new Map,F=()=>{for(let z of L.values())z[1].abort();L.clear()},u=()=>{A?.(h())},E=()=>{y?.()},H=()=>{I.clear();let z=g.getLoadedRanges();for(let N of z)for(let le=N.start;le<=N.end;le++){let c=g.get(le);if(c&&!xt(c))I.set(c.id,le)}},R=(z,N)=>{if(!xt(N))I.set(N.id,z)},ie=(z)=>{I.delete(z)},ce=(z,N)=>`${z}-${N}`,de=()=>g.getTotal(),b=()=>g.getCachedCount(),C=()=>d,w=()=>p,h=()=>({total:g.getTotal(),cached:g.getCachedCount(),isLoading:d,pendingRanges:m,error:T,hasMore:p,cursor:_}),Q=()=>g,f=()=>S(),P=(z)=>{let N=g.get(z);if(N!==void 0)return N;if(z>=0&&z<g.getTotal())return S().generate(z);return},Y=(z)=>{let N=I.get(z);if(N===void 0)return;return g.get(N)},G=(z)=>I.get(z)??-1,ee=(z)=>{let N=g.get(z);return N!==void 0&&!xt(N)},pe=(z,N)=>{let le=[],c=g.getTotal();g.touchChunksForRange(z,Math.min(N,c-1));for(let re=z;re<=N&&re<c;re++){let q=g.get(re);if(q!==void 0)le.push(q);else le.push(S().generate(re))}return le},be=(z)=>{g.setTotal(z),p=g.getCachedCount()<z,E(),u()},O=(z,N=0,le)=>{if(n&&z.length>0){let c=S();if(!c.hasAnalyzedStructure())c.analyzeStructure(z)}for(let c=0;c<z.length;c++){let re=z[c];if(re!==void 0){let q=N+c;g.set(q,re),R(q,re)}}if(le!==void 0)g.setTotal(le);else if(N+z.length>g.getTotal())g.setTotal(N+z.length);if(g.getCachedCount()>=g.getTotal()&&g.getTotal()>0)p=!1;E(),u(),l?.(z,N,g.getTotal())},fe=(z,N)=>{let le=g.get(z);if(!le)return!1;let c=le.id,re={...le,...N};if(g.set(z,re),N.id!==void 0&&N.id!==c)ie(c);return R(z,re),E(),u(),!0},j=(z,N)=>{g.insert(N,z),H(),F(),E(),u()},B=(z)=>{let N=I.get(z);if(N===void 0)return!1;if(!g.delete(N))return!1;return H(),F(),E(),u(),!0},D=async(z,N)=>{if(!n)return;let le=g.chunkSize,c=Math.floor(z/le),re=Math.floor(N/le),q=le*2;for(let[U,X]of L){let me=U.indexOf("-"),Le=parseInt(U.slice(0,me),10);if(Math.abs(Le-z)>q)X[1].abort(),L.delete(U)}let K=[],he=[];for(let U=c;U<=re;U++){let X=U*le,me=X+le-1,Le=ce(X,me);if(g.isChunkFullyLoaded(U))continue;let Te=L.get(Le);if(Te)he.push(Te[0]);else K.push({start:X,end:me})}if(K.length===0){if(he.length>0)await Promise.all(he);return}if(a>0){let U=L.size+K.length;if(U>a){let X=(z+N)/2,me=Math.min(U-a,L.size);while(me>0){let Ce=null,Te=-1,Pe=null;for(let[Re,ve]of L){let xe=Re.indexOf("-"),_e=parseInt(Re.slice(0,xe),10),ye=parseInt(Re.slice(xe+1),10),Se=Math.abs((_e+ye)/2-X);if(Se>Te)Te=Se,Ce=Re,Pe=ve[1]}if(Ce)Pe.abort(),L.delete(Ce);me--}let Le=a-L.size;if(K.length>Le)K.sort((Ce,Te)=>{let Pe=Math.abs((Ce.start+Ce.end)/2-X),Re=Math.abs((Te.start+Te.end)/2-X);return Pe-Re}),K.length=Math.max(0,Le)}}if(K.length===0){if(he.length>0)await Promise.all(he);return}for(let U of K){let X=ce(U.start,U.end),me=new AbortController,Le=(async()=>{m.push(U),d=!0,T=void 0,u();try{let Ce=U.end-U.start+1,Te={offset:U.start,limit:Ce,cursor:U.start===te?_:void 0,signal:me.signal},Pe=await n.read(Te);if(O(Pe.items,U.start,Pe.total),Pe.cursor)_=Pe.cursor,te=U.start+Pe.items.length;let Re=U.start+Pe.items.length;if(Re>=x){if(x=Re,Pe.hasMore!==void 0)p=Pe.hasMore;else if(Pe.total!==void 0)p=Re<Pe.total}}catch(Ce){if(Ce?.name==="AbortError")return;T=Ce instanceof Error?Ce:Error(String(Ce)),W?.(T,U)}finally{L.delete(X);let Ce=m.findIndex((Te)=>Te.start===U.start&&Te.end===U.end);if(Ce>=0)m.splice(Ce,1);d=L.size>0,u()}})();L.set(X,[Le,me]),he.push(Le)}await Promise.all(he)},se=async(z,N)=>{if(g.isRangeLoaded(z,N))return;await D(z,N)},Ie=async()=>{if(!n)return;await D(0,s-1)},Z=async()=>{if(!n||d||!p)return!1;let z=g.getCachedCount(),N=g.getTotal(),le=z,c=Math.min(le+s-1,N>0?N-1:le+s-1);if(le>=N&&N>0)return p=!1,!1;return await D(le,c),g.getCachedCount()>z},k=async()=>{if(g.clear(),I.clear(),V)V.clear();F(),m=[],d=!1,_=void 0,te=void 0,p=!0,x=0,T=void 0,E(),u()},ae=(z,N)=>{if(g.evictDistant(z,N)>0)H()},J=()=>{g.clear(),I.clear(),_=void 0,te=void 0,T=void 0,m=[],d=!1,E(),u()},ne=()=>{if(g.reset(),I.clear(),V)V.clear();_=void 0,te=void 0,p=!0,x=0,T=void 0,m=[],d=!1,E(),u()};if(o&&o.length>0)O(o,0,i??o.length);else if(i!==void 0)g.setTotal(i),E(),u();return{getState:h,getTotal:de,getCached:b,getIsLoading:C,getHasMore:w,getStorage:Q,getPlaceholders:f,getItem:P,getItemById:Y,getIndexById:G,isItemLoaded:ee,getItemsInRange:pe,setTotal:be,setItems:O,updateItem:fe,insertItem:j,removeItem:B,loadRange:D,ensureRange:se,loadInitial:Ie,loadMore:Z,reload:k,evictDistant:ae,clear:J,reset:ne}};function Dt(e){let{adapter:n,total:o,autoLoad:i=!0,storage:r}=e,t=e.loading?.cancelThreshold??tn,s=e.loading?.preloadThreshold??en,a=e.loading?.preloadAhead??Qt,A=e.loading?.maxConcurrent??nn,y,l,M,W,g,V,S=null,I=null,d=null,T=0,p=!1,_=null,te=At,m=-1,x=-1,L=-1,F=-1,u=r?.chunkSize??pt,E=()=>{if(S=null,I!==null)clearTimeout(I),I=null},H=(h,Q)=>y.ensureRange(h,Q),R=(h,Q=pt)=>{W.emit("load:start",{offset:h,limit:Q})},ie=(h)=>{W.emit("error",{error:h,context:"ensureRange"})},ce=()=>{S=null;let h={start:l.startIndex,end:l.startIndex+Math.max(0,l.visibleCount-1)};if(h.end<h.start)return;H(h.start,h.end).catch(ie)},de=()=>{if(_!==null)clearTimeout(_),_=null},b=()=>{if(l.destroyed)return;let h=y.getTotal();if(l.visibleCount<=0||l.startIndex>=h)return;let Q=Math.min(l.startIndex+l.visibleCount-1,h-1);if(Q<l.startIndex)return;H(l.startIndex,Q).catch(ie)},C=()=>{if(_!==null||l.destroyed)return;_=setTimeout(()=>{_=null,b()},te),te=Math.min(te*2,on)},w=()=>{de(),te=At};return{name:"data",priority:20,setup(h){l=h.getState(),M=h.sizes.cache,W=h.emitter,g=h.dom,V=h.render.force.bind(h);let Q=null;h.items.setTotalFn(()=>Q?.getTotal()??0),h.items.setIndexByIdFn((P)=>Q?.getIndexById(P)??-1),y=Q=An({adapter:n,...o!==void 0&&{initialTotal:o},pageSize:r?.chunkSize??pt,maxConcurrent:A,...r&&{storage:{...r.chunkSize!==void 0&&{chunkSize:r.chunkSize},...r.maxCachedItems!==void 0&&{maxCachedItems:r.maxCachedItems},...r.evictionBuffer!==void 0&&{evictionBuffer:r.evictionBuffer}}},onDataChange:()=>{if(l.initialized){let P=y.getTotal(),Y=y.getCached();if(l.totalItems=P,P!==m||Y!==x)m=P,x=Y,M.rebuild(P);h.render.contentSize(M.getTotalSize()),h.render.ifNeeded()}},onItemsLoaded:(P)=>{if(w(),l.initialized)h.render.contentSize(M.getTotalSize()),V(),W.emit("load:end",{items:P,total:y.getTotal()})},onLoadError:(P)=>{if(W.emit("error",{error:P,context:"load"}),l.initialized)h.render.ifNeeded();C()}}),h.items.setGetFn((P)=>y.getItem(P)),h.items.setRemoveFn((P)=>{let Y=y.getIndexById(P);if(Y<0)return-1;if(!y.removeItem(P))return-1;return Y}),h.items.setInsertFn((P,Y)=>{y.insertItem(P,Y)}),h.items.setUpdateFn((P,Y)=>{let G=y.getIndexById(P);if(G<0)return!1;return y.updateItem(G,Y)}),h.hooks.method("reload",async()=>{if(S=null,L=-1,F=-1,w(),h.render.force(),await y.reload(),h.scroll.to(0),i)R(0),await y.loadInitial(),h.render.force()}),h.hooks.method("loadVisibleRange",async()=>{S=null,h.render.force();let P=y.getTotal();if(l.visibleCount>0&&l.startIndex<P){let Y=Math.min(l.startIndex+l.visibleCount-1,P-1);R(l.startIndex,Y-l.startIndex+1),await H(l.startIndex,Y)}}),h.hooks.method("loadInitial",async()=>{R(0),await y.loadInitial(),h.render.force()}),h.hooks.method("getTotal",()=>y.getTotal()),h.hooks.method("setTotal",(P)=>{y.setTotal(P)}),h.hooks.method("_getTotal",()=>y.getTotal()),h.hooks.method("_setTotal",(P)=>{y.setTotal(P)}),h.hooks.method("_cancelAutoLoad",()=>{p=!0}),h.hooks.method("_getLoadedItem",(P)=>y.getStorage().get(P)),h.hooks.method("_getItem",(P)=>y.getItem(P)),h.hooks.method("_getLoadedCount",()=>y.getCached()),W.on("load:start",()=>{g.root.setAttribute("aria-busy","true")}),W.on("load:end",()=>{g.root.removeAttribute("aria-busy")}),h.hooks.onDestroy(()=>{if(d!==null)clearTimeout(d),d=null;E(),de()}),W.on("velocity:change",({velocity:P})=>{T=Math.abs(P)});let f=()=>{if(l.destroyed)return;w(),b(),ce()};if(window.addEventListener("online",f),h.hooks.onDestroy(()=>{window.removeEventListener("online",f)}),i)queueMicrotask(()=>{if(p)return;R(0),y.loadInitial().catch((P)=>{W.emit("error",{error:P,context:"loadInitial"})})});else if(o!==void 0)y.setTotal(o)},hooks:{onAfterScroll(){if(l.destroyed)return;let h=l.startIndex+Math.max(0,l.visibleCount-1);if(T>t){if(I!==null)clearTimeout(I),I=null;S={start:l.startIndex,end:h};return}if(T>s){let P=Math.floor(l.startIndex/u),Y=Math.floor(h/u);if(P!==L||Y!==F){if(L=P,F=Y,h>=l.startIndex)H(l.startIndex,h).catch(ie)}let G=l.startIndex,ee=h,pe=l.scrollDirection;if(pe>0)ee=Math.min(ee+a,y.getTotal()-1);else if(pe<0)G=Math.max(0,G-a);if(S={start:G,end:ee},I!==null)clearTimeout(I);I=setTimeout(()=>{if(I=null,l.destroyed||!S)return;let{start:be,end:O}=S;if(S=null,O>=be)H(be,O).catch(ie)},100);return}E();let Q=Math.floor(l.startIndex/u),f=Math.floor(h/u);if(Q!==L||f!==F){if(L=Q,F=f,h>=l.startIndex)H(l.startIndex,h).catch(ie)}},onIdle(){if(l.destroyed)return;T=0,L=-1,F=-1,ce(),E()},onResize(){if(l.destroyed)return;let h=y.getTotal();if(h<=0)return;if(l.visibleCount<=0||l.startIndex>=h)return;let Q=Math.min(l.startIndex+l.visibleCount-1,h-1);if(Q<l.startIndex)return;R(l.startIndex,Q-l.startIndex+1),H(l.startIndex,Q).catch(ie)}},destroy(){if(d!==null)clearTimeout(d);E(),de()}}}var wn=(e)=>{let n=Math.max(1,Math.floor(e.columns)),o=e.gap??0,i=e.isHeaderFn,r={row:0,col:0},t=(S)=>{if(S<=0)return 0;if(!i)return Math.ceil(S/n);let I=0,d=0,T=0;for(let p=0;p<S;p++)if(i(p)){if(T++,d)I++,d=0;I++,d=0}else if(d++,d>=n)I++,d=0;if(d)I++;return I},s=(S)=>(r.row=a(S),r.col=A(S),r),a=(S)=>{if(!i)return Math.floor(S/n);let I=0,d=0;for(let T=0;T<=S;T++)if(i(T)){if(d)I++,d=0;if(T===S)return I;I++,d=0}else{if(T===S)return I;if(d++,d>=n)I++,d=0}return I},A=(S)=>{if(!i)return S%n;if(i(S))return 0;let I=0;for(let d=0;d<=S;d++)if(i(d))I=0;else{if(d===S)return I;if(I++,I>=n)I=0}return I},y=(S,I,d,T)=>{if(d<=0){T.start=0,T.end=-1;return}if(!i){T.start=Math.max(0,S*n),T.end=Math.min(d-1,(I+1)*n-1);return}let p=l(S,I,d);T.start=p.start,T.end=p.end},l=(S,I,d)=>{if(d<=0)return{start:0,end:-1};if(!i){let m=Math.max(0,S*n),x=Math.min(d-1,(I+1)*n-1);return{start:m,end:x}}let T=-1,p=-1,_=0,te=0;for(let m=0;m<d;m++){if(i(m)){if(te)_++,te=0;if(_>=S&&_<=I){if(T<0)T=m;p=m}_++,te=0}else{if(_>=S&&_<=I){if(T<0)T=m;p=m}if(te++,te>=n)_++,te=0}if(_>I&&!te)break}if(T<0)return{start:0,end:-1};return{start:T,end:p}},M=(S,I,d)=>{if(I<0||I>=n)return-1;let T=S*n+I;if(T<0||T>=d)return-1;return T},W=(S)=>{let I=(n-1)*o;return Math.max(0,(S-I)/n)};return{get columns(){return n},get gap(){return o},update:(S)=>{if(S.columns!==void 0)n=Math.max(1,Math.floor(S.columns));if(S.gap!==void 0)o=S.gap;if(S.isHeaderFn!==void 0)i=S.isHeaderFn},getTotalRows:t,getPosition:s,getRow:a,getCol:A,getItemRange:l,fillItemRange:y,getItemIndex:M,getColumnWidth:W,getColumnOffset:(S,I)=>{let d=W(I);return S*(d+o)}}};function rt(e,n,o,i,r){if(o==="smooth")e.smoothTo(n,i??ht,r);else e.to(n)}var Je={selected:!1,focused:!1};function $t(e){if(!e.columns||e.columns<1)throw Error("[vlist] grid: columns must be >= 1");let n,o,i,r,t=0,s,a=null,A=null,y=-1,l,M,W,g,V,S,I=null,d=0,T=0,p=0,_=0,te=new Map,m=0,x=0,L=0,F=0,u=null,E=!1,H="",R="",ie="",ce={start:0,end:-1},de=-1,b=-1,C=-1,w=!0,h,Q=!1;function f(){let j=(x-1)*L;F=Math.max(0,(m-j)/x)}function P(){if(E)return;E=!0,u=I?.()??null}function Y(){if(A!==null||a===null)return;A=a.dom.content.getAttribute("role")==="listbox"}function G(){return n.getTotalRows(i.totalItems)}function ee(j,B){let D=j/x|0,Ie=(j-D*x)*(F+L)+d,Z=o.getOffset(D)-B+p;if(g)return`translate(${Math.round(Z)}px, ${Math.round(Ie)}px)`;return`translate(${Math.round(Ie)}px, ${Math.round(Z)}px)`}function pe(j,B){let D=o.getSize(B)-L;if(g)j.style.width=`${D}px`,j.style.height=`${F}px`;else j.style.width=`${F}px`,j.style.height=`${D}px`}function be(j,B,D){if(u)u(D,Je);else Je.selected=!1,Je.focused=!1;let se=M(B,D,Je);if(typeof se==="string")j.innerHTML=se;else j.innerHTML="",j.appendChild(se);Xe(j)}function O(){if(i.destroyed)return;let j=r.getRenderOrigin(),B=r.getPixelEquivalent(),D=i.containerSize;if(!w&&B===de&&D===b&&j===t)return;de=B,b=D,w=!1;let se=G();if(D<=0||se===0)return;P(),Y();let Ie=o.indexAtOffset(B),Z=o.indexAtOffset(B+D);if(Z<se-1)Z++;Ie=Math.max(0,Ie),Z=Math.min(se-1,Math.max(0,Z));let k=Math.max(0,Ie-S),ae=Math.min(se-1,Z+S);if(k===i.prevRangeStart&&ae===i.prevRangeEnd&&!i.renderPending&&j===t)return;n.fillItemRange(k,ae,i.totalItems,ce);let{start:J,end:ne}=ce;for(let[le,c]of te)if(le<J||le>ne)c.el.remove(),s.release(c.el),te.delete(le);if(A&&i.totalItems!==y){y=i.totalItems;let le=String(i.totalItems);for(let[,c]of te)c.el.setAttribute("aria-setsize",le)}for(let le=J;le<=ne;le++){let c=W(le);if(!c)continue;let re=le/x|0,q=le-re*x,K=te.get(le);if(K===void 0){let X=s.acquire();if(X.className=H,X.setAttribute("data-index",String(le)),X.setAttribute("data-id",String(c.id)),X.setAttribute("role",A?"option":"listitem"),A)X.id=`${V}-item-${le}`,X.setAttribute("aria-posinset",String(le+1)),X.setAttribute("aria-setsize",String(i.totalItems));be(X,c,le),K={el:X,lastItem:c},te.set(le,K),l.appendChild(X)}else if(K.lastItem!==c)K.el.setAttribute("data-id",String(c.id)),K.lastItem=c,be(K.el,c,le);else if(u)u(le,Je);if(u)if(K.el.classList.toggle(R,Je.selected),K.el.classList.toggle(ie,Je.focused),Je.selected)K.el.setAttribute("aria-selected","true");else K.el.removeAttribute("aria-selected");pe(K.el,re);let he=q*(F+L)+d,U=o.getOffset(re)-j+p;K.el.style.transform=g?`translate(${Math.round(U)}px, ${Math.round(he)}px)`:`translate(${Math.round(he)}px, ${Math.round(U)}px)`}let z=o.getTotalSize();if(z!==C)C=z,a?.render.contentSize(z);i.prevRangeStart=k,i.prevRangeEnd=ae,t=j,i.renderPending=!1;let N=ne-J+1;i.visibleCount=Math.min(N,i.capacity),i.startIndex=J;for(let le=0;le<i.visibleCount;le++){let c=J+le,re=c/x|0;i.visibleIndices[le]=c,i.visibleOffsets[le]=o.getOffset(re),i.visibleSizes[le]=o.getSize(re)}}function fe(){if(i.destroyed)return;h(G()),C=-1,i.prevRangeStart=-1,i.prevRangeEnd=-1,i.renderPending=!0,w=!0,O()}return{name:"grid",priority:10,conflicts:["masonry","table","autosize"],setup(j){r=j.scroll,x=Math.max(1,Math.floor(e.columns)),L=e.gap??0,n=wn({columns:e.columns,gap:L}),o=j.sizes.cache,i=j.getState(),s=j.pool,a=j,l=j.dom.content,M=j.template,g=j.config.axis.primary==="x",V=j.config.classPrefix,S=j.config.overscan,W=j.items.at.bind(j),I=()=>j.render.getStateFn(),H=`${V}-item ${V}-grid-item`,R=`${V}-item--selected`,ie=`${V}-item--focused`,d=j.config.crossPadStart,T=j.config.crossAxisPadding,p=j.config.startPadding,_=j.config.mainAxisPadding,m=i.crossSize-T,f();let B=j.sizes.rawSpec,D;Q=typeof B==="function";function se(ae,J,ne,z){let N=ae*J;if(N>=i.totalItems)return D+ne;return B(N,z)+ne}if(typeof B==="function"){let J={columnWidth:n.getColumnWidth(m),columns:e.columns,gap:L};D=i.totalItems>0?B(0,J):0,j.sizes.setConfig((ne)=>(J.columnWidth=n.getColumnWidth(m),se(ne,e.columns,L,J)),L)}else if(D=B,L>0)j.sizes.setConfig(D+L,L);let Ie=null,Z=o.rebuild;function k(){if(o.rebuild===Ie)return;Z=o.rebuild,h=(ae)=>Z(ae),Ie=(ae)=>{h(Math.ceil(ae/x))},o.rebuild=Ie}j.hooks.method("_setSizeCacheBase",(ae)=>{Z=ae,h=(J)=>Z(J)}),k(),h(G()),j.items.setTotalFn(()=>i.totalItems),j.hooks.method("_getTotal",()=>i.totalItems),j.dom.root.classList.add(`${V}--grid`),j.render.setFn(O,fe),j.hooks.method("getGridLayout",()=>n),j.hooks.method("_getRowGap",()=>n.gap),j.hooks.method("updateGrid",(ae)=>{if(ae.columns!==void 0){if(!Number.isInteger(ae.columns)||ae.columns<1)throw Error("[vlist] updateGrid: columns must be >= 1")}if(ae.gap!==void 0&&ae.gap<0)throw Error("[vlist] updateGrid: gap must be >= 0");if(n.update(ae),ae.columns!==void 0)x=Math.max(1,Math.floor(ae.columns));if(ae.gap!==void 0)L=ae.gap;if(ae.gap!==void 0||ae.columns!==void 0){let J=n.gap;if(typeof B==="function"){let ne={columnWidth:n.getColumnWidth(m),columns:n.columns,gap:J};j.sizes.setConfig((z)=>(ne.columnWidth=n.getColumnWidth(m),se(z,n.columns,J,ne)),J)}else j.sizes.setConfig(D+J,J);k(),h(G())}if(ae.columns!==void 0)j.nav.set({ud:n.columns});m=i.crossSize-T,f(),fe()}),j.scroll.setToIndexFn((ae,J,ne,z,N)=>{let le=n.getRow(ae),c=G();if(c===0)return!1;let re=Math.max(0,Math.min(le,c-1)),q=o.getOffset(re)+p,K=o.getSize(re),he=i.containerSize,U=o.getTotalSize()+_,X=Math.max(0,U-he),me;switch(J){case"center":me=q-(he-K)/2;break;case"end":me=q-he+K;break;default:me=q}me=Math.max(0,Math.min(me,X)),rt(j.scroll,me,ne,z,N)}),j.nav.set({total:()=>i.totalItems,ud:e.columns,lr:1,scrollIndex:(ae)=>n.getRow(ae)}),j.hooks.onDestroy(()=>{for(let[,ae]of te)ae.el.remove();te.clear(),A=null,y=-1,j.dom.root.classList.remove(`${V}--grid`)})},hooks:{onResize(j,B){let D=i.crossSize-T;if(Math.abs(D-m)<1)return;if(m=D,f(),Q){fe();return}let se=r.getRenderOrigin();for(let[Ie,Z]of te){let k=Ie/x|0;pe(Z.el,k),Z.el.style.transform=ee(Ie,se)}}},destroy(){te.clear()}}}var kn=(e)=>{let n=Math.max(1,Math.floor(e.columns)),o=e.gap??0,i=e.containerSize,r=e.crossOffset??0,t=e.mainOffset??0,s=0,a=[],A=()=>{let d=(n-1)*o;s=Math.max(0,(i-d)/n),a=Array(n);let T=s+o;for(let p=0;p<n;p++)a[p]=r+p*T};A();let y=[],l=0,M=[],W=(d,T)=>{if(d<=0)return l=0,y=[],[];let p=Array(n).fill(t),_=Array(n);for(let x=0;x<n;x++)_[x]=[];let te=Array(d);for(let x=0;x<d;x++){let L=0,F=p[0];for(let H=1;H<n;H++){let R=p[H];if(R<F)F=R,L=H}let u=T(x),E=p[L];te[x]={index:x,x:a[L],y:E,lane:L,size:u,crossSize:s},_[L].push(x),p[L]=E+u+o}y=_;let m=0;for(let x=0;x<n;x++){let L=p[x],F=L>0?L-o:0;if(F>m)m=F}return l=m,te},g=(d)=>{if(d.length===0)return l;if(l)return l;let T=Array(n).fill(0);for(let _ of d){let te=_.y+_.size,m=T[_.lane];if(te>m)T[_.lane]=te}let p=0;for(let _=0;_<n;_++)if(T[_]>p)p=T[_];return p},V=(d,T,p)=>{if(d.length===0||p<=T)return M.length=0,M;if(y.length===0||y.length!==n)return S(d,T,p);M.length=0;for(let _=0;_<n;_++){let te=y[_],m=te.length;if(!m)continue;let x=0,L=m;while(x<L){let F=x+L>>>1,u=d[te[F]];if(u.y+u.size<=T)x=F+1;else L=F}for(let F=x;F<m;F++){let u=d[te[F]];if(u.y>=p)break;M.push(u)}}return M},S=(d,T,p)=>{M.length=0;for(let _ of d)if(_.y+_.size>T&&_.y<p)M.push(_);return M};return{get columns(){return n},get gap(){return o},get containerSize(){return i},update:(d)=>{let T=!1;if(d.columns!==void 0){let p=Math.max(1,Math.floor(d.columns));if(p!==n)n=p,T=!0}if(d.gap!==void 0&&d.gap!==o)o=d.gap,T=!0;if(d.containerSize!==void 0&&d.containerSize!==i)i=d.containerSize,T=!0;if(d.crossOffset!==void 0&&d.crossOffset!==r)r=d.crossOffset,T=!0;if(d.mainOffset!==void 0&&d.mainOffset!==t)t=d.mainOffset,T=!0;if(T)A()},calculateLayout:W,getTotalSize:g,getVisibleItems:V}};var Rn=(e,n,o)=>{let i=Array.from(n).sort((s,a)=>s-a);if(i.length<=1)return;let r=[];for(let s=0;s<i.length;s++){let a=o(i[s]);if(a)r.push(a)}if(r.length<=1)return;let t=e.firstChild;for(let s=0;s<r.length;s++){let a=r[s];if(a===t)t=t.nextSibling;else e.insertBefore(a,t)}};var mo=(e=200)=>{let n=[];return{acquire:()=>{let t=n.pop();if(t)return t;let s=document.createElement("div");return s.setAttribute("role","option"),s},release:(t)=>{if(t.remove(),n.length<e)t.className="",t.textContent="",t.removeAttribute("style"),t.removeAttribute("data-index"),t.removeAttribute("data-id"),t.removeAttribute("data-lane"),n.push(t)},clear:()=>{n.length=0}}},fo=1,_n=(e,n,o,i=!1,r,t,s,a,A=()=>0)=>{let y=mo(),l=new Map,M=new Set,W=0,g="",V=-1,S=!1,I={selected:!1,focused:!1},d=(b,C)=>(I.selected=b,I.focused=C,I),T=`${o}-item ${o}-masonry-item`,p=`${o}-group-header`,_=`${o}-item--selected`,te=`${o}-item--focused`,m=(b,C)=>{if(typeof C==="string")b.innerHTML=C;else b.replaceChildren(C);Xe(b)},x=(b,C,w)=>{b.classList.toggle(_,C),b.classList.toggle(te,w)},L=(b,C)=>{let w=Math.round(C.y-E);if(i)b.style.transform=`translate(${w}px, ${Math.round(C.x)}px)`;else b.style.transform=`translate(${Math.round(C.x)}px, ${w}px)`},F=(b,C)=>{if(i)b.style.width=`${C.size}px`,b.style.height=`${C.crossSize}px`;else b.style.width=`${C.crossSize}px`,b.style.height=`${C.size}px`},u=(b,C,w,h,Q)=>{let f=y.acquire(),P=C.__groupHeader,Y=d(h,Q);if(f.className=P?p:T,f.dataset.index=String(b),f.dataset.id=String(C.id),f.dataset.lane=String(w.lane),P)f.setAttribute("role","presentation"),f.removeAttribute("aria-selected"),f.removeAttribute("aria-setsize"),f.removeAttribute("aria-posinset"),f.removeAttribute("id");else if(S){if(f.setAttribute("role","option"),f.ariaSelected=String(h),t)f.id=`${t}-item-${b}`;if(r){let ee=r();if(ee!==V)V=ee,g=String(ee);f.setAttribute("aria-setsize",g);let pe=s?s(b):b+1;f.setAttribute("aria-posinset",String(pe))}}else f.setAttribute("role","listitem"),f.removeAttribute("aria-selected"),f.removeAttribute("aria-setsize"),f.removeAttribute("aria-posinset"),f.removeAttribute("id");F(f,w);let G=n(C,b,Y);return m(f,G),x(f,h,Q),L(f,w),{element:f,lastItem:C,lastSelected:h,lastFocused:Q,lastY:w.y-E,absY:w.y,lastX:w.x,lastSize:w.size,lastCrossSize:w.crossSize,lastSeenFrame:W}},E=0,H=(b,C,w,h,Q=A())=>{if(E=Q,W++,S=typeof a==="function"?a():a===!0,S&&r){let P=r();if(P!==V){V=P,g=String(P);for(let Y of l.values())if(Y.element.getAttribute("role")==="option")Y.element.setAttribute("aria-setsize",g)}}M.clear();for(let P=0;P<C.length;P++)M.add(C[P].index);let f=null;for(let P=0;P<C.length;P++){let Y=C[P],G=Y.index,ee=b(G);if(!ee)continue;let pe=w.has(ee.id),be=G===h,O=l.get(G);if(O){let fe=O.lastItem!==ee,j=O.lastSelected!==pe,B=O.lastFocused!==be,D=O.lastY!==Y.y-E||O.lastX!==Y.x,se=O.lastSize!==Y.size||O.lastCrossSize!==Y.crossSize;if(fe){let Ie=d(pe,be),Z=n(ee,G,Ie);if(m(O.element,Z),O.element.dataset.id=String(ee.id),O.lastItem=ee,!ee.__groupHeader&&S){let ae=s?s(G):G+1;O.element.setAttribute("aria-posinset",String(ae))}}if(fe||j||B){if(x(O.element,pe,be),S)O.element.ariaSelected=String(pe);else O.element.removeAttribute("aria-selected");O.lastSelected=pe,O.lastFocused=be}if(se)F(O.element,Y),O.lastSize=Y.size,O.lastCrossSize=Y.crossSize;if(D)L(O.element,Y),O.lastY=Y.y-E,O.absY=Y.y,O.lastX=Y.x}else{let fe=u(G,ee,Y,pe,be);if(!f)f=document.createDocumentFragment();f.appendChild(fe.element),l.set(G,fe)}}if(f)e.appendChild(f);for(let[P,Y]of l)if(M.has(P))Y.lastSeenFrame=W;else if(W-Y.lastSeenFrame>fo)y.release(Y.element),l.delete(P);else{let G=Math.round(Y.absY-E);if(G!==Y.lastY){Y.lastY=G;let ee=Math.round(Y.lastX);Y.element.style.transform=i?`translate(${G}px, ${ee}px)`:`translate(${ee}px, ${G}px)`}}},R=()=>{for(let b of l.values())y.release(b.element);l.clear(),e.innerHTML=""};return{render:H,getElement:(b)=>l.get(b)?.element,updateItemClasses:(b,C,w)=>{let h=l.get(b);if(!h)return;let Q=h.lastSelected!==C,f=h.lastFocused!==w;if(Q||f)x(h.element,C,w),h.lastSelected=C,h.lastFocused=w},sortDOM:()=>{Rn(e,l.keys(),(b)=>l.get(b)?.element)},clear:R,destroy:()=>{R(),y.clear()}}};var go=100,po=new Set;function Gt(e){if(!e.columns||e.columns<1)throw Error("[vlist] masonry: columns must be >= 1");let n,o=null,i=0,r,t,s=0,a=null,A,y,l,M=[],W=-1,g=-1,V=!0,S=-1,I=-1,d=0,T=0,p=0,_=0,te={columnWidth:0,columns:0,gap:0,containerWidth:0},m=[],x=(k)=>P?P(k):m[k],L=null,F=null,u=!1,E=null;function H(){if(u||!a)return;u=!0,L=a.hooks.get("_getSelectedIds")??null,F=a.hooks.get("_getFocusedIndex")??null}function R(){if(E!==null)return E;if(!a)return!1;return E=a.dom.content.getAttribute("role")==="listbox",E}let ie=[],ce=new Int32Array(0),de=[],b=null,C=null,w=null,h=null,Q=!1,f=!0,P=null,Y=!1;function G(){if(Y||!a)return;if(P=a.hooks.get("_getLoadedItem")??null,P)Y=!0}function ee(){if(Q||!a)return;if(b=a.hooks.get("_getItemLane")??null,C=a.hooks.get("_getItemY")??null,w=a.hooks.get("_getItemH")??null,h=a.hooks.get("_isGroupHeader")??null,b||h)Q=!0}function pe(){ee();let k=n.columns,ae=!!b;if(ae){let J=r.totalItems;ie=Array(k);for(let ne=0;ne<k;ne++)ie[ne]=[];if(ce.length<J)ce=new Int32Array(J);for(let ne=0;ne<J;ne++){if(h?.(ne))continue;let z=b(ne);if(z<0||z>=k)continue;ce[ne]=ie[z].length,ie[z].push(ne)}}else{let J=M.length;ie=Array(k);for(let ne=0;ne<k;ne++)ie[ne]=[];if(ce.length<J)ce=new Int32Array(J);for(let ne=0;ne<J;ne++){let z=M[ne];ce[ne]=ie[z.lane].length,ie[z.lane].push(ne)}}de=Array(k);for(let J=0;J<k;J++){let ne=ie[J],z=new Float64Array(ne.length);for(let N=0;N<ne.length;N++){let le=ne[N];if(ae&&C&&w){let c=C(le),re=w(le);z[N]=c>=0?c+(re>0?re*0.5:0):0}else{let c=M[le];z[N]=c.y+c.size*0.5}}de[J]=z}}function be(k,ae){let J=k.length;if(!J)return-1;let ne=0,z=J-1;while(ne<z){let N=ne+z>>1;if(k[N]<ae)ne=N+1;else z=N}if(ne>0&&Math.abs(k[ne-1]-ae)<=Math.abs(k[ne]-ae))return ne-1;return ne}function O(k,ae,J){if(f)pe(),f=!1;let ne=!!b,z,N;if(ne){if(h?.(k))return k;if(z=b(k),z<0)return k;N=ce[k]}else{let q=M[k];if(!q)return k;z=q.lane,N=ce[k]}let le=n.columns,c=ie[z];switch(A?ae==="ArrowDown"?"ArrowRight":ae==="ArrowUp"?"ArrowLeft":ae==="ArrowRight"?"ArrowDown":ae==="ArrowLeft"?"ArrowUp":ae:ae){case"ArrowDown":if(N+1<c.length)return c[N+1];return k;case"ArrowUp":if(N>0)return c[N-1];return k;case"ArrowRight":{if(z>=le-1)return k;let q=z+1,K=ie[q];if(!K.length)return k;let he=be(de[q],de[z]?.[N]??0);return he>=0?K[he]:k}case"ArrowLeft":{if(z<=0)return k;let q=z-1,K=ie[q];if(!K.length)return k;let he=be(de[q],de[z]?.[N]??0);return he>=0?K[he]:k}case"Home":return 0;case"End":{let q=ie[le-1];return q.length>0?q[q.length-1]:k}case"PageDown":{let q=r.containerSize,K=ne?null:M[k],he=K&&K.size>0?K.size:150,U=Math.max(1,Math.floor(q/he)),X=Math.min(N+U,c.length-1);return c[X]}case"PageUp":{let q=r.containerSize,K=ne?null:M[k],he=K&&K.size>0?K.size:150,U=Math.max(1,Math.floor(q/he)),X=Math.max(0,N-U);return c[X]}}return k}let fe=null;function j(){if(e.size)return(k)=>e.size(k,te);if(fe!==null&&typeof fe==="function")return(k)=>fe(k,te);return(k)=>a.sizes.cache.getSize(k)}function B(){let k=n.columns,ae=n.gap;te.containerWidth=n.containerSize,te.columns=k,te.gap=ae,te.columnWidth=Math.max(0,(n.containerSize-(k-1)*ae)/k)}function D(){if(!a)return;B();let k=r.totalItems;M=n.calculateLayout(k,j()),S=k,f=!0,se()}function se(){if(!a)return;let k=n.getTotalSize(M)+_;if(k===I)return;I=k,a.render.contentSize(k)}function Ie(){if(r.destroyed||!a||!o)return;if(r.totalItems!==S)D();if(V)I=-1,se();H(),G();let k=t.getRenderOrigin(),ae=t.getPixelEquivalent(),J=r.containerSize;if(!V&&ae===W&&J===g&&k===s)return;if(W=ae,g=J,V=!1,J<=0||M.length===0)return;let ne=Math.max(0,ae-l),z=ae+J+l,N=n.getVisibleItems(M,ne,z),le=L?.()??po,c=F?.()??-1;m=a.items.all(),o.render(x,N,le,c,k),s=k;let re=N.length,q=re>0?N[0].index:0,K=re>0?N[re-1].index:0;r.prevRangeStart=q,r.prevRangeEnd=K,r.renderPending=!1;let he=Math.min(re,r.capacity);r.visibleCount=he,r.startIndex=q;for(let U=0;U<he;U++){let X=N[U];r.visibleIndices[U]=X.index,r.visibleOffsets[U]=X.y,r.visibleSizes[U]=X.size}}function Z(){if(r.destroyed)return;I=-1,D(),r.prevRangeStart=-1,r.prevRangeEnd=-1,r.renderPending=!0,V=!0,Ie()}return{name:"masonry",priority:10,conflicts:["grid","table"],validateConfig(k){if(k.reverse)throw Error("[vlist] masonry: cannot be combined with reverse mode")},setup(k){i++,t=k.scroll,a=k,r=k.getState(),fe=k.sizes.rawSpec,A=k.config.axis.primary==="x",y=k.config.classPrefix,l=k.config.overscan*go,d=k.config.crossAxisPadding,T=k.config.crossPadStart,p=k.config.startPadding,_=k.config.endPadding;let ae=r.crossSize-d;n=kn({columns:e.columns,gap:e.gap??0,containerSize:ae,crossOffset:T,mainOffset:p}),o=_n(k.dom.content,k.template,y,A,()=>r.totalItems,y,void 0,R,t.getRenderOrigin),k.dom.root.classList.add(`${y}--masonry`);let J=Tt(k);k.render.setFn(Ie,Z),D(),k.hooks.method("getMasonryLayout",()=>n),k.hooks.method("updateMasonry",(z)=>{if(z.columns!==void 0&&z.columns<1)throw Error("[vlist] updateMasonry: columns must be >= 1");if(z.gap!==void 0&&z.gap<0)throw Error("[vlist] updateMasonry: gap must be >= 0");let N={};if(z.columns!==void 0)N.columns=z.columns;if(z.gap!==void 0)N.gap=z.gap;n.update(N),o?.clear(),Z()}),k.scroll.setToIndexFn((z,N,le,c,re)=>{let q=M[z];if(!q)return!1;let K=r.containerSize,he=n.getTotalSize(M)+_,U=Math.max(0,he-K),X=J(),me=q.y-X.start;if(N==="center")me=q.y-X.start-(K-X.start-X.end-q.size)/2;else if(N==="end"){if(me=q.y-K+q.size+X.end,z>=r.totalItems-1&&q.y+q.size>U)me=U+X.end}let Le=X.start>0?-X.start:0;me=Math.max(Le,Math.min(me,U+X.end)),rt(k.scroll,me,le,c,re)}),k.hooks.method("_scrollItemIntoView",(z)=>{let N=M[z];if(!N)return;let le=t.getPixelEquivalent(),c=r.containerSize,re=n.getTotalSize(M)+_,q=Math.max(0,re-c),K=J(),he=p+K.start,U=_+K.end,X=N.y,me=X+N.size,Le=K.start>0?-K.start:0;if(X-he<le)k.scroll.to(Math.max(Le,X-he));else if(me+U>le+c){let Ce=ie[n.columns-1];if(Ce&&Ce.length>0&&z===Ce[Ce.length-1]&&X>=q)k.scroll.to(q+K.end);else k.scroll.to(Math.min(me+U-c,q+K.end))}}),k.nav.set({total:()=>r.totalItems,navigate:O});let ne=o;k.hooks.onDestroy(()=>{if(i=Math.max(0,i-1),ne?.destroy(),o===ne)o=null;if(i===0)E=null;k.dom.root.classList.remove(`${y}--masonry`)})},hooks:{onResize(k,ae){if(!n||!a)return;let J=r.crossSize-d;if(Math.abs(J-n.containerSize)<1)return;n.update({containerSize:J}),o?.clear(),Z()},onIdle(){o?.sortDOM()}},destroy(){if(i>0)return;o?.destroy(),o=null,M=[],E=null,a=null}}}var ct={key:"",groupIndex:0,headerLayoutIndex:0,firstDataIndex:0,count:0},Bt=(e,n)=>{let o=0,i=e.length-1;while(o<i){let r=o+i+1>>>1;if(e[r].headerLayoutIndex<=n)o=r;else i=r-1}return o},Hn=(e,n)=>{let o=0,i=e.length-1;while(o<i){let r=o+i+1>>>1;if(e[r].firstDataIndex<=n)o=r;else i=r-1}return o},Vn=(e,n,o)=>{if(e===0)return[];let i=[],r=null,t=0,s=0;for(let a=0;a<e;a++){let A=o?.(a);if(!A)continue;let y=n(a,A);if(r===null)r=y,t=0;else if(y!==r){let l=a-t;i.push({key:r,groupIndex:i.length,headerLayoutIndex:s,firstDataIndex:t,count:l}),s=s+1+l,r=y,t=a}}if(r!==null)i.push({key:r,groupIndex:i.length,headerLayoutIndex:s,firstDataIndex:t,count:e-t});return i};var Fn=(e,n,o)=>{let i=Vn(e,n.getGroupForIndex,o),r=e+i.length,t=n.header?.height??n.header?.width??n.headerHeight,s=typeof t==="number"?(S)=>t:(S)=>{let I=i[S];if(!I)return 0;return t(I.key,S)},a={type:"header",group:ct},A={type:"item",dataIndex:0,group:ct};return{get totalEntries(){return r},get groupCount(){return i.length},get groups(){return i},getEntry:(S)=>{if(i.length===0)return A.dataIndex=S,A.group=ct,A;let I=Bt(i,S),d=i[I];if(S===d.headerLayoutIndex)return a.group=d,a;let T=S-d.headerLayoutIndex-1;return A.dataIndex=d.firstDataIndex+T,A.group=d,A},layoutToDataIndex:(S)=>{if(i.length===0)return S;let I=Bt(i,S),d=i[I];if(S===d.headerLayoutIndex)return-1;let T=S-d.headerLayoutIndex-1;return d.firstDataIndex+T},dataToLayoutIndex:(S)=>{if(i.length===0)return S;let I=Hn(i,S),d=i[I],T=S-d.firstDataIndex;return d.headerLayoutIndex+1+T},getGroupAtLayoutIndex:(S)=>{if(i.length===0)return ct;let I=Bt(i,S);return i[I]},getGroupAtDataIndex:(S)=>{if(i.length===0)return ct;let I=Hn(i,S);return i[I]},getHeaderHeight:s,rebuild:(S,I)=>{i=Vn(S,n.getGroupForIndex,I??o),r=S+i.length}}};var Nt=(e,n,o,i,r=0)=>{let t=o?"width":"height",s=document.createElement("div");return s.className=`${n}-sticky-header`,s.setAttribute("role","presentation"),s.setAttribute("aria-hidden","true"),s.style.cssText="z-index:5;pointer-events:none;overflow:hidden;"+(o?`position:absolute;top:0;bottom:0;left:${r||0}px`:`position:relative;top:${r||0}px`),s.style[t]=`${i}px`,e.insertBefore(s,e.firstChild),s},On=(e,n,o,i,r,t=!1,s=0,a,A)=>{let y=t?"width":"height",l=t?"height":"width",M=t?"X":"Y",W=(O,fe)=>{O.style[y]=`${fe}px`},g=a??Nt(e,r,t,0,s),V=()=>{let O=document.createElement("div");return O.className="sticky-group",O.style.position="absolute",O.style.willChange="transform",O.style[l]="100%",O},S=V(),I=V();g.append(S,I);let d=S,T=I,p=n.groups,_=[],te=[],m=[],x=0,L=()=>{p=n.groups,x=p.length,_=Array(x),te=Array(x),m=Array(x);for(let O=0;O<x;O++)_[O]=A?A(p[O].headerLayoutIndex):o.getOffset(p[O].headerLayoutIndex),te[O]=n.getHeaderHeight(O),m[O]=te[O]};L();let F=-1,u=0,E=0,H=-1,R=!1,ie=0,ce=!1,de=(O,fe)=>{i(O,fe);let j=te[fe];return W(O,j),j},b=(O)=>{O.replaceChildren(),O.style.transform=""},C=(O)=>{if(O===F)return;if(F=O,u=0,E=0,O<0||O>=x){b(d);return}u=de(d,O),E=m[O],W(g,u),d.style.transform=""},w=(O)=>{if(O===ie)return;ie=O;let fe=Math.round(O);d.style.transform=`translate${M}(${fe}px)`,T.style.transform=`translate${M}(${fe+u}px)`},h=()=>{ie=0,d.style.transform="",T.style.transform=""},Q=()=>{if(!ce)return;let O=d;d=T,T=O,F=H,u=F>=0?te[F]:0,E=F>=0?m[F]:0,W(g,u),b(T),H=-1,ce=!1,h()},f=()=>{if(!ce)return;b(T),H=-1,ce=!1,h()},P=!!a,Y=()=>{if(R)return;if(R=!0,P)g.style.visibility="";else g.style.display=""},G=()=>{if(!R)return;if(R=!1,P)g.style.visibility="hidden";else g.style.display="none";b(d),F=-1,u=0,E=0,f()},ee=(O)=>{if(x===0){if(ce)f();if(!R)Y();C(-1);return}if(O<_[0]){G();return}let fe=0,j=x-1;while(fe<j){let D=fe+j+1>>>1;if(_[D]+m[D]<=O)fe=D;else j=D-1}if(!R)Y();C(fe);let B=fe+1;if(B<x){let D=_[B]-O;if(D<=0&&D>-E){if(H!==B||!ce)H=B,de(T,B),ce=!0;let se=E>0?D/E*u:D;w(se)}else if(D<=-E){if(ce)Q()}else if(ce)f()}else if(ce)f()},pe=()=>{L();let O=F;if(F=-1,u=0,E=0,O>=0)C(O)},be=()=>{g.remove(),F=-1,u=0,E=0,H=-1,R=!1,ce=!1};if(!a)g.style.display="none";return{update:ee,refresh:pe,show:Y,hide:G,destroy:be}};var Qe={selected:!1,focused:!1};function Wt(e){if(!e.getGroupForIndex)throw Error("[vlist] groups: getGroupForIndex is required");let n=e.header?.height??e.header?.width??e.headerHeight;if(n==null||typeof n==="number"&&n<=0)throw Error("[vlist] groups: header height/width must be a positive number or function");let o=e.header?.template??e.headerTemplate;if(!o)throw Error("[vlist] groups: header.template is required");let i=o,r,t=null,s,a,A,y,l,M=null,W,g,V,S=null,I,d,T,p=null,_,te,m=null,x=null,L=0,F=0,u=0,E=0,H=0,R=!1,ie=null,ce=null,de=new Map,b=new Set,C=new Map,w=-1,h=-1,Q=0,f=!0,P=-1,Y=0,G=null,ee;function pe(){return r.totalEntries}function be(){let c=a.totalItems;if(c===P)return;let re=P>0;P=c,r.rebuild(c,S??V),ee(r.totalEntries),D();let q=fe?se():s.getTotalSize();if(M?.(q),t)t.refresh(),t.update(A.getPixelEquivalent());if(re)k();let K=m?.("_scrollbar:getInstance");if(K)K()?.updateBounds(q,a.containerSize)}let O=0,fe=null,j=null,B=null;function D(){if(L<=0){fe=null,j=null;return}O=((a.crossSize||l.clientWidth)-E-(L-1)*F)/L,fe=new Map;let q=r.totalEntries,K=Array(q),he=0;if(R){let U=ie??ce??((Te)=>s.getSize(Te)),X=new Float64Array(L),me=[],Le=0,Ce=-1;for(let Te=0;Te<q;Te++){let Pe=r.getEntry(Te);if(Pe.type==="header"){let Re=0;for(let xe=0;xe<L;xe++)if(X[xe]>Re)Re=X[xe];if(Ce>=0)me[Ce]=Le+Re;Le+=Re;let ve=s.getSize(Te);fe.set(Te,{col:-1,rowY:Le}),K[he++]=[Te,Le,Le+ve],Le+=ve,X.fill(0),Ce=Pe.group.groupIndex}else{let Re=0,ve=X[0];for(let ye=1;ye<L;ye++)if(X[ye]<ve)ve=X[ye],Re=ye;let xe=U(Pe.dataIndex),_e=Le+X[Re];fe.set(Te,{col:Re,rowY:_e,h:xe}),K[he++]=[Te,_e,_e+xe],X[Re]=X[Re]+xe+F}}if(Ce>=0){let Te=0;for(let Pe=0;Pe<L;Pe++)if(X[Pe]>Te)Te=X[Pe];me[Ce]=Le+Te}B=me}else{B=null;let U=0,X=0,me=0;for(let Le=0;Le<q;Le++)if(r.getEntry(Le).type==="header"){if(X>0&&me>0)U+=me;let Te=s.getSize(Le);fe.set(Le,{col:-1,rowY:U}),K[he++]=[Le,U,U+Te],U+=Te,X=0,me=0}else{let Te=X%L,Pe=s.getSize(Le);if(Te===0){if(X>0&&me>0)U+=me+F;me=Pe}else if(Pe>me)me=Pe;fe.set(Le,{col:Te,rowY:U}),K[he++]=[Le,U,U+Pe],X++}}K.length=he,j=K}function se(){if(!fe||fe.size===0)return s.getTotalSize();let c=r.totalEntries;if(R)return B?.[B.length-1]??0;let re=0;for(let q=c-1;q>=0;q--){let K=fe.get(q);if(K){re=K.rowY+(K.h??s.getSize(q));break}if(r.getEntry(q).type==="header"){re=s.getOffset(q)+s.getSize(q);break}}return re}function Ie(c,re){if(fe){let K=fe.get(c);if(K){let he=K.col<0?0:u+K.col*(O+F),U=K.rowY-re;if(I)return`translate(${Math.round(U)}px, ${Math.round(he)}px)`;return`translate(${Math.round(he)}px, ${Math.round(U)}px)`}}let q=s.getOffset(c)-re;if(I)return`translate(${Math.round(q)}px, 0)`;return`translate(0, ${Math.round(q)}px)`}function Z(c,re){let q=fe?.get(re);if(q){let he=q.h??s.getSize(re);if(q.col<0)if(I)c.style.width=`${he}px`,c.style.height="";else c.style.height=`${he}px`,c.style.width="100%";else if(I)c.style.width=`${he}px`,c.style.height=`${O}px`;else c.style.height=`${he}px`,c.style.width=`${O}px`;return}let K=s.getSize(re);if(I)c.style.width=`${K}px`;else c.style.height=`${K}px`}function k(){de.forEach((c)=>{c.remove();let re=c.getAttribute("data-id");if(re)C.set(re,c);else y.release(c)}),de.clear(),b.clear()}function ae(){if(C.size>0)C.forEach((c)=>y.release(c)),C.clear()}function J(c,re,q,K){if(x===null)x=l.getAttribute("role")==="listbox";if(re.type==="header"){let Ce=`__group_header_${re.group.groupIndex}`;if(c.getAttribute("data-id")===Ce)return!0;if(c.className=te,c.setAttribute("role","presentation"),c.removeAttribute("aria-selected"),c.setAttribute("data-id",Ce),I&&t&&re.group.groupIndex===0)c.style.display="none";else{c.style.display="";let Te=i(re.group.key,re.group.groupIndex);if(typeof Te==="string")c.innerHTML=Te;else c.innerHTML="",c.appendChild(Te)}return!0}let he=re.dataIndex,U=V(he);if(!U)return c.innerHTML="",!1;let X=U._isPlaceholder===!0,me=String(U.id);if(!X&&c.getAttribute("data-id")===me){if(x)c.id=`${d}-item-${K}`,c.setAttribute("aria-posinset",String(he+1)),c.setAttribute("aria-setsize",String(a.totalItems));return!0}if(c.className=_,c.setAttribute("role",x?"option":"listitem"),c.setAttribute("data-id",me),x)c.id=`${d}-item-${K}`,c.setAttribute("aria-posinset",String(he+1)),c.setAttribute("aria-setsize",String(a.totalItems));if(X)c.classList.add(`${d}-item--placeholder`);if(q)q(K,Qe);else Qe.selected=!1,Qe.focused=!1;let Le=g(U,he,Qe);if(typeof Le==="string")c.innerHTML=Le;else c.innerHTML="",c.appendChild(Le);return Xe(c),!X}let ne=0;function z(){if(L<=0)return;let c=a.crossSize;if(c===ne)return;ne=c,D();let re=se();if(M?.(re),t)t.refresh(),t.update(A.getPixelEquivalent());f=!0}function N(){if(a.destroyed)return;be(),z();let c=A.getPixelEquivalent(),re=a.containerSize,q=A.getRenderOrigin(),K=q!==Q;if(!f&&c===w&&re===h&&!K)return;w=c,h=re;let he=f;f=!1;let U=pe();if(re<=0||U===0){if(de.size>0)de.forEach((ye)=>{ye.remove(),y.release(ye)}),de.clear(),b.clear();return}let X,me;if(j){let ye=j,Se=ye.length,Me=0,Ae=Se-1;while(Me<Ae){let He=Me+Ae>>>1;if(ye[He][2]<=c)Me=He+1;else Ae=He}let Oe=Me;Ae=Se-1;while(Me<Ae){let He=Me+Ae+1>>>1;if(ye[He][1]>=c+re)Ae=He-1;else Me=He}let Ge=Me,Fe=ye[Oe][0],qe=ye[Ge][0];for(let He=Fe-1;He>=0;He--)if(r.getEntry(He).type==="header"){Fe=He;break}let Ne=T*L;X=Math.max(0,Fe-Ne),me=Math.min(U-1,qe+Ne)}else{let ye=s.indexAtOffset(c),Se=s.indexAtOffset(c+re);if(Se<U-1)Se++;ye=Math.max(0,ye),Se=Math.min(U-1,Math.max(0,Se)),X=Math.max(0,ye-T),me=Math.min(U-1,Se+T)}if(X===a.prevRangeStart&&me===a.prevRangeEnd&&!a.renderPending&&!K)return;Q=q,de.forEach((ye,Se)=>{if(Se<X||Se>me)ye.remove(),y.release(ye),de.delete(Se),b.delete(Se)});let Le=p?.()??null,Ce=Le?`${d}-item--selected`:"",Te=Le?`${d}-item--focused`:"",Pe=null;for(let ye=X;ye<=me;ye++){let Se=de.get(ye),Me=!1;if(Se===void 0){let Ae=r.getEntry(ye);Me=Ae.type==="header";let Oe;if(Ae.type==="header")Oe=`__group_header_${Ae.group.groupIndex}`;else{let Fe=V(Ae.dataIndex);if(Fe&&Fe._isPlaceholder!==!0)Oe=String(Fe.id)}if(Oe!==void 0){let Fe=C.get(Oe);if(Fe)C.delete(Oe),Se=Fe}if(!Se)Se=y.acquire();if(Se.setAttribute("data-index",String(ye)),J(Se,Ae,Le,ye))b.delete(ye);else b.add(ye);if(Z(Se,ye),Se.style.transform=Ie(ye,q),de.set(ye,Se),!Pe)Pe=document.createDocumentFragment();Pe.appendChild(Se)}else if(he&&b.has(ye)){let Ae=r.getEntry(ye);if(Ae.type==="item")if(J(Se,Ae,Le,ye))b.delete(ye);else b.add(ye)}else if(Me=Se.classList.contains(te),he)Z(Se,ye),Se.style.transform=Ie(ye,q);else if(K)Se.style.transform=Ie(ye,q);if(!Me&&Le)if(Le(ye,Qe),Se.classList.toggle(Ce,Qe.selected),Se.classList.toggle(Te,Qe.focused),Qe.selected)Se.setAttribute("aria-selected","true");else Se.removeAttribute("aria-selected")}if(Pe)l.appendChild(Pe);ae();let Re=fe?se():s.getTotalSize();M?.(Re),a.prevRangeStart=X,a.prevRangeEnd=me,a.renderPending=!1;let ve=0,xe=0,_e=!1;for(let ye=X;ye<=me&&ve<a.capacity;ye++){let Se=r.getEntry(ye);if(Se.type==="item"){if(!_e)xe=Se.dataIndex,_e=!0;a.visibleIndices[ve]=Se.dataIndex,a.visibleOffsets[ve]=s.getOffset(ye),a.visibleSizes[ve]=s.getSize(ye),ve++}}a.visibleCount=ve,a.startIndex=xe}function le(){if(a.destroyed)return;z();let c=G?.()??0;if(c!==Y){Y=c;let re=r.groups,q=re.length;r.rebuild(P,S??V);let K=r.groups,he=K.length!==q;if(!he){for(let U=0;U<q;U++)if(K[U].headerLayoutIndex!==re[U].headerLayoutIndex){he=!0;break}}if(he){ee(r.totalEntries),D();let U=fe?se():s.getTotalSize();if(M?.(U),t)t.refresh(),t.update(A.getPixelEquivalent());let X=1/0,me=Math.min(q,K.length);for(let Ce=0;Ce<me;Ce++)if(K[Ce].headerLayoutIndex!==re[Ce].headerLayoutIndex){X=Math.min(K[Ce].headerLayoutIndex,re[Ce].headerLayoutIndex);break}if(K.length>q&&me<K.length)X=Math.min(X,K[me].headerLayoutIndex);else if(q>K.length&&me<q)X=Math.min(X,re[me].headerLayoutIndex);if(X<=a.prevRangeEnd)k();let Le=m?.("_scrollbar:getInstance");if(Le)Le()?.updateBounds(U,a.containerSize)}}a.prevRangeStart=-1,a.prevRangeEnd=-1,a.renderPending=!0,f=!0,N()}return{name:"groups",priority:11,setup(c){A=c.scroll,s=c.sizes.cache,a=c.getState(),y=c.pool,l=c.dom.content,M=c.render.contentSize.bind(c),W=c.dom.root,g=c.template,I=c.config.axis.primary==="x",d=c.config.classPrefix,T=c.config.overscan,H=c.config.mainAxisPadding,V=c.items.at.bind(c),p=()=>c.render.getStateFn(),m=c.hooks.get.bind(c),x=null,_=`${d}-item`,te=`${d}-group-header`;let re=m?.("getGridLayout"),q=m?.("getMasonryLayout");if(re){let ve=re();L=ve.columns,F=ve.gap,u=c.config.crossPadStart,E=c.config.crossAxisPadding}else if(q){let ve=q();L=ve.columns,F=ve.gap,u=c.config.crossPadStart,E=c.config.crossAxisPadding,R=!0;let xe=c.sizes.rawSpec;if(typeof xe==="function")ie=(_e)=>xe(_e,{columnWidth:O})}queueMicrotask(()=>{let ve=m?.("_getLoadedItem");if(ve)S=ve;let xe=m?.("_getLoadedCount");if(xe)G=xe});let K=a.totalItems;r=Fn(K,e,S??V),P=K;let he=typeof n==="number"?(ve)=>n:(ve)=>{let xe=r.groups[ve];if(!xe)return 0;return n(xe.key,ve)},U=s.getSize;ce=U;let X=(ve)=>{let xe=r.getEntry(ve);if(xe.type==="header"){if(e.sticky!==!1&&xe.group.groupIndex===0)return 0;return he(xe.group.groupIndex)}return U(xe.dataIndex)};c.sizes.setConfig(X,c.config.gap);let me=!1,Le=-1;if(c.hooks.method("_setSizeCacheBase",(ve)=>{ee=ve}),ee=s.rebuild,s.rebuild=(ve)=>{if(me){if(!G)G=m?.("_getLoadedCount")??null;let xe=G?.()??0;if(ve!==P||xe!==Le){if(P=ve,Le=xe,!S)S=m?.("_getLoadedItem")??null;if(r.rebuild(ve,S??((_e)=>c.items.all()[_e])),a.totalItems=r.totalEntries,t)t.refresh(),t.update(A.getPixelEquivalent())}}ee(r.totalEntries)},s.rebuild(r.totalEntries),D(),c.items.setTotalFn(()=>r.totalEntries-r.groupCount),W.classList.add(`${d}--grouped`),e.sticky!==!1){let ve=(Se,Me)=>{let Ae=r.groups[Me];if(!Ae)return;let Oe=i(Ae.key,Me);if(typeof Oe==="string")Se.innerHTML=Oe;else Se.replaceChildren(Oe)},xe=r.getHeaderHeight(0),_e=Nt(W,d,I,xe),ye=L>0?(Se)=>{let Me=fe?.get(Se);return Me?Me.rowY:s.getOffset(Se)}:void 0;if(t=On(W,r,s,ve,d,I,0,_e,ye),t.update(A.getPixelEquivalent()),!I)c.dom.viewport.style.height=`calc(100% - ${xe}px)`;else c.dom.viewport.style.width=`calc(100% - ${xe}px)`,c.dom.viewport.style.marginLeft=`${xe}px`}let Ce=!!m?.("_updateTableForGroups");if(me=Ce,Ce)a.totalItems=r.totalEntries,queueMicrotask(()=>{let ve=m?.("_getItem")??null,xe=c.items.all.bind(c),_e=(Se)=>{let Me=r.getEntry(Se);if(Me.type==="header")return{id:`__group_header_${Me.group.groupIndex}`,__groupHeader:!0,groupKey:Me.group.key,groupIndex:Me.group.groupIndex};return ve?ve(Me.dataIndex):xe()[Me.dataIndex]};c.items.setGetFn(_e),c.hooks.method("_getItemAtLayout",_e);let ye=m?.("_updateTableForGroups");if(ye)ye((Se)=>!!Se.__groupHeader,i);c.render.force()});else c.render.setFn(N,le);if(c.hooks.method("getGroupLayout",()=>r),c.hooks.method("_getTotal",()=>r.totalEntries-r.groupCount),c.hooks.method("_dataToLayoutIndex",(ve)=>r.dataToLayoutIndex(ve)),c.hooks.method("_layoutToDataIndex",(ve)=>r.layoutToDataIndex(ve)),!me)c.hooks.method("_getRenderedElement",(ve)=>de.get(ve)??null);c.hooks.method("_isGroupHeader",(ve)=>r.getEntry(ve).type==="header"),c.hooks.method("_getItemLane",(ve)=>{let xe=fe?.get(ve);return xe?xe.col:-1}),c.hooks.method("_getItemY",(ve)=>{let xe=fe?.get(ve);return xe?xe.rowY:-1}),c.hooks.method("_getItemH",(ve)=>fe?.get(ve)?.h??-1);let Te=c.config.startPadding,Pe=H-Te,Re=Tt(c);c.hooks.method("_scrollItemIntoView",(ve)=>{if(ve<0)return;let xe=fe?.get(ve),_e=xe?xe.rowY:s.getOffset(ve),ye=xe?.h??s.getSize(ve),Se=a.containerSize,Me=A.getPixelEquivalent(),Ae=Re(),Oe=Te+Ae.start,Ge=Pe+Ae.end,Fe=Ae.start>0?-Ae.start:0;if(_e<Me+Oe)c.scroll.to(Math.max(Fe,_e-Oe));else if(_e+ye+Ge>Me+Se)c.scroll.to(_e+ye+Ge-Se)}),c.scroll.setToIndexFn((ve,xe,_e,ye,Se)=>{let Me=r.dataToLayoutIndex(ve),Ae=r.totalEntries;if(Ae===0)return!1;let Oe=Math.max(0,Math.min(Me,Ae-1)),Ge=a.containerSize,Fe=fe?.get(Oe),qe=Fe?Fe.rowY:s.getOffset(Oe),Ne=Fe?Fe.h??s.getSize(Oe):s.getSize(Oe),He=fe?se()+H:s.getTotalSize(),ue=Math.max(0,He-Ge),Ee=Re(),we=(fe?H:0)+Ee.end,Ve=qe+Ne;if(R&&B){let Ye=r.getEntry(Oe).group.groupIndex,tt=B[Ye];if(tt!==void 0)Ve=tt}let ke;switch(xe){case"center":ke=qe-Ee.start-(Ge-Ee.start-Ee.end-Ne)/2;break;case"end":ke=Ve-Ge+we;break;default:ke=qe-Ee.start}let We=Ee.start>0?-Ee.start:0;ke=Math.max(We,Math.min(ke,ue+Ee.end)),rt(c.scroll,ke,_e,ye,Se)}),c.hooks.onDestroy(()=>{for(let[,ve]of de)ve.remove();if(de.clear(),b.clear(),t)t.destroy(),t=null;W.classList.remove(`${d}--grouped`)})},hooks:{onAfterScroll(c,re){if(t)t.update(c)},onResize(c,re){if(L<=0)return;ee(r.totalEntries),ne=a.crossSize,D();let q=se();if(M?.(q),t)t.refresh(),t.update(A.getPixelEquivalent());f=!0,N()}},destroy(){if(t)t.destroy(),t=null;de.clear(),b.clear(),C.clear()}}}function et(e,n,o,i){if(i<=0)return 0;let r=i-1;if(o<=1)return e<0?0:e>r?r:e;let t=(n%o+o)%o;if(e<0)return t;if(e>r){let s=Math.floor(r/o)*o;return Math.min(s+t,r)}return e}var Dn=(e,n,o)=>{if(String(o).startsWith(Ke))return!1;let i=Ke+n;if(e.has(i))return e.delete(i),e.add(o),!0;return!1},$n=(e)=>({selected:new Set(e??[]),focusedIndex:-1,focusVisible:!1});function it(e,n,o,i){if(o===0)return;let r=i?-n:n,t=Math.abs(r);if(t>1&&e.focusedIndex>=0){e.focusedIndex=et(e.focusedIndex+r,e.focusedIndex,t,o);return}let s=e.focusedIndex+r;if(s<0)s=0;if(s>=o)s=o-1;e.focusedIndex=s}function Lt(e){return Array.from(e)}var bo={preventScroll:!0};function Kt(e){let n=e?.mode??"single",o=e?.followFocus??!1,i=e?.focusOnClick??!1,r=e?.keyboard??!0,t,s,a,A,y,l,M,W,g=-1,V=new Map,S=null,I=null,d=null,T=null,p,_,te=!1;function m(f){if(te)return;te=!0,S=f.hooks.get("_layoutToDataIndex")??null,I=f.hooks.get("_dataToLayoutIndex")??null,d=f.hooks.get("_isGroupHeader")??null,T=f.hooks.get("_scrollItemIntoView")??null,L=f.hooks.get("_getLoadedItem")??null;let P=f.hooks.get("_getTotal");if(P)_=P;let Y=f.hooks.get("getGroupLayout");if(Y){let G=Y();p=()=>G.totalEntries}}let x=(f)=>S?S(f):f,L=null,F=(f)=>{if(L)return L(f);return s()[f]},u=(f)=>{let P=x(f);return P>=0?F(P):void 0},E=(f,P,Y)=>{if(!d)return f;let G=f;while(G>=0&&G<Y){if(!d(G))return G;G+=P}G=f-P;while(G>=0&&G<Y){if(!d(G))return G;G-=P}return f};function H(f,P){if(n==="single")t.selected.clear(),V.clear();if(t.selected.add(f),P)V.set(f,P)}function R(f,P){if(t.selected.has(f))t.selected.delete(f),V.delete(f);else H(f,P)}function ie(){t.selected.clear(),V.clear()}function ce(f){t.selected.delete(f),V.delete(f)}function de(f,P){let Y=Math.min(f,P),G=Math.max(f,P);for(let ee=Y;ee<=G;ee++){if(d?.(ee))continue;let pe=u(ee);if(pe)t.selected.add(pe.id),V.set(pe.id,pe);else if(L){let be=x(ee);if(be>=0)t.selected.add(Ke+be)}}}function b(){let f=p();for(let P=0;P<f;P++){if(d?.(P))continue;let Y=u(P);if(Y)t.selected.add(Y.id),V.set(Y.id,Y);else if(L){let G=x(P);if(G>=0)t.selected.add(Ke+G)}}}function C(){if(t.selected.size===0)return[];if(V.size>=t.selected.size){let G=[];for(let ee of t.selected){let pe=V.get(ee);if(pe)G.push(pe)}if(G.length===t.selected.size)return G}let f=[],P=new Set(t.selected),Y=p();for(let G=0;G<Y&&P.size>0;G++){if(d?.(G))continue;let ee=u(G);if(ee&&P.has(ee.id))f.push(ee),V.set(ee.id,ee),P.delete(ee.id)}return f}function w(){a(),A.emit("selection:change",{selected:Lt(t.selected),items:C()})}let h=null,Q=-1;return{name:"selection",priority:50,setup(f){t=$n(e?.initial),s=f.items.all.bind(f),a=f.render.force.bind(f),A=f.emitter,y=f.dom;let P=f.config;if(l=f.sizes.cache,M=f.getState(),W=f.scroll.to.bind(f),p=()=>M.totalItems,_=()=>M.totalItems,n==="none"){f.hooks.method("select",()=>{}),f.hooks.method("deselect",()=>{}),f.hooks.method("toggleSelect",()=>{}),f.hooks.method("selectAll",()=>{}),f.hooks.method("clearSelection",()=>{}),f.hooks.method("getSelected",()=>[]),f.hooks.method("getSelectedItems",()=>[]),f.hooks.method("selectNext",()=>{}),f.hooks.method("selectPrevious",()=>{}),f.hooks.method("_seedSelection",()=>{}),f.hooks.method("_getFocusedId",()=>{return}),f.hooks.method("_focusById",()=>{});return}f.dom.enableListbox();let Y=P.classPrefix;f.render.setStateFn((B,D)=>{if(m(f),t.selected.size>0){let se=x(B),Ie=se>=0?u(B):void 0,Z=Ie?.id;if(Z!==void 0)if(t.selected.has(Z))D.selected=!0;else if(Dn(t.selected,se,Z))D.selected=!0,V.delete(Ke+se),V.set(Z,Ie);else D.selected=!1;else D.selected=L!==null&&se>=0&&t.selected.has(Ke+se)}else D.selected=!1;D.focused=t.focusVisible&&t.focusedIndex===B}),f.hooks.method("_getSelectedIds",()=>t.selected),f.hooks.method("_getFocusedIndex",()=>t.focusVisible?t.focusedIndex:-1),y.root.classList.add(`${Y}--selectable`);let G=(B)=>{h=null,Q=-1;let D=B.target.closest("[data-index]");if(!D)return!1;let se=parseInt(D.dataset.index??"-1",10);if(se<0)return!1;if(d?.(se))return!1;if(x(se)<0)return!1;let Z=u(se);if(!Z)return!1;return h=Z,Q=se,!0},ee=0,pe=(B)=>{if(B<0)return;if(f.scroll.cancel(),T){T(B);return}if(!ee){let z=f.hooks.get("_getRowGap");ee=z?z():0}let D=f.nav.get(),se=D.scrollIndex?D.scrollIndex(B):B,Ie=l.getOffset(se),Z=l.getSize(se)-ee,k=M.containerSize,ae=f.scroll.getPixelEquivalent(),{startPadding:J,endPadding:ne}=P;if(Ie<ae)W(Ie);else if(J+Ie+Z+ne>ae+k)W(J+Ie+Z+ne-k)},be=(B)=>{let D=y.content.querySelectorAll(`[data-index="${B}"]`),se=null;for(let Ie=0;Ie<D.length;Ie++){let Z=D[Ie];if(Z.style.display!=="none"){se=Z;break}}if(!se&&D.length>0)se=D[0];y.content.setAttribute("aria-activedescendant",se?.id??`${Y}-item-${B}`)},O=()=>{if(M.destroyed)return;if(m(f),!y.content.matches(":focus-visible")&&!y.root.matches(":focus-visible"))return;let B=p();if(B===0)return;let D=t.focusedIndex>=0?Math.min(t.focusedIndex,B-1):0;D=E(D,1,B),t.focusedIndex=D,t.focusVisible=!0,be(D),pe(D),a()};y.root.addEventListener("focusin",O);let fe=(B)=>{if(M.destroyed)return;let D=B.relatedTarget;if(D&&y.root.contains(D))return;t.focusVisible=!1,a(),y.content.removeAttribute("aria-activedescendant")};if(y.root.addEventListener("focusout",fe),f.hooks.onDestroy(()=>{y.root.removeEventListener("focusin",O),y.root.removeEventListener("focusout",fe)}),f.hooks.onClick((B)=>{if(m(f),!G(B))return;if(n==="multiple"&&B.shiftKey&&t.focusedIndex>=0){let se=g>=0?g:t.focusedIndex,Ie=x(se),Z=x(Q);if(Ie>=0&&Z>=0)de(se,Q);t.focusedIndex=Q,t.focusVisible=i,g=Q,w();return}if(t.focusedIndex=Q,t.focusVisible=i,g=Q,(y.content.getAttribute("tabindex")!==null?y.content:y.root).focus(bo),n==="single")H(h.id,h);else R(h.id,h);w()}),r)f.hooks.onKeydown((B)=>{m(f);let D=p();if(D===0)return;let se=f.nav.get(),Ie=t.focusedIndex,Z=!1,k=!1;if(se.navigate&&(B.key==="ArrowUp"||B.key==="ArrowDown"||B.key==="ArrowLeft"||B.key==="ArrowRight"||B.key==="PageUp"||B.key==="PageDown"||B.key==="Home"||B.key==="End")){let J=se.total?se.total():D,ne=se.navigate(t.focusedIndex,B.key,J);if(ne!==t.focusedIndex)t.focusedIndex=Math.max(0,Math.min(ne,J-1));t.focusVisible=!0,Z=!0}else switch(B.key){case"ArrowUp":{let J=se.ud||1,ne=se.lr,z=P.axis.primary==="x";if(z&&!ne)break;it(t,-(z?ne:J),D,P.reverse),t.focusVisible=!0,Z=!0;break}case"ArrowDown":{let J=se.ud||1,ne=se.lr,z=P.axis.primary==="x";if(z&&!ne)break;it(t,z?ne:J,D,P.reverse),t.focusVisible=!0,Z=!0;break}case"ArrowLeft":{let J=se.ud||1,ne=se.lr,z=P.axis.primary==="x";if(!z&&!ne)break;it(t,-(z?J:ne),D,P.reverse),t.focusVisible=!0,Z=!0;break}case"ArrowRight":{let J=se.ud||1,ne=se.lr,z=P.axis.primary==="x";if(!z&&!ne)break;it(t,z?J:ne,D,P.reverse),t.focusVisible=!0,Z=!0;break}case"Home":if(D>0)t.focusedIndex=0;t.focusVisible=!0,Z=!0;break;case"End":if(D>0)t.focusedIndex=D-1;t.focusVisible=!0,Z=!0;break;case"PageUp":case"PageDown":{let J=se.ud||1,ne=Math.max(0,t.focusedIndex),z=se.scrollIndex?se.scrollIndex(ne):ne,N=l.getSize(z),le=M.containerSize,re=(N>0?Math.max(1,Math.floor(le/N)):10)*J;if(S&&I){let q=S(t.focusedIndex),K=B.key==="PageUp"?-re:re,he=_()-1;t.focusedIndex=I(et(q+K,q,J,he+1))}else{let q=B.key==="PageUp"?t.focusedIndex-re:t.focusedIndex+re;t.focusedIndex=et(q,t.focusedIndex,J,D)}t.focusVisible=!0,Z=!0;break}case" ":case"Enter":if(B.key===" "&&B.shiftKey&&n==="multiple"&&t.focusedIndex>=0){if(g>=0){let J=x(g),ne=x(t.focusedIndex);if(J>=0&&ne>=0)de(g,t.focusedIndex)}t.focusVisible=!0,k=!0,Z=!0;break}if(t.focusedIndex>=0){let J=u(t.focusedIndex);if(J)R(J.id,J),g=t.focusedIndex;t.focusVisible=!0,k=!0,Z=!0}break;case"a":if((B.ctrlKey||B.metaKey)&&n==="multiple"){if(t.selected.size===_())ie();else b();t.focusVisible=!0,k=!0,Z=!0}break;case"Delete":case"Backspace":if(t.selected.size>0)A.emit("delete",{selected:Lt(t.selected),items:C()}),Z=!0;break}if(t.focusedIndex!==Ie&&d){let J=t.focusedIndex>Ie?1:-1;t.focusedIndex=E(t.focusedIndex,J,D)}let ae=t.focusedIndex!==Ie;if(B.shiftKey&&n==="multiple"&&!k&&ae){if(B.key==="ArrowUp"||B.key==="ArrowDown"||B.key==="ArrowLeft"||B.key==="ArrowRight"){let z=u(t.focusedIndex);if(z)R(z.id,z);g=t.focusedIndex,k=!0}if((B.ctrlKey||B.metaKey)&&(B.key==="Home"||B.key==="End")){let z=Ie>=0?Ie:t.focusedIndex,N=x(z),le=x(t.focusedIndex);if(N>=0&&le>=0)de(z,t.focusedIndex);g=t.focusedIndex,k=!0}}if(o&&n==="single"&&!k&&ae&&t.focusedIndex>=0){let J=u(t.focusedIndex);if(J)H(J.id,J);k=!0}if(Z){if(B.preventDefault(),ae&&t.focusedIndex>=0){if(T||!se.navigate)pe(t.focusedIndex);be(t.focusedIndex)}if(k)w();else if(ae){if(a(),t.focusedIndex>=0){let J=u(t.focusedIndex);if(J)A.emit("focus:change",{id:J.id,index:t.focusedIndex})}}}});f.hooks.method("select",(...B)=>{for(let D of B)H(D);w()}),f.hooks.method("deselect",(...B)=>{for(let D of B)ce(D);w()}),f.hooks.method("toggleSelect",(B)=>{R(B),w()}),f.hooks.method("selectAll",()=>{if(n!=="multiple")return;m(f),b(),w()}),f.hooks.method("clearSelection",()=>{ie(),w()}),f.hooks.method("getSelected",()=>Lt(t.selected)),f.hooks.method("getSelectedItems",()=>C());let j=(B)=>{m(f);let D=f.nav.get(),se=D.total?D.total():p();if(se===0)return;if(it(t,B,se,P.reverse),d)t.focusedIndex=E(t.focusedIndex,B,se);let Ie=u(t.focusedIndex);if(Ie)H(Ie.id,Ie);if(t.focusedIndex>=0){if(D.reveal)D.reveal(t.focusedIndex);else pe(t.focusedIndex);be(t.focusedIndex)}w()};f.hooks.method("selectNext",()=>{j(1)}),f.hooks.method("selectPrevious",()=>{j(-1)}),f.hooks.method("_seedSelection",(B)=>{if(n==="single"){if(B.length===1)t.selected.add(B[0])}else for(let D of B)t.selected.add(D)}),f.hooks.method("_isFollowFocus",()=>o),f.hooks.method("_getFocusedId",()=>{if(t.focusedIndex<0)return;return u(t.focusedIndex)?.id}),f.hooks.method("_focusById",(B,D)=>{let se=p();for(let Ie=0;Ie<se;Ie++){if(d?.(Ie))continue;let Z=u(Ie);if(Z&&Z.id===B){if(t.focusedIndex=Ie,D!=="preserve")t.focusVisible=D===!0||i;if(t.focusVisible)be(Ie);else y.content.removeAttribute("aria-activedescendant");A.emit("focus:change",{id:B,index:Ie}),a();return}}})},destroy(){V.clear()}}}function Ct(e){let n=e?.keyboard??!0;return{name:"a11y",priority:55,setup(o){if(o.render.getStateFn())return;o.dom.enableListbox();let{dom:i,config:r}=o,t=o.sizes.cache,s=o.getState(),a=o.emitter,A=r.classPrefix,y=i.liveRegion,l=-1,M=!1,W,g=-1,V=(u)=>o.items.at(u),S=()=>s.totalItems,I={id:0,index:0},d={selected:[],items:[]};o.render.setStateFn((u,E)=>{E.selected=g===u,E.focused=M&&l===u}),o.hooks.method("_getFocusedIndex",()=>M?l:-1),o.hooks.method("_getFocusedId",()=>{if(l<0)return;return V(l)?.id}),o.hooks.method("_focusById",(u,E)=>{let H=S();for(let R=0;R<H;R++){let ie=V(R);if(!ie||ie.id!==u)continue;if(l=R,E!=="preserve")M=E===!0;if(M)i.content.setAttribute("aria-activedescendant",`${A}-item-${R}`);else i.content.removeAttribute("aria-activedescendant");I.id=u,I.index=R,a.emit("focus:change",I),o.render.force();return}});function T(u){y.textContent="",y.textContent=u}let p=(u,E,H)=>{let R=u;while(R>=0&&R<H){let ie=V(R);if(!ie||!ie.__groupHeader)return R;R+=E}R=u-E;while(R>=0&&R<H){let ie=V(R);if(!ie||!ie.__groupHeader)return R;R-=E}return u},_=(u)=>{let E=o.nav.get();if(E.reveal){E.reveal(u);return}let H=o.hooks.get("_scrollItemIntoView");if(H){o.scroll.cancel(),H(u);return}let R=E.scrollIndex?E.scrollIndex(u):u,ie=t.getOffset(R),ce=t.getSize(R),de=o.scroll.getPixelEquivalent(),b=s.containerSize,{startPadding:C,endPadding:w}=r,h=ie+C,Q=h+ce,f=de;if(h<de)f=Math.max(0,ie);else if(Q>de+b)f=Q+w-b;if(f!==de)o.scroll.setPixelEquivalent(f)},te=(u,E)=>{if(i.content.setAttribute("aria-activedescendant",`${A}-item-${u}`),E)_(u);o.render.force()},m=(u)=>{l=u,M=!0,te(u,!0);let E=V(u);if(E)I.id=E.id,I.index=u,a.emit("focus:change",I),T(`Item ${u+1} of ${S()}`)},x=(u,E)=>{if(l=u,E)M=!0;let H=V(u);if(H&&W===H.id)W=void 0,g=-1;else W=H?.id,g=H?u:-1;if(te(u,E),W!==void 0&&H&&W===H.id)d.selected[0]=W,d.selected.length=1,d.items[0]=H,d.items.length=1,T(`Selected, item ${u+1} of ${S()}`);else d.selected.length=0,d.items.length=0,T("Deselected");a.emit("selection:change",d)},L=()=>{if(s.destroyed)return;if(!i.content.matches(":focus-visible"))return;let u=S();if(u===0)return;let E=l>=0?Math.min(l,u-1):0;E=p(E,1,u),m(E)},F=(u)=>{if(s.destroyed)return;let E=u.relatedTarget;if(E&&i.root.contains(E))return;M=!1,i.content.removeAttribute("aria-activedescendant"),o.render.force()};if(i.content.addEventListener("focusin",L),i.content.addEventListener("focusout",F),n)o.hooks.onKeydown((u)=>{if(s.destroyed)return;let E=S();if(E===0)return;let H=l,R=H;if(u.key===" "||u.key==="Enter"){if(H>=0){let ce=V(H);if(ce&&!ce.__groupHeader)x(H,!0)}u.preventDefault();return}let ie=o.nav.get();if(ie.navigate)switch(u.key){case"ArrowUp":case"ArrowDown":case"ArrowLeft":case"ArrowRight":case"PageUp":case"PageDown":case"Home":case"End":R=ie.navigate(H,u.key,E);break;default:return}else{let ce=ie.ud||1,de=ie.lr,b=r.axis.primary==="x",C=(w)=>Math.abs(w)>1&&H>=0?et(H+w,H,Math.abs(w),E):H+w;switch(u.key){case"ArrowUp":if(b&&!de)return;R=C(-(b?de:ce));break;case"ArrowDown":if(b&&!de)return;R=C(b?de:ce);break;case"ArrowLeft":if(!b&&!de)return;R=C(-(b?ce:de));break;case"ArrowRight":if(!b&&!de)return;R=C(b?ce:de);break;case"PageUp":case"PageDown":{let w=t.getSize(Math.max(0,ie.scrollIndex?ie.scrollIndex(H):H)),Q=Math.max(1,Math.floor(s.containerSize/w))*ce;R=et(u.key==="PageUp"?H-Q:H+Q,H,ce,E);break}case"Home":R=0;break;case"End":R=E-1;break;default:return}}if(R<0)R=0;else if(R>=E)R=E-1;if(u.preventDefault(),R=p(R,R>=H?1:-1,E),R!==H)m(R)});o.hooks.onClick((u)=>{if(s.destroyed)return;let E=u.target.closest("[data-index]");if(!E)return;let H=parseInt(E.dataset.index??"-1",10);if(H<0)return;let R=V(H);if(!R||R.__groupHeader)return;M=!1,i.content.focus({preventScroll:!0}),x(H,!1)}),o.hooks.onDestroy(()=>{i.content.removeEventListener("focusin",L),i.content.removeEventListener("focusout",F)})}}}var ho=0,vo=1000,yo=15,So=!0,Io=16,To=!0,mt=2,xo="scroll",Lo=350,Co=12,Eo=(e)=>{if(typeof e!=="object"){let n=e??mt;return{top:n,right:n,bottom:n,left:n}}return{top:e.top??mt,right:e.right??mt,bottom:e.bottom??mt,left:e.left??mt}},Gn=(e,n,o={},i="vlist",r=!1,t,s,a)=>{let A=navigator.userAgentData?.platform||navigator.platform+navigator.userAgent,y=o.platform?o.platform==="windows":!/Mac|Android/i.test(A),{autoHide:l=!y,autoHideDelay:M=vo,minThumbSize:W=yo,showOnHover:g=So,showOnViewportEnter:V=To,clickBehavior:S=xo}=o,I=S==="page"?"scroll":S,d=t??e,T=Eo(o.padding),p=r?T.left:T.top,_=r?T.right:T.bottom,te=r?T.bottom:T.right,m=o.hoverZoneWidth??te+Io,x=!0,L=0,F=0,u=0,E=0,H=!1,R=!1,ie=0,ce=0,de=0,b=null,C=!1,w=null,h=null,Q=-1,f=-1,P=-1,Y=-1,G=-1,ee=e.id?"":(()=>{let ue;do ue=`${i}-scrollport-${++ho}`;while(document.getElementById(ue));return e.id=ue,ue})(),pe=0,be=0,O=null,fe=null,j=null,B=r?"width":"height",D=r?"translateX":"translateY",se=r?(ue)=>ue.clientX:(ue)=>ue.clientY,Ie=r?"left":"top",Z=document.createElement("div"),k=document.createElement("div"),ae=document.createElement("div"),J=r?"--vlist-custom-scrollbar-padding-left":"--vlist-custom-scrollbar-padding-top",ne=()=>{if(d===e)return;let ue=e.offsetTop;Z.style[r?"left":"top"]=ue?`calc(var(${J}) + ${ue}px)`:`var(${J})`,ae.style[r?"left":"top"]=`${ue}px`},z=()=>{if(Z.className=`${i}-scrollbar`,Z.setAttribute("role","scrollbar"),Z.setAttribute("aria-controls",e.id),Z.setAttribute("aria-orientation",r?"horizontal":"vertical"),Z.setAttribute("aria-label",e.getAttribute("aria-label")||"Scroll"),Z.setAttribute("aria-valuemin","0"),Z.tabIndex=0,k.className=`${i}-scrollbar__thumb`,r)Z.classList.add(`${i}-scrollbar--horizontal`);if(o.padding!==void 0)d.style.setProperty("--vlist-custom-scrollbar-padding-top",`${T.top}px`),d.style.setProperty("--vlist-custom-scrollbar-padding-right",`${T.right}px`),d.style.setProperty("--vlist-custom-scrollbar-padding-bottom",`${T.bottom}px`),d.style.setProperty("--vlist-custom-scrollbar-padding-left",`${T.left}px`);if(o.minThumbSize!==void 0)Z.style.setProperty("--vlist-custom-scrollbar-min-thumb-size",`${W}px`);if(Z.appendChild(k),d.appendChild(Z),ae.className=`${i}-scrollbar__hover`,r)ae.classList.add(`${i}-scrollbar__hover--horizontal`),ae.style.height=`${m}px`;else ae.style.width=`${m}px`;if(d.appendChild(ae),d!==e)ne()},N=()=>{if(b)clearTimeout(b),b=null},le=()=>{if(!l)return;N(),b=setTimeout(re,M)},c=()=>{if(!x||L<=F)return;if(N(),!C)Z.classList.add(`${i}-scrollbar--visible`),C=!0;if(l&&!H&&!R&&document.activeElement!==Z)le()},re=()=>{if(H||R||document.activeElement===Z)return;Z.classList.remove(`${i}-scrollbar--visible`),C=!1},q=(ue,Ee)=>{if(L=ue,F=Ee,ne(),K(de),!x||L<=F){Z.style.display="none",Z.classList.remove(`${i}-scrollbar--visible`),C=!1;return}Z.style.display="";let we=Math.max(0,F-p-_),Ve=F/L;if(u=Math.max(W,Ve*we),k.style[B]=`${u}px`,E=we-u,K(de),!l)c()},K=(ue)=>{let Ee=Math.max(0,L-F);if(de=Math.max(0,Math.min(ue,Ee)),Q!==Ee)Q=Ee,Z.setAttribute("aria-valuemax",String(Ee));if(f!==de)f=de,Z.setAttribute("aria-valuenow",String(de));let we=s?.(),Ve=we?.getTotal()??0,ke=Ve?we.indexAtOffset(de)+1:0;if(ke!==P||Ve!==Y)P=ke,Y=Ve,Z.setAttribute("aria-valuetext",`Row ${ke} of ${Ve}`);if(Ee<=0||E<=0)return;let We=de/Ee*E;if(We!==G)G=We,k.style.transform=`${D}(${We}px)`},he=(ue)=>{if(!x||ue.target!==Z||document.activeElement!==Z)return;if(ue.stopPropagation(),ue.altKey||ue.ctrlKey||ue.metaKey)return;let Ee=s?.(),we=Ee?.getSize(Ee.indexAtOffset(de))??40,Ve=de;switch(ue.key){case(r?"ArrowLeft":"ArrowUp"):Ve-=we;break;case(r?"ArrowRight":"ArrowDown"):Ve+=we;break;case"PageUp":Ve-=F;break;case"PageDown":Ve+=F;break;case"Home":Ve=0;break;case"End":Ve=L;break;default:return}ue.preventDefault(),n(Math.max(0,Math.min(Ve,Math.max(0,L-F)))),c()},U=(ue)=>{if(ue.target===k||I!=="jump"||E<=0)return;let Ee=L-F,we=Z.getBoundingClientRect(),Ve=se(ue)-we[Ie],ke=Math.max(0,Math.min(Ve-u/2,E));n(ke/E*Ee),c()},X=()=>{if(O!==null)clearTimeout(O),O=null;if(fe!==null)cancelAnimationFrame(fe),fe=null;j=null},me=(ue)=>{let Ee=E>0?be/ue*E:0;if(pe<Ee)return-1;if(pe>=Ee+u)return 1;return 0},Le=()=>{let ue=L-F,Ee=me(ue);if(Ee===0){X();return}if(Ee===-1){if(be<=0){X();return}let we=Math.max(0,be-F);be=we,n(we)}else{if(be>=ue){X();return}let we=Math.min(ue,be+F);be=we,n(we)}c()},Ce=(ue)=>{if(j===null){j=ue,fe=requestAnimationFrame(Ce);return}let Ee=L-F,we=ue-j;j=ue;let Ve=me(Ee);if(Ve===0){X();return}let ke=Co*F/1000,We=Math.min(ke*we,F);if(Ve===-1){if(be<=0){X();return}let Ye=Math.max(0,be-We);be=Ye,n(Ye)}else{if(be>=Ee){X();return}let Ye=Math.min(Ee,be+We);be=Ye,n(Ye)}N(),fe=requestAnimationFrame(Ce)},Te=(ue)=>{if(ue&&ue.pointerId!==w)return;let Ee=w,we=h;if(w=null,h=null,H=!1,Z.classList.remove(`${i}-scrollbar--dragging`),X(),Ee!==null&&we?.hasPointerCapture(Ee))we.releasePointerCapture(Ee);le()},Pe=(ue)=>{if(!x||ue.button!==0||w!==null||E<=0)return;if(ue.preventDefault(),ue.stopPropagation(),w=ue.pointerId,H=ue.target===k,h=H?k:ue.currentTarget,h.setPointerCapture(w),N(),H)ie=se(ue),ce=de,Z.classList.add(`${i}-scrollbar--dragging`);else if(I==="jump")U(ue);else pe=se(ue)-Z.getBoundingClientRect()[Ie],be=de,Le(),O=setTimeout(()=>{fe=requestAnimationFrame(Ce)},Lo);c()},Re=(ue)=>{if(!H||ue.pointerId!==w)return;ue.stopPropagation();let Ee=se(ue)-ie,we=Math.max(0,L-F),Ve=Math.max(0,Math.min(ce+Ee/E*we,we));K(Ve),n(Ve)},ve=()=>{if(V)c()},xe=()=>{if(!H){if(R=!1,l)le()}},_e=()=>{R=!0,N(),c()},ye=()=>{if(R=!1,!H&&l)le()},Se=["width","radius","thumb-color","track-color"],Me=(ue,Ee)=>d.style.setProperty(`--vlist-custom-scrollbar-${ue}`,Ee),Ae=Se.map((ue)=>d.style.getPropertyValue(`--vlist-custom-scrollbar-${ue}`)),Oe=Ae.slice(0,2),Ge=[],Fe=()=>{for(let ke=0;ke<2;ke++){let We=Se[ke],Ye=d.style.getPropertyValue(`--vlist-custom-scrollbar-${We}`);if(Ye!==Ge[ke])Oe[ke]=Ye;Me(We,Oe[ke])}let ue=getComputedStyle(a??d),Ee=o.width??ue.getPropertyValue("scrollbar-width"),we=ue.getPropertyValue("scrollbar-color").match(/[\w-]+\([^)]*\)|\S+/g);x=o.enabled!==!1&&Ee!=="none";let Ve=[typeof o.width==="number"?`${o.width}px`:ue.getPropertyValue("--vlist-custom-scrollbar-width").trim()||(Ee==="thin"||!y?"6px":"14px"),typeof o.radius==="number"?`${o.radius}px`:ue.getPropertyValue("--vlist-custom-scrollbar-radius").trim()||(y?"0px":"4px"),o.thumbColor??(we?.length===2?we[0]:Ae[2]),o.trackColor??(we?.length===2?we[1]:Ae[3])];for(let ke=0;ke<Se.length;ke++)Me(Se[ke],Ve[ke]);if(Ge=Ve.slice(0,2),ae.style.display=x?"":"none",e.classList.toggle(`${i}-viewport--gutter`,x&&!!o.gutter),!x)Te();q(L,F)},qe=()=>{N(),X(),Te(),N();for(let ue of Ne)ue();for(let ue=0;ue<Se.length;ue++)Me(Se[ue],Ae[ue]);if(e.classList.remove(`${i}-viewport--gutter`),ae.remove(),d.style.removeProperty("--vlist-custom-scrollbar-padding-top"),d.style.removeProperty("--vlist-custom-scrollbar-padding-right"),d.style.removeProperty("--vlist-custom-scrollbar-padding-bottom"),d.style.removeProperty("--vlist-custom-scrollbar-padding-left"),Z.remove(),ee&&e.id===ee)e.removeAttribute("id")};z();let Ne=[],He=(ue,Ee,we)=>{ue.addEventListener(Ee,we),Ne.push(()=>ue.removeEventListener(Ee,we))};for(let ue of[Z,k,ae])He(ue,"pointerdown",Pe),He(ue,"pointermove",Re),He(ue,"pointerup",Te),He(ue,"pointercancel",Te),He(ue,"lostpointercapture",Te);if(He(Z,"keydown",he),He(Z,"focus",c),He(Z,"blur",le),He(e,"mouseenter",ve),He(e,"mouseleave",xe),He(Z,"mouseenter",_e),He(Z,"mouseleave",ye),g)He(ae,"mouseenter",_e),He(ae,"mouseleave",ye);return Fe(),{refresh:Fe,show:c,hide:re,updateBounds:q,updatePosition:K,isVisible:()=>C,destroy:qe}};function Et(e){let n=null,o,i=0,r=0,t=0;return{name:"scrollbar",priority:15,setup(s){let{dom:a,config:A}=s,{classPrefix:y}=A,l=A.axis.primary==="x";o=s.getState(),i=A.mainAxisPadding,n=Gn(a.viewport,(M)=>{s.scroll.to(M)},e,y,l,a.root,()=>s.sizes.cache,a.root.parentElement),a.viewport.classList.add(`${y}-viewport--custom-scrollbar`),s.hooks.method("refreshScrollbar",()=>n?.refresh()),queueMicrotask(()=>{n?.updateBounds(o.totalSize+i,o.containerSize)}),s.hooks.method("_scrollbar:getInstance",()=>n),s.hooks.onDestroy(()=>{if(n?.destroy(),n=null,a.viewport.classList.remove(`${y}-viewport--custom-scrollbar`),e?.gutter)a.viewport.classList.remove(`${y}-viewport--gutter`)})},hooks:{onAfterScroll(s){let a=o.totalSize+i,A=o.containerSize;if(a!==r||A!==t)r=a,t=A,n?.updateBounds(a,A);n?.updatePosition(s),n?.show()},onResize(){let s=o.totalSize+i,a=o.containerSize;r=s,t=a,n?.updateBounds(s,a)}},destroy(){n?.destroy(),n=null}}}var Po=(e)=>{try{let n=sessionStorage.getItem(e);if(!n)return;return JSON.parse(n)}catch{return}};function Yt(e){let n=e?.autoSave,o=e?.restore??(n?Po(n):void 0),i=!1,r=null;return{name:"snapshots",priority:50,setup(t){let{emitter:s,scroll:a}=t,A=t.sizes.cache,y=t.getState(),l=()=>{let g=a.getPixelEquivalent(),V=y.totalItems,I=t.hooks.get("getSelected")?.();if(V===0){let L={index:0,offsetInItem:0,total:0};if(I?.length)L.selectedIds=I;return L}let d=A.indexAtOffset(g),T=g-A.getOffset(d);T=Math.max(0,T);let p={index:d,offsetInItem:T,total:V,scrollTop:g},_=A.getSize(d);if(_)p.offsetRatio=T/_;let te=t.hooks.get("_layoutToDataIndex");if(te){let L=te(d);if(L<0){for(let F=d+1;F<V;F++)if(L=te(F),L>=0)break}if(L>=0)p.dataIndex=L}let m=t.hooks.get("_getTotal");if(m)p.dataTotal=m();if(I?.length)p.selectedIds=I;let x=t.hooks.get("_getFocusedId");if(x){let L=x();if(L!==void 0)p.focusedId=L}return p};t.hooks.method("getScrollSnapshot",l);let M=(g,V=!0)=>{let{index:S,offsetInItem:I,selectedIds:d,focusedId:T}=g,p=y.totalItems,_=g.dataTotal??g.total;if(p===0&&_&&_>0){let b=t.hooks.get("_setTotal");if(b)b(_),p=y.totalItems;A.rebuild(p),t.render.contentSize(A.getTotalSize()),y.totalSize=A.getTotalSize()}if(p===0)return Promise.resolve();if(!Number.isFinite(S)||!Number.isFinite(I))return Promise.resolve();if(A.getTotal()===0)A.rebuild(p),t.render.contentSize(A.getTotalSize()),y.totalSize=A.getTotalSize();let m=t.hooks.get("_dataToLayoutIndex"),x=S;if(g.dataIndex!==void 0&&g.dataIndex>=0)x=m?m(g.dataIndex):g.dataIndex;else if(m)x=m(S);let L=Math.max(0,Math.min(x,p-1)),F=A.getSize(L),u=g.offsetRatio!==void 0?g.offsetRatio*F:Math.min(I,F),E=t.hooks.get("_getTotal")?.(),H=g.total===p||E!==void 0&&g.dataTotal===E,R;if(g.scrollTop!==void 0&&H)R=g.scrollTop;else R=A.getOffset(L)+u;let ie=Math.max(0,y.totalSize-y.containerSize);if(R=Math.max(0,Math.min(R,ie)),t.scroll.to(R),V&&d?.length){let b=t.hooks.get("select");if(b)b(...d)}let ce=t.hooks.get("loadVisibleRange"),de=()=>{if(T===void 0)return;let b=t.hooks.get("_focusById");if(b)b(T,"preserve")};return new Promise((b)=>{let C=(w)=>{if(w)de();b()};if(ce){let w=0,h=()=>{if(y.containerSize>0){if(Math.abs(a.getPixelEquivalent()-R)>1)t.scroll.to(R);ce().then(()=>C(!0),()=>C(!1))}else if(++w<10)requestAnimationFrame(h);else C(!1)};requestAnimationFrame(h)}else{let w=t.hooks.get("reload");if(w)requestAnimationFrame(()=>{w().then(()=>C(!0),()=>C(!1))});else requestAnimationFrame(()=>C(!0))}})};t.hooks.method("restoreScroll",M);let W=!!(o&&n);if(t.hooks.onDestroy(()=>{i=!0}),n){r=()=>{if(i||W)return;let p=l();try{sessionStorage.setItem(n,JSON.stringify(p))}catch{}},t.hooks.method("_saveSnapshot",r);let g=0,V=()=>{if(g)return;g=requestAnimationFrame(()=>{if(g=0,r)r()})};s.on("selection:change",V),s.on("focus:change",V);let S=0,I=()=>{if(S=0,r)r()},d=()=>{if(S)clearTimeout(S);S=setTimeout(I,300)};s.on("scroll",d);let T=()=>{r?.()};if(window.addEventListener("beforeunload",T),t.hooks.onDestroy(()=>{if(g)cancelAnimationFrame(g);if(S)clearTimeout(S);window.removeEventListener("beforeunload",T)}),o&&o.total&&o.total>0){let p=t.hooks.get("_cancelAutoLoad");if(p)p();let _=t.hooks.get("_setTotal");if(_)_(o.total)}}if(o){let g=!0;if(o.selectedIds?.length){let V=t.hooks.get("_seedSelection");if(V)V(o.selectedIds),g=!1}queueMicrotask(()=>{if(M(o,g),W=!1,r)r()})}},hooks:{onIdle(){if(r&&!i)r()}},destroy(){i=!0,r=null}}}function Mo(e){let n=[];if(typeof window<"u"&&e.scroll?.element===window)n.push(Ft());let o=e.item,i=e.orientation==="horizontal",r=i?o.width!=null:o.height!=null,t=i?o.estimatedWidth!=null:o.estimatedHeight!=null;if(!r&&t){if(e.layout==="grid")throw Error('[vlist] config: layout: "grid" needs a fixed item size. An estimate wires autosize(), which grid() cannot combine with: grid indexes its size cache by row, autosize measures items. Use item.height (item.width when horizontal).');n.push(Ot())}if(e.adapter)n.push(Dt({adapter:e.adapter,...e.loading&&{loading:e.loading}}));if(e.layout==="grid"){if(!e.grid)throw Error('[vlist] config: layout: "grid" requires a `grid` option, e.g. { columns: 3 }');n.push($t(e.grid))}if(e.layout==="masonry"){if(!e.masonry)throw Error('[vlist] config: layout: "masonry" requires a `masonry` option, e.g. { columns: 3 }');n.push(Gt(e.masonry))}if(e.groups)n.push(Wt(e.groups));if(e.selection)n.push(Kt(e.selection));if(e.a11y)n.push(e.a11y===!0?Ct():Ct(e.a11y));let s=e.scroll?.scrollbar??e.scrollbar;if(s===!0)n.push(Et({}));else if(s&&typeof s==="object")n.push(Et(s));if(e.snapshots)n.push(Yt());if(e.plugins&&e.plugins.length>0){let a=new Set(e.plugins.map((y)=>y.name));return[...n.filter((y)=>!a.has(y.name)),...e.plugins]}return n}function Yi(e){let{factory:n,...o}=e;return(n??Cn)(o,Mo(e))}export{Yi as createVListFromConfig,Mo as resolvePlugins};
1
+ import{createVList as u,page as g,autosize as m,data as f,grid as C,masonry as y,groups as h,selection as T,a11y as r,scrollbar as l,snapshots as c}from"./index.js";function L(t){let e=[];if(typeof window<"u"&&t.scroll?.element===window)e.push(g());let i=t.item,n=t.orientation==="horizontal",a=n?i.width!=null:i.height!=null,p=n?i.estimatedWidth!=null:i.estimatedHeight!=null;if(!a&&p){if(t.layout==="grid")throw Error('[vlist] config: layout: "grid" needs a fixed item size. An estimate wires autosize(), which grid() cannot combine with: grid indexes its size cache by row, autosize measures items. Use item.height (item.width when horizontal).');e.push(m())}if(t.adapter)e.push(f({adapter:t.adapter,...t.loading&&{loading:t.loading}}));if(t.layout==="grid"){if(!t.grid)throw Error('[vlist] config: layout: "grid" requires a `grid` option, e.g. { columns: 3 }');e.push(C(t.grid))}if(t.layout==="masonry"){if(!t.masonry)throw Error('[vlist] config: layout: "masonry" requires a `masonry` option, e.g. { columns: 3 }');e.push(y(t.masonry))}if(t.groups)e.push(h(t.groups));if(t.selection)e.push(T(t.selection));if(t.a11y)e.push(t.a11y===!0?r():r(t.a11y));let s=t.scroll?.scrollbar??t.scrollbar;if(s===!0)e.push(l({}));else if(s&&typeof s==="object")e.push(l(s));if(t.snapshots)e.push(c());if(t.plugins&&t.plugins.length>0){let d=new Set(t.plugins.map((o)=>o.name));return[...e.filter((o)=>!d.has(o.name)),...t.plugins]}return e}function M(t){let{factory:e,...i}=t;return(e??u)(i,L(t))}export{M as createVListFromConfig,L as resolvePlugins};
@@ -0,0 +1,38 @@
1
+ /**
2
+ * vlist/react — React hooks, feature-first (#328).
3
+ *
4
+ * Features are passed explicitly, as with the vanilla builder, so an app only
5
+ * bundles what it uses:
6
+ *
7
+ * const { containerRef } = useVList({ items, item }, [grid({ columns: 4 })]);
8
+ *
9
+ * The core comes from the root entry (`import … from "vlist"` in the built
10
+ * package), never a copy of its own.
11
+ */
12
+ import { type RefObject } from "react";
13
+ import { createVList } from "./index";
14
+ import type { CreateVListConfig, EventHandler, PluginMethods, VList, VListEvents, VListItem, VListPlugin } from "./index";
15
+ /** `createVList`'s config without `container`: the hook owns the element. */
16
+ export type UseVListConfig<T extends VListItem = VListItem> = Omit<CreateVListConfig<T>, "container">;
17
+ export interface UseVListReturn<T extends VListItem = VListItem, P extends readonly VListPlugin<T, any>[] = VListPlugin<T>[]> {
18
+ /** Attach to the element the list renders into. */
19
+ containerRef: RefObject<HTMLDivElement | null>;
20
+ /** The list once mounted, with the methods its plugins add. */
21
+ instanceRef: RefObject<(VList<T> & PluginMethods<P>) | null>;
22
+ getInstance: () => (VList<T> & PluginMethods<P>) | null;
23
+ }
24
+ /**
25
+ * A vlist in a React component. `plugins` are read at mount: changing them
26
+ * means remounting (a `key`). `config.items` changes update the list.
27
+ *
28
+ * @param create Advanced: the factory that builds the list, `createVList` by
29
+ * default. The deprecated vlist-react package passes its own.
30
+ */
31
+ export declare function useVList<T extends VListItem = VListItem, const P extends readonly VListPlugin<T, any>[] = VListPlugin<T>[]>(config: UseVListConfig<T>, plugins?: P, create?: typeof createVList): UseVListReturn<T, P>;
32
+ /**
33
+ * Subscribe to a list event for the component's lifetime. After `useVList` in
34
+ * the same component it subscribes at mount; in a child, whose effects run
35
+ * before the parent's, on its first render once the list exists.
36
+ */
37
+ export declare function useVListEvent<T extends VListItem, K extends keyof VListEvents<T>>(instanceRef: RefObject<VList<T> | null>, event: K, handler: EventHandler<VListEvents<T>[K]>): void;
38
+ //# sourceMappingURL=react.d.ts.map
package/dist/react.js ADDED
@@ -0,0 +1 @@
1
+ import{useRef as s,useEffect as c,useCallback as V}from"react";import{createVList as f}from"./index.js";function d(e,i=[],r=f){let n=s(null),t=s(null),u=s(e);u.current=e;let L=s(i);c(()=>{let o=n.current;if(!o)return;let l=r({...u.current,container:o},L.current);return t.current=l,()=>{l.destroy(),t.current=null}},[]),c(()=>{if(t.current&&e.items)t.current.setItems(e.items)},[e.items]);let a=V(()=>t.current,[]);return{containerRef:n,instanceRef:t,getInstance:a}}function P(e,i,r){let n=s(r);n.current=r,c(()=>{let t=e.current;if(!t)return;return t.on(i,(u)=>n.current(u))},[e.current,i])}export{d as useVList,P as useVListEvent};
package/dist/size.json CHANGED
@@ -1 +1 @@
1
- {"base":{"minified":"27.3","gzipped":"10.3","minBytes":27986,"gzBytes":10539},"synthetic":{"minified":"34.2","gzipped":"12.9","minBytes":35039,"gzBytes":13192},"synthetic + carousel":{"minified":"49.3","gzipped":"18.1","minBytes":50498,"gzBytes":18513},"synthetic + sortable":{"minified":"46.1","gzipped":"16.5","minBytes":47232,"gzBytes":16885},"createStats":{"minified":"27.9","gzipped":"10.5","minBytes":28588,"gzBytes":10770},"synthetic + createStats":{"minified":"34.8","gzipped":"13.1","minBytes":35641,"gzBytes":13422},"native":{"minified":"27.3","gzipped":"10.3","minBytes":27986,"gzBytes":10536},"a11y":{"minified":"31.2","gzipped":"11.7","minBytes":31938,"gzBytes":11988},"selection":{"minified":"36.9","gzipped":"13.3","minBytes":37809,"gzBytes":13568},"data":{"minified":"41.0","gzipped":"15.1","minBytes":41945,"gzBytes":15449},"scrollbar":{"minified":"35.5","gzipped":"13.2","minBytes":36335,"gzBytes":13499},"sortable":{"minified":"39.2","gzipped":"13.9","minBytes":40170,"gzBytes":14245},"groups":{"minified":"43.4","gzipped":"15.7","minBytes":44439,"gzBytes":16060},"page":{"minified":"29.9","gzipped":"11.2","minBytes":30588,"gzBytes":11478},"snapshots":{"minified":"30.6","gzipped":"11.4","minBytes":31366,"gzBytes":11697},"transition":{"minified":"34.1","gzipped":"12.3","minBytes":34883,"gzBytes":12570},"autosize":{"minified":"30.6","gzipped":"11.5","minBytes":31336,"gzBytes":11739},"grid":{"minified":"34.7","gzipped":"12.9","minBytes":35573,"gzBytes":13179},"table":{"minified":"45.8","gzipped":"16.2","minBytes":46881,"gzBytes":16634},"masonry":{"minified":"39.4","gzipped":"14.7","minBytes":40373,"gzBytes":15056},"tree":{"minified":"43.5","gzipped":"15.7","minBytes":44581,"gzBytes":16050},"search":{"minified":"36.9","gzipped":"13.6","minBytes":37750,"gzBytes":13912},"carousel":{"minified":"43.2","gzipped":"15.8","minBytes":44286,"gzBytes":16154}}
1
+ {"base":{"minified":"27.3","gzipped":"10.3","minBytes":27986,"gzBytes":10539},"synthetic":{"minified":"34.2","gzipped":"12.9","minBytes":35039,"gzBytes":13192},"synthetic + carousel":{"minified":"49.3","gzipped":"18.1","minBytes":50498,"gzBytes":18513},"synthetic + sortable":{"minified":"46.1","gzipped":"16.5","minBytes":47232,"gzBytes":16885},"createStats":{"minified":"27.9","gzipped":"10.5","minBytes":28588,"gzBytes":10770},"synthetic + createStats":{"minified":"34.8","gzipped":"13.1","minBytes":35641,"gzBytes":13422},"native":{"minified":"27.3","gzipped":"10.3","minBytes":27986,"gzBytes":10536},"vue":{"minified":"27.7","gzipped":"10.5","minBytes":28376,"gzBytes":10722},"svelte":{"minified":"27.5","gzipped":"10.4","minBytes":28171,"gzBytes":10626},"solid":{"minified":"27.6","gzipped":"10.4","minBytes":28283,"gzBytes":10688},"react":{"minified":"27.8","gzipped":"10.5","minBytes":28423,"gzBytes":10717},"react + grid":{"minified":"35.2","gzipped":"13.1","minBytes":36010,"gzBytes":13373},"a11y":{"minified":"31.2","gzipped":"11.7","minBytes":31938,"gzBytes":11988},"selection":{"minified":"36.9","gzipped":"13.3","minBytes":37809,"gzBytes":13568},"data":{"minified":"41.0","gzipped":"15.1","minBytes":41945,"gzBytes":15449},"scrollbar":{"minified":"35.5","gzipped":"13.2","minBytes":36335,"gzBytes":13499},"sortable":{"minified":"39.2","gzipped":"13.9","minBytes":40170,"gzBytes":14245},"groups":{"minified":"43.4","gzipped":"15.7","minBytes":44439,"gzBytes":16060},"page":{"minified":"29.9","gzipped":"11.2","minBytes":30588,"gzBytes":11478},"snapshots":{"minified":"30.6","gzipped":"11.4","minBytes":31366,"gzBytes":11697},"transition":{"minified":"34.1","gzipped":"12.3","minBytes":34883,"gzBytes":12570},"autosize":{"minified":"30.6","gzipped":"11.5","minBytes":31336,"gzBytes":11739},"grid":{"minified":"34.7","gzipped":"12.9","minBytes":35573,"gzBytes":13179},"table":{"minified":"45.8","gzipped":"16.2","minBytes":46881,"gzBytes":16634},"masonry":{"minified":"39.4","gzipped":"14.7","minBytes":40373,"gzBytes":15056},"tree":{"minified":"43.5","gzipped":"15.7","minBytes":44581,"gzBytes":16050},"search":{"minified":"36.9","gzipped":"13.6","minBytes":37750,"gzBytes":13912},"carousel":{"minified":"43.2","gzipped":"15.8","minBytes":44286,"gzBytes":16154}}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * vlist/solid — SolidJS primitives, feature-first (#328).
3
+ *
4
+ * const { setRef } = createVList(() => ({ items, item }), [grid({ columns: 4 })]);
5
+ *
6
+ * `createVList` keeps the Solid primitive idiom and the vlist-solidjs name. In
7
+ * a file that also uses the core builder, alias one of them:
8
+ * `import { createVList as createSolidVList } from "vlist/solid"`.
9
+ *
10
+ * Features are passed explicitly, so an app only bundles what it uses. The
11
+ * core comes from the root entry, never a copy of its own.
12
+ */
13
+ import { type Accessor } from "solid-js";
14
+ import { createVList as createCoreVList } from "./index";
15
+ import type { CreateVListConfig, EventHandler, PluginMethods, VList, VListEvents, VListItem, VListPlugin } from "./index";
16
+ /** `createVList`'s config without `container`: the primitive owns the element. */
17
+ export type CreateVListConfigInput<T extends VListItem = VListItem> = Omit<CreateVListConfig<T>, "container">;
18
+ export interface CreateVListReturn<T extends VListItem = VListItem, P extends readonly VListPlugin<T, any>[] = VListPlugin<T>[]> {
19
+ /** Pass as `ref={setRef}` on the element the list renders into. */
20
+ setRef: (el: HTMLDivElement) => void;
21
+ /** The list once mounted, with the methods its plugins add. */
22
+ instance: Accessor<(VList<T> & PluginMethods<P>) | null>;
23
+ }
24
+ /**
25
+ * A vlist in a component. `plugins` are read at mount; `items` changes in the
26
+ * config accessor update the list.
27
+ *
28
+ * @param create Advanced: the factory that builds the list, the core
29
+ * `createVList` by default. The deprecated vlist-solidjs package passes its own.
30
+ */
31
+ export declare function createVList<T extends VListItem = VListItem, const P extends readonly VListPlugin<T, any>[] = VListPlugin<T>[]>(config: Accessor<CreateVListConfigInput<T>>, plugins?: P, create?: typeof createCoreVList): CreateVListReturn<T, P>;
32
+ /** Subscribe to a list event for the component's lifetime. */
33
+ export declare function createVListEvent<T extends VListItem, K extends keyof VListEvents<T>>(instance: Accessor<VList<T> | null>, event: K, handler: EventHandler<VListEvents<T>[K]>): void;
34
+ //# sourceMappingURL=solid.d.ts.map
package/dist/solid.js ADDED
@@ -0,0 +1 @@
1
+ import{onMount as r,onCleanup as l,createEffect as a,on as L}from"solid-js";import{createVList as V}from"./index.js";function f(n,i=[],o=V){let e=null,t=null;return r(()=>{if(!e)return;t=o({...n(),container:e},i)}),a(L(()=>n().items,(s)=>{if(t&&s)t.setItems(s)})),l(()=>{t?.destroy(),t=null}),{setRef:(s)=>{e=s},instance:()=>t}}function T(n,i,o){r(()=>{let e=n();if(!e)return;let t=e.on(i,o);l(t)})}export{f as createVList,T as createVListEvent};
@@ -0,0 +1,30 @@
1
+ /**
2
+ * vlist/svelte — a Svelte action, feature-first (#328). Works in Svelte 4 and 5.
3
+ *
4
+ * <div use:vlist={{ config: { items, item }, plugins: [grid({ columns: 4 })] }} />
5
+ *
6
+ * Features are passed explicitly, so an app only bundles what it uses. The
7
+ * core comes from the root entry, never a copy of its own.
8
+ */
9
+ import { createVList } from "./index";
10
+ import type { CreateVListConfig, EventHandler, PluginMethods, Unsubscribe, VList, VListEvents, VListItem, VListPlugin } from "./index";
11
+ /** `createVList`'s config without `container`: the action owns the node. */
12
+ export type VListActionConfig<T extends VListItem = VListItem> = Omit<CreateVListConfig<T>, "container">;
13
+ export interface VListActionOptions<T extends VListItem = VListItem, P extends readonly VListPlugin<T, any>[] = VListPlugin<T>[]> {
14
+ config: VListActionConfig<T>;
15
+ /** Read when the action mounts: changing them means remounting. */
16
+ plugins?: P;
17
+ /** Receives the list once created, with the methods its plugins add. */
18
+ onInstance?: (instance: VList<T> & PluginMethods<P>) => void;
19
+ /** Advanced: the factory that builds the list, `createVList` by default. */
20
+ create?: typeof createVList;
21
+ }
22
+ export interface VListActionReturn<T extends VListItem = VListItem, P extends readonly VListPlugin<T, any>[] = VListPlugin<T>[]> {
23
+ update: (options: VListActionOptions<T, P>) => void;
24
+ destroy: () => void;
25
+ }
26
+ /** A vlist on the node: `use:vlist={{ config, plugins }}`. `config.items` changes update it. */
27
+ export declare function vlist<T extends VListItem = VListItem, const P extends readonly VListPlugin<T, any>[] = VListPlugin<T>[]>(node: HTMLElement, options: VListActionOptions<T, P>): VListActionReturn<T, P>;
28
+ /** Subscribe to a list event; call the returned function to unsubscribe. */
29
+ export declare function onVListEvent<T extends VListItem, K extends keyof VListEvents<T>>(instance: VList<T>, event: K, handler: EventHandler<VListEvents<T>[K]>): Unsubscribe;
30
+ //# sourceMappingURL=svelte.d.ts.map
package/dist/svelte.js ADDED
@@ -0,0 +1 @@
1
+ import{createVList as o}from"./index.js";function r(e,t){let i=(t.create??o)({...t.config,container:e},t.plugins??[]);return t.onInstance?.(i),{update(s){if(s.config.items)i.setItems(s.config.items)},destroy(){i.destroy()}}}function V(e,t,n){return e.on(t,n)}export{V as onVListEvent,r as vlist};
package/dist/version.json CHANGED
@@ -1 +1 @@
1
- {"version":"3.1.0-next.2","commit":"0304127","builtAt":"2026-09-27T23:15:44.114Z","released":true}
1
+ {"version":"3.1.0-next.3","commit":"b458229","builtAt":"2026-10-01T07:42:43.065Z","released":true}
package/dist/vue.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ /**
2
+ * vlist/vue — Vue composables, feature-first (#328).
3
+ *
4
+ * const { containerRef } = useVList({ items, item }, [grid({ columns: 4 })]);
5
+ *
6
+ * Features are passed explicitly, so an app only bundles what it uses. The
7
+ * core comes from the root entry, never a copy of its own.
8
+ */
9
+ import { type Ref, type ShallowRef } from "vue";
10
+ import { createVList } from "./index";
11
+ import type { CreateVListConfig, EventHandler, PluginMethods, VList, VListEvents, VListItem, VListPlugin } from "./index";
12
+ /** `createVList`'s config without `container`: the composable owns the element. */
13
+ export type UseVListConfig<T extends VListItem = VListItem> = Omit<CreateVListConfig<T>, "container">;
14
+ export interface UseVListReturn<T extends VListItem = VListItem, P extends readonly VListPlugin<T, any>[] = VListPlugin<T>[]> {
15
+ /** Bind to the element the list renders into (`ref="containerRef"`). */
16
+ containerRef: Ref<HTMLDivElement | null>;
17
+ /** The list once mounted, with the methods its plugins add. */
18
+ instance: ShallowRef<(VList<T> & PluginMethods<P>) | null>;
19
+ }
20
+ /**
21
+ * A vlist in a component. `plugins` are read at mount. With a `Ref` config,
22
+ * `items` changes update the list.
23
+ *
24
+ * @param create Advanced: the factory that builds the list, `createVList` by
25
+ * default. The deprecated vlist-vue package passes its own.
26
+ */
27
+ export declare function useVList<T extends VListItem = VListItem, const P extends readonly VListPlugin<T, any>[] = VListPlugin<T>[]>(config: UseVListConfig<T> | Ref<UseVListConfig<T>>, plugins?: P, create?: typeof createVList): UseVListReturn<T, P>;
28
+ /** Subscribe to a list event for the component's lifetime. */
29
+ export declare function useVListEvent<T extends VListItem, K extends keyof VListEvents<T>>(instance: Ref<VList<T> | null> | ShallowRef<VList<T> | null>, event: K, handler: EventHandler<VListEvents<T>[K]>): void;
30
+ //# sourceMappingURL=vue.d.ts.map
package/dist/vue.js ADDED
@@ -0,0 +1 @@
1
+ import{ref as u,shallowRef as L,onMounted as r,onBeforeUnmount as o,watch as a,isRef as V,unref as f}from"vue";import{createVList as d}from"./index.js";function v(n,i=[],l=d){let t=u(null),e=L(null);if(r(()=>{let s=t.value;if(!s)return;e.value=l({...f(n),container:s},i)}),o(()=>{e.value?.destroy(),e.value=null}),V(n))a(()=>n.value.items,(s)=>{if(e.value&&s)e.value.setItems(s)});return{containerRef:t,instance:e}}function c(n,i,l){let t;a(()=>n.value,(e)=>{t?.(),t=e?.on(i,l)},{immediate:!0}),o(()=>t?.())}export{v as useVList,c as useVListEvent};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vlist",
3
- "version": "3.1.0-next.2",
3
+ "version": "3.1.0-next.3",
4
4
  "description": "Lightweight, high-performance virtual list with zero dependencies",
5
5
  "author": {
6
6
  "name": "Floor IO",
@@ -49,6 +49,26 @@
49
49
  "import": "./dist/config.js",
50
50
  "default": "./dist/config.js"
51
51
  },
52
+ "./vue": {
53
+ "types": "./dist/vue.d.ts",
54
+ "import": "./dist/vue.js",
55
+ "default": "./dist/vue.js"
56
+ },
57
+ "./svelte": {
58
+ "types": "./dist/svelte.d.ts",
59
+ "import": "./dist/svelte.js",
60
+ "default": "./dist/svelte.js"
61
+ },
62
+ "./solid": {
63
+ "types": "./dist/solid.d.ts",
64
+ "import": "./dist/solid.js",
65
+ "default": "./dist/solid.js"
66
+ },
67
+ "./react": {
68
+ "types": "./dist/react.d.ts",
69
+ "import": "./dist/react.js",
70
+ "default": "./dist/react.js"
71
+ },
52
72
  "./internals": {
53
73
  "types": "./dist/internals.d.ts",
54
74
  "import": "./dist/internals.js",
@@ -97,13 +117,40 @@
97
117
  "url": "https://github.com/floor/vlist/issues"
98
118
  },
99
119
  "homepage": "https://vlist.io",
120
+ "peerDependencies": {
121
+ "react": ">=17.0.0",
122
+ "vue": ">=3.0.0",
123
+ "svelte": ">=4.0.0",
124
+ "solid-js": ">=1.6.0"
125
+ },
126
+ "peerDependenciesMeta": {
127
+ "react": {
128
+ "optional": true
129
+ },
130
+ "vue": {
131
+ "optional": true
132
+ },
133
+ "svelte": {
134
+ "optional": true
135
+ },
136
+ "solid-js": {
137
+ "optional": true
138
+ }
139
+ },
100
140
  "devDependencies": {
101
141
  "@happy-dom/global-registrator": "^20.9.0",
102
142
  "@types/bun": "^1.0.0",
103
143
  "@types/jsdom": "^27.0.0",
144
+ "@types/react": "^19.2.13",
145
+ "@types/react-dom": "^19.2.3",
104
146
  "happy-dom": "^20.9.0",
105
147
  "jsdom": "^28.0.0",
106
148
  "puppeteer-core": "^24.43.1",
107
- "typescript": "^5.0.0"
149
+ "react": "19.2.7",
150
+ "react-dom": "19.2.7",
151
+ "solid-js": "^1.9.3",
152
+ "svelte": "^5.0.0",
153
+ "typescript": "^5.0.0",
154
+ "vue": "^3.5.28"
108
155
  }
109
156
  }