vlist 0.1.3 → 1.5.4

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.
Files changed (88) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +558 -0
  3. package/dist/builder/a11y.d.ts +16 -0
  4. package/dist/builder/api.d.ts +21 -0
  5. package/dist/builder/context.d.ts +36 -0
  6. package/dist/builder/core.d.ts +16 -0
  7. package/dist/builder/data.d.ts +69 -0
  8. package/dist/builder/dom.d.ts +15 -0
  9. package/dist/builder/index.d.ts +25 -0
  10. package/dist/builder/materialize.d.ts +165 -0
  11. package/dist/builder/pool.d.ts +10 -0
  12. package/dist/builder/range.d.ts +10 -0
  13. package/dist/builder/scroll.d.ts +24 -0
  14. package/dist/builder/types.d.ts +464 -0
  15. package/dist/builder/velocity.d.ts +23 -0
  16. package/dist/constants.d.ts +58 -0
  17. package/dist/events/emitter.d.ts +18 -0
  18. package/dist/events/index.d.ts +6 -0
  19. package/dist/features/async/feature.d.ts +72 -0
  20. package/dist/features/async/index.d.ts +9 -0
  21. package/dist/features/async/manager.d.ts +103 -0
  22. package/dist/features/async/placeholder.d.ts +54 -0
  23. package/dist/features/async/sparse.d.ts +91 -0
  24. package/dist/features/autosize/feature.d.ts +34 -0
  25. package/dist/features/autosize/index.d.ts +2 -0
  26. package/dist/features/grid/feature.d.ts +48 -0
  27. package/dist/features/grid/index.d.ts +9 -0
  28. package/dist/features/grid/layout.d.ts +29 -0
  29. package/dist/features/grid/renderer.d.ts +71 -0
  30. package/dist/features/grid/types.d.ts +71 -0
  31. package/dist/features/groups/feature.d.ts +74 -0
  32. package/dist/features/groups/index.d.ts +10 -0
  33. package/dist/features/groups/layout.d.ts +47 -0
  34. package/dist/features/groups/sticky.d.ts +21 -0
  35. package/dist/features/groups/types.d.ts +86 -0
  36. package/dist/features/masonry/feature.d.ts +45 -0
  37. package/dist/features/masonry/index.d.ts +9 -0
  38. package/dist/features/masonry/layout.d.ts +29 -0
  39. package/dist/features/masonry/renderer.d.ts +55 -0
  40. package/dist/features/masonry/types.d.ts +68 -0
  41. package/dist/features/page/feature.d.ts +53 -0
  42. package/dist/features/page/index.d.ts +8 -0
  43. package/dist/features/scale/feature.d.ts +42 -0
  44. package/dist/features/scale/index.d.ts +10 -0
  45. package/dist/features/scrollbar/controller.d.ts +121 -0
  46. package/dist/features/scrollbar/feature.d.ts +60 -0
  47. package/dist/features/scrollbar/index.d.ts +8 -0
  48. package/dist/features/scrollbar/scrollbar.d.ts +73 -0
  49. package/dist/features/selection/feature.d.ts +75 -0
  50. package/dist/features/selection/index.d.ts +7 -0
  51. package/dist/features/selection/state.d.ts +115 -0
  52. package/dist/features/snapshots/feature.d.ts +79 -0
  53. package/dist/features/snapshots/index.d.ts +9 -0
  54. package/dist/features/table/feature.d.ts +67 -0
  55. package/dist/features/table/header.d.ts +49 -0
  56. package/dist/features/table/index.d.ts +10 -0
  57. package/dist/features/table/layout.d.ts +26 -0
  58. package/dist/features/table/renderer.d.ts +72 -0
  59. package/dist/features/table/types.d.ts +239 -0
  60. package/dist/index.d.ts +28 -0
  61. package/dist/index.js +1 -0
  62. package/dist/internals.d.ts +21 -0
  63. package/dist/internals.js +1 -0
  64. package/dist/rendering/index.d.ts +12 -0
  65. package/dist/rendering/measured.d.ts +52 -0
  66. package/dist/rendering/renderer.d.ts +111 -0
  67. package/dist/rendering/scale.d.ts +121 -0
  68. package/dist/rendering/scroll.d.ts +23 -0
  69. package/dist/rendering/sizes.d.ts +63 -0
  70. package/dist/rendering/sort.d.ts +33 -0
  71. package/dist/rendering/viewport.d.ts +139 -0
  72. package/dist/size.json +1 -0
  73. package/dist/types.d.ts +487 -0
  74. package/dist/utils/padding.d.ts +38 -0
  75. package/dist/utils/stats.d.ts +49 -0
  76. package/dist/vlist-extras.css +1 -0
  77. package/dist/vlist-grid.css +1 -0
  78. package/dist/vlist-masonry.css +1 -0
  79. package/dist/vlist-table.css +1 -0
  80. package/dist/vlist.css +1 -0
  81. package/package.json +66 -14
  82. package/README.MD +0 -80
  83. package/index.d.ts +0 -3
  84. package/index.js +0 -196
  85. package/virtual-scroll.component.d.ts +0 -34
  86. package/vlist.d.ts +0 -4
  87. package/vlist.metadata.json +0 -1
  88. package/vlist.umd.js +0 -197
@@ -0,0 +1,69 @@
1
+ /**
2
+ * vlist/builder - Lightweight In-Memory Data Manager
3
+ *
4
+ * A minimal data manager that stores items in a plain array.
5
+ * No sparse storage, no placeholders, no async adapter support.
6
+ *
7
+ * This keeps the builder core small (~12 KB). When the user installs
8
+ * withData(), that feature replaces this manager with the full
9
+ * adapter-backed data manager from src/data/manager.ts.
10
+ */
11
+ import type { VListItem, Range } from "../types";
12
+ /** Minimal data state */
13
+ export interface SimpleDataState<_T extends VListItem = VListItem> {
14
+ total: number;
15
+ cached: number;
16
+ isLoading: boolean;
17
+ pendingRanges: Range[];
18
+ error: Error | undefined;
19
+ hasMore: boolean;
20
+ cursor: string | undefined;
21
+ }
22
+ /**
23
+ * SimpleDataManager — the same interface as the full DataManager,
24
+ * but backed by a plain array instead of sparse storage + placeholders.
25
+ *
26
+ * Only the methods used by the builder core and features are implemented.
27
+ * Adapter-related methods (loadRange, ensureRange, loadInitial, loadMore,
28
+ * reload, evictDistant) are no-ops or stubs.
29
+ */
30
+ export interface SimpleDataManager<T extends VListItem = VListItem> {
31
+ getState: () => SimpleDataState<T>;
32
+ getTotal: () => number;
33
+ getCached: () => number;
34
+ getIsLoading: () => boolean;
35
+ getHasMore: () => boolean;
36
+ getStorage: () => unknown;
37
+ getPlaceholders: () => unknown;
38
+ getItem: (index: number) => T | undefined;
39
+ isItemLoaded: (index: number) => boolean;
40
+ getItemsInRange: (start: number, end: number) => T[];
41
+ setTotal: (total: number) => void;
42
+ setItems: (items: T[], offset?: number, total?: number) => void;
43
+ updateItem: (index: number, updates: Partial<T>) => boolean;
44
+ removeItem: (id: string | number) => boolean;
45
+ loadRange: (start: number, end: number) => Promise<void>;
46
+ ensureRange: (start: number, end: number) => Promise<void>;
47
+ loadInitial: () => Promise<void>;
48
+ loadMore: (direction?: "down" | "up") => Promise<boolean>;
49
+ reload: () => Promise<void>;
50
+ evictDistant: (visibleStart: number, visibleEnd: number) => void;
51
+ clear: () => void;
52
+ reset: () => void;
53
+ }
54
+ export interface SimpleDataManagerConfig<T extends VListItem = VListItem> {
55
+ initialItems?: T[];
56
+ initialTotal?: number;
57
+ onStateChange?: (state: SimpleDataState<T>) => void;
58
+ onItemsLoaded?: (items: T[], offset: number, total: number) => void;
59
+ }
60
+ /**
61
+ * Create a lightweight in-memory data manager.
62
+ *
63
+ * Items are stored in a plain array. ID lookups use a Map.
64
+ * No sparse storage, no placeholders, no chunking, no eviction.
65
+ *
66
+ * ~1 KB minified vs ~8 KB for the full data manager.
67
+ */
68
+ export declare const createSimpleDataManager: <T extends VListItem = VListItem>(config?: SimpleDataManagerConfig<T>) => SimpleDataManager<T>;
69
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1,15 @@
1
+ /**
2
+ * vlist/builder — DOM Structure
3
+ * Container resolution and DOM scaffold creation for the virtual list.
4
+ */
5
+ export interface DOMStructure {
6
+ root: HTMLElement;
7
+ viewport: HTMLElement;
8
+ content: HTMLElement;
9
+ items: HTMLElement;
10
+ /** Visually-hidden live region for screen reader range announcements */
11
+ liveRegion: HTMLElement;
12
+ }
13
+ export declare const resolveContainer: (container: HTMLElement | string) => HTMLElement;
14
+ export declare const createDOMStructure: (container: HTMLElement, classPrefix: string, ariaLabel?: string, horizontal?: boolean, interactive?: boolean) => DOMStructure;
15
+ //# sourceMappingURL=dom.d.ts.map
@@ -0,0 +1,25 @@
1
+ /**
2
+ * vlist/builder - Composable Virtual List Builder
3
+ * Pick only the features you need, pay only for what you ship.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { vlist } from 'vlist/builder'
8
+ * import { withSelection } from 'vlist/selection'
9
+ * import { withScrollbar } from 'vlist/scroll'
10
+ *
11
+ * const list = vlist({
12
+ * container: '#app',
13
+ * item: { height: 48, template: renderItem },
14
+ * items: data,
15
+ * })
16
+ * .use(withSelection({ mode: 'multiple' }))
17
+ * .use(withScrollbar())
18
+ * .build()
19
+ * ```
20
+ *
21
+ * @packageDocumentation
22
+ */
23
+ export { vlist } from "./core";
24
+ export type { VListBuilder, VList, BuilderConfig, VListConfig, VListFeature, FeatureFactory, BuilderContext, ReloadOptions, BuilderState, ResolvedBuilderConfig, } from "./types";
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,165 @@
1
+ /**
2
+ * vlist/builder — Materialize Context Factory
3
+ *
4
+ * Extracts the BuilderContext object, default data-manager proxy, and default
5
+ * scroll-controller proxy out of materialize() in core.ts.
6
+ *
7
+ * All shared mutable state lives in a single `$` (MRefs) object that both
8
+ * core.ts and this module read/write through. Property names are kept short
9
+ * (2–3 chars) so they survive minification without bloating the bundle.
10
+ * Each factory destructures to readable locals on entry.
11
+ *
12
+ * Immutable dependencies are passed via a `deps` (MDeps) object — these are
13
+ * destructured once and never re-read, so their names don't matter at runtime.
14
+ */
15
+ import type { VListItem, VListEvents, ItemTemplate, ItemState, Range } from "../types";
16
+ import type { SizeCache } from "../rendering/sizes";
17
+ import type { Emitter } from "../events/emitter";
18
+ import type { DOMStructure } from "./dom";
19
+ import type { createElementPool } from "./pool";
20
+ import type { BuilderConfig, BuilderContext, BuilderState, ResolvedBuilderConfig } from "./types";
21
+ /**
22
+ * Mutable refs object shared between core.ts materialize() and context factories.
23
+ *
24
+ * Key mapping (short → long):
25
+ *
26
+ * | Key | Meaning |
27
+ * |------|------------------------|
28
+ * | it | items |
29
+ * | hc | sizeCache |
30
+ * | ch | containerHeight |
31
+ * | cw | containerWidth |
32
+ * | id | isDestroyed |
33
+ * | ii | isInitialized |
34
+ * | ls | lastScrollTop |
35
+ * | vt | velocityTracker |
36
+ * | ss | selectionSet |
37
+ * | fi | focusedIndex |
38
+ * | la | lastAriaSetSize |
39
+ * | dm | dataManagerProxy |
40
+ * | sc | scrollControllerProxy |
41
+ * | vtf | virtualTotalFn |
42
+ * | sgt | scrollGetTop |
43
+ * | sst | scrollSetTop |
44
+ * | sab | scrollIsAtBottom |
45
+ * | sic | scrollIsCompressed |
46
+ * | rfn | renderIfNeededFn |
47
+ * | ffn | forceRenderFn |
48
+ * | gvr | getVisibleRange |
49
+ * | gsp | getScrollToPos |
50
+ * | pef | positionElementFn |
51
+ * | at | activeTemplate |
52
+ * | vre | viewportResizeEnabled |
53
+ * | st | scrollTarget |
54
+ * | gcw | getContainerWidth |
55
+ * | gch | getContainerHeight |
56
+ */
57
+ export interface MRefs<T extends VListItem = VListItem> {
58
+ /** items */
59
+ it: T[];
60
+ /** sizeCache */
61
+ hc: SizeCache;
62
+ /** containerHeight */
63
+ ch: number;
64
+ /** containerWidth */
65
+ cw: number;
66
+ /** isDestroyed */
67
+ id: boolean;
68
+ /** isInitialized */
69
+ ii: boolean;
70
+ /** lastScrollTop */
71
+ ls: number;
72
+ /** velocityTracker */
73
+ vt: {
74
+ velocity: number;
75
+ sampleCount: number;
76
+ };
77
+ /** selectionSet */
78
+ ss: Set<string | number>;
79
+ /** focusedIndex */
80
+ fi: number;
81
+ /** lastAriaSetSize */
82
+ la: string;
83
+ /** dataManagerProxy */
84
+ dm: any;
85
+ /** scrollControllerProxy */
86
+ sc: any;
87
+ /** virtualTotalFn */
88
+ vtf: () => number;
89
+ /** scrollGetTop */
90
+ sgt: () => number;
91
+ /** scrollSetTop */
92
+ sst: (pos: number) => void;
93
+ /** scrollIsAtBottom */
94
+ sab: (threshold?: number) => boolean;
95
+ /** scrollIsCompressed */
96
+ sic: boolean;
97
+ /** renderIfNeededFn */
98
+ rfn: () => void;
99
+ /** forceRenderFn */
100
+ ffn: () => void;
101
+ /** getVisibleRange */
102
+ gvr: (scrollTop: number, cHeight: number, hc: SizeCache, total: number, out: Range) => void;
103
+ /** getScrollToPos */
104
+ gsp: (index: number, hc: SizeCache, cHeight: number, total: number, align: "start" | "center" | "end") => number;
105
+ /** positionElementFn */
106
+ pef: (element: HTMLElement, index: number) => void;
107
+ /** activeTemplate */
108
+ at: ItemTemplate<T>;
109
+ /** viewportResizeEnabled */
110
+ vre: boolean;
111
+ /** scrollTarget */
112
+ st: HTMLElement | Window;
113
+ /** wheelHandler - for features to disable wheel handling if needed */
114
+ wh: ((e: WheelEvent) => void) | null;
115
+ /** getContainerWidth */
116
+ gcw: () => number;
117
+ /** getContainerHeight */
118
+ gch: () => number;
119
+ /** gap — item spacing along main axis (0 = none) */
120
+ gp: number;
121
+ /** mainAxisPadding — sum of CSS padding along scroll axis (0 = none) */
122
+ mp: number;
123
+ /** stripeIndexFn — maps layout index to stripe index (-1 = skip) */
124
+ sif: (index: number) => number;
125
+ /** itemToScrollIndex — maps flat item index to size-cache index (identity for list, floor(index/cols) for grid) */
126
+ i2s: (index: number) => number;
127
+ /** updateItemClassesFn */
128
+ uic: (index: number, isSelected: boolean, isFocused: boolean) => void;
129
+ /** constrainSizeForIndex — null = always constrain (Mode A default) */
130
+ csi: ((index: number) => boolean) | null;
131
+ }
132
+ /** Immutable dependencies the context factory needs from materialize(). */
133
+ export interface MDeps<T extends VListItem = VListItem> {
134
+ readonly dom: DOMStructure;
135
+ readonly emitter: Emitter<VListEvents<T>>;
136
+ readonly resolvedConfig: ResolvedBuilderConfig;
137
+ readonly rawConfig: BuilderConfig<T>;
138
+ readonly rendered: Map<number, HTMLElement>;
139
+ readonly pool: ReturnType<typeof createElementPool>;
140
+ readonly itemState: ItemState;
141
+ readonly sharedState: BuilderState;
142
+ readonly renderRange: Range;
143
+ readonly isHorizontal: boolean;
144
+ readonly classPrefix: string;
145
+ readonly contentSizeHandlers: Array<() => void>;
146
+ readonly idleHandlers: Array<() => void>;
147
+ readonly afterScroll: Array<(scrollPosition: number, direction: string) => void>;
148
+ readonly clickHandlers: Array<(event: MouseEvent) => void>;
149
+ readonly keydownHandlers: Array<(event: KeyboardEvent) => void>;
150
+ readonly resizeHandlers: Array<(width: number, height: number) => void>;
151
+ readonly destroyHandlers: Array<() => void>;
152
+ readonly methods: Map<string, Function>;
153
+ readonly onScrollFrame: () => void;
154
+ readonly resizeObserver: ResizeObserver;
155
+ readonly afterRenderBatch: ReadonlyArray<(items: ReadonlyArray<{
156
+ index: number;
157
+ element: HTMLElement;
158
+ }>) => void>;
159
+ readonly applyTemplate: (element: HTMLElement, result: string | HTMLElement) => void;
160
+ readonly updateContentSize: () => void;
161
+ }
162
+ export declare const createMaterializeCtx: <T extends VListItem = VListItem>($: MRefs<T>, deps: MDeps<T>) => BuilderContext<T>;
163
+ export declare const createDefaultDataProxy: <T extends VListItem = VListItem>($: MRefs<T>, deps: Pick<MDeps<T>, "rendered" | "itemState" | "contentSizeHandlers" | "applyTemplate" | "updateContentSize">, ctx: BuilderContext<T>) => any;
164
+ export declare const createDefaultScrollProxy: <T extends VListItem = VListItem>($: MRefs<T>, deps: Pick<MDeps<T>, "dom" | "classPrefix">) => any;
165
+ //# sourceMappingURL=materialize.d.ts.map
@@ -0,0 +1,10 @@
1
+ /**
2
+ * vlist/builder — Element Pool
3
+ * Recycling pool for DOM elements to reduce allocation during scrolling.
4
+ */
5
+ export declare const createElementPool: (maxSize?: number) => {
6
+ acquire: () => HTMLElement;
7
+ release: (el: HTMLElement) => void;
8
+ clear: () => void;
9
+ };
10
+ //# sourceMappingURL=pool.d.ts.map
@@ -0,0 +1,10 @@
1
+ /**
2
+ * vlist/builder — Range Calculations
3
+ * Visible range detection, overscan application, and scroll-to-index positioning.
4
+ */
5
+ import type { Range } from "../types";
6
+ import type { SizeCache } from "../rendering/sizes";
7
+ export declare const calcVisibleRange: (scrollPosition: number, containerHeight: number, hc: SizeCache, totalItems: number, out: Range) => void;
8
+ export declare const applyOverscan: (visible: Range, overscan: number, totalItems: number, out: Range) => void;
9
+ export declare const calcScrollToPosition: (index: number, hc: SizeCache, containerHeight: number, totalItems: number, align: "start" | "center" | "end", mainAxisPadding?: number) => number;
10
+ //# sourceMappingURL=range.d.ts.map
@@ -0,0 +1,24 @@
1
+ /**
2
+ * vlist/builder — Scroll Utilities
3
+ * Easing, scroll-argument resolution, and smooth scroll animation.
4
+ */
5
+ import type { ScrollToOptions } from "../types";
6
+ export declare const easeInOutQuad: (t: number) => number;
7
+ export declare const resolveScrollArgs: (o?: "start" | "center" | "end" | ScrollToOptions) => {
8
+ align: "start" | "center" | "end";
9
+ behavior: "auto" | "smooth";
10
+ duration: number;
11
+ };
12
+ /** Scroll controller interface — minimal surface needed by the animation. */
13
+ export interface ScrollController {
14
+ scrollTo: (position: number) => void;
15
+ getScrollTop: () => number;
16
+ }
17
+ /**
18
+ * Create a smooth scroll animator with its own animation state.
19
+ */
20
+ export declare const createSmoothScroll: (scrollController: ScrollController, renderFn: () => void) => {
21
+ animateScroll: (from: number, to: number, duration: number) => void;
22
+ cancelScroll: () => void;
23
+ };
24
+ //# sourceMappingURL=scroll.d.ts.map