Repository navigation
perf(ci): use a pinned prepacked Windows SDK - #2995
Merged
Merged
Conversation
🚀 Deploying Preview to Cloudflare 🚀Preview URL: https://perf-ci-windows-sysroot-viteplus-dev.voidzero-docs.workers.dev (commit 1c23f7d)This URL reflects your latest Preview deploymentPreview Deployments by commit
|
Contributor
CLI artifact sizes (
|
| Artifact | Format | Base | PR | Change |
|---|---|---|---|---|
packages/cli/dist |
Directory total | 2.21 MiB | 2.21 MiB | 0 B (0.00%) |
packages/core/dist |
Directory total | 4.08 MiB | 4.08 MiB | 0 B (0.00%) |
| Combined package dist | Directory total | 6.29 MiB | 6.29 MiB | 0 B (0.00%) |
vp (Linux x64) |
Binary | 11.42 MiB | 11.42 MiB | 0 B (0.00%) |
vp (Linux x64) |
gzip -9 | 4.94 MiB | 4.94 MiB | 0 B (0.00%) |
| NAPI (Linux x64) | Binary | 33.69 MiB | 33.69 MiB | 0 B (0.00%) |
| NAPI (Linux x64) | gzip -9 | 13.41 MiB | 13.41 MiB | 0 B (0.00%) |
vp (macOS ARM64) |
Binary | 8.50 MiB | 8.50 MiB | 0 B (0.00%) |
vp (macOS ARM64) |
gzip -9 | 4.31 MiB | 4.31 MiB | 0 B (0.00%) |
| NAPI (macOS ARM64) | Binary | 40.96 MiB | 40.96 MiB | 0 B (0.00%) |
| NAPI (macOS ARM64) | gzip -9 | 17.64 MiB | 17.64 MiB | 0 B (0.00%) |
vp (Windows x64) |
Binary | 9.29 MiB | 9.29 MiB | 0 B (0.00%) |
vp (Windows x64) |
gzip -9 | 4.05 MiB | 4.05 MiB | +192 B (+0.00%) |
| NAPI (Windows x64) | Binary | 29.53 MiB | 29.72 MiB | +201.00 KiB (+0.66%) |
| NAPI (Windows x64) | gzip -9 | 12.03 MiB | 12.12 MiB | +88.76 KiB (+0.72%) |
| Trampoline (Windows x64) | Binary | 13.50 KiB | 13.50 KiB | 0 B (0.00%) |
| Trampoline (Windows x64) | gzip -9 | 7.08 KiB | 7.09 KiB | +3 B (+0.04%) |
| Installer (Windows x64) | Binary | 4.63 MiB | 4.63 MiB | 0 B (0.00%) |
| Installer (Windows x64) | gzip -9 | 2.17 MiB | 2.17 MiB | -215 B (-0.01%) |
This was referenced Oct 12, 2026
fengmk2
force-pushed
the
perf/ci-windows-sysroot
branch
from
October 14, 2026 03:50
8333c60 to
94440c9
Compare
fengmk2
marked this pull request as ready for review
October 14, 2026 10:51
Brooooooklyn
approved these changes
Oct 14, 2026
Merged
fengmk2
added a commit
that referenced
this pull request
Oct 16, 2026
Vite+ 1.3 adds `create-vite-plus`, so `npm create vite-plus@latest` starts a project without the global `vp`. It adds `vp pm pkg` for editing `package.json` and `vp pm licenses list` for dependency licenses, and lets `vp env` take package-manager dist-tags such as `pnpm@latest-10`. It also makes `vp migrate` import rewriting much faster on large projects and makes `vp dev` print Vite's `ready in` line and honor `--debug`, `--filter`, and `--profile`. ### Features - Create a Vite+ project without installing the global `vp` through `pnpm create vite-plus`, `npm create vite-plus@latest`, `yarn create vite-plus`, or `bun create vite-plus`, which run `vp create` with the same arguments ([docs](https://viteplus.dev/guide/create#without-the-global-cli)) ([#3028](#3028), [#3048](#3048)), by @liangmiQwQ. - `vp pm pkg get`, `set`, `delete`, and `fix` read and update `package.json` through the detected package manager: npm 7.20.0 and later (`fix` from 9.8.0), pnpm 11.3.0 and later, and Bun 1.2.19 and later ([docs](https://viteplus.dev/guide/package-management#package-manifest)) ([#3020](#3020)), by @jong-kyung. - `vp pm licenses list` (or `ls`) lists dependency licenses through pnpm 7.17.0 and later, Yarn Classic, or Bun 1.4.0 and later, with `--json` for machine-readable output ([#3037](#3037)), by @jong-kyung. - `vp env` accepts npm dist-tags in package-manager specs: `vp env pin pnpm@latest-10` pins the exact version the tag points to, and `vp env default pnpm@latest-10` follows the tag on each use ([#3047](#3047)), by @liangmiQwQ. - Upgrade the bundled tools ([#3058](#3058), [#3078](#3078)), by @voidzero-guard[bot] and @fengmk2: - `rolldown@1.2.13` to `rolldown@1.2.14`. Rolldown adds the `output.charset` option and fixes several tree-shaking, code-splitting, and renaming bugs. - `vitest@5.0.4` to `vitest@5.0.5`, with fixes for browser mode, hook cleanup after a failing hook, and `--changed` with quoted file names. ### Fixes & Enhancements - Import rewriting in `vp migrate` is up to 14 times faster on large projects, for example 78 s to 5.6 s on Dify ([#2987](#2987)), by @fengmk2. - `vp dev` prints Vite's `ready in N ms` line, so scripts that wait for it no longer time out after `vp migrate`. `--debug`, `--filter`, and `--profile` now take effect in `vp dev`, `vp build`, and `vp preview`, and `vp preview` stops when the build output is missing, as `vite preview` does ([#3056](#3056)), by @fengmk2. - `vp staged` prints one result line per task, such as `✔ vp check --fix`, instead of the task list and Git progress. Warnings, errors, and rollback results stay visible, `--verbose` shows task output, and `--debug` keeps the full log ([#3060](#3060)), by @fengmk2. - After a successful upgrade, `vp upgrade` reminds you to run `vp migrate` in projects that use an older Vite+ version ([#3063](#3063)), by @KTrain5169. - The coding agent picker in `vp create` and `vp migrate` lists Claude Code under `AGENTS.md` and no longer offers a separate `CLAUDE.md` option. `--agent claude` and existing `CLAUDE.md` files still work ([#3055](#3055)), by @fengmk2. ### Docs - Recommend setting `runtimeOnFail: ignore` and `pmOnFail: ignore` in the project's `pnpm-workspace.yaml` for pnpm 11 and later, since pnpm does not read `runtimeOnFail` from its global config ([#3077](#3077)), by @liangmiQwQ. ### Chore - Speed up CI with ThinLTO native test builds, a pinned prepacked Windows SDK, and a precompiled std for trampoline tests, keep dependencies in Cargo caches, switch Linux runners, and update Windows build pins with Renovate ([#3026](#3026), [#2995](#2995), [#3009](#3009), [#3000](#3000), [#3073](#3073), [#3049](#3049)), by @fengmk2. - Stabilize CLI snapshots during slow package-manager downloads, isolate Vitest browser and UI server ports, skip slow snapshot cases on Linux and Windows, and remove duplicate Rust unit tests ([#3043](#3043), [#3061](#3061), [#3059](#3059), [#3057](#3057)), by @fengmk2 and @Brooooooklyn. - Upgrade Rust crates and JavaScript dependencies, including `rustls@0.23.46` and `ast-grep@0.51.0`, and remove unused catalog entries ([#1780](#1780), [#1782](#1782), [#1783](#1783)), by @renovate[bot] and @fengmk2. - Refine the release-manager guidance ([#3052](#3052)), by @fengmk2. ### Bundled Versions | Tool | Version | Source | Changelog | | --------------- | ---------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | | vite | `8.3.4` | [`b6c20f6`](vitejs/vite@b6c20f6) | unchanged | | rolldown | `1.2.14` | [`c9a8cda`](rolldown/rolldown@c9a8cda) | [1.2.14](https://github.com/rolldown/rolldown/releases/tag/v1.2.14) | | tsdown | `0.23.1` | [npm](https://npmx.dev/package/tsdown/v/0.23.1) | unchanged | | vitest | `5.0.5` | [npm](https://npmx.dev/package/vitest/v/5.0.5) | [5.0.5](https://github.com/vitest-dev/vitest/releases/tag/v5.0.5) | | oxlint | `1.88.0` | [npm](https://npmx.dev/package/oxlint/v/1.88.0) | unchanged | | oxlint-tsgolint | `7.0.2004` | [npm](https://npmx.dev/package/oxlint-tsgolint/v/7.0.2004) | unchanged | | oxfmt | `0.73.0` | [npm](https://npmx.dev/package/oxfmt/v/0.73.0) | unchanged | ### Upgrade ```bash vp upgrade ``` **Full Changelog**: v1.2.0...v1.3.0 --- Merging this PR will trigger the release workflow. --------- Co-authored-by: voidzero-guard[bot] <278573678+voidzero-guard[bot]@users.noreply.github.com> Co-authored-by: MK (fengmk2) <fengmk2@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
fengmk2
pushed a commit
that referenced
this pull request
Oct 18, 2026
> [!NOTE]
> This PR body was truncated due to platform limits.
This PR contains the following updates:
| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Adoption](https://docs.renovatebot.com/merge-confidence/) |
[Passing](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|---|---|
| [@ast-grep/napi](https://ast-grep.github.io)
([source](https://redirect.github.com/ast-grep/ast-grep)) | [`^0.45.0` →
`^0.51.0`](https://renovatebot.com/diffs/npm/@ast-grep%2fnapi/0.45.3/0.51.0)
|

|

|

|

|
| [@iconify/vue](https://iconify.design/)
([source](https://redirect.github.com/iconify/iconify/tree/HEAD/components/vue))
| [`5.0.1` →
`5.0.3`](https://renovatebot.com/diffs/npm/@iconify%2fvue/5.0.1/5.0.3) |

|

|

|

|
|
[@nkzw/safe-word-list](https://redirect.github.com/nkzw-tech/safe-word-list)
| [`3.1.0` →
`3.1.2`](https://renovatebot.com/diffs/npm/@nkzw%2fsafe-word-list/3.1.0/3.1.2)
|

|

|

|

|
|
[es-module-lexer](https://redirect.github.com/guybedford/es-module-lexer)
| [`3.0.3` →
`3.0.4`](https://renovatebot.com/diffs/npm/es-module-lexer/3.0.3/3.0.4)
|

|

|

|

|
| [fast-wrap-ansi](https://redirect.github.com/43081j/fast-wrap-ansi) |
[`0.2.0` →
`0.2.2`](https://renovatebot.com/diffs/npm/fast-wrap-ansi/0.2.0/0.2.2) |

|

|

|

|
| [minimatch](https://redirect.github.com/isaacs/minimatch) | [`10.2.4`
→ `10.2.6`](https://renovatebot.com/diffs/npm/minimatch/10.2.4/10.2.6) |

|

|

|

|
| pkg-types | [`2.3.0` →
`2.3.3`](https://renovatebot.com/diffs/npm/pkg-types/2.3.0/2.3.3) |

|

|

|

|
| [playwright](https://playwright.dev)
([source](https://redirect.github.com/microsoft/playwright)) | [`1.62.1`
→ `1.64.1`](https://renovatebot.com/diffs/npm/playwright/1.62.1/1.64.1)
|

|

|

|

|
| [reka-ui](https://redirect.github.com/unovue/reka-ui) | [`2.9.9` →
`2.11.0`](https://renovatebot.com/diffs/npm/reka-ui/2.9.9/2.11.0) |

|

|

|

|
| [tailwindcss](https://tailwindcss.com)
([source](https://redirect.github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss))
| [`4.3.0` →
`4.3.3`](https://renovatebot.com/diffs/npm/tailwindcss/4.3.0/4.3.3) |

|

|

|

|
|
[vitepress-plugin-group-icons](https://redirect.github.com/yuyinws/vitepress-plugin-group-icons)
| [`1.7.5` →
`1.7.7`](https://renovatebot.com/diffs/npm/vitepress-plugin-group-icons/1.7.5/1.7.7)
|

|

|

|

|
|
[vitepress-plugin-llms](https://redirect.github.com/okineadev/vitepress-plugin-llms)
| [`1.13.1` →
`1.14.0`](https://renovatebot.com/diffs/npm/vitepress-plugin-llms/1.13.1/1.14.0)
|

|

|

|

|
| [vue](https://vuejs.org/)
([source](https://redirect.github.com/vuejs/core)) | [`3.5.35` →
`3.5.44`](https://renovatebot.com/diffs/npm/vue/3.5.35/3.5.44) |

|

|

|

|
| [wrangler](https://redirect.github.com/cloudflare/workers-sdk)
([source](https://redirect.github.com/cloudflare/workers-sdk/tree/HEAD/packages/wrangler))
| [`4.127.1` →
`4.151.0`](https://renovatebot.com/diffs/npm/wrangler/4.127.1/4.151.0) |

|

|

|

|
| [zod](https://zod.dev)
([source](https://redirect.github.com/colinhacks/zod)) | [`4.6.5` →
`4.6.7`](https://renovatebot.com/diffs/npm/zod/4.6.5/4.6.7) |

|

|

|

|
---
### Release Notes
<details>
<summary>ast-grep/ast-grep (@​ast-grep/napi)</summary>
###
[`v0.51.0`](https://redirect.github.com/ast-grep/ast-grep/blob/HEAD/CHANGELOG.md#0510)
[Compare
Source](https://redirect.github.com/ast-grep/ast-grep/compare/0.50.0...0.51.0)
- fix(cli): use `ast-grep` name in project setup hint
[`#3001`](https://redirect.github.com/ast-grep/ast-grep/pull/3001)
- fix: replace deprecated serde_yaml with serde-saphyr
[`#2999`](https://redirect.github.com/ast-grep/ast-grep/pull/2999)
- fix(deps): update rust crate tree-sitter-haskell to 0.24.0
[`#2988`](https://redirect.github.com/ast-grep/ast-grep/pull/2988)
- fix(cli): preserve files when update-all writes fail
[`#2995`](https://redirect.github.com/ast-grep/ast-grep/pull/2995)
- Revise security policy for clarity and updates
[`a7d3f69`](https://redirect.github.com/ast-grep/ast-grep/commit/a7d3f6935320f9859c3d522d133aabba21ccff4c)
- fix: update wasm linting
[`ea55463`](https://redirect.github.com/ast-grep/ast-grep/commit/ea5546303f4aebe86c16a3fada2dae0372bd95c4)
###
[`v0.50.0`](https://redirect.github.com/ast-grep/ast-grep/blob/HEAD/CHANGELOG.md#0500)
[Compare
Source](https://redirect.github.com/ast-grep/ast-grep/compare/0.45.3...0.50.0)
> 7 October 2026
- feat(outline): add Java annotation type and element rules
[`#2955`](https://redirect.github.com/ast-grep/ast-grep/pull/2955)
- fix(outline): report Java private/protected fields in the outline
[`#2950`](https://redirect.github.com/ast-grep/ast-grep/pull/2950)
- feat(outline): add Java enum member rule
[`#2954`](https://redirect.github.com/ast-grep/ast-grep/pull/2954)
- chore(deps): update dependency
[@​types/node](https://redirect.github.com/types/node) to v24.19.1
[`#2983`](https://redirect.github.com/ast-grep/ast-grep/pull/2983)
- chore(deps): update dependency dprint to v0.60.1
[`#2984`](https://redirect.github.com/ast-grep/ast-grep/pull/2984)
- feat(outline): add Java module declaration rule
[`#2956`](https://redirect.github.com/ast-grep/ast-grep/pull/2956)
- chore(deps): update rust crate termimad to v0.35.5
[`#2925`](https://redirect.github.com/ast-grep/ast-grep/pull/2925)
- chore(deps): update rust crate napi-derive to v3.6.10
[`#2936`](https://redirect.github.com/ast-grep/ast-grep/pull/2936)
- chore(deps): update dependency
[@​napi-rs/cli](https://redirect.github.com/napi-rs/cli) to
v3.10.6
[`#2922`](https://redirect.github.com/ast-grep/ast-grep/pull/2922)
- chore(deps): update dependency chalk to v6.0.1
[`#2979`](https://redirect.github.com/ast-grep/ast-grep/pull/2979)
- chore(deps): update rust crate tokio to v1.53.2
[`#2981`](https://redirect.github.com/ast-grep/ast-grep/pull/2981)
- chore(deps): update rust crate thiserror to v2.0.21
[`#2966`](https://redirect.github.com/ast-grep/ast-grep/pull/2966)
- chore(deps): update dependency oxlint to v1.86.0
[`#2967`](https://redirect.github.com/ast-grep/ast-grep/pull/2967)
- chore(deps): update rust crate smallvec to v1.16.2
[`#2968`](https://redirect.github.com/ast-grep/ast-grep/pull/2968)
- feat(outline): add Java wildcard-import outline rules
[`#2948`](https://redirect.github.com/ast-grep/ast-grep/pull/2948)
- fix(outline): capture C/C++ declarator identifier names
[`#2946`](https://redirect.github.com/ast-grep/ast-grep/pull/2946)
- feat(cli): add trust and revoke custom language policies
[`#2972`](https://redirect.github.com/ast-grep/ast-grep/pull/2972)
- refactor(cli): extract custom language policy
[`#2977`](https://redirect.github.com/ast-grep/ast-grep/pull/2977)
- feat(cli): add custom language loading policy
[`#2971`](https://redirect.github.com/ast-grep/ast-grep/pull/2971)
- fix(schema): reject null relation fields
[`#2969`](https://redirect.github.com/ast-grep/ast-grep/pull/2969)
- chore(deps): update rust crate clap_complete to v4.6.11
[`#2965`](https://redirect.github.com/ast-grep/ast-grep/pull/2965)
- chore(deps): update rust crate clap to v4.6.7
[`#2964`](https://redirect.github.com/ast-grep/ast-grep/pull/2964)
- chore(deps): update rust crate napi to v3.13.0
[`#2932`](https://redirect.github.com/ast-grep/ast-grep/pull/2932)
- chore(deps): update dependency
[@​types/node](https://redirect.github.com/types/node) to v24.13.6
[`#2941`](https://redirect.github.com/ast-grep/ast-grep/pull/2941)
- feat(language): add Zig support
[`#2942`](https://redirect.github.com/ast-grep/ast-grep/pull/2942)
- fix: require opt-in for custom language libraries
[`#2960`](https://redirect.github.com/ast-grep/ast-grep/pull/2960)
- refactor: parse default run through app
[`#2962`](https://redirect.github.com/ast-grep/ast-grep/pull/2962)
- feat(outline): add Java record_declaration rule
[`#2945`](https://redirect.github.com/ast-grep/ast-grep/pull/2945)
- chore(deps): update rust crate toml_edit to v0.25.15
[`#2937`](https://redirect.github.com/ast-grep/ast-grep/pull/2937)
- chore(deps): update rust crate smallvec to v1.16.1
[`#2920`](https://redirect.github.com/ast-grep/ast-grep/pull/2920)
- chore(deps): update dependency
[@​types/node](https://redirect.github.com/types/node) to v24.13.4
[`#2931`](https://redirect.github.com/ast-grep/ast-grep/pull/2931)
- chore(deps): update dependency dprint to v0.57.4
[`#2926`](https://redirect.github.com/ast-grep/ast-grep/pull/2926)
- chore(deps): update dependency oxlint to v1.82.0
[`#2928`](https://redirect.github.com/ast-grep/ast-grep/pull/2928)
- chore(deps): update dependency oxlint to v1.81.0
[`#2919`](https://redirect.github.com/ast-grep/ast-grep/pull/2919)
- chore(deps): update rust crate termimad to v0.35.3
[`#2921`](https://redirect.github.com/ast-grep/ast-grep/pull/2921)
- chore(deps): update dependency dprint to v0.57.1
[`#2923`](https://redirect.github.com/ast-grep/ast-grep/pull/2923)
- chore(deps): update dependency
[@​ast-grep/napi](https://redirect.github.com/ast-grep/napi) to
v0.45.3
[`#2918`](https://redirect.github.com/ast-grep/ast-grep/pull/2918)
- feat(outline): add Java record_declaration rule
([#​2945](https://redirect.github.com/ast-grep/ast-grep/issues/2945))
[`#2944`](https://redirect.github.com/ast-grep/ast-grep/issues/2944)
</details>
<details>
<summary>guybedford/es-module-lexer (es-module-lexer)</summary>
###
[`v3.0.4`](https://redirect.github.com/guybedford/es-module-lexer/releases/tag/3.0.4)
[Compare
Source](https://redirect.github.com/guybedford/es-module-lexer/compare/3.0.3...3.0.4)
#### What's Changed
- perf(lexer): reduce TS lookahead work by
[@​BridgeAR](https://redirect.github.com/BridgeAR) in
[#​258](https://redirect.github.com/guybedford/es-module-lexer/pull/258)
- fix(parser): preserve complete import attribute metadata by
[@​BridgeAR](https://redirect.github.com/BridgeAR) in
[#​260](https://redirect.github.com/guybedford/es-module-lexer/pull/260)
- fix(ts): lex `/` after a postfix non-null assertion as division by
[@​guybedford](https://redirect.github.com/guybedford) in
[#​263](https://redirect.github.com/guybedford/es-module-lexer/pull/263)
- ci: add release and publish workflows by
[@​guybedford](https://redirect.github.com/guybedford) in
[#​264](https://redirect.github.com/guybedford/es-module-lexer/pull/264)
**Full Changelog**:
<https://github.com/guybedford/es-module-lexer/compare/3.0.3...3.0.4>
</details>
<details>
<summary>43081j/fast-wrap-ansi (fast-wrap-ansi)</summary>
###
[`v0.2.2`](https://redirect.github.com/43081j/fast-wrap-ansi/releases/tag/0.2.2)
[Compare
Source](https://redirect.github.com/43081j/fast-wrap-ansi/compare/0.2.0...0.2.2)
#### What's Changed
- chore: fix typescript build by
[@​43081j](https://redirect.github.com/43081j) in
[#​95](https://redirect.github.com/43081j/fast-wrap-ansi/pull/95)
**Full Changelog**:
<https://github.com/43081j/fast-wrap-ansi/compare/0.2.1...0.2.2>
</details>
<details>
<summary>isaacs/minimatch (minimatch)</summary>
###
[`v10.2.6`](https://redirect.github.com/isaacs/minimatch/compare/v10.2.5...v10.2.6)
[Compare
Source](https://redirect.github.com/isaacs/minimatch/compare/v10.2.5...v10.2.6)
###
[`v10.2.5`](https://redirect.github.com/isaacs/minimatch/compare/v10.2.4...v10.2.5)
[Compare
Source](https://redirect.github.com/isaacs/minimatch/compare/v10.2.4...v10.2.5)
</details>
<details>
<summary>microsoft/playwright (playwright)</summary>
###
[`v1.64.1`](https://redirect.github.com/microsoft/playwright/releases/tag/v1.64.1)
[Compare
Source](https://redirect.github.com/microsoft/playwright/compare/v1.64.0...v1.64.1)
##### Bug Fixes
-
[#​43247](https://redirect.github.com/microsoft/playwright/issues/43247)
\[Bug]: \_electron.launch intermittently loses a packaged app's first
window since 1.64.0
-
[#​43242](https://redirect.github.com/microsoft/playwright/issues/43242)
\[Regression]: Chromium 155+ aborts a preflighted cross-origin redirect
whenever any route is registered (net::ERR_ABORTED)
###
[`v1.64.0`](https://redirect.github.com/microsoft/playwright/releases/tag/v1.64.0)
[Compare
Source](https://redirect.github.com/microsoft/playwright/compare/v1.63.0...v1.64.0)
#### 🧰 WebMCP
New
[page.webmcp](https://playwright.dev/docs/api/class-page#page-webmcp)
and
[frame.webmcp](https://playwright.dev/docs/api/class-frame#frame-webmcp)
give access to the tools that a page registers through the experimental
[WebMCP](https://playwright.dev/docs/api/class-webmcp) browser API, so
you can test them like any other part of your app:
```js
const browser = await chromium.launch({ args: ['--enable-features=WebMCP'] });
const page = await browser.newPage();
await page.goto('https://example.com');
for (const tool of await page.webmcp.tools())
console.log(tool.name, tool.description);
const result = await page.webmcp.callTool('add', { a: 2, b: 40 });
console.log(result.content[0].text); // "42"
```
[Playwright MCP](https://playwright.dev/docs/getting-started-mcp) also
supports WebMCP by default, with page-defined tools offered to the agent
as `webmcp_<tool>`. Pass `--no-webmcp` to opt out.
[`playwright-cli`](https://playwright.dev/docs/getting-started-cli)
exposes them as well:
```bash
playwright-cli webmcp-list
playwright-cli webmcp-call search_catalog --params '{"query":"cats"}'
```
#### 🎬 Better videos
Videos can now be recorded at a custom frame rate, and the decorations
for actions are styled with plain CSS:
```js
// playwright.config.ts
import { defineConfig } from '@playwright/test';
export default defineConfig({
use: {
video: {
mode: 'on',
size: { width: 1920, height: 1080 },
fps: 60,
show: {
actions: {
style: {
point: 'width: 20px; height: 20px; border-radius: 50%; background: red',
highlight: 'outline: 2px solid #​333; background: rgba(0, 128, 255, .15)',
title: 'font-size: 16px',
},
},
},
},
},
});
```
- New `fps` option in
[testOptions.video](https://playwright.dev/docs/api/class-testoptions#test-options-video),
[`recordVideo`](https://playwright.dev/docs/api/class-browser#browser-new-context-option-record-video)
and
[screencast.start()](https://playwright.dev/docs/api/class-screencast#screencast-start).
Firefox and WebKit currently capture up to 25 frames per second.
- New
[`style`](https://playwright.dev/docs/api/class-screencast#screencast-show-actions-option-style)
option takes CSS declarations for the `point` marker, the target
`highlight` and the action `title`. It replaces the `fontSize` option,
which is now deprecated.
- The cursor stays visible at the last action point, survives
navigations and travels along a natural, eased path.
- Videos are encoded with VP9 instead of VP8, which takes less CPU and
produces smaller files of the same or better
quality.
- All video options are also available in [Playwright
MCP](https://playwright.dev/docs/getting-started-mcp) and
[`playwright-cli`](https://playwright.dev/docs/getting-started-cli).
#### 🎯 Test runner
- New
[testProject.default](https://playwright.dev/docs/api/class-testproject#test-project-default)
option keeps a project in the config without running it by default. You
can configure every browser you care about, and let a plain `npx
playwright test` run just your favourite one:
```js
// playwright.config.ts
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
projects: [
{ name: 'chromium', use: devices['Desktop Chrome'] },
{ name: 'firefox', use: devices['Desktop Firefox'], default: false },
{ name: 'webkit', use: devices['Desktop Safari'], default: false },
],
});
```
```bash
npx playwright test # runs chromium only
npx playwright test --project=firefox # runs firefox
npx playwright test --project="*" # runs all three, for example on CI
```
- New `--shuffle` command line option schedules tests in a random order,
which helps to find tests that accidentally depend on each other.
```bash
npx playwright test --shuffle
# Running 42 tests using 4 workers, shuffle seed 271828182
# ...
# Pass the seed to reproduce the same order.
npx playwright test --shuffle 271828182
```
- New `lock` option in
[test.describe.configure()](https://playwright.dev/docs/api/class-test#test-describe-configure)
adds [test locks](https://playwright.dev/docs/test-parallel#test-locks)
to all tests in a file or a group:
```js
test.describe.configure({ lock: 'user-settings' });
```
- New `type` option of `toHaveScreenshot` in
[testConfig.expect](https://playwright.dev/docs/api/class-testconfig#test-config-expect)
stores all unnamed screenshots as WebP:
```js
// playwright.config.ts
export default defineConfig({
expect: {
toHaveScreenshot: { type: 'webp' },
},
});
```
#### 🪆 Locator.within()
New
[locator.within()](https://playwright.dev/docs/api/class-locator#locator-within)
combines two locators that you already have, reading in the natural
order —
"this button, within that dialog":
```js
const saveButton = page.getByRole('button', { name: 'Save' });
const dialog = page.getByTestId('settings-dialog');
await saveButton.within(dialog).click();
```
Relative locators such as
[locator.nth()](https://playwright.dev/docs/api/class-locator#locator-nth)
or
[locator.first()](https://playwright.dev/docs/api/class-locator#locator-first)
are resolved inside each parent
separately, which makes column-like queries straightforward:
```js
// The third cell of every row, not the third cell in the table.
const thirdColumn = page.getByRole('cell').nth(2).within(page.getByRole('row'));
await expect(thirdColumn).toHaveText(['Apple', 'Banana', 'Cherry']);
```
#### New APIs
- New
[page.getByRef()](https://playwright.dev/docs/api/class-page#page-get-by-ref)
locates an element by its aria ref, such as `e2`, reported by
[page.ariaSnapshot()](https://playwright.dev/docs/api/class-page#page-aria-snapshot)
in the `'ai'` mode.
- New option
[`includeShadow`](https://playwright.dev/docs/api/class-page#page-content-option-include-shadow)
in
[page.content()](https://playwright.dev/docs/api/class-page#page-content)
and
[frame.content()](https://playwright.dev/docs/api/class-frame#frame-content)
serializes open shadow roots as [declarative shadow
DOM](https://developer.mozilla.org/en-US/docs/Web/API/Web_components/Using_shadow_DOM#declaratively_with_html).
- New option
[`signCount`](https://playwright.dev/docs/api/class-credentials#credentials-create-option-sign-count)
sets the initial signature counter of a virtual credential.
[credentials.create()](https://playwright.dev/docs/api/class-credentials#credentials-create)
and
[credentials.get()](https://playwright.dev/docs/api/class-credentials#credentials-get)
return the current `signCount`, and it is saved and restored together
with the credentials in the storage state.
- New
[fullConfig.filteredProjects](https://playwright.dev/docs/api/class-fullconfig#full-config-filtered-projects)
lists the projects that were selected to run after applying the
`--project` filter. It is available in global setup and reporters.
- New
[apiRequestContext.addCookies()](https://playwright.dev/docs/api/class-apirequestcontext#api-request-context-add-cookies),
[apiRequestContext.cookies()](https://playwright.dev/docs/api/class-apirequestcontext#api-request-context-cookies)
and
[apiRequestContext.clearCookies()](https://playwright.dev/docs/api/class-apirequestcontext#api-request-context-clear-cookies)
manage cookies of a request context, mirroring the
[BrowserContext](https://playwright.dev/docs/api/class-browsercontext)
methods:
```js
await request.addCookies([{ name: 'session-id', value: '42', url:
'https://example.com' }]);
console.log(await request.cookies('https://example.com'));
await request.clearCookies({ name: 'session-id' });
```
#### Breaking changes ⚠️
- `screen` property is now forwarded from the [device
descriptors](https://playwright.dev/docs/emulation#devices). If you use
`...devices['Desktop Chrome']` and alike, `window.screen` and media
queries now see the emulated screen size. You can opt-out by explicitly
setting `screen` to `undefined`:
```js
// playwright.config.ts
export default defineConfig({
use: {
...devices['Desktop Chrome'],
screen: undefined,
},
});
```
- JSX in your test files now follows your `tsconfig.json`. Playwright
compiles JSX in test files according to the `jsx`, `jsxFactory`,
`jsxFragmentFactory` and `jsxImportSource` [tsconfig
options](https://playwright.dev/docs/test-typescript#tsconfig-jsx-options),
and defaults to the automatic runtime from `react/jsx-runtime`.
- `--update-snapshots=missing` now passes the test run. Tests that only
create missing snapshots now pass in the `'missing'` mode of
[testConfig.updateSnapshots](https://playwright.dev/docs/api/class-testconfig#test-config-update-snapshots),
so that CI can generate new snapshots and verify the existing ones in a
single run. The mode used when the option is not specified is now called
`'default'` and behaves as before: missing snapshots are written and the
test fails.
- Elements inside hidden iframes are considered hidden. Elements inside
an iframe that is not visible, for example with `visibility: hidden`,
are now considered hidden by actions,
[locator.isVisible()](https://playwright.dev/docs/api/class-locator#locator-is-visible)
and
[expect(locator).toBeVisible()](https://playwright.dev/docs/api/class-locatorassertions#locator-assertions-to-be-visible).
#### Browser Versions
- Chromium 156.0.8078.4
- Mozilla Firefox 157.0
- WebKit 27.2
This version was also tested against the following stable channels:
- Google Chrome 155
- Microsoft Edge 155
###
[`v1.63.0`](https://redirect.github.com/microsoft/playwright/releases/tag/v1.63.0)
[Compare
Source](https://redirect.github.com/microsoft/playwright/compare/v1.62.1...v1.63.0)
#### 🔒 Test locks
Tests that access a shared resource — an external service, a global
account setting — can now declare a named `lock`.
Tests that share a lock name never run concurrently, across files,
workers and [projects](https://playwright.dev/docs/test-projects), while
everything else keeps running in parallel:
```js
test('update user settings', { lock: 'user-settings' }, async ({ page }) => {
// never runs at the same time as other tests holding 'user-settings'
});
```
A test can hold multiple locks, and
[test.describe()](https://playwright.dev/docs/api/class-test#test-describe)
accepts a `lock` for the whole group.
Learn more about [test
locks](https://playwright.dev/docs/test-parallel#test-locks).
#### 🪟 Locate across frames
[page.frameLocator()](https://playwright.dev/docs/api/class-page#page-frame-locator)
and
[frame.frameLocator()](https://playwright.dev/docs/api/class-frame#frame-frame-locator)
called without a selector search in any frame of the
subtree, so you no longer need to locate the iframe first:
```js
// Finds the button in any frame on the page.
await page.frameLocator().getByRole('button').click();
```
The rest of the locator resolves inside a single frame, just like a
regular locator, and an error is thrown when it
matches elements in several frames.
#### 👁️ Visible-only locators
New
[locator.visible()](https://playwright.dev/docs/api/class-locator#locator-visible)
returns a locator that matches only visible elements. It is the
recommended
replacement for the `:visible` CSS pseudo-class:
```js
await page.locator('button').visible().click();
```
#### 🧾 Step params and subtitles
Steps now carry structured data for reporters. Playwright API steps
report the target locator and call arguments,
and [test.step()](https://playwright.dev/docs/api/class-test#test-step)
accepts `subtitle` and `params` options for your own steps:
```js
await test.step('Login', async () => {
// ...
}, { subtitle: 'as admin', params: { user: 'admin' } });
```
Reporters receive them via
[testStep.subtitle](https://playwright.dev/docs/api/class-teststep#test-step-subtitle)
and
[testStep.params](https://playwright.dev/docs/api/class-teststep#test-step-params).
For Playwright API
steps, the subtitle is the locator or the navigation url — for example,
`Click` with subtitle `getByRole('button')`.
Both are rendered next to the step title in the trace viewer and the
HTML report.
#### 🖼️ Aria and screen snapshots in traces
The `snapshots` option of
[tracing.start()](https://playwright.dev/docs/api/class-tracing#tracing-start)
and the
[testOptions.trace](https://playwright.dev/docs/api/class-testoptions#test-options-trace)
fixture option now accept an
object selecting what to capture on every action:
```js
// playwright.config.ts
export default defineConfig({
use: {
trace: {
mode: 'on',
snapshots: { dom: true, aria: true, screen: true }
},
},
});
```
With aria and screen snapshots recorded, the new **Display Aria** mode
in the trace viewer shows the action screenshot
side by side with the aria snapshot, and hovering an aria node
highlights it on the screenshot.
#### New APIs
##### Browser and Context
-
[`httpCredentials`](https://playwright.dev/docs/api/class-browser#browser-new-context-option-http-credentials)
now also accepts an array of credentials. The first entry matching the
request origin is used, and entries without an origin match any request.
- New option
[`opfs`](https://playwright.dev/docs/api/class-browsercontext#browser-context-storage-state-option-opfs)
includes the [origin private file
system](https://developer.mozilla.org/en-US/docs/Web/API/File_System_API/Origin_private_file_system)
in the storage state, so it can be persisted and restored into later
contexts.
- New events
[page.on('dialogclosed')](https://playwright.dev/docs/api/class-page#page-event-dialog-closed)
and
[browserContext.on('dialogclosed')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-dialog-closed)
are emitted when a JavaScript dialog is accepted, dismissed or closed by
the user.
##### Locators
- New
[locator.ariaSnapshotJSON()](https://playwright.dev/docs/api/class-locator#locator-aria-snapshot-json)
and
[page.ariaSnapshotJSON()](https://playwright.dev/docs/api/class-page#page-aria-snapshot-json)
return the aria snapshot as a JSON value instead of YAML markup, with
`mode`, `depth` and `boxes` options.
-
[apiRequestContext.get()](https://playwright.dev/docs/api/class-apirequestcontext#api-request-context-get)
and other request methods accept a type argument that types the response
`json()`:
```js
const response = await request.get<User>('/api/users/42');
const user = await response.json(); // typed as User
```
##### Test runner
- New standalone
[testOptions.reducedMotion](https://playwright.dev/docs/api/class-testoptions#test-options-reduced-motion),
[testOptions.forcedColors](https://playwright.dev/docs/api/class-testoptions#test-options-forced-colors)
and
[testOptions.contrast](https://playwright.dev/docs/api/class-testoptions#test-options-contrast)
options.
- New `--add-reporter` command line option appends a reporter on top of
the ones configured in `playwright.config`, instead of replacing them
like `--reporter` does.
- New `omitTags` option for the `list`, `line`, `dot`, `github` and
`junit` reporters suppresses the tags that are automatically appended to
test titles.
##### Command line
- `npx playwright install --no-remove` keeps the browsers of other
Playwright installations instead of removing them.
- `npx playwright codegen --http-credentials` records against pages
behind HTTP authentication.
##### Miscellaneous
- New built-in
[`perfetto`](https://playwright.dev/docs/test-reporters#perfetto-reporter)
reporter writes a Trace Event Format file for the [Perfetto
UI](https://ui.perfetto.dev) or `chrome://tracing`, rendering the test
run as a timeline with a lane per worker.
- The HTML report renders a duration waterfall next to test steps.
#### Announcements
- ⚠️ The experimental `@playwright/experimental-ct-react`,
`@playwright/experimental-ct-react17` and
`@playwright/experimental-ct-vue` packages will no longer be updated.
Follow the [migration
guide](https://playwright.dev/docs/test-components#migration-from-the-experimental-packages)
to move to the stories model introduced in 1.62. Story ids passed to
[fixtures.mount()](https://playwright.dev/docs/api/class-fixtures#fixtures-mount)
can now be typed through the generated `Stories` registry.
- ⚠️ Ubuntu 20.04 is not supported anymore.
- 🐧 On Linux arm64, Playwright now downloads the [Chrome for
Testing](https://developer.chrome.com/blog/chrome-for-testing) build of
Chromium, the same build used on all other platforms.
#### Browser Versions
- Chromium 153.0.8010.12
- Mozilla Firefox 155.0
- WebKit 26.6
This version was also tested against the following stable channels:
- Google Chrome 153
- Microsoft Edge 153
</details>
<details>
<summary>unovue/reka-ui (reka-ui)</summary>
###
[`v2.11.0`](https://redirect.github.com/unovue/reka-ui/releases/tag/v2.11.0)
[Compare
Source](https://redirect.github.com/unovue/reka-ui/compare/v2.10.5...v2.11.0)
##### 🚀 Features
- Add TagGroup component - by
[@​yan-ad](https://redirect.github.com/yan-ad) and **Claude Opus
5.5 (1M context)** in
[#​2684](https://redirect.github.com/unovue/reka-ui/issues/2684)
[<samp>(485cf)</samp>](https://redirect.github.com/unovue/reka-ui/commit/485cfd2b)
- Add `loop` keyboard navigation to Listbox, Select and Tree - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#​2981](https://redirect.github.com/unovue/reka-ui/issues/2981)
[<samp>(67409)</samp>](https://redirect.github.com/unovue/reka-ui/commit/67409e4e)
- **Calendar/RangeCalendar**:
- Enhanced keyboard navigation with Home/End/PageUp/PageDown shortcuts
- by [@​epr3](https://redirect.github.com/epr3) and **Claude
Opus 5.5 (1M context)** in
[#​2530](https://redirect.github.com/unovue/reka-ui/issues/2530)
[<samp>(3f836)</samp>](https://redirect.github.com/unovue/reka-ui/commit/3f836525)
- **Checkbox**:
- Add max prop - by
[@​malik-jouda](https://redirect.github.com/malik-jouda) in
[#​2058](https://redirect.github.com/unovue/reka-ui/issues/2058)
[<samp>(72355)</samp>](https://redirect.github.com/unovue/reka-ui/commit/7235598f)
- **Combobox**:
- Add unmountOnHide prop - by
[@​onmax](https://redirect.github.com/onmax) and **Claude Opus 5.5
(1M context)** in
[#​2842](https://redirect.github.com/unovue/reka-ui/issues/2842)
[<samp>(22ec2)</samp>](https://redirect.github.com/unovue/reka-ui/commit/22ec2bc2)
- **Drawer**:
- Add DrawerVirtualKeyboardProvider for software keyboards - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#​2889](https://redirect.github.com/unovue/reka-ui/issues/2889)
[<samp>(e65ad)</samp>](https://redirect.github.com/unovue/reka-ui/commit/e65add53)
- **Field,Form**:
- Add Field and Form primitives - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#​2830](https://redirect.github.com/unovue/reka-ui/issues/2830)
[<samp>(c0d26)</samp>](https://redirect.github.com/unovue/reka-ui/commit/c0d267f5)
- **Menu**:
- Allow grace customization - by
[@​J-Michalek](https://redirect.github.com/J-Michalek) and
**Claude Opus 5.5 (1M context)** in
[#​1771](https://redirect.github.com/unovue/reka-ui/issues/1771)
[<samp>(472b5)</samp>](https://redirect.github.com/unovue/reka-ui/commit/472b5b87)
- **Number Field**:
- Add startingValue prop for increment/decrement - by
[@​rikzwarthoff](https://redirect.github.com/rikzwarthoff) in
[#​2628](https://redirect.github.com/unovue/reka-ui/issues/2628)
[<samp>(e9230)</samp>](https://redirect.github.com/unovue/reka-ui/commit/e9230140)
- **NumberField**:
- Add allowInvalid prop - by
[@​xerox0213](https://redirect.github.com/xerox0213) in
[#​2761](https://redirect.github.com/unovue/reka-ui/issues/2761)
[<samp>(43a8e)</samp>](https://redirect.github.com/unovue/reka-ui/commit/43a8e6ae)
-
**Select/Listbox/Combobox/Menu/ContextMenu/DropdownMenu/Menubar/ColorSwatchPicker**:
- Add slot prop to `*Item` and `forceMount` to `*ItemIndicator` - by
[@​kricsleo](https://redirect.github.com/kricsleo) and **Claude
Opus 5.5 (1M context)** in
[#​2562](https://redirect.github.com/unovue/reka-ui/issues/2562)
[<samp>(90c17)</samp>](https://redirect.github.com/unovue/reka-ui/commit/90c175aa)
- **Toast**:
- Allow action without dismissing toast - by
[@​yan-ad](https://redirect.github.com/yan-ad) and **Claude Opus
5.5 (1M context)** in
[#​2673](https://redirect.github.com/unovue/reka-ui/issues/2673)
[<samp>(76cd1)</samp>](https://redirect.github.com/unovue/reka-ui/commit/76cd1ac1)
- Add toast manager - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#​2985](https://redirect.github.com/unovue/reka-ui/issues/2985)
[<samp>(6c047)</samp>](https://redirect.github.com/unovue/reka-ui/commit/6c047940)
##### 🐞 Bug Fixes
- Respect defaultPrevented in trigger event handlers - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#​2984](https://redirect.github.com/unovue/reka-ui/issues/2984)
[<samp>(b9a0e)</samp>](https://redirect.github.com/unovue/reka-ui/commit/b9a0e2d8)
- Regressions found in the 2.11.0 release review - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#​2991](https://redirect.github.com/unovue/reka-ui/issues/2991)
[<samp>(29926)</samp>](https://redirect.github.com/unovue/reka-ui/commit/29926c77)
- **Autocomplete**:
- Clear stale filter when cancelling a blurred input - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#​2989](https://redirect.github.com/unovue/reka-ui/issues/2989)
[<samp>(94965)</samp>](https://redirect.github.com/unovue/reka-ui/commit/94965eed)
- **Calendar**:
- Keep the visible month when modelValue is a new object for the same
day - by [@​jevin98](https://redirect.github.com/jevin98),
[@​cursoragent](https://redirect.github.com/cursoragent) and
**Claude Opus 5.5 (1M context)** in
[#​2961](https://redirect.github.com/unovue/reka-ui/issues/2961)
[<samp>(8c820)</samp>](https://redirect.github.com/unovue/reka-ui/commit/8c820da6)
- **ContextMenu**:
- Support controlled open state - by
[@​Chaweki](https://redirect.github.com/Chaweki) in
[#​2936](https://redirect.github.com/unovue/reka-ui/issues/2936)
[<samp>(78089)</samp>](https://redirect.github.com/unovue/reka-ui/commit/78089a5f)
- Keep pointer anchor while the menu closes - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#​2978](https://redirect.github.com/unovue/reka-ui/issues/2978)
[<samp>(5f5f9)</samp>](https://redirect.github.com/unovue/reka-ui/commit/5f5f92cf)
- **DismissableLayer**:
- Detect outside interactions inside an iframe - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#​2979](https://redirect.github.com/unovue/reka-ui/issues/2979)
[<samp>(2ede3)</samp>](https://redirect.github.com/unovue/reka-ui/commit/2ede30ab)
- Share one ref-counted owner for body pointer-events - by
[@​SDIjeremy](https://redirect.github.com/SDIjeremy) in
[#​2987](https://redirect.github.com/unovue/reka-ui/issues/2987)
[<samp>(1451c)</samp>](https://redirect.github.com/unovue/reka-ui/commit/1451c7ac)
- **Drawer**:
- Accept initialFocus/finalFocus elements from another realm - by
[@​chiliec](https://redirect.github.com/chiliec) and **Claude Opus
5.5 (1M context)** in
[#​2972](https://redirect.github.com/unovue/reka-ui/issues/2972)
[<samp>(2d9b3)</samp>](https://redirect.github.com/unovue/reka-ui/commit/2d9b3a15)
- Let touch swipes start on interactive elements - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#​2982](https://redirect.github.com/unovue/reka-ui/issues/2982)
[<samp>(abb74)</samp>](https://redirect.github.com/unovue/reka-ui/commit/abb7413a)
- Let consumers cancel a swipe dismissal - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#​2983](https://redirect.github.com/unovue/reka-ui/issues/2983)
[<samp>(714c3)</samp>](https://redirect.github.com/unovue/reka-ui/commit/714c35a9)
- **FocusScope**:
- Respect tabindex order on autofocus - by
[@​yan-ad](https://redirect.github.com/yan-ad) in
[#​2765](https://redirect.github.com/unovue/reka-ui/issues/2765)
[<samp>(b755e)</samp>](https://redirect.github.com/unovue/reka-ui/commit/b755e676)
- **Menu**:
- Correct emitted event types to match runtime behavior - by
[@​kricsleo](https://redirect.github.com/kricsleo) and **Claude
Opus 5.5 (1M context)** in
[#​2119](https://redirect.github.com/unovue/reka-ui/issues/2119)
[<samp>(13373)</samp>](https://redirect.github.com/unovue/reka-ui/commit/13373e6f)
- **Rating**:
- Hide half-step indicators consistently during SSR - by
[@​zernonia](https://redirect.github.com/zernonia) in
[#​2965](https://redirect.github.com/unovue/reka-ui/issues/2965)
[<samp>(65b6c)</samp>](https://redirect.github.com/unovue/reka-ui/commit/65b6ced0)
- **Splitter**:
- Ignore residual mousemove events after the pointer enters an iframe
- by [@​ahmedrangel](https://redirect.github.com/ahmedrangel)
and **Claude Opus 5.5 (1M context)** in
[#​2969](https://redirect.github.com/unovue/reka-ui/issues/2969)
[<samp>(6cd48)</samp>](https://redirect.github.com/unovue/reka-ui/commit/6cd4859a)
- **TagsInput**:
- Prevent form submission on Enter synchronously - by
[@​zernonia](https://redirect.github.com/zernonia) in
[#​2966](https://redirect.github.com/unovue/reka-ui/issues/2966)
[<samp>(628dc)</samp>](https://redirect.github.com/unovue/reka-ui/commit/628dcba3)
- **TimeRangeField**:
- Sync segments when the value changes externally - by
[@​lazerg](https://redirect.github.com/lazerg) in
[#​2902](https://redirect.github.com/unovue/reka-ui/issues/2902)
[<samp>(b0163)</samp>](https://redirect.github.com/unovue/reka-ui/commit/b0163d1a)
- **VisuallyHidden**:
- Keep focusable content in the accessibility tree - by
[@​zernonia](https://redirect.github.com/zernonia), **Claude Opus
5.5 (1M context)** and
[@​lazerg](https://redirect.github.com/lazerg) in
[#​2980](https://redirect.github.com/unovue/reka-ui/issues/2980)
[<samp>(a9764)</samp>](https://redirect.github.com/unovue/reka-ui/commit/a97648f7)
- **deps**:
- Update vue - in
[#​2093](https://redirect.github.com/unovue/reka-ui/issues/2093)
[<samp>(7189b)</samp>](https://redirect.github.com/unovue/reka-ui/commit/7189b892)
- **focus-scope**:
- Trap focus inside a shadow root - by
[@​qudsiamehmood](https://redirect.github.com/qudsiamehmood) in
[#​2780](https://redirect.github.com/unovue/reka-ui/issues/2780)
[<samp>(511e6)</samp>](https://redirect.github.com/unovue/reka-ui/commit/511e6d62)
##### [View changes on
GitHub](https://redirect.github.com/unovue/reka-ui/compare/v2.10.5...v2.11.0)
###
[`v2.10.5`](https://redirect.github.com/unovue/reka-ui/releases/tag/v2.10.5)
[Compare
Source](https://redirect.github.com/unovue/reka-ui/compare/v2.10.4...v2.10.5)
##### 🐞 Bug Fixes
- **Dialog**:
- Re-key auto-focus on presence when force-mounted - by
[@​EasonLin0716](https://redirect.github.com/EasonLin0716) and
**Claude Opus 5 (1M context)** in
[#​2856](https://redirect.github.com/unovue/reka-ui/issues/2856)
[<samp>(eb702)</samp>](https://redirect.github.com/unovue/reka-ui/commit/eb7026c6)
- **DismissableLayer**:
- Drop stale deferred click listener on inside pointerdown - by
[@​kevinpickett](https://redirect.github.com/kevinpickett) in
[#​2892](https://redirect.github.com/unovue/reka-ui/issues/2892)
[<samp>(f80e7)</samp>](https://redirect.github.com/unovue/reka-ui/commit/f80e7f0d)
- Treat the layer root as inside so a focused FocusScope container does
not dismiss it - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#​2942](https://redirect.github.com/unovue/reka-ui/issues/2942)
[<samp>(8d0a4)</samp>](https://redirect.github.com/unovue/reka-ui/commit/8d0a4671)
- **Drawer**:
- Apply initialFocus and finalFocus on the content - by
[@​lazerg](https://redirect.github.com/lazerg) in
[#​2935](https://redirect.github.com/unovue/reka-ui/issues/2935)
[<samp>(0351f)</samp>](https://redirect.github.com/unovue/reka-ui/commit/0351f0d3)
- **Listbox**:
- Include $attrs in ListboxItem v-memo deps - by
[@​KeionneDerousselle](https://redirect.github.com/KeionneDerousselle)
in
[#​2905](https://redirect.github.com/unovue/reka-ui/issues/2905)
[<samp>(7b0eb)</samp>](https://redirect.github.com/unovue/reka-ui/commit/7b0ebc56)
- **Menu**:
- Preserve focus event target across nextTick to keep submenu open -
by [@​qqqqqf-q](https://redirect.github.com/qqqqqf-q) in
[#​2930](https://redirect.github.com/unovue/reka-ui/issues/2930)
[<samp>(9a079)</samp>](https://redirect.github.com/unovue/reka-ui/commit/9a079466)
- **NumberField**:
- Defer touch stepper activation - by
[@​kaspernowak](https://redirect.github.com/kaspernowak) in
[#​2948](https://redirect.github.com/unovue/reka-ui/issues/2948)
[<samp>(72a3a)</samp>](https://redirect.github.com/unovue/reka-ui/commit/72a3a1dd)
- **PinInput**:
- Reflect undefined values in numeric v-model type - by
[@​lazerg](https://redirect.github.com/lazerg) in
[#​2815](https://redirect.github.com/unovue/reka-ui/issues/2815)
[<samp>(94b84)</samp>](https://redirect.github.com/unovue/reka-ui/commit/94b849cb)
- Stop trapping `Tab` inside the inputs in OTP mode - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#​2944](https://redirect.github.com/unovue/reka-ui/issues/2944)
[<samp>(136d4)</samp>](https://redirect.github.com/unovue/reka-ui/commit/136d4939)
- **Select**:
- Exclude Space from typeahead search - by
[@​martinascharrer](https://redirect.github.com/martinascharrer),
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#​2955](https://redirect.github.com/unovue/reka-ui/issues/2955)
[<samp>(f4089)</samp>](https://redirect.github.com/unovue/reka-ui/commit/f4089fc9)
- **Splitter**:
- Reset resize handle hover state when pointer enters an iframe - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#​2941](https://redirect.github.com/unovue/reka-ui/issues/2941)
[<samp>(d3dad)</samp>](https://redirect.github.com/unovue/reka-ui/commit/d3dad119)
- **Tooltip**:
- Stop pointing at a stale trigger element after it's replaced - by
[@​lazerg](https://redirect.github.com/lazerg) in
[#​2925](https://redirect.github.com/unovue/reka-ui/issues/2925)
[<samp>(2a4c6)</samp>](https://redirect.github.com/unovue/reka-ui/commit/2a4c6339)
- Close hoverable content when it covers another trigger - by
[@​zernonia](https://redirect.github.com/zernonia) in
[#​2946](https://redirect.github.com/unovue/reka-ui/issues/2946)
[<samp>(d54e3)</samp>](https://redirect.github.com/unovue/reka-ui/commit/d54e34d2)
- **Tree**:
- Leave keyboard events alone when they come from a text field - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#​2903](https://redirect.github.com/unovue/reka-ui/issues/2903)
[<samp>(f1697)</samp>](https://redirect.github.com/unovue/reka-ui/commit/f1697dc0)
- **shared**:
- Stop infinite type recursion in useEmitAsProps for `[void]` emits -
by [@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#​2945](https://redirect.github.com/unovue/reka-ui/issues/2945)
[<samp>(8360a)</samp>](https://redirect.github.com/unovue/reka-ui/commit/8360a70a)
- Derive the day period from a ZonedDateTime's own time zone - by
[@​simonworkhouse](https://redirect.github.com/simonworkhouse) in
[#​2953](https://redirect.github.com/unovue/reka-ui/issues/2953)
[<samp>(97006)</samp>](https://redirect.github.com/unovue/reka-ui/commit/97006686)
- Derive the day period from the hour, not a localized string - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#​2958](https://redirect.github.com/unovue/reka-ui/issues/2958)
[<samp>(a3239)</samp>](https://redirect.github.com/unovue/reka-ui/commit/a32396e7)
##### 🏎 Performance
- **Listbox**: Avoid collection scan when highlighting - by
[@​onmax](https://redirect.github.com/onmax) in
[#​2912](https://redirect.github.com/unovue/reka-ui/issues/2912)
[<samp>(bb6f6)</samp>](https://redirect.github.com/unovue/reka-ui/commit/bb6f68ea)
- **useFilter**: Short-circuit contains on exact substring match - by
[@​Cherry](https://redirect.github.com/Cherry) and **Claude Opus 5
(1M context)** in
[#​2890](https://redirect.github.com/unovue/reka-ui/issues/2890)
[<samp>(94895)</samp>](https://redirect.github.com/unovue/reka-ui/commit/94895041)
##### [View changes on
GitHub](https://redirect.github.com/unovue/reka-ui/compare/v2.10.4...v2.10.5)
###
[`v2.10.4`](https://redirect.github.com/unovue/reka-ui/releases/tag/v2.10.4)
[Compare
Source](https://redirect.github.com/unovue/reka-ui/compare/v2.10.3...v2.10.4)
##### 🐞 Bug Fixes
- **Combobox**:
- Defer highlight scroll until Popper placement - by
[@​gavgrego](https://redirect.github.com/gavgrego) in
[#​2885](https://redirect.github.com/unovue/reka-ui/issues/2885)
[<samp>(48a85)</samp>](https://redirect.github.com/unovue/reka-ui/commit/48a851cb)
- **DismissableLayer**:
- Ignore outside pointerdown while not present - by
[@​benjamincanac](https://redirect.github.com/benjamincanac) in
[#​2863](https://redirect.github.com/unovue/reka-ui/issues/2863)
[<samp>(099da)</samp>](https://redirect.github.com/unovue/reka-ui/commit/099dab99)
- Remove the stale branch element from the registry on unmount - by
[@​lazerg](https://redirect.github.com/lazerg) in
[#​2874](https://redirect.github.com/unovue/reka-ui/issues/2874)
[<samp>(e65b3)</samp>](https://redirect.github.com/unovue/reka-ui/commit/e65b3de9)
- **Drawer**:
- Toggle open state on trigger click - by
[@​NasreddinHodja](https://redirect.github.com/NasreddinHodja) and
**Claude Opus 5 (1M context)** in
[#​2881](https://redirect.github.com/unovue/reka-ui/issues/2881)
[<samp>(d5cb4)</samp>](https://redirect.github.com/unovue/reka-ui/commit/d5cb4375)
- Lock the swipe gesture to one axis on scrollable content - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#​2887](https://redirect.github.com/unovue/reka-ui/issues/2887)
[<samp>(c543b)</samp>](https://redirect.github.com/unovue/reka-ui/commit/c543b1db)
- **FocusScope**:
- Confirm focus is orphaned before pulling it to the container - by
[@​zernonia](https://redirect.github.com/zernonia) and **mkeyy0**
in
[#​2888](https://redirect.github.com/unovue/reka-ui/issues/2888)
[<samp>(f6f75)</samp>](https://redirect.github.com/unovue/reka-ui/commit/f6f75d0f)
- **RadioGroup**:
- Stop falling back to the item value for aria-label - by
[@​lazerg](https://redirect.github.com/lazerg) and **Lazizbek
Ergashev** in
[#​2861](https://redirect.github.com/unovue/reka-ui/issues/2861)
[<samp>(3efdb)</samp>](https://redirect.github.com/unovue/reka-ui/commit/3efdb080)
- **Select,Popover**:
- Drop aria-controls while the content is not rendered - by
[@​lazerg](https://redirect.github.com/lazerg) in
[#​2883](https://redirect.github.com/unovue/reka-ui/issues/2883)
[<samp>(6d2de)</samp>](https://redirect.github.com/unovue/reka-ui/commit/6d2de0ce)
- **Stepper**:
- Default StepperIndicator as <span> - by
[@​dibunbuns](https://redirect.github.com/dibunbuns) in
[#​2865](https://redirect.github.com/unovue/reka-ui/issues/2865)
[<samp>(c23e0)</samp>](https://redirect.github.com/unovue/reka-ui/commit/c23e0ed8)
- **Tooltip**:
- Receive the open broadcast on document instead of window - by
[@​lazerg](https://redirect.github.com/lazerg) and **Lazizbek
Ergashev** in
[#​2869](https://redirect.github.com/unovue/reka-ui/issues/2869)
[<samp>(b32f2)</samp>](https://redirect.github.com/unovue/reka-ui/commit/b32f255e)
##### [View changes on
GitHub](https://redirect.github.com/unovue/reka-ui/compare/v2.10.3...v2.10.4)
###
[`v2.10.3`](https://redirect.github.com/unovue/reka-ui/releases/tag/v2.10.3)
[Compare
Source](https://redirect.github.com/unovue/reka-ui/compare/v2.10.2...v2.10.3)
*No significant changes*
##### [View changes on
GitHub](https://redirect.github.com/unovue/reka-ui/compare/v2.10.2...v2.10.3)
###
[`v2.10.2`](https://redirect.github.com/unovue/reka-ui/releases/tag/v2.10.2)
[Compare
Source](https://redirect.github.com/unovue/reka-ui/compare/v2.10.1...v2.10.2)
##### 🐞 Bug Fixes
- **DateField,TimeField**: Advance segment focus in DOM order in RTL -
by [@​61021](https://redirect.github.com/61021) and **Claude Opus
5 (1M context)** in
[#​2813](https://redirect.github.com/unovue/reka-ui/issues/2813)
[<samp>(868cb)</samp>](https://redirect.github.com/unovue/reka-ui/commit/868cbcbd)
- **DismissableLayer**: Keep body pointer-events locked when the last
scroll lock releases - by
[@​61021](https://redirect.github.com/61021) and **Claude Opus 5
(1M context)** in
[#​2832](https://redirect.github.com/unovue/reka-ui/issues/2832)
[<samp>(a24ea)</samp>](https://redirect.github.com/unovue/reka-ui/commit/a24ea69a)
- **Drawer**: Track drags in non-dismissable directions so the drawer
pulls elastically - by
[@​zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#​2854](https://redirect.github.com/unovue/reka-ui/issues/2854)
[<samp>(719d5)</samp>](https://redirect.github.com/unovue/reka-ui/commit/719d59af)
- **IME**: Process Android soft-keyboard composition live for filters
- by
[@​benjamincanac](https://redirect.github.com/benjamincanac) in
[#​2806](https://redirect.github.com/unovue/reka-ui/issues/2806)
[<samp>(4e40e)</samp>](https://redirect.github.com/unovue/reka-ui/commit/4e40e144)
- **NumberField**: Allow backspacing through a formatted unit suffix -
by [@​lazerg](https://redirect.github.com/lazerg) and **Lazizbek
Ergashev** in [#​2851
> [!IMPORTANT]
> ✂ PR body was truncated to here.
</details>
---
### Configuration
📅 **Schedule**: (in timezone Asia/Shanghai)
- Branch creation
- "before 10am on monday"
- Automerge
- At any time (no schedule defined)
🚦 **Automerge**: Enabled.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.
👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions) if
that's undesired.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/voidzero-dev/vite-plus).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNjQuMSIsInVwZGF0ZWRJblZlciI6IjQ0LjE2NC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: voidzero-guard[bot] <278573678+voidzero-guard[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Cold Windows jobs unpack MSVC installer archives during compilation. A cache miss adds several minutes to the build.
Download a pinned Windows SDK archive, verify its SHA-256 checksum, and cache its headers and x64 libraries. Adapt its paths for
cargo-xwinand keep theclang-clcompiler driver.Use
Clang 22for the SDK headers. Set-fno-delete-null-pointer-checksbecauseDetoursadds an offset to a null pointer when it injects DLLs. All existing Windows builds and tests remain enabled.This comparison uses
mainat2e9d7cb0fand this PR at94440c95c. Only.github/actions/setup-xwin/action.ymldiffers between the build variants.Each result is the median of two runs on the same runner profile with four vCPUs. The second pair reverses the variant order. “Cold” means an empty SDK cache; “warm” requires an exact SDK cache hit. Cargo, native binary, and
pnpmcaches are disabled. Both variants use the same product source and release profile.mainSDK preparation includes Clang installation, SDK download or restoration, and SDK initialization. It excludes the common Rust tool setup. Job time includes shared setup, native builds, and artifact upload. Cold job time also includes the SDK cache save. Queue time is excluded.
mainThe packaged SDK avoids installer extraction on a cache miss. The cache is larger, and warm SDK preparation still requires Clang setup. Native build times vary between samples. These two pairs show no consistent benefit with warm SDK caches. Jobs that restore native binaries already skip SDK setup.
Individual job times and run links
mainBenchmark source · Recorded measurements.