UNPKG

@tanstack/svelte-virtual

Version:

Headless UI for virtualizing scrollable elements in Svelte

48 lines (47 loc) 1.86 kB
import { Virtualizer, elementScroll, observeElementOffset, observeElementRect, observeWindowOffset, observeWindowRect, windowScroll, } from '@tanstack/virtual-core'; import { derived, writable } from 'svelte/store'; export * from '@tanstack/virtual-core'; function createVirtualizerBase(initialOptions) { const virtualizer = new Virtualizer(initialOptions); const originalSetOptions = virtualizer.setOptions; // eslint-disable-next-line prefer-const let virtualizerWritable; const setOptions = (options) => { const resolvedOptions = { ...virtualizer.options, ...options, onChange: options.onChange, }; originalSetOptions({ ...resolvedOptions, onChange: (instance, sync) => { virtualizerWritable.set(instance); resolvedOptions.onChange?.(instance, sync); }, }); virtualizer._willUpdate(); }; virtualizerWritable = writable(virtualizer, () => { setOptions(initialOptions); return virtualizer._didMount(); }); return derived(virtualizerWritable, (instance) => Object.assign(instance, { setOptions })); } export function createVirtualizer(options) { return createVirtualizerBase({ observeElementRect: observeElementRect, observeElementOffset: observeElementOffset, scrollToFn: elementScroll, ...options, }); } export function createWindowVirtualizer(options) { return createVirtualizerBase({ getScrollElement: () => (typeof document !== 'undefined' ? window : null), observeElementRect: observeWindowRect, observeElementOffset: observeWindowOffset, scrollToFn: windowScroll, initialOffset: () => (typeof document !== 'undefined' ? window.scrollY : 0), ...options, }); }