Skip to content

Commit ec5bef4

Browse files
Fix svelte-virtual
1 parent 9368a80 commit ec5bef4

File tree

5 files changed

+153
-25
lines changed

5 files changed

+153
-25
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { PartialKeys, Virtualizer, VirtualizerOptions } from '@tanstack/virtual-core';
2+
export * from '@tanstack/virtual-core';
3+
import { Readable } from 'svelte/store';
4+
export type SvelteVirtualizer<TScrollElement extends Element | Window, TItemElement extends Element> = Omit<Virtualizer<TScrollElement, TItemElement>, 'setOptions'> & {
5+
setOptions: (options: Partial<VirtualizerOptions<TScrollElement, TItemElement>>) => void;
6+
};
7+
export declare function createVirtualizer<TScrollElement extends Element, TItemElement extends Element>(options: PartialKeys<VirtualizerOptions<TScrollElement, TItemElement>, 'observeElementRect' | 'observeElementOffset' | 'scrollToFn'>): Readable<SvelteVirtualizer<TScrollElement, TItemElement>>;
8+
export declare function createWindowVirtualizer<TItemElement extends Element>(options: PartialKeys<VirtualizerOptions<Window, TItemElement>, 'getScrollElement' | 'observeElementRect' | 'observeElementOffset' | 'scrollToFn'>): Readable<SvelteVirtualizer<Window, TItemElement>>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { elementScroll, observeElementOffset, observeElementRect, observeWindowOffset, observeWindowRect, Virtualizer, windowScroll, } from '@tanstack/virtual-core';
2+
export * from '@tanstack/virtual-core';
3+
import { derived, writable } from 'svelte/store';
4+
function createVirtualizerBase(initialOptions) {
5+
const virtualizer = new Virtualizer(initialOptions);
6+
const originalSetOptions = virtualizer.setOptions;
7+
let virtualizerWritable;
8+
const setOptions = (options) => {
9+
const resolvedOptions = {
10+
...virtualizer.options,
11+
...options,
12+
onChange: options.onChange,
13+
};
14+
originalSetOptions({
15+
...resolvedOptions,
16+
onChange: (instance, sync) => {
17+
virtualizerWritable.set(instance);
18+
resolvedOptions.onChange?.(instance, sync);
19+
},
20+
});
21+
virtualizer._willUpdate();
22+
};
23+
virtualizerWritable = writable(virtualizer, () => {
24+
setOptions(initialOptions);
25+
return virtualizer._didMount();
26+
});
27+
return derived(virtualizerWritable, (instance) => Object.assign(instance, { setOptions }));
28+
}
29+
export function createVirtualizer(options) {
30+
return createVirtualizerBase({
31+
observeElementRect: observeElementRect,
32+
observeElementOffset: observeElementOffset,
33+
scrollToFn: elementScroll,
34+
...options,
35+
});
36+
}
37+
export function createWindowVirtualizer(options) {
38+
return createVirtualizerBase({
39+
getScrollElement: () => (typeof document !== 'undefined' ? window : null),
40+
observeElementRect: observeWindowRect,
41+
observeElementOffset: observeWindowOffset,
42+
scrollToFn: windowScroll,
43+
initialOffset: typeof document !== 'undefined' ? window.scrollY : undefined,
44+
...options,
45+
});
46+
}

packages/svelte-virtual/package.json

+31-25
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,59 @@
11
{
22
"name": "@tanstack/svelte-virtual",
3-
"author": "Tanner Linsley",
43
"version": "3.0.4",
54
"description": "Headless UI for virtualizing scrollable elements in Svelte",
5+
"author": "Tanner Linsley",
66
"license": "MIT",
7-
"homepage": "https://github.com/tanstack/virtual#readme",
87
"repository": {
98
"type": "git",
109
"url": "git+https://github.com/tanstack/virtual.git"
1110
},
12-
"publishConfig": {
13-
"registry": "https://registry.npmjs.org/"
14-
},
15-
"keywords": [
16-
"react",
17-
"vue",
18-
"solid",
19-
"svelte",
20-
"virtual",
21-
"virtual-core",
22-
"datagrid"
23-
],
11+
"homepage": "https://github.com/tanstack/virtual#readme",
2412
"funding": {
2513
"type": "github",
2614
"url": "https://github.com/sponsors/tannerlinsley"
2715
},
28-
"types": "build/lib/index.d.ts",
29-
"main": "build/lib/index.js",
30-
"module": "build/lib/index.esm.js",
16+
"type": "module",
17+
"types": "dist/index.d.ts",
18+
"module": "dist/index.js",
19+
"svelte": "./dist/index.js",
3120
"exports": {
3221
".": {
33-
"types": "./build/lib/index.d.ts",
34-
"import": "./build/lib/index.mjs",
35-
"default": "./build/lib/index.js"
22+
"types": "./dist/index.d.ts",
23+
"svelte": "./dist/index.js",
24+
"import": "./dist/index.js"
3625
},
3726
"./package.json": "./package.json"
3827
},
3928
"sideEffects": false,
29+
"scripts": {
30+
"clean": "rimraf ./dist && rimraf ./coverage",
31+
"test:types": "svelte-check --tsconfig ./tsconfig.json",
32+
"test:build": "publint --strict",
33+
"build": "svelte-package --input ./src --output ./dist"
34+
},
35+
"keywords": [
36+
"react",
37+
"vue",
38+
"solid",
39+
"svelte",
40+
"virtual",
41+
"virtual-core",
42+
"datagrid"
43+
],
4044
"files": [
41-
"build/lib/*",
42-
"build/umd/*",
45+
"dist",
4346
"src"
4447
],
45-
"devDependencies": {
46-
"svelte": "^4.2.2"
47-
},
4848
"dependencies": {
4949
"@tanstack/virtual-core": "workspace:*"
5050
},
51+
"devDependencies": {
52+
"@sveltejs/package": "^2.2.6",
53+
"@sveltejs/vite-plugin-svelte": "^2.4.2",
54+
"svelte": "^4.2.2",
55+
"svelte-check": "^3.4.6"
56+
},
5157
"peerDependencies": {
5258
"svelte": "^3.48.0 || ^4.0.0"
5359
}
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { svelte } from '@sveltejs/vite-plugin-svelte'
2+
import { defineConfig } from 'vitest/config'
3+
4+
export default defineConfig({
5+
plugins: [svelte()],
6+
})

pnpm-lock.yaml

+62
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)