@floor/vlist 0.8.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # vlist
2
2
 
3
- Lightweight, high-performance virtual list with zero dependencies and optimal tree-shaking.
3
+ Lightweight, high-performance virtual list with zero dependencies and dimension-agnostic architecture.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/%40floor%2Fvlist.svg)](https://www.npmjs.com/package/@floor/vlist)
6
6
  [![bundle size](https://img.shields.io/bundlephobia/minzip/@floor/vlist)](https://bundlephobia.com/package/@floor/vlist)
@@ -12,12 +12,19 @@ Lightweight, high-performance virtual list with zero dependencies and optimal tr
12
12
  - **8–12 KB gzipped** — pay only for features you use (vs 20 KB+ monolithic alternatives)
13
13
  - **Builder API** — composable plugins with perfect tree-shaking
14
14
  - **Grid, sections, async, selection, scale** — all opt-in
15
- - **Horizontal, reverse, page-scroll, wrap** — every layout mode
15
+ - **Horizontal & vertical** — semantically correct orientation support
16
+ - **Reverse, page-scroll, wrap** — every layout mode
16
17
  - **Accessible** — WAI-ARIA, keyboard navigation, screen-reader friendly
17
18
  - **React, Vue, Svelte** — framework adapters available
18
19
 
19
20
  **30+ interactive examples → [vlist.dev](https://vlist.dev)**
20
21
 
22
+ ## v0.9.0 Highlights
23
+
24
+ - ✨ **Dimension-agnostic API** — semantically correct terminology for both orientations
25
+ - 🎯 **Horizontal sections** — sticky headers work in horizontal carousels
26
+ - 📐 **`orientation` not `direction`** — clearer, more intuitive configuration
27
+
21
28
  ## Installation
22
29
 
23
30
  ```bash
@@ -166,7 +173,8 @@ const list = vlist({
166
173
  | Pattern | Key options |
167
174
  |---------|------------|
168
175
  | **Chat UI** | `reverse: true` + `withSections({ sticky: false })` |
169
- | **Horizontal carousel** | `direction: 'horizontal'`, `item.width` |
176
+ | **Horizontal carousel** | `orientation: 'horizontal'`, `item.width` |
177
+ | **Horizontal sections** | `orientation: 'horizontal'` + `withSections()` |
170
178
  | **Page-level scroll** | `withPage()` |
171
179
  | **1M+ items** | `withScale()` — auto-compresses scroll space |
172
180
  | **Wrap navigation** | `scroll: { wrap: true }` |
@@ -225,7 +233,7 @@ const list = vlist(config).use(...plugins).build()
225
233
  `list.on()` returns an unsubscribe function. You can also use `list.off(event, handler)`.
226
234
 
227
235
  ```typescript
228
- list.on('scroll', ({ scrollTop, direction }) => {})
236
+ list.on('scroll', ({ scrollPosition, direction }) => {}) // v0.9.0: scrollPosition (was scrollTop)
229
237
  list.on('range:change', ({ range }) => {})
230
238
  list.on('item:click', ({ item, index, event }) => {})
231
239
  list.on('item:dblclick', ({ item, index, event }) => {})
@@ -290,6 +298,27 @@ import '@floor/vlist/styles/extras' // optional enhancements
290
298
 
291
299
  Override with your own CSS using the `.vlist`, `.vlist-item`, `.vlist-item--selected`, `.vlist-scrollbar` selectors. See [vlist.dev](https://vlist.dev) for theming examples.
292
300
 
301
+ ## Architecture
302
+
303
+ ### Dimension-Agnostic Design (v0.9.0)
304
+
305
+ vlist uses semantically correct terminology that works for both vertical and horizontal orientations:
306
+
307
+ ```typescript
308
+ // ✅ Correct: Works for both orientations
309
+ sizeCache.getSize(index) // Returns height OR width
310
+ state.scrollPosition // scrollTop OR scrollLeft
311
+ state.containerSize // height OR width
312
+
313
+ // Previously (v0.8.2): Semantically wrong in horizontal mode
314
+ heightCache.getHeight(index) // ❌ Returned WIDTH in horizontal!
315
+ state.scrollTop // ❌ Stored scrollLEFT!
316
+ ```
317
+
318
+ This makes the codebase clearer and eliminates semantic confusion when working with horizontal lists.
319
+
320
+ **Migration from v0.8.2:** See [v0.9.0 Migration Guide](https://vlist.dev/docs/refactoring/v0.9.0-migration-guide.md)
321
+
293
322
  ## Performance
294
323
 
295
324
  ### Bundle Size
@@ -357,9 +386,24 @@ const list: VList<Photo> = vlist<Photo>({
357
386
 
358
387
  [MIT](LICENSE)
359
388
 
389
+ ## Changelog
390
+
391
+ ### v0.9.0 (January 2025)
392
+
393
+ **Breaking Changes:**
394
+ - Renamed `direction` → `orientation` for semantic clarity
395
+ - Renamed `HeightCache` → `SizeCache` and all related APIs
396
+ - Renamed `scrollTop` → `scrollPosition` in ViewportState and events
397
+ - See [Migration Guide](https://vlist.dev/docs/refactoring/v0.9.0-migration-guide.md)
398
+
399
+ **New Features:**
400
+ - Horizontal orientation support for sections plugin
401
+ - Complete dimension-agnostic architecture
402
+
360
403
  ## Links
361
404
 
362
405
  - **Docs & Examples:** [vlist.dev](https://vlist.dev)
406
+ - **Migration Guide:** [v0.9.0 Migration](https://vlist.dev/docs/refactoring/v0.9.0-migration-guide.md)
363
407
  - **GitHub:** [github.com/floor/vlist](https://github.com/floor/vlist)
364
408
  - **NPM:** [@floor/vlist](https://www.npmjs.com/package/@floor/vlist)
365
409
  - **Issues:** [GitHub Issues](https://github.com/floor/vlist/issues)
@@ -6,7 +6,7 @@
6
6
  * registration points for handlers, methods, and cleanup callbacks.
7
7
  */
8
8
  import type { VListItem, VListEvents } from "../types";
9
- import type { HeightCache } from "../rendering/heights";
9
+ import type { SizeCache } from "../rendering/sizes";
10
10
  import type { Renderer, DOMStructure } from "../rendering/renderer";
11
11
  import type { SimpleDataManager } from "./data";
12
12
  import type { ScrollController } from "../features/scrollbar/controller";
@@ -17,13 +17,13 @@ export interface CreateBuilderContextOptions<T extends VListItem = VListItem> {
17
17
  rawConfig: BuilderConfig<T>;
18
18
  resolvedConfig: ResolvedBuilderConfig;
19
19
  dom: DOMStructure;
20
- heightCache: HeightCache;
20
+ sizeCache: SizeCache;
21
21
  dataManager: SimpleDataManager<T>;
22
22
  scrollController: ScrollController;
23
23
  renderer: Renderer<T>;
24
24
  emitter: Emitter<VListEvents<T>>;
25
25
  initialState: BuilderState;
26
- initialHeightConfig: number | ((index: number) => number);
26
+ initialSizeConfig: number | ((index: number) => number);
27
27
  }
28
28
  /**
29
29
  * Create a BuilderContext from individual components.
@@ -2,7 +2,7 @@
2
2
  * vlist/builder — Composable virtual list builder
3
3
  *
4
4
  * Pure utilities (velocity, DOM, pool, range, scroll) live in sibling files.
5
- * Height cache and emitter are reused from rendering/ and events/ modules.
5
+ * Size cache and emitter are reused from rendering/ and events/ modules.
6
6
  * Bun.build inlines everything into a single bundle automatically.
7
7
  *
8
8
  * Plugins compose features *around* the hot path via extension points:
@@ -13,7 +13,7 @@
13
13
  * destructured once and never re-read, so their names don't matter at runtime.
14
14
  */
15
15
  import type { VListItem, VListEvents, ItemTemplate, ItemState, Range } from "../types";
16
- import type { HeightCache } from "../rendering/heights";
16
+ import type { SizeCache } from "../rendering/sizes";
17
17
  import type { Emitter } from "../events/emitter";
18
18
  import type { DOMStructure } from "./dom";
19
19
  import type { createElementPool } from "./pool";
@@ -26,7 +26,7 @@ import type { BuilderConfig, BuilderContext, BuilderState, ResolvedBuilderConfig
26
26
  * | Key | Meaning |
27
27
  * |------|------------------------|
28
28
  * | it | items |
29
- * | hc | heightCache |
29
+ * | hc | sizeCache |
30
30
  * | ch | containerHeight |
31
31
  * | cw | containerWidth |
32
32
  * | id | isDestroyed |
@@ -57,8 +57,8 @@ import type { BuilderConfig, BuilderContext, BuilderState, ResolvedBuilderConfig
57
57
  export interface MRefs<T extends VListItem = VListItem> {
58
58
  /** items */
59
59
  it: T[];
60
- /** heightCache */
61
- hc: HeightCache;
60
+ /** sizeCache */
61
+ hc: SizeCache;
62
62
  /** containerHeight */
63
63
  ch: number;
64
64
  /** containerWidth */
@@ -99,9 +99,9 @@ export interface MRefs<T extends VListItem = VListItem> {
99
99
  /** forceRenderFn */
100
100
  ffn: () => void;
101
101
  /** getVisibleRange */
102
- gvr: (scrollTop: number, cHeight: number, hc: HeightCache, total: number, out: Range) => void;
102
+ gvr: (scrollTop: number, cHeight: number, hc: SizeCache, total: number, out: Range) => void;
103
103
  /** getScrollToPos */
104
- gsp: (index: number, hc: HeightCache, cHeight: number, total: number, align: "start" | "center" | "end") => number;
104
+ gsp: (index: number, hc: SizeCache, cHeight: number, total: number, align: "start" | "center" | "end") => number;
105
105
  /** positionElementFn */
106
106
  pef: (element: HTMLElement, index: number) => void;
107
107
  /** activeTemplate */
@@ -129,7 +129,7 @@ export interface MDeps<T extends VListItem = VListItem> {
129
129
  readonly isHorizontal: boolean;
130
130
  readonly classPrefix: string;
131
131
  readonly contentSizeHandlers: Array<() => void>;
132
- readonly afterScroll: Array<(scrollTop: number, direction: string) => void>;
132
+ readonly afterScroll: Array<(scrollPosition: number, direction: string) => void>;
133
133
  readonly clickHandlers: Array<(event: MouseEvent) => void>;
134
134
  readonly keydownHandlers: Array<(event: KeyboardEvent) => void>;
135
135
  readonly resizeHandlers: Array<(width: number, height: number) => void>;
@@ -3,8 +3,8 @@
3
3
  * Visible range detection, overscan application, and scroll-to-index positioning.
4
4
  */
5
5
  import type { Range } from "../types";
6
- import type { HeightCache } from "../rendering/heights";
7
- export declare const calcVisibleRange: (scrollTop: number, containerHeight: number, hc: HeightCache, totalItems: number, out: Range) => void;
6
+ import type { SizeCache } from "../rendering/sizes";
7
+ export declare const calcVisibleRange: (scrollPosition: number, containerHeight: number, hc: SizeCache, totalItems: number, out: Range) => void;
8
8
  export declare const applyOverscan: (visible: Range, overscan: number, totalItems: number, out: Range) => void;
9
- export declare const calcScrollToPosition: (index: number, hc: HeightCache, containerHeight: number, totalItems: number, align: "start" | "center" | "end") => number;
9
+ export declare const calcScrollToPosition: (index: number, hc: SizeCache, containerHeight: number, totalItems: number, align: "start" | "center" | "end") => number;
10
10
  //# sourceMappingURL=range.d.ts.map
@@ -3,7 +3,7 @@
3
3
  * Plugin interface, builder config, builder context, and return types
4
4
  */
5
5
  import type { VListItem, VListEvents, ItemConfig, ItemTemplate, Range, ViewportState, EventHandler, Unsubscribe, ScrollToOptions, ScrollSnapshot } from "../types";
6
- import type { DOMStructure, Renderer, HeightCache, CompressionContext } from "../rendering";
6
+ import type { DOMStructure, Renderer, SizeCache, CompressionContext } from "../rendering";
7
7
  import type { CompressionState } from "../rendering/viewport";
8
8
  import type { SimpleDataManager } from "./data";
9
9
  import type { ScrollController } from "../features/scrollbar/controller";
@@ -23,11 +23,11 @@ export interface BuilderConfig<T extends VListItem = VListItem> {
23
23
  /** Accessible label for the listbox */
24
24
  ariaLabel?: string;
25
25
  /**
26
- * Scroll direction (default: 'vertical')
26
+ * Layout orientation (default: 'vertical')
27
27
  * - 'vertical' — Standard top-to-bottom scrolling
28
28
  * - 'horizontal' — Left-to-right scrolling
29
29
  */
30
- direction?: "vertical" | "horizontal";
30
+ orientation?: "vertical" | "horizontal";
31
31
  /** Reverse mode for chat UIs */
32
32
  reverse?: boolean;
33
33
  /** Scroll behavior configuration (non-scrollbar options) */
@@ -72,7 +72,7 @@ export interface BuilderState {
72
72
  */
73
73
  export interface BuilderContext<T extends VListItem = VListItem> {
74
74
  readonly dom: DOMStructure;
75
- readonly heightCache: HeightCache;
75
+ readonly sizeCache: SizeCache;
76
76
  readonly emitter: Emitter<VListEvents<T>>;
77
77
  readonly config: ResolvedBuilderConfig;
78
78
  /** The raw user-provided builder config (for plugins that need original values) */
@@ -86,7 +86,7 @@ export interface BuilderContext<T extends VListItem = VListItem> {
86
86
  * scroll-triggered render. These are NOT on the hot path —
87
87
  * they run after DOM updates are complete.
88
88
  */
89
- afterScroll: Array<(scrollTop: number, direction: string) => void>;
89
+ afterScroll: Array<(scrollPosition: number, direction: string) => void>;
90
90
  /**
91
91
  * Plugins register handlers for user interaction events.
92
92
  * These are attached as DOM event listeners during .build().
@@ -136,15 +136,14 @@ export interface BuilderContext<T extends VListItem = VListItem> {
136
136
  */
137
137
  setVirtualTotalFn(fn: () => number): void;
138
138
  /**
139
- * Replace the effective height config.
140
- * Used by groups plugin to inject grouped height function and by grid to add gap.
139
+ * Used by groups plugin to inject grouped size function and by grid to add gap.
141
140
  */
142
- rebuildHeightCache(total?: number): void;
141
+ rebuildSizeCache(total?: number): void;
143
142
  /**
144
- * Set a new effective height config function/value.
145
- * Plugins that change heights (groups, grid) call this before rebuildHeightCache.
143
+ * Set a new effective size config function/value.
144
+ * Plugins that change sizes (groups, grid) call this before rebuildSizeCache.
146
145
  */
147
- setHeightConfig(config: number | ((index: number) => number)): void;
146
+ setSizeConfig(config: number | ((index: number) => number)): void;
148
147
  /**
149
148
  * Update content size on the main axis (height for vertical, width for horizontal).
150
149
  */
@@ -158,12 +157,12 @@ export interface BuilderContext<T extends VListItem = VListItem> {
158
157
  * Replace the visible-range calculation function.
159
158
  * Used by withCompression to inject compressed range calculation.
160
159
  */
161
- setVisibleRangeFn(fn: (scrollTop: number, containerHeight: number, hc: HeightCache, totalItems: number, out: Range) => void): void;
160
+ setVisibleRangeFn(fn: (scrollTop: number, containerHeight: number, sc: SizeCache, totalItems: number, out: Range) => void): void;
162
161
  /**
163
162
  * Replace the scroll-to-index position calculator.
164
163
  * Used by withCompression to inject compressed position calculation.
165
164
  */
166
- setScrollToPosFn(fn: (index: number, hc: HeightCache, containerHeight: number, totalItems: number, align: "start" | "center" | "end") => number): void;
165
+ setScrollToPosFn(fn: (index: number, sc: SizeCache, containerHeight: number, totalItems: number, align: "start" | "center" | "end") => number): void;
167
166
  /**
168
167
  * Replace the item positioning function.
169
168
  * Used by withCompression to inject compressed item positioning.
@@ -12,7 +12,7 @@
12
12
  * - CSS class — adds .vlist--grid to the root element
13
13
  *
14
14
  * Restrictions:
15
- * - Cannot be combined with direction: 'horizontal'
15
+ * - Cannot be combined with orientation: 'horizontal'
16
16
  * - Cannot be combined with reverse: true
17
17
  *
18
18
  * Can be combined with withGroups for grouped 2D layouts.
@@ -3,18 +3,18 @@
3
3
  * Renders items in a 2D grid layout within the virtual scroll container.
4
4
  *
5
5
  * Extends the base renderer pattern but positions items using both
6
- * row offsets (translateY from the height cache) and column offsets
6
+ * row offsets (translateY from the size cache) and column offsets
7
7
  * (translateX calculated from column index and container width).
8
8
  *
9
9
  * Key differences from the list renderer:
10
10
  * - Items are positioned with translate(x, y) instead of just translateY(y)
11
11
  * - Item width is set to columnWidth (containerWidth / columns - gaps)
12
12
  * - The "index" in the rendered map is the FLAT ITEM INDEX (not row index)
13
- * - Row offsets come from the height cache (which operates on row indices)
13
+ * - Row offsets come from the size cache (which operates on row indices)
14
14
  * - Column offsets are calculated from itemIndex % columns
15
15
  */
16
16
  import type { VListItem, ItemTemplate, Range } from "../../types";
17
- import type { HeightCache } from "../../rendering/heights";
17
+ import type { SizeCache } from "../../rendering/sizes";
18
18
  import type { CompressionContext } from "../../rendering/renderer";
19
19
  import type { GridLayout } from "./types";
20
20
  /** Grid renderer instance */
@@ -44,12 +44,12 @@ export interface GridRenderer<T extends VListItem = VListItem> {
44
44
  *
45
45
  * @param itemsContainer - The DOM element that holds rendered items
46
46
  * @param template - Item template function
47
- * @param heightCache - Height cache operating on ROW indices
47
+ * @param sizeCache - Size cache operating on ROW indices
48
48
  * @param gridLayout - Grid layout for row/col calculations
49
49
  * @param classPrefix - CSS class prefix
50
50
  * @param initialContainerWidth - Initial container width for column sizing
51
51
  * @param totalItemsGetter - Optional getter for total item count (for aria-setsize)
52
52
  * @param ariaIdPrefix - Optional unique prefix for element IDs (for aria-activedescendant)
53
53
  */
54
- export declare const createGridRenderer: <T extends VListItem = VListItem>(itemsContainer: HTMLElement, template: ItemTemplate<T>, heightCache: HeightCache, gridLayout: GridLayout, classPrefix: string, initialContainerWidth: number, totalItemsGetter?: () => number, ariaIdPrefix?: string) => GridRenderer<T>;
54
+ export declare const createGridRenderer: <T extends VListItem = VListItem>(itemsContainer: HTMLElement, template: ItemTemplate<T>, sizeCache: SizeCache, gridLayout: GridLayout, classPrefix: string, initialContainerWidth: number, totalItemsGetter?: () => number, ariaIdPrefix?: string) => GridRenderer<T>;
55
55
  //# sourceMappingURL=renderer.d.ts.map
@@ -43,7 +43,7 @@ import type { VListPlugin } from "../../builder/types";
43
43
  * const timeline = vlist({
44
44
  * container: '#timeline',
45
45
  * item: { height: 100, template: renderEvent },
46
- * direction: 'horizontal'
46
+ * orientation: 'horizontal'
47
47
  * })
48
48
  * .use(withWindow())
49
49
  * .build()
@@ -5,6 +5,6 @@
5
5
  export { withSections, type GroupsPluginConfig } from "./plugin";
6
6
  export type { GroupsConfig, GroupBoundary, LayoutEntry, GroupHeaderItem, GroupLayout, StickyHeader, } from "./types";
7
7
  export { isGroupHeader, isGroupHeader as isSectionHeader } from "./types";
8
- export { createGroupLayout, buildLayoutItems, createGroupedHeightFn, } from "./layout";
8
+ export { createGroupLayout, buildLayoutItems, createGroupedSizeFn, } from "./layout";
9
9
  export { createStickyHeader } from "./sticky";
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -25,14 +25,15 @@ import type { VListItem } from "../../types";
25
25
  */
26
26
  export declare const buildLayoutItems: <T extends VListItem>(items: T[], groups: readonly GroupBoundary[]) => Array<T | GroupHeaderItem>;
27
27
  /**
28
- * Create a height function for the layout that returns the correct height
29
- * for both group headers and data items.
28
+ * Create a size function for the layout (items + headers).
29
+ *
30
+ * Maps layout indices to sizes, accounting for both group headers and data items.
30
31
  *
31
32
  * @param layout - The group layout instance
32
- * @param itemHeight - Original item height config (number or function)
33
- * @returns A height function (layoutIndex) => number suitable for HeightCache
33
+ * @param itemSize - Original item size config (number or function)
34
+ * @returns A size function (layoutIndex) => number suitable for SizeCache
34
35
  */
35
- export declare const createGroupedHeightFn: (layout: GroupLayout, itemHeight: number | ((index: number) => number)) => ((layoutIndex: number) => number);
36
+ export declare const createGroupedSizeFn: (layout: GroupLayout, itemSize: number | ((index: number) => number)) => ((layoutIndex: number) => number);
36
37
  /**
37
38
  * Create a GroupLayout instance.
38
39
  *
@@ -14,11 +14,11 @@
14
14
  *
15
15
  * Restrictions:
16
16
  * - Items must be pre-sorted by group
17
- * - Cannot be combined with direction: 'horizontal'
18
17
  *
19
18
  * Can be combined with:
20
19
  * - withGrid for grouped 2D layouts
21
20
  * - reverse: true (sticky header shows current section as you scroll up through history)
21
+ * - orientation: 'horizontal' (sticky headers stick to left edge, push left when next header approaches)
22
22
  */
23
23
  import type { VListItem } from "../../types";
24
24
  import type { VListPlugin } from "../../builder/types";
@@ -18,16 +18,17 @@
18
18
  * └── .vlist-items
19
19
  */
20
20
  import type { GroupLayout, GroupsConfig, StickyHeader } from "./types";
21
- import type { HeightCache } from "../../rendering/heights";
21
+ import type { SizeCache } from "../../rendering/sizes";
22
22
  /**
23
23
  * Create a sticky header manager.
24
24
  *
25
25
  * @param root - The vlist root element (.vlist) — sticky header is appended here
26
26
  * @param layout - Group layout for index/group resolution
27
- * @param heightCache - The LAYOUT height cache (includes headers)
27
+ * @param sizeCache - The LAYOUT size cache (includes headers)
28
28
  * @param config - Groups configuration (headerTemplate, headerHeight)
29
29
  * @param classPrefix - CSS class prefix (default: 'vlist')
30
+ * @param horizontal - Whether using horizontal scrolling mode
30
31
  * @returns StickyHeader instance
31
32
  */
32
- export declare const createStickyHeader: (root: HTMLElement, layout: GroupLayout, heightCache: HeightCache, config: GroupsConfig, classPrefix: string) => StickyHeader;
33
+ export declare const createStickyHeader: (root: HTMLElement, layout: GroupLayout, sizeCache: SizeCache, config: GroupsConfig, classPrefix: string, horizontal?: boolean) => StickyHeader;
33
34
  //# sourceMappingURL=sticky.d.ts.map
package/dist/index.d.ts CHANGED
@@ -16,9 +16,9 @@ export { withSelection } from "./features/selection";
16
16
  export { withSnapshots } from "./features/snapshots";
17
17
  export type { VList, VListConfig, VListItem, VListEvents, ItemTemplate, ItemState, SelectionMode, SelectionConfig, SelectionState, ScrollbarConfig, ScrollbarOptions, ScrollConfig, ScrollToOptions, ScrollSnapshot, VListAdapter, AdapterParams, AdapterResponse, Range, ViewportState, EventHandler, Unsubscribe, } from "./types";
18
18
  export type { VListBuilder, BuiltVList, BuilderConfig, VListPlugin, BuilderContext, } from "./builder";
19
- export { createGroupLayout as createSectionLayout, buildLayoutItems, createGroupedHeightFn as createSectionedHeightFn, createStickyHeader, isGroupHeader as isSectionHeader, type GroupsConfig as SectionsConfig, type GroupBoundary as SectionBoundary, type LayoutEntry, type GroupHeaderItem as SectionHeaderItem, type GroupLayout as SectionLayout, type StickyHeader, } from "./features/sections";
19
+ export { createGroupLayout as createSectionLayout, buildLayoutItems, createGroupedSizeFn as createSectionedSizeFn, createStickyHeader, isGroupHeader as isSectionHeader, type GroupsConfig as SectionsConfig, type GroupBoundary as SectionBoundary, type LayoutEntry, type GroupHeaderItem as SectionHeaderItem, type GroupLayout as SectionLayout, type StickyHeader, } from "./features/sections";
20
20
  export { createGridLayout, createGridRenderer, type GridConfig, type GridLayout, type GridPosition, type GridRenderer, type ItemRange, } from "./features/grid";
21
- export { createHeightCache, type HeightCache, simpleVisibleRange, calculateRenderRange, calculateTotalHeight, calculateActualHeight, calculateItemOffset, calculateScrollToIndex, clampScrollPosition, rangesEqual, isInRange, getRangeCount, diffRanges, MAX_VIRTUAL_HEIGHT, getCompressionState as getScaleState, getCompression as getScale, needsCompression as needsScaling, getMaxItemsWithoutCompression as getMaxItemsWithoutScaling, getCompressionInfo as getScaleInfo, calculateCompressedVisibleRange as calculateScaledVisibleRange, calculateCompressedRenderRange as calculateScaledRenderRange, calculateCompressedItemPosition as calculateScaledItemPosition, calculateCompressedScrollToIndex as calculateScaledScrollToIndex, calculateIndexFromScrollPosition, type CompressionState as ScaleState, } from "./rendering";
21
+ export { createSizeCache, type SizeCache, simpleVisibleRange, calculateRenderRange, calculateTotalSize, calculateActualSize, calculateItemOffset, calculateScrollToIndex, clampScrollPosition, rangesEqual, isInRange, getRangeCount, diffRanges, MAX_VIRTUAL_HEIGHT, getCompressionState as getScaleState, getCompression as getScale, needsCompression as needsScaling, getMaxItemsWithoutCompression as getMaxItemsWithoutScaling, getCompressionInfo as getScaleInfo, calculateCompressedVisibleRange as calculateScaledVisibleRange, calculateCompressedRenderRange as calculateScaledRenderRange, calculateCompressedItemPosition as calculateScaledItemPosition, calculateCompressedScrollToIndex as calculateScaledScrollToIndex, calculateIndexFromScrollPosition, type CompressionState as ScaleState, } from "./rendering";
22
22
  export { createSelectionState, selectItems, deselectItems, toggleSelection, selectAll, clearSelection, isSelected, getSelectedIds, getSelectedItems, } from "./features/selection";
23
23
  export { createEmitter, type Emitter } from "./events";
24
24
  export { createDataManager as createAsyncManager, createSparseStorage, createPlaceholderManager, isPlaceholderItem, filterPlaceholders, mergeRanges, calculateMissingRanges, type DataManager as AsyncManager, type SparseStorage, type PlaceholderManager, } from "./features/async";