Skip to content

perf(ci): use a pinned prepacked Windows SDK - #2995

Merged
fengmk2 merged 4 commits into
mainfrom
perf/ci-windows-sysroot
Oct 14, 2026
Merged

fengmk2 merged 4 commits into
mainfrom
perf/ci-windows-sysroot

Conversation

@fengmk2

@fengmk2 fengmk2 commented Oct 12, 2026 •

Copy link
Copy Markdown
Member

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-xwin and keep the clang-cl compiler driver.

Use Clang 22 for the SDK headers. Set -fno-delete-null-pointer-checks because Detours adds an offset to a null pointer when it injects DLLs. All existing Windows builds and tests remain enabled.

This comparison uses main at 2e9d7cb0f and this PR at 94440c95c. Only .github/actions/setup-xwin/action.yml differs 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 pnpm caches are disabled. Both variants use the same product source and release profile.

SDK cache Measurement main This PR Change
Cold SDK preparation 4m32s 19.9s 🟢 ↓ 4m12s (92.7%)
Cold Native build commands 7m22s 7m02s 🟢 ↓ 19.5s (4.4%)
Cold Windows build job 12m24s 8m02s 🟢 ↓ 4m22s (35.3%)
Warm SDK preparation 2.7s 7.4s 🔴 ↑ 4.7s (176.8%)
Warm Native build commands 7m03s 7m37s 🔴 ↑ 33.9s (8.0%)
Warm Windows build job 7m35s 8m12s 🔴 ↑ 36.5s (8.0%)

SDK 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.

SDK cache size main This PR Change
Compressed storage 130.9 MiB 233.7 MiB 🔴 ↑ 102.8 MiB (78.6%)
Cached files, unpacked 1104.5 MiB 1625.6 MiB 🔴 ↑ 521.1 MiB (47.2%)

The 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
SDK cache Sample main This PR Change
Cold 1 12m06s 8m40s 🟢 ↓ 3m26s (28.4%)
Cold 2 12m42s 7m23s 🟢 ↓ 5m19s (41.9%)
Warm 1 7m56s 7m14s 🟢 ↓ 42.0s (8.8%)
Warm 2 7m14s 9m09s 🔴 ↑ 1m55s (26.5%)

Benchmark source · Recorded measurements.

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

🚀 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 deployment

Preview Deployments by commit

Status Deployment URL Commit Updated (UTC) See this deployment's details
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://85ea26aa-viteplus-dev.voidzero-docs.workers.dev 1c23f7d 2026-10-14T11:15:42.373Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://f9d9c3da-viteplus-dev.voidzero-docs.workers.dev 94440c9 2026-10-14T03:51:41.307Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://62777298-viteplus-dev.voidzero-docs.workers.dev 8333c60 2026-10-12T03:23:26.359Z Visit the dashboard ↗
  • Build: Success ✅
  • Deployment: Success ✅

View logs ↗
https://ecb85da3-viteplus-dev.voidzero-docs.workers.dev 4ce3044 2026-10-12T02:11:20.667Z Visit the dashboard ↗

@fengmk2 fengmk2 added the test: e2e Auto run e2e tests label Oct 12, 2026
@github-actions

github-actions Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

CLI artifact sizes (1c23f7d)

Final release artifacts built by the canonical build-upstream and build-windows-cli actions.
The dist rows use the Linux build. The core total excludes .node files to match the release artifact.

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%)

@fengmk2
fengmk2 force-pushed the perf/ci-windows-sysroot branch from 8333c60 to 94440c9 Compare October 14, 2026 03:50
@fengmk2
fengmk2 marked this pull request as ready for review October 14, 2026 10:51
@fengmk2 fengmk2 self-assigned this Oct 14, 2026
@fengmk2
fengmk2 requested a review from Brooooooklyn October 14, 2026 10:52
@fengmk2
fengmk2 merged commit 2970c91 into main Oct 14, 2026
104 checks passed
@fengmk2
fengmk2 deleted the perf/ci-windows-sysroot branch October 14, 2026 11:42
@fengmk2 fengmk2 mentioned this pull request Oct 16, 2026
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)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@ast-grep%2fnapi/0.51.0?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@ast-grep%2fnapi/0.51.0?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@ast-grep%2fnapi/0.45.3/0.51.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@ast-grep%2fnapi/0.45.3/0.51.0?slim=true)
|
| [@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) |
![age](https://developer.mend.io/api/mc/badges/age/npm/@iconify%2fvue/5.0.3?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@iconify%2fvue/5.0.3?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@iconify%2fvue/5.0.1/5.0.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@iconify%2fvue/5.0.1/5.0.3?slim=true)
|
|
[@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)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@nkzw%2fsafe-word-list/3.1.2?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nkzw%2fsafe-word-list/3.1.2?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nkzw%2fsafe-word-list/3.1.0/3.1.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nkzw%2fsafe-word-list/3.1.0/3.1.2?slim=true)
|
|
[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)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/es-module-lexer/3.0.4?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/es-module-lexer/3.0.4?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/es-module-lexer/3.0.3/3.0.4?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/es-module-lexer/3.0.3/3.0.4?slim=true)
|
| [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) |
![age](https://developer.mend.io/api/mc/badges/age/npm/fast-wrap-ansi/0.2.2?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/fast-wrap-ansi/0.2.2?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/fast-wrap-ansi/0.2.0/0.2.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/fast-wrap-ansi/0.2.0/0.2.2?slim=true)
|
| [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) |
![age](https://developer.mend.io/api/mc/badges/age/npm/minimatch/10.2.6?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/minimatch/10.2.6?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/minimatch/10.2.4/10.2.6?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/minimatch/10.2.4/10.2.6?slim=true)
|
| pkg-types | [`2.3.0` →
`2.3.3`](https://renovatebot.com/diffs/npm/pkg-types/2.3.0/2.3.3) |
![age](https://developer.mend.io/api/mc/badges/age/npm/pkg-types/2.3.3?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/pkg-types/2.3.3?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/pkg-types/2.3.0/2.3.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/pkg-types/2.3.0/2.3.3?slim=true)
|
| [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)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/playwright/1.64.1?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/playwright/1.64.1?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/playwright/1.62.1/1.64.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/playwright/1.62.1/1.64.1?slim=true)
|
| [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) |
![age](https://developer.mend.io/api/mc/badges/age/npm/reka-ui/2.11.0?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/reka-ui/2.11.0?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/reka-ui/2.9.9/2.11.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/reka-ui/2.9.9/2.11.0?slim=true)
|
| [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) |
![age](https://developer.mend.io/api/mc/badges/age/npm/tailwindcss/4.3.3?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/tailwindcss/4.3.3?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/tailwindcss/4.3.0/4.3.3?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/tailwindcss/4.3.0/4.3.3?slim=true)
|
|
[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)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/vitepress-plugin-group-icons/1.7.7?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/vitepress-plugin-group-icons/1.7.7?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/vitepress-plugin-group-icons/1.7.5/1.7.7?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vitepress-plugin-group-icons/1.7.5/1.7.7?slim=true)
|
|
[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)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/vitepress-plugin-llms/1.14.0?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/vitepress-plugin-llms/1.14.0?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/vitepress-plugin-llms/1.13.1/1.14.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vitepress-plugin-llms/1.13.1/1.14.0?slim=true)
|
| [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) |
![age](https://developer.mend.io/api/mc/badges/age/npm/vue/3.5.44?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/vue/3.5.44?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/vue/3.5.35/3.5.44?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vue/3.5.35/3.5.44?slim=true)
|
| [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) |
![age](https://developer.mend.io/api/mc/badges/age/npm/wrangler/4.151.0?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/wrangler/4.151.0?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/wrangler/4.127.1/4.151.0?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/wrangler/4.127.1/4.151.0?slim=true)
|
| [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) |
![age](https://developer.mend.io/api/mc/badges/age/npm/zod/4.6.7?slim=true)
|
![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/zod/4.6.7?slim=true)
|
![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/zod/4.6.5/4.6.7?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/zod/4.6.5/4.6.7?slim=true)
|

---

### Release Notes

<details>
<summary>ast-grep/ast-grep (@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
([#&#8203;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
[@&#8203;BridgeAR](https://redirect.github.com/BridgeAR) in
[#&#8203;258](https://redirect.github.com/guybedford/es-module-lexer/pull/258)
- fix(parser): preserve complete import attribute metadata by
[@&#8203;BridgeAR](https://redirect.github.com/BridgeAR) in
[#&#8203;260](https://redirect.github.com/guybedford/es-module-lexer/pull/260)
- fix(ts): lex `/` after a postfix non-null assertion as division by
[@&#8203;guybedford](https://redirect.github.com/guybedford) in
[#&#8203;263](https://redirect.github.com/guybedford/es-module-lexer/pull/263)
- ci: add release and publish workflows by
[@&#8203;guybedford](https://redirect.github.com/guybedford) in
[#&#8203;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
[@&#8203;43081j](https://redirect.github.com/43081j) in
[#&#8203;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

-
[#&#8203;43247](https://redirect.github.com/microsoft/playwright/issues/43247)
\[Bug]: \_electron.launch intermittently loses a packaged app's first
window since 1.64.0
-
[#&#8203;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 #&#8203;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
[@&#8203;yan-ad](https://redirect.github.com/yan-ad) and **Claude Opus
5.5 (1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#&#8203;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 [@&#8203;epr3](https://redirect.github.com/epr3) and **Claude
Opus 5.5 (1M context)** in
[#&#8203;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
[@&#8203;malik-jouda](https://redirect.github.com/malik-jouda) in
[#&#8203;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
[@&#8203;onmax](https://redirect.github.com/onmax) and **Claude Opus 5.5
(1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#&#8203;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
[@&#8203;J-Michalek](https://redirect.github.com/J-Michalek) and
**Claude Opus 5.5 (1M context)** in
[#&#8203;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
[@&#8203;rikzwarthoff](https://redirect.github.com/rikzwarthoff) in
[#&#8203;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
[@&#8203;xerox0213](https://redirect.github.com/xerox0213) in
[#&#8203;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
[@&#8203;kricsleo](https://redirect.github.com/kricsleo) and **Claude
Opus 5.5 (1M context)** in
[#&#8203;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
[@&#8203;yan-ad](https://redirect.github.com/yan-ad) and **Claude Opus
5.5 (1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#&#8203;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 [@&#8203;jevin98](https://redirect.github.com/jevin98),
[@&#8203;cursoragent](https://redirect.github.com/cursoragent) and
**Claude Opus 5.5 (1M context)** in
[#&#8203;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
[@&#8203;Chaweki](https://redirect.github.com/Chaweki) in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#&#8203;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
[@&#8203;SDIjeremy](https://redirect.github.com/SDIjeremy) in
[#&#8203;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
[@&#8203;chiliec](https://redirect.github.com/chiliec) and **Claude Opus
5.5 (1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5.5 (1M context)** in
[#&#8203;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
[@&#8203;yan-ad](https://redirect.github.com/yan-ad) in
[#&#8203;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
[@&#8203;kricsleo](https://redirect.github.com/kricsleo) and **Claude
Opus 5.5 (1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) in
[#&#8203;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 [@&#8203;ahmedrangel](https://redirect.github.com/ahmedrangel)
and **Claude Opus 5.5 (1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) in
[#&#8203;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
[@&#8203;lazerg](https://redirect.github.com/lazerg) in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia), **Claude Opus
5.5 (1M context)** and
[@&#8203;lazerg](https://redirect.github.com/lazerg) in
[#&#8203;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
[#&#8203;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
[@&#8203;qudsiamehmood](https://redirect.github.com/qudsiamehmood) in
[#&#8203;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
[@&#8203;EasonLin0716](https://redirect.github.com/EasonLin0716) and
**Claude Opus 5 (1M context)** in
[#&#8203;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
[@&#8203;kevinpickett](https://redirect.github.com/kevinpickett) in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#&#8203;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
[@&#8203;lazerg](https://redirect.github.com/lazerg) in
[#&#8203;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
[@&#8203;KeionneDerousselle](https://redirect.github.com/KeionneDerousselle)
in
[#&#8203;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 [@&#8203;qqqqqf-q](https://redirect.github.com/qqqqqf-q) in
[#&#8203;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
[@&#8203;kaspernowak](https://redirect.github.com/kaspernowak) in
[#&#8203;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
[@&#8203;lazerg](https://redirect.github.com/lazerg) in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#&#8203;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
[@&#8203;martinascharrer](https://redirect.github.com/martinascharrer),
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#&#8203;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
[@&#8203;lazerg](https://redirect.github.com/lazerg) in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#&#8203;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 [@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#&#8203;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
[@&#8203;simonworkhouse](https://redirect.github.com/simonworkhouse) in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#&#8203;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
[@&#8203;onmax](https://redirect.github.com/onmax) in
[#&#8203;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
[@&#8203;Cherry](https://redirect.github.com/Cherry) and **Claude Opus 5
(1M context)** in
[#&#8203;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
[@&#8203;gavgrego](https://redirect.github.com/gavgrego) in
[#&#8203;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
[@&#8203;benjamincanac](https://redirect.github.com/benjamincanac) in
[#&#8203;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
[@&#8203;lazerg](https://redirect.github.com/lazerg) in
[#&#8203;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
[@&#8203;NasreddinHodja](https://redirect.github.com/NasreddinHodja) and
**Claude Opus 5 (1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **mkeyy0**
in
[#&#8203;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
[@&#8203;lazerg](https://redirect.github.com/lazerg) and **Lazizbek
Ergashev** in
[#&#8203;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
[@&#8203;lazerg](https://redirect.github.com/lazerg) in
[#&#8203;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
[@&#8203;dibunbuns](https://redirect.github.com/dibunbuns) in
[#&#8203;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
[@&#8203;lazerg](https://redirect.github.com/lazerg) and **Lazizbek
Ergashev** in
[#&#8203;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 [@&#8203;61021](https://redirect.github.com/61021) and **Claude Opus
5 (1M context)** in
[#&#8203;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
[@&#8203;61021](https://redirect.github.com/61021) and **Claude Opus 5
(1M context)** in
[#&#8203;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
[@&#8203;zernonia](https://redirect.github.com/zernonia) and **Claude
Opus 5 (1M context)** in
[#&#8203;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
[@&#8203;benjamincanac](https://redirect.github.com/benjamincanac) in
[#&#8203;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 [@&#8203;lazerg](https://redirect.github.com/lazerg) and **Lazizbek
Ergashev** in [#&#8203;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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

test: e2e Auto run e2e tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants