diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index d8e41189f..9b72a44ba 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -28,6 +28,8 @@ jobs: uses: nrwl/nx-set-shas@v4.3.0 with: main-branch-name: main + - name: Install Playwright browsers + run: pnpm exec playwright install chromium - name: Run Checks run: pnpm run test:pr preview: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 35a381e00..16532632a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -28,6 +28,8 @@ jobs: fetch-depth: 0 - name: Setup Tools uses: tanstack/config/.github/setup@main + - name: Install Playwright browsers + run: pnpm exec playwright install chromium - name: Run Tests run: pnpm run test:ci - name: Run Changesets (version or publish) diff --git a/.gitignore b/.gitignore index cc376bd6c..2a91fb574 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,8 @@ stats.html vite.config.js.timestamp-* vite.config.ts.timestamp-* + +# Playwright test artifacts +test-results/ +playwright-report/ +*.log diff --git a/examples/angular/dynamic/package.json b/examples/angular/dynamic/package.json index 998300cd6..df5dcfed4 100644 --- a/examples/angular/dynamic/package.json +++ b/examples/angular/dynamic/package.json @@ -18,7 +18,7 @@ "@angular/platform-browser-dynamic": "^17.3.12", "@angular/router": "^17.3.12", "@faker-js/faker": "^8.4.1", - "@tanstack/angular-virtual": "^3.13.11", + "@tanstack/angular-virtual": "^3.13.12", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.1" diff --git a/examples/angular/fixed/package.json b/examples/angular/fixed/package.json index 28a3f8d5e..36ff8ee9c 100644 --- a/examples/angular/fixed/package.json +++ b/examples/angular/fixed/package.json @@ -17,7 +17,7 @@ "@angular/platform-browser": "^17.3.12", "@angular/platform-browser-dynamic": "^17.3.12", "@angular/router": "^17.3.12", - "@tanstack/angular-virtual": "^3.13.11", + "@tanstack/angular-virtual": "^3.13.12", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.1" diff --git a/examples/angular/infinite-scroll/package.json b/examples/angular/infinite-scroll/package.json index 3369df4e0..5440c2dff 100644 --- a/examples/angular/infinite-scroll/package.json +++ b/examples/angular/infinite-scroll/package.json @@ -18,7 +18,7 @@ "@angular/platform-browser-dynamic": "^17.3.12", "@angular/router": "^17.3.12", "@tanstack/angular-query-experimental": "5.80.7", - "@tanstack/angular-virtual": "^3.13.11", + "@tanstack/angular-virtual": "^3.13.12", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.1" diff --git a/examples/angular/padding/package.json b/examples/angular/padding/package.json index 5b440d8b1..c36a82d46 100644 --- a/examples/angular/padding/package.json +++ b/examples/angular/padding/package.json @@ -17,7 +17,7 @@ "@angular/platform-browser": "^17.3.12", "@angular/platform-browser-dynamic": "^17.3.12", "@angular/router": "^17.3.12", - "@tanstack/angular-virtual": "^3.13.11", + "@tanstack/angular-virtual": "^3.13.12", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.1" diff --git a/examples/angular/smooth-scroll/package.json b/examples/angular/smooth-scroll/package.json index b47b123ed..fc9eb3b34 100644 --- a/examples/angular/smooth-scroll/package.json +++ b/examples/angular/smooth-scroll/package.json @@ -17,7 +17,7 @@ "@angular/platform-browser": "^17.3.12", "@angular/platform-browser-dynamic": "^17.3.12", "@angular/router": "^17.3.12", - "@tanstack/angular-virtual": "^3.13.11", + "@tanstack/angular-virtual": "^3.13.12", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.1" diff --git a/examples/angular/sticky/package.json b/examples/angular/sticky/package.json index 9ce425680..d63f060d0 100644 --- a/examples/angular/sticky/package.json +++ b/examples/angular/sticky/package.json @@ -18,7 +18,7 @@ "@angular/platform-browser-dynamic": "^17.3.12", "@angular/router": "^17.3.12", "@faker-js/faker": "^8.4.1", - "@tanstack/angular-virtual": "^3.13.11", + "@tanstack/angular-virtual": "^3.13.12", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.1" diff --git a/examples/angular/table/package.json b/examples/angular/table/package.json index 9529c176c..bae19a419 100644 --- a/examples/angular/table/package.json +++ b/examples/angular/table/package.json @@ -19,7 +19,7 @@ "@angular/router": "^17.3.12", "@faker-js/faker": "^8.4.1", "@tanstack/angular-table": "8.21.3", - "@tanstack/angular-virtual": "^3.13.11", + "@tanstack/angular-virtual": "^3.13.12", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.1" diff --git a/examples/angular/variable/package.json b/examples/angular/variable/package.json index 6a5527e4e..5a904d618 100644 --- a/examples/angular/variable/package.json +++ b/examples/angular/variable/package.json @@ -17,7 +17,7 @@ "@angular/platform-browser": "^17.3.12", "@angular/platform-browser-dynamic": "^17.3.12", "@angular/router": "^17.3.12", - "@tanstack/angular-virtual": "^3.13.11", + "@tanstack/angular-virtual": "^3.13.12", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.1" diff --git a/examples/angular/window/package.json b/examples/angular/window/package.json index 119bf4dc3..3925d15df 100644 --- a/examples/angular/window/package.json +++ b/examples/angular/window/package.json @@ -17,7 +17,7 @@ "@angular/platform-browser": "^17.3.12", "@angular/platform-browser-dynamic": "^17.3.12", "@angular/router": "^17.3.12", - "@tanstack/angular-virtual": "^3.13.11", + "@tanstack/angular-virtual": "^3.13.12", "rxjs": "^7.8.2", "tslib": "^2.8.1", "zone.js": "0.15.1" diff --git a/examples/lit/dynamic/package.json b/examples/lit/dynamic/package.json index 587bab405..268e1f4b5 100644 --- a/examples/lit/dynamic/package.json +++ b/examples/lit/dynamic/package.json @@ -9,8 +9,8 @@ }, "dependencies": { "@faker-js/faker": "^8.4.1", - "@tanstack/lit-virtual": "^3.13.11", - "@tanstack/virtual-core": "^3.13.11", + "@tanstack/lit-virtual": "^3.13.12", + "@tanstack/virtual-core": "^3.13.12", "lit": "^3.3.0" }, "devDependencies": { diff --git a/examples/lit/fixed/package.json b/examples/lit/fixed/package.json index 32c252c76..21655cab2 100644 --- a/examples/lit/fixed/package.json +++ b/examples/lit/fixed/package.json @@ -9,8 +9,8 @@ }, "dependencies": { "@faker-js/faker": "^8.4.1", - "@tanstack/lit-virtual": "^3.13.11", - "@tanstack/virtual-core": "^3.13.11", + "@tanstack/lit-virtual": "^3.13.12", + "@tanstack/virtual-core": "^3.13.12", "lit": "^3.3.0" }, "devDependencies": { diff --git a/examples/react/dynamic/package.json b/examples/react/dynamic/package.json index 003814c39..83ac0a396 100644 --- a/examples/react/dynamic/package.json +++ b/examples/react/dynamic/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "@faker-js/faker": "^8.4.1", - "@tanstack/react-virtual": "^3.13.11", + "@tanstack/react-virtual": "^3.13.12", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/examples/react/fixed/package.json b/examples/react/fixed/package.json index abd21541c..9b2f02aa7 100644 --- a/examples/react/fixed/package.json +++ b/examples/react/fixed/package.json @@ -8,7 +8,7 @@ "serve": "vite preview" }, "dependencies": { - "@tanstack/react-virtual": "^3.13.11", + "@tanstack/react-virtual": "^3.13.12", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/examples/react/infinite-scroll/package.json b/examples/react/infinite-scroll/package.json index 7e7d2ef23..d52035f64 100644 --- a/examples/react/infinite-scroll/package.json +++ b/examples/react/infinite-scroll/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@tanstack/react-query": "^5.80.7", - "@tanstack/react-virtual": "^3.13.11", + "@tanstack/react-virtual": "^3.13.12", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/examples/react/padding/package.json b/examples/react/padding/package.json index 96c8e628d..ac6851cee 100644 --- a/examples/react/padding/package.json +++ b/examples/react/padding/package.json @@ -9,7 +9,7 @@ "start": "vite" }, "dependencies": { - "@tanstack/react-virtual": "^3.13.11", + "@tanstack/react-virtual": "^3.13.12", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/examples/react/scroll-padding/package.json b/examples/react/scroll-padding/package.json index 6a9148f6a..fa36ebfc0 100644 --- a/examples/react/scroll-padding/package.json +++ b/examples/react/scroll-padding/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@react-hookz/web": "^25.1.1", - "@tanstack/react-virtual": "^3.13.11", + "@tanstack/react-virtual": "^3.13.12", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/examples/react/smooth-scroll/package.json b/examples/react/smooth-scroll/package.json index c6e50e9de..446fc813c 100644 --- a/examples/react/smooth-scroll/package.json +++ b/examples/react/smooth-scroll/package.json @@ -9,7 +9,7 @@ "start": "vite" }, "dependencies": { - "@tanstack/react-virtual": "^3.13.11", + "@tanstack/react-virtual": "^3.13.12", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/examples/react/sticky/package.json b/examples/react/sticky/package.json index 1cf073027..50706ad7c 100644 --- a/examples/react/sticky/package.json +++ b/examples/react/sticky/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@faker-js/faker": "^8.4.1", - "@tanstack/react-virtual": "^3.13.11", + "@tanstack/react-virtual": "^3.13.12", "lodash": "^4.17.21", "react": "^18.3.1", "react-dom": "^18.3.1" diff --git a/examples/react/table/package.json b/examples/react/table/package.json index 1f040c9fc..51f48079f 100644 --- a/examples/react/table/package.json +++ b/examples/react/table/package.json @@ -11,7 +11,7 @@ "dependencies": { "@faker-js/faker": "^8.4.1", "@tanstack/react-table": "^8.21.3", - "@tanstack/react-virtual": "^3.13.11", + "@tanstack/react-virtual": "^3.13.12", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/examples/react/variable/package.json b/examples/react/variable/package.json index 2acd9d508..f758c579c 100644 --- a/examples/react/variable/package.json +++ b/examples/react/variable/package.json @@ -9,7 +9,7 @@ "start": "vite" }, "dependencies": { - "@tanstack/react-virtual": "^3.13.11", + "@tanstack/react-virtual": "^3.13.12", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/examples/react/window/package.json b/examples/react/window/package.json index df21c1892..eb74bac54 100644 --- a/examples/react/window/package.json +++ b/examples/react/window/package.json @@ -8,7 +8,7 @@ "serve": "vite preview" }, "dependencies": { - "@tanstack/react-virtual": "^3.13.11", + "@tanstack/react-virtual": "^3.13.12", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/examples/svelte/dynamic/package.json b/examples/svelte/dynamic/package.json index e4b32325e..2c38cd71e 100644 --- a/examples/svelte/dynamic/package.json +++ b/examples/svelte/dynamic/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@faker-js/faker": "^8.4.1", - "@tanstack/svelte-virtual": "^3.13.11" + "@tanstack/svelte-virtual": "^3.13.12" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^3.1.2", diff --git a/examples/svelte/fixed/package.json b/examples/svelte/fixed/package.json index 24c1be7c6..a893fe447 100644 --- a/examples/svelte/fixed/package.json +++ b/examples/svelte/fixed/package.json @@ -9,7 +9,7 @@ "check": "svelte-check --tsconfig ./tsconfig.json" }, "dependencies": { - "@tanstack/svelte-virtual": "^3.13.11" + "@tanstack/svelte-virtual": "^3.13.12" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^3.1.2", diff --git a/examples/svelte/infinite-scroll/package.json b/examples/svelte/infinite-scroll/package.json index 59ae7851a..fb2607d19 100644 --- a/examples/svelte/infinite-scroll/package.json +++ b/examples/svelte/infinite-scroll/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@tanstack/svelte-query": "^5.80.7", - "@tanstack/svelte-virtual": "^3.13.11" + "@tanstack/svelte-virtual": "^3.13.12" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^3.1.2", diff --git a/examples/svelte/smooth-scroll/package.json b/examples/svelte/smooth-scroll/package.json index 515e00644..50d20d2b5 100644 --- a/examples/svelte/smooth-scroll/package.json +++ b/examples/svelte/smooth-scroll/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@faker-js/faker": "^8.4.1", - "@tanstack/svelte-virtual": "^3.13.11" + "@tanstack/svelte-virtual": "^3.13.12" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^3.1.2", diff --git a/examples/svelte/sticky/package.json b/examples/svelte/sticky/package.json index 1fa3be225..032404252 100644 --- a/examples/svelte/sticky/package.json +++ b/examples/svelte/sticky/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@faker-js/faker": "^8.4.1", - "@tanstack/svelte-virtual": "^3.13.11", + "@tanstack/svelte-virtual": "^3.13.12", "lodash": "^4.17.21" }, "devDependencies": { diff --git a/examples/svelte/table/package.json b/examples/svelte/table/package.json index 21dcb8103..692c850bb 100644 --- a/examples/svelte/table/package.json +++ b/examples/svelte/table/package.json @@ -11,7 +11,7 @@ "dependencies": { "@faker-js/faker": "^8.4.1", "@tanstack/svelte-table": "^8.21.3", - "@tanstack/svelte-virtual": "^3.13.11" + "@tanstack/svelte-virtual": "^3.13.12" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^3.1.2", diff --git a/examples/vue/dynamic/package.json b/examples/vue/dynamic/package.json index fee4f48d5..cd017bdf9 100644 --- a/examples/vue/dynamic/package.json +++ b/examples/vue/dynamic/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "@faker-js/faker": "^8.4.1", - "@tanstack/vue-virtual": "^3.13.11", + "@tanstack/vue-virtual": "^3.13.12", "vue": "^3.5.16" }, "devDependencies": { diff --git a/examples/vue/fixed/package.json b/examples/vue/fixed/package.json index 20c61d47d..b11ee85b2 100644 --- a/examples/vue/fixed/package.json +++ b/examples/vue/fixed/package.json @@ -8,7 +8,7 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/vue-virtual": "^3.13.11", + "@tanstack/vue-virtual": "^3.13.12", "vue": "^3.5.16" }, "devDependencies": { diff --git a/examples/vue/infinite-scroll/package.json b/examples/vue/infinite-scroll/package.json index 5a8082f97..e32d32a42 100644 --- a/examples/vue/infinite-scroll/package.json +++ b/examples/vue/infinite-scroll/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "@tanstack/vue-query": "^5.80.7", - "@tanstack/vue-virtual": "^3.13.11", + "@tanstack/vue-virtual": "^3.13.12", "vue": "^3.5.16" }, "devDependencies": { diff --git a/examples/vue/padding/package.json b/examples/vue/padding/package.json index be46b4f75..f8183738c 100644 --- a/examples/vue/padding/package.json +++ b/examples/vue/padding/package.json @@ -8,7 +8,7 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/vue-virtual": "^3.13.11", + "@tanstack/vue-virtual": "^3.13.12", "vue": "^3.5.16" }, "devDependencies": { diff --git a/examples/vue/scroll-padding/package.json b/examples/vue/scroll-padding/package.json index 9fa9e9949..c195c4983 100644 --- a/examples/vue/scroll-padding/package.json +++ b/examples/vue/scroll-padding/package.json @@ -8,7 +8,7 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/vue-virtual": "^3.13.11", + "@tanstack/vue-virtual": "^3.13.12", "@vueuse/core": "^12.8.2", "vue": "^3.5.16" }, diff --git a/examples/vue/smooth-scroll/package.json b/examples/vue/smooth-scroll/package.json index 006ca1c48..be226253a 100644 --- a/examples/vue/smooth-scroll/package.json +++ b/examples/vue/smooth-scroll/package.json @@ -8,7 +8,7 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/vue-virtual": "^3.13.11", + "@tanstack/vue-virtual": "^3.13.12", "vue": "^3.5.16" }, "devDependencies": { diff --git a/examples/vue/sticky/package.json b/examples/vue/sticky/package.json index 821ab6991..73b849d5b 100644 --- a/examples/vue/sticky/package.json +++ b/examples/vue/sticky/package.json @@ -9,7 +9,7 @@ }, "dependencies": { "@faker-js/faker": "^8.4.1", - "@tanstack/vue-virtual": "^3.13.11", + "@tanstack/vue-virtual": "^3.13.12", "lodash": "^4.17.21", "vue": "^3.5.16" }, diff --git a/examples/vue/table/package.json b/examples/vue/table/package.json index fa82e7a24..5248ffe20 100644 --- a/examples/vue/table/package.json +++ b/examples/vue/table/package.json @@ -10,7 +10,7 @@ "dependencies": { "@faker-js/faker": "^8.4.1", "@tanstack/vue-table": "^8.21.3", - "@tanstack/vue-virtual": "^3.13.11", + "@tanstack/vue-virtual": "^3.13.12", "vue": "^3.5.16" }, "devDependencies": { diff --git a/examples/vue/variable/package.json b/examples/vue/variable/package.json index 81f7faf5e..9a1ee2b68 100644 --- a/examples/vue/variable/package.json +++ b/examples/vue/variable/package.json @@ -8,7 +8,7 @@ "preview": "vite preview" }, "dependencies": { - "@tanstack/vue-virtual": "^3.13.11", + "@tanstack/vue-virtual": "^3.13.12", "vue": "^3.5.16" }, "devDependencies": { diff --git a/knip.json b/knip.json index 639c5df88..f3a69e7a2 100644 --- a/knip.json +++ b/knip.json @@ -1,4 +1,4 @@ { "$schema": "https://unpkg.com/knip@5/schema.json", - "ignoreWorkspaces": ["examples/**"] + "ignoreWorkspaces": ["examples/**", "packages/react-virtual/e2e/**"] } diff --git a/package.json b/package.json index ee01fe550..370508b6c 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ "clean": "pnpm --filter \"./packages/**\" run clean", "preinstall": "node -e \"if(process.env.CI == 'true') {console.log('Skipping preinstall...'); process.exit(1)}\" || npx -y only-allow pnpm", "test": "pnpm run test:ci", - "test:pr": "nx affected --targets=test:sherif,test:knip,test:eslint,test:lib,test:types,test:build,build", - "test:ci": "nx run-many --targets=test:sherif,test:knip,test:eslint,test:lib,test:types,test:build,build", + "test:pr": "nx affected --targets=test:sherif,test:knip,test:eslint,test:lib,test:e2e,test:types,test:build,build", + "test:ci": "nx run-many --targets=test:sherif,test:knip,test:eslint,test:lib,test:e2e,test:types,test:build,build", "test:eslint": "nx affected --target=test:eslint", "test:format": "pnpm run prettier --check", "test:sherif": "sherif", @@ -20,6 +20,7 @@ "test:lib:dev": "pnpm run test:lib && nx watch --all -- pnpm run test:lib", "test:build": "nx affected --target=test:build --exclude=examples/**", "test:types": "nx affected --target=test:types --exclude=examples/**", + "test:e2e": "nx affected --target=test:e2e --exclude=examples/**", "test:knip": "knip", "build": "nx affected --target=build --exclude=examples/**", "build:all": "nx run-many --target=build --exclude=examples/**", @@ -39,6 +40,7 @@ }, "devDependencies": { "@changesets/cli": "^2.29.4", + "@playwright/test": "^1.53.1", "@svitejs/changesets-changelog-github-compact": "^1.2.0", "@tanstack/config": "^0.18.2", "@testing-library/jest-dom": "^6.6.3", diff --git a/packages/angular-virtual/CHANGELOG.md b/packages/angular-virtual/CHANGELOG.md index f1bf7d7da..349888a98 100644 --- a/packages/angular-virtual/CHANGELOG.md +++ b/packages/angular-virtual/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/angular-virtual +## 3.13.12 + +### Patch Changes + +- Updated dependencies [[`d21ed98`](https://github.com/TanStack/virtual/commit/d21ed98da3470b9986c9a028ed70fdf0d6189ab4)]: + - @tanstack/virtual-core@3.13.12 + ## 3.13.11 ### Patch Changes diff --git a/packages/angular-virtual/package.json b/packages/angular-virtual/package.json index 3a1ceaba4..6574fdff3 100644 --- a/packages/angular-virtual/package.json +++ b/packages/angular-virtual/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/angular-virtual", - "version": "3.13.11", + "version": "3.13.12", "description": "Headless UI for virtualizing scrollable elements in Angular", "author": "Garrett Darnell", "license": "MIT", diff --git a/packages/lit-virtual/CHANGELOG.md b/packages/lit-virtual/CHANGELOG.md index 2f76a109c..be7e68988 100644 --- a/packages/lit-virtual/CHANGELOG.md +++ b/packages/lit-virtual/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/lit-virtual +## 3.13.12 + +### Patch Changes + +- Updated dependencies [[`d21ed98`](https://github.com/TanStack/virtual/commit/d21ed98da3470b9986c9a028ed70fdf0d6189ab4)]: + - @tanstack/virtual-core@3.13.12 + ## 3.13.11 ### Patch Changes diff --git a/packages/lit-virtual/package.json b/packages/lit-virtual/package.json index 4abf17894..aeb07a9c7 100644 --- a/packages/lit-virtual/package.json +++ b/packages/lit-virtual/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/lit-virtual", - "version": "3.13.11", + "version": "3.13.12", "description": "Headless UI for virtualizing scrollable elements in Lit", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/react-virtual/CHANGELOG.md b/packages/react-virtual/CHANGELOG.md index 61357397b..d70879c81 100644 --- a/packages/react-virtual/CHANGELOG.md +++ b/packages/react-virtual/CHANGELOG.md @@ -1,5 +1,14 @@ # @tanstack/react-virtual +## 3.13.12 + +### Patch Changes + +- chore(react-virtual): fix vite e2e build ([#1030](https://github.com/TanStack/virtual/pull/1030)) + +- Updated dependencies [[`d21ed98`](https://github.com/TanStack/virtual/commit/d21ed98da3470b9986c9a028ed70fdf0d6189ab4)]: + - @tanstack/virtual-core@3.13.12 + ## 3.13.11 ### Patch Changes diff --git a/packages/react-virtual/e2e/app/index.html b/packages/react-virtual/e2e/app/index.html new file mode 100644 index 000000000..6d5c94aec --- /dev/null +++ b/packages/react-virtual/e2e/app/index.html @@ -0,0 +1,10 @@ + + + + + + +
+ + + diff --git a/packages/react-virtual/e2e/app/main.tsx b/packages/react-virtual/e2e/app/main.tsx new file mode 100644 index 000000000..e99be4b33 --- /dev/null +++ b/packages/react-virtual/e2e/app/main.tsx @@ -0,0 +1,76 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { useVirtualizer } from '@tanstack/react-virtual' + +function getRandomInt(min: number, max: number) { + return Math.floor(Math.random() * (max - min + 1)) + min +} + +const randomHeight = (() => { + const cache = new Map() + return (id: string) => { + const value = cache.get(id) + if (value !== undefined) { + return value + } + const v = getRandomInt(25, 100) + cache.set(id, v) + return v + } +})() + +const App = () => { + const parentRef = React.useRef(null) + const rowVirtualizer = useVirtualizer({ + count: 1002, + getScrollElement: () => parentRef.current, + estimateSize: () => 50, + debug: true, + }) + + return ( +
+ + +
+
+ {rowVirtualizer.getVirtualItems().map((v) => ( +
+
+ Row {v.index} +
+
+ ))} +
+
+
+ ) +} + +ReactDOM.createRoot(document.getElementById('root')!).render() diff --git a/packages/react-virtual/e2e/app/test/scroll.spec.ts b/packages/react-virtual/e2e/app/test/scroll.spec.ts new file mode 100644 index 000000000..65ba73b3a --- /dev/null +++ b/packages/react-virtual/e2e/app/test/scroll.spec.ts @@ -0,0 +1,33 @@ +import { expect, test } from '@playwright/test' + +const check = () => { + const item = document.querySelector('[data-testid="item-1000"]') + const container = document.querySelector('#scroll-container') + + if (!item || !container) throw new Error('Elements not found') + + const itemRect = item.getBoundingClientRect() + const containerRect = container.getBoundingClientRect() + const scrollTop = container.scrollTop + + const top = itemRect.top + scrollTop - containerRect.top + const botttom = top + itemRect.height + + const containerBottom = scrollTop + container.clientHeight + + return Math.abs(botttom - containerBottom) +} + +test('scrolls to index 1000', async ({ page }) => { + await page.goto('/') + await page.click('#scroll-to-1000') + + // Wait for scroll effect (including retries) + await page.waitForTimeout(1000) + + await expect(page.locator('[data-testid="item-1000"]')).toBeVisible() + + const delta = await page.evaluate(check) + console.log('bootom element detla', delta) + expect(delta).toBeLessThan(1.01) +}) diff --git a/packages/react-virtual/e2e/app/tsconfig.json b/packages/react-virtual/e2e/app/tsconfig.json new file mode 100644 index 000000000..ad08d6c2b --- /dev/null +++ b/packages/react-virtual/e2e/app/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "target": "ESNext", + "moduleResolution": "Bundler", + "module": "ESNext", + "resolveJsonModule": true, + "allowJs": true, + "skipLibCheck": true + }, + "exclude": ["node_modules", "dist"] +} diff --git a/packages/react-virtual/e2e/app/vite.config.ts b/packages/react-virtual/e2e/app/vite.config.ts new file mode 100644 index 000000000..f1479d13e --- /dev/null +++ b/packages/react-virtual/e2e/app/vite.config.ts @@ -0,0 +1,17 @@ +import path from 'node:path' +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + root: __dirname, + plugins: [react()], + resolve: { + alias: { + '@tanstack/react-virtual': path.resolve(__dirname, '../../src/index'), + '@tanstack/virtual-core': path.resolve( + __dirname, + '../../../virtual-core/src/index', + ), + }, + }, +}) diff --git a/packages/react-virtual/package.json b/packages/react-virtual/package.json index fef3ac781..4182103a8 100644 --- a/packages/react-virtual/package.json +++ b/packages/react-virtual/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/react-virtual", - "version": "3.13.11", + "version": "3.13.12", "description": "Headless UI for virtualizing scrollable elements in React", "author": "Tanner Linsley", "license": "MIT", @@ -29,7 +29,8 @@ "test:lib": "vitest", "test:lib:dev": "pnpm run test:lib --watch", "test:build": "publint --strict", - "build": "vite build" + "build": "vite build", + "test:e2e": "playwright test" }, "type": "module", "types": "dist/esm/index.d.ts", diff --git a/packages/react-virtual/playwright.config.ts b/packages/react-virtual/playwright.config.ts new file mode 100644 index 000000000..6e9f9a5fb --- /dev/null +++ b/packages/react-virtual/playwright.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from '@playwright/test' + +const PORT = 5173 +const baseURL = `http://localhost:${PORT}` + +export default defineConfig({ + testDir: './e2e/app/test', + use: { + baseURL, + }, + webServer: { + command: `VITE_SERVER_PORT=${PORT} vite build --config e2e/app/vite.config.ts && VITE_SERVER_PORT=${PORT} vite preview --config e2e/app/vite.config.ts --port ${PORT}`, + url: baseURL, + reuseExistingServer: !process.env.CI, + stdout: 'pipe', + }, +}) diff --git a/packages/react-virtual/tsconfig.json b/packages/react-virtual/tsconfig.json index 3655b9d05..effe33b1b 100644 --- a/packages/react-virtual/tsconfig.json +++ b/packages/react-virtual/tsconfig.json @@ -3,5 +3,10 @@ "compilerOptions": { "jsx": "react" }, - "include": ["src", "eslint.config.js", "vite.config.ts"] + "include": [ + "src", + "eslint.config.js", + "vite.config.ts", + "playwright.config.ts" + ] } diff --git a/packages/solid-virtual/CHANGELOG.md b/packages/solid-virtual/CHANGELOG.md index 056ec4085..9ac36931e 100644 --- a/packages/solid-virtual/CHANGELOG.md +++ b/packages/solid-virtual/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/solid-virtual +## 3.13.12 + +### Patch Changes + +- Updated dependencies [[`d21ed98`](https://github.com/TanStack/virtual/commit/d21ed98da3470b9986c9a028ed70fdf0d6189ab4)]: + - @tanstack/virtual-core@3.13.12 + ## 3.13.11 ### Patch Changes diff --git a/packages/solid-virtual/package.json b/packages/solid-virtual/package.json index c73e14bd2..ecdc1f9cf 100644 --- a/packages/solid-virtual/package.json +++ b/packages/solid-virtual/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/solid-virtual", - "version": "3.13.11", + "version": "3.13.12", "description": "Headless UI for virtualizing scrollable elements in Solid", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/svelte-virtual/CHANGELOG.md b/packages/svelte-virtual/CHANGELOG.md index 9f4bb7aa2..871e04d86 100644 --- a/packages/svelte-virtual/CHANGELOG.md +++ b/packages/svelte-virtual/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/svelte-virtual +## 3.13.12 + +### Patch Changes + +- Updated dependencies [[`d21ed98`](https://github.com/TanStack/virtual/commit/d21ed98da3470b9986c9a028ed70fdf0d6189ab4)]: + - @tanstack/virtual-core@3.13.12 + ## 3.13.11 ### Patch Changes diff --git a/packages/svelte-virtual/package.json b/packages/svelte-virtual/package.json index e24b77f13..a04091f73 100644 --- a/packages/svelte-virtual/package.json +++ b/packages/svelte-virtual/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/svelte-virtual", - "version": "3.13.11", + "version": "3.13.12", "description": "Headless UI for virtualizing scrollable elements in Svelte", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/virtual-core/CHANGELOG.md b/packages/virtual-core/CHANGELOG.md index af985eaea..f86daed0b 100644 --- a/packages/virtual-core/CHANGELOG.md +++ b/packages/virtual-core/CHANGELOG.md @@ -1,5 +1,11 @@ # @tanstack/virtual-core +## 3.13.12 + +### Patch Changes + +- fix(virtual-core): scroll to index doesn't scroll to bottom correctly ([#1029](https://github.com/TanStack/virtual/pull/1029)) + ## 3.13.11 ### Patch Changes diff --git a/packages/virtual-core/package.json b/packages/virtual-core/package.json index 99250ffec..6e32738e2 100644 --- a/packages/virtual-core/package.json +++ b/packages/virtual-core/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/virtual-core", - "version": "3.13.11", + "version": "3.13.12", "description": "Headless UI for virtualizing scrollable elements in TS/JS + Frameworks", "author": "Tanner Linsley", "license": "MIT", diff --git a/packages/virtual-core/src/index.ts b/packages/virtual-core/src/index.ts index fc6449839..b4794e06e 100644 --- a/packages/virtual-core/src/index.ts +++ b/packages/virtual-core/src/index.ts @@ -359,7 +359,6 @@ export class Virtualizer< scrollElement: TScrollElement | null = null targetWindow: (Window & typeof globalThis) | null = null isScrolling = false - private scrollToIndexTimeoutId: number | null = null measurementsCache: Array = [] private itemSizeCache = new Map() private pendingMeasuredCacheIndexes: Array = [] @@ -904,7 +903,7 @@ export class Virtualizer< toOffset -= size } - const maxOffset = this.getTotalSize() - size + const maxOffset = this.getTotalSize() + this.options.scrollMargin - size return Math.max(Math.min(maxOffset, toOffset), 0) } @@ -943,19 +942,10 @@ export class Virtualizer< private isDynamicMode = () => this.elementsCache.size > 0 - private cancelScrollToIndex = () => { - if (this.scrollToIndexTimeoutId !== null && this.targetWindow) { - this.targetWindow.clearTimeout(this.scrollToIndexTimeoutId) - this.scrollToIndexTimeoutId = null - } - } - scrollToOffset = ( toOffset: number, { align = 'start', behavior }: ScrollToOffsetOptions = {}, ) => { - this.cancelScrollToIndex() - if (behavior === 'smooth' && this.isDynamicMode()) { console.warn( 'The `smooth` scroll behavior is not fully supported with dynamic size.', @@ -972,50 +962,62 @@ export class Virtualizer< index: number, { align: initialAlign = 'auto', behavior }: ScrollToIndexOptions = {}, ) => { - index = Math.max(0, Math.min(index, this.options.count - 1)) - - this.cancelScrollToIndex() - if (behavior === 'smooth' && this.isDynamicMode()) { console.warn( 'The `smooth` scroll behavior is not fully supported with dynamic size.', ) } - const offsetAndAlign = this.getOffsetForIndex(index, initialAlign) - if (!offsetAndAlign) return + index = Math.max(0, Math.min(index, this.options.count - 1)) - const [offset, align] = offsetAndAlign + let attempts = 0 + const maxAttempts = 10 - this._scrollToOffset(offset, { adjustments: undefined, behavior }) + const tryScroll = (currentAlign: ScrollAlignment) => { + if (!this.targetWindow) return - if (behavior !== 'smooth' && this.isDynamicMode() && this.targetWindow) { - this.scrollToIndexTimeoutId = this.targetWindow.setTimeout(() => { - this.scrollToIndexTimeoutId = null + const offsetInfo = this.getOffsetForIndex(index, currentAlign) + if (!offsetInfo) { + console.warn('Failed to get offset for index:', index) + return + } + const [offset, align] = offsetInfo + this._scrollToOffset(offset, { adjustments: undefined, behavior }) + + this.targetWindow.requestAnimationFrame(() => { + const currentOffset = this.getScrollOffset() + const afterInfo = this.getOffsetForIndex(index, align) + if (!afterInfo) { + console.warn('Failed to get offset for index:', index) + return + } - const elementInDOM = this.elementsCache.has( - this.options.getItemKey(index), - ) + if (!approxEqual(afterInfo[0], currentOffset)) { + scheduleRetry(align) + } + }) + } - if (elementInDOM) { - const result = this.getOffsetForIndex(index, align) - if (!result) return - const [latestOffset] = result + const scheduleRetry = (align: ScrollAlignment) => { + if (!this.targetWindow) return - const currentScrollOffset = this.getScrollOffset() - if (!approxEqual(latestOffset, currentScrollOffset)) { - this.scrollToIndex(index, { align, behavior }) - } - } else { - this.scrollToIndex(index, { align, behavior }) + attempts++ + if (attempts < maxAttempts) { + if (process.env.NODE_ENV !== 'production' && this.options.debug) { + console.info('Schedule retry', attempts, maxAttempts) } - }) + this.targetWindow.requestAnimationFrame(() => tryScroll(align)) + } else { + console.warn( + `Failed to scroll to index ${index} after ${maxAttempts} attempts.`, + ) + } } + + tryScroll(initialAlign) } scrollBy = (delta: number, { behavior }: ScrollToOffsetOptions = {}) => { - this.cancelScrollToIndex() - if (behavior === 'smooth' && this.isDynamicMode()) { console.warn( 'The `smooth` scroll behavior is not fully supported with dynamic size.', diff --git a/packages/virtual-core/src/utils.ts b/packages/virtual-core/src/utils.ts index 1bb4615c2..c11b3d38c 100644 --- a/packages/virtual-core/src/utils.ts +++ b/packages/virtual-core/src/utils.ts @@ -83,7 +83,7 @@ export function notUndefined(value: T | undefined, msg?: string): T { } } -export const approxEqual = (a: number, b: number) => Math.abs(a - b) <= 1 +export const approxEqual = (a: number, b: number) => Math.abs(a - b) < 1.01 export const debounce = ( targetWindow: Window & typeof globalThis, diff --git a/packages/vue-virtual/CHANGELOG.md b/packages/vue-virtual/CHANGELOG.md index 19b986133..6eeec1fa7 100644 --- a/packages/vue-virtual/CHANGELOG.md +++ b/packages/vue-virtual/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/vue-virtual +## 3.13.12 + +### Patch Changes + +- Updated dependencies [[`d21ed98`](https://github.com/TanStack/virtual/commit/d21ed98da3470b9986c9a028ed70fdf0d6189ab4)]: + - @tanstack/virtual-core@3.13.12 + ## 3.13.11 ### Patch Changes diff --git a/packages/vue-virtual/package.json b/packages/vue-virtual/package.json index 4a6ca31a9..c7cc7ec0a 100644 --- a/packages/vue-virtual/package.json +++ b/packages/vue-virtual/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/vue-virtual", - "version": "3.13.11", + "version": "3.13.12", "description": "Headless UI for virtualizing scrollable elements in Vue", "author": "Tanner Linsley", "license": "MIT", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1859b3f87..bd8e18643 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@changesets/cli': specifier: ^2.29.4 version: 2.29.4 + '@playwright/test': + specifier: ^1.53.1 + version: 1.53.1 '@svitejs/changesets-changelog-github-compact': specifier: ^1.2.0 version: 1.2.0(encoding@0.1.13) @@ -90,7 +93,7 @@ importers: specifier: ^8.4.1 version: 8.4.1 '@tanstack/angular-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/angular-virtual rxjs: specifier: ^7.8.2 @@ -142,7 +145,7 @@ importers: specifier: ^17.3.12 version: 17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@17.3.12(@angular/animations@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@tanstack/angular-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/angular-virtual rxjs: specifier: ^7.8.2 @@ -197,7 +200,7 @@ importers: specifier: 5.80.7 version: 5.80.7(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1)) '@tanstack/angular-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/angular-virtual rxjs: specifier: ^7.8.2 @@ -249,7 +252,7 @@ importers: specifier: ^17.3.12 version: 17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@17.3.12(@angular/animations@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@tanstack/angular-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/angular-virtual rxjs: specifier: ^7.8.2 @@ -301,7 +304,7 @@ importers: specifier: ^17.3.12 version: 17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@17.3.12(@angular/animations@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@tanstack/angular-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/angular-virtual rxjs: specifier: ^7.8.2 @@ -356,7 +359,7 @@ importers: specifier: ^8.4.1 version: 8.4.1 '@tanstack/angular-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/angular-virtual rxjs: specifier: ^7.8.2 @@ -414,7 +417,7 @@ importers: specifier: 8.21.3 version: 8.21.3(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1)) '@tanstack/angular-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/angular-virtual rxjs: specifier: ^7.8.2 @@ -466,7 +469,7 @@ importers: specifier: ^17.3.12 version: 17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@17.3.12(@angular/animations@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@tanstack/angular-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/angular-virtual rxjs: specifier: ^7.8.2 @@ -518,7 +521,7 @@ importers: specifier: ^17.3.12 version: 17.3.12(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@17.3.12(@angular/animations@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@17.3.12(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) '@tanstack/angular-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/angular-virtual rxjs: specifier: ^7.8.2 @@ -549,10 +552,10 @@ importers: specifier: ^8.4.1 version: 8.4.1 '@tanstack/lit-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/lit-virtual '@tanstack/virtual-core': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/virtual-core lit: specifier: ^3.3.0 @@ -574,10 +577,10 @@ importers: specifier: ^8.4.1 version: 8.4.1 '@tanstack/lit-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/lit-virtual '@tanstack/virtual-core': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/virtual-core lit: specifier: ^3.3.0 @@ -599,7 +602,7 @@ importers: specifier: ^8.4.1 version: 8.4.1 '@tanstack/react-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/react-virtual react: specifier: ^18.3.1 @@ -630,7 +633,7 @@ importers: examples/react/fixed: dependencies: '@tanstack/react-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/react-virtual react: specifier: ^18.3.1 @@ -664,7 +667,7 @@ importers: specifier: ^5.80.7 version: 5.80.7(react@18.3.1) '@tanstack/react-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/react-virtual react: specifier: ^18.3.1 @@ -689,7 +692,7 @@ importers: examples/react/padding: dependencies: '@tanstack/react-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/react-virtual react: specifier: ^18.3.1 @@ -717,7 +720,7 @@ importers: specifier: ^25.1.1 version: 25.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/react-virtual react: specifier: ^18.3.1 @@ -742,7 +745,7 @@ importers: examples/react/smooth-scroll: dependencies: '@tanstack/react-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/react-virtual react: specifier: ^18.3.1 @@ -770,7 +773,7 @@ importers: specifier: ^8.4.1 version: 8.4.1 '@tanstack/react-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/react-virtual lodash: specifier: ^4.17.21 @@ -807,7 +810,7 @@ importers: specifier: ^8.21.3 version: 8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/react-virtual react: specifier: ^18.3.1 @@ -832,7 +835,7 @@ importers: examples/react/variable: dependencies: '@tanstack/react-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/react-virtual react: specifier: ^18.3.1 @@ -857,7 +860,7 @@ importers: examples/react/window: dependencies: '@tanstack/react-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/react-virtual react: specifier: ^18.3.1 @@ -891,7 +894,7 @@ importers: specifier: ^8.4.1 version: 8.4.1 '@tanstack/svelte-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/svelte-virtual devDependencies: '@sveltejs/vite-plugin-svelte': @@ -919,7 +922,7 @@ importers: examples/svelte/fixed: dependencies: '@tanstack/svelte-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/svelte-virtual devDependencies: '@sveltejs/vite-plugin-svelte': @@ -950,7 +953,7 @@ importers: specifier: ^5.80.7 version: 5.80.7(svelte@4.2.20) '@tanstack/svelte-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/svelte-virtual devDependencies: '@sveltejs/vite-plugin-svelte': @@ -981,7 +984,7 @@ importers: specifier: ^8.4.1 version: 8.4.1 '@tanstack/svelte-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/svelte-virtual devDependencies: '@sveltejs/vite-plugin-svelte': @@ -1012,7 +1015,7 @@ importers: specifier: ^8.4.1 version: 8.4.1 '@tanstack/svelte-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/svelte-virtual lodash: specifier: ^4.17.21 @@ -1049,7 +1052,7 @@ importers: specifier: ^8.21.3 version: 8.21.3(svelte@4.2.20) '@tanstack/svelte-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/svelte-virtual devDependencies: '@sveltejs/vite-plugin-svelte': @@ -1080,7 +1083,7 @@ importers: specifier: ^8.4.1 version: 8.4.1 '@tanstack/vue-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/vue-virtual vue: specifier: ^3.5.16 @@ -1105,7 +1108,7 @@ importers: examples/vue/fixed: dependencies: '@tanstack/vue-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/vue-virtual vue: specifier: ^3.5.16 @@ -1133,7 +1136,7 @@ importers: specifier: ^5.80.7 version: 5.80.7(vue@3.5.16(typescript@5.2.2)) '@tanstack/vue-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/vue-virtual vue: specifier: ^3.5.16 @@ -1158,7 +1161,7 @@ importers: examples/vue/padding: dependencies: '@tanstack/vue-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/vue-virtual vue: specifier: ^3.5.16 @@ -1183,7 +1186,7 @@ importers: examples/vue/scroll-padding: dependencies: '@tanstack/vue-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/vue-virtual '@vueuse/core': specifier: ^12.8.2 @@ -1211,7 +1214,7 @@ importers: examples/vue/smooth-scroll: dependencies: '@tanstack/vue-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/vue-virtual vue: specifier: ^3.5.16 @@ -1239,7 +1242,7 @@ importers: specifier: ^8.4.1 version: 8.4.1 '@tanstack/vue-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/vue-virtual lodash: specifier: ^4.17.21 @@ -1276,7 +1279,7 @@ importers: specifier: ^8.21.3 version: 8.21.3(vue@3.5.16(typescript@5.2.2)) '@tanstack/vue-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/vue-virtual vue: specifier: ^3.5.16 @@ -1301,7 +1304,7 @@ importers: examples/vue/variable: dependencies: '@tanstack/vue-virtual': - specifier: ^3.13.11 + specifier: ^3.13.12 version: link:../../../packages/vue-virtual vue: specifier: ^3.5.16 @@ -3181,6 +3184,11 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@playwright/test@1.53.1': + resolution: {integrity: sha512-Z4c23LHV0muZ8hfv4jw6HngPJkbbtZxTkxPNIg7cJcTc9C28N/p2q7g3JZS2SiKBBHJ3uM1dgDye66bB7LEk5w==} + engines: {node: '>=18'} + hasBin: true + '@publint/pack@0.1.2': resolution: {integrity: sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==} engines: {node: '>=18'} @@ -5218,6 +5226,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -6533,6 +6546,16 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + playwright-core@1.53.1: + resolution: {integrity: sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.53.1: + resolution: {integrity: sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw==} + engines: {node: '>=18'} + hasBin: true + postcss-loader@8.1.1: resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} engines: {node: '>= 18.12.0'} @@ -9842,6 +9865,10 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@playwright/test@1.53.1': + dependencies: + playwright: 1.53.1 + '@publint/pack@0.1.2': {} '@react-hookz/web@25.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -12219,6 +12246,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -13663,6 +13693,14 @@ snapshots: mlly: 1.7.4 pathe: 2.0.3 + playwright-core@1.53.1: {} + + playwright@1.53.1: + dependencies: + playwright-core: 1.53.1 + optionalDependencies: + fsevents: 2.3.2 + postcss-loader@8.1.1(postcss@8.4.35)(typescript@5.2.2)(webpack@5.94.0): dependencies: cosmiconfig: 9.0.0(typescript@5.2.2)