Skip to content

fix(core): field unmount#2068

Merged
harry-whorlow merged 18 commits intoTanStack:mainfrom
TkDodo:feature/fix/field-unmount
Mar 27, 2026
Merged

fix(core): field unmount#2068
harry-whorlow merged 18 commits intoTanStack:mainfrom
TkDodo:feature/fix/field-unmount

Conversation

@TkDodo
Copy link
Copy Markdown
Contributor

@TkDodo TkDodo commented Mar 6, 2026

Add unmounting to fields. field.mount now returns a cleanup function for unmounting.

Without unmounting, conditionally rendered fields will keep their field-level validations running even though the field isn’t rendered anymore.

Summary by CodeRabbit

  • New Features

    • Added form option cleanupFieldsOnUnmount (default: false) to control clearing field meta/state on unmount.
    • Field mount now returns an explicit cleanup/unmount function.
  • Bug Fixes

    • Unmount now cancels in-flight async validations and debounced listeners to avoid stale callbacks.
    • Hidden/conditionally rendered fields no longer retain submit errors after unmount when cleanup is enabled.
  • Tests

    • Expanded coverage for mount/unmount, value/meta preservation, async cancellation, and remount behavior.

@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Mar 6, 2026

🦋 Changeset detected

Latest commit: 7965967

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 13 packages
Name Type
@tanstack/form-core Patch
@tanstack/react-form Patch
@tanstack/angular-form Patch
@tanstack/form-devtools Patch
@tanstack/lit-form Patch
@tanstack/solid-form Patch
@tanstack/svelte-form Patch
@tanstack/vue-form Patch
@tanstack/react-form-nextjs Patch
@tanstack/react-form-remix Patch
@tanstack/react-form-start Patch
@tanstack/react-form-devtools Patch
@tanstack/solid-form-devtools Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Fixes the issue with field unmount in core.
@nx-cloud
Copy link
Copy Markdown

nx-cloud bot commented Mar 6, 2026

View your CI Pipeline Execution ↗ for commit add70ff

