UNPKG

@tanstack/solid-virtual

Version:

Headless UI for virtualizing scrollable elements in Solid

66 lines (65 loc) 2.29 kB
import { elementScroll, observeElementOffset, observeElementRect, windowScroll, observeWindowOffset, observeWindowRect, Virtualizer } from "@tanstack/virtual-core"; export * from "@tanstack/virtual-core"; import { mergeProps, createSignal, onMount, onCleanup, createComputed } from "solid-js"; import { createStore, reconcile } from "solid-js/store"; function createVirtualizerBase(options) { const resolvedOptions = mergeProps(options); const instance = new Virtualizer(resolvedOptions); const [virtualItems, setVirtualItems] = createStore(instance.getVirtualItems()); const [totalSize, setTotalSize] = createSignal(instance.getTotalSize()); const handler = { get(target, prop) { switch (prop) { case "getVirtualItems": return () => virtualItems; case "getTotalSize": return () => totalSize(); default: return Reflect.get(target, prop); } } }; const virtualizer = new Proxy(instance, handler); virtualizer.setOptions(resolvedOptions); onMount(() => { const cleanup = virtualizer._didMount(); virtualizer._willUpdate(); onCleanup(cleanup); }); createComputed(() => { virtualizer.setOptions(mergeProps(resolvedOptions, options, { onChange: (instance2, sync) => { var _a; instance2._willUpdate(); setVirtualItems(reconcile(instance2.getVirtualItems(), { key: "index" })); setTotalSize(instance2.getTotalSize()); (_a = options.onChange) == null ? void 0 : _a.call(options, instance2, sync); } })); virtualizer.measure(); }); return virtualizer; } function createVirtualizer(options) { return createVirtualizerBase(mergeProps({ observeElementRect, observeElementOffset, scrollToFn: elementScroll }, options)); } function createWindowVirtualizer(options) { return createVirtualizerBase(mergeProps({ getScrollElement: () => typeof document !== "undefined" ? window : null, observeElementRect: observeWindowRect, observeElementOffset: observeWindowOffset, scrollToFn: windowScroll, initialOffset: () => typeof document !== "undefined" ? window.scrollY : 0 }, options)); } export { createVirtualizer, createWindowVirtualizer }; //# sourceMappingURL=index.js.map