Command Status Duration Result
nx affected --targets=test:sherif,test:knip,tes... ✅ Succeeded 29s View ↗
nx run-many --target=build --exclude=examples/** ✅ Succeeded 1s View ↗

☁️ Nx Cloud last updated this comment at 2026-03-27 17:14:25 UTC

@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new bot commented Mar 6, 2026

More templates

@tanstack/angular-form

npm i https://pkg.pr.new/@tanstack/angular-form@2068

@tanstack/form-core

npm i https://pkg.pr.new/@tanstack/form-core@2068

@tanstack/form-devtools

npm i https://pkg.pr.new/@tanstack/form-devtools@2068

@tanstack/lit-form

npm i https://pkg.pr.new/@tanstack/lit-form@2068

@tanstack/react-form

npm i https://pkg.pr.new/@tanstack/react-form@2068

@tanstack/react-form-devtools

npm i https://pkg.pr.new/@tanstack/react-form-devtools@2068

@tanstack/react-form-nextjs

npm i https://pkg.pr.new/@tanstack/react-form-nextjs@2068

@tanstack/react-form-remix

npm i https://pkg.pr.new/@tanstack/react-form-remix@2068

@tanstack/react-form-start

npm i https://pkg.pr.new/@tanstack/react-form-start@2068

@tanstack/solid-form

npm i https://pkg.pr.new/@tanstack/solid-form@2068

@tanstack/solid-form-devtools

npm i https://pkg.pr.new/@tanstack/solid-form-devtools@2068

@tanstack/svelte-form

npm i https://pkg.pr.new/@tanstack/svelte-form@2068

@tanstack/vue-form

npm i https://pkg.pr.new/@tanstack/vue-form@2068

commit: add70ff

@TkDodo TkDodo marked this pull request as ready for review March 6, 2026 12:48
@sentry
Copy link
Copy Markdown

sentry bot commented Mar 6, 2026

Codecov Report

❌ Patch coverage is 92.30769% with 3 lines in your changes missing coverage. Please review.
✅ Project coverage is 90.24%. Comparing base (6892ed0) to head (add70ff).
⚠️ Report is 158 commits behind head on main.

Files with missing lines Patch % Lines
packages/form-core/src/FieldApi.ts 92.10% 3 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2068      +/-   ##
==========================================
- Coverage   90.35%   90.24%   -0.11%     
==========================================
  Files          38       49      +11     
  Lines        1752     2041     +289     
  Branches      444      532      +88     
==========================================
+ Hits         1583     1842     +259     
- Misses        149      179      +30     
  Partials       20       20              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@TkDodo TkDodo requested a review from crutchcorn March 7, 2026 08:36
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 13, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a Form option cleanupFieldsOnUnmount; FieldApi.mount now returns an explicit teardown function that may abort validations, cancel timers/listeners, reset per-field meta, and clear the field instance; tests and a changeset were added.

Changes

Cohort / File(s) Summary
Changeset
​.changeset/red-hats-jam.md
New changeset recording patch bumps for @tanstack/form-core and @tanstack/react-form and noting the core field unmount fix.
Form options & types
packages/form-core/src/FormApi.ts
Added public cleanupFieldsOnUnmount?: boolean (default false). Changed fieldInfo to a Partial<Record<...>> and removed two ESLint suppression comments.
Field lifecycle / mount API
packages/form-core/src/FieldApi.ts
FieldApi.mount now documents and returns an unmount/teardown function. Teardown (when enabled) aborts in-flight validations, clears timeouts/listeners, resets per-field meta (preserving interaction flags), nulls fieldInfo.instance, and guards against tearing down newer instances. FieldInfo lookups standardized.
Core tests
packages/form-core/tests/FieldApi.spec.ts
Added extensive tests for unmount behavior: meta preservation vs. clearing, async validation cancellation/ignore, debounced listener cancellation, newer-instance protection, value persistence across remounts, array/nested scenarios, and various validator triggers.
React integration test
packages/react-form/tests/useField.test.tsx
Added test verifying hidden field submit errors are cleared on unmount when cleanupFieldsOnUnmount: true, while values persist and submit validators run correctly after remount.

Sequence Diagram

sequenceDiagram
    participant App as Application
    participant Form as FormApi
    participant Field as FieldApi
    participant Val as ValidationSystem

    App->>Form: create(formOptions with cleanupFieldsOnUnmount=true)
    App->>Field: mount field
    Field->>Form: register field instance & metadata
    Field->>Val: start validations / set timeouts / listeners
    Field-->>App: return cleanup function

    Note over Val: validations/timeouts/listeners in-flight

    App->>Field: call cleanup() on unmount
    Field->>Val: abort controllers & cancel timeouts/listeners
    Val-->>Val: stop async callbacks / ignore late results
    Field->>Form: reset field meta (or preserve depending on option), clear instance reference
    Field-->>App: cleanup complete
Loading

Estimated Code Review Effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐰 I nibbled code where fields might dwell,
I cancel flights and clear each trail,
I keep the value, tidy the map,
Protect the new while old ones nap,
Hoppity hop — the form is hale.

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description lacks the required template structure including the '🎯 Changes' section details, '✅ Checklist', and '🚀 Release Impact' sections, though it does explain the core concept. Follow the repository's PR description template by adding the required sections: '🎯 Changes' with detailed change description, '✅ Checklist' with contribution steps confirmation, and '🚀 Release Impact' with changeset acknowledgment.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The title 'fix(core): field unmount' clearly and concisely describes the main change: adding unmount cleanup functionality to fields in the core module.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/form-core/src/FieldApi.ts`:
- Around line 1361-1375: The abort loop currently runs before checking whether
this FieldApi instance is still the active one, which can cancel validations for
a newer remounted instance; move the instance check so it runs before touching
shared state (i.e., check fieldInfo.instance !== this and return early), or
alternatively inside the loop verify fieldInfo.instance === this before calling
validationMeta?.lastAbortController.abort() and clearing entries; update the
code paths around fieldInfo, validationMetaMap, lastAbortController, and the
instance guard to ensure only the active FieldApi instance aborts and clears the
shared validationMetaMap.
- Around line 1377-1383: The current reset in FieldApi using
this.form.baseStore.setState(...) replaces prev.fieldMetaBase[this.name] with
defaultFieldMeta and thus wipes preserved state on unmount/remount; update the
setter to merge with any existing meta for this.name instead of overwriting so
preserved flags/values survive (e.g., read existing =
prev.fieldMetaBase?.[this.name], then set fieldMetaBase[this.name] = {
...defaultFieldMeta, ...existing } or selectively preserve keys like
touched/value/defaultValueSeeded) so the logic in FieldApi that reseeds
options.defaultValue (referenced by the FieldApi methods around lines that
handle defaultValue reseeding) no longer loses user-entered values on remount.

In `@packages/react-form/tests/useField.test.tsx`:
- Around line 422-423: The test asserts onSubmit immediately after clicking
submit but form.handleSubmit() executes asynchronously; update the test to wait
for the async submit path to complete before asserting by awaiting a wait helper
that checks onSubmit (e.g., use waitFor or another async wait) so the assertion
verifies that onSubmit was called after form._handleSubmit()/form.handleSubmit()
finishes; reference the submitButton click and the onSubmit mock in the updated
assertion.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a2c69fac-1e7b-4d00-b470-721c4ba1c718

📥 Commits

Reviewing files that changed from the base of the PR and between a4e8dec and 4eff6fa.

📒 Files selected for processing (5)
  • .changeset/red-hats-jam.md
  • packages/form-core/src/FieldApi.ts
  • packages/form-core/src/FormApi.ts
  • packages/form-core/tests/FieldApi.spec.ts
  • packages/react-form/tests/useField.test.tsx

Comment thread packages/form-core/src/FieldApi.ts Outdated
Comment thread packages/form-core/src/FieldApi.ts
Comment thread packages/react-form/tests/useField.test.tsx Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/form-core/src/FieldApi.ts`:
- Around line 1364-1375: The teardown skips aborting async work started by the
older FieldApi instance because it only avoids touching shared controllers when
a newer instance is mounted; fix by either tracking abort controllers per
FieldApi instance or by ignoring async completions when the instance no longer
matches. Concretely: change the validation logic so each FieldApi stores its own
controllers (e.g., a per-instance map on this) instead of reusing
fieldInfo.validationMetaMap.lastAbortController, and abort only those on
teardown; or add a guard in the async validator completion path (before calling
field.setMeta(...) / inside FieldApi's async result handling) that checks
field.getInfo().instance === this and returns early if it differs. Ensure you
reference validationMetaMap, lastAbortController, FieldApi, setMeta and getInfo
when locating the relevant code to update.
- Around line 1330-1359: Currently async validation/listener
timeouts/controllers are attached to the active instance (this) even when the
async work targets a different field, so the target field cannot cancel them on
unmount; update the code that schedules linked-field async work (the
validateAsync caller that writes to getInfo().validationMetaMap and
this.timeoutIds.validations / this.timeoutIds.listeners) to store ownership on
the target field instead of this (i.e., use the target field's timeoutIds and
validationMetaMap entry keys), and update the teardown returned by the FieldApi
cleanup to clear any timeouts/controllers stored on the field itself (iterate
and clear entries on field.timeoutIds.validations/listeners/formListeners and
remove related validationMetaMap entries) so the target field’s unmount cancels
its own async work. Ensure you reference and update validateAsync,
getInfo().validationMetaMap, and timeoutIds.validations/listeners/formListeners
usage sites so ownership is moved to the field.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 39798198-5e48-4350-8160-450fd6a0e1ea

📥 Commits

Reviewing files that changed from the base of the PR and between 10abde0 and 8b41487.

📒 Files selected for processing (3)
  • packages/form-core/src/FieldApi.ts
  • packages/form-core/tests/FieldApi.spec.ts
  • packages/react-form/tests/useField.test.tsx

Comment thread packages/form-core/src/FieldApi.ts
Comment thread packages/form-core/src/FieldApi.ts
@harry-whorlow
Copy link
Copy Markdown
Contributor

This is a really solid PR! 🚀

@Dakkers
Copy link
Copy Markdown

Dakkers commented Mar 24, 2026

@harry-whorlow would syncing this branch with main fix the CI failures?

Copy link
Copy Markdown
Contributor

@LeCarbonator LeCarbonator left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! Did a quick sanity check, only noticed a small typo.

Comment thread examples/react/simple/src/index.tsx Outdated
Comment thread examples/react/simple/src/index.tsx Outdated
@LeCarbonator
Copy link
Copy Markdown
Contributor

@Dakkers No it would not. But it'll be fixed soon.

@harry-whorlow harry-whorlow force-pushed the feature/fix/field-unmount branch from a49d20c to ed6f7db Compare March 27, 2026 16:46
@harry-whorlow harry-whorlow merged commit 7a1428d into TanStack:main Mar 27, 2026
27 of 33 checks passed
@github-actions github-actions bot mentioned this pull request Mar 27, 2026
MrNaif2018 pushed a commit to bitcart/bitcart-frontend that referenced this pull request Apr 13, 2026
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [@effect/language-service](https://github.com/Effect-TS/language-service) | [`0.84.2` → `0.84.3`](https://renovatebot.com/diffs/npm/@effect%2flanguage-service/0.84.2/0.84.3) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@effect%2flanguage-service/0.84.3?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@effect%2flanguage-service/0.84.2/0.84.3?slim=true) |
| [@playwright/test](https://playwright.dev) ([source](https://github.com/microsoft/playwright)) | [`1.58.2` → `1.59.1`](https://renovatebot.com/diffs/npm/@playwright%2ftest/1.58.2/1.59.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@playwright%2ftest/1.59.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@playwright%2ftest/1.58.2/1.59.1?slim=true) |
| [@tanstack/react-form](https://tanstack.com/form) ([source](https://github.com/TanStack/form/tree/HEAD/packages/react-form)) | [`1.28.5` → `1.28.6`](https://renovatebot.com/diffs/npm/@tanstack%2freact-form/1.28.5/1.28.6) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@tanstack%2freact-form/1.28.6?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@tanstack%2freact-form/1.28.5/1.28.6?slim=true) |
| [@tanstack/react-query](https://tanstack.com/query) ([source](https://github.com/TanStack/query/tree/HEAD/packages/react-query)) | [`5.95.2` → `5.96.2`](https://renovatebot.com/diffs/npm/@tanstack%2freact-query/5.95.2/5.96.2) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@tanstack%2freact-query/5.96.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@tanstack%2freact-query/5.95.2/5.96.2?slim=true) |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node) ([source](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)) | [`25.5.0` → `25.5.2`](https://renovatebot.com/diffs/npm/@types%2fnode/25.5.0/25.5.2) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/25.5.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/25.5.0/25.5.2?slim=true) |
| [dotenv](https://github.com/motdotla/dotenv) | [`17.3.1` → `17.4.1`](https://renovatebot.com/diffs/npm/dotenv/17.3.1/17.4.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/dotenv/17.4.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/dotenv/17.3.1/17.4.1?slim=true) |
| [nx](https://nx.dev) ([source](https://github.com/nrwl/nx/tree/HEAD/packages/nx)) | [`22.6.3` → `22.6.4`](https://renovatebot.com/diffs/npm/nx/22.6.3/22.6.4) | ![age](https://developer.mend.io/api/mc/badges/age/npm/nx/22.6.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/nx/22.6.3/22.6.4?slim=true) |
| [oxlint-tsgolint](https://github.com/oxc-project/tsgolint) | [`0.18.1` → `0.19.0`](https://renovatebot.com/diffs/npm/oxlint-tsgolint/0.18.1/0.19.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/oxlint-tsgolint/0.19.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/oxlint-tsgolint/0.18.1/0.19.0?slim=true) |
| [remeda](https://remedajs.com/) ([source](https://github.com/remeda/remeda)) | [`2.33.6` → `2.33.7`](https://renovatebot.com/diffs/npm/remeda/2.33.6/2.33.7) | ![age](https://developer.mend.io/api/mc/badges/age/npm/remeda/2.33.7?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/remeda/2.33.6/2.33.7?slim=true) |
| [vike](https://github.com/vikejs/vike) | [`0.4.255` → `0.4.256`](https://renovatebot.com/diffs/npm/vike/0.4.255/0.4.256) | ![age](https://developer.mend.io/api/mc/badges/age/npm/vike/0.4.256?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vike/0.4.255/0.4.256?slim=true) |
| [vite-plugin-static-copy](https://github.com/sapphi-red/vite-plugin-static-copy) | [`4.0.0` → `4.0.1`](https://renovatebot.com/diffs/npm/vite-plugin-static-copy/4.0.0/4.0.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/vite-plugin-static-copy/4.0.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vite-plugin-static-copy/4.0.0/4.0.1?slim=true) |

---

### Release Notes

<details>
<summary>Effect-TS/language-service (@&#8203;effect/language-service)</summary>

### [`v0.84.3`](https://github.com/Effect-TS/language-service/releases/tag/%40effect/language-service%400.84.3)

[Compare Source](https://github.com/Effect-TS/language-service/compare/@effect/language-service@0.84.2...@effect/language-service@0.84.3)

##### Patch Changes

- [#&#8203;711](Effect-TS/language-service#711) [`892984f`](Effect-TS/language-service@892984f) Thanks [@&#8203;mattiamanzati](https://github.com/mattiamanzati)! - Report floating `Stream` values in Effect projects by parsing `Stream` types in the diagnostic type parser and checking them in `floatingEffect` for both v3 and v4 harnesses.

- [#&#8203;709](Effect-TS/language-service#709) [`0372f58`](Effect-TS/language-service@0372f58) Thanks [@&#8203;mattiamanzati](https://github.com/mattiamanzati)! - Fix the Effect v4 completion harness to cover `ServiceMap` self-in-classes examples instead of the v3-only `Context.Tag` variants.

- [#&#8203;712](Effect-TS/language-service#712) [`b7554df`](Effect-TS/language-service@b7554df) Thanks [@&#8203;mattiamanzati](https://github.com/mattiamanzati)! - Align Effect diagnostic messages with the reviewed neutral wording, preserving the existing version-specific API references while updating both v3 and v4 snapshot fixtures.

</details>

<details>
<summary>microsoft/playwright (@&#8203;playwright/test)</summary>

### [`v1.59.1`](https://github.com/microsoft/playwright/releases/tag/v1.59.1)

[Compare Source](microsoft/playwright@v1.59.0...v1.59.1)

##### Bug Fixes

- **\[Windows]** Reverted hiding console window when spawning browser processes, which caused regressions including broken `codegen`, `--ui` and `show` commands ([#&#8203;39990](microsoft/playwright#39990))

### [`v1.59.0`](https://github.com/microsoft/playwright/releases/tag/v1.59.0)

[Compare Source](microsoft/playwright@v1.58.2...v1.59.0)

#### 🎬 Screencast

New [page.screencast](https://playwright.dev/docs/api/class-page#page-screencast) API provides a unified interface for capturing page content with:

- Screencast recordings
- Action annotations
- Visual overlays
- Real-time frame capture
- Agentic video receipts

<center>

<img src="https://raw.githubusercontent.com/microsoft/playwright/main/docs/src/images/release-notes-1.59-screencast-demo.gif" alt="Demo" width="500" height="313" />

</center>

**Screencast recording** — record video with precise start/stop control, as an alternative to the [`recordVideo`](https://playwright.dev/docs/api/class-browser#browser-new-context-option-record-video) option:

```js
await page.screencast.start({ path: 'video.webm' });
// ... perform actions ...
await page.screencast.stop();
```

**Action annotations** — enable built-in visual annotations that highlight interacted elements and display action titles during recording:

```js
await page.screencast.showActions({ position: 'top-right' });
```

[screencast.showActions()](https://playwright.dev/docs/api/class-screencast#screencast-show-actions) accepts `position` (`'top-left'`, `'top'`, `'top-right'`, `'bottom-left'`, `'bottom'`, `'bottom-right'`), `duration` (ms per annotation), and `fontSize` (px). Returns a disposable to stop showing actions.

Action annotations can also be enabled in test fixtures via the `video` option:

```js
// playwright.config.ts
export default defineConfig({
  use: {
    video: {
      mode: 'on',
      show: {
        actions: { position: 'top-left' },
        test: { position: 'top-right' },
      },
    },
  },
});
```

**Visual overlays** — add chapter titles and custom HTML overlays on top of the page for richer narration:

```js
await page.screencast.showChapter('Adding TODOs', {
  description: 'Type and press enter for each TODO',
  duration: 1000,
});

await page.screencast.showOverlay('<div style="color: red">Recording</div>');
```

**Real-time frame capture** — stream JPEG-encoded frames for custom processing like thumbnails, live previews, AI vision, and more:

```js
await page.screencast.start({
  onFrame: ({ data }) => sendToVisionModel(data),
  size: { width: 800, height: 600 },
});
```

**Agentic video receipts** — coding agents can produce video evidence of their work. After completing a task, an agent can record a walkthrough video with rich annotations for human review:

```js
await page.screencast.start({ path: 'receipt.webm' });
await page.screencast.showActions({ position: 'top-right' });

await page.screencast.showChapter('Verifying checkout flow', {
  description: 'Added coupon code support per ticket #&#8203;1234',
});

// Agent performs the verification steps...
await page.locator('#coupon').fill('SAVE20');
await page.locator('#apply-coupon').click();
await expect(page.locator('.discount')).toContainText('20%');

await page.screencast.showChapter('Done', {
  description: 'Coupon applied, discount reflected in total',
});

await page.screencast.stop();
```

The resulting video serves as a receipt: chapter titles provide context, action annotations highlight each interaction, and the visual walkthrough is faster to review than text logs.

#### 🔗 Interoperability

New [browser.bind()](https://playwright.dev/docs/api/class-browser#browser-bind) API makes a launched browser available for `playwright-cli`, `@playwright/mcp`, and other clients to connect to.

**Bind a browser** — start a browser and bind it so others can connect:

```js
const { endpoint } = await browser.bind('my-session', {
  workspaceDir: '/my/project',
});
```

**Connect from playwright-cli** — connect to the running browser from your favorite coding agent.

```bash
playwright-cli attach my-session
playwright-cli -s my-session snapshot
```

**Connect from [@&#8203;playwright/mcp](https://github.com/playwright/mcp)** — or point your MCP server to the running browser.

```bash
@&#8203;playwright/mcp --endpoint=my-session
```

**Connect from a Playwright client** — use API to connect to the browser. Multiple clients at a time are supported!

```js
const browser = await chromium.connect(endpoint);
```

Pass `host` and `port` options to bind over WebSocket instead of a named pipe:

```js
const { endpoint } = await browser.bind('my-session', {
  host: 'localhost',
  port: 0,
});
// endpoint is a ws:// URL
```

Call [browser.unbind()](https://playwright.dev/docs/api/class-browser#browser-unbind) to stop accepting new connections.

#### 📊 Observability

Run `playwright-cli show` to open the Dashboard that lists all the bound browsers, their statuses, and allows interacting with them:

- See what your agent is doing on the background browsers
- Click into the sessions for manual interventions
- Open DevTools to inspect pages from the background browsers.

<center>

<img src="https://raw.githubusercontent.com/microsoft/playwright/main/docs/src/images/release-notes-1.59-dashboard.png" alt="Demo" width="1169" height="835" />

</center>
- `playwright-cli` binds all of its browsers automatically, so you can see what your agents are doing.
- Pass `PLAYWRIGHT_DASHBOARD=1` env variable to see all `@playwright/test` browsers in the dashboard.

#### 🐛 CLI debugger for agents

Coding agents can now run `npx playwright test --debug=cli` to attach and debug tests over `playwright-cli` — perfect for automatically fixing tests in agentic workflows:

```bash
$ npx playwright test --debug=cli

### Debugging Instructions
- Run "playwright-cli attach tw-87b59e" to attach to this test

$ playwright-cli attach tw-87b59e

### Session `tw-87b59e` created, attached to `tw-87b59e`.
Run commands with: playwright-cli --session=tw-87b59e <command>

### Paused
- Navigate to "/" at output/tests/example.spec.ts:4

$ playwright-cli --session tw-87b59e step-over

### Page
- Page URL: https://playwright.dev/
- Page Title: Fast and reliable end-to-end testing for modern web apps | Playwright

### Paused
- Expect "toHaveTitle" at output/tests/example.spec.ts:7
```

#### 📋 CLI trace analysis for agents

Coding agents can run `npx playwright trace` to explore [Playwright Trace](https://playwright.dev/docs/trace-viewer) and understand failing or flaky tests from the command line:

```bash
$ npx playwright trace open test-results/example-has-title-chromium/trace.zip
  Title:        example.spec.ts:3 › has title

$ npx playwright trace actions --grep="expect"
     # Time       Action                                                  Duration
  ──── ─────────  ─────────────────────────────────────────────────────── ────────
    9. 0:00.859  Expect "toHaveTitle"                                        5.1s  ✗

$ npx playwright trace action 9
  Expect "toHaveTitle"
  Error: expect(page).toHaveTitle(expected) failed
    Expected pattern: /Wrong Title/
    Received string:  "Fast and reliable end-to-end testing for modern web apps | Playwright"
    Timeout: 5000ms
  Snapshots
    available: before, after
    usage:     npx playwright trace snapshot 9 --name <before|after>

$ npx playwright trace snapshot 9 --name after

### Page
- Page Title: Fast and reliable end-to-end testing for modern web apps | Playwright

$ npx playwright trace close
```

#### ♻️ `await using`

Many APIs now return [async disposables](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncDispose), enabling the `await using` syntax for automatic cleanup:

```js
await using page = await context.newPage();
{
  await using route = await page.route('**/*', route => route.continue());
  await using script = await page.addInitScript('console.log("init script here")');
  await page.goto('https://playwright.dev');
  // do something
}
// route and init script have been removed at this point
```

#### 🔍 Snapshots and Locators

- Method [page.ariaSnapshot()](https://playwright.dev/docs/api/class-page#page-aria-snapshot) to capture the aria snapshot of the page — equivalent to `page.locator('body').ariaSnapshot()`.
- Options `depth` and `mode` in [locator.ariaSnapshot()](https://playwright.dev/docs/api/class-locator#locator-aria-snapshot).
- Method [locator.normalize()](https://playwright.dev/docs/api/class-locator#locator-normalize) converts a locator to follow best practices like test ids and aria roles.
- Method [page.pickLocator()](https://playwright.dev/docs/api/class-page#page-pick-locator) enters an interactive mode where hovering over elements highlights them and shows the corresponding locator. Click an element to get its [Locator](https://playwright.dev/docs/api/class-locator) back. Use [page.cancelPickLocator()](https://playwright.dev/docs/api/class-page#page-cancel-pick-locator) to cancel.

#### New APIs

##### Screencast

- [page.screencast](https://playwright.dev/docs/api/class-page#page-screencast) provides video recording, real-time frame streaming, and overlay management.
- Methods [screencast.start()](https://playwright.dev/docs/api/class-screencast#screencast-start) and [screencast.stop()](https://playwright.dev/docs/api/class-screencast#screencast-stop) for recording and frame capture.
- Methods [screencast.showActions()](https://playwright.dev/docs/api/class-screencast#screencast-show-actions) and [screencast.hideActions()](https://playwright.dev/docs/api/class-screencast#screencast-hide-actions) for action annotations.
- Methods [screencast.showChapter()](https://playwright.dev/docs/api/class-screencast#screencast-show-chapter) and [screencast.showOverlay()](https://playwright.dev/docs/api/class-screencast#screencast-show-overlay) for visual overlays.
- Methods [screencast.showOverlays()](https://playwright.dev/docs/api/class-screencast#screencast-show-overlays) and [screencast.hideOverlays()](https://playwright.dev/docs/api/class-screencast#screencast-hide-overlays) for overlay visibility control.

##### Storage, Console and Errors

- Method [browserContext.setStorageState()](https://playwright.dev/docs/api/class-browsercontext#browser-context-set-storage-state) clears existing cookies, local storage, and IndexedDB for all origins and sets a new storage state — no need to create a new context.
- Methods [page.clearConsoleMessages()](https://playwright.dev/docs/api/class-page#page-clear-console-messages) and [page.clearPageErrors()](https://playwright.dev/docs/api/class-page#page-clear-page-errors) to clear stored messages and errors.
- Option `filter` in [page.consoleMessages()](https://playwright.dev/docs/api/class-page#page-console-messages) and [page.pageErrors()](https://playwright.dev/docs/api/class-page#page-page-errors) controls which messages are returned.
- Method [consoleMessage.timestamp()](https://playwright.dev/docs/api/class-consolemessage#console-message-timestamp).

##### Miscellaneous

- [browserContext.debugger](https://playwright.dev/docs/api/class-browsercontext#browser-context-debugger) provides programmatic control over the Playwright debugger.
- Method [browserContext.isClosed()](https://playwright.dev/docs/api/class-browsercontext#browser-context-is-closed).
- Method [request.existingResponse()](https://playwright.dev/docs/api/class-request#request-existing-response) returns the response without waiting.
- Method [response.httpVersion()](https://playwright.dev/docs/api/class-response#response-http-version) returns the HTTP version used by the response.
- Events [cdpSession.on('event')](https://playwright.dev/docs/api/class-cdpsession#cdp-session-event-event) and [cdpSession.on('close')](https://playwright.dev/docs/api/class-cdpsession#cdp-session-event-close) for CDP sessions.
- Option `live` in [tracing.start()](https://playwright.dev/docs/api/class-tracing#tracing-start) for real-time trace updates.
- Option `artifactsDir` in [browserType.launch()](https://playwright.dev/docs/api/class-browsertype#browser-type-launch) to configure the artifacts directory.

#### 🛠️ Other improvements

- UI Mode has an option to only show tests affected by source changes.
- UI Mode and Trace Viewer have improved action filtering.
- HTML Reporter shows the list of runs from the same worker.
- HTML Reporter allows filtering test steps for quick search.
- New trace mode `'retain-on-failure-and-retries'` records a trace for each test run and retains all traces when an attempt fails — great for comparing a passing trace with a failing one from a flaky test.

#### Known Issues ⚠️⚠️

- `navigator.platform` emulation can cause Ctrl or Meta dispatching errors ([#&#8203;40009](microsoft/playwright#40009)). Pass `PLAYWRIGHT_NO_UA_PLATFORM = '1'` environment variable while we are issuing a patch release. Let us know in the issue how it affected you.

#### Breaking Changes ⚠️

- Removed macOS 14 support for WebKit. We recommend upgrading your macOS version, or keeping an older Playwright version.
- Removed `@playwright/experimental-ct-svelte` package.

#### Browser Versions

- Chromium 147.0.7727.15
- Mozilla Firefox 148.0.2
- WebKit 26.4

This version was also tested against the following stable channels:

- Google Chrome 146
- Microsoft Edge 146

</details>

<details>
<summary>TanStack/form (@&#8203;tanstack/react-form)</summary>

### [`v1.28.6`](https://github.com/TanStack/form/blob/HEAD/packages/react-form/CHANGELOG.md#1286)

[Compare Source](https://github.com/TanStack/form/compare/@tanstack/react-form@1.28.5...@tanstack/react-form@1.28.6)

##### Patch Changes

- fix(core): field unmount ([#&#8203;2068](TanStack/form#2068))

- Updated dependencies \[[`7a1428d`](TanStack/form@7a1428d)]:
  - [@&#8203;tanstack/form-core](https://github.com/tanstack/form-core)@&#8203;1.28.6

</details>

<details>
<summary>TanStack/query (@&#8203;tanstack/react-query)</summary>

### [`v5.96.2`](https://github.com/TanStack/query/blob/HEAD/packages/react-query/CHANGELOG.md#5962)

[Compare Source](https://github.com/TanStack/query/compare/@tanstack/react-query@5.96.1...@tanstack/react-query@5.96.2)

##### Patch Changes

- Updated dependencies \[]:
  - [@&#8203;tanstack/query-core](https://github.com/tanstack/query-core)@&#8203;5.96.2

### [`v5.96.1`](https://github.com/TanStack/query/blob/HEAD/packages/react-query/CHANGELOG.md#5961)

[Compare Source](https://github.com/TanStack/query/compare/@tanstack/react-query@5.96.0...@tanstack/react-query@5.96.1)

##### Patch Changes

- Updated dependencies \[]:
  - [@&#8203;tanstack/query-core](https://github.com/tanstack/query-core)@&#8203;5.96.1

### [`v5.96.0`](https://github.com/TanStack/query/blob/HEAD/packages/react-query/CHANGELOG.md#5960)

[Compare Source](https://github.com/TanStack/query/compare/@tanstack/react-query@5.95.2...@tanstack/react-query@5.96.0)

##### Patch Changes

- Updated dependencies \[]:
  - [@&#8203;tanstack/query-core](https://github.com/tanstack/query-core)@&#8203;5.96.0

</details>

<details>
<summary>motdotla/dotenv (dotenv)</summary>

### [`v17.4.1`](https://github.com/motdotla/dotenv/blob/HEAD/CHANGELOG.md#1741-2026-04-05)

[Compare Source](motdotla/dotenv@v17.4.0...v17.4.1)

##### Changed

- Change text `injecting` to `injected` ([#&#8203;1005](motdotla/dotenv#1005))

### [`v17.4.0`](https://github.com/motdotla/dotenv/blob/HEAD/CHANGELOG.md#1740-2026-04-01)

[Compare Source](motdotla/dotenv@v17.3.1...v17.4.0)

##### Added

- Add `skills/` folder with focused agent skills: `skills/dotenv/SKILL.md` (core usage) and `skills/dotenvx/SKILL.md` (encryption, multiple environments, variable expansion) for AI coding agent discovery via the skills.sh ecosystem (`npx skills add motdotla/dotenv`)

##### Changed

- Tighten up logs: `◇ injecting env (14) from .env` ([#&#8203;1003](motdotla/dotenv#1003))

</details>

<details>
<summary>nrwl/nx (nx)</summary>

### [`v22.6.4`](https://github.com/nrwl/nx/releases/tag/22.6.4)

[Compare Source](nrwl/nx@22.6.3...22.6.4)

#### 22.6.4 (2026-04-01)

##### 🚀 Features

- **misc:** update nx init telemetry meta from CSV to JSON format ([#&#8203;35076](nrwl/nx#35076))
- **nx-dev:** add conditional blog/changelog proxy in edge function ([#&#8203;35043](nrwl/nx#35043))

##### 🩹 Fixes

- **core:** validate bundler option for Angular presets in create-nx-workspace ([#&#8203;35074](nrwl/nx#35074))
- **core:** handle "." and absolute paths as workspace name in CNW ([#&#8203;35083](nrwl/nx#35083), [#&#8203;1](nrwl/nx#1))
- **core:** pin version of axios ([#&#8203;35093](nrwl/nx#35093))
- **core:** preserve sibling dependency inputs in native hashing ([#&#8203;35071](nrwl/nx#35071))
- **core:** sandbox exclusions, multi-line typeof import detection, global ensurePackage mock ([#&#8203;35056](nrwl/nx#35056))
- **core:** no-interactive should disable prompts during migrate ([#&#8203;35106](nrwl/nx#35106))
- **gradle:** increase project graph timeout defaults ([#&#8203;35058](nrwl/nx#35058))
- **js:** recognize tsgo in dependency-checks lint rule ([#&#8203;35048](nrwl/nx#35048))
- **js:** narrow tsc build-base outputs to only tsc-produced file types ([#&#8203;35041](nrwl/nx#35041))
- **js:** include tsbuildinfo in narrowed tsc build-base outputs ([#&#8203;35086](nrwl/nx#35086), [#&#8203;35041](nrwl/nx#35041))
- **js:** use explicit nx/bin/nx path in start-local-registry ([#&#8203;35127](nrwl/nx#35127))
- **misc:** handle non-interactive mode and add template shorthand names for CNW ([#&#8203;35045](nrwl/nx#35045))
- **react:** force Vite 7 when using React Router in framework mode ([#&#8203;35101](nrwl/nx#35101))
- **react-native:** use vite's transformWithEsbuild instead of direct esbuild import ([5771eb3346](nrwl/nx@5771eb3346))
- **repo:** pass env vars into docker builds in publish workflow ([#&#8203;35060](nrwl/nx#35060))
- **repo:** bump picomatch from 4.0.2 to 4.0.4 ([#&#8203;35081](nrwl/nx#35081), [#&#8203;35068](nrwl/nx#35068))
- **repo:** fixup lock-threads failing with resource inaccessible message ([#&#8203;35005](nrwl/nx#35005))
- **repo:** fix lockfile ([b070e23445](nrwl/nx@b070e23445))
- **repo:** re-enable Cypress HMR e2e tests after upstream tapable fix ([#&#8203;35105](nrwl/nx#35105), [#&#8203;34969](nrwl/nx#34969), [#&#8203;20693](nrwl/nx#20693))
- **repo:** disable ts-jest diagnostics for workspace-plugin tests ([b013f93dca](nrwl/nx@b013f93dca))
- **vite:** update vitest and plugin-react-swc versions for vite 8 compat ([#&#8203;35062](nrwl/nx#35062))
- **vite:** bump sass version for vue/nuxt presets for Vite 8 compat ([#&#8203;35073](nrwl/nx#35073))
- **webpack:** bump postcss-loader to ^8.2.1 to eliminate transitive <yaml@1.x> CVE ([#&#8203;35028](nrwl/nx#35028), [#&#8203;35025](nrwl/nx#35025))

##### ❤️ Thank You

- Colum Ferry [@&#8203;Coly010](https://github.com/Coly010)
- Craigory Coppola [@&#8203;AgentEnder](https://github.com/AgentEnder)
- FrozenPandaz [@&#8203;FrozenPandaz](https://github.com/FrozenPandaz)
- Jack Hsu [@&#8203;jaysoo](https://github.com/jaysoo)
- Jason Jean [@&#8203;FrozenPandaz](https://github.com/FrozenPandaz)
- Leosvel Pérez Espinosa [@&#8203;leosvelperez](https://github.com/leosvelperez)
- Miroslav Jonaš [@&#8203;meeroslav](https://github.com/meeroslav)
- Robert Sidzinka

</details>

<details>
<summary>oxc-project/tsgolint (oxlint-tsgolint)</summary>

### [`v0.19.0`](https://github.com/oxc-project/tsgolint/releases/tag/v0.19.0)

[Compare Source](oxc-project/tsgolint@v0.18.1...v0.19.0)

#### What's Changed

- chore(deps): update npm packages by [@&#8203;renovate](https://github.com/renovate)\[bot] in [#&#8203;846](oxc-project/tsgolint#846)
- chore(deps): update github-actions by [@&#8203;renovate](https://github.com/renovate)\[bot] in [#&#8203;847](oxc-project/tsgolint#847)
- chore(deps): update dependency typescript to v6 by [@&#8203;renovate](https://github.com/renovate)\[bot] in [#&#8203;848](oxc-project/tsgolint#848)
- chore: fix schema generator drift by [@&#8203;camc314](https://github.com/camc314) in [#&#8203;850](oxc-project/tsgolint#850)
- feat(await-thenable): port promise aggregator checks and upstream tests by [@&#8203;camc314](https://github.com/camc314) in [#&#8203;851](oxc-project/tsgolint#851)
- test(e2e): make fixtures modules so they are processed in isolation by [@&#8203;camc314](https://github.com/camc314) in [#&#8203;854](oxc-project/tsgolint#854)
- chore(deps): update pnpm to v10.33.0 by [@&#8203;renovate](https://github.com/renovate)\[bot] in [#&#8203;855](oxc-project/tsgolint#855)
- feat(no-unnecessary-type-arguments): port upstream inference reporting by [@&#8203;camc314](https://github.com/camc314) in [#&#8203;853](oxc-project/tsgolint#853)
- feat(strict-void-return): sync overload-safe callback typing with upstream by [@&#8203;camc314](https://github.com/camc314) in [#&#8203;856](oxc-project/tsgolint#856)
- feat(prefer-promise-reject-errors): add allow specifiers and upstream test parity by [@&#8203;camc314](https://github.com/camc314) in [#&#8203;857](oxc-project/tsgolint#857)
- fix(prefer-readonly-parameter-types): preserve alias-aware parameter types by [@&#8203;camc314](https://github.com/camc314) in [#&#8203;858](oxc-project/tsgolint#858)
- feat(no-useless-default-assignment): skip unresolved type parameters by [@&#8203;camc314](https://github.com/camc314) in [#&#8203;859](oxc-project/tsgolint#859)

**Full Changelog**: <oxc-project/tsgolint@v0.18.1...v0.19.0>

</details>

<details>
<summary>remeda/remeda (remeda)</summary>

### [`v2.33.7`](https://github.com/remeda/remeda/releases/tag/v2.33.7)

[Compare Source](remeda/remeda@v2.33.6...v2.33.7)

##### Bug Fixes

- **range:** add step parameter to range function ([#&#8203;1257](remeda/remeda#1257)) ([cf2dee0](remeda/remeda@cf2dee0))

</details>

<details>
<summary>vikejs/vike (vike)</summary>

### [`v0.4.256`](https://github.com/vikejs/vike/blob/HEAD/CHANGELOG.md#04256-2026-03-31)

[Compare Source](vikejs/vike@v0.4.255...v0.4.256)

##### Bug Fixes

- duplicate URL verification on pre-rendering ([#&#8203;3156](vikejs/vike#3156)) ([7723d45](vikejs/vike@7723d45))
- polish node unsupported version error ([#&#8203;3148](vikejs/vike#3148)) ([279f79c](vikejs/vike@279f79c))

##### Performance Improvements

- remove slow plugin when not needed (fix [#&#8203;3086](vikejs/vike#3086)) ([#&#8203;3187](vikejs/vike#3187)) ([567fe61](vikejs/vike@567fe61))

</details>

<details>
<summary>sapphi-red/vite-plugin-static-copy (vite-plugin-static-copy)</summary>

### [`v4.0.1`](https://github.com/sapphi-red/vite-plugin-static-copy/blob/HEAD/CHANGELOG.md#401)

[Compare Source](https://github.com/sapphi-red/vite-plugin-static-copy/compare/vite-plugin-static-copy@4.0.0...vite-plugin-static-copy@4.0.1)

##### Patch Changes

- [#&#8203;249](sapphi-red/vite-plugin-static-copy#249) [`c6bf44c`](sapphi-red/vite-plugin-static-copy@c6bf44c) Thanks [@&#8203;sapphi-red](https://github.com/sapphi-red)! - Fix absolute `dest` paths being nested under the output directory

  When `dest` was an absolute path and the source file had a directory component (structured output), the path was incorrectly converted to a relative path, causing files to be nested under the build output directory instead of being copied to the specified absolute path.

  ```js
  { src: 'foo/foo.txt', dest: '/home/user/my-repo/bar' }
  ```

  **Before**: `/home/user/my-repo/dist/home/user/my-repo/bar/foo/foo.txt`
  **After**: `/home/user/my-repo/bar/foo/foo.txt`

- [#&#8203;247](sapphi-red/vite-plugin-static-copy#247) [`d3af79e`](sapphi-red/vite-plugin-static-copy@d3af79e) Thanks [@&#8203;sapphi-red](https://github.com/sapphi-red)! - Fix `rename.stripBase` to work correctly with `../` paths

  Previously, `stripBase` counted `..` as directory segments, causing incorrect output paths when copying from parent directories.

  ```js
  { src: '../../src/pages/**/*.html', dest: 'dist/', rename: { stripBase: 2 } }
  ```

  **Before**: `dist/src/pages/events/test.html`
  **After**: `dist/events/test.html`

  ```js
  { src: '../../src/pages/**/*.html', dest: 'dist/', rename: { stripBase: true } }
  ```

  **Before**: `dist/src/pages/events/test.html`
  **After**: `dist/test.html`

</details>

---

### Configuration

📅 **Schedule**: (in timezone UTC)

- Branch creation
  - Between 12:00 AM and 03:59 AM, only on Monday (`* 0-3 * * 1`)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDguMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwOC4xIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbXX0=-->

Reviewed-on: https://git.bitcart.ai/bitcart/bitcart-frontend/pulls/191
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants