diff --git a/404.html b/404.html index 6a1a23ed9..cca935428 100644 --- a/404.html +++ b/404.html @@ -6,10 +6,10 @@ 404 | Escrcpy - + - + @@ -19,7 +19,7 @@
- + \ No newline at end of file diff --git a/assets/app.BciEmEQ1.js b/assets/app.DxukUzai.js similarity index 95% rename from assets/app.BciEmEQ1.js rename to assets/app.DxukUzai.js index dbaa795ff..85771a7fa 100644 --- a/assets/app.BciEmEQ1.js +++ b/assets/app.DxukUzai.js @@ -1 +1 @@ -import{R as p}from"./chunks/theme.Duw9aDow.js";import{S as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as w,q as y,p as C,ac as P,ad as R,ae as b,af as S}from"./chunks/framework.D2Fz4Hoy.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),E=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=w();return y(()=>{C(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&P(),R(),b(),n.setup&&n.setup(),()=>S(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(E)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp}; +import{R as p}from"./chunks/theme.BntbHBZF.js";import{S as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as w,q as y,p as C,ac as P,ad as R,ae as b,af as S}from"./chunks/framework.D2Fz4Hoy.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),E=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=w();return y(()=>{C(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&P(),R(),b(),n.setup&&n.setup(),()=>S(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(E)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp}; diff --git a/assets/changelog.md.DwXQyWo8.js b/assets/changelog.md.D_WDUenM.js similarity index 99% rename from assets/changelog.md.DwXQyWo8.js rename to assets/changelog.md.D_WDUenM.js index d0ec417be..cf832fccb 100644 --- a/assets/changelog.md.DwXQyWo8.js +++ b/assets/changelog.md.D_WDUenM.js @@ -1 +1 @@ -import{e as r,o as a,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Changelog","description":"","frontmatter":{},"headers":[],"relativePath":"changelog.md","filePath":"en/changelog.md","lastUpdated":1776916170000}'),i={name:"changelog.md"};function c(l,e,n,h,f,b){return a(),t("div",null,[...e[0]||(e[0]=[o('

Changelog

2.8.1 (2026-04-07)

Bug Fixes

Performance Improvements

2.8.0 (2026-04-06)

Features

Bug Fixes

Performance Improvements

Code Refactoring

2.7.3 (2026-04-02)

Bug Fixes

Performance Improvements

Code Refactoring

2.7.2 (2026-04-01)

Bug Fixes

2.7.1 (2026-04-01)

Bug Fixes

2.7.0 (2026-04-01)

Features

Bug Fixes

Performance Improvements

Code Refactoring

2.6.2 (2026-03-13)

Bug Fixes

Code Refactoring

2.6.1 (2026-03-13)

Performance Improvements

2.6.0 (2026-03-12)

Features

Bug Fixes

Performance Improvements

Miscellaneous Chores

Code Refactoring

2.5.1 (2026-02-27)

Bug Fixes

2.5.0 (2026-02-27)

Features

Bug Fixes

2.4.2 (2026-02-26)

Bug Fixes

2.4.1 (2026-02-26)

Bug Fixes

Code Refactoring

2.4.0 (2026-02-26)

Features

Bug Fixes

Performance Improvements

Code Refactoring

2.3.1 (2026-01-27)

Bug Fixes

2.3.0 (2026-01-22)

Features

Bug Fixes

Performance Improvements

Code Refactoring

2.2.0 (2026-01-17)

Features

Bug Fixes

Code Refactoring

2.1.7 (2026-01-14)

Miscellaneous Chores

2.1.6 (2026-01-14)

Miscellaneous Chores

2.1.5 (2026-01-14)

Miscellaneous Chores

2.1.4 (2026-01-14)

Miscellaneous Chores

2.1.3 (2026-01-14)

Miscellaneous Chores

2.1.2 (2026-01-14)

Bug Fixes

Miscellaneous Chores

2.1.0 (2026-01-14)

Features

Bug Fixes

Performance Improvements

Code Refactoring

2.0.1 (2026-01-06)

Bug Fixes

2.0.0 (2026-01-05)

Features

Bug Fixes

Performance Improvements

Miscellaneous Chores

Code Refactoring

1.34.2 (2025-12-08)

Performance Improvements

1.34.1 (2025-12-07)

Performance Improvements

1.34.0 (2025-12-07)

Features

Bug Fixes

Performance Improvements

1.33.0 (2025-11-20)

Features

Bug Fixes

Performance Improvements

1.32.2 (2025-09-29)

Performance Improvements

1.32.1 (2025-09-10)

Performance Improvements

1.32.0 (2025-09-08)

Features

Bug Fixes

Performance Improvements

1.31.3 (2025-09-01)

Performance Improvements

1.31.2 (2025-09-01)

Bug Fixes

Performance Improvements

1.31.1 (2025-08-29)

Performance Improvements

1.31.0 (2025-08-29)

Features

Bug Fixes

Performance Improvements

1.30.2 (2025-07-15)

Performance Improvements

1.30.1 (2025-07-14)

Bug Fixes

Performance Improvements

1.30.0 (2025-07-14)

Features

Bug Fixes

Performance Improvements

1.29.9 (2025-06-27)

Performance Improvements

1.29.8 (2025-06-20)

Bug Fixes

1.29.7 (2025-06-16)

Performance Improvements

1.29.6 (2025-04-27)

Performance Improvements

1.29.5 (2025-04-17)

Bug Fixes

1.29.4 (2025-04-17)

Bug Fixes

Performance Improvements

1.29.3 (2025-04-02)

Performance Improvements

1.29.2 (2025-03-31)

Performance Improvements

1.29.1 (2025-03-31)

Performance Improvements

1.29.0 (2025-03-27)

Features

Bug Fixes

Performance Improvements

1.28.7 (2025-02-17)

Bug Fixes

Performance Improvements

1.28.6 (2025-02-05)

Bug Fixes

1.28.5 (2025-02-05)

Performance Improvements

1.28.4 (2025-01-13)

Bug Fixes

Performance Improvements

1.28.3 (2024-12-28)

Performance Improvements

1.28.2 (2024-12-27)

Performance Improvements

1.28.1 (2024-12-20)

Performance Improvements

1.28.0 (2024-12-20)

Features

Bug Fixes

Performance Improvements

1.27.7 (2024-12-10)

Performance Improvements

1.27.6 (2024-12-05)

Bug Fixes

Performance Improvements

1.27.5 (2024-11-29)

Performance Improvements

1.27.4 (2024-11-29)

Bug Fixes

1.27.3 (2024-11-28)

Bug Fixes

Performance Improvements

1.27.2 (2024-11-26)

Bug Fixes

1.27.1 (2024-11-25)

Bug Fixes

Performance Improvements

1.27.0 (2024-11-21)

Features

Performance Improvements

1.26.4 (2024-11-14)

Bug Fixes

1.26.3 (2024-11-08)

Bug Fixes

Performance Improvements

1.26.2 (2024-11-06)

Bug Fixes

1.26.1 (2024-11-06)

Performance Improvements

1.26.0 (2024-11-06)

Features

Bug Fixes

Performance Improvements

1.25.5 (2024-11-05)

Performance Improvements

1.25.4 (2024-10-31)

Performance Improvements

1.25.3 (2024-10-29)

Bug Fixes

Performance Improvements

1.25.2 (2024-10-29)

Bug Fixes

1.25.1 (2024-10-28)

Miscellaneous Chores

1.25.0 (2024-10-28)

Features

Performance Improvements

1.24.3 (2024-10-21)

Performance Improvements

1.24.2 (2024-09-16)

Bug Fixes

1.24.1 (2024-09-16)

Performance Improvements

1.24.0 (2024-09-12)

Features

Performance Improvements

1.23.6 (2024-09-09)

Bug Fixes

1.23.5 (2024-09-09)

Performance Improvements

1.23.4 (2024-09-08)

Bug Fixes

1.23.3 (2024-09-08)

Performance Improvements

1.23.2 (2024-09-07)

Performance Improvements

1.23.1 (2024-09-07)

Performance Improvements

1.23.0 (2024-09-07)

Features

Performance Improvements

1.22.4 (2024-08-03)

Bug Fixes

Performance Improvements

1.22.3 (2024-08-03)

Performance Improvements

1.22.2 (2024-07-25)

Performance Improvements

1.22.1 (2024-07-25)

Bug Fixes

1.22.0 (2024-07-25)

Features

Bug Fixes

Performance Improvements

1.21.4 (2024-07-14)

Performance Improvements

1.21.3 (2024-07-13)

Bug Fixes

1.21.2 (2024-07-13)

Bug Fixes

Performance Improvements

1.21.1 (2024-07-13)

Bug Fixes

1.21.0 (2024-07-13)

Features

Bug Fixes

Performance Improvements

1.20.1 (2024-07-04)

Bug Fixes

1.20.0 (2024-07-04)

Features

Performance Improvements

1.19.4 (2024-07-02)

Bug Fixes

Performance Improvements

1.19.3 (2024-06-13)

Bug Fixes

1.19.2 (2024-06-03)

Bug Fixes

1.19.1 (2024-05-26)

Bug Fixes

Performance Improvements

1.19.0 (2024-05-15)

Features

Bug Fixes

Performance Improvements

1.18.4 (2024-05-04)

Bug Fixes

1.18.3 (2024-04-12)

Performance Improvements

1.18.2 (2024-04-11)

Bug Fixes

1.18.1 (2024-04-11)

Bug Fixes

Performance Improvements

1.18.0 (2024-04-11)

Features

1.17.8 (2024-03-29)

Bug Fixes

1.17.7 (2024-03-27)

Bug Fixes

Performance Improvements

1.17.6 (2024-03-21)

Performance Improvements

1.17.5 (2024-03-17)

Performance Improvements

1.17.4 (2024-03-14)

Performance Improvements

1.17.3 (2024-03-13)

Performance Improvements

1.17.2 (2024-03-10)

Bug Fixes

Performance Improvements

1.17.1 (2024-03-05)

Performance Improvements

1.17.0 (2024-03-04)

Features

1.16.8 (2023-12-27)

Bug Fixes

1.16.7 (2023-12-19)

Performance Improvements

1.16.6 (2023-12-19)

Miscellaneous Chores

1.16.5 (2023-12-19)

Performance Improvements

1.16.4 (2023-12-19)

Bug Fixes

1.16.3 (2023-12-03)

Performance Improvements

1.16.2 (2023-12-02)

Bug Fixes

1.16.1 (2023-11-26)

Bug Fixes

1.16.0 (2023-11-26)

Performance Improvements

Miscellaneous Chores

1.15.0 (2023-11-18)

Features

Performance Improvements

1.14.3 (2023-11-17)

Performance Improvements

1.14.2 (2023-11-16)

Performance Improvements

1.14.1 (2023-11-14)

Bug Fixes

1.14.0 (2023-11-14)

Features

Performance Improvements

1.13.5 (2023-11-11)

Performance Improvements

1.13.4 (2023-11-10)

Performance Improvements

1.13.3 (2023-11-10)

Bug Fixes

Performance Improvements

1.13.2 (2023-11-09)

Bug Fixes

Performance Improvements

1.13.1 (2023-11-08)

Performance Improvements

1.13.0 (2023-11-07)

Features

Bug Fixes

Performance Improvements

1.12.4 (2023-11-03)

Bug Fixes

1.12.3 (2023-11-03)

Bug Fixes

1.12.2 (2023-11-03)

Bug Fixes

1.12.1 (2023-11-03)

Bug Fixes

Performance Improvements

1.12.0 (2023-11-02)

Features

Bug Fixes

Performance Improvements

1.11.9 (2023-10-31)

Performance Improvements

1.11.8 (2023-10-31)

Bug Fixes

1.11.7 (2023-10-31)

Bug Fixes

1.11.6 (2023-10-31)

Bug Fixes

1.11.5 (2023-10-31)

Bug Fixes

1.11.4 (2023-10-31)

Bug Fixes

1.11.3 (2023-10-31)

Bug Fixes

1.11.2 (2023-10-30)

Bug Fixes

1.11.1 (2023-10-30)

Bug Fixes

1.11.0 (2023-10-30)

Features

Bug Fixes

Performance Improvements

1.10.2 (2023-10-28)

Bug Fixes

1.10.1 (2023-10-28)

Bug Fixes

1.10.0 (2023-10-27)

Features

Bug Fixes

Performance Improvements

1.9.1 (2023-10-24)

Performance Improvements

1.9.0 (2023-10-24)

Features

Bug Fixes

1.8.17 (2023-10-23)

Bug Fixes

1.8.16 (2023-10-23)

Performance Improvements

1.8.15 (2023-10-22)

Bug Fixes

1.8.14 (2023-10-21)

Bug Fixes

1.8.13 (2023-10-21)

Performance Improvements

1.8.12 (2023-10-21)

Bug Fixes

1.8.11 (2023-10-21)

Performance Improvements

1.8.10 (2023-10-20)

Bug Fixes

1.8.9 (2023-10-20)

Bug Fixes

1.8.8 (2023-10-20)

Bug Fixes

1.8.7 (2023-10-20)

Bug Fixes

1.8.6 (2023-10-20)

Bug Fixes

1.8.5 (2023-10-20)

Bug Fixes

1.8.4 (2023-10-20)

Bug Fixes

1.8.3 (2023-10-20)

Bug Fixes

1.8.2 (2023-10-20)

Bug Fixes

1.8.1 (2023-10-20)

Performance Improvements

1.8.0 (2023-10-20)

Features

Bug Fixes

Performance Improvements

1.7.1 (2023-10-20)

Bug Fixes

Performance Improvements

1.7.0 (2023-10-19)

Features

Performance Improvements

1.6.10 (2023-10-18)

Performance Improvements

1.6.9 (2023-10-17)

Bug Fixes

1.6.8 (2023-10-17)

Performance Improvements

1.6.7 (2023-10-17)

Performance Improvements

1.6.6 (2023-10-17)

Bug Fixes

1.6.5 (2023-10-16)

Bug Fixes

1.6.4 (2023-10-16)

Bug Fixes

1.6.3 (2023-10-16)

Bug Fixes

1.6.2 (2023-10-13)

Bug Fixes

1.6.1 (2023-10-13)

Performance Improvements

1.6.0 (2023-10-13)

Features

1.5.3 (2023-10-13)

Bug Fixes

1.5.2 (2023-10-13)

Bug Fixes

Performance Improvements

1.5.1 (2023-10-12)

Bug Fixes

1.5.0 (2023-10-12)

Features

1.4.1 (2023-10-12)

Bug Fixes

1.4.0 (2023-10-11)

Features

Bug Fixes

1.3.3 (2023-09-26)

Bug Fixes

1.3.2 (2023-09-19)

Bug Fixes

1.3.1 (2023-09-19)

Bug Fixes

1.3.0 (2023-09-19)

Features

1.2.0 (2023-09-19)

Features

1.1.0 (2023-09-18)

Features

1.0.2 (2023-09-18)

Performance Improvements

1.0.1 (2023-09-16)

Bug Fixes

1.0.0 (2023-09-16)

Features

Bug Fixes

',812)])])}const d=r(i,[["render",c]]);export{m as __pageData,d as default}; +import{e as r,o as a,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Changelog","description":"","frontmatter":{},"headers":[],"relativePath":"changelog.md","filePath":"en/changelog.md","lastUpdated":1777999882000}'),i={name:"changelog.md"};function c(l,e,n,h,f,b){return a(),t("div",null,[...e[0]||(e[0]=[o('

Changelog

2.8.1 (2026-04-07)

Bug Fixes

Performance Improvements

2.8.0 (2026-04-06)

Features

Bug Fixes

Performance Improvements

Code Refactoring

2.7.3 (2026-04-02)

Bug Fixes

Performance Improvements

Code Refactoring

2.7.2 (2026-04-01)

Bug Fixes

2.7.1 (2026-04-01)

Bug Fixes

2.7.0 (2026-04-01)

Features

Bug Fixes

Performance Improvements

Code Refactoring

2.6.2 (2026-03-13)

Bug Fixes

Code Refactoring

2.6.1 (2026-03-13)

Performance Improvements

2.6.0 (2026-03-12)

Features

Bug Fixes

Performance Improvements

Miscellaneous Chores

Code Refactoring

2.5.1 (2026-02-27)

Bug Fixes

2.5.0 (2026-02-27)

Features

Bug Fixes

2.4.2 (2026-02-26)

Bug Fixes

2.4.1 (2026-02-26)

Bug Fixes

Code Refactoring

2.4.0 (2026-02-26)

Features

Bug Fixes

Performance Improvements

Code Refactoring

2.3.1 (2026-01-27)

Bug Fixes

2.3.0 (2026-01-22)

Features

Bug Fixes

Performance Improvements

Code Refactoring

2.2.0 (2026-01-17)

Features

Bug Fixes

Code Refactoring

2.1.7 (2026-01-14)

Miscellaneous Chores

2.1.6 (2026-01-14)

Miscellaneous Chores

2.1.5 (2026-01-14)

Miscellaneous Chores

2.1.4 (2026-01-14)

Miscellaneous Chores

2.1.3 (2026-01-14)

Miscellaneous Chores

2.1.2 (2026-01-14)

Bug Fixes

Miscellaneous Chores

2.1.0 (2026-01-14)

Features

Bug Fixes

Performance Improvements

Code Refactoring

2.0.1 (2026-01-06)

Bug Fixes

2.0.0 (2026-01-05)

Features

Bug Fixes

Performance Improvements

Miscellaneous Chores

Code Refactoring

1.34.2 (2025-12-08)

Performance Improvements

1.34.1 (2025-12-07)

Performance Improvements

1.34.0 (2025-12-07)

Features

Bug Fixes

Performance Improvements

1.33.0 (2025-11-20)

Features

Bug Fixes

Performance Improvements

1.32.2 (2025-09-29)

Performance Improvements

1.32.1 (2025-09-10)

Performance Improvements

1.32.0 (2025-09-08)

Features

Bug Fixes

Performance Improvements

1.31.3 (2025-09-01)

Performance Improvements

1.31.2 (2025-09-01)

Bug Fixes

Performance Improvements

1.31.1 (2025-08-29)

Performance Improvements

1.31.0 (2025-08-29)

Features

Bug Fixes

Performance Improvements

1.30.2 (2025-07-15)

Performance Improvements

1.30.1 (2025-07-14)

Bug Fixes

Performance Improvements

1.30.0 (2025-07-14)

Features

Bug Fixes

Performance Improvements

1.29.9 (2025-06-27)

Performance Improvements

1.29.8 (2025-06-20)

Bug Fixes

1.29.7 (2025-06-16)

Performance Improvements

1.29.6 (2025-04-27)

Performance Improvements

1.29.5 (2025-04-17)

Bug Fixes

1.29.4 (2025-04-17)

Bug Fixes

Performance Improvements

1.29.3 (2025-04-02)

Performance Improvements

1.29.2 (2025-03-31)

Performance Improvements

1.29.1 (2025-03-31)

Performance Improvements

1.29.0 (2025-03-27)

Features

Bug Fixes

Performance Improvements

1.28.7 (2025-02-17)

Bug Fixes

Performance Improvements

1.28.6 (2025-02-05)

Bug Fixes

1.28.5 (2025-02-05)

Performance Improvements

1.28.4 (2025-01-13)

Bug Fixes

Performance Improvements

1.28.3 (2024-12-28)

Performance Improvements

1.28.2 (2024-12-27)

Performance Improvements

1.28.1 (2024-12-20)

Performance Improvements

1.28.0 (2024-12-20)

Features

Bug Fixes

Performance Improvements

1.27.7 (2024-12-10)

Performance Improvements

1.27.6 (2024-12-05)

Bug Fixes

Performance Improvements

1.27.5 (2024-11-29)

Performance Improvements

1.27.4 (2024-11-29)

Bug Fixes

1.27.3 (2024-11-28)

Bug Fixes

Performance Improvements

1.27.2 (2024-11-26)

Bug Fixes

1.27.1 (2024-11-25)

Bug Fixes

Performance Improvements

1.27.0 (2024-11-21)

Features

Performance Improvements

1.26.4 (2024-11-14)

Bug Fixes

1.26.3 (2024-11-08)

Bug Fixes

Performance Improvements

1.26.2 (2024-11-06)

Bug Fixes

1.26.1 (2024-11-06)

Performance Improvements

1.26.0 (2024-11-06)

Features

Bug Fixes

Performance Improvements

1.25.5 (2024-11-05)

Performance Improvements

1.25.4 (2024-10-31)

Performance Improvements

1.25.3 (2024-10-29)

Bug Fixes

Performance Improvements

1.25.2 (2024-10-29)

Bug Fixes

1.25.1 (2024-10-28)

Miscellaneous Chores

1.25.0 (2024-10-28)

Features

Performance Improvements

1.24.3 (2024-10-21)

Performance Improvements

1.24.2 (2024-09-16)

Bug Fixes

1.24.1 (2024-09-16)

Performance Improvements

1.24.0 (2024-09-12)

Features

Performance Improvements

1.23.6 (2024-09-09)

Bug Fixes

1.23.5 (2024-09-09)

Performance Improvements

1.23.4 (2024-09-08)

Bug Fixes

1.23.3 (2024-09-08)

Performance Improvements

1.23.2 (2024-09-07)

Performance Improvements

1.23.1 (2024-09-07)

Performance Improvements

1.23.0 (2024-09-07)

Features

Performance Improvements

1.22.4 (2024-08-03)

Bug Fixes

Performance Improvements

1.22.3 (2024-08-03)

Performance Improvements

1.22.2 (2024-07-25)

Performance Improvements

1.22.1 (2024-07-25)

Bug Fixes

1.22.0 (2024-07-25)

Features

Bug Fixes

Performance Improvements

1.21.4 (2024-07-14)

Performance Improvements

1.21.3 (2024-07-13)

Bug Fixes

1.21.2 (2024-07-13)

Bug Fixes

Performance Improvements

1.21.1 (2024-07-13)

Bug Fixes

1.21.0 (2024-07-13)

Features

Bug Fixes

Performance Improvements

1.20.1 (2024-07-04)

Bug Fixes

1.20.0 (2024-07-04)

Features

Performance Improvements

1.19.4 (2024-07-02)

Bug Fixes

Performance Improvements

1.19.3 (2024-06-13)

Bug Fixes

1.19.2 (2024-06-03)

Bug Fixes

1.19.1 (2024-05-26)

Bug Fixes

Performance Improvements

1.19.0 (2024-05-15)

Features

Bug Fixes

Performance Improvements

1.18.4 (2024-05-04)

Bug Fixes

1.18.3 (2024-04-12)

Performance Improvements

1.18.2 (2024-04-11)

Bug Fixes

1.18.1 (2024-04-11)

Bug Fixes

Performance Improvements

1.18.0 (2024-04-11)

Features

1.17.8 (2024-03-29)

Bug Fixes

1.17.7 (2024-03-27)

Bug Fixes

Performance Improvements

1.17.6 (2024-03-21)

Performance Improvements

1.17.5 (2024-03-17)

Performance Improvements

1.17.4 (2024-03-14)

Performance Improvements

1.17.3 (2024-03-13)

Performance Improvements

1.17.2 (2024-03-10)

Bug Fixes

Performance Improvements

1.17.1 (2024-03-05)

Performance Improvements

1.17.0 (2024-03-04)

Features

1.16.8 (2023-12-27)

Bug Fixes

1.16.7 (2023-12-19)

Performance Improvements

1.16.6 (2023-12-19)

Miscellaneous Chores

1.16.5 (2023-12-19)

Performance Improvements

1.16.4 (2023-12-19)

Bug Fixes

1.16.3 (2023-12-03)

Performance Improvements

1.16.2 (2023-12-02)

Bug Fixes

1.16.1 (2023-11-26)

Bug Fixes

1.16.0 (2023-11-26)

Performance Improvements

Miscellaneous Chores

1.15.0 (2023-11-18)

Features

Performance Improvements

1.14.3 (2023-11-17)

Performance Improvements

1.14.2 (2023-11-16)

Performance Improvements

1.14.1 (2023-11-14)

Bug Fixes

1.14.0 (2023-11-14)

Features

Performance Improvements

1.13.5 (2023-11-11)

Performance Improvements

1.13.4 (2023-11-10)

Performance Improvements

1.13.3 (2023-11-10)

Bug Fixes

Performance Improvements

1.13.2 (2023-11-09)

Bug Fixes

Performance Improvements

1.13.1 (2023-11-08)

Performance Improvements

1.13.0 (2023-11-07)

Features

Bug Fixes

Performance Improvements

1.12.4 (2023-11-03)

Bug Fixes

1.12.3 (2023-11-03)

Bug Fixes

1.12.2 (2023-11-03)

Bug Fixes

1.12.1 (2023-11-03)

Bug Fixes

Performance Improvements

1.12.0 (2023-11-02)

Features

Bug Fixes

Performance Improvements

1.11.9 (2023-10-31)

Performance Improvements

1.11.8 (2023-10-31)

Bug Fixes

1.11.7 (2023-10-31)

Bug Fixes

1.11.6 (2023-10-31)

Bug Fixes

1.11.5 (2023-10-31)

Bug Fixes

1.11.4 (2023-10-31)

Bug Fixes

1.11.3 (2023-10-31)

Bug Fixes

1.11.2 (2023-10-30)

Bug Fixes

1.11.1 (2023-10-30)

Bug Fixes

1.11.0 (2023-10-30)

Features

Bug Fixes

Performance Improvements

1.10.2 (2023-10-28)

Bug Fixes

1.10.1 (2023-10-28)

Bug Fixes

1.10.0 (2023-10-27)

Features

Bug Fixes

Performance Improvements

1.9.1 (2023-10-24)

Performance Improvements

1.9.0 (2023-10-24)

Features

Bug Fixes

1.8.17 (2023-10-23)

Bug Fixes

1.8.16 (2023-10-23)

Performance Improvements

1.8.15 (2023-10-22)

Bug Fixes

1.8.14 (2023-10-21)

Bug Fixes

1.8.13 (2023-10-21)

Performance Improvements

1.8.12 (2023-10-21)

Bug Fixes

1.8.11 (2023-10-21)

Performance Improvements

1.8.10 (2023-10-20)

Bug Fixes

1.8.9 (2023-10-20)

Bug Fixes

1.8.8 (2023-10-20)

Bug Fixes

1.8.7 (2023-10-20)

Bug Fixes

1.8.6 (2023-10-20)

Bug Fixes

1.8.5 (2023-10-20)

Bug Fixes

1.8.4 (2023-10-20)

Bug Fixes

1.8.3 (2023-10-20)

Bug Fixes

1.8.2 (2023-10-20)

Bug Fixes

1.8.1 (2023-10-20)

Performance Improvements

1.8.0 (2023-10-20)

Features

Bug Fixes

Performance Improvements

1.7.1 (2023-10-20)

Bug Fixes

Performance Improvements

1.7.0 (2023-10-19)

Features

Performance Improvements

1.6.10 (2023-10-18)

Performance Improvements

1.6.9 (2023-10-17)

Bug Fixes

1.6.8 (2023-10-17)

Performance Improvements

1.6.7 (2023-10-17)

Performance Improvements

1.6.6 (2023-10-17)

Bug Fixes

1.6.5 (2023-10-16)

Bug Fixes

1.6.4 (2023-10-16)

Bug Fixes

1.6.3 (2023-10-16)

Bug Fixes

1.6.2 (2023-10-13)

Bug Fixes

1.6.1 (2023-10-13)

Performance Improvements

1.6.0 (2023-10-13)

Features

1.5.3 (2023-10-13)

Bug Fixes

1.5.2 (2023-10-13)

Bug Fixes

Performance Improvements

1.5.1 (2023-10-12)

Bug Fixes

1.5.0 (2023-10-12)

Features

1.4.1 (2023-10-12)

Bug Fixes

1.4.0 (2023-10-11)

Features

Bug Fixes

1.3.3 (2023-09-26)

Bug Fixes

1.3.2 (2023-09-19)

Bug Fixes

1.3.1 (2023-09-19)

Bug Fixes

1.3.0 (2023-09-19)

Features

1.2.0 (2023-09-19)

Features

1.1.0 (2023-09-18)

Features

1.0.2 (2023-09-18)

Performance Improvements

1.0.1 (2023-09-16)

Bug Fixes

1.0.0 (2023-09-16)

Features

Bug Fixes

',812)])])}const d=r(i,[["render",c]]);export{m as __pageData,d as default}; diff --git a/assets/changelog.md.DwXQyWo8.lean.js b/assets/changelog.md.D_WDUenM.lean.js similarity index 84% rename from assets/changelog.md.DwXQyWo8.lean.js rename to assets/changelog.md.D_WDUenM.lean.js index ffb74831a..c798289cf 100644 --- a/assets/changelog.md.DwXQyWo8.lean.js +++ b/assets/changelog.md.D_WDUenM.lean.js @@ -1 +1 @@ -import{e as r,o as a,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Changelog","description":"","frontmatter":{},"headers":[],"relativePath":"changelog.md","filePath":"en/changelog.md","lastUpdated":1776916170000}'),i={name:"changelog.md"};function c(l,e,n,h,f,b){return a(),t("div",null,[...e[0]||(e[0]=[o("",812)])])}const d=r(i,[["render",c]]);export{m as __pageData,d as default}; +import{e as r,o as a,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Changelog","description":"","frontmatter":{},"headers":[],"relativePath":"changelog.md","filePath":"en/changelog.md","lastUpdated":1777999882000}'),i={name:"changelog.md"};function c(l,e,n,h,f,b){return a(),t("div",null,[...e[0]||(e[0]=[o("",812)])])}const d=r(i,[["render",c]]);export{m as __pageData,d as default}; diff --git a/assets/chunks/VPAlgoliaSearchBox.Dq8oDwpi.js b/assets/chunks/VPAlgoliaSearchBox.Bh0HaW-g.js similarity index 99% rename from assets/chunks/VPAlgoliaSearchBox.Dq8oDwpi.js rename to assets/chunks/VPAlgoliaSearchBox.Bh0HaW-g.js index 65800f9af..3345dd35c 100644 --- a/assets/chunks/VPAlgoliaSearchBox.Dq8oDwpi.js +++ b/assets/chunks/VPAlgoliaSearchBox.Bh0HaW-g.js @@ -1,4 +1,4 @@ -import{d as pi,ah as vi,K as hi,q as di,n as yi,Q as _i,o as gi,a as bi}from"./framework.D2Fz4Hoy.js";import{u as Si}from"./theme.Duw9aDow.js";/*! @docsearch/js 3.8.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */function Hr(){return Hr=Object.assign?Object.assign.bind():function(e){for(var t=1;t2&&(a.children=arguments.length>3?Wt.call(arguments,2):r),typeof e=="function"&&e.defaultProps!=null)for(i in e.defaultProps)a[i]===void 0&&(a[i]=e.defaultProps[i]);return Et(e,a,n,o,null)}function Et(e,t,r,n,o){var i={type:e,props:t,key:r,ref:n,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:o??++So,__i:-1,__u:0};return o==null&&H.vnode!=null&&H.vnode(i),i}function Re(e){return e.children}function Ce(e,t){this.props=e,this.context=t}function ct(e,t){if(t==null)return e.__?ct(e.__,e.__i+1):null;for(var r;tt&&Ge.sort(Ur));dr.__r=0}function Io(e,t,r,n,o,i,a,c,f,m,b){var l,v,s,S,g,y=n&&n.__k||Eo,_=t.length;for(r.__d=f,function(h,p,d){var P,E,C,N,I,x=p.length,k=d.length,U=k,z=0;for(h.__k=[],P=0;P0?Et(E.type,E.props,E.key,E.ref?E.ref:null,E.__v):E).__=h,E.__b=h.__b+1,C=null,(I=E.__i=wi(E,d,N,U))!==-1&&(U--,(C=d[I])&&(C.__u|=131072)),C==null||C.__v===null?(I==-1&&z--,typeof E.type!="function"&&(E.__u|=65536)):I!==N&&(I==N-1?z--:I==N+1?z++:(I>N?z--:z++,E.__u|=65536))):E=h.__k[P]=null;if(U)for(P=0;P(f==null||131072&f.__u?0:1))for(;a>=0||c=0){if((f=t[a])&&!(131072&f.__u)&&o==f.key&&i===f.type)return a;a--}if(c2&&(c.children=arguments.length>3?Wt.call(arguments,2):r),Et(e.type,c,n||e.key,o||e.ref,null)}Wt=Eo.slice,H={__e:function(e,t,r,n){for(var o,i,a;t=t.__;)if((o=t.__c)&&!o.__)try{if((i=o.constructor)&&i.getDerivedStateFromError!=null&&(o.setState(i.getDerivedStateFromError(e)),a=o.__d),o.componentDidCatch!=null&&(o.componentDidCatch(e,n||{}),a=o.__d),a)return o.__E=o}catch(c){e=c}throw e}},So=0,Ce.prototype.setState=function(e,t){var r;r=this.__s!=null&&this.__s!==this.state?this.__s:this.__s=Te({},this.state),typeof e=="function"&&(e=e(Te({},r),this.props)),e&&Te(r,e),e!=null&&this.__v&&(t&&this._sb.push(t),Vr(this))},Ce.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),Vr(this))},Ce.prototype.render=Re,Ge=[],Oo=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ur=function(e,t){return e.__v.__b-t.__v.__b},dr.__r=0,en=0,Fr=bn(!1),Br=bn(!0),wo=0;var Be,Z,Dr,Sn,lt=0,Ao=[],Y=H,On=Y.__b,wn=Y.__r,En=Y.diffed,jn=Y.__c,Pn=Y.unmount,In=Y.__;function st(e,t){Y.__h&&Y.__h(Z,e,lt||t),lt=0;var r=Z.__H||(Z.__H={__:[],__h:[]});return e>=r.__.length&&r.__.push({}),r.__[e]}function zt(e){return lt=1,nn(Ho,e)}function nn(e,t,r){var n=st(Be++,2);if(n.t=e,!n.__c&&(n.__=[r?r(t):Ho(void 0,t),function(c){var f=n.__N?n.__N[0]:n.__[0],m=n.t(f,c);f!==m&&(n.__N=[m,n.__[1]],n.__c.setState({}))}],n.__c=Z,!Z.u)){var o=function(c,f,m){if(!n.__c.__H)return!0;var b=n.__c.__H.__.filter(function(v){return!!v.__c});if(b.every(function(v){return!v.__N}))return!i||i.call(this,c,f,m);var l=!1;return b.forEach(function(v){if(v.__N){var s=v.__[0];v.__=v.__N,v.__N=void 0,s!==v.__[0]&&(l=!0)}}),!(!l&&n.__c.props===c)&&(!i||i.call(this,c,f,m))};Z.u=!0;var i=Z.shouldComponentUpdate,a=Z.componentWillUpdate;Z.componentWillUpdate=function(c,f,m){if(this.__e){var b=i;i=void 0,o(c,f,m),i=b}a&&a.call(this,c,f,m)},Z.shouldComponentUpdate=o}return n.__N||n.__}function Jt(e,t){var r=st(Be++,3);!Y.__s&&on(r.__H,t)&&(r.__=e,r.i=t,Z.__H.__h.push(r))}function Qt(e,t){var r=st(Be++,4);!Y.__s&&on(r.__H,t)&&(r.__=e,r.i=t,Z.__h.push(r))}function No(e){return lt=5,_r(function(){return{current:e}},[])}function To(e,t,r){lt=6,Qt(function(){return typeof e=="function"?(e(t()),function(){return e(null)}):e?(e.current=t(),function(){return e.current=null}):void 0},r==null?r:r.concat(e))}function _r(e,t){var r=st(Be++,7);return on(r.__H,t)&&(r.__=e(),r.__H=t,r.__h=e),r.__}function Ro(e,t){return lt=8,_r(function(){return e},t)}function Lo(e){var t=Z.context[e.__c],r=st(Be++,9);return r.c=e,t?(r.__==null&&(r.__=!0,t.sub(Z)),t.props.value):e.__}function qo(e,t){Y.useDebugValue&&Y.useDebugValue(t?t(e):e)}function Mo(){var e=st(Be++,11);if(!e.__){for(var t=Z.__v;t!==null&&!t.__m&&t.__!==null;)t=t.__;var r=t.__m||(t.__m=[0,0]);e.__="P"+r[0]+"-"+r[1]++}return e.__}function Ii(){for(var e;e=Ao.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(mr),e.__H.__h.forEach(Kr),e.__H.__h=[]}catch(t){e.__H.__h=[],Y.__e(t,e.__v)}}Y.__b=function(e){Z=null,On&&On(e)},Y.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),In&&In(e,t)},Y.__r=function(e){wn&&wn(e),Be=0;var t=(Z=e.__c).__H;t&&(Dr===Z?(t.__h=[],Z.__h=[],t.__.forEach(function(r){r.__N&&(r.__=r.__N),r.i=r.__N=void 0})):(t.__h.forEach(mr),t.__h.forEach(Kr),t.__h=[],Be=0)),Dr=Z},Y.diffed=function(e){En&&En(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(Ao.push(t)!==1&&Sn===Y.requestAnimationFrame||((Sn=Y.requestAnimationFrame)||ki)(Ii)),t.__H.__.forEach(function(r){r.i&&(r.__H=r.i),r.i=void 0})),Dr=Z=null},Y.__c=function(e,t){t.some(function(r){try{r.__h.forEach(mr),r.__h=r.__h.filter(function(n){return!n.__||Kr(n)})}catch(n){t.some(function(o){o.__h&&(o.__h=[])}),t=[],Y.__e(n,r.__v)}}),jn&&jn(e,t)},Y.unmount=function(e){Pn&&Pn(e);var t,r=e.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{mr(n)}catch(o){t=o}}),r.__H=void 0,t&&Y.__e(t,r.__v))};var kn=typeof requestAnimationFrame=="function";function ki(e){var t,r=function(){clearTimeout(n),kn&&cancelAnimationFrame(t),setTimeout(e)},n=setTimeout(r,100);kn&&(t=requestAnimationFrame(r))}function mr(e){var t=Z,r=e.__c;typeof r=="function"&&(e.__c=void 0,r()),Z=t}function Kr(e){var t=Z;e.__c=e.__(),Z=t}function on(e,t){return!e||e.length!==t.length||t.some(function(r,n){return r!==e[n]})}function Ho(e,t){return typeof t=="function"?t(e):t}function Wr(e,t){for(var r in e)if(r!=="__source"&&!(r in t))return!0;for(var n in t)if(n!=="__source"&&e[n]!==t[n])return!0;return!1}function zr(e,t){this.props=e,this.context=t}(zr.prototype=new Ce).isPureReactComponent=!0,zr.prototype.shouldComponentUpdate=function(e,t){return Wr(this.props,e)||Wr(this.state,t)};var Dn=H.__b;H.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),Dn&&Dn(e)};var Di=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.forward_ref")||3911,Cn=function(e,t){return e==null?null:Le(Le(e).map(t))},Ci={map:Cn,forEach:Cn,count:function(e){return e?Le(e).length:0},only:function(e){var t=Le(e);if(t.length!==1)throw"Children.only";return t[0]},toArray:Le},xi=H.__e;H.__e=function(e,t,r,n){if(e.then){for(var o,i=t;i=i.__;)if((o=i.__c)&&o.__c)return t.__e==null&&(t.__e=r.__e,t.__k=r.__k),o.__c(e,t)}xi(e,t,r,n)};var xn=H.unmount;function Uo(e,t,r){return e&&(e.__c&&e.__c.__H&&(e.__c.__H.__.forEach(function(n){typeof n.__c=="function"&&n.__c()}),e.__c.__H=null),(e=function(n,o){for(var i in o)n[i]=o[i];return n}({},e)).__c!=null&&(e.__c.__P===r&&(e.__c.__P=t),e.__c=null),e.__k=e.__k&&e.__k.map(function(n){return Uo(n,t,r)})),e}function Fo(e,t,r){return e&&r&&(e.__v=null,e.__k=e.__k&&e.__k.map(function(n){return Fo(n,t,r)}),e.__c&&e.__c.__P===t&&(e.__e&&r.appendChild(e.__e),e.__c.__e=!0,e.__c.__P=r)),e}function pr(){this.__u=0,this.t=null,this.__b=null}function Bo(e){var t=e.__.__c;return t&&t.__a&&t.__a(e)}function Ot(){this.u=null,this.o=null}H.unmount=function(e){var t=e.__c;t&&t.__R&&t.__R(),t&&32&e.__u&&(e.type=null),xn&&xn(e)},(pr.prototype=new Ce).__c=function(e,t){var r=t.__c,n=this;n.t==null&&(n.t=[]),n.t.push(r);var o=Bo(n.__v),i=!1,a=function(){i||(i=!0,r.__R=null,o?o(c):c())};r.__R=a;var c=function(){if(!--n.__u){if(n.state.__a){var f=n.state.__a;n.__v.__k[0]=Fo(f,f.__c.__P,f.__c.__O)}var m;for(n.setState({__a:n.__b=null});m=n.t.pop();)m.forceUpdate()}};n.__u++||32&t.__u||n.setState({__a:n.__b=n.__v.__k[0]}),e.then(a,a)},pr.prototype.componentWillUnmount=function(){this.t=[]},pr.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var r=document.createElement("div"),n=this.__v.__k[0].__c;this.__v.__k[0]=Uo(this.__b,r,n.__O=n.__P)}this.__b=null}var o=t.__a&&De(Re,null,e.fallback);return o&&(o.__u&=-33),[De(Re,null,t.__a?null:e.children),o]};var An=function(e,t,r){if(++r[1]===r[0]&&e.o.delete(t),e.props.revealOrder&&(e.props.revealOrder[0]!=="t"||!e.o.size))for(r=e.u;r;){for(;r.length>3;)r.pop()();if(r[1]>>1,1),t.i.removeChild(n)}}),Ft(De(Ai,{context:t.context},e.__v),t.l)}function Vo(e,t){var r=De(Ni,{__v:e,i:t});return r.containerInfo=t,r}(Ot.prototype=new Ce).__a=function(e){var t=this,r=Bo(t.__v),n=t.o.get(e);return n[0]++,function(o){var i=function(){t.props.revealOrder?(n.push(o),An(t,e,n)):o()};r?r(i):i()}},Ot.prototype.render=function(e){this.u=null,this.o=new Map;var t=Le(e.children);e.revealOrder&&e.revealOrder[0]==="b"&&t.reverse();for(var r=t.length;r--;)this.o.set(t[r],this.u=[1,0,this.u]);return e.children},Ot.prototype.componentDidUpdate=Ot.prototype.componentDidMount=function(){var e=this;this.o.forEach(function(t,r){An(e,r,t)})};var Ko=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.element")||60103,Ti=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Ri=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,Li=/[A-Z0-9]/g,qi=typeof document<"u",Mi=function(e){return(typeof Symbol<"u"&&A(Symbol())=="symbol"?/fil|che|rad/:/fil|che|ra/).test(e)};function Wo(e,t,r){return t.__k==null&&(t.textContent=""),Ft(e,t),typeof r=="function"&&r(),e?e.__c:null}Ce.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(e){Object.defineProperty(Ce.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})});var Nn=H.event;function Hi(){}function Ui(){return this.cancelBubble}function Fi(){return this.defaultPrevented}H.event=function(e){return Nn&&(e=Nn(e)),e.persist=Hi,e.isPropagationStopped=Ui,e.isDefaultPrevented=Fi,e.nativeEvent=e};var an,Bi={enumerable:!1,configurable:!0,get:function(){return this.class}},Tn=H.vnode;H.vnode=function(e){typeof e.type=="string"&&function(t){var r=t.props,n=t.type,o={},i=n.indexOf("-")===-1;for(var a in r){var c=r[a];if(!(a==="value"&&"defaultValue"in r&&c==null||qi&&a==="children"&&n==="noscript"||a==="class"||a==="className")){var f=a.toLowerCase();a==="defaultValue"&&"value"in r&&r.value==null?a="value":a==="download"&&c===!0?c="":f==="translate"&&c==="no"?c=!1:f[0]==="o"&&f[1]==="n"?f==="ondoubleclick"?a="ondblclick":f!=="onchange"||n!=="input"&&n!=="textarea"||Mi(r.type)?f==="onfocus"?a="onfocusin":f==="onblur"?a="onfocusout":Ri.test(a)&&(a=f):f=a="oninput":i&&Ti.test(a)?a=a.replace(Li,"-$&").toLowerCase():c===null&&(c=void 0),f==="oninput"&&o[a=f]&&(a="oninputCapture"),o[a]=c}}n=="select"&&o.multiple&&Array.isArray(o.value)&&(o.value=Le(r.children).forEach(function(m){m.props.selected=o.value.indexOf(m.props.value)!=-1})),n=="select"&&o.defaultValue!=null&&(o.value=Le(r.children).forEach(function(m){m.props.selected=o.multiple?o.defaultValue.indexOf(m.props.value)!=-1:o.defaultValue==m.props.value})),r.class&&!r.className?(o.class=r.class,Object.defineProperty(o,"className",Bi)):(r.className&&!r.class||r.class&&r.className)&&(o.class=o.className=r.className),t.props=o}(e),e.$$typeof=Ko,Tn&&Tn(e)};var Rn=H.__r;H.__r=function(e){Rn&&Rn(e),an=e.__c};var Ln=H.diffed;H.diffed=function(e){Ln&&Ln(e);var t=e.props,r=e.__e;r!=null&&e.type==="textarea"&&"value"in t&&t.value!==r.value&&(r.value=t.value==null?"":t.value),an=null};var Vi={ReactCurrentDispatcher:{current:{readContext:function(e){return an.__n[e.__c].props.value},useCallback:Ro,useContext:Lo,useDebugValue:qo,useDeferredValue:Jo,useEffect:Jt,useId:Mo,useImperativeHandle:To,useInsertionEffect:$o,useLayoutEffect:Qt,useMemo:_r,useReducer:nn,useRef:No,useState:zt,useSyncExternalStore:Zo,useTransition:Qo}}};function rr(e){return!!e&&e.$$typeof===Ko}function zo(e){e()}function Jo(e){return e}function Qo(){return[!1,zo]}var $o=Qt;function Zo(e,t){var r=t(),n=zt({h:{__:r,v:t}}),o=n[0].h,i=n[1];return Qt(function(){o.__=r,o.v=t,Cr(o)&&i({h:o})},[e,r,t]),Jt(function(){return Cr(o)&&i({h:o}),e(function(){Cr(o)&&i({h:o})})},[e]),r}function Cr(e){var t,r,n=e.v,o=e.__;try{var i=n();return!((t=o)===(r=i)&&(t!==0||1/t==1/r)||t!=t&&r!=r)}catch{return!0}}var u={useState:zt,useId:Mo,useReducer:nn,useEffect:Jt,useLayoutEffect:Qt,useInsertionEffect:$o,useTransition:Qo,useDeferredValue:Jo,useSyncExternalStore:Zo,startTransition:zo,useRef:No,useImperativeHandle:To,useMemo:_r,useCallback:Ro,useContext:Lo,useDebugValue:qo,version:"18.3.1",Children:Ci,render:Wo,hydrate:function(e,t,r){return xo(e,t),typeof r=="function"&&r(),e?e.__c:null},unmountComponentAtNode:function(e){return!!e.__k&&(Ft(null,e),!0)},createPortal:Vo,createElement:De,createContext:function(e,t){var r={__c:t="__cC"+wo++,__:e,Consumer:function(n,o){return n.children(o)},Provider:function(n){var o,i;return this.getChildContext||(o=new Set,(i={})[t]=this,this.getChildContext=function(){return i},this.componentWillUnmount=function(){o=null},this.shouldComponentUpdate=function(a){this.props.value!==a.value&&o.forEach(function(c){c.__e=!0,Vr(c)})},this.sub=function(a){o.add(a);var c=a.componentWillUnmount;a.componentWillUnmount=function(){o&&o.delete(a),c&&c.call(a)}}),n.children}};return r.Provider.__=r.Consumer.contextType=r},createFactory:function(e){return De.bind(null,e)},cloneElement:function(e){return rr(e)?Pi.apply(null,arguments):e},createRef:function(){return{current:null}},Fragment:Re,isValidElement:rr,isElement:rr,isFragment:function(e){return rr(e)&&e.type===Re},isMemo:function(e){return!!e&&!!e.displayName&&(typeof e.displayName=="string"||e.displayName instanceof String)&&e.displayName.startsWith("Memo(")},findDOMNode:function(e){return e&&(e.base||e.nodeType===1&&e)||null},Component:Ce,PureComponent:zr,memo:function(e,t){function r(o){var i=this.props.ref,a=i==o.ref;return!a&&i&&(i.call?i(null):i.current=null),t?!t(this.props,o)||!a:Wr(this.props,o)}function n(o){return this.shouldComponentUpdate=r,De(e,o)}return n.displayName="Memo("+(e.displayName||e.name)+")",n.prototype.isReactComponent=!0,n.__f=!0,n},forwardRef:function(e){function t(r){if(!("ref"in r))return e(r,null);var n=r.ref;delete r.ref;var o=e(r,n);return r.ref=n,o}return t.$$typeof=Di,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName="ForwardRef("+(e.displayName||e.name)+")",t},flushSync:function(e,t){return e(t)},unstable_batchedUpdates:function(e,t){return e(t)},StrictMode:Re,Suspense:pr,SuspenseList:Ot,lazy:function(e){var t,r,n;function o(i){if(t||(t=e()).then(function(a){r=a.default||a},function(a){n=a}),n)throw n;if(!r)throw t;return De(r,i)}return o.displayName="Lazy",o.__f=!0,o},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:Vi};function Jr(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r=0;--R){var D=this.tryEntries[R],L=D.completion;if(D.tryLoc==="root")return j("end");if(D.tryLoc<=this.prev){var W=n.call(D,"catchLoc"),K=n.call(D,"finallyLoc");if(W&&K){if(this.prev=0;--j){var R=this.tryEntries[j];if(R.tryLoc<=this.prev&&n.call(R,"finallyLoc")&&this.prev=0;--w){var j=this.tryEntries[w];if(j.finallyLoc===O)return this.complete(j.completion,j.afterLoc),z(j),y}},catch:function(O){for(var w=this.tryEntries.length-1;w>=0;--w){var j=this.tryEntries[w];if(j.tryLoc===O){var R=j.completion;if(R.type==="throw"){var D=R.arg;z(j)}return D}}throw Error("illegal catch attempt")},delegateYield:function(O,w,j){return this.delegate={iterator:oe(O),resultName:w,nextLoc:j},this.method==="next"&&(this.arg=e),y}},t}function Vt(e,t){return Vt=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(r,n){return r.__proto__=n,r},Vt(e,t)}function he(e,t){return function(r){if(Array.isArray(r))return r}(e)||function(r,n){var o=r==null?null:typeof Symbol<"u"&&r[Symbol.iterator]||r["@@iterator"];if(o!=null){var i,a,c,f,m=[],b=!0,l=!1;try{if(c=(o=o.call(r)).next,n===0){if(Object(o)!==o)return;b=!1}else for(;!(b=(i=c.call(o)).done)&&(m.push(i.value),m.length!==n);b=!0);}catch(v){l=!0,a=v}finally{try{if(!b&&o.return!=null&&(f=o.return(),Object(f)!==f))return}finally{if(l)throw a}}return m}}(e,t)||Go(e,t)||function(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +import{d as pi,ah as vi,K as hi,q as di,n as yi,Q as _i,o as gi,a as bi}from"./framework.D2Fz4Hoy.js";import{u as Si}from"./theme.BntbHBZF.js";/*! @docsearch/js 3.8.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */function Hr(){return Hr=Object.assign?Object.assign.bind():function(e){for(var t=1;t2&&(a.children=arguments.length>3?Wt.call(arguments,2):r),typeof e=="function"&&e.defaultProps!=null)for(i in e.defaultProps)a[i]===void 0&&(a[i]=e.defaultProps[i]);return Et(e,a,n,o,null)}function Et(e,t,r,n,o){var i={type:e,props:t,key:r,ref:n,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:o??++So,__i:-1,__u:0};return o==null&&H.vnode!=null&&H.vnode(i),i}function Re(e){return e.children}function Ce(e,t){this.props=e,this.context=t}function ct(e,t){if(t==null)return e.__?ct(e.__,e.__i+1):null;for(var r;tt&&Ge.sort(Ur));dr.__r=0}function Io(e,t,r,n,o,i,a,c,f,m,b){var l,v,s,S,g,y=n&&n.__k||Eo,_=t.length;for(r.__d=f,function(h,p,d){var P,E,C,N,I,x=p.length,k=d.length,U=k,z=0;for(h.__k=[],P=0;P0?Et(E.type,E.props,E.key,E.ref?E.ref:null,E.__v):E).__=h,E.__b=h.__b+1,C=null,(I=E.__i=wi(E,d,N,U))!==-1&&(U--,(C=d[I])&&(C.__u|=131072)),C==null||C.__v===null?(I==-1&&z--,typeof E.type!="function"&&(E.__u|=65536)):I!==N&&(I==N-1?z--:I==N+1?z++:(I>N?z--:z++,E.__u|=65536))):E=h.__k[P]=null;if(U)for(P=0;P(f==null||131072&f.__u?0:1))for(;a>=0||c=0){if((f=t[a])&&!(131072&f.__u)&&o==f.key&&i===f.type)return a;a--}if(c2&&(c.children=arguments.length>3?Wt.call(arguments,2):r),Et(e.type,c,n||e.key,o||e.ref,null)}Wt=Eo.slice,H={__e:function(e,t,r,n){for(var o,i,a;t=t.__;)if((o=t.__c)&&!o.__)try{if((i=o.constructor)&&i.getDerivedStateFromError!=null&&(o.setState(i.getDerivedStateFromError(e)),a=o.__d),o.componentDidCatch!=null&&(o.componentDidCatch(e,n||{}),a=o.__d),a)return o.__E=o}catch(c){e=c}throw e}},So=0,Ce.prototype.setState=function(e,t){var r;r=this.__s!=null&&this.__s!==this.state?this.__s:this.__s=Te({},this.state),typeof e=="function"&&(e=e(Te({},r),this.props)),e&&Te(r,e),e!=null&&this.__v&&(t&&this._sb.push(t),Vr(this))},Ce.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),Vr(this))},Ce.prototype.render=Re,Ge=[],Oo=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Ur=function(e,t){return e.__v.__b-t.__v.__b},dr.__r=0,en=0,Fr=bn(!1),Br=bn(!0),wo=0;var Be,Z,Dr,Sn,lt=0,Ao=[],Y=H,On=Y.__b,wn=Y.__r,En=Y.diffed,jn=Y.__c,Pn=Y.unmount,In=Y.__;function st(e,t){Y.__h&&Y.__h(Z,e,lt||t),lt=0;var r=Z.__H||(Z.__H={__:[],__h:[]});return e>=r.__.length&&r.__.push({}),r.__[e]}function zt(e){return lt=1,nn(Ho,e)}function nn(e,t,r){var n=st(Be++,2);if(n.t=e,!n.__c&&(n.__=[r?r(t):Ho(void 0,t),function(c){var f=n.__N?n.__N[0]:n.__[0],m=n.t(f,c);f!==m&&(n.__N=[m,n.__[1]],n.__c.setState({}))}],n.__c=Z,!Z.u)){var o=function(c,f,m){if(!n.__c.__H)return!0;var b=n.__c.__H.__.filter(function(v){return!!v.__c});if(b.every(function(v){return!v.__N}))return!i||i.call(this,c,f,m);var l=!1;return b.forEach(function(v){if(v.__N){var s=v.__[0];v.__=v.__N,v.__N=void 0,s!==v.__[0]&&(l=!0)}}),!(!l&&n.__c.props===c)&&(!i||i.call(this,c,f,m))};Z.u=!0;var i=Z.shouldComponentUpdate,a=Z.componentWillUpdate;Z.componentWillUpdate=function(c,f,m){if(this.__e){var b=i;i=void 0,o(c,f,m),i=b}a&&a.call(this,c,f,m)},Z.shouldComponentUpdate=o}return n.__N||n.__}function Jt(e,t){var r=st(Be++,3);!Y.__s&&on(r.__H,t)&&(r.__=e,r.i=t,Z.__H.__h.push(r))}function Qt(e,t){var r=st(Be++,4);!Y.__s&&on(r.__H,t)&&(r.__=e,r.i=t,Z.__h.push(r))}function No(e){return lt=5,_r(function(){return{current:e}},[])}function To(e,t,r){lt=6,Qt(function(){return typeof e=="function"?(e(t()),function(){return e(null)}):e?(e.current=t(),function(){return e.current=null}):void 0},r==null?r:r.concat(e))}function _r(e,t){var r=st(Be++,7);return on(r.__H,t)&&(r.__=e(),r.__H=t,r.__h=e),r.__}function Ro(e,t){return lt=8,_r(function(){return e},t)}function Lo(e){var t=Z.context[e.__c],r=st(Be++,9);return r.c=e,t?(r.__==null&&(r.__=!0,t.sub(Z)),t.props.value):e.__}function qo(e,t){Y.useDebugValue&&Y.useDebugValue(t?t(e):e)}function Mo(){var e=st(Be++,11);if(!e.__){for(var t=Z.__v;t!==null&&!t.__m&&t.__!==null;)t=t.__;var r=t.__m||(t.__m=[0,0]);e.__="P"+r[0]+"-"+r[1]++}return e.__}function Ii(){for(var e;e=Ao.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(mr),e.__H.__h.forEach(Kr),e.__H.__h=[]}catch(t){e.__H.__h=[],Y.__e(t,e.__v)}}Y.__b=function(e){Z=null,On&&On(e)},Y.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),In&&In(e,t)},Y.__r=function(e){wn&&wn(e),Be=0;var t=(Z=e.__c).__H;t&&(Dr===Z?(t.__h=[],Z.__h=[],t.__.forEach(function(r){r.__N&&(r.__=r.__N),r.i=r.__N=void 0})):(t.__h.forEach(mr),t.__h.forEach(Kr),t.__h=[],Be=0)),Dr=Z},Y.diffed=function(e){En&&En(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(Ao.push(t)!==1&&Sn===Y.requestAnimationFrame||((Sn=Y.requestAnimationFrame)||ki)(Ii)),t.__H.__.forEach(function(r){r.i&&(r.__H=r.i),r.i=void 0})),Dr=Z=null},Y.__c=function(e,t){t.some(function(r){try{r.__h.forEach(mr),r.__h=r.__h.filter(function(n){return!n.__||Kr(n)})}catch(n){t.some(function(o){o.__h&&(o.__h=[])}),t=[],Y.__e(n,r.__v)}}),jn&&jn(e,t)},Y.unmount=function(e){Pn&&Pn(e);var t,r=e.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{mr(n)}catch(o){t=o}}),r.__H=void 0,t&&Y.__e(t,r.__v))};var kn=typeof requestAnimationFrame=="function";function ki(e){var t,r=function(){clearTimeout(n),kn&&cancelAnimationFrame(t),setTimeout(e)},n=setTimeout(r,100);kn&&(t=requestAnimationFrame(r))}function mr(e){var t=Z,r=e.__c;typeof r=="function"&&(e.__c=void 0,r()),Z=t}function Kr(e){var t=Z;e.__c=e.__(),Z=t}function on(e,t){return!e||e.length!==t.length||t.some(function(r,n){return r!==e[n]})}function Ho(e,t){return typeof t=="function"?t(e):t}function Wr(e,t){for(var r in e)if(r!=="__source"&&!(r in t))return!0;for(var n in t)if(n!=="__source"&&e[n]!==t[n])return!0;return!1}function zr(e,t){this.props=e,this.context=t}(zr.prototype=new Ce).isPureReactComponent=!0,zr.prototype.shouldComponentUpdate=function(e,t){return Wr(this.props,e)||Wr(this.state,t)};var Dn=H.__b;H.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),Dn&&Dn(e)};var Di=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.forward_ref")||3911,Cn=function(e,t){return e==null?null:Le(Le(e).map(t))},Ci={map:Cn,forEach:Cn,count:function(e){return e?Le(e).length:0},only:function(e){var t=Le(e);if(t.length!==1)throw"Children.only";return t[0]},toArray:Le},xi=H.__e;H.__e=function(e,t,r,n){if(e.then){for(var o,i=t;i=i.__;)if((o=i.__c)&&o.__c)return t.__e==null&&(t.__e=r.__e,t.__k=r.__k),o.__c(e,t)}xi(e,t,r,n)};var xn=H.unmount;function Uo(e,t,r){return e&&(e.__c&&e.__c.__H&&(e.__c.__H.__.forEach(function(n){typeof n.__c=="function"&&n.__c()}),e.__c.__H=null),(e=function(n,o){for(var i in o)n[i]=o[i];return n}({},e)).__c!=null&&(e.__c.__P===r&&(e.__c.__P=t),e.__c=null),e.__k=e.__k&&e.__k.map(function(n){return Uo(n,t,r)})),e}function Fo(e,t,r){return e&&r&&(e.__v=null,e.__k=e.__k&&e.__k.map(function(n){return Fo(n,t,r)}),e.__c&&e.__c.__P===t&&(e.__e&&r.appendChild(e.__e),e.__c.__e=!0,e.__c.__P=r)),e}function pr(){this.__u=0,this.t=null,this.__b=null}function Bo(e){var t=e.__.__c;return t&&t.__a&&t.__a(e)}function Ot(){this.u=null,this.o=null}H.unmount=function(e){var t=e.__c;t&&t.__R&&t.__R(),t&&32&e.__u&&(e.type=null),xn&&xn(e)},(pr.prototype=new Ce).__c=function(e,t){var r=t.__c,n=this;n.t==null&&(n.t=[]),n.t.push(r);var o=Bo(n.__v),i=!1,a=function(){i||(i=!0,r.__R=null,o?o(c):c())};r.__R=a;var c=function(){if(!--n.__u){if(n.state.__a){var f=n.state.__a;n.__v.__k[0]=Fo(f,f.__c.__P,f.__c.__O)}var m;for(n.setState({__a:n.__b=null});m=n.t.pop();)m.forceUpdate()}};n.__u++||32&t.__u||n.setState({__a:n.__b=n.__v.__k[0]}),e.then(a,a)},pr.prototype.componentWillUnmount=function(){this.t=[]},pr.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var r=document.createElement("div"),n=this.__v.__k[0].__c;this.__v.__k[0]=Uo(this.__b,r,n.__O=n.__P)}this.__b=null}var o=t.__a&&De(Re,null,e.fallback);return o&&(o.__u&=-33),[De(Re,null,t.__a?null:e.children),o]};var An=function(e,t,r){if(++r[1]===r[0]&&e.o.delete(t),e.props.revealOrder&&(e.props.revealOrder[0]!=="t"||!e.o.size))for(r=e.u;r;){for(;r.length>3;)r.pop()();if(r[1]>>1,1),t.i.removeChild(n)}}),Ft(De(Ai,{context:t.context},e.__v),t.l)}function Vo(e,t){var r=De(Ni,{__v:e,i:t});return r.containerInfo=t,r}(Ot.prototype=new Ce).__a=function(e){var t=this,r=Bo(t.__v),n=t.o.get(e);return n[0]++,function(o){var i=function(){t.props.revealOrder?(n.push(o),An(t,e,n)):o()};r?r(i):i()}},Ot.prototype.render=function(e){this.u=null,this.o=new Map;var t=Le(e.children);e.revealOrder&&e.revealOrder[0]==="b"&&t.reverse();for(var r=t.length;r--;)this.o.set(t[r],this.u=[1,0,this.u]);return e.children},Ot.prototype.componentDidUpdate=Ot.prototype.componentDidMount=function(){var e=this;this.o.forEach(function(t,r){An(e,r,t)})};var Ko=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.element")||60103,Ti=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Ri=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,Li=/[A-Z0-9]/g,qi=typeof document<"u",Mi=function(e){return(typeof Symbol<"u"&&A(Symbol())=="symbol"?/fil|che|rad/:/fil|che|ra/).test(e)};function Wo(e,t,r){return t.__k==null&&(t.textContent=""),Ft(e,t),typeof r=="function"&&r(),e?e.__c:null}Ce.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(e){Object.defineProperty(Ce.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})});var Nn=H.event;function Hi(){}function Ui(){return this.cancelBubble}function Fi(){return this.defaultPrevented}H.event=function(e){return Nn&&(e=Nn(e)),e.persist=Hi,e.isPropagationStopped=Ui,e.isDefaultPrevented=Fi,e.nativeEvent=e};var an,Bi={enumerable:!1,configurable:!0,get:function(){return this.class}},Tn=H.vnode;H.vnode=function(e){typeof e.type=="string"&&function(t){var r=t.props,n=t.type,o={},i=n.indexOf("-")===-1;for(var a in r){var c=r[a];if(!(a==="value"&&"defaultValue"in r&&c==null||qi&&a==="children"&&n==="noscript"||a==="class"||a==="className")){var f=a.toLowerCase();a==="defaultValue"&&"value"in r&&r.value==null?a="value":a==="download"&&c===!0?c="":f==="translate"&&c==="no"?c=!1:f[0]==="o"&&f[1]==="n"?f==="ondoubleclick"?a="ondblclick":f!=="onchange"||n!=="input"&&n!=="textarea"||Mi(r.type)?f==="onfocus"?a="onfocusin":f==="onblur"?a="onfocusout":Ri.test(a)&&(a=f):f=a="oninput":i&&Ti.test(a)?a=a.replace(Li,"-$&").toLowerCase():c===null&&(c=void 0),f==="oninput"&&o[a=f]&&(a="oninputCapture"),o[a]=c}}n=="select"&&o.multiple&&Array.isArray(o.value)&&(o.value=Le(r.children).forEach(function(m){m.props.selected=o.value.indexOf(m.props.value)!=-1})),n=="select"&&o.defaultValue!=null&&(o.value=Le(r.children).forEach(function(m){m.props.selected=o.multiple?o.defaultValue.indexOf(m.props.value)!=-1:o.defaultValue==m.props.value})),r.class&&!r.className?(o.class=r.class,Object.defineProperty(o,"className",Bi)):(r.className&&!r.class||r.class&&r.className)&&(o.class=o.className=r.className),t.props=o}(e),e.$$typeof=Ko,Tn&&Tn(e)};var Rn=H.__r;H.__r=function(e){Rn&&Rn(e),an=e.__c};var Ln=H.diffed;H.diffed=function(e){Ln&&Ln(e);var t=e.props,r=e.__e;r!=null&&e.type==="textarea"&&"value"in t&&t.value!==r.value&&(r.value=t.value==null?"":t.value),an=null};var Vi={ReactCurrentDispatcher:{current:{readContext:function(e){return an.__n[e.__c].props.value},useCallback:Ro,useContext:Lo,useDebugValue:qo,useDeferredValue:Jo,useEffect:Jt,useId:Mo,useImperativeHandle:To,useInsertionEffect:$o,useLayoutEffect:Qt,useMemo:_r,useReducer:nn,useRef:No,useState:zt,useSyncExternalStore:Zo,useTransition:Qo}}};function rr(e){return!!e&&e.$$typeof===Ko}function zo(e){e()}function Jo(e){return e}function Qo(){return[!1,zo]}var $o=Qt;function Zo(e,t){var r=t(),n=zt({h:{__:r,v:t}}),o=n[0].h,i=n[1];return Qt(function(){o.__=r,o.v=t,Cr(o)&&i({h:o})},[e,r,t]),Jt(function(){return Cr(o)&&i({h:o}),e(function(){Cr(o)&&i({h:o})})},[e]),r}function Cr(e){var t,r,n=e.v,o=e.__;try{var i=n();return!((t=o)===(r=i)&&(t!==0||1/t==1/r)||t!=t&&r!=r)}catch{return!0}}var u={useState:zt,useId:Mo,useReducer:nn,useEffect:Jt,useLayoutEffect:Qt,useInsertionEffect:$o,useTransition:Qo,useDeferredValue:Jo,useSyncExternalStore:Zo,startTransition:zo,useRef:No,useImperativeHandle:To,useMemo:_r,useCallback:Ro,useContext:Lo,useDebugValue:qo,version:"18.3.1",Children:Ci,render:Wo,hydrate:function(e,t,r){return xo(e,t),typeof r=="function"&&r(),e?e.__c:null},unmountComponentAtNode:function(e){return!!e.__k&&(Ft(null,e),!0)},createPortal:Vo,createElement:De,createContext:function(e,t){var r={__c:t="__cC"+wo++,__:e,Consumer:function(n,o){return n.children(o)},Provider:function(n){var o,i;return this.getChildContext||(o=new Set,(i={})[t]=this,this.getChildContext=function(){return i},this.componentWillUnmount=function(){o=null},this.shouldComponentUpdate=function(a){this.props.value!==a.value&&o.forEach(function(c){c.__e=!0,Vr(c)})},this.sub=function(a){o.add(a);var c=a.componentWillUnmount;a.componentWillUnmount=function(){o&&o.delete(a),c&&c.call(a)}}),n.children}};return r.Provider.__=r.Consumer.contextType=r},createFactory:function(e){return De.bind(null,e)},cloneElement:function(e){return rr(e)?Pi.apply(null,arguments):e},createRef:function(){return{current:null}},Fragment:Re,isValidElement:rr,isElement:rr,isFragment:function(e){return rr(e)&&e.type===Re},isMemo:function(e){return!!e&&!!e.displayName&&(typeof e.displayName=="string"||e.displayName instanceof String)&&e.displayName.startsWith("Memo(")},findDOMNode:function(e){return e&&(e.base||e.nodeType===1&&e)||null},Component:Ce,PureComponent:zr,memo:function(e,t){function r(o){var i=this.props.ref,a=i==o.ref;return!a&&i&&(i.call?i(null):i.current=null),t?!t(this.props,o)||!a:Wr(this.props,o)}function n(o){return this.shouldComponentUpdate=r,De(e,o)}return n.displayName="Memo("+(e.displayName||e.name)+")",n.prototype.isReactComponent=!0,n.__f=!0,n},forwardRef:function(e){function t(r){if(!("ref"in r))return e(r,null);var n=r.ref;delete r.ref;var o=e(r,n);return r.ref=n,o}return t.$$typeof=Di,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName="ForwardRef("+(e.displayName||e.name)+")",t},flushSync:function(e,t){return e(t)},unstable_batchedUpdates:function(e,t){return e(t)},StrictMode:Re,Suspense:pr,SuspenseList:Ot,lazy:function(e){var t,r,n;function o(i){if(t||(t=e()).then(function(a){r=a.default||a},function(a){n=a}),n)throw n;if(!r)throw t;return De(r,i)}return o.displayName="Lazy",o.__f=!0,o},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:Vi};function Jr(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r=0;--R){var D=this.tryEntries[R],L=D.completion;if(D.tryLoc==="root")return j("end");if(D.tryLoc<=this.prev){var W=n.call(D,"catchLoc"),K=n.call(D,"finallyLoc");if(W&&K){if(this.prev=0;--j){var R=this.tryEntries[j];if(R.tryLoc<=this.prev&&n.call(R,"finallyLoc")&&this.prev=0;--w){var j=this.tryEntries[w];if(j.finallyLoc===O)return this.complete(j.completion,j.afterLoc),z(j),y}},catch:function(O){for(var w=this.tryEntries.length-1;w>=0;--w){var j=this.tryEntries[w];if(j.tryLoc===O){var R=j.completion;if(R.type==="throw"){var D=R.arg;z(j)}return D}}throw Error("illegal catch attempt")},delegateYield:function(O,w,j){return this.delegate={iterator:oe(O),resultName:w,nextLoc:j},this.method==="next"&&(this.arg=e),y}},t}function Vt(e,t){return Vt=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(r,n){return r.__proto__=n,r},Vt(e,t)}function he(e,t){return function(r){if(Array.isArray(r))return r}(e)||function(r,n){var o=r==null?null:typeof Symbol<"u"&&r[Symbol.iterator]||r["@@iterator"];if(o!=null){var i,a,c,f,m=[],b=!0,l=!1;try{if(c=(o=o.call(r)).next,n===0){if(Object(o)!==o)return;b=!1}else for(;!(b=(i=c.call(o)).done)&&(m.push(i.value),m.length!==n);b=!0);}catch(v){l=!0,a=v}finally{try{if(!b&&o.return!=null&&(f=o.return(),Object(f)!==f))return}finally{if(l)throw a}}return m}}(e,t)||Go(e,t)||function(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function jt(e){return function(t){if(Array.isArray(t))return Jr(t)}(e)||function(t){if(typeof Symbol<"u"&&t[Symbol.iterator]!=null||t["@@iterator"]!=null)return Array.from(t)}(e)||Go(e)||function(){throw new TypeError(`Invalid attempt to spread non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function Go(e,t){if(e){if(typeof e=="string")return Jr(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Jr(e,t):void 0}}function Qr(e){var t=typeof Map=="function"?new Map:void 0;return Qr=function(r){if(r===null||!function(o){try{return Function.toString.call(o).indexOf("[native code]")!==-1}catch{return typeof o=="function"}}(r))return r;if(typeof r!="function")throw new TypeError("Super expression must either be null or a function");if(t!==void 0){if(t.has(r))return t.get(r);t.set(r,n)}function n(){return function(o,i,a){if(un())return Reflect.construct.apply(null,arguments);var c=[null];c.push.apply(c,i);var f=new(o.bind.apply(o,c));return a&&Vt(f,a.prototype),f}(r,arguments,Bt(this).constructor)}return n.prototype=Object.create(r.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),Vt(n,r)},Qr(e)}function Ki(){return u.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},u.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}function Yo(){return u.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20","aria-hidden":"true"},u.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}var Wi=["translations"],Ar="Ctrl",zi=u.forwardRef(function(e,t){var r=e.translations,n=r===void 0?{}:r,o=xe(e,Wi),i=n.buttonText,a=i===void 0?"Search":i,c=n.buttonAriaLabel,f=c===void 0?"Search":c,m=he(zt(null),2),b=m[0],l=m[1];Jt(function(){typeof navigator<"u"&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?l("⌘"):l(Ar))},[]);var v=he(b===Ar?[Ar,"Ctrl",u.createElement(Ki,null)]:["Meta","Command",b],3),s=v[0],S=v[1],g=v[2];return u.createElement("button",le({type:"button",className:"DocSearch DocSearch-Button","aria-label":"".concat(f," (").concat(S,"+K)")},o,{ref:t}),u.createElement("span",{className:"DocSearch-Button-Container"},u.createElement(Yo,null),u.createElement("span",{className:"DocSearch-Button-Placeholder"},a)),u.createElement("span",{className:"DocSearch-Button-Keys"},b!==null&&u.createElement(u.Fragment,null,u.createElement(Hn,{reactsToKey:s},g),u.createElement(Hn,{reactsToKey:"k"},"K"))))});function Hn(e){var t=e.reactsToKey,r=e.children,n=he(zt(!1),2),o=n[0],i=n[1];return Jt(function(){if(t)return window.addEventListener("keydown",a),window.addEventListener("keyup",c),function(){window.removeEventListener("keydown",a),window.removeEventListener("keyup",c)};function a(f){f.key===t&&i(!0)}function c(f){f.key!==t&&f.key!=="Meta"||i(!1)}},[t]),u.createElement("kbd",{className:o?"DocSearch-Button-Key DocSearch-Button-Key--pressed":"DocSearch-Button-Key"},r)}function Xo(e,t){var r=void 0;return function(){for(var n=arguments.length,o=new Array(n),i=0;ie.length)&&(t=e.length);for(var r=0,n=new Array(t);re.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0||(b[f]=a[f]);return b}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}function Vn(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),r.push.apply(r,n)}return r}function at(e){for(var t=1;ti.map(i=>d[i]); -import{_ as ye,d as p,o as s,c as _,T as ue,w as d,a as u,b as m,e as b,u as Pe,i as Be,t as Ee,f as de,g,h as v,j as I,k as i,l as z,m as ie,r as w,n as D,p as Y,q as U,s as Q,v as ve,x as De,y as Fe,z as j,A as N,F as M,B as C,C as Le,D as X,E as k,G as c,H as Ve,I as B,J as K,K as Z,L as G,M as ee,N as Oe,O as Se,P as Ge,Q as fe,R as Te,S as te,U as Ue,V as je,W as we,X as Ne,Y as ze,Z as Re,$ as Ke,a0 as We,a1 as qe}from"./framework.D2Fz4Hoy.js";const ge="G-24PQ0ZF4RG";(async()=>{const{install:e,gtag:t}=await ye(async()=>{const{install:n,gtag:a}=await import("./index.D9Q8CHZq.js").then(o=>o.i);return{install:n,gtag:a}},[]).catch(n=>console.error(n));e(ge),t("js",new Date),t("config",ge)})();const Je={key:0,class:"VPBackdrop"},Ye=p({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(s(),_(ue,{name:"fade"},{default:d(()=>[e.show?(s(),u("div",Je)):m("",!0)]),_:1}))}}),Qe=b(Ye,[["__scopeId","data-v-e363cfcf"]]),V=Pe;function Xe(e,t){let n,a=!1;return()=>{n&&clearTimeout(n),a?n=setTimeout(e,t):(e(),(a=!0)&&setTimeout(()=>a=!1,t))}}function re(e){return e.startsWith("/")?e:`/${e}`}function he(e){const{pathname:t,search:n,hash:a,protocol:o}=new URL(e,"http://a.com");if(Be(e)||e.startsWith("#")||!o.startsWith("http")||!Ee(t))return e;const{site:r}=V(),l=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${n}${a}`);return de(l)}function W({correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:a,theme:o,hash:r}=V(),l=g(()=>{var f,$;return{label:(f=t.value.locales[n.value])==null?void 0:f.label,link:(($=t.value.locales[n.value])==null?void 0:$.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:g(()=>Object.entries(t.value.locales).flatMap(([f,$])=>l.value.label===$.label?[]:{text:$.label,link:Ze($.link||(f==="root"?"/":`/${f}/`),o.value.i18nRouting!==!1&&e,a.value.relativePath.slice(l.value.link.length-1),!t.value.cleanUrls)+r.value})),currentLang:l}}function Ze(e,t,n,a){return t?e.replace(/\/$/,"")+re(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,a?".html":"")):e}const et={class:"NotFound"},tt={class:"code"},nt={class:"title"},at={class:"quote"},ot={class:"action"},st=["href","aria-label"],it=p({__name:"NotFound",setup(e){const{theme:t}=V(),{currentLang:n}=W();return(a,o)=>{var r,l,h,f,$;return s(),u("div",et,[v("p",tt,I(((r=i(t).notFound)==null?void 0:r.code)??"404"),1),v("h1",nt,I(((l=i(t).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),o[0]||(o[0]=v("div",{class:"divider"},null,-1)),v("blockquote",at,I(((h=i(t).notFound)==null?void 0:h.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),v("div",ot,[v("a",{class:"link",href:i(de)(i(n).link),"aria-label":((f=i(t).notFound)==null?void 0:f.linkLabel)??"go to home"},I((($=i(t).notFound)==null?void 0:$.linkText)??"Take me home"),9,st)])])}}}),rt=b(it,[["__scopeId","data-v-0ccf90c8"]]);function Ie(e,t){if(Array.isArray(e))return q(e);if(e==null)return[];t=re(t);const n=Object.keys(e).sort((o,r)=>r.split("/").length-o.split("/").length).find(o=>t.startsWith(re(o))),a=n?e[n]:[];return Array.isArray(a)?q(a):q(a.items,a.base)}function lt(e){const t=[];let n=0;for(const a in e){const o=e[a];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function ct(e){const t=[];function n(a){for(const o of a)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&n(o.items)}return n(e),t}function le(e,t){return Array.isArray(t)?t.some(n=>le(e,n)):z(e,t.link)?!0:t.items?le(e,t.items):!1}function q(e,t){return[...e].map(n=>{const a={...n},o=a.base||t;return o&&a.link&&(a.link=o+a.link),a.items&&(a.items=q(a.items,o)),a})}function F(){const{frontmatter:e,page:t,theme:n}=V(),a=ie("(min-width: 960px)"),o=w(!1),r=g(()=>{const x=n.value.sidebar,A=t.value.relativePath;return x?Ie(x,A):[]}),l=w(r.value);D(r,(x,A)=>{JSON.stringify(x)!==JSON.stringify(A)&&(l.value=r.value)});const h=g(()=>e.value.sidebar!==!1&&l.value.length>0&&e.value.layout!=="home"),f=g(()=>$?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),$=g(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),T=g(()=>h.value&&a.value),P=g(()=>h.value?lt(l.value):[]);function y(){o.value=!0}function S(){o.value=!1}function L(){o.value?S():y()}return{isOpen:o,sidebar:l,sidebarGroups:P,hasSidebar:h,hasAside:$,leftAside:f,isSidebarEnabled:T,open:y,close:S,toggle:L}}function ut(e,t){let n;Y(()=>{n=e.value?document.activeElement:void 0}),U(()=>{window.addEventListener("keyup",a)}),Q(()=>{window.removeEventListener("keyup",a)});function a(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function dt(e){const{page:t,hash:n}=V(),a=w(!1),o=g(()=>e.value.collapsed!=null),r=g(()=>!!e.value.link),l=w(!1),h=()=>{l.value=z(t.value.relativePath,e.value.link)};D([t,e,n],h),U(h);const f=g(()=>l.value?!0:e.value.items?le(t.value.relativePath,e.value.items):!1),$=g(()=>!!(e.value.items&&e.value.items.length));Y(()=>{a.value=!!(o.value&&e.value.collapsed)}),ve(()=>{(l.value||f.value)&&(a.value=!1)});function T(){o.value&&(a.value=!a.value)}return{collapsed:a,collapsible:o,isLink:r,isActiveLink:l,hasActiveLink:f,hasChildren:$,toggle:T}}function vt(){const{hasSidebar:e}=F(),t=ie("(min-width: 960px)"),n=ie("(min-width: 1280px)");return{isAsideEnabled:g(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const ft=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,ce=[];function xe(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function me(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const a=Number(n.tagName[1]);return{element:n,title:ht(n),link:"#"+n.id,level:a}});return mt(t,e)}function ht(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(ft.test(n.className))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function mt(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[a,o]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;return _t(e,a,o)}function pt(e,t){const{isAsideEnabled:n}=vt(),a=Xe(r,100);let o=null;U(()=>{requestAnimationFrame(r),window.addEventListener("scroll",a)}),De(()=>{l(location.hash)}),Q(()=>{window.removeEventListener("scroll",a)});function r(){if(!n.value)return;const h=window.scrollY,f=window.innerHeight,$=document.body.offsetHeight,T=Math.abs(h+f-$)<1,P=ce.map(({element:S,link:L})=>({link:L,top:kt(S)})).filter(({top:S})=>!Number.isNaN(S)).sort((S,L)=>S.top-L.top);if(!P.length){l(null);return}if(h<1){l(null);return}if(T){l(P[P.length-1].link);return}let y=null;for(const{link:S,top:L}of P){if(L>h+Fe()+4)break;y=S}l(y)}function l(h){o&&o.classList.remove("active"),h==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(h)}"]`);const f=o;f?(f.classList.add("active"),t.value.style.top=f.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function kt(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}function _t(e,t,n){ce.length=0;const a=[],o=[];return e.forEach(r=>{const l={...r,children:[]};let h=o[o.length-1];for(;h&&h.level>=l.level;)o.pop(),h=o[o.length-1];if(l.element.classList.contains("ignore-header")||h&&"shouldIgnore"in h){o.push({level:l.level,shouldIgnore:!0});return}l.level>n||l.level{const o=j("VPDocOutlineItem",!0);return s(),u("ul",{class:N(["VPDocOutlineItem",e.root?"root":"nested"])},[(s(!0),u(M,null,C(e.headers,({children:r,link:l,title:h})=>(s(),u("li",null,[v("a",{class:"outline-link",href:l,onClick:t,title:h},I(h),9,bt),r!=null&&r.length?(s(),_(o,{key:0,headers:r},null,8,["headers"])):m("",!0)]))),256))],2)}}}),Me=b(gt,[["__scopeId","data-v-14dc50eb"]]),$t={class:"content"},yt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Pt=p({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=V(),a=Le([]);X(()=>{a.value=me(t.value.outline??n.value.outline)});const o=w(),r=w();return pt(o,r),(l,h)=>(s(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:N(["VPDocAsideOutline",{"has-outline":a.value.length>0}]),ref_key:"container",ref:o},[v("div",$t,[v("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),v("div",yt,I(i(xe)(i(n))),1),k(Me,{headers:a.value,root:!0},null,8,["headers"])])],2))}}),Lt=b(Pt,[["__scopeId","data-v-db815389"]]),Vt={class:"VPDocAsideCarbonAds"},St=p({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,a)=>(s(),u("div",Vt,[k(i(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),Tt={class:"VPDocAside"},wt=p({__name:"VPDocAside",setup(e){const{theme:t}=V();return(n,a)=>(s(),u("div",Tt,[c(n.$slots,"aside-top",{},void 0,!0),c(n.$slots,"aside-outline-before",{},void 0,!0),k(Lt),c(n.$slots,"aside-outline-after",{},void 0,!0),a[0]||(a[0]=v("div",{class:"spacer"},null,-1)),c(n.$slots,"aside-ads-before",{},void 0,!0),i(t).carbonAds?(s(),_(St,{key:0,"carbon-ads":i(t).carbonAds},null,8,["carbon-ads"])):m("",!0),c(n.$slots,"aside-ads-after",{},void 0,!0),c(n.$slots,"aside-bottom",{},void 0,!0)]))}}),Nt=b(wt,[["__scopeId","data-v-aa6669ad"]]);function It(){const{theme:e,page:t}=V();return g(()=>{const{text:n="Edit this page",pattern:a=""}=e.value.editLink||{};let o;return typeof a=="function"?o=a(t.value):o=a.replace(/:path/g,t.value.filePath),{url:o,text:n}})}function xt(){const{page:e,theme:t,frontmatter:n}=V();return g(()=>{var $,T,P,y,S,L,x,A;const a=Ie(t.value.sidebar,e.value.relativePath),o=ct(a),r=Mt(o,H=>H.link.replace(/[?#].*$/,"")),l=r.findIndex(H=>z(e.value.relativePath,H.link)),h=(($=t.value.docFooter)==null?void 0:$.prev)===!1&&!n.value.prev||n.value.prev===!1,f=((T=t.value.docFooter)==null?void 0:T.next)===!1&&!n.value.next||n.value.next===!1;return{prev:h?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((P=r[l-1])==null?void 0:P.docFooterText)??((y=r[l-1])==null?void 0:y.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((S=r[l-1])==null?void 0:S.link)},next:f?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((L=r[l+1])==null?void 0:L.docFooterText)??((x=r[l+1])==null?void 0:x.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((A=r[l+1])==null?void 0:A.link)}}})}function Mt(e,t){const n=new Set;return e.filter(a=>{const o=t(a);return n.has(o)?!1:n.add(o)})}const E=p({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=g(()=>t.tag??(t.href?"a":"span")),a=g(()=>t.href&&Ve.test(t.href)||t.target==="_blank");return(o,r)=>(s(),_(B(n.value),{class:N(["VPLink",{link:e.href,"vp-external-link-icon":a.value,"no-icon":e.noIcon}]),href:e.href?i(he)(e.href):void 0,target:e.target??(a.value?"_blank":void 0),rel:e.rel??(a.value?"noreferrer":void 0)},{default:d(()=>[c(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Ct={class:"VPLastUpdated"},At=["datetime"],Ht=p({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,lang:a}=V(),o=g(()=>new Date(n.value.lastUpdated)),r=g(()=>o.value.toISOString()),l=w("");return U(()=>{Y(()=>{var h,f,$;l.value=new Intl.DateTimeFormat((f=(h=t.value.lastUpdated)==null?void 0:h.formatOptions)!=null&&f.forceLocale?a.value:void 0,(($=t.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(h,f)=>{var $;return s(),u("p",Ct,[K(I((($=i(t).lastUpdated)==null?void 0:$.text)||i(t).lastUpdatedText||"Last updated")+": ",1),v("time",{datetime:r.value},I(l.value),9,At)])}}}),Bt=b(Ht,[["__scopeId","data-v-674b29ec"]]),Et={key:0,class:"VPDocFooter"},Dt={key:0,class:"edit-info"},Ft={key:0,class:"edit-link"},Ot={key:1,class:"last-updated"},Gt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Ut={class:"pager"},jt=["innerHTML"],zt=["innerHTML"],Rt={class:"pager"},Kt=["innerHTML"],Wt=["innerHTML"],qt=p({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:a}=V(),o=It(),r=xt(),l=g(()=>t.value.editLink&&a.value.editLink!==!1),h=g(()=>n.value.lastUpdated),f=g(()=>l.value||h.value||r.value.prev||r.value.next);return($,T)=>{var P,y,S,L;return f.value?(s(),u("footer",Et,[c($.$slots,"doc-footer-before",{},void 0,!0),l.value||h.value?(s(),u("div",Dt,[l.value?(s(),u("div",Ft,[k(E,{class:"edit-link-button",href:i(o).url,"no-icon":!0},{default:d(()=>[T[0]||(T[0]=v("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),K(" "+I(i(o).text),1)]),_:1},8,["href"])])):m("",!0),h.value?(s(),u("div",Ot,[k(Bt)])):m("",!0)])):m("",!0),(P=i(r).prev)!=null&&P.link||(y=i(r).next)!=null&&y.link?(s(),u("nav",Gt,[T[1]||(T[1]=v("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),v("div",Ut,[(S=i(r).prev)!=null&&S.link?(s(),_(E,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:d(()=>{var x;return[v("span",{class:"desc",innerHTML:((x=i(t).docFooter)==null?void 0:x.prev)||"Previous page"},null,8,jt),v("span",{class:"title",innerHTML:i(r).prev.text},null,8,zt)]}),_:1},8,["href"])):m("",!0)]),v("div",Rt,[(L=i(r).next)!=null&&L.link?(s(),_(E,{key:0,class:"pager-link next",href:i(r).next.link},{default:d(()=>{var x;return[v("span",{class:"desc",innerHTML:((x=i(t).docFooter)==null?void 0:x.next)||"Next page"},null,8,Kt),v("span",{class:"title",innerHTML:i(r).next.text},null,8,Wt)]}),_:1},8,["href"])):m("",!0)])])):m("",!0)])):m("",!0)}}}),Jt=b(qt,[["__scopeId","data-v-dbf6cb78"]]),Yt={class:"container"},Qt={class:"aside-container"},Xt={class:"aside-content"},Zt={class:"content"},en={class:"content-container"},tn={class:"main"},nn=p({__name:"VPDoc",setup(e){const{theme:t}=V(),n=Z(),{hasSidebar:a,hasAside:o,leftAside:r}=F(),l=g(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(h,f)=>{const $=j("Content");return s(),u("div",{class:N(["VPDoc",{"has-sidebar":i(a),"has-aside":i(o)}])},[c(h.$slots,"doc-top",{},void 0,!0),v("div",Yt,[i(o)?(s(),u("div",{key:0,class:N(["aside",{"left-aside":i(r)}])},[f[0]||(f[0]=v("div",{class:"aside-curtain"},null,-1)),v("div",Qt,[v("div",Xt,[k(Nt,null,{"aside-top":d(()=>[c(h.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":d(()=>[c(h.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":d(()=>[c(h.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":d(()=>[c(h.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":d(()=>[c(h.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":d(()=>[c(h.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):m("",!0),v("div",Zt,[v("div",en,[c(h.$slots,"doc-before",{},void 0,!0),v("main",tn,[k($,{class:N(["vp-doc",[l.value,i(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(Jt,null,{"doc-footer-before":d(()=>[c(h.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(h.$slots,"doc-after",{},void 0,!0)])])]),c(h.$slots,"doc-bottom",{},void 0,!0)],2)}}}),an=b(nn,[["__scopeId","data-v-9d5e9fc1"]]),on=p({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(e){const t=e,n=g(()=>t.href&&Ve.test(t.href)),a=g(()=>t.tag||(t.href?"a":"button"));return(o,r)=>(s(),_(B(a.value),{class:N(["VPButton",[e.size,e.theme]]),href:e.href?i(he)(e.href):void 0,target:t.target??(n.value?"_blank":void 0),rel:t.rel??(n.value?"noreferrer":void 0)},{default:d(()=>[K(I(e.text),1)]),_:1},8,["class","href","target","rel"]))}}),sn=b(on,[["__scopeId","data-v-000d56ea"]]),rn=["src","alt"],ln=p({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const a=j("VPImage",!0);return e.image?(s(),u(M,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),u("img",G({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:i(de)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,rn)):(s(),u(M,{key:1},[k(a,G({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),k(a,G({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):m("",!0)}}}),J=b(ln,[["__scopeId","data-v-4bf6137d"]]),cn={class:"container"},un={class:"main"},dn={class:"heading"},vn=["innerHTML"],fn=["innerHTML"],hn=["innerHTML"],mn={key:0,class:"actions"},pn={key:0,class:"image"},kn={class:"image-container"},_n=p({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=ee("hero-image-slot-exists");return(n,a)=>(s(),u("div",{class:N(["VPHero",{"has-image":e.image||i(t)}])},[v("div",cn,[v("div",un,[c(n.$slots,"home-hero-info-before",{},void 0,!0),c(n.$slots,"home-hero-info",{},()=>[v("h1",dn,[e.name?(s(),u("span",{key:0,innerHTML:e.name,class:"name clip"},null,8,vn)):m("",!0),e.text?(s(),u("span",{key:1,innerHTML:e.text,class:"text"},null,8,fn)):m("",!0)]),e.tagline?(s(),u("p",{key:0,innerHTML:e.tagline,class:"tagline"},null,8,hn)):m("",!0)],!0),c(n.$slots,"home-hero-info-after",{},void 0,!0),e.actions?(s(),u("div",mn,[(s(!0),u(M,null,C(e.actions,o=>(s(),u("div",{key:o.link,class:"action"},[k(sn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):m("",!0),c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),e.image||i(t)?(s(),u("div",pn,[v("div",kn,[a[0]||(a[0]=v("div",{class:"image-bg"},null,-1)),c(n.$slots,"home-hero-image",{},()=>[e.image?(s(),_(J,{key:0,class:"image-src",image:e.image},null,8,["image"])):m("",!0)],!0)])])):m("",!0)])],2))}}),bn=b(_n,[["__scopeId","data-v-e3f598c4"]]),gn=p({__name:"VPHomeHero",setup(e){const{frontmatter:t}=V();return(n,a)=>i(t).hero?(s(),_(bn,{key:0,class:"VPHomeHero",name:i(t).hero.name,text:i(t).hero.text,tagline:i(t).hero.tagline,image:i(t).hero.image,actions:i(t).hero.actions},{"home-hero-info-before":d(()=>[c(n.$slots,"home-hero-info-before")]),"home-hero-info":d(()=>[c(n.$slots,"home-hero-info")]),"home-hero-info-after":d(()=>[c(n.$slots,"home-hero-info-after")]),"home-hero-actions-after":d(()=>[c(n.$slots,"home-hero-actions-after")]),"home-hero-image":d(()=>[c(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):m("",!0)}}),$n={class:"box"},yn={key:0,class:"icon"},Pn=["innerHTML"],Ln=["innerHTML"],Vn=["innerHTML"],Sn={key:4,class:"link-text"},Tn={class:"link-text-value"},wn=p({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(s(),_(E,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:d(()=>[v("article",$n,[typeof e.icon=="object"&&e.icon.wrap?(s(),u("div",yn,[k(J,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),_(J,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Pn)):m("",!0),v("h2",{class:"title",innerHTML:e.title},null,8,Ln),e.details?(s(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Vn)):m("",!0),e.linkText?(s(),u("div",Sn,[v("p",Tn,[K(I(e.linkText)+" ",1),n[0]||(n[0]=v("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):m("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Nn=b(wn,[["__scopeId","data-v-66976325"]]),In={key:0,class:"VPFeatures"},xn={class:"container"},Mn={class:"items"},Cn=p({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=g(()=>{const a=t.features.length;if(a){if(a===2)return"grid-2";if(a===3)return"grid-3";if(a%3===0)return"grid-6";if(a>3)return"grid-4"}else return});return(a,o)=>e.features?(s(),u("div",In,[v("div",xn,[v("div",Mn,[(s(!0),u(M,null,C(e.features,r=>(s(),u("div",{key:r.title,class:N(["item",[n.value]])},[k(Nn,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):m("",!0)}}),An=b(Cn,[["__scopeId","data-v-2844bedd"]]),Hn=p({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=V();return(n,a)=>i(t).features?(s(),_(An,{key:0,class:"VPHomeFeatures",features:i(t).features},null,8,["features"])):m("",!0)}}),Bn=p({__name:"VPHomeContent",setup(e){const{width:t}=Oe({initialWidth:0,includeScrollbar:!1});return(n,a)=>(s(),u("div",{class:"vp-doc container",style:Se(i(t)?{"--vp-offset":`calc(50% - ${i(t)/2}px)`}:{})},[c(n.$slots,"default",{},void 0,!0)],4))}}),En=b(Bn,[["__scopeId","data-v-8327b799"]]),Dn=p({__name:"VPHome",setup(e){const{frontmatter:t,theme:n}=V();return(a,o)=>{const r=j("Content");return s(),u("div",{class:N(["VPHome",{"external-link-icon-enabled":i(n).externalLinkIcon}])},[c(a.$slots,"home-hero-before",{},void 0,!0),k(gn,null,{"home-hero-info-before":d(()=>[c(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":d(()=>[c(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":d(()=>[c(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":d(()=>[c(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":d(()=>[c(a.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(a.$slots,"home-hero-after",{},void 0,!0),c(a.$slots,"home-features-before",{},void 0,!0),k(Hn),c(a.$slots,"home-features-after",{},void 0,!0),i(t).markdownStyles!==!1?(s(),_(En,{key:0},{default:d(()=>[k(r)]),_:1})):(s(),_(r,{key:1}))],2)}}}),Fn=b(Dn,[["__scopeId","data-v-260dc7ef"]]),On={},Gn={class:"VPPage"};function Un(e,t){const n=j("Content");return s(),u("div",Gn,[c(e.$slots,"page-top"),k(n),c(e.$slots,"page-bottom")])}const jn=b(On,[["render",Un]]),zn=p({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=V(),{hasSidebar:a}=F();return(o,r)=>(s(),u("div",{class:N(["VPContent",{"has-sidebar":i(a),"is-home":i(n).layout==="home"}]),id:"VPContent"},[i(t).isNotFound?c(o.$slots,"not-found",{key:0},()=>[k(rt)],!0):i(n).layout==="page"?(s(),_(jn,{key:1},{"page-top":d(()=>[c(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":d(()=>[c(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(n).layout==="home"?(s(),_(Fn,{key:2},{"home-hero-before":d(()=>[c(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":d(()=>[c(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":d(()=>[c(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":d(()=>[c(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":d(()=>[c(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":d(()=>[c(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":d(()=>[c(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":d(()=>[c(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":d(()=>[c(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(n).layout&&i(n).layout!=="doc"?(s(),_(B(i(n).layout),{key:3})):(s(),_(an,{key:4},{"doc-top":d(()=>[c(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":d(()=>[c(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":d(()=>[c(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":d(()=>[c(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":d(()=>[c(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":d(()=>[c(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":d(()=>[c(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":d(()=>[c(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":d(()=>[c(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":d(()=>[c(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":d(()=>[c(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Rn=b(zn,[["__scopeId","data-v-069fbe0c"]]),Kn={class:"container"},Wn=["innerHTML"],qn=["innerHTML"],Jn=p({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=V(),{hasSidebar:a}=F();return(o,r)=>i(t).footer&&i(n).footer!==!1?(s(),u("footer",{key:0,class:N(["VPFooter",{"has-sidebar":i(a)}])},[v("div",Kn,[i(t).footer.message?(s(),u("p",{key:0,class:"message",innerHTML:i(t).footer.message},null,8,Wn)):m("",!0),i(t).footer.copyright?(s(),u("p",{key:1,class:"copyright",innerHTML:i(t).footer.copyright},null,8,qn)):m("",!0)])],2)):m("",!0)}}),Yn=b(Jn,[["__scopeId","data-v-e4d622eb"]]);function Qn(){const{theme:e,frontmatter:t}=V(),n=Le([]),a=g(()=>n.value.length>0);return X(()=>{n.value=me(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:a}}const Xn={class:"menu-text"},Zn={class:"header"},ea={class:"outline"},ta=p({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=V(),a=w(!1),o=w(0),r=w(),l=w();function h(P){var y;(y=r.value)!=null&&y.contains(P.target)||(a.value=!1)}D(a,P=>{if(P){document.addEventListener("click",h);return}document.removeEventListener("click",h)}),Ge("Escape",()=>{a.value=!1}),X(()=>{a.value=!1});function f(){a.value=!a.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function $(P){P.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),fe(()=>{a.value=!1}))}function T(){a.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(P,y)=>(s(),u("div",{class:"VPLocalNavOutlineDropdown",style:Se({"--vp-vh":o.value+"px"}),ref_key:"main",ref:r},[e.headers.length>0?(s(),u("button",{key:0,onClick:f,class:N({open:a.value})},[v("span",Xn,I(i(xe)(i(n))),1),y[0]||(y[0]=v("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(s(),u("button",{key:1,onClick:T},I(i(n).returnToTopLabel||"Return to top"),1)),k(ue,{name:"flyout"},{default:d(()=>[a.value?(s(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:$},[v("div",Zn,[v("a",{class:"top-link",href:"#",onClick:T},I(i(n).returnToTopLabel||"Return to top"),1)]),v("div",ea,[k(Me,{headers:e.headers},null,8,["headers"])])],512)):m("",!0)]),_:1})],4))}}),na=b(ta,[["__scopeId","data-v-ef699ed1"]]),aa={class:"container"},oa=["aria-expanded"],sa={class:"menu-text"},ia=p({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=V(),{hasSidebar:a}=F(),{headers:o}=Qn(),{y:r}=Te(),l=w(0);U(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),X(()=>{o.value=me(n.value.outline??t.value.outline)});const h=g(()=>o.value.length===0),f=g(()=>h.value&&!a.value),$=g(()=>({VPLocalNav:!0,"has-sidebar":a.value,empty:h.value,fixed:f.value}));return(T,P)=>i(n).layout!=="home"&&(!f.value||i(r)>=l.value)?(s(),u("div",{key:0,class:N($.value)},[v("div",aa,[i(a)?(s(),u("button",{key:0,class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:P[0]||(P[0]=y=>T.$emit("open-menu"))},[P[1]||(P[1]=v("span",{class:"vpi-align-left menu-icon"},null,-1)),v("span",sa,I(i(t).sidebarMenuLabel||"Menu"),1)],8,oa)):m("",!0),k(na,{headers:i(o),navHeight:l.value},null,8,["headers","navHeight"])])],2)):m("",!0)}}),ra=b(ia,[["__scopeId","data-v-927bc523"]]);function la(){const e=w(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function a(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const r=Z();return D(()=>r.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:a}}const ca={},ua={class:"VPSwitch",type:"button",role:"switch"},da={class:"check"},va={key:0,class:"icon"};function fa(e,t){return s(),u("button",ua,[v("span",da,[e.$slots.default?(s(),u("span",va,[c(e.$slots,"default",{},void 0,!0)])):m("",!0)])])}const ha=b(ca,[["render",fa],["__scopeId","data-v-4fbad16d"]]),ma=p({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=V(),a=ee("toggle-appearance",()=>{t.value=!t.value}),o=w("");return ve(()=>{o.value=t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme"}),(r,l)=>(s(),_(ha,{title:o.value,class:"VPSwitchAppearance","aria-checked":i(t),onClick:i(a)},{default:d(()=>[...l[0]||(l[0]=[v("span",{class:"vpi-sun sun"},null,-1),v("span",{class:"vpi-moon moon"},null,-1)])]),_:1},8,["title","aria-checked","onClick"]))}}),pe=b(ma,[["__scopeId","data-v-7b0e90b6"]]),pa={key:0,class:"VPNavBarAppearance"},ka=p({__name:"VPNavBarAppearance",setup(e){const{site:t}=V();return(n,a)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",pa,[k(pe)])):m("",!0)}}),_a=b(ka,[["__scopeId","data-v-edc5c802"]]),ke=w();let Ce=!1,se=0;function ba(e){const t=w(!1);if(te){!Ce&&ga(),se++;const n=D(ke,a=>{var o,r,l;a===e.el.value||(o=e.el.value)!=null&&o.contains(a)?(t.value=!0,(r=e.onFocus)==null||r.call(e)):(t.value=!1,(l=e.onBlur)==null||l.call(e))});Q(()=>{n(),se--,se||$a()})}return Ue(t)}function ga(){document.addEventListener("focusin",Ae),Ce=!0,ke.value=document.activeElement}function $a(){document.removeEventListener("focusin",Ae)}function Ae(){ke.value=document.activeElement}const ya={class:"VPMenuLink"},Pa=["innerHTML"],La=p({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=V();return(n,a)=>(s(),u("div",ya,[k(E,{class:N({active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon},{default:d(()=>[v("span",{innerHTML:e.item.text},null,8,Pa)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),ne=b(La,[["__scopeId","data-v-98c1068d"]]),Va={class:"VPMenuGroup"},Sa={key:0,class:"title"},Ta=p({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Va,[e.text?(s(),u("p",Sa,I(e.text),1)):m("",!0),(s(!0),u(M,null,C(e.items,a=>(s(),u(M,null,["link"in a?(s(),_(ne,{key:0,item:a},null,8,["item"])):m("",!0)],64))),256))]))}}),wa=b(Ta,[["__scopeId","data-v-396199aa"]]),Na={class:"VPMenu"},Ia={key:0,class:"items"},xa=p({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(s(),u("div",Na,[e.items?(s(),u("div",Ia,[(s(!0),u(M,null,C(e.items,a=>(s(),u(M,{key:JSON.stringify(a)},["link"in a?(s(),_(ne,{key:0,item:a},null,8,["item"])):"component"in a?(s(),_(B(a.component),G({key:1,ref_for:!0},a.props),null,16)):(s(),_(wa,{key:2,text:a.text,items:a.items},null,8,["text","items"]))],64))),128))])):m("",!0),c(t.$slots,"default",{},void 0,!0)]))}}),Ma=b(xa,[["__scopeId","data-v-ef9b3e72"]]),Ca=["aria-expanded","aria-label"],Aa={key:0,class:"text"},Ha=["innerHTML"],Ba={key:1,class:"vpi-more-horizontal icon"},Ea={class:"menu"},Da=p({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=w(!1),n=w();ba({el:n,onBlur:a});function a(){t.value=!1}return(o,r)=>(s(),u("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=l=>t.value=!0),onMouseleave:r[2]||(r[2]=l=>t.value=!1)},[v("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:r[0]||(r[0]=l=>t.value=!t.value)},[e.button||e.icon?(s(),u("span",Aa,[e.icon?(s(),u("span",{key:0,class:N([e.icon,"option-icon"])},null,2)):m("",!0),e.button?(s(),u("span",{key:1,innerHTML:e.button},null,8,Ha)):m("",!0),r[3]||(r[3]=v("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(s(),u("span",Ba))],8,Ca),v("div",Ea,[k(Ma,{items:e.items},{default:d(()=>[c(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),_e=b(Da,[["__scopeId","data-v-5462cb06"]]),Fa=["href","aria-label","innerHTML"],Oa=p({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=w();U(async()=>{var r;await fe();const o=(r=n.value)==null?void 0:r.children[0];o instanceof HTMLElement&&o.className.startsWith("vpi-social-")&&(getComputedStyle(o).maskImage||getComputedStyle(o).webkitMaskImage)==="none"&&o.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${t.icon}.svg')`)});const a=g(()=>typeof t.icon=="object"?t.icon.svg:``);return(o,r)=>(s(),u("a",{ref_key:"el",ref:n,class:"VPSocialLink no-icon",href:e.link,"aria-label":e.ariaLabel??(typeof e.icon=="string"?e.icon:""),target:"_blank",rel:"noopener",innerHTML:a.value},null,8,Fa))}}),Ga=b(Oa,[["__scopeId","data-v-7ed0bbdb"]]),Ua={class:"VPSocialLinks"},ja=p({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(s(),u("div",Ua,[(s(!0),u(M,null,C(e.links,({link:a,icon:o,ariaLabel:r})=>(s(),_(Ga,{key:a,icon:o,link:a,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),be=b(ja,[["__scopeId","data-v-347b6376"]]),za={key:0,class:"group translations"},Ra={class:"trans-title"},Ka={key:1,class:"group"},Wa={class:"item appearance"},qa={class:"label"},Ja={class:"appearance-action"},Ya={key:2,class:"group"},Qa={class:"item social-links"},Xa=p({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=V(),{localeLinks:a,currentLang:o}=W({correspondingLink:!0}),r=g(()=>a.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(l,h)=>r.value?(s(),_(_e,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:d(()=>[i(a).length&&i(o).label?(s(),u("div",za,[v("p",Ra,I(i(o).label),1),(s(!0),u(M,null,C(i(a),f=>(s(),_(ne,{key:f.link,item:f},null,8,["item"]))),128))])):m("",!0),i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Ka,[v("div",Wa,[v("p",qa,I(i(n).darkModeSwitchLabel||"Appearance"),1),v("div",Ja,[k(pe)])])])):m("",!0),i(n).socialLinks?(s(),u("div",Ya,[v("div",Qa,[k(be,{class:"social-links-list",links:i(n).socialLinks},null,8,["links"])])])):m("",!0)]),_:1})):m("",!0)}}),Za=b(Xa,[["__scopeId","data-v-4694d3fe"]]),eo=["aria-expanded"],to=p({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(s(),u("button",{type:"button",class:N(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=a=>t.$emit("click"))},[...n[1]||(n[1]=[v("span",{class:"container"},[v("span",{class:"top"}),v("span",{class:"middle"}),v("span",{class:"bottom"})],-1)])],10,eo))}}),no=b(to,[["__scopeId","data-v-965cc22b"]]),ao=["innerHTML"],oo=p({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=V();return(n,a)=>(s(),_(E,{class:N({VPNavBarMenuLink:!0,active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,tabindex:"0"},{default:d(()=>[v("span",{innerHTML:e.item.text},null,8,ao)]),_:1},8,["class","href","target","rel","no-icon"]))}}),so=b(oo,[["__scopeId","data-v-af90171e"]]),io=p({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=V(),a=r=>"component"in r?!1:"link"in r?z(n.value.relativePath,r.link,!!t.item.activeMatch):r.items.some(a),o=g(()=>a(t.item));return(r,l)=>(s(),_(_e,{class:N({VPNavBarMenuGroup:!0,active:i(z)(i(n).relativePath,e.item.activeMatch,!!e.item.activeMatch)||o.value}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),ro={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},lo=p({__name:"VPNavBarMenu",setup(e){const{theme:t}=V();return(n,a)=>i(t).nav?(s(),u("nav",ro,[a[0]||(a[0]=v("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(s(!0),u(M,null,C(i(t).nav,o=>(s(),u(M,{key:JSON.stringify(o)},["link"in o?(s(),_(so,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props),null,16)):(s(),_(io,{key:2,item:o},null,8,["item"]))],64))),128))])):m("",!0)}}),co=b(lo,[["__scopeId","data-v-3e77c3d1"]]);function uo(e){const{localeIndex:t,theme:n}=V();function a(o){var L,x,A;const r=o.split("."),l=(L=n.value.search)==null?void 0:L.options,h=l&&typeof l=="object",f=h&&((A=(x=l.locales)==null?void 0:x[t.value])==null?void 0:A.translations)||null,$=h&&l.translations||null;let T=f,P=$,y=e;const S=r.pop();for(const H of r){let O=null;const R=y==null?void 0:y[H];R&&(O=y=R);const ae=P==null?void 0:P[H];ae&&(O=P=ae);const oe=T==null?void 0:T[H];oe&&(O=T=oe),R||(y=O),ae||(P=O),oe||(T=O)}return(T==null?void 0:T[S])??(P==null?void 0:P[S])??(y==null?void 0:y[S])??""}return a}const vo=["aria-label"],fo={class:"DocSearch-Button-Container"},ho={class:"DocSearch-Button-Placeholder"},$e=p({__name:"VPNavBarSearchButton",setup(e){const n=uo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(a,o)=>(s(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(n)("button.buttonAriaLabel")},[v("span",fo,[o[0]||(o[0]=v("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),v("span",ho,I(i(n)("button.buttonText")),1)]),o[1]||(o[1]=v("span",{class:"DocSearch-Button-Keys"},[v("kbd",{class:"DocSearch-Button-Key"}),v("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,vo))}}),mo={class:"VPNavBarSearch"},po={id:"local-search"},ko={key:1,id:"docsearch"},_o=p({__name:"VPNavBarSearch",setup(e){const t=()=>null,n=je(()=>ye(()=>import("./VPAlgoliaSearchBox.Dq8oDwpi.js"),__vite__mapDeps([0,1]))),{theme:a}=V(),o=w(!1),r=w(!1),l=()=>{const y="VPAlgoliaPreconnect";(window.requestIdleCallback||setTimeout)(()=>{var x;const L=document.createElement("link");L.id=y,L.rel="preconnect",L.href=`https://${(((x=a.value.search)==null?void 0:x.options)??a.value.algolia).appId}-dsn.algolia.net`,L.crossOrigin="",document.head.appendChild(L)})};U(()=>{l();const y=L=>{(L.key.toLowerCase()==="k"&&(L.metaKey||L.ctrlKey)||!$(L)&&L.key==="/")&&(L.preventDefault(),h(),S())},S=()=>{window.removeEventListener("keydown",y)};window.addEventListener("keydown",y),Q(S)});function h(){o.value||(o.value=!0,setTimeout(f,16))}function f(){const y=new Event("keydown");y.key="k",y.metaKey=!0,window.dispatchEvent(y),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||f()},16)}function $(y){const S=y.target,L=S.tagName;return S.isContentEditable||L==="INPUT"||L==="SELECT"||L==="TEXTAREA"}const T=w(!1),P="algolia";return(y,S)=>{var L;return s(),u("div",mo,[i(P)==="local"?(s(),u(M,{key:0},[T.value?(s(),_(i(t),{key:0,onClose:S[0]||(S[0]=x=>T.value=!1)})):m("",!0),v("div",po,[k($e,{onClick:S[1]||(S[1]=x=>T.value=!0)})])],64)):i(P)==="algolia"?(s(),u(M,{key:1},[o.value?(s(),_(i(n),{key:0,algolia:((L=i(a).search)==null?void 0:L.options)??i(a).algolia,onVnodeBeforeMount:S[2]||(S[2]=x=>r.value=!0)},null,8,["algolia"])):m("",!0),r.value?m("",!0):(s(),u("div",ko,[k($e,{onClick:h})]))],64)):m("",!0)])}}}),bo=p({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=V();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavBarSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),go=b(bo,[["__scopeId","data-v-6fbb189e"]]),$o=["href","rel","target"],yo=["innerHTML"],Po={key:2},Lo=p({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=V(),{hasSidebar:a}=F(),{currentLang:o}=W(),r=g(()=>{var f;return typeof n.value.logoLink=="string"?n.value.logoLink:(f=n.value.logoLink)==null?void 0:f.link}),l=g(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.rel}),h=g(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.target});return(f,$)=>(s(),u("div",{class:N(["VPNavBarTitle",{"has-sidebar":i(a)}])},[v("a",{class:"title",href:r.value??i(he)(i(o).link),rel:l.value,target:h.value},[c(f.$slots,"nav-bar-title-before",{},void 0,!0),i(n).logo?(s(),_(J,{key:0,class:"logo",image:i(n).logo},null,8,["image"])):m("",!0),i(n).siteTitle?(s(),u("span",{key:1,innerHTML:i(n).siteTitle},null,8,yo)):i(n).siteTitle===void 0?(s(),u("span",Po,I(i(t).title),1)):m("",!0),c(f.$slots,"nav-bar-title-after",{},void 0,!0)],8,$o)],2))}}),Vo=b(Lo,[["__scopeId","data-v-8d452041"]]),So={class:"items"},To={class:"title"},wo=p({__name:"VPNavBarTranslations",setup(e){const{theme:t}=V(),{localeLinks:n,currentLang:a}=W({correspondingLink:!0});return(o,r)=>i(n).length&&i(a).label?(s(),_(_e,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(t).langMenuLabel||"Change language"},{default:d(()=>[v("div",So,[v("p",To,I(i(a).label),1),(s(!0),u(M,null,C(i(n),l=>(s(),_(ne,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):m("",!0)}}),No=b(wo,[["__scopeId","data-v-fd9b8244"]]),Io={class:"wrapper"},xo={class:"container"},Mo={class:"title"},Co={class:"content"},Ao={class:"content-body"},Ho=p({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const t=e,{y:n}=Te(),{hasSidebar:a}=F(),{frontmatter:o}=V(),r=w({});return ve(()=>{r.value={"has-sidebar":a.value,home:o.value.layout==="home",top:n.value===0,"screen-open":t.isScreenOpen}}),(l,h)=>(s(),u("div",{class:N(["VPNavBar",r.value])},[v("div",Io,[v("div",xo,[v("div",Mo,[k(Vo,null,{"nav-bar-title-before":d(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":d(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),v("div",Co,[v("div",Ao,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),k(_o,{class:"search"}),k(co,{class:"menu"}),k(No,{class:"translations"}),k(_a,{class:"appearance"}),k(go,{class:"social-links"}),k(Za,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),k(no,{class:"hamburger",active:e.isScreenOpen,onClick:h[0]||(h[0]=f=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),h[1]||(h[1]=v("div",{class:"divider"},[v("div",{class:"divider-line"})],-1))],2))}}),Bo=b(Ho,[["__scopeId","data-v-82bf9753"]]),Eo={key:0,class:"VPNavScreenAppearance"},Do={class:"text"},Fo=p({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=V();return(a,o)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Eo,[v("p",Do,I(i(n).darkModeSwitchLabel||"Appearance"),1),k(pe)])):m("",!0)}}),Oo=b(Fo,[["__scopeId","data-v-05b28f24"]]),Go=["innerHTML"],Uo=p({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=ee("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:d(()=>[v("span",{innerHTML:e.item.text},null,8,Go)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),jo=b(Uo,[["__scopeId","data-v-2f616699"]]),zo=["innerHTML"],Ro=p({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=ee("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuGroupLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:d(()=>[v("span",{innerHTML:e.item.text},null,8,zo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),He=b(Ro,[["__scopeId","data-v-7236d213"]]),Ko={class:"VPNavScreenMenuGroupSection"},Wo={key:0,class:"title"},qo=p({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Ko,[e.text?(s(),u("p",Wo,I(e.text),1)):m("",!0),(s(!0),u(M,null,C(e.items,a=>(s(),_(He,{key:a.text,item:a},null,8,["item"]))),128))]))}}),Jo=b(qo,[["__scopeId","data-v-b59f21a5"]]),Yo=["aria-controls","aria-expanded"],Qo=["innerHTML"],Xo=["id"],Zo={key:0,class:"item"},es={key:1,class:"item"},ts={key:2,class:"group"},ns=p({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=w(!1),a=g(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(r,l)=>(s(),u("div",{class:N(["VPNavScreenMenuGroup",{open:n.value}])},[v("button",{class:"button","aria-controls":a.value,"aria-expanded":n.value,onClick:o},[v("span",{class:"button-text",innerHTML:e.text},null,8,Qo),l[0]||(l[0]=v("span",{class:"vpi-plus button-icon"},null,-1))],8,Yo),v("div",{id:a.value,class:"items"},[(s(!0),u(M,null,C(e.items,h=>(s(),u(M,{key:JSON.stringify(h)},["link"in h?(s(),u("div",Zo,[k(He,{item:h},null,8,["item"])])):"component"in h?(s(),u("div",es,[(s(),_(B(h.component),G({ref_for:!0},h.props,{"screen-menu":""}),null,16))])):(s(),u("div",ts,[k(Jo,{text:h.text,items:h.items},null,8,["text","items"])]))],64))),128))],8,Xo)],2))}}),as=b(ns,[["__scopeId","data-v-451d3337"]]),os={key:0,class:"VPNavScreenMenu"},ss=p({__name:"VPNavScreenMenu",setup(e){const{theme:t}=V();return(n,a)=>i(t).nav?(s(),u("nav",os,[(s(!0),u(M,null,C(i(t).nav,o=>(s(),u(M,{key:JSON.stringify(o)},["link"in o?(s(),_(jo,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(s(),_(as,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):m("",!0)}}),is=p({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=V();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavScreenSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),rs={class:"list"},ls=p({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=W({correspondingLink:!0}),a=w(!1);function o(){a.value=!a.value}return(r,l)=>i(t).length&&i(n).label?(s(),u("div",{key:0,class:N(["VPNavScreenTranslations",{open:a.value}])},[v("button",{class:"title",onClick:o},[l[0]||(l[0]=v("span",{class:"vpi-languages icon lang"},null,-1)),K(" "+I(i(n).label)+" ",1),l[1]||(l[1]=v("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),v("ul",rs,[(s(!0),u(M,null,C(i(t),h=>(s(),u("li",{key:h.link,class:"item"},[k(E,{class:"link",href:h.link},{default:d(()=>[K(I(h.text),1)]),_:2},1032,["href"])]))),128))])],2)):m("",!0)}}),cs=b(ls,[["__scopeId","data-v-5d42b2ca"]]),us={class:"container"},ds=p({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=w(null),n=we(te?document.body:null);return(a,o)=>(s(),_(ue,{name:"fade",onEnter:o[0]||(o[0]=r=>n.value=!0),onAfterLeave:o[1]||(o[1]=r=>n.value=!1)},{default:d(()=>[e.open?(s(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[v("div",us,[c(a.$slots,"nav-screen-content-before",{},void 0,!0),k(ss,{class:"menu"}),k(cs,{class:"translations"}),k(Oo,{class:"appearance"}),k(is,{class:"social-links"}),c(a.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):m("",!0)]),_:3}))}}),vs=b(ds,[["__scopeId","data-v-4fad8bb9"]]),fs={key:0,class:"VPNav"},hs=p({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:a}=la(),{frontmatter:o}=V(),r=g(()=>o.value.navbar!==!1);return Ne("close-screen",n),Y(()=>{te&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(l,h)=>r.value?(s(),u("header",fs,[k(Bo,{"is-screen-open":i(t),onToggleScreen:i(a)},{"nav-bar-title-before":d(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":d(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":d(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":d(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(vs,{open:i(t)},{"nav-screen-content-before":d(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":d(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):m("",!0)}}),ms=b(hs,[["__scopeId","data-v-e44eaeb0"]]),ps=["role","tabindex"],ks={key:1,class:"items"},_s=p({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:a,isLink:o,isActiveLink:r,hasActiveLink:l,hasChildren:h,toggle:f}=dt(g(()=>t.item)),$=g(()=>h.value?"section":"div"),T=g(()=>o.value?"a":"div"),P=g(()=>h.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),y=g(()=>o.value?void 0:"button"),S=g(()=>[[`level-${t.depth}`],{collapsible:a.value},{collapsed:n.value},{"is-link":o.value},{"is-active":r.value},{"has-active":l.value}]);function L(A){"key"in A&&A.key!=="Enter"||!t.item.link&&f()}function x(){t.item.link&&f()}return(A,H)=>{const O=j("VPSidebarItem",!0);return s(),_(B($.value),{class:N(["VPSidebarItem",S.value])},{default:d(()=>[e.item.text?(s(),u("div",G({key:0,class:"item",role:y.value},ze(e.item.items?{click:L,keydown:L}:{},!0),{tabindex:e.item.items&&0}),[H[1]||(H[1]=v("div",{class:"indicator"},null,-1)),e.item.link?(s(),_(E,{key:0,tag:T.value,class:"link",href:e.item.link,rel:e.item.rel,target:e.item.target},{default:d(()=>[(s(),_(B(P.value),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),_(B(P.value),{key:1,class:"text",innerHTML:e.item.text},null,8,["innerHTML"])),e.item.collapsed!=null&&e.item.items&&e.item.items.length?(s(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:x,onKeydown:Re(x,["enter"]),tabindex:"0"},[...H[0]||(H[0]=[v("span",{class:"vpi-chevron-right caret-icon"},null,-1)])],32)):m("",!0)],16,ps)):m("",!0),e.item.items&&e.item.items.length?(s(),u("div",ks,[e.depth<5?(s(!0),u(M,{key:0},C(e.item.items,R=>(s(),_(O,{key:R.text,item:R,depth:e.depth+1},null,8,["item","depth"]))),128)):m("",!0)])):m("",!0)]),_:1},8,["class"])}}}),bs=b(_s,[["__scopeId","data-v-66f7eb2a"]]),gs=p({__name:"VPSidebarGroup",props:{items:{}},setup(e){const t=w(!0);let n=null;return U(()=>{n=setTimeout(()=>{n=null,t.value=!1},300)}),Ke(()=>{n!=null&&(clearTimeout(n),n=null)}),(a,o)=>(s(!0),u(M,null,C(e.items,r=>(s(),u("div",{key:r.text,class:N(["group",{"no-transition":t.value}])},[k(bs,{item:r,depth:0},null,8,["item"])],2))),128))}}),$s=b(gs,[["__scopeId","data-v-ccb29e76"]]),ys={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Ps=p({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=F(),a=e,o=w(null),r=we(te?document.body:null);D([a,o],()=>{var h;a.open?(r.value=!0,(h=o.value)==null||h.focus()):r.value=!1},{immediate:!0,flush:"post"});const l=w(0);return D(t,()=>{l.value+=1},{deep:!0}),(h,f)=>i(n)?(s(),u("aside",{key:0,class:N(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:f[0]||(f[0]=We(()=>{},["stop"]))},[f[2]||(f[2]=v("div",{class:"curtain"},null,-1)),v("nav",ys,[f[1]||(f[1]=v("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(h.$slots,"sidebar-nav-before",{},void 0,!0),(s(),_($s,{items:i(t),key:l.value},null,8,["items"])),c(h.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):m("",!0)}}),Ls=b(Ps,[["__scopeId","data-v-60cdee07"]]),Vs=p({__name:"VPSkipLink",setup(e){const{theme:t}=V(),n=Z(),a=w();D(()=>n.path,()=>a.value.focus());function o({target:r}){const l=document.getElementById(decodeURIComponent(r.hash).slice(1));if(l){const h=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",h)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",h),l.focus(),window.scrollTo(0,0)}}return(r,l)=>(s(),u(M,null,[v("span",{ref_key:"backToTop",ref:a,tabindex:"-1"},null,512),v("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o},I(i(t).skipToContentLabel||"Skip to content"),1)],64))}}),Ss=b(Vs,[["__scopeId","data-v-5c217c0c"]]),Ts=p({__name:"Layout",setup(e){const{isOpen:t,open:n,close:a}=F(),o=Z();D(()=>o.path,a),ut(t,a);const{frontmatter:r}=V(),l=qe(),h=g(()=>!!l["home-hero-image"]);return Ne("hero-image-slot-exists",h),(f,$)=>{const T=j("Content");return i(r).layout!==!1?(s(),u("div",{key:0,class:N(["Layout",i(r).pageClass])},[c(f.$slots,"layout-top",{},void 0,!0),k(Ss),k(Qe,{class:"backdrop",show:i(t),onClick:i(a)},null,8,["show","onClick"]),k(ms,null,{"nav-bar-title-before":d(()=>[c(f.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":d(()=>[c(f.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":d(()=>[c(f.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":d(()=>[c(f.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":d(()=>[c(f.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":d(()=>[c(f.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(ra,{open:i(t),onOpenMenu:i(n)},null,8,["open","onOpenMenu"]),k(Ls,{open:i(t)},{"sidebar-nav-before":d(()=>[c(f.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":d(()=>[c(f.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(Rn,null,{"page-top":d(()=>[c(f.$slots,"page-top",{},void 0,!0)]),"page-bottom":d(()=>[c(f.$slots,"page-bottom",{},void 0,!0)]),"not-found":d(()=>[c(f.$slots,"not-found",{},void 0,!0)]),"home-hero-before":d(()=>[c(f.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":d(()=>[c(f.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":d(()=>[c(f.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":d(()=>[c(f.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":d(()=>[c(f.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":d(()=>[c(f.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":d(()=>[c(f.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":d(()=>[c(f.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":d(()=>[c(f.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":d(()=>[c(f.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":d(()=>[c(f.$slots,"doc-before",{},void 0,!0)]),"doc-after":d(()=>[c(f.$slots,"doc-after",{},void 0,!0)]),"doc-top":d(()=>[c(f.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":d(()=>[c(f.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":d(()=>[c(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":d(()=>[c(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":d(()=>[c(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":d(()=>[c(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":d(()=>[c(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":d(()=>[c(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(Yn),c(f.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),_(T,{key:1}))}}}),ws=b(Ts,[["__scopeId","data-v-76809ff5"]]),Ns={Layout:ws},Is={style:{"margin-top":"72px"}},xs={__name:"index",setup(e){const{page:t}=Pe(),n=g(()=>t.value.relativePath);D(n,a,{immediate:!0});async function a(){await fe();try{(window.adsbygoogle=window.adsbygoogle||[]).push({}),console.log("adsbygoogle loaded")}catch(o){console.warn("adsbygoogle error:",o)}}return(o,r)=>(s(),u("div",Is,[(s(),u("ins",{key:n.value,class:"adsbygoogle",style:{display:"block"},"data-ad-client":"ca-pub-5328953201873088","data-ad-slot":"9903011682","data-ad-format":"auto","data-full-width-responsive":"true"}))]))}},Ms={__name:"Layout",setup(e){const{Layout:t}=Ns;return(n,a)=>{const o=j("ClientOnly");return s(),_(i(t),{class:""},{"aside-ads-before":d(()=>[k(o,null,{default:d(()=>[k(xs)]),_:1})]),_:1})}}},As={Layout:Ms,enhanceApp({app:e,router:t,siteData:n}){}};export{As as R,V as u}; +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPAlgoliaSearchBox.Bh0HaW-g.js","assets/chunks/framework.D2Fz4Hoy.js"])))=>i.map(i=>d[i]); +import{_ as ye,d as p,o as s,c as _,T as ue,w as d,a as u,b as m,e as b,u as Pe,i as Be,t as Ee,f as de,g,h as v,j as I,k as i,l as z,m as ie,r as w,n as D,p as Y,q as U,s as Q,v as ve,x as De,y as Fe,z as j,A as N,F as M,B as C,C as Le,D as X,E as k,G as c,H as Ve,I as B,J as K,K as Z,L as G,M as ee,N as Oe,O as Se,P as Ge,Q as fe,R as Te,S as te,U as Ue,V as je,W as we,X as Ne,Y as ze,Z as Re,$ as Ke,a0 as We,a1 as qe}from"./framework.D2Fz4Hoy.js";const ge="G-24PQ0ZF4RG";(async()=>{const{install:e,gtag:t}=await ye(async()=>{const{install:n,gtag:a}=await import("./index.D9Q8CHZq.js").then(o=>o.i);return{install:n,gtag:a}},[]).catch(n=>console.error(n));e(ge),t("js",new Date),t("config",ge)})();const Je={key:0,class:"VPBackdrop"},Ye=p({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(s(),_(ue,{name:"fade"},{default:d(()=>[e.show?(s(),u("div",Je)):m("",!0)]),_:1}))}}),Qe=b(Ye,[["__scopeId","data-v-28d9dc79"]]),V=Pe;function Xe(e,t){let n,a=!1;return()=>{n&&clearTimeout(n),a?n=setTimeout(e,t):(e(),(a=!0)&&setTimeout(()=>a=!1,t))}}function re(e){return e.startsWith("/")?e:`/${e}`}function he(e){const{pathname:t,search:n,hash:a,protocol:o}=new URL(e,"http://a.com");if(Be(e)||e.startsWith("#")||!o.startsWith("http")||!Ee(t))return e;const{site:r}=V(),l=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${n}${a}`);return de(l)}function W({correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:a,theme:o,hash:r}=V(),l=g(()=>{var f,$;return{label:(f=t.value.locales[n.value])==null?void 0:f.label,link:(($=t.value.locales[n.value])==null?void 0:$.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:g(()=>Object.entries(t.value.locales).flatMap(([f,$])=>l.value.label===$.label?[]:{text:$.label,link:Ze($.link||(f==="root"?"/":`/${f}/`),o.value.i18nRouting!==!1&&e,a.value.relativePath.slice(l.value.link.length-1),!t.value.cleanUrls)+r.value})),currentLang:l}}function Ze(e,t,n,a){return t?e.replace(/\/$/,"")+re(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,a?".html":"")):e}const et={class:"NotFound"},tt={class:"code"},nt={class:"title"},at={class:"quote"},ot={class:"action"},st=["href","aria-label"],it=p({__name:"NotFound",setup(e){const{theme:t}=V(),{currentLang:n}=W();return(a,o)=>{var r,l,h,f,$;return s(),u("div",et,[v("p",tt,I(((r=i(t).notFound)==null?void 0:r.code)??"404"),1),v("h1",nt,I(((l=i(t).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),o[0]||(o[0]=v("div",{class:"divider"},null,-1)),v("blockquote",at,I(((h=i(t).notFound)==null?void 0:h.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),v("div",ot,[v("a",{class:"link",href:i(de)(i(n).link),"aria-label":((f=i(t).notFound)==null?void 0:f.linkLabel)??"go to home"},I((($=i(t).notFound)==null?void 0:$.linkText)??"Take me home"),9,st)])])}}}),rt=b(it,[["__scopeId","data-v-f9c08b30"]]);function Ie(e,t){if(Array.isArray(e))return q(e);if(e==null)return[];t=re(t);const n=Object.keys(e).sort((o,r)=>r.split("/").length-o.split("/").length).find(o=>t.startsWith(re(o))),a=n?e[n]:[];return Array.isArray(a)?q(a):q(a.items,a.base)}function lt(e){const t=[];let n=0;for(const a in e){const o=e[a];if(o.items){n=t.push(o);continue}t[n]||t.push({items:[]}),t[n].items.push(o)}return t}function ct(e){const t=[];function n(a){for(const o of a)o.text&&o.link&&t.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&n(o.items)}return n(e),t}function le(e,t){return Array.isArray(t)?t.some(n=>le(e,n)):z(e,t.link)?!0:t.items?le(e,t.items):!1}function q(e,t){return[...e].map(n=>{const a={...n},o=a.base||t;return o&&a.link&&(a.link=o+a.link),a.items&&(a.items=q(a.items,o)),a})}function F(){const{frontmatter:e,page:t,theme:n}=V(),a=ie("(min-width: 960px)"),o=w(!1),r=g(()=>{const x=n.value.sidebar,A=t.value.relativePath;return x?Ie(x,A):[]}),l=w(r.value);D(r,(x,A)=>{JSON.stringify(x)!==JSON.stringify(A)&&(l.value=r.value)});const h=g(()=>e.value.sidebar!==!1&&l.value.length>0&&e.value.layout!=="home"),f=g(()=>$?e.value.aside==null?n.value.aside==="left":e.value.aside==="left":!1),$=g(()=>e.value.layout==="home"?!1:e.value.aside!=null?!!e.value.aside:n.value.aside!==!1),T=g(()=>h.value&&a.value),P=g(()=>h.value?lt(l.value):[]);function y(){o.value=!0}function S(){o.value=!1}function L(){o.value?S():y()}return{isOpen:o,sidebar:l,sidebarGroups:P,hasSidebar:h,hasAside:$,leftAside:f,isSidebarEnabled:T,open:y,close:S,toggle:L}}function ut(e,t){let n;Y(()=>{n=e.value?document.activeElement:void 0}),U(()=>{window.addEventListener("keyup",a)}),Q(()=>{window.removeEventListener("keyup",a)});function a(o){o.key==="Escape"&&e.value&&(t(),n==null||n.focus())}}function dt(e){const{page:t,hash:n}=V(),a=w(!1),o=g(()=>e.value.collapsed!=null),r=g(()=>!!e.value.link),l=w(!1),h=()=>{l.value=z(t.value.relativePath,e.value.link)};D([t,e,n],h),U(h);const f=g(()=>l.value?!0:e.value.items?le(t.value.relativePath,e.value.items):!1),$=g(()=>!!(e.value.items&&e.value.items.length));Y(()=>{a.value=!!(o.value&&e.value.collapsed)}),ve(()=>{(l.value||f.value)&&(a.value=!1)});function T(){o.value&&(a.value=!a.value)}return{collapsed:a,collapsible:o,isLink:r,isActiveLink:l,hasActiveLink:f,hasChildren:$,toggle:T}}function vt(){const{hasSidebar:e}=F(),t=ie("(min-width: 960px)"),n=ie("(min-width: 1280px)");return{isAsideEnabled:g(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const ft=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,ce=[];function xe(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function me(e){const t=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const a=Number(n.tagName[1]);return{element:n,title:ht(n),link:"#"+n.id,level:a}});return mt(t,e)}function ht(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if(ft.test(n.className))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function mt(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[a,o]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;return _t(e,a,o)}function pt(e,t){const{isAsideEnabled:n}=vt(),a=Xe(r,100);let o=null;U(()=>{requestAnimationFrame(r),window.addEventListener("scroll",a)}),De(()=>{l(location.hash)}),Q(()=>{window.removeEventListener("scroll",a)});function r(){if(!n.value)return;const h=window.scrollY,f=window.innerHeight,$=document.body.offsetHeight,T=Math.abs(h+f-$)<1,P=ce.map(({element:S,link:L})=>({link:L,top:kt(S)})).filter(({top:S})=>!Number.isNaN(S)).sort((S,L)=>S.top-L.top);if(!P.length){l(null);return}if(h<1){l(null);return}if(T){l(P[P.length-1].link);return}let y=null;for(const{link:S,top:L}of P){if(L>h+Fe()+4)break;y=S}l(y)}function l(h){o&&o.classList.remove("active"),h==null?o=null:o=e.value.querySelector(`a[href="${decodeURIComponent(h)}"]`);const f=o;f?(f.classList.add("active"),t.value.style.top=f.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function kt(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}function _t(e,t,n){ce.length=0;const a=[],o=[];return e.forEach(r=>{const l={...r,children:[]};let h=o[o.length-1];for(;h&&h.level>=l.level;)o.pop(),h=o[o.length-1];if(l.element.classList.contains("ignore-header")||h&&"shouldIgnore"in h){o.push({level:l.level,shouldIgnore:!0});return}l.level>n||l.level{const o=j("VPDocOutlineItem",!0);return s(),u("ul",{class:N(["VPDocOutlineItem",e.root?"root":"nested"])},[(s(!0),u(M,null,C(e.headers,({children:r,link:l,title:h})=>(s(),u("li",null,[v("a",{class:"outline-link",href:l,onClick:t,title:h},I(h),9,bt),r!=null&&r.length?(s(),_(o,{key:0,headers:r},null,8,["headers"])):m("",!0)]))),256))],2)}}}),Me=b(gt,[["__scopeId","data-v-c7d2d5d0"]]),$t={class:"content"},yt={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Pt=p({__name:"VPDocAsideOutline",setup(e){const{frontmatter:t,theme:n}=V(),a=Le([]);X(()=>{a.value=me(t.value.outline??n.value.outline)});const o=w(),r=w();return pt(o,r),(l,h)=>(s(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:N(["VPDocAsideOutline",{"has-outline":a.value.length>0}]),ref_key:"container",ref:o},[v("div",$t,[v("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),v("div",yt,I(i(xe)(i(n))),1),k(Me,{headers:a.value,root:!0},null,8,["headers"])])],2))}}),Lt=b(Pt,[["__scopeId","data-v-3281fb23"]]),Vt={class:"VPDocAsideCarbonAds"},St=p({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,a)=>(s(),u("div",Vt,[k(i(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),Tt={class:"VPDocAside"},wt=p({__name:"VPDocAside",setup(e){const{theme:t}=V();return(n,a)=>(s(),u("div",Tt,[c(n.$slots,"aside-top",{},void 0,!0),c(n.$slots,"aside-outline-before",{},void 0,!0),k(Lt),c(n.$slots,"aside-outline-after",{},void 0,!0),a[0]||(a[0]=v("div",{class:"spacer"},null,-1)),c(n.$slots,"aside-ads-before",{},void 0,!0),i(t).carbonAds?(s(),_(St,{key:0,"carbon-ads":i(t).carbonAds},null,8,["carbon-ads"])):m("",!0),c(n.$slots,"aside-ads-after",{},void 0,!0),c(n.$slots,"aside-bottom",{},void 0,!0)]))}}),Nt=b(wt,[["__scopeId","data-v-ea2271c7"]]);function It(){const{theme:e,page:t}=V();return g(()=>{const{text:n="Edit this page",pattern:a=""}=e.value.editLink||{};let o;return typeof a=="function"?o=a(t.value):o=a.replace(/:path/g,t.value.filePath),{url:o,text:n}})}function xt(){const{page:e,theme:t,frontmatter:n}=V();return g(()=>{var $,T,P,y,S,L,x,A;const a=Ie(t.value.sidebar,e.value.relativePath),o=ct(a),r=Mt(o,H=>H.link.replace(/[?#].*$/,"")),l=r.findIndex(H=>z(e.value.relativePath,H.link)),h=(($=t.value.docFooter)==null?void 0:$.prev)===!1&&!n.value.prev||n.value.prev===!1,f=((T=t.value.docFooter)==null?void 0:T.next)===!1&&!n.value.next||n.value.next===!1;return{prev:h?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((P=r[l-1])==null?void 0:P.docFooterText)??((y=r[l-1])==null?void 0:y.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((S=r[l-1])==null?void 0:S.link)},next:f?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((L=r[l+1])==null?void 0:L.docFooterText)??((x=r[l+1])==null?void 0:x.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((A=r[l+1])==null?void 0:A.link)}}})}function Mt(e,t){const n=new Set;return e.filter(a=>{const o=t(a);return n.has(o)?!1:n.add(o)})}const E=p({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=g(()=>t.tag??(t.href?"a":"span")),a=g(()=>t.href&&Ve.test(t.href)||t.target==="_blank");return(o,r)=>(s(),_(B(n.value),{class:N(["VPLink",{link:e.href,"vp-external-link-icon":a.value,"no-icon":e.noIcon}]),href:e.href?i(he)(e.href):void 0,target:e.target??(a.value?"_blank":void 0),rel:e.rel??(a.value?"noreferrer":void 0)},{default:d(()=>[c(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Ct={class:"VPLastUpdated"},At=["datetime"],Ht=p({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,lang:a}=V(),o=g(()=>new Date(n.value.lastUpdated)),r=g(()=>o.value.toISOString()),l=w("");return U(()=>{Y(()=>{var h,f,$;l.value=new Intl.DateTimeFormat((f=(h=t.value.lastUpdated)==null?void 0:h.formatOptions)!=null&&f.forceLocale?a.value:void 0,(($=t.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(h,f)=>{var $;return s(),u("p",Ct,[K(I((($=i(t).lastUpdated)==null?void 0:$.text)||i(t).lastUpdatedText||"Last updated")+": ",1),v("time",{datetime:r.value},I(l.value),9,At)])}}}),Bt=b(Ht,[["__scopeId","data-v-261dbf8b"]]),Et={key:0,class:"VPDocFooter"},Dt={key:0,class:"edit-info"},Ft={key:0,class:"edit-link"},Ot={key:1,class:"last-updated"},Gt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Ut={class:"pager"},jt=["innerHTML"],zt=["innerHTML"],Rt={class:"pager"},Kt=["innerHTML"],Wt=["innerHTML"],qt=p({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:a}=V(),o=It(),r=xt(),l=g(()=>t.value.editLink&&a.value.editLink!==!1),h=g(()=>n.value.lastUpdated),f=g(()=>l.value||h.value||r.value.prev||r.value.next);return($,T)=>{var P,y,S,L;return f.value?(s(),u("footer",Et,[c($.$slots,"doc-footer-before",{},void 0,!0),l.value||h.value?(s(),u("div",Dt,[l.value?(s(),u("div",Ft,[k(E,{class:"edit-link-button",href:i(o).url,"no-icon":!0},{default:d(()=>[T[0]||(T[0]=v("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),K(" "+I(i(o).text),1)]),_:1},8,["href"])])):m("",!0),h.value?(s(),u("div",Ot,[k(Bt)])):m("",!0)])):m("",!0),(P=i(r).prev)!=null&&P.link||(y=i(r).next)!=null&&y.link?(s(),u("nav",Gt,[T[1]||(T[1]=v("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),v("div",Ut,[(S=i(r).prev)!=null&&S.link?(s(),_(E,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:d(()=>{var x;return[v("span",{class:"desc",innerHTML:((x=i(t).docFooter)==null?void 0:x.prev)||"Previous page"},null,8,jt),v("span",{class:"title",innerHTML:i(r).prev.text},null,8,zt)]}),_:1},8,["href"])):m("",!0)]),v("div",Rt,[(L=i(r).next)!=null&&L.link?(s(),_(E,{key:0,class:"pager-link next",href:i(r).next.link},{default:d(()=>{var x;return[v("span",{class:"desc",innerHTML:((x=i(t).docFooter)==null?void 0:x.next)||"Next page"},null,8,Kt),v("span",{class:"title",innerHTML:i(r).next.text},null,8,Wt)]}),_:1},8,["href"])):m("",!0)])])):m("",!0)])):m("",!0)}}}),Jt=b(qt,[["__scopeId","data-v-b70cbb92"]]),Yt={class:"container"},Qt={class:"aside-container"},Xt={class:"aside-content"},Zt={class:"content"},en={class:"content-container"},tn={class:"main"},nn=p({__name:"VPDoc",setup(e){const{theme:t}=V(),n=Z(),{hasSidebar:a,hasAside:o,leftAside:r}=F(),l=g(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(h,f)=>{const $=j("Content");return s(),u("div",{class:N(["VPDoc",{"has-sidebar":i(a),"has-aside":i(o)}])},[c(h.$slots,"doc-top",{},void 0,!0),v("div",Yt,[i(o)?(s(),u("div",{key:0,class:N(["aside",{"left-aside":i(r)}])},[f[0]||(f[0]=v("div",{class:"aside-curtain"},null,-1)),v("div",Qt,[v("div",Xt,[k(Nt,null,{"aside-top":d(()=>[c(h.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":d(()=>[c(h.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":d(()=>[c(h.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":d(()=>[c(h.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":d(()=>[c(h.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":d(()=>[c(h.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):m("",!0),v("div",Zt,[v("div",en,[c(h.$slots,"doc-before",{},void 0,!0),v("main",tn,[k($,{class:N(["vp-doc",[l.value,i(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(Jt,null,{"doc-footer-before":d(()=>[c(h.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(h.$slots,"doc-after",{},void 0,!0)])])]),c(h.$slots,"doc-bottom",{},void 0,!0)],2)}}}),an=b(nn,[["__scopeId","data-v-93b7b678"]]),on=p({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(e){const t=e,n=g(()=>t.href&&Ve.test(t.href)),a=g(()=>t.tag||(t.href?"a":"button"));return(o,r)=>(s(),_(B(a.value),{class:N(["VPButton",[e.size,e.theme]]),href:e.href?i(he)(e.href):void 0,target:t.target??(n.value?"_blank":void 0),rel:t.rel??(n.value?"noreferrer":void 0)},{default:d(()=>[K(I(e.text),1)]),_:1},8,["class","href","target","rel"]))}}),sn=b(on,[["__scopeId","data-v-c1b5e92f"]]),rn=["src","alt"],ln=p({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const a=j("VPImage",!0);return e.image?(s(),u(M,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),u("img",G({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:i(de)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,rn)):(s(),u(M,{key:1},[k(a,G({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),k(a,G({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):m("",!0)}}}),J=b(ln,[["__scopeId","data-v-f096d6bf"]]),cn={class:"container"},un={class:"main"},dn={class:"heading"},vn=["innerHTML"],fn=["innerHTML"],hn=["innerHTML"],mn={key:0,class:"actions"},pn={key:0,class:"image"},kn={class:"image-container"},_n=p({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const t=ee("hero-image-slot-exists");return(n,a)=>(s(),u("div",{class:N(["VPHero",{"has-image":e.image||i(t)}])},[v("div",cn,[v("div",un,[c(n.$slots,"home-hero-info-before",{},void 0,!0),c(n.$slots,"home-hero-info",{},()=>[v("h1",dn,[e.name?(s(),u("span",{key:0,innerHTML:e.name,class:"name clip"},null,8,vn)):m("",!0),e.text?(s(),u("span",{key:1,innerHTML:e.text,class:"text"},null,8,fn)):m("",!0)]),e.tagline?(s(),u("p",{key:0,innerHTML:e.tagline,class:"tagline"},null,8,hn)):m("",!0)],!0),c(n.$slots,"home-hero-info-after",{},void 0,!0),e.actions?(s(),u("div",mn,[(s(!0),u(M,null,C(e.actions,o=>(s(),u("div",{key:o.link,class:"action"},[k(sn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):m("",!0),c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),e.image||i(t)?(s(),u("div",pn,[v("div",kn,[a[0]||(a[0]=v("div",{class:"image-bg"},null,-1)),c(n.$slots,"home-hero-image",{},()=>[e.image?(s(),_(J,{key:0,class:"image-src",image:e.image},null,8,["image"])):m("",!0)],!0)])])):m("",!0)])],2))}}),bn=b(_n,[["__scopeId","data-v-db0fa370"]]),gn=p({__name:"VPHomeHero",setup(e){const{frontmatter:t}=V();return(n,a)=>i(t).hero?(s(),_(bn,{key:0,class:"VPHomeHero",name:i(t).hero.name,text:i(t).hero.text,tagline:i(t).hero.tagline,image:i(t).hero.image,actions:i(t).hero.actions},{"home-hero-info-before":d(()=>[c(n.$slots,"home-hero-info-before")]),"home-hero-info":d(()=>[c(n.$slots,"home-hero-info")]),"home-hero-info-after":d(()=>[c(n.$slots,"home-hero-info-after")]),"home-hero-actions-after":d(()=>[c(n.$slots,"home-hero-actions-after")]),"home-hero-image":d(()=>[c(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):m("",!0)}}),$n={class:"box"},yn={key:0,class:"icon"},Pn=["innerHTML"],Ln=["innerHTML"],Vn=["innerHTML"],Sn={key:4,class:"link-text"},Tn={class:"link-text-value"},wn=p({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(s(),_(E,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:d(()=>[v("article",$n,[typeof e.icon=="object"&&e.icon.wrap?(s(),u("div",yn,[k(J,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),_(J,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Pn)):m("",!0),v("h2",{class:"title",innerHTML:e.title},null,8,Ln),e.details?(s(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Vn)):m("",!0),e.linkText?(s(),u("div",Sn,[v("p",Tn,[K(I(e.linkText)+" ",1),n[0]||(n[0]=v("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):m("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Nn=b(wn,[["__scopeId","data-v-376a790b"]]),In={key:0,class:"VPFeatures"},xn={class:"container"},Mn={class:"items"},Cn=p({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=g(()=>{const a=t.features.length;if(a){if(a===2)return"grid-2";if(a===3)return"grid-3";if(a%3===0)return"grid-6";if(a>3)return"grid-4"}else return});return(a,o)=>e.features?(s(),u("div",In,[v("div",xn,[v("div",Mn,[(s(!0),u(M,null,C(e.features,r=>(s(),u("div",{key:r.title,class:N(["item",[n.value]])},[k(Nn,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):m("",!0)}}),An=b(Cn,[["__scopeId","data-v-720b7754"]]),Hn=p({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=V();return(n,a)=>i(t).features?(s(),_(An,{key:0,class:"VPHomeFeatures",features:i(t).features},null,8,["features"])):m("",!0)}}),Bn=p({__name:"VPHomeContent",setup(e){const{width:t}=Oe({initialWidth:0,includeScrollbar:!1});return(n,a)=>(s(),u("div",{class:"vp-doc container",style:Se(i(t)?{"--vp-offset":`calc(50% - ${i(t)/2}px)`}:{})},[c(n.$slots,"default",{},void 0,!0)],4))}}),En=b(Bn,[["__scopeId","data-v-6d62d23d"]]),Dn=p({__name:"VPHome",setup(e){const{frontmatter:t,theme:n}=V();return(a,o)=>{const r=j("Content");return s(),u("div",{class:N(["VPHome",{"external-link-icon-enabled":i(n).externalLinkIcon}])},[c(a.$slots,"home-hero-before",{},void 0,!0),k(gn,null,{"home-hero-info-before":d(()=>[c(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":d(()=>[c(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":d(()=>[c(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":d(()=>[c(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":d(()=>[c(a.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(a.$slots,"home-hero-after",{},void 0,!0),c(a.$slots,"home-features-before",{},void 0,!0),k(Hn),c(a.$slots,"home-features-after",{},void 0,!0),i(t).markdownStyles!==!1?(s(),_(En,{key:0},{default:d(()=>[k(r)]),_:1})):(s(),_(r,{key:1}))],2)}}}),Fn=b(Dn,[["__scopeId","data-v-4a86bbdf"]]),On={},Gn={class:"VPPage"};function Un(e,t){const n=j("Content");return s(),u("div",Gn,[c(e.$slots,"page-top"),k(n),c(e.$slots,"page-bottom")])}const jn=b(On,[["render",Un]]),zn=p({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=V(),{hasSidebar:a}=F();return(o,r)=>(s(),u("div",{class:N(["VPContent",{"has-sidebar":i(a),"is-home":i(n).layout==="home"}]),id:"VPContent"},[i(t).isNotFound?c(o.$slots,"not-found",{key:0},()=>[k(rt)],!0):i(n).layout==="page"?(s(),_(jn,{key:1},{"page-top":d(()=>[c(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":d(()=>[c(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(n).layout==="home"?(s(),_(Fn,{key:2},{"home-hero-before":d(()=>[c(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":d(()=>[c(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":d(()=>[c(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":d(()=>[c(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":d(()=>[c(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":d(()=>[c(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":d(()=>[c(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":d(()=>[c(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":d(()=>[c(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(n).layout&&i(n).layout!=="doc"?(s(),_(B(i(n).layout),{key:3})):(s(),_(an,{key:4},{"doc-top":d(()=>[c(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":d(()=>[c(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":d(()=>[c(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":d(()=>[c(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":d(()=>[c(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":d(()=>[c(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":d(()=>[c(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":d(()=>[c(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":d(()=>[c(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":d(()=>[c(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":d(()=>[c(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Rn=b(zn,[["__scopeId","data-v-b2712108"]]),Kn={class:"container"},Wn=["innerHTML"],qn=["innerHTML"],Jn=p({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=V(),{hasSidebar:a}=F();return(o,r)=>i(t).footer&&i(n).footer!==!1?(s(),u("footer",{key:0,class:N(["VPFooter",{"has-sidebar":i(a)}])},[v("div",Kn,[i(t).footer.message?(s(),u("p",{key:0,class:"message",innerHTML:i(t).footer.message},null,8,Wn)):m("",!0),i(t).footer.copyright?(s(),u("p",{key:1,class:"copyright",innerHTML:i(t).footer.copyright},null,8,qn)):m("",!0)])],2)):m("",!0)}}),Yn=b(Jn,[["__scopeId","data-v-b372df82"]]);function Qn(){const{theme:e,frontmatter:t}=V(),n=Le([]),a=g(()=>n.value.length>0);return X(()=>{n.value=me(t.value.outline??e.value.outline)}),{headers:n,hasLocalNav:a}}const Xn={class:"menu-text"},Zn={class:"header"},ea={class:"outline"},ta=p({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=V(),a=w(!1),o=w(0),r=w(),l=w();function h(P){var y;(y=r.value)!=null&&y.contains(P.target)||(a.value=!1)}D(a,P=>{if(P){document.addEventListener("click",h);return}document.removeEventListener("click",h)}),Ge("Escape",()=>{a.value=!1}),X(()=>{a.value=!1});function f(){a.value=!a.value,o.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function $(P){P.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),fe(()=>{a.value=!1}))}function T(){a.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(P,y)=>(s(),u("div",{class:"VPLocalNavOutlineDropdown",style:Se({"--vp-vh":o.value+"px"}),ref_key:"main",ref:r},[e.headers.length>0?(s(),u("button",{key:0,onClick:f,class:N({open:a.value})},[v("span",Xn,I(i(xe)(i(n))),1),y[0]||(y[0]=v("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(s(),u("button",{key:1,onClick:T},I(i(n).returnToTopLabel||"Return to top"),1)),k(ue,{name:"flyout"},{default:d(()=>[a.value?(s(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:$},[v("div",Zn,[v("a",{class:"top-link",href:"#",onClick:T},I(i(n).returnToTopLabel||"Return to top"),1)]),v("div",ea,[k(Me,{headers:e.headers},null,8,["headers"])])],512)):m("",!0)]),_:1})],4))}}),na=b(ta,[["__scopeId","data-v-dd9b5a2b"]]),aa={class:"container"},oa=["aria-expanded"],sa={class:"menu-text"},ia=p({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t,frontmatter:n}=V(),{hasSidebar:a}=F(),{headers:o}=Qn(),{y:r}=Te(),l=w(0);U(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),X(()=>{o.value=me(n.value.outline??t.value.outline)});const h=g(()=>o.value.length===0),f=g(()=>h.value&&!a.value),$=g(()=>({VPLocalNav:!0,"has-sidebar":a.value,empty:h.value,fixed:f.value}));return(T,P)=>i(n).layout!=="home"&&(!f.value||i(r)>=l.value)?(s(),u("div",{key:0,class:N($.value)},[v("div",aa,[i(a)?(s(),u("button",{key:0,class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:P[0]||(P[0]=y=>T.$emit("open-menu"))},[P[1]||(P[1]=v("span",{class:"vpi-align-left menu-icon"},null,-1)),v("span",sa,I(i(t).sidebarMenuLabel||"Menu"),1)],8,oa)):m("",!0),k(na,{headers:i(o),navHeight:l.value},null,8,["headers","navHeight"])])],2)):m("",!0)}}),ra=b(ia,[["__scopeId","data-v-2b0c5ae1"]]);function la(){const e=w(!1);function t(){e.value=!0,window.addEventListener("resize",o)}function n(){e.value=!1,window.removeEventListener("resize",o)}function a(){e.value?n():t()}function o(){window.outerWidth>=768&&n()}const r=Z();return D(()=>r.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:a}}const ca={},ua={class:"VPSwitch",type:"button",role:"switch"},da={class:"check"},va={key:0,class:"icon"};function fa(e,t){return s(),u("button",ua,[v("span",da,[e.$slots.default?(s(),u("span",va,[c(e.$slots,"default",{},void 0,!0)])):m("",!0)])])}const ha=b(ca,[["render",fa],["__scopeId","data-v-66d4d931"]]),ma=p({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=V(),a=ee("toggle-appearance",()=>{t.value=!t.value}),o=w("");return ve(()=>{o.value=t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme"}),(r,l)=>(s(),_(ha,{title:o.value,class:"VPSwitchAppearance","aria-checked":i(t),onClick:i(a)},{default:d(()=>[...l[0]||(l[0]=[v("span",{class:"vpi-sun sun"},null,-1),v("span",{class:"vpi-moon moon"},null,-1)])]),_:1},8,["title","aria-checked","onClick"]))}}),pe=b(ma,[["__scopeId","data-v-73828c81"]]),pa={key:0,class:"VPNavBarAppearance"},ka=p({__name:"VPNavBarAppearance",setup(e){const{site:t}=V();return(n,a)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",pa,[k(pe)])):m("",!0)}}),_a=b(ka,[["__scopeId","data-v-cac39bab"]]),ke=w();let Ce=!1,se=0;function ba(e){const t=w(!1);if(te){!Ce&&ga(),se++;const n=D(ke,a=>{var o,r,l;a===e.el.value||(o=e.el.value)!=null&&o.contains(a)?(t.value=!0,(r=e.onFocus)==null||r.call(e)):(t.value=!1,(l=e.onBlur)==null||l.call(e))});Q(()=>{n(),se--,se||$a()})}return Ue(t)}function ga(){document.addEventListener("focusin",Ae),Ce=!0,ke.value=document.activeElement}function $a(){document.removeEventListener("focusin",Ae)}function Ae(){ke.value=document.activeElement}const ya={class:"VPMenuLink"},Pa=["innerHTML"],La=p({__name:"VPMenuLink",props:{item:{}},setup(e){const{page:t}=V();return(n,a)=>(s(),u("div",ya,[k(E,{class:N({active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon},{default:d(()=>[v("span",{innerHTML:e.item.text},null,8,Pa)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),ne=b(La,[["__scopeId","data-v-0c070bce"]]),Va={class:"VPMenuGroup"},Sa={key:0,class:"title"},Ta=p({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Va,[e.text?(s(),u("p",Sa,I(e.text),1)):m("",!0),(s(!0),u(M,null,C(e.items,a=>(s(),u(M,null,["link"in a?(s(),_(ne,{key:0,item:a},null,8,["item"])):m("",!0)],64))),256))]))}}),wa=b(Ta,[["__scopeId","data-v-95d15443"]]),Na={class:"VPMenu"},Ia={key:0,class:"items"},xa=p({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(s(),u("div",Na,[e.items?(s(),u("div",Ia,[(s(!0),u(M,null,C(e.items,a=>(s(),u(M,{key:JSON.stringify(a)},["link"in a?(s(),_(ne,{key:0,item:a},null,8,["item"])):"component"in a?(s(),_(B(a.component),G({key:1,ref_for:!0},a.props),null,16)):(s(),_(wa,{key:2,text:a.text,items:a.items},null,8,["text","items"]))],64))),128))])):m("",!0),c(t.$slots,"default",{},void 0,!0)]))}}),Ma=b(xa,[["__scopeId","data-v-39ec0372"]]),Ca=["aria-expanded","aria-label"],Aa={key:0,class:"text"},Ha=["innerHTML"],Ba={key:1,class:"vpi-more-horizontal icon"},Ea={class:"menu"},Da=p({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=w(!1),n=w();ba({el:n,onBlur:a});function a(){t.value=!1}return(o,r)=>(s(),u("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=l=>t.value=!0),onMouseleave:r[2]||(r[2]=l=>t.value=!1)},[v("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:r[0]||(r[0]=l=>t.value=!t.value)},[e.button||e.icon?(s(),u("span",Aa,[e.icon?(s(),u("span",{key:0,class:N([e.icon,"option-icon"])},null,2)):m("",!0),e.button?(s(),u("span",{key:1,innerHTML:e.button},null,8,Ha)):m("",!0),r[3]||(r[3]=v("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(s(),u("span",Ba))],8,Ca),v("div",Ea,[k(Ma,{items:e.items},{default:d(()=>[c(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),_e=b(Da,[["__scopeId","data-v-3f28edee"]]),Fa=["href","aria-label","innerHTML"],Oa=p({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(e){const t=e,n=w();U(async()=>{var r;await fe();const o=(r=n.value)==null?void 0:r.children[0];o instanceof HTMLElement&&o.className.startsWith("vpi-social-")&&(getComputedStyle(o).maskImage||getComputedStyle(o).webkitMaskImage)==="none"&&o.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${t.icon}.svg')`)});const a=g(()=>typeof t.icon=="object"?t.icon.svg:``);return(o,r)=>(s(),u("a",{ref_key:"el",ref:n,class:"VPSocialLink no-icon",href:e.link,"aria-label":e.ariaLabel??(typeof e.icon=="string"?e.icon:""),target:"_blank",rel:"noopener",innerHTML:a.value},null,8,Fa))}}),Ga=b(Oa,[["__scopeId","data-v-29bd0169"]]),Ua={class:"VPSocialLinks"},ja=p({__name:"VPSocialLinks",props:{links:{}},setup(e){return(t,n)=>(s(),u("div",Ua,[(s(!0),u(M,null,C(e.links,({link:a,icon:o,ariaLabel:r})=>(s(),_(Ga,{key:a,icon:o,link:a,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),be=b(ja,[["__scopeId","data-v-80ce7203"]]),za={key:0,class:"group translations"},Ra={class:"trans-title"},Ka={key:1,class:"group"},Wa={class:"item appearance"},qa={class:"label"},Ja={class:"appearance-action"},Ya={key:2,class:"group"},Qa={class:"item social-links"},Xa=p({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=V(),{localeLinks:a,currentLang:o}=W({correspondingLink:!0}),r=g(()=>a.value.length&&o.value.label||t.value.appearance||n.value.socialLinks);return(l,h)=>r.value?(s(),_(_e,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:d(()=>[i(a).length&&i(o).label?(s(),u("div",za,[v("p",Ra,I(i(o).label),1),(s(!0),u(M,null,C(i(a),f=>(s(),_(ne,{key:f.link,item:f},null,8,["item"]))),128))])):m("",!0),i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Ka,[v("div",Wa,[v("p",qa,I(i(n).darkModeSwitchLabel||"Appearance"),1),v("div",Ja,[k(pe)])])])):m("",!0),i(n).socialLinks?(s(),u("div",Ya,[v("div",Qa,[k(be,{class:"social-links-list",links:i(n).socialLinks},null,8,["links"])])])):m("",!0)]),_:1})):m("",!0)}}),Za=b(Xa,[["__scopeId","data-v-bc8ca248"]]),eo=["aria-expanded"],to=p({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(s(),u("button",{type:"button",class:N(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=a=>t.$emit("click"))},[...n[1]||(n[1]=[v("span",{class:"container"},[v("span",{class:"top"}),v("span",{class:"middle"}),v("span",{class:"bottom"})],-1)])],10,eo))}}),no=b(to,[["__scopeId","data-v-4f789efa"]]),ao=["innerHTML"],oo=p({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const{page:t}=V();return(n,a)=>(s(),_(E,{class:N({VPNavBarMenuLink:!0,active:i(z)(i(t).relativePath,e.item.activeMatch||e.item.link,!!e.item.activeMatch)}),href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,tabindex:"0"},{default:d(()=>[v("span",{innerHTML:e.item.text},null,8,ao)]),_:1},8,["class","href","target","rel","no-icon"]))}}),so=b(oo,[["__scopeId","data-v-a4527372"]]),io=p({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=V(),a=r=>"component"in r?!1:"link"in r?z(n.value.relativePath,r.link,!!t.item.activeMatch):r.items.some(a),o=g(()=>a(t.item));return(r,l)=>(s(),_(_e,{class:N({VPNavBarMenuGroup:!0,active:i(z)(i(n).relativePath,e.item.activeMatch,!!e.item.activeMatch)||o.value}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),ro={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},lo=p({__name:"VPNavBarMenu",setup(e){const{theme:t}=V();return(n,a)=>i(t).nav?(s(),u("nav",ro,[a[0]||(a[0]=v("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(s(!0),u(M,null,C(i(t).nav,o=>(s(),u(M,{key:JSON.stringify(o)},["link"in o?(s(),_(so,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props),null,16)):(s(),_(io,{key:2,item:o},null,8,["item"]))],64))),128))])):m("",!0)}}),co=b(lo,[["__scopeId","data-v-d39706cd"]]);function uo(e){const{localeIndex:t,theme:n}=V();function a(o){var L,x,A;const r=o.split("."),l=(L=n.value.search)==null?void 0:L.options,h=l&&typeof l=="object",f=h&&((A=(x=l.locales)==null?void 0:x[t.value])==null?void 0:A.translations)||null,$=h&&l.translations||null;let T=f,P=$,y=e;const S=r.pop();for(const H of r){let O=null;const R=y==null?void 0:y[H];R&&(O=y=R);const ae=P==null?void 0:P[H];ae&&(O=P=ae);const oe=T==null?void 0:T[H];oe&&(O=T=oe),R||(y=O),ae||(P=O),oe||(T=O)}return(T==null?void 0:T[S])??(P==null?void 0:P[S])??(y==null?void 0:y[S])??""}return a}const vo=["aria-label"],fo={class:"DocSearch-Button-Container"},ho={class:"DocSearch-Button-Placeholder"},$e=p({__name:"VPNavBarSearchButton",setup(e){const n=uo({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(a,o)=>(s(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(n)("button.buttonAriaLabel")},[v("span",fo,[o[0]||(o[0]=v("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),v("span",ho,I(i(n)("button.buttonText")),1)]),o[1]||(o[1]=v("span",{class:"DocSearch-Button-Keys"},[v("kbd",{class:"DocSearch-Button-Key"}),v("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,vo))}}),mo={class:"VPNavBarSearch"},po={id:"local-search"},ko={key:1,id:"docsearch"},_o=p({__name:"VPNavBarSearch",setup(e){const t=()=>null,n=je(()=>ye(()=>import("./VPAlgoliaSearchBox.Bh0HaW-g.js"),__vite__mapDeps([0,1]))),{theme:a}=V(),o=w(!1),r=w(!1),l=()=>{const y="VPAlgoliaPreconnect";(window.requestIdleCallback||setTimeout)(()=>{var x;const L=document.createElement("link");L.id=y,L.rel="preconnect",L.href=`https://${(((x=a.value.search)==null?void 0:x.options)??a.value.algolia).appId}-dsn.algolia.net`,L.crossOrigin="",document.head.appendChild(L)})};U(()=>{l();const y=L=>{(L.key.toLowerCase()==="k"&&(L.metaKey||L.ctrlKey)||!$(L)&&L.key==="/")&&(L.preventDefault(),h(),S())},S=()=>{window.removeEventListener("keydown",y)};window.addEventListener("keydown",y),Q(S)});function h(){o.value||(o.value=!0,setTimeout(f,16))}function f(){const y=new Event("keydown");y.key="k",y.metaKey=!0,window.dispatchEvent(y),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||f()},16)}function $(y){const S=y.target,L=S.tagName;return S.isContentEditable||L==="INPUT"||L==="SELECT"||L==="TEXTAREA"}const T=w(!1),P="algolia";return(y,S)=>{var L;return s(),u("div",mo,[i(P)==="local"?(s(),u(M,{key:0},[T.value?(s(),_(i(t),{key:0,onClose:S[0]||(S[0]=x=>T.value=!1)})):m("",!0),v("div",po,[k($e,{onClick:S[1]||(S[1]=x=>T.value=!0)})])],64)):i(P)==="algolia"?(s(),u(M,{key:1},[o.value?(s(),_(i(n),{key:0,algolia:((L=i(a).search)==null?void 0:L.options)??i(a).algolia,onVnodeBeforeMount:S[2]||(S[2]=x=>r.value=!0)},null,8,["algolia"])):m("",!0),r.value?m("",!0):(s(),u("div",ko,[k($e,{onClick:h})]))],64)):m("",!0)])}}}),bo=p({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=V();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavBarSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),go=b(bo,[["__scopeId","data-v-0d43bdb9"]]),$o=["href","rel","target"],yo=["innerHTML"],Po={key:2},Lo=p({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=V(),{hasSidebar:a}=F(),{currentLang:o}=W(),r=g(()=>{var f;return typeof n.value.logoLink=="string"?n.value.logoLink:(f=n.value.logoLink)==null?void 0:f.link}),l=g(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.rel}),h=g(()=>{var f;return typeof n.value.logoLink=="string"||(f=n.value.logoLink)==null?void 0:f.target});return(f,$)=>(s(),u("div",{class:N(["VPNavBarTitle",{"has-sidebar":i(a)}])},[v("a",{class:"title",href:r.value??i(he)(i(o).link),rel:l.value,target:h.value},[c(f.$slots,"nav-bar-title-before",{},void 0,!0),i(n).logo?(s(),_(J,{key:0,class:"logo",image:i(n).logo},null,8,["image"])):m("",!0),i(n).siteTitle?(s(),u("span",{key:1,innerHTML:i(n).siteTitle},null,8,yo)):i(n).siteTitle===void 0?(s(),u("span",Po,I(i(t).title),1)):m("",!0),c(f.$slots,"nav-bar-title-after",{},void 0,!0)],8,$o)],2))}}),Vo=b(Lo,[["__scopeId","data-v-8d48b877"]]),So={class:"items"},To={class:"title"},wo=p({__name:"VPNavBarTranslations",setup(e){const{theme:t}=V(),{localeLinks:n,currentLang:a}=W({correspondingLink:!0});return(o,r)=>i(n).length&&i(a).label?(s(),_(_e,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(t).langMenuLabel||"Change language"},{default:d(()=>[v("div",So,[v("p",To,I(i(a).label),1),(s(!0),u(M,null,C(i(n),l=>(s(),_(ne,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):m("",!0)}}),No=b(wo,[["__scopeId","data-v-33dab750"]]),Io={class:"wrapper"},xo={class:"container"},Mo={class:"title"},Co={class:"content"},Ao={class:"content-body"},Ho=p({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const t=e,{y:n}=Te(),{hasSidebar:a}=F(),{frontmatter:o}=V(),r=w({});return ve(()=>{r.value={"has-sidebar":a.value,home:o.value.layout==="home",top:n.value===0,"screen-open":t.isScreenOpen}}),(l,h)=>(s(),u("div",{class:N(["VPNavBar",r.value])},[v("div",Io,[v("div",xo,[v("div",Mo,[k(Vo,null,{"nav-bar-title-before":d(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":d(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),v("div",Co,[v("div",Ao,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),k(_o,{class:"search"}),k(co,{class:"menu"}),k(No,{class:"translations"}),k(_a,{class:"appearance"}),k(go,{class:"social-links"}),k(Za,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),k(no,{class:"hamburger",active:e.isScreenOpen,onClick:h[0]||(h[0]=f=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),h[1]||(h[1]=v("div",{class:"divider"},[v("div",{class:"divider-line"})],-1))],2))}}),Bo=b(Ho,[["__scopeId","data-v-bc6dd710"]]),Eo={key:0,class:"VPNavScreenAppearance"},Do={class:"text"},Fo=p({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=V();return(a,o)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(s(),u("div",Eo,[v("p",Do,I(i(n).darkModeSwitchLabel||"Appearance"),1),k(pe)])):m("",!0)}}),Oo=b(Fo,[["__scopeId","data-v-9da1e4ae"]]),Go=["innerHTML"],Uo=p({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=ee("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:d(()=>[v("span",{innerHTML:e.item.text},null,8,Go)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),jo=b(Uo,[["__scopeId","data-v-e11bf1a5"]]),zo=["innerHTML"],Ro=p({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=ee("close-screen");return(n,a)=>(s(),_(E,{class:"VPNavScreenMenuGroupLink",href:e.item.link,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(t)},{default:d(()=>[v("span",{innerHTML:e.item.text},null,8,zo)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),He=b(Ro,[["__scopeId","data-v-0ac9b15a"]]),Ko={class:"VPNavScreenMenuGroupSection"},Wo={key:0,class:"title"},qo=p({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(s(),u("div",Ko,[e.text?(s(),u("p",Wo,I(e.text),1)):m("",!0),(s(!0),u(M,null,C(e.items,a=>(s(),_(He,{key:a.text,item:a},null,8,["item"]))),128))]))}}),Jo=b(qo,[["__scopeId","data-v-8c61599d"]]),Yo=["aria-controls","aria-expanded"],Qo=["innerHTML"],Xo=["id"],Zo={key:0,class:"item"},es={key:1,class:"item"},ts={key:2,class:"group"},ns=p({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=w(!1),a=g(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function o(){n.value=!n.value}return(r,l)=>(s(),u("div",{class:N(["VPNavScreenMenuGroup",{open:n.value}])},[v("button",{class:"button","aria-controls":a.value,"aria-expanded":n.value,onClick:o},[v("span",{class:"button-text",innerHTML:e.text},null,8,Qo),l[0]||(l[0]=v("span",{class:"vpi-plus button-icon"},null,-1))],8,Yo),v("div",{id:a.value,class:"items"},[(s(!0),u(M,null,C(e.items,h=>(s(),u(M,{key:JSON.stringify(h)},["link"in h?(s(),u("div",Zo,[k(He,{item:h},null,8,["item"])])):"component"in h?(s(),u("div",es,[(s(),_(B(h.component),G({ref_for:!0},h.props,{"screen-menu":""}),null,16))])):(s(),u("div",ts,[k(Jo,{text:h.text,items:h.items},null,8,["text","items"])]))],64))),128))],8,Xo)],2))}}),as=b(ns,[["__scopeId","data-v-a12a8bb1"]]),os={key:0,class:"VPNavScreenMenu"},ss=p({__name:"VPNavScreenMenu",setup(e){const{theme:t}=V();return(n,a)=>i(t).nav?(s(),u("nav",os,[(s(!0),u(M,null,C(i(t).nav,o=>(s(),u(M,{key:JSON.stringify(o)},["link"in o?(s(),_(jo,{key:0,item:o},null,8,["item"])):"component"in o?(s(),_(B(o.component),G({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(s(),_(as,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):m("",!0)}}),is=p({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=V();return(n,a)=>i(t).socialLinks?(s(),_(be,{key:0,class:"VPNavScreenSocialLinks",links:i(t).socialLinks},null,8,["links"])):m("",!0)}}),rs={class:"list"},ls=p({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=W({correspondingLink:!0}),a=w(!1);function o(){a.value=!a.value}return(r,l)=>i(t).length&&i(n).label?(s(),u("div",{key:0,class:N(["VPNavScreenTranslations",{open:a.value}])},[v("button",{class:"title",onClick:o},[l[0]||(l[0]=v("span",{class:"vpi-languages icon lang"},null,-1)),K(" "+I(i(n).label)+" ",1),l[1]||(l[1]=v("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),v("ul",rs,[(s(!0),u(M,null,C(i(t),h=>(s(),u("li",{key:h.link,class:"item"},[k(E,{class:"link",href:h.link},{default:d(()=>[K(I(h.text),1)]),_:2},1032,["href"])]))),128))])],2)):m("",!0)}}),cs=b(ls,[["__scopeId","data-v-d392ff81"]]),us={class:"container"},ds=p({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=w(null),n=we(te?document.body:null);return(a,o)=>(s(),_(ue,{name:"fade",onEnter:o[0]||(o[0]=r=>n.value=!0),onAfterLeave:o[1]||(o[1]=r=>n.value=!1)},{default:d(()=>[e.open?(s(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:t,id:"VPNavScreen"},[v("div",us,[c(a.$slots,"nav-screen-content-before",{},void 0,!0),k(ss,{class:"menu"}),k(cs,{class:"translations"}),k(Oo,{class:"appearance"}),k(is,{class:"social-links"}),c(a.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):m("",!0)]),_:3}))}}),vs=b(ds,[["__scopeId","data-v-2744c432"]]),fs={key:0,class:"VPNav"},hs=p({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:a}=la(),{frontmatter:o}=V(),r=g(()=>o.value.navbar!==!1);return Ne("close-screen",n),Y(()=>{te&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(l,h)=>r.value?(s(),u("header",fs,[k(Bo,{"is-screen-open":i(t),onToggleScreen:i(a)},{"nav-bar-title-before":d(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":d(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":d(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":d(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(vs,{open:i(t)},{"nav-screen-content-before":d(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":d(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):m("",!0)}}),ms=b(hs,[["__scopeId","data-v-393b4581"]]),ps=["role","tabindex"],ks={key:1,class:"items"},_s=p({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:a,isLink:o,isActiveLink:r,hasActiveLink:l,hasChildren:h,toggle:f}=dt(g(()=>t.item)),$=g(()=>h.value?"section":"div"),T=g(()=>o.value?"a":"div"),P=g(()=>h.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),y=g(()=>o.value?void 0:"button"),S=g(()=>[[`level-${t.depth}`],{collapsible:a.value},{collapsed:n.value},{"is-link":o.value},{"is-active":r.value},{"has-active":l.value}]);function L(A){"key"in A&&A.key!=="Enter"||!t.item.link&&f()}function x(){t.item.link&&f()}return(A,H)=>{const O=j("VPSidebarItem",!0);return s(),_(B($.value),{class:N(["VPSidebarItem",S.value])},{default:d(()=>[e.item.text?(s(),u("div",G({key:0,class:"item",role:y.value},ze(e.item.items?{click:L,keydown:L}:{},!0),{tabindex:e.item.items&&0}),[H[1]||(H[1]=v("div",{class:"indicator"},null,-1)),e.item.link?(s(),_(E,{key:0,tag:T.value,class:"link",href:e.item.link,rel:e.item.rel,target:e.item.target},{default:d(()=>[(s(),_(B(P.value),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),_(B(P.value),{key:1,class:"text",innerHTML:e.item.text},null,8,["innerHTML"])),e.item.collapsed!=null&&e.item.items&&e.item.items.length?(s(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:x,onKeydown:Re(x,["enter"]),tabindex:"0"},[...H[0]||(H[0]=[v("span",{class:"vpi-chevron-right caret-icon"},null,-1)])],32)):m("",!0)],16,ps)):m("",!0),e.item.items&&e.item.items.length?(s(),u("div",ks,[e.depth<5?(s(!0),u(M,{key:0},C(e.item.items,R=>(s(),_(O,{key:R.text,item:R,depth:e.depth+1},null,8,["item","depth"]))),128)):m("",!0)])):m("",!0)]),_:1},8,["class"])}}}),bs=b(_s,[["__scopeId","data-v-60211452"]]),gs=p({__name:"VPSidebarGroup",props:{items:{}},setup(e){const t=w(!0);let n=null;return U(()=>{n=setTimeout(()=>{n=null,t.value=!1},300)}),Ke(()=>{n!=null&&(clearTimeout(n),n=null)}),(a,o)=>(s(!0),u(M,null,C(e.items,r=>(s(),u("div",{key:r.text,class:N(["group",{"no-transition":t.value}])},[k(bs,{item:r,depth:0},null,8,["item"])],2))),128))}}),$s=b(gs,[["__scopeId","data-v-a4b6e0b6"]]),ys={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Ps=p({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=F(),a=e,o=w(null),r=we(te?document.body:null);D([a,o],()=>{var h;a.open?(r.value=!0,(h=o.value)==null||h.focus()):r.value=!1},{immediate:!0,flush:"post"});const l=w(0);return D(t,()=>{l.value+=1},{deep:!0}),(h,f)=>i(n)?(s(),u("aside",{key:0,class:N(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:o,onClick:f[0]||(f[0]=We(()=>{},["stop"]))},[f[2]||(f[2]=v("div",{class:"curtain"},null,-1)),v("nav",ys,[f[1]||(f[1]=v("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(h.$slots,"sidebar-nav-before",{},void 0,!0),(s(),_($s,{items:i(t),key:l.value},null,8,["items"])),c(h.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):m("",!0)}}),Ls=b(Ps,[["__scopeId","data-v-94cb84fa"]]),Vs=p({__name:"VPSkipLink",setup(e){const{theme:t}=V(),n=Z(),a=w();D(()=>n.path,()=>a.value.focus());function o({target:r}){const l=document.getElementById(decodeURIComponent(r.hash).slice(1));if(l){const h=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",h)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",h),l.focus(),window.scrollTo(0,0)}}return(r,l)=>(s(),u(M,null,[v("span",{ref_key:"backToTop",ref:a,tabindex:"-1"},null,512),v("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o},I(i(t).skipToContentLabel||"Skip to content"),1)],64))}}),Ss=b(Vs,[["__scopeId","data-v-d43c41b1"]]),Ts=p({__name:"Layout",setup(e){const{isOpen:t,open:n,close:a}=F(),o=Z();D(()=>o.path,a),ut(t,a);const{frontmatter:r}=V(),l=qe(),h=g(()=>!!l["home-hero-image"]);return Ne("hero-image-slot-exists",h),(f,$)=>{const T=j("Content");return i(r).layout!==!1?(s(),u("div",{key:0,class:N(["Layout",i(r).pageClass])},[c(f.$slots,"layout-top",{},void 0,!0),k(Ss),k(Qe,{class:"backdrop",show:i(t),onClick:i(a)},null,8,["show","onClick"]),k(ms,null,{"nav-bar-title-before":d(()=>[c(f.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":d(()=>[c(f.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":d(()=>[c(f.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":d(()=>[c(f.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":d(()=>[c(f.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":d(()=>[c(f.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(ra,{open:i(t),onOpenMenu:i(n)},null,8,["open","onOpenMenu"]),k(Ls,{open:i(t)},{"sidebar-nav-before":d(()=>[c(f.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":d(()=>[c(f.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(Rn,null,{"page-top":d(()=>[c(f.$slots,"page-top",{},void 0,!0)]),"page-bottom":d(()=>[c(f.$slots,"page-bottom",{},void 0,!0)]),"not-found":d(()=>[c(f.$slots,"not-found",{},void 0,!0)]),"home-hero-before":d(()=>[c(f.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":d(()=>[c(f.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":d(()=>[c(f.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":d(()=>[c(f.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":d(()=>[c(f.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":d(()=>[c(f.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":d(()=>[c(f.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":d(()=>[c(f.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":d(()=>[c(f.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":d(()=>[c(f.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":d(()=>[c(f.$slots,"doc-before",{},void 0,!0)]),"doc-after":d(()=>[c(f.$slots,"doc-after",{},void 0,!0)]),"doc-top":d(()=>[c(f.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":d(()=>[c(f.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":d(()=>[c(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":d(()=>[c(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":d(()=>[c(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":d(()=>[c(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":d(()=>[c(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":d(()=>[c(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(Yn),c(f.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),_(T,{key:1}))}}}),ws=b(Ts,[["__scopeId","data-v-e9797c95"]]),Ns={Layout:ws},Is={style:{"margin-top":"72px"}},xs={__name:"index",setup(e){const{page:t}=Pe(),n=g(()=>t.value.relativePath);D(n,a,{immediate:!0});async function a(){await fe();try{(window.adsbygoogle=window.adsbygoogle||[]).push({}),console.log("adsbygoogle loaded")}catch(o){console.warn("adsbygoogle error:",o)}}return(o,r)=>(s(),u("div",Is,[(s(),u("ins",{key:n.value,class:"adsbygoogle",style:{display:"block"},"data-ad-client":"ca-pub-5328953201873088","data-ad-slot":"9903011682","data-ad-format":"auto","data-full-width-responsive":"true"}))]))}},Ms={__name:"Layout",setup(e){const{Layout:t}=Ns;return(n,a)=>{const o=j("ClientOnly");return s(),_(i(t),{class:""},{"aside-ads-before":d(()=>[k(o,null,{default:d(()=>[k(xs)]),_:1})]),_:1})}}},As={Layout:Ms,enhanceApp({app:e,router:t,siteData:n}){}};export{As as R,V as u}; diff --git a/assets/contact.md.CFGLvHVJ.js b/assets/contact.md.hcol2kXC.js similarity index 90% rename from assets/contact.md.CFGLvHVJ.js rename to assets/contact.md.hcol2kXC.js index 452b349ef..5ead84a28 100644 --- a/assets/contact.md.CFGLvHVJ.js +++ b/assets/contact.md.hcol2kXC.js @@ -1 +1 @@ -import{e as l,o as n,a as o,h as t,J as e}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"en/contact.md","lastUpdated":1776916170000}'),r={name:"contact.md"};function s(c,a,i,d,m,u){return n(),o("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("Email: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("WeChat: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default}; +import{e as l,o as n,a as o,h as t,J as e}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"en/contact.md","lastUpdated":1777999882000}'),r={name:"contact.md"};function s(c,a,i,d,m,u){return n(),o("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("Email: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("WeChat: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default}; diff --git a/assets/contact.md.CFGLvHVJ.lean.js b/assets/contact.md.hcol2kXC.lean.js similarity index 90% rename from assets/contact.md.CFGLvHVJ.lean.js rename to assets/contact.md.hcol2kXC.lean.js index 452b349ef..5ead84a28 100644 --- a/assets/contact.md.CFGLvHVJ.lean.js +++ b/assets/contact.md.hcol2kXC.lean.js @@ -1 +1 @@ -import{e as l,o as n,a as o,h as t,J as e}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"en/contact.md","lastUpdated":1776916170000}'),r={name:"contact.md"};function s(c,a,i,d,m,u){return n(),o("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("Email: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("WeChat: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default}; +import{e as l,o as n,a as o,h as t,J as e}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"en/contact.md","lastUpdated":1777999882000}'),r={name:"contact.md"};function s(c,a,i,d,m,u){return n(),o("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("Email: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("WeChat: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default}; diff --git a/assets/donate.md.DdwO5Lhr.js b/assets/donate.md.CocsUBXN.js similarity index 95% rename from assets/donate.md.DdwO5Lhr.js rename to assets/donate.md.CocsUBXN.js index fad294c2d..7283555e8 100644 --- a/assets/donate.md.DdwO5Lhr.js +++ b/assets/donate.md.CocsUBXN.js @@ -1 +1 @@ -import{e as t,o as a,a as r,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const _=JSON.parse('{"title":"Donate Project ♥️","description":"","frontmatter":{},"headers":[],"relativePath":"donate.md","filePath":"en/donate.md","lastUpdated":1776916170000}'),l={name:"donate.md"};function n(s,e,i,p,d,c){return a(),r("div",null,[...e[0]||(e[0]=[o('

Donate Project ♥️

If this project has helped you, you can buy me a coffee to keep me energized and improving the project! 😛

viarotel-wepayviarotel-alipayviarotel-paypal
',3)])])}const f=t(l,[["render",n]]);export{_ as __pageData,f as default}; +import{e as t,o as a,a as r,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const _=JSON.parse('{"title":"Donate Project ♥️","description":"","frontmatter":{},"headers":[],"relativePath":"donate.md","filePath":"en/donate.md","lastUpdated":1777999882000}'),l={name:"donate.md"};function n(s,e,i,p,d,c){return a(),r("div",null,[...e[0]||(e[0]=[o('

Donate Project ♥️

If this project has helped you, you can buy me a coffee to keep me energized and improving the project! 😛

viarotel-wepayviarotel-alipayviarotel-paypal
',3)])])}const f=t(l,[["render",n]]);export{_ as __pageData,f as default}; diff --git a/assets/donate.md.DdwO5Lhr.lean.js b/assets/donate.md.CocsUBXN.lean.js similarity index 84% rename from assets/donate.md.DdwO5Lhr.lean.js rename to assets/donate.md.CocsUBXN.lean.js index 22ef47645..fc02dddcf 100644 --- a/assets/donate.md.DdwO5Lhr.lean.js +++ b/assets/donate.md.CocsUBXN.lean.js @@ -1 +1 @@ -import{e as t,o as a,a as r,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const _=JSON.parse('{"title":"Donate Project ♥️","description":"","frontmatter":{},"headers":[],"relativePath":"donate.md","filePath":"en/donate.md","lastUpdated":1776916170000}'),l={name:"donate.md"};function n(s,e,i,p,d,c){return a(),r("div",null,[...e[0]||(e[0]=[o("",3)])])}const f=t(l,[["render",n]]);export{_ as __pageData,f as default}; +import{e as t,o as a,a as r,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const _=JSON.parse('{"title":"Donate Project ♥️","description":"","frontmatter":{},"headers":[],"relativePath":"donate.md","filePath":"en/donate.md","lastUpdated":1777999882000}'),l={name:"donate.md"};function n(s,e,i,p,d,c){return a(),r("div",null,[...e[0]||(e[0]=[o("",3)])])}const f=t(l,[["render",n]]);export{_ as __pageData,f as default}; diff --git a/assets/guide_index.md.C58ef6zY.js b/assets/guide_index.md.BWinlxA1.js similarity index 97% rename from assets/guide_index.md.C58ef6zY.js rename to assets/guide_index.md.BWinlxA1.js index 9fea96a72..60955f013 100644 --- a/assets/guide_index.md.C58ef6zY.js +++ b/assets/guide_index.md.BWinlxA1.js @@ -1 +1 @@ -import{e as i,o as a,a as r,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const h=JSON.parse('{"title":"Guide","description":"","frontmatter":{"title":"Guide"},"headers":[],"relativePath":"guide/index.md","filePath":"en/guide/index.md","lastUpdated":1776916170000}'),t={name:"guide/index.md"};function n(l,e,s,c,d,p){return a(),r("div",null,[...e[0]||(e[0]=[o('

Escrcpy: A Graphical Android Device Control Tool Based on Electron

What is Escrcpy?

Escrcpy is a graphical Android device control tool developed based on Electron. Built upon the renowned open-source project Scrcpy, it provides users with a more user-friendly and feature-rich graphical interface. With Escrcpy, users can easily display and control Android devices on their computers, enjoying a high-definition, low-latency screen mirroring experience.

Core Features

Efficient and Stable Screen Mirroring

  • ⚡️ High Performance: Supports 30-120 fps (depending on device capability)
  • 🌟 High Quality: Supports 1920×1080 or higher resolution display
  • 🕒 Low Latency: Only 35~70 milliseconds of delay
  • 🚀 Fast Startup: Displays the first frame in about 1 second

Rich Functional Features

  • 📡 Wireless Connection: Supports quick device connection via QR code scanning
  • 🤖 Automation: Auto-connect devices, auto-execute mirroring, custom scripts, and scheduled tasks
  • 💡 Highly Customizable: Multi-device management, independent configurations, custom notes, config import/export
  • 🖥️ Window Arrangement: Visual multi-device window layout management with drag-and-drop position and size adjustment
  • 🔗 Reverse Tethering: Built-in Gnirehtet reverse tethering functionality
  • 🎨 Theme Switching: Supports light/dark modes, automatically switches with the system

Optimized User Experience

  • 😎 Lightweight: Native support, displays only the device screen
  • 🙅‍♂️ No Residue: Leaves no traces on Android devices
  • 🤩 Pure Experience: No account required, no ads, no internet needed
  • 🗽 Completely Free and Open Source

Use Cases

Escrcpy is ideal for the following scenarios:

  1. Developers debugging Android apps on their computers
  2. Gamers playing mobile games on larger screens
  3. Users needing to record mobile screen content
  4. Situations requiring phone operation on a computer for work
  5. Demonstrating phone operations during teaching sessions

Cross-Platform Support

Escrcpy supports major operating systems:

  • Windows
  • macOS
  • Linux

Technical Advantages

As the graphical interface version of Scrcpy, Escrcpy retains all the advantages of Scrcpy while adding:

  • A more intuitive device management interface
  • More convenient connection methods
  • Richer customization options
  • More comprehensive batch operation features

Future Development

The project team continues to improve Escrcpy, with future plans including:

  • Enhancing the way mirror window position and size are set
  • Optimizing the batch device connection experience
  • Developing a graphical script editing tool

How to use

Escrcpy is a completely free and open-source project. Please refer to the specific usage:

Get Started 👉

Conclusion

Escrcpy brings a modern graphical interface and enhanced features to Scrcpy, making Android device control simpler and more efficient. Whether you're a developer or an average user, Escrcpy can provide an outstanding device control experience. Its open-source and free nature also allows more people to use this excellent tool without hesitation.

If you're looking for a powerful, user-friendly Android device control tool, Escrcpy is definitely worth trying!

',28)])])}const m=i(t,[["render",n]]);export{h as __pageData,m as default}; +import{e as i,o as a,a as r,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const h=JSON.parse('{"title":"Guide","description":"","frontmatter":{"title":"Guide"},"headers":[],"relativePath":"guide/index.md","filePath":"en/guide/index.md","lastUpdated":1777999882000}'),t={name:"guide/index.md"};function n(l,e,s,c,d,p){return a(),r("div",null,[...e[0]||(e[0]=[o('

Escrcpy: A Graphical Android Device Control Tool Based on Electron

What is Escrcpy?

Escrcpy is a graphical Android device control tool developed based on Electron. Built upon the renowned open-source project Scrcpy, it provides users with a more user-friendly and feature-rich graphical interface. With Escrcpy, users can easily display and control Android devices on their computers, enjoying a high-definition, low-latency screen mirroring experience.

Core Features

Efficient and Stable Screen Mirroring

  • ⚡️ High Performance: Supports 30-120 fps (depending on device capability)
  • 🌟 High Quality: Supports 1920×1080 or higher resolution display
  • 🕒 Low Latency: Only 35~70 milliseconds of delay
  • 🚀 Fast Startup: Displays the first frame in about 1 second

Rich Functional Features

  • 📡 Wireless Connection: Supports quick device connection via QR code scanning
  • 🤖 Automation: Auto-connect devices, auto-execute mirroring, custom scripts, and scheduled tasks
  • 💡 Highly Customizable: Multi-device management, independent configurations, custom notes, config import/export
  • 🖥️ Window Arrangement: Visual multi-device window layout management with drag-and-drop position and size adjustment
  • 🔗 Reverse Tethering: Built-in Gnirehtet reverse tethering functionality
  • 🎨 Theme Switching: Supports light/dark modes, automatically switches with the system

Optimized User Experience

  • 😎 Lightweight: Native support, displays only the device screen
  • 🙅‍♂️ No Residue: Leaves no traces on Android devices
  • 🤩 Pure Experience: No account required, no ads, no internet needed
  • 🗽 Completely Free and Open Source

Use Cases

Escrcpy is ideal for the following scenarios:

  1. Developers debugging Android apps on their computers
  2. Gamers playing mobile games on larger screens
  3. Users needing to record mobile screen content
  4. Situations requiring phone operation on a computer for work
  5. Demonstrating phone operations during teaching sessions

Cross-Platform Support

Escrcpy supports major operating systems:

  • Windows
  • macOS
  • Linux

Technical Advantages

As the graphical interface version of Scrcpy, Escrcpy retains all the advantages of Scrcpy while adding:

  • A more intuitive device management interface
  • More convenient connection methods
  • Richer customization options
  • More comprehensive batch operation features

Future Development

The project team continues to improve Escrcpy, with future plans including:

  • Enhancing the way mirror window position and size are set
  • Optimizing the batch device connection experience
  • Developing a graphical script editing tool

How to use

Escrcpy is a completely free and open-source project. Please refer to the specific usage:

Get Started 👉

Conclusion

Escrcpy brings a modern graphical interface and enhanced features to Scrcpy, making Android device control simpler and more efficient. Whether you're a developer or an average user, Escrcpy can provide an outstanding device control experience. Its open-source and free nature also allows more people to use this excellent tool without hesitation.

If you're looking for a powerful, user-friendly Android device control tool, Escrcpy is definitely worth trying!

',28)])])}const m=i(t,[["render",n]]);export{h as __pageData,m as default}; diff --git a/assets/guide_index.md.C58ef6zY.lean.js b/assets/guide_index.md.BWinlxA1.lean.js similarity index 70% rename from assets/guide_index.md.C58ef6zY.lean.js rename to assets/guide_index.md.BWinlxA1.lean.js index f727b5479..16e52dd37 100644 --- a/assets/guide_index.md.C58ef6zY.lean.js +++ b/assets/guide_index.md.BWinlxA1.lean.js @@ -1 +1 @@ -import{e as i,o as a,a as r,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const h=JSON.parse('{"title":"Guide","description":"","frontmatter":{"title":"Guide"},"headers":[],"relativePath":"guide/index.md","filePath":"en/guide/index.md","lastUpdated":1776916170000}'),t={name:"guide/index.md"};function n(l,e,s,c,d,p){return a(),r("div",null,[...e[0]||(e[0]=[o("",28)])])}const m=i(t,[["render",n]]);export{h as __pageData,m as default}; +import{e as i,o as a,a as r,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const h=JSON.parse('{"title":"Guide","description":"","frontmatter":{"title":"Guide"},"headers":[],"relativePath":"guide/index.md","filePath":"en/guide/index.md","lastUpdated":1777999882000}'),t={name:"guide/index.md"};function n(l,e,s,c,d,p){return a(),r("div",null,[...e[0]||(e[0]=[o("",28)])])}const m=i(t,[["render",n]]);export{h as __pageData,m as default}; diff --git a/assets/guide_milestones.md.CkUKwfnL.js b/assets/guide_milestones.md.CLGBZrm8.js similarity index 97% rename from assets/guide_milestones.md.CkUKwfnL.js rename to assets/guide_milestones.md.CLGBZrm8.js index 075ceb516..52e89099d 100644 --- a/assets/guide_milestones.md.CkUKwfnL.js +++ b/assets/guide_milestones.md.CLGBZrm8.js @@ -1 +1 @@ -import{e,o as l,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Milestones","description":"","frontmatter":{"title":"Milestones"},"headers":[],"relativePath":"guide/milestones.md","filePath":"en/guide/milestones.md","lastUpdated":1776916170000}'),r={name:"guide/milestones.md"};function n(a,i,s,c,d,u){return l(),t("div",null,[...i[0]||(i[0]=[o('

Milestones

Priority from high to low:

  • Improved logo ✅
  • Software update feature ✅
  • Record and save audio/video ✅
  • Device quick interaction control bar ✅
  • Custom Adb and Scrcpy dependencies ✅
  • Custom device names ✅
  • Export and import preferences ✅
  • Individual device configuration ✅
  • macOS and Linux support ✅
  • Internationalization ✅
  • Dark mode ✅
  • Reverse tethering (Gnirehtet) ✅
  • Camera mirroring ✅
  • Multi-screen collaboration ✅
  • File push, screen rotation, audio control ✅
  • Batch connect historical devices ✅
  • Built-in terminal ✅
  • Auto-execute mirroring ✅
  • Flexible mirroring launch ✅
  • Batch processing ✅
  • Scheduled tasks ✅
  • Graphical file manager ✅
  • Floating control bar ✅
  • Enhanced recording ✅
  • Start APP(Multi-threaded) ✅
  • Main window edge hidden ✅
  • Group devices (by filtering remarks) ✅
  • Improved history device connection experience ✅
  • File management supports uploading directories ✅
  • Support adding open APP to desktop shortcut (Windows only) ✅
  • Support batch startup of devices ✅
  • Supports controlling the window layout of each device through visual orchestration tools ✅
  • Integrate different connection methods and configurations of the same device to improve user experience ✅
  • Enhanced device file manager ✅
  • Integrate AutoGLM to control your Android device using natural language without scripting ✅
  • Refactor main process architecture to improve performance and stability ✅
  • Support script automation through visual orchestration tools ✅
  • Device group control feature ✅
  • Keyboard mapping feature 🚧
',3)])])}const h=e(r,[["render",n]]);export{m as __pageData,h as default}; +import{e,o as l,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Milestones","description":"","frontmatter":{"title":"Milestones"},"headers":[],"relativePath":"guide/milestones.md","filePath":"en/guide/milestones.md","lastUpdated":1777999882000}'),r={name:"guide/milestones.md"};function n(a,i,s,c,d,u){return l(),t("div",null,[...i[0]||(i[0]=[o('

Milestones

Priority from high to low:

  • Improved logo ✅
  • Software update feature ✅
  • Record and save audio/video ✅
  • Device quick interaction control bar ✅
  • Custom Adb and Scrcpy dependencies ✅
  • Custom device names ✅
  • Export and import preferences ✅
  • Individual device configuration ✅
  • macOS and Linux support ✅
  • Internationalization ✅
  • Dark mode ✅
  • Reverse tethering (Gnirehtet) ✅
  • Camera mirroring ✅
  • Multi-screen collaboration ✅
  • File push, screen rotation, audio control ✅
  • Batch connect historical devices ✅
  • Built-in terminal ✅
  • Auto-execute mirroring ✅
  • Flexible mirroring launch ✅
  • Batch processing ✅
  • Scheduled tasks ✅
  • Graphical file manager ✅
  • Floating control bar ✅
  • Enhanced recording ✅
  • Start APP(Multi-threaded) ✅
  • Main window edge hidden ✅
  • Group devices (by filtering remarks) ✅
  • Improved history device connection experience ✅
  • File management supports uploading directories ✅
  • Support adding open APP to desktop shortcut (Windows only) ✅
  • Support batch startup of devices ✅
  • Supports controlling the window layout of each device through visual orchestration tools ✅
  • Integrate different connection methods and configurations of the same device to improve user experience ✅
  • Enhanced device file manager ✅
  • Integrate AutoGLM to control your Android device using natural language without scripting ✅
  • Refactor main process architecture to improve performance and stability ✅
  • Support script automation through visual orchestration tools ✅
  • Device group control feature ✅
  • Keyboard mapping feature 🚧
',3)])])}const h=e(r,[["render",n]]);export{m as __pageData,h as default}; diff --git a/assets/guide_milestones.md.CkUKwfnL.lean.js b/assets/guide_milestones.md.CLGBZrm8.lean.js similarity index 85% rename from assets/guide_milestones.md.CkUKwfnL.lean.js rename to assets/guide_milestones.md.CLGBZrm8.lean.js index adeddfebc..ac2ecc03a 100644 --- a/assets/guide_milestones.md.CkUKwfnL.lean.js +++ b/assets/guide_milestones.md.CLGBZrm8.lean.js @@ -1 +1 @@ -import{e,o as l,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Milestones","description":"","frontmatter":{"title":"Milestones"},"headers":[],"relativePath":"guide/milestones.md","filePath":"en/guide/milestones.md","lastUpdated":1776916170000}'),r={name:"guide/milestones.md"};function n(a,i,s,c,d,u){return l(),t("div",null,[...i[0]||(i[0]=[o("",3)])])}const h=e(r,[["render",n]]);export{m as __pageData,h as default}; +import{e,o as l,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Milestones","description":"","frontmatter":{"title":"Milestones"},"headers":[],"relativePath":"guide/milestones.md","filePath":"en/guide/milestones.md","lastUpdated":1777999882000}'),r={name:"guide/milestones.md"};function n(a,i,s,c,d,u){return l(),t("div",null,[...i[0]||(i[0]=[o("",3)])])}const h=e(r,[["render",n]]);export{m as __pageData,h as default}; diff --git a/assets/guide_operation.md.Bp2dKiuC.js b/assets/guide_operation.md.CxX__I0K.js similarity index 96% rename from assets/guide_operation.md.Bp2dKiuC.js rename to assets/guide_operation.md.CxX__I0K.js index b8856789c..ea1a55cf1 100644 --- a/assets/guide_operation.md.Bp2dKiuC.js +++ b/assets/guide_operation.md.CxX__I0K.js @@ -1 +1 @@ -import{e,o as a,a as l,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Operation","description":"","frontmatter":{"title":"Operation"},"headers":[],"relativePath":"guide/operation.md","filePath":"en/guide/operation.md","lastUpdated":1776916170000}'),o={name:"guide/operation.md"};function r(n,i,c,d,s,h){return a(),l("div",null,[...i[0]||(i[0]=[t('

Device Operation

Batch Processing

  • Batch mirroring
  • Batch Interception Screen
  • Batch Installation Application
  • Batch File Management
  • Batch Execution Script
  • Batch Scheduled Task

Control Model

  • Mirror
  • Recording
  • Recording Camera
  • Recording Audio
  • Camera
  • Custom
  • OTG

Device Interaction Bar

  • Automatic Control (AutoGLM)
  • Switch
  • Home
  • Back
  • Start APP (Mirror Group)
  • Turn off screen (experimental)
  • Notification
  • Power
  • Rotation
  • Volume
  • Screenshot
  • Reboot
  • Install APP
  • File Manager
  • Execution Script
  • Scheduled Task
  • Gnirehtet
',7)])])}const m=e(o,[["render",r]]);export{p as __pageData,m as default}; +import{e,o as a,a as l,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Operation","description":"","frontmatter":{"title":"Operation"},"headers":[],"relativePath":"guide/operation.md","filePath":"en/guide/operation.md","lastUpdated":1777999882000}'),o={name:"guide/operation.md"};function r(n,i,c,d,s,h){return a(),l("div",null,[...i[0]||(i[0]=[t('

Device Operation

Batch Processing

  • Batch mirroring
  • Batch Interception Screen
  • Batch Installation Application
  • Batch File Management
  • Batch Execution Script
  • Batch Scheduled Task

Control Model

  • Mirror
  • Recording
  • Recording Camera
  • Recording Audio
  • Camera
  • Custom
  • OTG

Device Interaction Bar

  • Automatic Control (AutoGLM)
  • Switch
  • Home
  • Back
  • Start APP (Mirror Group)
  • Turn off screen (experimental)
  • Notification
  • Power
  • Rotation
  • Volume
  • Screenshot
  • Reboot
  • Install APP
  • File Manager
  • Execution Script
  • Scheduled Task
  • Gnirehtet
',7)])])}const m=e(o,[["render",r]]);export{p as __pageData,m as default}; diff --git a/assets/guide_operation.md.Bp2dKiuC.lean.js b/assets/guide_operation.md.CxX__I0K.lean.js similarity index 85% rename from assets/guide_operation.md.Bp2dKiuC.lean.js rename to assets/guide_operation.md.CxX__I0K.lean.js index 6c1d67649..a71c70286 100644 --- a/assets/guide_operation.md.Bp2dKiuC.lean.js +++ b/assets/guide_operation.md.CxX__I0K.lean.js @@ -1 +1 @@ -import{e,o as a,a as l,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Operation","description":"","frontmatter":{"title":"Operation"},"headers":[],"relativePath":"guide/operation.md","filePath":"en/guide/operation.md","lastUpdated":1776916170000}'),o={name:"guide/operation.md"};function r(n,i,c,d,s,h){return a(),l("div",null,[...i[0]||(i[0]=[t("",7)])])}const m=e(o,[["render",r]]);export{p as __pageData,m as default}; +import{e,o as a,a as l,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Operation","description":"","frontmatter":{"title":"Operation"},"headers":[],"relativePath":"guide/operation.md","filePath":"en/guide/operation.md","lastUpdated":1777999882000}'),o={name:"guide/operation.md"};function r(n,i,c,d,s,h){return a(),l("div",null,[...i[0]||(i[0]=[t("",7)])])}const m=e(o,[["render",r]]);export{p as __pageData,m as default}; diff --git a/assets/guide_preferences.md.DdxxuWiW.js b/assets/guide_preferences.md.DM2R_va4.js similarity index 98% rename from assets/guide_preferences.md.DdxxuWiW.js rename to assets/guide_preferences.md.DM2R_va4.js index 3b0360a88..bc4f09b34 100644 --- a/assets/guide_preferences.md.DdxxuWiW.js +++ b/assets/guide_preferences.md.DM2R_va4.js @@ -1 +1 @@ -import{e,o as l,a as o,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"Preferences","description":"","frontmatter":{"title":"Preferences"},"headers":[],"relativePath":"guide/preferences.md","filePath":"en/guide/preferences.md","lastUpdated":1776916170000}'),a={name:"guide/preferences.md"};function t(n,i,d,c,u,s){return l(),o("div",null,[...i[0]||(i[0]=[r('

Preferences

Continuously improving. Currently supports the following common configurations

General

  • Theme
  • Language
  • File storage path
  • Adb path
  • Scrcpy path
  • Gnirehtet path
  • Scrcpy parameters
  • Gnirehtet parameters
  • Auto-connect device
  • Auto-execute mirroring
  • Gnirehtet fix
  • Debug
  • Floating control bar
  • Use system terminal
  • Preferred terminal
  • Concurrency limit

Video Control

  • Disable video forwarding
  • Maximum size
  • Video bitrate
  • Refresh rate
  • Video codec
  • Display orientation
  • Rotation angle
  • Screen cropping
  • Monitor
  • Video buffer
  • Receiver (v4l2) buffer

Device Control

  • Show touch points
  • Keep awake
  • Turn off screen during control
  • Turn off screen after control
  • Disable auto screen on during control
  • Simulate auxiliary display

Window Control

  • Window width
  • Window height
  • Window X-coordinate
  • Window Y-coordinate
  • Borderless mode
  • Fullscreen mode
  • Always on top
  • Disable screensaver

Audio Control

  • Disable audio forwarding
  • Keep device audio
  • Audio source
  • Audio codec
  • Audio bitrate
  • Audio buffer
  • Audio output buffer

Audio/Video Recording

  • Record video format
  • Record video orientation
  • Recording duration
  • Disable video playback
  • Disable audio playback

Input Control

  • Mouse mode
  • Mouse binding
  • Keyboard mode
  • Keyboard injection method
  • Gamepad

Camera Control

  • Camera source
  • Camera size
  • Camera ratio
  • Camera frame rate
',18)])])}const m=e(a,[["render",t]]);export{f as __pageData,m as default}; +import{e,o as l,a as o,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"Preferences","description":"","frontmatter":{"title":"Preferences"},"headers":[],"relativePath":"guide/preferences.md","filePath":"en/guide/preferences.md","lastUpdated":1777999882000}'),a={name:"guide/preferences.md"};function t(n,i,d,c,u,s){return l(),o("div",null,[...i[0]||(i[0]=[r('

Preferences

Continuously improving. Currently supports the following common configurations

General

  • Theme
  • Language
  • File storage path
  • Adb path
  • Scrcpy path
  • Gnirehtet path
  • Scrcpy parameters
  • Gnirehtet parameters
  • Auto-connect device
  • Auto-execute mirroring
  • Gnirehtet fix
  • Debug
  • Floating control bar
  • Use system terminal
  • Preferred terminal
  • Concurrency limit

Video Control

  • Disable video forwarding
  • Maximum size
  • Video bitrate
  • Refresh rate
  • Video codec
  • Display orientation
  • Rotation angle
  • Screen cropping
  • Monitor
  • Video buffer
  • Receiver (v4l2) buffer

Device Control

  • Show touch points
  • Keep awake
  • Turn off screen during control
  • Turn off screen after control
  • Disable auto screen on during control
  • Simulate auxiliary display

Window Control

  • Window width
  • Window height
  • Window X-coordinate
  • Window Y-coordinate
  • Borderless mode
  • Fullscreen mode
  • Always on top
  • Disable screensaver

Audio Control

  • Disable audio forwarding
  • Keep device audio
  • Audio source
  • Audio codec
  • Audio bitrate
  • Audio buffer
  • Audio output buffer

Audio/Video Recording

  • Record video format
  • Record video orientation
  • Recording duration
  • Disable video playback
  • Disable audio playback

Input Control

  • Mouse mode
  • Mouse binding
  • Keyboard mode
  • Keyboard injection method
  • Gamepad

Camera Control

  • Camera source
  • Camera size
  • Camera ratio
  • Camera frame rate
',18)])])}const m=e(a,[["render",t]]);export{f as __pageData,m as default}; diff --git a/assets/guide_preferences.md.DdxxuWiW.lean.js b/assets/guide_preferences.md.DM2R_va4.lean.js similarity index 86% rename from assets/guide_preferences.md.DdxxuWiW.lean.js rename to assets/guide_preferences.md.DM2R_va4.lean.js index 0ac89c76b..24a8247cc 100644 --- a/assets/guide_preferences.md.DdxxuWiW.lean.js +++ b/assets/guide_preferences.md.DM2R_va4.lean.js @@ -1 +1 @@ -import{e,o as l,a as o,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"Preferences","description":"","frontmatter":{"title":"Preferences"},"headers":[],"relativePath":"guide/preferences.md","filePath":"en/guide/preferences.md","lastUpdated":1776916170000}'),a={name:"guide/preferences.md"};function t(n,i,d,c,u,s){return l(),o("div",null,[...i[0]||(i[0]=[r("",18)])])}const m=e(a,[["render",t]]);export{f as __pageData,m as default}; +import{e,o as l,a as o,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"Preferences","description":"","frontmatter":{"title":"Preferences"},"headers":[],"relativePath":"guide/preferences.md","filePath":"en/guide/preferences.md","lastUpdated":1777999882000}'),a={name:"guide/preferences.md"};function t(n,i,d,c,u,s){return l(),o("div",null,[...i[0]||(i[0]=[r("",18)])])}const m=e(a,[["render",t]]);export{f as __pageData,m as default}; diff --git a/assets/guide_started.md.BOcw05bX.js b/assets/guide_started.md.BtW7i3wQ.js similarity index 98% rename from assets/guide_started.md.BOcw05bX.js rename to assets/guide_started.md.BtW7i3wQ.js index 32e161a1b..623298ef4 100644 --- a/assets/guide_started.md.BOcw05bX.js +++ b/assets/guide_started.md.BtW7i3wQ.js @@ -1 +1 @@ -import{e as a,o as t,a as r,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Quick Start","description":"","frontmatter":{"title":"Quick Start"},"headers":[],"relativePath":"guide/started.md","filePath":"en/guide/started.md","lastUpdated":1776916170000}'),i={name:"guide/started.md"};function o(l,e,c,s,d,h){return t(),r("div",null,[...e[0]||(e[0]=[n('

Quick Start

Installation

Manual installation via released packages

macOS can be installed via Homebrew

See homebrew-escrcpy

USB Connection

Note: If the phone prompts for debugging authorization, click allow

  1. Enable developer mode and USB debugging on your Android phone
  2. Open Escrcpy and connect your Android phone to your computer
  3. The device list in Escrcpy should have detected your phone, click start mirroring
  4. Enjoy!

WIFI Connection

Scan QR Code to Connect

  1. Follow steps 1-2 from USB connection
  2. Enable and enter wireless debugging in developer mode
  3. Click "Pair device using QR code"
  4. Start enjoying!

Connect via IP Address

Note: If initial wireless connection fails, you may need wireless pairing. Please refer to FAQ

Note: You need to enable wireless debugging and obtain your device's wireless address (usually the IP address assigned when connecting to WiFi) and port number (default is 5555) from the wireless debugging page

  1. Follow steps 1-2 from USB connection
  2. Enter the obtained device IP address and port number in Escrcpy, then click connect device
  3. At this point, Escrcpy device list should detect your phone, click start mirroring
  4. Start enjoying!

macOS && Linux

Note: These platforms do not come with integrated Scrcpy, you need to install them manually

In Escrcpy@1.27.1+ scrcpy binary files are preliminarily integrated, eliminating the need for manual scrcpy installation.

  1. Refer to the installation document for Linux
  2. Refer to the installation document for macOS
  3. Follow steps in USB Connection and WIFI Connection after dependencies are installed successfully

Gnirehtet Reverse Tethering

Gnirehtet is built into the Windows and Linux apps to provide reverse tethering from PC to Android devices.

After connecting the device through the above steps, enable the reverse network function through Devices -> Device Control Bar -> Gnirehtet.

Note: macOS does not have Gnirehtet built-in. You need to manually install it to use this feature Installation Guide.

',23)])])}const m=a(i,[["render",o]]);export{p as __pageData,m as default}; +import{e as a,o as t,a as r,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Quick Start","description":"","frontmatter":{"title":"Quick Start"},"headers":[],"relativePath":"guide/started.md","filePath":"en/guide/started.md","lastUpdated":1777999882000}'),i={name:"guide/started.md"};function o(l,e,c,s,d,h){return t(),r("div",null,[...e[0]||(e[0]=[n('

Quick Start

Installation

Manual installation via released packages

macOS can be installed via Homebrew

See homebrew-escrcpy

USB Connection

Note: If the phone prompts for debugging authorization, click allow

  1. Enable developer mode and USB debugging on your Android phone
  2. Open Escrcpy and connect your Android phone to your computer
  3. The device list in Escrcpy should have detected your phone, click start mirroring
  4. Enjoy!

WIFI Connection

Scan QR Code to Connect

  1. Follow steps 1-2 from USB connection
  2. Enable and enter wireless debugging in developer mode
  3. Click "Pair device using QR code"
  4. Start enjoying!

Connect via IP Address

Note: If initial wireless connection fails, you may need wireless pairing. Please refer to FAQ

Note: You need to enable wireless debugging and obtain your device's wireless address (usually the IP address assigned when connecting to WiFi) and port number (default is 5555) from the wireless debugging page

  1. Follow steps 1-2 from USB connection
  2. Enter the obtained device IP address and port number in Escrcpy, then click connect device
  3. At this point, Escrcpy device list should detect your phone, click start mirroring
  4. Start enjoying!

macOS && Linux

Note: These platforms do not come with integrated Scrcpy, you need to install them manually

In Escrcpy@1.27.1+ scrcpy binary files are preliminarily integrated, eliminating the need for manual scrcpy installation.

  1. Refer to the installation document for Linux
  2. Refer to the installation document for macOS
  3. Follow steps in USB Connection and WIFI Connection after dependencies are installed successfully

Gnirehtet Reverse Tethering

Gnirehtet is built into the Windows and Linux apps to provide reverse tethering from PC to Android devices.

After connecting the device through the above steps, enable the reverse network function through Devices -> Device Control Bar -> Gnirehtet.

Note: macOS does not have Gnirehtet built-in. You need to manually install it to use this feature Installation Guide.

',23)])])}const m=a(i,[["render",o]]);export{p as __pageData,m as default}; diff --git a/assets/guide_started.md.BOcw05bX.lean.js b/assets/guide_started.md.BtW7i3wQ.lean.js similarity index 85% rename from assets/guide_started.md.BOcw05bX.lean.js rename to assets/guide_started.md.BtW7i3wQ.lean.js index 7e7a107fc..175c6669d 100644 --- a/assets/guide_started.md.BOcw05bX.lean.js +++ b/assets/guide_started.md.BtW7i3wQ.lean.js @@ -1 +1 @@ -import{e as a,o as t,a as r,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Quick Start","description":"","frontmatter":{"title":"Quick Start"},"headers":[],"relativePath":"guide/started.md","filePath":"en/guide/started.md","lastUpdated":1776916170000}'),i={name:"guide/started.md"};function o(l,e,c,s,d,h){return t(),r("div",null,[...e[0]||(e[0]=[n("",23)])])}const m=a(i,[["render",o]]);export{p as __pageData,m as default}; +import{e as a,o as t,a as r,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Quick Start","description":"","frontmatter":{"title":"Quick Start"},"headers":[],"relativePath":"guide/started.md","filePath":"en/guide/started.md","lastUpdated":1777999882000}'),i={name:"guide/started.md"};function o(l,e,c,s,d,h){return t(),r("div",null,[...e[0]||(e[0]=[n("",23)])])}const m=a(i,[["render",o]]);export{p as __pageData,m as default}; diff --git a/assets/guide_window-arrangement.md.KrYr4e8L.js b/assets/guide_window-arrangement.md.CySyvPTR.js similarity index 99% rename from assets/guide_window-arrangement.md.KrYr4e8L.js rename to assets/guide_window-arrangement.md.CySyvPTR.js index f80001a49..e0b5f5043 100644 --- a/assets/guide_window-arrangement.md.KrYr4e8L.js +++ b/assets/guide_window-arrangement.md.CySyvPTR.js @@ -1 +1 @@ -import{e as i,o,a as n,ag as a}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Window Arrangement","description":"","frontmatter":{"title":"Window Arrangement"},"headers":[],"relativePath":"guide/window-arrangement.md","filePath":"en/guide/window-arrangement.md","lastUpdated":1776916170000}'),t={name:"guide/window-arrangement.md"};function r(l,e,d,s,c,u){return o(),n("div",null,[...e[0]||(e[0]=[a('

Device Window Arrangement Feature Guide

Device Window Arrangement is one of Escrcpy's advanced features, designed specifically for multi-device management and screen space optimization. Through a visual drag-and-drop interface, you can precisely control the position, size, and layout of each device window, enabling efficient multi-device collaborative operations.

Feature Overview

The Window Arrangement feature provides a fullscreen visual editing interface that allows you to:

  • Simultaneously manage the layout of multiple device windows
  • Adjust window positions and sizes through drag-and-drop
  • Set global default configurations and device-specific configurations
  • Preview window layout effects in real-time
  • Save and load custom layout schemes

Core Components

Global Configuration Component

The global configuration component is used to set default window parameters for all devices, including:

  • Default window width and height
  • Default window position coordinates
  • Other common window properties

Device Window Component

Each connected device can be added as an independent window component, supporting:

  • Independent position and size settings
  • Device-specific window configurations
  • Inheritance or override of global configurations

Detailed Operation Guide

Starting Window Arrangement

  1. Launch from Main Interface
    • Find the "Arrange" button in the top-right corner of the main interface
    • Click the button to enter window arrangement interface
    • The system will open a fullscreen window arrangement interface

Adding and Managing Components

Adding Global Configuration Component

  1. Click the "Add Widget" dropdown button
  2. Select "Global Configuration" option
  3. The global configuration component will appear in the arrangement area
  4. This component is used to set default parameters for all devices

Note: Each arrangement scheme can only have one global configuration component.

Adding Device Window Components

  1. Click the "Add Widget" dropdown button
  2. Select the device you want to add from the device list
  3. The device window component will be added to the arrangement area
  4. Each device can only be added once

Device Display Rules:

  • Only currently connected devices are displayed
  • Already added devices will not appear repeatedly in the dropdown list
  • Device names prioritize custom names, followed by device models

Window Layout Adjustment

Moving Window Position

  1. Select Target Window: Click the window component you want to move
  2. Drag to Move: Hold down the left mouse button and drag the window to the target position
  3. Real-time Feedback: You can see real-time position changes during dragging
  4. Release to Position: Release the mouse to complete position adjustment

Adjusting Window Size

  1. Locate Adjustment Point: Move the mouse to the corner position of the window
  2. Drag to Adjust: Hold down the left mouse button and drag to change window size
  3. Proportion Constraints: The system automatically maintains reasonable window proportions
  4. Minimum Size Limit: Windows cannot be smaller than the preset minimum size

Size Limitation Description

  • Minimum Width: 1/6 of container width
  • Minimum Height: 1/4 of container height
  • Boundary Constraints: Windows cannot be dragged outside the arrangement area
  • Overlap Handling: Windows are allowed to overlap, but complete occlusion should be avoided

Layout Management Operations

Reset Layout

  1. Click the "Reset Layout" button in the control panel
  2. The system will clear all current components
  3. Reload saved layout configurations
  4. If no saved configuration exists, an empty arrangement area will be displayed

Clear All Components

  1. Click the "Clear All" button
  2. The system will display a confirmation dialog
  3. After confirmation, all window components will be removed
  4. The arrangement area will become blank

Delete Individual Component

  1. Hover the mouse over the target window component
  2. Click the delete button (×) in the top-right corner of the window
  3. The component will be immediately removed from the arrangement area
  4. The corresponding device will reappear in the addable list

Configuration Saving and Application

Saving Layout Configuration

  1. Complete Layout Adjustment: Ensure all window components are adjusted to satisfactory positions and sizes
  2. Click Save Button: Click the "Save Layout" button at the bottom of the interface
  3. Configuration Writing: The system will write current layout information to configuration files
  4. Success Feedback: Display a successful save message prompt

Configuration Storage Mechanism

  • Global Configuration: Stored in scrcpy.global configuration node
  • Device Configuration: Stored in scrcpy.[DeviceID] configuration node
  • Parameter Format:
    • --window-width: Window width
    • --window-height: Window height
    • --window-x: Window X coordinate
    • --window-y: Window Y coordinate

Configuration Application Timing

  • When Starting Mirroring: Automatically apply corresponding window configuration when device starts mirroring
  • Configuration Inheritance: Device-specific configuration takes priority, unset parameters inherit global configuration
  • Dynamic Updates: Configuration takes effect immediately after saving, no application restart required

Troubleshooting

Common Issues

Issue 1: Device not showing in add list

  • Confirm device is properly connected
  • Check if device is already added to arrangement
  • Try refreshing device list

Issue 2: Window dragging not responsive

  • Confirm mouse click is in draggable area of window
  • Check if other programs are occupying mouse events
  • Try reopening arrangement interface

Issue 3: Saved layout not taking effect

  • Confirm "Save Layout" button was clicked
  • Check if configuration file has write permissions
  • Try restarting application and testing again

Issue 4: Abnormal window size

  • Check if minimum size limits are exceeded
  • Confirm monitor resolution settings are correct
  • Try resetting layout and reconfiguring

By properly using the Window Arrangement feature, you can significantly improve multi-device management efficiency and create a personalized operating environment suitable for your workflow.

',55)])])}const h=i(t,[["render",r]]);export{m as __pageData,h as default}; +import{e as i,o,a as n,ag as a}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Window Arrangement","description":"","frontmatter":{"title":"Window Arrangement"},"headers":[],"relativePath":"guide/window-arrangement.md","filePath":"en/guide/window-arrangement.md","lastUpdated":1777999882000}'),t={name:"guide/window-arrangement.md"};function r(l,e,d,s,c,u){return o(),n("div",null,[...e[0]||(e[0]=[a('

Device Window Arrangement Feature Guide

Device Window Arrangement is one of Escrcpy's advanced features, designed specifically for multi-device management and screen space optimization. Through a visual drag-and-drop interface, you can precisely control the position, size, and layout of each device window, enabling efficient multi-device collaborative operations.

Feature Overview

The Window Arrangement feature provides a fullscreen visual editing interface that allows you to:

  • Simultaneously manage the layout of multiple device windows
  • Adjust window positions and sizes through drag-and-drop
  • Set global default configurations and device-specific configurations
  • Preview window layout effects in real-time
  • Save and load custom layout schemes

Core Components

Global Configuration Component

The global configuration component is used to set default window parameters for all devices, including:

  • Default window width and height
  • Default window position coordinates
  • Other common window properties

Device Window Component

Each connected device can be added as an independent window component, supporting:

  • Independent position and size settings
  • Device-specific window configurations
  • Inheritance or override of global configurations

Detailed Operation Guide

Starting Window Arrangement

  1. Launch from Main Interface
    • Find the "Arrange" button in the top-right corner of the main interface
    • Click the button to enter window arrangement interface
    • The system will open a fullscreen window arrangement interface

Adding and Managing Components

Adding Global Configuration Component

  1. Click the "Add Widget" dropdown button
  2. Select "Global Configuration" option
  3. The global configuration component will appear in the arrangement area
  4. This component is used to set default parameters for all devices

Note: Each arrangement scheme can only have one global configuration component.

Adding Device Window Components

  1. Click the "Add Widget" dropdown button
  2. Select the device you want to add from the device list
  3. The device window component will be added to the arrangement area
  4. Each device can only be added once

Device Display Rules:

  • Only currently connected devices are displayed
  • Already added devices will not appear repeatedly in the dropdown list
  • Device names prioritize custom names, followed by device models

Window Layout Adjustment

Moving Window Position

  1. Select Target Window: Click the window component you want to move
  2. Drag to Move: Hold down the left mouse button and drag the window to the target position
  3. Real-time Feedback: You can see real-time position changes during dragging
  4. Release to Position: Release the mouse to complete position adjustment

Adjusting Window Size

  1. Locate Adjustment Point: Move the mouse to the corner position of the window
  2. Drag to Adjust: Hold down the left mouse button and drag to change window size
  3. Proportion Constraints: The system automatically maintains reasonable window proportions
  4. Minimum Size Limit: Windows cannot be smaller than the preset minimum size

Size Limitation Description

  • Minimum Width: 1/6 of container width
  • Minimum Height: 1/4 of container height
  • Boundary Constraints: Windows cannot be dragged outside the arrangement area
  • Overlap Handling: Windows are allowed to overlap, but complete occlusion should be avoided

Layout Management Operations

Reset Layout

  1. Click the "Reset Layout" button in the control panel
  2. The system will clear all current components
  3. Reload saved layout configurations
  4. If no saved configuration exists, an empty arrangement area will be displayed

Clear All Components

  1. Click the "Clear All" button
  2. The system will display a confirmation dialog
  3. After confirmation, all window components will be removed
  4. The arrangement area will become blank

Delete Individual Component

  1. Hover the mouse over the target window component
  2. Click the delete button (×) in the top-right corner of the window
  3. The component will be immediately removed from the arrangement area
  4. The corresponding device will reappear in the addable list

Configuration Saving and Application

Saving Layout Configuration

  1. Complete Layout Adjustment: Ensure all window components are adjusted to satisfactory positions and sizes
  2. Click Save Button: Click the "Save Layout" button at the bottom of the interface
  3. Configuration Writing: The system will write current layout information to configuration files
  4. Success Feedback: Display a successful save message prompt

Configuration Storage Mechanism

  • Global Configuration: Stored in scrcpy.global configuration node
  • Device Configuration: Stored in scrcpy.[DeviceID] configuration node
  • Parameter Format:
    • --window-width: Window width
    • --window-height: Window height
    • --window-x: Window X coordinate
    • --window-y: Window Y coordinate

Configuration Application Timing

  • When Starting Mirroring: Automatically apply corresponding window configuration when device starts mirroring
  • Configuration Inheritance: Device-specific configuration takes priority, unset parameters inherit global configuration
  • Dynamic Updates: Configuration takes effect immediately after saving, no application restart required

Troubleshooting

Common Issues

Issue 1: Device not showing in add list

  • Confirm device is properly connected
  • Check if device is already added to arrangement
  • Try refreshing device list

Issue 2: Window dragging not responsive

  • Confirm mouse click is in draggable area of window
  • Check if other programs are occupying mouse events
  • Try reopening arrangement interface

Issue 3: Saved layout not taking effect

  • Confirm "Save Layout" button was clicked
  • Check if configuration file has write permissions
  • Try restarting application and testing again

Issue 4: Abnormal window size

  • Check if minimum size limits are exceeded
  • Confirm monitor resolution settings are correct
  • Try resetting layout and reconfiguring

By properly using the Window Arrangement feature, you can significantly improve multi-device management efficiency and create a personalized operating environment suitable for your workflow.

',55)])])}const h=i(t,[["render",r]]);export{m as __pageData,h as default}; diff --git a/assets/guide_window-arrangement.md.KrYr4e8L.lean.js b/assets/guide_window-arrangement.md.CySyvPTR.lean.js similarity index 87% rename from assets/guide_window-arrangement.md.KrYr4e8L.lean.js rename to assets/guide_window-arrangement.md.CySyvPTR.lean.js index 14156fdd5..47fb0aa93 100644 --- a/assets/guide_window-arrangement.md.KrYr4e8L.lean.js +++ b/assets/guide_window-arrangement.md.CySyvPTR.lean.js @@ -1 +1 @@ -import{e as i,o,a as n,ag as a}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Window Arrangement","description":"","frontmatter":{"title":"Window Arrangement"},"headers":[],"relativePath":"guide/window-arrangement.md","filePath":"en/guide/window-arrangement.md","lastUpdated":1776916170000}'),t={name:"guide/window-arrangement.md"};function r(l,e,d,s,c,u){return o(),n("div",null,[...e[0]||(e[0]=[a("",55)])])}const h=i(t,[["render",r]]);export{m as __pageData,h as default}; +import{e as i,o,a as n,ag as a}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Window Arrangement","description":"","frontmatter":{"title":"Window Arrangement"},"headers":[],"relativePath":"guide/window-arrangement.md","filePath":"en/guide/window-arrangement.md","lastUpdated":1777999882000}'),t={name:"guide/window-arrangement.md"};function r(l,e,d,s,c,u){return o(),n("div",null,[...e[0]||(e[0]=[a("",55)])])}const h=i(t,[["render",r]]);export{m as __pageData,h as default}; diff --git a/assets/help_escrcpy.md.fnXd3HiV.js b/assets/help_escrcpy.md.DA7YYKsG.js similarity index 99% rename from assets/help_escrcpy.md.fnXd3HiV.js rename to assets/help_escrcpy.md.DA7YYKsG.js index d4646b7b5..bff8f72d7 100644 --- a/assets/help_escrcpy.md.fnXd3HiV.js +++ b/assets/help_escrcpy.md.DA7YYKsG.js @@ -1 +1 @@ -import{e as t,o,a,ag as i}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Escrcpy","description":"","frontmatter":{"title":"Escrcpy"},"headers":[],"relativePath":"help/escrcpy.md","filePath":"en/help/escrcpy.md","lastUpdated":1776916170000}'),n={name:"help/escrcpy.md"};function r(s,e,c,l,d,h){return o(),a("div",null,[...e[0]||(e[0]=[i('

Escrcpy

Computer cannot detect device after connecting

  1. Please unplug and reconnect your device, and make sure the device has granted USB debugging authorization.
  2. If it still doesn't work, your computer may be missing necessary drivers. Please install drivers using third-party tools such as DriverWizard and try again.

Unable to enter Chinese

In Scrcpy@2.4+ and above, the solution is as follows:

  1. Escrcpy Settings: Go to PreferencesInput ControlKeyboard Mode and select uhid mode.
  2. Device Input Method Preparation: Install an input method that supports physical keyboards (WeChat Input Method is recommended) and complete the setup.
  3. Start Mirroring: Click Start Mirroring in Escrcpy. Verification: The device’s SettingsSystemLanguage & Input should display options for Physical Keyboard and On-screen Keyboard.
  4. Device Input Settings: Enable WeChat Input Method in the On-screen Keyboard settings. Configure the keyboard layout in the Physical Keyboard settings to match the computer keyboard (only needs to be done once).
  5. Computer Input Preparation: Set the input mode to English (important).
  6. Switch Input Language: Use Ctrl + Shift to switch between English and Chinese.
  7. Start Using.

Download WeChat Input Method

Wireless connection prompts: The target computer actively refuses access

The first wireless connection may require pairing. Alternatively, insert USB to ensure connection establishment and authorization success before using wireless.

Clicking wireless mode after connecting via data cable has no response

Please click again, or click refresh devices. Generally it will not exceed two clicks. If still not working, please provide device model and Android version to Issues

Why is the device interaction control bar not designed as an automatically sticking floating menu?

It is important to note that, in principle, Escrcpy is just a GUI version based on Scrcpy, although it does extend some functionality. However, these extensions do not affect the core of Scrcpy. To implement this particular feature, I would have to modify the underlying Scrcpy code, which would make it more difficult for Escrcpy to stay in sync with Scrcpy's updates, and the drawbacks would outweigh the benefits.

Therefore, after careful consideration, we have decided to adopt the existing solution and look forward to Scrcpy adding native support for an interactive control bar in the future.

Some devices can see screenshots after connecting but cannot operate

Note: For Xiaomi phones in particular, it requires not only enabling USB debugging but also enabling USB debugging (Security Settings), which is to allow modifying permissions or simulating clicks via USB debugging.

Please refer to the detailed instructions under Reasons why mouse and keyboard do not work

Downloading prompts antivirus detection causing unable to download normally

After feedback, Windows Defender may occasionally block the software packages from being downloaded due to lack of certificate signing. You can try the following solutions:

  1. Open Windows Security Center.
  2. Select Virus & threat protection.
  3. In the Virus & threat protection settings, click Manage settings.
  4. Find Real-time protection, you can try clicking Disable if permission allows. If unable to disable real-time protection, please skip this step.
  5. Scroll down the page, find Exclusions, click Add or remove exclusions.
  6. Add the folder path where you download the software packages as an exclusion item, i.e. add the folder to the Excluded list.

Failed to get device list or error when starting mirroring/recording

This is generally caused by an incorrect path for Adb or Scrcpy, you can try the following solutions:

  1. In the menu, select Preferences and then click the reset configuration button in the top right corner of Global Mode.
  2. Go to the Device List page and try enabling mirroring again.
  3. Make sure you have downloaded and installed the latest version of Escrcpy.
  4. Press Ctrl + Shift + I to open the developer tools and check for any error messages.
  5. If there are errors, take a screenshot and submit your issue with the screenshot on the Feedback Issues page.

macOS window minimized to system tray icon not found

This is generally caused by too many icons in the system tray overflowing and hiding the Escrcpy icon. Try using the following tools:

After a successful installation of macOS, when I try to open it, I receive a prompt saying the file is damaged.

This is usually due to the software package not being signed. You can try the following solutions:

  1. Open Terminal and execute sudo spctl --master-disable to allow software from any source.
  2. Open Terminal and execute sudo xattr -r -d com.apple.quarantine /Applications/Escrcpy.app to attempt fixing the damaged software package prompt.

Only support Windows 10 and above versions.

Audio capture exception causing mirroring failure.

This usually happens because your computer lacks audio output or you have a low Android version (Android 11+).

Please try disabling audio forwarding feature through the preferences settings to resolve this issue.

Microsoft Store version mirror startup error

This is caused by files in the installation directory lacking executable permissions.

You need to customize the file paths for scrcpy and adb (ensuring they have executable permissions). If using reverse tethering, configure gnirehtet similarly.

Could not execute "adb start-server"

This might be due to Chinese or special characters in the installation path. Please try changing the installation path.

Unable to Open After Installation in Linux System

New restrictions have been implemented for AppImage applications in some popular distributions, such as Ubuntu 24.04, limiting the use of sandboxes. A temporary workaround is as follows:

shell
sudo chmod 4755 /opt/Escrcpy/chrome-sandbox

Black edges appear after resizing the casting window

If black edges appear after resizing the casting window, simply double-click the black edge area and it will automatically hide.

',44)])])}const g=t(n,[["render",r]]);export{p as __pageData,g as default}; +import{e as t,o,a,ag as i}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Escrcpy","description":"","frontmatter":{"title":"Escrcpy"},"headers":[],"relativePath":"help/escrcpy.md","filePath":"en/help/escrcpy.md","lastUpdated":1777999882000}'),n={name:"help/escrcpy.md"};function r(s,e,c,l,d,h){return o(),a("div",null,[...e[0]||(e[0]=[i('

Escrcpy

Computer cannot detect device after connecting

  1. Please unplug and reconnect your device, and make sure the device has granted USB debugging authorization.
  2. If it still doesn't work, your computer may be missing necessary drivers. Please install drivers using third-party tools such as DriverWizard and try again.

Unable to enter Chinese

In Scrcpy@2.4+ and above, the solution is as follows:

  1. Escrcpy Settings: Go to PreferencesInput ControlKeyboard Mode and select uhid mode.
  2. Device Input Method Preparation: Install an input method that supports physical keyboards (WeChat Input Method is recommended) and complete the setup.
  3. Start Mirroring: Click Start Mirroring in Escrcpy. Verification: The device’s SettingsSystemLanguage & Input should display options for Physical Keyboard and On-screen Keyboard.
  4. Device Input Settings: Enable WeChat Input Method in the On-screen Keyboard settings. Configure the keyboard layout in the Physical Keyboard settings to match the computer keyboard (only needs to be done once).
  5. Computer Input Preparation: Set the input mode to English (important).
  6. Switch Input Language: Use Ctrl + Shift to switch between English and Chinese.
  7. Start Using.

Download WeChat Input Method

Wireless connection prompts: The target computer actively refuses access

The first wireless connection may require pairing. Alternatively, insert USB to ensure connection establishment and authorization success before using wireless.

Clicking wireless mode after connecting via data cable has no response

Please click again, or click refresh devices. Generally it will not exceed two clicks. If still not working, please provide device model and Android version to Issues

Why is the device interaction control bar not designed as an automatically sticking floating menu?

It is important to note that, in principle, Escrcpy is just a GUI version based on Scrcpy, although it does extend some functionality. However, these extensions do not affect the core of Scrcpy. To implement this particular feature, I would have to modify the underlying Scrcpy code, which would make it more difficult for Escrcpy to stay in sync with Scrcpy's updates, and the drawbacks would outweigh the benefits.

Therefore, after careful consideration, we have decided to adopt the existing solution and look forward to Scrcpy adding native support for an interactive control bar in the future.

Some devices can see screenshots after connecting but cannot operate

Note: For Xiaomi phones in particular, it requires not only enabling USB debugging but also enabling USB debugging (Security Settings), which is to allow modifying permissions or simulating clicks via USB debugging.

Please refer to the detailed instructions under Reasons why mouse and keyboard do not work

Downloading prompts antivirus detection causing unable to download normally

After feedback, Windows Defender may occasionally block the software packages from being downloaded due to lack of certificate signing. You can try the following solutions:

  1. Open Windows Security Center.
  2. Select Virus & threat protection.
  3. In the Virus & threat protection settings, click Manage settings.
  4. Find Real-time protection, you can try clicking Disable if permission allows. If unable to disable real-time protection, please skip this step.
  5. Scroll down the page, find Exclusions, click Add or remove exclusions.
  6. Add the folder path where you download the software packages as an exclusion item, i.e. add the folder to the Excluded list.

Failed to get device list or error when starting mirroring/recording

This is generally caused by an incorrect path for Adb or Scrcpy, you can try the following solutions:

  1. In the menu, select Preferences and then click the reset configuration button in the top right corner of Global Mode.
  2. Go to the Device List page and try enabling mirroring again.
  3. Make sure you have downloaded and installed the latest version of Escrcpy.
  4. Press Ctrl + Shift + I to open the developer tools and check for any error messages.
  5. If there are errors, take a screenshot and submit your issue with the screenshot on the Feedback Issues page.

macOS window minimized to system tray icon not found

This is generally caused by too many icons in the system tray overflowing and hiding the Escrcpy icon. Try using the following tools:

After a successful installation of macOS, when I try to open it, I receive a prompt saying the file is damaged.

This is usually due to the software package not being signed. You can try the following solutions:

  1. Open Terminal and execute sudo spctl --master-disable to allow software from any source.
  2. Open Terminal and execute sudo xattr -r -d com.apple.quarantine /Applications/Escrcpy.app to attempt fixing the damaged software package prompt.

Only support Windows 10 and above versions.

Audio capture exception causing mirroring failure.

This usually happens because your computer lacks audio output or you have a low Android version (Android 11+).

Please try disabling audio forwarding feature through the preferences settings to resolve this issue.

Microsoft Store version mirror startup error

This is caused by files in the installation directory lacking executable permissions.

You need to customize the file paths for scrcpy and adb (ensuring they have executable permissions). If using reverse tethering, configure gnirehtet similarly.

Could not execute "adb start-server"

This might be due to Chinese or special characters in the installation path. Please try changing the installation path.

Unable to Open After Installation in Linux System

New restrictions have been implemented for AppImage applications in some popular distributions, such as Ubuntu 24.04, limiting the use of sandboxes. A temporary workaround is as follows:

shell
sudo chmod 4755 /opt/Escrcpy/chrome-sandbox

Black edges appear after resizing the casting window

If black edges appear after resizing the casting window, simply double-click the black edge area and it will automatically hide.

',44)])])}const g=t(n,[["render",r]]);export{p as __pageData,g as default}; diff --git a/assets/help_escrcpy.md.fnXd3HiV.lean.js b/assets/help_escrcpy.md.DA7YYKsG.lean.js similarity index 85% rename from assets/help_escrcpy.md.fnXd3HiV.lean.js rename to assets/help_escrcpy.md.DA7YYKsG.lean.js index 29c23419e..e30265ec1 100644 --- a/assets/help_escrcpy.md.fnXd3HiV.lean.js +++ b/assets/help_escrcpy.md.DA7YYKsG.lean.js @@ -1 +1 @@ -import{e as t,o,a,ag as i}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Escrcpy","description":"","frontmatter":{"title":"Escrcpy"},"headers":[],"relativePath":"help/escrcpy.md","filePath":"en/help/escrcpy.md","lastUpdated":1776916170000}'),n={name:"help/escrcpy.md"};function r(s,e,c,l,d,h){return o(),a("div",null,[...e[0]||(e[0]=[i("",44)])])}const g=t(n,[["render",r]]);export{p as __pageData,g as default}; +import{e as t,o,a,ag as i}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Escrcpy","description":"","frontmatter":{"title":"Escrcpy"},"headers":[],"relativePath":"help/escrcpy.md","filePath":"en/help/escrcpy.md","lastUpdated":1777999882000}'),n={name:"help/escrcpy.md"};function r(s,e,c,l,d,h){return o(),a("div",null,[...e[0]||(e[0]=[i("",44)])])}const g=t(n,[["render",r]]);export{p as __pageData,g as default}; diff --git a/assets/help_index.md.BPXjHoc0.js b/assets/help_index.md.CxGHpb9o.js similarity index 92% rename from assets/help_index.md.BPXjHoc0.js rename to assets/help_index.md.CxGHpb9o.js index c63ea47b8..3923b2460 100644 --- a/assets/help_index.md.BPXjHoc0.js +++ b/assets/help_index.md.CxGHpb9o.js @@ -1 +1 @@ -import{e as t,o as l,a,h as e,J as n}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"Help","description":"","frontmatter":{"title":"Help"},"headers":[],"relativePath":"help/index.md","filePath":"en/help/index.md","lastUpdated":1776916170000}'),s={name:"help/index.md"};function p(c,r,o,i,d,h){return l(),a("div",null,[...r[0]||(r[0]=[e("h1",{id:"help-center",tabindex:"-1"},[n("Help Center "),e("a",{class:"header-anchor",href:"#help-center","aria-label":'Permalink to "Help Center"'},"​")],-1),e("p",null,"This section provides solutions to common problems for Escrcpy and Scrcpy users.",-1),e("ul",null,[e("li",null,[e("a",{href:"/help/escrcpy"},"Escrcpy")]),e("li",null,[e("a",{href:"/help/scrcpy"},"Scrcpy")])],-1)])])}const u=t(s,[["render",p]]);export{f as __pageData,u as default}; +import{e as t,o as l,a,h as e,J as n}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"Help","description":"","frontmatter":{"title":"Help"},"headers":[],"relativePath":"help/index.md","filePath":"en/help/index.md","lastUpdated":1777999882000}'),s={name:"help/index.md"};function p(c,r,o,i,d,h){return l(),a("div",null,[...r[0]||(r[0]=[e("h1",{id:"help-center",tabindex:"-1"},[n("Help Center "),e("a",{class:"header-anchor",href:"#help-center","aria-label":'Permalink to "Help Center"'},"​")],-1),e("p",null,"This section provides solutions to common problems for Escrcpy and Scrcpy users.",-1),e("ul",null,[e("li",null,[e("a",{href:"/help/escrcpy"},"Escrcpy")]),e("li",null,[e("a",{href:"/help/scrcpy"},"Scrcpy")])],-1)])])}const u=t(s,[["render",p]]);export{f as __pageData,u as default}; diff --git a/assets/help_index.md.BPXjHoc0.lean.js b/assets/help_index.md.CxGHpb9o.lean.js similarity index 92% rename from assets/help_index.md.BPXjHoc0.lean.js rename to assets/help_index.md.CxGHpb9o.lean.js index c63ea47b8..3923b2460 100644 --- a/assets/help_index.md.BPXjHoc0.lean.js +++ b/assets/help_index.md.CxGHpb9o.lean.js @@ -1 +1 @@ -import{e as t,o as l,a,h as e,J as n}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"Help","description":"","frontmatter":{"title":"Help"},"headers":[],"relativePath":"help/index.md","filePath":"en/help/index.md","lastUpdated":1776916170000}'),s={name:"help/index.md"};function p(c,r,o,i,d,h){return l(),a("div",null,[...r[0]||(r[0]=[e("h1",{id:"help-center",tabindex:"-1"},[n("Help Center "),e("a",{class:"header-anchor",href:"#help-center","aria-label":'Permalink to "Help Center"'},"​")],-1),e("p",null,"This section provides solutions to common problems for Escrcpy and Scrcpy users.",-1),e("ul",null,[e("li",null,[e("a",{href:"/help/escrcpy"},"Escrcpy")]),e("li",null,[e("a",{href:"/help/scrcpy"},"Scrcpy")])],-1)])])}const u=t(s,[["render",p]]);export{f as __pageData,u as default}; +import{e as t,o as l,a,h as e,J as n}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"Help","description":"","frontmatter":{"title":"Help"},"headers":[],"relativePath":"help/index.md","filePath":"en/help/index.md","lastUpdated":1777999882000}'),s={name:"help/index.md"};function p(c,r,o,i,d,h){return l(),a("div",null,[...r[0]||(r[0]=[e("h1",{id:"help-center",tabindex:"-1"},[n("Help Center "),e("a",{class:"header-anchor",href:"#help-center","aria-label":'Permalink to "Help Center"'},"​")],-1),e("p",null,"This section provides solutions to common problems for Escrcpy and Scrcpy users.",-1),e("ul",null,[e("li",null,[e("a",{href:"/help/escrcpy"},"Escrcpy")]),e("li",null,[e("a",{href:"/help/scrcpy"},"Scrcpy")])],-1)])])}const u=t(s,[["render",p]]);export{f as __pageData,u as default}; diff --git a/assets/help_scrcpy.md.EcbL_RwG.js b/assets/help_scrcpy.md.N7lc9V0M.js similarity index 99% rename from assets/help_scrcpy.md.EcbL_RwG.js rename to assets/help_scrcpy.md.N7lc9V0M.js index b5d12c203..6481e5df9 100644 --- a/assets/help_scrcpy.md.EcbL_RwG.js +++ b/assets/help_scrcpy.md.N7lc9V0M.js @@ -1,4 +1,4 @@ -import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"help/scrcpy.md","filePath":"en/help/scrcpy.md","lastUpdated":1776916170000}'),o={name:"help/scrcpy.md"};function n(r,e,c,d,l,h){return s(),i("div",null,[...e[0]||(e[0]=[t(`

Scrcpy

Here are the common reported problems and their status.

If you encounter any error, the first step is to upgrade to the latest version.

adb and USB issues

scrcpy execute adb commands to initialize the connection with the device. If adb fails, then scrcpy will not work.

This is typically not a bug in scrcpy, but a problem in your environment.

adb not found

You need adb accessible from your PATH.

On Windows, the current directory is in your PATH, and adb.exe is included in the release, so it should work out-of-the-box.

Device not detected

ERROR: Could not find any ADB device
+import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"help/scrcpy.md","filePath":"en/help/scrcpy.md","lastUpdated":1777999882000}'),o={name:"help/scrcpy.md"};function n(r,e,c,d,l,h){return s(),i("div",null,[...e[0]||(e[0]=[t(`

Scrcpy

Here are the common reported problems and their status.

If you encounter any error, the first step is to upgrade to the latest version.

adb and USB issues

scrcpy execute adb commands to initialize the connection with the device. If adb fails, then scrcpy will not work.

This is typically not a bug in scrcpy, but a problem in your environment.

adb not found

You need adb accessible from your PATH.

On Windows, the current directory is in your PATH, and adb.exe is included in the release, so it should work out-of-the-box.

Device not detected

ERROR: Could not find any ADB device
 

Check that you correctly enabled adb debugging.

Your device must be detected by adb:

adb devices

If your device is not detected, you may need some drivers (on Windows). There is a separate USB driver for Google devices.

Device unauthorized

ERROR: Device is unauthorized:
 ERROR:     -->   (usb)  0123456789abcdef          unauthorized
 ERROR: A popup should open on the device to request authorization.
diff --git a/assets/help_scrcpy.md.EcbL_RwG.lean.js b/assets/help_scrcpy.md.N7lc9V0M.lean.js
similarity index 70%
rename from assets/help_scrcpy.md.EcbL_RwG.lean.js
rename to assets/help_scrcpy.md.N7lc9V0M.lean.js
index 6b4a563ff..bae8fcd27 100644
--- a/assets/help_scrcpy.md.EcbL_RwG.lean.js
+++ b/assets/help_scrcpy.md.N7lc9V0M.lean.js
@@ -1 +1 @@
-import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"help/scrcpy.md","filePath":"en/help/scrcpy.md","lastUpdated":1776916170000}'),o={name:"help/scrcpy.md"};function n(r,e,c,d,l,h){return s(),i("div",null,[...e[0]||(e[0]=[t("",66)])])}const b=a(o,[["render",n]]);export{u as __pageData,b as default};
+import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"help/scrcpy.md","filePath":"en/help/scrcpy.md","lastUpdated":1777999882000}'),o={name:"help/scrcpy.md"};function n(r,e,c,d,l,h){return s(),i("div",null,[...e[0]||(e[0]=[t("",66)])])}const b=a(o,[["render",n]]);export{u as __pageData,b as default};
diff --git a/assets/index.md.BDpYpidL.js b/assets/index.md.DR8zCQql.js
similarity index 96%
rename from assets/index.md.BDpYpidL.js
rename to assets/index.md.DR8zCQql.js
index 5780b7f98..84be58c99 100644
--- a/assets/index.md.BDpYpidL.js
+++ b/assets/index.md.DR8zCQql.js
@@ -1 +1 @@
-import{e,o as t,a as i}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Escrcpy","text":"Display and control your Android device graphically with scrcpy","tagline":"Powered by electron.","image":{"src":"/images/logo@1024x1024.png","alt":"Escrcpy"},"actions":[{"theme":"brand","text":"Get Started 👉","link":"/guide/started"},{"theme":"alt","text":"Help","link":"/help/escrcpy"},{"theme":"alt","text":"Github","link":"https://github.com/viarotel-org/escrcpy"}]},"features":[{"icon":"🖥️","title":"Inset Mirror","details":"Dedicated embedded window, auto-fits screen resolution and orientation, with integrated one-tap shortcuts"},{"icon":"🔄","title":"Multi-Device Control","details":"Control multiple devices simultaneously in a single window, broadcast input, with batch screenshot and APK install support"},{"icon":"🎛️","title":"Integrated Control Bar","details":"Compact, draggable sidebar with reorderable controls: rotation, screenshot, apps, files, terminal, AI assistant, and automation"},{"icon":"🤖","title":"Intelligent Control","details":"Natural-language commands powered by AutoGLM for smart control of Android devices"},{"icon":"🏃","title":"Automated Execution","details":"Automation workflows run in parallel, supporting synchronized operations across multiple devices"},{"icon":"🪟","title":"Multi-Device Management","details":"Visual window orchestration for centralized management of all connected devices"},{"icon":"📡","title":"Wireless Connection","details":"Wireless ADB connections with Gnirehtet reverse tethering support"},{"icon":"⚡️","title":"Scrcpy Core","details":"High-performance, low-latency screen mirroring and control"}]},"headers":[],"relativePath":"index.md","filePath":"en/index.md","lastUpdated":1776916170000}'),o={name:"index.md"};function n(a,r,s,l,c,d){return t(),i("div")}const u=e(o,[["render",n]]);export{m as __pageData,u as default};
+import{e,o as t,a as i}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Escrcpy","text":"Display and control your Android device graphically with scrcpy","tagline":"Powered by electron.","image":{"src":"/images/logo@1024x1024.png","alt":"Escrcpy"},"actions":[{"theme":"brand","text":"Get Started 👉","link":"/guide/started"},{"theme":"alt","text":"Help","link":"/help/escrcpy"},{"theme":"alt","text":"Github","link":"https://github.com/viarotel-org/escrcpy"}]},"features":[{"icon":"🖥️","title":"Inset Mirror","details":"Dedicated embedded window, auto-fits screen resolution and orientation, with integrated one-tap shortcuts"},{"icon":"🔄","title":"Multi-Device Control","details":"Control multiple devices simultaneously in a single window, broadcast input, with batch screenshot and APK install support"},{"icon":"🎛️","title":"Integrated Control Bar","details":"Compact, draggable sidebar with reorderable controls: rotation, screenshot, apps, files, terminal, AI assistant, and automation"},{"icon":"🤖","title":"Intelligent Control","details":"Natural-language commands powered by AutoGLM for smart control of Android devices"},{"icon":"🏃","title":"Automated Execution","details":"Automation workflows run in parallel, supporting synchronized operations across multiple devices"},{"icon":"🪟","title":"Multi-Device Management","details":"Visual window orchestration for centralized management of all connected devices"},{"icon":"📡","title":"Wireless Connection","details":"Wireless ADB connections with Gnirehtet reverse tethering support"},{"icon":"⚡️","title":"Scrcpy Core","details":"High-performance, low-latency screen mirroring and control"}]},"headers":[],"relativePath":"index.md","filePath":"en/index.md","lastUpdated":1777999882000}'),o={name:"index.md"};function n(a,r,s,l,c,d){return t(),i("div")}const u=e(o,[["render",n]]);export{m as __pageData,u as default};
diff --git a/assets/index.md.BDpYpidL.lean.js b/assets/index.md.DR8zCQql.lean.js
similarity index 96%
rename from assets/index.md.BDpYpidL.lean.js
rename to assets/index.md.DR8zCQql.lean.js
index 5780b7f98..84be58c99 100644
--- a/assets/index.md.BDpYpidL.lean.js
+++ b/assets/index.md.DR8zCQql.lean.js
@@ -1 +1 @@
-import{e,o as t,a as i}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Escrcpy","text":"Display and control your Android device graphically with scrcpy","tagline":"Powered by electron.","image":{"src":"/images/logo@1024x1024.png","alt":"Escrcpy"},"actions":[{"theme":"brand","text":"Get Started 👉","link":"/guide/started"},{"theme":"alt","text":"Help","link":"/help/escrcpy"},{"theme":"alt","text":"Github","link":"https://github.com/viarotel-org/escrcpy"}]},"features":[{"icon":"🖥️","title":"Inset Mirror","details":"Dedicated embedded window, auto-fits screen resolution and orientation, with integrated one-tap shortcuts"},{"icon":"🔄","title":"Multi-Device Control","details":"Control multiple devices simultaneously in a single window, broadcast input, with batch screenshot and APK install support"},{"icon":"🎛️","title":"Integrated Control Bar","details":"Compact, draggable sidebar with reorderable controls: rotation, screenshot, apps, files, terminal, AI assistant, and automation"},{"icon":"🤖","title":"Intelligent Control","details":"Natural-language commands powered by AutoGLM for smart control of Android devices"},{"icon":"🏃","title":"Automated Execution","details":"Automation workflows run in parallel, supporting synchronized operations across multiple devices"},{"icon":"🪟","title":"Multi-Device Management","details":"Visual window orchestration for centralized management of all connected devices"},{"icon":"📡","title":"Wireless Connection","details":"Wireless ADB connections with Gnirehtet reverse tethering support"},{"icon":"⚡️","title":"Scrcpy Core","details":"High-performance, low-latency screen mirroring and control"}]},"headers":[],"relativePath":"index.md","filePath":"en/index.md","lastUpdated":1776916170000}'),o={name:"index.md"};function n(a,r,s,l,c,d){return t(),i("div")}const u=e(o,[["render",n]]);export{m as __pageData,u as default};
+import{e,o as t,a as i}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Escrcpy","text":"Display and control your Android device graphically with scrcpy","tagline":"Powered by electron.","image":{"src":"/images/logo@1024x1024.png","alt":"Escrcpy"},"actions":[{"theme":"brand","text":"Get Started 👉","link":"/guide/started"},{"theme":"alt","text":"Help","link":"/help/escrcpy"},{"theme":"alt","text":"Github","link":"https://github.com/viarotel-org/escrcpy"}]},"features":[{"icon":"🖥️","title":"Inset Mirror","details":"Dedicated embedded window, auto-fits screen resolution and orientation, with integrated one-tap shortcuts"},{"icon":"🔄","title":"Multi-Device Control","details":"Control multiple devices simultaneously in a single window, broadcast input, with batch screenshot and APK install support"},{"icon":"🎛️","title":"Integrated Control Bar","details":"Compact, draggable sidebar with reorderable controls: rotation, screenshot, apps, files, terminal, AI assistant, and automation"},{"icon":"🤖","title":"Intelligent Control","details":"Natural-language commands powered by AutoGLM for smart control of Android devices"},{"icon":"🏃","title":"Automated Execution","details":"Automation workflows run in parallel, supporting synchronized operations across multiple devices"},{"icon":"🪟","title":"Multi-Device Management","details":"Visual window orchestration for centralized management of all connected devices"},{"icon":"📡","title":"Wireless Connection","details":"Wireless ADB connections with Gnirehtet reverse tethering support"},{"icon":"⚡️","title":"Scrcpy Core","details":"High-performance, low-latency screen mirroring and control"}]},"headers":[],"relativePath":"index.md","filePath":"en/index.md","lastUpdated":1777999882000}'),o={name:"index.md"};function n(a,r,s,l,c,d){return t(),i("div")}const u=e(o,[["render",n]]);export{m as __pageData,u as default};
diff --git a/assets/reference_gnirehtet_api.md.BkOI_ngI.js b/assets/reference_gnirehtet_api.md.eub4XAAp.js
similarity index 99%
rename from assets/reference_gnirehtet_api.md.BkOI_ngI.js
rename to assets/reference_gnirehtet_api.md.eub4XAAp.js
index c10e593f4..3b54f49fd 100644
--- a/assets/reference_gnirehtet_api.md.BkOI_ngI.js
+++ b/assets/reference_gnirehtet_api.md.eub4XAAp.js
@@ -1 +1 @@
-import{e as i,o as e,a,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"API","description":"","frontmatter":{"title":"API"},"headers":[],"relativePath":"reference/gnirehtet/api.md","filePath":"en/reference/gnirehtet/api.md","lastUpdated":1776916170000}'),n={name:"reference/gnirehtet/api.md"};function p(h,s,l,r,d,o){return e(),a("div",null,[...s[0]||(s[0]=[t('

Gnirehtet API

gnirehtet is a tool used to enable reverse tethering on Android devices, allowing the device to share the computer's internet connection via USB. Below is the detailed usage of each command along with examples.

gnirehtet install [serial]

Description: Install the client on the specified Android device and exit. If multiple devices are connected, the serial parameter must be provided.

Example Usage:

bash
gnirehtet install

If multiple devices are connected, specify the device:

bash
gnirehtet install 1234567890ABCDEF

gnirehtet uninstall [serial]

Description: Uninstall the client from the specified Android device and exit. If multiple devices are connected, the serial parameter must be provided.

Example Usage:

bash
gnirehtet uninstall

If multiple devices are connected, specify the device:

bash
gnirehtet uninstall 1234567890ABCDEF

gnirehtet reinstall [serial]

Description: Uninstall then install the client.

Example Usage:

bash
gnirehtet reinstall

If multiple devices are connected, specify the device:

bash
gnirehtet reinstall 1234567890ABCDEF

gnirehtet run [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

Description: Enable reverse tethering for exactly one device:

  • Install the client if necessary.
  • Start the client.
  • Start the relay server.
  • On Ctrl+C, stop both the relay server and the client.

Example Usage:

bash
gnirehtet run

Specify DNS:

bash
gnirehtet run -d 8.8.8.8,8.8.4.4

Specify port:

bash
gnirehtet run -p 8080

Specify route:

bash
gnirehtet run -r 192.168.1.0/24

gnirehtet autorun [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

Description: Enable reverse tethering for all devices:

  • Monitor devices and start clients (autostart).
  • Start the relay server.

Example Usage:

bash
gnirehtet autorun

Specify DNS:

bash
gnirehtet autorun -d 8.8.8.8,8.8.4.4

Specify port:

bash
gnirehtet autorun -p 8080

Specify route:

bash
gnirehtet autorun -r 192.168.1.0/24

gnirehtet start [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

Description: Start a client on the Android device and exit.

  • If -d is specified, the device will use the specified DNS servers.
  • If -r is specified, only reverse tether the specified routes.
  • If -p is specified, the relay server will listen on the specified port.

Example Usage:

bash
gnirehtet start

Specify device serial:

bash
gnirehtet start 1234567890ABCDEF

Specify DNS:

bash
gnirehtet start -d 8.8.8.8,8.8.4.4

Specify port:

bash
gnirehtet start -p 8080

Specify route:

bash
gnirehtet start -r 192.168.1.0/24

gnirehtet autostart [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

Description: Listen for device connections and start a client on each detected device.

  • Accepts the same parameters as the start command (excluding the serial, which will be taken from the detected device).

Example Usage:

bash
gnirehtet autostart

Specify DNS:

bash
gnirehtet autostart -d 8.8.8.8,8.8.4.4

Specify port:

bash
gnirehtet autostart -p 8080

Specify route:

bash
gnirehtet autostart -r 192.168.1.0/24

gnirehtet stop [serial]

Description: Stop the client on the specified Android device and exit.

Example Usage:

bash
gnirehtet stop

Specify device serial:

bash
gnirehtet stop 1234567890ABCDEF

gnirehtet restart [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

Description: Stop the current client and restart it.

Example Usage:

bash
gnirehtet restart

Specify device serial:

bash
gnirehtet restart 1234567890ABCDEF

Specify DNS:

bash
gnirehtet restart -d 8.8.8.8,8.8.4.4

Specify port:

bash
gnirehtet restart -p 8080

Specify route:

bash
gnirehtet restart -r 192.168.1.0/24

gnirehtet tunnel [serial] [-p PORT]

Description: Set up the adb reverse tunnel. If a device is unplugged and plugged back in while gnirehtet is active, resetting the tunnel will restore the connection.

Example Usage:

bash
gnirehtet tunnel

Specify device serial:

bash
gnirehtet tunnel 1234567890ABCDEF

Specify port:

bash
gnirehtet tunnel -p 8080

gnirehtet relay [-p PORT]

Description: Start the relay server in the current terminal.

Example Usage:

bash
gnirehtet relay

Specify port:

bash
gnirehtet relay -p 8080
',98)])])}const k=i(n,[["render",p]]);export{g as __pageData,k as default}; +import{e as i,o as e,a,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"API","description":"","frontmatter":{"title":"API"},"headers":[],"relativePath":"reference/gnirehtet/api.md","filePath":"en/reference/gnirehtet/api.md","lastUpdated":1777999882000}'),n={name:"reference/gnirehtet/api.md"};function p(h,s,l,r,d,o){return e(),a("div",null,[...s[0]||(s[0]=[t('

Gnirehtet API

gnirehtet is a tool used to enable reverse tethering on Android devices, allowing the device to share the computer's internet connection via USB. Below is the detailed usage of each command along with examples.

gnirehtet install [serial]

Description: Install the client on the specified Android device and exit. If multiple devices are connected, the serial parameter must be provided.

Example Usage:

bash
gnirehtet install

If multiple devices are connected, specify the device:

bash
gnirehtet install 1234567890ABCDEF

gnirehtet uninstall [serial]

Description: Uninstall the client from the specified Android device and exit. If multiple devices are connected, the serial parameter must be provided.

Example Usage:

bash
gnirehtet uninstall

If multiple devices are connected, specify the device:

bash
gnirehtet uninstall 1234567890ABCDEF

gnirehtet reinstall [serial]

Description: Uninstall then install the client.

Example Usage:

bash
gnirehtet reinstall

If multiple devices are connected, specify the device:

bash
gnirehtet reinstall 1234567890ABCDEF

gnirehtet run [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

Description: Enable reverse tethering for exactly one device:

  • Install the client if necessary.
  • Start the client.
  • Start the relay server.
  • On Ctrl+C, stop both the relay server and the client.

Example Usage:

bash
gnirehtet run

Specify DNS:

bash
gnirehtet run -d 8.8.8.8,8.8.4.4

Specify port:

bash
gnirehtet run -p 8080

Specify route:

bash
gnirehtet run -r 192.168.1.0/24

gnirehtet autorun [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

Description: Enable reverse tethering for all devices:

  • Monitor devices and start clients (autostart).
  • Start the relay server.

Example Usage:

bash
gnirehtet autorun

Specify DNS:

bash
gnirehtet autorun -d 8.8.8.8,8.8.4.4

Specify port:

bash
gnirehtet autorun -p 8080

Specify route:

bash
gnirehtet autorun -r 192.168.1.0/24

gnirehtet start [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

Description: Start a client on the Android device and exit.

  • If -d is specified, the device will use the specified DNS servers.
  • If -r is specified, only reverse tether the specified routes.
  • If -p is specified, the relay server will listen on the specified port.

Example Usage:

bash
gnirehtet start

Specify device serial:

bash
gnirehtet start 1234567890ABCDEF

Specify DNS:

bash
gnirehtet start -d 8.8.8.8,8.8.4.4

Specify port:

bash
gnirehtet start -p 8080

Specify route:

bash
gnirehtet start -r 192.168.1.0/24

gnirehtet autostart [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

Description: Listen for device connections and start a client on each detected device.

  • Accepts the same parameters as the start command (excluding the serial, which will be taken from the detected device).

Example Usage:

bash
gnirehtet autostart

Specify DNS:

bash
gnirehtet autostart -d 8.8.8.8,8.8.4.4

Specify port:

bash
gnirehtet autostart -p 8080

Specify route:

bash
gnirehtet autostart -r 192.168.1.0/24

gnirehtet stop [serial]

Description: Stop the client on the specified Android device and exit.

Example Usage:

bash
gnirehtet stop

Specify device serial:

bash
gnirehtet stop 1234567890ABCDEF

gnirehtet restart [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

Description: Stop the current client and restart it.

Example Usage:

bash
gnirehtet restart

Specify device serial:

bash
gnirehtet restart 1234567890ABCDEF

Specify DNS:

bash
gnirehtet restart -d 8.8.8.8,8.8.4.4

Specify port:

bash
gnirehtet restart -p 8080

Specify route:

bash
gnirehtet restart -r 192.168.1.0/24

gnirehtet tunnel [serial] [-p PORT]

Description: Set up the adb reverse tunnel. If a device is unplugged and plugged back in while gnirehtet is active, resetting the tunnel will restore the connection.

Example Usage:

bash
gnirehtet tunnel

Specify device serial:

bash
gnirehtet tunnel 1234567890ABCDEF

Specify port:

bash
gnirehtet tunnel -p 8080

gnirehtet relay [-p PORT]

Description: Start the relay server in the current terminal.

Example Usage:

bash
gnirehtet relay

Specify port:

bash
gnirehtet relay -p 8080
',98)])])}const k=i(n,[["render",p]]);export{g as __pageData,k as default}; diff --git a/assets/reference_gnirehtet_api.md.BkOI_ngI.lean.js b/assets/reference_gnirehtet_api.md.eub4XAAp.lean.js similarity index 86% rename from assets/reference_gnirehtet_api.md.BkOI_ngI.lean.js rename to assets/reference_gnirehtet_api.md.eub4XAAp.lean.js index 5d68e8638..5f78c8f81 100644 --- a/assets/reference_gnirehtet_api.md.BkOI_ngI.lean.js +++ b/assets/reference_gnirehtet_api.md.eub4XAAp.lean.js @@ -1 +1 @@ -import{e as i,o as e,a,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"API","description":"","frontmatter":{"title":"API"},"headers":[],"relativePath":"reference/gnirehtet/api.md","filePath":"en/reference/gnirehtet/api.md","lastUpdated":1776916170000}'),n={name:"reference/gnirehtet/api.md"};function p(h,s,l,r,d,o){return e(),a("div",null,[...s[0]||(s[0]=[t("",98)])])}const k=i(n,[["render",p]]);export{g as __pageData,k as default}; +import{e as i,o as e,a,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"API","description":"","frontmatter":{"title":"API"},"headers":[],"relativePath":"reference/gnirehtet/api.md","filePath":"en/reference/gnirehtet/api.md","lastUpdated":1777999882000}'),n={name:"reference/gnirehtet/api.md"};function p(h,s,l,r,d,o){return e(),a("div",null,[...s[0]||(s[0]=[t("",98)])])}const k=i(n,[["render",p]]);export{g as __pageData,k as default}; diff --git a/assets/reference_gnirehtet_index.md.CoKB9kcb.js b/assets/reference_gnirehtet_index.md.D76rx-ph.js similarity index 99% rename from assets/reference_gnirehtet_index.md.CoKB9kcb.js rename to assets/reference_gnirehtet_index.md.D76rx-ph.js index 8ec9df213..8e2d64044 100644 --- a/assets/reference_gnirehtet_index.md.CoKB9kcb.js +++ b/assets/reference_gnirehtet_index.md.D76rx-ph.js @@ -1,4 +1,4 @@ -import{e as a,o as i,a as t,ag as s}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"Gnirehtet","description":"","frontmatter":{"title":"Gnirehtet"},"headers":[],"relativePath":"reference/gnirehtet/index.md","filePath":"en/reference/gnirehtet/index.md","lastUpdated":1776916170000}'),n={name:"reference/gnirehtet/index.md"};function l(r,e,o,h,p,d){return i(),t("div",null,[...e[0]||(e[0]=[s(`

IMPORTANT

Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.

Gnirehtet (v2.5.1)

This project provides reverse tethering over adb for Android: it allows devices to use the internet connection of the computer they are plugged on. It does not require any root access (neither on the device nor on the computer). It works on GNU/Linux, Windows and Mac OS.

Currently, it relays TCP and UDP over IPv4 traffic, but it does not support IPv6 (yet?).

This project is not actively maintained anymore, only major blockers (like build issues) are fixed. It should still work, though.

Flavors

Two implementations of Gnirehtet are available:

  • one in Java;
  • one in Rust.

Which one to choose?

Use the Rust implementation. The native binary consumes less CPU and memory, and does not require a Java runtime environment.

The relay server of Gnirehtet was initially only implemented in Java. As a benefit, the same "binary" runs on every platform having Java 8 runtime installed. It is still maintained to provide a working alternative in case of problems with the Rust version.

Requirements

The Android application requires at least API 21 (Android 5.0).

For the Java version only, Java 8 (JRE) is required on your computer. On Debian-based distros, install the package openjdk-8-jre.

adb

You need a recent version of adb (where adb reverse is implemented, it works with 1.0.36).

It is available in the Android SDK platform tools.

On Debian-based distros, you can alternatively install the package android-tools-adb.

On Windows, if you need adb only for this application, just download the platform-tools and extract the following files to the gnirehtet directory:

  • adb.exe
  • AdbWinApi.dll
  • AdbWinUsbApi.dll

Make sure you enabled adb debugging on your device(s).

Get the app

Homebrew

If you use Homebrew, getting up and running is very quick. To install the Rust version:

brew install gnirehtet

Download

Download the latest release in the flavor you want.

Rust

Then extract it.

The Linux and MacOS archives contain:

  • gnirehtet.apk
  • gnirehtet

The Windows archive contains:

  • gnirehtet.apk
  • gnirehtet.exe
  • gnirehtet-run.cmd

Java

Then extract it. The archive contains:

  • gnirehtet.apk
  • gnirehtet.jar
  • gnirehtet
  • gnirehtet.cmd
  • gnirehtet-run.cmd

Run (simple)

Note: On Windows, replace ./gnirehtet by gnirehtet in the following commands.

The application has no UI, and is intended to be controlled from the computer only.

If you want to activate reverse tethering for exactly one device, just execute:

shell
./gnirehtet run

Reverse tethering remains active until you press Ctrl+C.

On Windows, for convenience, you can double-click on gnirehtet-run.cmd instead (it just executes gnirehtet run, without requiring to open a terminal).

The very first start should open a popup to request permission:

request

A "key" logo appears in the status bar whenever Gnirehtet is active:

key

Alternatively, you can enable reverse tethering for all connected devices (present and future) by calling:

shell
./gnirehtet autorun

Run

You can execute the actions separately (it may be useful if you want to reverse tether several devices simultaneously).

Start the relay server and keep it open:

shell
./gnirehtet relay

Install the apk on your Android device:

shell
./gnirehtet install [serial]

In another terminal, for each client, execute:

shell
./gnirehtet start [serial]

To stop a client:

shell
./gnirehtet stop [serial]

To reset the tunnel (useful to get the connection back when a device is unplugged and plugged back while gnirehtet is active):

shell
./gnirehtet tunnel [serial]

The serial parameter is required only if adb devices outputs more than one device.

For advanced options, call ./gnirehtet without arguments to get more details.

Run manually

The gnirehtet program exposes a simple command-line interface that executes lower-level commands. You can call them manually instead.

To start the relay server:

shell
./gnirehtet relay

To install the apk:

shell
adb install -r gnirehtet.apk

To start a client:

shell
adb reverse localabstract:gnirehtet tcp:31416
+import{e as a,o as i,a as t,ag as s}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"Gnirehtet","description":"","frontmatter":{"title":"Gnirehtet"},"headers":[],"relativePath":"reference/gnirehtet/index.md","filePath":"en/reference/gnirehtet/index.md","lastUpdated":1777999882000}'),n={name:"reference/gnirehtet/index.md"};function l(r,e,o,h,p,d){return i(),t("div",null,[...e[0]||(e[0]=[s(`

IMPORTANT

Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.

Gnirehtet (v2.5.1)

This project provides reverse tethering over adb for Android: it allows devices to use the internet connection of the computer they are plugged on. It does not require any root access (neither on the device nor on the computer). It works on GNU/Linux, Windows and Mac OS.

Currently, it relays TCP and UDP over IPv4 traffic, but it does not support IPv6 (yet?).

This project is not actively maintained anymore, only major blockers (like build issues) are fixed. It should still work, though.

Flavors

Two implementations of Gnirehtet are available:

  • one in Java;
  • one in Rust.

Which one to choose?

Use the Rust implementation. The native binary consumes less CPU and memory, and does not require a Java runtime environment.

The relay server of Gnirehtet was initially only implemented in Java. As a benefit, the same "binary" runs on every platform having Java 8 runtime installed. It is still maintained to provide a working alternative in case of problems with the Rust version.

Requirements

The Android application requires at least API 21 (Android 5.0).

For the Java version only, Java 8 (JRE) is required on your computer. On Debian-based distros, install the package openjdk-8-jre.

adb

You need a recent version of adb (where adb reverse is implemented, it works with 1.0.36).

It is available in the Android SDK platform tools.

On Debian-based distros, you can alternatively install the package android-tools-adb.

On Windows, if you need adb only for this application, just download the platform-tools and extract the following files to the gnirehtet directory:

  • adb.exe
  • AdbWinApi.dll
  • AdbWinUsbApi.dll

Make sure you enabled adb debugging on your device(s).

Get the app

Homebrew

If you use Homebrew, getting up and running is very quick. To install the Rust version:

brew install gnirehtet

Download

Download the latest release in the flavor you want.

Rust

Then extract it.

The Linux and MacOS archives contain:

  • gnirehtet.apk
  • gnirehtet

The Windows archive contains:

  • gnirehtet.apk
  • gnirehtet.exe
  • gnirehtet-run.cmd

Java

Then extract it. The archive contains:

  • gnirehtet.apk
  • gnirehtet.jar
  • gnirehtet
  • gnirehtet.cmd
  • gnirehtet-run.cmd

Run (simple)

Note: On Windows, replace ./gnirehtet by gnirehtet in the following commands.

The application has no UI, and is intended to be controlled from the computer only.

If you want to activate reverse tethering for exactly one device, just execute:

shell
./gnirehtet run

Reverse tethering remains active until you press Ctrl+C.

On Windows, for convenience, you can double-click on gnirehtet-run.cmd instead (it just executes gnirehtet run, without requiring to open a terminal).

The very first start should open a popup to request permission:

request

A "key" logo appears in the status bar whenever Gnirehtet is active:

key

Alternatively, you can enable reverse tethering for all connected devices (present and future) by calling:

shell
./gnirehtet autorun

Run

You can execute the actions separately (it may be useful if you want to reverse tether several devices simultaneously).

Start the relay server and keep it open:

shell
./gnirehtet relay

Install the apk on your Android device:

shell
./gnirehtet install [serial]

In another terminal, for each client, execute:

shell
./gnirehtet start [serial]

To stop a client:

shell
./gnirehtet stop [serial]

To reset the tunnel (useful to get the connection back when a device is unplugged and plugged back while gnirehtet is active):

shell
./gnirehtet tunnel [serial]

The serial parameter is required only if adb devices outputs more than one device.

For advanced options, call ./gnirehtet without arguments to get more details.

Run manually

The gnirehtet program exposes a simple command-line interface that executes lower-level commands. You can call them manually instead.

To start the relay server:

shell
./gnirehtet relay

To install the apk:

shell
adb install -r gnirehtet.apk

To start a client:

shell
adb reverse localabstract:gnirehtet tcp:31416
 adb shell am start -a com.genymobile.gnirehtet.START \\
     -n com.genymobile.gnirehtet/.GnirehtetActivity

To stop a client:

shell
adb shell am start -a com.genymobile.gnirehtet.STOP \\
     -n com.genymobile.gnirehtet/.GnirehtetActivity

Environment variables

ADB defines a custom path to the adb executable:

shell
ADB=/path/to/my/adb ./gnirehtet run

GNIREHTET_APK defines a custom path to gnirehtet.apk:

shell
GNIREHTET_APK=/usr/share/gnirehtet/gnirehtet.apk ./gnirehtet run

Why gnirehtet?

rev <<< tethering
diff --git a/assets/reference_gnirehtet_index.md.CoKB9kcb.lean.js b/assets/reference_gnirehtet_index.md.D76rx-ph.lean.js
similarity index 86%
rename from assets/reference_gnirehtet_index.md.CoKB9kcb.lean.js
rename to assets/reference_gnirehtet_index.md.D76rx-ph.lean.js
index 0f2e7d912..6174122fc 100644
--- a/assets/reference_gnirehtet_index.md.CoKB9kcb.lean.js
+++ b/assets/reference_gnirehtet_index.md.D76rx-ph.lean.js
@@ -1 +1 @@
-import{e as a,o as i,a as t,ag as s}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"Gnirehtet","description":"","frontmatter":{"title":"Gnirehtet"},"headers":[],"relativePath":"reference/gnirehtet/index.md","filePath":"en/reference/gnirehtet/index.md","lastUpdated":1776916170000}'),n={name:"reference/gnirehtet/index.md"};function l(r,e,o,h,p,d){return i(),t("div",null,[...e[0]||(e[0]=[s("",89)])])}const u=a(n,[["render",l]]);export{g as __pageData,u as default};
+import{e as a,o as i,a as t,ag as s}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"Gnirehtet","description":"","frontmatter":{"title":"Gnirehtet"},"headers":[],"relativePath":"reference/gnirehtet/index.md","filePath":"en/reference/gnirehtet/index.md","lastUpdated":1777999882000}'),n={name:"reference/gnirehtet/index.md"};function l(r,e,o,h,p,d){return i(),t("div",null,[...e[0]||(e[0]=[s("",89)])])}const u=a(n,[["render",l]]);export{g as __pageData,u as default};
diff --git a/assets/reference_index.md.EmNgEN4K.js b/assets/reference_index.md.BMtFiAcA.js
similarity index 92%
rename from assets/reference_index.md.EmNgEN4K.js
rename to assets/reference_index.md.BMtFiAcA.js
index 93b22b073..17031cd63 100644
--- a/assets/reference_index.md.EmNgEN4K.js
+++ b/assets/reference_index.md.BMtFiAcA.js
@@ -1 +1 @@
-import{e as n,o as t,a,h as e,J as c}from"./chunks/framework.D2Fz4Hoy.js";const h=JSON.parse('{"title":"Reference","description":"","frontmatter":{"title":"Reference"},"headers":[],"relativePath":"reference/index.md","filePath":"en/reference/index.md","lastUpdated":1776916170000}'),l={name:"reference/index.md"};function i(o,r,s,d,f,p){return t(),a("div",null,[...r[0]||(r[0]=[e("h1",{id:"reference",tabindex:"-1"},[c("Reference "),e("a",{class:"header-anchor",href:"#reference","aria-label":'Permalink to "Reference"'},"​")],-1),e("p",null,"Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.",-1),e("ul",null,[e("li",null,[e("a",{href:"/reference/scrcpy/"},"Scrcpy")]),e("li",null,[e("a",{href:"/reference/gnirehtet/"},"Gnirehtet")])],-1)])])}const m=n(l,[["render",i]]);export{h as __pageData,m as default};
+import{e as n,o as t,a,h as e,J as c}from"./chunks/framework.D2Fz4Hoy.js";const h=JSON.parse('{"title":"Reference","description":"","frontmatter":{"title":"Reference"},"headers":[],"relativePath":"reference/index.md","filePath":"en/reference/index.md","lastUpdated":1777999882000}'),l={name:"reference/index.md"};function i(o,r,s,d,f,p){return t(),a("div",null,[...r[0]||(r[0]=[e("h1",{id:"reference",tabindex:"-1"},[c("Reference "),e("a",{class:"header-anchor",href:"#reference","aria-label":'Permalink to "Reference"'},"​")],-1),e("p",null,"Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.",-1),e("ul",null,[e("li",null,[e("a",{href:"/reference/scrcpy/"},"Scrcpy")]),e("li",null,[e("a",{href:"/reference/gnirehtet/"},"Gnirehtet")])],-1)])])}const m=n(l,[["render",i]]);export{h as __pageData,m as default};
diff --git a/assets/reference_index.md.EmNgEN4K.lean.js b/assets/reference_index.md.BMtFiAcA.lean.js
similarity index 92%
rename from assets/reference_index.md.EmNgEN4K.lean.js
rename to assets/reference_index.md.BMtFiAcA.lean.js
index 93b22b073..17031cd63 100644
--- a/assets/reference_index.md.EmNgEN4K.lean.js
+++ b/assets/reference_index.md.BMtFiAcA.lean.js
@@ -1 +1 @@
-import{e as n,o as t,a,h as e,J as c}from"./chunks/framework.D2Fz4Hoy.js";const h=JSON.parse('{"title":"Reference","description":"","frontmatter":{"title":"Reference"},"headers":[],"relativePath":"reference/index.md","filePath":"en/reference/index.md","lastUpdated":1776916170000}'),l={name:"reference/index.md"};function i(o,r,s,d,f,p){return t(),a("div",null,[...r[0]||(r[0]=[e("h1",{id:"reference",tabindex:"-1"},[c("Reference "),e("a",{class:"header-anchor",href:"#reference","aria-label":'Permalink to "Reference"'},"​")],-1),e("p",null,"Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.",-1),e("ul",null,[e("li",null,[e("a",{href:"/reference/scrcpy/"},"Scrcpy")]),e("li",null,[e("a",{href:"/reference/gnirehtet/"},"Gnirehtet")])],-1)])])}const m=n(l,[["render",i]]);export{h as __pageData,m as default};
+import{e as n,o as t,a,h as e,J as c}from"./chunks/framework.D2Fz4Hoy.js";const h=JSON.parse('{"title":"Reference","description":"","frontmatter":{"title":"Reference"},"headers":[],"relativePath":"reference/index.md","filePath":"en/reference/index.md","lastUpdated":1777999882000}'),l={name:"reference/index.md"};function i(o,r,s,d,f,p){return t(),a("div",null,[...r[0]||(r[0]=[e("h1",{id:"reference",tabindex:"-1"},[c("Reference "),e("a",{class:"header-anchor",href:"#reference","aria-label":'Permalink to "Reference"'},"​")],-1),e("p",null,"Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.",-1),e("ul",null,[e("li",null,[e("a",{href:"/reference/scrcpy/"},"Scrcpy")]),e("li",null,[e("a",{href:"/reference/gnirehtet/"},"Gnirehtet")])],-1)])])}const m=n(l,[["render",i]]);export{h as __pageData,m as default};
diff --git a/assets/reference_scrcpy_audio.md.D6IOAVz-.js b/assets/reference_scrcpy_audio.md.BNd8vqbG.js
similarity index 99%
rename from assets/reference_scrcpy_audio.md.D6IOAVz-.js
rename to assets/reference_scrcpy_audio.md.BNd8vqbG.js
index 8d49afcb8..6a0d4d54b 100644
--- a/assets/reference_scrcpy_audio.md.D6IOAVz-.js
+++ b/assets/reference_scrcpy_audio.md.BNd8vqbG.js
@@ -1,4 +1,4 @@
-import{e as a,o as i,a as s,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Audio","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/audio.md","filePath":"en/reference/scrcpy/audio.md","lastUpdated":1776916170000}'),t={name:"reference/scrcpy/audio.md"};function d(n,e,r,c,p,l){return i(),s("div",null,[...e[0]||(e[0]=[o(`

Audio

Audio forwarding is supported for devices with Android 11 or higher, and it is enabled by default:

  • For Android 12 or newer, it works out-of-the-box.
  • For Android 11, you'll need to ensure that the device screen is unlocked when starting scrcpy. A fake popup will briefly appear to make the system think that the shell app is in the foreground. Without this, audio capture will fail.
  • For Android 10 or earlier, audio cannot be captured and is automatically disabled.

If audio capture fails, then mirroring continues with video only (since audio is enabled by default, it is not acceptable to make scrcpy fail if it is not available), unless --require-audio is set.

No audio

To disable audio:

scrcpy --no-audio

To disable only the audio playback, see no playback.

Audio only

To play audio only, disable video and control:

bash
scrcpy --no-video --no-control

To play audio without a window:

bash
# --no-video and --no-control are implied by --no-window
+import{e as a,o as i,a as s,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Audio","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/audio.md","filePath":"en/reference/scrcpy/audio.md","lastUpdated":1777999882000}'),t={name:"reference/scrcpy/audio.md"};function d(n,e,r,c,p,l){return i(),s("div",null,[...e[0]||(e[0]=[o(`

Audio

Audio forwarding is supported for devices with Android 11 or higher, and it is enabled by default:

  • For Android 12 or newer, it works out-of-the-box.
  • For Android 11, you'll need to ensure that the device screen is unlocked when starting scrcpy. A fake popup will briefly appear to make the system think that the shell app is in the foreground. Without this, audio capture will fail.
  • For Android 10 or earlier, audio cannot be captured and is automatically disabled.

If audio capture fails, then mirroring continues with video only (since audio is enabled by default, it is not acceptable to make scrcpy fail if it is not available), unless --require-audio is set.

No audio

To disable audio:

scrcpy --no-audio

To disable only the audio playback, see no playback.

Audio only

To play audio only, disable video and control:

bash
scrcpy --no-video --no-control

To play audio without a window:

bash
# --no-video and --no-control are implied by --no-window
 scrcpy --no-window
 # interrupt with Ctrl+C

Without video, the audio latency is typically not critical, so it might be interesting to add buffering to minimize glitches:

scrcpy --no-video --audio-buffer=200

Source

By default, the device audio output is forwarded.

It is possible to capture the device microphone instead:

scrcpy --audio-source=mic

For example, to use the device as a dictaphone and record a capture directly on the computer:

scrcpy --audio-source=mic --no-video --no-playback --record=file.opus

Many sources are available:

  • output (default): forwards the whole audio output, and disables playback on the device (mapped to REMOTE_SUBMIX).
  • playback: captures the audio playback (Android apps can opt-out, so the whole output is not necessarily captured).
  • mic: captures the microphone (mapped to MIC).
  • mic-unprocessed: captures the microphone unprocessed (raw) sound (mapped to UNPROCESSED).
  • mic-camcorder: captures the microphone tuned for video recording, with the same orientation as the camera if available (mapped to CAMCORDER).
  • mic-voice-recognition: captures the microphone tuned for voice recognition (mapped to VOICE_RECOGNITION).
  • mic-voice-communication: captures the microphone tuned for voice communications (it will for instance take advantage of echo cancellation or automatic gain control if available) (mapped to VOICE_COMMUNICATION).
  • voice-call: captures voice call (mapped to VOICE_CALL).
  • voice-call-uplink: captures voice call uplink only (mapped to VOICE_UPLINK).
  • voice-call-downlink: captures voice call downlink only (mapped to VOICE_DOWNLINK).
  • voice-performance: captures audio meant to be processed for live performance (karaoke), includes both the microphone and the device playback (mapped to VOICE_PERFORMANCE).

Duplication

An alternative device audio capture method is also available (only for Android 13 and above):

scrcpy --audio-source=playback

This audio source supports keeping the audio playing on the device while mirroring, with --audio-dup:

bash
scrcpy --audio-source=playback --audio-dup
 # or simply:
diff --git a/assets/reference_scrcpy_audio.md.D6IOAVz-.lean.js b/assets/reference_scrcpy_audio.md.BNd8vqbG.lean.js
similarity index 85%
rename from assets/reference_scrcpy_audio.md.D6IOAVz-.lean.js
rename to assets/reference_scrcpy_audio.md.BNd8vqbG.lean.js
index 1181c9d9b..0cb5d65ea 100644
--- a/assets/reference_scrcpy_audio.md.D6IOAVz-.lean.js
+++ b/assets/reference_scrcpy_audio.md.BNd8vqbG.lean.js
@@ -1 +1 @@
-import{e as a,o as i,a as s,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Audio","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/audio.md","filePath":"en/reference/scrcpy/audio.md","lastUpdated":1776916170000}'),t={name:"reference/scrcpy/audio.md"};function d(n,e,r,c,p,l){return i(),s("div",null,[...e[0]||(e[0]=[o("",57)])])}const k=a(t,[["render",d]]);export{u as __pageData,k as default};
+import{e as a,o as i,a as s,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Audio","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/audio.md","filePath":"en/reference/scrcpy/audio.md","lastUpdated":1777999882000}'),t={name:"reference/scrcpy/audio.md"};function d(n,e,r,c,p,l){return i(),s("div",null,[...e[0]||(e[0]=[o("",57)])])}const k=a(t,[["render",d]]);export{u as __pageData,k as default};
diff --git a/assets/reference_scrcpy_build.md.jEwBzyHk.js b/assets/reference_scrcpy_build.md.CP3zb9UV.js
similarity index 99%
rename from assets/reference_scrcpy_build.md.jEwBzyHk.js
rename to assets/reference_scrcpy_build.md.CP3zb9UV.js
index cce78c9af..a4a90fa82 100644
--- a/assets/reference_scrcpy_build.md.jEwBzyHk.js
+++ b/assets/reference_scrcpy_build.md.CP3zb9UV.js
@@ -1,4 +1,4 @@
-import{e as i,o as a,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"Build scrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/build.md","filePath":"en/reference/scrcpy/build.md","lastUpdated":1776916170000}'),l={name:"reference/scrcpy/build.md"};function t(h,s,p,r,k,d){return a(),e("div",null,[...s[0]||(s[0]=[n(`

Build scrcpy

Here are the instructions to build scrcpy (client and server).

If you just want to build and install the latest release, follow the simplified process described in doc/linux.md.

Branches

There are two main branches:

  • master: contains the latest release. It is the home page of the project on GitHub.
  • dev: the current development branch. Every commit present in dev will be in the next release.

If you want to contribute code, please base your commits on the latest dev branch.

Requirements

You need adb. It is available in the Android SDK platform tools, or packaged in your distribution (adb).

On Windows, download the platform-tools and extract the following files to a directory accessible from your PATH:

  • adb.exe
  • AdbWinApi.dll
  • AdbWinUsbApi.dll

It is also available in scrcpy releases.

The client requires FFmpeg and LibSDL2. Just follow the instructions.

System-specific steps

Linux

Install the required packages from your package manager.

Debian/Ubuntu

bash
# runtime dependencies
+import{e as i,o as a,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"Build scrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/build.md","filePath":"en/reference/scrcpy/build.md","lastUpdated":1777999882000}'),l={name:"reference/scrcpy/build.md"};function t(h,s,p,r,k,d){return a(),e("div",null,[...s[0]||(s[0]=[n(`

Build scrcpy

Here are the instructions to build scrcpy (client and server).

If you just want to build and install the latest release, follow the simplified process described in doc/linux.md.

Branches

There are two main branches:

  • master: contains the latest release. It is the home page of the project on GitHub.
  • dev: the current development branch. Every commit present in dev will be in the next release.

If you want to contribute code, please base your commits on the latest dev branch.

Requirements

You need adb. It is available in the Android SDK platform tools, or packaged in your distribution (adb).

On Windows, download the platform-tools and extract the following files to a directory accessible from your PATH:

  • adb.exe
  • AdbWinApi.dll
  • AdbWinUsbApi.dll

It is also available in scrcpy releases.

The client requires FFmpeg and LibSDL2. Just follow the instructions.

System-specific steps

Linux

Install the required packages from your package manager.

Debian/Ubuntu

bash
# runtime dependencies
 sudo apt install ffmpeg libsdl2-2.0-0 adb libusb-1.0-0
 
 # client build dependencies
diff --git a/assets/reference_scrcpy_build.md.jEwBzyHk.lean.js b/assets/reference_scrcpy_build.md.CP3zb9UV.lean.js
similarity index 86%
rename from assets/reference_scrcpy_build.md.jEwBzyHk.lean.js
rename to assets/reference_scrcpy_build.md.CP3zb9UV.lean.js
index a729b0434..a89d8286b 100644
--- a/assets/reference_scrcpy_build.md.jEwBzyHk.lean.js
+++ b/assets/reference_scrcpy_build.md.CP3zb9UV.lean.js
@@ -1 +1 @@
-import{e as i,o as a,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"Build scrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/build.md","filePath":"en/reference/scrcpy/build.md","lastUpdated":1776916170000}'),l={name:"reference/scrcpy/build.md"};function t(h,s,p,r,k,d){return a(),e("div",null,[...s[0]||(s[0]=[n("",72)])])}const F=i(l,[["render",t]]);export{c as __pageData,F as default};
+import{e as i,o as a,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"Build scrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/build.md","filePath":"en/reference/scrcpy/build.md","lastUpdated":1777999882000}'),l={name:"reference/scrcpy/build.md"};function t(h,s,p,r,k,d){return a(),e("div",null,[...s[0]||(s[0]=[n("",72)])])}const F=i(l,[["render",t]]);export{c as __pageData,F as default};
diff --git a/assets/reference_scrcpy_camera.md.BdHJXJkv.js b/assets/reference_scrcpy_camera.md.DPv7cum1.js
similarity index 99%
rename from assets/reference_scrcpy_camera.md.BdHJXJkv.js
rename to assets/reference_scrcpy_camera.md.DPv7cum1.js
index 218ab0551..24eab0c41 100644
--- a/assets/reference_scrcpy_camera.md.BdHJXJkv.js
+++ b/assets/reference_scrcpy_camera.md.DPv7cum1.js
@@ -1,4 +1,4 @@
-import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Camera","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/camera.md","filePath":"en/reference/scrcpy/camera.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/camera.md"};function p(r,s,h,l,c,d){return e(),i("div",null,[...s[0]||(s[0]=[t(`

Camera

Camera mirroring is supported for devices with Android 12 or higher.

To capture the camera instead of the device screen:

scrcpy --video-source=camera

By default, it automatically switches audio source to microphone (as if --audio-source=mic were also passed).

bash
scrcpy --video-source=display  # default is --audio-source=output
+import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Camera","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/camera.md","filePath":"en/reference/scrcpy/camera.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/camera.md"};function p(r,s,h,l,c,d){return e(),i("div",null,[...s[0]||(s[0]=[t(`

Camera

Camera mirroring is supported for devices with Android 12 or higher.

To capture the camera instead of the device screen:

scrcpy --video-source=camera

By default, it automatically switches audio source to microphone (as if --audio-source=mic were also passed).

bash
scrcpy --video-source=display  # default is --audio-source=output
 scrcpy --video-source=camera   # default is --audio-source=mic
 scrcpy --video-source=display --audio-source=mic    # force display AND microphone
 scrcpy --video-source=camera --audio-source=output  # force camera AND device audio output

Audio can be disabled:

bash
# audio not captured at all
diff --git a/assets/reference_scrcpy_camera.md.BdHJXJkv.lean.js b/assets/reference_scrcpy_camera.md.DPv7cum1.lean.js
similarity index 86%
rename from assets/reference_scrcpy_camera.md.BdHJXJkv.lean.js
rename to assets/reference_scrcpy_camera.md.DPv7cum1.lean.js
index 8ee95b115..6c31235f0 100644
--- a/assets/reference_scrcpy_camera.md.BdHJXJkv.lean.js
+++ b/assets/reference_scrcpy_camera.md.DPv7cum1.lean.js
@@ -1 +1 @@
-import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Camera","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/camera.md","filePath":"en/reference/scrcpy/camera.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/camera.md"};function p(r,s,h,l,c,d){return e(),i("div",null,[...s[0]||(s[0]=[t("",49)])])}const g=a(n,[["render",p]]);export{k as __pageData,g as default};
+import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Camera","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/camera.md","filePath":"en/reference/scrcpy/camera.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/camera.md"};function p(r,s,h,l,c,d){return e(),i("div",null,[...s[0]||(s[0]=[t("",49)])])}const g=a(n,[["render",p]]);export{k as __pageData,g as default};
diff --git a/assets/reference_scrcpy_connection.md.H2I8Yn35.js b/assets/reference_scrcpy_connection.md.NXdIkpOM.js
similarity index 99%
rename from assets/reference_scrcpy_connection.md.H2I8Yn35.js
rename to assets/reference_scrcpy_connection.md.NXdIkpOM.js
index 41a61d327..d102c28a8 100644
--- a/assets/reference_scrcpy_connection.md.H2I8Yn35.js
+++ b/assets/reference_scrcpy_connection.md.NXdIkpOM.js
@@ -1,4 +1,4 @@
-import{e as i,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Connection","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/connection.md","filePath":"en/reference/scrcpy/connection.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/connection.md"};function l(p,s,h,c,o,d){return a(),e("div",null,[...s[0]||(s[0]=[t(`

Connection

Selection

If exactly one device is connected (i.e. listed by adb devices), then it is automatically selected.

However, if there are multiple devices connected, you must specify the one to use in one of 4 ways:

  • by its serial:

    bash
    scrcpy --serial=0123456789abcdef
    +import{e as i,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Connection","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/connection.md","filePath":"en/reference/scrcpy/connection.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/connection.md"};function l(p,s,h,c,o,d){return a(),e("div",null,[...s[0]||(s[0]=[t(`

    Connection

    Selection

    If exactly one device is connected (i.e. listed by adb devices), then it is automatically selected.

    However, if there are multiple devices connected, you must specify the one to use in one of 4 ways:

    • by its serial:

      bash
      scrcpy --serial=0123456789abcdef
       scrcpy -s 0123456789abcdef   # short version
       
       # the serial is the ip:port if connected over TCP/IP (same behavior as adb)
      diff --git a/assets/reference_scrcpy_connection.md.H2I8Yn35.lean.js b/assets/reference_scrcpy_connection.md.NXdIkpOM.lean.js
      similarity index 86%
      rename from assets/reference_scrcpy_connection.md.H2I8Yn35.lean.js
      rename to assets/reference_scrcpy_connection.md.NXdIkpOM.lean.js
      index f22b09ab8..d34478a2d 100644
      --- a/assets/reference_scrcpy_connection.md.H2I8Yn35.lean.js
      +++ b/assets/reference_scrcpy_connection.md.NXdIkpOM.lean.js
      @@ -1 +1 @@
      -import{e as i,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Connection","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/connection.md","filePath":"en/reference/scrcpy/connection.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/connection.md"};function l(p,s,h,c,o,d){return a(),e("div",null,[...s[0]||(s[0]=[t("",27)])])}const g=i(n,[["render",l]]);export{k as __pageData,g as default};
      +import{e as i,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Connection","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/connection.md","filePath":"en/reference/scrcpy/connection.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/connection.md"};function l(p,s,h,c,o,d){return a(),e("div",null,[...s[0]||(s[0]=[t("",27)])])}const g=i(n,[["render",l]]);export{k as __pageData,g as default};
      diff --git a/assets/reference_scrcpy_control.md.g5G7PvkX.js b/assets/reference_scrcpy_control.md.BLmM_i0H.js
      similarity index 99%
      rename from assets/reference_scrcpy_control.md.g5G7PvkX.js
      rename to assets/reference_scrcpy_control.md.BLmM_i0H.js
      index c718ff8df..57c7ca8b0 100644
      --- a/assets/reference_scrcpy_control.md.g5G7PvkX.js
      +++ b/assets/reference_scrcpy_control.md.BLmM_i0H.js
      @@ -1,4 +1,4 @@
      -import{e as a,o as i,a as s,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Control","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/control.md","filePath":"en/reference/scrcpy/control.md","lastUpdated":1776916170000}'),o={name:"reference/scrcpy/control.md"};function n(d,e,l,r,p,h){return i(),s("div",null,[...e[0]||(e[0]=[t(`

      Control

      Read-only

      To disable controls (everything which can interact with the device: input keys, mouse events, drag&drop files):

      bash
      scrcpy --no-control
      +import{e as a,o as i,a as s,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Control","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/control.md","filePath":"en/reference/scrcpy/control.md","lastUpdated":1777999882000}'),o={name:"reference/scrcpy/control.md"};function n(d,e,l,r,p,h){return i(),s("div",null,[...e[0]||(e[0]=[t(`

      Control

      Read-only

      To disable controls (everything which can interact with the device: input keys, mouse events, drag&drop files):

      bash
      scrcpy --no-control
       scrcpy -n   # short version

      Keyboard and mouse

      Read keyboard and mouse.

      Control only

      To control the device without mirroring:

      bash
      scrcpy --no-video --no-audio

      By default, the mouse is disabled when video playback is turned off.

      To control the device using a relative mouse, enable UHID mouse mode:

      bash
      scrcpy --no-video --no-audio --mouse=uhid
       scrcpy --no-video --no-audio -M  # short version

      To also use a UHID keyboard, set it explicitly:

      bash
      scrcpy --no-video --no-audio --mouse=uhid --keyboard=uhid
       scrcpy --no-video --no-audio -MK  # short version

      To use AOA instead (over USB only):

      bash
      scrcpy --no-video --no-audio --keyboard=aoa --mouse=aoa

      Copy-paste

      Any time the Android clipboard changes, it is automatically synchronized to the computer clipboard.

      Any Ctrl shortcut is forwarded to the device. In particular:

      • Ctrl+c typically copies
      • Ctrl+x typically cuts
      • Ctrl+v typically pastes (after computer-to-device clipboard synchronization)

      This typically works as you expect.

      The actual behavior depends on the active application though. For example, Termux sends SIGINT on Ctrl+c instead, and K-9 Mail composes a new message.

      To copy, cut and paste in such cases (but only supported on Android >= 7):

      • MOD+c injects COPY
      • MOD+x injects CUT
      • MOD+v injects PASTE (after computer-to-device clipboard synchronization)

      In addition, MOD+Shift+v injects the computer clipboard text as a sequence of key events. This is useful when the component does not accept text pasting (for example in Termux), but it can break non-ASCII content.

      WARNING: Pasting the computer clipboard to the device (either via Ctrl+v or MOD+v) copies the content into the Android clipboard. As a consequence, any Android application could read its content. You should avoid pasting sensitive content (like passwords) that way.

      Some Android devices do not behave as expected when setting the device clipboard programmatically. An option --legacy-paste is provided to change the behavior of Ctrl+v and MOD+v so that they also inject the computer clipboard text as a sequence of key events (the same way as MOD+Shift+v).

      To disable automatic clipboard synchronization, use --no-clipboard-autosync.

      Pinch-to-zoom, rotate and tilt simulation

      To simulate "pinch-to-zoom": Ctrl+click-and-move.

      More precisely, hold down Ctrl while pressing the left-click button. Until the left-click button is released, all mouse movements scale and rotate the content (if supported by the app) relative to the center of the screen.

      https://github.com/Genymobile/scrcpy/assets/543275/26c4a920-9805-43f1-8d4c-608752d04767

      To simulate a vertical tilt gesture: Shift+click-and-move-up-or-down.

      https://github.com/Genymobile/scrcpy/assets/543275/1e252341-4a90-4b29-9d11-9153b324669f

      Similarly, to simulate a horizontal tilt gesture: Ctrl+Shift+click-and-move-left-or-right.

      Technically, scrcpy generates additional touch events from a "virtual finger" at a location inverted through the center of the screen. When pressing Ctrl the x and y coordinates are inverted. Using Shift only inverts x, whereas using Ctrl+Shift only inverts y.

      This only works for the default mouse mode (--mouse=sdk).

      File drop

      Install APK

      To install an APK, drag & drop an APK file (ending with .apk) to the scrcpy window.

      There is no visual feedback, a log is printed to the console.

      Push file to device

      To push a file to /sdcard/Download/ on the device, drag & drop a (non-APK) file to the scrcpy window.

      There is no visual feedback, a log is printed to the console.

      The target directory can be changed on start:

      bash
      scrcpy --push-target=/sdcard/Movies/
      `,46)])])}const b=a(o,[["render",n]]);export{k as __pageData,b as default}; diff --git a/assets/reference_scrcpy_control.md.g5G7PvkX.lean.js b/assets/reference_scrcpy_control.md.BLmM_i0H.lean.js similarity index 86% rename from assets/reference_scrcpy_control.md.g5G7PvkX.lean.js rename to assets/reference_scrcpy_control.md.BLmM_i0H.lean.js index 471333cff..c14ae2fa7 100644 --- a/assets/reference_scrcpy_control.md.g5G7PvkX.lean.js +++ b/assets/reference_scrcpy_control.md.BLmM_i0H.lean.js @@ -1 +1 @@ -import{e as a,o as i,a as s,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Control","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/control.md","filePath":"en/reference/scrcpy/control.md","lastUpdated":1776916170000}'),o={name:"reference/scrcpy/control.md"};function n(d,e,l,r,p,h){return i(),s("div",null,[...e[0]||(e[0]=[t("",46)])])}const b=a(o,[["render",n]]);export{k as __pageData,b as default}; +import{e as a,o as i,a as s,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Control","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/control.md","filePath":"en/reference/scrcpy/control.md","lastUpdated":1777999882000}'),o={name:"reference/scrcpy/control.md"};function n(d,e,l,r,p,h){return i(),s("div",null,[...e[0]||(e[0]=[t("",46)])])}const b=a(o,[["render",n]]);export{k as __pageData,b as default}; diff --git a/assets/reference_scrcpy_develop.md.CFf49M8d.js b/assets/reference_scrcpy_develop.md.DCwFSoYA.js similarity index 99% rename from assets/reference_scrcpy_develop.md.CFf49M8d.js rename to assets/reference_scrcpy_develop.md.DCwFSoYA.js index ff801a3b6..0dcc15d31 100644 --- a/assets/reference_scrcpy_develop.md.CFf49M8d.js +++ b/assets/reference_scrcpy_develop.md.DCwFSoYA.js @@ -1,4 +1,4 @@ -import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"scrcpy for developers","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/develop.md","filePath":"en/reference/scrcpy/develop.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/develop.md"};function r(o,e,c,l,d,h){return s(),i("div",null,[...e[0]||(e[0]=[t(`

      scrcpy for developers

      Overview

      This application is composed of two parts:

      • the server (scrcpy-server), to be executed on the device,
      • the client (the scrcpy binary), executed on the host computer.

      The client is responsible to push the server to the device and start its execution.

      The client and the server establish communication using separate sockets for video, audio and controls. Any of them may be disabled (but not all), so there are 1, 2 or 3 socket(s).

      The server initially sends the device name on the first socket (it is used for the scrcpy window title), then each socket is used for its own purpose. All reads and writes are performed from a dedicated thread for each socket, both on the client and on the server.

      If video is enabled, then the server sends a raw video stream (H.264 by default) of the device screen, with some additional headers for each packet. The client decodes the video frames, and displays them as soon as possible, without buffering (unless --video-buffer=delay is specified) to minimize latency. The client is not aware of the device rotation (which is handled by the server), it just knows the dimensions of the video frames it receives.

      Similarly, if audio is enabled, then the server sends a raw audio stream (OPUS by default) of the device audio output (or the microphone if --audio-source=mic is specified), with some additional headers for each packet. The client decodes the stream, attempts to keep a minimal latency by maintaining an average buffering. The blog post of the scrcpy v2.0 release gives more details about the audio feature.

      If control is enabled, then the client captures relevant keyboard and mouse events, that it transmits to the server, which injects them to the device. This is the only socket which is used in both direction: input events are sent from the client to the device, and when the device clipboard changes, the new content is sent from the device to the client to support seamless copy-paste.

      Note that the client-server roles are expressed at the application level:

      • the server serves video and audio streams, and handle requests from the client,
      • the client controls the device through the server.

      However, by default (when --force-adb-forward is not set), the roles are reversed at the network level:

      • the client opens a server socket and listen on a port before starting the server,
      • the server connects to the client.

      This role inversion guarantees that the connection will not fail due to race conditions without polling.

      Server

      Privileges

      Capturing the screen requires some privileges, which are granted to shell.

      The server is a Java application (with a public static void main(String... args) method), compiled against the Android framework, and executed as shell on the Android device.

      To run such a Java application, the classes must be dexed (typically, to classes.dex). If my.package.MainClass is the main class, compiled to classes.dex, pushed to the device in /data/local/tmp, then it can be run with:

      adb shell CLASSPATH=/data/local/tmp/classes.dex app_process / my.package.MainClass
      +import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"scrcpy for developers","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/develop.md","filePath":"en/reference/scrcpy/develop.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/develop.md"};function r(o,e,c,l,d,h){return s(),i("div",null,[...e[0]||(e[0]=[t(`

      scrcpy for developers

      Overview

      This application is composed of two parts:

      • the server (scrcpy-server), to be executed on the device,
      • the client (the scrcpy binary), executed on the host computer.

      The client is responsible to push the server to the device and start its execution.

      The client and the server establish communication using separate sockets for video, audio and controls. Any of them may be disabled (but not all), so there are 1, 2 or 3 socket(s).

      The server initially sends the device name on the first socket (it is used for the scrcpy window title), then each socket is used for its own purpose. All reads and writes are performed from a dedicated thread for each socket, both on the client and on the server.

      If video is enabled, then the server sends a raw video stream (H.264 by default) of the device screen, with some additional headers for each packet. The client decodes the video frames, and displays them as soon as possible, without buffering (unless --video-buffer=delay is specified) to minimize latency. The client is not aware of the device rotation (which is handled by the server), it just knows the dimensions of the video frames it receives.

      Similarly, if audio is enabled, then the server sends a raw audio stream (OPUS by default) of the device audio output (or the microphone if --audio-source=mic is specified), with some additional headers for each packet. The client decodes the stream, attempts to keep a minimal latency by maintaining an average buffering. The blog post of the scrcpy v2.0 release gives more details about the audio feature.

      If control is enabled, then the client captures relevant keyboard and mouse events, that it transmits to the server, which injects them to the device. This is the only socket which is used in both direction: input events are sent from the client to the device, and when the device clipboard changes, the new content is sent from the device to the client to support seamless copy-paste.

      Note that the client-server roles are expressed at the application level:

      • the server serves video and audio streams, and handle requests from the client,
      • the client controls the device through the server.

      However, by default (when --force-adb-forward is not set), the roles are reversed at the network level:

      • the client opens a server socket and listen on a port before starting the server,
      • the server connects to the client.

      This role inversion guarantees that the connection will not fail due to race conditions without polling.

      Server

      Privileges

      Capturing the screen requires some privileges, which are granted to shell.

      The server is a Java application (with a public static void main(String... args) method), compiled against the Android framework, and executed as shell on the Android device.

      To run such a Java application, the classes must be dexed (typically, to classes.dex). If my.package.MainClass is the main class, compiled to classes.dex, pushed to the device in /data/local/tmp, then it can be run with:

      adb shell CLASSPATH=/data/local/tmp/classes.dex app_process / my.package.MainClass
       

      The path /data/local/tmp is a good candidate to push the server, since it's readable and writable by shell, but not world-writable, so a malicious application may not replace the server just before the client executes it.

      Instead of a raw dex file, app_process accepts a jar containing classes.dex (e.g. an APK). For simplicity, and to benefit from the gradle build system, the server is built to an (unsigned) APK (renamed to scrcpy-server.jar).

      Hidden methods

      Although compiled against the Android framework, hidden methods and classes are not directly accessible (and they may differ from one Android version to another).

      They can be called using reflection though. The communication with hidden components is provided by wrappers classes and aidl.

      Execution

      The server is started by the client basically by executing the following commands:

      bash
      adb push scrcpy-server /data/local/tmp/scrcpy-server.jar
       adb forward tcp:27183 localabstract:scrcpy
       adb shell CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process / com.genymobile.scrcpy.Server 2.1

      The first argument (2.1 in the example) is the client scrcpy version. The server fails if the client and the server do not have the exact same version. The protocol between the client and the server may change from version to version (see protocol below), and there is no backward or forward compatibility (there is no point to use different client and server versions). This check allows to detect misconfiguration (running an older or newer server by mistake).

      It is followed by any number of arguments, in the form of key=value pairs. Their order is irrelevant. The possible keys and associated value types can be found in the server and client code.

      For example, if we execute scrcpy -m1920 --no-audio, then the server execution will look like this:

      bash
      # scid is a random number to identify different clients running on the same device
      diff --git a/assets/reference_scrcpy_develop.md.CFf49M8d.lean.js b/assets/reference_scrcpy_develop.md.DCwFSoYA.lean.js
      similarity index 86%
      rename from assets/reference_scrcpy_develop.md.CFf49M8d.lean.js
      rename to assets/reference_scrcpy_develop.md.DCwFSoYA.lean.js
      index a1f7c7d37..7b8b51d2a 100644
      --- a/assets/reference_scrcpy_develop.md.CFf49M8d.lean.js
      +++ b/assets/reference_scrcpy_develop.md.DCwFSoYA.lean.js
      @@ -1 +1 @@
      -import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"scrcpy for developers","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/develop.md","filePath":"en/reference/scrcpy/develop.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/develop.md"};function r(o,e,c,l,d,h){return s(),i("div",null,[...e[0]||(e[0]=[t("",119)])])}const b=a(n,[["render",r]]);export{m as __pageData,b as default};
      +import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"scrcpy for developers","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/develop.md","filePath":"en/reference/scrcpy/develop.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/develop.md"};function r(o,e,c,l,d,h){return s(),i("div",null,[...e[0]||(e[0]=[t("",119)])])}const b=a(n,[["render",r]]);export{m as __pageData,b as default};
      diff --git a/assets/reference_scrcpy_device.md.DQ_Dt-uj.js b/assets/reference_scrcpy_device.md.wjd2R2RA.js
      similarity index 99%
      rename from assets/reference_scrcpy_device.md.DQ_Dt-uj.js
      rename to assets/reference_scrcpy_device.md.wjd2R2RA.js
      index 5ea0e38b0..2140d1ba5 100644
      --- a/assets/reference_scrcpy_device.md.DQ_Dt-uj.js
      +++ b/assets/reference_scrcpy_device.md.wjd2R2RA.js
      @@ -1,4 +1,4 @@
      -import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Device","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/device.md","filePath":"en/reference/scrcpy/device.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/device.md"};function p(l,s,h,o,d,r){return i(),e("div",null,[...s[0]||(s[0]=[t(`

      Device

      Some command line arguments perform actions on the device itself while scrcpy is running.

      Stay awake

      To prevent the device from sleeping after a delay when the device is plugged in:

      bash
      scrcpy --stay-awake
      +import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Device","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/device.md","filePath":"en/reference/scrcpy/device.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/device.md"};function p(l,s,h,o,d,r){return i(),e("div",null,[...s[0]||(s[0]=[t(`

      Device

      Some command line arguments perform actions on the device itself while scrcpy is running.

      Stay awake

      To prevent the device from sleeping after a delay when the device is plugged in:

      bash
      scrcpy --stay-awake
       scrcpy -w

      The initial state is restored when scrcpy is closed.

      If the device is not plugged in (i.e. only connected over TCP/IP), --stay-awake has no effect (this is the Android behavior).

      This changes the value of stay_on_while_plugged_in, setting which can be changed manually:

      bash
      # get the current show_touches value
       adb shell settings get global stay_on_while_plugged_in
       # enable for AC/USB/wireless chargers
      diff --git a/assets/reference_scrcpy_device.md.DQ_Dt-uj.lean.js b/assets/reference_scrcpy_device.md.wjd2R2RA.lean.js
      similarity index 86%
      rename from assets/reference_scrcpy_device.md.DQ_Dt-uj.lean.js
      rename to assets/reference_scrcpy_device.md.wjd2R2RA.lean.js
      index 3ff64bf3d..fb3f9f28d 100644
      --- a/assets/reference_scrcpy_device.md.DQ_Dt-uj.lean.js
      +++ b/assets/reference_scrcpy_device.md.wjd2R2RA.lean.js
      @@ -1 +1 @@
      -import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Device","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/device.md","filePath":"en/reference/scrcpy/device.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/device.md"};function p(l,s,h,o,d,r){return i(),e("div",null,[...s[0]||(s[0]=[t("",54)])])}const g=a(n,[["render",p]]);export{k as __pageData,g as default};
      +import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Device","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/device.md","filePath":"en/reference/scrcpy/device.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/device.md"};function p(l,s,h,o,d,r){return i(),e("div",null,[...s[0]||(s[0]=[t("",54)])])}const g=a(n,[["render",p]]);export{k as __pageData,g as default};
      diff --git a/assets/reference_scrcpy_gamepad.md.BDgKCUYZ.js b/assets/reference_scrcpy_gamepad.md.FzRzwry2.js
      similarity index 98%
      rename from assets/reference_scrcpy_gamepad.md.BDgKCUYZ.js
      rename to assets/reference_scrcpy_gamepad.md.FzRzwry2.js
      index 9fa96b2af..0d6374f0b 100644
      --- a/assets/reference_scrcpy_gamepad.md.BDgKCUYZ.js
      +++ b/assets/reference_scrcpy_gamepad.md.FzRzwry2.js
      @@ -1,2 +1,2 @@
      -import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Gamepad","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/gamepad.md","filePath":"en/reference/scrcpy/gamepad.md","lastUpdated":1776916170000}'),o={name:"reference/scrcpy/gamepad.md"};function d(r,e,p,n,l,h){return s(),i("div",null,[...e[0]||(e[0]=[t(`

      Gamepad

      Several gamepad input modes are available:

      • --gamepad=disabled (default)
      • --gamepad=uhid (or -G): simulates physical HID gamepads using the UHID kernel module on the device
      • --gamepad=aoa: simulates physical HID gamepads using the AOAv2 protocol

      Physical gamepad simulation

      Two modes allow to simulate physical HID gamepads on the device, one for each physical gamepad plugged into the computer.

      UHID

      This mode simulates physical HID gamepads using the UHID kernel module on the device.

      To enable UHID gamepads, use:

      bash
      scrcpy --gamepad=uhid
      +import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Gamepad","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/gamepad.md","filePath":"en/reference/scrcpy/gamepad.md","lastUpdated":1777999882000}'),o={name:"reference/scrcpy/gamepad.md"};function d(r,e,p,n,l,h){return s(),i("div",null,[...e[0]||(e[0]=[t(`

      Gamepad

      Several gamepad input modes are available:

      • --gamepad=disabled (default)
      • --gamepad=uhid (or -G): simulates physical HID gamepads using the UHID kernel module on the device
      • --gamepad=aoa: simulates physical HID gamepads using the AOAv2 protocol

      Physical gamepad simulation

      Two modes allow to simulate physical HID gamepads on the device, one for each physical gamepad plugged into the computer.

      UHID

      This mode simulates physical HID gamepads using the UHID kernel module on the device.

      To enable UHID gamepads, use:

      bash
      scrcpy --gamepad=uhid
       scrcpy -G  # short version

      Note: UHID may not work on old Android versions due to permission errors.

      AOA

      This mode simulates physical HID gamepads using the AOAv2 protocol.

      To enable AOA gamepads, use:

      bash
      scrcpy --gamepad=aoa

      Contrary to the other mode, it works at the USB level directly (so it only works over USB).

      It does not use the scrcpy server, and does not require adb (USB debugging). Therefore, it is possible to control the device (but not mirror) even with USB debugging disabled (see OTG).

      Note: For some reason, in this mode, Android detects multiple physical gamepads as a single misbehaving one. Use UHID if you need multiple gamepads.

      Note: On Windows, it may only work in OTG mode, not while mirroring (it is not possible to open a USB device if it is already open by another process like the adb daemon).

      `,18)])])}const g=a(o,[["render",d]]);export{m as __pageData,g as default}; diff --git a/assets/reference_scrcpy_gamepad.md.BDgKCUYZ.lean.js b/assets/reference_scrcpy_gamepad.md.FzRzwry2.lean.js similarity index 86% rename from assets/reference_scrcpy_gamepad.md.BDgKCUYZ.lean.js rename to assets/reference_scrcpy_gamepad.md.FzRzwry2.lean.js index f0ef0a252..03e6f4bf9 100644 --- a/assets/reference_scrcpy_gamepad.md.BDgKCUYZ.lean.js +++ b/assets/reference_scrcpy_gamepad.md.FzRzwry2.lean.js @@ -1 +1 @@ -import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Gamepad","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/gamepad.md","filePath":"en/reference/scrcpy/gamepad.md","lastUpdated":1776916170000}'),o={name:"reference/scrcpy/gamepad.md"};function d(r,e,p,n,l,h){return s(),i("div",null,[...e[0]||(e[0]=[t("",18)])])}const g=a(o,[["render",d]]);export{m as __pageData,g as default}; +import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"Gamepad","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/gamepad.md","filePath":"en/reference/scrcpy/gamepad.md","lastUpdated":1777999882000}'),o={name:"reference/scrcpy/gamepad.md"};function d(r,e,p,n,l,h){return s(),i("div",null,[...e[0]||(e[0]=[t("",18)])])}const g=a(o,[["render",d]]);export{m as __pageData,g as default}; diff --git a/assets/reference_scrcpy_index.md.CpFMlC50.js b/assets/reference_scrcpy_index.md.D_zn973Z.js similarity index 99% rename from assets/reference_scrcpy_index.md.CpFMlC50.js rename to assets/reference_scrcpy_index.md.D_zn973Z.js index 81951a836..5bdc636a7 100644 --- a/assets/reference_scrcpy_index.md.CpFMlC50.js +++ b/assets/reference_scrcpy_index.md.D_zn973Z.js @@ -1,4 +1,4 @@ -import{e as a,o as s,a as i,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"reference/scrcpy/index.md","filePath":"en/reference/scrcpy/index.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/index.md"};function t(o,e,l,c,p,h){return s(),i("div",null,[...e[0]||(e[0]=[r(`

      IMPORTANT

      Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.

      scrcpy (v3.2)

      scrcpy

      pronounced "screen copy"

      This application mirrors Android devices (video and audio) connected via USB or TCP/IP and allows control using the computer's keyboard and mouse. It does not require root access or an app installed on the device. It works on Linux, Windows, and macOS.

      screenshot

      It focuses on:

      • lightness: native, displays only the device screen
      • performance: 30~120fps, depending on the device
      • quality: 1920×1080 or above
      • low latency: 35~70ms
      • low startup time: ~1 second to display the first image
      • non-intrusiveness: nothing is left installed on the Android device
      • user benefits: no account, no ads, no internet required
      • freedom: free and open source software

      Its features include:

      Prerequisites

      The Android device requires at least API 21 (Android 5.0).

      Audio forwarding is supported for API >= 30 (Android 11+).

      Make sure you enabled USB debugging on your device(s).

      On some devices (especially Xiaomi), you might get the following error:

      java.lang.SecurityException: Injecting input events requires the caller (or the source of the instrumentation, if any) to have the INJECT_EVENTS permission.

      In that case, you need to enable an additional option USB debugging (Security Settings) (this is an item different from USB debugging) to control it using a keyboard and mouse. Rebooting the device is necessary once this option is set.

      Note that USB debugging is not required to run scrcpy in OTG mode.

      Get the app

      Must-know tips

      Usage examples

      There are a lot of options, documented in separate pages. Here are just some common examples.

      • Capture the screen in H.265 (better quality), limit the size to 1920, limit the frame rate to 60fps, disable audio, and control the device by simulating a physical keyboard:

        bash
        scrcpy --video-codec=h265 --max-size=1920 --max-fps=60 --no-audio --keyboard=uhid
        +import{e as a,o as s,a as i,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"reference/scrcpy/index.md","filePath":"en/reference/scrcpy/index.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/index.md"};function t(o,e,l,c,p,h){return s(),i("div",null,[...e[0]||(e[0]=[r(`

        IMPORTANT

        Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.

        scrcpy (v3.2)

        scrcpy

        pronounced "screen copy"

        This application mirrors Android devices (video and audio) connected via USB or TCP/IP and allows control using the computer's keyboard and mouse. It does not require root access or an app installed on the device. It works on Linux, Windows, and macOS.

        screenshot

        It focuses on:

        • lightness: native, displays only the device screen
        • performance: 30~120fps, depending on the device
        • quality: 1920×1080 or above
        • low latency: 35~70ms
        • low startup time: ~1 second to display the first image
        • non-intrusiveness: nothing is left installed on the Android device
        • user benefits: no account, no ads, no internet required
        • freedom: free and open source software

        Its features include:

        Prerequisites

        The Android device requires at least API 21 (Android 5.0).

        Audio forwarding is supported for API >= 30 (Android 11+).

        Make sure you enabled USB debugging on your device(s).

        On some devices (especially Xiaomi), you might get the following error:

        java.lang.SecurityException: Injecting input events requires the caller (or the source of the instrumentation, if any) to have the INJECT_EVENTS permission.

        In that case, you need to enable an additional option USB debugging (Security Settings) (this is an item different from USB debugging) to control it using a keyboard and mouse. Rebooting the device is necessary once this option is set.

        Note that USB debugging is not required to run scrcpy in OTG mode.

        Get the app

        Must-know tips

        Usage examples

        There are a lot of options, documented in separate pages. Here are just some common examples.

        • Capture the screen in H.265 (better quality), limit the size to 1920, limit the frame rate to 60fps, disable audio, and control the device by simulating a physical keyboard:

          bash
          scrcpy --video-codec=h265 --max-size=1920 --max-fps=60 --no-audio --keyboard=uhid
           scrcpy --video-codec=h265 -m1920 --max-fps=60 --no-audio -K  # short version
        • Start VLC in a new virtual display (separate from the device display):

          bash
          scrcpy --new-display=1920x1080 --start-app=org.videolan.vlc
        • Record the device camera in H.265 at 1920x1080 (and microphone) to an MP4 file:

          bash
          scrcpy --video-source=camera --video-codec=h265 --camera-size=1920x1080 --record=file.mp4
        • Capture the device front camera and expose it as a webcam on the computer (on Linux):

          bash
          scrcpy --video-source=camera --camera-size=1920x1080 --camera-facing=front --v4l2-sink=/dev/video2 --no-playback
        • Control the device without mirroring by simulating a physical keyboard and mouse (USB debugging not required):

          bash
          scrcpy --otg
        • Control the device using gamepad controllers plugged into the computer:

          bash
          scrcpy --gamepad=uhid
           scrcpy -G  # short version

        User documentation

        The application provides a lot of features and configuration options. They are documented in the following pages:

        Resources

        Articles

        Contact

        You can open an issue for bug reports, feature requests or general questions.

        For bug reports, please read the FAQ first, you might find a solution to your problem immediately.

        You can also use:

        I'm @rom1v, the author and maintainer of scrcpy.

        If you appreciate this application, you can support my open source work:

        Licence

        Copyright (C) 2018 Genymobile
         Copyright (C) 2018-2025 Romain Vimont
        diff --git a/assets/reference_scrcpy_index.md.CpFMlC50.lean.js b/assets/reference_scrcpy_index.md.D_zn973Z.lean.js
        similarity index 86%
        rename from assets/reference_scrcpy_index.md.CpFMlC50.lean.js
        rename to assets/reference_scrcpy_index.md.D_zn973Z.lean.js
        index 652610332..8df272083 100644
        --- a/assets/reference_scrcpy_index.md.CpFMlC50.lean.js
        +++ b/assets/reference_scrcpy_index.md.D_zn973Z.lean.js
        @@ -1 +1 @@
        -import{e as a,o as s,a as i,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"reference/scrcpy/index.md","filePath":"en/reference/scrcpy/index.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/index.md"};function t(o,e,l,c,p,h){return s(),i("div",null,[...e[0]||(e[0]=[r("",43)])])}const g=a(n,[["render",t]]);export{u as __pageData,g as default};
        +import{e as a,o as s,a as i,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"reference/scrcpy/index.md","filePath":"en/reference/scrcpy/index.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/index.md"};function t(o,e,l,c,p,h){return s(),i("div",null,[...e[0]||(e[0]=[r("",43)])])}const g=a(n,[["render",t]]);export{u as __pageData,g as default};
        diff --git a/assets/reference_scrcpy_keyboard.md.DopANcGF.js b/assets/reference_scrcpy_keyboard.md.DC8b91AJ.js
        similarity index 99%
        rename from assets/reference_scrcpy_keyboard.md.DopANcGF.js
        rename to assets/reference_scrcpy_keyboard.md.DC8b91AJ.js
        index bb216c885..6dd76b5f5 100644
        --- a/assets/reference_scrcpy_keyboard.md.DopANcGF.js
        +++ b/assets/reference_scrcpy_keyboard.md.DC8b91AJ.js
        @@ -1,2 +1,2 @@
        -import{e as a,o as s,a as t,ag as i}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Keyboard","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/keyboard.md","filePath":"en/reference/scrcpy/keyboard.md","lastUpdated":1776916170000}'),o={name:"reference/scrcpy/keyboard.md"};function r(n,e,d,l,c,h){return s(),t("div",null,[...e[0]||(e[0]=[i(`

        Keyboard

        Several keyboard input modes are available:

        • --keyboard=sdk (default)
        • --keyboard=uhid (or -K): simulates a physical HID keyboard using the UHID kernel module on the device
        • --keyboard=aoa: simulates a physical HID keyboard using the AOAv2 protocol
        • --keyboard=disabled

        By default, sdk is used, but if you use scrcpy regularly, it is recommended to use uhid and configure the keyboard layout once and for all.

        SDK keyboard

        In this mode (--keyboard=sdk, or if the parameter is omitted), keyboard input events are injected at the Android API level. It works everywhere, but it is limited to ASCII and some other characters.

        Note that on some devices, an additional option must be enabled in developer options for this keyboard mode to work. See prerequisites.

        Additional parameters (specific to --keyboard=sdk) described below allow to customize the behavior.

        Text injection preference

        Two kinds of events are generated when typing text:

        • key events, signaling that a key is pressed or released;
        • text events, signaling that a text has been entered.

        By default, numbers and "special characters" are inserted using text events, but letters are injected using key events, so that the keyboard behaves as expected in games (typically for WASD keys).

        But this may cause issues. If you encounter such a problem, you can inject letters as text (or just switch to UHID):

        bash
        scrcpy --prefer-text

        (but this will break keyboard behavior in games)

        On the contrary, you could force to always inject raw key events:

        bash
        scrcpy --raw-key-events

        Key repeat

        By default, holding a key down generates repeated key events. Ths can cause performance problems in some games, where these events are useless anyway.

        To avoid forwarding repeated key events:

        bash
        scrcpy --no-key-repeat

        Physical keyboard simulation

        Two modes allow to simulate a physical HID keyboard on the device.

        To work properly, it is necessary to configure (once and for all) the keyboard layout on the device to match that of the computer.

        The configuration page can be opened in one of the following ways:

        • from the scrcpy window (when uhid or aoa is used), by pressing MOD+k (see shortcuts)
        • from the device, in Settings → System → Languages and input → Physical devices
        • from a terminal on the computer, by executing adb shell am start -a android.settings.HARD_KEYBOARD_SETTINGS

        From this configuration page, it is also possible to enable or disable on-screen keyboard.

        UHID

        This mode simulates a physical HID keyboard using the UHID kernel module on the device.

        To enable UHID keyboard, use:

        bash
        scrcpy --keyboard=uhid
        +import{e as a,o as s,a as t,ag as i}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Keyboard","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/keyboard.md","filePath":"en/reference/scrcpy/keyboard.md","lastUpdated":1777999882000}'),o={name:"reference/scrcpy/keyboard.md"};function r(n,e,d,l,c,h){return s(),t("div",null,[...e[0]||(e[0]=[i(`

        Keyboard

        Several keyboard input modes are available:

        • --keyboard=sdk (default)
        • --keyboard=uhid (or -K): simulates a physical HID keyboard using the UHID kernel module on the device
        • --keyboard=aoa: simulates a physical HID keyboard using the AOAv2 protocol
        • --keyboard=disabled

        By default, sdk is used, but if you use scrcpy regularly, it is recommended to use uhid and configure the keyboard layout once and for all.

        SDK keyboard

        In this mode (--keyboard=sdk, or if the parameter is omitted), keyboard input events are injected at the Android API level. It works everywhere, but it is limited to ASCII and some other characters.

        Note that on some devices, an additional option must be enabled in developer options for this keyboard mode to work. See prerequisites.

        Additional parameters (specific to --keyboard=sdk) described below allow to customize the behavior.

        Text injection preference

        Two kinds of events are generated when typing text:

        • key events, signaling that a key is pressed or released;
        • text events, signaling that a text has been entered.

        By default, numbers and "special characters" are inserted using text events, but letters are injected using key events, so that the keyboard behaves as expected in games (typically for WASD keys).

        But this may cause issues. If you encounter such a problem, you can inject letters as text (or just switch to UHID):

        bash
        scrcpy --prefer-text

        (but this will break keyboard behavior in games)

        On the contrary, you could force to always inject raw key events:

        bash
        scrcpy --raw-key-events

        Key repeat

        By default, holding a key down generates repeated key events. Ths can cause performance problems in some games, where these events are useless anyway.

        To avoid forwarding repeated key events:

        bash
        scrcpy --no-key-repeat

        Physical keyboard simulation

        Two modes allow to simulate a physical HID keyboard on the device.

        To work properly, it is necessary to configure (once and for all) the keyboard layout on the device to match that of the computer.

        The configuration page can be opened in one of the following ways:

        • from the scrcpy window (when uhid or aoa is used), by pressing MOD+k (see shortcuts)
        • from the device, in Settings → System → Languages and input → Physical devices
        • from a terminal on the computer, by executing adb shell am start -a android.settings.HARD_KEYBOARD_SETTINGS

        From this configuration page, it is also possible to enable or disable on-screen keyboard.

        UHID

        This mode simulates a physical HID keyboard using the UHID kernel module on the device.

        To enable UHID keyboard, use:

        bash
        scrcpy --keyboard=uhid
         scrcpy -K  # short version

        Once the keyboard layout is configured (see above), it is the best mode for using the keyboard while mirroring:

        • it works for all characters and IME (contrary to --keyboard=sdk)
        • the on-screen keyboard can be disabled (contrary to --keyboard=sdk)
        • it works over TCP/IP (wirelessly) (contrary to --keyboard=aoa)
        • there are no issues on Windows (contrary to --keyboard=aoa)

        One drawback is that it may not work on old Android versions due to permission errors.

        AOA

        This mode simulates a physical HID keyboard using the AOAv2 protocol.

        To enable AOA keyboard, use:

        bash
        scrcpy --keyboard=aoa

        Contrary to the other modes, it works at the USB level directly (so it only works over USB).

        It does not use the scrcpy server, and does not require adb (USB debugging). Therefore, it is possible to control the device (but not mirror) even with USB debugging disabled (see OTG).

        Note: On Windows, it may only work in OTG mode, not while mirroring (it is not possible to open a USB device if it is already open by another process like the adb daemon).

        `,41)])])}const y=a(o,[["render",r]]);export{k as __pageData,y as default}; diff --git a/assets/reference_scrcpy_keyboard.md.DopANcGF.lean.js b/assets/reference_scrcpy_keyboard.md.DC8b91AJ.lean.js similarity index 86% rename from assets/reference_scrcpy_keyboard.md.DopANcGF.lean.js rename to assets/reference_scrcpy_keyboard.md.DC8b91AJ.lean.js index 3f05703b8..f7e9a38a0 100644 --- a/assets/reference_scrcpy_keyboard.md.DopANcGF.lean.js +++ b/assets/reference_scrcpy_keyboard.md.DC8b91AJ.lean.js @@ -1 +1 @@ -import{e as a,o as s,a as t,ag as i}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Keyboard","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/keyboard.md","filePath":"en/reference/scrcpy/keyboard.md","lastUpdated":1776916170000}'),o={name:"reference/scrcpy/keyboard.md"};function r(n,e,d,l,c,h){return s(),t("div",null,[...e[0]||(e[0]=[i("",41)])])}const y=a(o,[["render",r]]);export{k as __pageData,y as default}; +import{e as a,o as s,a as t,ag as i}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Keyboard","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/keyboard.md","filePath":"en/reference/scrcpy/keyboard.md","lastUpdated":1777999882000}'),o={name:"reference/scrcpy/keyboard.md"};function r(n,e,d,l,c,h){return s(),t("div",null,[...e[0]||(e[0]=[i("",41)])])}const y=a(o,[["render",r]]);export{k as __pageData,y as default}; diff --git a/assets/reference_scrcpy_linux.md.Bzy-SPRq.js b/assets/reference_scrcpy_linux.md.D02q-Gnh.js similarity index 99% rename from assets/reference_scrcpy_linux.md.Bzy-SPRq.js rename to assets/reference_scrcpy_linux.md.D02q-Gnh.js index 2dcc3c605..5fee28a19 100644 --- a/assets/reference_scrcpy_linux.md.Bzy-SPRq.js +++ b/assets/reference_scrcpy_linux.md.D02q-Gnh.js @@ -1,4 +1,4 @@ -import{e as a,o as e,a as i,ag as l}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"On Linux","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/linux.md","filePath":"en/reference/scrcpy/linux.md","lastUpdated":1776916170000}'),t={name:"reference/scrcpy/linux.md"};function n(r,s,p,h,o,c){return e(),i("div",null,[...s[0]||(s[0]=[l(`

        On Linux

        Install

        From the official release

        Download a static build of the latest release:

        and extract it.

        Static builds of scrcpy for Linux are still experimental.

        From your package manager

        Packaging status

        Scrcpy is packaged in several distributions and package managers:

        • Debian/Ubuntu: apt install scrcpy (obsolete version)
        • Arch Linux: pacman -S scrcpy
        • Fedora: dnf copr enable zeno/scrcpy && dnf install scrcpy
        • Gentoo: emerge scrcpy
        • Snap: snap install scrcpy
        • … (see repology)

        From an install script

        To install the latest release from master, follow this simplified process.

        First, you need to install the required packages:

        bash
        # for Debian/Ubuntu
        +import{e as a,o as e,a as i,ag as l}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"On Linux","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/linux.md","filePath":"en/reference/scrcpy/linux.md","lastUpdated":1777999882000}'),t={name:"reference/scrcpy/linux.md"};function n(r,s,p,h,o,c){return e(),i("div",null,[...s[0]||(s[0]=[l(`

        On Linux

        Install

        From the official release

        Download a static build of the latest release:

        and extract it.

        Static builds of scrcpy for Linux are still experimental.

        From your package manager

        Packaging status

        Scrcpy is packaged in several distributions and package managers:

        • Debian/Ubuntu: apt install scrcpy (obsolete version)
        • Arch Linux: pacman -S scrcpy
        • Fedora: dnf copr enable zeno/scrcpy && dnf install scrcpy
        • Gentoo: emerge scrcpy
        • Snap: snap install scrcpy
        • … (see repology)

        From an install script

        To install the latest release from master, follow this simplified process.

        First, you need to install the required packages:

        bash
        # for Debian/Ubuntu
         sudo apt install ffmpeg libsdl2-2.0-0 adb wget \\
                          gcc git pkg-config meson ninja-build libsdl2-dev \\
                          libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev \\
        diff --git a/assets/reference_scrcpy_linux.md.Bzy-SPRq.lean.js b/assets/reference_scrcpy_linux.md.D02q-Gnh.lean.js
        similarity index 85%
        rename from assets/reference_scrcpy_linux.md.Bzy-SPRq.lean.js
        rename to assets/reference_scrcpy_linux.md.D02q-Gnh.lean.js
        index 22ae68421..a324a6b79 100644
        --- a/assets/reference_scrcpy_linux.md.Bzy-SPRq.lean.js
        +++ b/assets/reference_scrcpy_linux.md.D02q-Gnh.lean.js
        @@ -1 +1 @@
        -import{e as a,o as e,a as i,ag as l}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"On Linux","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/linux.md","filePath":"en/reference/scrcpy/linux.md","lastUpdated":1776916170000}'),t={name:"reference/scrcpy/linux.md"};function n(r,s,p,h,o,c){return e(),i("div",null,[...s[0]||(s[0]=[l("",31)])])}const g=a(t,[["render",n]]);export{k as __pageData,g as default};
        +import{e as a,o as e,a as i,ag as l}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"On Linux","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/linux.md","filePath":"en/reference/scrcpy/linux.md","lastUpdated":1777999882000}'),t={name:"reference/scrcpy/linux.md"};function n(r,s,p,h,o,c){return e(),i("div",null,[...s[0]||(s[0]=[l("",31)])])}const g=a(t,[["render",n]]);export{k as __pageData,g as default};
        diff --git a/assets/reference_scrcpy_macos.md.CQicNXQT.js b/assets/reference_scrcpy_macos.md.xpHTIFhL.js
        similarity index 98%
        rename from assets/reference_scrcpy_macos.md.CQicNXQT.js
        rename to assets/reference_scrcpy_macos.md.xpHTIFhL.js
        index a62dce1dc..c1df682bf 100644
        --- a/assets/reference_scrcpy_macos.md.CQicNXQT.js
        +++ b/assets/reference_scrcpy_macos.md.xpHTIFhL.js
        @@ -1 +1 @@
        -import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const b=JSON.parse('{"title":"On macOS","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/macos.md","filePath":"en/reference/scrcpy/macos.md","lastUpdated":1776916170000}'),r={name:"reference/scrcpy/macos.md"};function l(c,a,n,o,p,h){return s(),i("div",null,[...a[0]||(a[0]=[t('

        On macOS

        Install

        From the official release

        Download a static build of the latest release:

        and extract it.

        Static builds of scrcpy for macOS are still experimental.

        From a package manager

        Scrcpy is available in Homebrew:

        bash
        brew install scrcpy

        You need adb, accessible from your PATH. If you don't have it yet:

        bash
        brew install --cask android-platform-tools

        Alternatively, Scrcpy is also available in MacPorts, which sets up adb for you:

        bash
        sudo port install scrcpy

        See build.md to build and install the app manually.

        Run

        Make sure that your device meets the prerequisites.

        Once installed, run from a terminal:

        bash
        scrcpy

        or with arguments (here to disable audio and record to file.mkv):

        bash
        scrcpy --no-audio --record=file.mkv

        Documentation for command line arguments is available:

        • man scrcpy
        • scrcpy --help
        • on github
        ',23)])])}const k=e(r,[["render",l]]);export{b as __pageData,k as default}; +import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const b=JSON.parse('{"title":"On macOS","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/macos.md","filePath":"en/reference/scrcpy/macos.md","lastUpdated":1777999882000}'),r={name:"reference/scrcpy/macos.md"};function l(c,a,n,o,p,h){return s(),i("div",null,[...a[0]||(a[0]=[t('

        On macOS

        Install

        From the official release

        Download a static build of the latest release:

        and extract it.

        Static builds of scrcpy for macOS are still experimental.

        From a package manager

        Scrcpy is available in Homebrew:

        bash
        brew install scrcpy

        You need adb, accessible from your PATH. If you don't have it yet:

        bash
        brew install --cask android-platform-tools

        Alternatively, Scrcpy is also available in MacPorts, which sets up adb for you:

        bash
        sudo port install scrcpy

        See build.md to build and install the app manually.

        Run

        Make sure that your device meets the prerequisites.

        Once installed, run from a terminal:

        bash
        scrcpy

        or with arguments (here to disable audio and record to file.mkv):

        bash
        scrcpy --no-audio --record=file.mkv

        Documentation for command line arguments is available:

        • man scrcpy
        • scrcpy --help
        • on github
        ',23)])])}const k=e(r,[["render",l]]);export{b as __pageData,k as default}; diff --git a/assets/reference_scrcpy_macos.md.CQicNXQT.lean.js b/assets/reference_scrcpy_macos.md.xpHTIFhL.lean.js similarity index 85% rename from assets/reference_scrcpy_macos.md.CQicNXQT.lean.js rename to assets/reference_scrcpy_macos.md.xpHTIFhL.lean.js index c19f62dc4..b90cf60dc 100644 --- a/assets/reference_scrcpy_macos.md.CQicNXQT.lean.js +++ b/assets/reference_scrcpy_macos.md.xpHTIFhL.lean.js @@ -1 +1 @@ -import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const b=JSON.parse('{"title":"On macOS","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/macos.md","filePath":"en/reference/scrcpy/macos.md","lastUpdated":1776916170000}'),r={name:"reference/scrcpy/macos.md"};function l(c,a,n,o,p,h){return s(),i("div",null,[...a[0]||(a[0]=[t("",23)])])}const k=e(r,[["render",l]]);export{b as __pageData,k as default}; +import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const b=JSON.parse('{"title":"On macOS","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/macos.md","filePath":"en/reference/scrcpy/macos.md","lastUpdated":1777999882000}'),r={name:"reference/scrcpy/macos.md"};function l(c,a,n,o,p,h){return s(),i("div",null,[...a[0]||(a[0]=[t("",23)])])}const k=e(r,[["render",l]]);export{b as __pageData,k as default}; diff --git a/assets/reference_scrcpy_mouse.md.NQj8mai2.js b/assets/reference_scrcpy_mouse.md.DaBiTfPw.js similarity index 99% rename from assets/reference_scrcpy_mouse.md.NQj8mai2.js rename to assets/reference_scrcpy_mouse.md.DaBiTfPw.js index 5e6af0512..16c461a92 100644 --- a/assets/reference_scrcpy_mouse.md.NQj8mai2.js +++ b/assets/reference_scrcpy_mouse.md.DaBiTfPw.js @@ -1,4 +1,4 @@ -import{e as s,o as a,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Mouse","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/mouse.md","filePath":"en/reference/scrcpy/mouse.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/mouse.md"};function o(l,e,d,c,h,p){return a(),i("div",null,[...e[0]||(e[0]=[t(`

        Mouse

        Several mouse input modes are available:

        • --mouse=sdk (default)
        • --mouse=uhid (or -M): simulates a physical HID mouse using the UHID kernel module on the device
        • --mouse=aoa: simulates a physical HID mouse using the AOAv2 protocol
        • --mouse=disabled

        SDK mouse

        In this mode (--mouse=sdk, or if the parameter is omitted), mouse input events are injected at the Android API level with absolute coordinates.

        Note that on some devices, an additional option must be enabled in developer options for this mouse mode to work. See prerequisites.

        Mouse hover

        By default, mouse hover (mouse motion without any clicks) events are forwarded to the device. This can be disabled with:

        scrcpy --no-mouse-hover

        Physical mouse simulation

        Two modes allow to simulate a physical HID mouse on the device.

        In these modes, the computer mouse is "captured": the mouse pointer disappears from the computer and appears on the Android device instead.

        The shortcut mod (either Alt or Super by default) toggle (disable or enable) the mouse capture. Use one of them to give the control of the mouse back to the computer.

        UHID

        This mode simulates a physical HID mouse using the UHID kernel module on the device.

        To enable UHID mouse, use:

        bash
        scrcpy --mouse=uhid
        +import{e as s,o as a,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Mouse","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/mouse.md","filePath":"en/reference/scrcpy/mouse.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/mouse.md"};function o(l,e,d,c,h,p){return a(),i("div",null,[...e[0]||(e[0]=[t(`

        Mouse

        Several mouse input modes are available:

        • --mouse=sdk (default)
        • --mouse=uhid (or -M): simulates a physical HID mouse using the UHID kernel module on the device
        • --mouse=aoa: simulates a physical HID mouse using the AOAv2 protocol
        • --mouse=disabled

        SDK mouse

        In this mode (--mouse=sdk, or if the parameter is omitted), mouse input events are injected at the Android API level with absolute coordinates.

        Note that on some devices, an additional option must be enabled in developer options for this mouse mode to work. See prerequisites.

        Mouse hover

        By default, mouse hover (mouse motion without any clicks) events are forwarded to the device. This can be disabled with:

        scrcpy --no-mouse-hover

        Physical mouse simulation

        Two modes allow to simulate a physical HID mouse on the device.

        In these modes, the computer mouse is "captured": the mouse pointer disappears from the computer and appears on the Android device instead.

        The shortcut mod (either Alt or Super by default) toggle (disable or enable) the mouse capture. Use one of them to give the control of the mouse back to the computer.

        UHID

        This mode simulates a physical HID mouse using the UHID kernel module on the device.

        To enable UHID mouse, use:

        bash
        scrcpy --mouse=uhid
         scrcpy -M  # short version

        Note: UHID may not work on old Android versions due to permission errors.

        AOA

        This mode simulates a physical HID mouse using the AOAv2 protocol.

        To enable AOA mouse, use:

        bash
        scrcpy --mouse=aoa

        Contrary to the other modes, it works at the USB level directly (so it only works over USB).

        It does not use the scrcpy server, and does not require adb (USB debugging). Therefore, it is possible to control the device (but not mirror) even with USB debugging disabled (see OTG).

        Note: On Windows, it may only work in OTG mode, not while mirroring (it is not possible to open a USB device if it is already open by another process like the adb daemon).

        Mouse bindings

        By default, with SDK mouse:

        • right-click triggers BACK (or POWER on)
        • middle-click triggers HOME
        • the 4th click triggers APP_SWITCH
        • the 5th click expands the notification panel

        The secondary clicks may be forwarded to the device instead by pressing the Shift key (e.g. Shift+right-click injects a right click to the device).

        In AOA and UHID mouse modes, the default bindings are reversed: all clicks are forwarded by default, and pressing Shift gives access to the shortcuts (since the cursor is handled on the device side, it makes more sense to forward all mouse buttons by default in these modes).

        The shortcuts can be configured using --mouse-bind=xxxx:xxxx for any mouse mode. The argument must be one or two sequences (separated by :) of exactly 4 characters, one for each secondary click:

                          .---- Shift + right click
                SECONDARY  |.--- Shift + middle click
                 BINDINGS  ||.-- Shift + 4th click
        diff --git a/assets/reference_scrcpy_mouse.md.NQj8mai2.lean.js b/assets/reference_scrcpy_mouse.md.DaBiTfPw.lean.js
        similarity index 85%
        rename from assets/reference_scrcpy_mouse.md.NQj8mai2.lean.js
        rename to assets/reference_scrcpy_mouse.md.DaBiTfPw.lean.js
        index da4f5df7a..382c693ed 100644
        --- a/assets/reference_scrcpy_mouse.md.NQj8mai2.lean.js
        +++ b/assets/reference_scrcpy_mouse.md.DaBiTfPw.lean.js
        @@ -1 +1 @@
        -import{e as s,o as a,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Mouse","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/mouse.md","filePath":"en/reference/scrcpy/mouse.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/mouse.md"};function o(l,e,d,c,h,p){return a(),i("div",null,[...e[0]||(e[0]=[t("",38)])])}const k=s(n,[["render",o]]);export{u as __pageData,k as default};
        +import{e as s,o as a,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Mouse","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/mouse.md","filePath":"en/reference/scrcpy/mouse.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/mouse.md"};function o(l,e,d,c,h,p){return a(),i("div",null,[...e[0]||(e[0]=[t("",38)])])}const k=s(n,[["render",o]]);export{u as __pageData,k as default};
        diff --git a/assets/reference_scrcpy_otg.md.CIV5SDzf.js b/assets/reference_scrcpy_otg.md.CBP3ZJbh.js
        similarity index 98%
        rename from assets/reference_scrcpy_otg.md.CIV5SDzf.js
        rename to assets/reference_scrcpy_otg.md.CBP3ZJbh.js
        index 08543cced..0975b5ba3 100644
        --- a/assets/reference_scrcpy_otg.md.CIV5SDzf.js
        +++ b/assets/reference_scrcpy_otg.md.CBP3ZJbh.js
        @@ -1,4 +1,4 @@
        -import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"OTG","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/otg.md","filePath":"en/reference/scrcpy/otg.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/otg.md"};function o(p,s,l,h,d,r){return e(),i("div",null,[...s[0]||(s[0]=[t(`

        OTG

        By default, scrcpy injects input events at the Android API level. As an alternative, it is possible to send HID events, so that scrcpy behaves as if it was a physical keyboard and/or a physical mouse connected to the Android device (see keyboard and mouse).

        A special mode (OTG) allows to control the device using AOA keyboard, mouse and gamepad, without using adb at all (so USB debugging is not necessary). In this mode, video and audio are disabled, and --keyboard=aoa and --mouse=aoa are implicitly set. However, gamepads are disabled by default, so --gamepad=aoa (or -G in OTG mode) must be explicitly set.

        Therefore, it is possible to run scrcpy with only physical keyboard, mouse and gamepad simulation, as if the computer keyboard, mouse and gamepads were plugged directly to the device via an OTG cable.

        To enable OTG mode:

        bash
        scrcpy --otg
        +import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"OTG","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/otg.md","filePath":"en/reference/scrcpy/otg.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/otg.md"};function o(p,s,l,h,d,r){return e(),i("div",null,[...s[0]||(s[0]=[t(`

        OTG

        By default, scrcpy injects input events at the Android API level. As an alternative, it is possible to send HID events, so that scrcpy behaves as if it was a physical keyboard and/or a physical mouse connected to the Android device (see keyboard and mouse).

        A special mode (OTG) allows to control the device using AOA keyboard, mouse and gamepad, without using adb at all (so USB debugging is not necessary). In this mode, video and audio are disabled, and --keyboard=aoa and --mouse=aoa are implicitly set. However, gamepads are disabled by default, so --gamepad=aoa (or -G in OTG mode) must be explicitly set.

        Therefore, it is possible to run scrcpy with only physical keyboard, mouse and gamepad simulation, as if the computer keyboard, mouse and gamepads were plugged directly to the device via an OTG cable.

        To enable OTG mode:

        bash
        scrcpy --otg
         # Pass the serial if several USB devices are available
         scrcpy --otg -s 0123456789abcdef

        It is possible to disable keyboard or mouse:

        bash
        scrcpy --otg --keyboard=disabled
         scrcpy --otg --mouse=disabled

        and to enable gamepads:

        bash
        scrcpy --otg --gamepad=aoa
        diff --git a/assets/reference_scrcpy_otg.md.CIV5SDzf.lean.js b/assets/reference_scrcpy_otg.md.CBP3ZJbh.lean.js
        similarity index 71%
        rename from assets/reference_scrcpy_otg.md.CIV5SDzf.lean.js
        rename to assets/reference_scrcpy_otg.md.CBP3ZJbh.lean.js
        index 6f247f5b6..adf04b213 100644
        --- a/assets/reference_scrcpy_otg.md.CIV5SDzf.lean.js
        +++ b/assets/reference_scrcpy_otg.md.CBP3ZJbh.lean.js
        @@ -1 +1 @@
        -import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"OTG","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/otg.md","filePath":"en/reference/scrcpy/otg.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/otg.md"};function o(p,s,l,h,d,r){return e(),i("div",null,[...s[0]||(s[0]=[t("",19)])])}const y=a(n,[["render",o]]);export{k as __pageData,y as default};
        +import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"OTG","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/otg.md","filePath":"en/reference/scrcpy/otg.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/otg.md"};function o(p,s,l,h,d,r){return e(),i("div",null,[...s[0]||(s[0]=[t("",19)])])}const y=a(n,[["render",o]]);export{k as __pageData,y as default};
        diff --git a/assets/reference_scrcpy_recording.md.-SVrdjVV.js b/assets/reference_scrcpy_recording.md.642iKMng.js
        similarity index 99%
        rename from assets/reference_scrcpy_recording.md.-SVrdjVV.js
        rename to assets/reference_scrcpy_recording.md.642iKMng.js
        index a54312ee6..6d704e8ba 100644
        --- a/assets/reference_scrcpy_recording.md.-SVrdjVV.js
        +++ b/assets/reference_scrcpy_recording.md.642iKMng.js
        @@ -1,4 +1,4 @@
        -import{e as a,o as s,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Recording","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/recording.md","filePath":"en/reference/scrcpy/recording.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/recording.md"};function l(p,i,o,d,r,h){return s(),e("div",null,[...i[0]||(i[0]=[t(`

        Recording

        To record video and audio streams while mirroring:

        bash
        scrcpy --record=file.mp4
        +import{e as a,o as s,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Recording","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/recording.md","filePath":"en/reference/scrcpy/recording.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/recording.md"};function l(p,i,o,d,r,h){return s(),e("div",null,[...i[0]||(i[0]=[t(`

        Recording

        To record video and audio streams while mirroring:

        bash
        scrcpy --record=file.mp4
         scrcpy -r file.mkv

        To record only the video:

        bash
        scrcpy --no-audio --record=file.mp4

        To record only the audio:

        bash
        scrcpy --no-video --record=file.opus
         scrcpy --no-video --audio-codec=aac --record=file.aac
         scrcpy --no-video --audio-codec=flac --record=file.flac
        diff --git a/assets/reference_scrcpy_recording.md.-SVrdjVV.lean.js b/assets/reference_scrcpy_recording.md.642iKMng.lean.js
        similarity index 86%
        rename from assets/reference_scrcpy_recording.md.-SVrdjVV.lean.js
        rename to assets/reference_scrcpy_recording.md.642iKMng.lean.js
        index da0efae8d..25639a62e 100644
        --- a/assets/reference_scrcpy_recording.md.-SVrdjVV.lean.js
        +++ b/assets/reference_scrcpy_recording.md.642iKMng.lean.js
        @@ -1 +1 @@
        -import{e as a,o as s,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Recording","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/recording.md","filePath":"en/reference/scrcpy/recording.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/recording.md"};function l(p,i,o,d,r,h){return s(),e("div",null,[...i[0]||(i[0]=[t("",28)])])}const g=a(n,[["render",l]]);export{k as __pageData,g as default};
        +import{e as a,o as s,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Recording","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/recording.md","filePath":"en/reference/scrcpy/recording.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/recording.md"};function l(p,i,o,d,r,h){return s(),e("div",null,[...i[0]||(i[0]=[t("",28)])])}const g=a(n,[["render",l]]);export{k as __pageData,g as default};
        diff --git a/assets/reference_scrcpy_shortcuts.md.DNKNygOp.js b/assets/reference_scrcpy_shortcuts.md.EJ0Z8Ppp.js
        similarity index 99%
        rename from assets/reference_scrcpy_shortcuts.md.DNKNygOp.js
        rename to assets/reference_scrcpy_shortcuts.md.EJ0Z8Ppp.js
        index cd78d23d2..6d4ef9621 100644
        --- a/assets/reference_scrcpy_shortcuts.md.DNKNygOp.js
        +++ b/assets/reference_scrcpy_shortcuts.md.EJ0Z8Ppp.js
        @@ -1,4 +1,4 @@
        -import{e,o as d,a as l,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Shortcuts","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/shortcuts.md","filePath":"en/reference/scrcpy/shortcuts.md","lastUpdated":1776916170000}'),s={name:"reference/scrcpy/shortcuts.md"};function k(i,t,b,a,o,n){return d(),l("div",null,[...t[0]||(t[0]=[r(`

        Shortcuts

        Actions can be performed on the scrcpy window using keyboard and mouse shortcuts.

        In the following list, MOD is the shortcut modifier. By default, it's (left) Alt or (left) Super.

        It can be changed using --shortcut-mod. Possible keys are lctrl, rctrl, lalt, ralt, lsuper and rsuper. For example:

        bash
        # use RCtrl for shortcuts
        +import{e,o as d,a as l,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Shortcuts","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/shortcuts.md","filePath":"en/reference/scrcpy/shortcuts.md","lastUpdated":1777999882000}'),s={name:"reference/scrcpy/shortcuts.md"};function k(i,t,b,a,o,n){return d(),l("div",null,[...t[0]||(t[0]=[r(`

        Shortcuts

        Actions can be performed on the scrcpy window using keyboard and mouse shortcuts.

        In the following list, MOD is the shortcut modifier. By default, it's (left) Alt or (left) Super.

        It can be changed using --shortcut-mod. Possible keys are lctrl, rctrl, lalt, ralt, lsuper and rsuper. For example:

        bash
        # use RCtrl for shortcuts
         scrcpy --shortcut-mod=rctrl
         
         # use either LCtrl or LSuper for shortcuts
        diff --git a/assets/reference_scrcpy_shortcuts.md.DNKNygOp.lean.js b/assets/reference_scrcpy_shortcuts.md.EJ0Z8Ppp.lean.js
        similarity index 86%
        rename from assets/reference_scrcpy_shortcuts.md.DNKNygOp.lean.js
        rename to assets/reference_scrcpy_shortcuts.md.EJ0Z8Ppp.lean.js
        index f02137eeb..b352b2d60 100644
        --- a/assets/reference_scrcpy_shortcuts.md.DNKNygOp.lean.js
        +++ b/assets/reference_scrcpy_shortcuts.md.EJ0Z8Ppp.lean.js
        @@ -1 +1 @@
        -import{e,o as d,a as l,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Shortcuts","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/shortcuts.md","filePath":"en/reference/scrcpy/shortcuts.md","lastUpdated":1776916170000}'),s={name:"reference/scrcpy/shortcuts.md"};function k(i,t,b,a,o,n){return d(),l("div",null,[...t[0]||(t[0]=[r("",11)])])}const h=e(s,[["render",k]]);export{p as __pageData,h as default};
        +import{e,o as d,a as l,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Shortcuts","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/shortcuts.md","filePath":"en/reference/scrcpy/shortcuts.md","lastUpdated":1777999882000}'),s={name:"reference/scrcpy/shortcuts.md"};function k(i,t,b,a,o,n){return d(),l("div",null,[...t[0]||(t[0]=[r("",11)])])}const h=e(s,[["render",k]]);export{p as __pageData,h as default};
        diff --git a/assets/reference_scrcpy_tunnels.md.BkR0y4f4.js b/assets/reference_scrcpy_tunnels.md.-VKAcimy.js
        similarity index 99%
        rename from assets/reference_scrcpy_tunnels.md.BkR0y4f4.js
        rename to assets/reference_scrcpy_tunnels.md.-VKAcimy.js
        index 2882172a5..ef1a4286f 100644
        --- a/assets/reference_scrcpy_tunnels.md.BkR0y4f4.js
        +++ b/assets/reference_scrcpy_tunnels.md.-VKAcimy.js
        @@ -1,4 +1,4 @@
        -import{e as i,o as a,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"Tunnels","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/tunnels.md","filePath":"en/reference/scrcpy/tunnels.md","lastUpdated":1776916170000}'),t={name:"reference/scrcpy/tunnels.md"};function l(h,s,p,k,r,d){return a(),e("div",null,[...s[0]||(s[0]=[n(`

        Tunnels

        Scrcpy is designed to mirror local Android devices. Tunnels allow to connect to a remote device (e.g. over the Internet).

        To connect to a remote device, it is possible to connect a local adb client to a remote adb server (provided they use the same version of the adb protocol).

        Remote ADB server

        To connect to a remote adb server, make the server listen on all interfaces:

        bash
        adb kill-server
        +import{e as i,o as a,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"Tunnels","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/tunnels.md","filePath":"en/reference/scrcpy/tunnels.md","lastUpdated":1777999882000}'),t={name:"reference/scrcpy/tunnels.md"};function l(h,s,p,k,r,d){return a(),e("div",null,[...s[0]||(s[0]=[n(`

        Tunnels

        Scrcpy is designed to mirror local Android devices. Tunnels allow to connect to a remote device (e.g. over the Internet).

        To connect to a remote device, it is possible to connect a local adb client to a remote adb server (provided they use the same version of the adb protocol).

        Remote ADB server

        To connect to a remote adb server, make the server listen on all interfaces:

        bash
        adb kill-server
         adb -a nodaemon server start
         # keep this open

        Warning: all communications between clients and the adb server are unencrypted.

        Suppose that this server is accessible at 192.168.1.2. Then, from another terminal, run scrcpy:

        bash
        # in bash
         export ADB_SERVER_SOCKET=tcp:192.168.1.2:5037
        diff --git a/assets/reference_scrcpy_tunnels.md.BkR0y4f4.lean.js b/assets/reference_scrcpy_tunnels.md.-VKAcimy.lean.js
        similarity index 86%
        rename from assets/reference_scrcpy_tunnels.md.BkR0y4f4.lean.js
        rename to assets/reference_scrcpy_tunnels.md.-VKAcimy.lean.js
        index 16db80fe0..92641bc9c 100644
        --- a/assets/reference_scrcpy_tunnels.md.BkR0y4f4.lean.js
        +++ b/assets/reference_scrcpy_tunnels.md.-VKAcimy.lean.js
        @@ -1 +1 @@
        -import{e as i,o as a,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"Tunnels","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/tunnels.md","filePath":"en/reference/scrcpy/tunnels.md","lastUpdated":1776916170000}'),t={name:"reference/scrcpy/tunnels.md"};function l(h,s,p,k,r,d){return a(),e("div",null,[...s[0]||(s[0]=[n("",29)])])}const g=i(t,[["render",l]]);export{c as __pageData,g as default};
        +import{e as i,o as a,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"Tunnels","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/tunnels.md","filePath":"en/reference/scrcpy/tunnels.md","lastUpdated":1777999882000}'),t={name:"reference/scrcpy/tunnels.md"};function l(h,s,p,k,r,d){return a(),e("div",null,[...s[0]||(s[0]=[n("",29)])])}const g=i(t,[["render",l]]);export{c as __pageData,g as default};
        diff --git a/assets/reference_scrcpy_v4l2.md.DS8efe0e.js b/assets/reference_scrcpy_v4l2.md.8gQpAHLo.js
        similarity index 99%
        rename from assets/reference_scrcpy_v4l2.md.DS8efe0e.js
        rename to assets/reference_scrcpy_v4l2.md.8gQpAHLo.js
        index 9640a40b8..9e60b9be3 100644
        --- a/assets/reference_scrcpy_v4l2.md.DS8efe0e.js
        +++ b/assets/reference_scrcpy_v4l2.md.8gQpAHLo.js
        @@ -1,4 +1,4 @@
        -import{e,o as i,a,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Video4Linux","description":"","frontmatter":{"title":"Video4Linux"},"headers":[],"relativePath":"reference/scrcpy/v4l2.md","filePath":"en/reference/scrcpy/v4l2.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/v4l2.md"};function l(p,s,o,d,h,c){return i(),a("div",null,[...s[0]||(s[0]=[t(`

        Video4Linux

        On Linux, it is possible to send the video stream to a v4l2 loopback device, so that the Android device can be opened like a webcam by any v4l2-capable tool.

        The module v4l2loopback must be installed:

        bash
        sudo apt install v4l2loopback-dkms

        To create a v4l2 device:

        bash
        sudo modprobe v4l2loopback

        This will create a new video device in /dev/videoN, where N is an integer (more options are available to create several devices or devices with specific IDs).

        If you encounter problems detecting your device with Chrome/WebRTC, you can try exclusive_caps mode:

        sudo modprobe v4l2loopback exclusive_caps=1

        To list the enabled devices:

        bash
        # requires v4l-utils package
        +import{e,o as i,a,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Video4Linux","description":"","frontmatter":{"title":"Video4Linux"},"headers":[],"relativePath":"reference/scrcpy/v4l2.md","filePath":"en/reference/scrcpy/v4l2.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/v4l2.md"};function l(p,s,o,d,h,c){return i(),a("div",null,[...s[0]||(s[0]=[t(`

        Video4Linux

        On Linux, it is possible to send the video stream to a v4l2 loopback device, so that the Android device can be opened like a webcam by any v4l2-capable tool.

        The module v4l2loopback must be installed:

        bash
        sudo apt install v4l2loopback-dkms

        To create a v4l2 device:

        bash
        sudo modprobe v4l2loopback

        This will create a new video device in /dev/videoN, where N is an integer (more options are available to create several devices or devices with specific IDs).

        If you encounter problems detecting your device with Chrome/WebRTC, you can try exclusive_caps mode:

        sudo modprobe v4l2loopback exclusive_caps=1

        To list the enabled devices:

        bash
        # requires v4l-utils package
         v4l2-ctl --list-devices
         
         # simple but might be sufficient
        diff --git a/assets/reference_scrcpy_v4l2.md.DS8efe0e.lean.js b/assets/reference_scrcpy_v4l2.md.8gQpAHLo.lean.js
        similarity index 86%
        rename from assets/reference_scrcpy_v4l2.md.DS8efe0e.lean.js
        rename to assets/reference_scrcpy_v4l2.md.8gQpAHLo.lean.js
        index 5363c4bf1..3249cb248 100644
        --- a/assets/reference_scrcpy_v4l2.md.DS8efe0e.lean.js
        +++ b/assets/reference_scrcpy_v4l2.md.8gQpAHLo.lean.js
        @@ -1 +1 @@
        -import{e,o as i,a,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Video4Linux","description":"","frontmatter":{"title":"Video4Linux"},"headers":[],"relativePath":"reference/scrcpy/v4l2.md","filePath":"en/reference/scrcpy/v4l2.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/v4l2.md"};function l(p,s,o,d,h,c){return i(),a("div",null,[...s[0]||(s[0]=[t("",21)])])}const v=e(n,[["render",l]]);export{k as __pageData,v as default};
        +import{e,o as i,a,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Video4Linux","description":"","frontmatter":{"title":"Video4Linux"},"headers":[],"relativePath":"reference/scrcpy/v4l2.md","filePath":"en/reference/scrcpy/v4l2.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/v4l2.md"};function l(p,s,o,d,h,c){return i(),a("div",null,[...s[0]||(s[0]=[t("",21)])])}const v=e(n,[["render",l]]);export{k as __pageData,v as default};
        diff --git a/assets/reference_scrcpy_video.md.DMsAmnyq.js b/assets/reference_scrcpy_video.md.DkxkkzrA.js
        similarity index 99%
        rename from assets/reference_scrcpy_video.md.DMsAmnyq.js
        rename to assets/reference_scrcpy_video.md.DkxkkzrA.js
        index 7c9874b00..e08ac1843 100644
        --- a/assets/reference_scrcpy_video.md.DMsAmnyq.js
        +++ b/assets/reference_scrcpy_video.md.DkxkkzrA.js
        @@ -1,4 +1,4 @@
        -import{e as i,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Video","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/video.md","filePath":"en/reference/scrcpy/video.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/video.md"};function p(l,s,h,r,o,d){return a(),e("div",null,[...s[0]||(s[0]=[t(`

        Video

        Source

        By default, scrcpy mirrors the device screen.

        It is possible to capture the device camera instead.

        See the dedicated camera page.

        Size

        By default, scrcpy attempts to mirror at the Android device resolution.

        It might be useful to mirror at a lower definition to increase performance. To limit both width and height to some maximum value (here 1024):

        bash
        scrcpy --max-size=1024
        +import{e as i,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Video","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/video.md","filePath":"en/reference/scrcpy/video.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/video.md"};function p(l,s,h,r,o,d){return a(),e("div",null,[...s[0]||(s[0]=[t(`

        Video

        Source

        By default, scrcpy mirrors the device screen.

        It is possible to capture the device camera instead.

        See the dedicated camera page.

        Size

        By default, scrcpy attempts to mirror at the Android device resolution.

        It might be useful to mirror at a lower definition to increase performance. To limit both width and height to some maximum value (here 1024):

        bash
        scrcpy --max-size=1024
         scrcpy -m 1024   # short version

        The other dimension is computed so that the Android device aspect ratio is preserved. That way, a device in 1920×1080 will be mirrored at 1024×576.

        If encoding fails, scrcpy automatically tries again with a lower definition (unless --no-downsize-on-error is enabled).

        For camera mirroring, the --max-size value is used to select the camera source size instead (among the available resolutions).

        Bit rate

        The default video bit rate is 8 Mbps. To change it:

        bash
        scrcpy --video-bit-rate=2M
         scrcpy --video-bit-rate=2000000  # equivalent
         scrcpy -b 2M                     # short version

        Frame rate

        The capture frame rate can be limited:

        bash
        scrcpy --max-fps=15

        The actual capture frame rate may be printed to the console:

        scrcpy --print-fps

        It may also be enabled or disabled at anytime with MOD+i (see shortcuts).

        The frame rate is intrinsically variable: a new frame is produced only when the screen content changes. For example, if you play a fullscreen video at 24fps on your device, you should not get more than 24 frames per second in scrcpy.

        Codec

        The video codec can be selected. The possible values are h264 (default), h265 and av1:

        bash
        scrcpy --video-codec=h264  # default
        diff --git a/assets/reference_scrcpy_video.md.DMsAmnyq.lean.js b/assets/reference_scrcpy_video.md.DkxkkzrA.lean.js
        similarity index 85%
        rename from assets/reference_scrcpy_video.md.DMsAmnyq.lean.js
        rename to assets/reference_scrcpy_video.md.DkxkkzrA.lean.js
        index 1843794e1..766f74c70 100644
        --- a/assets/reference_scrcpy_video.md.DMsAmnyq.lean.js
        +++ b/assets/reference_scrcpy_video.md.DkxkkzrA.lean.js
        @@ -1 +1 @@
        -import{e as i,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Video","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/video.md","filePath":"en/reference/scrcpy/video.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/video.md"};function p(l,s,h,r,o,d){return a(),e("div",null,[...s[0]||(s[0]=[t("",80)])])}const y=i(n,[["render",p]]);export{k as __pageData,y as default};
        +import{e as i,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Video","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/video.md","filePath":"en/reference/scrcpy/video.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/video.md"};function p(l,s,h,r,o,d){return a(),e("div",null,[...s[0]||(s[0]=[t("",80)])])}const y=i(n,[["render",p]]);export{k as __pageData,y as default};
        diff --git a/assets/reference_scrcpy_virtual_display.md.DWZ_BrqQ.js b/assets/reference_scrcpy_virtual_display.md.DUhMJ4qt.js
        similarity index 99%
        rename from assets/reference_scrcpy_virtual_display.md.DWZ_BrqQ.js
        rename to assets/reference_scrcpy_virtual_display.md.DUhMJ4qt.js
        index 14b7d1330..acef3dd0f 100644
        --- a/assets/reference_scrcpy_virtual_display.md.DWZ_BrqQ.js
        +++ b/assets/reference_scrcpy_virtual_display.md.DUhMJ4qt.js
        @@ -1,4 +1,4 @@
        -import{e as s,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const y=JSON.parse('{"title":"Virtual display","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/virtual_display.md","filePath":"en/reference/scrcpy/virtual_display.md","lastUpdated":1776916170000}'),l={name:"reference/scrcpy/virtual_display.md"};function p(n,a,d,r,o,h){return i(),e("div",null,[...a[0]||(a[0]=[t(`

        Virtual display

        New display

        To mirror a new virtual display instead of the device screen:

        bash
        scrcpy --new-display=1920x1080
        +import{e as s,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const y=JSON.parse('{"title":"Virtual display","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/virtual_display.md","filePath":"en/reference/scrcpy/virtual_display.md","lastUpdated":1777999882000}'),l={name:"reference/scrcpy/virtual_display.md"};function p(n,a,d,r,o,h){return i(),e("div",null,[...a[0]||(a[0]=[t(`

        Virtual display

        New display

        To mirror a new virtual display instead of the device screen:

        bash
        scrcpy --new-display=1920x1080
         scrcpy --new-display=1920x1080/420  # force 420 dpi
         scrcpy --new-display         # use the main display size and density
         scrcpy --new-display=/240    # use the main display size and 240 dpi

        The new virtual display is destroyed on exit.

        Start app

        On some devices, a launcher is available in the virtual display.

        When no launcher is available (or if is explicitly disabled by --no-vd-system-decorations), the virtual display is empty. In that case, you must start an Android app.

        For example:

        bash
        scrcpy --new-display=1920x1080 --start-app=org.videolan.vlc

        The app may itself be a launcher. For example, to run the open source Fossify Launcher:

        bash
        scrcpy --new-display=1920x1080 --no-vd-system-decorations --start-app=org.fossify.home

        System decorations

        By default, virtual display system decorations are enabled. To disable them, use --no-vd-system-decorations:

        scrcpy --new-display --no-vd-system-decorations

        This is useful for some devices which might display a broken UI, or to disable any default launcher UI available in virtual displays.

        Note that if no app is started, no content will be rendered, so no video frame will be produced at all.

        Destroy on close

        By default, when the virtual display is closed, the running apps are destroyed.

        To move them to the main display instead, use:

        scrcpy --new-display --no-vd-destroy-content

        Display IME policy

        By default, the virtual display IME appears on the default display.

        To make it appear on the local display, use --display-ime-policy=local:

        bash
        scrcpy --display-id=1 --display-ime-policy=local
        diff --git a/assets/reference_scrcpy_virtual_display.md.DWZ_BrqQ.lean.js b/assets/reference_scrcpy_virtual_display.md.DUhMJ4qt.lean.js
        similarity index 87%
        rename from assets/reference_scrcpy_virtual_display.md.DWZ_BrqQ.lean.js
        rename to assets/reference_scrcpy_virtual_display.md.DUhMJ4qt.lean.js
        index 93244a503..7ad7ca19d 100644
        --- a/assets/reference_scrcpy_virtual_display.md.DWZ_BrqQ.lean.js
        +++ b/assets/reference_scrcpy_virtual_display.md.DUhMJ4qt.lean.js
        @@ -1 +1 @@
        -import{e as s,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const y=JSON.parse('{"title":"Virtual display","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/virtual_display.md","filePath":"en/reference/scrcpy/virtual_display.md","lastUpdated":1776916170000}'),l={name:"reference/scrcpy/virtual_display.md"};function p(n,a,d,r,o,h){return i(),e("div",null,[...a[0]||(a[0]=[t("",25)])])}const k=s(l,[["render",p]]);export{y as __pageData,k as default};
        +import{e as s,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const y=JSON.parse('{"title":"Virtual display","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/virtual_display.md","filePath":"en/reference/scrcpy/virtual_display.md","lastUpdated":1777999882000}'),l={name:"reference/scrcpy/virtual_display.md"};function p(n,a,d,r,o,h){return i(),e("div",null,[...a[0]||(a[0]=[t("",25)])])}const k=s(l,[["render",p]]);export{y as __pageData,k as default};
        diff --git a/assets/reference_scrcpy_window.md.CK4PKnAi.js b/assets/reference_scrcpy_window.md.ZBdlXIXk.js
        similarity index 98%
        rename from assets/reference_scrcpy_window.md.CK4PKnAi.js
        rename to assets/reference_scrcpy_window.md.ZBdlXIXk.js
        index 5df960507..5013c8ade 100644
        --- a/assets/reference_scrcpy_window.md.CK4PKnAi.js
        +++ b/assets/reference_scrcpy_window.md.ZBdlXIXk.js
        @@ -1,3 +1,3 @@
        -import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Window","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/window.md","filePath":"en/reference/scrcpy/window.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/window.md"};function l(h,s,d,p,o,r){return e(),i("div",null,[...s[0]||(s[0]=[t(`

        Window

        Disable window

        To disable window (may be useful for recording or for playing audio only):

        bash
        scrcpy --no-window --record=file.mp4
        +import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Window","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/window.md","filePath":"en/reference/scrcpy/window.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/window.md"};function l(h,s,d,p,o,r){return e(),i("div",null,[...s[0]||(s[0]=[t(`

        Window

        Disable window

        To disable window (may be useful for recording or for playing audio only):

        bash
        scrcpy --no-window --record=file.mp4
         # Ctrl+C to interrupt

        Title

        By default, the window title is the device model. It can be changed:

        bash
        scrcpy --window-title='My device'

        Position and size

        The initial window position and size may be specified:

        bash
        scrcpy --window-x=100 --window-y=100 --window-width=800 --window-height=600

        Borderless

        To disable window decorations:

        bash
        scrcpy --window-borderless

        Always on top

        To keep the window always on top:

        bash
        scrcpy --always-on-top

        Fullscreen

        The app may be started directly in fullscreen:

        bash
        scrcpy --fullscreen
         scrcpy -f   # short version

        Fullscreen mode can then be toggled dynamically with MOD+f (see shortcuts).

        Disable screensaver

        By default, scrcpy does not prevent the screensaver from running on the computer. To disable it:

        bash
        scrcpy --disable-screensaver
        `,23)])])}const b=a(n,[["render",l]]);export{k as __pageData,b as default}; diff --git a/assets/reference_scrcpy_window.md.CK4PKnAi.lean.js b/assets/reference_scrcpy_window.md.ZBdlXIXk.lean.js similarity index 86% rename from assets/reference_scrcpy_window.md.CK4PKnAi.lean.js rename to assets/reference_scrcpy_window.md.ZBdlXIXk.lean.js index 593f3fb15..c833dbc83 100644 --- a/assets/reference_scrcpy_window.md.CK4PKnAi.lean.js +++ b/assets/reference_scrcpy_window.md.ZBdlXIXk.lean.js @@ -1 +1 @@ -import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Window","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/window.md","filePath":"en/reference/scrcpy/window.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/window.md"};function l(h,s,d,p,o,r){return e(),i("div",null,[...s[0]||(s[0]=[t("",23)])])}const b=a(n,[["render",l]]);export{k as __pageData,b as default}; +import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Window","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/window.md","filePath":"en/reference/scrcpy/window.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/window.md"};function l(h,s,d,p,o,r){return e(),i("div",null,[...s[0]||(s[0]=[t("",23)])])}const b=a(n,[["render",l]]);export{k as __pageData,b as default}; diff --git a/assets/reference_scrcpy_windows.md.juLBbBsp.js b/assets/reference_scrcpy_windows.md.Ce0Wqs7H.js similarity index 99% rename from assets/reference_scrcpy_windows.md.juLBbBsp.js rename to assets/reference_scrcpy_windows.md.Ce0Wqs7H.js index cc3e67b4d..a982cb378 100644 --- a/assets/reference_scrcpy_windows.md.juLBbBsp.js +++ b/assets/reference_scrcpy_windows.md.Ce0Wqs7H.js @@ -1,3 +1,3 @@ -import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"On Windows","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/windows.md","filePath":"en/reference/scrcpy/windows.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/windows.md"};function o(l,e,r,c,p,h){return s(),i("div",null,[...e[0]||(e[0]=[t(`

        On Windows

        Install

        From the official release

        Download the latest release:

        and extract it.

        From a package manager

        From WinGet (ADB and other dependencies will be installed alongside scrcpy):

        bash
        winget install --exact Genymobile.scrcpy

        From Chocolatey:

        bash
        choco install scrcpy
        +import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"On Windows","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/windows.md","filePath":"en/reference/scrcpy/windows.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/windows.md"};function o(l,e,r,c,p,h){return s(),i("div",null,[...e[0]||(e[0]=[t(`

        On Windows

        Install

        From the official release

        Download the latest release:

        and extract it.

        From a package manager

        From WinGet (ADB and other dependencies will be installed alongside scrcpy):

        bash
        winget install --exact Genymobile.scrcpy

        From Chocolatey:

        bash
        choco install scrcpy
         choco install adb    # if you don't have it yet

        From Scoop:

        bash
        scoop install scrcpy
         scoop install adb    # if you don't have it yet

        See build.md to build and install the app manually.

        Run

        Make sure that your device meets the prerequisites.

        Scrcpy is a command line application: it is mainly intended to be executed from a terminal with command line arguments.

        To open a terminal at the expected location, double-click on open_a_terminal_here.bat in your scrcpy directory, then type your command. For example, without arguments:

        bash
        scrcpy

        or with arguments (here to disable audio and record to file.mkv):

        scrcpy --no-audio --record=file.mkv

        Documentation for command line arguments is available:

        To start scrcpy directly without opening a terminal, double-click on one of these files:

        • scrcpy-console.bat: start with a terminal open (it will close when scrcpy terminates, unless an error occurs);
        • scrcpy-noconsole.vbs: start without a terminal (but you won't see any error message).

        Avoid double-clicking on scrcpy.exe directly: on error, the terminal would close immediately and you won't have time to read any error message (this executable is intended to be run from the terminal). Use scrcpy-console.bat instead.

        If you plan to always use the same arguments, create a file myscrcpy.bat (enable show file extensions to avoid confusion) containing your command, For example:

        bash
        scrcpy --prefer-text --turn-screen-off --stay-awake

        Then just double-click on that file.

        You could also edit (a copy of) scrcpy-console.bat or scrcpy-noconsole.vbs to add some arguments.

        `,30)])])}const u=a(n,[["render",o]]);export{k as __pageData,u as default}; diff --git a/assets/reference_scrcpy_windows.md.juLBbBsp.lean.js b/assets/reference_scrcpy_windows.md.Ce0Wqs7H.lean.js similarity index 86% rename from assets/reference_scrcpy_windows.md.juLBbBsp.lean.js rename to assets/reference_scrcpy_windows.md.Ce0Wqs7H.lean.js index 5b594bd12..4f253707f 100644 --- a/assets/reference_scrcpy_windows.md.juLBbBsp.lean.js +++ b/assets/reference_scrcpy_windows.md.Ce0Wqs7H.lean.js @@ -1 +1 @@ -import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"On Windows","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/windows.md","filePath":"en/reference/scrcpy/windows.md","lastUpdated":1776916170000}'),n={name:"reference/scrcpy/windows.md"};function o(l,e,r,c,p,h){return s(),i("div",null,[...e[0]||(e[0]=[t("",30)])])}const u=a(n,[["render",o]]);export{k as __pageData,u as default}; +import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"On Windows","description":"","frontmatter":{},"headers":[],"relativePath":"reference/scrcpy/windows.md","filePath":"en/reference/scrcpy/windows.md","lastUpdated":1777999882000}'),n={name:"reference/scrcpy/windows.md"};function o(l,e,r,c,p,h){return s(),i("div",null,[...e[0]||(e[0]=[t("",30)])])}const u=a(n,[["render",o]]);export{k as __pageData,u as default}; diff --git a/assets/style.5Nav9ite.css b/assets/style.DD_kAf1a.css similarity index 73% rename from assets/style.5Nav9ite.css rename to assets/style.DD_kAf1a.css index 12b64fac3..22ce7c685 100644 --- a/assets/style.5Nav9ite.css +++ b/assets/style.DD_kAf1a.css @@ -1 +1 @@ -@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: #3c3c43;--vp-c-text-2: #67676c;--vp-c-text-3: #929295}.dark{--vp-c-text-1: #dfdfd6;--vp-c-text-2: #98989f;--vp-c-text-3: #6a6a71}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:lang(es),:lang(pt){--vp-code-copy-copied-text-content: "Copiado"}:lang(fa){--vp-code-copy-copied-text-content: "کپی شد"}:lang(ko){--vp-code-copy-copied-text-content: "복사됨"}:lang(ru){--vp-code-copy-copied-text-content: "Скопировано"}:lang(zh){--vp-code-copy-copied-text-content: "已复制"}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;-webkit-user-select:none;user-select:none;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-e363cfcf]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-e363cfcf],.VPBackdrop.fade-leave-to[data-v-e363cfcf]{opacity:0}.VPBackdrop.fade-leave-active[data-v-e363cfcf]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-e363cfcf]{display:none}}.NotFound[data-v-0ccf90c8]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-0ccf90c8]{padding:96px 32px 168px}}.code[data-v-0ccf90c8]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-0ccf90c8]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-0ccf90c8]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-0ccf90c8]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-0ccf90c8]{padding-top:20px}.link[data-v-0ccf90c8]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-0ccf90c8]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-14dc50eb]{position:relative;z-index:1}.nested[data-v-14dc50eb]{padding-right:16px;padding-left:16px}.outline-link[data-v-14dc50eb]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-14dc50eb]:hover,.outline-link.active[data-v-14dc50eb]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-14dc50eb]{padding-left:13px}.VPDocAsideOutline[data-v-db815389]{display:none}.VPDocAsideOutline.has-outline[data-v-db815389]{display:block}.content[data-v-db815389]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-db815389]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-db815389]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-aa6669ad]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-aa6669ad]{flex-grow:1}.VPDocAside[data-v-aa6669ad] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-aa6669ad] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-aa6669ad] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-674b29ec]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-674b29ec]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-dbf6cb78]{margin-top:64px}.edit-info[data-v-dbf6cb78]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-dbf6cb78]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-dbf6cb78]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-dbf6cb78]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-dbf6cb78]{margin-right:8px}.prev-next[data-v-dbf6cb78]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-dbf6cb78]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-dbf6cb78]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-dbf6cb78]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-dbf6cb78]{margin-left:auto;text-align:right}.desc[data-v-dbf6cb78]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-dbf6cb78]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-9d5e9fc1]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-9d5e9fc1]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-9d5e9fc1]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-9d5e9fc1]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-9d5e9fc1]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-9d5e9fc1]{display:flex;justify-content:center}.VPDoc .aside[data-v-9d5e9fc1]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-9d5e9fc1]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-9d5e9fc1]{max-width:1104px}}.container[data-v-9d5e9fc1]{margin:0 auto;width:100%}.aside[data-v-9d5e9fc1]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-9d5e9fc1]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-9d5e9fc1]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-9d5e9fc1]::-webkit-scrollbar{display:none}.aside-curtain[data-v-9d5e9fc1]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-9d5e9fc1]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-9d5e9fc1]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-9d5e9fc1]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-9d5e9fc1]{order:1;margin:0;min-width:640px}}.content-container[data-v-9d5e9fc1]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-9d5e9fc1]{max-width:688px}.VPButton[data-v-000d56ea]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-000d56ea]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-000d56ea]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-000d56ea]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-000d56ea]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-000d56ea]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-000d56ea]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-000d56ea]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-000d56ea]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-000d56ea]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-000d56ea]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-000d56ea]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-000d56ea]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-4bf6137d]{display:none}.dark .VPImage.light[data-v-4bf6137d]{display:none}.VPHero[data-v-e3f598c4]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-e3f598c4]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-e3f598c4]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-e3f598c4]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-e3f598c4]{flex-direction:row}}.main[data-v-e3f598c4]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-e3f598c4]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-e3f598c4]{text-align:left}}@media (min-width: 960px){.main[data-v-e3f598c4]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-e3f598c4]{max-width:592px}}.heading[data-v-e3f598c4]{display:flex;flex-direction:column}.name[data-v-e3f598c4],.text[data-v-e3f598c4]{width:fit-content;max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-e3f598c4],.VPHero.has-image .text[data-v-e3f598c4]{margin:0 auto}.name[data-v-e3f598c4]{color:var(--vp-home-hero-name-color)}.clip[data-v-e3f598c4]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-e3f598c4],.text[data-v-e3f598c4]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-e3f598c4],.text[data-v-e3f598c4]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-e3f598c4],.VPHero.has-image .text[data-v-e3f598c4]{margin:0}}.tagline[data-v-e3f598c4]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-e3f598c4]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-e3f598c4]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-e3f598c4]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-e3f598c4]{margin:0}}.actions[data-v-e3f598c4]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-e3f598c4]{justify-content:center}@media (min-width: 640px){.actions[data-v-e3f598c4]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-e3f598c4]{justify-content:flex-start}}.action[data-v-e3f598c4]{flex-shrink:0;padding:6px}.image[data-v-e3f598c4]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-e3f598c4]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-e3f598c4]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-e3f598c4]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-e3f598c4]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-e3f598c4]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-e3f598c4]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-e3f598c4]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-e3f598c4]{width:320px;height:320px}}[data-v-e3f598c4] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-e3f598c4] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-e3f598c4] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-66976325]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-66976325]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-66976325]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-66976325]>.VPImage{margin-bottom:20px}.icon[data-v-66976325]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-66976325]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-66976325]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-66976325]{padding-top:8px}.link-text-value[data-v-66976325]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-66976325]{margin-left:6px}.VPFeatures[data-v-2844bedd]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-2844bedd]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-2844bedd]{padding:0 64px}}.container[data-v-2844bedd]{margin:0 auto;max-width:1152px}.items[data-v-2844bedd]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-2844bedd]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-2844bedd],.item.grid-4[data-v-2844bedd],.item.grid-6[data-v-2844bedd]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-2844bedd],.item.grid-4[data-v-2844bedd]{width:50%}.item.grid-3[data-v-2844bedd],.item.grid-6[data-v-2844bedd]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-2844bedd]{width:25%}}.container[data-v-8327b799]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-8327b799]{padding:0 48px}}@media (min-width: 960px){.container[data-v-8327b799]{width:100%;padding:0 64px}}.vp-doc[data-v-8327b799] .VPHomeSponsors,.vp-doc[data-v-8327b799] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-8327b799] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-8327b799] .VPHomeSponsors a,.vp-doc[data-v-8327b799] .VPTeamPage a{text-decoration:none}.VPHome[data-v-260dc7ef]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-260dc7ef]{margin-bottom:128px}}.VPContent[data-v-069fbe0c]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-069fbe0c]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-069fbe0c]{margin:0}@media (min-width: 960px){.VPContent[data-v-069fbe0c]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-069fbe0c]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-069fbe0c]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-e4d622eb]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-e4d622eb]{display:none}.VPFooter[data-v-e4d622eb] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-e4d622eb] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-e4d622eb]{padding:32px}}.container[data-v-e4d622eb]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-e4d622eb],.copyright[data-v-e4d622eb]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-ef699ed1]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-ef699ed1]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-ef699ed1]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-ef699ed1]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-ef699ed1]{color:var(--vp-c-text-1)}.icon[data-v-ef699ed1]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-ef699ed1]{font-size:14px}.icon[data-v-ef699ed1]{font-size:16px}}.open>.icon[data-v-ef699ed1]{transform:rotate(90deg)}.items[data-v-ef699ed1]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-ef699ed1]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-ef699ed1]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-ef699ed1]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-ef699ed1]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-ef699ed1]{transition:all .2s ease-out}.flyout-leave-active[data-v-ef699ed1]{transition:all .15s ease-in}.flyout-enter-from[data-v-ef699ed1],.flyout-leave-to[data-v-ef699ed1]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-927bc523]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-927bc523]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-927bc523]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-927bc523]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-927bc523]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-927bc523]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-927bc523]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-927bc523]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-927bc523]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-927bc523]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-927bc523]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-927bc523]{display:none}}.menu-icon[data-v-927bc523]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-927bc523]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-927bc523]{padding:12px 32px 11px}}.VPSwitch[data-v-4fbad16d]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-4fbad16d]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-4fbad16d]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-4fbad16d]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-4fbad16d] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-4fbad16d] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-7b0e90b6]{opacity:1}.moon[data-v-7b0e90b6],.dark .sun[data-v-7b0e90b6]{opacity:0}.dark .moon[data-v-7b0e90b6]{opacity:1}.dark .VPSwitchAppearance[data-v-7b0e90b6] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-edc5c802]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-edc5c802]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-98c1068d]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-98c1068d]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-98c1068d]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-98c1068d]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-396199aa]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-396199aa]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-396199aa]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-396199aa]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-ef9b3e72]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-ef9b3e72] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-ef9b3e72] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-ef9b3e72] .group:last-child{padding-bottom:0}.VPMenu[data-v-ef9b3e72] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-ef9b3e72] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-ef9b3e72] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-ef9b3e72] .action{padding-left:24px}.VPFlyout[data-v-5462cb06]{position:relative}.VPFlyout[data-v-5462cb06]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-5462cb06]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-5462cb06]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-5462cb06]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-5462cb06]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-5462cb06]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-5462cb06],.button[aria-expanded=true]+.menu[data-v-5462cb06]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-5462cb06]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-5462cb06]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-5462cb06]{margin-right:0;font-size:16px}.text-icon[data-v-5462cb06]{margin-left:4px;font-size:14px}.icon[data-v-5462cb06]{font-size:20px;transition:fill .25s}.menu[data-v-5462cb06]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-7ed0bbdb]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-7ed0bbdb]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-7ed0bbdb]>svg,.VPSocialLink[data-v-7ed0bbdb]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-347b6376]{display:flex;justify-content:center}.VPNavBarExtra[data-v-4694d3fe]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-4694d3fe]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-4694d3fe]{display:none}}.trans-title[data-v-4694d3fe]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-4694d3fe],.item.social-links[data-v-4694d3fe]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-4694d3fe]{min-width:176px}.appearance-action[data-v-4694d3fe]{margin-right:-2px}.social-links-list[data-v-4694d3fe]{margin:-4px -8px}.VPNavBarHamburger[data-v-965cc22b]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-965cc22b]{display:none}}.container[data-v-965cc22b]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-965cc22b]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-965cc22b]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-965cc22b]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-965cc22b]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-965cc22b]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-965cc22b]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-965cc22b],.VPNavBarHamburger.active:hover .middle[data-v-965cc22b],.VPNavBarHamburger.active:hover .bottom[data-v-965cc22b]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-965cc22b],.middle[data-v-965cc22b],.bottom[data-v-965cc22b]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-965cc22b]{top:0;left:0;transform:translate(0)}.middle[data-v-965cc22b]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-965cc22b]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-af90171e]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-af90171e],.VPNavBarMenuLink[data-v-af90171e]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-3e77c3d1]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-3e77c3d1]{display:flex}}/*! @docsearch/css 3.8.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-6fbb189e]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-6fbb189e]{display:flex;align-items:center}}.title[data-v-8d452041]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-8d452041]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-8d452041]{border-bottom-color:var(--vp-c-divider)}}[data-v-8d452041] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-fd9b8244]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-fd9b8244]{display:flex;align-items:center}}.title[data-v-fd9b8244]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-82bf9753]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-82bf9753]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-82bf9753]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-82bf9753]:not(.home){background-color:transparent}.VPNavBar[data-v-82bf9753]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-82bf9753]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-82bf9753]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-82bf9753]{padding:0}}.container[data-v-82bf9753]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-82bf9753],.container>.content[data-v-82bf9753]{pointer-events:none}.container[data-v-82bf9753] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-82bf9753]{max-width:100%}}.title[data-v-82bf9753]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-82bf9753]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-82bf9753]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-82bf9753]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-82bf9753]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-82bf9753]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-82bf9753]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-82bf9753]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-82bf9753]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-82bf9753]{column-gap:.5rem}}.menu+.translations[data-v-82bf9753]:before,.menu+.appearance[data-v-82bf9753]:before,.menu+.social-links[data-v-82bf9753]:before,.translations+.appearance[data-v-82bf9753]:before,.appearance+.social-links[data-v-82bf9753]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-82bf9753]:before,.translations+.appearance[data-v-82bf9753]:before{margin-right:16px}.appearance+.social-links[data-v-82bf9753]:before{margin-left:16px}.social-links[data-v-82bf9753]{margin-right:-8px}.divider[data-v-82bf9753]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-82bf9753]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-82bf9753]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-82bf9753]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-82bf9753]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-82bf9753]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-82bf9753]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-05b28f24]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-05b28f24]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-2f616699]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-2f616699]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-7236d213]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-7236d213]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-b59f21a5]{display:block}.title[data-v-b59f21a5]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-451d3337]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-451d3337]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-451d3337]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-451d3337]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-451d3337]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-451d3337]{transform:rotate(45deg)}.button[data-v-451d3337]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-451d3337]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-451d3337]{transition:transform .25s}.group[data-v-451d3337]:first-child{padding-top:0}.group+.group[data-v-451d3337],.group+.item[data-v-451d3337]{padding-top:4px}.VPNavScreenTranslations[data-v-5d42b2ca]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-5d42b2ca]{height:auto}.title[data-v-5d42b2ca]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-5d42b2ca]{font-size:16px}.icon.lang[data-v-5d42b2ca]{margin-right:8px}.icon.chevron[data-v-5d42b2ca]{margin-left:4px}.list[data-v-5d42b2ca]{padding:4px 0 0 24px}.link[data-v-5d42b2ca]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-4fad8bb9]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-4fad8bb9],.VPNavScreen.fade-leave-active[data-v-4fad8bb9]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-4fad8bb9],.VPNavScreen.fade-leave-active .container[data-v-4fad8bb9]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-4fad8bb9],.VPNavScreen.fade-leave-to[data-v-4fad8bb9]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-4fad8bb9],.VPNavScreen.fade-leave-to .container[data-v-4fad8bb9]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-4fad8bb9]{display:none}}.container[data-v-4fad8bb9]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-4fad8bb9],.menu+.appearance[data-v-4fad8bb9],.translations+.appearance[data-v-4fad8bb9]{margin-top:24px}.menu+.social-links[data-v-4fad8bb9]{margin-top:16px}.appearance+.social-links[data-v-4fad8bb9]{margin-top:16px}.VPNav[data-v-e44eaeb0]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-e44eaeb0]{position:fixed}}.VPSidebarItem.level-0[data-v-66f7eb2a]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-66f7eb2a]{padding-bottom:10px}.item[data-v-66f7eb2a]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-66f7eb2a]{cursor:pointer}.indicator[data-v-66f7eb2a]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-66f7eb2a],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-66f7eb2a],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-66f7eb2a],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-66f7eb2a]{background-color:var(--vp-c-brand-1)}.link[data-v-66f7eb2a]{display:flex;align-items:center;flex-grow:1}.text[data-v-66f7eb2a]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-66f7eb2a]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-66f7eb2a],.VPSidebarItem.level-2 .text[data-v-66f7eb2a],.VPSidebarItem.level-3 .text[data-v-66f7eb2a],.VPSidebarItem.level-4 .text[data-v-66f7eb2a],.VPSidebarItem.level-5 .text[data-v-66f7eb2a]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-66f7eb2a],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-66f7eb2a],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-66f7eb2a],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-66f7eb2a],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-66f7eb2a],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-66f7eb2a]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-66f7eb2a],.VPSidebarItem.level-1.has-active>.item>.text[data-v-66f7eb2a],.VPSidebarItem.level-2.has-active>.item>.text[data-v-66f7eb2a],.VPSidebarItem.level-3.has-active>.item>.text[data-v-66f7eb2a],.VPSidebarItem.level-4.has-active>.item>.text[data-v-66f7eb2a],.VPSidebarItem.level-5.has-active>.item>.text[data-v-66f7eb2a],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-66f7eb2a],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-66f7eb2a],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-66f7eb2a],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-66f7eb2a],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-66f7eb2a],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-66f7eb2a]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-66f7eb2a],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-66f7eb2a],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-66f7eb2a],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-66f7eb2a],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-66f7eb2a],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-66f7eb2a]{color:var(--vp-c-brand-1)}.caret[data-v-66f7eb2a]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-66f7eb2a]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-66f7eb2a]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-66f7eb2a]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-66f7eb2a]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-66f7eb2a],.VPSidebarItem.level-2 .items[data-v-66f7eb2a],.VPSidebarItem.level-3 .items[data-v-66f7eb2a],.VPSidebarItem.level-4 .items[data-v-66f7eb2a],.VPSidebarItem.level-5 .items[data-v-66f7eb2a]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-66f7eb2a]{display:none}.no-transition[data-v-ccb29e76] .caret-icon{transition:none}.group+.group[data-v-ccb29e76]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-ccb29e76]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-60cdee07]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-60cdee07]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-60cdee07]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-60cdee07]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-60cdee07]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-60cdee07]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-60cdee07]{outline:0}.VPSkipLink[data-v-5c217c0c]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-5c217c0c]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-5c217c0c]{top:14px;left:16px}}.Layout[data-v-76809ff5]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-0a218919]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-0a218919]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-0a218919]{margin:128px 0}}.VPHomeSponsors[data-v-0a218919]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-0a218919]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-0a218919]{padding:0 64px}}.container[data-v-0a218919]{margin:0 auto;max-width:1152px}.love[data-v-0a218919]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-0a218919]{display:inline-block}.message[data-v-0a218919]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-0a218919]{padding-top:32px}.action[data-v-0a218919]{padding-top:40px;text-align:center}.VPTeamMembersItem[data-v-c7bfe99e]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-c7bfe99e]{padding:32px}.VPTeamMembersItem.small .data[data-v-c7bfe99e]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-c7bfe99e]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-c7bfe99e]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-c7bfe99e]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-c7bfe99e]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-c7bfe99e]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-c7bfe99e]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-c7bfe99e]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-c7bfe99e]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-c7bfe99e]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-c7bfe99e]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-c7bfe99e]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-c7bfe99e]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-c7bfe99e]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-c7bfe99e]{text-align:center}.avatar[data-v-c7bfe99e]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-c7bfe99e]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-c7bfe99e]{margin:0;font-weight:600}.affiliation[data-v-c7bfe99e]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-c7bfe99e]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-c7bfe99e]:hover{color:var(--vp-c-brand-1)}.desc[data-v-c7bfe99e]{margin:0 auto}.desc[data-v-c7bfe99e] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-c7bfe99e]{display:flex;justify-content:center;height:56px}.sp-link[data-v-c7bfe99e]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-c7bfe99e]:hover,.sp .sp-link.link[data-v-c7bfe99e]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-c7bfe99e]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-200736b3]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-200736b3]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-200736b3]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-200736b3]{max-width:876px}.VPTeamMembers.medium .container[data-v-200736b3]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-200736b3]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-200736b3]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-200736b3]{max-width:760px}.container[data-v-200736b3]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.VPTeamPage[data-v-551ac535]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-551ac535]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-551ac535-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-551ac535-s],.VPTeamMembers+.VPTeamPageSection[data-v-551ac535-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-551ac535-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-551ac535-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-551ac535-s],.VPTeamMembers+.VPTeamPageSection[data-v-551ac535-s]{margin-top:96px}}.VPTeamMembers[data-v-551ac535-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-551ac535-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-551ac535-s]{padding:0 64px}}.VPTeamPageSection[data-v-fd8468a4]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-fd8468a4]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-fd8468a4]{padding:0 64px}}.title[data-v-fd8468a4]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-fd8468a4]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-fd8468a4]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-fd8468a4]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-fd8468a4]{padding-top:40px}.VPTeamPageTitle[data-v-0a121923]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-0a121923]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-0a121923]{padding:80px 64px 48px}}.title[data-v-0a121923]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-0a121923]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-0a121923]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-0a121923]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}@keyframes rainbow{0%{--vp-c-brand-1: #00a98e;--vp-c-brand-light: #4ad1b4;--vp-c-brand-lighter: #78fadc;--vp-c-brand-dark: #008269;--vp-c-brand-darker: #005d47;--vp-c-brand-next: #009ff7}1.25%{--vp-c-brand-1: #00a996;--vp-c-brand-light: #4bd1bd;--vp-c-brand-lighter: #79fbe5;--vp-c-brand-dark: #008371;--vp-c-brand-darker: #005e4f;--vp-c-brand-next: #009dfa}2.5%{--vp-c-brand-1: #00a99f;--vp-c-brand-light: #4cd1c6;--vp-c-brand-lighter: #7afbee;--vp-c-brand-dark: #00837a;--vp-c-brand-darker: #005e56;--vp-c-brand-next: #009bfc}3.75%{--vp-c-brand-1: #00a9a7;--vp-c-brand-light: #4dd1cf;--vp-c-brand-lighter: #7bfbf8;--vp-c-brand-dark: #008382;--vp-c-brand-darker: #005e5e;--vp-c-brand-next: #0098fd}5%{--vp-c-brand-1: #00a9b0;--vp-c-brand-light: #4ed1d7;--vp-c-brand-lighter: #7dfaff;--vp-c-brand-dark: #00838a;--vp-c-brand-darker: #005e65;--vp-c-brand-next: #0096fd}6.25%{--vp-c-brand-1: #00a9b8;--vp-c-brand-light: #4fd1e0;--vp-c-brand-lighter: #7efaff;--vp-c-brand-dark: #008391;--vp-c-brand-darker: #005e6d;--vp-c-brand-next: #0093fd}7.5%{--vp-c-brand-1: #00a9c0;--vp-c-brand-light: #50d0e8;--vp-c-brand-lighter: #7ffaff;--vp-c-brand-dark: #008399;--vp-c-brand-darker: #005e74;--vp-c-brand-next: #2e90fc}8.75%{--vp-c-brand-1: #00a8c7;--vp-c-brand-light: #51d0f0;--vp-c-brand-lighter: #81f9ff;--vp-c-brand-dark: #0082a0;--vp-c-brand-darker: #005e7b;--vp-c-brand-next: #4d8dfa}10%{--vp-c-brand-1: #00a8cf;--vp-c-brand-light: #52cff7;--vp-c-brand-lighter: #82f8ff;--vp-c-brand-dark: #0082a7;--vp-c-brand-darker: #005e81;--vp-c-brand-next: #638af8}11.25%{--vp-c-brand-1: #00a7d5;--vp-c-brand-light: #53cfff;--vp-c-brand-lighter: #84f8ff;--vp-c-brand-dark: #0081ae;--vp-c-brand-darker: #005d87;--vp-c-brand-next: #7587f5}12.5%{--vp-c-brand-1: #00a6dc;--vp-c-brand-light: #55ceff;--vp-c-brand-lighter: #85f7ff;--vp-c-brand-dark: #0081b4;--vp-c-brand-darker: #005d8d;--vp-c-brand-next: #8583f1}13.75%{--vp-c-brand-1: #00a6e2;--vp-c-brand-light: #56cdff;--vp-c-brand-lighter: #87f6ff;--vp-c-brand-dark: #0080b9;--vp-c-brand-darker: #005c93;--vp-c-brand-next: #9280ed}15%{--vp-c-brand-1: #00a4e7;--vp-c-brand-light: #57ccff;--vp-c-brand-lighter: #88f4ff;--vp-c-brand-dark: #007fbf;--vp-c-brand-darker: #005b98;--vp-c-brand-next: #9f7ce9}16.25%{--vp-c-brand-1: #00a3ec;--vp-c-brand-light: #58caff;--vp-c-brand-lighter: #89f3ff;--vp-c-brand-dark: #007ec3;--vp-c-brand-darker: #005b9c;--vp-c-brand-next: #aa78e3}17.5%{--vp-c-brand-1: #00a2f1;--vp-c-brand-light: #58c9ff;--vp-c-brand-lighter: #8af1ff;--vp-c-brand-dark: #007dc8;--vp-c-brand-darker: #0059a0;--vp-c-brand-next: #b574dd}18.75%{--vp-c-brand-1: #00a0f4;--vp-c-brand-light: #59c7ff;--vp-c-brand-lighter: #8bf0ff;--vp-c-brand-dark: #007bcb;--vp-c-brand-darker: #0058a3;--vp-c-brand-next: #be71d7}20%{--vp-c-brand-1: #009ff7;--vp-c-brand-light: #5ac5ff;--vp-c-brand-lighter: #8ceeff;--vp-c-brand-dark: #007ace;--vp-c-brand-darker: #0057a6;--vp-c-brand-next: #c76dd1}21.25%{--vp-c-brand-1: #009dfa;--vp-c-brand-light: #5ac3ff;--vp-c-brand-lighter: #8decff;--vp-c-brand-dark: #0078d0;--vp-c-brand-darker: #0055a8;--vp-c-brand-next: #cf69c9}22.5%{--vp-c-brand-1: #009bfc;--vp-c-brand-light: #5bc1ff;--vp-c-brand-lighter: #8de9ff;--vp-c-brand-dark: #0076d2;--vp-c-brand-darker: #0053aa;--vp-c-brand-next: #d566c2}23.75%{--vp-c-brand-1: #0098fd;--vp-c-brand-light: #5bbfff;--vp-c-brand-lighter: #8ee7ff;--vp-c-brand-dark: #0074d3;--vp-c-brand-darker: #0051ab;--vp-c-brand-next: #dc63ba}25%{--vp-c-brand-1: #0096fd;--vp-c-brand-light: #5bbcff;--vp-c-brand-lighter: #8ee4ff;--vp-c-brand-dark: #0071d4;--vp-c-brand-darker: #004fab;--vp-c-brand-next: #e160b3}26.25%{--vp-c-brand-1: #0093fd;--vp-c-brand-light: #5bb9ff;--vp-c-brand-lighter: #8ee1ff;--vp-c-brand-dark: #006fd3;--vp-c-brand-darker: #004dab;--vp-c-brand-next: #e65eab}27.5%{--vp-c-brand-1: #2e90fc;--vp-c-brand-light: #69b6ff;--vp-c-brand-lighter: #99deff;--vp-c-brand-dark: #006cd2;--vp-c-brand-darker: #004baa;--vp-c-brand-next: #e95ca2}28.75%{--vp-c-brand-1: #4d8dfa;--vp-c-brand-light: #7eb3ff;--vp-c-brand-lighter: #abdbff;--vp-c-brand-dark: #0069d1;--vp-c-brand-darker: #0048a9;--vp-c-brand-next: #ed5a9a}30%{--vp-c-brand-1: #638af8;--vp-c-brand-light: #8fb0ff;--vp-c-brand-lighter: #bbd7ff;--vp-c-brand-dark: #3066cf;--vp-c-brand-darker: #0045a7;--vp-c-brand-next: #ef5992}31.25%{--vp-c-brand-1: #7587f5;--vp-c-brand-light: #9fadff;--vp-c-brand-lighter: #cad4ff;--vp-c-brand-dark: #4963cc;--vp-c-brand-darker: #0941a4;--vp-c-brand-next: #f15989}32.5%{--vp-c-brand-1: #8583f1;--vp-c-brand-light: #aea9ff;--vp-c-brand-lighter: #d8d1ff;--vp-c-brand-dark: #5b5fc8;--vp-c-brand-darker: #2e3ea1;--vp-c-brand-next: #f25981}33.75%{--vp-c-brand-1: #9280ed;--vp-c-brand-light: #bca6ff;--vp-c-brand-lighter: #e6cdff;--vp-c-brand-dark: #6a5cc4;--vp-c-brand-darker: #413a9d;--vp-c-brand-next: #f25a79}35%{--vp-c-brand-1: #9f7ce9;--vp-c-brand-light: #c8a2ff;--vp-c-brand-lighter: #f2c9ff;--vp-c-brand-dark: #7758c0;--vp-c-brand-darker: #503598;--vp-c-brand-next: #f25c71}36.25%{--vp-c-brand-1: #aa78e3;--vp-c-brand-light: #d39eff;--vp-c-brand-lighter: #fec6ff;--vp-c-brand-dark: #8354bb;--vp-c-brand-darker: #5c3193;--vp-c-brand-next: #f15e69}37.5%{--vp-c-brand-1: #b574dd;--vp-c-brand-light: #de9bff;--vp-c-brand-lighter: #ffc2ff;--vp-c-brand-dark: #8d50b5;--vp-c-brand-darker: #662c8e;--vp-c-brand-next: #ef6061}38.75%{--vp-c-brand-1: #be71d7;--vp-c-brand-light: #e897ff;--vp-c-brand-lighter: #ffbfff;--vp-c-brand-dark: #964baf;--vp-c-brand-darker: #6f2688;--vp-c-brand-next: #ed635a}40%{--vp-c-brand-1: #c76dd1;--vp-c-brand-light: #f194fa;--vp-c-brand-lighter: #ffbcff;--vp-c-brand-dark: #9e47a9;--vp-c-brand-darker: #772082;--vp-c-brand-next: #eb6552}41.25%{--vp-c-brand-1: #cf69c9;--vp-c-brand-light: #f991f2;--vp-c-brand-lighter: #ffb9ff;--vp-c-brand-dark: #a643a2;--vp-c-brand-darker: #7e197c;--vp-c-brand-next: #e8694b}42.5%{--vp-c-brand-1: #d566c2;--vp-c-brand-light: #ff8deb;--vp-c-brand-lighter: #ffb6ff;--vp-c-brand-dark: #ac3f9b;--vp-c-brand-darker: #841075;--vp-c-brand-next: #e46c44}43.75%{--vp-c-brand-1: #dc63ba;--vp-c-brand-light: #ff8be3;--vp-c-brand-lighter: #ffb3ff;--vp-c-brand-dark: #b23b94;--vp-c-brand-darker: #89046f;--vp-c-brand-next: #e06f3d}45%{--vp-c-brand-1: #e160b3;--vp-c-brand-light: #ff88db;--vp-c-brand-lighter: #ffb1ff;--vp-c-brand-dark: #b7378c;--vp-c-brand-darker: #8d0068;--vp-c-brand-next: #db7336}46.25%{--vp-c-brand-1: #e65eab;--vp-c-brand-light: #ff86d2;--vp-c-brand-lighter: #ffaffb;--vp-c-brand-dark: #bb3485;--vp-c-brand-darker: #910060;--vp-c-brand-next: #d77630}47.5%{--vp-c-brand-1: #e95ca2;--vp-c-brand-light: #ff84ca;--vp-c-brand-lighter: #ffadf2;--vp-c-brand-dark: #be317d;--vp-c-brand-darker: #940059;--vp-c-brand-next: #d17a2a}48.75%{--vp-c-brand-1: #ed5a9a;--vp-c-brand-light: #ff83c1;--vp-c-brand-lighter: #fface9;--vp-c-brand-dark: #c12f75;--vp-c-brand-darker: #970052;--vp-c-brand-next: #cc7d24}50%{--vp-c-brand-1: #ef5992;--vp-c-brand-light: #ff82b8;--vp-c-brand-lighter: #ffabe0;--vp-c-brand-dark: #c32d6d;--vp-c-brand-darker: #98004b;--vp-c-brand-next: #c6811e}51.25%{--vp-c-brand-1: #f15989;--vp-c-brand-light: #ff82af;--vp-c-brand-lighter: #ffabd7;--vp-c-brand-dark: #c52d65;--vp-c-brand-darker: #9a0043;--vp-c-brand-next: #bf8418}52.5%{--vp-c-brand-1: #f25981;--vp-c-brand-light: #ff82a7;--vp-c-brand-lighter: #ffabce;--vp-c-brand-dark: #c52e5e;--vp-c-brand-darker: #9a003c;--vp-c-brand-next: #b98713}53.75%{--vp-c-brand-1: #f25a79;--vp-c-brand-light: #ff839e;--vp-c-brand-lighter: #ffacc5;--vp-c-brand-dark: #c62f56;--vp-c-brand-darker: #9a0035;--vp-c-brand-next: #b28a0f}55%{--vp-c-brand-1: #f25c71;--vp-c-brand-light: #ff8496;--vp-c-brand-lighter: #ffadbc;--vp-c-brand-dark: #c5314e;--vp-c-brand-darker: #99002e;--vp-c-brand-next: #ab8d0c}56.25%{--vp-c-brand-1: #f15e69;--vp-c-brand-light: #ff868d;--vp-c-brand-lighter: #ffaeb4;--vp-c-brand-dark: #c43447;--vp-c-brand-darker: #980027;--vp-c-brand-next: #a3900b}57.5%{--vp-c-brand-1: #ef6061;--vp-c-brand-light: #ff8885;--vp-c-brand-lighter: #ffb0ab;--vp-c-brand-dark: #c3373f;--vp-c-brand-darker: #970020;--vp-c-brand-next: #9c920d}58.75%{--vp-c-brand-1: #ed635a;--vp-c-brand-light: #ff8a7d;--vp-c-brand-lighter: #ffb2a3;--vp-c-brand-dark: #c13b38;--vp-c-brand-darker: #940619;--vp-c-brand-next: #949510}60%{--vp-c-brand-1: #eb6552;--vp-c-brand-light: #ff8d76;--vp-c-brand-lighter: #ffb59b;--vp-c-brand-dark: #be3e31;--vp-c-brand-darker: #921111;--vp-c-brand-next: #8b9715}61.25%{--vp-c-brand-1: #e8694b;--vp-c-brand-light: #ff8f6e;--vp-c-brand-lighter: #ffb794;--vp-c-brand-dark: #bb4229;--vp-c-brand-darker: #8f1908;--vp-c-brand-next: #83991b}62.5%{--vp-c-brand-1: #e46c44;--vp-c-brand-light: #ff9367;--vp-c-brand-lighter: #ffba8c;--vp-c-brand-dark: #b74622;--vp-c-brand-darker: #8c1f00;--vp-c-brand-next: #7a9b21}63.75%{--vp-c-brand-1: #e06f3d;--vp-c-brand-light: #ff9661;--vp-c-brand-lighter: #ffbd86;--vp-c-brand-dark: #b44a1a;--vp-c-brand-darker: #882500;--vp-c-brand-next: #719d27}65%{--vp-c-brand-1: #db7336;--vp-c-brand-light: #ff995a;--vp-c-brand-lighter: #ffc17f;--vp-c-brand-dark: #af4e11;--vp-c-brand-darker: #842a00;--vp-c-brand-next: #679e2e}66.25%{--vp-c-brand-1: #d77630;--vp-c-brand-light: #ff9c54;--vp-c-brand-lighter: #ffc47a;--vp-c-brand-dark: #ab5206;--vp-c-brand-darker: #802f00;--vp-c-brand-next: #5da035}67.5%{--vp-c-brand-1: #d17a2a;--vp-c-brand-light: #fea04f;--vp-c-brand-lighter: #ffc774;--vp-c-brand-dark: #a55600;--vp-c-brand-darker: #7b3300;--vp-c-brand-next: #51a13c}68.75%{--vp-c-brand-1: #cc7d24;--vp-c-brand-light: #f8a34a;--vp-c-brand-lighter: #ffca70;--vp-c-brand-dark: #a05900;--vp-c-brand-darker: #773700;--vp-c-brand-next: #44a244}70%{--vp-c-brand-1: #c6811e;--vp-c-brand-light: #f2a646;--vp-c-brand-lighter: #ffce6c;--vp-c-brand-dark: #9b5d00;--vp-c-brand-darker: #713b00;--vp-c-brand-next: #34a44b}71.25%{--vp-c-brand-1: #bf8418;--vp-c-brand-light: #ebaa42;--vp-c-brand-lighter: #ffd168;--vp-c-brand-dark: #956000;--vp-c-brand-darker: #6c3e00;--vp-c-brand-next: #1ba553}72.5%{--vp-c-brand-1: #b98713;--vp-c-brand-light: #e4ad3f;--vp-c-brand-lighter: #ffd466;--vp-c-brand-dark: #8e6300;--vp-c-brand-darker: #674100;--vp-c-brand-next: #00a65b}73.75%{--vp-c-brand-1: #b28a0f;--vp-c-brand-light: #ddb03d;--vp-c-brand-lighter: #ffd764;--vp-c-brand-dark: #886600;--vp-c-brand-darker: #614400;--vp-c-brand-next: #00a663}75%{--vp-c-brand-1: #ab8d0c;--vp-c-brand-light: #d5b33c;--vp-c-brand-lighter: #ffda63;--vp-c-brand-dark: #816900;--vp-c-brand-darker: #5b4700;--vp-c-brand-next: #00a76c}76.25%{--vp-c-brand-1: #a3900b;--vp-c-brand-light: #cdb63c;--vp-c-brand-lighter: #f8dd63;--vp-c-brand-dark: #7a6b00;--vp-c-brand-darker: #554900;--vp-c-brand-next: #00a874}77.5%{--vp-c-brand-1: #9c920d;--vp-c-brand-light: #c5b83d;--vp-c-brand-lighter: #f0e064;--vp-c-brand-dark: #736e00;--vp-c-brand-darker: #4e4b00;--vp-c-brand-next: #00a87d}78.75%{--vp-c-brand-1: #949510;--vp-c-brand-light: #bdbb3e;--vp-c-brand-lighter: #e7e366;--vp-c-brand-dark: #6c7000;--vp-c-brand-darker: #474d00;--vp-c-brand-next: #00a985}80%{--vp-c-brand-1: #8b9715;--vp-c-brand-light: #b4bd41;--vp-c-brand-lighter: #dee668;--vp-c-brand-dark: #647200;--vp-c-brand-darker: #404f00;--vp-c-brand-next: #00a98e}81.25%{--vp-c-brand-1: #83991b;--vp-c-brand-light: #abc045;--vp-c-brand-lighter: #d4e86c;--vp-c-brand-dark: #5c7400;--vp-c-brand-darker: #385100;--vp-c-brand-next: #00a996}82.5%{--vp-c-brand-1: #7a9b21;--vp-c-brand-light: #a2c249;--vp-c-brand-lighter: #cbea70;--vp-c-brand-dark: #537600;--vp-c-brand-darker: #2f5200;--vp-c-brand-next: #00a99f}83.75%{--vp-c-brand-1: #719d27;--vp-c-brand-light: #98c44e;--vp-c-brand-lighter: #c1ec75;--vp-c-brand-dark: #4a7700;--vp-c-brand-darker: #255300;--vp-c-brand-next: #00a9a7}85%{--vp-c-brand-1: #679e2e;--vp-c-brand-light: #8ec654;--vp-c-brand-lighter: #b7ee7a;--vp-c-brand-dark: #407900;--vp-c-brand-darker: #185500;--vp-c-brand-next: #00a9b0}86.25%{--vp-c-brand-1: #5da035;--vp-c-brand-light: #84c75a;--vp-c-brand-lighter: #acf080;--vp-c-brand-dark: #357a0a;--vp-c-brand-darker: #015600;--vp-c-brand-next: #00a9b8}87.5%{--vp-c-brand-1: #51a13c;--vp-c-brand-light: #79c961;--vp-c-brand-lighter: #a1f287;--vp-c-brand-dark: #277b16;--vp-c-brand-darker: #005700;--vp-c-brand-next: #00a9c0}88.75%{--vp-c-brand-1: #44a244;--vp-c-brand-light: #6dca68;--vp-c-brand-lighter: #96f48e;--vp-c-brand-dark: #117c1f;--vp-c-brand-darker: #005700;--vp-c-brand-next: #00a8c7}90%{--vp-c-brand-1: #34a44b;--vp-c-brand-light: #60cc70;--vp-c-brand-lighter: #89f595;--vp-c-brand-dark: #007d28;--vp-c-brand-darker: #005801;--vp-c-brand-next: #00a8cf}91.25%{--vp-c-brand-1: #1ba553;--vp-c-brand-light: #51cd77;--vp-c-brand-lighter: #7cf69d;--vp-c-brand-dark: #007e30;--vp-c-brand-darker: #00590d;--vp-c-brand-next: #00a7d5}92.5%{--vp-c-brand-1: #00a65b;--vp-c-brand-light: #48ce80;--vp-c-brand-lighter: #75f7a6;--vp-c-brand-dark: #007f38;--vp-c-brand-darker: #005917;--vp-c-brand-next: #00a6dc}93.75%{--vp-c-brand-1: #00a663;--vp-c-brand-light: #48cf88;--vp-c-brand-lighter: #75f8ae;--vp-c-brand-dark: #008040;--vp-c-brand-darker: #005a20;--vp-c-brand-next: #00a6e2}95%{--vp-c-brand-1: #00a76c;--vp-c-brand-light: #49cf91;--vp-c-brand-lighter: #76f9b7;--vp-c-brand-dark: #008049;--vp-c-brand-darker: #005b28;--vp-c-brand-next: #00a4e7}96.25%{--vp-c-brand-1: #00a874;--vp-c-brand-light: #49d099;--vp-c-brand-lighter: #76f9c0;--vp-c-brand-dark: #008151;--vp-c-brand-darker: #005c30;--vp-c-brand-next: #00a3ec}97.5%{--vp-c-brand-1: #00a87d;--vp-c-brand-light: #49d0a2;--vp-c-brand-lighter: #77fac9;--vp-c-brand-dark: #008159;--vp-c-brand-darker: #005c37;--vp-c-brand-next: #00a2f1}98.75%{--vp-c-brand-1: #00a985;--vp-c-brand-light: #4ad1ab;--vp-c-brand-lighter: #77fad3;--vp-c-brand-dark: #008261;--vp-c-brand-darker: #005d3f;--vp-c-brand-next: #00a0f4}to{--vp-c-brand-1: #00a98e;--vp-c-brand-light: #4ad1b4;--vp-c-brand-lighter: #78fadc;--vp-c-brand-dark: #008269;--vp-c-brand-darker: #005d47;--vp-c-brand-next: #009ff7}}:root{--vp-c-brand-1: #00a98e;--vp-c-brand-light: #4ad1b4;--vp-c-brand-lighter: #78fadc;--vp-c-brand-dark: #008269;--vp-c-brand-darker: #005d47;--vp-c-brand-next: #009ff7;animation:rainbow 40s linear infinite}html:not(.rainbow){--vp-c-brand-1: #00a98e;--vp-c-brand-light: #4ad1b4;--vp-c-brand-lighter: #78fadc;--vp-c-brand-dark: #008269;--vp-c-brand-darker: #005d47;--vp-c-brand-next: #009ff7;animation:none!important}:root{--vp-c-gutter: var(--vp-c-divider);--vp-code-block-bg: rgb(125 125 125 / .04);--vp-code-tab-divider: var(--vp-c-divider);--vp-code-copy-code-bg: rgb(125 125 125 / .1);--vp-code-copy-code-hover-bg: rgb(125 125 125 / .2);--vp-c-disabled-bg: rgb(125 125 125 / .2);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-c-text-dark-3: rgb(56 56 56 / .8);--vp-c-brand-lightest: var(--vp-c-brand-1);--vp-c-highlight-bg: var(--vp-c-brand-light);--vp-c-highlight-text: var(--vp-c-bg)}.dark{--vp-code-block-bg: rgb(0 0 0 / .2);--vp-c-text-code: #c0cec0}:root{--vp-button-brand-border: var(--vp-c-brand-light);--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-1);--vp-button-brand-hover-border: var(--vp-c-brand-light);--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-light);--vp-button-brand-active-border: var(--vp-c-brand-light);--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-button-brand-bg)}:root{--vp-home-hero-name-color: transparent;--vp-home-hero-name-background: -webkit-linear-gradient(120deg, var(--vp-c-brand-1) 30%, var(--vp-c-brand-next));--vp-home-hero-image-background-image: linear-gradient(-45deg, var(--vp-c-brand-1) 30%, var(--vp-c-brand-next));--vp-home-hero-image-filter: blur(80px)}@media (min-width: 640px){:root{--vp-home-hero-image-filter: blur(120px)}}@media (min-width: 960px){:root{--vp-home-hero-image-filter: blur(120px)}}.browser-safari,.browser-firefox{--vp-home-hero-image-background-image: transparent;--vp-home-hero-image-filter: ""}:root{--vp-custom-block-tip-border: var(--vp-c-brand-1);--vp-custom-block-tip-text: var(--vp-c-brand-darker);--vp-custom-block-tip-bg: var(--vp-c-brand-dimm)}.dark{--vp-custom-block-tip-border: var(--vp-c-brand-1);--vp-custom-block-tip-text: var(--vp-c-brand-lightest);--vp-custom-block-tip-bg: var(--vp-c-brand-dimm)}.DocSearch{--docsearch-primary-color: var(--vp-c-brand-1) !important} +@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: #3c3c43;--vp-c-text-2: #67676c;--vp-c-text-3: #929295}.dark{--vp-c-text-1: #dfdfd6;--vp-c-text-2: #98989f;--vp-c-text-3: #6a6a71}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:lang(es),:lang(pt){--vp-code-copy-copied-text-content: "Copiado"}:lang(fa){--vp-code-copy-copied-text-content: "کپی شد"}:lang(ko){--vp-code-copy-copied-text-content: "복사됨"}:lang(ru){--vp-code-copy-copied-text-content: "Скопировано"}:lang(zh){--vp-code-copy-copied-text-content: "已复制"}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;-webkit-user-select:none;user-select:none;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(:is(.no-icon,svg a,:has(img,svg))):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-28d9dc79]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-28d9dc79],.VPBackdrop.fade-leave-to[data-v-28d9dc79]{opacity:0}.VPBackdrop.fade-leave-active[data-v-28d9dc79]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-28d9dc79]{display:none}}.NotFound[data-v-f9c08b30]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-f9c08b30]{padding:96px 32px 168px}}.code[data-v-f9c08b30]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-f9c08b30]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-f9c08b30]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-f9c08b30]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-f9c08b30]{padding-top:20px}.link[data-v-f9c08b30]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-f9c08b30]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-c7d2d5d0]{position:relative;z-index:1}.nested[data-v-c7d2d5d0]{padding-right:16px;padding-left:16px}.outline-link[data-v-c7d2d5d0]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-c7d2d5d0]:hover,.outline-link.active[data-v-c7d2d5d0]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-c7d2d5d0]{padding-left:13px}.VPDocAsideOutline[data-v-3281fb23]{display:none}.VPDocAsideOutline.has-outline[data-v-3281fb23]{display:block}.content[data-v-3281fb23]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-3281fb23]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-3281fb23]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-ea2271c7]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-ea2271c7]{flex-grow:1}.VPDocAside[data-v-ea2271c7] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-ea2271c7] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-ea2271c7] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-261dbf8b]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-261dbf8b]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-b70cbb92]{margin-top:64px}.edit-info[data-v-b70cbb92]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-b70cbb92]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-b70cbb92]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-b70cbb92]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-b70cbb92]{margin-right:8px}.prev-next[data-v-b70cbb92]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-b70cbb92]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-b70cbb92]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-b70cbb92]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-b70cbb92]{margin-left:auto;text-align:right}.desc[data-v-b70cbb92]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-b70cbb92]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-93b7b678]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-93b7b678]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-93b7b678]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-93b7b678]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-93b7b678]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-93b7b678]{display:flex;justify-content:center}.VPDoc .aside[data-v-93b7b678]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-93b7b678]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-93b7b678]{max-width:1104px}}.container[data-v-93b7b678]{margin:0 auto;width:100%}.aside[data-v-93b7b678]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-93b7b678]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-93b7b678]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-93b7b678]::-webkit-scrollbar{display:none}.aside-curtain[data-v-93b7b678]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-93b7b678]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-93b7b678]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-93b7b678]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-93b7b678]{order:1;margin:0;min-width:640px}}.content-container[data-v-93b7b678]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-93b7b678]{max-width:688px}.VPButton[data-v-c1b5e92f]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-c1b5e92f]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-c1b5e92f]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-c1b5e92f]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-c1b5e92f]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-c1b5e92f]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-c1b5e92f]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-c1b5e92f]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-c1b5e92f]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-c1b5e92f]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-c1b5e92f]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-c1b5e92f]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-c1b5e92f]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-f096d6bf]{display:none}.dark .VPImage.light[data-v-f096d6bf]{display:none}.VPHero[data-v-db0fa370]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-db0fa370]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-db0fa370]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-db0fa370]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-db0fa370]{flex-direction:row}}.main[data-v-db0fa370]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-db0fa370]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-db0fa370]{text-align:left}}@media (min-width: 960px){.main[data-v-db0fa370]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-db0fa370]{max-width:592px}}.heading[data-v-db0fa370]{display:flex;flex-direction:column}.name[data-v-db0fa370],.text[data-v-db0fa370]{width:fit-content;max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-db0fa370],.VPHero.has-image .text[data-v-db0fa370]{margin:0 auto}.name[data-v-db0fa370]{color:var(--vp-home-hero-name-color)}.clip[data-v-db0fa370]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-db0fa370],.text[data-v-db0fa370]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-db0fa370],.text[data-v-db0fa370]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-db0fa370],.VPHero.has-image .text[data-v-db0fa370]{margin:0}}.tagline[data-v-db0fa370]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-db0fa370]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-db0fa370]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-db0fa370]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-db0fa370]{margin:0}}.actions[data-v-db0fa370]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-db0fa370]{justify-content:center}@media (min-width: 640px){.actions[data-v-db0fa370]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-db0fa370]{justify-content:flex-start}}.action[data-v-db0fa370]{flex-shrink:0;padding:6px}.image[data-v-db0fa370]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-db0fa370]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-db0fa370]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-db0fa370]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-db0fa370]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-db0fa370]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-db0fa370]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-db0fa370]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-db0fa370]{width:320px;height:320px}}[data-v-db0fa370] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-db0fa370] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-db0fa370] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-376a790b]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-376a790b]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-376a790b]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-376a790b]>.VPImage{margin-bottom:20px}.icon[data-v-376a790b]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-376a790b]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-376a790b]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-376a790b]{padding-top:8px}.link-text-value[data-v-376a790b]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-376a790b]{margin-left:6px}.VPFeatures[data-v-720b7754]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-720b7754]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-720b7754]{padding:0 64px}}.container[data-v-720b7754]{margin:0 auto;max-width:1152px}.items[data-v-720b7754]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-720b7754]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-720b7754],.item.grid-4[data-v-720b7754],.item.grid-6[data-v-720b7754]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-720b7754],.item.grid-4[data-v-720b7754]{width:50%}.item.grid-3[data-v-720b7754],.item.grid-6[data-v-720b7754]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-720b7754]{width:25%}}.container[data-v-6d62d23d]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-6d62d23d]{padding:0 48px}}@media (min-width: 960px){.container[data-v-6d62d23d]{width:100%;padding:0 64px}}.vp-doc[data-v-6d62d23d] .VPHomeSponsors,.vp-doc[data-v-6d62d23d] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-6d62d23d] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-6d62d23d] .VPHomeSponsors a,.vp-doc[data-v-6d62d23d] .VPTeamPage a{text-decoration:none}.VPHome[data-v-4a86bbdf]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-4a86bbdf]{margin-bottom:128px}}.VPContent[data-v-b2712108]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-b2712108]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-b2712108]{margin:0}@media (min-width: 960px){.VPContent[data-v-b2712108]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-b2712108]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-b2712108]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-b372df82]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-b372df82]{display:none}.VPFooter[data-v-b372df82] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-b372df82] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-b372df82]{padding:32px}}.container[data-v-b372df82]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-b372df82],.copyright[data-v-b372df82]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-dd9b5a2b]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-dd9b5a2b]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-dd9b5a2b]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-dd9b5a2b]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-dd9b5a2b]{color:var(--vp-c-text-1)}.icon[data-v-dd9b5a2b]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-dd9b5a2b]{font-size:14px}.icon[data-v-dd9b5a2b]{font-size:16px}}.open>.icon[data-v-dd9b5a2b]{transform:rotate(90deg)}.items[data-v-dd9b5a2b]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-dd9b5a2b]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-dd9b5a2b]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-dd9b5a2b]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-dd9b5a2b]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-dd9b5a2b]{transition:all .2s ease-out}.flyout-leave-active[data-v-dd9b5a2b]{transition:all .15s ease-in}.flyout-enter-from[data-v-dd9b5a2b],.flyout-leave-to[data-v-dd9b5a2b]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-2b0c5ae1]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-2b0c5ae1]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-2b0c5ae1]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-2b0c5ae1]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-2b0c5ae1]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-2b0c5ae1]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-2b0c5ae1]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-2b0c5ae1]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-2b0c5ae1]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-2b0c5ae1]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-2b0c5ae1]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-2b0c5ae1]{display:none}}.menu-icon[data-v-2b0c5ae1]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-2b0c5ae1]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-2b0c5ae1]{padding:12px 32px 11px}}.VPSwitch[data-v-66d4d931]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-66d4d931]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-66d4d931]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-66d4d931]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-66d4d931] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-66d4d931] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-73828c81]{opacity:1}.moon[data-v-73828c81],.dark .sun[data-v-73828c81]{opacity:0}.dark .moon[data-v-73828c81]{opacity:1}.dark .VPSwitchAppearance[data-v-73828c81] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-cac39bab]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-cac39bab]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-0c070bce]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-0c070bce]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-0c070bce]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-0c070bce]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-95d15443]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-95d15443]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-95d15443]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-95d15443]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-39ec0372]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-39ec0372] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-39ec0372] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-39ec0372] .group:last-child{padding-bottom:0}.VPMenu[data-v-39ec0372] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-39ec0372] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-39ec0372] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-39ec0372] .action{padding-left:24px}.VPFlyout[data-v-3f28edee]{position:relative}.VPFlyout[data-v-3f28edee]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-3f28edee]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-3f28edee]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-3f28edee]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-3f28edee]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-3f28edee]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-3f28edee],.button[aria-expanded=true]+.menu[data-v-3f28edee]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-3f28edee]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-3f28edee]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-3f28edee]{margin-right:0;font-size:16px}.text-icon[data-v-3f28edee]{margin-left:4px;font-size:14px}.icon[data-v-3f28edee]{font-size:20px;transition:fill .25s}.menu[data-v-3f28edee]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-29bd0169]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-29bd0169]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-29bd0169]>svg,.VPSocialLink[data-v-29bd0169]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-80ce7203]{display:flex;justify-content:center}.VPNavBarExtra[data-v-bc8ca248]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-bc8ca248]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-bc8ca248]{display:none}}.trans-title[data-v-bc8ca248]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-bc8ca248],.item.social-links[data-v-bc8ca248]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-bc8ca248]{min-width:176px}.appearance-action[data-v-bc8ca248]{margin-right:-2px}.social-links-list[data-v-bc8ca248]{margin:-4px -8px}.VPNavBarHamburger[data-v-4f789efa]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-4f789efa]{display:none}}.container[data-v-4f789efa]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-4f789efa]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-4f789efa]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-4f789efa]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-4f789efa]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-4f789efa]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-4f789efa]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-4f789efa],.VPNavBarHamburger.active:hover .middle[data-v-4f789efa],.VPNavBarHamburger.active:hover .bottom[data-v-4f789efa]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-4f789efa],.middle[data-v-4f789efa],.bottom[data-v-4f789efa]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-4f789efa]{top:0;left:0;transform:translate(0)}.middle[data-v-4f789efa]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-4f789efa]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-a4527372]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-a4527372],.VPNavBarMenuLink[data-v-a4527372]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-d39706cd]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-d39706cd]{display:flex}}/*! @docsearch/css 3.8.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-0d43bdb9]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-0d43bdb9]{display:flex;align-items:center}}.title[data-v-8d48b877]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-8d48b877]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-8d48b877]{border-bottom-color:var(--vp-c-divider)}}[data-v-8d48b877] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-33dab750]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-33dab750]{display:flex;align-items:center}}.title[data-v-33dab750]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-bc6dd710]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-bc6dd710]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-bc6dd710]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-bc6dd710]:not(.home){background-color:transparent}.VPNavBar[data-v-bc6dd710]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-bc6dd710]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-bc6dd710]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-bc6dd710]{padding:0}}.container[data-v-bc6dd710]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-bc6dd710],.container>.content[data-v-bc6dd710]{pointer-events:none}.container[data-v-bc6dd710] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-bc6dd710]{max-width:100%}}.title[data-v-bc6dd710]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-bc6dd710]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-bc6dd710]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-bc6dd710]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-bc6dd710]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-bc6dd710]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-bc6dd710]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-bc6dd710]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-bc6dd710]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-bc6dd710]{column-gap:.5rem}}.menu+.translations[data-v-bc6dd710]:before,.menu+.appearance[data-v-bc6dd710]:before,.menu+.social-links[data-v-bc6dd710]:before,.translations+.appearance[data-v-bc6dd710]:before,.appearance+.social-links[data-v-bc6dd710]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-bc6dd710]:before,.translations+.appearance[data-v-bc6dd710]:before{margin-right:16px}.appearance+.social-links[data-v-bc6dd710]:before{margin-left:16px}.social-links[data-v-bc6dd710]{margin-right:-8px}.divider[data-v-bc6dd710]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-bc6dd710]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-bc6dd710]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-bc6dd710]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-bc6dd710]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-bc6dd710]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-bc6dd710]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-9da1e4ae]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-9da1e4ae]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-e11bf1a5]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-e11bf1a5]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-0ac9b15a]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-0ac9b15a]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-8c61599d]{display:block}.title[data-v-8c61599d]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-a12a8bb1]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-a12a8bb1]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-a12a8bb1]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-a12a8bb1]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-a12a8bb1]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-a12a8bb1]{transform:rotate(45deg)}.button[data-v-a12a8bb1]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-a12a8bb1]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-a12a8bb1]{transition:transform .25s}.group[data-v-a12a8bb1]:first-child{padding-top:0}.group+.group[data-v-a12a8bb1],.group+.item[data-v-a12a8bb1]{padding-top:4px}.VPNavScreenTranslations[data-v-d392ff81]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-d392ff81]{height:auto}.title[data-v-d392ff81]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-d392ff81]{font-size:16px}.icon.lang[data-v-d392ff81]{margin-right:8px}.icon.chevron[data-v-d392ff81]{margin-left:4px}.list[data-v-d392ff81]{padding:4px 0 0 24px}.link[data-v-d392ff81]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-2744c432]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-2744c432],.VPNavScreen.fade-leave-active[data-v-2744c432]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-2744c432],.VPNavScreen.fade-leave-active .container[data-v-2744c432]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-2744c432],.VPNavScreen.fade-leave-to[data-v-2744c432]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-2744c432],.VPNavScreen.fade-leave-to .container[data-v-2744c432]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-2744c432]{display:none}}.container[data-v-2744c432]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-2744c432],.menu+.appearance[data-v-2744c432],.translations+.appearance[data-v-2744c432]{margin-top:24px}.menu+.social-links[data-v-2744c432]{margin-top:16px}.appearance+.social-links[data-v-2744c432]{margin-top:16px}.VPNav[data-v-393b4581]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-393b4581]{position:fixed}}.VPSidebarItem.level-0[data-v-60211452]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-60211452]{padding-bottom:10px}.item[data-v-60211452]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-60211452]{cursor:pointer}.indicator[data-v-60211452]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-60211452],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-60211452],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-60211452],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-60211452]{background-color:var(--vp-c-brand-1)}.link[data-v-60211452]{display:flex;align-items:center;flex-grow:1}.text[data-v-60211452]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-60211452]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-60211452],.VPSidebarItem.level-2 .text[data-v-60211452],.VPSidebarItem.level-3 .text[data-v-60211452],.VPSidebarItem.level-4 .text[data-v-60211452],.VPSidebarItem.level-5 .text[data-v-60211452]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-60211452],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-60211452],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-60211452],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-60211452],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-60211452],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-60211452]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-60211452],.VPSidebarItem.level-1.has-active>.item>.text[data-v-60211452],.VPSidebarItem.level-2.has-active>.item>.text[data-v-60211452],.VPSidebarItem.level-3.has-active>.item>.text[data-v-60211452],.VPSidebarItem.level-4.has-active>.item>.text[data-v-60211452],.VPSidebarItem.level-5.has-active>.item>.text[data-v-60211452],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-60211452],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-60211452],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-60211452],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-60211452],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-60211452],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-60211452]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-60211452],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-60211452],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-60211452],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-60211452],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-60211452],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-60211452]{color:var(--vp-c-brand-1)}.caret[data-v-60211452]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-60211452]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-60211452]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-60211452]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-60211452]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-60211452],.VPSidebarItem.level-2 .items[data-v-60211452],.VPSidebarItem.level-3 .items[data-v-60211452],.VPSidebarItem.level-4 .items[data-v-60211452],.VPSidebarItem.level-5 .items[data-v-60211452]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-60211452]{display:none}.no-transition[data-v-a4b6e0b6] .caret-icon{transition:none}.group+.group[data-v-a4b6e0b6]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-a4b6e0b6]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-94cb84fa]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-94cb84fa]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-94cb84fa]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-94cb84fa]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-94cb84fa]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-94cb84fa]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-94cb84fa]{outline:0}.VPSkipLink[data-v-d43c41b1]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-d43c41b1]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-d43c41b1]{top:14px;left:16px}}.Layout[data-v-e9797c95]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-633292b4]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-633292b4]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-633292b4]{margin:128px 0}}.VPHomeSponsors[data-v-633292b4]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-633292b4]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-633292b4]{padding:0 64px}}.container[data-v-633292b4]{margin:0 auto;max-width:1152px}.love[data-v-633292b4]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-633292b4]{display:inline-block}.message[data-v-633292b4]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-633292b4]{padding-top:32px}.action[data-v-633292b4]{padding-top:40px;text-align:center}.VPTeamMembersItem[data-v-f4b6f4ec]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-f4b6f4ec]{padding:32px}.VPTeamMembersItem.small .data[data-v-f4b6f4ec]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-f4b6f4ec]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-f4b6f4ec]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-f4b6f4ec]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-f4b6f4ec]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-f4b6f4ec]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-f4b6f4ec]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-f4b6f4ec]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-f4b6f4ec]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-f4b6f4ec]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-f4b6f4ec]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-f4b6f4ec]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-f4b6f4ec]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-f4b6f4ec]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-f4b6f4ec]{text-align:center}.avatar[data-v-f4b6f4ec]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-f4b6f4ec]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-f4b6f4ec]{margin:0;font-weight:600}.affiliation[data-v-f4b6f4ec]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-f4b6f4ec]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-f4b6f4ec]:hover{color:var(--vp-c-brand-1)}.desc[data-v-f4b6f4ec]{margin:0 auto}.desc[data-v-f4b6f4ec] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-f4b6f4ec]{display:flex;justify-content:center;height:56px}.sp-link[data-v-f4b6f4ec]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-f4b6f4ec]:hover,.sp .sp-link.link[data-v-f4b6f4ec]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-f4b6f4ec]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-9d493cd3]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-9d493cd3]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-9d493cd3]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-9d493cd3]{max-width:876px}.VPTeamMembers.medium .container[data-v-9d493cd3]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-9d493cd3]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-9d493cd3]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-9d493cd3]{max-width:760px}.container[data-v-9d493cd3]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.VPTeamPage[data-v-97b510d6]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-97b510d6]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-97b510d6-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-97b510d6-s],.VPTeamMembers+.VPTeamPageSection[data-v-97b510d6-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-97b510d6-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-97b510d6-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-97b510d6-s],.VPTeamMembers+.VPTeamPageSection[data-v-97b510d6-s]{margin-top:96px}}.VPTeamMembers[data-v-97b510d6-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-97b510d6-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-97b510d6-s]{padding:0 64px}}.VPTeamPageSection[data-v-cfb57e67]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-cfb57e67]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-cfb57e67]{padding:0 64px}}.title[data-v-cfb57e67]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-cfb57e67]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-cfb57e67]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-cfb57e67]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-cfb57e67]{padding-top:40px}.VPTeamPageTitle[data-v-29936b20]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-29936b20]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-29936b20]{padding:80px 64px 48px}}.title[data-v-29936b20]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-29936b20]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-29936b20]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-29936b20]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}@keyframes rainbow{0%{--vp-c-brand-1: #00a98e;--vp-c-brand-light: #4ad1b4;--vp-c-brand-lighter: #78fadc;--vp-c-brand-dark: #008269;--vp-c-brand-darker: #005d47;--vp-c-brand-next: #009ff7}1.25%{--vp-c-brand-1: #00a996;--vp-c-brand-light: #4bd1bd;--vp-c-brand-lighter: #79fbe5;--vp-c-brand-dark: #008371;--vp-c-brand-darker: #005e4f;--vp-c-brand-next: #009dfa}2.5%{--vp-c-brand-1: #00a99f;--vp-c-brand-light: #4cd1c6;--vp-c-brand-lighter: #7afbee;--vp-c-brand-dark: #00837a;--vp-c-brand-darker: #005e56;--vp-c-brand-next: #009bfc}3.75%{--vp-c-brand-1: #00a9a7;--vp-c-brand-light: #4dd1cf;--vp-c-brand-lighter: #7bfbf8;--vp-c-brand-dark: #008382;--vp-c-brand-darker: #005e5e;--vp-c-brand-next: #0098fd}5%{--vp-c-brand-1: #00a9b0;--vp-c-brand-light: #4ed1d7;--vp-c-brand-lighter: #7dfaff;--vp-c-brand-dark: #00838a;--vp-c-brand-darker: #005e65;--vp-c-brand-next: #0096fd}6.25%{--vp-c-brand-1: #00a9b8;--vp-c-brand-light: #4fd1e0;--vp-c-brand-lighter: #7efaff;--vp-c-brand-dark: #008391;--vp-c-brand-darker: #005e6d;--vp-c-brand-next: #0093fd}7.5%{--vp-c-brand-1: #00a9c0;--vp-c-brand-light: #50d0e8;--vp-c-brand-lighter: #7ffaff;--vp-c-brand-dark: #008399;--vp-c-brand-darker: #005e74;--vp-c-brand-next: #2e90fc}8.75%{--vp-c-brand-1: #00a8c7;--vp-c-brand-light: #51d0f0;--vp-c-brand-lighter: #81f9ff;--vp-c-brand-dark: #0082a0;--vp-c-brand-darker: #005e7b;--vp-c-brand-next: #4d8dfa}10%{--vp-c-brand-1: #00a8cf;--vp-c-brand-light: #52cff7;--vp-c-brand-lighter: #82f8ff;--vp-c-brand-dark: #0082a7;--vp-c-brand-darker: #005e81;--vp-c-brand-next: #638af8}11.25%{--vp-c-brand-1: #00a7d5;--vp-c-brand-light: #53cfff;--vp-c-brand-lighter: #84f8ff;--vp-c-brand-dark: #0081ae;--vp-c-brand-darker: #005d87;--vp-c-brand-next: #7587f5}12.5%{--vp-c-brand-1: #00a6dc;--vp-c-brand-light: #55ceff;--vp-c-brand-lighter: #85f7ff;--vp-c-brand-dark: #0081b4;--vp-c-brand-darker: #005d8d;--vp-c-brand-next: #8583f1}13.75%{--vp-c-brand-1: #00a6e2;--vp-c-brand-light: #56cdff;--vp-c-brand-lighter: #87f6ff;--vp-c-brand-dark: #0080b9;--vp-c-brand-darker: #005c93;--vp-c-brand-next: #9280ed}15%{--vp-c-brand-1: #00a4e7;--vp-c-brand-light: #57ccff;--vp-c-brand-lighter: #88f4ff;--vp-c-brand-dark: #007fbf;--vp-c-brand-darker: #005b98;--vp-c-brand-next: #9f7ce9}16.25%{--vp-c-brand-1: #00a3ec;--vp-c-brand-light: #58caff;--vp-c-brand-lighter: #89f3ff;--vp-c-brand-dark: #007ec3;--vp-c-brand-darker: #005b9c;--vp-c-brand-next: #aa78e3}17.5%{--vp-c-brand-1: #00a2f1;--vp-c-brand-light: #58c9ff;--vp-c-brand-lighter: #8af1ff;--vp-c-brand-dark: #007dc8;--vp-c-brand-darker: #0059a0;--vp-c-brand-next: #b574dd}18.75%{--vp-c-brand-1: #00a0f4;--vp-c-brand-light: #59c7ff;--vp-c-brand-lighter: #8bf0ff;--vp-c-brand-dark: #007bcb;--vp-c-brand-darker: #0058a3;--vp-c-brand-next: #be71d7}20%{--vp-c-brand-1: #009ff7;--vp-c-brand-light: #5ac5ff;--vp-c-brand-lighter: #8ceeff;--vp-c-brand-dark: #007ace;--vp-c-brand-darker: #0057a6;--vp-c-brand-next: #c76dd1}21.25%{--vp-c-brand-1: #009dfa;--vp-c-brand-light: #5ac3ff;--vp-c-brand-lighter: #8decff;--vp-c-brand-dark: #0078d0;--vp-c-brand-darker: #0055a8;--vp-c-brand-next: #cf69c9}22.5%{--vp-c-brand-1: #009bfc;--vp-c-brand-light: #5bc1ff;--vp-c-brand-lighter: #8de9ff;--vp-c-brand-dark: #0076d2;--vp-c-brand-darker: #0053aa;--vp-c-brand-next: #d566c2}23.75%{--vp-c-brand-1: #0098fd;--vp-c-brand-light: #5bbfff;--vp-c-brand-lighter: #8ee7ff;--vp-c-brand-dark: #0074d3;--vp-c-brand-darker: #0051ab;--vp-c-brand-next: #dc63ba}25%{--vp-c-brand-1: #0096fd;--vp-c-brand-light: #5bbcff;--vp-c-brand-lighter: #8ee4ff;--vp-c-brand-dark: #0071d4;--vp-c-brand-darker: #004fab;--vp-c-brand-next: #e160b3}26.25%{--vp-c-brand-1: #0093fd;--vp-c-brand-light: #5bb9ff;--vp-c-brand-lighter: #8ee1ff;--vp-c-brand-dark: #006fd3;--vp-c-brand-darker: #004dab;--vp-c-brand-next: #e65eab}27.5%{--vp-c-brand-1: #2e90fc;--vp-c-brand-light: #69b6ff;--vp-c-brand-lighter: #99deff;--vp-c-brand-dark: #006cd2;--vp-c-brand-darker: #004baa;--vp-c-brand-next: #e95ca2}28.75%{--vp-c-brand-1: #4d8dfa;--vp-c-brand-light: #7eb3ff;--vp-c-brand-lighter: #abdbff;--vp-c-brand-dark: #0069d1;--vp-c-brand-darker: #0048a9;--vp-c-brand-next: #ed5a9a}30%{--vp-c-brand-1: #638af8;--vp-c-brand-light: #8fb0ff;--vp-c-brand-lighter: #bbd7ff;--vp-c-brand-dark: #3066cf;--vp-c-brand-darker: #0045a7;--vp-c-brand-next: #ef5992}31.25%{--vp-c-brand-1: #7587f5;--vp-c-brand-light: #9fadff;--vp-c-brand-lighter: #cad4ff;--vp-c-brand-dark: #4963cc;--vp-c-brand-darker: #0941a4;--vp-c-brand-next: #f15989}32.5%{--vp-c-brand-1: #8583f1;--vp-c-brand-light: #aea9ff;--vp-c-brand-lighter: #d8d1ff;--vp-c-brand-dark: #5b5fc8;--vp-c-brand-darker: #2e3ea1;--vp-c-brand-next: #f25981}33.75%{--vp-c-brand-1: #9280ed;--vp-c-brand-light: #bca6ff;--vp-c-brand-lighter: #e6cdff;--vp-c-brand-dark: #6a5cc4;--vp-c-brand-darker: #413a9d;--vp-c-brand-next: #f25a79}35%{--vp-c-brand-1: #9f7ce9;--vp-c-brand-light: #c8a2ff;--vp-c-brand-lighter: #f2c9ff;--vp-c-brand-dark: #7758c0;--vp-c-brand-darker: #503598;--vp-c-brand-next: #f25c71}36.25%{--vp-c-brand-1: #aa78e3;--vp-c-brand-light: #d39eff;--vp-c-brand-lighter: #fec6ff;--vp-c-brand-dark: #8354bb;--vp-c-brand-darker: #5c3193;--vp-c-brand-next: #f15e69}37.5%{--vp-c-brand-1: #b574dd;--vp-c-brand-light: #de9bff;--vp-c-brand-lighter: #ffc2ff;--vp-c-brand-dark: #8d50b5;--vp-c-brand-darker: #662c8e;--vp-c-brand-next: #ef6061}38.75%{--vp-c-brand-1: #be71d7;--vp-c-brand-light: #e897ff;--vp-c-brand-lighter: #ffbfff;--vp-c-brand-dark: #964baf;--vp-c-brand-darker: #6f2688;--vp-c-brand-next: #ed635a}40%{--vp-c-brand-1: #c76dd1;--vp-c-brand-light: #f194fa;--vp-c-brand-lighter: #ffbcff;--vp-c-brand-dark: #9e47a9;--vp-c-brand-darker: #772082;--vp-c-brand-next: #eb6552}41.25%{--vp-c-brand-1: #cf69c9;--vp-c-brand-light: #f991f2;--vp-c-brand-lighter: #ffb9ff;--vp-c-brand-dark: #a643a2;--vp-c-brand-darker: #7e197c;--vp-c-brand-next: #e8694b}42.5%{--vp-c-brand-1: #d566c2;--vp-c-brand-light: #ff8deb;--vp-c-brand-lighter: #ffb6ff;--vp-c-brand-dark: #ac3f9b;--vp-c-brand-darker: #841075;--vp-c-brand-next: #e46c44}43.75%{--vp-c-brand-1: #dc63ba;--vp-c-brand-light: #ff8be3;--vp-c-brand-lighter: #ffb3ff;--vp-c-brand-dark: #b23b94;--vp-c-brand-darker: #89046f;--vp-c-brand-next: #e06f3d}45%{--vp-c-brand-1: #e160b3;--vp-c-brand-light: #ff88db;--vp-c-brand-lighter: #ffb1ff;--vp-c-brand-dark: #b7378c;--vp-c-brand-darker: #8d0068;--vp-c-brand-next: #db7336}46.25%{--vp-c-brand-1: #e65eab;--vp-c-brand-light: #ff86d2;--vp-c-brand-lighter: #ffaffb;--vp-c-brand-dark: #bb3485;--vp-c-brand-darker: #910060;--vp-c-brand-next: #d77630}47.5%{--vp-c-brand-1: #e95ca2;--vp-c-brand-light: #ff84ca;--vp-c-brand-lighter: #ffadf2;--vp-c-brand-dark: #be317d;--vp-c-brand-darker: #940059;--vp-c-brand-next: #d17a2a}48.75%{--vp-c-brand-1: #ed5a9a;--vp-c-brand-light: #ff83c1;--vp-c-brand-lighter: #fface9;--vp-c-brand-dark: #c12f75;--vp-c-brand-darker: #970052;--vp-c-brand-next: #cc7d24}50%{--vp-c-brand-1: #ef5992;--vp-c-brand-light: #ff82b8;--vp-c-brand-lighter: #ffabe0;--vp-c-brand-dark: #c32d6d;--vp-c-brand-darker: #98004b;--vp-c-brand-next: #c6811e}51.25%{--vp-c-brand-1: #f15989;--vp-c-brand-light: #ff82af;--vp-c-brand-lighter: #ffabd7;--vp-c-brand-dark: #c52d65;--vp-c-brand-darker: #9a0043;--vp-c-brand-next: #bf8418}52.5%{--vp-c-brand-1: #f25981;--vp-c-brand-light: #ff82a7;--vp-c-brand-lighter: #ffabce;--vp-c-brand-dark: #c52e5e;--vp-c-brand-darker: #9a003c;--vp-c-brand-next: #b98713}53.75%{--vp-c-brand-1: #f25a79;--vp-c-brand-light: #ff839e;--vp-c-brand-lighter: #ffacc5;--vp-c-brand-dark: #c62f56;--vp-c-brand-darker: #9a0035;--vp-c-brand-next: #b28a0f}55%{--vp-c-brand-1: #f25c71;--vp-c-brand-light: #ff8496;--vp-c-brand-lighter: #ffadbc;--vp-c-brand-dark: #c5314e;--vp-c-brand-darker: #99002e;--vp-c-brand-next: #ab8d0c}56.25%{--vp-c-brand-1: #f15e69;--vp-c-brand-light: #ff868d;--vp-c-brand-lighter: #ffaeb4;--vp-c-brand-dark: #c43447;--vp-c-brand-darker: #980027;--vp-c-brand-next: #a3900b}57.5%{--vp-c-brand-1: #ef6061;--vp-c-brand-light: #ff8885;--vp-c-brand-lighter: #ffb0ab;--vp-c-brand-dark: #c3373f;--vp-c-brand-darker: #970020;--vp-c-brand-next: #9c920d}58.75%{--vp-c-brand-1: #ed635a;--vp-c-brand-light: #ff8a7d;--vp-c-brand-lighter: #ffb2a3;--vp-c-brand-dark: #c13b38;--vp-c-brand-darker: #940619;--vp-c-brand-next: #949510}60%{--vp-c-brand-1: #eb6552;--vp-c-brand-light: #ff8d76;--vp-c-brand-lighter: #ffb59b;--vp-c-brand-dark: #be3e31;--vp-c-brand-darker: #921111;--vp-c-brand-next: #8b9715}61.25%{--vp-c-brand-1: #e8694b;--vp-c-brand-light: #ff8f6e;--vp-c-brand-lighter: #ffb794;--vp-c-brand-dark: #bb4229;--vp-c-brand-darker: #8f1908;--vp-c-brand-next: #83991b}62.5%{--vp-c-brand-1: #e46c44;--vp-c-brand-light: #ff9367;--vp-c-brand-lighter: #ffba8c;--vp-c-brand-dark: #b74622;--vp-c-brand-darker: #8c1f00;--vp-c-brand-next: #7a9b21}63.75%{--vp-c-brand-1: #e06f3d;--vp-c-brand-light: #ff9661;--vp-c-brand-lighter: #ffbd86;--vp-c-brand-dark: #b44a1a;--vp-c-brand-darker: #882500;--vp-c-brand-next: #719d27}65%{--vp-c-brand-1: #db7336;--vp-c-brand-light: #ff995a;--vp-c-brand-lighter: #ffc17f;--vp-c-brand-dark: #af4e11;--vp-c-brand-darker: #842a00;--vp-c-brand-next: #679e2e}66.25%{--vp-c-brand-1: #d77630;--vp-c-brand-light: #ff9c54;--vp-c-brand-lighter: #ffc47a;--vp-c-brand-dark: #ab5206;--vp-c-brand-darker: #802f00;--vp-c-brand-next: #5da035}67.5%{--vp-c-brand-1: #d17a2a;--vp-c-brand-light: #fea04f;--vp-c-brand-lighter: #ffc774;--vp-c-brand-dark: #a55600;--vp-c-brand-darker: #7b3300;--vp-c-brand-next: #51a13c}68.75%{--vp-c-brand-1: #cc7d24;--vp-c-brand-light: #f8a34a;--vp-c-brand-lighter: #ffca70;--vp-c-brand-dark: #a05900;--vp-c-brand-darker: #773700;--vp-c-brand-next: #44a244}70%{--vp-c-brand-1: #c6811e;--vp-c-brand-light: #f2a646;--vp-c-brand-lighter: #ffce6c;--vp-c-brand-dark: #9b5d00;--vp-c-brand-darker: #713b00;--vp-c-brand-next: #34a44b}71.25%{--vp-c-brand-1: #bf8418;--vp-c-brand-light: #ebaa42;--vp-c-brand-lighter: #ffd168;--vp-c-brand-dark: #956000;--vp-c-brand-darker: #6c3e00;--vp-c-brand-next: #1ba553}72.5%{--vp-c-brand-1: #b98713;--vp-c-brand-light: #e4ad3f;--vp-c-brand-lighter: #ffd466;--vp-c-brand-dark: #8e6300;--vp-c-brand-darker: #674100;--vp-c-brand-next: #00a65b}73.75%{--vp-c-brand-1: #b28a0f;--vp-c-brand-light: #ddb03d;--vp-c-brand-lighter: #ffd764;--vp-c-brand-dark: #886600;--vp-c-brand-darker: #614400;--vp-c-brand-next: #00a663}75%{--vp-c-brand-1: #ab8d0c;--vp-c-brand-light: #d5b33c;--vp-c-brand-lighter: #ffda63;--vp-c-brand-dark: #816900;--vp-c-brand-darker: #5b4700;--vp-c-brand-next: #00a76c}76.25%{--vp-c-brand-1: #a3900b;--vp-c-brand-light: #cdb63c;--vp-c-brand-lighter: #f8dd63;--vp-c-brand-dark: #7a6b00;--vp-c-brand-darker: #554900;--vp-c-brand-next: #00a874}77.5%{--vp-c-brand-1: #9c920d;--vp-c-brand-light: #c5b83d;--vp-c-brand-lighter: #f0e064;--vp-c-brand-dark: #736e00;--vp-c-brand-darker: #4e4b00;--vp-c-brand-next: #00a87d}78.75%{--vp-c-brand-1: #949510;--vp-c-brand-light: #bdbb3e;--vp-c-brand-lighter: #e7e366;--vp-c-brand-dark: #6c7000;--vp-c-brand-darker: #474d00;--vp-c-brand-next: #00a985}80%{--vp-c-brand-1: #8b9715;--vp-c-brand-light: #b4bd41;--vp-c-brand-lighter: #dee668;--vp-c-brand-dark: #647200;--vp-c-brand-darker: #404f00;--vp-c-brand-next: #00a98e}81.25%{--vp-c-brand-1: #83991b;--vp-c-brand-light: #abc045;--vp-c-brand-lighter: #d4e86c;--vp-c-brand-dark: #5c7400;--vp-c-brand-darker: #385100;--vp-c-brand-next: #00a996}82.5%{--vp-c-brand-1: #7a9b21;--vp-c-brand-light: #a2c249;--vp-c-brand-lighter: #cbea70;--vp-c-brand-dark: #537600;--vp-c-brand-darker: #2f5200;--vp-c-brand-next: #00a99f}83.75%{--vp-c-brand-1: #719d27;--vp-c-brand-light: #98c44e;--vp-c-brand-lighter: #c1ec75;--vp-c-brand-dark: #4a7700;--vp-c-brand-darker: #255300;--vp-c-brand-next: #00a9a7}85%{--vp-c-brand-1: #679e2e;--vp-c-brand-light: #8ec654;--vp-c-brand-lighter: #b7ee7a;--vp-c-brand-dark: #407900;--vp-c-brand-darker: #185500;--vp-c-brand-next: #00a9b0}86.25%{--vp-c-brand-1: #5da035;--vp-c-brand-light: #84c75a;--vp-c-brand-lighter: #acf080;--vp-c-brand-dark: #357a0a;--vp-c-brand-darker: #015600;--vp-c-brand-next: #00a9b8}87.5%{--vp-c-brand-1: #51a13c;--vp-c-brand-light: #79c961;--vp-c-brand-lighter: #a1f287;--vp-c-brand-dark: #277b16;--vp-c-brand-darker: #005700;--vp-c-brand-next: #00a9c0}88.75%{--vp-c-brand-1: #44a244;--vp-c-brand-light: #6dca68;--vp-c-brand-lighter: #96f48e;--vp-c-brand-dark: #117c1f;--vp-c-brand-darker: #005700;--vp-c-brand-next: #00a8c7}90%{--vp-c-brand-1: #34a44b;--vp-c-brand-light: #60cc70;--vp-c-brand-lighter: #89f595;--vp-c-brand-dark: #007d28;--vp-c-brand-darker: #005801;--vp-c-brand-next: #00a8cf}91.25%{--vp-c-brand-1: #1ba553;--vp-c-brand-light: #51cd77;--vp-c-brand-lighter: #7cf69d;--vp-c-brand-dark: #007e30;--vp-c-brand-darker: #00590d;--vp-c-brand-next: #00a7d5}92.5%{--vp-c-brand-1: #00a65b;--vp-c-brand-light: #48ce80;--vp-c-brand-lighter: #75f7a6;--vp-c-brand-dark: #007f38;--vp-c-brand-darker: #005917;--vp-c-brand-next: #00a6dc}93.75%{--vp-c-brand-1: #00a663;--vp-c-brand-light: #48cf88;--vp-c-brand-lighter: #75f8ae;--vp-c-brand-dark: #008040;--vp-c-brand-darker: #005a20;--vp-c-brand-next: #00a6e2}95%{--vp-c-brand-1: #00a76c;--vp-c-brand-light: #49cf91;--vp-c-brand-lighter: #76f9b7;--vp-c-brand-dark: #008049;--vp-c-brand-darker: #005b28;--vp-c-brand-next: #00a4e7}96.25%{--vp-c-brand-1: #00a874;--vp-c-brand-light: #49d099;--vp-c-brand-lighter: #76f9c0;--vp-c-brand-dark: #008151;--vp-c-brand-darker: #005c30;--vp-c-brand-next: #00a3ec}97.5%{--vp-c-brand-1: #00a87d;--vp-c-brand-light: #49d0a2;--vp-c-brand-lighter: #77fac9;--vp-c-brand-dark: #008159;--vp-c-brand-darker: #005c37;--vp-c-brand-next: #00a2f1}98.75%{--vp-c-brand-1: #00a985;--vp-c-brand-light: #4ad1ab;--vp-c-brand-lighter: #77fad3;--vp-c-brand-dark: #008261;--vp-c-brand-darker: #005d3f;--vp-c-brand-next: #00a0f4}to{--vp-c-brand-1: #00a98e;--vp-c-brand-light: #4ad1b4;--vp-c-brand-lighter: #78fadc;--vp-c-brand-dark: #008269;--vp-c-brand-darker: #005d47;--vp-c-brand-next: #009ff7}}:root{--vp-c-brand-1: #00a98e;--vp-c-brand-light: #4ad1b4;--vp-c-brand-lighter: #78fadc;--vp-c-brand-dark: #008269;--vp-c-brand-darker: #005d47;--vp-c-brand-next: #009ff7;animation:rainbow 40s linear infinite}html:not(.rainbow){--vp-c-brand-1: #00a98e;--vp-c-brand-light: #4ad1b4;--vp-c-brand-lighter: #78fadc;--vp-c-brand-dark: #008269;--vp-c-brand-darker: #005d47;--vp-c-brand-next: #009ff7;animation:none!important}:root{--vp-c-gutter: var(--vp-c-divider);--vp-code-block-bg: rgb(125 125 125 / .04);--vp-code-tab-divider: var(--vp-c-divider);--vp-code-copy-code-bg: rgb(125 125 125 / .1);--vp-code-copy-code-hover-bg: rgb(125 125 125 / .2);--vp-c-disabled-bg: rgb(125 125 125 / .2);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-c-text-dark-3: rgb(56 56 56 / .8);--vp-c-brand-lightest: var(--vp-c-brand-1);--vp-c-highlight-bg: var(--vp-c-brand-light);--vp-c-highlight-text: var(--vp-c-bg)}.dark{--vp-code-block-bg: rgb(0 0 0 / .2);--vp-c-text-code: #c0cec0}:root{--vp-button-brand-border: var(--vp-c-brand-light);--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-1);--vp-button-brand-hover-border: var(--vp-c-brand-light);--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-light);--vp-button-brand-active-border: var(--vp-c-brand-light);--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-button-brand-bg)}:root{--vp-home-hero-name-color: transparent;--vp-home-hero-name-background: -webkit-linear-gradient(120deg, var(--vp-c-brand-1) 30%, var(--vp-c-brand-next));--vp-home-hero-image-background-image: linear-gradient(-45deg, var(--vp-c-brand-1) 30%, var(--vp-c-brand-next));--vp-home-hero-image-filter: blur(80px)}@media (min-width: 640px){:root{--vp-home-hero-image-filter: blur(120px)}}@media (min-width: 960px){:root{--vp-home-hero-image-filter: blur(120px)}}.browser-safari,.browser-firefox{--vp-home-hero-image-background-image: transparent;--vp-home-hero-image-filter: ""}:root{--vp-custom-block-tip-border: var(--vp-c-brand-1);--vp-custom-block-tip-text: var(--vp-c-brand-darker);--vp-custom-block-tip-bg: var(--vp-c-brand-dimm)}.dark{--vp-custom-block-tip-border: var(--vp-c-brand-1);--vp-custom-block-tip-text: var(--vp-c-brand-lightest);--vp-custom-block-tip-bg: var(--vp-c-brand-dimm)}.DocSearch{--docsearch-primary-color: var(--vp-c-brand-1) !important} diff --git a/assets/zhHans_changelog.md.CNUeKrzR.js b/assets/zhHans_changelog.md.B4oYZ-kH.js similarity index 99% rename from assets/zhHans_changelog.md.CNUeKrzR.js rename to assets/zhHans_changelog.md.B4oYZ-kH.js index 67de42384..4d428bcf2 100644 --- a/assets/zhHans_changelog.md.CNUeKrzR.js +++ b/assets/zhHans_changelog.md.B4oYZ-kH.js @@ -1 +1 @@ -import{e as r,o as a,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"更新日志","description":"","frontmatter":{"title":"更新日志"},"headers":[],"relativePath":"zhHans/changelog.md","filePath":"zhHans/changelog.md","lastUpdated":1776916170000}'),i={name:"zhHans/changelog.md"};function c(l,e,n,h,f,b){return a(),t("div",null,[...e[0]||(e[0]=[o('

        Changelog

        2.8.1 (2026-04-07)

        Bug Fixes

        • 🐛 Fixed the problem of dark theme background not taking effect (ad19695)

        Performance Improvements

        • 🎉 Increased free limit for batch automation scripts and device group controls to 5 devices. (11271f2)

        2.8.0 (2026-04-06)

        Features

        • ✨ Window arrangement supports the automatic arrangement function (696d94b)

        Bug Fixes

        • 🐛 Fix i18n errors (e4ad3ec)
        • 🐛 Fix the default value issue of the subscription plan (a19dd9e)
        • 🐛 Fixed the issue where multiple files cannot be pasted when copied to the clipboard under Windows (dcc7a94)

        Performance Improvements

        • ♻️ Optimize subscription plan (c12ef9d)
        • ♻️ Optimize the pricing strategy for advanced features to prevent misjudgments by users (4d722b7)
        • 💄 Optimize the display details of the embedded mirror window (6cf4c69)
        • 🚀 Automation script adds random range option (4d73e1a)
        • 🚀 Extended embedded mirroring operable shortcut buttons (19c0de2)
        • 🚀 Optimize subscription configuration (d053bfa)
        • 🚀 Optimize the automation script editor to avoid screen border issues (ffd56a6)
        • 🚀 Refactored file copy function supports batch copying to the clipboard (ccca99a)

        Code Refactoring

        • ♻️ Optimize subscription plan default value acquisition (7b9c47f)
        • 🚀 Dynamically configure subscriptions by detecting the environment (d02e1b3)
        • 🚀 Fix typescript configuration (cbc8631)

        2.7.3 (2026-04-02)

        Bug Fixes

        • 🐛 Fixed an issue where embedded mirroring could not be input due to external activation elements. (058b982)

        Performance Improvements

        • 🚀 Optimize the embedded image to open the application list display (7f6b18a)

        Code Refactoring

        • 🔊 Optimize the wscrcpy audio cleaning logic (a29cd85)

        2.7.2 (2026-04-01)

        Bug Fixes

        • 🐛 Fix dependency not updated error (2d8ebfd)

        2.7.1 (2026-04-01)

        Bug Fixes

        • 🐛 Fixed the problem that the global search shortcut key does not take effect (e7596f9)

        2.7.0 (2026-04-01)

        Features

        • 🚀 Add wscrcpy cli parameter adapter (ea64b5e)
        • 🚀 Complete more parameters of wscrcpy (c48020b)
        • 🚀 Extend wscrcpy capabilities (0717688)
        • 🚀 Initial implementation of device group control function (4ea4e7d)
        • 🚀 Optimize group control experience (853e53d)
        • 🚀 Optimize the details of the mask layer module (c9da58e)
        • 🚀 Optimize the interaction details of the mask board module (b67582a)
        • 🚀 Redesign the overlay module guide page (c522fcb)
        • 🚀 Refactor the embedded image package to the wscrcpy package (5f8a309)
        • 🚀 Use tango-adb to directly render the device screen in the mask layer module (81d93dd)
        • 🚀 wscrcpy adds support for mouse hover monitoring (eb78931)
        • 🚀 wscrcpy only enables audio forwarding by default in the macos environment (5d510dc)

        Bug Fixes

        • 🐛 Fix the issue of resetting the window position of the mirror module (d4c3a74)
        • 🐛 Fix the problem of data echo in automation steps (435c3de)
        • 🐛 Fix the problem of Wscrcpy audio forwarding exception (967a6c2)
        • 🐛 Fix the problem of wscrcpy group control failure (ea74182)
        • 🐛 Fix wscrcpy clipboard synchronization issue (42fee69)
        • 🐛 Fix wscrcpy reconnection problem (a6de9b9)
        • 🐛 Fixed sub-package build conflict and misalignment issue (99b22ba)
        • 🐛 Fixed syntax error in the action bar at the bottom of the overlay (ef0a301)
        • 🐛 Fixed the problem of abnormal calculation of size ratio when switching the main device on the group control page (5ad014f)
        • 🐛 Fixed the problem of abnormal disconnection of wscrcpy video stream when exiting the program (174a01c)
        • 🐛 Fixed the problem of interactive forwarding conflict when group control is enabled for auxiliary devices (60ae2a4)
        • 🐛 Fixed the problem of mask layer adaptation button forwarding (4be239e)
        • 🚀 Fix mask layer test issue (33581df)
        • 🚀 Fixed overlay module screen rotation issue (ad0af45)
        • 🚀 Fixed wscrcpy audio and clipboard synchronization configuration conflict issue (5bb65e0)

        Performance Improvements

        • 💄 Optimize the interaction of the embedded image module (7a21fdb)
        • 🚀 Add internationalization to automation script keylist (e7b78c1)
        • 🚀 Device group control expands more operations (08e46b6)
        • 🚀 Enhance the interaction experience of built-in images (e913fee)
        • 🚀 Expand batch opening function for group control function (a38dbde)
        • 🚀 Explicitly declare wscrcpy external dependencies (52924c8)
        • 🚀 Improve group control function subscription capabilities (479b996)
        • 🚀 Improve the stability of the overlay adapter (be0ff8c)
        • 🚀 More embedded startup entries have been added to the device list (24e4fd1)
        • 🚀 Optimize check update pop-up window style (54eaa51)
        • 🚀 Optimize embedded image module error prompts (e26186b)
        • 🚀 Optimize overlay click/swipe event interaction (d7c0500)
        • 🚀 Optimize overlay module details (8ce5937)
        • 🚀 Optimize overlay module details (2799ab0)
        • 🚀 Optimize preference interaction Disable device-dependent options in global mode (ea47604)
        • 🚀 Optimize the directory structure of the group control module (f9a9d67)
        • 🚀 Optimize the empty list style of the device list (95e8e4a)
        • 🚀 Optimize the interaction details of the overlay module (e297850)
        • 🚀 Optimize the interactive experience of group control function (05c8643)
        • 🚀 Optimize the interactive experience of the embedded mirror control bar (ac6159f)
        • 🚀 Optimize the keyboard input experience of the group control module (32b7fa2)
        • 🚀 Optimize the overlay module to organize interaction details (f358348)
        • 🚀 Optimize the video stream freezing problem when wscrcpy starts the same device (7baa53c)
        • 🚀 Optimize universal scroll bar interaction (dd6f3fe)
        • 🚀 Optimize window arrangement function details (91e1a3a)
        • 🚀 Overlay module input function reconstruction (ac19fab)
        • 🚀 The overlay module supports forwarding more key types (05c6faf)

        Code Refactoring

        • ♻️ Reconstruct the embedded mirror module directory structure (119a471)
        • 📝 Remove redundant wscrcpy judgments (3d9add8)
        • 🚀 Adjust the group control module naming (3c14c99)
        • 🚀 Expand the embedded image switching function (a49f8b5)
        • 🚀 Optimize and extend wscrcpy type (eec0913)
        • 🚀 Optimize interactive performance of embedded mirroring (ba8bfea)
        • 🚀 Optimize overlay module configuration (08009bf)
        • 🚀 Optimize the details of the overlay layer (59dc702)
        • 🚀 Optimize the directory structure of the group control module (7116264)
        • 🚀 Optimize wscrcpy details (247dc5e)
        • 🚀 Reconstruct the directory structure of the overlay module (668ef67)
        • 🚀 Reconstruct the image window ratio to improve reusability (555e346)
        • 🚀 Reconstruct the mask layer keyboard module (cad077d)
        • 🚀 Reconstruct the overlay module architecture (196cca0)
        • 🚀 Reconstruct the overlay module parameter injection method to solve the problem of responsive loss (3163c60)
        • 🚀 Reconstructed mirror window ratio algorithm is compatible with all platforms (b8377f2)
        • 🚀 Refactor and extend wscrcpy library functionality (4ca2c49)
        • 🚀 Refactor wscrcpy (b537a96)
        • 🚀 Remove redundant code from built-in images (f6bcbf5)
        • 🚀 Remove redundant code from the mask layer module (bdb4f49)

        2.6.2 (2026-03-13)

        Bug Fixes

        • 🐛 Fix the problem of inaccurate vertical coordinate of window arrangement under Windows (1fa6bd5)
        • 🐛 Fixed the issue of abnormal scaling of the window arrangement function under Windows (87f3596)
        • 🐛 Fixed the issue of redundant scroll bars appearing in the window arrangement tool screen area (ea0b451)

        Code Refactoring

        • 🚀 Refactored version build (bd3ec90)

        2.6.1 (2026-03-13)

        Performance Improvements

        • 🌱 Improve the interactive experience of subscription plans (f3620fd)

        2.6.0 (2026-03-12)

        Features

        • 🎉 Optimize device window arrangement: By obtaining the actual screen size of the device, canceling fixed ratio scaling, avoiding black border issues, and improving adaptation accuracy and display experience. (35d2028)
        • 🚀 Add a subscription plan for batch automation scripts (efa6e28)
        • 🚀 Add WeChat script template (569099c)
        • 🚀 Improve the international translation of automated script modules (1cb2cb6)
        • 🚀 Optimize automated script interaction (1e61d0f)
        • 🚀 Optimize magic variable interaction support for import and export (b7ba176)
        • 🚀 Preliminary addition of automation script editor support (bc6fdcc)
        • 🚀 Preliminary support for automated script batch execution and scheduled tasks (e14c302)
        • 🚀 Product and optimization of automation script editor (b36f6c6)

        Bug Fixes

        • 🐛 Fix custom startup layout and interaction issues (6311364)
        • 🐛 Fixed an issue where the automation script log directory was ignored (8777e63)
        • 🐛 Fixed script template translation issue (01870f7)
        • 🐛 Fixed split automation script editor form variable usage compatibility issue (53da1e9)
        • 🐛 Fixed the issue of abnormal task type penetration display in the scheduled task list (58ced2b)
        • 🐛 Fixed the issue of batch execution image blocking (9e3e17b)
        • 🐛 Fixed the issue where the aspect ratio was not fixed when the window arrangement was adjusted again after being saved. (8977138)
        • 🐛 Fixed the problem of unable to echo after window arrangement (6907762)
        • 🚀 Fixed batch execution automation script variable injection concurrency issue (3b8dae0)
        • 🚀 Fixed the problem that the automation script during switching execution could not confirm the interruption (2162203)
        • 🚀 Optimize subscription configuration (9711e73)
        • Fix automated script editor testing issue (87c6f93)

        Performance Improvements

        • 💄 Optimize smart picking interaction (a66fb7a)
        • 🚀 Automate script selectors to support termination logic and interaction optimization (d0a4bb3)
        • 🚀 Automation script editor adds execution selection function (d8f1300)
        • 🚀 Detail optimization of the automated script editor (338ad3e)
        • 🚀 Improve automation script stability (455c11f)
        • 🚀 Integrate the adb keyboard installation universal hook (aca0427)
        • 🚀 Optimize automation script editor details (fb2e4ad)
        • 🚀 Optimize automation script editor interaction details (e371171)
        • 🚀 Optimize automation script editor interaction details (24f0792)
        • 🚀 Optimize automation script function details (f084d08)
        • 🚀 Optimize execution of automation script interaction details (568fedf)
        • 🚀 Optimize international translation (3dd15a9)
        • 🚀 Optimize product details (a3abd2c)
        • 🚀 Optimize the installation of adb keyboard boot (fd4e752)
        • 🚀 Optimize the layout of the execution page for planned tasks (10da149)
        • 🚀 Remove obsolete shell script functionality (dfc505b)
        • 🚀 Template import supports importing magic variables (767c1dd)
        • 🚀 When obtaining the device list, synchronously obtain the screen resolution to optimize the screen arrangement experience (3715e0f)
        • Enhance the stability of the automated script editor (8030668)
        • Optimize script editor interaction (7367d15)

        Miscellaneous Chores

        Code Refactoring

        • ♻️ Restore version of the system (4a7c653)
        • ➖ Remove redundant printing information (6bd144d)
        • 🔨 Split Automation Script Editor form (98ac71b)
        • 🚀 Extract the common logic of launching the app function into an independent selector and reuse it (583b93f)
        • 🚀 Optimize automation script editor details (06f1ede)
        • 🚀 Optimize international translation (2d07a60)
        • 🚀 Optimize the interaction of script selectors for batch execution (c3e86fd)
        • 🚀 Optimize the size of deleted pop-up windows (a43fc53)
        • 🚀 Project code details optimization (eda1d5a)
        • 🚀 Support adjusting subscription price through environment variables (1867f03)
        • Integrated script editor supports more configuration functions (b0a30f8)
        • Optimize the overall directory and naming conventions (aed80ef)

        2.5.1 (2026-02-27)

        Bug Fixes

        • Fixed the issue of missing title bar information when launching through the app (e6bcd1e)

        2.5.0 (2026-02-27)

        Features

        • Add concurrency limit for batch wireless device connections (f048956)

        Bug Fixes

        • Fix shell space command parsing problem (e1ab66c)
        • Initialize shell command variables to prevent undefined values (e776c11)

        2.4.2 (2026-02-26)

        Bug Fixes

        • Fix the problem of abnormal disconnection of adb after changing some configurations (ffbfc40)

        2.4.1 (2026-02-26)

        Bug Fixes

        • Fix the language detection issue of portable software (9985067)

        Code Refactoring

        • Reorganize initialization order to load store before process configuration (9283a45)

        2.4.0 (2026-02-26)

        Features

        • ✨ Adds fastboot command support and provides experimental integration of scrcpy dependencies for Linux ARM64 platforms. (70f3243)
        • 🎉 Comprehensive migration to the built-in terminal based on xterm to provide a more controllable user experience (a2ee25f)
        • add drag and drop file upload support (d5b969c)
        • add gnirehtet path for mac (8da67c8)
        • add scroll to bottom button in chat (e4e8f80)
        • add terminal shell support with xterm integration (3c7828c)
        • add wireless connection mode switch toggle (161acf4)
        • add wireless pair success message and UI improvements (eccb26e)
        • improve ADB keyboard installation error handling (71f7635)
        • trigger language change callback immediately on init (e0e3d22)
        • update api endpoint and enable adb keyboard (4010b17)
        • Window orchestration component enhancement: Supports manual setting of position and size (e3aa89a)

        Bug Fixes

        • 🐛 Migrate fkill to tree-kill to solve windows binary file execution problems (6c89b73)
        • change clipboard tag type to primary (edb8840)
        • enhance xterm terminal styling and resize handling (9e031f5)
        • filter ANSI color codes for Windows PowerShell terminal (9c58f25)
        • Fix i18n race translation (7b37f29)
        • handle terminal exit and error states with reload (e8d93d5)
        • handle Windows terminal line ending for all cases (e06e763)
        • handle Windows terminal line ending for device type (1be1a5e)
        • improve Windows terminal compatibility and session management (7f37f7d)
        • improve Windows terminal cursor sync and resize responsiveness (c16a5f9)
        • improve Windows terminal encoding and scrollbar styling (85d5a96)
        • improve Windows terminal rendering and resize stability (7f05996)
        • improve Windows terminal shell detection and remove debug logs (4a5ebbc)
        • include node-pty in electron build (c98d82d)
        • prioritize pwsh.exe for Windows terminal (a99d830)
        • simplify Windows PowerShell terminal initialization (95c432c)
        • simplify Windows terminal shell initialization (2a3ed6f)
        • Solve the problem that the language of the terminal title cannot be dynamically updated (6e2c030)
        • specify SIGTERM signal for treeKill (d28eb1a)
        • update terminal tip color to custom RGB (156d39b)

        Performance Improvements

        • 🚀 Optimize ADB keyboard installation and detection (f312cc2)

        Code Refactoring

        • add cleanup handler for window IPC (bad6752)
        • add comment for tray destroy event (12038df)
        • add electron-modularity dependency (d0abc0b)
        • add main window API and type system (778a65f)
        • add plugin warnings and fix module loading order (a5bdbf3)
        • add rendererDir support and update window loading (fac664d)
        • adjust screenshot message and dialog styles (7bbab51)
        • adjust terminal line height to 1.4 (5068f7d)
        • adjust terminal window and device sync settings (6a4bd61)
        • adjust window width and improve error handling (5576d2e)
        • centralize PATH setup and environment configuration (6a6eb80)
        • clean up .gitignore file (3644b3e)
        • clean up main window module (9d1eee9)
        • defer app initialization until ready (9905f41)
        • defer plugin registration until app start (46ac0db)
        • Electron main process architecture reconstruction (f810ecb)
        • emit tray:destroy on window restore (fab9343)
        • expose $platform to window and global properties (9a7ee70)
        • extract terminal logic into useTerminal hook (9d725ca)
        • fix device payload and adjust control bar height (e5981ac)
        • fix failed translation key (fe98a56)
        • fix payload type and resolve target logic (5af60c8)
        • fix preview button visibility class (5a8c97b)
        • implement retained terminal session with cleanup (532a055)
        • implement terminal session management with providers (fa156e1)
        • improve file download progress tracking (51101c7)
        • improve gnirehtet menu handling and options (8d0e85b)
        • improve process killing and error handling (85a080e)
        • improve window bounds persistence logic (5361e24)
        • improve wireless pair input handling and UI (3aea5f6)
        • migrate core helpers to electron-modularity package (630deaa)
        • migrate edger to service (9c64cd5)
        • migrate events to service handlers (c99b1de)
        • migrate plugins to priority-based system (ae4404a)
        • migrate services and modules to explicit app.use (e63de2e)
        • migrate services to plugins (36e2a0d)
        • migrate to ipcx for IPC handling (1b1fd8d)
        • migrate to official plugins and update imports (eb9bead)
        • migrate to window.$preload namespace (41a2342)
        • move i18next-fs-backend to dependencies (f507222)
        • move window-manager to window module (8af97a5)
        • optimize device query and control window (4e2736d)
        • optimize minimized tray and window handling (3765b73)
        • Reconstruct the multi-entry directory structure (0690f4b)
        • Refactor i18n related services (6e882b6)
        • remove app parameter from window manager (f8719f1)
        • remove appium-adb documentation and update github link (f532aab)
        • remove border from preference header (9c97366)
        • remove debug console log for args (e4332c1)
        • remove debug console log for platform paths (e5590f3)
        • remove electron middleware module (3bd462c)
        • remove encoding conversion and use utf8 only (c32cb79)
        • remove fixed width from window configuration (ef3e86b)
        • remove spawnShell and convert arrow functions (66978f1)
        • remove theme plugin README (85a853b)
        • remove trailing whitespace in adb helpers (ec7314c)
        • remove ui-ux-pro-max prompt files (11d41a9)
        • remove unused app-region-drag style (094e0df)
        • remove unused terminalConfig from useTerminal (9db3f24)
        • remove Windows-specific encoding default (534934b)
        • rename app to ctx and update electron app imports (4c7ceba)
        • rename app to ctx in electron app (6707e2d)
        • rename currentStatusType to sessionStatus (8c84464)
        • rename electron-modularity to electron-setup (081a8a5)
        • rename entries to pages for routing structure (863ecd4)
        • rename windowOptions to browserWindow and add mainWindow flag (5093577)
        • reorder plugin registration in electron main (b8ee4ef)
        • reorganize process helpers directory structure (dcdb6d7)
        • replace args-tokenizer with shell-quote (1196263)
        • replace getSize with computed size property (c7edceb)
        • replace IS_PACKAGED with import.meta.env.MODE (521e2ba)
        • replace spawnShell with unified sheller helper (0159bb4)
        • replace tree-kill with fkill for process termination (c50cea6)
        • replace window controls with app header (a5fa218)
        • restructure copilot and explorer modules (74efca1)
        • restructure core helpers and window management (16fc934)
        • restructure electron helpers and modules (f0e4851)
        • restructure main window and singleton modules (7b979d6)
        • restructure terminal session management (19428dd)
        • restructure window management and IPC handlers (59a315f)
        • simplify file list extraction in drag upload (7453a99)
        • simplify gnirehtet trigger handling (f9185c3)
        • simplify main window resolution and remove legacy code (c764f91)
        • simplify restoreAndFocusWindow options (27185f5)
        • simplify window types and return native BrowserWindow (184ab7b)
        • simplify wireless connection UI and remove pair dialog (30e026c)
        • standardize module export structure (8111f6f)
        • throttle download and upload progress callbacks (8a16d22)
        • translate terminal comments to English and add command execution (71a2d7a)
        • unify control bar height configuration (7e6abed)
        • unify shell error handling and lazy loading (98dd91b)
        • update primaryColor value (346df64)
        • update scrollbar styling with Tailwind CSS (6eaf259)
        • update terminal scrollbar styling with custom width and transparency (b2c8f87)
        • update terminal title and locale strings (f0bdf0b)

        2.3.1 (2026-01-27)

        Bug Fixes

        • 🐛 Fixed the problem of being unable to click to enter the co-pilot entrance under Windows and Linux. (c563d11)

        2.3.0 (2026-01-22)

        Features

        • 🚀 Optimize portable package configuration and add linux flatpak package support (a7982db)
        • configure electron-log file path in debugger helper (2242668)

        Bug Fixes

        • 🐛 handle copilot execution failures and adjust config max steps (3601709)
        • win: fully redirect user data to portable folder and fix CI workflow (fe2fd89)

        Performance Improvements

        • ✨ Optimize windows and linux window layout (b63b59c)

        Code Refactoring

        • add platform simulation support and adjust window controls layout (9c3a5b1)
        • adjust header and chat layout padding (70fe60d)
        • adjust layout padding for windows and linux platforms (4e153cc)
        • adjust widget dimensions and clear dialog messages (ca6796f)
        • implement immersive title bar and optimize window layout (1e76d11)
        • improve chat retry logic and ADB keyboard detection (8e0e43c)
        • remove dialog width constraints and improve file creation (54e5553)
        • remove quiet config option (76f9d6c)
        • remove redundant success messages and unify dialog titles (b1eac32)
        • reorganize emitter module and update event emitter references (4c3cc2d)
        • reorganize preference form layout with tabs and scroll (7f0f864)
        • replace ExTooltipButton with native el-button title attribute (8056977)

        2.2.0 (2026-01-17)

        Features

        • 🎉 Improve the accuracy and coverage of Copilot opening applications by obtaining information about installed applications on the device (e2f27da)
        • add keyboard shortcuts for connect and disconnect (39293af)
        • auto-focus input when editing prompt (d58b993)

        Bug Fixes

        • 🐛 Fixed the issue where autoglm.js conversation request listener was not cleaned up causing memory overflow (bac2126)

        Code Refactoring

        • improve config management and prompt editing (de2f708)
        • improve prompt manager UI and editing experience (1697558)
        • optimize subscribe store initialization and token management (0f00903)

        2.1.7 (2026-01-14)

        Miscellaneous Chores

        2.1.6 (2026-01-14)

        Miscellaneous Chores

        2.1.5 (2026-01-14)

        Miscellaneous Chores

        • remove comments in copilot window handler (f231998)
        • update version to 2.1.4 (9bdf671)

        2.1.4 (2026-01-14)

        Miscellaneous Chores

        • add release name format to config (6db1b51)
        • update release workflow and build commands (8f5345b)

        2.1.3 (2026-01-14)

        Miscellaneous Chores

        • add linked-versions plugin to release config (415e4ae)

        2.1.2 (2026-01-14)

        Bug Fixes

        • 🐛 Fix automatic build issues (aba8f27)

        Miscellaneous Chores

        • add GH_TOKEN env to release workflow (078bf18)
        • release 2.1.1 (d1c04ce)
        • release 2.1.2 (91d9bbd)
        • release 2.1.2 (c7c8616)
        • remove release creation step from workflow (b73c179)
        • remove unnecessary comments in App.vue (22e331d)
        • remove unnecessary comments in App.vue (5ae8fbe)
        • update electron-builder config path and publish options (d3b4914)
        • update pull request title pattern (060ad4a)
        • update release configuration and patterns (0054fd4)

        2.1.0 (2026-01-14)

        Features

        • ✨ Add auto launch functionality and preference option (69c75cc)
        • ✨ Add hidden launch option for auto-start (dd1c2e1)
        • ✨ Add subscribe configuration hook and update UI (80b3534)
        • ✨ Add system tray support and Linux auto-launch (df414b9)
        • 🔖 Copilot adds thinking_stream event support (22623c4)
        • 🚑️ The portable version now supports automatically generating configuration files in the running directory (ba551b7)
        • add custom empty state icon for device list (65b028f)
        • add zip target for macOS builds (f52d3a5)

        Bug Fixes

        • 🐛 Fix delete message and config initialization (82a77ea)
        • 🐛 Fixed the issue of failed export and export configuration files (fd32c36)
        • 🐛 Update dependencies and add sharp override in workspace configuration (dbf366a)
        • 💰 Update payment amount handling in subscription (422950c)
        • add background color and improve window initialization (498fc90)
        • adjust empty state icon styling in device list (363bf3d)
        • ensure concurrency limit is numeric (d2c977c)
        • types: allow typed payload handlers by using any[] for handle listener rest params (b4e8058)

        Performance Improvements

        • 🚀 Use an external library instead of the built-in autoglm.js (d1f8176)

        Code Refactoring

        • ⚡️ Refactor code structure for improved readability and maintainability (f211924)
        • 🌐 Update language labels to native text (cb7ac96)
        • 🌐 Update subscription translations for multiple locales (b4e5780)
        • 🎨 Redesign task dialog with card layout (cd06d3b)
        • 🎨 Simplify config UI layout and update maxSteps (af18241)
        • 🔄 Auto configure Copilot after payment (c00ac1e)
        • 🔄 Move ESLint config to root and clean up dependencies (f2bd345)
        • 🔄 Optimize session callbacks and event handling (ae19570)
        • 🔄 Rename ipc to services for better structure (8212872)
        • 🔄 Rename start module to launch for clarity (5d44ebf)
        • 🔧 Optimize copilot config change detection (2776e8a)
        • 🔧 Replace quick prompts with PromptBar component (9b0c4df)
        • improve theme switching and background handling (b3203af)
        • migrate copilot config to store (e323611)
        • replace rotation icon with outline version (95ad30d)
        • replace send icon with rocket icon (ef9e7d3)
        • replace svg icons with font icons (9eca902)
        • replace trash icon with Delete icon (c59994e)

        2.0.1 (2026-01-06)

        Bug Fixes

        • 🐛 Fix the problem of abnormal subscription recharge fee (b32043c)

        2.0.0 (2026-01-05)

        Features

        • ✨ Add system terminal support (e5c157e)
        • ✨ Device lists will now intelligently merge duplicate device entries and share device configurations (52cc4b1)
        • ✨ Integrate scrcpy binaries for macos (85bf096)
        • ✨ Introducing a new file icon display component and enhancing the File Explorer dialog. (11be6f1)
        • ✨ Now supports copying device screenshots and recording files to the clipboard (bdb3644)
        • ✨ Now you can arrange your device windows through a graphical interface (91ad249)
        • ✨ Support edge hiding function (14a81de)
        • ✨ Support floating control bar (8807e50)
        • ✨ Support pairing and connecting to devices via QR code (14306b2)
        • ✨ Support to close the device screen when controlling (a84c775)
        • ✨ Supports starting applications for mirroring (d19e781)
        • ✨ Use the new interface design (b08021b)
        • 💥[Release-As: 2.0.0] major copilot overhaul with AutoGLM and multi-device automation (7ad5ecd)
        • 📸 Enhanced recording (7f10161)
        • 🔍️ Optimize the search function of the app (94ccb7b)
        • 🚀 Split the file manager into independent windows and support multiple instances in parallel (f41d853)
        • 🚀 Support adding the open application action to the desktop shortcut. (Not supported on macOS) (add251f)
        • 🚀 Supports connecting historical devices via device list (e0687e8)
        • 🚀 Supports dragging the device control bar to sort (64a98b2)
        • 🚀 Update to scrcpy v3.3.2 (462536c)
        • 🚚 Support batch startup mirroring (fcfd78e)
        • 🚚 The file manager has been refactored and improved, and more useful features have been added. (5cd5992)

        Bug Fixes

        • ♻️ Fixed repeated dependency issues (9777622)
        • 🐛 Fix automatic release (c2254aa)
        • 🐛 Fix device support audio and video encoding cannot be parsed (9b7f6a9)
        • 🐛 Fix for built-in scrcpy not supporting x64 macos (0d60655)
        • 🐛 Fix issue with incorrect address bar path when returning to the previous level in file management (0222675)
        • 🐛 Fix linux build errors (9b43dc0)
        • 🐛 Fix the display ID value type error (2b7ee79)
        • 🐛 Fix the mirror group bug (cd7d9cd)
        • 🐛 Fix the problem of build failure caused by missing dependencies (e34e1c2)
        • 🐛 Fix the problem of Windows calling system terminal failure (194689e)
        • 🐛 Fix the problem of Windows terminal injection command failure (fbf88d0)
        • 🐛 Fix typos (a7a3a17)
        • 🐛 Fixed an issue where macos built-in updates failed (432eceb)
        • 🐛 Fixed an issue where some options in preferences could not be turned off (269bd29)
        • 🐛 Fixed possible sandbox issues on Linux (ff9f9bd)
        • 🐛 Fixed the conflict between device control bar sorting and click events (18a57b9)
        • 🐛 Fixed the issue of abnormal path display in the file manager address bar (2f63f6f)
        • 🐛 Fixed the issue of duplicate filter conditions in the device list (6c4242c)
        • 🐛 Fixed the issue of layout flickering when refreshing the device list page (608b8f3)
        • 🐛 Fixed the issue of saving exceptions after adjusting parameters in preference settings (4a18f61)
        • 🐛 Fixed the issue where activating the program on macOS in certain situations would cause the tray to be created repeatedly (cf8e183)
        • 🐛 Fixed the issue where all configurations would be cleared when resetting the category configuration in preferences (6ee9a92)
        • 🐛 Fixed the issue where Chinese text cannot be saved in file management read and write text (34785dd)
        • 🐛 Fixed the issue where PowerShell failed to call the system terminal (7beb027)
        • 🐛 Fixed the issue where recorded files could not be copied to the clipboard under Windows (119b518)
        • 🐛 Fixed the issue where there is a chance of an error when closing the floating control bar on macOS (5c2c711)
        • 🐛 Fixed the problem of minimizing the visibility of tray icons (b0f42aa)
        • 🐛 Issue not taking effect after restarting the application after switching themes (857c480)
        • 🐛 Make StartApp compatible with scrcpy v3.0 (1082e0d)
        • 🐛 Rename --display-buffer to --video-buffer (b2bb0ae)
        • 🐛 Repair ADB timeout problems (b5bffc5)
        • 🐛 Repair floating action bar start application error (487e7e2)
        • 🐛 Repair part of internationalization Lost dynamics (d18444f)
        • 🐛 Resolve default recording error (358064e)
        • 🐛 Resolved the issue where the device list could not be displayed due to compatibility issues with certain devices (2c53b77)
        • 🐛 Resolving build errors (d21fa29)
        • 🐛 Restore the --display-buffer parameter to solve the mirroring problem (0f3d869)
        • 🐛 Solve the conflict between floating navigation bar and quick APP launch (460aca1)
        • 🐛 Solve the problem of abnormal display timing when recording related functions are successful (67d279e)
        • 🐛 Solve the problem of IPV6 address connection failure (1a95325)
        • 🐛 Solve the problem of startup error of development mode under Linux (5c4f65e)
        • 🐛 Solve the problem of Windows disabling video forwarding and crashing (10b902a)
        • 🐛 Solved the problem that the main window could not be restored after being moved off the screen in some cases (d054f8d)
        • 🐛 Start app to adapt to dark mode (ae13fde)
        • 🐛 Temporarily disable scrcpy integration in macOS (9bf4d5c)
        • 🐛 Update scrcpy-server file to solve the problem of not being able to obtain device APP list (63f7135)
        • 📝 Fixed the issue that special characters in Windows prevented the creation of app shortcut launch (301dac5)
        • 🔧 Camera recording and screen off configuration conflict (4508758)
        • 🔧 Fixed button loading prompt conflict issue (c323ad6)
        • 🩹 Restore the windows build configuration (9491069)
        • 🚀 Fix the issue of abnormal program exit behavior under windows (705f8be)

        Performance Improvements

        • ♻️ Adjust the position of the start application button (9833932)
        • ♻️ Code structure optimization (595216b)
        • ♻️ Enhance recording stability (3dd7525)
        • ♻️ Improve ADB connection stability (7655ba6)
        • ♻️ Improve the stability of window arrangement function (7ae3f21)
        • ♻️ Improve wireless connection stability (85be898)
        • ♻️ Improved device connection stability (1d603ab)
        • ♻️ No longer building universal packages for macOS (db5deb4)
        • ♻️ Optimize camera recording (4be2cf4)
        • ♻️ Optimize camera recording stability (952b2a7)
        • ♻️ Optimize device details performance (38d1433)
        • ♻️ Optimize device list interaction logic (3812061)
        • ♻️ Optimize file manager interaction (b168cc3)
        • ♻️ Optimize QR code connection experience (86f5e69)
        • ♻️ Optimize the Russian presentation effect (0d8a8ee)
        • ♻️ Optimized contextBridge related improvements for stability (0e098c3)
        • ♻️ Optimized the adb daemon startup failure detection mechanism (ca6be85)
        • ♻️ Reduce build package size by removing redundant dependencies (7b61b25)
        • ♻️ Refactor configuration related code to improve stability (37bf438)
        • ♻️ Script and directory structure optimization (68378ef)
        • ♻️ Simplify sandbox automatic configuration manager code to improve performance (1b82336)
        • ♻️ Support interruption during waiting for wireless connection (344b385)
        • ♻️ Supports retrieving a list of applications (b1a6ba7)
        • ♻️ Update mirror icon (c214e5a)
        • ♻️ When the application fails to start, display the error message (dbc34d6)
        • ♿️ Supports adjusting the closing method of the application in preferences (e643f8e)
        • ⚗️ Experimental support for turning off screen controls (9555f58)
        • ⚡️ Improve the start APP experience (29e5e1b)
        • ⚡️ Optimize scrcpy parameter conversion performance (18dcd24)
        • ⚡️ Optimize startup application performance (8e94494)
        • ⚡️ Optimize the method of obtaining the available displays of the device (9e31c84)
        • ⚡️ Optimize the stability of options that need to dynamically obtain parameters in preference settings (39bbc98)
        • ✅ A new method is adopted to solve the problem of IP type configuration storage (5488a1e)
        • ✅ File management supports selecting directories for uploading (fd2e639)
        • ✅ Provides the function of detecting and migrating configurations when deleting a device (39e0533)
        • ✅ Support switching devices on the floating control bar (50440f5)
        • ✨ Adjust the position of the wireless connection screen (3e3fc34)
        • ✨ Enable new icon (695e35d)
        • ✨ The floating control bar supports transparent display when inactive (34f27c5)
        • ✨ Update to scrcpy@2.7 to support the gamepad (0053e87)
        • ➖ Remove redundant console (9a67142)
        • ⬆️ Improve QR code connection performance (b413889)
        • ⬆️ Improved performance of automated mirroring (33a03c3)
        • ⬆️ Optimize edge hiding performance (74a91a4)
        • ⬆️ Optimize the performance of the floating control bar (a1c60ec)
        • 🌱 Optimize app icon background color and corner radius. (bc4f492)
        • 🌱 Optimize application icon details (55800be)
        • 🌱 UI details and documentation optimization (5b5bbf7)
        • 🍻 Improve file manager reliability (9063243)
        • 🐛 Improve wireless connection verification method (69fecc3)
        • 👥 Control bar sorting supports state synchronization (88abe95)
        • 👷 Added edge hiding function switch (d25714a)
        • 👷 Explicitly clean up unnecessary child processes on exit (0549dda)
        • 👷 Optimize the edge hiding function (d5caaa9)
        • 👷 Remove redundant code comments (ca4e826)
        • 👽️ Experimental support for adding open application actions to linux desktop shortcuts (6897c0e)
        • 👽️ Experimentally add linux arm64 support (5b033fd)
        • 💄 Improve space utilization of device window layout tools (939a2d2)
        • 💄 Improved Russian display (ca79e1b)
        • 💄 Normalize control window titles and generated file names (ccc7f0e)
        • 💄 Optimization of display effect of device list page (305187d)
        • 💄 Optimize device refresh mode (ea75615)
        • 💄 Optimize dialog display (1813718)
        • 💄 Optimize pairing interface display (df4103b)
        • 💄 Optimize preference setting button layout (47ae53d)
        • 💄 Optimize Russian display effect (5ca39ae)
        • 💄 Optimize the display effect of horizontal screen screenshots (90c7163)
        • 💄 Optimize the interface display effect (c7a5cd4)
        • 💄 Window layout adapted to dark mode theme (eab402b)
        • 💫 Adjust gnirehtet configuration behavior to make it consistent with user operation habits (7507915)
        • 💫 Support appending gnirehtet custom parameters in configuration (206a030)
        • 📌 Standardize the device list lifecycle processing flow. IPv6 addresses must be enclosed in [] and the port number cannot be omitted for wireless connections. (93c059d)
        • 📌 Support saving the main panel window size status (cef022f)
        • 📝 Add docs entry to the program (db5d157)
        • 📝 Add Japanese language support (969378f)
        • 📝 Added Arabic language support (f6c9fa4)
        • 📝 Optimize the scheduled task list (c666709)
        • 📝 Optimize the title of the control interface to solve the problem of duplicate device names (06a151d)
        • 📝 Optimized startup app package name display (22eb718)
        • 📝 Simplified partial translation (7411487)
        • 📦️ Update the upload function to support file and directory selection, and optimize the interface layout (7f5bd35)
        • 📸 Recording camera support (10d0370)
        • 📸 Support viewing real-time images and power information of the device (d262adf)
        • 🔀 Optimize the storage policy configured in preferences (b9faabf)
        • 🔊 Expanded audio source options (fc91f07)
        • 🔍️ Optimize QR code style to avoid scanning problems on some devices (dd3ad6c)
        • 🔖 Adjust the order of quick entry functions (ccb59e1)
        • 🔖 Optimize interaction of preferred terminal options (900dc69)
        • 🔧 Optimized startup APP function interaction (468af22)
        • 🔧 Temporarily disable scheduled tasks that are too far away (be5e639)
        • 🔨 Fixed the problem that some models could not reversely supply the network due to the blocking of installation detection when using Gnirehtet (c5369af)
        • 🔨 Improve the reliability of the linux sandbox configuration tool (6de2538)
        • 🧑‍💻 Improve application performance with VueRouter (6a8c190)
        • 🧑‍💻 Improve device-based terminal experience (88a0356)
        • 🧑‍💻 Optimize application icon size under macOS (066d81f)
        • 🧑‍💻 Optimize the interactive experience of the device control bar (8388646)
        • 🩹 Add an option to enable keyboard fix on app startup to be compatible with older versions of scrcpy (be89b36)
        • 🩹 Closing a screen via the control bar no longer requires creating a help window (84c7be7)
        • 🚀 Adjust options to support scrcpy v3.0 (0602676)
        • 🚀 After getting the device list, query and save the SerialNo of each device in preparation for subsequent integration (4464e7e)
        • 🚀 Clean output when closing built-in terminal (c976d4c)
        • 🚀 Extended floating control bar function (790e703)
        • 🚀 File management supports returning to the root directory (2e27443)
        • 🚀 Improve app icon quality (8a6f4c7)
        • 🚀 Improve performance by asynchronously storing main interface boundary information (d230c15)
        • 🚀 Modify the adb connection method to be compatible with scan connection (e6e8a09)
        • 🚀 Optimization of window arrangement function (33786ab)
        • 🚀 Optimize device connection experience (0690f2d)
        • 🚀 Optimize device list connection behavior and configuration migration strategy (8237058)
        • 🚀 Optimize program performance (9af3988)
        • 🚀 Optimize system terminal stability (2ffc588)
        • 🚀 Optimize the built-in terminal interaction experience (bb56d5b)
        • 🚀 Optimize the default behavior when adding new widgets to the device window arrangement (1be470a)
        • 🚀 Optimize the details of the new version of the icon (db9b19a)
        • 🚀 Optimize the display effect of application icons under windows (e0c221f)
        • 🚀 Optimize the display effect of new icons in smaller sizes (7d91d71)
        • 🚀 Optimize the layout effect of the task list (044cfcd)
        • 🚀 Optimize the menu trigger method for the upload function (8d39f5b)
        • 🚀 Optimize the storage strategy for preference Settings (359b9b9)
        • 🚀 Provide feedback on the application shortcut addition (d7eca8d)
        • 🚀 Supports display of offline devices (dcf817f)
        • 🚀 Supports opening using the main monitor when starting the APP (aec9b78)
        • 🚀 The main panel supports single instance startup (c49d22c)
        • 🚀 Update to scrcpy v3.3.1 (a2bb039)
        • 🚀 Update to scrcpy v3.0 (bf06382)
        • 🚀 Update to scrcpy v3.0.2 (7510548)
        • 🚀 Update to scrcpy v3.1 (7c74c71)
        • 🚀 Update to scrcpy v3.2 (57c11af)
        • 🚀 Update to scrcpy v3.3 (bbf2335)
        • 🚀 Update to scrcpy v3.3.3 (8566644)
        • 🚚 Reduce some unnecessary verifications and increase the speed at which equipment starts reverse network supply (c17aaba)

        Miscellaneous Chores

        Code Refactoring

        • ♻️ Reconstruct the multi-device batch upload function (dbdaa35)
        • 🔨 Optimize code (f61d820)

        1.34.2 (2025-12-08)

        Performance Improvements

        • 📦️ Update the upload function to support file and directory selection, and optimize the interface layout (7f5bd35)
        • 🚀 Optimize the menu trigger method for the upload function (8d39f5b)

        1.34.1 (2025-12-07)

        Performance Improvements

        • 🍻 Improve file manager reliability (9063243)

        1.34.0 (2025-12-07)

        Features

        • ✨ Introducing a new file icon display component and enhancing the File Explorer dialog. (11be6f1)
        • 🚀 Split the file manager into independent windows and support multiple instances in parallel (f41d853)
        • 🚚 The file manager has been refactored and improved, and more useful features have been added. (5cd5992)

        Bug Fixes

        • 🐛 Fixed the conflict between device control bar sorting and click events (18a57b9)
        • 🐛 Fixed the issue of abnormal path display in the file manager address bar (2f63f6f)
        • 🐛 Fixed the issue where Chinese text cannot be saved in file management read and write text (34785dd)

        Performance Improvements

        • ♻️ Optimize file manager interaction (b168cc3)
        • ✨ Enable new icon (695e35d)
        • 🌱 Optimize app icon background color and corner radius. (bc4f492)
        • 🌱 Optimize application icon details (55800be)
        • 📝 Optimize the scheduled task list (c666709)
        • 🧑‍💻 Optimize application icon size under macOS (066d81f)
        • 🧑‍💻 Optimize the interactive experience of the device control bar (8388646)
        • 🚀 Improve app icon quality (8a6f4c7)
        • 🚀 Optimize program performance (9af3988)
        • 🚀 Optimize the details of the new version of the icon (db9b19a)
        • 🚀 Optimize the display effect of application icons under windows (e0c221f)
        • 🚀 Optimize the display effect of new icons in smaller sizes (7d91d71)

        1.33.0 (2025-11-20)

        Features

        • ✨ Add system terminal support (e5c157e)

        Bug Fixes

        • 🐛 Fix issue with incorrect address bar path when returning to the previous level in file management (0222675)
        • 🐛 Fix the problem of Windows calling system terminal failure (194689e)
        • 🐛 Fix the problem of Windows terminal injection command failure (fbf88d0)
        • 🐛 Fixed the issue where PowerShell failed to call the system terminal (7beb027)

        Performance Improvements

        • 🔖 Optimize interaction of preferred terminal options (900dc69)
        • 🚀 Clean output when closing built-in terminal (c976d4c)
        • 🚀 Optimize system terminal stability (2ffc588)
        • 🚀 Optimize the built-in terminal interaction experience (bb56d5b)

        1.32.2 (2025-09-29)

        Performance Improvements

        • 🚀 Update to scrcpy v3.3.3 (8566644)

        1.32.1 (2025-09-10)

        Performance Improvements

        • 🌱 UI details and documentation optimization (5b5bbf7)

        1.32.0 (2025-09-08)

        Features

        • ✨ Now supports copying device screenshots and recording files to the clipboard (bdb3644)
        • 🚀 Update to scrcpy v3.3.2 (462536c)

        Bug Fixes

        • 🐛 Fixed the issue where recorded files could not be copied to the clipboard under Windows (119b518)
        • 🔧 Fixed button loading prompt conflict issue (c323ad6)

        Performance Improvements

        • ✅ Provides the function of detecting and migrating configurations when deleting a device (39e0533)
        • 📌 Standardize the device list lifecycle processing flow. IPv6 addresses must be enclosed in [] and the port number cannot be omitted for wireless connections. (93c059d)
        • 🚀 Modify the adb connection method to be compatible with scan connection (e6e8a09)
        • 🚀 Optimize device list connection behavior and configuration migration strategy (8237058)

        1.31.3 (2025-09-01)

        Performance Improvements

        • 💄 Window layout adapted to dark mode theme (eab402b)

        1.31.2 (2025-09-01)

        Bug Fixes

        • 🐛 Resolved the issue where the device list could not be displayed due to compatibility issues with certain devices (2c53b77)

        Performance Improvements

        • 🚀 Optimization of window arrangement function (33786ab)

        1.31.1 (2025-08-29)

        Performance Improvements

        • 👷 Remove redundant code comments (ca4e826)

        1.31.0 (2025-08-29)

        Features

        • ✨ Device lists will now intelligently merge duplicate device entries and share device configurations (52cc4b1)
        • ✨ Now you can arrange your device windows through a graphical interface (91ad249)

        Bug Fixes

        • 🐛 Fix typos (a7a3a17)
        • 🐛 Fixed possible sandbox issues on Linux (ff9f9bd)
        • 🐛 Fixed the issue of saving exceptions after adjusting parameters in preference settings (4a18f61)
        • 🐛 Issue not taking effect after restarting the application after switching themes (857c480)

        Performance Improvements

        • ♻️ Improve the stability of window arrangement function (7ae3f21)
        • ♻️ Simplify sandbox automatic configuration manager code to improve performance (1b82336)
        • 💄 Improve space utilization of device window layout tools (939a2d2)
        • 🔖 Adjust the order of quick entry functions (ccb59e1)
        • 🔨 Improve the reliability of the linux sandbox configuration tool (6de2538)
        • 🚀 After getting the device list, query and save the SerialNo of each device in preparation for subsequent integration (4464e7e)
        • 🚀 Improve performance by asynchronously storing main interface boundary information (d230c15)
        • 🚀 Optimize the default behavior when adding new widgets to the device window arrangement (1be470a)
        • 🚀 Optimize the layout effect of the task list (044cfcd)
        • 🚀 Optimize the storage strategy for preference Settings (359b9b9)

        1.30.2 (2025-07-15)

        Performance Improvements

        • ♻️ Optimize device list interaction logic (3812061)
        • 📝 Add Japanese language support (969378f)

        1.30.1 (2025-07-14)

        Bug Fixes

        • 🐛 Fixed the issue where all configurations would be cleared when resetting the category configuration in preferences (6ee9a92)
        • 🐛 Solve the problem of abnormal display timing when recording related functions are successful (67d279e)
        • 📝 Fixed the issue that special characters in Windows prevented the creation of app shortcut launch (301dac5)

        Performance Improvements

        • 📝 Optimized startup app package name display (22eb718)
        • 🔧 Optimized startup APP function interaction (468af22)

        1.30.0 (2025-07-14)

        Features

        • 🔍️ Optimize the search function of the app (94ccb7b)
        • 🚀 Supports dragging the device control bar to sort (64a98b2)

        Bug Fixes

        • 🐛 Fixed the issue of layout flickering when refreshing the device list page (608b8f3)
        • 🐛 Fixed the issue where activating the program on macOS in certain situations would cause the tray to be created repeatedly (cf8e183)
        • 🐛 Fixed the issue where there is a chance of an error when closing the floating control bar on macOS (5c2c711)
        • 🚀 Fix the issue of abnormal program exit behavior under windows (705f8be)

        Performance Improvements

        • ♻️ Code structure optimization (595216b)
        • 👥 Control bar sorting supports state synchronization (88abe95)
        • 📝 Optimize the title of the control interface to solve the problem of duplicate device names (06a151d)
        • 🔀 Optimize the storage policy configured in preferences (b9faabf)
        • 🚀 Supports opening using the main monitor when starting the APP (aec9b78)

        1.29.9 (2025-06-27)

        Performance Improvements

        • 🚀 Update to scrcpy v3.3.1 (a2bb039)

        1.29.8 (2025-06-20)

        Bug Fixes

        • 🐛 Update scrcpy-server file to solve the problem of not being able to obtain device APP list (63f7135)

        1.29.7 (2025-06-16)

        Performance Improvements

        • 🚀 Update to scrcpy v3.3 (bbf2335)

        1.29.6 (2025-04-27)

        Performance Improvements

        • 📝 Added Arabic language support (f6c9fa4)
        • 🚀 File management supports returning to the root directory (2e27443)

        1.29.5 (2025-04-17)

        Bug Fixes

        • 🐛 Fix the problem of build failure caused by missing dependencies (e34e1c2)

        1.29.4 (2025-04-17)

        Bug Fixes

        • 🐛 Fixed an issue where some options in preferences could not be turned off (269bd29)

        Performance Improvements

        • 💫 Adjust gnirehtet configuration behavior to make it consistent with user operation habits (7507915)
        • 🔍️ Optimize QR code style to avoid scanning problems on some devices (dd3ad6c)
        • 🩹 Add an option to enable keyboard fix on app startup to be compatible with older versions of scrcpy (be89b36)

        1.29.3 (2025-04-02)

        Performance Improvements

        • 📝 Add docs entry to the program (db5d157)
        • 🚚 Reduce some unnecessary verifications and increase the speed at which equipment starts reverse network supply (c17aaba)

        1.29.2 (2025-03-31)

        Performance Improvements

        • 🔨 Fixed the problem that some models could not reversely supply the network due to the blocking of installation detection when using Gnirehtet (c5369af)

        1.29.1 (2025-03-31)

        Performance Improvements

        • 🔊 Expanded audio source options (fc91f07)
        • 🩹 Closing a screen via the control bar no longer requires creating a help window (84c7be7)
        • 🚀 Update to scrcpy v3.2 (57c11af)

        1.29.0 (2025-03-27)

        Features

        • 🚀 Support adding the open application action to the desktop shortcut. (Not supported on macOS) (add251f)
        • 🚚 Support batch startup mirroring (fcfd78e)

        Bug Fixes

        • 🐛 Solve the conflict between floating navigation bar and quick APP launch (460aca1)
        • 🐛 Solve the problem of startup error of development mode under Linux (5c4f65e)

        Performance Improvements

        • ✨ The floating control bar supports transparent display when inactive (34f27c5)
        • 👷 Explicitly clean up unnecessary child processes on exit (0549dda)
        • 👽️ Experimental support for adding open application actions to linux desktop shortcuts (6897c0e)
        • 👽️ Experimentally add linux arm64 support (5b033fd)
        • 💄 Optimization of display effect of device list page (305187d)
        • 💫 Support appending gnirehtet custom parameters in configuration (206a030)
        • 🚀 Provide feedback on the application shortcut addition (d7eca8d)

        1.28.7 (2025-02-17)

        Bug Fixes

        • 🐛 Fixed the issue of duplicate filter conditions in the device list (6c4242c)
        • 🐛 Solved the problem that the main window could not be restored after being moved off the screen in some cases (d054f8d)

        Performance Improvements

        • ⬆️ Improved performance of automated mirroring (33a03c3)
        • 💄 Optimize the display effect of horizontal screen screenshots (90c7163)
        • 🚀 The main panel supports single instance startup (c49d22c)

        1.28.6 (2025-02-05)

        Bug Fixes

        • 🐛 Resolving build errors (d21fa29)

        1.28.5 (2025-02-05)

        Performance Improvements

        • ✅ File management supports selecting directories for uploading (fd2e639)
        • ⬆️ Improve QR code connection performance (b413889)

        1.28.4 (2025-01-13)

        Bug Fixes

        • 🐛 Fix the display ID value type error (2b7ee79)
        • 🐛 Solve the problem of IPV6 address connection failure (1a95325)

        Performance Improvements

        • ♻️ Improve wireless connection stability (85be898)
        • ⚡️ Optimize the method of obtaining the available displays of the device (9e31c84)
        • 🐛 Improve wireless connection verification method (69fecc3)
        • 👷 Added edge hiding function switch (d25714a)

        1.28.3 (2024-12-28)

        Performance Improvements

        • ♻️ Optimize device details performance (38d1433)

        1.28.2 (2024-12-27)

        Performance Improvements

        • 👷 Optimize the edge hiding function (d5caaa9)
        • 📸 Support viewing real-time images and power information of the device (d262adf)

        1.28.1 (2024-12-20)

        Performance Improvements

        • ♻️ Optimize QR code connection experience (86f5e69)

        1.28.0 (2024-12-20)

        Features

        • ✨ Support pairing and connecting to devices via QR code (14306b2)
        • 🚀 Supports connecting historical devices via device list (e0687e8)

        Bug Fixes

        • 🐛 Solve the problem of Windows disabling video forwarding and crashing (10b902a)

        Performance Improvements

        • ♻️ Update mirror icon (c214e5a)
        • ✅ A new method is adopted to solve the problem of IP type configuration storage (5488a1e)
        • 🚀 Optimize device connection experience (0690f2d)
        • 🚀 Supports display of offline devices (dcf817f)

        1.27.7 (2024-12-10)

        Performance Improvements

        • 🚀 Update to scrcpy v3.1 (7c74c71)

        1.27.6 (2024-12-05)

        Bug Fixes

        • ♻️ Fixed repeated dependency issues (9777622)

        Performance Improvements

        • ♻️ Optimized contextBridge related improvements for stability (0e098c3)
        • ♻️ Reduce build package size by removing redundant dependencies (7b61b25)
        • 🚀 Update to scrcpy v3.0.2 (7510548)

        1.27.5 (2024-11-29)

        Performance Improvements

        • ➖ Remove redundant console (9a67142)

        1.27.4 (2024-11-29)

        Bug Fixes

        • 🐛 Fix automatic release (c2254aa)
        • 🐛 Fixed an issue where macos built-in updates failed (432eceb)

        1.27.3 (2024-11-28)

        Bug Fixes

        • 🐛 Fix for built-in scrcpy not supporting x64 macos (0d60655)

        Performance Improvements

        • ♻️ Improved device connection stability (1d603ab)
        • ♻️ Optimized the adb daemon startup failure detection mechanism (ca6be85)
        • 🧑‍💻 Improve device-based terminal experience (88a0356)

        1.27.2 (2024-11-26)

        Bug Fixes

        • 🐛 Start app to adapt to dark mode (ae13fde)

        1.27.1 (2024-11-25)

        Bug Fixes

        • 🐛 Make StartApp compatible with scrcpy v3.0 (1082e0d)

        Performance Improvements

        • 🚀 Adjust options to support scrcpy v3.0 (0602676)
        • 🚀 Update to scrcpy v3.0 (bf06382)

        1.27.0 (2024-11-21)

        Features

        • ✨ Support edge hiding function (14a81de)

        Performance Improvements

        • ⬆️ Optimize edge hiding performance (74a91a4)

        1.26.4 (2024-11-14)

        Bug Fixes

        • 🐛 Temporarily disable scrcpy integration in macOS (9bf4d5c)

        1.26.3 (2024-11-08)

        Bug Fixes

        • 🐛 Fix device support audio and video encoding cannot be parsed (9b7f6a9)
        • 🐛 Restore the --display-buffer parameter to solve the mirroring problem (0f3d869)

        Performance Improvements

        • ♻️ Support interruption during waiting for wireless connection (344b385)
        • ♻️ Supports retrieving a list of applications (b1a6ba7)
        • ⚡️ Optimize startup application performance (8e94494)

        1.26.2 (2024-11-06)

        Bug Fixes

        • 🐛 Fix linux build errors (9b43dc0)

        1.26.1 (2024-11-06)

        Performance Improvements

        • ♻️ No longer building universal packages for macOS (db5deb4)

        1.26.0 (2024-11-06)

        Features

        • ✨ Integrate scrcpy binaries for macos (85bf096)
        • ✨ Supports starting applications for mirroring (d19e781)

        Bug Fixes

        • 🐛 Rename --display-buffer to --video-buffer (b2bb0ae)
        • 🐛 Repair floating action bar start application error (487e7e2)
        • 🩹 Restore the windows build configuration (9491069)

        Performance Improvements

        • ♻️ Adjust the position of the start application button (9833932)
        • ♻️ When the application fails to start, display the error message (dbc34d6)
        • ⚡️ Improve the start APP experience (29e5e1b)

        1.25.5 (2024-11-05)

        Performance Improvements

        • ⚡️ Optimize the stability of options that need to dynamically obtain parameters in preference settings (39bbc98)

        1.25.4 (2024-10-31)

        Performance Improvements

        • ♻️ Enhance recording stability (3dd7525)
        • ♻️ Optimize camera recording stability (952b2a7)
        • 💄 Normalize control window titles and generated file names (ccc7f0e)

        1.25.3 (2024-10-29)

        Bug Fixes

        • 🔧 Camera recording and screen off configuration conflict (4508758)

        Performance Improvements

        • 🔧 Temporarily disable scheduled tasks that are too far away (be5e639)

        1.25.2 (2024-10-29)

        Bug Fixes

        • 🐛 Resolve default recording error (358064e)

        1.25.1 (2024-10-28)

        Miscellaneous Chores

        1.25.0 (2024-10-28)

        Features

        • ✨ Support to close the device screen when controlling (a84c775)
        • 📸 Enhanced recording (7f10161)

        Performance Improvements

        • ♻️ Optimize camera recording (4be2cf4)
        • ♻️ Script and directory structure optimization (68378ef)
        • ⚗️ Experimental support for turning off screen controls (9555f58)
        • ⚡️ Optimize scrcpy parameter conversion performance (18dcd24)
        • 💄 Improved Russian display (ca79e1b)
        • 📸 Recording camera support (10d0370)

        1.24.3 (2024-10-21)

        Performance Improvements

        • 💄 Optimize Russian display effect (5ca39ae)

        1.24.2 (2024-09-16)

        Bug Fixes

        • 🐛 Fix the mirror group bug (cd7d9cd)

        1.24.1 (2024-09-16)

        Performance Improvements

        • ✨ Update to scrcpy@2.7 to support the gamepad (0053e87)
        • ⬆️ Optimize the performance of the floating control bar (a1c60ec)
        • 🚀 Extended floating control bar function (790e703)

        1.24.0 (2024-09-12)

        Features

        • ✨ Support floating control bar (8807e50)

        Performance Improvements

        • ✅ Support switching devices on the floating control bar (50440f5)
        • 💄 Optimize preference setting button layout (47ae53d)

        1.23.6 (2024-09-09)

        Bug Fixes

        • 🐛 Fixed the problem of minimizing the visibility of tray icons (b0f42aa)
        • 🐛 Repair ADB timeout problems (b5bffc5)

        1.23.5 (2024-09-09)

        Performance Improvements

        • ♻️ Improve ADB connection stability (7655ba6)

        1.23.4 (2024-09-08)

        Bug Fixes

        • 🐛 Repair part of internationalization Lost dynamics (d18444f)

        1.23.3 (2024-09-08)

        Performance Improvements

        • ♻️ Optimize the performance of equipment interaction column and file manager (41ffcf5)

        1.23.2 (2024-09-07)

        Performance Improvements

        • 🚀 Support file manager upload to the current directory (737c2a3)

        1.23.1 (2024-09-07)

        Performance Improvements

        • ⬆️ Update dependencies (8b03862)

        1.23.0 (2024-09-07)

        Features

        • ✨ Support graphic file manager (8155723)
        • 🚀 Initially add a new file manager (94ee007)

        Performance Improvements

        1.22.4 (2024-08-03)

        Bug Fixes

        • 🐛 plan task Remove operation bug (5205935)

        Performance Improvements

        1.22.3 (2024-08-03)

        Performance Improvements

        • ♻️ Update scrcpy to 2.6.1 (1eef9d2)

        1.22.2 (2024-07-25)

        Performance Improvements

        • 💄 Optimize the display effect of the dark mode (38f854b)
        • 💄 Optimize the display effect of the quick operation bar (7b3c4db)
        • 💄 Optimize the display effect of the tabs bar (5b2d41c)

        1.22.1 (2024-07-25)

        Bug Fixes

        • 🐛 Fixed asset publishing issues (222f626)

        1.22.0 (2024-07-25)

        Features

        • 🚀 Add a scheduled task list (d72202b)
        • 🚀 Add basic timing task function (04a7608)
        • 🚀 Add timing task entrance (8393c85)
        • 🚀 添加定时任务入口 (6ce66d4)

        Bug Fixes

        • 🐛 The internationalization problem of repairing path selector (8e6af20)
        • 💄 Optimize wireless connection user interface (50ae742)

        Performance Improvements

        • 💄 Optimization of the operation bar at the top of the equipment list (81bd3d9)
        • 💄 Optimized operation button layout (16f9535)

        1.21.4 (2024-07-14)

        Performance Improvements

        • ♻️ Optimize custom startup performance (abd468b)
        • ♻️ Perfect allSettledWrapper method (5b7d0af)

        1.21.3 (2024-07-13)

        Bug Fixes

        • Fix the width problem of custom startup pop-up windows (9a7e56b)

        1.21.2 (2024-07-13)

        Bug Fixes

        • 🐛 Fix terminal style abnormalities in dark theme (3d4dc7c)

        Performance Improvements

        • ♻️ Improve code robustness (2f389af)
        • 🚀 Optimize batch operation interaction (343eab2)

        1.21.1 (2024-07-13)

        Bug Fixes

        • 🐛 Fix dependency build errors (5b02621)

        1.21.0 (2024-07-13)

        Features

        • 🎉 Support batch execution script function (8097022)
        • 🚀 Support execution script function (2013413)

        Bug Fixes

        • 🐛 Repair the problem of equipment width in the English state (25c42d9)
        • 📝 Update Translation (33b0181)

        Performance Improvements

        • ✅ Support batch screenshot and other performance optimization (db9e3e7)
        • ✨ Support for custom startup mirroring (677f30c)
        • 🐛 Fix the problem of frequently trigger preservation of preferences (8261916)

        1.20.1 (2024-07-04)

        Bug Fixes

        • 🐛 Fix batch text spelling errors (062c689)

        1.20.0 (2024-07-04)

        Features

        • ✨ Add batch installation application function (37ce245)

        Performance Improvements

        • 🚀 Add mouse binding options (7ee4ba4)

        1.19.4 (2024-07-02)

        Bug Fixes

        • 🐛 Fix terminal style problems (9fc1ded)
        • Update Chinese language translations (b8d77e3)

        Performance Improvements

        • 🚀 Update to scrcpy v2.5 (22cc5a3)

        1.19.3 (2024-06-13)

        Bug Fixes

        • 🐛 Abnormal operations cause the program that cannot be closed (b989140)

        1.19.2 (2024-06-03)

        Bug Fixes

        • 🐛 Automatically apply local languages (0cc8208)

        1.19.1 (2024-05-26)

        Bug Fixes

        • 🐛 In some cases, the light mode is abnormal (ea227e0)
        • 🐛 Search for shortcut key conflicts (c70e6ca)

        Performance Improvements

        1.19.0 (2024-05-15)

        Features

        • 🚀 Add page search function (6dd8244)
        • 🚀 Update dependencies to support ESM (9f1696f)

        Bug Fixes

        • 🐛 Resolving build failures (8460945)
        • 🐛 Tips unavailable (603e4e9)

        Performance Improvements

        • ♻️ FindInPage API (fcf8269)
        • ♻️ Optimize dark mode (2f2e1cf)
        • ♻️ Search interaction (a195b7e)
        • ♻️ Search variable name (7c55e50)
        • 🐛 Global search error (091d503)
        • 🚀 优化页面查找工具性能 (8587977)

        1.18.4 (2024-05-04)

        Bug Fixes

        • 🐛 Wireless adb does not support Spaces (1f27597)

        1.18.3 (2024-04-12)

        Performance Improvements

        • ♻️ i18n configuration (1ca0469)

        1.18.2 (2024-04-11)

        Bug Fixes

        • 🐛 zh_TW Language support (885af3a)

        1.18.1 (2024-04-11)

        Bug Fixes

        • 🔧 Repair merge zh-TW failed (81ff63f)

        Performance Improvements

        1.18.0 (2024-04-11)

        Features

        • Add a simple zh_TW Traditional Chinese locale (cec6539)

        1.17.8 (2024-03-29)

        Bug Fixes

        • 🐛 Camera configuration conflict (07cc5f3)
        • 🐛 OTG configuration conflict (576d287)
        • 🐛 OTG mode: could not turn screen off (c5bed0e)

        1.17.7 (2024-03-27)

        Bug Fixes

        • ♻️ Remove the redundant imports (a06708f)

        Performance Improvements

        • ♻️ Optimize delete history logic (780e3b9)
        • ♻️ Support delete historical connection (c82560f)
        • 💄 Wireless style optimization (ba51fe3)

        1.17.6 (2024-03-21)

        Performance Improvements

        • ♻️ Supports automatic execution of mirrors on devices (11e0884)

        1.17.5 (2024-03-17)

        Performance Improvements

        1.17.4 (2024-03-14)

        Performance Improvements

        • ♻️ Options in the preference settings (dc711cb)

        1.17.3 (2024-03-13)

        Performance Improvements

        • ♻️ Remove console log (6e25eb7)

        1.17.2 (2024-03-10)

        Bug Fixes

        • 🐛 Abnormal built-in terminal adb command (368551a)

        Performance Improvements

        • ♻️ Update eslint config (bf2d2b4)

        1.17.1 (2024-03-05)

        Performance Improvements

        • ♻️ Interactive logic optimization (193f80a)
        • ♻️ Optimize design and code (d507c2d)
        • ♻️ Optimize equipment operation (389ac33)
        • ➖ Remove redundant packages (f9e4a0e)
        • 💄 Optimize dark mode styles (1cac054)

        1.17.0 (2024-03-04)

        Features

        • 🎉 Update to scrcpy v2.4 (02a4d39)

        1.16.8 (2023-12-27)

        Bug Fixes

        • 🐛 The maximum size description error (01fd926)

        1.16.7 (2023-12-19)

        Performance Improvements

        1.16.6 (2023-12-19)

        Miscellaneous Chores

        1.16.5 (2023-12-19)

        Performance Improvements

        • 📝 Control in stop charging (8707eb5)

        1.16.4 (2023-12-19)

        Bug Fixes

        • 🐛 Pairing code type issue (889fe8c)

        1.16.3 (2023-12-03)

        Performance Improvements

        • 🚀 Update scrcpy v2.3.1 (3566655)

        1.16.2 (2023-12-02)

        Bug Fixes

        1.16.1 (2023-11-26)

        Bug Fixes

        1.16.0 (2023-11-26)

        Performance Improvements

        Miscellaneous Chores

        1.15.0 (2023-11-18)

        Features

        • 添加投屏窗口大小控制 (97d7868)

        Performance Improvements

        • 🚀 Add window position option (866aa2c)

        1.14.3 (2023-11-17)

        Performance Improvements

        • ♻️ Add context menu (f0f25a7)
        • ♻️ Optimize extended menu bar interaction (de9352c)
        • 📝 Optimization preferences description (30eca50)

        1.14.2 (2023-11-16)

        Performance Improvements

        • ♻️ Optimize autoConnect historical devices (755a130)
        • 💡 Add autoConnect option (a57b847)

        1.14.1 (2023-11-14)

        Bug Fixes

        • 🐛 Abnormal terminal theme (20d37c1)

        1.14.0 (2023-11-14)

        Features

        • 🎉 Add Terminal Debugging (fdf40c7)

        Performance Improvements

        • ♻️ Optimize terminal performance (d3afc4b)
        • 💄 Update terminal style (5b6b8d1)
        • 🚨 Optimization error prompt (b759502)

        1.13.5 (2023-11-11)

        Performance Improvements

        • ♻️ Mirror group shutdown logic (296e21d)
        • ♻️ Optimize mirror group (5793c24)

        1.13.4 (2023-11-10)

        Performance Improvements

        • ♻️ Optimization updater (61ccd4a)
        • ♻️ Optimize mirror group (81c007f)

        1.13.3 (2023-11-10)

        Bug Fixes

        • 🐛 Recording prompt and file format errors (bfdad9e)

        Performance Improvements

        • ♻️ Optimize Batch connection performance (36de67b)
        • ♻️ Optimize file push prompts (4a3575f)
        • ♻️ Optimize historical device connections (83f8c04)
        • ✨ Support bulk connecting to historical devices (b7eb1dd)

        1.13.2 (2023-11-09)

        Bug Fixes

        Performance Improvements

        • ♻️ Configure Incompatible Handling Mechanism (c0e6a01)
        • ♻️ Optimize gnirehtet (de3555b)
        • 💄 Optimize volume control and gnirehtet (b40bdcf)
        • 🚀 Add File push function (70f8b46)
        • 🚀 Add screen rotation shortcut menu (dd601df)

        1.13.1 (2023-11-08)

        Performance Improvements

        • ♻️ Adjust volume control position (1b3f49e)
        • ♻️ Optimize configuration file logic (5f8cc5a)
        • 🚀 Add volume control (1505518)

        1.13.0 (2023-11-07)

        Features

        • 🎉 Add mirror group function (0c9d36f)

        Bug Fixes

        Performance Improvements

        • ♻️ Optimize mirror group (cf9c82d)
        • ♻️ optimize mirror group tips (46defbf)
        • ♻️ Optimize preferences (7a6417e)
        • ♻️ Optimize window control (0530ed3)
        • 💄 Update styles (37da97b)
        • 🚀 Add camera options (5a04b4c)

        1.12.4 (2023-11-03)

        Bug Fixes

        • 🐛 MacOS reduced to the tray to evoke failure (d7bf83b)

        1.12.3 (2023-11-03)

        Bug Fixes

        • 🐛 MacOS reduced to the tray to evoke failure (6153bc4)

        1.12.2 (2023-11-03)

        Bug Fixes

        1.12.1 (2023-11-03)

        Bug Fixes

        • 🐛 Add gnirehtet fix option (f9c6c32)
        • 🐛 Display options cannot be changed (3046746)
        • 🐛 Preference style (0f72090)
        • 🐛 Reset preferences language not restored (d691780)
        • 🐛 Unable to update path selector (3279c34)
        • 🐛 Video codec preset error (1af9abd)

        Performance Improvements

        • ♻️ optimize Codec (6154ffc)
        • ♻️ Optimize recording (f4dfb2c)
        • 🎨 Update preferences style (e9befea)

        1.12.0 (2023-11-02)

        Features

        • 🎉 Update Scrcpy to v2.2 (5c401a8)

        Bug Fixes

        Performance Improvements

        1.11.9 (2023-10-31)

        Performance Improvements

        • ♻️ Optimization gnirehtet and scrcpy (9cf800c)
        • ♻️ Optimize Gnirehtet interaction (a90e570)

        1.11.8 (2023-10-31)

        Bug Fixes

        • 🎨 修复 macOS 设置主题跟随系统后 某些情况下循环触发导致死循环的问题 (1d7b188)

        1.11.7 (2023-10-31)

        Bug Fixes

        • 🐛 macOS x64ArchFiles Errors (151cb29)

        1.11.6 (2023-10-31)

        Bug Fixes

        • 🐛 macOS x64ArchFiles Errors (7dbca01)

        1.11.5 (2023-10-31)

        Bug Fixes

        • 🐛 macOS x64ArchFiles Errors (ad3f77f)

        1.11.4 (2023-10-31)

        Bug Fixes

        • 🐛 macOS x64ArchFiles Errors (4b4e116)

        1.11.3 (2023-10-31)

        Bug Fixes

        • 🐛 Unix permission issues (1279994)
        • 🐛 Unix permission issues (dc9a3c4)
        • 🐛 x64ArchFiles Error (82a99d9)

        1.11.2 (2023-10-30)

        Bug Fixes

        • 🐛 修复 macOS 打包失败的问题 (1b2236c)

        1.11.1 (2023-10-30)

        Bug Fixes

        • 🐛 修复 macOS 打包失败的问题 (37e2837)

        1.11.0 (2023-10-30)

        Features

        • 🎉 Add gnirehtet reverse tethering function (2c97189)

        Bug Fixes

        • 🐛 gnirehtet custom dependent paths error (cfd0e1d)

        Performance Improvements

        • ♻️ Optimize Gnirehtet interaction (e1237cd)
        • ♻️ 拆分依赖文件禁用冗余的警告信息 (93ad836)
        • ♻️ 目录结构及描述调整 (f9a32d6)
        • ♻️ 补充依赖及目录结构调整 (b18256b)

        1.10.2 (2023-10-28)

        Bug Fixes

        • 🐛 修复设置主题跟随系统后没有生效的问题 (95a83f4)

        1.10.1 (2023-10-28)

        Bug Fixes

        • 🐛 修复 linux 无法启动镜像或录制服务以及修改自定义依赖目录的问题 (d815643)

        1.10.0 (2023-10-27)

        Features

        • 🚀 新增支持 深色模式、国际化语言、运行日志等功能 (4b13f58)

        Bug Fixes

        • 🐛 修复 linux 打包后图标丢失的问题 (217d82d)
        • 🐛 修复安装路径包含空格会导致无法启动服务的问题 (29ae786)
        • 🐛 修复录制结束点击取消异常弹窗以及点击重启服务没有反应的问题 (054c55b)
        • 🔧 修复自定义路径功能没有生效的问题 (894b581)

        Performance Improvements

        1.9.1 (2023-10-24)

        Performance Improvements

        • 💄 窗口控制及交互逻辑优化 (52514e2)

        1.9.0 (2023-10-24)

        Features

        • 🚀 添加 i18n 初步支持 (18d490f)

        Bug Fixes

        • 🐛 修复 macOS 最小化到托盘后状态栏图标不显示的问题 (a789826)

        1.8.17 (2023-10-23)

        Bug Fixes

        • 🐛 尝试修复构建失败 (daeb9e5)

        1.8.16 (2023-10-23)

        Performance Improvements

        • ✨ 采用新的 Logo 设计 (3bf79d3)

        1.8.15 (2023-10-22)

        Bug Fixes

        • 🐛 修复 Linux 平台启动白屏无法正常使用的问题 (54e713b)

        1.8.14 (2023-10-21)

        Bug Fixes

        • 🐛 修复 linux 打包配置错误的问题 (a9668d9)

        1.8.13 (2023-10-21)

        Performance Improvements

        • 🚀 为 windows 添加 ARM64 软件包编译 (368e8ee)
        • 🚀 支持所有平台在点击关闭按钮时选择是否保存到托盘中的功能 (8360198)

        1.8.12 (2023-10-21)

        Bug Fixes

        • 🐛 修复 macOS 或 linux 下自定义依赖选项描述错误的问题 (0d4b1ce)

        1.8.11 (2023-10-21)

        Performance Improvements

        • 🔨 优化窗口默认大小 (393e899)

        1.8.10 (2023-10-20)

        Bug Fixes

        • 🐛 修复 macOS 窗口问题 (f768566)

        1.8.9 (2023-10-20)

        Bug Fixes

        • 🐛 修复 macOS 窗口过小导致出现横向滚动条的问题 (8ee34ca)

        1.8.8 (2023-10-20)

        Bug Fixes

        • 🚀 修复 macOS 简单关闭应用重新打开时报错的问题 (4b259c3)

        1.8.7 (2023-10-20)

        Bug Fixes

        • 🐛 修复打包多个平台时可能生成重复文件导致发布软件包失败的问题 (e89a7a5)

        1.8.6 (2023-10-20)

        Bug Fixes

        • 🔧 修复 macOS 无法正确获取系统依赖路径的问题 (2352593)

        1.8.5 (2023-10-20)

        Bug Fixes

        • 🚑️ 修复 Linux maintainer 问题 (4e1542a)

        1.8.4 (2023-10-20)

        Bug Fixes

        • 🚑️ 修复 Linux 打包失败的问题 (96f85d8)

        1.8.3 (2023-10-20)

        Bug Fixes

        • 🚀 修复 MacOS 软件包安装后无线显示 Logo 的问题 (77dd81b)

        1.8.2 (2023-10-20)

        Bug Fixes

        • 🔧 修复 Linux 及 MacOS 获取默认依赖路径异常的问题 (87b533f)
        • 🔧 修复 MacOS ARM64 版本打包失败的问题 (e9a8fc2)

        1.8.1 (2023-10-20)

        Performance Improvements

        • 🚀 支持创建更多架构的 MacOS 软件包格式 (4780e7c)

        1.8.0 (2023-10-20)

        Features

        • 🚀 初步添加对 Linux 以及 MacOS 的支持 (569ed2e)

        Bug Fixes

        • 📝 偏好设置描述信息修改 (23d68d4)
        • 🔧 设备列表标签显示细节调整 (4f2f00e)

        Performance Improvements

        • 📝 设备备注文本框描述信息调整 (379b325)

        1.7.1 (2023-10-20)

        Bug Fixes

        • 🚀 修复对设备进行独立配置时的一些问题 (6ccd6d0)

        Performance Improvements

        • 🎉 初步支持设置偏好设置的作用域范围 (5dd328c)

        1.7.0 (2023-10-19)

        Features

        • 🚀 新增支持导入及导出配置 (326a133)
        • 🚀 新增支持添加设备备注 (43f15be)

        Performance Improvements

        • ➕ 设备交互栏添加重启设备及打开通知栏功能 (1341fb8)

        1.6.10 (2023-10-18)

        Performance Improvements

        • 🚀 采用新的方法实现所有进程共享 isPackaged (8a5f7d9)

        1.6.9 (2023-10-17)

        Bug Fixes

        • 🔧 优化 isPackaged 判断条件解决某些情况下资源路径解析异常的问题 (fbd1885)

        1.6.8 (2023-10-17)

        Performance Improvements

        • 🚀 支持通过操作栏安装应用并提供相应安装反馈 (3bd2075)

        1.6.7 (2023-10-17)

        Performance Improvements

        • 📝 去除冗余的依赖项 (a6744dc)

        1.6.6 (2023-10-17)

        Bug Fixes

        • 🐛 build fix (09c8dee)
        • 🐛 修复 electron 资源路径问题 (955756e)

        1.6.5 (2023-10-16)

        Bug Fixes

        • 🐛 修复 App NextTick 错误 (79d85eb)

        1.6.4 (2023-10-16)

        Bug Fixes

        • 🐛 修复 electron-builder 配置异常导致打包的文件无法发布的问题 (9a4efa5)
        • 🚀 修复设备列表按钮状态变更影响布局变化的问题 (83a8043)

        1.6.3 (2023-10-16)

        Bug Fixes

        • 🐛 修复打包后图标丢失的问题 (58a66f1)

        1.6.2 (2023-10-13)

        Bug Fixes

        • 🐛 修复USB未授权设备导致无线连接地址变为假值的问题 (9c25325)

        1.6.1 (2023-10-13)

        Performance Improvements

        • 🔨 自定义通用的文件存储路径相关逻辑完善 (8455e86)

        1.6.0 (2023-10-13)

        Features

        • 🚀 增加了对设备交互控制栏的支持 (fd20736)

        1.5.3 (2023-10-13)

        Bug Fixes

        • 🔧 修复点击无线模式没有反应的问题 (9d55ef9)

        1.5.2 (2023-10-13)

        Bug Fixes

        • 📝 修复高级配置标题语义不明的问题 (218de1c)

        Performance Improvements

        • 🚀 添加更多的高级配置并更新文档 (922abd2)

        1.5.1 (2023-10-12)

        Bug Fixes

        • 🐛 去除页面组件冗余参数 (8e5df15)

        1.5.0 (2023-10-12)

        Features

        • 🚀 添加音视频录制功能以及更多的高级选项 (b6986d1)

        1.4.1 (2023-10-12)

        Bug Fixes

        • 🐛 修复检查更新失败没有提示的问题 (6f733ea)

        1.4.0 (2023-10-11)

        Features

        • 🚀 添加在线检查更新功能 (8de04e0)

        Bug Fixes

        • 🔨 修复无线配对时表单验证错误 (7cd9ea3)
        • 🔨 修复直接进行无线连接时没有处理配对设备的问题 (4263d07)

        1.3.3 (2023-09-26)

        Bug Fixes

        • 🐛 修复触摸点配置描述错误的问题 (4e2be23)

        1.3.2 (2023-09-19)

        Bug Fixes

        • 🔧 修复旋转屏幕配置异常的问题 (af7a319)

        1.3.1 (2023-09-19)

        Bug Fixes

        • 🔧 修复图标不透明的问题 (24c011f)

        1.3.0 (2023-09-19)

        Features

        • ✨ 用户界面进行优化,制作了合适的 Logo (1b96ffc)

        1.2.0 (2023-09-19)

        Features

        • 🎉 优化设备界面视图并添加虚拟控制栏配置 (3be0682)

        1.1.0 (2023-09-18)

        Features

        • 🚀 增加了常用的 Scrcpy 高级配置 (ac52df2)

        1.0.2 (2023-09-18)

        Performance Improvements

        • 🚀 合并无线连接及有线连接到设备列表 (e84f24e)

        1.0.1 (2023-09-16)

        Bug Fixes

        • 🔧 去除未测试环境的打包以修复构建失败的问题 (d6ec7fd)

        1.0.0 (2023-09-16)

        Features

        • 📝 添加基本的有线连接支持 (647a0c5)
        • 🚀 添加 Electron 基本支持 (a46a5e1)
        • 🚀 添加初步的构建及发布支持 (c85f8fb)
        • 🚀 添加基本的无线连接功能 (6dd2db9)

        Bug Fixes

        • 🔧 修复 ADB 环境变量配置错误导致无法连接的问题 (9ef7203)
        ',812)])])}const d=r(i,[["render",c]]);export{m as __pageData,d as default}; +import{e as r,o as a,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"更新日志","description":"","frontmatter":{"title":"更新日志"},"headers":[],"relativePath":"zhHans/changelog.md","filePath":"zhHans/changelog.md","lastUpdated":1777999882000}'),i={name:"zhHans/changelog.md"};function c(l,e,n,h,f,b){return a(),t("div",null,[...e[0]||(e[0]=[o('

        Changelog

        2.8.1 (2026-04-07)

        Bug Fixes

        • 🐛 Fixed the problem of dark theme background not taking effect (ad19695)

        Performance Improvements

        • 🎉 Increased free limit for batch automation scripts and device group controls to 5 devices. (11271f2)

        2.8.0 (2026-04-06)

        Features

        • ✨ Window arrangement supports the automatic arrangement function (696d94b)

        Bug Fixes

        • 🐛 Fix i18n errors (e4ad3ec)
        • 🐛 Fix the default value issue of the subscription plan (a19dd9e)
        • 🐛 Fixed the issue where multiple files cannot be pasted when copied to the clipboard under Windows (dcc7a94)

        Performance Improvements

        • ♻️ Optimize subscription plan (c12ef9d)
        • ♻️ Optimize the pricing strategy for advanced features to prevent misjudgments by users (4d722b7)
        • 💄 Optimize the display details of the embedded mirror window (6cf4c69)
        • 🚀 Automation script adds random range option (4d73e1a)
        • 🚀 Extended embedded mirroring operable shortcut buttons (19c0de2)
        • 🚀 Optimize subscription configuration (d053bfa)
        • 🚀 Optimize the automation script editor to avoid screen border issues (ffd56a6)
        • 🚀 Refactored file copy function supports batch copying to the clipboard (ccca99a)

        Code Refactoring

        • ♻️ Optimize subscription plan default value acquisition (7b9c47f)
        • 🚀 Dynamically configure subscriptions by detecting the environment (d02e1b3)
        • 🚀 Fix typescript configuration (cbc8631)

        2.7.3 (2026-04-02)

        Bug Fixes

        • 🐛 Fixed an issue where embedded mirroring could not be input due to external activation elements. (058b982)

        Performance Improvements

        • 🚀 Optimize the embedded image to open the application list display (7f6b18a)

        Code Refactoring

        • 🔊 Optimize the wscrcpy audio cleaning logic (a29cd85)

        2.7.2 (2026-04-01)

        Bug Fixes

        • 🐛 Fix dependency not updated error (2d8ebfd)

        2.7.1 (2026-04-01)

        Bug Fixes

        • 🐛 Fixed the problem that the global search shortcut key does not take effect (e7596f9)

        2.7.0 (2026-04-01)

        Features

        • 🚀 Add wscrcpy cli parameter adapter (ea64b5e)
        • 🚀 Complete more parameters of wscrcpy (c48020b)
        • 🚀 Extend wscrcpy capabilities (0717688)
        • 🚀 Initial implementation of device group control function (4ea4e7d)
        • 🚀 Optimize group control experience (853e53d)
        • 🚀 Optimize the details of the mask layer module (c9da58e)
        • 🚀 Optimize the interaction details of the mask board module (b67582a)
        • 🚀 Redesign the overlay module guide page (c522fcb)
        • 🚀 Refactor the embedded image package to the wscrcpy package (5f8a309)
        • 🚀 Use tango-adb to directly render the device screen in the mask layer module (81d93dd)
        • 🚀 wscrcpy adds support for mouse hover monitoring (eb78931)
        • 🚀 wscrcpy only enables audio forwarding by default in the macos environment (5d510dc)

        Bug Fixes

        • 🐛 Fix the issue of resetting the window position of the mirror module (d4c3a74)
        • 🐛 Fix the problem of data echo in automation steps (435c3de)
        • 🐛 Fix the problem of Wscrcpy audio forwarding exception (967a6c2)
        • 🐛 Fix the problem of wscrcpy group control failure (ea74182)
        • 🐛 Fix wscrcpy clipboard synchronization issue (42fee69)
        • 🐛 Fix wscrcpy reconnection problem (a6de9b9)
        • 🐛 Fixed sub-package build conflict and misalignment issue (99b22ba)
        • 🐛 Fixed syntax error in the action bar at the bottom of the overlay (ef0a301)
        • 🐛 Fixed the problem of abnormal calculation of size ratio when switching the main device on the group control page (5ad014f)
        • 🐛 Fixed the problem of abnormal disconnection of wscrcpy video stream when exiting the program (174a01c)
        • 🐛 Fixed the problem of interactive forwarding conflict when group control is enabled for auxiliary devices (60ae2a4)
        • 🐛 Fixed the problem of mask layer adaptation button forwarding (4be239e)
        • 🚀 Fix mask layer test issue (33581df)
        • 🚀 Fixed overlay module screen rotation issue (ad0af45)
        • 🚀 Fixed wscrcpy audio and clipboard synchronization configuration conflict issue (5bb65e0)

        Performance Improvements

        • 💄 Optimize the interaction of the embedded image module (7a21fdb)
        • 🚀 Add internationalization to automation script keylist (e7b78c1)
        • 🚀 Device group control expands more operations (08e46b6)
        • 🚀 Enhance the interaction experience of built-in images (e913fee)
        • 🚀 Expand batch opening function for group control function (a38dbde)
        • 🚀 Explicitly declare wscrcpy external dependencies (52924c8)
        • 🚀 Improve group control function subscription capabilities (479b996)
        • 🚀 Improve the stability of the overlay adapter (be0ff8c)
        • 🚀 More embedded startup entries have been added to the device list (24e4fd1)
        • 🚀 Optimize check update pop-up window style (54eaa51)
        • 🚀 Optimize embedded image module error prompts (e26186b)
        • 🚀 Optimize overlay click/swipe event interaction (d7c0500)
        • 🚀 Optimize overlay module details (8ce5937)
        • 🚀 Optimize overlay module details (2799ab0)
        • 🚀 Optimize preference interaction Disable device-dependent options in global mode (ea47604)
        • 🚀 Optimize the directory structure of the group control module (f9a9d67)
        • 🚀 Optimize the empty list style of the device list (95e8e4a)
        • 🚀 Optimize the interaction details of the overlay module (e297850)
        • 🚀 Optimize the interactive experience of group control function (05c8643)
        • 🚀 Optimize the interactive experience of the embedded mirror control bar (ac6159f)
        • 🚀 Optimize the keyboard input experience of the group control module (32b7fa2)
        • 🚀 Optimize the overlay module to organize interaction details (f358348)
        • 🚀 Optimize the video stream freezing problem when wscrcpy starts the same device (7baa53c)
        • 🚀 Optimize universal scroll bar interaction (dd6f3fe)
        • 🚀 Optimize window arrangement function details (91e1a3a)
        • 🚀 Overlay module input function reconstruction (ac19fab)
        • 🚀 The overlay module supports forwarding more key types (05c6faf)

        Code Refactoring

        • ♻️ Reconstruct the embedded mirror module directory structure (119a471)
        • 📝 Remove redundant wscrcpy judgments (3d9add8)
        • 🚀 Adjust the group control module naming (3c14c99)
        • 🚀 Expand the embedded image switching function (a49f8b5)
        • 🚀 Optimize and extend wscrcpy type (eec0913)
        • 🚀 Optimize interactive performance of embedded mirroring (ba8bfea)
        • 🚀 Optimize overlay module configuration (08009bf)
        • 🚀 Optimize the details of the overlay layer (59dc702)
        • 🚀 Optimize the directory structure of the group control module (7116264)
        • 🚀 Optimize wscrcpy details (247dc5e)
        • 🚀 Reconstruct the directory structure of the overlay module (668ef67)
        • 🚀 Reconstruct the image window ratio to improve reusability (555e346)
        • 🚀 Reconstruct the mask layer keyboard module (cad077d)
        • 🚀 Reconstruct the overlay module architecture (196cca0)
        • 🚀 Reconstruct the overlay module parameter injection method to solve the problem of responsive loss (3163c60)
        • 🚀 Reconstructed mirror window ratio algorithm is compatible with all platforms (b8377f2)
        • 🚀 Refactor and extend wscrcpy library functionality (4ca2c49)
        • 🚀 Refactor wscrcpy (b537a96)
        • 🚀 Remove redundant code from built-in images (f6bcbf5)
        • 🚀 Remove redundant code from the mask layer module (bdb4f49)

        2.6.2 (2026-03-13)

        Bug Fixes

        • 🐛 Fix the problem of inaccurate vertical coordinate of window arrangement under Windows (1fa6bd5)
        • 🐛 Fixed the issue of abnormal scaling of the window arrangement function under Windows (87f3596)
        • 🐛 Fixed the issue of redundant scroll bars appearing in the window arrangement tool screen area (ea0b451)

        Code Refactoring

        • 🚀 Refactored version build (bd3ec90)

        2.6.1 (2026-03-13)

        Performance Improvements

        • 🌱 Improve the interactive experience of subscription plans (f3620fd)

        2.6.0 (2026-03-12)

        Features

        • 🎉 Optimize device window arrangement: By obtaining the actual screen size of the device, canceling fixed ratio scaling, avoiding black border issues, and improving adaptation accuracy and display experience. (35d2028)
        • 🚀 Add a subscription plan for batch automation scripts (efa6e28)
        • 🚀 Add WeChat script template (569099c)
        • 🚀 Improve the international translation of automated script modules (1cb2cb6)
        • 🚀 Optimize automated script interaction (1e61d0f)
        • 🚀 Optimize magic variable interaction support for import and export (b7ba176)
        • 🚀 Preliminary addition of automation script editor support (bc6fdcc)
        • 🚀 Preliminary support for automated script batch execution and scheduled tasks (e14c302)
        • 🚀 Product and optimization of automation script editor (b36f6c6)

        Bug Fixes

        • 🐛 Fix custom startup layout and interaction issues (6311364)
        • 🐛 Fixed an issue where the automation script log directory was ignored (8777e63)
        • 🐛 Fixed script template translation issue (01870f7)
        • 🐛 Fixed split automation script editor form variable usage compatibility issue (53da1e9)
        • 🐛 Fixed the issue of abnormal task type penetration display in the scheduled task list (58ced2b)
        • 🐛 Fixed the issue of batch execution image blocking (9e3e17b)
        • 🐛 Fixed the issue where the aspect ratio was not fixed when the window arrangement was adjusted again after being saved. (8977138)
        • 🐛 Fixed the problem of unable to echo after window arrangement (6907762)
        • 🚀 Fixed batch execution automation script variable injection concurrency issue (3b8dae0)
        • 🚀 Fixed the problem that the automation script during switching execution could not confirm the interruption (2162203)
        • 🚀 Optimize subscription configuration (9711e73)
        • Fix automated script editor testing issue (87c6f93)

        Performance Improvements

        • 💄 Optimize smart picking interaction (a66fb7a)
        • 🚀 Automate script selectors to support termination logic and interaction optimization (d0a4bb3)
        • 🚀 Automation script editor adds execution selection function (d8f1300)
        • 🚀 Detail optimization of the automated script editor (338ad3e)
        • 🚀 Improve automation script stability (455c11f)
        • 🚀 Integrate the adb keyboard installation universal hook (aca0427)
        • 🚀 Optimize automation script editor details (fb2e4ad)
        • 🚀 Optimize automation script editor interaction details (e371171)
        • 🚀 Optimize automation script editor interaction details (24f0792)
        • 🚀 Optimize automation script function details (f084d08)
        • 🚀 Optimize execution of automation script interaction details (568fedf)
        • 🚀 Optimize international translation (3dd15a9)
        • 🚀 Optimize product details (a3abd2c)
        • 🚀 Optimize the installation of adb keyboard boot (fd4e752)
        • 🚀 Optimize the layout of the execution page for planned tasks (10da149)
        • 🚀 Remove obsolete shell script functionality (dfc505b)
        • 🚀 Template import supports importing magic variables (767c1dd)
        • 🚀 When obtaining the device list, synchronously obtain the screen resolution to optimize the screen arrangement experience (3715e0f)
        • Enhance the stability of the automated script editor (8030668)
        • Optimize script editor interaction (7367d15)

        Miscellaneous Chores

        Code Refactoring

        • ♻️ Restore version of the system (4a7c653)
        • ➖ Remove redundant printing information (6bd144d)
        • 🔨 Split Automation Script Editor form (98ac71b)
        • 🚀 Extract the common logic of launching the app function into an independent selector and reuse it (583b93f)
        • 🚀 Optimize automation script editor details (06f1ede)
        • 🚀 Optimize international translation (2d07a60)
        • 🚀 Optimize the interaction of script selectors for batch execution (c3e86fd)
        • 🚀 Optimize the size of deleted pop-up windows (a43fc53)
        • 🚀 Project code details optimization (eda1d5a)
        • 🚀 Support adjusting subscription price through environment variables (1867f03)
        • Integrated script editor supports more configuration functions (b0a30f8)
        • Optimize the overall directory and naming conventions (aed80ef)

        2.5.1 (2026-02-27)

        Bug Fixes

        • Fixed the issue of missing title bar information when launching through the app (e6bcd1e)

        2.5.0 (2026-02-27)

        Features

        • Add concurrency limit for batch wireless device connections (f048956)

        Bug Fixes

        • Fix shell space command parsing problem (e1ab66c)
        • Initialize shell command variables to prevent undefined values (e776c11)

        2.4.2 (2026-02-26)

        Bug Fixes

        • Fix the problem of abnormal disconnection of adb after changing some configurations (ffbfc40)

        2.4.1 (2026-02-26)

        Bug Fixes

        • Fix the language detection issue of portable software (9985067)

        Code Refactoring

        • Reorganize initialization order to load store before process configuration (9283a45)

        2.4.0 (2026-02-26)

        Features

        • ✨ Adds fastboot command support and provides experimental integration of scrcpy dependencies for Linux ARM64 platforms. (70f3243)
        • 🎉 Comprehensive migration to the built-in terminal based on xterm to provide a more controllable user experience (a2ee25f)
        • add drag and drop file upload support (d5b969c)
        • add gnirehtet path for mac (8da67c8)
        • add scroll to bottom button in chat (e4e8f80)
        • add terminal shell support with xterm integration (3c7828c)
        • add wireless connection mode switch toggle (161acf4)
        • add wireless pair success message and UI improvements (eccb26e)
        • improve ADB keyboard installation error handling (71f7635)
        • trigger language change callback immediately on init (e0e3d22)
        • update api endpoint and enable adb keyboard (4010b17)
        • Window orchestration component enhancement: Supports manual setting of position and size (e3aa89a)

        Bug Fixes

        • 🐛 Migrate fkill to tree-kill to solve windows binary file execution problems (6c89b73)
        • change clipboard tag type to primary (edb8840)
        • enhance xterm terminal styling and resize handling (9e031f5)
        • filter ANSI color codes for Windows PowerShell terminal (9c58f25)
        • Fix i18n race translation (7b37f29)
        • handle terminal exit and error states with reload (e8d93d5)
        • handle Windows terminal line ending for all cases (e06e763)
        • handle Windows terminal line ending for device type (1be1a5e)
        • improve Windows terminal compatibility and session management (7f37f7d)
        • improve Windows terminal cursor sync and resize responsiveness (c16a5f9)
        • improve Windows terminal encoding and scrollbar styling (85d5a96)
        • improve Windows terminal rendering and resize stability (7f05996)
        • improve Windows terminal shell detection and remove debug logs (4a5ebbc)
        • include node-pty in electron build (c98d82d)
        • prioritize pwsh.exe for Windows terminal (a99d830)
        • simplify Windows PowerShell terminal initialization (95c432c)
        • simplify Windows terminal shell initialization (2a3ed6f)
        • Solve the problem that the language of the terminal title cannot be dynamically updated (6e2c030)
        • specify SIGTERM signal for treeKill (d28eb1a)
        • update terminal tip color to custom RGB (156d39b)

        Performance Improvements

        • 🚀 Optimize ADB keyboard installation and detection (f312cc2)

        Code Refactoring

        • add cleanup handler for window IPC (bad6752)
        • add comment for tray destroy event (12038df)
        • add electron-modularity dependency (d0abc0b)
        • add main window API and type system (778a65f)
        • add plugin warnings and fix module loading order (a5bdbf3)
        • add rendererDir support and update window loading (fac664d)
        • adjust screenshot message and dialog styles (7bbab51)
        • adjust terminal line height to 1.4 (5068f7d)
        • adjust terminal window and device sync settings (6a4bd61)
        • adjust window width and improve error handling (5576d2e)
        • centralize PATH setup and environment configuration (6a6eb80)
        • clean up .gitignore file (3644b3e)
        • clean up main window module (9d1eee9)
        • defer app initialization until ready (9905f41)
        • defer plugin registration until app start (46ac0db)
        • Electron main process architecture reconstruction (f810ecb)
        • emit tray:destroy on window restore (fab9343)
        • expose $platform to window and global properties (9a7ee70)
        • extract terminal logic into useTerminal hook (9d725ca)
        • fix device payload and adjust control bar height (e5981ac)
        • fix failed translation key (fe98a56)
        • fix payload type and resolve target logic (5af60c8)
        • fix preview button visibility class (5a8c97b)
        • implement retained terminal session with cleanup (532a055)
        • implement terminal session management with providers (fa156e1)
        • improve file download progress tracking (51101c7)
        • improve gnirehtet menu handling and options (8d0e85b)
        • improve process killing and error handling (85a080e)
        • improve window bounds persistence logic (5361e24)
        • improve wireless pair input handling and UI (3aea5f6)
        • migrate core helpers to electron-modularity package (630deaa)
        • migrate edger to service (9c64cd5)
        • migrate events to service handlers (c99b1de)
        • migrate plugins to priority-based system (ae4404a)
        • migrate services and modules to explicit app.use (e63de2e)
        • migrate services to plugins (36e2a0d)
        • migrate to ipcx for IPC handling (1b1fd8d)
        • migrate to official plugins and update imports (eb9bead)
        • migrate to window.$preload namespace (41a2342)
        • move i18next-fs-backend to dependencies (f507222)
        • move window-manager to window module (8af97a5)
        • optimize device query and control window (4e2736d)
        • optimize minimized tray and window handling (3765b73)
        • Reconstruct the multi-entry directory structure (0690f4b)
        • Refactor i18n related services (6e882b6)
        • remove app parameter from window manager (f8719f1)
        • remove appium-adb documentation and update github link (f532aab)
        • remove border from preference header (9c97366)
        • remove debug console log for args (e4332c1)
        • remove debug console log for platform paths (e5590f3)
        • remove electron middleware module (3bd462c)
        • remove encoding conversion and use utf8 only (c32cb79)
        • remove fixed width from window configuration (ef3e86b)
        • remove spawnShell and convert arrow functions (66978f1)
        • remove theme plugin README (85a853b)
        • remove trailing whitespace in adb helpers (ec7314c)
        • remove ui-ux-pro-max prompt files (11d41a9)
        • remove unused app-region-drag style (094e0df)
        • remove unused terminalConfig from useTerminal (9db3f24)
        • remove Windows-specific encoding default (534934b)
        • rename app to ctx and update electron app imports (4c7ceba)
        • rename app to ctx in electron app (6707e2d)
        • rename currentStatusType to sessionStatus (8c84464)
        • rename electron-modularity to electron-setup (081a8a5)
        • rename entries to pages for routing structure (863ecd4)
        • rename windowOptions to browserWindow and add mainWindow flag (5093577)
        • reorder plugin registration in electron main (b8ee4ef)
        • reorganize process helpers directory structure (dcdb6d7)
        • replace args-tokenizer with shell-quote (1196263)
        • replace getSize with computed size property (c7edceb)
        • replace IS_PACKAGED with import.meta.env.MODE (521e2ba)
        • replace spawnShell with unified sheller helper (0159bb4)
        • replace tree-kill with fkill for process termination (c50cea6)
        • replace window controls with app header (a5fa218)
        • restructure copilot and explorer modules (74efca1)
        • restructure core helpers and window management (16fc934)
        • restructure electron helpers and modules (f0e4851)
        • restructure main window and singleton modules (7b979d6)
        • restructure terminal session management (19428dd)
        • restructure window management and IPC handlers (59a315f)
        • simplify file list extraction in drag upload (7453a99)
        • simplify gnirehtet trigger handling (f9185c3)
        • simplify main window resolution and remove legacy code (c764f91)
        • simplify restoreAndFocusWindow options (27185f5)
        • simplify window types and return native BrowserWindow (184ab7b)
        • simplify wireless connection UI and remove pair dialog (30e026c)
        • standardize module export structure (8111f6f)
        • throttle download and upload progress callbacks (8a16d22)
        • translate terminal comments to English and add command execution (71a2d7a)
        • unify control bar height configuration (7e6abed)
        • unify shell error handling and lazy loading (98dd91b)
        • update primaryColor value (346df64)
        • update scrollbar styling with Tailwind CSS (6eaf259)
        • update terminal scrollbar styling with custom width and transparency (b2c8f87)
        • update terminal title and locale strings (f0bdf0b)

        2.3.1 (2026-01-27)

        Bug Fixes

        • 🐛 Fixed the problem of being unable to click to enter the co-pilot entrance under Windows and Linux. (c563d11)

        2.3.0 (2026-01-22)

        Features

        • 🚀 Optimize portable package configuration and add linux flatpak package support (a7982db)
        • configure electron-log file path in debugger helper (2242668)

        Bug Fixes

        • 🐛 handle copilot execution failures and adjust config max steps (3601709)
        • win: fully redirect user data to portable folder and fix CI workflow (fe2fd89)

        Performance Improvements

        • ✨ Optimize windows and linux window layout (b63b59c)

        Code Refactoring

        • add platform simulation support and adjust window controls layout (9c3a5b1)
        • adjust header and chat layout padding (70fe60d)
        • adjust layout padding for windows and linux platforms (4e153cc)
        • adjust widget dimensions and clear dialog messages (ca6796f)
        • implement immersive title bar and optimize window layout (1e76d11)
        • improve chat retry logic and ADB keyboard detection (8e0e43c)
        • remove dialog width constraints and improve file creation (54e5553)
        • remove quiet config option (76f9d6c)
        • remove redundant success messages and unify dialog titles (b1eac32)
        • reorganize emitter module and update event emitter references (4c3cc2d)
        • reorganize preference form layout with tabs and scroll (7f0f864)
        • replace ExTooltipButton with native el-button title attribute (8056977)

        2.2.0 (2026-01-17)

        Features

        • 🎉 Improve the accuracy and coverage of Copilot opening applications by obtaining information about installed applications on the device (e2f27da)
        • add keyboard shortcuts for connect and disconnect (39293af)
        • auto-focus input when editing prompt (d58b993)

        Bug Fixes

        • 🐛 Fixed the issue where autoglm.js conversation request listener was not cleaned up causing memory overflow (bac2126)

        Code Refactoring

        • improve config management and prompt editing (de2f708)
        • improve prompt manager UI and editing experience (1697558)
        • optimize subscribe store initialization and token management (0f00903)

        2.1.7 (2026-01-14)

        Miscellaneous Chores

        2.1.6 (2026-01-14)

        Miscellaneous Chores

        2.1.5 (2026-01-14)

        Miscellaneous Chores

        • remove comments in copilot window handler (f231998)
        • update version to 2.1.4 (9bdf671)

        2.1.4 (2026-01-14)

        Miscellaneous Chores

        • add release name format to config (6db1b51)
        • update release workflow and build commands (8f5345b)

        2.1.3 (2026-01-14)

        Miscellaneous Chores

        • add linked-versions plugin to release config (415e4ae)

        2.1.2 (2026-01-14)

        Bug Fixes

        • 🐛 Fix automatic build issues (aba8f27)

        Miscellaneous Chores

        • add GH_TOKEN env to release workflow (078bf18)
        • release 2.1.1 (d1c04ce)
        • release 2.1.2 (91d9bbd)
        • release 2.1.2 (c7c8616)
        • remove release creation step from workflow (b73c179)
        • remove unnecessary comments in App.vue (22e331d)
        • remove unnecessary comments in App.vue (5ae8fbe)
        • update electron-builder config path and publish options (d3b4914)
        • update pull request title pattern (060ad4a)
        • update release configuration and patterns (0054fd4)

        2.1.0 (2026-01-14)

        Features

        • ✨ Add auto launch functionality and preference option (69c75cc)
        • ✨ Add hidden launch option for auto-start (dd1c2e1)
        • ✨ Add subscribe configuration hook and update UI (80b3534)
        • ✨ Add system tray support and Linux auto-launch (df414b9)
        • 🔖 Copilot adds thinking_stream event support (22623c4)
        • 🚑️ The portable version now supports automatically generating configuration files in the running directory (ba551b7)
        • add custom empty state icon for device list (65b028f)
        • add zip target for macOS builds (f52d3a5)

        Bug Fixes

        • 🐛 Fix delete message and config initialization (82a77ea)
        • 🐛 Fixed the issue of failed export and export configuration files (fd32c36)
        • 🐛 Update dependencies and add sharp override in workspace configuration (dbf366a)
        • 💰 Update payment amount handling in subscription (422950c)
        • add background color and improve window initialization (498fc90)
        • adjust empty state icon styling in device list (363bf3d)
        • ensure concurrency limit is numeric (d2c977c)
        • types: allow typed payload handlers by using any[] for handle listener rest params (b4e8058)

        Performance Improvements

        • 🚀 Use an external library instead of the built-in autoglm.js (d1f8176)

        Code Refactoring

        • ⚡️ Refactor code structure for improved readability and maintainability (f211924)
        • 🌐 Update language labels to native text (cb7ac96)
        • 🌐 Update subscription translations for multiple locales (b4e5780)
        • 🎨 Redesign task dialog with card layout (cd06d3b)
        • 🎨 Simplify config UI layout and update maxSteps (af18241)
        • 🔄 Auto configure Copilot after payment (c00ac1e)
        • 🔄 Move ESLint config to root and clean up dependencies (f2bd345)
        • 🔄 Optimize session callbacks and event handling (ae19570)
        • 🔄 Rename ipc to services for better structure (8212872)
        • 🔄 Rename start module to launch for clarity (5d44ebf)
        • 🔧 Optimize copilot config change detection (2776e8a)
        • 🔧 Replace quick prompts with PromptBar component (9b0c4df)
        • improve theme switching and background handling (b3203af)
        • migrate copilot config to store (e323611)
        • replace rotation icon with outline version (95ad30d)
        • replace send icon with rocket icon (ef9e7d3)
        • replace svg icons with font icons (9eca902)
        • replace trash icon with Delete icon (c59994e)

        2.0.1 (2026-01-06)

        Bug Fixes

        • 🐛 Fix the problem of abnormal subscription recharge fee (b32043c)

        2.0.0 (2026-01-05)

        Features

        • ✨ Add system terminal support (e5c157e)
        • ✨ Device lists will now intelligently merge duplicate device entries and share device configurations (52cc4b1)
        • ✨ Integrate scrcpy binaries for macos (85bf096)
        • ✨ Introducing a new file icon display component and enhancing the File Explorer dialog. (11be6f1)
        • ✨ Now supports copying device screenshots and recording files to the clipboard (bdb3644)
        • ✨ Now you can arrange your device windows through a graphical interface (91ad249)
        • ✨ Support edge hiding function (14a81de)
        • ✨ Support floating control bar (8807e50)
        • ✨ Support pairing and connecting to devices via QR code (14306b2)
        • ✨ Support to close the device screen when controlling (a84c775)
        • ✨ Supports starting applications for mirroring (d19e781)
        • ✨ Use the new interface design (b08021b)
        • 💥[Release-As: 2.0.0] major copilot overhaul with AutoGLM and multi-device automation (7ad5ecd)
        • 📸 Enhanced recording (7f10161)
        • 🔍️ Optimize the search function of the app (94ccb7b)
        • 🚀 Split the file manager into independent windows and support multiple instances in parallel (f41d853)
        • 🚀 Support adding the open application action to the desktop shortcut. (Not supported on macOS) (add251f)
        • 🚀 Supports connecting historical devices via device list (e0687e8)
        • 🚀 Supports dragging the device control bar to sort (64a98b2)
        • 🚀 Update to scrcpy v3.3.2 (462536c)
        • 🚚 Support batch startup mirroring (fcfd78e)
        • 🚚 The file manager has been refactored and improved, and more useful features have been added. (5cd5992)

        Bug Fixes

        • ♻️ Fixed repeated dependency issues (9777622)
        • 🐛 Fix automatic release (c2254aa)
        • 🐛 Fix device support audio and video encoding cannot be parsed (9b7f6a9)
        • 🐛 Fix for built-in scrcpy not supporting x64 macos (0d60655)
        • 🐛 Fix issue with incorrect address bar path when returning to the previous level in file management (0222675)
        • 🐛 Fix linux build errors (9b43dc0)
        • 🐛 Fix the display ID value type error (2b7ee79)
        • 🐛 Fix the mirror group bug (cd7d9cd)
        • 🐛 Fix the problem of build failure caused by missing dependencies (e34e1c2)
        • 🐛 Fix the problem of Windows calling system terminal failure (194689e)
        • 🐛 Fix the problem of Windows terminal injection command failure (fbf88d0)
        • 🐛 Fix typos (a7a3a17)
        • 🐛 Fixed an issue where macos built-in updates failed (432eceb)
        • 🐛 Fixed an issue where some options in preferences could not be turned off (269bd29)
        • 🐛 Fixed possible sandbox issues on Linux (ff9f9bd)
        • 🐛 Fixed the conflict between device control bar sorting and click events (18a57b9)
        • 🐛 Fixed the issue of abnormal path display in the file manager address bar (2f63f6f)
        • 🐛 Fixed the issue of duplicate filter conditions in the device list (6c4242c)
        • 🐛 Fixed the issue of layout flickering when refreshing the device list page (608b8f3)
        • 🐛 Fixed the issue of saving exceptions after adjusting parameters in preference settings (4a18f61)
        • 🐛 Fixed the issue where activating the program on macOS in certain situations would cause the tray to be created repeatedly (cf8e183)
        • 🐛 Fixed the issue where all configurations would be cleared when resetting the category configuration in preferences (6ee9a92)
        • 🐛 Fixed the issue where Chinese text cannot be saved in file management read and write text (34785dd)
        • 🐛 Fixed the issue where PowerShell failed to call the system terminal (7beb027)
        • 🐛 Fixed the issue where recorded files could not be copied to the clipboard under Windows (119b518)
        • 🐛 Fixed the issue where there is a chance of an error when closing the floating control bar on macOS (5c2c711)
        • 🐛 Fixed the problem of minimizing the visibility of tray icons (b0f42aa)
        • 🐛 Issue not taking effect after restarting the application after switching themes (857c480)
        • 🐛 Make StartApp compatible with scrcpy v3.0 (1082e0d)
        • 🐛 Rename --display-buffer to --video-buffer (b2bb0ae)
        • 🐛 Repair ADB timeout problems (b5bffc5)
        • 🐛 Repair floating action bar start application error (487e7e2)
        • 🐛 Repair part of internationalization Lost dynamics (d18444f)
        • 🐛 Resolve default recording error (358064e)
        • 🐛 Resolved the issue where the device list could not be displayed due to compatibility issues with certain devices (2c53b77)
        • 🐛 Resolving build errors (d21fa29)
        • 🐛 Restore the --display-buffer parameter to solve the mirroring problem (0f3d869)
        • 🐛 Solve the conflict between floating navigation bar and quick APP launch (460aca1)
        • 🐛 Solve the problem of abnormal display timing when recording related functions are successful (67d279e)
        • 🐛 Solve the problem of IPV6 address connection failure (1a95325)
        • 🐛 Solve the problem of startup error of development mode under Linux (5c4f65e)
        • 🐛 Solve the problem of Windows disabling video forwarding and crashing (10b902a)
        • 🐛 Solved the problem that the main window could not be restored after being moved off the screen in some cases (d054f8d)
        • 🐛 Start app to adapt to dark mode (ae13fde)
        • 🐛 Temporarily disable scrcpy integration in macOS (9bf4d5c)
        • 🐛 Update scrcpy-server file to solve the problem of not being able to obtain device APP list (63f7135)
        • 📝 Fixed the issue that special characters in Windows prevented the creation of app shortcut launch (301dac5)
        • 🔧 Camera recording and screen off configuration conflict (4508758)
        • 🔧 Fixed button loading prompt conflict issue (c323ad6)
        • 🩹 Restore the windows build configuration (9491069)
        • 🚀 Fix the issue of abnormal program exit behavior under windows (705f8be)

        Performance Improvements

        • ♻️ Adjust the position of the start application button (9833932)
        • ♻️ Code structure optimization (595216b)
        • ♻️ Enhance recording stability (3dd7525)
        • ♻️ Improve ADB connection stability (7655ba6)
        • ♻️ Improve the stability of window arrangement function (7ae3f21)
        • ♻️ Improve wireless connection stability (85be898)
        • ♻️ Improved device connection stability (1d603ab)
        • ♻️ No longer building universal packages for macOS (db5deb4)
        • ♻️ Optimize camera recording (4be2cf4)
        • ♻️ Optimize camera recording stability (952b2a7)
        • ♻️ Optimize device details performance (38d1433)
        • ♻️ Optimize device list interaction logic (3812061)
        • ♻️ Optimize file manager interaction (b168cc3)
        • ♻️ Optimize QR code connection experience (86f5e69)
        • ♻️ Optimize the Russian presentation effect (0d8a8ee)
        • ♻️ Optimized contextBridge related improvements for stability (0e098c3)
        • ♻️ Optimized the adb daemon startup failure detection mechanism (ca6be85)
        • ♻️ Reduce build package size by removing redundant dependencies (7b61b25)
        • ♻️ Refactor configuration related code to improve stability (37bf438)
        • ♻️ Script and directory structure optimization (68378ef)
        • ♻️ Simplify sandbox automatic configuration manager code to improve performance (1b82336)
        • ♻️ Support interruption during waiting for wireless connection (344b385)
        • ♻️ Supports retrieving a list of applications (b1a6ba7)
        • ♻️ Update mirror icon (c214e5a)
        • ♻️ When the application fails to start, display the error message (dbc34d6)
        • ♿️ Supports adjusting the closing method of the application in preferences (e643f8e)
        • ⚗️ Experimental support for turning off screen controls (9555f58)
        • ⚡️ Improve the start APP experience (29e5e1b)
        • ⚡️ Optimize scrcpy parameter conversion performance (18dcd24)
        • ⚡️ Optimize startup application performance (8e94494)
        • ⚡️ Optimize the method of obtaining the available displays of the device (9e31c84)
        • ⚡️ Optimize the stability of options that need to dynamically obtain parameters in preference settings (39bbc98)
        • ✅ A new method is adopted to solve the problem of IP type configuration storage (5488a1e)
        • ✅ File management supports selecting directories for uploading (fd2e639)
        • ✅ Provides the function of detecting and migrating configurations when deleting a device (39e0533)
        • ✅ Support switching devices on the floating control bar (50440f5)
        • ✨ Adjust the position of the wireless connection screen (3e3fc34)
        • ✨ Enable new icon (695e35d)
        • ✨ The floating control bar supports transparent display when inactive (34f27c5)
        • ✨ Update to scrcpy@2.7 to support the gamepad (0053e87)
        • ➖ Remove redundant console (9a67142)
        • ⬆️ Improve QR code connection performance (b413889)
        • ⬆️ Improved performance of automated mirroring (33a03c3)
        • ⬆️ Optimize edge hiding performance (74a91a4)
        • ⬆️ Optimize the performance of the floating control bar (a1c60ec)
        • 🌱 Optimize app icon background color and corner radius. (bc4f492)
        • 🌱 Optimize application icon details (55800be)
        • 🌱 UI details and documentation optimization (5b5bbf7)
        • 🍻 Improve file manager reliability (9063243)
        • 🐛 Improve wireless connection verification method (69fecc3)
        • 👥 Control bar sorting supports state synchronization (88abe95)
        • 👷 Added edge hiding function switch (d25714a)
        • 👷 Explicitly clean up unnecessary child processes on exit (0549dda)
        • 👷 Optimize the edge hiding function (d5caaa9)
        • 👷 Remove redundant code comments (ca4e826)
        • 👽️ Experimental support for adding open application actions to linux desktop shortcuts (6897c0e)
        • 👽️ Experimentally add linux arm64 support (5b033fd)
        • 💄 Improve space utilization of device window layout tools (939a2d2)
        • 💄 Improved Russian display (ca79e1b)
        • 💄 Normalize control window titles and generated file names (ccc7f0e)
        • 💄 Optimization of display effect of device list page (305187d)
        • 💄 Optimize device refresh mode (ea75615)
        • 💄 Optimize dialog display (1813718)
        • 💄 Optimize pairing interface display (df4103b)
        • 💄 Optimize preference setting button layout (47ae53d)
        • 💄 Optimize Russian display effect (5ca39ae)
        • 💄 Optimize the display effect of horizontal screen screenshots (90c7163)
        • 💄 Optimize the interface display effect (c7a5cd4)
        • 💄 Window layout adapted to dark mode theme (eab402b)
        • 💫 Adjust gnirehtet configuration behavior to make it consistent with user operation habits (7507915)
        • 💫 Support appending gnirehtet custom parameters in configuration (206a030)
        • 📌 Standardize the device list lifecycle processing flow. IPv6 addresses must be enclosed in [] and the port number cannot be omitted for wireless connections. (93c059d)
        • 📌 Support saving the main panel window size status (cef022f)
        • 📝 Add docs entry to the program (db5d157)
        • 📝 Add Japanese language support (969378f)
        • 📝 Added Arabic language support (f6c9fa4)
        • 📝 Optimize the scheduled task list (c666709)
        • 📝 Optimize the title of the control interface to solve the problem of duplicate device names (06a151d)
        • 📝 Optimized startup app package name display (22eb718)
        • 📝 Simplified partial translation (7411487)
        • 📦️ Update the upload function to support file and directory selection, and optimize the interface layout (7f5bd35)
        • 📸 Recording camera support (10d0370)
        • 📸 Support viewing real-time images and power information of the device (d262adf)
        • 🔀 Optimize the storage policy configured in preferences (b9faabf)
        • 🔊 Expanded audio source options (fc91f07)
        • 🔍️ Optimize QR code style to avoid scanning problems on some devices (dd3ad6c)
        • 🔖 Adjust the order of quick entry functions (ccb59e1)
        • 🔖 Optimize interaction of preferred terminal options (900dc69)
        • 🔧 Optimized startup APP function interaction (468af22)
        • 🔧 Temporarily disable scheduled tasks that are too far away (be5e639)
        • 🔨 Fixed the problem that some models could not reversely supply the network due to the blocking of installation detection when using Gnirehtet (c5369af)
        • 🔨 Improve the reliability of the linux sandbox configuration tool (6de2538)
        • 🧑‍💻 Improve application performance with VueRouter (6a8c190)
        • 🧑‍💻 Improve device-based terminal experience (88a0356)
        • 🧑‍💻 Optimize application icon size under macOS (066d81f)
        • 🧑‍💻 Optimize the interactive experience of the device control bar (8388646)
        • 🩹 Add an option to enable keyboard fix on app startup to be compatible with older versions of scrcpy (be89b36)
        • 🩹 Closing a screen via the control bar no longer requires creating a help window (84c7be7)
        • 🚀 Adjust options to support scrcpy v3.0 (0602676)
        • 🚀 After getting the device list, query and save the SerialNo of each device in preparation for subsequent integration (4464e7e)
        • 🚀 Clean output when closing built-in terminal (c976d4c)
        • 🚀 Extended floating control bar function (790e703)
        • 🚀 File management supports returning to the root directory (2e27443)
        • 🚀 Improve app icon quality (8a6f4c7)
        • 🚀 Improve performance by asynchronously storing main interface boundary information (d230c15)
        • 🚀 Modify the adb connection method to be compatible with scan connection (e6e8a09)
        • 🚀 Optimization of window arrangement function (33786ab)
        • 🚀 Optimize device connection experience (0690f2d)
        • 🚀 Optimize device list connection behavior and configuration migration strategy (8237058)
        • 🚀 Optimize program performance (9af3988)
        • 🚀 Optimize system terminal stability (2ffc588)
        • 🚀 Optimize the built-in terminal interaction experience (bb56d5b)
        • 🚀 Optimize the default behavior when adding new widgets to the device window arrangement (1be470a)
        • 🚀 Optimize the details of the new version of the icon (db9b19a)
        • 🚀 Optimize the display effect of application icons under windows (e0c221f)
        • 🚀 Optimize the display effect of new icons in smaller sizes (7d91d71)
        • 🚀 Optimize the layout effect of the task list (044cfcd)
        • 🚀 Optimize the menu trigger method for the upload function (8d39f5b)
        • 🚀 Optimize the storage strategy for preference Settings (359b9b9)
        • 🚀 Provide feedback on the application shortcut addition (d7eca8d)
        • 🚀 Supports display of offline devices (dcf817f)
        • 🚀 Supports opening using the main monitor when starting the APP (aec9b78)
        • 🚀 The main panel supports single instance startup (c49d22c)
        • 🚀 Update to scrcpy v3.3.1 (a2bb039)
        • 🚀 Update to scrcpy v3.0 (bf06382)
        • 🚀 Update to scrcpy v3.0.2 (7510548)
        • 🚀 Update to scrcpy v3.1 (7c74c71)
        • 🚀 Update to scrcpy v3.2 (57c11af)
        • 🚀 Update to scrcpy v3.3 (bbf2335)
        • 🚀 Update to scrcpy v3.3.3 (8566644)
        • 🚚 Reduce some unnecessary verifications and increase the speed at which equipment starts reverse network supply (c17aaba)

        Miscellaneous Chores

        Code Refactoring

        • ♻️ Reconstruct the multi-device batch upload function (dbdaa35)
        • 🔨 Optimize code (f61d820)

        1.34.2 (2025-12-08)

        Performance Improvements

        • 📦️ Update the upload function to support file and directory selection, and optimize the interface layout (7f5bd35)
        • 🚀 Optimize the menu trigger method for the upload function (8d39f5b)

        1.34.1 (2025-12-07)

        Performance Improvements

        • 🍻 Improve file manager reliability (9063243)

        1.34.0 (2025-12-07)

        Features

        • ✨ Introducing a new file icon display component and enhancing the File Explorer dialog. (11be6f1)
        • 🚀 Split the file manager into independent windows and support multiple instances in parallel (f41d853)
        • 🚚 The file manager has been refactored and improved, and more useful features have been added. (5cd5992)

        Bug Fixes

        • 🐛 Fixed the conflict between device control bar sorting and click events (18a57b9)
        • 🐛 Fixed the issue of abnormal path display in the file manager address bar (2f63f6f)
        • 🐛 Fixed the issue where Chinese text cannot be saved in file management read and write text (34785dd)

        Performance Improvements

        • ♻️ Optimize file manager interaction (b168cc3)
        • ✨ Enable new icon (695e35d)
        • 🌱 Optimize app icon background color and corner radius. (bc4f492)
        • 🌱 Optimize application icon details (55800be)
        • 📝 Optimize the scheduled task list (c666709)
        • 🧑‍💻 Optimize application icon size under macOS (066d81f)
        • 🧑‍💻 Optimize the interactive experience of the device control bar (8388646)
        • 🚀 Improve app icon quality (8a6f4c7)
        • 🚀 Optimize program performance (9af3988)
        • 🚀 Optimize the details of the new version of the icon (db9b19a)
        • 🚀 Optimize the display effect of application icons under windows (e0c221f)
        • 🚀 Optimize the display effect of new icons in smaller sizes (7d91d71)

        1.33.0 (2025-11-20)

        Features

        • ✨ Add system terminal support (e5c157e)

        Bug Fixes

        • 🐛 Fix issue with incorrect address bar path when returning to the previous level in file management (0222675)
        • 🐛 Fix the problem of Windows calling system terminal failure (194689e)
        • 🐛 Fix the problem of Windows terminal injection command failure (fbf88d0)
        • 🐛 Fixed the issue where PowerShell failed to call the system terminal (7beb027)

        Performance Improvements

        • 🔖 Optimize interaction of preferred terminal options (900dc69)
        • 🚀 Clean output when closing built-in terminal (c976d4c)
        • 🚀 Optimize system terminal stability (2ffc588)
        • 🚀 Optimize the built-in terminal interaction experience (bb56d5b)

        1.32.2 (2025-09-29)

        Performance Improvements

        • 🚀 Update to scrcpy v3.3.3 (8566644)

        1.32.1 (2025-09-10)

        Performance Improvements

        • 🌱 UI details and documentation optimization (5b5bbf7)

        1.32.0 (2025-09-08)

        Features

        • ✨ Now supports copying device screenshots and recording files to the clipboard (bdb3644)
        • 🚀 Update to scrcpy v3.3.2 (462536c)

        Bug Fixes

        • 🐛 Fixed the issue where recorded files could not be copied to the clipboard under Windows (119b518)
        • 🔧 Fixed button loading prompt conflict issue (c323ad6)

        Performance Improvements

        • ✅ Provides the function of detecting and migrating configurations when deleting a device (39e0533)
        • 📌 Standardize the device list lifecycle processing flow. IPv6 addresses must be enclosed in [] and the port number cannot be omitted for wireless connections. (93c059d)
        • 🚀 Modify the adb connection method to be compatible with scan connection (e6e8a09)
        • 🚀 Optimize device list connection behavior and configuration migration strategy (8237058)

        1.31.3 (2025-09-01)

        Performance Improvements

        • 💄 Window layout adapted to dark mode theme (eab402b)

        1.31.2 (2025-09-01)

        Bug Fixes

        • 🐛 Resolved the issue where the device list could not be displayed due to compatibility issues with certain devices (2c53b77)

        Performance Improvements

        • 🚀 Optimization of window arrangement function (33786ab)

        1.31.1 (2025-08-29)

        Performance Improvements

        • 👷 Remove redundant code comments (ca4e826)

        1.31.0 (2025-08-29)

        Features

        • ✨ Device lists will now intelligently merge duplicate device entries and share device configurations (52cc4b1)
        • ✨ Now you can arrange your device windows through a graphical interface (91ad249)

        Bug Fixes

        • 🐛 Fix typos (a7a3a17)
        • 🐛 Fixed possible sandbox issues on Linux (ff9f9bd)
        • 🐛 Fixed the issue of saving exceptions after adjusting parameters in preference settings (4a18f61)
        • 🐛 Issue not taking effect after restarting the application after switching themes (857c480)

        Performance Improvements

        • ♻️ Improve the stability of window arrangement function (7ae3f21)
        • ♻️ Simplify sandbox automatic configuration manager code to improve performance (1b82336)
        • 💄 Improve space utilization of device window layout tools (939a2d2)
        • 🔖 Adjust the order of quick entry functions (ccb59e1)
        • 🔨 Improve the reliability of the linux sandbox configuration tool (6de2538)
        • 🚀 After getting the device list, query and save the SerialNo of each device in preparation for subsequent integration (4464e7e)
        • 🚀 Improve performance by asynchronously storing main interface boundary information (d230c15)
        • 🚀 Optimize the default behavior when adding new widgets to the device window arrangement (1be470a)
        • 🚀 Optimize the layout effect of the task list (044cfcd)
        • 🚀 Optimize the storage strategy for preference Settings (359b9b9)

        1.30.2 (2025-07-15)

        Performance Improvements

        • ♻️ Optimize device list interaction logic (3812061)
        • 📝 Add Japanese language support (969378f)

        1.30.1 (2025-07-14)

        Bug Fixes

        • 🐛 Fixed the issue where all configurations would be cleared when resetting the category configuration in preferences (6ee9a92)
        • 🐛 Solve the problem of abnormal display timing when recording related functions are successful (67d279e)
        • 📝 Fixed the issue that special characters in Windows prevented the creation of app shortcut launch (301dac5)

        Performance Improvements

        • 📝 Optimized startup app package name display (22eb718)
        • 🔧 Optimized startup APP function interaction (468af22)

        1.30.0 (2025-07-14)

        Features

        • 🔍️ Optimize the search function of the app (94ccb7b)
        • 🚀 Supports dragging the device control bar to sort (64a98b2)

        Bug Fixes

        • 🐛 Fixed the issue of layout flickering when refreshing the device list page (608b8f3)
        • 🐛 Fixed the issue where activating the program on macOS in certain situations would cause the tray to be created repeatedly (cf8e183)
        • 🐛 Fixed the issue where there is a chance of an error when closing the floating control bar on macOS (5c2c711)
        • 🚀 Fix the issue of abnormal program exit behavior under windows (705f8be)

        Performance Improvements

        • ♻️ Code structure optimization (595216b)
        • 👥 Control bar sorting supports state synchronization (88abe95)
        • 📝 Optimize the title of the control interface to solve the problem of duplicate device names (06a151d)
        • 🔀 Optimize the storage policy configured in preferences (b9faabf)
        • 🚀 Supports opening using the main monitor when starting the APP (aec9b78)

        1.29.9 (2025-06-27)

        Performance Improvements

        • 🚀 Update to scrcpy v3.3.1 (a2bb039)

        1.29.8 (2025-06-20)

        Bug Fixes

        • 🐛 Update scrcpy-server file to solve the problem of not being able to obtain device APP list (63f7135)

        1.29.7 (2025-06-16)

        Performance Improvements

        • 🚀 Update to scrcpy v3.3 (bbf2335)

        1.29.6 (2025-04-27)

        Performance Improvements

        • 📝 Added Arabic language support (f6c9fa4)
        • 🚀 File management supports returning to the root directory (2e27443)

        1.29.5 (2025-04-17)

        Bug Fixes

        • 🐛 Fix the problem of build failure caused by missing dependencies (e34e1c2)

        1.29.4 (2025-04-17)

        Bug Fixes

        • 🐛 Fixed an issue where some options in preferences could not be turned off (269bd29)

        Performance Improvements

        • 💫 Adjust gnirehtet configuration behavior to make it consistent with user operation habits (7507915)
        • 🔍️ Optimize QR code style to avoid scanning problems on some devices (dd3ad6c)
        • 🩹 Add an option to enable keyboard fix on app startup to be compatible with older versions of scrcpy (be89b36)

        1.29.3 (2025-04-02)

        Performance Improvements

        • 📝 Add docs entry to the program (db5d157)
        • 🚚 Reduce some unnecessary verifications and increase the speed at which equipment starts reverse network supply (c17aaba)

        1.29.2 (2025-03-31)

        Performance Improvements

        • 🔨 Fixed the problem that some models could not reversely supply the network due to the blocking of installation detection when using Gnirehtet (c5369af)

        1.29.1 (2025-03-31)

        Performance Improvements

        • 🔊 Expanded audio source options (fc91f07)
        • 🩹 Closing a screen via the control bar no longer requires creating a help window (84c7be7)
        • 🚀 Update to scrcpy v3.2 (57c11af)

        1.29.0 (2025-03-27)

        Features

        • 🚀 Support adding the open application action to the desktop shortcut. (Not supported on macOS) (add251f)
        • 🚚 Support batch startup mirroring (fcfd78e)

        Bug Fixes

        • 🐛 Solve the conflict between floating navigation bar and quick APP launch (460aca1)
        • 🐛 Solve the problem of startup error of development mode under Linux (5c4f65e)

        Performance Improvements

        • ✨ The floating control bar supports transparent display when inactive (34f27c5)
        • 👷 Explicitly clean up unnecessary child processes on exit (0549dda)
        • 👽️ Experimental support for adding open application actions to linux desktop shortcuts (6897c0e)
        • 👽️ Experimentally add linux arm64 support (5b033fd)
        • 💄 Optimization of display effect of device list page (305187d)
        • 💫 Support appending gnirehtet custom parameters in configuration (206a030)
        • 🚀 Provide feedback on the application shortcut addition (d7eca8d)

        1.28.7 (2025-02-17)

        Bug Fixes

        • 🐛 Fixed the issue of duplicate filter conditions in the device list (6c4242c)
        • 🐛 Solved the problem that the main window could not be restored after being moved off the screen in some cases (d054f8d)

        Performance Improvements

        • ⬆️ Improved performance of automated mirroring (33a03c3)
        • 💄 Optimize the display effect of horizontal screen screenshots (90c7163)
        • 🚀 The main panel supports single instance startup (c49d22c)

        1.28.6 (2025-02-05)

        Bug Fixes

        • 🐛 Resolving build errors (d21fa29)

        1.28.5 (2025-02-05)

        Performance Improvements

        • ✅ File management supports selecting directories for uploading (fd2e639)
        • ⬆️ Improve QR code connection performance (b413889)

        1.28.4 (2025-01-13)

        Bug Fixes

        • 🐛 Fix the display ID value type error (2b7ee79)
        • 🐛 Solve the problem of IPV6 address connection failure (1a95325)

        Performance Improvements

        • ♻️ Improve wireless connection stability (85be898)
        • ⚡️ Optimize the method of obtaining the available displays of the device (9e31c84)
        • 🐛 Improve wireless connection verification method (69fecc3)
        • 👷 Added edge hiding function switch (d25714a)

        1.28.3 (2024-12-28)

        Performance Improvements

        • ♻️ Optimize device details performance (38d1433)

        1.28.2 (2024-12-27)

        Performance Improvements

        • 👷 Optimize the edge hiding function (d5caaa9)
        • 📸 Support viewing real-time images and power information of the device (d262adf)

        1.28.1 (2024-12-20)

        Performance Improvements

        • ♻️ Optimize QR code connection experience (86f5e69)

        1.28.0 (2024-12-20)

        Features

        • ✨ Support pairing and connecting to devices via QR code (14306b2)
        • 🚀 Supports connecting historical devices via device list (e0687e8)

        Bug Fixes

        • 🐛 Solve the problem of Windows disabling video forwarding and crashing (10b902a)

        Performance Improvements

        • ♻️ Update mirror icon (c214e5a)
        • ✅ A new method is adopted to solve the problem of IP type configuration storage (5488a1e)
        • 🚀 Optimize device connection experience (0690f2d)
        • 🚀 Supports display of offline devices (dcf817f)

        1.27.7 (2024-12-10)

        Performance Improvements

        • 🚀 Update to scrcpy v3.1 (7c74c71)

        1.27.6 (2024-12-05)

        Bug Fixes

        • ♻️ Fixed repeated dependency issues (9777622)

        Performance Improvements

        • ♻️ Optimized contextBridge related improvements for stability (0e098c3)
        • ♻️ Reduce build package size by removing redundant dependencies (7b61b25)
        • 🚀 Update to scrcpy v3.0.2 (7510548)

        1.27.5 (2024-11-29)

        Performance Improvements

        • ➖ Remove redundant console (9a67142)

        1.27.4 (2024-11-29)

        Bug Fixes

        • 🐛 Fix automatic release (c2254aa)
        • 🐛 Fixed an issue where macos built-in updates failed (432eceb)

        1.27.3 (2024-11-28)

        Bug Fixes

        • 🐛 Fix for built-in scrcpy not supporting x64 macos (0d60655)

        Performance Improvements

        • ♻️ Improved device connection stability (1d603ab)
        • ♻️ Optimized the adb daemon startup failure detection mechanism (ca6be85)
        • 🧑‍💻 Improve device-based terminal experience (88a0356)

        1.27.2 (2024-11-26)

        Bug Fixes

        • 🐛 Start app to adapt to dark mode (ae13fde)

        1.27.1 (2024-11-25)

        Bug Fixes

        • 🐛 Make StartApp compatible with scrcpy v3.0 (1082e0d)

        Performance Improvements

        • 🚀 Adjust options to support scrcpy v3.0 (0602676)
        • 🚀 Update to scrcpy v3.0 (bf06382)

        1.27.0 (2024-11-21)

        Features

        • ✨ Support edge hiding function (14a81de)

        Performance Improvements

        • ⬆️ Optimize edge hiding performance (74a91a4)

        1.26.4 (2024-11-14)

        Bug Fixes

        • 🐛 Temporarily disable scrcpy integration in macOS (9bf4d5c)

        1.26.3 (2024-11-08)

        Bug Fixes

        • 🐛 Fix device support audio and video encoding cannot be parsed (9b7f6a9)
        • 🐛 Restore the --display-buffer parameter to solve the mirroring problem (0f3d869)

        Performance Improvements

        • ♻️ Support interruption during waiting for wireless connection (344b385)
        • ♻️ Supports retrieving a list of applications (b1a6ba7)
        • ⚡️ Optimize startup application performance (8e94494)

        1.26.2 (2024-11-06)

        Bug Fixes

        • 🐛 Fix linux build errors (9b43dc0)

        1.26.1 (2024-11-06)

        Performance Improvements

        • ♻️ No longer building universal packages for macOS (db5deb4)

        1.26.0 (2024-11-06)

        Features

        • ✨ Integrate scrcpy binaries for macos (85bf096)
        • ✨ Supports starting applications for mirroring (d19e781)

        Bug Fixes

        • 🐛 Rename --display-buffer to --video-buffer (b2bb0ae)
        • 🐛 Repair floating action bar start application error (487e7e2)
        • 🩹 Restore the windows build configuration (9491069)

        Performance Improvements

        • ♻️ Adjust the position of the start application button (9833932)
        • ♻️ When the application fails to start, display the error message (dbc34d6)
        • ⚡️ Improve the start APP experience (29e5e1b)

        1.25.5 (2024-11-05)

        Performance Improvements

        • ⚡️ Optimize the stability of options that need to dynamically obtain parameters in preference settings (39bbc98)

        1.25.4 (2024-10-31)

        Performance Improvements

        • ♻️ Enhance recording stability (3dd7525)
        • ♻️ Optimize camera recording stability (952b2a7)
        • 💄 Normalize control window titles and generated file names (ccc7f0e)

        1.25.3 (2024-10-29)

        Bug Fixes

        • 🔧 Camera recording and screen off configuration conflict (4508758)

        Performance Improvements

        • 🔧 Temporarily disable scheduled tasks that are too far away (be5e639)

        1.25.2 (2024-10-29)

        Bug Fixes

        • 🐛 Resolve default recording error (358064e)

        1.25.1 (2024-10-28)

        Miscellaneous Chores

        1.25.0 (2024-10-28)

        Features

        • ✨ Support to close the device screen when controlling (a84c775)
        • 📸 Enhanced recording (7f10161)

        Performance Improvements

        • ♻️ Optimize camera recording (4be2cf4)
        • ♻️ Script and directory structure optimization (68378ef)
        • ⚗️ Experimental support for turning off screen controls (9555f58)
        • ⚡️ Optimize scrcpy parameter conversion performance (18dcd24)
        • 💄 Improved Russian display (ca79e1b)
        • 📸 Recording camera support (10d0370)

        1.24.3 (2024-10-21)

        Performance Improvements

        • 💄 Optimize Russian display effect (5ca39ae)

        1.24.2 (2024-09-16)

        Bug Fixes

        • 🐛 Fix the mirror group bug (cd7d9cd)

        1.24.1 (2024-09-16)

        Performance Improvements

        • ✨ Update to scrcpy@2.7 to support the gamepad (0053e87)
        • ⬆️ Optimize the performance of the floating control bar (a1c60ec)
        • 🚀 Extended floating control bar function (790e703)

        1.24.0 (2024-09-12)

        Features

        • ✨ Support floating control bar (8807e50)

        Performance Improvements

        • ✅ Support switching devices on the floating control bar (50440f5)
        • 💄 Optimize preference setting button layout (47ae53d)

        1.23.6 (2024-09-09)

        Bug Fixes

        • 🐛 Fixed the problem of minimizing the visibility of tray icons (b0f42aa)
        • 🐛 Repair ADB timeout problems (b5bffc5)

        1.23.5 (2024-09-09)

        Performance Improvements

        • ♻️ Improve ADB connection stability (7655ba6)

        1.23.4 (2024-09-08)

        Bug Fixes

        • 🐛 Repair part of internationalization Lost dynamics (d18444f)

        1.23.3 (2024-09-08)

        Performance Improvements

        • ♻️ Optimize the performance of equipment interaction column and file manager (41ffcf5)

        1.23.2 (2024-09-07)

        Performance Improvements

        • 🚀 Support file manager upload to the current directory (737c2a3)

        1.23.1 (2024-09-07)

        Performance Improvements

        • ⬆️ Update dependencies (8b03862)

        1.23.0 (2024-09-07)

        Features

        • ✨ Support graphic file manager (8155723)
        • 🚀 Initially add a new file manager (94ee007)

        Performance Improvements

        1.22.4 (2024-08-03)

        Bug Fixes

        • 🐛 plan task Remove operation bug (5205935)

        Performance Improvements

        1.22.3 (2024-08-03)

        Performance Improvements

        • ♻️ Update scrcpy to 2.6.1 (1eef9d2)

        1.22.2 (2024-07-25)

        Performance Improvements

        • 💄 Optimize the display effect of the dark mode (38f854b)
        • 💄 Optimize the display effect of the quick operation bar (7b3c4db)
        • 💄 Optimize the display effect of the tabs bar (5b2d41c)

        1.22.1 (2024-07-25)

        Bug Fixes

        • 🐛 Fixed asset publishing issues (222f626)

        1.22.0 (2024-07-25)

        Features

        • 🚀 Add a scheduled task list (d72202b)
        • 🚀 Add basic timing task function (04a7608)
        • 🚀 Add timing task entrance (8393c85)
        • 🚀 添加定时任务入口 (6ce66d4)

        Bug Fixes

        • 🐛 The internationalization problem of repairing path selector (8e6af20)
        • 💄 Optimize wireless connection user interface (50ae742)

        Performance Improvements

        • 💄 Optimization of the operation bar at the top of the equipment list (81bd3d9)
        • 💄 Optimized operation button layout (16f9535)

        1.21.4 (2024-07-14)

        Performance Improvements

        • ♻️ Optimize custom startup performance (abd468b)
        • ♻️ Perfect allSettledWrapper method (5b7d0af)

        1.21.3 (2024-07-13)

        Bug Fixes

        • Fix the width problem of custom startup pop-up windows (9a7e56b)

        1.21.2 (2024-07-13)

        Bug Fixes

        • 🐛 Fix terminal style abnormalities in dark theme (3d4dc7c)

        Performance Improvements

        • ♻️ Improve code robustness (2f389af)
        • 🚀 Optimize batch operation interaction (343eab2)

        1.21.1 (2024-07-13)

        Bug Fixes

        • 🐛 Fix dependency build errors (5b02621)

        1.21.0 (2024-07-13)

        Features

        • 🎉 Support batch execution script function (8097022)
        • 🚀 Support execution script function (2013413)

        Bug Fixes

        • 🐛 Repair the problem of equipment width in the English state (25c42d9)
        • 📝 Update Translation (33b0181)

        Performance Improvements

        • ✅ Support batch screenshot and other performance optimization (db9e3e7)
        • ✨ Support for custom startup mirroring (677f30c)
        • 🐛 Fix the problem of frequently trigger preservation of preferences (8261916)

        1.20.1 (2024-07-04)

        Bug Fixes

        • 🐛 Fix batch text spelling errors (062c689)

        1.20.0 (2024-07-04)

        Features

        • ✨ Add batch installation application function (37ce245)

        Performance Improvements

        • 🚀 Add mouse binding options (7ee4ba4)

        1.19.4 (2024-07-02)

        Bug Fixes

        • 🐛 Fix terminal style problems (9fc1ded)
        • Update Chinese language translations (b8d77e3)

        Performance Improvements

        • 🚀 Update to scrcpy v2.5 (22cc5a3)

        1.19.3 (2024-06-13)

        Bug Fixes

        • 🐛 Abnormal operations cause the program that cannot be closed (b989140)

        1.19.2 (2024-06-03)

        Bug Fixes

        • 🐛 Automatically apply local languages (0cc8208)

        1.19.1 (2024-05-26)

        Bug Fixes

        • 🐛 In some cases, the light mode is abnormal (ea227e0)
        • 🐛 Search for shortcut key conflicts (c70e6ca)

        Performance Improvements

        1.19.0 (2024-05-15)

        Features

        • 🚀 Add page search function (6dd8244)
        • 🚀 Update dependencies to support ESM (9f1696f)

        Bug Fixes

        • 🐛 Resolving build failures (8460945)
        • 🐛 Tips unavailable (603e4e9)

        Performance Improvements

        • ♻️ FindInPage API (fcf8269)
        • ♻️ Optimize dark mode (2f2e1cf)
        • ♻️ Search interaction (a195b7e)
        • ♻️ Search variable name (7c55e50)
        • 🐛 Global search error (091d503)
        • 🚀 优化页面查找工具性能 (8587977)

        1.18.4 (2024-05-04)

        Bug Fixes

        • 🐛 Wireless adb does not support Spaces (1f27597)

        1.18.3 (2024-04-12)

        Performance Improvements

        • ♻️ i18n configuration (1ca0469)

        1.18.2 (2024-04-11)

        Bug Fixes

        • 🐛 zh_TW Language support (885af3a)

        1.18.1 (2024-04-11)

        Bug Fixes

        • 🔧 Repair merge zh-TW failed (81ff63f)

        Performance Improvements

        1.18.0 (2024-04-11)

        Features

        • Add a simple zh_TW Traditional Chinese locale (cec6539)

        1.17.8 (2024-03-29)

        Bug Fixes

        • 🐛 Camera configuration conflict (07cc5f3)
        • 🐛 OTG configuration conflict (576d287)
        • 🐛 OTG mode: could not turn screen off (c5bed0e)

        1.17.7 (2024-03-27)

        Bug Fixes

        • ♻️ Remove the redundant imports (a06708f)

        Performance Improvements

        • ♻️ Optimize delete history logic (780e3b9)
        • ♻️ Support delete historical connection (c82560f)
        • 💄 Wireless style optimization (ba51fe3)

        1.17.6 (2024-03-21)

        Performance Improvements

        • ♻️ Supports automatic execution of mirrors on devices (11e0884)

        1.17.5 (2024-03-17)

        Performance Improvements

        1.17.4 (2024-03-14)

        Performance Improvements

        • ♻️ Options in the preference settings (dc711cb)

        1.17.3 (2024-03-13)

        Performance Improvements

        • ♻️ Remove console log (6e25eb7)

        1.17.2 (2024-03-10)

        Bug Fixes

        • 🐛 Abnormal built-in terminal adb command (368551a)

        Performance Improvements

        • ♻️ Update eslint config (bf2d2b4)

        1.17.1 (2024-03-05)

        Performance Improvements

        • ♻️ Interactive logic optimization (193f80a)
        • ♻️ Optimize design and code (d507c2d)
        • ♻️ Optimize equipment operation (389ac33)
        • ➖ Remove redundant packages (f9e4a0e)
        • 💄 Optimize dark mode styles (1cac054)

        1.17.0 (2024-03-04)

        Features

        • 🎉 Update to scrcpy v2.4 (02a4d39)

        1.16.8 (2023-12-27)

        Bug Fixes

        • 🐛 The maximum size description error (01fd926)

        1.16.7 (2023-12-19)

        Performance Improvements

        1.16.6 (2023-12-19)

        Miscellaneous Chores

        1.16.5 (2023-12-19)

        Performance Improvements

        • 📝 Control in stop charging (8707eb5)

        1.16.4 (2023-12-19)

        Bug Fixes

        • 🐛 Pairing code type issue (889fe8c)

        1.16.3 (2023-12-03)

        Performance Improvements

        • 🚀 Update scrcpy v2.3.1 (3566655)

        1.16.2 (2023-12-02)

        Bug Fixes

        1.16.1 (2023-11-26)

        Bug Fixes

        1.16.0 (2023-11-26)

        Performance Improvements

        Miscellaneous Chores

        1.15.0 (2023-11-18)

        Features

        • 添加投屏窗口大小控制 (97d7868)

        Performance Improvements

        • 🚀 Add window position option (866aa2c)

        1.14.3 (2023-11-17)

        Performance Improvements

        • ♻️ Add context menu (f0f25a7)
        • ♻️ Optimize extended menu bar interaction (de9352c)
        • 📝 Optimization preferences description (30eca50)

        1.14.2 (2023-11-16)

        Performance Improvements

        • ♻️ Optimize autoConnect historical devices (755a130)
        • 💡 Add autoConnect option (a57b847)

        1.14.1 (2023-11-14)

        Bug Fixes

        • 🐛 Abnormal terminal theme (20d37c1)

        1.14.0 (2023-11-14)

        Features

        • 🎉 Add Terminal Debugging (fdf40c7)

        Performance Improvements

        • ♻️ Optimize terminal performance (d3afc4b)
        • 💄 Update terminal style (5b6b8d1)
        • 🚨 Optimization error prompt (b759502)

        1.13.5 (2023-11-11)

        Performance Improvements

        • ♻️ Mirror group shutdown logic (296e21d)
        • ♻️ Optimize mirror group (5793c24)

        1.13.4 (2023-11-10)

        Performance Improvements

        • ♻️ Optimization updater (61ccd4a)
        • ♻️ Optimize mirror group (81c007f)

        1.13.3 (2023-11-10)

        Bug Fixes

        • 🐛 Recording prompt and file format errors (bfdad9e)

        Performance Improvements

        • ♻️ Optimize Batch connection performance (36de67b)
        • ♻️ Optimize file push prompts (4a3575f)
        • ♻️ Optimize historical device connections (83f8c04)
        • ✨ Support bulk connecting to historical devices (b7eb1dd)

        1.13.2 (2023-11-09)

        Bug Fixes

        Performance Improvements

        • ♻️ Configure Incompatible Handling Mechanism (c0e6a01)
        • ♻️ Optimize gnirehtet (de3555b)
        • 💄 Optimize volume control and gnirehtet (b40bdcf)
        • 🚀 Add File push function (70f8b46)
        • 🚀 Add screen rotation shortcut menu (dd601df)

        1.13.1 (2023-11-08)

        Performance Improvements

        • ♻️ Adjust volume control position (1b3f49e)
        • ♻️ Optimize configuration file logic (5f8cc5a)
        • 🚀 Add volume control (1505518)

        1.13.0 (2023-11-07)

        Features

        • 🎉 Add mirror group function (0c9d36f)

        Bug Fixes

        Performance Improvements

        • ♻️ Optimize mirror group (cf9c82d)
        • ♻️ optimize mirror group tips (46defbf)
        • ♻️ Optimize preferences (7a6417e)
        • ♻️ Optimize window control (0530ed3)
        • 💄 Update styles (37da97b)
        • 🚀 Add camera options (5a04b4c)

        1.12.4 (2023-11-03)

        Bug Fixes

        • 🐛 MacOS reduced to the tray to evoke failure (d7bf83b)

        1.12.3 (2023-11-03)

        Bug Fixes

        • 🐛 MacOS reduced to the tray to evoke failure (6153bc4)

        1.12.2 (2023-11-03)

        Bug Fixes

        1.12.1 (2023-11-03)

        Bug Fixes

        • 🐛 Add gnirehtet fix option (f9c6c32)
        • 🐛 Display options cannot be changed (3046746)
        • 🐛 Preference style (0f72090)
        • 🐛 Reset preferences language not restored (d691780)
        • 🐛 Unable to update path selector (3279c34)
        • 🐛 Video codec preset error (1af9abd)

        Performance Improvements

        • ♻️ optimize Codec (6154ffc)
        • ♻️ Optimize recording (f4dfb2c)
        • 🎨 Update preferences style (e9befea)

        1.12.0 (2023-11-02)

        Features

        • 🎉 Update Scrcpy to v2.2 (5c401a8)

        Bug Fixes

        Performance Improvements

        1.11.9 (2023-10-31)

        Performance Improvements

        • ♻️ Optimization gnirehtet and scrcpy (9cf800c)
        • ♻️ Optimize Gnirehtet interaction (a90e570)

        1.11.8 (2023-10-31)

        Bug Fixes

        • 🎨 修复 macOS 设置主题跟随系统后 某些情况下循环触发导致死循环的问题 (1d7b188)

        1.11.7 (2023-10-31)

        Bug Fixes

        • 🐛 macOS x64ArchFiles Errors (151cb29)

        1.11.6 (2023-10-31)

        Bug Fixes

        • 🐛 macOS x64ArchFiles Errors (7dbca01)

        1.11.5 (2023-10-31)

        Bug Fixes

        • 🐛 macOS x64ArchFiles Errors (ad3f77f)

        1.11.4 (2023-10-31)

        Bug Fixes

        • 🐛 macOS x64ArchFiles Errors (4b4e116)

        1.11.3 (2023-10-31)

        Bug Fixes

        • 🐛 Unix permission issues (1279994)
        • 🐛 Unix permission issues (dc9a3c4)
        • 🐛 x64ArchFiles Error (82a99d9)

        1.11.2 (2023-10-30)

        Bug Fixes

        • 🐛 修复 macOS 打包失败的问题 (1b2236c)

        1.11.1 (2023-10-30)

        Bug Fixes

        • 🐛 修复 macOS 打包失败的问题 (37e2837)

        1.11.0 (2023-10-30)

        Features

        • 🎉 Add gnirehtet reverse tethering function (2c97189)

        Bug Fixes

        • 🐛 gnirehtet custom dependent paths error (cfd0e1d)

        Performance Improvements

        • ♻️ Optimize Gnirehtet interaction (e1237cd)
        • ♻️ 拆分依赖文件禁用冗余的警告信息 (93ad836)
        • ♻️ 目录结构及描述调整 (f9a32d6)
        • ♻️ 补充依赖及目录结构调整 (b18256b)

        1.10.2 (2023-10-28)

        Bug Fixes

        • 🐛 修复设置主题跟随系统后没有生效的问题 (95a83f4)

        1.10.1 (2023-10-28)

        Bug Fixes

        • 🐛 修复 linux 无法启动镜像或录制服务以及修改自定义依赖目录的问题 (d815643)

        1.10.0 (2023-10-27)

        Features

        • 🚀 新增支持 深色模式、国际化语言、运行日志等功能 (4b13f58)

        Bug Fixes

        • 🐛 修复 linux 打包后图标丢失的问题 (217d82d)
        • 🐛 修复安装路径包含空格会导致无法启动服务的问题 (29ae786)
        • 🐛 修复录制结束点击取消异常弹窗以及点击重启服务没有反应的问题 (054c55b)
        • 🔧 修复自定义路径功能没有生效的问题 (894b581)

        Performance Improvements

        1.9.1 (2023-10-24)

        Performance Improvements

        • 💄 窗口控制及交互逻辑优化 (52514e2)

        1.9.0 (2023-10-24)

        Features

        • 🚀 添加 i18n 初步支持 (18d490f)

        Bug Fixes

        • 🐛 修复 macOS 最小化到托盘后状态栏图标不显示的问题 (a789826)

        1.8.17 (2023-10-23)

        Bug Fixes

        • 🐛 尝试修复构建失败 (daeb9e5)

        1.8.16 (2023-10-23)

        Performance Improvements

        • ✨ 采用新的 Logo 设计 (3bf79d3)

        1.8.15 (2023-10-22)

        Bug Fixes

        • 🐛 修复 Linux 平台启动白屏无法正常使用的问题 (54e713b)

        1.8.14 (2023-10-21)

        Bug Fixes

        • 🐛 修复 linux 打包配置错误的问题 (a9668d9)

        1.8.13 (2023-10-21)

        Performance Improvements

        • 🚀 为 windows 添加 ARM64 软件包编译 (368e8ee)
        • 🚀 支持所有平台在点击关闭按钮时选择是否保存到托盘中的功能 (8360198)

        1.8.12 (2023-10-21)

        Bug Fixes

        • 🐛 修复 macOS 或 linux 下自定义依赖选项描述错误的问题 (0d4b1ce)

        1.8.11 (2023-10-21)

        Performance Improvements

        • 🔨 优化窗口默认大小 (393e899)

        1.8.10 (2023-10-20)

        Bug Fixes

        • 🐛 修复 macOS 窗口问题 (f768566)

        1.8.9 (2023-10-20)

        Bug Fixes

        • 🐛 修复 macOS 窗口过小导致出现横向滚动条的问题 (8ee34ca)

        1.8.8 (2023-10-20)

        Bug Fixes

        • 🚀 修复 macOS 简单关闭应用重新打开时报错的问题 (4b259c3)

        1.8.7 (2023-10-20)

        Bug Fixes

        • 🐛 修复打包多个平台时可能生成重复文件导致发布软件包失败的问题 (e89a7a5)

        1.8.6 (2023-10-20)

        Bug Fixes

        • 🔧 修复 macOS 无法正确获取系统依赖路径的问题 (2352593)

        1.8.5 (2023-10-20)

        Bug Fixes

        • 🚑️ 修复 Linux maintainer 问题 (4e1542a)

        1.8.4 (2023-10-20)

        Bug Fixes

        • 🚑️ 修复 Linux 打包失败的问题 (96f85d8)

        1.8.3 (2023-10-20)

        Bug Fixes

        • 🚀 修复 MacOS 软件包安装后无线显示 Logo 的问题 (77dd81b)

        1.8.2 (2023-10-20)

        Bug Fixes

        • 🔧 修复 Linux 及 MacOS 获取默认依赖路径异常的问题 (87b533f)
        • 🔧 修复 MacOS ARM64 版本打包失败的问题 (e9a8fc2)

        1.8.1 (2023-10-20)

        Performance Improvements

        • 🚀 支持创建更多架构的 MacOS 软件包格式 (4780e7c)

        1.8.0 (2023-10-20)

        Features

        • 🚀 初步添加对 Linux 以及 MacOS 的支持 (569ed2e)

        Bug Fixes

        • 📝 偏好设置描述信息修改 (23d68d4)
        • 🔧 设备列表标签显示细节调整 (4f2f00e)

        Performance Improvements

        • 📝 设备备注文本框描述信息调整 (379b325)

        1.7.1 (2023-10-20)

        Bug Fixes

        • 🚀 修复对设备进行独立配置时的一些问题 (6ccd6d0)

        Performance Improvements

        • 🎉 初步支持设置偏好设置的作用域范围 (5dd328c)

        1.7.0 (2023-10-19)

        Features

        • 🚀 新增支持导入及导出配置 (326a133)
        • 🚀 新增支持添加设备备注 (43f15be)

        Performance Improvements

        • ➕ 设备交互栏添加重启设备及打开通知栏功能 (1341fb8)

        1.6.10 (2023-10-18)

        Performance Improvements

        • 🚀 采用新的方法实现所有进程共享 isPackaged (8a5f7d9)

        1.6.9 (2023-10-17)

        Bug Fixes

        • 🔧 优化 isPackaged 判断条件解决某些情况下资源路径解析异常的问题 (fbd1885)

        1.6.8 (2023-10-17)

        Performance Improvements

        • 🚀 支持通过操作栏安装应用并提供相应安装反馈 (3bd2075)

        1.6.7 (2023-10-17)

        Performance Improvements

        • 📝 去除冗余的依赖项 (a6744dc)

        1.6.6 (2023-10-17)

        Bug Fixes

        • 🐛 build fix (09c8dee)
        • 🐛 修复 electron 资源路径问题 (955756e)

        1.6.5 (2023-10-16)

        Bug Fixes

        • 🐛 修复 App NextTick 错误 (79d85eb)

        1.6.4 (2023-10-16)

        Bug Fixes

        • 🐛 修复 electron-builder 配置异常导致打包的文件无法发布的问题 (9a4efa5)
        • 🚀 修复设备列表按钮状态变更影响布局变化的问题 (83a8043)

        1.6.3 (2023-10-16)

        Bug Fixes

        • 🐛 修复打包后图标丢失的问题 (58a66f1)

        1.6.2 (2023-10-13)

        Bug Fixes

        • 🐛 修复USB未授权设备导致无线连接地址变为假值的问题 (9c25325)

        1.6.1 (2023-10-13)

        Performance Improvements

        • 🔨 自定义通用的文件存储路径相关逻辑完善 (8455e86)

        1.6.0 (2023-10-13)

        Features

        • 🚀 增加了对设备交互控制栏的支持 (fd20736)

        1.5.3 (2023-10-13)

        Bug Fixes

        • 🔧 修复点击无线模式没有反应的问题 (9d55ef9)

        1.5.2 (2023-10-13)

        Bug Fixes

        • 📝 修复高级配置标题语义不明的问题 (218de1c)

        Performance Improvements

        • 🚀 添加更多的高级配置并更新文档 (922abd2)

        1.5.1 (2023-10-12)

        Bug Fixes

        • 🐛 去除页面组件冗余参数 (8e5df15)

        1.5.0 (2023-10-12)

        Features

        • 🚀 添加音视频录制功能以及更多的高级选项 (b6986d1)

        1.4.1 (2023-10-12)

        Bug Fixes

        • 🐛 修复检查更新失败没有提示的问题 (6f733ea)

        1.4.0 (2023-10-11)

        Features

        • 🚀 添加在线检查更新功能 (8de04e0)

        Bug Fixes

        • 🔨 修复无线配对时表单验证错误 (7cd9ea3)
        • 🔨 修复直接进行无线连接时没有处理配对设备的问题 (4263d07)

        1.3.3 (2023-09-26)

        Bug Fixes

        • 🐛 修复触摸点配置描述错误的问题 (4e2be23)

        1.3.2 (2023-09-19)

        Bug Fixes

        • 🔧 修复旋转屏幕配置异常的问题 (af7a319)

        1.3.1 (2023-09-19)

        Bug Fixes

        • 🔧 修复图标不透明的问题 (24c011f)

        1.3.0 (2023-09-19)

        Features

        • ✨ 用户界面进行优化,制作了合适的 Logo (1b96ffc)

        1.2.0 (2023-09-19)

        Features

        • 🎉 优化设备界面视图并添加虚拟控制栏配置 (3be0682)

        1.1.0 (2023-09-18)

        Features

        • 🚀 增加了常用的 Scrcpy 高级配置 (ac52df2)

        1.0.2 (2023-09-18)

        Performance Improvements

        • 🚀 合并无线连接及有线连接到设备列表 (e84f24e)

        1.0.1 (2023-09-16)

        Bug Fixes

        • 🔧 去除未测试环境的打包以修复构建失败的问题 (d6ec7fd)

        1.0.0 (2023-09-16)

        Features

        • 📝 添加基本的有线连接支持 (647a0c5)
        • 🚀 添加 Electron 基本支持 (a46a5e1)
        • 🚀 添加初步的构建及发布支持 (c85f8fb)
        • 🚀 添加基本的无线连接功能 (6dd2db9)

        Bug Fixes

        • 🔧 修复 ADB 环境变量配置错误导致无法连接的问题 (9ef7203)
        ',812)])])}const d=r(i,[["render",c]]);export{m as __pageData,d as default}; diff --git a/assets/zhHans_changelog.md.CNUeKrzR.lean.js b/assets/zhHans_changelog.md.B4oYZ-kH.lean.js similarity index 86% rename from assets/zhHans_changelog.md.CNUeKrzR.lean.js rename to assets/zhHans_changelog.md.B4oYZ-kH.lean.js index 779fc6a4f..9ad70f648 100644 --- a/assets/zhHans_changelog.md.CNUeKrzR.lean.js +++ b/assets/zhHans_changelog.md.B4oYZ-kH.lean.js @@ -1 +1 @@ -import{e as r,o as a,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"更新日志","description":"","frontmatter":{"title":"更新日志"},"headers":[],"relativePath":"zhHans/changelog.md","filePath":"zhHans/changelog.md","lastUpdated":1776916170000}'),i={name:"zhHans/changelog.md"};function c(l,e,n,h,f,b){return a(),t("div",null,[...e[0]||(e[0]=[o("",812)])])}const d=r(i,[["render",c]]);export{m as __pageData,d as default}; +import{e as r,o as a,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"更新日志","description":"","frontmatter":{"title":"更新日志"},"headers":[],"relativePath":"zhHans/changelog.md","filePath":"zhHans/changelog.md","lastUpdated":1777999882000}'),i={name:"zhHans/changelog.md"};function c(l,e,n,h,f,b){return a(),t("div",null,[...e[0]||(e[0]=[o("",812)])])}const d=r(i,[["render",c]]);export{m as __pageData,d as default}; diff --git a/assets/zhHans_contact.md.xXXvTA0i.js b/assets/zhHans_contact.md.Cov6ZTse.js similarity index 91% rename from assets/zhHans_contact.md.xXXvTA0i.js rename to assets/zhHans_contact.md.Cov6ZTse.js index b0c0d1ce6..b626aee25 100644 --- a/assets/zhHans_contact.md.xXXvTA0i.js +++ b/assets/zhHans_contact.md.Cov6ZTse.js @@ -1 +1 @@ -import{e as l,o as n,a as o,h as t,J as e}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"联系我们","description":"","frontmatter":{"title":"联系我们"},"headers":[],"relativePath":"zhHans/contact.md","filePath":"zhHans/contact.md","lastUpdated":1776916170000}'),r={name:"zhHans/contact.md"};function s(c,a,i,d,u,m){return n(),o("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("邮箱: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("微信: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default}; +import{e as l,o as n,a as o,h as t,J as e}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"联系我们","description":"","frontmatter":{"title":"联系我们"},"headers":[],"relativePath":"zhHans/contact.md","filePath":"zhHans/contact.md","lastUpdated":1777999882000}'),r={name:"zhHans/contact.md"};function s(c,a,i,d,u,m){return n(),o("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("邮箱: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("微信: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default}; diff --git a/assets/zhHans_contact.md.xXXvTA0i.lean.js b/assets/zhHans_contact.md.Cov6ZTse.lean.js similarity index 91% rename from assets/zhHans_contact.md.xXXvTA0i.lean.js rename to assets/zhHans_contact.md.Cov6ZTse.lean.js index b0c0d1ce6..b626aee25 100644 --- a/assets/zhHans_contact.md.xXXvTA0i.lean.js +++ b/assets/zhHans_contact.md.Cov6ZTse.lean.js @@ -1 +1 @@ -import{e as l,o as n,a as o,h as t,J as e}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"联系我们","description":"","frontmatter":{"title":"联系我们"},"headers":[],"relativePath":"zhHans/contact.md","filePath":"zhHans/contact.md","lastUpdated":1776916170000}'),r={name:"zhHans/contact.md"};function s(c,a,i,d,u,m){return n(),o("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("邮箱: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("微信: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default}; +import{e as l,o as n,a as o,h as t,J as e}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"联系我们","description":"","frontmatter":{"title":"联系我们"},"headers":[],"relativePath":"zhHans/contact.md","filePath":"zhHans/contact.md","lastUpdated":1777999882000}'),r={name:"zhHans/contact.md"};function s(c,a,i,d,u,m){return n(),o("div",null,[...a[0]||(a[0]=[t("ul",null,[t("li",null,[e("邮箱: "),t("strong",null,[t("a",{href:"mailto:viarotel@qq.com",target:"_blank",rel:"noreferrer"},"viarotel@qq.com")])]),t("li",null,[e("微信: "),t("strong",null,"viarotel")]),t("li",null,[e("QQ: "),t("strong",null,"523469508")])],-1)])])}const _=l(r,[["render",s]]);export{f as __pageData,_ as default}; diff --git a/assets/zhHans_donate.md.dJ_LbUKQ.js b/assets/zhHans_donate.md.HSuoYpEX.js similarity index 95% rename from assets/zhHans_donate.md.dJ_LbUKQ.js rename to assets/zhHans_donate.md.HSuoYpEX.js index 4d8dcd379..484a6b654 100644 --- a/assets/zhHans_donate.md.dJ_LbUKQ.js +++ b/assets/zhHans_donate.md.HSuoYpEX.js @@ -1 +1 @@ -import{e as t,o as a,a as r,ag as l}from"./chunks/framework.D2Fz4Hoy.js";const _=JSON.parse('{"title":"捐赠项目","description":"","frontmatter":{"title":"捐赠项目"},"headers":[],"relativePath":"zhHans/donate.md","filePath":"zhHans/donate.md","lastUpdated":1776916170000}'),s={name:"zhHans/donate.md"};function o(n,e,i,d,p,c){return a(),r("div",null,[...e[0]||(e[0]=[l('

        捐赠项目♥️

        如果该项目帮到你的话,可以请我喝杯咖啡,让我更有精神完善该项目 😛

        viarotel-wepayviarotel-alipayviarotel-paypal
        ',3)])])}const v=t(s,[["render",o]]);export{_ as __pageData,v as default}; +import{e as t,o as a,a as r,ag as l}from"./chunks/framework.D2Fz4Hoy.js";const _=JSON.parse('{"title":"捐赠项目","description":"","frontmatter":{"title":"捐赠项目"},"headers":[],"relativePath":"zhHans/donate.md","filePath":"zhHans/donate.md","lastUpdated":1777999882000}'),s={name:"zhHans/donate.md"};function o(n,e,i,d,p,c){return a(),r("div",null,[...e[0]||(e[0]=[l('

        捐赠项目♥️

        如果该项目帮到你的话,可以请我喝杯咖啡,让我更有精神完善该项目 😛

        viarotel-wepayviarotel-alipayviarotel-paypal
        ',3)])])}const v=t(s,[["render",o]]);export{_ as __pageData,v as default}; diff --git a/assets/zhHans_donate.md.dJ_LbUKQ.lean.js b/assets/zhHans_donate.md.HSuoYpEX.lean.js similarity index 85% rename from assets/zhHans_donate.md.dJ_LbUKQ.lean.js rename to assets/zhHans_donate.md.HSuoYpEX.lean.js index 6da3f01db..cb668c023 100644 --- a/assets/zhHans_donate.md.dJ_LbUKQ.lean.js +++ b/assets/zhHans_donate.md.HSuoYpEX.lean.js @@ -1 +1 @@ -import{e as t,o as a,a as r,ag as l}from"./chunks/framework.D2Fz4Hoy.js";const _=JSON.parse('{"title":"捐赠项目","description":"","frontmatter":{"title":"捐赠项目"},"headers":[],"relativePath":"zhHans/donate.md","filePath":"zhHans/donate.md","lastUpdated":1776916170000}'),s={name:"zhHans/donate.md"};function o(n,e,i,d,p,c){return a(),r("div",null,[...e[0]||(e[0]=[l("",3)])])}const v=t(s,[["render",o]]);export{_ as __pageData,v as default}; +import{e as t,o as a,a as r,ag as l}from"./chunks/framework.D2Fz4Hoy.js";const _=JSON.parse('{"title":"捐赠项目","description":"","frontmatter":{"title":"捐赠项目"},"headers":[],"relativePath":"zhHans/donate.md","filePath":"zhHans/donate.md","lastUpdated":1777999882000}'),s={name:"zhHans/donate.md"};function o(n,e,i,d,p,c){return a(),r("div",null,[...e[0]||(e[0]=[l("",3)])])}const v=t(s,[["render",o]]);export{_ as __pageData,v as default}; diff --git a/assets/zhHans_guide_index.md.C1LSp1z1.js b/assets/zhHans_guide_index.md.C2icwcEL.js similarity index 98% rename from assets/zhHans_guide_index.md.C1LSp1z1.js rename to assets/zhHans_guide_index.md.C2icwcEL.js index 19685e23f..dadc2ba44 100644 --- a/assets/zhHans_guide_index.md.C1LSp1z1.js +++ b/assets/zhHans_guide_index.md.C2icwcEL.js @@ -1 +1 @@ -import{e as l,o as i,a as e,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"指引","description":"","frontmatter":{"title":"指引"},"headers":[],"relativePath":"zhHans/guide/index.md","filePath":"zhHans/guide/index.md","lastUpdated":1776916170000}'),t={name:"zhHans/guide/index.md"};function c(o,a,h,n,s,d){return i(),e("div",null,[...a[0]||(a[0]=[r('

        Escrcpy:基于Electron的图形化安卓设备控制工具

        什么是Escrcpy?

        Escrcpy是一款基于Electron开发的图形化安卓设备控制工具。它基于知名的开源项目Scrcpy构建,为用户提供了更加友好且功能丰富的图形界面。通过Escrcpy,用户可以轻松地在电脑上显示并控制安卓设备,享受高清、低延迟的投屏体验。

        核心功能

        高效稳定的投屏体验

        • ⚡️ 高性能:支持30-120 fps(取决于设备性能)
        • 🌟 高质量:支持1920×1080或更高分辨率显示
        • 🕒 低延迟:延迟仅35~70毫秒
        • 🚀 快速启动:约1秒即可显示首帧画面

        丰富的功能特性

        • 📡 无线连接:支持通过扫码快速连接设备
        • 🤖 自动化:自动连接设备、自动执行投屏、自定义脚本及定时任务
        • 💡 高度可定制:多设备管理、独立配置、自定义备注、配置导入导出
        • 🖥️ 窗口编排:可视化多设备窗口布局管理,支持拖拽调整位置和尺寸
        • 🔗 反向网络共享:内置Gnirehtet反向网络共享功能
        • 🎨 主题切换:支持浅色/深色模式,随系统自动切换

        优化的用户体验

        • 😎 轻量化:原生支持,仅显示设备屏幕
        • 🙅‍♂️ 无残留:不会在安卓设备上留下任何痕迹
        • 🤩 纯净体验:无需账户、无广告、无需联网
        • 🗽 完全免费开源

        使用场景

        Escrcpy非常适合以下场景:

        1. 开发者在电脑上调试安卓应用
        2. 游戏玩家在大屏幕上畅玩手游
        3. 需要录制手机屏幕内容的用户
        4. 工作中需在电脑上操作手机的情况
        5. 教学时演示手机操作

        跨平台支持

        Escrcpy支持主流操作系统:

        • Windows
        • macOS
        • Linux

        技术优势

        作为Scrcpy的图形界面版本,Escrcpy保留了Scrcpy的全部优点,同时新增了:

        • 更直观的设备管理界面
        • 更便捷的连接方式
        • 更丰富的自定义选项
        • 更完善的批量操作功能

        未来发展

        项目团队将持续完善Escrcpy,未来计划包括:

        • 优化投屏窗口位置与大小的设置方式
        • 提升批量设备连接体验
        • 开发图形化脚本编辑工具

        如何使用

        Escrcpy是一个完全免费的开源项目,具体使用方法请参考:

        快速开始 👉

        结语

        Escrcpy为Scrcpy带来了现代化的图形界面和增强功能,让安卓设备控制变得更简单高效。无论你是开发者还是普通用户,Escrcpy都能为你提供出色的设备控制体验。其开源免费的特性,也让更多人能够毫无顾虑地使用这一优秀工具。

        如果你正在寻找一款强大且易用的安卓设备控制工具,Escrcpy绝对值得一试!

        ',28)])])}const b=l(t,[["render",c]]);export{u as __pageData,b as default}; +import{e as l,o as i,a as e,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"指引","description":"","frontmatter":{"title":"指引"},"headers":[],"relativePath":"zhHans/guide/index.md","filePath":"zhHans/guide/index.md","lastUpdated":1777999882000}'),t={name:"zhHans/guide/index.md"};function c(o,a,h,n,s,d){return i(),e("div",null,[...a[0]||(a[0]=[r('

        Escrcpy:基于Electron的图形化安卓设备控制工具

        什么是Escrcpy?

        Escrcpy是一款基于Electron开发的图形化安卓设备控制工具。它基于知名的开源项目Scrcpy构建,为用户提供了更加友好且功能丰富的图形界面。通过Escrcpy,用户可以轻松地在电脑上显示并控制安卓设备,享受高清、低延迟的投屏体验。

        核心功能

        高效稳定的投屏体验

        • ⚡️ 高性能:支持30-120 fps(取决于设备性能)
        • 🌟 高质量:支持1920×1080或更高分辨率显示
        • 🕒 低延迟:延迟仅35~70毫秒
        • 🚀 快速启动:约1秒即可显示首帧画面

        丰富的功能特性

        • 📡 无线连接:支持通过扫码快速连接设备
        • 🤖 自动化:自动连接设备、自动执行投屏、自定义脚本及定时任务
        • 💡 高度可定制:多设备管理、独立配置、自定义备注、配置导入导出
        • 🖥️ 窗口编排:可视化多设备窗口布局管理,支持拖拽调整位置和尺寸
        • 🔗 反向网络共享:内置Gnirehtet反向网络共享功能
        • 🎨 主题切换:支持浅色/深色模式,随系统自动切换

        优化的用户体验

        • 😎 轻量化:原生支持,仅显示设备屏幕
        • 🙅‍♂️ 无残留:不会在安卓设备上留下任何痕迹
        • 🤩 纯净体验:无需账户、无广告、无需联网
        • 🗽 完全免费开源

        使用场景

        Escrcpy非常适合以下场景:

        1. 开发者在电脑上调试安卓应用
        2. 游戏玩家在大屏幕上畅玩手游
        3. 需要录制手机屏幕内容的用户
        4. 工作中需在电脑上操作手机的情况
        5. 教学时演示手机操作

        跨平台支持

        Escrcpy支持主流操作系统:

        • Windows
        • macOS
        • Linux

        技术优势

        作为Scrcpy的图形界面版本,Escrcpy保留了Scrcpy的全部优点,同时新增了:

        • 更直观的设备管理界面
        • 更便捷的连接方式
        • 更丰富的自定义选项
        • 更完善的批量操作功能

        未来发展

        项目团队将持续完善Escrcpy,未来计划包括:

        • 优化投屏窗口位置与大小的设置方式
        • 提升批量设备连接体验
        • 开发图形化脚本编辑工具

        如何使用

        Escrcpy是一个完全免费的开源项目,具体使用方法请参考:

        快速开始 👉

        结语

        Escrcpy为Scrcpy带来了现代化的图形界面和增强功能,让安卓设备控制变得更简单高效。无论你是开发者还是普通用户,Escrcpy都能为你提供出色的设备控制体验。其开源免费的特性,也让更多人能够毫无顾虑地使用这一优秀工具。

        如果你正在寻找一款强大且易用的安卓设备控制工具,Escrcpy绝对值得一试!

        ',28)])])}const b=l(t,[["render",c]]);export{u as __pageData,b as default}; diff --git a/assets/zhHans_guide_index.md.C1LSp1z1.lean.js b/assets/zhHans_guide_index.md.C2icwcEL.lean.js similarity index 85% rename from assets/zhHans_guide_index.md.C1LSp1z1.lean.js rename to assets/zhHans_guide_index.md.C2icwcEL.lean.js index 110fa3b0c..1f73ba621 100644 --- a/assets/zhHans_guide_index.md.C1LSp1z1.lean.js +++ b/assets/zhHans_guide_index.md.C2icwcEL.lean.js @@ -1 +1 @@ -import{e as l,o as i,a as e,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"指引","description":"","frontmatter":{"title":"指引"},"headers":[],"relativePath":"zhHans/guide/index.md","filePath":"zhHans/guide/index.md","lastUpdated":1776916170000}'),t={name:"zhHans/guide/index.md"};function c(o,a,h,n,s,d){return i(),e("div",null,[...a[0]||(a[0]=[r("",28)])])}const b=l(t,[["render",c]]);export{u as __pageData,b as default}; +import{e as l,o as i,a as e,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"指引","description":"","frontmatter":{"title":"指引"},"headers":[],"relativePath":"zhHans/guide/index.md","filePath":"zhHans/guide/index.md","lastUpdated":1777999882000}'),t={name:"zhHans/guide/index.md"};function c(o,a,h,n,s,d){return i(),e("div",null,[...a[0]||(a[0]=[r("",28)])])}const b=l(t,[["render",c]]);export{u as __pageData,b as default}; diff --git a/assets/zhHans_guide_milestones.md.CHbxTkDr.js b/assets/zhHans_guide_milestones.md.BgHjzWdL.js similarity index 97% rename from assets/zhHans_guide_milestones.md.CHbxTkDr.js rename to assets/zhHans_guide_milestones.md.BgHjzWdL.js index cdc5ada77..61ab815d6 100644 --- a/assets/zhHans_guide_milestones.md.CHbxTkDr.js +++ b/assets/zhHans_guide_milestones.md.BgHjzWdL.js @@ -1 +1 @@ -import{e as l,o as e,a as t,ag as a}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"里程碑","description":"","frontmatter":{"title":"里程碑"},"headers":[],"relativePath":"zhHans/guide/milestones.md","filePath":"zhHans/guide/milestones.md","lastUpdated":1776916170000}'),s={name:"zhHans/guide/milestones.md"};function o(n,i,r,d,_,c){return e(),t("div",null,[...i[0]||(i[0]=[a('

        里程碑

        优先级从高到低:

        • 优化Logo设计 ✅
        • 软件更新功能 ✅
        • 录制并保存音视频 ✅
        • 设备快捷交互控制栏 ✅
        • 自定义Adb和Scrcpy依赖项 ✅
        • 自定义设备名称 ✅
        • 导出和导入偏好设置 ✅
        • 单独设备配置 ✅
        • 支持macOS和Linux系统 ✅
        • 国际化支持 ✅
        • 深色模式 ✅
        • 反向网络共享(Gnirehtet)✅
        • 摄像头镜像 ✅
        • 多屏协同 ✅
        • 文件推送、屏幕旋转、音频控制 ✅
        • 批量连接历史设备 ✅
        • 内置终端 ✅
        • 自动执行镜像 ✅
        • 灵活启动镜像 ✅
        • 批量处理 ✅
        • 计划任务 ✅
        • 图形化文件管理器 ✅
        • 悬浮控制栏 ✅
        • 增强版录制功能 ✅
        • 启动APP(多线程) ✅
        • 主窗口边缘隐藏 ✅
        • 设备分组(通过备注筛选) ✅
        • 改进历史设备连接体验 ✅
        • 文件管理支持上传目录 ✅
        • 支持添加打开APP到桌面快捷方式(仅Windows) ✅
        • 支持设备批量启动 ✅
        • 支持通过可视化编排工具控制各设备的窗口布局 ✅
        • 整合同一设备的不同连接方式和配置,提升用户体验 ✅
        • 增强设备文件管理器 ✅
        • 集成 AutoGLM 无需脚本使用自然语言控制你的安卓设备 ✅
        • 重构主进程架构,提升性能和稳定性 ✅
        • 通过可视化编排工具支持脚本的自动化 ✅
        • 设备群控功能 ✅
        • 键盘映射功能 🚧
        ',3)])])}const u=l(s,[["render",o]]);export{p as __pageData,u as default}; +import{e as l,o as e,a as t,ag as a}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"里程碑","description":"","frontmatter":{"title":"里程碑"},"headers":[],"relativePath":"zhHans/guide/milestones.md","filePath":"zhHans/guide/milestones.md","lastUpdated":1777999882000}'),s={name:"zhHans/guide/milestones.md"};function o(n,i,r,d,_,c){return e(),t("div",null,[...i[0]||(i[0]=[a('

        里程碑

        优先级从高到低:

        • 优化Logo设计 ✅
        • 软件更新功能 ✅
        • 录制并保存音视频 ✅
        • 设备快捷交互控制栏 ✅
        • 自定义Adb和Scrcpy依赖项 ✅
        • 自定义设备名称 ✅
        • 导出和导入偏好设置 ✅
        • 单独设备配置 ✅
        • 支持macOS和Linux系统 ✅
        • 国际化支持 ✅
        • 深色模式 ✅
        • 反向网络共享(Gnirehtet)✅
        • 摄像头镜像 ✅
        • 多屏协同 ✅
        • 文件推送、屏幕旋转、音频控制 ✅
        • 批量连接历史设备 ✅
        • 内置终端 ✅
        • 自动执行镜像 ✅
        • 灵活启动镜像 ✅
        • 批量处理 ✅
        • 计划任务 ✅
        • 图形化文件管理器 ✅
        • 悬浮控制栏 ✅
        • 增强版录制功能 ✅
        • 启动APP(多线程) ✅
        • 主窗口边缘隐藏 ✅
        • 设备分组(通过备注筛选) ✅
        • 改进历史设备连接体验 ✅
        • 文件管理支持上传目录 ✅
        • 支持添加打开APP到桌面快捷方式(仅Windows) ✅
        • 支持设备批量启动 ✅
        • 支持通过可视化编排工具控制各设备的窗口布局 ✅
        • 整合同一设备的不同连接方式和配置,提升用户体验 ✅
        • 增强设备文件管理器 ✅
        • 集成 AutoGLM 无需脚本使用自然语言控制你的安卓设备 ✅
        • 重构主进程架构,提升性能和稳定性 ✅
        • 通过可视化编排工具支持脚本的自动化 ✅
        • 设备群控功能 ✅
        • 键盘映射功能 🚧
        ',3)])])}const u=l(s,[["render",o]]);export{p as __pageData,u as default}; diff --git a/assets/zhHans_guide_milestones.md.CHbxTkDr.lean.js b/assets/zhHans_guide_milestones.md.BgHjzWdL.lean.js similarity index 86% rename from assets/zhHans_guide_milestones.md.CHbxTkDr.lean.js rename to assets/zhHans_guide_milestones.md.BgHjzWdL.lean.js index ba3a66a45..8a25a1157 100644 --- a/assets/zhHans_guide_milestones.md.CHbxTkDr.lean.js +++ b/assets/zhHans_guide_milestones.md.BgHjzWdL.lean.js @@ -1 +1 @@ -import{e as l,o as e,a as t,ag as a}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"里程碑","description":"","frontmatter":{"title":"里程碑"},"headers":[],"relativePath":"zhHans/guide/milestones.md","filePath":"zhHans/guide/milestones.md","lastUpdated":1776916170000}'),s={name:"zhHans/guide/milestones.md"};function o(n,i,r,d,_,c){return e(),t("div",null,[...i[0]||(i[0]=[a("",3)])])}const u=l(s,[["render",o]]);export{p as __pageData,u as default}; +import{e as l,o as e,a as t,ag as a}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"里程碑","description":"","frontmatter":{"title":"里程碑"},"headers":[],"relativePath":"zhHans/guide/milestones.md","filePath":"zhHans/guide/milestones.md","lastUpdated":1777999882000}'),s={name:"zhHans/guide/milestones.md"};function o(n,i,r,d,_,c){return e(),t("div",null,[...i[0]||(i[0]=[a("",3)])])}const u=l(s,[["render",o]]);export{p as __pageData,u as default}; diff --git a/assets/zhHans_guide_operation.md.D1aZ_uQw.js b/assets/zhHans_guide_operation.md.BC_KoM-_.js similarity index 96% rename from assets/zhHans_guide_operation.md.D1aZ_uQw.js rename to assets/zhHans_guide_operation.md.BC_KoM-_.js index 48cbb23c7..aefbbf6c2 100644 --- a/assets/zhHans_guide_operation.md.D1aZ_uQw.js +++ b/assets/zhHans_guide_operation.md.BC_KoM-_.js @@ -1 +1 @@ -import{e as l,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const _=JSON.parse('{"title":"操作指南","description":"","frontmatter":{"title":"操作指南"},"headers":[],"relativePath":"zhHans/guide/operation.md","filePath":"zhHans/guide/operation.md","lastUpdated":1776916170000}'),r={name:"zhHans/guide/operation.md"};function o(n,i,s,d,h,u){return a(),e("div",null,[...i[0]||(i[0]=[t('

        设备操作指南

        批量处理

        • 批量镜像
        • 批量截屏
        • 批量安装应用
        • 批量文件管理
        • 批量执行脚本
        • 批量计划任务

        控制模式

        • 镜像模式
        • 录制模式
        • 摄像头录制
        • 音频录制
        • 摄像头
        • 自定义模式
        • OTG模式

        设备交互栏

        • 自动操控(AutoGLM)
        • 切换应用
        • 返回主页
        • 返回键
        • 启动APP(镜像组)
        • 关闭屏幕(实验性功能)
        • 通知中心
        • 电源键
        • 屏幕旋转
        • 音量控制
        • 截图
        • 重启设备
        • 安装APP
        • 文件管理器
        • 执行脚本
        • 计划任务
        • Gnirehtet(反向网络共享)
        ',7)])])}const p=l(r,[["render",o]]);export{_ as __pageData,p as default}; +import{e as l,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const _=JSON.parse('{"title":"操作指南","description":"","frontmatter":{"title":"操作指南"},"headers":[],"relativePath":"zhHans/guide/operation.md","filePath":"zhHans/guide/operation.md","lastUpdated":1777999882000}'),r={name:"zhHans/guide/operation.md"};function o(n,i,s,d,h,u){return a(),e("div",null,[...i[0]||(i[0]=[t('

        设备操作指南

        批量处理

        • 批量镜像
        • 批量截屏
        • 批量安装应用
        • 批量文件管理
        • 批量执行脚本
        • 批量计划任务

        控制模式

        • 镜像模式
        • 录制模式
        • 摄像头录制
        • 音频录制
        • 摄像头
        • 自定义模式
        • OTG模式

        设备交互栏

        • 自动操控(AutoGLM)
        • 切换应用
        • 返回主页
        • 返回键
        • 启动APP(镜像组)
        • 关闭屏幕(实验性功能)
        • 通知中心
        • 电源键
        • 屏幕旋转
        • 音量控制
        • 截图
        • 重启设备
        • 安装APP
        • 文件管理器
        • 执行脚本
        • 计划任务
        • Gnirehtet(反向网络共享)
        ',7)])])}const p=l(r,[["render",o]]);export{_ as __pageData,p as default}; diff --git a/assets/zhHans_guide_operation.md.D1aZ_uQw.lean.js b/assets/zhHans_guide_operation.md.BC_KoM-_.lean.js similarity index 86% rename from assets/zhHans_guide_operation.md.D1aZ_uQw.lean.js rename to assets/zhHans_guide_operation.md.BC_KoM-_.lean.js index f84926ec9..ec1b89f9f 100644 --- a/assets/zhHans_guide_operation.md.D1aZ_uQw.lean.js +++ b/assets/zhHans_guide_operation.md.BC_KoM-_.lean.js @@ -1 +1 @@ -import{e as l,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const _=JSON.parse('{"title":"操作指南","description":"","frontmatter":{"title":"操作指南"},"headers":[],"relativePath":"zhHans/guide/operation.md","filePath":"zhHans/guide/operation.md","lastUpdated":1776916170000}'),r={name:"zhHans/guide/operation.md"};function o(n,i,s,d,h,u){return a(),e("div",null,[...i[0]||(i[0]=[t("",7)])])}const p=l(r,[["render",o]]);export{_ as __pageData,p as default}; +import{e as l,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const _=JSON.parse('{"title":"操作指南","description":"","frontmatter":{"title":"操作指南"},"headers":[],"relativePath":"zhHans/guide/operation.md","filePath":"zhHans/guide/operation.md","lastUpdated":1777999882000}'),r={name:"zhHans/guide/operation.md"};function o(n,i,s,d,h,u){return a(),e("div",null,[...i[0]||(i[0]=[t("",7)])])}const p=l(r,[["render",o]]);export{_ as __pageData,p as default}; diff --git a/assets/zhHans_guide_preferences.md.DUWEj5Mz.js b/assets/zhHans_guide_preferences.md.BJwzq8b7.js similarity index 98% rename from assets/zhHans_guide_preferences.md.DUWEj5Mz.js rename to assets/zhHans_guide_preferences.md.BJwzq8b7.js index 9fb26f52a..c66ee4be5 100644 --- a/assets/zhHans_guide_preferences.md.DUWEj5Mz.js +++ b/assets/zhHans_guide_preferences.md.BJwzq8b7.js @@ -1 +1 @@ -import{e as i,o as a,a as e,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"偏好设置","description":"","frontmatter":{"title":"偏好设置"},"headers":[],"relativePath":"zhHans/guide/preferences.md","filePath":"zhHans/guide/preferences.md","lastUpdated":1776916170000}'),t={name:"zhHans/guide/preferences.md"};function o(h,l,n,d,s,u){return a(),e("div",null,[...l[0]||(l[0]=[r('

        偏好设置

        持续完善中,目前已支持以下常用配置项

        通用设置

        • 主题风格
        • 语言选择
        • 文件存储路径
        • ADB路径
        • Scrcpy路径
        • Gnirehtet路径
        • Scrcpy参数
        • Gnirehtet参数
        • 自动连接设备
        • 自动执行镜像
        • Gnirehtet修复
        • 调试模式
        • 悬浮控制栏
        • 使用系统终端
        • 首选终端
        • 并发上限

        视频控制

        • 禁用视频传输
        • 最大分辨率
        • 视频比特率
        • 刷新频率
        • 视频编解码器
        • 显示方向
        • 旋转角度
        • 屏幕裁剪
        • 显示器选择
        • 视频缓冲区
        • 接收端(v4l2)缓冲区

        设备控制

        • 显示触摸点
        • 保持唤醒状态
        • 控制时关闭屏幕
        • 控制结束后关闭屏幕
        • 禁用控制时自动亮屏
        • 模拟辅助显示器

        窗口控制

        • 窗口宽度
        • 窗口高度
        • 窗口X坐标
        • 窗口Y坐标
        • 无边框模式
        • 全屏模式
        • 窗口置顶
        • 禁用屏幕保护

        音频控制

        • 禁用音频传输
        • 保留设备音频
        • 音频源选择
        • 音频编解码器
        • 音频比特率
        • 音频缓冲区
        • 音频输出缓冲区

        音视频录制

        • 录制视频格式
        • 录制视频方向
        • 录制时长
        • 禁用视频回放
        • 禁用音频回放

        输入控制

        • 鼠标模式
        • 鼠标绑定
        • 键盘模式
        • 键盘注入方式
        • 游戏手柄设置

        摄像头控制

        • 摄像头源选择
        • 摄像头尺寸
        • 摄像头比例
        • 摄像头帧率
        ',18)])])}const p=i(t,[["render",o]]);export{f as __pageData,p as default}; +import{e as i,o as a,a as e,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"偏好设置","description":"","frontmatter":{"title":"偏好设置"},"headers":[],"relativePath":"zhHans/guide/preferences.md","filePath":"zhHans/guide/preferences.md","lastUpdated":1777999882000}'),t={name:"zhHans/guide/preferences.md"};function o(h,l,n,d,s,u){return a(),e("div",null,[...l[0]||(l[0]=[r('

        偏好设置

        持续完善中,目前已支持以下常用配置项

        通用设置

        • 主题风格
        • 语言选择
        • 文件存储路径
        • ADB路径
        • Scrcpy路径
        • Gnirehtet路径
        • Scrcpy参数
        • Gnirehtet参数
        • 自动连接设备
        • 自动执行镜像
        • Gnirehtet修复
        • 调试模式
        • 悬浮控制栏
        • 使用系统终端
        • 首选终端
        • 并发上限

        视频控制

        • 禁用视频传输
        • 最大分辨率
        • 视频比特率
        • 刷新频率
        • 视频编解码器
        • 显示方向
        • 旋转角度
        • 屏幕裁剪
        • 显示器选择
        • 视频缓冲区
        • 接收端(v4l2)缓冲区

        设备控制

        • 显示触摸点
        • 保持唤醒状态
        • 控制时关闭屏幕
        • 控制结束后关闭屏幕
        • 禁用控制时自动亮屏
        • 模拟辅助显示器

        窗口控制

        • 窗口宽度
        • 窗口高度
        • 窗口X坐标
        • 窗口Y坐标
        • 无边框模式
        • 全屏模式
        • 窗口置顶
        • 禁用屏幕保护

        音频控制

        • 禁用音频传输
        • 保留设备音频
        • 音频源选择
        • 音频编解码器
        • 音频比特率
        • 音频缓冲区
        • 音频输出缓冲区

        音视频录制

        • 录制视频格式
        • 录制视频方向
        • 录制时长
        • 禁用视频回放
        • 禁用音频回放

        输入控制

        • 鼠标模式
        • 鼠标绑定
        • 键盘模式
        • 键盘注入方式
        • 游戏手柄设置

        摄像头控制

        • 摄像头源选择
        • 摄像头尺寸
        • 摄像头比例
        • 摄像头帧率
        ',18)])])}const p=i(t,[["render",o]]);export{f as __pageData,p as default}; diff --git a/assets/zhHans_guide_preferences.md.DUWEj5Mz.lean.js b/assets/zhHans_guide_preferences.md.BJwzq8b7.lean.js similarity index 86% rename from assets/zhHans_guide_preferences.md.DUWEj5Mz.lean.js rename to assets/zhHans_guide_preferences.md.BJwzq8b7.lean.js index 58f0d8520..1e27f2d18 100644 --- a/assets/zhHans_guide_preferences.md.DUWEj5Mz.lean.js +++ b/assets/zhHans_guide_preferences.md.BJwzq8b7.lean.js @@ -1 +1 @@ -import{e as i,o as a,a as e,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"偏好设置","description":"","frontmatter":{"title":"偏好设置"},"headers":[],"relativePath":"zhHans/guide/preferences.md","filePath":"zhHans/guide/preferences.md","lastUpdated":1776916170000}'),t={name:"zhHans/guide/preferences.md"};function o(h,l,n,d,s,u){return a(),e("div",null,[...l[0]||(l[0]=[r("",18)])])}const p=i(t,[["render",o]]);export{f as __pageData,p as default}; +import{e as i,o as a,a as e,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const f=JSON.parse('{"title":"偏好设置","description":"","frontmatter":{"title":"偏好设置"},"headers":[],"relativePath":"zhHans/guide/preferences.md","filePath":"zhHans/guide/preferences.md","lastUpdated":1777999882000}'),t={name:"zhHans/guide/preferences.md"};function o(h,l,n,d,s,u){return a(),e("div",null,[...l[0]||(l[0]=[r("",18)])])}const p=i(t,[["render",o]]);export{f as __pageData,p as default}; diff --git a/assets/zhHans_guide_started.md.DBz1FX_y.js b/assets/zhHans_guide_started.md.DBz1FX_y.js new file mode 100644 index 000000000..051c48d68 --- /dev/null +++ b/assets/zhHans_guide_started.md.DBz1FX_y.js @@ -0,0 +1 @@ +import{e as r,o as a,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"快速上手","description":"","frontmatter":{"title":"快速上手"},"headers":[],"relativePath":"zhHans/guide/started.md","filePath":"zhHans/guide/started.md","lastUpdated":1777999882000}'),l={name:"zhHans/guide/started.md"};function i(c,e,h,n,s,u){return a(),t("div",null,[...e[0]||(e[0]=[o('

        快速上手

        安装说明

        手动安装(通过发行包)

        macOS用户可通过Homebrew安装

        详见 homebrew-escrcpy

        USB连接方式

        注意:若手机弹出调试授权提示,请点击允许

        1. 在安卓设备上启用开发者模式USB调试功能
        2. 启动Escrcpy并将安卓设备通过USB连接电脑
        3. Escrcpy设备列表应已检测到您的设备,点击"开始镜像"
        4. 开始使用!

        无线连接方式

        扫码连接

        1. 先完成USB连接方式的步骤1-2
        2. 在开发者选项中启用并进入"无线调试"
        3. 点击"通过二维码配对设备"
        4. 开始使用!

        IP地址连接

        注意:若首次无线连接失败,可能需先进行无线配对,详见常见问题

        注意:需在无线调试页面获取设备无线地址(通常为连接WiFi时分配的IP地址)和端口号(默认为5555)

        1. 先完成USB连接方式的步骤1-2
        2. 在Escrcpy中输入设备IP地址和端口号,点击"连接设备"
        3. 此时设备列表应显示您的手机,点击"开始镜像"
        4. 开始使用!

        macOS与Linux平台

        注意:这些平台未预装Scrcpy,需手动安装

        Escrcpy@1.27.1+版本已初步集成scrcpy二进制文件,无需手动安装

        1. Linux用户参考安装文档
        2. macOS用户参考安装文档
        3. 依赖安装成功后,按照USB连接或无线连接的步骤操作即可

        Gnirehtet反向网络共享

        Windows和Linux应用已内置Gnirehtet功能,可实现PC到安卓设备的网络共享。

        设备连接成功后,通过设备->设备控制栏->Gnirehtet启用反向网络功能。

        注意:macOS版本未内置Gnirehtet,需手动安装才能使用该功能安装指南

        ',23)])])}const b=r(l,[["render",i]]);export{p as __pageData,b as default}; diff --git a/assets/zhHans_guide_started.md.DBz1FX_y.lean.js b/assets/zhHans_guide_started.md.DBz1FX_y.lean.js new file mode 100644 index 000000000..b89f17f62 --- /dev/null +++ b/assets/zhHans_guide_started.md.DBz1FX_y.lean.js @@ -0,0 +1 @@ +import{e as r,o as a,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"快速上手","description":"","frontmatter":{"title":"快速上手"},"headers":[],"relativePath":"zhHans/guide/started.md","filePath":"zhHans/guide/started.md","lastUpdated":1777999882000}'),l={name:"zhHans/guide/started.md"};function i(c,e,h,n,s,u){return a(),t("div",null,[...e[0]||(e[0]=[o("",23)])])}const b=r(l,[["render",i]]);export{p as __pageData,b as default}; diff --git a/assets/zhHans_guide_started.md.dewAws4q.js b/assets/zhHans_guide_started.md.dewAws4q.js deleted file mode 100644 index 0d98d4809..000000000 --- a/assets/zhHans_guide_started.md.dewAws4q.js +++ /dev/null @@ -1 +0,0 @@ -import{e as a,o as r,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"快速上手","description":"","frontmatter":{"title":"快速上手"},"headers":[],"relativePath":"zhHans/guide/started.md","filePath":"zhHans/guide/started.md","lastUpdated":1776916170000}'),l={name:"zhHans/guide/started.md"};function i(c,e,h,n,s,u){return r(),t("div",null,[...e[0]||(e[0]=[o('

        快速上手

        安装说明

        手动安装(通过发行包)

        macOS用户可通过Homebrew安装

        详见 homebrew-escrcpy

        USB连接方式

        注意:若手机弹出调试授权提示,请点击允许

        1. 在安卓设备上启用开发者模式USB调试功能
        2. 启动Escrcpy并将安卓设备通过USB连接电脑
        3. Escrcpy设备列表应已检测到您的设备,点击"开始镜像"
        4. 开始使用!

        无线连接方式

        扫码连接

        1. 先完成USB连接方式的步骤1-2
        2. 在开发者选项中启用并进入"无线调试"
        3. 点击"通过二维码配对设备"
        4. 开始使用!

        IP地址连接

        注意:若首次无线连接失败,可能需先进行无线配对,详见常见问题

        注意:需在无线调试页面获取设备无线地址(通常为连接WiFi时分配的IP地址)和端口号(默认为5555)

        1. 先完成USB连接方式的步骤1-2
        2. 在Escrcpy中输入设备IP地址和端口号,点击"连接设备"
        3. 此时设备列表应显示您的手机,点击"开始镜像"
        4. 开始使用!

        macOS与Linux平台

        注意:这些平台未预装Scrcpy,需手动安装

        Escrcpy@1.27.1+版本已初步集成scrcpy二进制文件,无需手动安装

        1. Linux用户参考安装文档
        2. macOS用户参考安装文档
        3. 依赖安装成功后,按照USB连接或无线连接的步骤操作即可

        Gnirehtet反向网络共享

        Windows和Linux应用已内置Gnirehtet功能,可实现PC到安卓设备的网络共享。

        设备连接成功后,通过设备->设备控制栏->Gnirehtet启用反向网络功能。

        注意:macOS版本未内置Gnirehtet,需手动安装才能使用该功能安装指南

        ',23)])])}const b=a(l,[["render",i]]);export{p as __pageData,b as default}; diff --git a/assets/zhHans_guide_started.md.dewAws4q.lean.js b/assets/zhHans_guide_started.md.dewAws4q.lean.js deleted file mode 100644 index 5b805dc57..000000000 --- a/assets/zhHans_guide_started.md.dewAws4q.lean.js +++ /dev/null @@ -1 +0,0 @@ -import{e as a,o as r,a as t,ag as o}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"快速上手","description":"","frontmatter":{"title":"快速上手"},"headers":[],"relativePath":"zhHans/guide/started.md","filePath":"zhHans/guide/started.md","lastUpdated":1776916170000}'),l={name:"zhHans/guide/started.md"};function i(c,e,h,n,s,u){return r(),t("div",null,[...e[0]||(e[0]=[o("",23)])])}const b=a(l,[["render",i]]);export{p as __pageData,b as default}; diff --git a/assets/zhHans_guide_window-arrangement.md.BfDLUcqn.js b/assets/zhHans_guide_window-arrangement.md.DXIswo8V.js similarity index 99% rename from assets/zhHans_guide_window-arrangement.md.BfDLUcqn.js rename to assets/zhHans_guide_window-arrangement.md.DXIswo8V.js index ec6de023a..037fd131b 100644 --- a/assets/zhHans_guide_window-arrangement.md.BfDLUcqn.js +++ b/assets/zhHans_guide_window-arrangement.md.DXIswo8V.js @@ -1 +1 @@ -import{e as a,o as i,a as o,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"窗口编排","description":"","frontmatter":{"title":"窗口编排"},"headers":[],"relativePath":"zhHans/guide/window-arrangement.md","filePath":"zhHans/guide/window-arrangement.md","lastUpdated":1776916170000}'),t={name:"zhHans/guide/window-arrangement.md"};function e(n,l,s,h,d,u){return i(),o("div",null,[...l[0]||(l[0]=[r('

        设备窗口编排功能详解

        设备窗口编排是 Escrcpy 的高级功能之一,专为多设备管理和屏幕空间优化而设计。通过可视化的拖拽界面,您可以精确控制每个设备窗口的位置、大小和布局,实现高效的多设备协同操作。

        功能概述

        窗口编排功能提供了一个全屏的可视化编辑界面,让您能够:

        • 同时管理多个设备窗口的布局
        • 通过拖拽方式调整窗口位置和尺寸
        • 设置全局默认配置和设备特定配置
        • 实时预览窗口布局效果
        • 保存和加载自定义布局方案

        核心组件

        全局配置组件

        全局配置组件用于设置所有设备的默认窗口参数,包括:

        • 默认窗口宽度和高度
        • 默认窗口位置坐标
        • 其他通用窗口属性

        设备窗口组件

        每个连接的设备都可以添加为独立的窗口组件,支持:

        • 独立的位置和尺寸设置
        • 设备特定的窗口配置
        • 继承或覆盖全局配置

        详细操作指南

        启动窗口编排

        1. 通过主界面启动
          • 在主界面右上角找到"窗口编排"按钮
          • 点击该按钮进入窗口编排界面
          • 系统将打开全屏的窗口编排界面

        添加和管理组件

        添加全局配置组件

        1. 点击"添加组件"下拉按钮
        2. 选择"全局配置"选项
        3. 全局配置组件将出现在编排区域
        4. 该组件用于设置所有设备的默认参数

        注意:每个编排方案中只能有一个全局配置组件。

        添加设备窗口组件

        1. 点击"添加组件"下拉按钮
        2. 从设备列表中选择要添加的设备
        3. 设备窗口组件将添加到编排区域
        4. 每个设备只能添加一次

        设备显示规则

        • 只显示当前已连接的设备
        • 已添加的设备不会在下拉列表中重复显示
        • 设备名称优先显示自定义名称,其次为设备型号

        窗口布局调整

        移动窗口位置

        1. 选择目标窗口:点击要移动的窗口组件
        2. 拖拽移动:按住鼠标左键拖拽窗口到目标位置
        3. 实时反馈:拖拽过程中可以看到实时的位置变化
        4. 释放定位:松开鼠标完成位置调整

        调整窗口尺寸

        1. 定位调整点:将鼠标移动到窗口的边角位置
        2. 拖拽调整:按住鼠标左键拖拽来改变窗口大小
        3. 比例约束:系统会自动维持合理的窗口比例
        4. 最小尺寸限制:窗口不能小于预设的最小尺寸

        尺寸限制说明

        • 最小宽度:容器宽度的 1/6
        • 最小高度:容器高度的 1/4
        • 边界约束:窗口不能拖拽到编排区域外部
        • 重叠处理:允许窗口重叠,但建议避免完全遮挡

        布局管理操作

        重置布局

        1. 点击控制面板中的"重置布局"按钮
        2. 系统将清除当前所有组件
        3. 重新加载保存的布局配置
        4. 如果没有保存的配置,将显示空白编排区域

        清除全部组件

        1. 点击"清除全部"按钮
        2. 系统将弹出确认对话框
        3. 确认后将移除所有窗口组件
        4. 编排区域将变为空白状态

        删除单个组件

        1. 将鼠标悬停在目标窗口组件上
        2. 点击窗口右上角的删除按钮(×)
        3. 该组件将立即从编排区域移除
        4. 对应的设备将重新出现在可添加列表中

        配置保存和应用

        保存布局配置

        1. 完成布局调整:确保所有窗口组件都已调整到满意的位置和尺寸
        2. 点击保存按钮:点击界面底部的"保存布局"按钮
        3. 配置写入:系统将当前布局信息写入配置文件
        4. 成功反馈:显示保存成功的消息提示

        配置存储机制

        • 全局配置:存储在 scrcpy.global 配置节点
        • 设备配置:存储在 scrcpy.[设备ID] 配置节点
        • 参数格式
          • --window-width:窗口宽度
          • --window-height:窗口高度
          • --window-x:窗口X坐标
          • --window-y:窗口Y坐标

        配置应用时机

        • 启动镜像时:设备开始镜像时自动应用对应的窗口配置
        • 配置继承:设备特定配置优先,未设置的参数继承全局配置
        • 动态更新:保存配置后立即生效,无需重启应用

        故障排除

        常见问题

        问题1:设备不显示在添加列表中

        • 确认设备已正确连接
        • 检查设备是否已经添加到编排中
        • 尝试刷新设备列表

        问题2:窗口拖拽不响应

        • 确认鼠标点击在窗口的可拖拽区域
        • 检查是否有其他程序占用鼠标事件
        • 尝试重新打开编排界面

        问题3:保存的布局没有生效

        • 确认点击了"保存布局"按钮
        • 检查配置文件是否有写入权限
        • 尝试重启应用后再次测试

        问题4:窗口尺寸异常

        • 检查是否超出了最小尺寸限制
        • 确认显示器分辨率设置正确
        • 尝试重置布局后重新配置

        通过合理使用窗口编排功能,您可以显著提高多设备管理的效率,创建适合自己工作流程的个性化操作环境。

        ',55)])])}const q=a(t,[["render",e]]);export{g as __pageData,q as default}; +import{e as a,o as i,a as o,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"窗口编排","description":"","frontmatter":{"title":"窗口编排"},"headers":[],"relativePath":"zhHans/guide/window-arrangement.md","filePath":"zhHans/guide/window-arrangement.md","lastUpdated":1777999882000}'),t={name:"zhHans/guide/window-arrangement.md"};function e(n,l,s,h,d,u){return i(),o("div",null,[...l[0]||(l[0]=[r('

        设备窗口编排功能详解

        设备窗口编排是 Escrcpy 的高级功能之一,专为多设备管理和屏幕空间优化而设计。通过可视化的拖拽界面,您可以精确控制每个设备窗口的位置、大小和布局,实现高效的多设备协同操作。

        功能概述

        窗口编排功能提供了一个全屏的可视化编辑界面,让您能够:

        • 同时管理多个设备窗口的布局
        • 通过拖拽方式调整窗口位置和尺寸
        • 设置全局默认配置和设备特定配置
        • 实时预览窗口布局效果
        • 保存和加载自定义布局方案

        核心组件

        全局配置组件

        全局配置组件用于设置所有设备的默认窗口参数,包括:

        • 默认窗口宽度和高度
        • 默认窗口位置坐标
        • 其他通用窗口属性

        设备窗口组件

        每个连接的设备都可以添加为独立的窗口组件,支持:

        • 独立的位置和尺寸设置
        • 设备特定的窗口配置
        • 继承或覆盖全局配置

        详细操作指南

        启动窗口编排

        1. 通过主界面启动
          • 在主界面右上角找到"窗口编排"按钮
          • 点击该按钮进入窗口编排界面
          • 系统将打开全屏的窗口编排界面

        添加和管理组件

        添加全局配置组件

        1. 点击"添加组件"下拉按钮
        2. 选择"全局配置"选项
        3. 全局配置组件将出现在编排区域
        4. 该组件用于设置所有设备的默认参数

        注意:每个编排方案中只能有一个全局配置组件。

        添加设备窗口组件

        1. 点击"添加组件"下拉按钮
        2. 从设备列表中选择要添加的设备
        3. 设备窗口组件将添加到编排区域
        4. 每个设备只能添加一次

        设备显示规则

        • 只显示当前已连接的设备
        • 已添加的设备不会在下拉列表中重复显示
        • 设备名称优先显示自定义名称,其次为设备型号

        窗口布局调整

        移动窗口位置

        1. 选择目标窗口:点击要移动的窗口组件
        2. 拖拽移动:按住鼠标左键拖拽窗口到目标位置
        3. 实时反馈:拖拽过程中可以看到实时的位置变化
        4. 释放定位:松开鼠标完成位置调整

        调整窗口尺寸

        1. 定位调整点:将鼠标移动到窗口的边角位置
        2. 拖拽调整:按住鼠标左键拖拽来改变窗口大小
        3. 比例约束:系统会自动维持合理的窗口比例
        4. 最小尺寸限制:窗口不能小于预设的最小尺寸

        尺寸限制说明

        • 最小宽度:容器宽度的 1/6
        • 最小高度:容器高度的 1/4
        • 边界约束:窗口不能拖拽到编排区域外部
        • 重叠处理:允许窗口重叠,但建议避免完全遮挡

        布局管理操作

        重置布局

        1. 点击控制面板中的"重置布局"按钮
        2. 系统将清除当前所有组件
        3. 重新加载保存的布局配置
        4. 如果没有保存的配置,将显示空白编排区域

        清除全部组件

        1. 点击"清除全部"按钮
        2. 系统将弹出确认对话框
        3. 确认后将移除所有窗口组件
        4. 编排区域将变为空白状态

        删除单个组件

        1. 将鼠标悬停在目标窗口组件上
        2. 点击窗口右上角的删除按钮(×)
        3. 该组件将立即从编排区域移除
        4. 对应的设备将重新出现在可添加列表中

        配置保存和应用

        保存布局配置

        1. 完成布局调整:确保所有窗口组件都已调整到满意的位置和尺寸
        2. 点击保存按钮:点击界面底部的"保存布局"按钮
        3. 配置写入:系统将当前布局信息写入配置文件
        4. 成功反馈:显示保存成功的消息提示

        配置存储机制

        • 全局配置:存储在 scrcpy.global 配置节点
        • 设备配置:存储在 scrcpy.[设备ID] 配置节点
        • 参数格式
          • --window-width:窗口宽度
          • --window-height:窗口高度
          • --window-x:窗口X坐标
          • --window-y:窗口Y坐标

        配置应用时机

        • 启动镜像时:设备开始镜像时自动应用对应的窗口配置
        • 配置继承:设备特定配置优先,未设置的参数继承全局配置
        • 动态更新:保存配置后立即生效,无需重启应用

        故障排除

        常见问题

        问题1:设备不显示在添加列表中

        • 确认设备已正确连接
        • 检查设备是否已经添加到编排中
        • 尝试刷新设备列表

        问题2:窗口拖拽不响应

        • 确认鼠标点击在窗口的可拖拽区域
        • 检查是否有其他程序占用鼠标事件
        • 尝试重新打开编排界面

        问题3:保存的布局没有生效

        • 确认点击了"保存布局"按钮
        • 检查配置文件是否有写入权限
        • 尝试重启应用后再次测试

        问题4:窗口尺寸异常

        • 检查是否超出了最小尺寸限制
        • 确认显示器分辨率设置正确
        • 尝试重置布局后重新配置

        通过合理使用窗口编排功能,您可以显著提高多设备管理的效率,创建适合自己工作流程的个性化操作环境。

        ',55)])])}const q=a(t,[["render",e]]);export{g as __pageData,q as default}; diff --git a/assets/zhHans_guide_window-arrangement.md.BfDLUcqn.lean.js b/assets/zhHans_guide_window-arrangement.md.DXIswo8V.lean.js similarity index 87% rename from assets/zhHans_guide_window-arrangement.md.BfDLUcqn.lean.js rename to assets/zhHans_guide_window-arrangement.md.DXIswo8V.lean.js index 4d08f857d..85451c8f1 100644 --- a/assets/zhHans_guide_window-arrangement.md.BfDLUcqn.lean.js +++ b/assets/zhHans_guide_window-arrangement.md.DXIswo8V.lean.js @@ -1 +1 @@ -import{e as a,o as i,a as o,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"窗口编排","description":"","frontmatter":{"title":"窗口编排"},"headers":[],"relativePath":"zhHans/guide/window-arrangement.md","filePath":"zhHans/guide/window-arrangement.md","lastUpdated":1776916170000}'),t={name:"zhHans/guide/window-arrangement.md"};function e(n,l,s,h,d,u){return i(),o("div",null,[...l[0]||(l[0]=[r("",55)])])}const q=a(t,[["render",e]]);export{g as __pageData,q as default}; +import{e as a,o as i,a as o,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"窗口编排","description":"","frontmatter":{"title":"窗口编排"},"headers":[],"relativePath":"zhHans/guide/window-arrangement.md","filePath":"zhHans/guide/window-arrangement.md","lastUpdated":1777999882000}'),t={name:"zhHans/guide/window-arrangement.md"};function e(n,l,s,h,d,u){return i(),o("div",null,[...l[0]||(l[0]=[r("",55)])])}const q=a(t,[["render",e]]);export{g as __pageData,q as default}; diff --git a/assets/zhHans_help_escrcpy.md.ZCefmSs0.js b/assets/zhHans_help_escrcpy.md.B0zBNP_j.js similarity index 99% rename from assets/zhHans_help_escrcpy.md.ZCefmSs0.js rename to assets/zhHans_help_escrcpy.md.B0zBNP_j.js index 46fd0e8ef..217540cd8 100644 --- a/assets/zhHans_help_escrcpy.md.ZCefmSs0.js +++ b/assets/zhHans_help_escrcpy.md.B0zBNP_j.js @@ -1 +1 @@ -import{e as a,o,a as r,ag as c}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Escrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"zhHans/help/escrcpy.md","filePath":"zhHans/help/escrcpy.md","lastUpdated":1776916170000}'),l={name:"zhHans/help/escrcpy.md"};function t(i,e,d,s,h,n){return o(),r("div",null,[...e[0]||(e[0]=[c('

        Escrcpy

        电脑连接后无法识别设备

        1. 请重新插拔设备,并确保设备已授权USB调试权限。
        2. 若仍无法识别,可能是电脑缺少必要驱动。请使用驱动精灵等第三方工具安装驱动后重试。

        无法输入中文

        在Scrcpy@2.4+及以上版本中,解决方案如下:

        1. Escrcpy设置:进入偏好设置输入控制键盘模式,选择uhid模式。
        2. 设备输入法准备:安装支持物理键盘的输入法(推荐微信输入法)并完成设置。
        3. 启动镜像:点击Escrcpy中的开始镜像。验证:设备的设置系统语言与输入中应显示物理键盘屏幕键盘选项。
        4. 设备输入设置:在屏幕键盘设置中启用微信输入法。在物理键盘设置中配置键盘布局与电脑键盘一致(仅需设置一次)。
        5. 电脑输入准备:将输入模式设置为英文(重要)。
        6. 切换输入语言:使用Ctrl + Shift切换中英文。
        7. 开始使用。

        下载微信输入法

        无线连接提示:目标计算机积极拒绝访问

        首次无线连接可能需要配对。或插入USB确保连接建立并授权成功后再使用无线。

        数据线连接后点击无线模式无响应

        请再次点击,或点击刷新设备。通常不会超过两次点击。若仍无效,请提交设备型号和安卓版本至Issues

        为何设备交互控制栏未设计为自动贴边的悬浮菜单?

        需注意,原则上Escrcpy只是基于Scrcpy的GUI版本,尽管扩展了部分功能,但这些扩展不影响Scrcpy核心。实现该特性需修改底层Scrcpy代码,这会导致Escrcpy更难同步Scrcpy更新,弊大于利。

        因此,经慎重考虑,我们决定采用现有方案,并期待Scrcpy未来原生支持交互控制栏。

        部分设备连接后可见画面但无法操作

        注:小米手机尤其需注意,除开启USB调试外,还需开启USB调试(安全设置),即允许通过USB调试修改权限或模拟点击。

        详细说明请参考鼠标键盘无法工作的原因

        下载时提示杀毒检测导致无法正常下载

        经反馈,因缺少证书签名,Windows Defender偶会拦截软件包下载。可尝试以下方案:

        1. 打开Windows安全中心
        2. 选择病毒和威胁防护
        3. 病毒和威胁防护设置中点击管理设置
        4. 找到实时保护,若权限允许可尝试点击关闭。若无法关闭实时保护,请跳过此步。
        5. 向下滚动页面,找到排除项,点击添加或删除排除项
        6. 将下载软件包的文件夹路径添加为排除项,即加入排除列表

        启动镜像/录制时获取设备列表失败或报错

        通常由AdbScrcpy路径错误引起,可尝试以下方案:

        1. 在菜单中选择偏好设置,点击全局模式右上角的重置配置按钮。
        2. 进入设备列表页面重试启用镜像。
        3. 确保已下载安装最新版Escrcpy
        4. Ctrl + Shift + I打开开发者工具检查报错信息。
        5. 若有报错,截图并提交至反馈Issues页面。

        macOS窗口最小化至系统托盘图标未找到

        通常因系统托盘图标过多溢出隐藏了Escrcpy图标。可尝试使用以下工具:

        macOS安装成功后打开提示文件已损坏

        通常因软件包未签名导致。可尝试以下方案:

        1. 打开终端执行sudo spctl --master-disable允许任何来源软件。
        2. 打开终端执行sudo xattr -r -d com.apple.quarantine /Applications/Escrcpy.app尝试修复损坏提示。

        无法定位程序输入点DiscardvirtualMemory于动态链接库Kernel32.dll上

        仅支持Windows 10及以上版本。

        音频捕获异常导致镜像失败

        通常因电脑缺少音频输出或安卓版本过低(Android 11+)。

        请尝试通过偏好设置禁用音频转发功能解决此问题。

        微软商店版镜像启动报错

        因安装目录文件缺少执行权限引起。

        需自定义scrcpyadb的文件路径(确保有执行权限)。若使用反向网络共享,需同样配置gnirehtet

        无法执行"adb start-server"

        可能是安装路径包含中文或特殊字符。请尝试更改安装路径。

        Linux系统安装后无法打开

        部分流行发行版(如Ubuntu 24.04)对AppImage应用新增了沙盒使用限制。临时解决方案如下:

        shell
        sudo chmod 4755 /opt/Escrcpy/chrome-sandbox

        调整投屏窗口大小后出现黑边

        当调整投屏窗口尺寸后出现黑边时,只需双击黑边区域即可让其自动隐藏。

        ',44)])])}const b=a(l,[["render",t]]);export{u as __pageData,b as default}; +import{e as a,o,a as r,ag as c}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Escrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"zhHans/help/escrcpy.md","filePath":"zhHans/help/escrcpy.md","lastUpdated":1777999882000}'),l={name:"zhHans/help/escrcpy.md"};function t(i,e,d,s,h,n){return o(),r("div",null,[...e[0]||(e[0]=[c('

        Escrcpy

        电脑连接后无法识别设备

        1. 请重新插拔设备,并确保设备已授权USB调试权限。
        2. 若仍无法识别,可能是电脑缺少必要驱动。请使用驱动精灵等第三方工具安装驱动后重试。

        无法输入中文

        在Scrcpy@2.4+及以上版本中,解决方案如下:

        1. Escrcpy设置:进入偏好设置输入控制键盘模式,选择uhid模式。
        2. 设备输入法准备:安装支持物理键盘的输入法(推荐微信输入法)并完成设置。
        3. 启动镜像:点击Escrcpy中的开始镜像。验证:设备的设置系统语言与输入中应显示物理键盘屏幕键盘选项。
        4. 设备输入设置:在屏幕键盘设置中启用微信输入法。在物理键盘设置中配置键盘布局与电脑键盘一致(仅需设置一次)。
        5. 电脑输入准备:将输入模式设置为英文(重要)。
        6. 切换输入语言:使用Ctrl + Shift切换中英文。
        7. 开始使用。

        下载微信输入法

        无线连接提示:目标计算机积极拒绝访问

        首次无线连接可能需要配对。或插入USB确保连接建立并授权成功后再使用无线。

        数据线连接后点击无线模式无响应

        请再次点击,或点击刷新设备。通常不会超过两次点击。若仍无效,请提交设备型号和安卓版本至Issues

        为何设备交互控制栏未设计为自动贴边的悬浮菜单?

        需注意,原则上Escrcpy只是基于Scrcpy的GUI版本,尽管扩展了部分功能,但这些扩展不影响Scrcpy核心。实现该特性需修改底层Scrcpy代码,这会导致Escrcpy更难同步Scrcpy更新,弊大于利。

        因此,经慎重考虑,我们决定采用现有方案,并期待Scrcpy未来原生支持交互控制栏。

        部分设备连接后可见画面但无法操作

        注:小米手机尤其需注意,除开启USB调试外,还需开启USB调试(安全设置),即允许通过USB调试修改权限或模拟点击。

        详细说明请参考鼠标键盘无法工作的原因

        下载时提示杀毒检测导致无法正常下载

        经反馈,因缺少证书签名,Windows Defender偶会拦截软件包下载。可尝试以下方案:

        1. 打开Windows安全中心
        2. 选择病毒和威胁防护
        3. 病毒和威胁防护设置中点击管理设置
        4. 找到实时保护,若权限允许可尝试点击关闭。若无法关闭实时保护,请跳过此步。
        5. 向下滚动页面,找到排除项,点击添加或删除排除项
        6. 将下载软件包的文件夹路径添加为排除项,即加入排除列表

        启动镜像/录制时获取设备列表失败或报错

        通常由AdbScrcpy路径错误引起,可尝试以下方案:

        1. 在菜单中选择偏好设置,点击全局模式右上角的重置配置按钮。
        2. 进入设备列表页面重试启用镜像。
        3. 确保已下载安装最新版Escrcpy
        4. Ctrl + Shift + I打开开发者工具检查报错信息。
        5. 若有报错,截图并提交至反馈Issues页面。

        macOS窗口最小化至系统托盘图标未找到

        通常因系统托盘图标过多溢出隐藏了Escrcpy图标。可尝试使用以下工具:

        macOS安装成功后打开提示文件已损坏

        通常因软件包未签名导致。可尝试以下方案:

        1. 打开终端执行sudo spctl --master-disable允许任何来源软件。
        2. 打开终端执行sudo xattr -r -d com.apple.quarantine /Applications/Escrcpy.app尝试修复损坏提示。

        无法定位程序输入点DiscardvirtualMemory于动态链接库Kernel32.dll上

        仅支持Windows 10及以上版本。

        音频捕获异常导致镜像失败

        通常因电脑缺少音频输出或安卓版本过低(Android 11+)。

        请尝试通过偏好设置禁用音频转发功能解决此问题。

        微软商店版镜像启动报错

        因安装目录文件缺少执行权限引起。

        需自定义scrcpyadb的文件路径(确保有执行权限)。若使用反向网络共享,需同样配置gnirehtet

        无法执行"adb start-server"

        可能是安装路径包含中文或特殊字符。请尝试更改安装路径。

        Linux系统安装后无法打开

        部分流行发行版(如Ubuntu 24.04)对AppImage应用新增了沙盒使用限制。临时解决方案如下:

        shell
        sudo chmod 4755 /opt/Escrcpy/chrome-sandbox

        调整投屏窗口大小后出现黑边

        当调整投屏窗口尺寸后出现黑边时,只需双击黑边区域即可让其自动隐藏。

        ',44)])])}const b=a(l,[["render",t]]);export{u as __pageData,b as default}; diff --git a/assets/zhHans_help_escrcpy.md.ZCefmSs0.lean.js b/assets/zhHans_help_escrcpy.md.B0zBNP_j.lean.js similarity index 85% rename from assets/zhHans_help_escrcpy.md.ZCefmSs0.lean.js rename to assets/zhHans_help_escrcpy.md.B0zBNP_j.lean.js index 7dca0de35..8617ac4c2 100644 --- a/assets/zhHans_help_escrcpy.md.ZCefmSs0.lean.js +++ b/assets/zhHans_help_escrcpy.md.B0zBNP_j.lean.js @@ -1 +1 @@ -import{e as a,o,a as r,ag as c}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Escrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"zhHans/help/escrcpy.md","filePath":"zhHans/help/escrcpy.md","lastUpdated":1776916170000}'),l={name:"zhHans/help/escrcpy.md"};function t(i,e,d,s,h,n){return o(),r("div",null,[...e[0]||(e[0]=[c("",44)])])}const b=a(l,[["render",t]]);export{u as __pageData,b as default}; +import{e as a,o,a as r,ag as c}from"./chunks/framework.D2Fz4Hoy.js";const u=JSON.parse('{"title":"Escrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"zhHans/help/escrcpy.md","filePath":"zhHans/help/escrcpy.md","lastUpdated":1777999882000}'),l={name:"zhHans/help/escrcpy.md"};function t(i,e,d,s,h,n){return o(),r("div",null,[...e[0]||(e[0]=[c("",44)])])}const b=a(l,[["render",t]]);export{u as __pageData,b as default}; diff --git a/assets/zhHans_help_index.md.B52axyib.js b/assets/zhHans_help_index.md.CZhuyQ5q.js similarity index 92% rename from assets/zhHans_help_index.md.B52axyib.js rename to assets/zhHans_help_index.md.CZhuyQ5q.js index dc8bc15b2..0a19d79ba 100644 --- a/assets/zhHans_help_index.md.B52axyib.js +++ b/assets/zhHans_help_index.md.CZhuyQ5q.js @@ -1 +1 @@ -import{e as t,o as r,a as n,h as e,J as l}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"帮助","description":"","frontmatter":{"title":"帮助"},"headers":[],"relativePath":"zhHans/help/index.md","filePath":"zhHans/help/index.md","lastUpdated":1776916170000}'),s={name:"zhHans/help/index.md"};function c(p,a,d,i,o,h){return r(),n("div",null,[...a[0]||(a[0]=[e("h1",{id:"帮助中心",tabindex:"-1"},[l("帮助中心 "),e("a",{class:"header-anchor",href:"#帮助中心","aria-label":'Permalink to "帮助中心"'},"​")],-1),e("p",null,"本节为Escrcpy和Scrcpy用户提供了解决常见问题的解决方案。",-1),e("ul",null,[e("li",null,[e("a",{href:"/zhHans/help/escrcpy"},"Escrcpy")]),e("li",null,[e("a",{href:"/zhHans/help/scrcpy"},"Scrcpy")])],-1)])])}const u=t(s,[["render",c]]);export{m as __pageData,u as default}; +import{e as t,o as r,a as n,h as e,J as l}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"帮助","description":"","frontmatter":{"title":"帮助"},"headers":[],"relativePath":"zhHans/help/index.md","filePath":"zhHans/help/index.md","lastUpdated":1777999882000}'),s={name:"zhHans/help/index.md"};function c(p,a,d,i,o,h){return r(),n("div",null,[...a[0]||(a[0]=[e("h1",{id:"帮助中心",tabindex:"-1"},[l("帮助中心 "),e("a",{class:"header-anchor",href:"#帮助中心","aria-label":'Permalink to "帮助中心"'},"​")],-1),e("p",null,"本节为Escrcpy和Scrcpy用户提供了解决常见问题的解决方案。",-1),e("ul",null,[e("li",null,[e("a",{href:"/zhHans/help/escrcpy"},"Escrcpy")]),e("li",null,[e("a",{href:"/zhHans/help/scrcpy"},"Scrcpy")])],-1)])])}const u=t(s,[["render",c]]);export{m as __pageData,u as default}; diff --git a/assets/zhHans_help_index.md.B52axyib.lean.js b/assets/zhHans_help_index.md.CZhuyQ5q.lean.js similarity index 92% rename from assets/zhHans_help_index.md.B52axyib.lean.js rename to assets/zhHans_help_index.md.CZhuyQ5q.lean.js index dc8bc15b2..0a19d79ba 100644 --- a/assets/zhHans_help_index.md.B52axyib.lean.js +++ b/assets/zhHans_help_index.md.CZhuyQ5q.lean.js @@ -1 +1 @@ -import{e as t,o as r,a as n,h as e,J as l}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"帮助","description":"","frontmatter":{"title":"帮助"},"headers":[],"relativePath":"zhHans/help/index.md","filePath":"zhHans/help/index.md","lastUpdated":1776916170000}'),s={name:"zhHans/help/index.md"};function c(p,a,d,i,o,h){return r(),n("div",null,[...a[0]||(a[0]=[e("h1",{id:"帮助中心",tabindex:"-1"},[l("帮助中心 "),e("a",{class:"header-anchor",href:"#帮助中心","aria-label":'Permalink to "帮助中心"'},"​")],-1),e("p",null,"本节为Escrcpy和Scrcpy用户提供了解决常见问题的解决方案。",-1),e("ul",null,[e("li",null,[e("a",{href:"/zhHans/help/escrcpy"},"Escrcpy")]),e("li",null,[e("a",{href:"/zhHans/help/scrcpy"},"Scrcpy")])],-1)])])}const u=t(s,[["render",c]]);export{m as __pageData,u as default}; +import{e as t,o as r,a as n,h as e,J as l}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"帮助","description":"","frontmatter":{"title":"帮助"},"headers":[],"relativePath":"zhHans/help/index.md","filePath":"zhHans/help/index.md","lastUpdated":1777999882000}'),s={name:"zhHans/help/index.md"};function c(p,a,d,i,o,h){return r(),n("div",null,[...a[0]||(a[0]=[e("h1",{id:"帮助中心",tabindex:"-1"},[l("帮助中心 "),e("a",{class:"header-anchor",href:"#帮助中心","aria-label":'Permalink to "帮助中心"'},"​")],-1),e("p",null,"本节为Escrcpy和Scrcpy用户提供了解决常见问题的解决方案。",-1),e("ul",null,[e("li",null,[e("a",{href:"/zhHans/help/escrcpy"},"Escrcpy")]),e("li",null,[e("a",{href:"/zhHans/help/scrcpy"},"Scrcpy")])],-1)])])}const u=t(s,[["render",c]]);export{m as __pageData,u as default}; diff --git a/assets/zhHans_help_scrcpy.md.foVIj1PA.js b/assets/zhHans_help_scrcpy.md.CmPTXUiC.js similarity index 99% rename from assets/zhHans_help_scrcpy.md.foVIj1PA.js rename to assets/zhHans_help_scrcpy.md.CmPTXUiC.js index 606b6aa33..2f32dada0 100644 --- a/assets/zhHans_help_scrcpy.md.foVIj1PA.js +++ b/assets/zhHans_help_scrcpy.md.CmPTXUiC.js @@ -1,4 +1,4 @@ -import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const b=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"zhHans/help/scrcpy.md","filePath":"zhHans/help/scrcpy.md","lastUpdated":1776916170000}'),r={name:"zhHans/help/scrcpy.md"};function n(o,a,l,p,h,d){return s(),i("div",null,[...a[0]||(a[0]=[t(`

        Scrcpy

        以下是常见问题及其状态报告。 遇到任何错误时,请首先升级至最新版本。

        adb 与 USB 问题

        scrcpy 通过执行 adb 命令初始化设备连接。若 adb 失败,则 scrcpy 无法工作。 这通常并非 scrcpy 的 bug,而是环境配置问题。

        adb 未找到

        需确保 adb 位于 PATH 环境变量中。 Windows 版本已默认包含 adb.exe 且当前目录在 PATH 中,因此开箱即用。

        设备未检测到

        ERROR: 未找到任何 ADB 设备
        +import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const b=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"zhHans/help/scrcpy.md","filePath":"zhHans/help/scrcpy.md","lastUpdated":1777999882000}'),r={name:"zhHans/help/scrcpy.md"};function n(o,a,l,p,h,d){return s(),i("div",null,[...a[0]||(a[0]=[t(`

        Scrcpy

        以下是常见问题及其状态报告。 遇到任何错误时,请首先升级至最新版本。

        adb 与 USB 问题

        scrcpy 通过执行 adb 命令初始化设备连接。若 adb 失败,则 scrcpy 无法工作。 这通常并非 scrcpy 的 bug,而是环境配置问题。

        adb 未找到

        需确保 adb 位于 PATH 环境变量中。 Windows 版本已默认包含 adb.exe 且当前目录在 PATH 中,因此开箱即用。

        设备未检测到

        ERROR: 未找到任何 ADB 设备
         

        请确认已正确启用 adb 调试。 通过以下命令检查设备是否被识别:

        adb devices

        若设备未列出,可能需要安装驱动(Windows 系统)。Google 设备需单独安装 USB 驱动

        设备未授权

        ERROR: 设备未授权:
         ERROR:     -->   (usb)  0123456789abcdef          unauthorized
         ERROR: 设备端应弹出授权请求窗口
        diff --git a/assets/zhHans_help_scrcpy.md.foVIj1PA.lean.js b/assets/zhHans_help_scrcpy.md.CmPTXUiC.lean.js
        similarity index 85%
        rename from assets/zhHans_help_scrcpy.md.foVIj1PA.lean.js
        rename to assets/zhHans_help_scrcpy.md.CmPTXUiC.lean.js
        index d9bf07410..c1eb70090 100644
        --- a/assets/zhHans_help_scrcpy.md.foVIj1PA.lean.js
        +++ b/assets/zhHans_help_scrcpy.md.CmPTXUiC.lean.js
        @@ -1 +1 @@
        -import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const b=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"zhHans/help/scrcpy.md","filePath":"zhHans/help/scrcpy.md","lastUpdated":1776916170000}'),r={name:"zhHans/help/scrcpy.md"};function n(o,a,l,p,h,d){return s(),i("div",null,[...a[0]||(a[0]=[t("",54)])])}const k=e(r,[["render",n]]);export{b as __pageData,k as default};
        +import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const b=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{},"headers":[],"relativePath":"zhHans/help/scrcpy.md","filePath":"zhHans/help/scrcpy.md","lastUpdated":1777999882000}'),r={name:"zhHans/help/scrcpy.md"};function n(o,a,l,p,h,d){return s(),i("div",null,[...a[0]||(a[0]=[t("",54)])])}const k=e(r,[["render",n]]);export{b as __pageData,k as default};
        diff --git a/assets/zhHans_index.md.JkvKQVbP.js b/assets/zhHans_index.md.Dhdjchr3.js
        similarity index 96%
        rename from assets/zhHans_index.md.JkvKQVbP.js
        rename to assets/zhHans_index.md.Dhdjchr3.js
        index 4401b7821..258c7144c 100644
        --- a/assets/zhHans_index.md.JkvKQVbP.js
        +++ b/assets/zhHans_index.md.Dhdjchr3.js
        @@ -1 +1 @@
        -import{e as t,o as e,a as i}from"./chunks/framework.D2Fz4Hoy.js";const h=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Escrcpy","text":"使用图形化的 scrcpy 显示和控制你的安卓设备","tagline":"Powered by electron.","image":{"src":"/images/logo@1024x1024.png","alt":"Escrcpy"},"actions":[{"theme":"brand","text":"快速上手 👉","link":"/zhHans/guide/started"},{"theme":"alt","text":"帮助","link":"/zhHans/help/escrcpy"},{"theme":"alt","text":"Github","link":"https://github.com/viarotel-org/escrcpy"}]},"features":[{"icon":"🖥️","title":"内嵌镜像","details":"独立内嵌窗口,自动适配分辨率与屏幕方向,内置一体化快捷操作"},{"icon":"🔄","title":"多设备群控","details":"单窗口同控多台设备,广播输入,支持批量截图与 APK 安装"},{"icon":"🎛️","title":"集成控制栏","details":"可拖拽排序的紧凑侧边栏,涵盖旋转、截图、应用、文件、终端、AI 助手与自动化"},{"icon":"🤖","title":"智能控制","details":"基于 AutoGLM 的自然语言指令,智能操控 Android 设备"},{"icon":"🏃","title":"自动化执行","details":"自动化流程并行运行,支持多设备同步操作"},{"icon":"🪟","title":"多设备管理","details":"可视化窗口编排,统一管理所有已连接设备"},{"icon":"📡","title":"无线连接","details":"无线 ADB 连接,支持 Gnirehtet 反向供网"},{"icon":"⚡️","title":"Scrcpy 内核","details":"高性能、低延迟屏幕镜像与控制"}]},"headers":[],"relativePath":"zhHans/index.md","filePath":"zhHans/index.md","lastUpdated":1776916170000}'),a={name:"zhHans/index.md"};function n(s,c,o,l,r,d){return e(),i("div")}const m=t(a,[["render",n]]);export{h as __pageData,m as default};
        +import{e as t,o as e,a as i}from"./chunks/framework.D2Fz4Hoy.js";const h=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Escrcpy","text":"使用图形化的 scrcpy 显示和控制你的安卓设备","tagline":"Powered by electron.","image":{"src":"/images/logo@1024x1024.png","alt":"Escrcpy"},"actions":[{"theme":"brand","text":"快速上手 👉","link":"/zhHans/guide/started"},{"theme":"alt","text":"帮助","link":"/zhHans/help/escrcpy"},{"theme":"alt","text":"Github","link":"https://github.com/viarotel-org/escrcpy"}]},"features":[{"icon":"🖥️","title":"内嵌镜像","details":"独立内嵌窗口,自动适配分辨率与屏幕方向,内置一体化快捷操作"},{"icon":"🔄","title":"多设备群控","details":"单窗口同控多台设备,广播输入,支持批量截图与 APK 安装"},{"icon":"🎛️","title":"集成控制栏","details":"可拖拽排序的紧凑侧边栏,涵盖旋转、截图、应用、文件、终端、AI 助手与自动化"},{"icon":"🤖","title":"智能控制","details":"基于 AutoGLM 的自然语言指令,智能操控 Android 设备"},{"icon":"🏃","title":"自动化执行","details":"自动化流程并行运行,支持多设备同步操作"},{"icon":"🪟","title":"多设备管理","details":"可视化窗口编排,统一管理所有已连接设备"},{"icon":"📡","title":"无线连接","details":"无线 ADB 连接,支持 Gnirehtet 反向供网"},{"icon":"⚡️","title":"Scrcpy 内核","details":"高性能、低延迟屏幕镜像与控制"}]},"headers":[],"relativePath":"zhHans/index.md","filePath":"zhHans/index.md","lastUpdated":1777999882000}'),a={name:"zhHans/index.md"};function n(s,c,o,l,r,d){return e(),i("div")}const m=t(a,[["render",n]]);export{h as __pageData,m as default};
        diff --git a/assets/zhHans_index.md.JkvKQVbP.lean.js b/assets/zhHans_index.md.Dhdjchr3.lean.js
        similarity index 96%
        rename from assets/zhHans_index.md.JkvKQVbP.lean.js
        rename to assets/zhHans_index.md.Dhdjchr3.lean.js
        index 4401b7821..258c7144c 100644
        --- a/assets/zhHans_index.md.JkvKQVbP.lean.js
        +++ b/assets/zhHans_index.md.Dhdjchr3.lean.js
        @@ -1 +1 @@
        -import{e as t,o as e,a as i}from"./chunks/framework.D2Fz4Hoy.js";const h=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Escrcpy","text":"使用图形化的 scrcpy 显示和控制你的安卓设备","tagline":"Powered by electron.","image":{"src":"/images/logo@1024x1024.png","alt":"Escrcpy"},"actions":[{"theme":"brand","text":"快速上手 👉","link":"/zhHans/guide/started"},{"theme":"alt","text":"帮助","link":"/zhHans/help/escrcpy"},{"theme":"alt","text":"Github","link":"https://github.com/viarotel-org/escrcpy"}]},"features":[{"icon":"🖥️","title":"内嵌镜像","details":"独立内嵌窗口,自动适配分辨率与屏幕方向,内置一体化快捷操作"},{"icon":"🔄","title":"多设备群控","details":"单窗口同控多台设备,广播输入,支持批量截图与 APK 安装"},{"icon":"🎛️","title":"集成控制栏","details":"可拖拽排序的紧凑侧边栏,涵盖旋转、截图、应用、文件、终端、AI 助手与自动化"},{"icon":"🤖","title":"智能控制","details":"基于 AutoGLM 的自然语言指令,智能操控 Android 设备"},{"icon":"🏃","title":"自动化执行","details":"自动化流程并行运行,支持多设备同步操作"},{"icon":"🪟","title":"多设备管理","details":"可视化窗口编排,统一管理所有已连接设备"},{"icon":"📡","title":"无线连接","details":"无线 ADB 连接,支持 Gnirehtet 反向供网"},{"icon":"⚡️","title":"Scrcpy 内核","details":"高性能、低延迟屏幕镜像与控制"}]},"headers":[],"relativePath":"zhHans/index.md","filePath":"zhHans/index.md","lastUpdated":1776916170000}'),a={name:"zhHans/index.md"};function n(s,c,o,l,r,d){return e(),i("div")}const m=t(a,[["render",n]]);export{h as __pageData,m as default};
        +import{e as t,o as e,a as i}from"./chunks/framework.D2Fz4Hoy.js";const h=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Escrcpy","text":"使用图形化的 scrcpy 显示和控制你的安卓设备","tagline":"Powered by electron.","image":{"src":"/images/logo@1024x1024.png","alt":"Escrcpy"},"actions":[{"theme":"brand","text":"快速上手 👉","link":"/zhHans/guide/started"},{"theme":"alt","text":"帮助","link":"/zhHans/help/escrcpy"},{"theme":"alt","text":"Github","link":"https://github.com/viarotel-org/escrcpy"}]},"features":[{"icon":"🖥️","title":"内嵌镜像","details":"独立内嵌窗口,自动适配分辨率与屏幕方向,内置一体化快捷操作"},{"icon":"🔄","title":"多设备群控","details":"单窗口同控多台设备,广播输入,支持批量截图与 APK 安装"},{"icon":"🎛️","title":"集成控制栏","details":"可拖拽排序的紧凑侧边栏,涵盖旋转、截图、应用、文件、终端、AI 助手与自动化"},{"icon":"🤖","title":"智能控制","details":"基于 AutoGLM 的自然语言指令,智能操控 Android 设备"},{"icon":"🏃","title":"自动化执行","details":"自动化流程并行运行,支持多设备同步操作"},{"icon":"🪟","title":"多设备管理","details":"可视化窗口编排,统一管理所有已连接设备"},{"icon":"📡","title":"无线连接","details":"无线 ADB 连接,支持 Gnirehtet 反向供网"},{"icon":"⚡️","title":"Scrcpy 内核","details":"高性能、低延迟屏幕镜像与控制"}]},"headers":[],"relativePath":"zhHans/index.md","filePath":"zhHans/index.md","lastUpdated":1777999882000}'),a={name:"zhHans/index.md"};function n(s,c,o,l,r,d){return e(),i("div")}const m=t(a,[["render",n]]);export{h as __pageData,m as default};
        diff --git a/assets/zhHans_reference_gnirehtet_api.md.De0QToXo.js b/assets/zhHans_reference_gnirehtet_api.md.Bj95AeHJ.js
        similarity index 99%
        rename from assets/zhHans_reference_gnirehtet_api.md.De0QToXo.js
        rename to assets/zhHans_reference_gnirehtet_api.md.Bj95AeHJ.js
        index f8115c28b..bf76cb8dd 100644
        --- a/assets/zhHans_reference_gnirehtet_api.md.De0QToXo.js
        +++ b/assets/zhHans_reference_gnirehtet_api.md.Bj95AeHJ.js
        @@ -1 +1 @@
        -import{e as i,o as a,a as t,ag as e}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"API(接口文档)","description":"","frontmatter":{"title":"API(接口文档)"},"headers":[],"relativePath":"zhHans/reference/gnirehtet/api.md","filePath":"zhHans/reference/gnirehtet/api.md","lastUpdated":1776916170000}'),n={name:"zhHans/reference/gnirehtet/api.md"};function h(p,s,l,r,d,o){return a(),t("div",null,[...s[0]||(s[0]=[e('

        Gnirehtet API

        gnirehtet 是一款用于在安卓设备上实现反向网络共享的工具,允许设备通过USB共享电脑的网络连接。以下是各命令的详细用法及示例。

        gnirehtet install [serial]

        描述:在指定的安卓设备上安装客户端并退出。若连接了多个设备,必须提供 serial 参数。

        示例用法

        bash
        gnirehtet install

        若连接了多个设备,指定设备序列号:

        bash
        gnirehtet install 1234567890ABCDEF

        gnirehtet uninstall [serial]

        描述:从指定的安卓设备上卸载客户端并退出。若连接了多个设备,必须提供 serial 参数。

        示例用法

        bash
        gnirehtet uninstall

        若连接了多个设备,指定设备序列号:

        bash
        gnirehtet uninstall 1234567890ABCDEF

        gnirehtet reinstall [serial]

        描述:先卸载再安装客户端。

        示例用法

        bash
        gnirehtet reinstall

        若连接了多个设备,指定设备序列号:

        bash
        gnirehtet reinstall 1234567890ABCDEF

        gnirehtet run [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

        描述:为单一设备启用反向网络共享:

        • 必要时安装客户端。
        • 启动客户端。
        • 启动中继服务器。
        • 按下 Ctrl+C 时,停止中继服务器和客户端。

        示例用法

        bash
        gnirehtet run

        指定DNS服务器:

        bash
        gnirehtet run -d 8.8.8.8,8.8.4.4

        指定端口:

        bash
        gnirehtet run -p 8080

        指定路由:

        bash
        gnirehtet run -r 192.168.1.0/24

        gnirehtet autorun [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

        描述:为所有设备启用反向网络共享:

        • 监控设备并自动启动客户端。
        • 启动中继服务器。

        示例用法

        bash
        gnirehtet autorun

        指定DNS服务器:

        bash
        gnirehtet autorun -d 8.8.8.8,8.8.4.4

        指定端口:

        bash
        gnirehtet autorun -p 8080

        指定路由:

        bash
        gnirehtet autorun -r 192.168.1.0/24

        gnirehtet start [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

        描述:在安卓设备上启动客户端并退出。

        • 若指定 -d,设备将使用指定的DNS服务器。
        • 若指定 -r,仅反向共享指定的路由。
        • 若指定 -p,中继服务器将监听指定端口。

        示例用法

        bash
        gnirehtet start

        指定设备序列号:

        bash
        gnirehtet start 1234567890ABCDEF

        指定DNS服务器:

        bash
        gnirehtet start -d 8.8.8.8,8.8.4.4

        指定端口:

        bash
        gnirehtet start -p 8080

        指定路由:

        bash
        gnirehtet start -r 192.168.1.0/24

        gnirehtet autostart [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

        描述:监听设备连接并为每个检测到的设备启动客户端。

        • 参数与 start 命令相同(无需指定序列号,将自动从检测到的设备获取)。

        示例用法

        bash
        gnirehtet autostart

        指定DNS服务器:

        bash
        gnirehtet autostart -d 8.8.8.8,8.8.4.4

        指定端口:

        bash
        gnirehtet autostart -p 8080

        指定路由:

        bash
        gnirehtet autostart -r 192.168.1.0/24

        gnirehtet stop [serial]

        描述:停止指定安卓设备上的客户端并退出。

        示例用法

        bash
        gnirehtet stop

        指定设备序列号:

        bash
        gnirehtet stop 1234567890ABCDEF

        gnirehtet restart [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

        描述:停止当前客户端并重新启动。

        示例用法

        bash
        gnirehtet restart

        指定设备序列号:

        bash
        gnirehtet restart 1234567890ABCDEF

        指定DNS服务器:

        bash
        gnirehtet restart -d 8.8.8.8,8.8.4.4

        指定端口:

        bash
        gnirehtet restart -p 8080

        指定路由:

        bash
        gnirehtet restart -r 192.168.1.0/24

        gnirehtet tunnel [serial] [-p PORT]

        描述:设置 adb reverse 隧道。若设备在 gnirehtet 运行期间断开并重新连接,重置隧道可恢复连接。

        示例用法

        bash
        gnirehtet tunnel

        指定设备序列号:

        bash
        gnirehtet tunnel 1234567890ABCDEF

        指定端口:

        bash
        gnirehtet tunnel -p 8080

        gnirehtet relay [-p PORT]

        描述:在当前终端启动中继服务器。

        示例用法

        bash
        gnirehtet relay

        指定端口:

        bash
        gnirehtet relay -p 8080
        ',98)])])}const c=i(n,[["render",h]]);export{k as __pageData,c as default}; +import{e as i,o as a,a as t,ag as e}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"API(接口文档)","description":"","frontmatter":{"title":"API(接口文档)"},"headers":[],"relativePath":"zhHans/reference/gnirehtet/api.md","filePath":"zhHans/reference/gnirehtet/api.md","lastUpdated":1777999882000}'),n={name:"zhHans/reference/gnirehtet/api.md"};function h(p,s,l,r,d,o){return a(),t("div",null,[...s[0]||(s[0]=[e('

        Gnirehtet API

        gnirehtet 是一款用于在安卓设备上实现反向网络共享的工具,允许设备通过USB共享电脑的网络连接。以下是各命令的详细用法及示例。

        gnirehtet install [serial]

        描述:在指定的安卓设备上安装客户端并退出。若连接了多个设备,必须提供 serial 参数。

        示例用法

        bash
        gnirehtet install

        若连接了多个设备,指定设备序列号:

        bash
        gnirehtet install 1234567890ABCDEF

        gnirehtet uninstall [serial]

        描述:从指定的安卓设备上卸载客户端并退出。若连接了多个设备,必须提供 serial 参数。

        示例用法

        bash
        gnirehtet uninstall

        若连接了多个设备,指定设备序列号:

        bash
        gnirehtet uninstall 1234567890ABCDEF

        gnirehtet reinstall [serial]

        描述:先卸载再安装客户端。

        示例用法

        bash
        gnirehtet reinstall

        若连接了多个设备,指定设备序列号:

        bash
        gnirehtet reinstall 1234567890ABCDEF

        gnirehtet run [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

        描述:为单一设备启用反向网络共享:

        • 必要时安装客户端。
        • 启动客户端。
        • 启动中继服务器。
        • 按下 Ctrl+C 时,停止中继服务器和客户端。

        示例用法

        bash
        gnirehtet run

        指定DNS服务器:

        bash
        gnirehtet run -d 8.8.8.8,8.8.4.4

        指定端口:

        bash
        gnirehtet run -p 8080

        指定路由:

        bash
        gnirehtet run -r 192.168.1.0/24

        gnirehtet autorun [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

        描述:为所有设备启用反向网络共享:

        • 监控设备并自动启动客户端。
        • 启动中继服务器。

        示例用法

        bash
        gnirehtet autorun

        指定DNS服务器:

        bash
        gnirehtet autorun -d 8.8.8.8,8.8.4.4

        指定端口:

        bash
        gnirehtet autorun -p 8080

        指定路由:

        bash
        gnirehtet autorun -r 192.168.1.0/24

        gnirehtet start [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

        描述:在安卓设备上启动客户端并退出。

        • 若指定 -d,设备将使用指定的DNS服务器。
        • 若指定 -r,仅反向共享指定的路由。
        • 若指定 -p,中继服务器将监听指定端口。

        示例用法

        bash
        gnirehtet start

        指定设备序列号:

        bash
        gnirehtet start 1234567890ABCDEF

        指定DNS服务器:

        bash
        gnirehtet start -d 8.8.8.8,8.8.4.4

        指定端口:

        bash
        gnirehtet start -p 8080

        指定路由:

        bash
        gnirehtet start -r 192.168.1.0/24

        gnirehtet autostart [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

        描述:监听设备连接并为每个检测到的设备启动客户端。

        • 参数与 start 命令相同(无需指定序列号,将自动从检测到的设备获取)。

        示例用法

        bash
        gnirehtet autostart

        指定DNS服务器:

        bash
        gnirehtet autostart -d 8.8.8.8,8.8.4.4

        指定端口:

        bash
        gnirehtet autostart -p 8080

        指定路由:

        bash
        gnirehtet autostart -r 192.168.1.0/24

        gnirehtet stop [serial]

        描述:停止指定安卓设备上的客户端并退出。

        示例用法

        bash
        gnirehtet stop

        指定设备序列号:

        bash
        gnirehtet stop 1234567890ABCDEF

        gnirehtet restart [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

        描述:停止当前客户端并重新启动。

        示例用法

        bash
        gnirehtet restart

        指定设备序列号:

        bash
        gnirehtet restart 1234567890ABCDEF

        指定DNS服务器:

        bash
        gnirehtet restart -d 8.8.8.8,8.8.4.4

        指定端口:

        bash
        gnirehtet restart -p 8080

        指定路由:

        bash
        gnirehtet restart -r 192.168.1.0/24

        gnirehtet tunnel [serial] [-p PORT]

        描述:设置 adb reverse 隧道。若设备在 gnirehtet 运行期间断开并重新连接,重置隧道可恢复连接。

        示例用法

        bash
        gnirehtet tunnel

        指定设备序列号:

        bash
        gnirehtet tunnel 1234567890ABCDEF

        指定端口:

        bash
        gnirehtet tunnel -p 8080

        gnirehtet relay [-p PORT]

        描述:在当前终端启动中继服务器。

        示例用法

        bash
        gnirehtet relay

        指定端口:

        bash
        gnirehtet relay -p 8080
        ',98)])])}const c=i(n,[["render",h]]);export{k as __pageData,c as default}; diff --git a/assets/zhHans_reference_gnirehtet_api.md.De0QToXo.lean.js b/assets/zhHans_reference_gnirehtet_api.md.Bj95AeHJ.lean.js similarity index 75% rename from assets/zhHans_reference_gnirehtet_api.md.De0QToXo.lean.js rename to assets/zhHans_reference_gnirehtet_api.md.Bj95AeHJ.lean.js index d62394394..68f784634 100644 --- a/assets/zhHans_reference_gnirehtet_api.md.De0QToXo.lean.js +++ b/assets/zhHans_reference_gnirehtet_api.md.Bj95AeHJ.lean.js @@ -1 +1 @@ -import{e as i,o as a,a as t,ag as e}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"API(接口文档)","description":"","frontmatter":{"title":"API(接口文档)"},"headers":[],"relativePath":"zhHans/reference/gnirehtet/api.md","filePath":"zhHans/reference/gnirehtet/api.md","lastUpdated":1776916170000}'),n={name:"zhHans/reference/gnirehtet/api.md"};function h(p,s,l,r,d,o){return a(),t("div",null,[...s[0]||(s[0]=[e("",98)])])}const c=i(n,[["render",h]]);export{k as __pageData,c as default}; +import{e as i,o as a,a as t,ag as e}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"API(接口文档)","description":"","frontmatter":{"title":"API(接口文档)"},"headers":[],"relativePath":"zhHans/reference/gnirehtet/api.md","filePath":"zhHans/reference/gnirehtet/api.md","lastUpdated":1777999882000}'),n={name:"zhHans/reference/gnirehtet/api.md"};function h(p,s,l,r,d,o){return a(),t("div",null,[...s[0]||(s[0]=[e("",98)])])}const c=i(n,[["render",h]]);export{k as __pageData,c as default}; diff --git a/assets/zhHans_reference_gnirehtet_index.md.37muRUY0.js b/assets/zhHans_reference_gnirehtet_index.md.CUmxck2C.js similarity index 99% rename from assets/zhHans_reference_gnirehtet_index.md.37muRUY0.js rename to assets/zhHans_reference_gnirehtet_index.md.CUmxck2C.js index d6b24f993..1b91e13d1 100644 --- a/assets/zhHans_reference_gnirehtet_index.md.37muRUY0.js +++ b/assets/zhHans_reference_gnirehtet_index.md.CUmxck2C.js @@ -1,4 +1,4 @@ -import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"Gnirehtet","description":"","frontmatter":{"title":"Gnirehtet"},"headers":[],"relativePath":"zhHans/reference/gnirehtet/index.md","filePath":"zhHans/reference/gnirehtet/index.md","lastUpdated":1776916170000}'),n={name:"zhHans/reference/gnirehtet/index.md"};function l(r,e,h,p,o,d){return s(),i("div",null,[...e[0]||(e[0]=[t(`

        IMPORTANT

        Escrcpy基于以下开源项目构建。相关内容按原样提供,仅供用户参考,并将定期更新。

        Gnirehtet (v2.5.1)

        该项目通过adb为Android设备提供反向网络共享功能:允许设备使用所连接计算机的网络连接。它不需要任何root权限(设备或计算机均无需)。支持GNU/LinuxWindowsMac OS

        目前,它通过IPv4转发TCPUDP流量,但不支持IPv6(未来可能支持?)。

        该项目已不再积极维护,仅修复重大阻塞问题(如构建问题)。但功能仍可正常使用。

        版本

        Gnirehtet提供两种实现:

        • Java版本;
        • Rust版本。

        如何选择?

        推荐使用Rust版本。原生二进制文件占用更少的CPU和内存资源,且无需安装Java运行时环境。

        Gnirehtet的中继服务器最初仅以Java实现,其优势在于支持所有安装了Java 8运行时的平台。目前仍保留该版本,以便在Rust版本出现问题时作为备选方案。

        要求

        Android应用至少需要API 21(Android 5.0)。

        仅针对Java版本,计算机需安装Java 8(JRE)。在基于Debian的系统中,请安装openjdk-8-jre包。

        adb

        需要较新版本的adb(支持adb reverse命令,1.0.36版本已验证可用)。

        可通过Android SDK平台工具获取。

        在基于Debian的系统中,也可安装android-tools-adb包。

        在Windows上,若仅为此应用需要adb,可直接下载平台工具,并将以下文件解压至gnirehtet目录:

        • adb.exe
        • AdbWinApi.dll
        • AdbWinUsbApi.dll

        确保已在设备上启用adb调试

        获取应用

        Homebrew

        若使用Homebrew,安装过程非常简单。安装Rust版本:

        brew install gnirehtet

        下载

        最新发布中下载所需版本。

        Rust

        下载后解压文件。

        Linux和MacOS压缩包包含:

        • gnirehtet.apk
        • gnirehtet

        Windows压缩包包含:

        • gnirehtet.apk
        • gnirehtet.exe
        • gnirehtet-run.cmd

        Java

        解压后包含:

        • gnirehtet.apk
        • gnirehtet.jar
        • gnirehtet
        • gnirehtet.cmd
        • gnirehtet-run.cmd

        运行(简单方式)

        注意:在Windows上,以下命令中的./gnirehtet需替换为gnirehtet

        该应用无用户界面,需通过计算机控制。

        若需为单一设备启用反向网络共享,直接执行:

        shell
        ./gnirehtet run

        反向网络共享将持续生效,直至按下Ctrl+C终止。

        在Windows上,为方便起见,可直接双击gnirehtet-run.cmd(其功能等同于gnirehtet run,无需打开终端)。

        首次启动时会弹出权限请求窗口:

        request

        Gnirehtet激活时,状态栏会显示“钥匙”图标:

        key

        若需为所有已连接设备(包括后续连接的设备)启用反向网络共享,可执行:

        shell
        ./gnirehtet autorun

        运行(分步操作)

        可分别执行各步骤(适用于需同时为多台设备启用反向网络共享的场景)。

        启动中继服务器并保持运行:

        shell
        ./gnirehtet relay

        在Android设备上安装apk

        shell
        ./gnirehtet install [serial]

        在另一终端中,为每个客户端执行:

        shell
        ./gnirehtet start [serial]

        停止客户端:

        shell
        ./gnirehtet stop [serial]

        重置隧道(当设备在Gnirehtet激活时断开并重新连接后,可用于恢复连接):

        shell
        ./gnirehtet tunnel [serial]

        仅当adb devices输出多个设备时,才需指定serial参数。

        高级选项可通过不带参数的./gnirehtet命令查看详情。

        手动运行

        gnirehtet程序提供了简单的命令行接口,实际执行的是底层命令。用户也可手动调用这些命令。

        启动中继服务器:

        shell
        ./gnirehtet relay

        安装apk:

        shell
        adb install -r gnirehtet.apk

        启动客户端:

        shell
        adb reverse localabstract:gnirehtet tcp:31416
        +import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"Gnirehtet","description":"","frontmatter":{"title":"Gnirehtet"},"headers":[],"relativePath":"zhHans/reference/gnirehtet/index.md","filePath":"zhHans/reference/gnirehtet/index.md","lastUpdated":1777999882000}'),n={name:"zhHans/reference/gnirehtet/index.md"};function l(r,e,h,p,o,d){return s(),i("div",null,[...e[0]||(e[0]=[t(`

        IMPORTANT

        Escrcpy基于以下开源项目构建。相关内容按原样提供,仅供用户参考,并将定期更新。

        Gnirehtet (v2.5.1)

        该项目通过adb为Android设备提供反向网络共享功能:允许设备使用所连接计算机的网络连接。它不需要任何root权限(设备或计算机均无需)。支持GNU/LinuxWindowsMac OS

        目前,它通过IPv4转发TCPUDP流量,但不支持IPv6(未来可能支持?)。

        该项目已不再积极维护,仅修复重大阻塞问题(如构建问题)。但功能仍可正常使用。

        版本

        Gnirehtet提供两种实现:

        • Java版本;
        • Rust版本。

        如何选择?

        推荐使用Rust版本。原生二进制文件占用更少的CPU和内存资源,且无需安装Java运行时环境。

        Gnirehtet的中继服务器最初仅以Java实现,其优势在于支持所有安装了Java 8运行时的平台。目前仍保留该版本,以便在Rust版本出现问题时作为备选方案。

        要求

        Android应用至少需要API 21(Android 5.0)。

        仅针对Java版本,计算机需安装Java 8(JRE)。在基于Debian的系统中,请安装openjdk-8-jre包。

        adb

        需要较新版本的adb(支持adb reverse命令,1.0.36版本已验证可用)。

        可通过Android SDK平台工具获取。

        在基于Debian的系统中,也可安装android-tools-adb包。

        在Windows上,若仅为此应用需要adb,可直接下载平台工具,并将以下文件解压至gnirehtet目录:

        • adb.exe
        • AdbWinApi.dll
        • AdbWinUsbApi.dll

        确保已在设备上启用adb调试

        获取应用

        Homebrew

        若使用Homebrew,安装过程非常简单。安装Rust版本:

        brew install gnirehtet

        下载

        最新发布中下载所需版本。

        Rust

        下载后解压文件。

        Linux和MacOS压缩包包含:

        • gnirehtet.apk
        • gnirehtet

        Windows压缩包包含:

        • gnirehtet.apk
        • gnirehtet.exe
        • gnirehtet-run.cmd

        Java

        解压后包含:

        • gnirehtet.apk
        • gnirehtet.jar
        • gnirehtet
        • gnirehtet.cmd
        • gnirehtet-run.cmd

        运行(简单方式)

        注意:在Windows上,以下命令中的./gnirehtet需替换为gnirehtet

        该应用无用户界面,需通过计算机控制。

        若需为单一设备启用反向网络共享,直接执行:

        shell
        ./gnirehtet run

        反向网络共享将持续生效,直至按下Ctrl+C终止。

        在Windows上,为方便起见,可直接双击gnirehtet-run.cmd(其功能等同于gnirehtet run,无需打开终端)。

        首次启动时会弹出权限请求窗口:

        request

        Gnirehtet激活时,状态栏会显示“钥匙”图标:

        key

        若需为所有已连接设备(包括后续连接的设备)启用反向网络共享,可执行:

        shell
        ./gnirehtet autorun

        运行(分步操作)

        可分别执行各步骤(适用于需同时为多台设备启用反向网络共享的场景)。

        启动中继服务器并保持运行:

        shell
        ./gnirehtet relay

        在Android设备上安装apk

        shell
        ./gnirehtet install [serial]

        在另一终端中,为每个客户端执行:

        shell
        ./gnirehtet start [serial]

        停止客户端:

        shell
        ./gnirehtet stop [serial]

        重置隧道(当设备在Gnirehtet激活时断开并重新连接后,可用于恢复连接):

        shell
        ./gnirehtet tunnel [serial]

        仅当adb devices输出多个设备时,才需指定serial参数。

        高级选项可通过不带参数的./gnirehtet命令查看详情。

        手动运行

        gnirehtet程序提供了简单的命令行接口,实际执行的是底层命令。用户也可手动调用这些命令。

        启动中继服务器:

        shell
        ./gnirehtet relay

        安装apk:

        shell
        adb install -r gnirehtet.apk

        启动客户端:

        shell
        adb reverse localabstract:gnirehtet tcp:31416
         adb shell am start -a com.genymobile.gnirehtet.START \\
             -n com.genymobile.gnirehtet/.GnirehtetActivity

        停止客户端:

        shell
        adb shell am start -a com.genymobile.gnirehtet.STOP \\
             -n com.genymobile.gnirehtet/.GnirehtetActivity

        环境变量

        ADB用于指定自定义的adb路径:

        shell
        ADB=/path/to/my/adb ./gnirehtet run

        GNIREHTET_APK用于指定自定义的gnirehtet.apk路径:

        shell
        GNIREHTET_APK=/usr/share/gnirehtet/gnirehtet.apk ./gnirehtet run

        为什么叫gnirehtet

        rev <<< tethering
        diff --git a/assets/zhHans_reference_gnirehtet_index.md.37muRUY0.lean.js b/assets/zhHans_reference_gnirehtet_index.md.CUmxck2C.lean.js
        similarity index 87%
        rename from assets/zhHans_reference_gnirehtet_index.md.37muRUY0.lean.js
        rename to assets/zhHans_reference_gnirehtet_index.md.CUmxck2C.lean.js
        index eebb4c00f..109ec2043 100644
        --- a/assets/zhHans_reference_gnirehtet_index.md.37muRUY0.lean.js
        +++ b/assets/zhHans_reference_gnirehtet_index.md.CUmxck2C.lean.js
        @@ -1 +1 @@
        -import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"Gnirehtet","description":"","frontmatter":{"title":"Gnirehtet"},"headers":[],"relativePath":"zhHans/reference/gnirehtet/index.md","filePath":"zhHans/reference/gnirehtet/index.md","lastUpdated":1776916170000}'),n={name:"zhHans/reference/gnirehtet/index.md"};function l(r,e,h,p,o,d){return s(),i("div",null,[...e[0]||(e[0]=[t("",89)])])}const k=a(n,[["render",l]]);export{g as __pageData,k as default};
        +import{e as a,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"Gnirehtet","description":"","frontmatter":{"title":"Gnirehtet"},"headers":[],"relativePath":"zhHans/reference/gnirehtet/index.md","filePath":"zhHans/reference/gnirehtet/index.md","lastUpdated":1777999882000}'),n={name:"zhHans/reference/gnirehtet/index.md"};function l(r,e,h,p,o,d){return s(),i("div",null,[...e[0]||(e[0]=[t("",89)])])}const k=a(n,[["render",l]]);export{g as __pageData,k as default};
        diff --git a/assets/zhHans_reference_index.md.DdCvWGMU.js b/assets/zhHans_reference_index.md.C890s8Az.js
        similarity index 93%
        rename from assets/zhHans_reference_index.md.DdCvWGMU.js
        rename to assets/zhHans_reference_index.md.C890s8Az.js
        index 27a373088..0847a9dba 100644
        --- a/assets/zhHans_reference_index.md.DdCvWGMU.js
        +++ b/assets/zhHans_reference_index.md.C890s8Az.js
        @@ -1 +1 @@
        -import{e as r,o as n,a as t,h as e,J as s}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"参考手册","description":"","frontmatter":{"title":"参考手册"},"headers":[],"relativePath":"zhHans/reference/index.md","filePath":"zhHans/reference/index.md","lastUpdated":1776916170000}'),l={name:"zhHans/reference/index.md"};function c(i,a,d,o,f,h){return n(),t("div",null,[...a[0]||(a[0]=[e("h1",{id:"参考手册",tabindex:"-1"},[s("参考手册 "),e("a",{class:"header-anchor",href:"#参考手册","aria-label":'Permalink to "参考手册"'},"​")],-1),e("p",null,"Escrcpy 建立在以下开源项目的基础上。提供相关内容以及用户参考,并将定期更新。",-1),e("ul",null,[e("li",null,[e("a",{href:"/zhHans/reference/scrcpy/"},"Scrcpy")]),e("li",null,[e("a",{href:"/zhHans/reference/gnirehtet/"},"Gnirehtet")])],-1)])])}const u=r(l,[["render",c]]);export{m as __pageData,u as default};
        +import{e as r,o as n,a as t,h as e,J as s}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"参考手册","description":"","frontmatter":{"title":"参考手册"},"headers":[],"relativePath":"zhHans/reference/index.md","filePath":"zhHans/reference/index.md","lastUpdated":1777999882000}'),l={name:"zhHans/reference/index.md"};function c(i,a,d,o,f,h){return n(),t("div",null,[...a[0]||(a[0]=[e("h1",{id:"参考手册",tabindex:"-1"},[s("参考手册 "),e("a",{class:"header-anchor",href:"#参考手册","aria-label":'Permalink to "参考手册"'},"​")],-1),e("p",null,"Escrcpy 建立在以下开源项目的基础上。提供相关内容以及用户参考,并将定期更新。",-1),e("ul",null,[e("li",null,[e("a",{href:"/zhHans/reference/scrcpy/"},"Scrcpy")]),e("li",null,[e("a",{href:"/zhHans/reference/gnirehtet/"},"Gnirehtet")])],-1)])])}const u=r(l,[["render",c]]);export{m as __pageData,u as default};
        diff --git a/assets/zhHans_reference_index.md.DdCvWGMU.lean.js b/assets/zhHans_reference_index.md.C890s8Az.lean.js
        similarity index 93%
        rename from assets/zhHans_reference_index.md.DdCvWGMU.lean.js
        rename to assets/zhHans_reference_index.md.C890s8Az.lean.js
        index 27a373088..0847a9dba 100644
        --- a/assets/zhHans_reference_index.md.DdCvWGMU.lean.js
        +++ b/assets/zhHans_reference_index.md.C890s8Az.lean.js
        @@ -1 +1 @@
        -import{e as r,o as n,a as t,h as e,J as s}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"参考手册","description":"","frontmatter":{"title":"参考手册"},"headers":[],"relativePath":"zhHans/reference/index.md","filePath":"zhHans/reference/index.md","lastUpdated":1776916170000}'),l={name:"zhHans/reference/index.md"};function c(i,a,d,o,f,h){return n(),t("div",null,[...a[0]||(a[0]=[e("h1",{id:"参考手册",tabindex:"-1"},[s("参考手册 "),e("a",{class:"header-anchor",href:"#参考手册","aria-label":'Permalink to "参考手册"'},"​")],-1),e("p",null,"Escrcpy 建立在以下开源项目的基础上。提供相关内容以及用户参考,并将定期更新。",-1),e("ul",null,[e("li",null,[e("a",{href:"/zhHans/reference/scrcpy/"},"Scrcpy")]),e("li",null,[e("a",{href:"/zhHans/reference/gnirehtet/"},"Gnirehtet")])],-1)])])}const u=r(l,[["render",c]]);export{m as __pageData,u as default};
        +import{e as r,o as n,a as t,h as e,J as s}from"./chunks/framework.D2Fz4Hoy.js";const m=JSON.parse('{"title":"参考手册","description":"","frontmatter":{"title":"参考手册"},"headers":[],"relativePath":"zhHans/reference/index.md","filePath":"zhHans/reference/index.md","lastUpdated":1777999882000}'),l={name:"zhHans/reference/index.md"};function c(i,a,d,o,f,h){return n(),t("div",null,[...a[0]||(a[0]=[e("h1",{id:"参考手册",tabindex:"-1"},[s("参考手册 "),e("a",{class:"header-anchor",href:"#参考手册","aria-label":'Permalink to "参考手册"'},"​")],-1),e("p",null,"Escrcpy 建立在以下开源项目的基础上。提供相关内容以及用户参考,并将定期更新。",-1),e("ul",null,[e("li",null,[e("a",{href:"/zhHans/reference/scrcpy/"},"Scrcpy")]),e("li",null,[e("a",{href:"/zhHans/reference/gnirehtet/"},"Gnirehtet")])],-1)])])}const u=r(l,[["render",c]]);export{m as __pageData,u as default};
        diff --git a/assets/zhHans_reference_scrcpy_audio.md.Br-Vngro.js b/assets/zhHans_reference_scrcpy_audio.md.CiaJRNI8.js
        similarity index 99%
        rename from assets/zhHans_reference_scrcpy_audio.md.Br-Vngro.js
        rename to assets/zhHans_reference_scrcpy_audio.md.CiaJRNI8.js
        index 4e3f3dbf6..d15949393 100644
        --- a/assets/zhHans_reference_scrcpy_audio.md.Br-Vngro.js
        +++ b/assets/zhHans_reference_scrcpy_audio.md.CiaJRNI8.js
        @@ -1,4 +1,4 @@
        -import{e as a,o as s,a as i,ag as d}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Audio(音频)","description":"","frontmatter":{"title":"Audio(音频)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/audio.md","filePath":"zhHans/reference/scrcpy/audio.md","lastUpdated":1776916170000}'),o={name:"zhHans/reference/scrcpy/audio.md"};function n(p,e,t,r,c,l){return s(),i("div",null,[...e[0]||(e[0]=[d(`

        音频

        音频转发功能支持运行 Android 11 或更高版本的设备,并默认启用:

        • Android 12 或更新版本:开箱即用。
        • Android 11:需要确保在启动 scrcpy 时设备屏幕已解锁。此时会短暂弹出一个虚假窗口,让系统认为 shell 应用处于前台。若不满足此条件,音频捕获将失败。
        • Android 10 或更早版本:无法捕获音频,功能自动禁用。

        如果音频捕获失败,镜像会继续仅传输视频(由于音频默认启用,若音频不可用,scrcpy 不会直接失败,除非设置了 --require-audio)。

        禁用音频

        要禁用音频功能:

        scrcpy --no-audio

        若仅禁用音频播放,请参阅禁用播放

        仅音频模式

        要仅播放音频,需禁用视频和控制功能:

        bash
        scrcpy --no-video --no-control

        要在无窗口模式下播放音频:

        bash
        # --no-video 和 --no-control 会被 --no-window 隐含
        +import{e as a,o as s,a as i,ag as d}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Audio(音频)","description":"","frontmatter":{"title":"Audio(音频)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/audio.md","filePath":"zhHans/reference/scrcpy/audio.md","lastUpdated":1777999882000}'),o={name:"zhHans/reference/scrcpy/audio.md"};function n(p,e,t,r,c,l){return s(),i("div",null,[...e[0]||(e[0]=[d(`

        音频

        音频转发功能支持运行 Android 11 或更高版本的设备,并默认启用:

        • Android 12 或更新版本:开箱即用。
        • Android 11:需要确保在启动 scrcpy 时设备屏幕已解锁。此时会短暂弹出一个虚假窗口,让系统认为 shell 应用处于前台。若不满足此条件,音频捕获将失败。
        • Android 10 或更早版本:无法捕获音频,功能自动禁用。

        如果音频捕获失败,镜像会继续仅传输视频(由于音频默认启用,若音频不可用,scrcpy 不会直接失败,除非设置了 --require-audio)。

        禁用音频

        要禁用音频功能:

        scrcpy --no-audio

        若仅禁用音频播放,请参阅禁用播放

        仅音频模式

        要仅播放音频,需禁用视频和控制功能:

        bash
        scrcpy --no-video --no-control

        要在无窗口模式下播放音频:

        bash
        # --no-video 和 --no-control 会被 --no-window 隐含
         scrcpy --no-window
         # 按 Ctrl+C 中断

        无视频时,音频延迟通常不关键,因此可以增加缓冲以减少卡顿:

        scrcpy --no-video --audio-buffer=200

        音频源

        默认情况下,转发的是设备音频输出。

        也可以捕获设备麦克风输入:

        scrcpy --audio-source=mic

        例如,将设备用作录音机并直接在电脑上录制:

        scrcpy --audio-source=mic --no-video --no-playback --record=file.opus

        支持的音频源包括:

        • output(默认):转发全部音频输出,并禁用设备播放(映射到 REMOTE_SUBMIX)。
        • playback:捕获音频播放(Android 应用可选择退出,因此不一定能捕获全部输出)。
        • mic:捕获麦克风输入(映射到 MIC)。
        • mic-unprocessed:捕获未经处理的麦克风原始音频(映射到 UNPROCESSED)。
        • mic-camcorder:捕获为视频录制优化的麦克风音频,方向与摄像头一致(映射到 CAMCORDER)。
        • mic-voice-recognition:捕获为语音识别优化的麦克风音频(映射到 VOICE_RECOGNITION)。
        • mic-voice-communication:捕获为语音通信优化的麦克风音频(例如支持回声消除或自动增益控制)(映射到 VOICE_COMMUNICATION)。
        • voice-call:捕获语音通话(映射到 VOICE_CALL)。
        • voice-call-uplink:仅捕获语音通话上行链路(映射到 VOICE_UPLINK)。
        • voice-call-downlink:仅捕获语音通话下行链路(映射到 VOICE_DOWNLINK)。
        • voice-performance:捕获适用于实时表演(如卡拉OK)的音频,包括麦克风和设备播放(映射到 VOICE_PERFORMANCE)。

        音频复制

        另一种设备音频捕获方法(仅限 Android 13 及以上版本):

        scrcpy --audio-source=playback

        此音频源支持在镜像时保持设备音频播放,通过 --audio-dup 实现:

        bash
        scrcpy --audio-source=playback --audio-dup
         # 或简写为:
        diff --git a/assets/zhHans_reference_scrcpy_audio.md.Br-Vngro.lean.js b/assets/zhHans_reference_scrcpy_audio.md.CiaJRNI8.lean.js
        similarity index 87%
        rename from assets/zhHans_reference_scrcpy_audio.md.Br-Vngro.lean.js
        rename to assets/zhHans_reference_scrcpy_audio.md.CiaJRNI8.lean.js
        index b9377d951..826164417 100644
        --- a/assets/zhHans_reference_scrcpy_audio.md.Br-Vngro.lean.js
        +++ b/assets/zhHans_reference_scrcpy_audio.md.CiaJRNI8.lean.js
        @@ -1 +1 @@
        -import{e as a,o as s,a as i,ag as d}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Audio(音频)","description":"","frontmatter":{"title":"Audio(音频)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/audio.md","filePath":"zhHans/reference/scrcpy/audio.md","lastUpdated":1776916170000}'),o={name:"zhHans/reference/scrcpy/audio.md"};function n(p,e,t,r,c,l){return s(),i("div",null,[...e[0]||(e[0]=[d("",57)])])}const u=a(o,[["render",n]]);export{k as __pageData,u as default};
        +import{e as a,o as s,a as i,ag as d}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Audio(音频)","description":"","frontmatter":{"title":"Audio(音频)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/audio.md","filePath":"zhHans/reference/scrcpy/audio.md","lastUpdated":1777999882000}'),o={name:"zhHans/reference/scrcpy/audio.md"};function n(p,e,t,r,c,l){return s(),i("div",null,[...e[0]||(e[0]=[d("",57)])])}const u=a(o,[["render",n]]);export{k as __pageData,u as default};
        diff --git a/assets/zhHans_reference_scrcpy_build.md.BG9nlnfF.js b/assets/zhHans_reference_scrcpy_build.md.L1hlNQNq.js
        similarity index 99%
        rename from assets/zhHans_reference_scrcpy_build.md.BG9nlnfF.js
        rename to assets/zhHans_reference_scrcpy_build.md.L1hlNQNq.js
        index 0645e8642..7ea6d234c 100644
        --- a/assets/zhHans_reference_scrcpy_build.md.BG9nlnfF.js
        +++ b/assets/zhHans_reference_scrcpy_build.md.L1hlNQNq.js
        @@ -1,4 +1,4 @@
        -import{e as i,o as a,a as n,ag as e}from"./chunks/framework.D2Fz4Hoy.js";const F=JSON.parse('{"title":"Build(编译)","description":"","frontmatter":{"title":"Build(编译)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/build.md","filePath":"zhHans/reference/scrcpy/build.md","lastUpdated":1776916170000}'),l={name:"zhHans/reference/scrcpy/build.md"};function h(t,s,p,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[e(`

        编译 scrcpy

        以下是编译 scrcpy(客户端和服务器)的说明。

        如果只需构建并安装最新版本,请按照 linux.md 中的简化流程操作。

        分支

        项目有两个主要分支:

        • master:包含最新发布版本。这是 GitHub 上的项目主页。
        • dev:当前开发分支。所有提交到 dev 的代码将包含在下一个版本中。

        如需贡献代码,请基于最新的 dev 分支提交。

        要求

        需要 adb。可从 Android SDK 平台工具 获取,或通过系统包管理器安装(如 adb)。

        在 Windows 上,下载 platform-tools 并将以下文件解压到 PATH 可访问的目录:

        • adb.exe
        • AdbWinApi.dll
        • AdbWinUsbApi.dll

        scrcpy 的发布版本中也包含这些文件。

        客户端需要 FFmpegLibSDL2。请按照说明安装。

        系统特定步骤

        Linux

        通过包管理器安装所需依赖。

        Debian/Ubuntu

        bash
        # 运行时依赖
        +import{e as i,o as a,a as n,ag as e}from"./chunks/framework.D2Fz4Hoy.js";const F=JSON.parse('{"title":"Build(编译)","description":"","frontmatter":{"title":"Build(编译)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/build.md","filePath":"zhHans/reference/scrcpy/build.md","lastUpdated":1777999882000}'),l={name:"zhHans/reference/scrcpy/build.md"};function h(t,s,p,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[e(`

        编译 scrcpy

        以下是编译 scrcpy(客户端和服务器)的说明。

        如果只需构建并安装最新版本,请按照 linux.md 中的简化流程操作。

        分支

        项目有两个主要分支:

        • master:包含最新发布版本。这是 GitHub 上的项目主页。
        • dev:当前开发分支。所有提交到 dev 的代码将包含在下一个版本中。

        如需贡献代码,请基于最新的 dev 分支提交。

        要求

        需要 adb。可从 Android SDK 平台工具 获取,或通过系统包管理器安装(如 adb)。

        在 Windows 上,下载 platform-tools 并将以下文件解压到 PATH 可访问的目录:

        • adb.exe
        • AdbWinApi.dll
        • AdbWinUsbApi.dll

        scrcpy 的发布版本中也包含这些文件。

        客户端需要 FFmpegLibSDL2。请按照说明安装。

        系统特定步骤

        Linux

        通过包管理器安装所需依赖。

        Debian/Ubuntu

        bash
        # 运行时依赖
         sudo apt install ffmpeg libsdl2-2.0-0 adb libusb-1.0-0
         
         # 客户端构建依赖
        diff --git a/assets/zhHans_reference_scrcpy_build.md.BG9nlnfF.lean.js b/assets/zhHans_reference_scrcpy_build.md.L1hlNQNq.lean.js
        similarity index 87%
        rename from assets/zhHans_reference_scrcpy_build.md.BG9nlnfF.lean.js
        rename to assets/zhHans_reference_scrcpy_build.md.L1hlNQNq.lean.js
        index 2a870b318..458314cd5 100644
        --- a/assets/zhHans_reference_scrcpy_build.md.BG9nlnfF.lean.js
        +++ b/assets/zhHans_reference_scrcpy_build.md.L1hlNQNq.lean.js
        @@ -1 +1 @@
        -import{e as i,o as a,a as n,ag as e}from"./chunks/framework.D2Fz4Hoy.js";const F=JSON.parse('{"title":"Build(编译)","description":"","frontmatter":{"title":"Build(编译)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/build.md","filePath":"zhHans/reference/scrcpy/build.md","lastUpdated":1776916170000}'),l={name:"zhHans/reference/scrcpy/build.md"};function h(t,s,p,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[e("",72)])])}const c=i(l,[["render",h]]);export{F as __pageData,c as default};
        +import{e as i,o as a,a as n,ag as e}from"./chunks/framework.D2Fz4Hoy.js";const F=JSON.parse('{"title":"Build(编译)","description":"","frontmatter":{"title":"Build(编译)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/build.md","filePath":"zhHans/reference/scrcpy/build.md","lastUpdated":1777999882000}'),l={name:"zhHans/reference/scrcpy/build.md"};function h(t,s,p,k,d,r){return a(),n("div",null,[...s[0]||(s[0]=[e("",72)])])}const c=i(l,[["render",h]]);export{F as __pageData,c as default};
        diff --git a/assets/zhHans_reference_scrcpy_camera.md.Daxds0CG.js b/assets/zhHans_reference_scrcpy_camera.md.UhHPDGH0.js
        similarity index 99%
        rename from assets/zhHans_reference_scrcpy_camera.md.Daxds0CG.js
        rename to assets/zhHans_reference_scrcpy_camera.md.UhHPDGH0.js
        index 73d82577c..68bf1a335 100644
        --- a/assets/zhHans_reference_scrcpy_camera.md.Daxds0CG.js
        +++ b/assets/zhHans_reference_scrcpy_camera.md.UhHPDGH0.js
        @@ -1,4 +1,4 @@
        -import{e as a,o as i,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Camera(相机)","description":"","frontmatter":{"title":"Camera(相机)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/camera.md","filePath":"zhHans/reference/scrcpy/camera.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/camera.md"};function t(h,s,l,c,r,d){return i(),e("div",null,[...s[0]||(s[0]=[n(`

        相机

        支持在运行 Android 12 或更高版本的设备上使用相机镜像功能。

        若要捕获相机画面而非设备屏幕,请运行以下命令:

        scrcpy --video-source=camera

        默认情况下,该命令会自动将音频源切换为麦克风(相当于同时传递了 --audio-source=mic 参数)。

        bash
        scrcpy --video-source=display  # 默认音频源为输出(output)
        +import{e as a,o as i,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Camera(相机)","description":"","frontmatter":{"title":"Camera(相机)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/camera.md","filePath":"zhHans/reference/scrcpy/camera.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/camera.md"};function t(h,s,l,c,r,d){return i(),e("div",null,[...s[0]||(s[0]=[n(`

        相机

        支持在运行 Android 12 或更高版本的设备上使用相机镜像功能。

        若要捕获相机画面而非设备屏幕,请运行以下命令:

        scrcpy --video-source=camera

        默认情况下,该命令会自动将音频源切换为麦克风(相当于同时传递了 --audio-source=mic 参数)。

        bash
        scrcpy --video-source=display  # 默认音频源为输出(output)
         scrcpy --video-source=camera   # 默认音频源为麦克风(mic)
         scrcpy --video-source=display --audio-source=mic    # 强制显示画面并使用麦克风
         scrcpy --video-source=camera --audio-source=output  # 强制使用相机画面并捕获设备音频输出

        可以禁用音频:

        bash
        # 完全不捕获音频
        diff --git a/assets/zhHans_reference_scrcpy_camera.md.Daxds0CG.lean.js b/assets/zhHans_reference_scrcpy_camera.md.UhHPDGH0.lean.js
        similarity index 87%
        rename from assets/zhHans_reference_scrcpy_camera.md.Daxds0CG.lean.js
        rename to assets/zhHans_reference_scrcpy_camera.md.UhHPDGH0.lean.js
        index 1d8762c03..300c8fd99 100644
        --- a/assets/zhHans_reference_scrcpy_camera.md.Daxds0CG.lean.js
        +++ b/assets/zhHans_reference_scrcpy_camera.md.UhHPDGH0.lean.js
        @@ -1 +1 @@
        -import{e as a,o as i,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Camera(相机)","description":"","frontmatter":{"title":"Camera(相机)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/camera.md","filePath":"zhHans/reference/scrcpy/camera.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/camera.md"};function t(h,s,l,c,r,d){return i(),e("div",null,[...s[0]||(s[0]=[n("",49)])])}const g=a(p,[["render",t]]);export{o as __pageData,g as default};
        +import{e as a,o as i,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Camera(相机)","description":"","frontmatter":{"title":"Camera(相机)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/camera.md","filePath":"zhHans/reference/scrcpy/camera.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/camera.md"};function t(h,s,l,c,r,d){return i(),e("div",null,[...s[0]||(s[0]=[n("",49)])])}const g=a(p,[["render",t]]);export{o as __pageData,g as default};
        diff --git a/assets/zhHans_reference_scrcpy_connection.md.CsTlJ0UC.js b/assets/zhHans_reference_scrcpy_connection.md.xFHwE7Hq.js
        similarity index 99%
        rename from assets/zhHans_reference_scrcpy_connection.md.CsTlJ0UC.js
        rename to assets/zhHans_reference_scrcpy_connection.md.xFHwE7Hq.js
        index ba03345c1..3e0266c8a 100644
        --- a/assets/zhHans_reference_scrcpy_connection.md.CsTlJ0UC.js
        +++ b/assets/zhHans_reference_scrcpy_connection.md.xFHwE7Hq.js
        @@ -1,4 +1,4 @@
        -import{e as i,o as a,a as e,ag as p}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Connection(连接)","description":"","frontmatter":{"title":"Connection(连接)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/connection.md","filePath":"zhHans/reference/scrcpy/connection.md","lastUpdated":1776916170000}'),n={name:"zhHans/reference/scrcpy/connection.md"};function t(l,s,h,d,c,k){return a(),e("div",null,[...s[0]||(s[0]=[p(`

        连接

        设备选择

        如果仅有一台设备已连接(即通过 adb devices 列出),则该设备会被自动选中。

        但如果有多台设备连接,您需要通过以下4种方式之一指定要使用的设备:

        • 通过设备序列号:

          bash
          scrcpy --serial=0123456789abcdef
          +import{e as i,o as a,a as e,ag as p}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Connection(连接)","description":"","frontmatter":{"title":"Connection(连接)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/connection.md","filePath":"zhHans/reference/scrcpy/connection.md","lastUpdated":1777999882000}'),n={name:"zhHans/reference/scrcpy/connection.md"};function t(l,s,h,d,c,k){return a(),e("div",null,[...s[0]||(s[0]=[p(`

          连接

          设备选择

          如果仅有一台设备已连接(即通过 adb devices 列出),则该设备会被自动选中。

          但如果有多台设备连接,您需要通过以下4种方式之一指定要使用的设备:

          • 通过设备序列号:

            bash
            scrcpy --serial=0123456789abcdef
             scrcpy -s 0123456789abcdef   # 简写形式
             
             # 如果通过 TCP/IP 连接,序列号为 IP:端口(与 adb 行为一致)
            diff --git a/assets/zhHans_reference_scrcpy_connection.md.CsTlJ0UC.lean.js b/assets/zhHans_reference_scrcpy_connection.md.xFHwE7Hq.lean.js
            similarity index 88%
            rename from assets/zhHans_reference_scrcpy_connection.md.CsTlJ0UC.lean.js
            rename to assets/zhHans_reference_scrcpy_connection.md.xFHwE7Hq.lean.js
            index 1cb37fcc4..900f90c87 100644
            --- a/assets/zhHans_reference_scrcpy_connection.md.CsTlJ0UC.lean.js
            +++ b/assets/zhHans_reference_scrcpy_connection.md.xFHwE7Hq.lean.js
            @@ -1 +1 @@
            -import{e as i,o as a,a as e,ag as p}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Connection(连接)","description":"","frontmatter":{"title":"Connection(连接)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/connection.md","filePath":"zhHans/reference/scrcpy/connection.md","lastUpdated":1776916170000}'),n={name:"zhHans/reference/scrcpy/connection.md"};function t(l,s,h,d,c,k){return a(),e("div",null,[...s[0]||(s[0]=[p("",27)])])}const g=i(n,[["render",t]]);export{o as __pageData,g as default};
            +import{e as i,o as a,a as e,ag as p}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Connection(连接)","description":"","frontmatter":{"title":"Connection(连接)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/connection.md","filePath":"zhHans/reference/scrcpy/connection.md","lastUpdated":1777999882000}'),n={name:"zhHans/reference/scrcpy/connection.md"};function t(l,s,h,d,c,k){return a(),e("div",null,[...s[0]||(s[0]=[p("",27)])])}const g=i(n,[["render",t]]);export{o as __pageData,g as default};
            diff --git a/assets/zhHans_reference_scrcpy_control.md.DlXmnrGh.js b/assets/zhHans_reference_scrcpy_control.md.DXGOUQmQ.js
            similarity index 98%
            rename from assets/zhHans_reference_scrcpy_control.md.DlXmnrGh.js
            rename to assets/zhHans_reference_scrcpy_control.md.DXGOUQmQ.js
            index 496eae9aa..f12fe0660 100644
            --- a/assets/zhHans_reference_scrcpy_control.md.DlXmnrGh.js
            +++ b/assets/zhHans_reference_scrcpy_control.md.DXGOUQmQ.js
            @@ -1,4 +1,4 @@
            -import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"Control(控制)","description":"","frontmatter":{"title":"Control(控制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/control.md","filePath":"zhHans/reference/scrcpy/control.md","lastUpdated":1776916170000}'),d={name:"zhHans/reference/scrcpy/control.md"};function p(l,s,n,h,k,r){return i(),e("div",null,[...s[0]||(s[0]=[t(`

            控制

            只读模式

            禁用所有控制功能(包括与设备交互的所有操作:输入按键、鼠标事件、拖放文件等):

            bash
            scrcpy --no-control
            +import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"Control(控制)","description":"","frontmatter":{"title":"Control(控制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/control.md","filePath":"zhHans/reference/scrcpy/control.md","lastUpdated":1777999882000}'),d={name:"zhHans/reference/scrcpy/control.md"};function p(l,s,n,h,k,r){return i(),e("div",null,[...s[0]||(s[0]=[t(`

            控制

            只读模式

            禁用所有控制功能(包括与设备交互的所有操作:输入按键、鼠标事件、拖放文件等):

            bash
            scrcpy --no-control
             scrcpy -n   # 简写形式

            键盘与鼠标

            详见键盘鼠标文档。

            仅控制模式

            仅控制设备而不显示屏幕镜像:

            bash
            scrcpy --no-video --no-audio

            默认情况下,关闭视频播放时鼠标功能会被禁用。

            如需使用相对鼠标模式控制设备,启用UHID鼠标模式:

            bash
            scrcpy --no-video --no-audio --mouse=uhid
             scrcpy --no-video --no-audio -M  # 简写形式

            如需同时使用UHID键盘,需显式设置:

            bash
            scrcpy --no-video --no-audio --mouse=uhid --keyboard=uhid
             scrcpy --no-video --no-audio -MK  # 简写形式

            如需改用AOA模式(仅限USB连接):

            bash
            scrcpy --no-video --no-audio --keyboard=aoa --mouse=aoa

            复制粘贴

            Android剪贴板内容变化时会自动同步到电脑剪贴板。

            所有Ctrl快捷键都会转发到设备,例如:

            • Ctrl+c 通常执行复制
            • Ctrl+x 通常执行剪切
            • Ctrl+v 通常执行粘贴(在电脑到设备剪贴板同步后)

            这些操作通常符合预期,但具体行为取决于当前应用。例如:

            • Termux 会在Ctrl+c时发送SIGINT信号
            • K-9 Mail 会触发新建邮件功能

            针对此类情况(仅支持Android 7及以上版本),可通过以下组合键实现复制/剪切/粘贴:

            • MOD+c 注入COPY命令
            • MOD+x 注入CUT命令
            • MOD+v 注入PASTE命令(在电脑到设备剪贴板同步后)

            此外,MOD+Shift+v会将电脑剪贴板文本作为按键序列注入。这在组件不支持文本粘贴时(如Termux中)很有用,但可能破坏非ASCII内容。

            警告: 将电脑剪贴板内容粘贴到设备(通过Ctrl+vMOD+v)会将该内容存入Android剪贴板,导致任何应用均可读取。应避免以此方式粘贴敏感内容(如密码)。

            部分Android设备在编程设置剪贴板时行为异常,可通过--legacy-paste选项修改Ctrl+vMOD+v的行为,使其同样以按键序列方式注入电脑剪贴板文本(与MOD+Shift+v相同)。

            如需禁用自动剪贴板同步,使用--no-clipboard-autosync

            捏合缩放、旋转与倾斜模拟

            模拟"捏合缩放":Ctrl+点击并移动

            具体操作:按住Ctrl的同时按下鼠标左键。在左键释放前,所有鼠标移动都会以屏幕中心为基准对内容进行缩放和旋转(如果应用支持)。

            https://github.com/Genymobile/scrcpy/assets/543275/26c4a920-9805-43f1-8d4c-608752d04767

            模拟垂直倾斜手势:Shift+点击并上下移动

            https://github.com/Genymobile/scrcpy/assets/543275/1e252341-4a90-4b29-9d11-9153b324669f

            类似地,模拟水平倾斜手势:Ctrl+Shift+点击并左右移动

            技术实现上,scrcpy会通过屏幕中心对称点生成"虚拟手指"的额外触摸事件。按下Ctrlxy坐标会反转,单独按下Shift仅反转x,而Ctrl+Shift仅反转y

            此功能仅适用于默认鼠标模式(--mouse=sdk)。

            文件拖放

            安装APK

            安装APK时,只需将APK文件(后缀为.apk)拖放到scrcpy窗口。

            无视觉反馈,操作日志会打印到控制台。

            推送文件到设备

            推送文件到设备的/sdcard/Download/目录:将非APK文件拖放到scrcpy窗口。

            无视觉反馈,操作日志会打印到控制台。

            目标目录可通过启动参数修改:

            bash
            scrcpy --push-target=/sdcard/Movies/
            `,46)])])}const b=a(d,[["render",p]]);export{c as __pageData,b as default}; diff --git a/assets/zhHans_reference_scrcpy_control.md.DlXmnrGh.lean.js b/assets/zhHans_reference_scrcpy_control.md.DXGOUQmQ.lean.js similarity index 75% rename from assets/zhHans_reference_scrcpy_control.md.DlXmnrGh.lean.js rename to assets/zhHans_reference_scrcpy_control.md.DXGOUQmQ.lean.js index 57351887b..acb7f2920 100644 --- a/assets/zhHans_reference_scrcpy_control.md.DlXmnrGh.lean.js +++ b/assets/zhHans_reference_scrcpy_control.md.DXGOUQmQ.lean.js @@ -1 +1 @@ -import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"Control(控制)","description":"","frontmatter":{"title":"Control(控制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/control.md","filePath":"zhHans/reference/scrcpy/control.md","lastUpdated":1776916170000}'),d={name:"zhHans/reference/scrcpy/control.md"};function p(l,s,n,h,k,r){return i(),e("div",null,[...s[0]||(s[0]=[t("",46)])])}const b=a(d,[["render",p]]);export{c as __pageData,b as default}; +import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"Control(控制)","description":"","frontmatter":{"title":"Control(控制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/control.md","filePath":"zhHans/reference/scrcpy/control.md","lastUpdated":1777999882000}'),d={name:"zhHans/reference/scrcpy/control.md"};function p(l,s,n,h,k,r){return i(),e("div",null,[...s[0]||(s[0]=[t("",46)])])}const b=a(d,[["render",p]]);export{c as __pageData,b as default}; diff --git a/assets/zhHans_reference_scrcpy_develop.md.s3gvZK2Y.js b/assets/zhHans_reference_scrcpy_develop.md.fwHMW-Ud.js similarity index 99% rename from assets/zhHans_reference_scrcpy_develop.md.s3gvZK2Y.js rename to assets/zhHans_reference_scrcpy_develop.md.fwHMW-Ud.js index aee8b8f91..3bdd5bf0e 100644 --- a/assets/zhHans_reference_scrcpy_develop.md.s3gvZK2Y.js +++ b/assets/zhHans_reference_scrcpy_develop.md.fwHMW-Ud.js @@ -1,4 +1,4 @@ -import{e,o as s,a as i,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"develop(开发者指南)","description":"","frontmatter":{"title":"develop(开发者指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/develop.md","filePath":"zhHans/reference/scrcpy/develop.md","lastUpdated":1776916170000}'),l={name:"zhHans/reference/scrcpy/develop.md"};function n(p,a,t,c,h,o){return s(),i("div",null,[...a[0]||(a[0]=[r(`

            开发者指南:scrcpy

            概述

            该应用由两部分组成:

            • 服务端(scrcpy-server),在设备上执行;
            • 客户端(scrcpy 可执行文件),在主机上执行。

            客户端负责将服务端推送到设备并启动其执行。

            客户端和服务端通过独立的套接字进行视频、音频和控制通信。这些功能可以单独禁用(但不能全部禁用),因此可能使用 1、2 或 3 个套接字。

            服务端首先在第一个套接字上发送设备名称(用于 scrcpy 窗口标题),随后每个套接字分别用于其特定用途。客户端和服务端均为每个套接字分配专用线程进行读写操作。

            如果启用了视频功能,服务端会发送设备屏幕的原始视频流(默认为 H.264 编码),每个数据包附带额外头部信息。客户端解码视频帧并尽快显示,不进行缓冲(除非指定 --video-buffer=delay)以最小化延迟。客户端不感知设备旋转(由服务端处理),仅知道接收到的视频帧尺寸。

            类似地,如果启用了音频功能,服务端会发送设备音频输出(或通过 --audio-source=mic 指定麦克风输入)的原始音频流(默认为 OPUS 编码),每个数据包附带额外头部信息。客户端解码音频流,尝试通过保持最小缓冲来降低延迟。scrcpy v2.0 发布的博客文章详细介绍了音频功能。

            如果启用了控制功能,客户端会捕获相关的键盘和鼠标事件,并将其传输到服务端,由服务端注入到设备中。这是唯一一个双向使用的套接字:输入事件从客户端发送到设备,而当设备剪贴板内容变化时,新内容会从设备发送到客户端,以实现无缝复制粘贴。

            需要注意的是,客户端和服务端的角色是从应用层面定义的:

            • 服务端提供视频和音频流,并处理客户端的请求;
            • 客户端通过服务端控制设备。

            然而,默认情况下(未设置 --force-adb-forward 时),网络层面的角色是相反的:

            • 客户端在启动服务端之前打开服务器套接字并监听端口;
            • 服务端连接到客户端。

            这种角色反转避免了因竞态条件导致的连接失败,而无需轮询。


            服务端

            权限

            捕获屏幕需要一些权限,这些权限已授予 shell 用户。

            服务端是一个 Java 应用程序(包含 public static void main(String... args) 方法),针对 Android 框架编译,并在 Android 设备上以 shell 用户身份执行。

            要运行这样的 Java 应用程序,类必须被 dexed(通常是 classes.dex)。如果 my.package.MainClass 是主类,编译为 classes.dex 并推送到设备的 /data/local/tmp 目录,则可以通过以下命令运行:

            bash
            adb shell CLASSPATH=/data/local/tmp/classes.dex app_process / my.package.MainClass

            路径 /data/local/tmp 是推送服务端的理想选择,因为它对 shell 用户可读写,但对其他用户不可写,因此恶意应用无法在客户端执行前替换服务端。

            除了原始的 dex 文件,app_process 还接受包含 classes.dexjar 文件(例如 APK)。为了简化操作并利用 gradle 构建系统,服务端被构建为一个(未签名的)APK(重命名为 scrcpy-server.jar)。

            隐藏方法

            尽管针对 Android 框架编译,隐藏方法和类无法直接访问(且不同 Android 版本可能有所不同)。

            可以通过反射调用这些方法。与隐藏组件的通信由 wrapperaidl 提供。

            执行

            客户端通过以下命令启动服务端:

            bash
            adb push scrcpy-server /data/local/tmp/scrcpy-server.jar
            +import{e,o as s,a as i,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"develop(开发者指南)","description":"","frontmatter":{"title":"develop(开发者指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/develop.md","filePath":"zhHans/reference/scrcpy/develop.md","lastUpdated":1777999882000}'),l={name:"zhHans/reference/scrcpy/develop.md"};function n(p,a,t,c,h,o){return s(),i("div",null,[...a[0]||(a[0]=[r(`

            开发者指南:scrcpy

            概述

            该应用由两部分组成:

            • 服务端(scrcpy-server),在设备上执行;
            • 客户端(scrcpy 可执行文件),在主机上执行。

            客户端负责将服务端推送到设备并启动其执行。

            客户端和服务端通过独立的套接字进行视频、音频和控制通信。这些功能可以单独禁用(但不能全部禁用),因此可能使用 1、2 或 3 个套接字。

            服务端首先在第一个套接字上发送设备名称(用于 scrcpy 窗口标题),随后每个套接字分别用于其特定用途。客户端和服务端均为每个套接字分配专用线程进行读写操作。

            如果启用了视频功能,服务端会发送设备屏幕的原始视频流(默认为 H.264 编码),每个数据包附带额外头部信息。客户端解码视频帧并尽快显示,不进行缓冲(除非指定 --video-buffer=delay)以最小化延迟。客户端不感知设备旋转(由服务端处理),仅知道接收到的视频帧尺寸。

            类似地,如果启用了音频功能,服务端会发送设备音频输出(或通过 --audio-source=mic 指定麦克风输入)的原始音频流(默认为 OPUS 编码),每个数据包附带额外头部信息。客户端解码音频流,尝试通过保持最小缓冲来降低延迟。scrcpy v2.0 发布的博客文章详细介绍了音频功能。

            如果启用了控制功能,客户端会捕获相关的键盘和鼠标事件,并将其传输到服务端,由服务端注入到设备中。这是唯一一个双向使用的套接字:输入事件从客户端发送到设备,而当设备剪贴板内容变化时,新内容会从设备发送到客户端,以实现无缝复制粘贴。

            需要注意的是,客户端和服务端的角色是从应用层面定义的:

            • 服务端提供视频和音频流,并处理客户端的请求;
            • 客户端通过服务端控制设备。

            然而,默认情况下(未设置 --force-adb-forward 时),网络层面的角色是相反的:

            • 客户端在启动服务端之前打开服务器套接字并监听端口;
            • 服务端连接到客户端。

            这种角色反转避免了因竞态条件导致的连接失败,而无需轮询。


            服务端

            权限

            捕获屏幕需要一些权限,这些权限已授予 shell 用户。

            服务端是一个 Java 应用程序(包含 public static void main(String... args) 方法),针对 Android 框架编译,并在 Android 设备上以 shell 用户身份执行。

            要运行这样的 Java 应用程序,类必须被 dexed(通常是 classes.dex)。如果 my.package.MainClass 是主类,编译为 classes.dex 并推送到设备的 /data/local/tmp 目录,则可以通过以下命令运行:

            bash
            adb shell CLASSPATH=/data/local/tmp/classes.dex app_process / my.package.MainClass

            路径 /data/local/tmp 是推送服务端的理想选择,因为它对 shell 用户可读写,但对其他用户不可写,因此恶意应用无法在客户端执行前替换服务端。

            除了原始的 dex 文件,app_process 还接受包含 classes.dexjar 文件(例如 APK)。为了简化操作并利用 gradle 构建系统,服务端被构建为一个(未签名的)APK(重命名为 scrcpy-server.jar)。

            隐藏方法

            尽管针对 Android 框架编译,隐藏方法和类无法直接访问(且不同 Android 版本可能有所不同)。

            可以通过反射调用这些方法。与隐藏组件的通信由 wrapperaidl 提供。

            执行

            客户端通过以下命令启动服务端:

            bash
            adb push scrcpy-server /data/local/tmp/scrcpy-server.jar
             adb forward tcp:27183 localabstract:scrcpy
             adb shell CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process / com.genymobile.scrcpy.Server 2.1

            第一个参数(示例中的 2.1)是客户端的 scrcpy 版本。如果客户端和服务端版本不完全一致,服务端会失败。客户端和服务端之间的协议可能因版本而异(参见协议部分),且没有向后或向前兼容性(使用不同版本的服务端和客户端毫无意义)。此检查用于检测配置错误(意外运行旧版或新版服务端)。

            随后可以跟随任意数量的参数,形式为 key=value 对,顺序无关。可能的键及其值类型可以在服务端客户端代码中找到。

            例如,如果执行 scrcpy -m1920 --no-audio,则服务端的执行如下:

            bash
            # scid 是一个随机数,用于区分同一设备上运行的不同客户端
             adb shell CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process / com.genymobile.scrcpy.Server 2.1 scid=12345678 log_level=info audio=false max_size=1920

            组件

            执行时,其 main() 方法(在“主”线程中运行)会解析参数,建立与客户端的连接,并启动其他“组件”:

            • 视频流:捕获屏幕视频并通过 video 套接字发送编码后的视频数据包(从 video 线程)。
            • 音频流:使用多个线程捕获原始数据包,提交编码并获取编码后的数据包,通过 audio 套接字发送。
            • 控制器:从一个线程接收 control 套接字上的控制消息(通常是输入事件),并从另一个线程通过同一 control 套接字发送设备消息(例如将设备剪贴板内容传输到客户端)。因此,control 套接字是双向使用的(与 videoaudio 套接字不同)。

            屏幕视频编码

            编码由 ScreenEncoder 管理。

            视频使用 MediaCodec API 编码。编码器编码与显示关联的 Surface 内容,并将编码后的数据包写入客户端(通过 video 套接字)。

            在设备旋转(或折叠)时,编码会话会重置并重新启动。

            仅当 Surface 发生变化时才会生成新帧。这避免了发送不必要的帧,但默认情况下可能存在以下问题:

            • 如果设备屏幕未变化,启动时不会发送任何帧;
            • 快速运动变化后,最后一帧的质量可能较差。

            这两个问题通过标志 KEY_REPEAT_PREVIOUS_FRAME_AFTER 解决

            音频编码

            类似地,音频通过 AudioRecord 捕获,并使用 MediaCodec 异步 API 编码

            更多细节请参阅介绍音频功能的博客文章

            输入事件注入

            控制消息 由客户端通过 Controller(在单独线程中运行)接收。输入事件有多种类型:

            • 键码(参考 KeyEvent);
            • 文本(特殊字符可能无法直接通过键码处理);
            • 鼠标移动/点击;
            • 鼠标滚动;
            • 其他命令(例如开关屏幕或复制剪贴板)。

            其中一些需要通过系统注入输入事件。为此,它们使用 隐藏 方法 InputManager.injectInputEvent()(由 InputManager 包装器 暴露)。


            客户端

            客户端依赖 SDL,它提供了跨平台的 UI、输入事件、线程等 API。

            视频和音频流由 FFmpeg 解码。

            初始化

            客户端解析命令行参数后,运行以下两种代码路径之一

            在本文档的剩余部分,我们假设使用的是“正常”模式(OTG 模式的代码请自行阅读)。

            启动时,客户端:

            • 打开 videoaudiocontrol 套接字;
            • 推送并启动设备上的服务端;
            • 初始化其组件(解复用器、解码器、录制器等)。

            视频和音频流

            根据传递给 scrcpy 的参数,可能会使用多个组件。以下是视频和音频组件的概述:

                                                             V4L2 sink
            diff --git a/assets/zhHans_reference_scrcpy_develop.md.s3gvZK2Y.lean.js b/assets/zhHans_reference_scrcpy_develop.md.fwHMW-Ud.lean.js
            similarity index 88%
            rename from assets/zhHans_reference_scrcpy_develop.md.s3gvZK2Y.lean.js
            rename to assets/zhHans_reference_scrcpy_develop.md.fwHMW-Ud.lean.js
            index fc6498a6f..ab03dcc2d 100644
            --- a/assets/zhHans_reference_scrcpy_develop.md.s3gvZK2Y.lean.js
            +++ b/assets/zhHans_reference_scrcpy_develop.md.fwHMW-Ud.lean.js
            @@ -1 +1 @@
            -import{e,o as s,a as i,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"develop(开发者指南)","description":"","frontmatter":{"title":"develop(开发者指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/develop.md","filePath":"zhHans/reference/scrcpy/develop.md","lastUpdated":1776916170000}'),l={name:"zhHans/reference/scrcpy/develop.md"};function n(p,a,t,c,h,o){return s(),i("div",null,[...a[0]||(a[0]=[r("",124)])])}const b=e(l,[["render",n]]);export{k as __pageData,b as default};
            +import{e,o as s,a as i,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"develop(开发者指南)","description":"","frontmatter":{"title":"develop(开发者指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/develop.md","filePath":"zhHans/reference/scrcpy/develop.md","lastUpdated":1777999882000}'),l={name:"zhHans/reference/scrcpy/develop.md"};function n(p,a,t,c,h,o){return s(),i("div",null,[...a[0]||(a[0]=[r("",124)])])}const b=e(l,[["render",n]]);export{k as __pageData,b as default};
            diff --git a/assets/zhHans_reference_scrcpy_device.md.Cn0i3r8v.js b/assets/zhHans_reference_scrcpy_device.md.VYXs7c1q.js
            similarity index 99%
            rename from assets/zhHans_reference_scrcpy_device.md.Cn0i3r8v.js
            rename to assets/zhHans_reference_scrcpy_device.md.VYXs7c1q.js
            index 75d6bbc24..d2bcb422d 100644
            --- a/assets/zhHans_reference_scrcpy_device.md.Cn0i3r8v.js
            +++ b/assets/zhHans_reference_scrcpy_device.md.VYXs7c1q.js
            @@ -1,4 +1,4 @@
            -import{e as i,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"device(设备控制)","description":"","frontmatter":{"title":"device(设备控制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/device.md","filePath":"zhHans/reference/scrcpy/device.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/device.md"};function h(n,s,l,k,d,r){return a(),e("div",null,[...s[0]||(s[0]=[t(`

            设备控制

            某些命令行参数可以在scrcpy运行时对设备本身执行操作。

            保持唤醒

            当设备通过有线连接时,防止设备延迟休眠:

            bash
            scrcpy --stay-awake
            +import{e as i,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"device(设备控制)","description":"","frontmatter":{"title":"device(设备控制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/device.md","filePath":"zhHans/reference/scrcpy/device.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/device.md"};function h(n,s,l,k,d,r){return a(),e("div",null,[...s[0]||(s[0]=[t(`

            设备控制

            某些命令行参数可以在scrcpy运行时对设备本身执行操作。

            保持唤醒

            当设备通过有线连接时,防止设备延迟休眠:

            bash
            scrcpy --stay-awake
             scrcpy -w  # 简写形式

            scrcpy关闭时将恢复初始状态。

            如果设备未通过有线连接(即仅通过TCP/IP连接),--stay-awake参数无效(这是Android系统的特性)。

            该功能通过修改stay_on_while_plugged_in设置实现,也可手动调整:

            bash
            # 获取当前stay_on_while_plugged_in值
             adb shell settings get global stay_on_while_plugged_in
             # 为AC/USB/无线充电器启用保持唤醒
            diff --git a/assets/zhHans_reference_scrcpy_device.md.Cn0i3r8v.lean.js b/assets/zhHans_reference_scrcpy_device.md.VYXs7c1q.lean.js
            similarity index 87%
            rename from assets/zhHans_reference_scrcpy_device.md.Cn0i3r8v.lean.js
            rename to assets/zhHans_reference_scrcpy_device.md.VYXs7c1q.lean.js
            index a7f9b2773..83f1a6ae5 100644
            --- a/assets/zhHans_reference_scrcpy_device.md.Cn0i3r8v.lean.js
            +++ b/assets/zhHans_reference_scrcpy_device.md.VYXs7c1q.lean.js
            @@ -1 +1 @@
            -import{e as i,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"device(设备控制)","description":"","frontmatter":{"title":"device(设备控制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/device.md","filePath":"zhHans/reference/scrcpy/device.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/device.md"};function h(n,s,l,k,d,r){return a(),e("div",null,[...s[0]||(s[0]=[t("",54)])])}const F=i(p,[["render",h]]);export{o as __pageData,F as default};
            +import{e as i,o as a,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"device(设备控制)","description":"","frontmatter":{"title":"device(设备控制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/device.md","filePath":"zhHans/reference/scrcpy/device.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/device.md"};function h(n,s,l,k,d,r){return a(),e("div",null,[...s[0]||(s[0]=[t("",54)])])}const F=i(p,[["render",h]]);export{o as __pageData,F as default};
            diff --git a/assets/zhHans_reference_scrcpy_gamepad.md.58_1gtlb.js b/assets/zhHans_reference_scrcpy_gamepad.md.D3XZ6ol7.js
            similarity index 98%
            rename from assets/zhHans_reference_scrcpy_gamepad.md.58_1gtlb.js
            rename to assets/zhHans_reference_scrcpy_gamepad.md.D3XZ6ol7.js
            index 6a8408d15..e8cbe41f1 100644
            --- a/assets/zhHans_reference_scrcpy_gamepad.md.58_1gtlb.js
            +++ b/assets/zhHans_reference_scrcpy_gamepad.md.D3XZ6ol7.js
            @@ -1,2 +1,2 @@
            -import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"Gamepad(游戏手柄)","description":"","frontmatter":{"title":"Gamepad(游戏手柄)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/gamepad.md","filePath":"zhHans/reference/scrcpy/gamepad.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/gamepad.md"};function d(r,a,n,o,c,h){return s(),i("div",null,[...a[0]||(a[0]=[t(`

            Gamepad(游戏手柄)

            提供多种游戏手柄输入模式:

            • --gamepad=disabled(默认模式)
            • --gamepad=uhid(或简写为 -G):通过设备的 UHID 内核模块模拟物理 HID 游戏手柄
            • --gamepad=aoa:通过 AOAv2 协议模拟物理 HID 游戏手柄

            物理游戏手柄模拟

            有两种模式可以在设备上模拟物理 HID 游戏手柄,每种模式对应计算机上连接的一个物理游戏手柄。

            UHID 模式

            此模式通过设备上的 UHID 内核模块模拟物理 HID 游戏手柄。

            启用 UHID 游戏手柄模式,请使用以下命令:

            bash
            scrcpy --gamepad=uhid
            +import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"Gamepad(游戏手柄)","description":"","frontmatter":{"title":"Gamepad(游戏手柄)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/gamepad.md","filePath":"zhHans/reference/scrcpy/gamepad.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/gamepad.md"};function d(r,a,n,o,c,h){return s(),i("div",null,[...a[0]||(a[0]=[t(`

            Gamepad(游戏手柄)

            提供多种游戏手柄输入模式:

            • --gamepad=disabled(默认模式)
            • --gamepad=uhid(或简写为 -G):通过设备的 UHID 内核模块模拟物理 HID 游戏手柄
            • --gamepad=aoa:通过 AOAv2 协议模拟物理 HID 游戏手柄

            物理游戏手柄模拟

            有两种模式可以在设备上模拟物理 HID 游戏手柄,每种模式对应计算机上连接的一个物理游戏手柄。

            UHID 模式

            此模式通过设备上的 UHID 内核模块模拟物理 HID 游戏手柄。

            启用 UHID 游戏手柄模式,请使用以下命令:

            bash
            scrcpy --gamepad=uhid
             scrcpy -G  # 简写形式

            注意:由于权限问题,UHID 在较旧的 Android 版本上可能无法正常工作。

            AOA 模式

            此模式通过 AOAv2 协议模拟物理 HID 游戏手柄。

            启用 AOA 游戏手柄模式,请使用以下命令:

            bash
            scrcpy --gamepad=aoa

            与其他模式不同,此模式直接在 USB 层级工作(因此仅支持通过 USB 连接)。

            它不使用 scrcpy 服务端,也不需要 adb(USB 调试)。因此,即使 USB 调试被禁用,也可以控制设备(但无法镜像屏幕,详见 OTG)。

            注意:在此模式下,Android 会将多个物理游戏手柄检测为一个行为异常的单一设备。如果需要使用多个游戏手柄,请选择 UHID 模式。

            注意:在 Windows 上,此模式可能仅在 OTG 模式 下有效,无法在镜像时使用(如果 USB 设备已被其他进程如 adb 守护进程 占用,则无法打开)。

            `,18)])])}const k=e(p,[["render",d]]);export{g as __pageData,k as default}; diff --git a/assets/zhHans_reference_scrcpy_gamepad.md.58_1gtlb.lean.js b/assets/zhHans_reference_scrcpy_gamepad.md.D3XZ6ol7.lean.js similarity index 87% rename from assets/zhHans_reference_scrcpy_gamepad.md.58_1gtlb.lean.js rename to assets/zhHans_reference_scrcpy_gamepad.md.D3XZ6ol7.lean.js index 65f40289a..230a1b9c9 100644 --- a/assets/zhHans_reference_scrcpy_gamepad.md.58_1gtlb.lean.js +++ b/assets/zhHans_reference_scrcpy_gamepad.md.D3XZ6ol7.lean.js @@ -1 +1 @@ -import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"Gamepad(游戏手柄)","description":"","frontmatter":{"title":"Gamepad(游戏手柄)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/gamepad.md","filePath":"zhHans/reference/scrcpy/gamepad.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/gamepad.md"};function d(r,a,n,o,c,h){return s(),i("div",null,[...a[0]||(a[0]=[t("",18)])])}const k=e(p,[["render",d]]);export{g as __pageData,k as default}; +import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const g=JSON.parse('{"title":"Gamepad(游戏手柄)","description":"","frontmatter":{"title":"Gamepad(游戏手柄)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/gamepad.md","filePath":"zhHans/reference/scrcpy/gamepad.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/gamepad.md"};function d(r,a,n,o,c,h){return s(),i("div",null,[...a[0]||(a[0]=[t("",18)])])}const k=e(p,[["render",d]]);export{g as __pageData,k as default}; diff --git a/assets/zhHans_reference_scrcpy_index.md.DAHNtU1Y.js b/assets/zhHans_reference_scrcpy_index.md.6gBVsBM0.js similarity index 99% rename from assets/zhHans_reference_scrcpy_index.md.DAHNtU1Y.js rename to assets/zhHans_reference_scrcpy_index.md.6gBVsBM0.js index eaf61a899..fe0079ed5 100644 --- a/assets/zhHans_reference_scrcpy_index.md.DAHNtU1Y.js +++ b/assets/zhHans_reference_scrcpy_index.md.6gBVsBM0.js @@ -1,4 +1,4 @@ -import{e as a,o as s,a as i,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"zhHans/reference/scrcpy/index.md","filePath":"zhHans/reference/scrcpy/index.md","lastUpdated":1776916170000}'),n={name:"zhHans/reference/scrcpy/index.md"};function l(t,e,c,p,h,o){return s(),i("div",null,[...e[0]||(e[0]=[r(`

            IMPORTANT

            Escrcpy基于以下开源项目构建。相关内容仅供参考,将定期更新。

            scrcpy (v3.2)

            scrcpy

            发音为 "screen copy"

            此应用通过USB或TCP/IP连接镜像Android设备(视频和音频),并支持使用计算机的键盘和鼠标进行控制。它不需要root权限,也无需在设备上安装应用。支持LinuxWindowsmacOS

            截图

            其特点包括:

            • 轻量:原生实现,仅显示设备屏幕
            • 高性能:30~120fps,具体取决于设备
            • 高质量:1920×1080或更高分辨率
            • 低延迟35~70毫秒
            • 快速启动:约1秒显示首帧画面
            • 无侵入性:不会在Android设备上留下任何痕迹
            • 用户友好:无需账户、无广告、无需联网
            • 自由:免费开源软件

            功能亮点:

            前提条件

            Android设备需至少支持API 21(Android 5.0)。

            音频转发需API >= 30(Android 11+)。

            确保已在设备上启用USB调试

            在某些设备(尤其是小米)上,可能会遇到以下错误:

            java.lang.SecurityException: Injecting input events requires the caller (or the source of the instrumentation, if any) to have the INJECT_EVENTS permission.

            此时,需启用额外选项control USB调试(安全设置)(与USB调试不同),才能使用键盘和鼠标控制设备。启用后需重启设备。

            注意:OTG模式下无需开启USB调试。

            获取应用

            必知技巧

            使用示例

            提供多种选项,详见文档。以下为常用示例:

            • 以H.265格式捕获屏幕(更高画质),限制分辨率为1920,帧率60fps,禁用音频,并通过模拟物理键盘控制设备:

              bash
              scrcpy --video-codec=h265 --max-size=1920 --max-fps=60 --no-audio --keyboard=uhid
              +import{e as a,o as s,a as i,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"zhHans/reference/scrcpy/index.md","filePath":"zhHans/reference/scrcpy/index.md","lastUpdated":1777999882000}'),n={name:"zhHans/reference/scrcpy/index.md"};function l(t,e,c,p,h,o){return s(),i("div",null,[...e[0]||(e[0]=[r(`

              IMPORTANT

              Escrcpy基于以下开源项目构建。相关内容仅供参考,将定期更新。

              scrcpy (v3.2)

              scrcpy

              发音为 "screen copy"

              此应用通过USB或TCP/IP连接镜像Android设备(视频和音频),并支持使用计算机的键盘和鼠标进行控制。它不需要root权限,也无需在设备上安装应用。支持LinuxWindowsmacOS

              截图

              其特点包括:

              • 轻量:原生实现,仅显示设备屏幕
              • 高性能:30~120fps,具体取决于设备
              • 高质量:1920×1080或更高分辨率
              • 低延迟35~70毫秒
              • 快速启动:约1秒显示首帧画面
              • 无侵入性:不会在Android设备上留下任何痕迹
              • 用户友好:无需账户、无广告、无需联网
              • 自由:免费开源软件

              功能亮点:

              前提条件

              Android设备需至少支持API 21(Android 5.0)。

              音频转发需API >= 30(Android 11+)。

              确保已在设备上启用USB调试

              在某些设备(尤其是小米)上,可能会遇到以下错误:

              java.lang.SecurityException: Injecting input events requires the caller (or the source of the instrumentation, if any) to have the INJECT_EVENTS permission.

              此时,需启用额外选项control USB调试(安全设置)(与USB调试不同),才能使用键盘和鼠标控制设备。启用后需重启设备。

              注意:OTG模式下无需开启USB调试。

              获取应用

              必知技巧

              使用示例

              提供多种选项,详见文档。以下为常用示例:

              • 以H.265格式捕获屏幕(更高画质),限制分辨率为1920,帧率60fps,禁用音频,并通过模拟物理键盘控制设备:

                bash
                scrcpy --video-codec=h265 --max-size=1920 --max-fps=60 --no-audio --keyboard=uhid
                 scrcpy --video-codec=h265 -m1920 --max-fps=60 --no-audio -K  # 简写版本
              • 在新虚拟显示中启动VLC(与设备显示分离):

                bash
                scrcpy --new-display=1920x1080 --start-app=org.videolan.vlc
              • 以H.265格式录制设备摄像头(及麦克风)到MP4文件,分辨率1920x1080:

                bash
                scrcpy --video-source=camera --video-codec=h265 --camera-size=1920x1080 --record=file.mp4
              • 捕获设备前置摄像头并作为网络摄像头暴露给计算机(仅限Linux):

                bash
                scrcpy --video-source=camera --camera-size=1920x1080 --camera-facing=front --v4l2-sink=/dev/video2 --no-playback
              • 通过模拟物理键盘和鼠标控制设备,无需镜像(无需USB调试):

                bash
                scrcpy --otg
              • 使用连接到计算机的手柄控制设备:

                bash
                scrcpy --gamepad=uhid
                 scrcpy -G  # 简写版本

              用户文档

              应用提供丰富的功能和配置选项,详见以下页面:

              资源

              相关文章

              联系方式

              可通过issue提交错误报告、功能请求或一般问题。

              提交错误报告前,请先阅读常见问题,可能已包含解决方案。

              其他渠道:

              捐赠

              我是@rom1v,Scrcpy的作者和维护者。

              如果您喜欢此应用,可以支持我的开源工作

              许可证

              版权所有 (C) 2018 Genymobile
               版权所有 (C) 2018-2025 Romain Vimont
              diff --git a/assets/zhHans_reference_scrcpy_index.md.DAHNtU1Y.lean.js b/assets/zhHans_reference_scrcpy_index.md.6gBVsBM0.lean.js
              similarity index 86%
              rename from assets/zhHans_reference_scrcpy_index.md.DAHNtU1Y.lean.js
              rename to assets/zhHans_reference_scrcpy_index.md.6gBVsBM0.lean.js
              index ecbb69151..c56be6f0b 100644
              --- a/assets/zhHans_reference_scrcpy_index.md.DAHNtU1Y.lean.js
              +++ b/assets/zhHans_reference_scrcpy_index.md.6gBVsBM0.lean.js
              @@ -1 +1 @@
              -import{e as a,o as s,a as i,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"zhHans/reference/scrcpy/index.md","filePath":"zhHans/reference/scrcpy/index.md","lastUpdated":1776916170000}'),n={name:"zhHans/reference/scrcpy/index.md"};function l(t,e,c,p,h,o){return s(),i("div",null,[...e[0]||(e[0]=[r("",43)])])}const y=a(n,[["render",l]]);export{k as __pageData,y as default};
              +import{e as a,o as s,a as i,ag as r}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Scrcpy","description":"","frontmatter":{"title":"Scrcpy"},"headers":[],"relativePath":"zhHans/reference/scrcpy/index.md","filePath":"zhHans/reference/scrcpy/index.md","lastUpdated":1777999882000}'),n={name:"zhHans/reference/scrcpy/index.md"};function l(t,e,c,p,h,o){return s(),i("div",null,[...e[0]||(e[0]=[r("",43)])])}const y=a(n,[["render",l]]);export{k as __pageData,y as default};
              diff --git a/assets/zhHans_reference_scrcpy_keyboard.md.Cn4jH-On.js b/assets/zhHans_reference_scrcpy_keyboard.md.DYPYL1D7.js
              similarity index 98%
              rename from assets/zhHans_reference_scrcpy_keyboard.md.Cn4jH-On.js
              rename to assets/zhHans_reference_scrcpy_keyboard.md.DYPYL1D7.js
              index 425bab286..ba3cdbdab 100644
              --- a/assets/zhHans_reference_scrcpy_keyboard.md.Cn4jH-On.js
              +++ b/assets/zhHans_reference_scrcpy_keyboard.md.DYPYL1D7.js
              @@ -1,2 +1,2 @@
              -import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"keyboard(键盘)","description":"","frontmatter":{"title":"keyboard(键盘)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/keyboard.md","filePath":"zhHans/reference/scrcpy/keyboard.md","lastUpdated":1776916170000}'),r={name:"zhHans/reference/scrcpy/keyboard.md"};function d(p,a,l,h,o,n){return s(),i("div",null,[...a[0]||(a[0]=[t(`

              键盘

              提供多种键盘输入模式:

              • --keyboard=sdk(默认模式)
              • --keyboard=uhid(或简写为 -K):通过设备的 UHID 内核模块模拟物理 HID 键盘
              • --keyboard=aoa:通过 AOAv2 协议模拟物理 HID 键盘
              • --keyboard=disabled 禁用键盘输入

              默认使用 sdk 模式,但如果经常使用 scrcpy,建议切换到 uhid 模式并一次性配置键盘布局。


              SDK 键盘模式

              在此模式下(--keyboard=sdk 或省略参数时),键盘输入事件通过 Android API 层级注入。该模式通用性强,但仅支持 ASCII 和部分其他字符。

              注意:某些设备需在开发者选项中启用额外设置才能使此模式正常工作,详见前提条件

              以下参数(专用于 --keyboard=sdk)可自定义行为:

              文本注入偏好

              输入文本时会生成两种事件

              • 按键事件:表示按键的按下或释放;
              • 文本事件:表示文本的输入。

              默认情况下,数字和“特殊字符”通过文本事件插入,而字母通过按键事件注入(以便在游戏中正常响应 WASD 等按键)。

              但此行为可能导致问题。若遇到此类问题,可强制将字母作为文本注入(或直接切换至 UHID 模式):

              bash
              scrcpy --prefer-text

              (但这会破坏游戏中的键盘行为)

              反之,也可强制始终使用原始按键事件:

              bash
              scrcpy --raw-key-events

              按键重复

              默认情况下,长按按键会生成重复的按键事件。某些游戏中这些事件无用且可能导致性能问题。

              禁用重复按键事件转发:

              bash
              scrcpy --no-key-repeat

              物理键盘模拟

              两种模式可在设备上模拟物理 HID 键盘。为确保正常工作,需在设备上一次性配置与计算机匹配的键盘布局。

              可通过以下方式打开配置页面:

              • 使用 uhidaoa 模式时,在 scrcpy 窗口中按 MOD+k(见快捷键
              • 在设备上进入:设置 → 系统 → 语言与输入 → 物理键盘
              • 通过计算机终端执行:
                bash
                adb shell am start -a android.settings.HARD_KEYBOARD_SETTINGS

              在此配置页面中,还可启用或禁用屏幕键盘。

              UHID 模式

              此模式通过设备的 UHID 内核模块模拟物理 HID 键盘。

              启用 UHID 键盘:

              bash
              scrcpy --keyboard=uhid
              +import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"keyboard(键盘)","description":"","frontmatter":{"title":"keyboard(键盘)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/keyboard.md","filePath":"zhHans/reference/scrcpy/keyboard.md","lastUpdated":1777999882000}'),r={name:"zhHans/reference/scrcpy/keyboard.md"};function d(p,a,l,h,o,n){return s(),i("div",null,[...a[0]||(a[0]=[t(`

              键盘

              提供多种键盘输入模式:

              • --keyboard=sdk(默认模式)
              • --keyboard=uhid(或简写为 -K):通过设备的 UHID 内核模块模拟物理 HID 键盘
              • --keyboard=aoa:通过 AOAv2 协议模拟物理 HID 键盘
              • --keyboard=disabled 禁用键盘输入

              默认使用 sdk 模式,但如果经常使用 scrcpy,建议切换到 uhid 模式并一次性配置键盘布局。


              SDK 键盘模式

              在此模式下(--keyboard=sdk 或省略参数时),键盘输入事件通过 Android API 层级注入。该模式通用性强,但仅支持 ASCII 和部分其他字符。

              注意:某些设备需在开发者选项中启用额外设置才能使此模式正常工作,详见前提条件

              以下参数(专用于 --keyboard=sdk)可自定义行为:

              文本注入偏好

              输入文本时会生成两种事件

              • 按键事件:表示按键的按下或释放;
              • 文本事件:表示文本的输入。

              默认情况下,数字和“特殊字符”通过文本事件插入,而字母通过按键事件注入(以便在游戏中正常响应 WASD 等按键)。

              但此行为可能导致问题。若遇到此类问题,可强制将字母作为文本注入(或直接切换至 UHID 模式):

              bash
              scrcpy --prefer-text

              (但这会破坏游戏中的键盘行为)

              反之,也可强制始终使用原始按键事件:

              bash
              scrcpy --raw-key-events

              按键重复

              默认情况下,长按按键会生成重复的按键事件。某些游戏中这些事件无用且可能导致性能问题。

              禁用重复按键事件转发:

              bash
              scrcpy --no-key-repeat

              物理键盘模拟

              两种模式可在设备上模拟物理 HID 键盘。为确保正常工作,需在设备上一次性配置与计算机匹配的键盘布局。

              可通过以下方式打开配置页面:

              • 使用 uhidaoa 模式时,在 scrcpy 窗口中按 MOD+k(见快捷键
              • 在设备上进入:设置 → 系统 → 语言与输入 → 物理键盘
              • 通过计算机终端执行:
                bash
                adb shell am start -a android.settings.HARD_KEYBOARD_SETTINGS

              在此配置页面中,还可启用或禁用屏幕键盘。

              UHID 模式

              此模式通过设备的 UHID 内核模块模拟物理 HID 键盘。

              启用 UHID 键盘:

              bash
              scrcpy --keyboard=uhid
               scrcpy -K  # 简写形式

              配置键盘布局后(见上文),这是镜像时使用键盘的最佳模式:

              • 支持所有字符和输入法(与 --keyboard=sdk 不同)
              • 可禁用屏幕键盘(与 --keyboard=sdk 不同)
              • 支持 TCP/IP 无线连接(与 --keyboard=aoa 不同)
              • 在 Windows 上无兼容问题(与 --keyboard=aoa 不同)

              缺点是由于权限问题,旧版 Android 可能无法使用此模式。

              AOA 模式

              此模式通过 AOAv2 协议模拟物理 HID 键盘。

              启用 AOA 键盘:

              bash
              scrcpy --keyboard=aoa

              与其他模式不同,AOA 直接在 USB 层级工作(仅支持有线连接)。

              它不使用 scrcpy 服务端,且无需 adb(USB 调试)。因此,即使关闭 USB 调试,仍可控制设备(但不支持镜像,见 OTG)。

              注意:在 Windows 上,此模式可能仅支持 OTG 模式,镜像时无法使用(若 USB 设备已被其他进程如 adb 守护进程 占用,则无法重复打开)。

              `,42)])])}const b=e(r,[["render",d]]);export{k as __pageData,b as default}; diff --git a/assets/zhHans_reference_scrcpy_keyboard.md.Cn4jH-On.lean.js b/assets/zhHans_reference_scrcpy_keyboard.md.DYPYL1D7.lean.js similarity index 75% rename from assets/zhHans_reference_scrcpy_keyboard.md.Cn4jH-On.lean.js rename to assets/zhHans_reference_scrcpy_keyboard.md.DYPYL1D7.lean.js index e1498542f..879826017 100644 --- a/assets/zhHans_reference_scrcpy_keyboard.md.Cn4jH-On.lean.js +++ b/assets/zhHans_reference_scrcpy_keyboard.md.DYPYL1D7.lean.js @@ -1 +1 @@ -import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"keyboard(键盘)","description":"","frontmatter":{"title":"keyboard(键盘)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/keyboard.md","filePath":"zhHans/reference/scrcpy/keyboard.md","lastUpdated":1776916170000}'),r={name:"zhHans/reference/scrcpy/keyboard.md"};function d(p,a,l,h,o,n){return s(),i("div",null,[...a[0]||(a[0]=[t("",42)])])}const b=e(r,[["render",d]]);export{k as __pageData,b as default}; +import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"keyboard(键盘)","description":"","frontmatter":{"title":"keyboard(键盘)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/keyboard.md","filePath":"zhHans/reference/scrcpy/keyboard.md","lastUpdated":1777999882000}'),r={name:"zhHans/reference/scrcpy/keyboard.md"};function d(p,a,l,h,o,n){return s(),i("div",null,[...a[0]||(a[0]=[t("",42)])])}const b=e(r,[["render",d]]);export{k as __pageData,b as default}; diff --git a/assets/zhHans_reference_scrcpy_linux.md.CBKcy-vy.js b/assets/zhHans_reference_scrcpy_linux.md.EXbVcpfJ.js similarity index 99% rename from assets/zhHans_reference_scrcpy_linux.md.CBKcy-vy.js rename to assets/zhHans_reference_scrcpy_linux.md.EXbVcpfJ.js index 6f459677f..cf2b4d07e 100644 --- a/assets/zhHans_reference_scrcpy_linux.md.CBKcy-vy.js +++ b/assets/zhHans_reference_scrcpy_linux.md.EXbVcpfJ.js @@ -1,4 +1,4 @@ -import{e as a,o as i,a as e,ag as l}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Linux(平台指南)","description":"","frontmatter":{"title":"Linux(平台指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/linux.md","filePath":"zhHans/reference/scrcpy/linux.md","lastUpdated":1776916170000}'),t={name:"zhHans/reference/scrcpy/linux.md"};function n(p,s,h,r,c,d){return i(),e("div",null,[...s[0]||(s[0]=[l(`

              Linux 平台指南

              安装

              官方发布版本

              下载最新版本的静态构建包:

              下载后解压即可。

              Linux平台的静态构建版本仍处于实验阶段。

              通过包管理器安装

              Packaging status

              Scrcpy已被多种发行版和包管理器收录:

              • Debian/Ubuntu: apt install scrcpy (版本过旧)
              • Arch Linux: pacman -S scrcpy
              • Fedora: dnf copr enable zeno/scrcpy && dnf install scrcpy
              • Gentoo: emerge scrcpy
              • Snap: snap install scrcpy
              • … (详见 repology)

              使用安装脚本

              如需安装master分支的最新版本,可按以下简化流程操作:

              首先安装依赖包:

              bash
              # Debian/Ubuntu系统
              +import{e as a,o as i,a as e,ag as l}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Linux(平台指南)","description":"","frontmatter":{"title":"Linux(平台指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/linux.md","filePath":"zhHans/reference/scrcpy/linux.md","lastUpdated":1777999882000}'),t={name:"zhHans/reference/scrcpy/linux.md"};function n(p,s,h,r,c,d){return i(),e("div",null,[...s[0]||(s[0]=[l(`

              Linux 平台指南

              安装

              官方发布版本

              下载最新版本的静态构建包:

              下载后解压即可。

              Linux平台的静态构建版本仍处于实验阶段。

              通过包管理器安装

              Packaging status

              Scrcpy已被多种发行版和包管理器收录:

              • Debian/Ubuntu: apt install scrcpy (版本过旧)
              • Arch Linux: pacman -S scrcpy
              • Fedora: dnf copr enable zeno/scrcpy && dnf install scrcpy
              • Gentoo: emerge scrcpy
              • Snap: snap install scrcpy
              • … (详见 repology)

              使用安装脚本

              如需安装master分支的最新版本,可按以下简化流程操作:

              首先安装依赖包:

              bash
              # Debian/Ubuntu系统
               sudo apt install ffmpeg libsdl2-2.0-0 adb wget \\
                                gcc git pkg-config meson ninja-build libsdl2-dev \\
                                libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev \\
              diff --git a/assets/zhHans_reference_scrcpy_linux.md.CBKcy-vy.lean.js b/assets/zhHans_reference_scrcpy_linux.md.EXbVcpfJ.lean.js
              similarity index 87%
              rename from assets/zhHans_reference_scrcpy_linux.md.CBKcy-vy.lean.js
              rename to assets/zhHans_reference_scrcpy_linux.md.EXbVcpfJ.lean.js
              index d1de4c984..f70b950f4 100644
              --- a/assets/zhHans_reference_scrcpy_linux.md.CBKcy-vy.lean.js
              +++ b/assets/zhHans_reference_scrcpy_linux.md.EXbVcpfJ.lean.js
              @@ -1 +1 @@
              -import{e as a,o as i,a as e,ag as l}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Linux(平台指南)","description":"","frontmatter":{"title":"Linux(平台指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/linux.md","filePath":"zhHans/reference/scrcpy/linux.md","lastUpdated":1776916170000}'),t={name:"zhHans/reference/scrcpy/linux.md"};function n(p,s,h,r,c,d){return i(),e("div",null,[...s[0]||(s[0]=[l("",31)])])}const g=a(t,[["render",n]]);export{k as __pageData,g as default};
              +import{e as a,o as i,a as e,ag as l}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Linux(平台指南)","description":"","frontmatter":{"title":"Linux(平台指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/linux.md","filePath":"zhHans/reference/scrcpy/linux.md","lastUpdated":1777999882000}'),t={name:"zhHans/reference/scrcpy/linux.md"};function n(p,s,h,r,c,d){return i(),e("div",null,[...s[0]||(s[0]=[l("",31)])])}const g=a(t,[["render",n]]);export{k as __pageData,g as default};
              diff --git a/assets/zhHans_reference_scrcpy_macos.md.STr7UfC2.js b/assets/zhHans_reference_scrcpy_macos.md.hIvaSvin.js
              similarity index 97%
              rename from assets/zhHans_reference_scrcpy_macos.md.STr7UfC2.js
              rename to assets/zhHans_reference_scrcpy_macos.md.hIvaSvin.js
              index 35eb0c62a..31b21ba6e 100644
              --- a/assets/zhHans_reference_scrcpy_macos.md.STr7UfC2.js
              +++ b/assets/zhHans_reference_scrcpy_macos.md.hIvaSvin.js
              @@ -1 +1 @@
              -import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const b=JSON.parse('{"title":"MacOS(平台指南)","description":"","frontmatter":{"title":"MacOS(平台指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/macos.md","filePath":"zhHans/reference/scrcpy/macos.md","lastUpdated":1776916170000}'),c={name:"zhHans/reference/scrcpy/macos.md"};function r(p,a,l,h,n,o){return s(),i("div",null,[...a[0]||(a[0]=[t('

              在 macOS 上使用 scrcpy

              安装

              从官方发布版本安装

              下载最新版本的静态构建包:

              下载完成后解压即可。

              注意:macOS 版的 scrcpy 静态构建包仍处于实验阶段。

              通过包管理器安装

              Scrcpy 可通过 Homebrew 安装:

              bash
              brew install scrcpy

              你需要确保 adb 工具已在 PATH 环境变量中。如果尚未安装:

              bash
              brew install --cask android-platform-tools

              此外,Scrcpy 也可通过 MacPorts 安装,该工具会自动配置 adb

              bash
              sudo port install scrcpy

              如需手动构建和安装,请参阅 build

              运行

              请确保你的设备满足使用前提

              安装完成后,在终端中运行:

              bash
              scrcpy

              或带参数运行(以下示例为禁用音频并录制到 file.mkv):

              bash
              scrcpy --no-audio --record=file.mkv

              命令行参数的文档可通过以下方式查看:

              ',23)])])}const k=e(c,[["render",r]]);export{b as __pageData,k as default}; +import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const b=JSON.parse('{"title":"MacOS(平台指南)","description":"","frontmatter":{"title":"MacOS(平台指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/macos.md","filePath":"zhHans/reference/scrcpy/macos.md","lastUpdated":1777999882000}'),c={name:"zhHans/reference/scrcpy/macos.md"};function r(p,a,l,h,n,o){return s(),i("div",null,[...a[0]||(a[0]=[t('

              在 macOS 上使用 scrcpy

              安装

              从官方发布版本安装

              下载最新版本的静态构建包:

              下载完成后解压即可。

              注意:macOS 版的 scrcpy 静态构建包仍处于实验阶段。

              通过包管理器安装

              Scrcpy 可通过 Homebrew 安装:

              bash
              brew install scrcpy

              你需要确保 adb 工具已在 PATH 环境变量中。如果尚未安装:

              bash
              brew install --cask android-platform-tools

              此外,Scrcpy 也可通过 MacPorts 安装,该工具会自动配置 adb

              bash
              sudo port install scrcpy

              如需手动构建和安装,请参阅 build

              运行

              请确保你的设备满足使用前提

              安装完成后,在终端中运行:

              bash
              scrcpy

              或带参数运行(以下示例为禁用音频并录制到 file.mkv):

              bash
              scrcpy --no-audio --record=file.mkv

              命令行参数的文档可通过以下方式查看:

              ',23)])])}const k=e(c,[["render",r]]);export{b as __pageData,k as default}; diff --git a/assets/zhHans_reference_scrcpy_macos.md.STr7UfC2.lean.js b/assets/zhHans_reference_scrcpy_macos.md.hIvaSvin.lean.js similarity index 75% rename from assets/zhHans_reference_scrcpy_macos.md.STr7UfC2.lean.js rename to assets/zhHans_reference_scrcpy_macos.md.hIvaSvin.lean.js index adae1fa99..6bbe18d70 100644 --- a/assets/zhHans_reference_scrcpy_macos.md.STr7UfC2.lean.js +++ b/assets/zhHans_reference_scrcpy_macos.md.hIvaSvin.lean.js @@ -1 +1 @@ -import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const b=JSON.parse('{"title":"MacOS(平台指南)","description":"","frontmatter":{"title":"MacOS(平台指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/macos.md","filePath":"zhHans/reference/scrcpy/macos.md","lastUpdated":1776916170000}'),c={name:"zhHans/reference/scrcpy/macos.md"};function r(p,a,l,h,n,o){return s(),i("div",null,[...a[0]||(a[0]=[t("",23)])])}const k=e(c,[["render",r]]);export{b as __pageData,k as default}; +import{e,o as s,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const b=JSON.parse('{"title":"MacOS(平台指南)","description":"","frontmatter":{"title":"MacOS(平台指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/macos.md","filePath":"zhHans/reference/scrcpy/macos.md","lastUpdated":1777999882000}'),c={name:"zhHans/reference/scrcpy/macos.md"};function r(p,a,l,h,n,o){return s(),i("div",null,[...a[0]||(a[0]=[t("",23)])])}const k=e(c,[["render",r]]);export{b as __pageData,k as default}; diff --git a/assets/zhHans_reference_scrcpy_mouse.md.C6aH6Fyb.js b/assets/zhHans_reference_scrcpy_mouse.md.Cq2ENg_v.js similarity index 99% rename from assets/zhHans_reference_scrcpy_mouse.md.C6aH6Fyb.js rename to assets/zhHans_reference_scrcpy_mouse.md.Cq2ENg_v.js index f9eedaf3a..94ad821e0 100644 --- a/assets/zhHans_reference_scrcpy_mouse.md.C6aH6Fyb.js +++ b/assets/zhHans_reference_scrcpy_mouse.md.Cq2ENg_v.js @@ -1,4 +1,4 @@ -import{e as a,o as e,a as i,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Mouse(鼠标)","description":"","frontmatter":{"title":"Mouse(鼠标)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/mouse.md","filePath":"zhHans/reference/scrcpy/mouse.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/mouse.md"};function l(t,s,h,d,c,o){return e(),i("div",null,[...s[0]||(s[0]=[n(`

              鼠标

              提供多种鼠标输入模式:

              • --mouse=sdk(默认模式)
              • --mouse=uhid(或 -M):通过设备的 UHID 内核模块模拟物理 HID 鼠标
              • --mouse=aoa:通过 AOAv2 协议模拟物理 HID 鼠标
              • --mouse=disabled

              SDK 鼠标模式

              在此模式下(--mouse=sdk 或省略参数时),鼠标输入事件会以绝对坐标的形式通过 Android API 注入设备。

              注意:在某些设备上,开发者选项中需启用额外选项才能使此模式生效。详见前提条件

              鼠标悬停

              默认情况下,鼠标悬停(无点击的鼠标移动)事件会被转发到设备。可通过以下命令禁用:

              scrcpy --no-mouse-hover

              物理鼠标模拟

              有两种模式可在设备上模拟物理 HID 鼠标。

              在这些模式下,计算机鼠标会被“捕获”:鼠标指针从计算机消失,转而出现在 Android 设备上。

              通过快捷键修饰键(默认为 AltSuper)可切换(禁用或启用)鼠标捕获功能。使用其中之一可将鼠标控制权交还给计算机。

              UHID 模式

              此模式通过设备的 UHID 内核模块模拟物理 HID 鼠标。

              启用 UHID 鼠标模式的命令:

              bash
              scrcpy --mouse=uhid
              +import{e as a,o as e,a as i,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Mouse(鼠标)","description":"","frontmatter":{"title":"Mouse(鼠标)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/mouse.md","filePath":"zhHans/reference/scrcpy/mouse.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/mouse.md"};function l(t,s,h,d,c,o){return e(),i("div",null,[...s[0]||(s[0]=[n(`

              鼠标

              提供多种鼠标输入模式:

              • --mouse=sdk(默认模式)
              • --mouse=uhid(或 -M):通过设备的 UHID 内核模块模拟物理 HID 鼠标
              • --mouse=aoa:通过 AOAv2 协议模拟物理 HID 鼠标
              • --mouse=disabled

              SDK 鼠标模式

              在此模式下(--mouse=sdk 或省略参数时),鼠标输入事件会以绝对坐标的形式通过 Android API 注入设备。

              注意:在某些设备上,开发者选项中需启用额外选项才能使此模式生效。详见前提条件

              鼠标悬停

              默认情况下,鼠标悬停(无点击的鼠标移动)事件会被转发到设备。可通过以下命令禁用:

              scrcpy --no-mouse-hover

              物理鼠标模拟

              有两种模式可在设备上模拟物理 HID 鼠标。

              在这些模式下,计算机鼠标会被“捕获”:鼠标指针从计算机消失,转而出现在 Android 设备上。

              通过快捷键修饰键(默认为 AltSuper)可切换(禁用或启用)鼠标捕获功能。使用其中之一可将鼠标控制权交还给计算机。

              UHID 模式

              此模式通过设备的 UHID 内核模块模拟物理 HID 鼠标。

              启用 UHID 鼠标模式的命令:

              bash
              scrcpy --mouse=uhid
               scrcpy -M  # 简写形式

              注意:由于权限问题,UHID 在旧版 Android 上可能无法工作。

              AOA 模式

              此模式通过 AOAv2 协议模拟物理 HID 鼠标。

              启用 AOA 鼠标模式的命令:

              bash
              scrcpy --mouse=aoa

              与其他模式不同,此模式直接在 USB 层面工作(因此仅支持 USB 连接)。

              它不使用 scrcpy 服务端,也不依赖 adb(USB 调试)。因此,即使 USB 调试被禁用,仍可控制设备(但无法镜像)。详见 OTG

              注意:在 Windows 上,此模式可能仅在 OTG 模式下有效,镜像时无效(如果 USB 设备已被其他进程如 adb 守护进程 占用,则无法打开)。

              鼠标按键绑定

              默认情况下,在 SDK 鼠标模式下:

              • 右键触发 BACK(或点亮屏幕)
              • 中键触发 HOME
              • 第四键触发 APP_SWITCH
              • 第五键展开通知面板

              通过按住 Shift 键,可将次要点击事件转发到设备(例如 Shift+右键会向设备注入右键点击)。

              在 AOA 和 UHID 鼠标模式下,默认绑定相反:所有点击默认被转发,按住 Shift 可触发快捷键(由于光标由设备端处理,在此模式下默认转发所有鼠标按键更合理)。

              可通过 --mouse-bind=xxxx:xxxx 配置任何鼠标模式的快捷键。参数必须为一或两组(用 : 分隔)共 4 个字符的序列,分别对应每次次要点击:

                              .---- Shift + 右键
                      次要绑定 |.--- Shift + 中键
                              ||.-- Shift + 第四键
              diff --git a/assets/zhHans_reference_scrcpy_mouse.md.C6aH6Fyb.lean.js b/assets/zhHans_reference_scrcpy_mouse.md.Cq2ENg_v.lean.js
              similarity index 87%
              rename from assets/zhHans_reference_scrcpy_mouse.md.C6aH6Fyb.lean.js
              rename to assets/zhHans_reference_scrcpy_mouse.md.Cq2ENg_v.lean.js
              index f9c5e8a0b..fb7fdb540 100644
              --- a/assets/zhHans_reference_scrcpy_mouse.md.C6aH6Fyb.lean.js
              +++ b/assets/zhHans_reference_scrcpy_mouse.md.Cq2ENg_v.lean.js
              @@ -1 +1 @@
              -import{e as a,o as e,a as i,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Mouse(鼠标)","description":"","frontmatter":{"title":"Mouse(鼠标)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/mouse.md","filePath":"zhHans/reference/scrcpy/mouse.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/mouse.md"};function l(t,s,h,d,c,o){return e(),i("div",null,[...s[0]||(s[0]=[n("",38)])])}const u=a(p,[["render",l]]);export{k as __pageData,u as default};
              +import{e as a,o as e,a as i,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Mouse(鼠标)","description":"","frontmatter":{"title":"Mouse(鼠标)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/mouse.md","filePath":"zhHans/reference/scrcpy/mouse.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/mouse.md"};function l(t,s,h,d,c,o){return e(),i("div",null,[...s[0]||(s[0]=[n("",38)])])}const u=a(p,[["render",l]]);export{k as __pageData,u as default};
              diff --git a/assets/zhHans_reference_scrcpy_otg.md.upw6u_tw.js b/assets/zhHans_reference_scrcpy_otg.md.DPLP1u79.js
              similarity index 99%
              rename from assets/zhHans_reference_scrcpy_otg.md.upw6u_tw.js
              rename to assets/zhHans_reference_scrcpy_otg.md.DPLP1u79.js
              index de8e0ee34..56b03fd3c 100644
              --- a/assets/zhHans_reference_scrcpy_otg.md.upw6u_tw.js
              +++ b/assets/zhHans_reference_scrcpy_otg.md.DPLP1u79.js
              @@ -1,4 +1,4 @@
              -import{e as a,o as i,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"OTG","description":"","frontmatter":{"title":"OTG"},"headers":[],"relativePath":"zhHans/reference/scrcpy/otg.md","filePath":"zhHans/reference/scrcpy/otg.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/otg.md"};function h(t,s,l,r,d,k){return i(),e("div",null,[...s[0]||(s[0]=[n(`

              OTG

              默认情况下,scrcpy 通过 Android API 层级注入输入事件。作为替代方案,它可以发送 HID 事件,使得 scrcpy 的行为类似于连接到 Android 设备的物理键盘和/或物理鼠标(详见键盘鼠标)。

              一种特殊模式(OTG)允许使用 AOA 键盘鼠标游戏手柄控制设备,完全无需使用 adb(因此 USB 调试不是必需的)。在此模式下,视频和音频被禁用,且默认启用 --keyboard=aoa--mouse=aoa。但游戏手柄默认禁用,因此需要显式设置 --gamepad=aoa(或在 OTG 模式下使用 -G)。

              因此,可以仅通过物理键盘、鼠标和游戏手柄模拟运行 scrcpy,就像计算机的键盘、鼠标和游戏手柄通过 OTG 线缆直接连接到设备一样。

              启用 OTG 模式:

              bash
              scrcpy --otg
              +import{e as a,o as i,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"OTG","description":"","frontmatter":{"title":"OTG"},"headers":[],"relativePath":"zhHans/reference/scrcpy/otg.md","filePath":"zhHans/reference/scrcpy/otg.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/otg.md"};function h(t,s,l,r,d,k){return i(),e("div",null,[...s[0]||(s[0]=[n(`

              OTG

              默认情况下,scrcpy 通过 Android API 层级注入输入事件。作为替代方案,它可以发送 HID 事件,使得 scrcpy 的行为类似于连接到 Android 设备的物理键盘和/或物理鼠标(详见键盘鼠标)。

              一种特殊模式(OTG)允许使用 AOA 键盘鼠标游戏手柄控制设备,完全无需使用 adb(因此 USB 调试不是必需的)。在此模式下,视频和音频被禁用,且默认启用 --keyboard=aoa--mouse=aoa。但游戏手柄默认禁用,因此需要显式设置 --gamepad=aoa(或在 OTG 模式下使用 -G)。

              因此,可以仅通过物理键盘、鼠标和游戏手柄模拟运行 scrcpy,就像计算机的键盘、鼠标和游戏手柄通过 OTG 线缆直接连接到设备一样。

              启用 OTG 模式:

              bash
              scrcpy --otg
               # 如果连接了多个 USB 设备,需指定序列号
               scrcpy --otg -s 0123456789abcdef

              可以禁用键盘或鼠标:

              bash
              scrcpy --otg --keyboard=disabled
               scrcpy --otg --mouse=disabled

              并启用游戏手柄:

              bash
              scrcpy --otg --gamepad=aoa
              diff --git a/assets/zhHans_reference_scrcpy_otg.md.upw6u_tw.lean.js b/assets/zhHans_reference_scrcpy_otg.md.DPLP1u79.lean.js
              similarity index 86%
              rename from assets/zhHans_reference_scrcpy_otg.md.upw6u_tw.lean.js
              rename to assets/zhHans_reference_scrcpy_otg.md.DPLP1u79.lean.js
              index b975e8849..3690a398a 100644
              --- a/assets/zhHans_reference_scrcpy_otg.md.upw6u_tw.lean.js
              +++ b/assets/zhHans_reference_scrcpy_otg.md.DPLP1u79.lean.js
              @@ -1 +1 @@
              -import{e as a,o as i,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"OTG","description":"","frontmatter":{"title":"OTG"},"headers":[],"relativePath":"zhHans/reference/scrcpy/otg.md","filePath":"zhHans/reference/scrcpy/otg.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/otg.md"};function h(t,s,l,r,d,k){return i(),e("div",null,[...s[0]||(s[0]=[n("",19)])])}const g=a(p,[["render",h]]);export{c as __pageData,g as default};
              +import{e as a,o as i,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const c=JSON.parse('{"title":"OTG","description":"","frontmatter":{"title":"OTG"},"headers":[],"relativePath":"zhHans/reference/scrcpy/otg.md","filePath":"zhHans/reference/scrcpy/otg.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/otg.md"};function h(t,s,l,r,d,k){return i(),e("div",null,[...s[0]||(s[0]=[n("",19)])])}const g=a(p,[["render",h]]);export{c as __pageData,g as default};
              diff --git a/assets/zhHans_reference_scrcpy_recording.md.Degt-sIM.js b/assets/zhHans_reference_scrcpy_recording.md.C8XHQgXy.js
              similarity index 99%
              rename from assets/zhHans_reference_scrcpy_recording.md.Degt-sIM.js
              rename to assets/zhHans_reference_scrcpy_recording.md.C8XHQgXy.js
              index 2db45a753..44e931a4d 100644
              --- a/assets/zhHans_reference_scrcpy_recording.md.Degt-sIM.js
              +++ b/assets/zhHans_reference_scrcpy_recording.md.C8XHQgXy.js
              @@ -1,4 +1,4 @@
              -import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Recording(录制)","description":"","frontmatter":{"title":"Recording(录制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/recording.md","filePath":"zhHans/reference/scrcpy/recording.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/recording.md"};function n(l,s,h,d,c,r){return i(),e("div",null,[...s[0]||(s[0]=[t(`

              录制

              在镜像时录制视频和音频流:

              bash
              scrcpy --record=file.mp4
              +import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Recording(录制)","description":"","frontmatter":{"title":"Recording(录制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/recording.md","filePath":"zhHans/reference/scrcpy/recording.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/recording.md"};function n(l,s,h,d,c,r){return i(),e("div",null,[...s[0]||(s[0]=[t(`

              录制

              在镜像时录制视频和音频流:

              bash
              scrcpy --record=file.mp4
               scrcpy -r file.mkv

              仅录制视频:

              bash
              scrcpy --no-audio --record=file.mp4

              仅录制音频:

              bash
              scrcpy --no-video --record=file.opus
               scrcpy --no-video --audio-codec=aac --record=file.aac
               scrcpy --no-video --audio-codec=flac --record=file.flac
              diff --git a/assets/zhHans_reference_scrcpy_recording.md.Degt-sIM.lean.js b/assets/zhHans_reference_scrcpy_recording.md.C8XHQgXy.lean.js
              similarity index 87%
              rename from assets/zhHans_reference_scrcpy_recording.md.Degt-sIM.lean.js
              rename to assets/zhHans_reference_scrcpy_recording.md.C8XHQgXy.lean.js
              index 8585736a7..967b92c18 100644
              --- a/assets/zhHans_reference_scrcpy_recording.md.Degt-sIM.lean.js
              +++ b/assets/zhHans_reference_scrcpy_recording.md.C8XHQgXy.lean.js
              @@ -1 +1 @@
              -import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Recording(录制)","description":"","frontmatter":{"title":"Recording(录制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/recording.md","filePath":"zhHans/reference/scrcpy/recording.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/recording.md"};function n(l,s,h,d,c,r){return i(),e("div",null,[...s[0]||(s[0]=[t("",28)])])}const g=a(p,[["render",n]]);export{o as __pageData,g as default};
              +import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Recording(录制)","description":"","frontmatter":{"title":"Recording(录制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/recording.md","filePath":"zhHans/reference/scrcpy/recording.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/recording.md"};function n(l,s,h,d,c,r){return i(),e("div",null,[...s[0]||(s[0]=[t("",28)])])}const g=a(p,[["render",n]]);export{o as __pageData,g as default};
              diff --git a/assets/zhHans_reference_scrcpy_shortcuts.md.BqCcsFsa.js b/assets/zhHans_reference_scrcpy_shortcuts.md.E4-Y4OFe.js
              similarity index 99%
              rename from assets/zhHans_reference_scrcpy_shortcuts.md.BqCcsFsa.js
              rename to assets/zhHans_reference_scrcpy_shortcuts.md.E4-Y4OFe.js
              index 66ed48417..0266c966b 100644
              --- a/assets/zhHans_reference_scrcpy_shortcuts.md.BqCcsFsa.js
              +++ b/assets/zhHans_reference_scrcpy_shortcuts.md.E4-Y4OFe.js
              @@ -1,4 +1,4 @@
              -import{e as t,o as k,a as b,ag as e}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Shortcuts(快捷键)","description":"","frontmatter":{"title":"Shortcuts(快捷键)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/shortcuts.md","filePath":"zhHans/reference/scrcpy/shortcuts.md","lastUpdated":1776916170000}'),r={name:"zhHans/reference/scrcpy/shortcuts.md"};function s(a,d,c,i,o,n){return k(),b("div",null,[...d[0]||(d[0]=[e(`

              快捷键

              在 scrcpy 窗口中可以通过键盘和鼠标快捷键执行操作。

              以下列表中,MOD 是快捷键修饰键。默认情况下是(左)Alt 或(左)Super

              可以使用 --shortcut-mod 修改修饰键。可选键包括 lctrlrctrllaltraltlsuperrsuper。例如:

              bash
              # 使用右Ctrl作为快捷键修饰键
              +import{e as t,o as k,a as b,ag as e}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Shortcuts(快捷键)","description":"","frontmatter":{"title":"Shortcuts(快捷键)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/shortcuts.md","filePath":"zhHans/reference/scrcpy/shortcuts.md","lastUpdated":1777999882000}'),r={name:"zhHans/reference/scrcpy/shortcuts.md"};function s(a,d,c,i,o,n){return k(),b("div",null,[...d[0]||(d[0]=[e(`

              快捷键

              在 scrcpy 窗口中可以通过键盘和鼠标快捷键执行操作。

              以下列表中,MOD 是快捷键修饰键。默认情况下是(左)Alt 或(左)Super

              可以使用 --shortcut-mod 修改修饰键。可选键包括 lctrlrctrllaltraltlsuperrsuper。例如:

              bash
              # 使用右Ctrl作为快捷键修饰键
               scrcpy --shortcut-mod=rctrl
               
               # 使用左Ctrl或左Super作为快捷键修饰键
              diff --git a/assets/zhHans_reference_scrcpy_shortcuts.md.BqCcsFsa.lean.js b/assets/zhHans_reference_scrcpy_shortcuts.md.E4-Y4OFe.lean.js
              similarity index 88%
              rename from assets/zhHans_reference_scrcpy_shortcuts.md.BqCcsFsa.lean.js
              rename to assets/zhHans_reference_scrcpy_shortcuts.md.E4-Y4OFe.lean.js
              index 35162ad67..13c18bfbc 100644
              --- a/assets/zhHans_reference_scrcpy_shortcuts.md.BqCcsFsa.lean.js
              +++ b/assets/zhHans_reference_scrcpy_shortcuts.md.E4-Y4OFe.lean.js
              @@ -1 +1 @@
              -import{e as t,o as k,a as b,ag as e}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Shortcuts(快捷键)","description":"","frontmatter":{"title":"Shortcuts(快捷键)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/shortcuts.md","filePath":"zhHans/reference/scrcpy/shortcuts.md","lastUpdated":1776916170000}'),r={name:"zhHans/reference/scrcpy/shortcuts.md"};function s(a,d,c,i,o,n){return k(),b("div",null,[...d[0]||(d[0]=[e("",11)])])}const h=t(r,[["render",s]]);export{p as __pageData,h as default};
              +import{e as t,o as k,a as b,ag as e}from"./chunks/framework.D2Fz4Hoy.js";const p=JSON.parse('{"title":"Shortcuts(快捷键)","description":"","frontmatter":{"title":"Shortcuts(快捷键)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/shortcuts.md","filePath":"zhHans/reference/scrcpy/shortcuts.md","lastUpdated":1777999882000}'),r={name:"zhHans/reference/scrcpy/shortcuts.md"};function s(a,d,c,i,o,n){return k(),b("div",null,[...d[0]||(d[0]=[e("",11)])])}const h=t(r,[["render",s]]);export{p as __pageData,h as default};
              diff --git a/assets/zhHans_reference_scrcpy_tunnels.md.0tdj1aM8.js b/assets/zhHans_reference_scrcpy_tunnels.md.DS3RA5Gh.js
              similarity index 99%
              rename from assets/zhHans_reference_scrcpy_tunnels.md.0tdj1aM8.js
              rename to assets/zhHans_reference_scrcpy_tunnels.md.DS3RA5Gh.js
              index dba6e0af9..a0c15396e 100644
              --- a/assets/zhHans_reference_scrcpy_tunnels.md.0tdj1aM8.js
              +++ b/assets/zhHans_reference_scrcpy_tunnels.md.DS3RA5Gh.js
              @@ -1,4 +1,4 @@
              -import{e as i,o as a,a as n,ag as p}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Tunnels(隧道连接)","description":"","frontmatter":{"title":"Tunnels(隧道连接)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/tunnels.md","filePath":"zhHans/reference/scrcpy/tunnels.md","lastUpdated":1776916170000}'),h={name:"zhHans/reference/scrcpy/tunnels.md"};function t(l,s,e,k,d,c){return a(),n("div",null,[...s[0]||(s[0]=[p(`

              隧道连接

              Scrcpy 主要用于镜像本地安卓设备。通过隧道技术,可以实现远程设备连接(例如通过互联网)。

              要连接远程设备,可以让本地 adb 客户端连接到远程 adb 服务器(需确保双方使用相同版本的 adb 协议)。

              远程 ADB 服务器

              要连接到远程 adb 服务器,需将服务器设置为监听所有网络接口:

              bash
              adb kill-server
              +import{e as i,o as a,a as n,ag as p}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Tunnels(隧道连接)","description":"","frontmatter":{"title":"Tunnels(隧道连接)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/tunnels.md","filePath":"zhHans/reference/scrcpy/tunnels.md","lastUpdated":1777999882000}'),h={name:"zhHans/reference/scrcpy/tunnels.md"};function t(l,s,e,k,d,c){return a(),n("div",null,[...s[0]||(s[0]=[p(`

              隧道连接

              Scrcpy 主要用于镜像本地安卓设备。通过隧道技术,可以实现远程设备连接(例如通过互联网)。

              要连接远程设备,可以让本地 adb 客户端连接到远程 adb 服务器(需确保双方使用相同版本的 adb 协议)。

              远程 ADB 服务器

              要连接到远程 adb 服务器,需将服务器设置为监听所有网络接口:

              bash
              adb kill-server
               adb -a nodaemon server start
               # 保持此窗口开启

              警告:客户端与 adb 服务器 之间的所有通信均为明文传输。

              假设该服务器可通过 IP 地址 192.168.1.2 访问,则在另一终端中运行 scrcpy

              bash
              # bash 环境
               export ADB_SERVER_SOCKET=tcp:192.168.1.2:5037
              diff --git a/assets/zhHans_reference_scrcpy_tunnels.md.0tdj1aM8.lean.js b/assets/zhHans_reference_scrcpy_tunnels.md.DS3RA5Gh.lean.js
              similarity index 87%
              rename from assets/zhHans_reference_scrcpy_tunnels.md.0tdj1aM8.lean.js
              rename to assets/zhHans_reference_scrcpy_tunnels.md.DS3RA5Gh.lean.js
              index 0237759fc..b35b2f420 100644
              --- a/assets/zhHans_reference_scrcpy_tunnels.md.0tdj1aM8.lean.js
              +++ b/assets/zhHans_reference_scrcpy_tunnels.md.DS3RA5Gh.lean.js
              @@ -1 +1 @@
              -import{e as i,o as a,a as n,ag as p}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Tunnels(隧道连接)","description":"","frontmatter":{"title":"Tunnels(隧道连接)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/tunnels.md","filePath":"zhHans/reference/scrcpy/tunnels.md","lastUpdated":1776916170000}'),h={name:"zhHans/reference/scrcpy/tunnels.md"};function t(l,s,e,k,d,c){return a(),n("div",null,[...s[0]||(s[0]=[p("",29)])])}const g=i(h,[["render",t]]);export{o as __pageData,g as default};
              +import{e as i,o as a,a as n,ag as p}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Tunnels(隧道连接)","description":"","frontmatter":{"title":"Tunnels(隧道连接)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/tunnels.md","filePath":"zhHans/reference/scrcpy/tunnels.md","lastUpdated":1777999882000}'),h={name:"zhHans/reference/scrcpy/tunnels.md"};function t(l,s,e,k,d,c){return a(),n("div",null,[...s[0]||(s[0]=[p("",29)])])}const g=i(h,[["render",t]]);export{o as __pageData,g as default};
              diff --git a/assets/zhHans_reference_scrcpy_v4l2.md.DFNKRFo4.js b/assets/zhHans_reference_scrcpy_v4l2.md.Dekz6XIg.js
              similarity index 99%
              rename from assets/zhHans_reference_scrcpy_v4l2.md.DFNKRFo4.js
              rename to assets/zhHans_reference_scrcpy_v4l2.md.Dekz6XIg.js
              index c828d2f4d..0672a465a 100644
              --- a/assets/zhHans_reference_scrcpy_v4l2.md.DFNKRFo4.js
              +++ b/assets/zhHans_reference_scrcpy_v4l2.md.Dekz6XIg.js
              @@ -1,4 +1,4 @@
              -import{e as a,o as i,a as e,ag as p}from"./chunks/framework.D2Fz4Hoy.js";const r=JSON.parse('{"title":"Video4Linux(视频流监控)","description":"","frontmatter":{"title":"Video4Linux(视频流监控)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/v4l2.md","filePath":"zhHans/reference/scrcpy/v4l2.md","lastUpdated":1776916170000}'),t={name:"zhHans/reference/scrcpy/v4l2.md"};function l(n,s,h,d,o,c){return i(),e("div",null,[...s[0]||(s[0]=[p(`

              Video4Linux

              在 Linux 系统上,可以将视频流发送到 v4l2 回环设备,这样 Android 设备就能像普通摄像头一样被任何支持 v4l2 的工具打开。

              需要先安装 v4l2loopback 模块:

              bash
              sudo apt install v4l2loopback-dkms

              创建 v4l2 设备:

              bash
              sudo modprobe v4l2loopback

              这将在 /dev/videoN 路径下创建一个新的视频设备,其中 N 为数字(可通过更多选项创建多个设备或指定设备ID)。

              如果在 Chrome/WebRTC 中检测设备时遇到问题,可以尝试 exclusive_caps 模式:

              sudo modprobe v4l2loopback exclusive_caps=1

              列出已启用的设备:

              bash
              # 需要安装 v4l-utils 包
              +import{e as a,o as i,a as e,ag as p}from"./chunks/framework.D2Fz4Hoy.js";const r=JSON.parse('{"title":"Video4Linux(视频流监控)","description":"","frontmatter":{"title":"Video4Linux(视频流监控)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/v4l2.md","filePath":"zhHans/reference/scrcpy/v4l2.md","lastUpdated":1777999882000}'),t={name:"zhHans/reference/scrcpy/v4l2.md"};function l(n,s,h,d,o,c){return i(),e("div",null,[...s[0]||(s[0]=[p(`

              Video4Linux

              在 Linux 系统上,可以将视频流发送到 v4l2 回环设备,这样 Android 设备就能像普通摄像头一样被任何支持 v4l2 的工具打开。

              需要先安装 v4l2loopback 模块:

              bash
              sudo apt install v4l2loopback-dkms

              创建 v4l2 设备:

              bash
              sudo modprobe v4l2loopback

              这将在 /dev/videoN 路径下创建一个新的视频设备,其中 N 为数字(可通过更多选项创建多个设备或指定设备ID)。

              如果在 Chrome/WebRTC 中检测设备时遇到问题,可以尝试 exclusive_caps 模式:

              sudo modprobe v4l2loopback exclusive_caps=1

              列出已启用的设备:

              bash
              # 需要安装 v4l-utils 包
               v4l2-ctl --list-devices
               
               # 简单方法(通常够用)
              diff --git a/assets/zhHans_reference_scrcpy_v4l2.md.DFNKRFo4.lean.js b/assets/zhHans_reference_scrcpy_v4l2.md.Dekz6XIg.lean.js
              similarity index 88%
              rename from assets/zhHans_reference_scrcpy_v4l2.md.DFNKRFo4.lean.js
              rename to assets/zhHans_reference_scrcpy_v4l2.md.Dekz6XIg.lean.js
              index 7b4ebe239..e4c950bc8 100644
              --- a/assets/zhHans_reference_scrcpy_v4l2.md.DFNKRFo4.lean.js
              +++ b/assets/zhHans_reference_scrcpy_v4l2.md.Dekz6XIg.lean.js
              @@ -1 +1 @@
              -import{e as a,o as i,a as e,ag as p}from"./chunks/framework.D2Fz4Hoy.js";const r=JSON.parse('{"title":"Video4Linux(视频流监控)","description":"","frontmatter":{"title":"Video4Linux(视频流监控)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/v4l2.md","filePath":"zhHans/reference/scrcpy/v4l2.md","lastUpdated":1776916170000}'),t={name:"zhHans/reference/scrcpy/v4l2.md"};function l(n,s,h,d,o,c){return i(),e("div",null,[...s[0]||(s[0]=[p("",21)])])}const v=a(t,[["render",l]]);export{r as __pageData,v as default};
              +import{e as a,o as i,a as e,ag as p}from"./chunks/framework.D2Fz4Hoy.js";const r=JSON.parse('{"title":"Video4Linux(视频流监控)","description":"","frontmatter":{"title":"Video4Linux(视频流监控)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/v4l2.md","filePath":"zhHans/reference/scrcpy/v4l2.md","lastUpdated":1777999882000}'),t={name:"zhHans/reference/scrcpy/v4l2.md"};function l(n,s,h,d,o,c){return i(),e("div",null,[...s[0]||(s[0]=[p("",21)])])}const v=a(t,[["render",l]]);export{r as __pageData,v as default};
              diff --git a/assets/zhHans_reference_scrcpy_video.md.CHc7dQPp.js b/assets/zhHans_reference_scrcpy_video.md.DZAoX0Fr.js
              similarity index 99%
              rename from assets/zhHans_reference_scrcpy_video.md.CHc7dQPp.js
              rename to assets/zhHans_reference_scrcpy_video.md.DZAoX0Fr.js
              index 1872db275..3993da8f8 100644
              --- a/assets/zhHans_reference_scrcpy_video.md.CHc7dQPp.js
              +++ b/assets/zhHans_reference_scrcpy_video.md.DZAoX0Fr.js
              @@ -1,4 +1,4 @@
              -import{e as i,o as a,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Video(视频)","description":"","frontmatter":{"title":"Video(视频)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/video.md","filePath":"zhHans/reference/scrcpy/video.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/video.md"};function t(h,s,l,k,r,d){return a(),e("div",null,[...s[0]||(s[0]=[n(`

              视频

              默认情况下,scrcpy 会镜像显示设备屏幕。

              也可以选择捕获设备摄像头画面。

              详见专门的 摄像头 页面。

              尺寸

              默认情况下,scrcpy 会尝试以 Android 设备的分辨率进行镜像。

              为了提升性能,可以降低分辨率进行镜像。以下命令将宽度和高度限制在最大值(此处为 1024):

              bash
              scrcpy --max-size=1024
              +import{e as i,o as a,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Video(视频)","description":"","frontmatter":{"title":"Video(视频)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/video.md","filePath":"zhHans/reference/scrcpy/video.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/video.md"};function t(h,s,l,k,r,d){return a(),e("div",null,[...s[0]||(s[0]=[n(`

              视频

              默认情况下,scrcpy 会镜像显示设备屏幕。

              也可以选择捕获设备摄像头画面。

              详见专门的 摄像头 页面。

              尺寸

              默认情况下,scrcpy 会尝试以 Android 设备的分辨率进行镜像。

              为了提升性能,可以降低分辨率进行镜像。以下命令将宽度和高度限制在最大值(此处为 1024):

              bash
              scrcpy --max-size=1024
               scrcpy -m 1024   # 简写版本

              另一边的尺寸会按比例计算,以保持 Android 设备的宽高比。例如,1920×1080 的设备会被镜像为 1024×576。

              如果编码失败,scrcpy 会自动尝试降低分辨率(除非启用了 --no-downsize-on-error)。

              对于摄像头镜像,--max-size 值用于选择摄像头源尺寸(在可用分辨率中)。

              比特率

              默认视频比特率为 8 Mbps。可以通过以下命令修改:

              bash
              scrcpy --video-bit-rate=2M
               scrcpy --video-bit-rate=2000000  # 等效
               scrcpy -b 2M                     # 简写版本

              帧率

              可以限制捕获帧率:

              bash
              scrcpy --max-fps=15

              实际捕获帧率可以通过以下命令打印到控制台:

              bash
              scrcpy --print-fps

              也可以通过快捷键 MOD+i 随时启用或禁用(见 快捷键)。

              帧率本质上是可变的:只有当屏幕内容发生变化时才会生成新帧。例如,如果在设备上全屏播放 24fps 的视频,scrcpy 的帧率不会超过 24 帧每秒。

              编解码器

              可以选择视频编解码器,可选值为 h264(默认)、h265av1

              bash
              scrcpy --video-codec=h264  # 默认
              diff --git a/assets/zhHans_reference_scrcpy_video.md.CHc7dQPp.lean.js b/assets/zhHans_reference_scrcpy_video.md.DZAoX0Fr.lean.js
              similarity index 87%
              rename from assets/zhHans_reference_scrcpy_video.md.CHc7dQPp.lean.js
              rename to assets/zhHans_reference_scrcpy_video.md.DZAoX0Fr.lean.js
              index dc4ed8c4e..2e52e14c6 100644
              --- a/assets/zhHans_reference_scrcpy_video.md.CHc7dQPp.lean.js
              +++ b/assets/zhHans_reference_scrcpy_video.md.DZAoX0Fr.lean.js
              @@ -1 +1 @@
              -import{e as i,o as a,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Video(视频)","description":"","frontmatter":{"title":"Video(视频)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/video.md","filePath":"zhHans/reference/scrcpy/video.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/video.md"};function t(h,s,l,k,r,d){return a(),e("div",null,[...s[0]||(s[0]=[n("",80)])])}const g=i(p,[["render",t]]);export{o as __pageData,g as default};
              +import{e as i,o as a,a as e,ag as n}from"./chunks/framework.D2Fz4Hoy.js";const o=JSON.parse('{"title":"Video(视频)","description":"","frontmatter":{"title":"Video(视频)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/video.md","filePath":"zhHans/reference/scrcpy/video.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/video.md"};function t(h,s,l,k,r,d){return a(),e("div",null,[...s[0]||(s[0]=[n("",80)])])}const g=i(p,[["render",t]]);export{o as __pageData,g as default};
              diff --git a/assets/zhHans_reference_scrcpy_virtual_display.md.Da2X0giP.js b/assets/zhHans_reference_scrcpy_virtual_display.md.B17ZAE_r.js
              similarity index 99%
              rename from assets/zhHans_reference_scrcpy_virtual_display.md.Da2X0giP.js
              rename to assets/zhHans_reference_scrcpy_virtual_display.md.B17ZAE_r.js
              index f89bce077..055dfd305 100644
              --- a/assets/zhHans_reference_scrcpy_virtual_display.md.Da2X0giP.js
              +++ b/assets/zhHans_reference_scrcpy_virtual_display.md.B17ZAE_r.js
              @@ -1,4 +1,4 @@
              -import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"VirtualDisplay(虚拟显示)","description":"","frontmatter":{"title":"VirtualDisplay(虚拟显示)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/virtual_display.md","filePath":"zhHans/reference/scrcpy/virtual_display.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/virtual_display.md"};function n(l,s,h,d,r,c){return i(),e("div",null,[...s[0]||(s[0]=[t(`

              虚拟显示屏

              新建虚拟显示屏

              将画面镜像到新建的虚拟显示屏(而非设备主屏幕):

              bash
              scrcpy --new-display=1920x1080
              +import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"VirtualDisplay(虚拟显示)","description":"","frontmatter":{"title":"VirtualDisplay(虚拟显示)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/virtual_display.md","filePath":"zhHans/reference/scrcpy/virtual_display.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/virtual_display.md"};function n(l,s,h,d,r,c){return i(),e("div",null,[...s[0]||(s[0]=[t(`

              虚拟显示屏

              新建虚拟显示屏

              将画面镜像到新建的虚拟显示屏(而非设备主屏幕):

              bash
              scrcpy --new-display=1920x1080
               scrcpy --new-display=1920x1080/420  # 强制设为420 dpi
               scrcpy --new-display         # 使用主屏幕尺寸和像素密度
               scrcpy --new-display=/240    # 使用主屏幕尺寸和240 dpi

              虚拟显示屏会在程序退出时销毁。

              启动应用

              部分设备会在虚拟显示屏中显示启动器。

              若设备未提供启动器(或通过 --no-vd-system-decorations 参数显式禁用),虚拟显示屏将显示空白内容。此时需要启动安卓应用

              例如:

              bash
              scrcpy --new-display=1920x1080 --start-app=org.videolan.vlc

              也可以直接启动启动器应用。例如运行开源启动器 Fossify Launcher

              bash
              scrcpy --new-display=1920x1080 --no-vd-system-decorations --start-app=org.fossify.home

              系统装饰

              默认启用虚拟显示屏的系统装饰元素。禁用请使用 --no-vd-system-decorations

              bash
              scrcpy --new-display --no-vd-system-decorations

              该参数适用于解决某些设备可能出现的UI异常,或禁用虚拟显示屏中默认的启动器界面。

              注意:若未启动任何应用,虚拟显示屏将不会渲染任何内容,因此不会产生视频帧。

              关闭时销毁

              默认情况下,关闭虚拟显示屏时,正在运行的应用会被销毁。

              若要将应用转移至主屏幕显示,请使用:

              bash
              scrcpy --new-display --no-vd-destroy-content

              输入法策略

              默认情况下,虚拟显示屏的输入法会显示在默认屏幕上。

              若要在本地显示屏显示输入法,请使用 --display-ime-policy=local

              bash
              scrcpy --display-id=1 --display-ime-policy=local
              diff --git a/assets/zhHans_reference_scrcpy_virtual_display.md.Da2X0giP.lean.js b/assets/zhHans_reference_scrcpy_virtual_display.md.B17ZAE_r.lean.js
              similarity index 88%
              rename from assets/zhHans_reference_scrcpy_virtual_display.md.Da2X0giP.lean.js
              rename to assets/zhHans_reference_scrcpy_virtual_display.md.B17ZAE_r.lean.js
              index b18d235fa..cbbfb095d 100644
              --- a/assets/zhHans_reference_scrcpy_virtual_display.md.Da2X0giP.lean.js
              +++ b/assets/zhHans_reference_scrcpy_virtual_display.md.B17ZAE_r.lean.js
              @@ -1 +1 @@
              -import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"VirtualDisplay(虚拟显示)","description":"","frontmatter":{"title":"VirtualDisplay(虚拟显示)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/virtual_display.md","filePath":"zhHans/reference/scrcpy/virtual_display.md","lastUpdated":1776916170000}'),p={name:"zhHans/reference/scrcpy/virtual_display.md"};function n(l,s,h,d,r,c){return i(),e("div",null,[...s[0]||(s[0]=[t("",25)])])}const y=a(p,[["render",n]]);export{k as __pageData,y as default};
              +import{e as a,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"VirtualDisplay(虚拟显示)","description":"","frontmatter":{"title":"VirtualDisplay(虚拟显示)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/virtual_display.md","filePath":"zhHans/reference/scrcpy/virtual_display.md","lastUpdated":1777999882000}'),p={name:"zhHans/reference/scrcpy/virtual_display.md"};function n(l,s,h,d,r,c){return i(),e("div",null,[...s[0]||(s[0]=[t("",25)])])}const y=a(p,[["render",n]]);export{k as __pageData,y as default};
              diff --git a/assets/zhHans_reference_scrcpy_window.md.rahd1W76.js b/assets/zhHans_reference_scrcpy_window.md.DsVhYpEM.js
              similarity index 98%
              rename from assets/zhHans_reference_scrcpy_window.md.rahd1W76.js
              rename to assets/zhHans_reference_scrcpy_window.md.DsVhYpEM.js
              index d59017161..da9612e39 100644
              --- a/assets/zhHans_reference_scrcpy_window.md.rahd1W76.js
              +++ b/assets/zhHans_reference_scrcpy_window.md.DsVhYpEM.js
              @@ -1,3 +1,3 @@
              -import{e as s,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Window(窗口控制)","description":"","frontmatter":{"title":"Window(窗口控制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/window.md","filePath":"zhHans/reference/scrcpy/window.md","lastUpdated":1776916170000}'),n={name:"zhHans/reference/scrcpy/window.md"};function h(l,a,p,d,r,c){return i(),e("div",null,[...a[0]||(a[0]=[t(`

              窗口设置

              禁用窗口显示

              如需禁用窗口显示(适用于仅需录制或播放音频的场景):

              bash
              scrcpy --no-window --record=file.mp4
              +import{e as s,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Window(窗口控制)","description":"","frontmatter":{"title":"Window(窗口控制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/window.md","filePath":"zhHans/reference/scrcpy/window.md","lastUpdated":1777999882000}'),n={name:"zhHans/reference/scrcpy/window.md"};function h(l,a,p,d,r,c){return i(),e("div",null,[...a[0]||(a[0]=[t(`

              窗口设置

              禁用窗口显示

              如需禁用窗口显示(适用于仅需录制或播放音频的场景):

              bash
              scrcpy --no-window --record=file.mp4
               # 按Ctrl+C终止录制

              窗口标题

              默认窗口标题为设备型号,可通过以下命令修改:

              bash
              scrcpy --window-title='我的设备'

              位置与尺寸

              可指定窗口初始位置和尺寸:

              bash
              scrcpy --window-x=100 --window-y=100 --window-width=800 --window-height=600

              无边框模式

              禁用窗口装饰边框:

              bash
              scrcpy --window-borderless

              窗口置顶

              保持窗口始终在最前端显示:

              bash
              scrcpy --always-on-top

              全屏模式

              直接以全屏模式启动:

              bash
              scrcpy --fullscreen
               scrcpy -f   # 简写形式

              全屏模式可通过快捷键 MOD+f 动态切换(参见快捷键说明)。

              禁用屏幕保护

              默认情况下,scrcpy 不会阻止计算机进入屏幕保护状态。如需禁用:

              bash
              scrcpy --disable-screensaver
              `,23)])])}const b=s(n,[["render",h]]);export{k as __pageData,b as default}; diff --git a/assets/zhHans_reference_scrcpy_window.md.rahd1W76.lean.js b/assets/zhHans_reference_scrcpy_window.md.DsVhYpEM.lean.js similarity index 87% rename from assets/zhHans_reference_scrcpy_window.md.rahd1W76.lean.js rename to assets/zhHans_reference_scrcpy_window.md.DsVhYpEM.lean.js index 800a4171f..6313b2cbe 100644 --- a/assets/zhHans_reference_scrcpy_window.md.rahd1W76.lean.js +++ b/assets/zhHans_reference_scrcpy_window.md.DsVhYpEM.lean.js @@ -1 +1 @@ -import{e as s,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Window(窗口控制)","description":"","frontmatter":{"title":"Window(窗口控制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/window.md","filePath":"zhHans/reference/scrcpy/window.md","lastUpdated":1776916170000}'),n={name:"zhHans/reference/scrcpy/window.md"};function h(l,a,p,d,r,c){return i(),e("div",null,[...a[0]||(a[0]=[t("",23)])])}const b=s(n,[["render",h]]);export{k as __pageData,b as default}; +import{e as s,o as i,a as e,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Window(窗口控制)","description":"","frontmatter":{"title":"Window(窗口控制)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/window.md","filePath":"zhHans/reference/scrcpy/window.md","lastUpdated":1777999882000}'),n={name:"zhHans/reference/scrcpy/window.md"};function h(l,a,p,d,r,c){return i(),e("div",null,[...a[0]||(a[0]=[t("",23)])])}const b=s(n,[["render",h]]);export{k as __pageData,b as default}; diff --git a/assets/zhHans_reference_scrcpy_windows.md.B8w41ZpH.js b/assets/zhHans_reference_scrcpy_windows.md.ByPHmbRS.js similarity index 99% rename from assets/zhHans_reference_scrcpy_windows.md.B8w41ZpH.js rename to assets/zhHans_reference_scrcpy_windows.md.ByPHmbRS.js index ca65c194d..4a96aac41 100644 --- a/assets/zhHans_reference_scrcpy_windows.md.B8w41ZpH.js +++ b/assets/zhHans_reference_scrcpy_windows.md.ByPHmbRS.js @@ -1,3 +1,3 @@ -import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Windows(平台指南)","description":"","frontmatter":{"title":"Windows(平台指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/windows.md","filePath":"zhHans/reference/scrcpy/windows.md","lastUpdated":1776916170000}'),n={name:"zhHans/reference/scrcpy/windows.md"};function l(p,s,c,r,h,o){return e(),i("div",null,[...s[0]||(s[0]=[t(`

              Windows 平台指南

              安装

              官方发布版本

              下载最新版本

              下载后解压即可。

              通过包管理器安装

              使用 WinGet(将同时安装ADB和其他依赖项):

              bash
              winget install --exact Genymobile.scrcpy

              使用 Chocolatey

              bash
              choco install scrcpy
              +import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Windows(平台指南)","description":"","frontmatter":{"title":"Windows(平台指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/windows.md","filePath":"zhHans/reference/scrcpy/windows.md","lastUpdated":1777999882000}'),n={name:"zhHans/reference/scrcpy/windows.md"};function l(p,s,c,r,h,o){return e(),i("div",null,[...s[0]||(s[0]=[t(`

              Windows 平台指南

              安装

              官方发布版本

              下载最新版本

              下载后解压即可。

              通过包管理器安装

              使用 WinGet(将同时安装ADB和其他依赖项):

              bash
              winget install --exact Genymobile.scrcpy

              使用 Chocolatey

              bash
              choco install scrcpy
               choco install adb    # 如果尚未安装ADB

              使用 Scoop

              bash
              scoop install scrcpy
               scoop install adb    # 如果尚未安装ADB

              如需手动构建和安装应用,请参阅 build

              运行

              请确保您的设备满足先决条件

              Scrcpy是一个命令行应用程序,主要设计为通过终端带参数执行。

              在scrcpy目录中双击open_a_terminal_here.bat文件,即可在指定位置打开终端,然后输入命令。例如,不带参数运行:

              bash
              scrcpy

              或带参数运行(以下示例禁用音频并录制到file.mkv):

              bash
              scrcpy --no-audio --record=file.mkv

              命令行参数的文档可通过以下方式查看:

              若需直接启动scrcpy而无需打开终端,可双击以下文件之一:

              • scrcpy-console.bat:启动时打开终端(scrcpy终止后终端会关闭,除非发生错误);
              • scrcpy-noconsole.vbs:启动时不显示终端(但错误信息将不可见)。

              避免直接双击scrcpy.exe文件:若发生错误,终端会立即关闭,您将无法查看错误信息(该程序设计为通过终端运行)。请使用scrcpy-console.bat替代。

              如果希望固定使用某些参数,可以创建一个myscrcpy.bat文件(需先显示文件扩展名以避免混淆),内容为您的命令。例如:

              bash
              scrcpy --prefer-text --turn-screen-off --stay-awake

              之后双击该文件即可运行。您也可以编辑(或复制)scrcpy-console.batscrcpy-noconsole.vbs文件,添加所需的参数。

              `,29)])])}const b=a(n,[["render",l]]);export{k as __pageData,b as default}; diff --git a/assets/zhHans_reference_scrcpy_windows.md.B8w41ZpH.lean.js b/assets/zhHans_reference_scrcpy_windows.md.ByPHmbRS.lean.js similarity index 87% rename from assets/zhHans_reference_scrcpy_windows.md.B8w41ZpH.lean.js rename to assets/zhHans_reference_scrcpy_windows.md.ByPHmbRS.lean.js index 5df20dd0b..c82040021 100644 --- a/assets/zhHans_reference_scrcpy_windows.md.B8w41ZpH.lean.js +++ b/assets/zhHans_reference_scrcpy_windows.md.ByPHmbRS.lean.js @@ -1 +1 @@ -import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Windows(平台指南)","description":"","frontmatter":{"title":"Windows(平台指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/windows.md","filePath":"zhHans/reference/scrcpy/windows.md","lastUpdated":1776916170000}'),n={name:"zhHans/reference/scrcpy/windows.md"};function l(p,s,c,r,h,o){return e(),i("div",null,[...s[0]||(s[0]=[t("",29)])])}const b=a(n,[["render",l]]);export{k as __pageData,b as default}; +import{e as a,o as e,a as i,ag as t}from"./chunks/framework.D2Fz4Hoy.js";const k=JSON.parse('{"title":"Windows(平台指南)","description":"","frontmatter":{"title":"Windows(平台指南)"},"headers":[],"relativePath":"zhHans/reference/scrcpy/windows.md","filePath":"zhHans/reference/scrcpy/windows.md","lastUpdated":1777999882000}'),n={name:"zhHans/reference/scrcpy/windows.md"};function l(p,s,c,r,h,o){return e(),i("div",null,[...s[0]||(s[0]=[t("",29)])])}const b=a(n,[["render",l]]);export{k as __pageData,b as default}; diff --git a/changelog.html b/changelog.html index 8ee84fa06..c23c48a76 100644 --- a/changelog.html +++ b/changelog.html @@ -6,14 +6,14 @@ Changelog | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
              Skip to content

              Changelog

              2.8.1 (2026-04-07)

              Bug Fixes

              • 🐛 Fixed the problem of dark theme background not taking effect (ad19695)

              Performance Improvements

              • 🎉 Increased free limit for batch automation scripts and device group controls to 5 devices. (11271f2)

              2.8.0 (2026-04-06)

              Features

              • ✨ Window arrangement supports the automatic arrangement function (696d94b)

              Bug Fixes

              • 🐛 Fix i18n errors (e4ad3ec)
              • 🐛 Fix the default value issue of the subscription plan (a19dd9e)
              • 🐛 Fixed the issue where multiple files cannot be pasted when copied to the clipboard under Windows (dcc7a94)

              Performance Improvements

              • ♻️ Optimize subscription plan (c12ef9d)
              • ♻️ Optimize the pricing strategy for advanced features to prevent misjudgments by users (4d722b7)
              • 💄 Optimize the display details of the embedded mirror window (6cf4c69)
              • 🚀 Automation script adds random range option (4d73e1a)
              • 🚀 Extended embedded mirroring operable shortcut buttons (19c0de2)
              • 🚀 Optimize subscription configuration (d053bfa)
              • 🚀 Optimize the automation script editor to avoid screen border issues (ffd56a6)
              • 🚀 Refactored file copy function supports batch copying to the clipboard (ccca99a)

              Code Refactoring

              • ♻️ Optimize subscription plan default value acquisition (7b9c47f)
              • 🚀 Dynamically configure subscriptions by detecting the environment (d02e1b3)
              • 🚀 Fix typescript configuration (cbc8631)

              2.7.3 (2026-04-02)

              Bug Fixes

              • 🐛 Fixed an issue where embedded mirroring could not be input due to external activation elements. (058b982)

              Performance Improvements

              • 🚀 Optimize the embedded image to open the application list display (7f6b18a)

              Code Refactoring

              • 🔊 Optimize the wscrcpy audio cleaning logic (a29cd85)

              2.7.2 (2026-04-01)

              Bug Fixes

              • 🐛 Fix dependency not updated error (2d8ebfd)

              2.7.1 (2026-04-01)

              Bug Fixes

              • 🐛 Fixed the problem that the global search shortcut key does not take effect (e7596f9)

              2.7.0 (2026-04-01)

              Features

              • 🚀 Add wscrcpy cli parameter adapter (ea64b5e)
              • 🚀 Complete more parameters of wscrcpy (c48020b)
              • 🚀 Extend wscrcpy capabilities (0717688)
              • 🚀 Initial implementation of device group control function (4ea4e7d)
              • 🚀 Optimize group control experience (853e53d)
              • 🚀 Optimize the details of the mask layer module (c9da58e)
              • 🚀 Optimize the interaction details of the mask board module (b67582a)
              • 🚀 Redesign the overlay module guide page (c522fcb)
              • 🚀 Refactor the embedded image package to the wscrcpy package (5f8a309)
              • 🚀 Use tango-adb to directly render the device screen in the mask layer module (81d93dd)
              • 🚀 wscrcpy adds support for mouse hover monitoring (eb78931)
              • 🚀 wscrcpy only enables audio forwarding by default in the macos environment (5d510dc)

              Bug Fixes

              • 🐛 Fix the issue of resetting the window position of the mirror module (d4c3a74)
              • 🐛 Fix the problem of data echo in automation steps (435c3de)
              • 🐛 Fix the problem of Wscrcpy audio forwarding exception (967a6c2)
              • 🐛 Fix the problem of wscrcpy group control failure (ea74182)
              • 🐛 Fix wscrcpy clipboard synchronization issue (42fee69)
              • 🐛 Fix wscrcpy reconnection problem (a6de9b9)
              • 🐛 Fixed sub-package build conflict and misalignment issue (99b22ba)
              • 🐛 Fixed syntax error in the action bar at the bottom of the overlay (ef0a301)
              • 🐛 Fixed the problem of abnormal calculation of size ratio when switching the main device on the group control page (5ad014f)
              • 🐛 Fixed the problem of abnormal disconnection of wscrcpy video stream when exiting the program (174a01c)
              • 🐛 Fixed the problem of interactive forwarding conflict when group control is enabled for auxiliary devices (60ae2a4)
              • 🐛 Fixed the problem of mask layer adaptation button forwarding (4be239e)
              • 🚀 Fix mask layer test issue (33581df)
              • 🚀 Fixed overlay module screen rotation issue (ad0af45)
              • 🚀 Fixed wscrcpy audio and clipboard synchronization configuration conflict issue (5bb65e0)

              Performance Improvements

              • 💄 Optimize the interaction of the embedded image module (7a21fdb)
              • 🚀 Add internationalization to automation script keylist (e7b78c1)
              • 🚀 Device group control expands more operations (08e46b6)
              • 🚀 Enhance the interaction experience of built-in images (e913fee)
              • 🚀 Expand batch opening function for group control function (a38dbde)
              • 🚀 Explicitly declare wscrcpy external dependencies (52924c8)
              • 🚀 Improve group control function subscription capabilities (479b996)
              • 🚀 Improve the stability of the overlay adapter (be0ff8c)
              • 🚀 More embedded startup entries have been added to the device list (24e4fd1)
              • 🚀 Optimize check update pop-up window style (54eaa51)
              • 🚀 Optimize embedded image module error prompts (e26186b)
              • 🚀 Optimize overlay click/swipe event interaction (d7c0500)
              • 🚀 Optimize overlay module details (8ce5937)
              • 🚀 Optimize overlay module details (2799ab0)
              • 🚀 Optimize preference interaction Disable device-dependent options in global mode (ea47604)
              • 🚀 Optimize the directory structure of the group control module (f9a9d67)
              • 🚀 Optimize the empty list style of the device list (95e8e4a)
              • 🚀 Optimize the interaction details of the overlay module (e297850)
              • 🚀 Optimize the interactive experience of group control function (05c8643)
              • 🚀 Optimize the interactive experience of the embedded mirror control bar (ac6159f)
              • 🚀 Optimize the keyboard input experience of the group control module (32b7fa2)
              • 🚀 Optimize the overlay module to organize interaction details (f358348)
              • 🚀 Optimize the video stream freezing problem when wscrcpy starts the same device (7baa53c)
              • 🚀 Optimize universal scroll bar interaction (dd6f3fe)
              • 🚀 Optimize window arrangement function details (91e1a3a)
              • 🚀 Overlay module input function reconstruction (ac19fab)
              • 🚀 The overlay module supports forwarding more key types (05c6faf)

              Code Refactoring

              • ♻️ Reconstruct the embedded mirror module directory structure (119a471)
              • 📝 Remove redundant wscrcpy judgments (3d9add8)
              • 🚀 Adjust the group control module naming (3c14c99)
              • 🚀 Expand the embedded image switching function (a49f8b5)
              • 🚀 Optimize and extend wscrcpy type (eec0913)
              • 🚀 Optimize interactive performance of embedded mirroring (ba8bfea)
              • 🚀 Optimize overlay module configuration (08009bf)
              • 🚀 Optimize the details of the overlay layer (59dc702)
              • 🚀 Optimize the directory structure of the group control module (7116264)
              • 🚀 Optimize wscrcpy details (247dc5e)
              • 🚀 Reconstruct the directory structure of the overlay module (668ef67)
              • 🚀 Reconstruct the image window ratio to improve reusability (555e346)
              • 🚀 Reconstruct the mask layer keyboard module (cad077d)
              • 🚀 Reconstruct the overlay module architecture (196cca0)
              • 🚀 Reconstruct the overlay module parameter injection method to solve the problem of responsive loss (3163c60)
              • 🚀 Reconstructed mirror window ratio algorithm is compatible with all platforms (b8377f2)
              • 🚀 Refactor and extend wscrcpy library functionality (4ca2c49)
              • 🚀 Refactor wscrcpy (b537a96)
              • 🚀 Remove redundant code from built-in images (f6bcbf5)
              • 🚀 Remove redundant code from the mask layer module (bdb4f49)

              2.6.2 (2026-03-13)

              Bug Fixes

              • 🐛 Fix the problem of inaccurate vertical coordinate of window arrangement under Windows (1fa6bd5)
              • 🐛 Fixed the issue of abnormal scaling of the window arrangement function under Windows (87f3596)
              • 🐛 Fixed the issue of redundant scroll bars appearing in the window arrangement tool screen area (ea0b451)

              Code Refactoring

              • 🚀 Refactored version build (bd3ec90)

              2.6.1 (2026-03-13)

              Performance Improvements

              • 🌱 Improve the interactive experience of subscription plans (f3620fd)

              2.6.0 (2026-03-12)

              Features

              • 🎉 Optimize device window arrangement: By obtaining the actual screen size of the device, canceling fixed ratio scaling, avoiding black border issues, and improving adaptation accuracy and display experience. (35d2028)
              • 🚀 Add a subscription plan for batch automation scripts (efa6e28)
              • 🚀 Add WeChat script template (569099c)
              • 🚀 Improve the international translation of automated script modules (1cb2cb6)
              • 🚀 Optimize automated script interaction (1e61d0f)
              • 🚀 Optimize magic variable interaction support for import and export (b7ba176)
              • 🚀 Preliminary addition of automation script editor support (bc6fdcc)
              • 🚀 Preliminary support for automated script batch execution and scheduled tasks (e14c302)
              • 🚀 Product and optimization of automation script editor (b36f6c6)

              Bug Fixes

              • 🐛 Fix custom startup layout and interaction issues (6311364)
              • 🐛 Fixed an issue where the automation script log directory was ignored (8777e63)
              • 🐛 Fixed script template translation issue (01870f7)
              • 🐛 Fixed split automation script editor form variable usage compatibility issue (53da1e9)
              • 🐛 Fixed the issue of abnormal task type penetration display in the scheduled task list (58ced2b)
              • 🐛 Fixed the issue of batch execution image blocking (9e3e17b)
              • 🐛 Fixed the issue where the aspect ratio was not fixed when the window arrangement was adjusted again after being saved. (8977138)
              • 🐛 Fixed the problem of unable to echo after window arrangement (6907762)
              • 🚀 Fixed batch execution automation script variable injection concurrency issue (3b8dae0)
              • 🚀 Fixed the problem that the automation script during switching execution could not confirm the interruption (2162203)
              • 🚀 Optimize subscription configuration (9711e73)
              • Fix automated script editor testing issue (87c6f93)

              Performance Improvements

              • 💄 Optimize smart picking interaction (a66fb7a)
              • 🚀 Automate script selectors to support termination logic and interaction optimization (d0a4bb3)
              • 🚀 Automation script editor adds execution selection function (d8f1300)
              • 🚀 Detail optimization of the automated script editor (338ad3e)
              • 🚀 Improve automation script stability (455c11f)
              • 🚀 Integrate the adb keyboard installation universal hook (aca0427)
              • 🚀 Optimize automation script editor details (fb2e4ad)
              • 🚀 Optimize automation script editor interaction details (e371171)
              • 🚀 Optimize automation script editor interaction details (24f0792)
              • 🚀 Optimize automation script function details (f084d08)
              • 🚀 Optimize execution of automation script interaction details (568fedf)
              • 🚀 Optimize international translation (3dd15a9)
              • 🚀 Optimize product details (a3abd2c)
              • 🚀 Optimize the installation of adb keyboard boot (fd4e752)
              • 🚀 Optimize the layout of the execution page for planned tasks (10da149)
              • 🚀 Remove obsolete shell script functionality (dfc505b)
              • 🚀 Template import supports importing magic variables (767c1dd)
              • 🚀 When obtaining the device list, synchronously obtain the screen resolution to optimize the screen arrangement experience (3715e0f)
              • Enhance the stability of the automated script editor (8030668)
              • Optimize script editor interaction (7367d15)

              Miscellaneous Chores

              Code Refactoring

              • ♻️ Restore version of the system (4a7c653)
              • ➖ Remove redundant printing information (6bd144d)
              • 🔨 Split Automation Script Editor form (98ac71b)
              • 🚀 Extract the common logic of launching the app function into an independent selector and reuse it (583b93f)
              • 🚀 Optimize automation script editor details (06f1ede)
              • 🚀 Optimize international translation (2d07a60)
              • 🚀 Optimize the interaction of script selectors for batch execution (c3e86fd)
              • 🚀 Optimize the size of deleted pop-up windows (a43fc53)
              • 🚀 Project code details optimization (eda1d5a)
              • 🚀 Support adjusting subscription price through environment variables (1867f03)
              • Integrated script editor supports more configuration functions (b0a30f8)
              • Optimize the overall directory and naming conventions (aed80ef)

              2.5.1 (2026-02-27)

              Bug Fixes

              • Fixed the issue of missing title bar information when launching through the app (e6bcd1e)

              2.5.0 (2026-02-27)

              Features

              • Add concurrency limit for batch wireless device connections (f048956)

              Bug Fixes

              • Fix shell space command parsing problem (e1ab66c)
              • Initialize shell command variables to prevent undefined values (e776c11)

              2.4.2 (2026-02-26)

              Bug Fixes

              • Fix the problem of abnormal disconnection of adb after changing some configurations (ffbfc40)

              2.4.1 (2026-02-26)

              Bug Fixes

              • Fix the language detection issue of portable software (9985067)

              Code Refactoring

              • Reorganize initialization order to load store before process configuration (9283a45)

              2.4.0 (2026-02-26)

              Features

              • ✨ Adds fastboot command support and provides experimental integration of scrcpy dependencies for Linux ARM64 platforms. (70f3243)
              • 🎉 Comprehensive migration to the built-in terminal based on xterm to provide a more controllable user experience (a2ee25f)
              • add drag and drop file upload support (d5b969c)
              • add gnirehtet path for mac (8da67c8)
              • add scroll to bottom button in chat (e4e8f80)
              • add terminal shell support with xterm integration (3c7828c)
              • add wireless connection mode switch toggle (161acf4)
              • add wireless pair success message and UI improvements (eccb26e)
              • improve ADB keyboard installation error handling (71f7635)
              • trigger language change callback immediately on init (e0e3d22)
              • update api endpoint and enable adb keyboard (4010b17)
              • Window orchestration component enhancement: Supports manual setting of position and size (e3aa89a)

              Bug Fixes

              • 🐛 Migrate fkill to tree-kill to solve windows binary file execution problems (6c89b73)
              • change clipboard tag type to primary (edb8840)
              • enhance xterm terminal styling and resize handling (9e031f5)
              • filter ANSI color codes for Windows PowerShell terminal (9c58f25)
              • Fix i18n race translation (7b37f29)
              • handle terminal exit and error states with reload (e8d93d5)
              • handle Windows terminal line ending for all cases (e06e763)
              • handle Windows terminal line ending for device type (1be1a5e)
              • improve Windows terminal compatibility and session management (7f37f7d)
              • improve Windows terminal cursor sync and resize responsiveness (c16a5f9)
              • improve Windows terminal encoding and scrollbar styling (85d5a96)
              • improve Windows terminal rendering and resize stability (7f05996)
              • improve Windows terminal shell detection and remove debug logs (4a5ebbc)
              • include node-pty in electron build (c98d82d)
              • prioritize pwsh.exe for Windows terminal (a99d830)
              • simplify Windows PowerShell terminal initialization (95c432c)
              • simplify Windows terminal shell initialization (2a3ed6f)
              • Solve the problem that the language of the terminal title cannot be dynamically updated (6e2c030)
              • specify SIGTERM signal for treeKill (d28eb1a)
              • update terminal tip color to custom RGB (156d39b)

              Performance Improvements

              • 🚀 Optimize ADB keyboard installation and detection (f312cc2)

              Code Refactoring

              • add cleanup handler for window IPC (bad6752)
              • add comment for tray destroy event (12038df)
              • add electron-modularity dependency (d0abc0b)
              • add main window API and type system (778a65f)
              • add plugin warnings and fix module loading order (a5bdbf3)
              • add rendererDir support and update window loading (fac664d)
              • adjust screenshot message and dialog styles (7bbab51)
              • adjust terminal line height to 1.4 (5068f7d)
              • adjust terminal window and device sync settings (6a4bd61)
              • adjust window width and improve error handling (5576d2e)
              • centralize PATH setup and environment configuration (6a6eb80)
              • clean up .gitignore file (3644b3e)
              • clean up main window module (9d1eee9)
              • defer app initialization until ready (9905f41)
              • defer plugin registration until app start (46ac0db)
              • Electron main process architecture reconstruction (f810ecb)
              • emit tray:destroy on window restore (fab9343)
              • expose $platform to window and global properties (9a7ee70)
              • extract terminal logic into useTerminal hook (9d725ca)
              • fix device payload and adjust control bar height (e5981ac)
              • fix failed translation key (fe98a56)
              • fix payload type and resolve target logic (5af60c8)
              • fix preview button visibility class (5a8c97b)
              • implement retained terminal session with cleanup (532a055)
              • implement terminal session management with providers (fa156e1)
              • improve file download progress tracking (51101c7)
              • improve gnirehtet menu handling and options (8d0e85b)
              • improve process killing and error handling (85a080e)
              • improve window bounds persistence logic (5361e24)
              • improve wireless pair input handling and UI (3aea5f6)
              • migrate core helpers to electron-modularity package (630deaa)
              • migrate edger to service (9c64cd5)
              • migrate events to service handlers (c99b1de)
              • migrate plugins to priority-based system (ae4404a)
              • migrate services and modules to explicit app.use (e63de2e)
              • migrate services to plugins (36e2a0d)
              • migrate to ipcx for IPC handling (1b1fd8d)
              • migrate to official plugins and update imports (eb9bead)
              • migrate to window.$preload namespace (41a2342)
              • move i18next-fs-backend to dependencies (f507222)
              • move window-manager to window module (8af97a5)
              • optimize device query and control window (4e2736d)
              • optimize minimized tray and window handling (3765b73)
              • Reconstruct the multi-entry directory structure (0690f4b)
              • Refactor i18n related services (6e882b6)
              • remove app parameter from window manager (f8719f1)
              • remove appium-adb documentation and update github link (f532aab)
              • remove border from preference header (9c97366)
              • remove debug console log for args (e4332c1)
              • remove debug console log for platform paths (e5590f3)
              • remove electron middleware module (3bd462c)
              • remove encoding conversion and use utf8 only (c32cb79)
              • remove fixed width from window configuration (ef3e86b)
              • remove spawnShell and convert arrow functions (66978f1)
              • remove theme plugin README (85a853b)
              • remove trailing whitespace in adb helpers (ec7314c)
              • remove ui-ux-pro-max prompt files (11d41a9)
              • remove unused app-region-drag style (094e0df)
              • remove unused terminalConfig from useTerminal (9db3f24)
              • remove Windows-specific encoding default (534934b)
              • rename app to ctx and update electron app imports (4c7ceba)
              • rename app to ctx in electron app (6707e2d)
              • rename currentStatusType to sessionStatus (8c84464)
              • rename electron-modularity to electron-setup (081a8a5)
              • rename entries to pages for routing structure (863ecd4)
              • rename windowOptions to browserWindow and add mainWindow flag (5093577)
              • reorder plugin registration in electron main (b8ee4ef)
              • reorganize process helpers directory structure (dcdb6d7)
              • replace args-tokenizer with shell-quote (1196263)
              • replace getSize with computed size property (c7edceb)
              • replace IS_PACKAGED with import.meta.env.MODE (521e2ba)
              • replace spawnShell with unified sheller helper (0159bb4)
              • replace tree-kill with fkill for process termination (c50cea6)
              • replace window controls with app header (a5fa218)
              • restructure copilot and explorer modules (74efca1)
              • restructure core helpers and window management (16fc934)
              • restructure electron helpers and modules (f0e4851)
              • restructure main window and singleton modules (7b979d6)
              • restructure terminal session management (19428dd)
              • restructure window management and IPC handlers (59a315f)
              • simplify file list extraction in drag upload (7453a99)
              • simplify gnirehtet trigger handling (f9185c3)
              • simplify main window resolution and remove legacy code (c764f91)
              • simplify restoreAndFocusWindow options (27185f5)
              • simplify window types and return native BrowserWindow (184ab7b)
              • simplify wireless connection UI and remove pair dialog (30e026c)
              • standardize module export structure (8111f6f)
              • throttle download and upload progress callbacks (8a16d22)
              • translate terminal comments to English and add command execution (71a2d7a)
              • unify control bar height configuration (7e6abed)
              • unify shell error handling and lazy loading (98dd91b)
              • update primaryColor value (346df64)
              • update scrollbar styling with Tailwind CSS (6eaf259)
              • update terminal scrollbar styling with custom width and transparency (b2c8f87)
              • update terminal title and locale strings (f0bdf0b)

              2.3.1 (2026-01-27)

              Bug Fixes

              • 🐛 Fixed the problem of being unable to click to enter the co-pilot entrance under Windows and Linux. (c563d11)

              2.3.0 (2026-01-22)

              Features

              • 🚀 Optimize portable package configuration and add linux flatpak package support (a7982db)
              • configure electron-log file path in debugger helper (2242668)

              Bug Fixes

              • 🐛 handle copilot execution failures and adjust config max steps (3601709)
              • win: fully redirect user data to portable folder and fix CI workflow (fe2fd89)

              Performance Improvements

              • ✨ Optimize windows and linux window layout (b63b59c)

              Code Refactoring

              • add platform simulation support and adjust window controls layout (9c3a5b1)
              • adjust header and chat layout padding (70fe60d)
              • adjust layout padding for windows and linux platforms (4e153cc)
              • adjust widget dimensions and clear dialog messages (ca6796f)
              • implement immersive title bar and optimize window layout (1e76d11)
              • improve chat retry logic and ADB keyboard detection (8e0e43c)
              • remove dialog width constraints and improve file creation (54e5553)
              • remove quiet config option (76f9d6c)
              • remove redundant success messages and unify dialog titles (b1eac32)
              • reorganize emitter module and update event emitter references (4c3cc2d)
              • reorganize preference form layout with tabs and scroll (7f0f864)
              • replace ExTooltipButton with native el-button title attribute (8056977)

              2.2.0 (2026-01-17)

              Features

              • 🎉 Improve the accuracy and coverage of Copilot opening applications by obtaining information about installed applications on the device (e2f27da)
              • add keyboard shortcuts for connect and disconnect (39293af)
              • auto-focus input when editing prompt (d58b993)

              Bug Fixes

              • 🐛 Fixed the issue where autoglm.js conversation request listener was not cleaned up causing memory overflow (bac2126)

              Code Refactoring

              • improve config management and prompt editing (de2f708)
              • improve prompt manager UI and editing experience (1697558)
              • optimize subscribe store initialization and token management (0f00903)

              2.1.7 (2026-01-14)

              Miscellaneous Chores

              2.1.6 (2026-01-14)

              Miscellaneous Chores

              2.1.5 (2026-01-14)

              Miscellaneous Chores

              • remove comments in copilot window handler (f231998)
              • update version to 2.1.4 (9bdf671)

              2.1.4 (2026-01-14)

              Miscellaneous Chores

              • add release name format to config (6db1b51)
              • update release workflow and build commands (8f5345b)

              2.1.3 (2026-01-14)

              Miscellaneous Chores

              • add linked-versions plugin to release config (415e4ae)

              2.1.2 (2026-01-14)

              Bug Fixes

              • 🐛 Fix automatic build issues (aba8f27)

              Miscellaneous Chores

              • add GH_TOKEN env to release workflow (078bf18)
              • release 2.1.1 (d1c04ce)
              • release 2.1.2 (91d9bbd)
              • release 2.1.2 (c7c8616)
              • remove release creation step from workflow (b73c179)
              • remove unnecessary comments in App.vue (22e331d)
              • remove unnecessary comments in App.vue (5ae8fbe)
              • update electron-builder config path and publish options (d3b4914)
              • update pull request title pattern (060ad4a)
              • update release configuration and patterns (0054fd4)

              2.1.0 (2026-01-14)

              Features

              • ✨ Add auto launch functionality and preference option (69c75cc)
              • ✨ Add hidden launch option for auto-start (dd1c2e1)
              • ✨ Add subscribe configuration hook and update UI (80b3534)
              • ✨ Add system tray support and Linux auto-launch (df414b9)
              • 🔖 Copilot adds thinking_stream event support (22623c4)
              • 🚑️ The portable version now supports automatically generating configuration files in the running directory (ba551b7)
              • add custom empty state icon for device list (65b028f)
              • add zip target for macOS builds (f52d3a5)

              Bug Fixes

              • 🐛 Fix delete message and config initialization (82a77ea)
              • 🐛 Fixed the issue of failed export and export configuration files (fd32c36)
              • 🐛 Update dependencies and add sharp override in workspace configuration (dbf366a)
              • 💰 Update payment amount handling in subscription (422950c)
              • add background color and improve window initialization (498fc90)
              • adjust empty state icon styling in device list (363bf3d)
              • ensure concurrency limit is numeric (d2c977c)
              • types: allow typed payload handlers by using any[] for handle listener rest params (b4e8058)

              Performance Improvements

              • 🚀 Use an external library instead of the built-in autoglm.js (d1f8176)

              Code Refactoring

              • ⚡️ Refactor code structure for improved readability and maintainability (f211924)
              • 🌐 Update language labels to native text (cb7ac96)
              • 🌐 Update subscription translations for multiple locales (b4e5780)
              • 🎨 Redesign task dialog with card layout (cd06d3b)
              • 🎨 Simplify config UI layout and update maxSteps (af18241)
              • 🔄 Auto configure Copilot after payment (c00ac1e)
              • 🔄 Move ESLint config to root and clean up dependencies (f2bd345)
              • 🔄 Optimize session callbacks and event handling (ae19570)
              • 🔄 Rename ipc to services for better structure (8212872)
              • 🔄 Rename start module to launch for clarity (5d44ebf)
              • 🔧 Optimize copilot config change detection (2776e8a)
              • 🔧 Replace quick prompts with PromptBar component (9b0c4df)
              • improve theme switching and background handling (b3203af)
              • migrate copilot config to store (e323611)
              • replace rotation icon with outline version (95ad30d)
              • replace send icon with rocket icon (ef9e7d3)
              • replace svg icons with font icons (9eca902)
              • replace trash icon with Delete icon (c59994e)

              2.0.1 (2026-01-06)

              Bug Fixes

              • 🐛 Fix the problem of abnormal subscription recharge fee (b32043c)

              2.0.0 (2026-01-05)

              Features

              • ✨ Add system terminal support (e5c157e)
              • ✨ Device lists will now intelligently merge duplicate device entries and share device configurations (52cc4b1)
              • ✨ Integrate scrcpy binaries for macos (85bf096)
              • ✨ Introducing a new file icon display component and enhancing the File Explorer dialog. (11be6f1)
              • ✨ Now supports copying device screenshots and recording files to the clipboard (bdb3644)
              • ✨ Now you can arrange your device windows through a graphical interface (91ad249)
              • ✨ Support edge hiding function (14a81de)
              • ✨ Support floating control bar (8807e50)
              • ✨ Support pairing and connecting to devices via QR code (14306b2)
              • ✨ Support to close the device screen when controlling (a84c775)
              • ✨ Supports starting applications for mirroring (d19e781)
              • ✨ Use the new interface design (b08021b)
              • 💥[Release-As: 2.0.0] major copilot overhaul with AutoGLM and multi-device automation (7ad5ecd)
              • 📸 Enhanced recording (7f10161)
              • 🔍️ Optimize the search function of the app (94ccb7b)
              • 🚀 Split the file manager into independent windows and support multiple instances in parallel (f41d853)
              • 🚀 Support adding the open application action to the desktop shortcut. (Not supported on macOS) (add251f)
              • 🚀 Supports connecting historical devices via device list (e0687e8)
              • 🚀 Supports dragging the device control bar to sort (64a98b2)
              • 🚀 Update to scrcpy v3.3.2 (462536c)
              • 🚚 Support batch startup mirroring (fcfd78e)
              • 🚚 The file manager has been refactored and improved, and more useful features have been added. (5cd5992)

              Bug Fixes

              • ♻️ Fixed repeated dependency issues (9777622)
              • 🐛 Fix automatic release (c2254aa)
              • 🐛 Fix device support audio and video encoding cannot be parsed (9b7f6a9)
              • 🐛 Fix for built-in scrcpy not supporting x64 macos (0d60655)
              • 🐛 Fix issue with incorrect address bar path when returning to the previous level in file management (0222675)
              • 🐛 Fix linux build errors (9b43dc0)
              • 🐛 Fix the display ID value type error (2b7ee79)
              • 🐛 Fix the mirror group bug (cd7d9cd)
              • 🐛 Fix the problem of build failure caused by missing dependencies (e34e1c2)
              • 🐛 Fix the problem of Windows calling system terminal failure (194689e)
              • 🐛 Fix the problem of Windows terminal injection command failure (fbf88d0)
              • 🐛 Fix typos (a7a3a17)
              • 🐛 Fixed an issue where macos built-in updates failed (432eceb)
              • 🐛 Fixed an issue where some options in preferences could not be turned off (269bd29)
              • 🐛 Fixed possible sandbox issues on Linux (ff9f9bd)
              • 🐛 Fixed the conflict between device control bar sorting and click events (18a57b9)
              • 🐛 Fixed the issue of abnormal path display in the file manager address bar (2f63f6f)
              • 🐛 Fixed the issue of duplicate filter conditions in the device list (6c4242c)
              • 🐛 Fixed the issue of layout flickering when refreshing the device list page (608b8f3)
              • 🐛 Fixed the issue of saving exceptions after adjusting parameters in preference settings (4a18f61)
              • 🐛 Fixed the issue where activating the program on macOS in certain situations would cause the tray to be created repeatedly (cf8e183)
              • 🐛 Fixed the issue where all configurations would be cleared when resetting the category configuration in preferences (6ee9a92)
              • 🐛 Fixed the issue where Chinese text cannot be saved in file management read and write text (34785dd)
              • 🐛 Fixed the issue where PowerShell failed to call the system terminal (7beb027)
              • 🐛 Fixed the issue where recorded files could not be copied to the clipboard under Windows (119b518)
              • 🐛 Fixed the issue where there is a chance of an error when closing the floating control bar on macOS (5c2c711)
              • 🐛 Fixed the problem of minimizing the visibility of tray icons (b0f42aa)
              • 🐛 Issue not taking effect after restarting the application after switching themes (857c480)
              • 🐛 Make StartApp compatible with scrcpy v3.0 (1082e0d)
              • 🐛 Rename --display-buffer to --video-buffer (b2bb0ae)
              • 🐛 Repair ADB timeout problems (b5bffc5)
              • 🐛 Repair floating action bar start application error (487e7e2)
              • 🐛 Repair part of internationalization Lost dynamics (d18444f)
              • 🐛 Resolve default recording error (358064e)
              • 🐛 Resolved the issue where the device list could not be displayed due to compatibility issues with certain devices (2c53b77)
              • 🐛 Resolving build errors (d21fa29)
              • 🐛 Restore the --display-buffer parameter to solve the mirroring problem (0f3d869)
              • 🐛 Solve the conflict between floating navigation bar and quick APP launch (460aca1)
              • 🐛 Solve the problem of abnormal display timing when recording related functions are successful (67d279e)
              • 🐛 Solve the problem of IPV6 address connection failure (1a95325)
              • 🐛 Solve the problem of startup error of development mode under Linux (5c4f65e)
              • 🐛 Solve the problem of Windows disabling video forwarding and crashing (10b902a)
              • 🐛 Solved the problem that the main window could not be restored after being moved off the screen in some cases (d054f8d)
              • 🐛 Start app to adapt to dark mode (ae13fde)
              • 🐛 Temporarily disable scrcpy integration in macOS (9bf4d5c)
              • 🐛 Update scrcpy-server file to solve the problem of not being able to obtain device APP list (63f7135)
              • 📝 Fixed the issue that special characters in Windows prevented the creation of app shortcut launch (301dac5)
              • 🔧 Camera recording and screen off configuration conflict (4508758)
              • 🔧 Fixed button loading prompt conflict issue (c323ad6)
              • 🩹 Restore the windows build configuration (9491069)
              • 🚀 Fix the issue of abnormal program exit behavior under windows (705f8be)

              Performance Improvements

              • ♻️ Adjust the position of the start application button (9833932)
              • ♻️ Code structure optimization (595216b)
              • ♻️ Enhance recording stability (3dd7525)
              • ♻️ Improve ADB connection stability (7655ba6)
              • ♻️ Improve the stability of window arrangement function (7ae3f21)
              • ♻️ Improve wireless connection stability (85be898)
              • ♻️ Improved device connection stability (1d603ab)
              • ♻️ No longer building universal packages for macOS (db5deb4)
              • ♻️ Optimize camera recording (4be2cf4)
              • ♻️ Optimize camera recording stability (952b2a7)
              • ♻️ Optimize device details performance (38d1433)
              • ♻️ Optimize device list interaction logic (3812061)
              • ♻️ Optimize file manager interaction (b168cc3)
              • ♻️ Optimize QR code connection experience (86f5e69)
              • ♻️ Optimize the Russian presentation effect (0d8a8ee)
              • ♻️ Optimized contextBridge related improvements for stability (0e098c3)
              • ♻️ Optimized the adb daemon startup failure detection mechanism (ca6be85)
              • ♻️ Reduce build package size by removing redundant dependencies (7b61b25)
              • ♻️ Refactor configuration related code to improve stability (37bf438)
              • ♻️ Script and directory structure optimization (68378ef)
              • ♻️ Simplify sandbox automatic configuration manager code to improve performance (1b82336)
              • ♻️ Support interruption during waiting for wireless connection (344b385)
              • ♻️ Supports retrieving a list of applications (b1a6ba7)
              • ♻️ Update mirror icon (c214e5a)
              • ♻️ When the application fails to start, display the error message (dbc34d6)
              • ♿️ Supports adjusting the closing method of the application in preferences (e643f8e)
              • ⚗️ Experimental support for turning off screen controls (9555f58)
              • ⚡️ Improve the start APP experience (29e5e1b)
              • ⚡️ Optimize scrcpy parameter conversion performance (18dcd24)
              • ⚡️ Optimize startup application performance (8e94494)
              • ⚡️ Optimize the method of obtaining the available displays of the device (9e31c84)
              • ⚡️ Optimize the stability of options that need to dynamically obtain parameters in preference settings (39bbc98)
              • ✅ A new method is adopted to solve the problem of IP type configuration storage (5488a1e)
              • ✅ File management supports selecting directories for uploading (fd2e639)
              • ✅ Provides the function of detecting and migrating configurations when deleting a device (39e0533)
              • ✅ Support switching devices on the floating control bar (50440f5)
              • ✨ Adjust the position of the wireless connection screen (3e3fc34)
              • ✨ Enable new icon (695e35d)
              • ✨ The floating control bar supports transparent display when inactive (34f27c5)
              • ✨ Update to scrcpy@2.7 to support the gamepad (0053e87)
              • ➖ Remove redundant console (9a67142)
              • ⬆️ Improve QR code connection performance (b413889)
              • ⬆️ Improved performance of automated mirroring (33a03c3)
              • ⬆️ Optimize edge hiding performance (74a91a4)
              • ⬆️ Optimize the performance of the floating control bar (a1c60ec)
              • 🌱 Optimize app icon background color and corner radius. (bc4f492)
              • 🌱 Optimize application icon details (55800be)
              • 🌱 UI details and documentation optimization (5b5bbf7)
              • 🍻 Improve file manager reliability (9063243)
              • 🐛 Improve wireless connection verification method (69fecc3)
              • 👥 Control bar sorting supports state synchronization (88abe95)
              • 👷 Added edge hiding function switch (d25714a)
              • 👷 Explicitly clean up unnecessary child processes on exit (0549dda)
              • 👷 Optimize the edge hiding function (d5caaa9)
              • 👷 Remove redundant code comments (ca4e826)
              • 👽️ Experimental support for adding open application actions to linux desktop shortcuts (6897c0e)
              • 👽️ Experimentally add linux arm64 support (5b033fd)
              • 💄 Improve space utilization of device window layout tools (939a2d2)
              • 💄 Improved Russian display (ca79e1b)
              • 💄 Normalize control window titles and generated file names (ccc7f0e)
              • 💄 Optimization of display effect of device list page (305187d)
              • 💄 Optimize device refresh mode (ea75615)
              • 💄 Optimize dialog display (1813718)
              • 💄 Optimize pairing interface display (df4103b)
              • 💄 Optimize preference setting button layout (47ae53d)
              • 💄 Optimize Russian display effect (5ca39ae)
              • 💄 Optimize the display effect of horizontal screen screenshots (90c7163)
              • 💄 Optimize the interface display effect (c7a5cd4)
              • 💄 Window layout adapted to dark mode theme (eab402b)
              • 💫 Adjust gnirehtet configuration behavior to make it consistent with user operation habits (7507915)
              • 💫 Support appending gnirehtet custom parameters in configuration (206a030)
              • 📌 Standardize the device list lifecycle processing flow. IPv6 addresses must be enclosed in [] and the port number cannot be omitted for wireless connections. (93c059d)
              • 📌 Support saving the main panel window size status (cef022f)
              • 📝 Add docs entry to the program (db5d157)
              • 📝 Add Japanese language support (969378f)
              • 📝 Added Arabic language support (f6c9fa4)
              • 📝 Optimize the scheduled task list (c666709)
              • 📝 Optimize the title of the control interface to solve the problem of duplicate device names (06a151d)
              • 📝 Optimized startup app package name display (22eb718)
              • 📝 Simplified partial translation (7411487)
              • 📦️ Update the upload function to support file and directory selection, and optimize the interface layout (7f5bd35)
              • 📸 Recording camera support (10d0370)
              • 📸 Support viewing real-time images and power information of the device (d262adf)
              • 🔀 Optimize the storage policy configured in preferences (b9faabf)
              • 🔊 Expanded audio source options (fc91f07)
              • 🔍️ Optimize QR code style to avoid scanning problems on some devices (dd3ad6c)
              • 🔖 Adjust the order of quick entry functions (ccb59e1)
              • 🔖 Optimize interaction of preferred terminal options (900dc69)
              • 🔧 Optimized startup APP function interaction (468af22)
              • 🔧 Temporarily disable scheduled tasks that are too far away (be5e639)
              • 🔨 Fixed the problem that some models could not reversely supply the network due to the blocking of installation detection when using Gnirehtet (c5369af)
              • 🔨 Improve the reliability of the linux sandbox configuration tool (6de2538)
              • 🧑‍💻 Improve application performance with VueRouter (6a8c190)
              • 🧑‍💻 Improve device-based terminal experience (88a0356)
              • 🧑‍💻 Optimize application icon size under macOS (066d81f)
              • 🧑‍💻 Optimize the interactive experience of the device control bar (8388646)
              • 🩹 Add an option to enable keyboard fix on app startup to be compatible with older versions of scrcpy (be89b36)
              • 🩹 Closing a screen via the control bar no longer requires creating a help window (84c7be7)
              • 🚀 Adjust options to support scrcpy v3.0 (0602676)
              • 🚀 After getting the device list, query and save the SerialNo of each device in preparation for subsequent integration (4464e7e)
              • 🚀 Clean output when closing built-in terminal (c976d4c)
              • 🚀 Extended floating control bar function (790e703)
              • 🚀 File management supports returning to the root directory (2e27443)
              • 🚀 Improve app icon quality (8a6f4c7)
              • 🚀 Improve performance by asynchronously storing main interface boundary information (d230c15)
              • 🚀 Modify the adb connection method to be compatible with scan connection (e6e8a09)
              • 🚀 Optimization of window arrangement function (33786ab)
              • 🚀 Optimize device connection experience (0690f2d)
              • 🚀 Optimize device list connection behavior and configuration migration strategy (8237058)
              • 🚀 Optimize program performance (9af3988)
              • 🚀 Optimize system terminal stability (2ffc588)
              • 🚀 Optimize the built-in terminal interaction experience (bb56d5b)
              • 🚀 Optimize the default behavior when adding new widgets to the device window arrangement (1be470a)
              • 🚀 Optimize the details of the new version of the icon (db9b19a)
              • 🚀 Optimize the display effect of application icons under windows (e0c221f)
              • 🚀 Optimize the display effect of new icons in smaller sizes (7d91d71)
              • 🚀 Optimize the layout effect of the task list (044cfcd)
              • 🚀 Optimize the menu trigger method for the upload function (8d39f5b)
              • 🚀 Optimize the storage strategy for preference Settings (359b9b9)
              • 🚀 Provide feedback on the application shortcut addition (d7eca8d)
              • 🚀 Supports display of offline devices (dcf817f)
              • 🚀 Supports opening using the main monitor when starting the APP (aec9b78)
              • 🚀 The main panel supports single instance startup (c49d22c)
              • 🚀 Update to scrcpy v3.3.1 (a2bb039)
              • 🚀 Update to scrcpy v3.0 (bf06382)
              • 🚀 Update to scrcpy v3.0.2 (7510548)
              • 🚀 Update to scrcpy v3.1 (7c74c71)
              • 🚀 Update to scrcpy v3.2 (57c11af)
              • 🚀 Update to scrcpy v3.3 (bbf2335)
              • 🚀 Update to scrcpy v3.3.3 (8566644)
              • 🚚 Reduce some unnecessary verifications and increase the speed at which equipment starts reverse network supply (c17aaba)

              Miscellaneous Chores

              Code Refactoring

              • ♻️ Reconstruct the multi-device batch upload function (dbdaa35)
              • 🔨 Optimize code (f61d820)

              1.34.2 (2025-12-08)

              Performance Improvements

              • 📦️ Update the upload function to support file and directory selection, and optimize the interface layout (7f5bd35)
              • 🚀 Optimize the menu trigger method for the upload function (8d39f5b)

              1.34.1 (2025-12-07)

              Performance Improvements

              • 🍻 Improve file manager reliability (9063243)

              1.34.0 (2025-12-07)

              Features

              • ✨ Introducing a new file icon display component and enhancing the File Explorer dialog. (11be6f1)
              • 🚀 Split the file manager into independent windows and support multiple instances in parallel (f41d853)
              • 🚚 The file manager has been refactored and improved, and more useful features have been added. (5cd5992)

              Bug Fixes

              • 🐛 Fixed the conflict between device control bar sorting and click events (18a57b9)
              • 🐛 Fixed the issue of abnormal path display in the file manager address bar (2f63f6f)
              • 🐛 Fixed the issue where Chinese text cannot be saved in file management read and write text (34785dd)

              Performance Improvements

              • ♻️ Optimize file manager interaction (b168cc3)
              • ✨ Enable new icon (695e35d)
              • 🌱 Optimize app icon background color and corner radius. (bc4f492)
              • 🌱 Optimize application icon details (55800be)
              • 📝 Optimize the scheduled task list (c666709)
              • 🧑‍💻 Optimize application icon size under macOS (066d81f)
              • 🧑‍💻 Optimize the interactive experience of the device control bar (8388646)
              • 🚀 Improve app icon quality (8a6f4c7)
              • 🚀 Optimize program performance (9af3988)
              • 🚀 Optimize the details of the new version of the icon (db9b19a)
              • 🚀 Optimize the display effect of application icons under windows (e0c221f)
              • 🚀 Optimize the display effect of new icons in smaller sizes (7d91d71)

              1.33.0 (2025-11-20)

              Features

              • ✨ Add system terminal support (e5c157e)

              Bug Fixes

              • 🐛 Fix issue with incorrect address bar path when returning to the previous level in file management (0222675)
              • 🐛 Fix the problem of Windows calling system terminal failure (194689e)
              • 🐛 Fix the problem of Windows terminal injection command failure (fbf88d0)
              • 🐛 Fixed the issue where PowerShell failed to call the system terminal (7beb027)

              Performance Improvements

              • 🔖 Optimize interaction of preferred terminal options (900dc69)
              • 🚀 Clean output when closing built-in terminal (c976d4c)
              • 🚀 Optimize system terminal stability (2ffc588)
              • 🚀 Optimize the built-in terminal interaction experience (bb56d5b)

              1.32.2 (2025-09-29)

              Performance Improvements

              • 🚀 Update to scrcpy v3.3.3 (8566644)

              1.32.1 (2025-09-10)

              Performance Improvements

              • 🌱 UI details and documentation optimization (5b5bbf7)

              1.32.0 (2025-09-08)

              Features

              • ✨ Now supports copying device screenshots and recording files to the clipboard (bdb3644)
              • 🚀 Update to scrcpy v3.3.2 (462536c)

              Bug Fixes

              • 🐛 Fixed the issue where recorded files could not be copied to the clipboard under Windows (119b518)
              • 🔧 Fixed button loading prompt conflict issue (c323ad6)

              Performance Improvements

              • ✅ Provides the function of detecting and migrating configurations when deleting a device (39e0533)
              • 📌 Standardize the device list lifecycle processing flow. IPv6 addresses must be enclosed in [] and the port number cannot be omitted for wireless connections. (93c059d)
              • 🚀 Modify the adb connection method to be compatible with scan connection (e6e8a09)
              • 🚀 Optimize device list connection behavior and configuration migration strategy (8237058)

              1.31.3 (2025-09-01)

              Performance Improvements

              • 💄 Window layout adapted to dark mode theme (eab402b)

              1.31.2 (2025-09-01)

              Bug Fixes

              • 🐛 Resolved the issue where the device list could not be displayed due to compatibility issues with certain devices (2c53b77)

              Performance Improvements

              • 🚀 Optimization of window arrangement function (33786ab)

              1.31.1 (2025-08-29)

              Performance Improvements

              • 👷 Remove redundant code comments (ca4e826)

              1.31.0 (2025-08-29)

              Features

              • ✨ Device lists will now intelligently merge duplicate device entries and share device configurations (52cc4b1)
              • ✨ Now you can arrange your device windows through a graphical interface (91ad249)

              Bug Fixes

              • 🐛 Fix typos (a7a3a17)
              • 🐛 Fixed possible sandbox issues on Linux (ff9f9bd)
              • 🐛 Fixed the issue of saving exceptions after adjusting parameters in preference settings (4a18f61)
              • 🐛 Issue not taking effect after restarting the application after switching themes (857c480)

              Performance Improvements

              • ♻️ Improve the stability of window arrangement function (7ae3f21)
              • ♻️ Simplify sandbox automatic configuration manager code to improve performance (1b82336)
              • 💄 Improve space utilization of device window layout tools (939a2d2)
              • 🔖 Adjust the order of quick entry functions (ccb59e1)
              • 🔨 Improve the reliability of the linux sandbox configuration tool (6de2538)
              • 🚀 After getting the device list, query and save the SerialNo of each device in preparation for subsequent integration (4464e7e)
              • 🚀 Improve performance by asynchronously storing main interface boundary information (d230c15)
              • 🚀 Optimize the default behavior when adding new widgets to the device window arrangement (1be470a)
              • 🚀 Optimize the layout effect of the task list (044cfcd)
              • 🚀 Optimize the storage strategy for preference Settings (359b9b9)

              1.30.2 (2025-07-15)

              Performance Improvements

              • ♻️ Optimize device list interaction logic (3812061)
              • 📝 Add Japanese language support (969378f)

              1.30.1 (2025-07-14)

              Bug Fixes

              • 🐛 Fixed the issue where all configurations would be cleared when resetting the category configuration in preferences (6ee9a92)
              • 🐛 Solve the problem of abnormal display timing when recording related functions are successful (67d279e)
              • 📝 Fixed the issue that special characters in Windows prevented the creation of app shortcut launch (301dac5)

              Performance Improvements

              • 📝 Optimized startup app package name display (22eb718)
              • 🔧 Optimized startup APP function interaction (468af22)

              1.30.0 (2025-07-14)

              Features

              • 🔍️ Optimize the search function of the app (94ccb7b)
              • 🚀 Supports dragging the device control bar to sort (64a98b2)

              Bug Fixes

              • 🐛 Fixed the issue of layout flickering when refreshing the device list page (608b8f3)
              • 🐛 Fixed the issue where activating the program on macOS in certain situations would cause the tray to be created repeatedly (cf8e183)
              • 🐛 Fixed the issue where there is a chance of an error when closing the floating control bar on macOS (5c2c711)
              • 🚀 Fix the issue of abnormal program exit behavior under windows (705f8be)

              Performance Improvements

              • ♻️ Code structure optimization (595216b)
              • 👥 Control bar sorting supports state synchronization (88abe95)
              • 📝 Optimize the title of the control interface to solve the problem of duplicate device names (06a151d)
              • 🔀 Optimize the storage policy configured in preferences (b9faabf)
              • 🚀 Supports opening using the main monitor when starting the APP (aec9b78)

              1.29.9 (2025-06-27)

              Performance Improvements

              • 🚀 Update to scrcpy v3.3.1 (a2bb039)

              1.29.8 (2025-06-20)

              Bug Fixes

              • 🐛 Update scrcpy-server file to solve the problem of not being able to obtain device APP list (63f7135)

              1.29.7 (2025-06-16)

              Performance Improvements

              • 🚀 Update to scrcpy v3.3 (bbf2335)

              1.29.6 (2025-04-27)

              Performance Improvements

              • 📝 Added Arabic language support (f6c9fa4)
              • 🚀 File management supports returning to the root directory (2e27443)

              1.29.5 (2025-04-17)

              Bug Fixes

              • 🐛 Fix the problem of build failure caused by missing dependencies (e34e1c2)

              1.29.4 (2025-04-17)

              Bug Fixes

              • 🐛 Fixed an issue where some options in preferences could not be turned off (269bd29)

              Performance Improvements

              • 💫 Adjust gnirehtet configuration behavior to make it consistent with user operation habits (7507915)
              • 🔍️ Optimize QR code style to avoid scanning problems on some devices (dd3ad6c)
              • 🩹 Add an option to enable keyboard fix on app startup to be compatible with older versions of scrcpy (be89b36)

              1.29.3 (2025-04-02)

              Performance Improvements

              • 📝 Add docs entry to the program (db5d157)
              • 🚚 Reduce some unnecessary verifications and increase the speed at which equipment starts reverse network supply (c17aaba)

              1.29.2 (2025-03-31)

              Performance Improvements

              • 🔨 Fixed the problem that some models could not reversely supply the network due to the blocking of installation detection when using Gnirehtet (c5369af)

              1.29.1 (2025-03-31)

              Performance Improvements

              • 🔊 Expanded audio source options (fc91f07)
              • 🩹 Closing a screen via the control bar no longer requires creating a help window (84c7be7)
              • 🚀 Update to scrcpy v3.2 (57c11af)

              1.29.0 (2025-03-27)

              Features

              • 🚀 Support adding the open application action to the desktop shortcut. (Not supported on macOS) (add251f)
              • 🚚 Support batch startup mirroring (fcfd78e)

              Bug Fixes

              • 🐛 Solve the conflict between floating navigation bar and quick APP launch (460aca1)
              • 🐛 Solve the problem of startup error of development mode under Linux (5c4f65e)

              Performance Improvements

              • ✨ The floating control bar supports transparent display when inactive (34f27c5)
              • 👷 Explicitly clean up unnecessary child processes on exit (0549dda)
              • 👽️ Experimental support for adding open application actions to linux desktop shortcuts (6897c0e)
              • 👽️ Experimentally add linux arm64 support (5b033fd)
              • 💄 Optimization of display effect of device list page (305187d)
              • 💫 Support appending gnirehtet custom parameters in configuration (206a030)
              • 🚀 Provide feedback on the application shortcut addition (d7eca8d)

              1.28.7 (2025-02-17)

              Bug Fixes

              • 🐛 Fixed the issue of duplicate filter conditions in the device list (6c4242c)
              • 🐛 Solved the problem that the main window could not be restored after being moved off the screen in some cases (d054f8d)

              Performance Improvements

              • ⬆️ Improved performance of automated mirroring (33a03c3)
              • 💄 Optimize the display effect of horizontal screen screenshots (90c7163)
              • 🚀 The main panel supports single instance startup (c49d22c)

              1.28.6 (2025-02-05)

              Bug Fixes

              • 🐛 Resolving build errors (d21fa29)

              1.28.5 (2025-02-05)

              Performance Improvements

              • ✅ File management supports selecting directories for uploading (fd2e639)
              • ⬆️ Improve QR code connection performance (b413889)

              1.28.4 (2025-01-13)

              Bug Fixes

              • 🐛 Fix the display ID value type error (2b7ee79)
              • 🐛 Solve the problem of IPV6 address connection failure (1a95325)

              Performance Improvements

              • ♻️ Improve wireless connection stability (85be898)
              • ⚡️ Optimize the method of obtaining the available displays of the device (9e31c84)
              • 🐛 Improve wireless connection verification method (69fecc3)
              • 👷 Added edge hiding function switch (d25714a)

              1.28.3 (2024-12-28)

              Performance Improvements

              • ♻️ Optimize device details performance (38d1433)

              1.28.2 (2024-12-27)

              Performance Improvements

              • 👷 Optimize the edge hiding function (d5caaa9)
              • 📸 Support viewing real-time images and power information of the device (d262adf)

              1.28.1 (2024-12-20)

              Performance Improvements

              • ♻️ Optimize QR code connection experience (86f5e69)

              1.28.0 (2024-12-20)

              Features

              • ✨ Support pairing and connecting to devices via QR code (14306b2)
              • 🚀 Supports connecting historical devices via device list (e0687e8)

              Bug Fixes

              • 🐛 Solve the problem of Windows disabling video forwarding and crashing (10b902a)

              Performance Improvements

              • ♻️ Update mirror icon (c214e5a)
              • ✅ A new method is adopted to solve the problem of IP type configuration storage (5488a1e)
              • 🚀 Optimize device connection experience (0690f2d)
              • 🚀 Supports display of offline devices (dcf817f)

              1.27.7 (2024-12-10)

              Performance Improvements

              • 🚀 Update to scrcpy v3.1 (7c74c71)

              1.27.6 (2024-12-05)

              Bug Fixes

              • ♻️ Fixed repeated dependency issues (9777622)

              Performance Improvements

              • ♻️ Optimized contextBridge related improvements for stability (0e098c3)
              • ♻️ Reduce build package size by removing redundant dependencies (7b61b25)
              • 🚀 Update to scrcpy v3.0.2 (7510548)

              1.27.5 (2024-11-29)

              Performance Improvements

              • ➖ Remove redundant console (9a67142)

              1.27.4 (2024-11-29)

              Bug Fixes

              • 🐛 Fix automatic release (c2254aa)
              • 🐛 Fixed an issue where macos built-in updates failed (432eceb)

              1.27.3 (2024-11-28)

              Bug Fixes

              • 🐛 Fix for built-in scrcpy not supporting x64 macos (0d60655)

              Performance Improvements

              • ♻️ Improved device connection stability (1d603ab)
              • ♻️ Optimized the adb daemon startup failure detection mechanism (ca6be85)
              • 🧑‍💻 Improve device-based terminal experience (88a0356)

              1.27.2 (2024-11-26)

              Bug Fixes

              • 🐛 Start app to adapt to dark mode (ae13fde)

              1.27.1 (2024-11-25)

              Bug Fixes

              • 🐛 Make StartApp compatible with scrcpy v3.0 (1082e0d)

              Performance Improvements

              • 🚀 Adjust options to support scrcpy v3.0 (0602676)
              • 🚀 Update to scrcpy v3.0 (bf06382)

              1.27.0 (2024-11-21)

              Features

              • ✨ Support edge hiding function (14a81de)

              Performance Improvements

              • ⬆️ Optimize edge hiding performance (74a91a4)

              1.26.4 (2024-11-14)

              Bug Fixes

              • 🐛 Temporarily disable scrcpy integration in macOS (9bf4d5c)

              1.26.3 (2024-11-08)

              Bug Fixes

              • 🐛 Fix device support audio and video encoding cannot be parsed (9b7f6a9)
              • 🐛 Restore the --display-buffer parameter to solve the mirroring problem (0f3d869)

              Performance Improvements

              • ♻️ Support interruption during waiting for wireless connection (344b385)
              • ♻️ Supports retrieving a list of applications (b1a6ba7)
              • ⚡️ Optimize startup application performance (8e94494)

              1.26.2 (2024-11-06)

              Bug Fixes

              • 🐛 Fix linux build errors (9b43dc0)

              1.26.1 (2024-11-06)

              Performance Improvements

              • ♻️ No longer building universal packages for macOS (db5deb4)

              1.26.0 (2024-11-06)

              Features

              • ✨ Integrate scrcpy binaries for macos (85bf096)
              • ✨ Supports starting applications for mirroring (d19e781)

              Bug Fixes

              • 🐛 Rename --display-buffer to --video-buffer (b2bb0ae)
              • 🐛 Repair floating action bar start application error (487e7e2)
              • 🩹 Restore the windows build configuration (9491069)

              Performance Improvements

              • ♻️ Adjust the position of the start application button (9833932)
              • ♻️ When the application fails to start, display the error message (dbc34d6)
              • ⚡️ Improve the start APP experience (29e5e1b)

              1.25.5 (2024-11-05)

              Performance Improvements

              • ⚡️ Optimize the stability of options that need to dynamically obtain parameters in preference settings (39bbc98)

              1.25.4 (2024-10-31)

              Performance Improvements

              • ♻️ Enhance recording stability (3dd7525)
              • ♻️ Optimize camera recording stability (952b2a7)
              • 💄 Normalize control window titles and generated file names (ccc7f0e)

              1.25.3 (2024-10-29)

              Bug Fixes

              • 🔧 Camera recording and screen off configuration conflict (4508758)

              Performance Improvements

              • 🔧 Temporarily disable scheduled tasks that are too far away (be5e639)

              1.25.2 (2024-10-29)

              Bug Fixes

              • 🐛 Resolve default recording error (358064e)

              1.25.1 (2024-10-28)

              Miscellaneous Chores

              1.25.0 (2024-10-28)

              Features

              • ✨ Support to close the device screen when controlling (a84c775)
              • 📸 Enhanced recording (7f10161)

              Performance Improvements

              • ♻️ Optimize camera recording (4be2cf4)
              • ♻️ Script and directory structure optimization (68378ef)
              • ⚗️ Experimental support for turning off screen controls (9555f58)
              • ⚡️ Optimize scrcpy parameter conversion performance (18dcd24)
              • 💄 Improved Russian display (ca79e1b)
              • 📸 Recording camera support (10d0370)

              1.24.3 (2024-10-21)

              Performance Improvements

              • 💄 Optimize Russian display effect (5ca39ae)

              1.24.2 (2024-09-16)

              Bug Fixes

              • 🐛 Fix the mirror group bug (cd7d9cd)

              1.24.1 (2024-09-16)

              Performance Improvements

              • ✨ Update to scrcpy@2.7 to support the gamepad (0053e87)
              • ⬆️ Optimize the performance of the floating control bar (a1c60ec)
              • 🚀 Extended floating control bar function (790e703)

              1.24.0 (2024-09-12)

              Features

              • ✨ Support floating control bar (8807e50)

              Performance Improvements

              • ✅ Support switching devices on the floating control bar (50440f5)
              • 💄 Optimize preference setting button layout (47ae53d)

              1.23.6 (2024-09-09)

              Bug Fixes

              • 🐛 Fixed the problem of minimizing the visibility of tray icons (b0f42aa)
              • 🐛 Repair ADB timeout problems (b5bffc5)

              1.23.5 (2024-09-09)

              Performance Improvements

              • ♻️ Improve ADB connection stability (7655ba6)

              1.23.4 (2024-09-08)

              Bug Fixes

              • 🐛 Repair part of internationalization Lost dynamics (d18444f)

              1.23.3 (2024-09-08)

              Performance Improvements

              • ♻️ Optimize the performance of equipment interaction column and file manager (41ffcf5)

              1.23.2 (2024-09-07)

              Performance Improvements

              • 🚀 Support file manager upload to the current directory (737c2a3)

              1.23.1 (2024-09-07)

              Performance Improvements

              • ⬆️ Update dependencies (8b03862)

              1.23.0 (2024-09-07)

              Features

              • ✨ Support graphic file manager (8155723)
              • 🚀 Initially add a new file manager (94ee007)

              Performance Improvements

              1.22.4 (2024-08-03)

              Bug Fixes

              • 🐛 plan task Remove operation bug (5205935)

              Performance Improvements

              1.22.3 (2024-08-03)

              Performance Improvements

              • ♻️ Update scrcpy to 2.6.1 (1eef9d2)

              1.22.2 (2024-07-25)

              Performance Improvements

              • 💄 Optimize the display effect of the dark mode (38f854b)
              • 💄 Optimize the display effect of the quick operation bar (7b3c4db)
              • 💄 Optimize the display effect of the tabs bar (5b2d41c)

              1.22.1 (2024-07-25)

              Bug Fixes

              • 🐛 Fixed asset publishing issues (222f626)

              1.22.0 (2024-07-25)

              Features

              • 🚀 Add a scheduled task list (d72202b)
              • 🚀 Add basic timing task function (04a7608)
              • 🚀 Add timing task entrance (8393c85)
              • 🚀 添加定时任务入口 (6ce66d4)

              Bug Fixes

              • 🐛 The internationalization problem of repairing path selector (8e6af20)
              • 💄 Optimize wireless connection user interface (50ae742)

              Performance Improvements

              • 💄 Optimization of the operation bar at the top of the equipment list (81bd3d9)
              • 💄 Optimized operation button layout (16f9535)

              1.21.4 (2024-07-14)

              Performance Improvements

              • ♻️ Optimize custom startup performance (abd468b)
              • ♻️ Perfect allSettledWrapper method (5b7d0af)

              1.21.3 (2024-07-13)

              Bug Fixes

              • Fix the width problem of custom startup pop-up windows (9a7e56b)

              1.21.2 (2024-07-13)

              Bug Fixes

              • 🐛 Fix terminal style abnormalities in dark theme (3d4dc7c)

              Performance Improvements

              • ♻️ Improve code robustness (2f389af)
              • 🚀 Optimize batch operation interaction (343eab2)

              1.21.1 (2024-07-13)

              Bug Fixes

              • 🐛 Fix dependency build errors (5b02621)

              1.21.0 (2024-07-13)

              Features

              • 🎉 Support batch execution script function (8097022)
              • 🚀 Support execution script function (2013413)

              Bug Fixes

              • 🐛 Repair the problem of equipment width in the English state (25c42d9)
              • 📝 Update Translation (33b0181)

              Performance Improvements

              • ✅ Support batch screenshot and other performance optimization (db9e3e7)
              • ✨ Support for custom startup mirroring (677f30c)
              • 🐛 Fix the problem of frequently trigger preservation of preferences (8261916)

              1.20.1 (2024-07-04)

              Bug Fixes

              • 🐛 Fix batch text spelling errors (062c689)

              1.20.0 (2024-07-04)

              Features

              • ✨ Add batch installation application function (37ce245)

              Performance Improvements

              • 🚀 Add mouse binding options (7ee4ba4)

              1.19.4 (2024-07-02)

              Bug Fixes

              • 🐛 Fix terminal style problems (9fc1ded)
              • Update Chinese language translations (b8d77e3)

              Performance Improvements

              • 🚀 Update to scrcpy v2.5 (22cc5a3)

              1.19.3 (2024-06-13)

              Bug Fixes

              • 🐛 Abnormal operations cause the program that cannot be closed (b989140)

              1.19.2 (2024-06-03)

              Bug Fixes

              • 🐛 Automatically apply local languages (0cc8208)

              1.19.1 (2024-05-26)

              Bug Fixes

              • 🐛 In some cases, the light mode is abnormal (ea227e0)
              • 🐛 Search for shortcut key conflicts (c70e6ca)

              Performance Improvements

              1.19.0 (2024-05-15)

              Features

              • 🚀 Add page search function (6dd8244)
              • 🚀 Update dependencies to support ESM (9f1696f)

              Bug Fixes

              • 🐛 Resolving build failures (8460945)
              • 🐛 Tips unavailable (603e4e9)

              Performance Improvements

              • ♻️ FindInPage API (fcf8269)
              • ♻️ Optimize dark mode (2f2e1cf)
              • ♻️ Search interaction (a195b7e)
              • ♻️ Search variable name (7c55e50)
              • 🐛 Global search error (091d503)
              • 🚀 优化页面查找工具性能 (8587977)

              1.18.4 (2024-05-04)

              Bug Fixes

              • 🐛 Wireless adb does not support Spaces (1f27597)

              1.18.3 (2024-04-12)

              Performance Improvements

              • ♻️ i18n configuration (1ca0469)

              1.18.2 (2024-04-11)

              Bug Fixes

              • 🐛 zh_TW Language support (885af3a)

              1.18.1 (2024-04-11)

              Bug Fixes

              • 🔧 Repair merge zh-TW failed (81ff63f)

              Performance Improvements

              1.18.0 (2024-04-11)

              Features

              • Add a simple zh_TW Traditional Chinese locale (cec6539)

              1.17.8 (2024-03-29)

              Bug Fixes

              • 🐛 Camera configuration conflict (07cc5f3)
              • 🐛 OTG configuration conflict (576d287)
              • 🐛 OTG mode: could not turn screen off (c5bed0e)

              1.17.7 (2024-03-27)

              Bug Fixes

              • ♻️ Remove the redundant imports (a06708f)

              Performance Improvements

              • ♻️ Optimize delete history logic (780e3b9)
              • ♻️ Support delete historical connection (c82560f)
              • 💄 Wireless style optimization (ba51fe3)

              1.17.6 (2024-03-21)

              Performance Improvements

              • ♻️ Supports automatic execution of mirrors on devices (11e0884)

              1.17.5 (2024-03-17)

              Performance Improvements

              1.17.4 (2024-03-14)

              Performance Improvements

              • ♻️ Options in the preference settings (dc711cb)

              1.17.3 (2024-03-13)

              Performance Improvements

              • ♻️ Remove console log (6e25eb7)

              1.17.2 (2024-03-10)

              Bug Fixes

              • 🐛 Abnormal built-in terminal adb command (368551a)

              Performance Improvements

              • ♻️ Update eslint config (bf2d2b4)

              1.17.1 (2024-03-05)

              Performance Improvements

              • ♻️ Interactive logic optimization (193f80a)
              • ♻️ Optimize design and code (d507c2d)
              • ♻️ Optimize equipment operation (389ac33)
              • ➖ Remove redundant packages (f9e4a0e)
              • 💄 Optimize dark mode styles (1cac054)

              1.17.0 (2024-03-04)

              Features

              • 🎉 Update to scrcpy v2.4 (02a4d39)

              1.16.8 (2023-12-27)

              Bug Fixes

              • 🐛 The maximum size description error (01fd926)

              1.16.7 (2023-12-19)

              Performance Improvements

              1.16.6 (2023-12-19)

              Miscellaneous Chores

              1.16.5 (2023-12-19)

              Performance Improvements

              • 📝 Control in stop charging (8707eb5)

              1.16.4 (2023-12-19)

              Bug Fixes

              • 🐛 Pairing code type issue (889fe8c)

              1.16.3 (2023-12-03)

              Performance Improvements

              • 🚀 Update scrcpy v2.3.1 (3566655)

              1.16.2 (2023-12-02)

              Bug Fixes

              1.16.1 (2023-11-26)

              Bug Fixes

              1.16.0 (2023-11-26)

              Performance Improvements

              Miscellaneous Chores

              1.15.0 (2023-11-18)

              Features

              • 添加投屏窗口大小控制 (97d7868)

              Performance Improvements

              • 🚀 Add window position option (866aa2c)

              1.14.3 (2023-11-17)

              Performance Improvements

              • ♻️ Add context menu (f0f25a7)
              • ♻️ Optimize extended menu bar interaction (de9352c)
              • 📝 Optimization preferences description (30eca50)

              1.14.2 (2023-11-16)

              Performance Improvements

              • ♻️ Optimize autoConnect historical devices (755a130)
              • 💡 Add autoConnect option (a57b847)

              1.14.1 (2023-11-14)

              Bug Fixes

              • 🐛 Abnormal terminal theme (20d37c1)

              1.14.0 (2023-11-14)

              Features

              • 🎉 Add Terminal Debugging (fdf40c7)

              Performance Improvements

              • ♻️ Optimize terminal performance (d3afc4b)
              • 💄 Update terminal style (5b6b8d1)
              • 🚨 Optimization error prompt (b759502)

              1.13.5 (2023-11-11)

              Performance Improvements

              • ♻️ Mirror group shutdown logic (296e21d)
              • ♻️ Optimize mirror group (5793c24)

              1.13.4 (2023-11-10)

              Performance Improvements

              • ♻️ Optimization updater (61ccd4a)
              • ♻️ Optimize mirror group (81c007f)

              1.13.3 (2023-11-10)

              Bug Fixes

              • 🐛 Recording prompt and file format errors (bfdad9e)

              Performance Improvements

              • ♻️ Optimize Batch connection performance (36de67b)
              • ♻️ Optimize file push prompts (4a3575f)
              • ♻️ Optimize historical device connections (83f8c04)
              • ✨ Support bulk connecting to historical devices (b7eb1dd)

              1.13.2 (2023-11-09)

              Bug Fixes

              Performance Improvements

              • ♻️ Configure Incompatible Handling Mechanism (c0e6a01)
              • ♻️ Optimize gnirehtet (de3555b)
              • 💄 Optimize volume control and gnirehtet (b40bdcf)
              • 🚀 Add File push function (70f8b46)
              • 🚀 Add screen rotation shortcut menu (dd601df)

              1.13.1 (2023-11-08)

              Performance Improvements

              • ♻️ Adjust volume control position (1b3f49e)
              • ♻️ Optimize configuration file logic (5f8cc5a)
              • 🚀 Add volume control (1505518)

              1.13.0 (2023-11-07)

              Features

              • 🎉 Add mirror group function (0c9d36f)

              Bug Fixes

              Performance Improvements

              • ♻️ Optimize mirror group (cf9c82d)
              • ♻️ optimize mirror group tips (46defbf)
              • ♻️ Optimize preferences (7a6417e)
              • ♻️ Optimize window control (0530ed3)
              • 💄 Update styles (37da97b)
              • 🚀 Add camera options (5a04b4c)

              1.12.4 (2023-11-03)

              Bug Fixes

              • 🐛 MacOS reduced to the tray to evoke failure (d7bf83b)

              1.12.3 (2023-11-03)

              Bug Fixes

              • 🐛 MacOS reduced to the tray to evoke failure (6153bc4)

              1.12.2 (2023-11-03)

              Bug Fixes

              1.12.1 (2023-11-03)

              Bug Fixes

              • 🐛 Add gnirehtet fix option (f9c6c32)
              • 🐛 Display options cannot be changed (3046746)
              • 🐛 Preference style (0f72090)
              • 🐛 Reset preferences language not restored (d691780)
              • 🐛 Unable to update path selector (3279c34)
              • 🐛 Video codec preset error (1af9abd)

              Performance Improvements

              • ♻️ optimize Codec (6154ffc)
              • ♻️ Optimize recording (f4dfb2c)
              • 🎨 Update preferences style (e9befea)

              1.12.0 (2023-11-02)

              Features

              • 🎉 Update Scrcpy to v2.2 (5c401a8)

              Bug Fixes

              Performance Improvements

              1.11.9 (2023-10-31)

              Performance Improvements

              • ♻️ Optimization gnirehtet and scrcpy (9cf800c)
              • ♻️ Optimize Gnirehtet interaction (a90e570)

              1.11.8 (2023-10-31)

              Bug Fixes

              • 🎨 修复 macOS 设置主题跟随系统后 某些情况下循环触发导致死循环的问题 (1d7b188)

              1.11.7 (2023-10-31)

              Bug Fixes

              • 🐛 macOS x64ArchFiles Errors (151cb29)

              1.11.6 (2023-10-31)

              Bug Fixes

              • 🐛 macOS x64ArchFiles Errors (7dbca01)

              1.11.5 (2023-10-31)

              Bug Fixes

              • 🐛 macOS x64ArchFiles Errors (ad3f77f)

              1.11.4 (2023-10-31)

              Bug Fixes

              • 🐛 macOS x64ArchFiles Errors (4b4e116)

              1.11.3 (2023-10-31)

              Bug Fixes

              • 🐛 Unix permission issues (1279994)
              • 🐛 Unix permission issues (dc9a3c4)
              • 🐛 x64ArchFiles Error (82a99d9)

              1.11.2 (2023-10-30)

              Bug Fixes

              • 🐛 修复 macOS 打包失败的问题 (1b2236c)

              1.11.1 (2023-10-30)

              Bug Fixes

              • 🐛 修复 macOS 打包失败的问题 (37e2837)

              1.11.0 (2023-10-30)

              Features

              • 🎉 Add gnirehtet reverse tethering function (2c97189)

              Bug Fixes

              • 🐛 gnirehtet custom dependent paths error (cfd0e1d)

              Performance Improvements

              • ♻️ Optimize Gnirehtet interaction (e1237cd)
              • ♻️ 拆分依赖文件禁用冗余的警告信息 (93ad836)
              • ♻️ 目录结构及描述调整 (f9a32d6)
              • ♻️ 补充依赖及目录结构调整 (b18256b)

              1.10.2 (2023-10-28)

              Bug Fixes

              • 🐛 修复设置主题跟随系统后没有生效的问题 (95a83f4)

              1.10.1 (2023-10-28)

              Bug Fixes

              • 🐛 修复 linux 无法启动镜像或录制服务以及修改自定义依赖目录的问题 (d815643)

              1.10.0 (2023-10-27)

              Features

              • 🚀 新增支持 深色模式、国际化语言、运行日志等功能 (4b13f58)

              Bug Fixes

              • 🐛 修复 linux 打包后图标丢失的问题 (217d82d)
              • 🐛 修复安装路径包含空格会导致无法启动服务的问题 (29ae786)
              • 🐛 修复录制结束点击取消异常弹窗以及点击重启服务没有反应的问题 (054c55b)
              • 🔧 修复自定义路径功能没有生效的问题 (894b581)

              Performance Improvements

              1.9.1 (2023-10-24)

              Performance Improvements

              • 💄 窗口控制及交互逻辑优化 (52514e2)

              1.9.0 (2023-10-24)

              Features

              • 🚀 添加 i18n 初步支持 (18d490f)

              Bug Fixes

              • 🐛 修复 macOS 最小化到托盘后状态栏图标不显示的问题 (a789826)

              1.8.17 (2023-10-23)

              Bug Fixes

              • 🐛 尝试修复构建失败 (daeb9e5)

              1.8.16 (2023-10-23)

              Performance Improvements

              • ✨ 采用新的 Logo 设计 (3bf79d3)

              1.8.15 (2023-10-22)

              Bug Fixes

              • 🐛 修复 Linux 平台启动白屏无法正常使用的问题 (54e713b)

              1.8.14 (2023-10-21)

              Bug Fixes

              • 🐛 修复 linux 打包配置错误的问题 (a9668d9)

              1.8.13 (2023-10-21)

              Performance Improvements

              • 🚀 为 windows 添加 ARM64 软件包编译 (368e8ee)
              • 🚀 支持所有平台在点击关闭按钮时选择是否保存到托盘中的功能 (8360198)

              1.8.12 (2023-10-21)

              Bug Fixes

              • 🐛 修复 macOS 或 linux 下自定义依赖选项描述错误的问题 (0d4b1ce)

              1.8.11 (2023-10-21)

              Performance Improvements

              • 🔨 优化窗口默认大小 (393e899)

              1.8.10 (2023-10-20)

              Bug Fixes

              • 🐛 修复 macOS 窗口问题 (f768566)

              1.8.9 (2023-10-20)

              Bug Fixes

              • 🐛 修复 macOS 窗口过小导致出现横向滚动条的问题 (8ee34ca)

              1.8.8 (2023-10-20)

              Bug Fixes

              • 🚀 修复 macOS 简单关闭应用重新打开时报错的问题 (4b259c3)

              1.8.7 (2023-10-20)

              Bug Fixes

              • 🐛 修复打包多个平台时可能生成重复文件导致发布软件包失败的问题 (e89a7a5)

              1.8.6 (2023-10-20)

              Bug Fixes

              • 🔧 修复 macOS 无法正确获取系统依赖路径的问题 (2352593)

              1.8.5 (2023-10-20)

              Bug Fixes

              • 🚑️ 修复 Linux maintainer 问题 (4e1542a)

              1.8.4 (2023-10-20)

              Bug Fixes

              • 🚑️ 修复 Linux 打包失败的问题 (96f85d8)

              1.8.3 (2023-10-20)

              Bug Fixes

              • 🚀 修复 MacOS 软件包安装后无线显示 Logo 的问题 (77dd81b)

              1.8.2 (2023-10-20)

              Bug Fixes

              • 🔧 修复 Linux 及 MacOS 获取默认依赖路径异常的问题 (87b533f)
              • 🔧 修复 MacOS ARM64 版本打包失败的问题 (e9a8fc2)

              1.8.1 (2023-10-20)

              Performance Improvements

              • 🚀 支持创建更多架构的 MacOS 软件包格式 (4780e7c)

              1.8.0 (2023-10-20)

              Features

              • 🚀 初步添加对 Linux 以及 MacOS 的支持 (569ed2e)

              Bug Fixes

              • 📝 偏好设置描述信息修改 (23d68d4)
              • 🔧 设备列表标签显示细节调整 (4f2f00e)

              Performance Improvements

              • 📝 设备备注文本框描述信息调整 (379b325)

              1.7.1 (2023-10-20)

              Bug Fixes

              • 🚀 修复对设备进行独立配置时的一些问题 (6ccd6d0)

              Performance Improvements

              • 🎉 初步支持设置偏好设置的作用域范围 (5dd328c)

              1.7.0 (2023-10-19)

              Features

              • 🚀 新增支持导入及导出配置 (326a133)
              • 🚀 新增支持添加设备备注 (43f15be)

              Performance Improvements

              • ➕ 设备交互栏添加重启设备及打开通知栏功能 (1341fb8)

              1.6.10 (2023-10-18)

              Performance Improvements

              • 🚀 采用新的方法实现所有进程共享 isPackaged (8a5f7d9)

              1.6.9 (2023-10-17)

              Bug Fixes

              • 🔧 优化 isPackaged 判断条件解决某些情况下资源路径解析异常的问题 (fbd1885)

              1.6.8 (2023-10-17)

              Performance Improvements

              • 🚀 支持通过操作栏安装应用并提供相应安装反馈 (3bd2075)

              1.6.7 (2023-10-17)

              Performance Improvements

              • 📝 去除冗余的依赖项 (a6744dc)

              1.6.6 (2023-10-17)

              Bug Fixes

              • 🐛 build fix (09c8dee)
              • 🐛 修复 electron 资源路径问题 (955756e)

              1.6.5 (2023-10-16)

              Bug Fixes

              • 🐛 修复 App NextTick 错误 (79d85eb)

              1.6.4 (2023-10-16)

              Bug Fixes

              • 🐛 修复 electron-builder 配置异常导致打包的文件无法发布的问题 (9a4efa5)
              • 🚀 修复设备列表按钮状态变更影响布局变化的问题 (83a8043)

              1.6.3 (2023-10-16)

              Bug Fixes

              • 🐛 修复打包后图标丢失的问题 (58a66f1)

              1.6.2 (2023-10-13)

              Bug Fixes

              • 🐛 修复USB未授权设备导致无线连接地址变为假值的问题 (9c25325)

              1.6.1 (2023-10-13)

              Performance Improvements

              • 🔨 自定义通用的文件存储路径相关逻辑完善 (8455e86)

              1.6.0 (2023-10-13)

              Features

              • 🚀 增加了对设备交互控制栏的支持 (fd20736)

              1.5.3 (2023-10-13)

              Bug Fixes

              • 🔧 修复点击无线模式没有反应的问题 (9d55ef9)

              1.5.2 (2023-10-13)

              Bug Fixes

              • 📝 修复高级配置标题语义不明的问题 (218de1c)

              Performance Improvements

              • 🚀 添加更多的高级配置并更新文档 (922abd2)

              1.5.1 (2023-10-12)

              Bug Fixes

              • 🐛 去除页面组件冗余参数 (8e5df15)

              1.5.0 (2023-10-12)

              Features

              • 🚀 添加音视频录制功能以及更多的高级选项 (b6986d1)

              1.4.1 (2023-10-12)

              Bug Fixes

              • 🐛 修复检查更新失败没有提示的问题 (6f733ea)

              1.4.0 (2023-10-11)

              Features

              • 🚀 添加在线检查更新功能 (8de04e0)

              Bug Fixes

              • 🔨 修复无线配对时表单验证错误 (7cd9ea3)
              • 🔨 修复直接进行无线连接时没有处理配对设备的问题 (4263d07)

              1.3.3 (2023-09-26)

              Bug Fixes

              • 🐛 修复触摸点配置描述错误的问题 (4e2be23)

              1.3.2 (2023-09-19)

              Bug Fixes

              • 🔧 修复旋转屏幕配置异常的问题 (af7a319)

              1.3.1 (2023-09-19)

              Bug Fixes

              • 🔧 修复图标不透明的问题 (24c011f)

              1.3.0 (2023-09-19)

              Features

              • ✨ 用户界面进行优化,制作了合适的 Logo (1b96ffc)

              1.2.0 (2023-09-19)

              Features

              • 🎉 优化设备界面视图并添加虚拟控制栏配置 (3be0682)

              1.1.0 (2023-09-18)

              Features

              • 🚀 增加了常用的 Scrcpy 高级配置 (ac52df2)

              1.0.2 (2023-09-18)

              Performance Improvements

              • 🚀 合并无线连接及有线连接到设备列表 (e84f24e)

              1.0.1 (2023-09-16)

              Bug Fixes

              • 🔧 去除未测试环境的打包以修复构建失败的问题 (d6ec7fd)

              1.0.0 (2023-09-16)

              Features

              • 📝 添加基本的有线连接支持 (647a0c5)
              • 🚀 添加 Electron 基本支持 (a46a5e1)
              • 🚀 添加初步的构建及发布支持 (c85f8fb)
              • 🚀 添加基本的无线连接功能 (6dd2db9)

              Bug Fixes

              • 🔧 修复 ADB 环境变量配置错误导致无法连接的问题 (9ef7203)

              +

              Skip to content

              Changelog

              2.8.1 (2026-04-07)

              Bug Fixes

              • 🐛 Fixed the problem of dark theme background not taking effect (ad19695)

              Performance Improvements

              • 🎉 Increased free limit for batch automation scripts and device group controls to 5 devices. (11271f2)

              2.8.0 (2026-04-06)

              Features

              • ✨ Window arrangement supports the automatic arrangement function (696d94b)

              Bug Fixes

              • 🐛 Fix i18n errors (e4ad3ec)
              • 🐛 Fix the default value issue of the subscription plan (a19dd9e)
              • 🐛 Fixed the issue where multiple files cannot be pasted when copied to the clipboard under Windows (dcc7a94)

              Performance Improvements

              • ♻️ Optimize subscription plan (c12ef9d)
              • ♻️ Optimize the pricing strategy for advanced features to prevent misjudgments by users (4d722b7)
              • 💄 Optimize the display details of the embedded mirror window (6cf4c69)
              • 🚀 Automation script adds random range option (4d73e1a)
              • 🚀 Extended embedded mirroring operable shortcut buttons (19c0de2)
              • 🚀 Optimize subscription configuration (d053bfa)
              • 🚀 Optimize the automation script editor to avoid screen border issues (ffd56a6)
              • 🚀 Refactored file copy function supports batch copying to the clipboard (ccca99a)

              Code Refactoring

              • ♻️ Optimize subscription plan default value acquisition (7b9c47f)
              • 🚀 Dynamically configure subscriptions by detecting the environment (d02e1b3)
              • 🚀 Fix typescript configuration (cbc8631)

              2.7.3 (2026-04-02)

              Bug Fixes

              • 🐛 Fixed an issue where embedded mirroring could not be input due to external activation elements. (058b982)

              Performance Improvements

              • 🚀 Optimize the embedded image to open the application list display (7f6b18a)

              Code Refactoring

              • 🔊 Optimize the wscrcpy audio cleaning logic (a29cd85)

              2.7.2 (2026-04-01)

              Bug Fixes

              • 🐛 Fix dependency not updated error (2d8ebfd)

              2.7.1 (2026-04-01)

              Bug Fixes

              • 🐛 Fixed the problem that the global search shortcut key does not take effect (e7596f9)

              2.7.0 (2026-04-01)

              Features

              • 🚀 Add wscrcpy cli parameter adapter (ea64b5e)
              • 🚀 Complete more parameters of wscrcpy (c48020b)
              • 🚀 Extend wscrcpy capabilities (0717688)
              • 🚀 Initial implementation of device group control function (4ea4e7d)
              • 🚀 Optimize group control experience (853e53d)
              • 🚀 Optimize the details of the mask layer module (c9da58e)
              • 🚀 Optimize the interaction details of the mask board module (b67582a)
              • 🚀 Redesign the overlay module guide page (c522fcb)
              • 🚀 Refactor the embedded image package to the wscrcpy package (5f8a309)
              • 🚀 Use tango-adb to directly render the device screen in the mask layer module (81d93dd)
              • 🚀 wscrcpy adds support for mouse hover monitoring (eb78931)
              • 🚀 wscrcpy only enables audio forwarding by default in the macos environment (5d510dc)

              Bug Fixes

              • 🐛 Fix the issue of resetting the window position of the mirror module (d4c3a74)
              • 🐛 Fix the problem of data echo in automation steps (435c3de)
              • 🐛 Fix the problem of Wscrcpy audio forwarding exception (967a6c2)
              • 🐛 Fix the problem of wscrcpy group control failure (ea74182)
              • 🐛 Fix wscrcpy clipboard synchronization issue (42fee69)
              • 🐛 Fix wscrcpy reconnection problem (a6de9b9)
              • 🐛 Fixed sub-package build conflict and misalignment issue (99b22ba)
              • 🐛 Fixed syntax error in the action bar at the bottom of the overlay (ef0a301)
              • 🐛 Fixed the problem of abnormal calculation of size ratio when switching the main device on the group control page (5ad014f)
              • 🐛 Fixed the problem of abnormal disconnection of wscrcpy video stream when exiting the program (174a01c)
              • 🐛 Fixed the problem of interactive forwarding conflict when group control is enabled for auxiliary devices (60ae2a4)
              • 🐛 Fixed the problem of mask layer adaptation button forwarding (4be239e)
              • 🚀 Fix mask layer test issue (33581df)
              • 🚀 Fixed overlay module screen rotation issue (ad0af45)
              • 🚀 Fixed wscrcpy audio and clipboard synchronization configuration conflict issue (5bb65e0)

              Performance Improvements

              • 💄 Optimize the interaction of the embedded image module (7a21fdb)
              • 🚀 Add internationalization to automation script keylist (e7b78c1)
              • 🚀 Device group control expands more operations (08e46b6)
              • 🚀 Enhance the interaction experience of built-in images (e913fee)
              • 🚀 Expand batch opening function for group control function (a38dbde)
              • 🚀 Explicitly declare wscrcpy external dependencies (52924c8)
              • 🚀 Improve group control function subscription capabilities (479b996)
              • 🚀 Improve the stability of the overlay adapter (be0ff8c)
              • 🚀 More embedded startup entries have been added to the device list (24e4fd1)
              • 🚀 Optimize check update pop-up window style (54eaa51)
              • 🚀 Optimize embedded image module error prompts (e26186b)
              • 🚀 Optimize overlay click/swipe event interaction (d7c0500)
              • 🚀 Optimize overlay module details (8ce5937)
              • 🚀 Optimize overlay module details (2799ab0)
              • 🚀 Optimize preference interaction Disable device-dependent options in global mode (ea47604)
              • 🚀 Optimize the directory structure of the group control module (f9a9d67)
              • 🚀 Optimize the empty list style of the device list (95e8e4a)
              • 🚀 Optimize the interaction details of the overlay module (e297850)
              • 🚀 Optimize the interactive experience of group control function (05c8643)
              • 🚀 Optimize the interactive experience of the embedded mirror control bar (ac6159f)
              • 🚀 Optimize the keyboard input experience of the group control module (32b7fa2)
              • 🚀 Optimize the overlay module to organize interaction details (f358348)
              • 🚀 Optimize the video stream freezing problem when wscrcpy starts the same device (7baa53c)
              • 🚀 Optimize universal scroll bar interaction (dd6f3fe)
              • 🚀 Optimize window arrangement function details (91e1a3a)
              • 🚀 Overlay module input function reconstruction (ac19fab)
              • 🚀 The overlay module supports forwarding more key types (05c6faf)

              Code Refactoring

              • ♻️ Reconstruct the embedded mirror module directory structure (119a471)
              • 📝 Remove redundant wscrcpy judgments (3d9add8)
              • 🚀 Adjust the group control module naming (3c14c99)
              • 🚀 Expand the embedded image switching function (a49f8b5)
              • 🚀 Optimize and extend wscrcpy type (eec0913)
              • 🚀 Optimize interactive performance of embedded mirroring (ba8bfea)
              • 🚀 Optimize overlay module configuration (08009bf)
              • 🚀 Optimize the details of the overlay layer (59dc702)
              • 🚀 Optimize the directory structure of the group control module (7116264)
              • 🚀 Optimize wscrcpy details (247dc5e)
              • 🚀 Reconstruct the directory structure of the overlay module (668ef67)
              • 🚀 Reconstruct the image window ratio to improve reusability (555e346)
              • 🚀 Reconstruct the mask layer keyboard module (cad077d)
              • 🚀 Reconstruct the overlay module architecture (196cca0)
              • 🚀 Reconstruct the overlay module parameter injection method to solve the problem of responsive loss (3163c60)
              • 🚀 Reconstructed mirror window ratio algorithm is compatible with all platforms (b8377f2)
              • 🚀 Refactor and extend wscrcpy library functionality (4ca2c49)
              • 🚀 Refactor wscrcpy (b537a96)
              • 🚀 Remove redundant code from built-in images (f6bcbf5)
              • 🚀 Remove redundant code from the mask layer module (bdb4f49)

              2.6.2 (2026-03-13)

              Bug Fixes

              • 🐛 Fix the problem of inaccurate vertical coordinate of window arrangement under Windows (1fa6bd5)
              • 🐛 Fixed the issue of abnormal scaling of the window arrangement function under Windows (87f3596)
              • 🐛 Fixed the issue of redundant scroll bars appearing in the window arrangement tool screen area (ea0b451)

              Code Refactoring

              • 🚀 Refactored version build (bd3ec90)

              2.6.1 (2026-03-13)

              Performance Improvements

              • 🌱 Improve the interactive experience of subscription plans (f3620fd)

              2.6.0 (2026-03-12)

              Features

              • 🎉 Optimize device window arrangement: By obtaining the actual screen size of the device, canceling fixed ratio scaling, avoiding black border issues, and improving adaptation accuracy and display experience. (35d2028)
              • 🚀 Add a subscription plan for batch automation scripts (efa6e28)
              • 🚀 Add WeChat script template (569099c)
              • 🚀 Improve the international translation of automated script modules (1cb2cb6)
              • 🚀 Optimize automated script interaction (1e61d0f)
              • 🚀 Optimize magic variable interaction support for import and export (b7ba176)
              • 🚀 Preliminary addition of automation script editor support (bc6fdcc)
              • 🚀 Preliminary support for automated script batch execution and scheduled tasks (e14c302)
              • 🚀 Product and optimization of automation script editor (b36f6c6)

              Bug Fixes

              • 🐛 Fix custom startup layout and interaction issues (6311364)
              • 🐛 Fixed an issue where the automation script log directory was ignored (8777e63)
              • 🐛 Fixed script template translation issue (01870f7)
              • 🐛 Fixed split automation script editor form variable usage compatibility issue (53da1e9)
              • 🐛 Fixed the issue of abnormal task type penetration display in the scheduled task list (58ced2b)
              • 🐛 Fixed the issue of batch execution image blocking (9e3e17b)
              • 🐛 Fixed the issue where the aspect ratio was not fixed when the window arrangement was adjusted again after being saved. (8977138)
              • 🐛 Fixed the problem of unable to echo after window arrangement (6907762)
              • 🚀 Fixed batch execution automation script variable injection concurrency issue (3b8dae0)
              • 🚀 Fixed the problem that the automation script during switching execution could not confirm the interruption (2162203)
              • 🚀 Optimize subscription configuration (9711e73)
              • Fix automated script editor testing issue (87c6f93)

              Performance Improvements

              • 💄 Optimize smart picking interaction (a66fb7a)
              • 🚀 Automate script selectors to support termination logic and interaction optimization (d0a4bb3)
              • 🚀 Automation script editor adds execution selection function (d8f1300)
              • 🚀 Detail optimization of the automated script editor (338ad3e)
              • 🚀 Improve automation script stability (455c11f)
              • 🚀 Integrate the adb keyboard installation universal hook (aca0427)
              • 🚀 Optimize automation script editor details (fb2e4ad)
              • 🚀 Optimize automation script editor interaction details (e371171)
              • 🚀 Optimize automation script editor interaction details (24f0792)
              • 🚀 Optimize automation script function details (f084d08)
              • 🚀 Optimize execution of automation script interaction details (568fedf)
              • 🚀 Optimize international translation (3dd15a9)
              • 🚀 Optimize product details (a3abd2c)
              • 🚀 Optimize the installation of adb keyboard boot (fd4e752)
              • 🚀 Optimize the layout of the execution page for planned tasks (10da149)
              • 🚀 Remove obsolete shell script functionality (dfc505b)
              • 🚀 Template import supports importing magic variables (767c1dd)
              • 🚀 When obtaining the device list, synchronously obtain the screen resolution to optimize the screen arrangement experience (3715e0f)
              • Enhance the stability of the automated script editor (8030668)
              • Optimize script editor interaction (7367d15)

              Miscellaneous Chores

              Code Refactoring

              • ♻️ Restore version of the system (4a7c653)
              • ➖ Remove redundant printing information (6bd144d)
              • 🔨 Split Automation Script Editor form (98ac71b)
              • 🚀 Extract the common logic of launching the app function into an independent selector and reuse it (583b93f)
              • 🚀 Optimize automation script editor details (06f1ede)
              • 🚀 Optimize international translation (2d07a60)
              • 🚀 Optimize the interaction of script selectors for batch execution (c3e86fd)
              • 🚀 Optimize the size of deleted pop-up windows (a43fc53)
              • 🚀 Project code details optimization (eda1d5a)
              • 🚀 Support adjusting subscription price through environment variables (1867f03)
              • Integrated script editor supports more configuration functions (b0a30f8)
              • Optimize the overall directory and naming conventions (aed80ef)

              2.5.1 (2026-02-27)

              Bug Fixes

              • Fixed the issue of missing title bar information when launching through the app (e6bcd1e)

              2.5.0 (2026-02-27)

              Features

              • Add concurrency limit for batch wireless device connections (f048956)

              Bug Fixes

              • Fix shell space command parsing problem (e1ab66c)
              • Initialize shell command variables to prevent undefined values (e776c11)

              2.4.2 (2026-02-26)

              Bug Fixes

              • Fix the problem of abnormal disconnection of adb after changing some configurations (ffbfc40)

              2.4.1 (2026-02-26)

              Bug Fixes

              • Fix the language detection issue of portable software (9985067)

              Code Refactoring

              • Reorganize initialization order to load store before process configuration (9283a45)

              2.4.0 (2026-02-26)

              Features

              • ✨ Adds fastboot command support and provides experimental integration of scrcpy dependencies for Linux ARM64 platforms. (70f3243)
              • 🎉 Comprehensive migration to the built-in terminal based on xterm to provide a more controllable user experience (a2ee25f)
              • add drag and drop file upload support (d5b969c)
              • add gnirehtet path for mac (8da67c8)
              • add scroll to bottom button in chat (e4e8f80)
              • add terminal shell support with xterm integration (3c7828c)
              • add wireless connection mode switch toggle (161acf4)
              • add wireless pair success message and UI improvements (eccb26e)
              • improve ADB keyboard installation error handling (71f7635)
              • trigger language change callback immediately on init (e0e3d22)
              • update api endpoint and enable adb keyboard (4010b17)
              • Window orchestration component enhancement: Supports manual setting of position and size (e3aa89a)

              Bug Fixes

              • 🐛 Migrate fkill to tree-kill to solve windows binary file execution problems (6c89b73)
              • change clipboard tag type to primary (edb8840)
              • enhance xterm terminal styling and resize handling (9e031f5)
              • filter ANSI color codes for Windows PowerShell terminal (9c58f25)
              • Fix i18n race translation (7b37f29)
              • handle terminal exit and error states with reload (e8d93d5)
              • handle Windows terminal line ending for all cases (e06e763)
              • handle Windows terminal line ending for device type (1be1a5e)
              • improve Windows terminal compatibility and session management (7f37f7d)
              • improve Windows terminal cursor sync and resize responsiveness (c16a5f9)
              • improve Windows terminal encoding and scrollbar styling (85d5a96)
              • improve Windows terminal rendering and resize stability (7f05996)
              • improve Windows terminal shell detection and remove debug logs (4a5ebbc)
              • include node-pty in electron build (c98d82d)
              • prioritize pwsh.exe for Windows terminal (a99d830)
              • simplify Windows PowerShell terminal initialization (95c432c)
              • simplify Windows terminal shell initialization (2a3ed6f)
              • Solve the problem that the language of the terminal title cannot be dynamically updated (6e2c030)
              • specify SIGTERM signal for treeKill (d28eb1a)
              • update terminal tip color to custom RGB (156d39b)

              Performance Improvements

              • 🚀 Optimize ADB keyboard installation and detection (f312cc2)

              Code Refactoring

              • add cleanup handler for window IPC (bad6752)
              • add comment for tray destroy event (12038df)
              • add electron-modularity dependency (d0abc0b)
              • add main window API and type system (778a65f)
              • add plugin warnings and fix module loading order (a5bdbf3)
              • add rendererDir support and update window loading (fac664d)
              • adjust screenshot message and dialog styles (7bbab51)
              • adjust terminal line height to 1.4 (5068f7d)
              • adjust terminal window and device sync settings (6a4bd61)
              • adjust window width and improve error handling (5576d2e)
              • centralize PATH setup and environment configuration (6a6eb80)
              • clean up .gitignore file (3644b3e)
              • clean up main window module (9d1eee9)
              • defer app initialization until ready (9905f41)
              • defer plugin registration until app start (46ac0db)
              • Electron main process architecture reconstruction (f810ecb)
              • emit tray:destroy on window restore (fab9343)
              • expose $platform to window and global properties (9a7ee70)
              • extract terminal logic into useTerminal hook (9d725ca)
              • fix device payload and adjust control bar height (e5981ac)
              • fix failed translation key (fe98a56)
              • fix payload type and resolve target logic (5af60c8)
              • fix preview button visibility class (5a8c97b)
              • implement retained terminal session with cleanup (532a055)
              • implement terminal session management with providers (fa156e1)
              • improve file download progress tracking (51101c7)
              • improve gnirehtet menu handling and options (8d0e85b)
              • improve process killing and error handling (85a080e)
              • improve window bounds persistence logic (5361e24)
              • improve wireless pair input handling and UI (3aea5f6)
              • migrate core helpers to electron-modularity package (630deaa)
              • migrate edger to service (9c64cd5)
              • migrate events to service handlers (c99b1de)
              • migrate plugins to priority-based system (ae4404a)
              • migrate services and modules to explicit app.use (e63de2e)
              • migrate services to plugins (36e2a0d)
              • migrate to ipcx for IPC handling (1b1fd8d)
              • migrate to official plugins and update imports (eb9bead)
              • migrate to window.$preload namespace (41a2342)
              • move i18next-fs-backend to dependencies (f507222)
              • move window-manager to window module (8af97a5)
              • optimize device query and control window (4e2736d)
              • optimize minimized tray and window handling (3765b73)
              • Reconstruct the multi-entry directory structure (0690f4b)
              • Refactor i18n related services (6e882b6)
              • remove app parameter from window manager (f8719f1)
              • remove appium-adb documentation and update github link (f532aab)
              • remove border from preference header (9c97366)
              • remove debug console log for args (e4332c1)
              • remove debug console log for platform paths (e5590f3)
              • remove electron middleware module (3bd462c)
              • remove encoding conversion and use utf8 only (c32cb79)
              • remove fixed width from window configuration (ef3e86b)
              • remove spawnShell and convert arrow functions (66978f1)
              • remove theme plugin README (85a853b)
              • remove trailing whitespace in adb helpers (ec7314c)
              • remove ui-ux-pro-max prompt files (11d41a9)
              • remove unused app-region-drag style (094e0df)
              • remove unused terminalConfig from useTerminal (9db3f24)
              • remove Windows-specific encoding default (534934b)
              • rename app to ctx and update electron app imports (4c7ceba)
              • rename app to ctx in electron app (6707e2d)
              • rename currentStatusType to sessionStatus (8c84464)
              • rename electron-modularity to electron-setup (081a8a5)
              • rename entries to pages for routing structure (863ecd4)
              • rename windowOptions to browserWindow and add mainWindow flag (5093577)
              • reorder plugin registration in electron main (b8ee4ef)
              • reorganize process helpers directory structure (dcdb6d7)
              • replace args-tokenizer with shell-quote (1196263)
              • replace getSize with computed size property (c7edceb)
              • replace IS_PACKAGED with import.meta.env.MODE (521e2ba)
              • replace spawnShell with unified sheller helper (0159bb4)
              • replace tree-kill with fkill for process termination (c50cea6)
              • replace window controls with app header (a5fa218)
              • restructure copilot and explorer modules (74efca1)
              • restructure core helpers and window management (16fc934)
              • restructure electron helpers and modules (f0e4851)
              • restructure main window and singleton modules (7b979d6)
              • restructure terminal session management (19428dd)
              • restructure window management and IPC handlers (59a315f)
              • simplify file list extraction in drag upload (7453a99)
              • simplify gnirehtet trigger handling (f9185c3)
              • simplify main window resolution and remove legacy code (c764f91)
              • simplify restoreAndFocusWindow options (27185f5)
              • simplify window types and return native BrowserWindow (184ab7b)
              • simplify wireless connection UI and remove pair dialog (30e026c)
              • standardize module export structure (8111f6f)
              • throttle download and upload progress callbacks (8a16d22)
              • translate terminal comments to English and add command execution (71a2d7a)
              • unify control bar height configuration (7e6abed)
              • unify shell error handling and lazy loading (98dd91b)
              • update primaryColor value (346df64)
              • update scrollbar styling with Tailwind CSS (6eaf259)
              • update terminal scrollbar styling with custom width and transparency (b2c8f87)
              • update terminal title and locale strings (f0bdf0b)

              2.3.1 (2026-01-27)

              Bug Fixes

              • 🐛 Fixed the problem of being unable to click to enter the co-pilot entrance under Windows and Linux. (c563d11)

              2.3.0 (2026-01-22)

              Features

              • 🚀 Optimize portable package configuration and add linux flatpak package support (a7982db)
              • configure electron-log file path in debugger helper (2242668)

              Bug Fixes

              • 🐛 handle copilot execution failures and adjust config max steps (3601709)
              • win: fully redirect user data to portable folder and fix CI workflow (fe2fd89)

              Performance Improvements

              • ✨ Optimize windows and linux window layout (b63b59c)

              Code Refactoring

              • add platform simulation support and adjust window controls layout (9c3a5b1)
              • adjust header and chat layout padding (70fe60d)
              • adjust layout padding for windows and linux platforms (4e153cc)
              • adjust widget dimensions and clear dialog messages (ca6796f)
              • implement immersive title bar and optimize window layout (1e76d11)
              • improve chat retry logic and ADB keyboard detection (8e0e43c)
              • remove dialog width constraints and improve file creation (54e5553)
              • remove quiet config option (76f9d6c)
              • remove redundant success messages and unify dialog titles (b1eac32)
              • reorganize emitter module and update event emitter references (4c3cc2d)
              • reorganize preference form layout with tabs and scroll (7f0f864)
              • replace ExTooltipButton with native el-button title attribute (8056977)

              2.2.0 (2026-01-17)

              Features

              • 🎉 Improve the accuracy and coverage of Copilot opening applications by obtaining information about installed applications on the device (e2f27da)
              • add keyboard shortcuts for connect and disconnect (39293af)
              • auto-focus input when editing prompt (d58b993)

              Bug Fixes

              • 🐛 Fixed the issue where autoglm.js conversation request listener was not cleaned up causing memory overflow (bac2126)

              Code Refactoring

              • improve config management and prompt editing (de2f708)
              • improve prompt manager UI and editing experience (1697558)
              • optimize subscribe store initialization and token management (0f00903)

              2.1.7 (2026-01-14)

              Miscellaneous Chores

              2.1.6 (2026-01-14)

              Miscellaneous Chores

              2.1.5 (2026-01-14)

              Miscellaneous Chores

              • remove comments in copilot window handler (f231998)
              • update version to 2.1.4 (9bdf671)

              2.1.4 (2026-01-14)

              Miscellaneous Chores

              • add release name format to config (6db1b51)
              • update release workflow and build commands (8f5345b)

              2.1.3 (2026-01-14)

              Miscellaneous Chores

              • add linked-versions plugin to release config (415e4ae)

              2.1.2 (2026-01-14)

              Bug Fixes

              • 🐛 Fix automatic build issues (aba8f27)

              Miscellaneous Chores

              • add GH_TOKEN env to release workflow (078bf18)
              • release 2.1.1 (d1c04ce)
              • release 2.1.2 (91d9bbd)
              • release 2.1.2 (c7c8616)
              • remove release creation step from workflow (b73c179)
              • remove unnecessary comments in App.vue (22e331d)
              • remove unnecessary comments in App.vue (5ae8fbe)
              • update electron-builder config path and publish options (d3b4914)
              • update pull request title pattern (060ad4a)
              • update release configuration and patterns (0054fd4)

              2.1.0 (2026-01-14)

              Features

              • ✨ Add auto launch functionality and preference option (69c75cc)
              • ✨ Add hidden launch option for auto-start (dd1c2e1)
              • ✨ Add subscribe configuration hook and update UI (80b3534)
              • ✨ Add system tray support and Linux auto-launch (df414b9)
              • 🔖 Copilot adds thinking_stream event support (22623c4)
              • 🚑️ The portable version now supports automatically generating configuration files in the running directory (ba551b7)
              • add custom empty state icon for device list (65b028f)
              • add zip target for macOS builds (f52d3a5)

              Bug Fixes

              • 🐛 Fix delete message and config initialization (82a77ea)
              • 🐛 Fixed the issue of failed export and export configuration files (fd32c36)
              • 🐛 Update dependencies and add sharp override in workspace configuration (dbf366a)
              • 💰 Update payment amount handling in subscription (422950c)
              • add background color and improve window initialization (498fc90)
              • adjust empty state icon styling in device list (363bf3d)
              • ensure concurrency limit is numeric (d2c977c)
              • types: allow typed payload handlers by using any[] for handle listener rest params (b4e8058)

              Performance Improvements

              • 🚀 Use an external library instead of the built-in autoglm.js (d1f8176)

              Code Refactoring

              • ⚡️ Refactor code structure for improved readability and maintainability (f211924)
              • 🌐 Update language labels to native text (cb7ac96)
              • 🌐 Update subscription translations for multiple locales (b4e5780)
              • 🎨 Redesign task dialog with card layout (cd06d3b)
              • 🎨 Simplify config UI layout and update maxSteps (af18241)
              • 🔄 Auto configure Copilot after payment (c00ac1e)
              • 🔄 Move ESLint config to root and clean up dependencies (f2bd345)
              • 🔄 Optimize session callbacks and event handling (ae19570)
              • 🔄 Rename ipc to services for better structure (8212872)
              • 🔄 Rename start module to launch for clarity (5d44ebf)
              • 🔧 Optimize copilot config change detection (2776e8a)
              • 🔧 Replace quick prompts with PromptBar component (9b0c4df)
              • improve theme switching and background handling (b3203af)
              • migrate copilot config to store (e323611)
              • replace rotation icon with outline version (95ad30d)
              • replace send icon with rocket icon (ef9e7d3)
              • replace svg icons with font icons (9eca902)
              • replace trash icon with Delete icon (c59994e)

              2.0.1 (2026-01-06)

              Bug Fixes

              • 🐛 Fix the problem of abnormal subscription recharge fee (b32043c)

              2.0.0 (2026-01-05)

              Features

              • ✨ Add system terminal support (e5c157e)
              • ✨ Device lists will now intelligently merge duplicate device entries and share device configurations (52cc4b1)
              • ✨ Integrate scrcpy binaries for macos (85bf096)
              • ✨ Introducing a new file icon display component and enhancing the File Explorer dialog. (11be6f1)
              • ✨ Now supports copying device screenshots and recording files to the clipboard (bdb3644)
              • ✨ Now you can arrange your device windows through a graphical interface (91ad249)
              • ✨ Support edge hiding function (14a81de)
              • ✨ Support floating control bar (8807e50)
              • ✨ Support pairing and connecting to devices via QR code (14306b2)
              • ✨ Support to close the device screen when controlling (a84c775)
              • ✨ Supports starting applications for mirroring (d19e781)
              • ✨ Use the new interface design (b08021b)
              • 💥[Release-As: 2.0.0] major copilot overhaul with AutoGLM and multi-device automation (7ad5ecd)
              • 📸 Enhanced recording (7f10161)
              • 🔍️ Optimize the search function of the app (94ccb7b)
              • 🚀 Split the file manager into independent windows and support multiple instances in parallel (f41d853)
              • 🚀 Support adding the open application action to the desktop shortcut. (Not supported on macOS) (add251f)
              • 🚀 Supports connecting historical devices via device list (e0687e8)
              • 🚀 Supports dragging the device control bar to sort (64a98b2)
              • 🚀 Update to scrcpy v3.3.2 (462536c)
              • 🚚 Support batch startup mirroring (fcfd78e)
              • 🚚 The file manager has been refactored and improved, and more useful features have been added. (5cd5992)

              Bug Fixes

              • ♻️ Fixed repeated dependency issues (9777622)
              • 🐛 Fix automatic release (c2254aa)
              • 🐛 Fix device support audio and video encoding cannot be parsed (9b7f6a9)
              • 🐛 Fix for built-in scrcpy not supporting x64 macos (0d60655)
              • 🐛 Fix issue with incorrect address bar path when returning to the previous level in file management (0222675)
              • 🐛 Fix linux build errors (9b43dc0)
              • 🐛 Fix the display ID value type error (2b7ee79)
              • 🐛 Fix the mirror group bug (cd7d9cd)
              • 🐛 Fix the problem of build failure caused by missing dependencies (e34e1c2)
              • 🐛 Fix the problem of Windows calling system terminal failure (194689e)
              • 🐛 Fix the problem of Windows terminal injection command failure (fbf88d0)
              • 🐛 Fix typos (a7a3a17)
              • 🐛 Fixed an issue where macos built-in updates failed (432eceb)
              • 🐛 Fixed an issue where some options in preferences could not be turned off (269bd29)
              • 🐛 Fixed possible sandbox issues on Linux (ff9f9bd)
              • 🐛 Fixed the conflict between device control bar sorting and click events (18a57b9)
              • 🐛 Fixed the issue of abnormal path display in the file manager address bar (2f63f6f)
              • 🐛 Fixed the issue of duplicate filter conditions in the device list (6c4242c)
              • 🐛 Fixed the issue of layout flickering when refreshing the device list page (608b8f3)
              • 🐛 Fixed the issue of saving exceptions after adjusting parameters in preference settings (4a18f61)
              • 🐛 Fixed the issue where activating the program on macOS in certain situations would cause the tray to be created repeatedly (cf8e183)
              • 🐛 Fixed the issue where all configurations would be cleared when resetting the category configuration in preferences (6ee9a92)
              • 🐛 Fixed the issue where Chinese text cannot be saved in file management read and write text (34785dd)
              • 🐛 Fixed the issue where PowerShell failed to call the system terminal (7beb027)
              • 🐛 Fixed the issue where recorded files could not be copied to the clipboard under Windows (119b518)
              • 🐛 Fixed the issue where there is a chance of an error when closing the floating control bar on macOS (5c2c711)
              • 🐛 Fixed the problem of minimizing the visibility of tray icons (b0f42aa)
              • 🐛 Issue not taking effect after restarting the application after switching themes (857c480)
              • 🐛 Make StartApp compatible with scrcpy v3.0 (1082e0d)
              • 🐛 Rename --display-buffer to --video-buffer (b2bb0ae)
              • 🐛 Repair ADB timeout problems (b5bffc5)
              • 🐛 Repair floating action bar start application error (487e7e2)
              • 🐛 Repair part of internationalization Lost dynamics (d18444f)
              • 🐛 Resolve default recording error (358064e)
              • 🐛 Resolved the issue where the device list could not be displayed due to compatibility issues with certain devices (2c53b77)
              • 🐛 Resolving build errors (d21fa29)
              • 🐛 Restore the --display-buffer parameter to solve the mirroring problem (0f3d869)
              • 🐛 Solve the conflict between floating navigation bar and quick APP launch (460aca1)
              • 🐛 Solve the problem of abnormal display timing when recording related functions are successful (67d279e)
              • 🐛 Solve the problem of IPV6 address connection failure (1a95325)
              • 🐛 Solve the problem of startup error of development mode under Linux (5c4f65e)
              • 🐛 Solve the problem of Windows disabling video forwarding and crashing (10b902a)
              • 🐛 Solved the problem that the main window could not be restored after being moved off the screen in some cases (d054f8d)
              • 🐛 Start app to adapt to dark mode (ae13fde)
              • 🐛 Temporarily disable scrcpy integration in macOS (9bf4d5c)
              • 🐛 Update scrcpy-server file to solve the problem of not being able to obtain device APP list (63f7135)
              • 📝 Fixed the issue that special characters in Windows prevented the creation of app shortcut launch (301dac5)
              • 🔧 Camera recording and screen off configuration conflict (4508758)
              • 🔧 Fixed button loading prompt conflict issue (c323ad6)
              • 🩹 Restore the windows build configuration (9491069)
              • 🚀 Fix the issue of abnormal program exit behavior under windows (705f8be)

              Performance Improvements

              • ♻️ Adjust the position of the start application button (9833932)
              • ♻️ Code structure optimization (595216b)
              • ♻️ Enhance recording stability (3dd7525)
              • ♻️ Improve ADB connection stability (7655ba6)
              • ♻️ Improve the stability of window arrangement function (7ae3f21)
              • ♻️ Improve wireless connection stability (85be898)
              • ♻️ Improved device connection stability (1d603ab)
              • ♻️ No longer building universal packages for macOS (db5deb4)
              • ♻️ Optimize camera recording (4be2cf4)
              • ♻️ Optimize camera recording stability (952b2a7)
              • ♻️ Optimize device details performance (38d1433)
              • ♻️ Optimize device list interaction logic (3812061)
              • ♻️ Optimize file manager interaction (b168cc3)
              • ♻️ Optimize QR code connection experience (86f5e69)
              • ♻️ Optimize the Russian presentation effect (0d8a8ee)
              • ♻️ Optimized contextBridge related improvements for stability (0e098c3)
              • ♻️ Optimized the adb daemon startup failure detection mechanism (ca6be85)
              • ♻️ Reduce build package size by removing redundant dependencies (7b61b25)
              • ♻️ Refactor configuration related code to improve stability (37bf438)
              • ♻️ Script and directory structure optimization (68378ef)
              • ♻️ Simplify sandbox automatic configuration manager code to improve performance (1b82336)
              • ♻️ Support interruption during waiting for wireless connection (344b385)
              • ♻️ Supports retrieving a list of applications (b1a6ba7)
              • ♻️ Update mirror icon (c214e5a)
              • ♻️ When the application fails to start, display the error message (dbc34d6)
              • ♿️ Supports adjusting the closing method of the application in preferences (e643f8e)
              • ⚗️ Experimental support for turning off screen controls (9555f58)
              • ⚡️ Improve the start APP experience (29e5e1b)
              • ⚡️ Optimize scrcpy parameter conversion performance (18dcd24)
              • ⚡️ Optimize startup application performance (8e94494)
              • ⚡️ Optimize the method of obtaining the available displays of the device (9e31c84)
              • ⚡️ Optimize the stability of options that need to dynamically obtain parameters in preference settings (39bbc98)
              • ✅ A new method is adopted to solve the problem of IP type configuration storage (5488a1e)
              • ✅ File management supports selecting directories for uploading (fd2e639)
              • ✅ Provides the function of detecting and migrating configurations when deleting a device (39e0533)
              • ✅ Support switching devices on the floating control bar (50440f5)
              • ✨ Adjust the position of the wireless connection screen (3e3fc34)
              • ✨ Enable new icon (695e35d)
              • ✨ The floating control bar supports transparent display when inactive (34f27c5)
              • ✨ Update to scrcpy@2.7 to support the gamepad (0053e87)
              • ➖ Remove redundant console (9a67142)
              • ⬆️ Improve QR code connection performance (b413889)
              • ⬆️ Improved performance of automated mirroring (33a03c3)
              • ⬆️ Optimize edge hiding performance (74a91a4)
              • ⬆️ Optimize the performance of the floating control bar (a1c60ec)
              • 🌱 Optimize app icon background color and corner radius. (bc4f492)
              • 🌱 Optimize application icon details (55800be)
              • 🌱 UI details and documentation optimization (5b5bbf7)
              • 🍻 Improve file manager reliability (9063243)
              • 🐛 Improve wireless connection verification method (69fecc3)
              • 👥 Control bar sorting supports state synchronization (88abe95)
              • 👷 Added edge hiding function switch (d25714a)
              • 👷 Explicitly clean up unnecessary child processes on exit (0549dda)
              • 👷 Optimize the edge hiding function (d5caaa9)
              • 👷 Remove redundant code comments (ca4e826)
              • 👽️ Experimental support for adding open application actions to linux desktop shortcuts (6897c0e)
              • 👽️ Experimentally add linux arm64 support (5b033fd)
              • 💄 Improve space utilization of device window layout tools (939a2d2)
              • 💄 Improved Russian display (ca79e1b)
              • 💄 Normalize control window titles and generated file names (ccc7f0e)
              • 💄 Optimization of display effect of device list page (305187d)
              • 💄 Optimize device refresh mode (ea75615)
              • 💄 Optimize dialog display (1813718)
              • 💄 Optimize pairing interface display (df4103b)
              • 💄 Optimize preference setting button layout (47ae53d)
              • 💄 Optimize Russian display effect (5ca39ae)
              • 💄 Optimize the display effect of horizontal screen screenshots (90c7163)
              • 💄 Optimize the interface display effect (c7a5cd4)
              • 💄 Window layout adapted to dark mode theme (eab402b)
              • 💫 Adjust gnirehtet configuration behavior to make it consistent with user operation habits (7507915)
              • 💫 Support appending gnirehtet custom parameters in configuration (206a030)
              • 📌 Standardize the device list lifecycle processing flow. IPv6 addresses must be enclosed in [] and the port number cannot be omitted for wireless connections. (93c059d)
              • 📌 Support saving the main panel window size status (cef022f)
              • 📝 Add docs entry to the program (db5d157)
              • 📝 Add Japanese language support (969378f)
              • 📝 Added Arabic language support (f6c9fa4)
              • 📝 Optimize the scheduled task list (c666709)
              • 📝 Optimize the title of the control interface to solve the problem of duplicate device names (06a151d)
              • 📝 Optimized startup app package name display (22eb718)
              • 📝 Simplified partial translation (7411487)
              • 📦️ Update the upload function to support file and directory selection, and optimize the interface layout (7f5bd35)
              • 📸 Recording camera support (10d0370)
              • 📸 Support viewing real-time images and power information of the device (d262adf)
              • 🔀 Optimize the storage policy configured in preferences (b9faabf)
              • 🔊 Expanded audio source options (fc91f07)
              • 🔍️ Optimize QR code style to avoid scanning problems on some devices (dd3ad6c)
              • 🔖 Adjust the order of quick entry functions (ccb59e1)
              • 🔖 Optimize interaction of preferred terminal options (900dc69)
              • 🔧 Optimized startup APP function interaction (468af22)
              • 🔧 Temporarily disable scheduled tasks that are too far away (be5e639)
              • 🔨 Fixed the problem that some models could not reversely supply the network due to the blocking of installation detection when using Gnirehtet (c5369af)
              • 🔨 Improve the reliability of the linux sandbox configuration tool (6de2538)
              • 🧑‍💻 Improve application performance with VueRouter (6a8c190)
              • 🧑‍💻 Improve device-based terminal experience (88a0356)
              • 🧑‍💻 Optimize application icon size under macOS (066d81f)
              • 🧑‍💻 Optimize the interactive experience of the device control bar (8388646)
              • 🩹 Add an option to enable keyboard fix on app startup to be compatible with older versions of scrcpy (be89b36)
              • 🩹 Closing a screen via the control bar no longer requires creating a help window (84c7be7)
              • 🚀 Adjust options to support scrcpy v3.0 (0602676)
              • 🚀 After getting the device list, query and save the SerialNo of each device in preparation for subsequent integration (4464e7e)
              • 🚀 Clean output when closing built-in terminal (c976d4c)
              • 🚀 Extended floating control bar function (790e703)
              • 🚀 File management supports returning to the root directory (2e27443)
              • 🚀 Improve app icon quality (8a6f4c7)
              • 🚀 Improve performance by asynchronously storing main interface boundary information (d230c15)
              • 🚀 Modify the adb connection method to be compatible with scan connection (e6e8a09)
              • 🚀 Optimization of window arrangement function (33786ab)
              • 🚀 Optimize device connection experience (0690f2d)
              • 🚀 Optimize device list connection behavior and configuration migration strategy (8237058)
              • 🚀 Optimize program performance (9af3988)
              • 🚀 Optimize system terminal stability (2ffc588)
              • 🚀 Optimize the built-in terminal interaction experience (bb56d5b)
              • 🚀 Optimize the default behavior when adding new widgets to the device window arrangement (1be470a)
              • 🚀 Optimize the details of the new version of the icon (db9b19a)
              • 🚀 Optimize the display effect of application icons under windows (e0c221f)
              • 🚀 Optimize the display effect of new icons in smaller sizes (7d91d71)
              • 🚀 Optimize the layout effect of the task list (044cfcd)
              • 🚀 Optimize the menu trigger method for the upload function (8d39f5b)
              • 🚀 Optimize the storage strategy for preference Settings (359b9b9)
              • 🚀 Provide feedback on the application shortcut addition (d7eca8d)
              • 🚀 Supports display of offline devices (dcf817f)
              • 🚀 Supports opening using the main monitor when starting the APP (aec9b78)
              • 🚀 The main panel supports single instance startup (c49d22c)
              • 🚀 Update to scrcpy v3.3.1 (a2bb039)
              • 🚀 Update to scrcpy v3.0 (bf06382)
              • 🚀 Update to scrcpy v3.0.2 (7510548)
              • 🚀 Update to scrcpy v3.1 (7c74c71)
              • 🚀 Update to scrcpy v3.2 (57c11af)
              • 🚀 Update to scrcpy v3.3 (bbf2335)
              • 🚀 Update to scrcpy v3.3.3 (8566644)
              • 🚚 Reduce some unnecessary verifications and increase the speed at which equipment starts reverse network supply (c17aaba)

              Miscellaneous Chores

              Code Refactoring

              • ♻️ Reconstruct the multi-device batch upload function (dbdaa35)
              • 🔨 Optimize code (f61d820)

              1.34.2 (2025-12-08)

              Performance Improvements

              • 📦️ Update the upload function to support file and directory selection, and optimize the interface layout (7f5bd35)
              • 🚀 Optimize the menu trigger method for the upload function (8d39f5b)

              1.34.1 (2025-12-07)

              Performance Improvements

              • 🍻 Improve file manager reliability (9063243)

              1.34.0 (2025-12-07)

              Features

              • ✨ Introducing a new file icon display component and enhancing the File Explorer dialog. (11be6f1)
              • 🚀 Split the file manager into independent windows and support multiple instances in parallel (f41d853)
              • 🚚 The file manager has been refactored and improved, and more useful features have been added. (5cd5992)

              Bug Fixes

              • 🐛 Fixed the conflict between device control bar sorting and click events (18a57b9)
              • 🐛 Fixed the issue of abnormal path display in the file manager address bar (2f63f6f)
              • 🐛 Fixed the issue where Chinese text cannot be saved in file management read and write text (34785dd)

              Performance Improvements

              • ♻️ Optimize file manager interaction (b168cc3)
              • ✨ Enable new icon (695e35d)
              • 🌱 Optimize app icon background color and corner radius. (bc4f492)
              • 🌱 Optimize application icon details (55800be)
              • 📝 Optimize the scheduled task list (c666709)
              • 🧑‍💻 Optimize application icon size under macOS (066d81f)
              • 🧑‍💻 Optimize the interactive experience of the device control bar (8388646)
              • 🚀 Improve app icon quality (8a6f4c7)
              • 🚀 Optimize program performance (9af3988)
              • 🚀 Optimize the details of the new version of the icon (db9b19a)
              • 🚀 Optimize the display effect of application icons under windows (e0c221f)
              • 🚀 Optimize the display effect of new icons in smaller sizes (7d91d71)

              1.33.0 (2025-11-20)

              Features

              • ✨ Add system terminal support (e5c157e)

              Bug Fixes

              • 🐛 Fix issue with incorrect address bar path when returning to the previous level in file management (0222675)
              • 🐛 Fix the problem of Windows calling system terminal failure (194689e)
              • 🐛 Fix the problem of Windows terminal injection command failure (fbf88d0)
              • 🐛 Fixed the issue where PowerShell failed to call the system terminal (7beb027)

              Performance Improvements

              • 🔖 Optimize interaction of preferred terminal options (900dc69)
              • 🚀 Clean output when closing built-in terminal (c976d4c)
              • 🚀 Optimize system terminal stability (2ffc588)
              • 🚀 Optimize the built-in terminal interaction experience (bb56d5b)

              1.32.2 (2025-09-29)

              Performance Improvements

              • 🚀 Update to scrcpy v3.3.3 (8566644)

              1.32.1 (2025-09-10)

              Performance Improvements

              • 🌱 UI details and documentation optimization (5b5bbf7)

              1.32.0 (2025-09-08)

              Features

              • ✨ Now supports copying device screenshots and recording files to the clipboard (bdb3644)
              • 🚀 Update to scrcpy v3.3.2 (462536c)

              Bug Fixes

              • 🐛 Fixed the issue where recorded files could not be copied to the clipboard under Windows (119b518)
              • 🔧 Fixed button loading prompt conflict issue (c323ad6)

              Performance Improvements

              • ✅ Provides the function of detecting and migrating configurations when deleting a device (39e0533)
              • 📌 Standardize the device list lifecycle processing flow. IPv6 addresses must be enclosed in [] and the port number cannot be omitted for wireless connections. (93c059d)
              • 🚀 Modify the adb connection method to be compatible with scan connection (e6e8a09)
              • 🚀 Optimize device list connection behavior and configuration migration strategy (8237058)

              1.31.3 (2025-09-01)

              Performance Improvements

              • 💄 Window layout adapted to dark mode theme (eab402b)

              1.31.2 (2025-09-01)

              Bug Fixes

              • 🐛 Resolved the issue where the device list could not be displayed due to compatibility issues with certain devices (2c53b77)

              Performance Improvements

              • 🚀 Optimization of window arrangement function (33786ab)

              1.31.1 (2025-08-29)

              Performance Improvements

              • 👷 Remove redundant code comments (ca4e826)

              1.31.0 (2025-08-29)

              Features

              • ✨ Device lists will now intelligently merge duplicate device entries and share device configurations (52cc4b1)
              • ✨ Now you can arrange your device windows through a graphical interface (91ad249)

              Bug Fixes

              • 🐛 Fix typos (a7a3a17)
              • 🐛 Fixed possible sandbox issues on Linux (ff9f9bd)
              • 🐛 Fixed the issue of saving exceptions after adjusting parameters in preference settings (4a18f61)
              • 🐛 Issue not taking effect after restarting the application after switching themes (857c480)

              Performance Improvements

              • ♻️ Improve the stability of window arrangement function (7ae3f21)
              • ♻️ Simplify sandbox automatic configuration manager code to improve performance (1b82336)
              • 💄 Improve space utilization of device window layout tools (939a2d2)
              • 🔖 Adjust the order of quick entry functions (ccb59e1)
              • 🔨 Improve the reliability of the linux sandbox configuration tool (6de2538)
              • 🚀 After getting the device list, query and save the SerialNo of each device in preparation for subsequent integration (4464e7e)
              • 🚀 Improve performance by asynchronously storing main interface boundary information (d230c15)
              • 🚀 Optimize the default behavior when adding new widgets to the device window arrangement (1be470a)
              • 🚀 Optimize the layout effect of the task list (044cfcd)
              • 🚀 Optimize the storage strategy for preference Settings (359b9b9)

              1.30.2 (2025-07-15)

              Performance Improvements

              • ♻️ Optimize device list interaction logic (3812061)
              • 📝 Add Japanese language support (969378f)

              1.30.1 (2025-07-14)

              Bug Fixes

              • 🐛 Fixed the issue where all configurations would be cleared when resetting the category configuration in preferences (6ee9a92)
              • 🐛 Solve the problem of abnormal display timing when recording related functions are successful (67d279e)
              • 📝 Fixed the issue that special characters in Windows prevented the creation of app shortcut launch (301dac5)

              Performance Improvements

              • 📝 Optimized startup app package name display (22eb718)
              • 🔧 Optimized startup APP function interaction (468af22)

              1.30.0 (2025-07-14)

              Features

              • 🔍️ Optimize the search function of the app (94ccb7b)
              • 🚀 Supports dragging the device control bar to sort (64a98b2)

              Bug Fixes

              • 🐛 Fixed the issue of layout flickering when refreshing the device list page (608b8f3)
              • 🐛 Fixed the issue where activating the program on macOS in certain situations would cause the tray to be created repeatedly (cf8e183)
              • 🐛 Fixed the issue where there is a chance of an error when closing the floating control bar on macOS (5c2c711)
              • 🚀 Fix the issue of abnormal program exit behavior under windows (705f8be)

              Performance Improvements

              • ♻️ Code structure optimization (595216b)
              • 👥 Control bar sorting supports state synchronization (88abe95)
              • 📝 Optimize the title of the control interface to solve the problem of duplicate device names (06a151d)
              • 🔀 Optimize the storage policy configured in preferences (b9faabf)
              • 🚀 Supports opening using the main monitor when starting the APP (aec9b78)

              1.29.9 (2025-06-27)

              Performance Improvements

              • 🚀 Update to scrcpy v3.3.1 (a2bb039)

              1.29.8 (2025-06-20)

              Bug Fixes

              • 🐛 Update scrcpy-server file to solve the problem of not being able to obtain device APP list (63f7135)

              1.29.7 (2025-06-16)

              Performance Improvements

              • 🚀 Update to scrcpy v3.3 (bbf2335)

              1.29.6 (2025-04-27)

              Performance Improvements

              • 📝 Added Arabic language support (f6c9fa4)
              • 🚀 File management supports returning to the root directory (2e27443)

              1.29.5 (2025-04-17)

              Bug Fixes

              • 🐛 Fix the problem of build failure caused by missing dependencies (e34e1c2)

              1.29.4 (2025-04-17)

              Bug Fixes

              • 🐛 Fixed an issue where some options in preferences could not be turned off (269bd29)

              Performance Improvements

              • 💫 Adjust gnirehtet configuration behavior to make it consistent with user operation habits (7507915)
              • 🔍️ Optimize QR code style to avoid scanning problems on some devices (dd3ad6c)
              • 🩹 Add an option to enable keyboard fix on app startup to be compatible with older versions of scrcpy (be89b36)

              1.29.3 (2025-04-02)

              Performance Improvements

              • 📝 Add docs entry to the program (db5d157)
              • 🚚 Reduce some unnecessary verifications and increase the speed at which equipment starts reverse network supply (c17aaba)

              1.29.2 (2025-03-31)

              Performance Improvements

              • 🔨 Fixed the problem that some models could not reversely supply the network due to the blocking of installation detection when using Gnirehtet (c5369af)

              1.29.1 (2025-03-31)

              Performance Improvements

              • 🔊 Expanded audio source options (fc91f07)
              • 🩹 Closing a screen via the control bar no longer requires creating a help window (84c7be7)
              • 🚀 Update to scrcpy v3.2 (57c11af)

              1.29.0 (2025-03-27)

              Features

              • 🚀 Support adding the open application action to the desktop shortcut. (Not supported on macOS) (add251f)
              • 🚚 Support batch startup mirroring (fcfd78e)

              Bug Fixes

              • 🐛 Solve the conflict between floating navigation bar and quick APP launch (460aca1)
              • 🐛 Solve the problem of startup error of development mode under Linux (5c4f65e)

              Performance Improvements

              • ✨ The floating control bar supports transparent display when inactive (34f27c5)
              • 👷 Explicitly clean up unnecessary child processes on exit (0549dda)
              • 👽️ Experimental support for adding open application actions to linux desktop shortcuts (6897c0e)
              • 👽️ Experimentally add linux arm64 support (5b033fd)
              • 💄 Optimization of display effect of device list page (305187d)
              • 💫 Support appending gnirehtet custom parameters in configuration (206a030)
              • 🚀 Provide feedback on the application shortcut addition (d7eca8d)

              1.28.7 (2025-02-17)

              Bug Fixes

              • 🐛 Fixed the issue of duplicate filter conditions in the device list (6c4242c)
              • 🐛 Solved the problem that the main window could not be restored after being moved off the screen in some cases (d054f8d)

              Performance Improvements

              • ⬆️ Improved performance of automated mirroring (33a03c3)
              • 💄 Optimize the display effect of horizontal screen screenshots (90c7163)
              • 🚀 The main panel supports single instance startup (c49d22c)

              1.28.6 (2025-02-05)

              Bug Fixes

              • 🐛 Resolving build errors (d21fa29)

              1.28.5 (2025-02-05)

              Performance Improvements

              • ✅ File management supports selecting directories for uploading (fd2e639)
              • ⬆️ Improve QR code connection performance (b413889)

              1.28.4 (2025-01-13)

              Bug Fixes

              • 🐛 Fix the display ID value type error (2b7ee79)
              • 🐛 Solve the problem of IPV6 address connection failure (1a95325)

              Performance Improvements

              • ♻️ Improve wireless connection stability (85be898)
              • ⚡️ Optimize the method of obtaining the available displays of the device (9e31c84)
              • 🐛 Improve wireless connection verification method (69fecc3)
              • 👷 Added edge hiding function switch (d25714a)

              1.28.3 (2024-12-28)

              Performance Improvements

              • ♻️ Optimize device details performance (38d1433)

              1.28.2 (2024-12-27)

              Performance Improvements

              • 👷 Optimize the edge hiding function (d5caaa9)
              • 📸 Support viewing real-time images and power information of the device (d262adf)

              1.28.1 (2024-12-20)

              Performance Improvements

              • ♻️ Optimize QR code connection experience (86f5e69)

              1.28.0 (2024-12-20)

              Features

              • ✨ Support pairing and connecting to devices via QR code (14306b2)
              • 🚀 Supports connecting historical devices via device list (e0687e8)

              Bug Fixes

              • 🐛 Solve the problem of Windows disabling video forwarding and crashing (10b902a)

              Performance Improvements

              • ♻️ Update mirror icon (c214e5a)
              • ✅ A new method is adopted to solve the problem of IP type configuration storage (5488a1e)
              • 🚀 Optimize device connection experience (0690f2d)
              • 🚀 Supports display of offline devices (dcf817f)

              1.27.7 (2024-12-10)

              Performance Improvements

              • 🚀 Update to scrcpy v3.1 (7c74c71)

              1.27.6 (2024-12-05)

              Bug Fixes

              • ♻️ Fixed repeated dependency issues (9777622)

              Performance Improvements

              • ♻️ Optimized contextBridge related improvements for stability (0e098c3)
              • ♻️ Reduce build package size by removing redundant dependencies (7b61b25)
              • 🚀 Update to scrcpy v3.0.2 (7510548)

              1.27.5 (2024-11-29)

              Performance Improvements

              • ➖ Remove redundant console (9a67142)

              1.27.4 (2024-11-29)

              Bug Fixes

              • 🐛 Fix automatic release (c2254aa)
              • 🐛 Fixed an issue where macos built-in updates failed (432eceb)

              1.27.3 (2024-11-28)

              Bug Fixes

              • 🐛 Fix for built-in scrcpy not supporting x64 macos (0d60655)

              Performance Improvements

              • ♻️ Improved device connection stability (1d603ab)
              • ♻️ Optimized the adb daemon startup failure detection mechanism (ca6be85)
              • 🧑‍💻 Improve device-based terminal experience (88a0356)

              1.27.2 (2024-11-26)

              Bug Fixes

              • 🐛 Start app to adapt to dark mode (ae13fde)

              1.27.1 (2024-11-25)

              Bug Fixes

              • 🐛 Make StartApp compatible with scrcpy v3.0 (1082e0d)

              Performance Improvements

              • 🚀 Adjust options to support scrcpy v3.0 (0602676)
              • 🚀 Update to scrcpy v3.0 (bf06382)

              1.27.0 (2024-11-21)

              Features

              • ✨ Support edge hiding function (14a81de)

              Performance Improvements

              • ⬆️ Optimize edge hiding performance (74a91a4)

              1.26.4 (2024-11-14)

              Bug Fixes

              • 🐛 Temporarily disable scrcpy integration in macOS (9bf4d5c)

              1.26.3 (2024-11-08)

              Bug Fixes

              • 🐛 Fix device support audio and video encoding cannot be parsed (9b7f6a9)
              • 🐛 Restore the --display-buffer parameter to solve the mirroring problem (0f3d869)

              Performance Improvements

              • ♻️ Support interruption during waiting for wireless connection (344b385)
              • ♻️ Supports retrieving a list of applications (b1a6ba7)
              • ⚡️ Optimize startup application performance (8e94494)

              1.26.2 (2024-11-06)

              Bug Fixes

              • 🐛 Fix linux build errors (9b43dc0)

              1.26.1 (2024-11-06)

              Performance Improvements

              • ♻️ No longer building universal packages for macOS (db5deb4)

              1.26.0 (2024-11-06)

              Features

              • ✨ Integrate scrcpy binaries for macos (85bf096)
              • ✨ Supports starting applications for mirroring (d19e781)

              Bug Fixes

              • 🐛 Rename --display-buffer to --video-buffer (b2bb0ae)
              • 🐛 Repair floating action bar start application error (487e7e2)
              • 🩹 Restore the windows build configuration (9491069)

              Performance Improvements

              • ♻️ Adjust the position of the start application button (9833932)
              • ♻️ When the application fails to start, display the error message (dbc34d6)
              • ⚡️ Improve the start APP experience (29e5e1b)

              1.25.5 (2024-11-05)

              Performance Improvements

              • ⚡️ Optimize the stability of options that need to dynamically obtain parameters in preference settings (39bbc98)

              1.25.4 (2024-10-31)

              Performance Improvements

              • ♻️ Enhance recording stability (3dd7525)
              • ♻️ Optimize camera recording stability (952b2a7)
              • 💄 Normalize control window titles and generated file names (ccc7f0e)

              1.25.3 (2024-10-29)

              Bug Fixes

              • 🔧 Camera recording and screen off configuration conflict (4508758)

              Performance Improvements

              • 🔧 Temporarily disable scheduled tasks that are too far away (be5e639)

              1.25.2 (2024-10-29)

              Bug Fixes

              • 🐛 Resolve default recording error (358064e)

              1.25.1 (2024-10-28)

              Miscellaneous Chores

              1.25.0 (2024-10-28)

              Features

              • ✨ Support to close the device screen when controlling (a84c775)
              • 📸 Enhanced recording (7f10161)

              Performance Improvements

              • ♻️ Optimize camera recording (4be2cf4)
              • ♻️ Script and directory structure optimization (68378ef)
              • ⚗️ Experimental support for turning off screen controls (9555f58)
              • ⚡️ Optimize scrcpy parameter conversion performance (18dcd24)
              • 💄 Improved Russian display (ca79e1b)
              • 📸 Recording camera support (10d0370)

              1.24.3 (2024-10-21)

              Performance Improvements

              • 💄 Optimize Russian display effect (5ca39ae)

              1.24.2 (2024-09-16)

              Bug Fixes

              • 🐛 Fix the mirror group bug (cd7d9cd)

              1.24.1 (2024-09-16)

              Performance Improvements

              • ✨ Update to scrcpy@2.7 to support the gamepad (0053e87)
              • ⬆️ Optimize the performance of the floating control bar (a1c60ec)
              • 🚀 Extended floating control bar function (790e703)

              1.24.0 (2024-09-12)

              Features

              • ✨ Support floating control bar (8807e50)

              Performance Improvements

              • ✅ Support switching devices on the floating control bar (50440f5)
              • 💄 Optimize preference setting button layout (47ae53d)

              1.23.6 (2024-09-09)

              Bug Fixes

              • 🐛 Fixed the problem of minimizing the visibility of tray icons (b0f42aa)
              • 🐛 Repair ADB timeout problems (b5bffc5)

              1.23.5 (2024-09-09)

              Performance Improvements

              • ♻️ Improve ADB connection stability (7655ba6)

              1.23.4 (2024-09-08)

              Bug Fixes

              • 🐛 Repair part of internationalization Lost dynamics (d18444f)

              1.23.3 (2024-09-08)

              Performance Improvements

              • ♻️ Optimize the performance of equipment interaction column and file manager (41ffcf5)

              1.23.2 (2024-09-07)

              Performance Improvements

              • 🚀 Support file manager upload to the current directory (737c2a3)

              1.23.1 (2024-09-07)

              Performance Improvements

              • ⬆️ Update dependencies (8b03862)

              1.23.0 (2024-09-07)

              Features

              • ✨ Support graphic file manager (8155723)
              • 🚀 Initially add a new file manager (94ee007)

              Performance Improvements

              1.22.4 (2024-08-03)

              Bug Fixes

              • 🐛 plan task Remove operation bug (5205935)

              Performance Improvements

              1.22.3 (2024-08-03)

              Performance Improvements

              • ♻️ Update scrcpy to 2.6.1 (1eef9d2)

              1.22.2 (2024-07-25)

              Performance Improvements

              • 💄 Optimize the display effect of the dark mode (38f854b)
              • 💄 Optimize the display effect of the quick operation bar (7b3c4db)
              • 💄 Optimize the display effect of the tabs bar (5b2d41c)

              1.22.1 (2024-07-25)

              Bug Fixes

              • 🐛 Fixed asset publishing issues (222f626)

              1.22.0 (2024-07-25)

              Features

              • 🚀 Add a scheduled task list (d72202b)
              • 🚀 Add basic timing task function (04a7608)
              • 🚀 Add timing task entrance (8393c85)
              • 🚀 添加定时任务入口 (6ce66d4)

              Bug Fixes

              • 🐛 The internationalization problem of repairing path selector (8e6af20)
              • 💄 Optimize wireless connection user interface (50ae742)

              Performance Improvements

              • 💄 Optimization of the operation bar at the top of the equipment list (81bd3d9)
              • 💄 Optimized operation button layout (16f9535)

              1.21.4 (2024-07-14)

              Performance Improvements

              • ♻️ Optimize custom startup performance (abd468b)
              • ♻️ Perfect allSettledWrapper method (5b7d0af)

              1.21.3 (2024-07-13)

              Bug Fixes

              • Fix the width problem of custom startup pop-up windows (9a7e56b)

              1.21.2 (2024-07-13)

              Bug Fixes

              • 🐛 Fix terminal style abnormalities in dark theme (3d4dc7c)

              Performance Improvements

              • ♻️ Improve code robustness (2f389af)
              • 🚀 Optimize batch operation interaction (343eab2)

              1.21.1 (2024-07-13)

              Bug Fixes

              • 🐛 Fix dependency build errors (5b02621)

              1.21.0 (2024-07-13)

              Features

              • 🎉 Support batch execution script function (8097022)
              • 🚀 Support execution script function (2013413)

              Bug Fixes

              • 🐛 Repair the problem of equipment width in the English state (25c42d9)
              • 📝 Update Translation (33b0181)

              Performance Improvements

              • ✅ Support batch screenshot and other performance optimization (db9e3e7)
              • ✨ Support for custom startup mirroring (677f30c)
              • 🐛 Fix the problem of frequently trigger preservation of preferences (8261916)

              1.20.1 (2024-07-04)

              Bug Fixes

              • 🐛 Fix batch text spelling errors (062c689)

              1.20.0 (2024-07-04)

              Features

              • ✨ Add batch installation application function (37ce245)

              Performance Improvements

              • 🚀 Add mouse binding options (7ee4ba4)

              1.19.4 (2024-07-02)

              Bug Fixes

              • 🐛 Fix terminal style problems (9fc1ded)
              • Update Chinese language translations (b8d77e3)

              Performance Improvements

              • 🚀 Update to scrcpy v2.5 (22cc5a3)

              1.19.3 (2024-06-13)

              Bug Fixes

              • 🐛 Abnormal operations cause the program that cannot be closed (b989140)

              1.19.2 (2024-06-03)

              Bug Fixes

              • 🐛 Automatically apply local languages (0cc8208)

              1.19.1 (2024-05-26)

              Bug Fixes

              • 🐛 In some cases, the light mode is abnormal (ea227e0)
              • 🐛 Search for shortcut key conflicts (c70e6ca)

              Performance Improvements

              1.19.0 (2024-05-15)

              Features

              • 🚀 Add page search function (6dd8244)
              • 🚀 Update dependencies to support ESM (9f1696f)

              Bug Fixes

              • 🐛 Resolving build failures (8460945)
              • 🐛 Tips unavailable (603e4e9)

              Performance Improvements

              • ♻️ FindInPage API (fcf8269)
              • ♻️ Optimize dark mode (2f2e1cf)
              • ♻️ Search interaction (a195b7e)
              • ♻️ Search variable name (7c55e50)
              • 🐛 Global search error (091d503)
              • 🚀 优化页面查找工具性能 (8587977)

              1.18.4 (2024-05-04)

              Bug Fixes

              • 🐛 Wireless adb does not support Spaces (1f27597)

              1.18.3 (2024-04-12)

              Performance Improvements

              • ♻️ i18n configuration (1ca0469)

              1.18.2 (2024-04-11)

              Bug Fixes

              • 🐛 zh_TW Language support (885af3a)

              1.18.1 (2024-04-11)

              Bug Fixes

              • 🔧 Repair merge zh-TW failed (81ff63f)

              Performance Improvements

              1.18.0 (2024-04-11)

              Features

              • Add a simple zh_TW Traditional Chinese locale (cec6539)

              1.17.8 (2024-03-29)

              Bug Fixes

              • 🐛 Camera configuration conflict (07cc5f3)
              • 🐛 OTG configuration conflict (576d287)
              • 🐛 OTG mode: could not turn screen off (c5bed0e)

              1.17.7 (2024-03-27)

              Bug Fixes

              • ♻️ Remove the redundant imports (a06708f)

              Performance Improvements

              • ♻️ Optimize delete history logic (780e3b9)
              • ♻️ Support delete historical connection (c82560f)
              • 💄 Wireless style optimization (ba51fe3)

              1.17.6 (2024-03-21)

              Performance Improvements

              • ♻️ Supports automatic execution of mirrors on devices (11e0884)

              1.17.5 (2024-03-17)

              Performance Improvements

              1.17.4 (2024-03-14)

              Performance Improvements

              • ♻️ Options in the preference settings (dc711cb)

              1.17.3 (2024-03-13)

              Performance Improvements

              • ♻️ Remove console log (6e25eb7)

              1.17.2 (2024-03-10)

              Bug Fixes

              • 🐛 Abnormal built-in terminal adb command (368551a)

              Performance Improvements

              • ♻️ Update eslint config (bf2d2b4)

              1.17.1 (2024-03-05)

              Performance Improvements

              • ♻️ Interactive logic optimization (193f80a)
              • ♻️ Optimize design and code (d507c2d)
              • ♻️ Optimize equipment operation (389ac33)
              • ➖ Remove redundant packages (f9e4a0e)
              • 💄 Optimize dark mode styles (1cac054)

              1.17.0 (2024-03-04)

              Features

              • 🎉 Update to scrcpy v2.4 (02a4d39)

              1.16.8 (2023-12-27)

              Bug Fixes

              • 🐛 The maximum size description error (01fd926)

              1.16.7 (2023-12-19)

              Performance Improvements

              1.16.6 (2023-12-19)

              Miscellaneous Chores

              1.16.5 (2023-12-19)

              Performance Improvements

              • 📝 Control in stop charging (8707eb5)

              1.16.4 (2023-12-19)

              Bug Fixes

              • 🐛 Pairing code type issue (889fe8c)

              1.16.3 (2023-12-03)

              Performance Improvements

              • 🚀 Update scrcpy v2.3.1 (3566655)

              1.16.2 (2023-12-02)

              Bug Fixes

              1.16.1 (2023-11-26)

              Bug Fixes

              1.16.0 (2023-11-26)

              Performance Improvements

              Miscellaneous Chores

              1.15.0 (2023-11-18)

              Features

              • 添加投屏窗口大小控制 (97d7868)

              Performance Improvements

              • 🚀 Add window position option (866aa2c)

              1.14.3 (2023-11-17)

              Performance Improvements

              • ♻️ Add context menu (f0f25a7)
              • ♻️ Optimize extended menu bar interaction (de9352c)
              • 📝 Optimization preferences description (30eca50)

              1.14.2 (2023-11-16)

              Performance Improvements

              • ♻️ Optimize autoConnect historical devices (755a130)
              • 💡 Add autoConnect option (a57b847)

              1.14.1 (2023-11-14)

              Bug Fixes

              • 🐛 Abnormal terminal theme (20d37c1)

              1.14.0 (2023-11-14)

              Features

              • 🎉 Add Terminal Debugging (fdf40c7)

              Performance Improvements

              • ♻️ Optimize terminal performance (d3afc4b)
              • 💄 Update terminal style (5b6b8d1)
              • 🚨 Optimization error prompt (b759502)

              1.13.5 (2023-11-11)

              Performance Improvements

              • ♻️ Mirror group shutdown logic (296e21d)
              • ♻️ Optimize mirror group (5793c24)

              1.13.4 (2023-11-10)

              Performance Improvements

              • ♻️ Optimization updater (61ccd4a)
              • ♻️ Optimize mirror group (81c007f)

              1.13.3 (2023-11-10)

              Bug Fixes

              • 🐛 Recording prompt and file format errors (bfdad9e)

              Performance Improvements

              • ♻️ Optimize Batch connection performance (36de67b)
              • ♻️ Optimize file push prompts (4a3575f)
              • ♻️ Optimize historical device connections (83f8c04)
              • ✨ Support bulk connecting to historical devices (b7eb1dd)

              1.13.2 (2023-11-09)

              Bug Fixes

              Performance Improvements

              • ♻️ Configure Incompatible Handling Mechanism (c0e6a01)
              • ♻️ Optimize gnirehtet (de3555b)
              • 💄 Optimize volume control and gnirehtet (b40bdcf)
              • 🚀 Add File push function (70f8b46)
              • 🚀 Add screen rotation shortcut menu (dd601df)

              1.13.1 (2023-11-08)

              Performance Improvements

              • ♻️ Adjust volume control position (1b3f49e)
              • ♻️ Optimize configuration file logic (5f8cc5a)
              • 🚀 Add volume control (1505518)

              1.13.0 (2023-11-07)

              Features

              • 🎉 Add mirror group function (0c9d36f)

              Bug Fixes

              Performance Improvements

              • ♻️ Optimize mirror group (cf9c82d)
              • ♻️ optimize mirror group tips (46defbf)
              • ♻️ Optimize preferences (7a6417e)
              • ♻️ Optimize window control (0530ed3)
              • 💄 Update styles (37da97b)
              • 🚀 Add camera options (5a04b4c)

              1.12.4 (2023-11-03)

              Bug Fixes

              • 🐛 MacOS reduced to the tray to evoke failure (d7bf83b)

              1.12.3 (2023-11-03)

              Bug Fixes

              • 🐛 MacOS reduced to the tray to evoke failure (6153bc4)

              1.12.2 (2023-11-03)

              Bug Fixes

              1.12.1 (2023-11-03)

              Bug Fixes

              • 🐛 Add gnirehtet fix option (f9c6c32)
              • 🐛 Display options cannot be changed (3046746)
              • 🐛 Preference style (0f72090)
              • 🐛 Reset preferences language not restored (d691780)
              • 🐛 Unable to update path selector (3279c34)
              • 🐛 Video codec preset error (1af9abd)

              Performance Improvements

              • ♻️ optimize Codec (6154ffc)
              • ♻️ Optimize recording (f4dfb2c)
              • 🎨 Update preferences style (e9befea)

              1.12.0 (2023-11-02)

              Features

              • 🎉 Update Scrcpy to v2.2 (5c401a8)

              Bug Fixes

              Performance Improvements

              1.11.9 (2023-10-31)

              Performance Improvements

              • ♻️ Optimization gnirehtet and scrcpy (9cf800c)
              • ♻️ Optimize Gnirehtet interaction (a90e570)

              1.11.8 (2023-10-31)

              Bug Fixes

              • 🎨 修复 macOS 设置主题跟随系统后 某些情况下循环触发导致死循环的问题 (1d7b188)

              1.11.7 (2023-10-31)

              Bug Fixes

              • 🐛 macOS x64ArchFiles Errors (151cb29)

              1.11.6 (2023-10-31)

              Bug Fixes

              • 🐛 macOS x64ArchFiles Errors (7dbca01)

              1.11.5 (2023-10-31)

              Bug Fixes

              • 🐛 macOS x64ArchFiles Errors (ad3f77f)

              1.11.4 (2023-10-31)

              Bug Fixes

              • 🐛 macOS x64ArchFiles Errors (4b4e116)

              1.11.3 (2023-10-31)

              Bug Fixes

              • 🐛 Unix permission issues (1279994)
              • 🐛 Unix permission issues (dc9a3c4)
              • 🐛 x64ArchFiles Error (82a99d9)

              1.11.2 (2023-10-30)

              Bug Fixes

              • 🐛 修复 macOS 打包失败的问题 (1b2236c)

              1.11.1 (2023-10-30)

              Bug Fixes

              • 🐛 修复 macOS 打包失败的问题 (37e2837)

              1.11.0 (2023-10-30)

              Features

              • 🎉 Add gnirehtet reverse tethering function (2c97189)

              Bug Fixes

              • 🐛 gnirehtet custom dependent paths error (cfd0e1d)

              Performance Improvements

              • ♻️ Optimize Gnirehtet interaction (e1237cd)
              • ♻️ 拆分依赖文件禁用冗余的警告信息 (93ad836)
              • ♻️ 目录结构及描述调整 (f9a32d6)
              • ♻️ 补充依赖及目录结构调整 (b18256b)

              1.10.2 (2023-10-28)

              Bug Fixes

              • 🐛 修复设置主题跟随系统后没有生效的问题 (95a83f4)

              1.10.1 (2023-10-28)

              Bug Fixes

              • 🐛 修复 linux 无法启动镜像或录制服务以及修改自定义依赖目录的问题 (d815643)

              1.10.0 (2023-10-27)

              Features

              • 🚀 新增支持 深色模式、国际化语言、运行日志等功能 (4b13f58)

              Bug Fixes

              • 🐛 修复 linux 打包后图标丢失的问题 (217d82d)
              • 🐛 修复安装路径包含空格会导致无法启动服务的问题 (29ae786)
              • 🐛 修复录制结束点击取消异常弹窗以及点击重启服务没有反应的问题 (054c55b)
              • 🔧 修复自定义路径功能没有生效的问题 (894b581)

              Performance Improvements

              1.9.1 (2023-10-24)

              Performance Improvements

              • 💄 窗口控制及交互逻辑优化 (52514e2)

              1.9.0 (2023-10-24)

              Features

              • 🚀 添加 i18n 初步支持 (18d490f)

              Bug Fixes

              • 🐛 修复 macOS 最小化到托盘后状态栏图标不显示的问题 (a789826)

              1.8.17 (2023-10-23)

              Bug Fixes

              • 🐛 尝试修复构建失败 (daeb9e5)

              1.8.16 (2023-10-23)

              Performance Improvements

              • ✨ 采用新的 Logo 设计 (3bf79d3)

              1.8.15 (2023-10-22)

              Bug Fixes

              • 🐛 修复 Linux 平台启动白屏无法正常使用的问题 (54e713b)

              1.8.14 (2023-10-21)

              Bug Fixes

              • 🐛 修复 linux 打包配置错误的问题 (a9668d9)

              1.8.13 (2023-10-21)

              Performance Improvements

              • 🚀 为 windows 添加 ARM64 软件包编译 (368e8ee)
              • 🚀 支持所有平台在点击关闭按钮时选择是否保存到托盘中的功能 (8360198)

              1.8.12 (2023-10-21)

              Bug Fixes

              • 🐛 修复 macOS 或 linux 下自定义依赖选项描述错误的问题 (0d4b1ce)

              1.8.11 (2023-10-21)

              Performance Improvements

              • 🔨 优化窗口默认大小 (393e899)

              1.8.10 (2023-10-20)

              Bug Fixes

              • 🐛 修复 macOS 窗口问题 (f768566)

              1.8.9 (2023-10-20)

              Bug Fixes

              • 🐛 修复 macOS 窗口过小导致出现横向滚动条的问题 (8ee34ca)

              1.8.8 (2023-10-20)

              Bug Fixes

              • 🚀 修复 macOS 简单关闭应用重新打开时报错的问题 (4b259c3)

              1.8.7 (2023-10-20)

              Bug Fixes

              • 🐛 修复打包多个平台时可能生成重复文件导致发布软件包失败的问题 (e89a7a5)

              1.8.6 (2023-10-20)

              Bug Fixes

              • 🔧 修复 macOS 无法正确获取系统依赖路径的问题 (2352593)

              1.8.5 (2023-10-20)

              Bug Fixes

              • 🚑️ 修复 Linux maintainer 问题 (4e1542a)

              1.8.4 (2023-10-20)

              Bug Fixes

              • 🚑️ 修复 Linux 打包失败的问题 (96f85d8)

              1.8.3 (2023-10-20)

              Bug Fixes

              • 🚀 修复 MacOS 软件包安装后无线显示 Logo 的问题 (77dd81b)

              1.8.2 (2023-10-20)

              Bug Fixes

              • 🔧 修复 Linux 及 MacOS 获取默认依赖路径异常的问题 (87b533f)
              • 🔧 修复 MacOS ARM64 版本打包失败的问题 (e9a8fc2)

              1.8.1 (2023-10-20)

              Performance Improvements

              • 🚀 支持创建更多架构的 MacOS 软件包格式 (4780e7c)

              1.8.0 (2023-10-20)

              Features

              • 🚀 初步添加对 Linux 以及 MacOS 的支持 (569ed2e)

              Bug Fixes

              • 📝 偏好设置描述信息修改 (23d68d4)
              • 🔧 设备列表标签显示细节调整 (4f2f00e)

              Performance Improvements

              • 📝 设备备注文本框描述信息调整 (379b325)

              1.7.1 (2023-10-20)

              Bug Fixes

              • 🚀 修复对设备进行独立配置时的一些问题 (6ccd6d0)

              Performance Improvements

              • 🎉 初步支持设置偏好设置的作用域范围 (5dd328c)

              1.7.0 (2023-10-19)

              Features

              • 🚀 新增支持导入及导出配置 (326a133)
              • 🚀 新增支持添加设备备注 (43f15be)

              Performance Improvements

              • ➕ 设备交互栏添加重启设备及打开通知栏功能 (1341fb8)

              1.6.10 (2023-10-18)

              Performance Improvements

              • 🚀 采用新的方法实现所有进程共享 isPackaged (8a5f7d9)

              1.6.9 (2023-10-17)

              Bug Fixes

              • 🔧 优化 isPackaged 判断条件解决某些情况下资源路径解析异常的问题 (fbd1885)

              1.6.8 (2023-10-17)

              Performance Improvements

              • 🚀 支持通过操作栏安装应用并提供相应安装反馈 (3bd2075)

              1.6.7 (2023-10-17)

              Performance Improvements

              • 📝 去除冗余的依赖项 (a6744dc)

              1.6.6 (2023-10-17)

              Bug Fixes

              • 🐛 build fix (09c8dee)
              • 🐛 修复 electron 资源路径问题 (955756e)

              1.6.5 (2023-10-16)

              Bug Fixes

              • 🐛 修复 App NextTick 错误 (79d85eb)

              1.6.4 (2023-10-16)

              Bug Fixes

              • 🐛 修复 electron-builder 配置异常导致打包的文件无法发布的问题 (9a4efa5)
              • 🚀 修复设备列表按钮状态变更影响布局变化的问题 (83a8043)

              1.6.3 (2023-10-16)

              Bug Fixes

              • 🐛 修复打包后图标丢失的问题 (58a66f1)

              1.6.2 (2023-10-13)

              Bug Fixes

              • 🐛 修复USB未授权设备导致无线连接地址变为假值的问题 (9c25325)

              1.6.1 (2023-10-13)

              Performance Improvements

              • 🔨 自定义通用的文件存储路径相关逻辑完善 (8455e86)

              1.6.0 (2023-10-13)

              Features

              • 🚀 增加了对设备交互控制栏的支持 (fd20736)

              1.5.3 (2023-10-13)

              Bug Fixes

              • 🔧 修复点击无线模式没有反应的问题 (9d55ef9)

              1.5.2 (2023-10-13)

              Bug Fixes

              • 📝 修复高级配置标题语义不明的问题 (218de1c)

              Performance Improvements

              • 🚀 添加更多的高级配置并更新文档 (922abd2)

              1.5.1 (2023-10-12)

              Bug Fixes

              • 🐛 去除页面组件冗余参数 (8e5df15)

              1.5.0 (2023-10-12)

              Features

              • 🚀 添加音视频录制功能以及更多的高级选项 (b6986d1)

              1.4.1 (2023-10-12)

              Bug Fixes

              • 🐛 修复检查更新失败没有提示的问题 (6f733ea)

              1.4.0 (2023-10-11)

              Features

              • 🚀 添加在线检查更新功能 (8de04e0)

              Bug Fixes

              • 🔨 修复无线配对时表单验证错误 (7cd9ea3)
              • 🔨 修复直接进行无线连接时没有处理配对设备的问题 (4263d07)

              1.3.3 (2023-09-26)

              Bug Fixes

              • 🐛 修复触摸点配置描述错误的问题 (4e2be23)

              1.3.2 (2023-09-19)

              Bug Fixes

              • 🔧 修复旋转屏幕配置异常的问题 (af7a319)

              1.3.1 (2023-09-19)

              Bug Fixes

              • 🔧 修复图标不透明的问题 (24c011f)

              1.3.0 (2023-09-19)

              Features

              • ✨ 用户界面进行优化,制作了合适的 Logo (1b96ffc)

              1.2.0 (2023-09-19)

              Features

              • 🎉 优化设备界面视图并添加虚拟控制栏配置 (3be0682)

              1.1.0 (2023-09-18)

              Features

              • 🚀 增加了常用的 Scrcpy 高级配置 (ac52df2)

              1.0.2 (2023-09-18)

              Performance Improvements

              • 🚀 合并无线连接及有线连接到设备列表 (e84f24e)

              1.0.1 (2023-09-16)

              Bug Fixes

              • 🔧 去除未测试环境的打包以修复构建失败的问题 (d6ec7fd)

              1.0.0 (2023-09-16)

              Features

              • 📝 添加基本的有线连接支持 (647a0c5)
              • 🚀 添加 Electron 基本支持 (a46a5e1)
              • 🚀 添加初步的构建及发布支持 (c85f8fb)
              • 🚀 添加基本的无线连接功能 (6dd2db9)

              Bug Fixes

              • 🔧 修复 ADB 环境变量配置错误导致无法连接的问题 (9ef7203)

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/contact.html b/contact.html index be2954053..a21762bda 100644 --- a/contact.html +++ b/contact.html @@ -6,14 +6,14 @@ Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
              Skip to content

              +

              - +

              + \ No newline at end of file diff --git a/donate.html b/donate.html index d52e9585b..37b7eeea6 100644 --- a/donate.html +++ b/donate.html @@ -6,14 +6,14 @@ Donate Project ♥️ | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
              Skip to content

              Donate Project ♥️

              If this project has helped you, you can buy me a coffee to keep me energized and improving the project! 😛

              viarotel-wepayviarotel-alipayviarotel-paypal

              +

              Skip to content

              Donate Project ♥️

              If this project has helped you, you can buy me a coffee to keep me energized and improving the project! 😛

              viarotel-wepayviarotel-alipayviarotel-paypal

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/guide/index.html b/guide/index.html index d8da5210a..3a0da6e0b 100644 --- a/guide/index.html +++ b/guide/index.html @@ -6,14 +6,14 @@ Guide | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
              Skip to content

              Escrcpy: A Graphical Android Device Control Tool Based on Electron

              What is Escrcpy?

              Escrcpy is a graphical Android device control tool developed based on Electron. Built upon the renowned open-source project Scrcpy, it provides users with a more user-friendly and feature-rich graphical interface. With Escrcpy, users can easily display and control Android devices on their computers, enjoying a high-definition, low-latency screen mirroring experience.

              Core Features

              Efficient and Stable Screen Mirroring

              • ⚡️ High Performance: Supports 30-120 fps (depending on device capability)
              • 🌟 High Quality: Supports 1920×1080 or higher resolution display
              • 🕒 Low Latency: Only 35~70 milliseconds of delay
              • 🚀 Fast Startup: Displays the first frame in about 1 second

              Rich Functional Features

              • 📡 Wireless Connection: Supports quick device connection via QR code scanning
              • 🤖 Automation: Auto-connect devices, auto-execute mirroring, custom scripts, and scheduled tasks
              • 💡 Highly Customizable: Multi-device management, independent configurations, custom notes, config import/export
              • 🖥️ Window Arrangement: Visual multi-device window layout management with drag-and-drop position and size adjustment
              • 🔗 Reverse Tethering: Built-in Gnirehtet reverse tethering functionality
              • 🎨 Theme Switching: Supports light/dark modes, automatically switches with the system

              Optimized User Experience

              • 😎 Lightweight: Native support, displays only the device screen
              • 🙅‍♂️ No Residue: Leaves no traces on Android devices
              • 🤩 Pure Experience: No account required, no ads, no internet needed
              • 🗽 Completely Free and Open Source

              Use Cases

              Escrcpy is ideal for the following scenarios:

              1. Developers debugging Android apps on their computers
              2. Gamers playing mobile games on larger screens
              3. Users needing to record mobile screen content
              4. Situations requiring phone operation on a computer for work
              5. Demonstrating phone operations during teaching sessions

              Cross-Platform Support

              Escrcpy supports major operating systems:

              • Windows
              • macOS
              • Linux

              Technical Advantages

              As the graphical interface version of Scrcpy, Escrcpy retains all the advantages of Scrcpy while adding:

              • A more intuitive device management interface
              • More convenient connection methods
              • Richer customization options
              • More comprehensive batch operation features

              Future Development

              The project team continues to improve Escrcpy, with future plans including:

              • Enhancing the way mirror window position and size are set
              • Optimizing the batch device connection experience
              • Developing a graphical script editing tool

              How to use

              Escrcpy is a completely free and open-source project. Please refer to the specific usage:

              Get Started 👉

              Conclusion

              Escrcpy brings a modern graphical interface and enhanced features to Scrcpy, making Android device control simpler and more efficient. Whether you're a developer or an average user, Escrcpy can provide an outstanding device control experience. Its open-source and free nature also allows more people to use this excellent tool without hesitation.

              If you're looking for a powerful, user-friendly Android device control tool, Escrcpy is definitely worth trying!

              +

              Skip to content

              Escrcpy: A Graphical Android Device Control Tool Based on Electron

              What is Escrcpy?

              Escrcpy is a graphical Android device control tool developed based on Electron. Built upon the renowned open-source project Scrcpy, it provides users with a more user-friendly and feature-rich graphical interface. With Escrcpy, users can easily display and control Android devices on their computers, enjoying a high-definition, low-latency screen mirroring experience.

              Core Features

              Efficient and Stable Screen Mirroring

              • ⚡️ High Performance: Supports 30-120 fps (depending on device capability)
              • 🌟 High Quality: Supports 1920×1080 or higher resolution display
              • 🕒 Low Latency: Only 35~70 milliseconds of delay
              • 🚀 Fast Startup: Displays the first frame in about 1 second

              Rich Functional Features

              • 📡 Wireless Connection: Supports quick device connection via QR code scanning
              • 🤖 Automation: Auto-connect devices, auto-execute mirroring, custom scripts, and scheduled tasks
              • 💡 Highly Customizable: Multi-device management, independent configurations, custom notes, config import/export
              • 🖥️ Window Arrangement: Visual multi-device window layout management with drag-and-drop position and size adjustment
              • 🔗 Reverse Tethering: Built-in Gnirehtet reverse tethering functionality
              • 🎨 Theme Switching: Supports light/dark modes, automatically switches with the system

              Optimized User Experience

              • 😎 Lightweight: Native support, displays only the device screen
              • 🙅‍♂️ No Residue: Leaves no traces on Android devices
              • 🤩 Pure Experience: No account required, no ads, no internet needed
              • 🗽 Completely Free and Open Source

              Use Cases

              Escrcpy is ideal for the following scenarios:

              1. Developers debugging Android apps on their computers
              2. Gamers playing mobile games on larger screens
              3. Users needing to record mobile screen content
              4. Situations requiring phone operation on a computer for work
              5. Demonstrating phone operations during teaching sessions

              Cross-Platform Support

              Escrcpy supports major operating systems:

              • Windows
              • macOS
              • Linux

              Technical Advantages

              As the graphical interface version of Scrcpy, Escrcpy retains all the advantages of Scrcpy while adding:

              • A more intuitive device management interface
              • More convenient connection methods
              • Richer customization options
              • More comprehensive batch operation features

              Future Development

              The project team continues to improve Escrcpy, with future plans including:

              • Enhancing the way mirror window position and size are set
              • Optimizing the batch device connection experience
              • Developing a graphical script editing tool

              How to use

              Escrcpy is a completely free and open-source project. Please refer to the specific usage:

              Get Started 👉

              Conclusion

              Escrcpy brings a modern graphical interface and enhanced features to Scrcpy, making Android device control simpler and more efficient. Whether you're a developer or an average user, Escrcpy can provide an outstanding device control experience. Its open-source and free nature also allows more people to use this excellent tool without hesitation.

              If you're looking for a powerful, user-friendly Android device control tool, Escrcpy is definitely worth trying!

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/guide/milestones.html b/guide/milestones.html index bb68e2b1d..55fbfd3ea 100644 --- a/guide/milestones.html +++ b/guide/milestones.html @@ -6,14 +6,14 @@ Milestones | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
              Skip to content

              Milestones

              Priority from high to low:

              • Improved logo ✅
              • Software update feature ✅
              • Record and save audio/video ✅
              • Device quick interaction control bar ✅
              • Custom Adb and Scrcpy dependencies ✅
              • Custom device names ✅
              • Export and import preferences ✅
              • Individual device configuration ✅
              • macOS and Linux support ✅
              • Internationalization ✅
              • Dark mode ✅
              • Reverse tethering (Gnirehtet) ✅
              • Camera mirroring ✅
              • Multi-screen collaboration ✅
              • File push, screen rotation, audio control ✅
              • Batch connect historical devices ✅
              • Built-in terminal ✅
              • Auto-execute mirroring ✅
              • Flexible mirroring launch ✅
              • Batch processing ✅
              • Scheduled tasks ✅
              • Graphical file manager ✅
              • Floating control bar ✅
              • Enhanced recording ✅
              • Start APP(Multi-threaded) ✅
              • Main window edge hidden ✅
              • Group devices (by filtering remarks) ✅
              • Improved history device connection experience ✅
              • File management supports uploading directories ✅
              • Support adding open APP to desktop shortcut (Windows only) ✅
              • Support batch startup of devices ✅
              • Supports controlling the window layout of each device through visual orchestration tools ✅
              • Integrate different connection methods and configurations of the same device to improve user experience ✅
              • Enhanced device file manager ✅
              • Integrate AutoGLM to control your Android device using natural language without scripting ✅
              • Refactor main process architecture to improve performance and stability ✅
              • Support script automation through visual orchestration tools ✅
              • Device group control feature ✅
              • Keyboard mapping feature 🚧

              +

              Skip to content

              Milestones

              Priority from high to low:

              • Improved logo ✅
              • Software update feature ✅
              • Record and save audio/video ✅
              • Device quick interaction control bar ✅
              • Custom Adb and Scrcpy dependencies ✅
              • Custom device names ✅
              • Export and import preferences ✅
              • Individual device configuration ✅
              • macOS and Linux support ✅
              • Internationalization ✅
              • Dark mode ✅
              • Reverse tethering (Gnirehtet) ✅
              • Camera mirroring ✅
              • Multi-screen collaboration ✅
              • File push, screen rotation, audio control ✅
              • Batch connect historical devices ✅
              • Built-in terminal ✅
              • Auto-execute mirroring ✅
              • Flexible mirroring launch ✅
              • Batch processing ✅
              • Scheduled tasks ✅
              • Graphical file manager ✅
              • Floating control bar ✅
              • Enhanced recording ✅
              • Start APP(Multi-threaded) ✅
              • Main window edge hidden ✅
              • Group devices (by filtering remarks) ✅
              • Improved history device connection experience ✅
              • File management supports uploading directories ✅
              • Support adding open APP to desktop shortcut (Windows only) ✅
              • Support batch startup of devices ✅
              • Supports controlling the window layout of each device through visual orchestration tools ✅
              • Integrate different connection methods and configurations of the same device to improve user experience ✅
              • Enhanced device file manager ✅
              • Integrate AutoGLM to control your Android device using natural language without scripting ✅
              • Refactor main process architecture to improve performance and stability ✅
              • Support script automation through visual orchestration tools ✅
              • Device group control feature ✅
              • Keyboard mapping feature 🚧

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/guide/operation.html b/guide/operation.html index 82637fc38..2eaf444b2 100644 --- a/guide/operation.html +++ b/guide/operation.html @@ -6,14 +6,14 @@ Operation | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
              Skip to content

              Device Operation

              Batch Processing

              • Batch mirroring
              • Batch Interception Screen
              • Batch Installation Application
              • Batch File Management
              • Batch Execution Script
              • Batch Scheduled Task

              Control Model

              • Mirror
              • Recording
              • Recording Camera
              • Recording Audio
              • Camera
              • Custom
              • OTG

              Device Interaction Bar

              • Automatic Control (AutoGLM)
              • Switch
              • Home
              • Back
              • Start APP (Mirror Group)
              • Turn off screen (experimental)
              • Notification
              • Power
              • Rotation
              • Volume
              • Screenshot
              • Reboot
              • Install APP
              • File Manager
              • Execution Script
              • Scheduled Task
              • Gnirehtet

              +

              Skip to content

              Device Operation

              Batch Processing

              • Batch mirroring
              • Batch Interception Screen
              • Batch Installation Application
              • Batch File Management
              • Batch Execution Script
              • Batch Scheduled Task

              Control Model

              • Mirror
              • Recording
              • Recording Camera
              • Recording Audio
              • Camera
              • Custom
              • OTG

              Device Interaction Bar

              • Automatic Control (AutoGLM)
              • Switch
              • Home
              • Back
              • Start APP (Mirror Group)
              • Turn off screen (experimental)
              • Notification
              • Power
              • Rotation
              • Volume
              • Screenshot
              • Reboot
              • Install APP
              • File Manager
              • Execution Script
              • Scheduled Task
              • Gnirehtet

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/guide/preferences.html b/guide/preferences.html index 89d15bc37..86a2492b4 100644 --- a/guide/preferences.html +++ b/guide/preferences.html @@ -6,14 +6,14 @@ Preferences | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
              Skip to content

              Preferences

              Continuously improving. Currently supports the following common configurations

              General

              • Theme
              • Language
              • File storage path
              • Adb path
              • Scrcpy path
              • Gnirehtet path
              • Scrcpy parameters
              • Gnirehtet parameters
              • Auto-connect device
              • Auto-execute mirroring
              • Gnirehtet fix
              • Debug
              • Floating control bar
              • Use system terminal
              • Preferred terminal
              • Concurrency limit

              Video Control

              • Disable video forwarding
              • Maximum size
              • Video bitrate
              • Refresh rate
              • Video codec
              • Display orientation
              • Rotation angle
              • Screen cropping
              • Monitor
              • Video buffer
              • Receiver (v4l2) buffer

              Device Control

              • Show touch points
              • Keep awake
              • Turn off screen during control
              • Turn off screen after control
              • Disable auto screen on during control
              • Simulate auxiliary display

              Window Control

              • Window width
              • Window height
              • Window X-coordinate
              • Window Y-coordinate
              • Borderless mode
              • Fullscreen mode
              • Always on top
              • Disable screensaver

              Audio Control

              • Disable audio forwarding
              • Keep device audio
              • Audio source
              • Audio codec
              • Audio bitrate
              • Audio buffer
              • Audio output buffer

              Audio/Video Recording

              • Record video format
              • Record video orientation
              • Recording duration
              • Disable video playback
              • Disable audio playback

              Input Control

              • Mouse mode
              • Mouse binding
              • Keyboard mode
              • Keyboard injection method
              • Gamepad

              Camera Control

              • Camera source
              • Camera size
              • Camera ratio
              • Camera frame rate

              +

              Skip to content

              Preferences

              Continuously improving. Currently supports the following common configurations

              General

              • Theme
              • Language
              • File storage path
              • Adb path
              • Scrcpy path
              • Gnirehtet path
              • Scrcpy parameters
              • Gnirehtet parameters
              • Auto-connect device
              • Auto-execute mirroring
              • Gnirehtet fix
              • Debug
              • Floating control bar
              • Use system terminal
              • Preferred terminal
              • Concurrency limit

              Video Control

              • Disable video forwarding
              • Maximum size
              • Video bitrate
              • Refresh rate
              • Video codec
              • Display orientation
              • Rotation angle
              • Screen cropping
              • Monitor
              • Video buffer
              • Receiver (v4l2) buffer

              Device Control

              • Show touch points
              • Keep awake
              • Turn off screen during control
              • Turn off screen after control
              • Disable auto screen on during control
              • Simulate auxiliary display

              Window Control

              • Window width
              • Window height
              • Window X-coordinate
              • Window Y-coordinate
              • Borderless mode
              • Fullscreen mode
              • Always on top
              • Disable screensaver

              Audio Control

              • Disable audio forwarding
              • Keep device audio
              • Audio source
              • Audio codec
              • Audio bitrate
              • Audio buffer
              • Audio output buffer

              Audio/Video Recording

              • Record video format
              • Record video orientation
              • Recording duration
              • Disable video playback
              • Disable audio playback

              Input Control

              • Mouse mode
              • Mouse binding
              • Keyboard mode
              • Keyboard injection method
              • Gamepad

              Camera Control

              • Camera source
              • Camera size
              • Camera ratio
              • Camera frame rate

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/guide/started.html b/guide/started.html index aaaa70cf2..ecc822274 100644 --- a/guide/started.html +++ b/guide/started.html @@ -6,14 +6,14 @@ Quick Start | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
              Skip to content

              Quick Start

              Installation

              Manual installation via released packages

              macOS can be installed via Homebrew

              See homebrew-escrcpy

              USB Connection

              Note: If the phone prompts for debugging authorization, click allow

              1. Enable developer mode and USB debugging on your Android phone
              2. Open Escrcpy and connect your Android phone to your computer
              3. The device list in Escrcpy should have detected your phone, click start mirroring
              4. Enjoy!

              WIFI Connection

              Scan QR Code to Connect

              1. Follow steps 1-2 from USB connection
              2. Enable and enter wireless debugging in developer mode
              3. Click "Pair device using QR code"
              4. Start enjoying!

              Connect via IP Address

              Note: If initial wireless connection fails, you may need wireless pairing. Please refer to FAQ

              Note: You need to enable wireless debugging and obtain your device's wireless address (usually the IP address assigned when connecting to WiFi) and port number (default is 5555) from the wireless debugging page

              1. Follow steps 1-2 from USB connection
              2. Enter the obtained device IP address and port number in Escrcpy, then click connect device
              3. At this point, Escrcpy device list should detect your phone, click start mirroring
              4. Start enjoying!

              macOS && Linux

              Note: These platforms do not come with integrated Scrcpy, you need to install them manually

              In Escrcpy@1.27.1+ scrcpy binary files are preliminarily integrated, eliminating the need for manual scrcpy installation.

              1. Refer to the installation document for Linux
              2. Refer to the installation document for macOS
              3. Follow steps in USB Connection and WIFI Connection after dependencies are installed successfully

              Gnirehtet Reverse Tethering

              Gnirehtet is built into the Windows and Linux apps to provide reverse tethering from PC to Android devices.

              After connecting the device through the above steps, enable the reverse network function through Devices -> Device Control Bar -> Gnirehtet.

              Note: macOS does not have Gnirehtet built-in. You need to manually install it to use this feature Installation Guide.

              +

              Skip to content

              Quick Start

              Installation

              Manual installation via released packages

              macOS can be installed via Homebrew

              See homebrew-escrcpy

              USB Connection

              Note: If the phone prompts for debugging authorization, click allow

              1. Enable developer mode and USB debugging on your Android phone
              2. Open Escrcpy and connect your Android phone to your computer
              3. The device list in Escrcpy should have detected your phone, click start mirroring
              4. Enjoy!

              WIFI Connection

              Scan QR Code to Connect

              1. Follow steps 1-2 from USB connection
              2. Enable and enter wireless debugging in developer mode
              3. Click "Pair device using QR code"
              4. Start enjoying!

              Connect via IP Address

              Note: If initial wireless connection fails, you may need wireless pairing. Please refer to FAQ

              Note: You need to enable wireless debugging and obtain your device's wireless address (usually the IP address assigned when connecting to WiFi) and port number (default is 5555) from the wireless debugging page

              1. Follow steps 1-2 from USB connection
              2. Enter the obtained device IP address and port number in Escrcpy, then click connect device
              3. At this point, Escrcpy device list should detect your phone, click start mirroring
              4. Start enjoying!

              macOS && Linux

              Note: These platforms do not come with integrated Scrcpy, you need to install them manually

              In Escrcpy@1.27.1+ scrcpy binary files are preliminarily integrated, eliminating the need for manual scrcpy installation.

              1. Refer to the installation document for Linux
              2. Refer to the installation document for macOS
              3. Follow steps in USB Connection and WIFI Connection after dependencies are installed successfully

              Gnirehtet Reverse Tethering

              Gnirehtet is built into the Windows and Linux apps to provide reverse tethering from PC to Android devices.

              After connecting the device through the above steps, enable the reverse network function through Devices -> Device Control Bar -> Gnirehtet.

              Note: macOS does not have Gnirehtet built-in. You need to manually install it to use this feature Installation Guide.

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/guide/window-arrangement.html b/guide/window-arrangement.html index bb9cea9a0..7d7fcce43 100644 --- a/guide/window-arrangement.html +++ b/guide/window-arrangement.html @@ -6,14 +6,14 @@ Window Arrangement | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
              Skip to content

              Device Window Arrangement Feature Guide

              Device Window Arrangement is one of Escrcpy's advanced features, designed specifically for multi-device management and screen space optimization. Through a visual drag-and-drop interface, you can precisely control the position, size, and layout of each device window, enabling efficient multi-device collaborative operations.

              Feature Overview

              The Window Arrangement feature provides a fullscreen visual editing interface that allows you to:

              • Simultaneously manage the layout of multiple device windows
              • Adjust window positions and sizes through drag-and-drop
              • Set global default configurations and device-specific configurations
              • Preview window layout effects in real-time
              • Save and load custom layout schemes

              Core Components

              Global Configuration Component

              The global configuration component is used to set default window parameters for all devices, including:

              • Default window width and height
              • Default window position coordinates
              • Other common window properties

              Device Window Component

              Each connected device can be added as an independent window component, supporting:

              • Independent position and size settings
              • Device-specific window configurations
              • Inheritance or override of global configurations

              Detailed Operation Guide

              Starting Window Arrangement

              1. Launch from Main Interface
                • Find the "Arrange" button in the top-right corner of the main interface
                • Click the button to enter window arrangement interface
                • The system will open a fullscreen window arrangement interface

              Adding and Managing Components

              Adding Global Configuration Component

              1. Click the "Add Widget" dropdown button
              2. Select "Global Configuration" option
              3. The global configuration component will appear in the arrangement area
              4. This component is used to set default parameters for all devices

              Note: Each arrangement scheme can only have one global configuration component.

              Adding Device Window Components

              1. Click the "Add Widget" dropdown button
              2. Select the device you want to add from the device list
              3. The device window component will be added to the arrangement area
              4. Each device can only be added once

              Device Display Rules:

              • Only currently connected devices are displayed
              • Already added devices will not appear repeatedly in the dropdown list
              • Device names prioritize custom names, followed by device models

              Window Layout Adjustment

              Moving Window Position

              1. Select Target Window: Click the window component you want to move
              2. Drag to Move: Hold down the left mouse button and drag the window to the target position
              3. Real-time Feedback: You can see real-time position changes during dragging
              4. Release to Position: Release the mouse to complete position adjustment

              Adjusting Window Size

              1. Locate Adjustment Point: Move the mouse to the corner position of the window
              2. Drag to Adjust: Hold down the left mouse button and drag to change window size
              3. Proportion Constraints: The system automatically maintains reasonable window proportions
              4. Minimum Size Limit: Windows cannot be smaller than the preset minimum size

              Size Limitation Description

              • Minimum Width: 1/6 of container width
              • Minimum Height: 1/4 of container height
              • Boundary Constraints: Windows cannot be dragged outside the arrangement area
              • Overlap Handling: Windows are allowed to overlap, but complete occlusion should be avoided

              Layout Management Operations

              Reset Layout

              1. Click the "Reset Layout" button in the control panel
              2. The system will clear all current components
              3. Reload saved layout configurations
              4. If no saved configuration exists, an empty arrangement area will be displayed

              Clear All Components

              1. Click the "Clear All" button
              2. The system will display a confirmation dialog
              3. After confirmation, all window components will be removed
              4. The arrangement area will become blank

              Delete Individual Component

              1. Hover the mouse over the target window component
              2. Click the delete button (×) in the top-right corner of the window
              3. The component will be immediately removed from the arrangement area
              4. The corresponding device will reappear in the addable list

              Configuration Saving and Application

              Saving Layout Configuration

              1. Complete Layout Adjustment: Ensure all window components are adjusted to satisfactory positions and sizes
              2. Click Save Button: Click the "Save Layout" button at the bottom of the interface
              3. Configuration Writing: The system will write current layout information to configuration files
              4. Success Feedback: Display a successful save message prompt

              Configuration Storage Mechanism

              • Global Configuration: Stored in scrcpy.global configuration node
              • Device Configuration: Stored in scrcpy.[DeviceID] configuration node
              • Parameter Format:
                • --window-width: Window width
                • --window-height: Window height
                • --window-x: Window X coordinate
                • --window-y: Window Y coordinate

              Configuration Application Timing

              • When Starting Mirroring: Automatically apply corresponding window configuration when device starts mirroring
              • Configuration Inheritance: Device-specific configuration takes priority, unset parameters inherit global configuration
              • Dynamic Updates: Configuration takes effect immediately after saving, no application restart required

              Troubleshooting

              Common Issues

              Issue 1: Device not showing in add list

              • Confirm device is properly connected
              • Check if device is already added to arrangement
              • Try refreshing device list

              Issue 2: Window dragging not responsive

              • Confirm mouse click is in draggable area of window
              • Check if other programs are occupying mouse events
              • Try reopening arrangement interface

              Issue 3: Saved layout not taking effect

              • Confirm "Save Layout" button was clicked
              • Check if configuration file has write permissions
              • Try restarting application and testing again

              Issue 4: Abnormal window size

              • Check if minimum size limits are exceeded
              • Confirm monitor resolution settings are correct
              • Try resetting layout and reconfiguring

              By properly using the Window Arrangement feature, you can significantly improve multi-device management efficiency and create a personalized operating environment suitable for your workflow.

              +

              Skip to content

              Device Window Arrangement Feature Guide

              Device Window Arrangement is one of Escrcpy's advanced features, designed specifically for multi-device management and screen space optimization. Through a visual drag-and-drop interface, you can precisely control the position, size, and layout of each device window, enabling efficient multi-device collaborative operations.

              Feature Overview

              The Window Arrangement feature provides a fullscreen visual editing interface that allows you to:

              • Simultaneously manage the layout of multiple device windows
              • Adjust window positions and sizes through drag-and-drop
              • Set global default configurations and device-specific configurations
              • Preview window layout effects in real-time
              • Save and load custom layout schemes

              Core Components

              Global Configuration Component

              The global configuration component is used to set default window parameters for all devices, including:

              • Default window width and height
              • Default window position coordinates
              • Other common window properties

              Device Window Component

              Each connected device can be added as an independent window component, supporting:

              • Independent position and size settings
              • Device-specific window configurations
              • Inheritance or override of global configurations

              Detailed Operation Guide

              Starting Window Arrangement

              1. Launch from Main Interface
                • Find the "Arrange" button in the top-right corner of the main interface
                • Click the button to enter window arrangement interface
                • The system will open a fullscreen window arrangement interface

              Adding and Managing Components

              Adding Global Configuration Component

              1. Click the "Add Widget" dropdown button
              2. Select "Global Configuration" option
              3. The global configuration component will appear in the arrangement area
              4. This component is used to set default parameters for all devices

              Note: Each arrangement scheme can only have one global configuration component.

              Adding Device Window Components

              1. Click the "Add Widget" dropdown button
              2. Select the device you want to add from the device list
              3. The device window component will be added to the arrangement area
              4. Each device can only be added once

              Device Display Rules:

              • Only currently connected devices are displayed
              • Already added devices will not appear repeatedly in the dropdown list
              • Device names prioritize custom names, followed by device models

              Window Layout Adjustment

              Moving Window Position

              1. Select Target Window: Click the window component you want to move
              2. Drag to Move: Hold down the left mouse button and drag the window to the target position
              3. Real-time Feedback: You can see real-time position changes during dragging
              4. Release to Position: Release the mouse to complete position adjustment

              Adjusting Window Size

              1. Locate Adjustment Point: Move the mouse to the corner position of the window
              2. Drag to Adjust: Hold down the left mouse button and drag to change window size
              3. Proportion Constraints: The system automatically maintains reasonable window proportions
              4. Minimum Size Limit: Windows cannot be smaller than the preset minimum size

              Size Limitation Description

              • Minimum Width: 1/6 of container width
              • Minimum Height: 1/4 of container height
              • Boundary Constraints: Windows cannot be dragged outside the arrangement area
              • Overlap Handling: Windows are allowed to overlap, but complete occlusion should be avoided

              Layout Management Operations

              Reset Layout

              1. Click the "Reset Layout" button in the control panel
              2. The system will clear all current components
              3. Reload saved layout configurations
              4. If no saved configuration exists, an empty arrangement area will be displayed

              Clear All Components

              1. Click the "Clear All" button
              2. The system will display a confirmation dialog
              3. After confirmation, all window components will be removed
              4. The arrangement area will become blank

              Delete Individual Component

              1. Hover the mouse over the target window component
              2. Click the delete button (×) in the top-right corner of the window
              3. The component will be immediately removed from the arrangement area
              4. The corresponding device will reappear in the addable list

              Configuration Saving and Application

              Saving Layout Configuration

              1. Complete Layout Adjustment: Ensure all window components are adjusted to satisfactory positions and sizes
              2. Click Save Button: Click the "Save Layout" button at the bottom of the interface
              3. Configuration Writing: The system will write current layout information to configuration files
              4. Success Feedback: Display a successful save message prompt

              Configuration Storage Mechanism

              • Global Configuration: Stored in scrcpy.global configuration node
              • Device Configuration: Stored in scrcpy.[DeviceID] configuration node
              • Parameter Format:
                • --window-width: Window width
                • --window-height: Window height
                • --window-x: Window X coordinate
                • --window-y: Window Y coordinate

              Configuration Application Timing

              • When Starting Mirroring: Automatically apply corresponding window configuration when device starts mirroring
              • Configuration Inheritance: Device-specific configuration takes priority, unset parameters inherit global configuration
              • Dynamic Updates: Configuration takes effect immediately after saving, no application restart required

              Troubleshooting

              Common Issues

              Issue 1: Device not showing in add list

              • Confirm device is properly connected
              • Check if device is already added to arrangement
              • Try refreshing device list

              Issue 2: Window dragging not responsive

              • Confirm mouse click is in draggable area of window
              • Check if other programs are occupying mouse events
              • Try reopening arrangement interface

              Issue 3: Saved layout not taking effect

              • Confirm "Save Layout" button was clicked
              • Check if configuration file has write permissions
              • Try restarting application and testing again

              Issue 4: Abnormal window size

              • Check if minimum size limits are exceeded
              • Confirm monitor resolution settings are correct
              • Try resetting layout and reconfiguring

              By properly using the Window Arrangement feature, you can significantly improve multi-device management efficiency and create a personalized operating environment suitable for your workflow.

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index c094cc2ed..fc242c47e 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"changelog.md":"DwXQyWo8","contact.md":"CFGLvHVJ","donate.md":"DdwO5Lhr","guide_index.md":"C58ef6zY","guide_milestones.md":"CkUKwfnL","guide_operation.md":"Bp2dKiuC","guide_preferences.md":"DdxxuWiW","guide_started.md":"BOcw05bX","guide_window-arrangement.md":"KrYr4e8L","help_escrcpy.md":"fnXd3HiV","help_index.md":"BPXjHoc0","help_scrcpy.md":"EcbL_RwG","index.md":"BDpYpidL","reference_gnirehtet_api.md":"BkOI_ngI","reference_gnirehtet_index.md":"CoKB9kcb","reference_index.md":"EmNgEN4K","reference_scrcpy_audio.md":"D6IOAVz-","reference_scrcpy_build.md":"jEwBzyHk","reference_scrcpy_camera.md":"BdHJXJkv","reference_scrcpy_connection.md":"H2I8Yn35","reference_scrcpy_control.md":"g5G7PvkX","reference_scrcpy_develop.md":"CFf49M8d","reference_scrcpy_device.md":"DQ_Dt-uj","reference_scrcpy_gamepad.md":"BDgKCUYZ","reference_scrcpy_index.md":"CpFMlC50","reference_scrcpy_keyboard.md":"DopANcGF","reference_scrcpy_linux.md":"Bzy-SPRq","reference_scrcpy_macos.md":"CQicNXQT","reference_scrcpy_mouse.md":"NQj8mai2","reference_scrcpy_otg.md":"CIV5SDzf","reference_scrcpy_recording.md":"-SVrdjVV","reference_scrcpy_shortcuts.md":"DNKNygOp","reference_scrcpy_tunnels.md":"BkR0y4f4","reference_scrcpy_v4l2.md":"DS8efe0e","reference_scrcpy_video.md":"DMsAmnyq","reference_scrcpy_virtual_display.md":"DWZ_BrqQ","reference_scrcpy_window.md":"CK4PKnAi","reference_scrcpy_windows.md":"juLBbBsp","zhhans_changelog.md":"CNUeKrzR","zhhans_contact.md":"xXXvTA0i","zhhans_donate.md":"dJ_LbUKQ","zhhans_guide_index.md":"C1LSp1z1","zhhans_guide_milestones.md":"CHbxTkDr","zhhans_guide_operation.md":"D1aZ_uQw","zhhans_guide_preferences.md":"DUWEj5Mz","zhhans_guide_started.md":"dewAws4q","zhhans_guide_window-arrangement.md":"BfDLUcqn","zhhans_help_escrcpy.md":"ZCefmSs0","zhhans_help_index.md":"B52axyib","zhhans_help_scrcpy.md":"foVIj1PA","zhhans_index.md":"JkvKQVbP","zhhans_reference_gnirehtet_api.md":"De0QToXo","zhhans_reference_gnirehtet_index.md":"37muRUY0","zhhans_reference_index.md":"DdCvWGMU","zhhans_reference_scrcpy_audio.md":"Br-Vngro","zhhans_reference_scrcpy_build.md":"BG9nlnfF","zhhans_reference_scrcpy_camera.md":"Daxds0CG","zhhans_reference_scrcpy_connection.md":"CsTlJ0UC","zhhans_reference_scrcpy_control.md":"DlXmnrGh","zhhans_reference_scrcpy_develop.md":"s3gvZK2Y","zhhans_reference_scrcpy_device.md":"Cn0i3r8v","zhhans_reference_scrcpy_gamepad.md":"58_1gtlb","zhhans_reference_scrcpy_index.md":"DAHNtU1Y","zhhans_reference_scrcpy_keyboard.md":"Cn4jH-On","zhhans_reference_scrcpy_linux.md":"CBKcy-vy","zhhans_reference_scrcpy_macos.md":"STr7UfC2","zhhans_reference_scrcpy_mouse.md":"C6aH6Fyb","zhhans_reference_scrcpy_otg.md":"upw6u_tw","zhhans_reference_scrcpy_recording.md":"Degt-sIM","zhhans_reference_scrcpy_shortcuts.md":"BqCcsFsa","zhhans_reference_scrcpy_tunnels.md":"0tdj1aM8","zhhans_reference_scrcpy_v4l2.md":"DFNKRFo4","zhhans_reference_scrcpy_video.md":"CHc7dQPp","zhhans_reference_scrcpy_virtual_display.md":"Da2X0giP","zhhans_reference_scrcpy_window.md":"rahd1W76","zhhans_reference_scrcpy_windows.md":"B8w41ZpH"} +{"changelog.md":"D_WDUenM","contact.md":"hcol2kXC","donate.md":"CocsUBXN","guide_index.md":"BWinlxA1","guide_milestones.md":"CLGBZrm8","guide_operation.md":"CxX__I0K","guide_preferences.md":"DM2R_va4","guide_started.md":"BtW7i3wQ","guide_window-arrangement.md":"CySyvPTR","help_escrcpy.md":"DA7YYKsG","help_index.md":"CxGHpb9o","help_scrcpy.md":"N7lc9V0M","index.md":"DR8zCQql","reference_gnirehtet_api.md":"eub4XAAp","reference_gnirehtet_index.md":"D76rx-ph","reference_index.md":"BMtFiAcA","reference_scrcpy_audio.md":"BNd8vqbG","reference_scrcpy_build.md":"CP3zb9UV","reference_scrcpy_camera.md":"DPv7cum1","reference_scrcpy_connection.md":"NXdIkpOM","reference_scrcpy_control.md":"BLmM_i0H","reference_scrcpy_develop.md":"DCwFSoYA","reference_scrcpy_device.md":"wjd2R2RA","reference_scrcpy_gamepad.md":"FzRzwry2","reference_scrcpy_index.md":"D_zn973Z","reference_scrcpy_keyboard.md":"DC8b91AJ","reference_scrcpy_linux.md":"D02q-Gnh","reference_scrcpy_macos.md":"xpHTIFhL","reference_scrcpy_mouse.md":"DaBiTfPw","reference_scrcpy_otg.md":"CBP3ZJbh","reference_scrcpy_recording.md":"642iKMng","reference_scrcpy_shortcuts.md":"EJ0Z8Ppp","reference_scrcpy_tunnels.md":"-VKAcimy","reference_scrcpy_v4l2.md":"8gQpAHLo","reference_scrcpy_video.md":"DkxkkzrA","reference_scrcpy_virtual_display.md":"DUhMJ4qt","reference_scrcpy_window.md":"ZBdlXIXk","reference_scrcpy_windows.md":"Ce0Wqs7H","zhhans_changelog.md":"B4oYZ-kH","zhhans_contact.md":"Cov6ZTse","zhhans_donate.md":"HSuoYpEX","zhhans_guide_index.md":"C2icwcEL","zhhans_guide_milestones.md":"BgHjzWdL","zhhans_guide_operation.md":"BC_KoM-_","zhhans_guide_preferences.md":"BJwzq8b7","zhhans_guide_started.md":"DBz1FX_y","zhhans_guide_window-arrangement.md":"DXIswo8V","zhhans_help_escrcpy.md":"B0zBNP_j","zhhans_help_index.md":"CZhuyQ5q","zhhans_help_scrcpy.md":"CmPTXUiC","zhhans_index.md":"Dhdjchr3","zhhans_reference_gnirehtet_api.md":"Bj95AeHJ","zhhans_reference_gnirehtet_index.md":"CUmxck2C","zhhans_reference_index.md":"C890s8Az","zhhans_reference_scrcpy_audio.md":"CiaJRNI8","zhhans_reference_scrcpy_build.md":"L1hlNQNq","zhhans_reference_scrcpy_camera.md":"UhHPDGH0","zhhans_reference_scrcpy_connection.md":"xFHwE7Hq","zhhans_reference_scrcpy_control.md":"DXGOUQmQ","zhhans_reference_scrcpy_develop.md":"fwHMW-Ud","zhhans_reference_scrcpy_device.md":"VYXs7c1q","zhhans_reference_scrcpy_gamepad.md":"D3XZ6ol7","zhhans_reference_scrcpy_index.md":"6gBVsBM0","zhhans_reference_scrcpy_keyboard.md":"DYPYL1D7","zhhans_reference_scrcpy_linux.md":"EXbVcpfJ","zhhans_reference_scrcpy_macos.md":"hIvaSvin","zhhans_reference_scrcpy_mouse.md":"Cq2ENg_v","zhhans_reference_scrcpy_otg.md":"DPLP1u79","zhhans_reference_scrcpy_recording.md":"C8XHQgXy","zhhans_reference_scrcpy_shortcuts.md":"E4-Y4OFe","zhhans_reference_scrcpy_tunnels.md":"DS3RA5Gh","zhhans_reference_scrcpy_v4l2.md":"Dekz6XIg","zhhans_reference_scrcpy_video.md":"DZAoX0Fr","zhhans_reference_scrcpy_virtual_display.md":"B17ZAE_r","zhhans_reference_scrcpy_window.md":"DsVhYpEM","zhhans_reference_scrcpy_windows.md":"ByPHmbRS"} diff --git a/help/escrcpy.html b/help/escrcpy.html index 07cb581f6..51390ee2b 100644 --- a/help/escrcpy.html +++ b/help/escrcpy.html @@ -6,14 +6,14 @@ Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
              Skip to content

              Escrcpy

              Computer cannot detect device after connecting

              1. Please unplug and reconnect your device, and make sure the device has granted USB debugging authorization.
              2. If it still doesn't work, your computer may be missing necessary drivers. Please install drivers using third-party tools such as DriverWizard and try again.

              Unable to enter Chinese

              In Scrcpy@2.4+ and above, the solution is as follows:

              1. Escrcpy Settings: Go to PreferencesInput ControlKeyboard Mode and select uhid mode.
              2. Device Input Method Preparation: Install an input method that supports physical keyboards (WeChat Input Method is recommended) and complete the setup.
              3. Start Mirroring: Click Start Mirroring in Escrcpy. Verification: The device’s SettingsSystemLanguage & Input should display options for Physical Keyboard and On-screen Keyboard.
              4. Device Input Settings: Enable WeChat Input Method in the On-screen Keyboard settings. Configure the keyboard layout in the Physical Keyboard settings to match the computer keyboard (only needs to be done once).
              5. Computer Input Preparation: Set the input mode to English (important).
              6. Switch Input Language: Use Ctrl + Shift to switch between English and Chinese.
              7. Start Using.

              Download WeChat Input Method

              Wireless connection prompts: The target computer actively refuses access

              The first wireless connection may require pairing. Alternatively, insert USB to ensure connection establishment and authorization success before using wireless.

              Clicking wireless mode after connecting via data cable has no response

              Please click again, or click refresh devices. Generally it will not exceed two clicks. If still not working, please provide device model and Android version to Issues

              Why is the device interaction control bar not designed as an automatically sticking floating menu?

              It is important to note that, in principle, Escrcpy is just a GUI version based on Scrcpy, although it does extend some functionality. However, these extensions do not affect the core of Scrcpy. To implement this particular feature, I would have to modify the underlying Scrcpy code, which would make it more difficult for Escrcpy to stay in sync with Scrcpy's updates, and the drawbacks would outweigh the benefits.

              Therefore, after careful consideration, we have decided to adopt the existing solution and look forward to Scrcpy adding native support for an interactive control bar in the future.

              Some devices can see screenshots after connecting but cannot operate

              Note: For Xiaomi phones in particular, it requires not only enabling USB debugging but also enabling USB debugging (Security Settings), which is to allow modifying permissions or simulating clicks via USB debugging.

              Please refer to the detailed instructions under Reasons why mouse and keyboard do not work

              Downloading prompts antivirus detection causing unable to download normally

              After feedback, Windows Defender may occasionally block the software packages from being downloaded due to lack of certificate signing. You can try the following solutions:

              1. Open Windows Security Center.
              2. Select Virus & threat protection.
              3. In the Virus & threat protection settings, click Manage settings.
              4. Find Real-time protection, you can try clicking Disable if permission allows. If unable to disable real-time protection, please skip this step.
              5. Scroll down the page, find Exclusions, click Add or remove exclusions.
              6. Add the folder path where you download the software packages as an exclusion item, i.e. add the folder to the Excluded list.

              Failed to get device list or error when starting mirroring/recording

              This is generally caused by an incorrect path for Adb or Scrcpy, you can try the following solutions:

              1. In the menu, select Preferences and then click the reset configuration button in the top right corner of Global Mode.
              2. Go to the Device List page and try enabling mirroring again.
              3. Make sure you have downloaded and installed the latest version of Escrcpy.
              4. Press Ctrl + Shift + I to open the developer tools and check for any error messages.
              5. If there are errors, take a screenshot and submit your issue with the screenshot on the Feedback Issues page.

              macOS window minimized to system tray icon not found

              This is generally caused by too many icons in the system tray overflowing and hiding the Escrcpy icon. Try using the following tools:

              After a successful installation of macOS, when I try to open it, I receive a prompt saying the file is damaged.

              This is usually due to the software package not being signed. You can try the following solutions:

              1. Open Terminal and execute sudo spctl --master-disable to allow software from any source.
              2. Open Terminal and execute sudo xattr -r -d com.apple.quarantine /Applications/Escrcpy.app to attempt fixing the damaged software package prompt.

              Only support Windows 10 and above versions.

              Audio capture exception causing mirroring failure.

              This usually happens because your computer lacks audio output or you have a low Android version (Android 11+).

              Please try disabling audio forwarding feature through the preferences settings to resolve this issue.

              Microsoft Store version mirror startup error

              This is caused by files in the installation directory lacking executable permissions.

              You need to customize the file paths for scrcpy and adb (ensuring they have executable permissions). If using reverse tethering, configure gnirehtet similarly.

              Could not execute "adb start-server"

              This might be due to Chinese or special characters in the installation path. Please try changing the installation path.

              Unable to Open After Installation in Linux System

              New restrictions have been implemented for AppImage applications in some popular distributions, such as Ubuntu 24.04, limiting the use of sandboxes. A temporary workaround is as follows:

              shell
              sudo chmod 4755 /opt/Escrcpy/chrome-sandbox

              Black edges appear after resizing the casting window

              If black edges appear after resizing the casting window, simply double-click the black edge area and it will automatically hide.

              +

              Skip to content

              Escrcpy

              Computer cannot detect device after connecting

              1. Please unplug and reconnect your device, and make sure the device has granted USB debugging authorization.
              2. If it still doesn't work, your computer may be missing necessary drivers. Please install drivers using third-party tools such as DriverWizard and try again.

              Unable to enter Chinese

              In Scrcpy@2.4+ and above, the solution is as follows:

              1. Escrcpy Settings: Go to PreferencesInput ControlKeyboard Mode and select uhid mode.
              2. Device Input Method Preparation: Install an input method that supports physical keyboards (WeChat Input Method is recommended) and complete the setup.
              3. Start Mirroring: Click Start Mirroring in Escrcpy. Verification: The device’s SettingsSystemLanguage & Input should display options for Physical Keyboard and On-screen Keyboard.
              4. Device Input Settings: Enable WeChat Input Method in the On-screen Keyboard settings. Configure the keyboard layout in the Physical Keyboard settings to match the computer keyboard (only needs to be done once).
              5. Computer Input Preparation: Set the input mode to English (important).
              6. Switch Input Language: Use Ctrl + Shift to switch between English and Chinese.
              7. Start Using.

              Download WeChat Input Method

              Wireless connection prompts: The target computer actively refuses access

              The first wireless connection may require pairing. Alternatively, insert USB to ensure connection establishment and authorization success before using wireless.

              Clicking wireless mode after connecting via data cable has no response

              Please click again, or click refresh devices. Generally it will not exceed two clicks. If still not working, please provide device model and Android version to Issues

              Why is the device interaction control bar not designed as an automatically sticking floating menu?

              It is important to note that, in principle, Escrcpy is just a GUI version based on Scrcpy, although it does extend some functionality. However, these extensions do not affect the core of Scrcpy. To implement this particular feature, I would have to modify the underlying Scrcpy code, which would make it more difficult for Escrcpy to stay in sync with Scrcpy's updates, and the drawbacks would outweigh the benefits.

              Therefore, after careful consideration, we have decided to adopt the existing solution and look forward to Scrcpy adding native support for an interactive control bar in the future.

              Some devices can see screenshots after connecting but cannot operate

              Note: For Xiaomi phones in particular, it requires not only enabling USB debugging but also enabling USB debugging (Security Settings), which is to allow modifying permissions or simulating clicks via USB debugging.

              Please refer to the detailed instructions under Reasons why mouse and keyboard do not work

              Downloading prompts antivirus detection causing unable to download normally

              After feedback, Windows Defender may occasionally block the software packages from being downloaded due to lack of certificate signing. You can try the following solutions:

              1. Open Windows Security Center.
              2. Select Virus & threat protection.
              3. In the Virus & threat protection settings, click Manage settings.
              4. Find Real-time protection, you can try clicking Disable if permission allows. If unable to disable real-time protection, please skip this step.
              5. Scroll down the page, find Exclusions, click Add or remove exclusions.
              6. Add the folder path where you download the software packages as an exclusion item, i.e. add the folder to the Excluded list.

              Failed to get device list or error when starting mirroring/recording

              This is generally caused by an incorrect path for Adb or Scrcpy, you can try the following solutions:

              1. In the menu, select Preferences and then click the reset configuration button in the top right corner of Global Mode.
              2. Go to the Device List page and try enabling mirroring again.
              3. Make sure you have downloaded and installed the latest version of Escrcpy.
              4. Press Ctrl + Shift + I to open the developer tools and check for any error messages.
              5. If there are errors, take a screenshot and submit your issue with the screenshot on the Feedback Issues page.

              macOS window minimized to system tray icon not found

              This is generally caused by too many icons in the system tray overflowing and hiding the Escrcpy icon. Try using the following tools:

              After a successful installation of macOS, when I try to open it, I receive a prompt saying the file is damaged.

              This is usually due to the software package not being signed. You can try the following solutions:

              1. Open Terminal and execute sudo spctl --master-disable to allow software from any source.
              2. Open Terminal and execute sudo xattr -r -d com.apple.quarantine /Applications/Escrcpy.app to attempt fixing the damaged software package prompt.

              Only support Windows 10 and above versions.

              Audio capture exception causing mirroring failure.

              This usually happens because your computer lacks audio output or you have a low Android version (Android 11+).

              Please try disabling audio forwarding feature through the preferences settings to resolve this issue.

              Microsoft Store version mirror startup error

              This is caused by files in the installation directory lacking executable permissions.

              You need to customize the file paths for scrcpy and adb (ensuring they have executable permissions). If using reverse tethering, configure gnirehtet similarly.

              Could not execute "adb start-server"

              This might be due to Chinese or special characters in the installation path. Please try changing the installation path.

              Unable to Open After Installation in Linux System

              New restrictions have been implemented for AppImage applications in some popular distributions, such as Ubuntu 24.04, limiting the use of sandboxes. A temporary workaround is as follows:

              shell
              sudo chmod 4755 /opt/Escrcpy/chrome-sandbox

              Black edges appear after resizing the casting window

              If black edges appear after resizing the casting window, simply double-click the black edge area and it will automatically hide.

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/help/index.html b/help/index.html index e7d206c5d..e4804533d 100644 --- a/help/index.html +++ b/help/index.html @@ -6,14 +6,14 @@ Help | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
              Skip to content

              Help Center

              This section provides solutions to common problems for Escrcpy and Scrcpy users.

              +

              Skip to content

              Help Center

              This section provides solutions to common problems for Escrcpy and Scrcpy users.

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/help/scrcpy.html b/help/scrcpy.html index d5ece9a1b..f8a3bee85 100644 --- a/help/scrcpy.html +++ b/help/scrcpy.html @@ -6,14 +6,14 @@ Scrcpy | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
              Skip to content

              Scrcpy

              Here are the common reported problems and their status.

              If you encounter any error, the first step is to upgrade to the latest version.

              adb and USB issues

              scrcpy execute adb commands to initialize the connection with the device. If adb fails, then scrcpy will not work.

              This is typically not a bug in scrcpy, but a problem in your environment.

              adb not found

              You need adb accessible from your PATH.

              On Windows, the current directory is in your PATH, and adb.exe is included in the release, so it should work out-of-the-box.

              Device not detected

              ERROR: Could not find any ADB device
              +    
              Skip to content

              Scrcpy

              Here are the common reported problems and their status.

              If you encounter any error, the first step is to upgrade to the latest version.

              adb and USB issues

              scrcpy execute adb commands to initialize the connection with the device. If adb fails, then scrcpy will not work.

              This is typically not a bug in scrcpy, but a problem in your environment.

              adb not found

              You need adb accessible from your PATH.

              On Windows, the current directory is in your PATH, and adb.exe is included in the release, so it should work out-of-the-box.

              Device not detected

              ERROR: Could not find any ADB device
               

              Check that you correctly enabled adb debugging.

              Your device must be detected by adb:

              adb devices

              If your device is not detected, you may need some drivers (on Windows). There is a separate USB driver for Google devices.

              Device unauthorized

              ERROR: Device is unauthorized:
               ERROR:     -->   (usb)  0123456789abcdef          unauthorized
               ERROR: A popup should open on the device to request authorization.
              @@ -44,15 +44,15 @@ WARN: 'adb reverse' failed, fallback to 'adb forward'
               

              (or if only unrelated USB devices are detected), there might be drivers issues.

              Please read #3654, in particular this comment and the next one.

              Control issues

              Mouse and keyboard do not work

              On some devices, you may need to enable an option to allow simulating input. In developer options, enable:

              USB debugging (Security settings)Allow granting permissions and simulating input via USB debugging

              Rebooting the device is necessary once this option is set.

              Special characters do not work

              The default text injection method is limited to ASCII characters. A trick allows to also inject some accented characters, but that's all. See #37.

              To avoid the problem, change the keyboard mode to simulate a physical keyboard.

              Client issues

              Issue with Wayland

              By default, SDL uses x11 on Linux. The video driver can be changed via the SDL_VIDEODRIVER environment variable:

              bash
              export SDL_VIDEODRIVER=wayland
               scrcpy

              On some distributions (at least Fedora), the package libdecor must be installed manually.

              See issues #2554 and #2559.

              KWin compositor crashes

              On Plasma Desktop, compositor is disabled while scrcpy is running.

              As a workaround, disable "Block compositing".

              Crashes

              Exception

              If you get any exception related to MediaCodec:

              ERROR: Exception on thread Thread[main,5,main]
               java.lang.IllegalStateException
              -        at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)

              then try with another encoder.

              + at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)

              then try with another encoder.

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/index.html b/index.html index 820b5a176..6c6ea3650 100644 --- a/index.html +++ b/index.html @@ -6,14 +6,14 @@ Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
              Skip to content

              EscrcpyDisplay and control your Android device graphically with scrcpy

              Powered by electron.

              Escrcpy

              +

              Skip to content

              EscrcpyDisplay and control your Android device graphically with scrcpy

              Powered by electron.

              Escrcpy

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/reference/gnirehtet/api.html b/reference/gnirehtet/api.html index c0e875952..2079cd3f7 100644 --- a/reference/gnirehtet/api.html +++ b/reference/gnirehtet/api.html @@ -6,14 +6,14 @@ API | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
              Skip to content

              Gnirehtet API

              gnirehtet is a tool used to enable reverse tethering on Android devices, allowing the device to share the computer's internet connection via USB. Below is the detailed usage of each command along with examples.

              gnirehtet install [serial]

              Description: Install the client on the specified Android device and exit. If multiple devices are connected, the serial parameter must be provided.

              Example Usage:

              bash
              gnirehtet install

              If multiple devices are connected, specify the device:

              bash
              gnirehtet install 1234567890ABCDEF

              gnirehtet uninstall [serial]

              Description: Uninstall the client from the specified Android device and exit. If multiple devices are connected, the serial parameter must be provided.

              Example Usage:

              bash
              gnirehtet uninstall

              If multiple devices are connected, specify the device:

              bash
              gnirehtet uninstall 1234567890ABCDEF

              gnirehtet reinstall [serial]

              Description: Uninstall then install the client.

              Example Usage:

              bash
              gnirehtet reinstall

              If multiple devices are connected, specify the device:

              bash
              gnirehtet reinstall 1234567890ABCDEF

              gnirehtet run [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

              Description: Enable reverse tethering for exactly one device:

              • Install the client if necessary.
              • Start the client.
              • Start the relay server.
              • On Ctrl+C, stop both the relay server and the client.

              Example Usage:

              bash
              gnirehtet run

              Specify DNS:

              bash
              gnirehtet run -d 8.8.8.8,8.8.4.4

              Specify port:

              bash
              gnirehtet run -p 8080

              Specify route:

              bash
              gnirehtet run -r 192.168.1.0/24

              gnirehtet autorun [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

              Description: Enable reverse tethering for all devices:

              • Monitor devices and start clients (autostart).
              • Start the relay server.

              Example Usage:

              bash
              gnirehtet autorun

              Specify DNS:

              bash
              gnirehtet autorun -d 8.8.8.8,8.8.4.4

              Specify port:

              bash
              gnirehtet autorun -p 8080

              Specify route:

              bash
              gnirehtet autorun -r 192.168.1.0/24

              gnirehtet start [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

              Description: Start a client on the Android device and exit.

              • If -d is specified, the device will use the specified DNS servers.
              • If -r is specified, only reverse tether the specified routes.
              • If -p is specified, the relay server will listen on the specified port.

              Example Usage:

              bash
              gnirehtet start

              Specify device serial:

              bash
              gnirehtet start 1234567890ABCDEF

              Specify DNS:

              bash
              gnirehtet start -d 8.8.8.8,8.8.4.4

              Specify port:

              bash
              gnirehtet start -p 8080

              Specify route:

              bash
              gnirehtet start -r 192.168.1.0/24

              gnirehtet autostart [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

              Description: Listen for device connections and start a client on each detected device.

              • Accepts the same parameters as the start command (excluding the serial, which will be taken from the detected device).

              Example Usage:

              bash
              gnirehtet autostart

              Specify DNS:

              bash
              gnirehtet autostart -d 8.8.8.8,8.8.4.4

              Specify port:

              bash
              gnirehtet autostart -p 8080

              Specify route:

              bash
              gnirehtet autostart -r 192.168.1.0/24

              gnirehtet stop [serial]

              Description: Stop the client on the specified Android device and exit.

              Example Usage:

              bash
              gnirehtet stop

              Specify device serial:

              bash
              gnirehtet stop 1234567890ABCDEF

              gnirehtet restart [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

              Description: Stop the current client and restart it.

              Example Usage:

              bash
              gnirehtet restart

              Specify device serial:

              bash
              gnirehtet restart 1234567890ABCDEF

              Specify DNS:

              bash
              gnirehtet restart -d 8.8.8.8,8.8.4.4

              Specify port:

              bash
              gnirehtet restart -p 8080

              Specify route:

              bash
              gnirehtet restart -r 192.168.1.0/24

              gnirehtet tunnel [serial] [-p PORT]

              Description: Set up the adb reverse tunnel. If a device is unplugged and plugged back in while gnirehtet is active, resetting the tunnel will restore the connection.

              Example Usage:

              bash
              gnirehtet tunnel

              Specify device serial:

              bash
              gnirehtet tunnel 1234567890ABCDEF

              Specify port:

              bash
              gnirehtet tunnel -p 8080

              gnirehtet relay [-p PORT]

              Description: Start the relay server in the current terminal.

              Example Usage:

              bash
              gnirehtet relay

              Specify port:

              bash
              gnirehtet relay -p 8080

              +

              Skip to content

              Gnirehtet API

              gnirehtet is a tool used to enable reverse tethering on Android devices, allowing the device to share the computer's internet connection via USB. Below is the detailed usage of each command along with examples.

              gnirehtet install [serial]

              Description: Install the client on the specified Android device and exit. If multiple devices are connected, the serial parameter must be provided.

              Example Usage:

              bash
              gnirehtet install

              If multiple devices are connected, specify the device:

              bash
              gnirehtet install 1234567890ABCDEF

              gnirehtet uninstall [serial]

              Description: Uninstall the client from the specified Android device and exit. If multiple devices are connected, the serial parameter must be provided.

              Example Usage:

              bash
              gnirehtet uninstall

              If multiple devices are connected, specify the device:

              bash
              gnirehtet uninstall 1234567890ABCDEF

              gnirehtet reinstall [serial]

              Description: Uninstall then install the client.

              Example Usage:

              bash
              gnirehtet reinstall

              If multiple devices are connected, specify the device:

              bash
              gnirehtet reinstall 1234567890ABCDEF

              gnirehtet run [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

              Description: Enable reverse tethering for exactly one device:

              • Install the client if necessary.
              • Start the client.
              • Start the relay server.
              • On Ctrl+C, stop both the relay server and the client.

              Example Usage:

              bash
              gnirehtet run

              Specify DNS:

              bash
              gnirehtet run -d 8.8.8.8,8.8.4.4

              Specify port:

              bash
              gnirehtet run -p 8080

              Specify route:

              bash
              gnirehtet run -r 192.168.1.0/24

              gnirehtet autorun [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

              Description: Enable reverse tethering for all devices:

              • Monitor devices and start clients (autostart).
              • Start the relay server.

              Example Usage:

              bash
              gnirehtet autorun

              Specify DNS:

              bash
              gnirehtet autorun -d 8.8.8.8,8.8.4.4

              Specify port:

              bash
              gnirehtet autorun -p 8080

              Specify route:

              bash
              gnirehtet autorun -r 192.168.1.0/24

              gnirehtet start [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

              Description: Start a client on the Android device and exit.

              • If -d is specified, the device will use the specified DNS servers.
              • If -r is specified, only reverse tether the specified routes.
              • If -p is specified, the relay server will listen on the specified port.

              Example Usage:

              bash
              gnirehtet start

              Specify device serial:

              bash
              gnirehtet start 1234567890ABCDEF

              Specify DNS:

              bash
              gnirehtet start -d 8.8.8.8,8.8.4.4

              Specify port:

              bash
              gnirehtet start -p 8080

              Specify route:

              bash
              gnirehtet start -r 192.168.1.0/24

              gnirehtet autostart [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

              Description: Listen for device connections and start a client on each detected device.

              • Accepts the same parameters as the start command (excluding the serial, which will be taken from the detected device).

              Example Usage:

              bash
              gnirehtet autostart

              Specify DNS:

              bash
              gnirehtet autostart -d 8.8.8.8,8.8.4.4

              Specify port:

              bash
              gnirehtet autostart -p 8080

              Specify route:

              bash
              gnirehtet autostart -r 192.168.1.0/24

              gnirehtet stop [serial]

              Description: Stop the client on the specified Android device and exit.

              Example Usage:

              bash
              gnirehtet stop

              Specify device serial:

              bash
              gnirehtet stop 1234567890ABCDEF

              gnirehtet restart [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

              Description: Stop the current client and restart it.

              Example Usage:

              bash
              gnirehtet restart

              Specify device serial:

              bash
              gnirehtet restart 1234567890ABCDEF

              Specify DNS:

              bash
              gnirehtet restart -d 8.8.8.8,8.8.4.4

              Specify port:

              bash
              gnirehtet restart -p 8080

              Specify route:

              bash
              gnirehtet restart -r 192.168.1.0/24

              gnirehtet tunnel [serial] [-p PORT]

              Description: Set up the adb reverse tunnel. If a device is unplugged and plugged back in while gnirehtet is active, resetting the tunnel will restore the connection.

              Example Usage:

              bash
              gnirehtet tunnel

              Specify device serial:

              bash
              gnirehtet tunnel 1234567890ABCDEF

              Specify port:

              bash
              gnirehtet tunnel -p 8080

              gnirehtet relay [-p PORT]

              Description: Start the relay server in the current terminal.

              Example Usage:

              bash
              gnirehtet relay

              Specify port:

              bash
              gnirehtet relay -p 8080

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/reference/gnirehtet/index.html b/reference/gnirehtet/index.html index b5ef7892c..8cb4ab78b 100644 --- a/reference/gnirehtet/index.html +++ b/reference/gnirehtet/index.html @@ -6,14 +6,14 @@ Gnirehtet | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
              Skip to content

              IMPORTANT

              Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.

              Gnirehtet (v2.5.1)

              This project provides reverse tethering over adb for Android: it allows devices to use the internet connection of the computer they are plugged on. It does not require any root access (neither on the device nor on the computer). It works on GNU/Linux, Windows and Mac OS.

              Currently, it relays TCP and UDP over IPv4 traffic, but it does not support IPv6 (yet?).

              This project is not actively maintained anymore, only major blockers (like build issues) are fixed. It should still work, though.

              Flavors

              Two implementations of Gnirehtet are available:

              • one in Java;
              • one in Rust.

              Which one to choose?

              Use the Rust implementation. The native binary consumes less CPU and memory, and does not require a Java runtime environment.

              The relay server of Gnirehtet was initially only implemented in Java. As a benefit, the same "binary" runs on every platform having Java 8 runtime installed. It is still maintained to provide a working alternative in case of problems with the Rust version.

              Requirements

              The Android application requires at least API 21 (Android 5.0).

              For the Java version only, Java 8 (JRE) is required on your computer. On Debian-based distros, install the package openjdk-8-jre.

              adb

              You need a recent version of adb (where adb reverse is implemented, it works with 1.0.36).

              It is available in the Android SDK platform tools.

              On Debian-based distros, you can alternatively install the package android-tools-adb.

              On Windows, if you need adb only for this application, just download the platform-tools and extract the following files to the gnirehtet directory:

              • adb.exe
              • AdbWinApi.dll
              • AdbWinUsbApi.dll

              Make sure you enabled adb debugging on your device(s).

              Get the app

              Homebrew

              If you use Homebrew, getting up and running is very quick. To install the Rust version:

              brew install gnirehtet

              Download

              Download the latest release in the flavor you want.

              Rust

              Then extract it.

              The Linux and MacOS archives contain:

              • gnirehtet.apk
              • gnirehtet

              The Windows archive contains:

              • gnirehtet.apk
              • gnirehtet.exe
              • gnirehtet-run.cmd

              Java

              Then extract it. The archive contains:

              • gnirehtet.apk
              • gnirehtet.jar
              • gnirehtet
              • gnirehtet.cmd
              • gnirehtet-run.cmd

              Run (simple)

              Note: On Windows, replace ./gnirehtet by gnirehtet in the following commands.

              The application has no UI, and is intended to be controlled from the computer only.

              If you want to activate reverse tethering for exactly one device, just execute:

              shell
              ./gnirehtet run

              Reverse tethering remains active until you press Ctrl+C.

              On Windows, for convenience, you can double-click on gnirehtet-run.cmd instead (it just executes gnirehtet run, without requiring to open a terminal).

              The very first start should open a popup to request permission:

              request

              A "key" logo appears in the status bar whenever Gnirehtet is active:

              key

              Alternatively, you can enable reverse tethering for all connected devices (present and future) by calling:

              shell
              ./gnirehtet autorun

              Run

              You can execute the actions separately (it may be useful if you want to reverse tether several devices simultaneously).

              Start the relay server and keep it open:

              shell
              ./gnirehtet relay

              Install the apk on your Android device:

              shell
              ./gnirehtet install [serial]

              In another terminal, for each client, execute:

              shell
              ./gnirehtet start [serial]

              To stop a client:

              shell
              ./gnirehtet stop [serial]

              To reset the tunnel (useful to get the connection back when a device is unplugged and plugged back while gnirehtet is active):

              shell
              ./gnirehtet tunnel [serial]

              The serial parameter is required only if adb devices outputs more than one device.

              For advanced options, call ./gnirehtet without arguments to get more details.

              Run manually

              The gnirehtet program exposes a simple command-line interface that executes lower-level commands. You can call them manually instead.

              To start the relay server:

              shell
              ./gnirehtet relay

              To install the apk:

              shell
              adb install -r gnirehtet.apk

              To start a client:

              shell
              adb reverse localabstract:gnirehtet tcp:31416
              +    
              Skip to content

              IMPORTANT

              Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.

              Gnirehtet (v2.5.1)

              This project provides reverse tethering over adb for Android: it allows devices to use the internet connection of the computer they are plugged on. It does not require any root access (neither on the device nor on the computer). It works on GNU/Linux, Windows and Mac OS.

              Currently, it relays TCP and UDP over IPv4 traffic, but it does not support IPv6 (yet?).

              This project is not actively maintained anymore, only major blockers (like build issues) are fixed. It should still work, though.

              Flavors

              Two implementations of Gnirehtet are available:

              • one in Java;
              • one in Rust.

              Which one to choose?

              Use the Rust implementation. The native binary consumes less CPU and memory, and does not require a Java runtime environment.

              The relay server of Gnirehtet was initially only implemented in Java. As a benefit, the same "binary" runs on every platform having Java 8 runtime installed. It is still maintained to provide a working alternative in case of problems with the Rust version.

              Requirements

              The Android application requires at least API 21 (Android 5.0).

              For the Java version only, Java 8 (JRE) is required on your computer. On Debian-based distros, install the package openjdk-8-jre.

              adb

              You need a recent version of adb (where adb reverse is implemented, it works with 1.0.36).

              It is available in the Android SDK platform tools.

              On Debian-based distros, you can alternatively install the package android-tools-adb.

              On Windows, if you need adb only for this application, just download the platform-tools and extract the following files to the gnirehtet directory:

              • adb.exe
              • AdbWinApi.dll
              • AdbWinUsbApi.dll

              Make sure you enabled adb debugging on your device(s).

              Get the app

              Homebrew

              If you use Homebrew, getting up and running is very quick. To install the Rust version:

              brew install gnirehtet

              Download

              Download the latest release in the flavor you want.

              Rust

              Then extract it.

              The Linux and MacOS archives contain:

              • gnirehtet.apk
              • gnirehtet

              The Windows archive contains:

              • gnirehtet.apk
              • gnirehtet.exe
              • gnirehtet-run.cmd

              Java

              Then extract it. The archive contains:

              • gnirehtet.apk
              • gnirehtet.jar
              • gnirehtet
              • gnirehtet.cmd
              • gnirehtet-run.cmd

              Run (simple)

              Note: On Windows, replace ./gnirehtet by gnirehtet in the following commands.

              The application has no UI, and is intended to be controlled from the computer only.

              If you want to activate reverse tethering for exactly one device, just execute:

              shell
              ./gnirehtet run

              Reverse tethering remains active until you press Ctrl+C.

              On Windows, for convenience, you can double-click on gnirehtet-run.cmd instead (it just executes gnirehtet run, without requiring to open a terminal).

              The very first start should open a popup to request permission:

              request

              A "key" logo appears in the status bar whenever Gnirehtet is active:

              key

              Alternatively, you can enable reverse tethering for all connected devices (present and future) by calling:

              shell
              ./gnirehtet autorun

              Run

              You can execute the actions separately (it may be useful if you want to reverse tether several devices simultaneously).

              Start the relay server and keep it open:

              shell
              ./gnirehtet relay

              Install the apk on your Android device:

              shell
              ./gnirehtet install [serial]

              In another terminal, for each client, execute:

              shell
              ./gnirehtet start [serial]

              To stop a client:

              shell
              ./gnirehtet stop [serial]

              To reset the tunnel (useful to get the connection back when a device is unplugged and plugged back while gnirehtet is active):

              shell
              ./gnirehtet tunnel [serial]

              The serial parameter is required only if adb devices outputs more than one device.

              For advanced options, call ./gnirehtet without arguments to get more details.

              Run manually

              The gnirehtet program exposes a simple command-line interface that executes lower-level commands. You can call them manually instead.

              To start the relay server:

              shell
              ./gnirehtet relay

              To install the apk:

              shell
              adb install -r gnirehtet.apk

              To start a client:

              shell
              adb reverse localabstract:gnirehtet tcp:31416
               adb shell am start -a com.genymobile.gnirehtet.START \
                   -n com.genymobile.gnirehtet/.GnirehtetActivity

              To stop a client:

              shell
              adb shell am start -a com.genymobile.gnirehtet.STOP \
                   -n com.genymobile.gnirehtet/.GnirehtetActivity

              Environment variables

              ADB defines a custom path to the adb executable:

              shell
              ADB=/path/to/my/adb ./gnirehtet run

              GNIREHTET_APK defines a custom path to gnirehtet.apk:

              shell
              GNIREHTET_APK=/usr/share/gnirehtet/gnirehtet.apk ./gnirehtet run

              Why gnirehtet?

              rev <<< tethering
              @@ -37,15 +37,15 @@
               distributed under the License is distributed on an "AS IS" BASIS,
               WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
               See the License for the specific language governing permissions and
              -limitations under the License.

              Articles

              +limitations under the License.

              Articles

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/reference/index.html b/reference/index.html index 8fed597f9..8d58af2a6 100644 --- a/reference/index.html +++ b/reference/index.html @@ -6,14 +6,14 @@ Reference | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
              Skip to content

              Reference

              Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.

              +

              Skip to content

              Reference

              Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/reference/scrcpy/audio.html b/reference/scrcpy/audio.html index 8d88c4525..10c0d7363 100644 --- a/reference/scrcpy/audio.html +++ b/reference/scrcpy/audio.html @@ -6,14 +6,14 @@ Audio | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
              Skip to content

              Audio

              Audio forwarding is supported for devices with Android 11 or higher, and it is enabled by default:

              • For Android 12 or newer, it works out-of-the-box.
              • For Android 11, you'll need to ensure that the device screen is unlocked when starting scrcpy. A fake popup will briefly appear to make the system think that the shell app is in the foreground. Without this, audio capture will fail.
              • For Android 10 or earlier, audio cannot be captured and is automatically disabled.

              If audio capture fails, then mirroring continues with video only (since audio is enabled by default, it is not acceptable to make scrcpy fail if it is not available), unless --require-audio is set.

              No audio

              To disable audio:

              scrcpy --no-audio

              To disable only the audio playback, see no playback.

              Audio only

              To play audio only, disable video and control:

              bash
              scrcpy --no-video --no-control

              To play audio without a window:

              bash
              # --no-video and --no-control are implied by --no-window
              +    
              Skip to content

              Audio

              Audio forwarding is supported for devices with Android 11 or higher, and it is enabled by default:

              • For Android 12 or newer, it works out-of-the-box.
              • For Android 11, you'll need to ensure that the device screen is unlocked when starting scrcpy. A fake popup will briefly appear to make the system think that the shell app is in the foreground. Without this, audio capture will fail.
              • For Android 10 or earlier, audio cannot be captured and is automatically disabled.

              If audio capture fails, then mirroring continues with video only (since audio is enabled by default, it is not acceptable to make scrcpy fail if it is not available), unless --require-audio is set.

              No audio

              To disable audio:

              scrcpy --no-audio

              To disable only the audio playback, see no playback.

              Audio only

              To play audio only, disable video and control:

              bash
              scrcpy --no-video --no-control

              To play audio without a window:

              bash
              # --no-video and --no-control are implied by --no-window
               scrcpy --no-window
               # interrupt with Ctrl+C

              Without video, the audio latency is typically not critical, so it might be interesting to add buffering to minimize glitches:

              scrcpy --no-video --audio-buffer=200

              Source

              By default, the device audio output is forwarded.

              It is possible to capture the device microphone instead:

              scrcpy --audio-source=mic

              For example, to use the device as a dictaphone and record a capture directly on the computer:

              scrcpy --audio-source=mic --no-video --no-playback --record=file.opus

              Many sources are available:

              • output (default): forwards the whole audio output, and disables playback on the device (mapped to REMOTE_SUBMIX).
              • playback: captures the audio playback (Android apps can opt-out, so the whole output is not necessarily captured).
              • mic: captures the microphone (mapped to MIC).
              • mic-unprocessed: captures the microphone unprocessed (raw) sound (mapped to UNPROCESSED).
              • mic-camcorder: captures the microphone tuned for video recording, with the same orientation as the camera if available (mapped to CAMCORDER).
              • mic-voice-recognition: captures the microphone tuned for voice recognition (mapped to VOICE_RECOGNITION).
              • mic-voice-communication: captures the microphone tuned for voice communications (it will for instance take advantage of echo cancellation or automatic gain control if available) (mapped to VOICE_COMMUNICATION).
              • voice-call: captures voice call (mapped to VOICE_CALL).
              • voice-call-uplink: captures voice call uplink only (mapped to VOICE_UPLINK).
              • voice-call-downlink: captures voice call downlink only (mapped to VOICE_DOWNLINK).
              • voice-performance: captures audio meant to be processed for live performance (karaoke), includes both the microphone and the device playback (mapped to VOICE_PERFORMANCE).

              Duplication

              An alternative device audio capture method is also available (only for Android 13 and above):

              scrcpy --audio-source=playback

              This audio source supports keeping the audio playing on the device while mirroring, with --audio-dup:

              bash
              scrcpy --audio-source=playback --audio-dup
               # or simply:
              @@ -31,15 +31,15 @@
               scrcpy --audio-codec=raw

              In particular, if you get the following error:

              Failed to initialize audio/opus, error 0xfffffffe

              then your device has no Opus encoder: try scrcpy --audio-codec=aac.

              For advanced usage, to pass arbitrary parameters to the MediaFormat, check --audio-codec-options in the manpage or in scrcpy --help.

              For example, to change the FLAC compression level:

              bash
              scrcpy --audio-codec=flac --audio-codec-options=flac-compression-level=8

              Encoder

              Several encoders may be available on the device. They can be listed by:

              bash
              scrcpy --list-encoders

              To select a specific encoder:

              bash
              scrcpy --audio-codec=opus --audio-encoder='c2.android.opus.encoder'

              Bit rate

              The default audio bit rate is 128Kbps. To change it:

              bash
              scrcpy --audio-bit-rate=64K
               scrcpy --audio-bit-rate=64000  # equivalent

              This parameter does not apply to RAW audio codec (--audio-codec=raw).

              Buffering

              Audio buffering is unavoidable. It must be kept small enough so that the latency is acceptable, but large enough to minimize buffer underrun (causing audio glitches).

              The default buffer size is set to 50ms. It can be adjusted:

              bash
              scrcpy --audio-buffer=40   # smaller than default
               scrcpy --audio-buffer=100  # higher than default

              Note that this option changes the target buffering. It is possible that this target buffering might not be reached (on frequent buffer underflow typically).

              If you don't interact with the device (to watch a video for example), a higher latency (for both video and audio) might be preferable to avoid glitches and smooth the playback:

              scrcpy --video-buffer=200 --audio-buffer=200

              It is also possible to configure another audio buffer (the audio output buffer), by default set to 5ms. Don't change it, unless you get some robotic and glitchy sound:

              bash
              # Only if absolutely necessary
              -scrcpy --audio-output-buffer=10

              +scrcpy --audio-output-buffer=10

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/reference/scrcpy/build.html b/reference/scrcpy/build.html index 25f0f6bba..63efa5bdb 100644 --- a/reference/scrcpy/build.html +++ b/reference/scrcpy/build.html @@ -6,14 +6,14 @@ Build scrcpy | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
              Skip to content

              Build scrcpy

              Here are the instructions to build scrcpy (client and server).

              If you just want to build and install the latest release, follow the simplified process described in doc/linux.md.

              Branches

              There are two main branches:

              • master: contains the latest release. It is the home page of the project on GitHub.
              • dev: the current development branch. Every commit present in dev will be in the next release.

              If you want to contribute code, please base your commits on the latest dev branch.

              Requirements

              You need adb. It is available in the Android SDK platform tools, or packaged in your distribution (adb).

              On Windows, download the platform-tools and extract the following files to a directory accessible from your PATH:

              • adb.exe
              • AdbWinApi.dll
              • AdbWinUsbApi.dll

              It is also available in scrcpy releases.

              The client requires FFmpeg and LibSDL2. Just follow the instructions.

              System-specific steps

              Linux

              Install the required packages from your package manager.

              Debian/Ubuntu

              bash
              # runtime dependencies
              +    
              Skip to content

              Build scrcpy

              Here are the instructions to build scrcpy (client and server).

              If you just want to build and install the latest release, follow the simplified process described in doc/linux.md.

              Branches

              There are two main branches:

              • master: contains the latest release. It is the home page of the project on GitHub.
              • dev: the current development branch. Every commit present in dev will be in the next release.

              If you want to contribute code, please base your commits on the latest dev branch.

              Requirements

              You need adb. It is available in the Android SDK platform tools, or packaged in your distribution (adb).

              On Windows, download the platform-tools and extract the following files to a directory accessible from your PATH:

              • adb.exe
              • AdbWinApi.dll
              • AdbWinUsbApi.dll

              It is also available in scrcpy releases.

              The client requires FFmpeg and LibSDL2. Just follow the instructions.

              System-specific steps

              Linux

              Install the required packages from your package manager.

              Debian/Ubuntu

              bash
              # runtime dependencies
               sudo apt install ffmpeg libsdl2-2.0-0 adb libusb-1.0-0
               
               # client build dependencies
              @@ -72,15 +72,15 @@
               set ANDROID_SDK_ROOT=%LOCALAPPDATA%\Android\sdk

              Then, build:

              bash
              meson setup x --buildtype=release --strip -Db_lto=true
               ninja -Cx  # DO NOT RUN AS ROOT

              Note: ninja must be run as a non-root user (only ninja install must be run as root).

              Option 2: Use prebuilt server

              • scrcpy-server-v3.2SHA-256: b920e0ea01936bf2482f4ba2fa985c22c13c621999e3d33b45baa5acfc1ea3d0

              Download the prebuilt server somewhere, and specify its path during the Meson configuration:

              bash
              meson setup x --buildtype=release --strip -Db_lto=true \
                   -Dprebuilt_server=/path/to/scrcpy-server
              -ninja -Cx  # DO NOT RUN AS ROOT

              The server only works with a matching client version (this server works with the master branch).

              Run without installing:

              bash
              ./run x [options]

              Install

              After a successful build, you can install scrcpy on the system:

              bash
              sudo ninja -Cx install    # without sudo on Windows

              This installs several files:

              • /usr/local/bin/scrcpy (main app)
              • /usr/local/share/scrcpy/scrcpy-server (server to push to the device)
              • /usr/local/share/man/man1/scrcpy.1 (manpage)
              • /usr/local/share/icons/hicolor/256x256/apps/icon.png (app icon)
              • /usr/local/share/zsh/site-functions/_scrcpy (zsh completion)
              • /usr/local/share/bash-completion/completions/scrcpy (bash completion)

              You can then run scrcpy.

              Uninstall

              bash
              sudo ninja -Cx uninstall  # without sudo on Windows

              +ninja -Cx # DO NOT RUN AS ROOT

              The server only works with a matching client version (this server works with the master branch).

              Run without installing:

              bash
              ./run x [options]

              Install

              After a successful build, you can install scrcpy on the system:

              bash
              sudo ninja -Cx install    # without sudo on Windows

              This installs several files:

              • /usr/local/bin/scrcpy (main app)
              • /usr/local/share/scrcpy/scrcpy-server (server to push to the device)
              • /usr/local/share/man/man1/scrcpy.1 (manpage)
              • /usr/local/share/icons/hicolor/256x256/apps/icon.png (app icon)
              • /usr/local/share/zsh/site-functions/_scrcpy (zsh completion)
              • /usr/local/share/bash-completion/completions/scrcpy (bash completion)

              You can then run scrcpy.

              Uninstall

              bash
              sudo ninja -Cx uninstall  # without sudo on Windows

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

              + \ No newline at end of file diff --git a/reference/scrcpy/camera.html b/reference/scrcpy/camera.html index 5f360f220..5afe3f516 100644 --- a/reference/scrcpy/camera.html +++ b/reference/scrcpy/camera.html @@ -6,14 +6,14 @@ Camera | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
              Skip to content

              Camera

              Camera mirroring is supported for devices with Android 12 or higher.

              To capture the camera instead of the device screen:

              scrcpy --video-source=camera

              By default, it automatically switches audio source to microphone (as if --audio-source=mic were also passed).

              bash
              scrcpy --video-source=display  # default is --audio-source=output
              +    
              Skip to content

              Camera

              Camera mirroring is supported for devices with Android 12 or higher.

              To capture the camera instead of the device screen:

              scrcpy --video-source=camera

              By default, it automatically switches audio source to microphone (as if --audio-source=mic were also passed).

              bash
              scrcpy --video-source=display  # default is --audio-source=output
               scrcpy --video-source=camera   # default is --audio-source=mic
               scrcpy --video-source=display --audio-source=mic    # force display AND microphone
               scrcpy --video-source=camera --audio-source=output  # force camera AND device audio output

              Audio can be disabled:

              bash
              # audio not captured at all
              @@ -38,15 +38,15 @@
               scrcpy --video-source=camera --camera-ar=4:3          # use the greatest size with an aspect ratio of 4:3 (+/- 10%)
               scrcpy --video-source=camera --camera-ar=1.6          # use the greatest size with an aspect ratio of 1.6 (+/- 10%)
               scrcpy --video-source=camera --camera-ar=sensor       # use the greatest size with the aspect ratio of the camera sensor (+/- 10%)
              -scrcpy --video-source=camera -m1920 --camera-ar=16:9  # use the greatest width not above 1920 and the closest to 16:9 aspect ratio

              If --camera-size is specified, then -m/--max-size and --camera-ar are forbidden (the size is determined by the value given explicitly):

              bash
              scrcpy --video-source=camera --camera-size=1920x1080 -m3000  # error

              Rotation

              To rotate the captured video, use the video orientation option:

              scrcpy --video-source=camera --camera-size=1920x1080 --orientation=90

              Frame rate

              By default, camera is captured at Android's default frame rate (30 fps).

              To configure a different frame rate:

              scrcpy --video-source=camera --camera-fps=60

              High speed capture

              The Android camera API also supports a high speed capture mode.

              This mode is restricted to specific resolutions and frame rates, listed by --list-camera-sizes.

              scrcpy --video-source=camera --camera-size=1920x1080 --camera-fps=240

              Brace expansion tip

              All camera options start with --camera-, so if your shell supports it, you can benefit from brace expansion (for example, it is supported bash and zsh):

              bash
              scrcpy --video-source=camera --camera-{facing=back,ar=16:9,high-speed,fps=120}

              This will be expanded as:

              bash
              scrcpy --video-source=camera --camera-facing=back --camera-ar=16:9 --camera-high-speed --camera-fps=120

              Webcam

              Combined with the V4L2 feature on Linux, the Android device camera may be used as a webcam on the computer.

              +scrcpy --video-source=camera -m1920 --camera-ar=16:9 # use the greatest width not above 1920 and the closest to 16:9 aspect ratio

              If --camera-size is specified, then -m/--max-size and --camera-ar are forbidden (the size is determined by the value given explicitly):

              bash
              scrcpy --video-source=camera --camera-size=1920x1080 -m3000  # error

              Rotation

              To rotate the captured video, use the video orientation option:

              scrcpy --video-source=camera --camera-size=1920x1080 --orientation=90

              Frame rate

              By default, camera is captured at Android's default frame rate (30 fps).

              To configure a different frame rate:

              scrcpy --video-source=camera --camera-fps=60

              High speed capture

              The Android camera API also supports a high speed capture mode.

              This mode is restricted to specific resolutions and frame rates, listed by --list-camera-sizes.

              scrcpy --video-source=camera --camera-size=1920x1080 --camera-fps=240

              Brace expansion tip

              All camera options start with --camera-, so if your shell supports it, you can benefit from brace expansion (for example, it is supported bash and zsh):

              bash
              scrcpy --video-source=camera --camera-{facing=back,ar=16:9,high-speed,fps=120}

              This will be expanded as:

              bash
              scrcpy --video-source=camera --camera-facing=back --camera-ar=16:9 --camera-high-speed --camera-fps=120

              Webcam

              Combined with the V4L2 feature on Linux, the Android device camera may be used as a webcam on the computer.

              Views 0, Visitors 0
              TodayViews 0, TodayVisitors 0
              -

              - +

            + \ No newline at end of file diff --git a/reference/scrcpy/connection.html b/reference/scrcpy/connection.html index cd890afa0..6d69b5fe3 100644 --- a/reference/scrcpy/connection.html +++ b/reference/scrcpy/connection.html @@ -6,14 +6,14 @@ Connection | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
            Skip to content

            Connection

            Selection

            If exactly one device is connected (i.e. listed by adb devices), then it is automatically selected.

            However, if there are multiple devices connected, you must specify the one to use in one of 4 ways:

            • by its serial:

              bash
              scrcpy --serial=0123456789abcdef
              +    
              Skip to content

              Connection

              Selection

              If exactly one device is connected (i.e. listed by adb devices), then it is automatically selected.

              However, if there are multiple devices connected, you must specify the one to use in one of 4 ways:

              • by its serial:

                bash
                scrcpy --serial=0123456789abcdef
                 scrcpy -s 0123456789abcdef   # short version
                 
                 # the serial is the ip:port if connected over TCP/IP (same behavior as adb)
                @@ -35,15 +35,15 @@
                 scrcpy
                powershell
                # in PowerShell
                 $env:ANDROID_SERIAL = '0123456789abcdef'
                 scrcpy

                TCP/IP (wireless)

                Scrcpy uses adb to communicate with the device, and adb can connect to a device over TCP/IP. The device must be connected on the same network as the computer.

                Automatic

                An option --tcpip allows to configure the connection automatically. There are two variants.

                If adb TCP/IP mode is disabled on the device (or if you don't know the IP address), connect the device over USB, then run:

                bash
                scrcpy --tcpip   # without arguments

                It will automatically find the device IP address and adb port, enable TCP/IP mode if necessary, then connect to the device before starting.

                If the device (accessible at 192.168.1.1 in this example) already listens on a port (typically 5555) for incoming adb connections, then run:

                bash
                scrcpy --tcpip=192.168.1.1       # default port is 5555
                -scrcpy --tcpip=192.168.1.1:5555

                Prefix the address with a '+' to force a reconnection:

                bash
                scrcpy --tcpip=+192.168.1.1

                Manual

                Alternatively, it is possible to enable the TCP/IP connection manually using adb:

                1. Plug the device into a USB port on your computer.

                2. Connect the device to the same Wi-Fi network as your computer.

                3. Get your device IP address, in Settings → About phone → Status, or by executing this command:

                  bash
                  adb shell ip route | awk '{print $9}'
                4. Enable adb over TCP/IP on your device: adb tcpip 5555.

                5. Unplug your device.

                6. Connect to your device: adb connect DEVICE_IP:5555 (replace DEVICE_IP with the device IP address you found).

                7. Run scrcpy as usual.

                8. Run adb disconnect once you're done.

                Since Android 11, a wireless debugging option allows you to bypass having to physically connect your device to your computer.

                Autostart

                A small tool (by the scrcpy author) allows you to run arbitrary commands whenever a new Android device is connected: AutoAdb. It can be used to start scrcpy:

                bash
                autoadb scrcpy -s '{}'

              +scrcpy --tcpip=192.168.1.1:5555

              Prefix the address with a '+' to force a reconnection:

              bash
              scrcpy --tcpip=+192.168.1.1

              Manual

              Alternatively, it is possible to enable the TCP/IP connection manually using adb:

              1. Plug the device into a USB port on your computer.

              2. Connect the device to the same Wi-Fi network as your computer.

              3. Get your device IP address, in Settings → About phone → Status, or by executing this command:

                bash
                adb shell ip route | awk '{print $9}'
              4. Enable adb over TCP/IP on your device: adb tcpip 5555.

              5. Unplug your device.

              6. Connect to your device: adb connect DEVICE_IP:5555 (replace DEVICE_IP with the device IP address you found).

              7. Run scrcpy as usual.

              8. Run adb disconnect once you're done.

              Since Android 11, a wireless debugging option allows you to bypass having to physically connect your device to your computer.

              Autostart

              A small tool (by the scrcpy author) allows you to run arbitrary commands whenever a new Android device is connected: AutoAdb. It can be used to start scrcpy:

              bash
              autoadb scrcpy -s '{}'

            Views 0, Visitors 0
            TodayViews 0, TodayVisitors 0
            -

            - +

            + \ No newline at end of file diff --git a/reference/scrcpy/control.html b/reference/scrcpy/control.html index c0f78fe1c..c635dc666 100644 --- a/reference/scrcpy/control.html +++ b/reference/scrcpy/control.html @@ -6,14 +6,14 @@ Control | Escrcpy - + - + - + - + @@ -21,18 +21,18 @@ -
            Skip to content

            Control

            Read-only

            To disable controls (everything which can interact with the device: input keys, mouse events, drag&drop files):

            bash
            scrcpy --no-control
            +    
            Skip to content

            Control

            Read-only

            To disable controls (everything which can interact with the device: input keys, mouse events, drag&drop files):

            bash
            scrcpy --no-control
             scrcpy -n   # short version

            Keyboard and mouse

            Read keyboard and mouse.

            Control only

            To control the device without mirroring:

            bash
            scrcpy --no-video --no-audio

            By default, the mouse is disabled when video playback is turned off.

            To control the device using a relative mouse, enable UHID mouse mode:

            bash
            scrcpy --no-video --no-audio --mouse=uhid
             scrcpy --no-video --no-audio -M  # short version

            To also use a UHID keyboard, set it explicitly:

            bash
            scrcpy --no-video --no-audio --mouse=uhid --keyboard=uhid
            -scrcpy --no-video --no-audio -MK  # short version

            To use AOA instead (over USB only):

            bash
            scrcpy --no-video --no-audio --keyboard=aoa --mouse=aoa

            Copy-paste

            Any time the Android clipboard changes, it is automatically synchronized to the computer clipboard.

            Any Ctrl shortcut is forwarded to the device. In particular:

            • Ctrl+c typically copies
            • Ctrl+x typically cuts
            • Ctrl+v typically pastes (after computer-to-device clipboard synchronization)

            This typically works as you expect.

            The actual behavior depends on the active application though. For example, Termux sends SIGINT on Ctrl+c instead, and K-9 Mail composes a new message.

            To copy, cut and paste in such cases (but only supported on Android >= 7):

            • MOD+c injects COPY
            • MOD+x injects CUT
            • MOD+v injects PASTE (after computer-to-device clipboard synchronization)

            In addition, MOD+Shift+v injects the computer clipboard text as a sequence of key events. This is useful when the component does not accept text pasting (for example in Termux), but it can break non-ASCII content.

            WARNING: Pasting the computer clipboard to the device (either via Ctrl+v or MOD+v) copies the content into the Android clipboard. As a consequence, any Android application could read its content. You should avoid pasting sensitive content (like passwords) that way.

            Some Android devices do not behave as expected when setting the device clipboard programmatically. An option --legacy-paste is provided to change the behavior of Ctrl+v and MOD+v so that they also inject the computer clipboard text as a sequence of key events (the same way as MOD+Shift+v).

            To disable automatic clipboard synchronization, use --no-clipboard-autosync.

            Pinch-to-zoom, rotate and tilt simulation

            To simulate "pinch-to-zoom": Ctrl+click-and-move.

            More precisely, hold down Ctrl while pressing the left-click button. Until the left-click button is released, all mouse movements scale and rotate the content (if supported by the app) relative to the center of the screen.

            https://github.com/Genymobile/scrcpy/assets/543275/26c4a920-9805-43f1-8d4c-608752d04767

            To simulate a vertical tilt gesture: Shift+click-and-move-up-or-down.

            https://github.com/Genymobile/scrcpy/assets/543275/1e252341-4a90-4b29-9d11-9153b324669f

            Similarly, to simulate a horizontal tilt gesture: Ctrl+Shift+click-and-move-left-or-right.

            Technically, scrcpy generates additional touch events from a "virtual finger" at a location inverted through the center of the screen. When pressing Ctrl the x and y coordinates are inverted. Using Shift only inverts x, whereas using Ctrl+Shift only inverts y.

            This only works for the default mouse mode (--mouse=sdk).

            File drop

            Install APK

            To install an APK, drag & drop an APK file (ending with .apk) to the scrcpy window.

            There is no visual feedback, a log is printed to the console.

            Push file to device

            To push a file to /sdcard/Download/ on the device, drag & drop a (non-APK) file to the scrcpy window.

            There is no visual feedback, a log is printed to the console.

            The target directory can be changed on start:

            bash
            scrcpy --push-target=/sdcard/Movies/

            +scrcpy --no-video --no-audio -MK # short version

            To use AOA instead (over USB only):

            bash
            scrcpy --no-video --no-audio --keyboard=aoa --mouse=aoa

            Copy-paste

            Any time the Android clipboard changes, it is automatically synchronized to the computer clipboard.

            Any Ctrl shortcut is forwarded to the device. In particular:

            • Ctrl+c typically copies
            • Ctrl+x typically cuts
            • Ctrl+v typically pastes (after computer-to-device clipboard synchronization)

            This typically works as you expect.

            The actual behavior depends on the active application though. For example, Termux sends SIGINT on Ctrl+c instead, and K-9 Mail composes a new message.

            To copy, cut and paste in such cases (but only supported on Android >= 7):

            • MOD+c injects COPY
            • MOD+x injects CUT
            • MOD+v injects PASTE (after computer-to-device clipboard synchronization)

            In addition, MOD+Shift+v injects the computer clipboard text as a sequence of key events. This is useful when the component does not accept text pasting (for example in Termux), but it can break non-ASCII content.

            WARNING: Pasting the computer clipboard to the device (either via Ctrl+v or MOD+v) copies the content into the Android clipboard. As a consequence, any Android application could read its content. You should avoid pasting sensitive content (like passwords) that way.

            Some Android devices do not behave as expected when setting the device clipboard programmatically. An option --legacy-paste is provided to change the behavior of Ctrl+v and MOD+v so that they also inject the computer clipboard text as a sequence of key events (the same way as MOD+Shift+v).

            To disable automatic clipboard synchronization, use --no-clipboard-autosync.

            Pinch-to-zoom, rotate and tilt simulation

            To simulate "pinch-to-zoom": Ctrl+click-and-move.

            More precisely, hold down Ctrl while pressing the left-click button. Until the left-click button is released, all mouse movements scale and rotate the content (if supported by the app) relative to the center of the screen.

            https://github.com/Genymobile/scrcpy/assets/543275/26c4a920-9805-43f1-8d4c-608752d04767

            To simulate a vertical tilt gesture: Shift+click-and-move-up-or-down.

            https://github.com/Genymobile/scrcpy/assets/543275/1e252341-4a90-4b29-9d11-9153b324669f

            Similarly, to simulate a horizontal tilt gesture: Ctrl+Shift+click-and-move-left-or-right.

            Technically, scrcpy generates additional touch events from a "virtual finger" at a location inverted through the center of the screen. When pressing Ctrl the x and y coordinates are inverted. Using Shift only inverts x, whereas using Ctrl+Shift only inverts y.

            This only works for the default mouse mode (--mouse=sdk).

            File drop

            Install APK

            To install an APK, drag & drop an APK file (ending with .apk) to the scrcpy window.

            There is no visual feedback, a log is printed to the console.

            Push file to device

            To push a file to /sdcard/Download/ on the device, drag & drop a (non-APK) file to the scrcpy window.

            There is no visual feedback, a log is printed to the console.

            The target directory can be changed on start:

            bash
            scrcpy --push-target=/sdcard/Movies/

            Views 0, Visitors 0
            TodayViews 0, TodayVisitors 0
            -

            - +

        + \ No newline at end of file diff --git a/reference/scrcpy/develop.html b/reference/scrcpy/develop.html index 9d6fa4da4..411141893 100644 --- a/reference/scrcpy/develop.html +++ b/reference/scrcpy/develop.html @@ -6,14 +6,14 @@ scrcpy for developers | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
        Skip to content

        scrcpy for developers

        Overview

        This application is composed of two parts:

        • the server (scrcpy-server), to be executed on the device,
        • the client (the scrcpy binary), executed on the host computer.

        The client is responsible to push the server to the device and start its execution.

        The client and the server establish communication using separate sockets for video, audio and controls. Any of them may be disabled (but not all), so there are 1, 2 or 3 socket(s).

        The server initially sends the device name on the first socket (it is used for the scrcpy window title), then each socket is used for its own purpose. All reads and writes are performed from a dedicated thread for each socket, both on the client and on the server.

        If video is enabled, then the server sends a raw video stream (H.264 by default) of the device screen, with some additional headers for each packet. The client decodes the video frames, and displays them as soon as possible, without buffering (unless --video-buffer=delay is specified) to minimize latency. The client is not aware of the device rotation (which is handled by the server), it just knows the dimensions of the video frames it receives.

        Similarly, if audio is enabled, then the server sends a raw audio stream (OPUS by default) of the device audio output (or the microphone if --audio-source=mic is specified), with some additional headers for each packet. The client decodes the stream, attempts to keep a minimal latency by maintaining an average buffering. The blog post of the scrcpy v2.0 release gives more details about the audio feature.

        If control is enabled, then the client captures relevant keyboard and mouse events, that it transmits to the server, which injects them to the device. This is the only socket which is used in both direction: input events are sent from the client to the device, and when the device clipboard changes, the new content is sent from the device to the client to support seamless copy-paste.

        Note that the client-server roles are expressed at the application level:

        • the server serves video and audio streams, and handle requests from the client,
        • the client controls the device through the server.

        However, by default (when --force-adb-forward is not set), the roles are reversed at the network level:

        • the client opens a server socket and listen on a port before starting the server,
        • the server connects to the client.

        This role inversion guarantees that the connection will not fail due to race conditions without polling.

        Server

        Privileges

        Capturing the screen requires some privileges, which are granted to shell.

        The server is a Java application (with a public static void main(String... args) method), compiled against the Android framework, and executed as shell on the Android device.

        To run such a Java application, the classes must be dexed (typically, to classes.dex). If my.package.MainClass is the main class, compiled to classes.dex, pushed to the device in /data/local/tmp, then it can be run with:

        adb shell CLASSPATH=/data/local/tmp/classes.dex app_process / my.package.MainClass
        +    
        Skip to content

        scrcpy for developers

        Overview

        This application is composed of two parts:

        • the server (scrcpy-server), to be executed on the device,
        • the client (the scrcpy binary), executed on the host computer.

        The client is responsible to push the server to the device and start its execution.

        The client and the server establish communication using separate sockets for video, audio and controls. Any of them may be disabled (but not all), so there are 1, 2 or 3 socket(s).

        The server initially sends the device name on the first socket (it is used for the scrcpy window title), then each socket is used for its own purpose. All reads and writes are performed from a dedicated thread for each socket, both on the client and on the server.

        If video is enabled, then the server sends a raw video stream (H.264 by default) of the device screen, with some additional headers for each packet. The client decodes the video frames, and displays them as soon as possible, without buffering (unless --video-buffer=delay is specified) to minimize latency. The client is not aware of the device rotation (which is handled by the server), it just knows the dimensions of the video frames it receives.

        Similarly, if audio is enabled, then the server sends a raw audio stream (OPUS by default) of the device audio output (or the microphone if --audio-source=mic is specified), with some additional headers for each packet. The client decodes the stream, attempts to keep a minimal latency by maintaining an average buffering. The blog post of the scrcpy v2.0 release gives more details about the audio feature.

        If control is enabled, then the client captures relevant keyboard and mouse events, that it transmits to the server, which injects them to the device. This is the only socket which is used in both direction: input events are sent from the client to the device, and when the device clipboard changes, the new content is sent from the device to the client to support seamless copy-paste.

        Note that the client-server roles are expressed at the application level:

        • the server serves video and audio streams, and handle requests from the client,
        • the client controls the device through the server.

        However, by default (when --force-adb-forward is not set), the roles are reversed at the network level:

        • the client opens a server socket and listen on a port before starting the server,
        • the server connects to the client.

        This role inversion guarantees that the connection will not fail due to race conditions without polling.

        Server

        Privileges

        Capturing the screen requires some privileges, which are granted to shell.

        The server is a Java application (with a public static void main(String... args) method), compiled against the Android framework, and executed as shell on the Android device.

        To run such a Java application, the classes must be dexed (typically, to classes.dex). If my.package.MainClass is the main class, compiled to classes.dex, pushed to the device in /data/local/tmp, then it can be run with:

        adb shell CLASSPATH=/data/local/tmp/classes.dex app_process / my.package.MainClass
         

        The path /data/local/tmp is a good candidate to push the server, since it's readable and writable by shell, but not world-writable, so a malicious application may not replace the server just before the client executes it.

        Instead of a raw dex file, app_process accepts a jar containing classes.dex (e.g. an APK). For simplicity, and to benefit from the gradle build system, the server is built to an (unsigned) APK (renamed to scrcpy-server.jar).

        Hidden methods

        Although compiled against the Android framework, hidden methods and classes are not directly accessible (and they may differ from one Android version to another).

        They can be called using reflection though. The communication with hidden components is provided by wrappers classes and aidl.

        Execution

        The server is started by the client basically by executing the following commands:

        bash
        adb push scrcpy-server /data/local/tmp/scrcpy-server.jar
         adb forward tcp:27183 localabstract:scrcpy
         adb shell CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process / com.genymobile.scrcpy.Server 2.1

        The first argument (2.1 in the example) is the client scrcpy version. The server fails if the client and the server do not have the exact same version. The protocol between the client and the server may change from version to version (see protocol below), and there is no backward or forward compatibility (there is no point to use different client and server versions). This check allows to detect misconfiguration (running an older or newer server by mistake).

        It is followed by any number of arguments, in the form of key=value pairs. Their order is irrelevant. The possible keys and associated value types can be found in the server and client code.

        For example, if we execute scrcpy -m1920 --no-audio, then the server execution will look like this:

        bash
        # scid is a random number to identify different clients running on the same device
        @@ -62,15 +62,15 @@
             raw_stream=true max_size=1920

        As soon as a client connects over TCP on port 1234, the device will start streaming the video. For example, VLC can play the video (although you will experience a very high latency, more details here):

        vlc -Idummy --demux=h264 --network-caching=0 tcp://localhost:1234

        Hack

        For more details, go read the code!

        If you find a bug, or have an awesome idea to implement, please discuss and contribute 😉

        Debug the server

        The server is pushed to the device by the client on startup.

        To debug it, enable the server debugger during configuration:

        bash
        meson setup x -Dserver_debugger=true
         # or, if x is already configured
         meson configure x -Dserver_debugger=true

        Then recompile, and run scrcpy.

        For Android < 11, it will start a debugger on port 5005 on the device and wait: Redirect that port to the computer:

        bash
        adb forward tcp:5005 tcp:5005

        For Android >= 11, first find the listening port:

        bash
        adb jdwp
        -# press Ctrl+C to interrupt

        Then redirect the resulting PID:

        bash
        adb forward tcp:5005 jdwp:XXXX  # replace XXXX

        In Android Studio, Run > Debug > Edit configurations... On the left, click on +, Remote, and fill the form:

        • Host: localhost
        • Port: 5005

        Then click on Debug.

        +# press Ctrl+C to interrupt

        Then redirect the resulting PID:

        bash
        adb forward tcp:5005 jdwp:XXXX  # replace XXXX

        In Android Studio, Run > Debug > Edit configurations... On the left, click on +, Remote, and fill the form:

        • Host: localhost
        • Port: 5005

        Then click on Debug.

        Views 0, Visitors 0
        TodayViews 0, TodayVisitors 0
        -

        - +

        + \ No newline at end of file diff --git a/reference/scrcpy/device.html b/reference/scrcpy/device.html index f3057f282..a6149684a 100644 --- a/reference/scrcpy/device.html +++ b/reference/scrcpy/device.html @@ -6,14 +6,14 @@ Device | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
        Skip to content

        Device

        Some command line arguments perform actions on the device itself while scrcpy is running.

        Stay awake

        To prevent the device from sleeping after a delay when the device is plugged in:

        bash
        scrcpy --stay-awake
        +    
        Skip to content

        Device

        Some command line arguments perform actions on the device itself while scrcpy is running.

        Stay awake

        To prevent the device from sleeping after a delay when the device is plugged in:

        bash
        scrcpy --stay-awake
         scrcpy -w

        The initial state is restored when scrcpy is closed.

        If the device is not plugged in (i.e. only connected over TCP/IP), --stay-awake has no effect (this is the Android behavior).

        This changes the value of stay_on_while_plugged_in, setting which can be changed manually:

        bash
        # get the current show_touches value
         adb shell settings get global stay_on_while_plugged_in
         # enable for AC/USB/wireless chargers
        @@ -41,15 +41,15 @@
         # enable show_touches
         adb shell settings put system show_touches 1
         # disable show_touches
        -adb shell settings put system show_touches 0

        Power off on close

        To turn the device screen off when closing scrcpy:

        bash
        scrcpy --power-off-on-close

        Power on on start

        By default, on start, the device is powered on. To prevent this behavior:

        bash
        scrcpy --no-power-on

        Start Android app

        To list the Android apps installed on the device:

        bash
        scrcpy --list-apps

        An app, selected by its package name, can be launched on start:

        scrcpy --start-app=org.mozilla.firefox

        This feature can be used to run an app in a virtual display:

        scrcpy --new-display=1920x1080 --start-app=org.videolan.vlc

        The app can be optionally forced-stop before being started, by adding a + prefix:

        scrcpy --start-app=+org.mozilla.firefox

        For convenience, it is also possible to select an app by its name, by adding a ? prefix:

        scrcpy --start-app=?firefox

        But retrieving app names may take some time (sometimes several seconds), so passing the package name is recommended.

        The + and ? prefixes can be combined (in that order):

        scrcpy --start-app=+?firefox

        +adb shell settings put system show_touches 0

        Power off on close

        To turn the device screen off when closing scrcpy:

        bash
        scrcpy --power-off-on-close

        Power on on start

        By default, on start, the device is powered on. To prevent this behavior:

        bash
        scrcpy --no-power-on

        Start Android app

        To list the Android apps installed on the device:

        bash
        scrcpy --list-apps

        An app, selected by its package name, can be launched on start:

        scrcpy --start-app=org.mozilla.firefox

        This feature can be used to run an app in a virtual display:

        scrcpy --new-display=1920x1080 --start-app=org.videolan.vlc

        The app can be optionally forced-stop before being started, by adding a + prefix:

        scrcpy --start-app=+org.mozilla.firefox

        For convenience, it is also possible to select an app by its name, by adding a ? prefix:

        scrcpy --start-app=?firefox

        But retrieving app names may take some time (sometimes several seconds), so passing the package name is recommended.

        The + and ? prefixes can be combined (in that order):

        scrcpy --start-app=+?firefox

        Views 0, Visitors 0
        TodayViews 0, TodayVisitors 0
        -

        - +

        + \ No newline at end of file diff --git a/reference/scrcpy/gamepad.html b/reference/scrcpy/gamepad.html index bc7ba585d..1f89c80ea 100644 --- a/reference/scrcpy/gamepad.html +++ b/reference/scrcpy/gamepad.html @@ -6,14 +6,14 @@ Gamepad | Escrcpy - + - + - + - + @@ -21,16 +21,16 @@ -
        Skip to content

        Gamepad

        Several gamepad input modes are available:

        • --gamepad=disabled (default)
        • --gamepad=uhid (or -G): simulates physical HID gamepads using the UHID kernel module on the device
        • --gamepad=aoa: simulates physical HID gamepads using the AOAv2 protocol

        Physical gamepad simulation

        Two modes allow to simulate physical HID gamepads on the device, one for each physical gamepad plugged into the computer.

        UHID

        This mode simulates physical HID gamepads using the UHID kernel module on the device.

        To enable UHID gamepads, use:

        bash
        scrcpy --gamepad=uhid
        -scrcpy -G  # short version

        Note: UHID may not work on old Android versions due to permission errors.

        AOA

        This mode simulates physical HID gamepads using the AOAv2 protocol.

        To enable AOA gamepads, use:

        bash
        scrcpy --gamepad=aoa

        Contrary to the other mode, it works at the USB level directly (so it only works over USB).

        It does not use the scrcpy server, and does not require adb (USB debugging). Therefore, it is possible to control the device (but not mirror) even with USB debugging disabled (see OTG).

        Note: For some reason, in this mode, Android detects multiple physical gamepads as a single misbehaving one. Use UHID if you need multiple gamepads.

        Note: On Windows, it may only work in OTG mode, not while mirroring (it is not possible to open a USB device if it is already open by another process like the adb daemon).

        +

        Skip to content

        Gamepad

        Several gamepad input modes are available:

        • --gamepad=disabled (default)
        • --gamepad=uhid (or -G): simulates physical HID gamepads using the UHID kernel module on the device
        • --gamepad=aoa: simulates physical HID gamepads using the AOAv2 protocol

        Physical gamepad simulation

        Two modes allow to simulate physical HID gamepads on the device, one for each physical gamepad plugged into the computer.

        UHID

        This mode simulates physical HID gamepads using the UHID kernel module on the device.

        To enable UHID gamepads, use:

        bash
        scrcpy --gamepad=uhid
        +scrcpy -G  # short version

        Note: UHID may not work on old Android versions due to permission errors.

        AOA

        This mode simulates physical HID gamepads using the AOAv2 protocol.

        To enable AOA gamepads, use:

        bash
        scrcpy --gamepad=aoa

        Contrary to the other mode, it works at the USB level directly (so it only works over USB).

        It does not use the scrcpy server, and does not require adb (USB debugging). Therefore, it is possible to control the device (but not mirror) even with USB debugging disabled (see OTG).

        Note: For some reason, in this mode, Android detects multiple physical gamepads as a single misbehaving one. Use UHID if you need multiple gamepads.

        Note: On Windows, it may only work in OTG mode, not while mirroring (it is not possible to open a USB device if it is already open by another process like the adb daemon).

        Views 0, Visitors 0
        TodayViews 0, TodayVisitors 0
        -

        - +

        + \ No newline at end of file diff --git a/reference/scrcpy/index.html b/reference/scrcpy/index.html index 5538f8cd5..328f7f87c 100644 --- a/reference/scrcpy/index.html +++ b/reference/scrcpy/index.html @@ -6,14 +6,14 @@ Scrcpy | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
        Skip to content

        IMPORTANT

        Escrcpy is built on the following open-source projects. The relevant content is provided as is for user reference and will be updated periodically.

        scrcpy (v3.2)

        scrcpy

        pronounced "screen copy"

        This application mirrors Android devices (video and audio) connected via USB or TCP/IP and allows control using the computer's keyboard and mouse. It does not require root access or an app installed on the device. It works on Linux, Windows, and macOS.

        screenshot

        It focuses on:

        • lightness: native, displays only the device screen
        • performance: 30~120fps, depending on the device
        • quality: 1920×1080 or above
        • low latency: 35~70ms
        • low startup time: ~1 second to display the first image
        • non-intrusiveness: nothing is left installed on the Android device
        • user benefits: no account, no ads, no internet required
        • freedom: free and open source software

        Its features include:

        Prerequisites

        The Android device requires at least API 21 (Android 5.0).

        Audio forwarding is supported for API >= 30 (Android 11+).

        Make sure you enabled USB debugging on your device(s).

        On some devices (especially Xiaomi), you might get the following error:

        java.lang.SecurityException: Injecting input events requires the caller (or the source of the instrumentation, if any) to have the INJECT_EVENTS permission.

        In that case, you need to enable an additional option USB debugging (Security Settings) (this is an item different from USB debugging) to control it using a keyboard and mouse. Rebooting the device is necessary once this option is set.

        Note that USB debugging is not required to run scrcpy in OTG mode.

        Get the app

        Must-know tips

        Usage examples

        There are a lot of options, documented in separate pages. Here are just some common examples.

        Views 0, Visitors 0
        TodayViews 0, TodayVisitors 0
        -

        - +

        + \ No newline at end of file diff --git a/reference/scrcpy/keyboard.html b/reference/scrcpy/keyboard.html index 8b2a336d0..3073de54d 100644 --- a/reference/scrcpy/keyboard.html +++ b/reference/scrcpy/keyboard.html @@ -6,14 +6,14 @@ Keyboard | Escrcpy - + - + - + - + @@ -21,16 +21,16 @@ -
        Skip to content

        Keyboard

        Several keyboard input modes are available:

        • --keyboard=sdk (default)
        • --keyboard=uhid (or -K): simulates a physical HID keyboard using the UHID kernel module on the device
        • --keyboard=aoa: simulates a physical HID keyboard using the AOAv2 protocol
        • --keyboard=disabled

        By default, sdk is used, but if you use scrcpy regularly, it is recommended to use uhid and configure the keyboard layout once and for all.

        SDK keyboard

        In this mode (--keyboard=sdk, or if the parameter is omitted), keyboard input events are injected at the Android API level. It works everywhere, but it is limited to ASCII and some other characters.

        Note that on some devices, an additional option must be enabled in developer options for this keyboard mode to work. See prerequisites.

        Additional parameters (specific to --keyboard=sdk) described below allow to customize the behavior.

        Text injection preference

        Two kinds of events are generated when typing text:

        • key events, signaling that a key is pressed or released;
        • text events, signaling that a text has been entered.

        By default, numbers and "special characters" are inserted using text events, but letters are injected using key events, so that the keyboard behaves as expected in games (typically for WASD keys).

        But this may cause issues. If you encounter such a problem, you can inject letters as text (or just switch to UHID):

        bash
        scrcpy --prefer-text

        (but this will break keyboard behavior in games)

        On the contrary, you could force to always inject raw key events:

        bash
        scrcpy --raw-key-events

        Key repeat

        By default, holding a key down generates repeated key events. Ths can cause performance problems in some games, where these events are useless anyway.

        To avoid forwarding repeated key events:

        bash
        scrcpy --no-key-repeat

        Physical keyboard simulation

        Two modes allow to simulate a physical HID keyboard on the device.

        To work properly, it is necessary to configure (once and for all) the keyboard layout on the device to match that of the computer.

        The configuration page can be opened in one of the following ways:

        • from the scrcpy window (when uhid or aoa is used), by pressing MOD+k (see shortcuts)
        • from the device, in Settings → System → Languages and input → Physical devices
        • from a terminal on the computer, by executing adb shell am start -a android.settings.HARD_KEYBOARD_SETTINGS

        From this configuration page, it is also possible to enable or disable on-screen keyboard.

        UHID

        This mode simulates a physical HID keyboard using the UHID kernel module on the device.

        To enable UHID keyboard, use:

        bash
        scrcpy --keyboard=uhid
        -scrcpy -K  # short version

        Once the keyboard layout is configured (see above), it is the best mode for using the keyboard while mirroring:

        • it works for all characters and IME (contrary to --keyboard=sdk)
        • the on-screen keyboard can be disabled (contrary to --keyboard=sdk)
        • it works over TCP/IP (wirelessly) (contrary to --keyboard=aoa)
        • there are no issues on Windows (contrary to --keyboard=aoa)

        One drawback is that it may not work on old Android versions due to permission errors.

        AOA

        This mode simulates a physical HID keyboard using the AOAv2 protocol.

        To enable AOA keyboard, use:

        bash
        scrcpy --keyboard=aoa

        Contrary to the other modes, it works at the USB level directly (so it only works over USB).

        It does not use the scrcpy server, and does not require adb (USB debugging). Therefore, it is possible to control the device (but not mirror) even with USB debugging disabled (see OTG).

        Note: On Windows, it may only work in OTG mode, not while mirroring (it is not possible to open a USB device if it is already open by another process like the adb daemon).

        +

        Skip to content

        Keyboard

        Several keyboard input modes are available:

        • --keyboard=sdk (default)
        • --keyboard=uhid (or -K): simulates a physical HID keyboard using the UHID kernel module on the device
        • --keyboard=aoa: simulates a physical HID keyboard using the AOAv2 protocol
        • --keyboard=disabled

        By default, sdk is used, but if you use scrcpy regularly, it is recommended to use uhid and configure the keyboard layout once and for all.

        SDK keyboard

        In this mode (--keyboard=sdk, or if the parameter is omitted), keyboard input events are injected at the Android API level. It works everywhere, but it is limited to ASCII and some other characters.

        Note that on some devices, an additional option must be enabled in developer options for this keyboard mode to work. See prerequisites.

        Additional parameters (specific to --keyboard=sdk) described below allow to customize the behavior.

        Text injection preference

        Two kinds of events are generated when typing text:

        • key events, signaling that a key is pressed or released;
        • text events, signaling that a text has been entered.

        By default, numbers and "special characters" are inserted using text events, but letters are injected using key events, so that the keyboard behaves as expected in games (typically for WASD keys).

        But this may cause issues. If you encounter such a problem, you can inject letters as text (or just switch to UHID):

        bash
        scrcpy --prefer-text

        (but this will break keyboard behavior in games)

        On the contrary, you could force to always inject raw key events:

        bash
        scrcpy --raw-key-events

        Key repeat

        By default, holding a key down generates repeated key events. Ths can cause performance problems in some games, where these events are useless anyway.

        To avoid forwarding repeated key events:

        bash
        scrcpy --no-key-repeat

        Physical keyboard simulation

        Two modes allow to simulate a physical HID keyboard on the device.

        To work properly, it is necessary to configure (once and for all) the keyboard layout on the device to match that of the computer.

        The configuration page can be opened in one of the following ways:

        • from the scrcpy window (when uhid or aoa is used), by pressing MOD+k (see shortcuts)
        • from the device, in Settings → System → Languages and input → Physical devices
        • from a terminal on the computer, by executing adb shell am start -a android.settings.HARD_KEYBOARD_SETTINGS

        From this configuration page, it is also possible to enable or disable on-screen keyboard.

        UHID

        This mode simulates a physical HID keyboard using the UHID kernel module on the device.

        To enable UHID keyboard, use:

        bash
        scrcpy --keyboard=uhid
        +scrcpy -K  # short version

        Once the keyboard layout is configured (see above), it is the best mode for using the keyboard while mirroring:

        • it works for all characters and IME (contrary to --keyboard=sdk)
        • the on-screen keyboard can be disabled (contrary to --keyboard=sdk)
        • it works over TCP/IP (wirelessly) (contrary to --keyboard=aoa)
        • there are no issues on Windows (contrary to --keyboard=aoa)

        One drawback is that it may not work on old Android versions due to permission errors.

        AOA

        This mode simulates a physical HID keyboard using the AOAv2 protocol.

        To enable AOA keyboard, use:

        bash
        scrcpy --keyboard=aoa

        Contrary to the other modes, it works at the USB level directly (so it only works over USB).

        It does not use the scrcpy server, and does not require adb (USB debugging). Therefore, it is possible to control the device (but not mirror) even with USB debugging disabled (see OTG).

        Note: On Windows, it may only work in OTG mode, not while mirroring (it is not possible to open a USB device if it is already open by another process like the adb daemon).

        Views 0, Visitors 0
        TodayViews 0, TodayVisitors 0
        -

        - +

        + \ No newline at end of file diff --git a/reference/scrcpy/linux.html b/reference/scrcpy/linux.html index 2084bb2d9..a6d8bf89e 100644 --- a/reference/scrcpy/linux.html +++ b/reference/scrcpy/linux.html @@ -6,14 +6,14 @@ On Linux | Escrcpy - + - + - + - + @@ -21,22 +21,22 @@ -
        Skip to content

        On Linux

        Install

        From the official release

        Download a static build of the latest release:

        and extract it.

        Static builds of scrcpy for Linux are still experimental.

        From your package manager

        Packaging status

        Scrcpy is packaged in several distributions and package managers:

        • Debian/Ubuntu: apt install scrcpy (obsolete version)
        • Arch Linux: pacman -S scrcpy
        • Fedora: dnf copr enable zeno/scrcpy && dnf install scrcpy
        • Gentoo: emerge scrcpy
        • Snap: snap install scrcpy
        • … (see repology)

        From an install script

        To install the latest release from master, follow this simplified process.

        First, you need to install the required packages:

        bash
        # for Debian/Ubuntu
        +    
        Skip to content

        On Linux

        Install

        From the official release

        Download a static build of the latest release:

        and extract it.

        Static builds of scrcpy for Linux are still experimental.

        From your package manager

        Packaging status

        Scrcpy is packaged in several distributions and package managers:

        • Debian/Ubuntu: apt install scrcpy (obsolete version)
        • Arch Linux: pacman -S scrcpy
        • Fedora: dnf copr enable zeno/scrcpy && dnf install scrcpy
        • Gentoo: emerge scrcpy
        • Snap: snap install scrcpy
        • … (see repology)

        From an install script

        To install the latest release from master, follow this simplified process.

        First, you need to install the required packages:

        bash
        # for Debian/Ubuntu
         sudo apt install ffmpeg libsdl2-2.0-0 adb wget \
                          gcc git pkg-config meson ninja-build libsdl2-dev \
                          libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev \
                          libswresample-dev libusb-1.0-0 libusb-1.0-0-dev

        Then clone the repo and execute the installation script (source):

        bash
        git clone https://github.com/Genymobile/scrcpy
         cd scrcpy
         ./install_release.sh

        When a new release is out, update the repo and reinstall:

        bash
        git pull
        -./install_release.sh

        To uninstall:

        bash
        sudo ninja -Cbuild-auto uninstall

        Note that this simplified process only works for released versions (it downloads a prebuilt server binary), so for example you can't use it for testing the development branch (dev).

        See build.md to build and install the app manually.

        Run

        Make sure that your device meets the prerequisites.

        Once installed, run from a terminal:

        bash
        scrcpy

        or with arguments (here to disable audio and record to file.mkv):

        bash
        scrcpy --no-audio --record=file.mkv

        Documentation for command line arguments is available:

        • man scrcpy
        • scrcpy --help
        • on github

        +./install_release.sh

        To uninstall:

        bash
        sudo ninja -Cbuild-auto uninstall

        Note that this simplified process only works for released versions (it downloads a prebuilt server binary), so for example you can't use it for testing the development branch (dev).

        See build.md to build and install the app manually.

        Run

        Make sure that your device meets the prerequisites.

        Once installed, run from a terminal:

        bash
        scrcpy

        or with arguments (here to disable audio and record to file.mkv):

        bash
        scrcpy --no-audio --record=file.mkv

        Documentation for command line arguments is available:

        • man scrcpy
        • scrcpy --help
        • on github

        Views 0, Visitors 0
        TodayViews 0, TodayVisitors 0
        -

        - +

        + \ No newline at end of file diff --git a/reference/scrcpy/macos.html b/reference/scrcpy/macos.html index bfb51e7a8..a23532acb 100644 --- a/reference/scrcpy/macos.html +++ b/reference/scrcpy/macos.html @@ -6,14 +6,14 @@ On macOS | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
        Skip to content

        On macOS

        Install

        From the official release

        Download a static build of the latest release:

        and extract it.

        Static builds of scrcpy for macOS are still experimental.

        From a package manager

        Scrcpy is available in Homebrew:

        bash
        brew install scrcpy

        You need adb, accessible from your PATH. If you don't have it yet:

        bash
        brew install --cask android-platform-tools

        Alternatively, Scrcpy is also available in MacPorts, which sets up adb for you:

        bash
        sudo port install scrcpy

        See build.md to build and install the app manually.

        Run

        Make sure that your device meets the prerequisites.

        Once installed, run from a terminal:

        bash
        scrcpy

        or with arguments (here to disable audio and record to file.mkv):

        bash
        scrcpy --no-audio --record=file.mkv

        Documentation for command line arguments is available:

        • man scrcpy
        • scrcpy --help
        • on github

        +

        Skip to content

        On macOS

        Install

        From the official release

        Download a static build of the latest release:

        and extract it.

        Static builds of scrcpy for macOS are still experimental.

        From a package manager

        Scrcpy is available in Homebrew:

        bash
        brew install scrcpy

        You need adb, accessible from your PATH. If you don't have it yet:

        bash
        brew install --cask android-platform-tools

        Alternatively, Scrcpy is also available in MacPorts, which sets up adb for you:

        bash
        sudo port install scrcpy

        See build.md to build and install the app manually.

        Run

        Make sure that your device meets the prerequisites.

        Once installed, run from a terminal:

        bash
        scrcpy

        or with arguments (here to disable audio and record to file.mkv):

        bash
        scrcpy --no-audio --record=file.mkv

        Documentation for command line arguments is available:

        • man scrcpy
        • scrcpy --help
        • on github

        Views 0, Visitors 0
        TodayViews 0, TodayVisitors 0
        -

        - +

        + \ No newline at end of file diff --git a/reference/scrcpy/mouse.html b/reference/scrcpy/mouse.html index 813b51c15..c0d1aff70 100644 --- a/reference/scrcpy/mouse.html +++ b/reference/scrcpy/mouse.html @@ -6,14 +6,14 @@ Mouse | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
        Skip to content

        Mouse

        Several mouse input modes are available:

        • --mouse=sdk (default)
        • --mouse=uhid (or -M): simulates a physical HID mouse using the UHID kernel module on the device
        • --mouse=aoa: simulates a physical HID mouse using the AOAv2 protocol
        • --mouse=disabled

        SDK mouse

        In this mode (--mouse=sdk, or if the parameter is omitted), mouse input events are injected at the Android API level with absolute coordinates.

        Note that on some devices, an additional option must be enabled in developer options for this mouse mode to work. See prerequisites.

        Mouse hover

        By default, mouse hover (mouse motion without any clicks) events are forwarded to the device. This can be disabled with:

        scrcpy --no-mouse-hover

        Physical mouse simulation

        Two modes allow to simulate a physical HID mouse on the device.

        In these modes, the computer mouse is "captured": the mouse pointer disappears from the computer and appears on the Android device instead.

        The shortcut mod (either Alt or Super by default) toggle (disable or enable) the mouse capture. Use one of them to give the control of the mouse back to the computer.

        UHID

        This mode simulates a physical HID mouse using the UHID kernel module on the device.

        To enable UHID mouse, use:

        bash
        scrcpy --mouse=uhid
        +    
        Skip to content

        Mouse

        Several mouse input modes are available:

        • --mouse=sdk (default)
        • --mouse=uhid (or -M): simulates a physical HID mouse using the UHID kernel module on the device
        • --mouse=aoa: simulates a physical HID mouse using the AOAv2 protocol
        • --mouse=disabled

        SDK mouse

        In this mode (--mouse=sdk, or if the parameter is omitted), mouse input events are injected at the Android API level with absolute coordinates.

        Note that on some devices, an additional option must be enabled in developer options for this mouse mode to work. See prerequisites.

        Mouse hover

        By default, mouse hover (mouse motion without any clicks) events are forwarded to the device. This can be disabled with:

        scrcpy --no-mouse-hover

        Physical mouse simulation

        Two modes allow to simulate a physical HID mouse on the device.

        In these modes, the computer mouse is "captured": the mouse pointer disappears from the computer and appears on the Android device instead.

        The shortcut mod (either Alt or Super by default) toggle (disable or enable) the mouse capture. Use one of them to give the control of the mouse back to the computer.

        UHID

        This mode simulates a physical HID mouse using the UHID kernel module on the device.

        To enable UHID mouse, use:

        bash
        scrcpy --mouse=uhid
         scrcpy -M  # short version

        Note: UHID may not work on old Android versions due to permission errors.

        AOA

        This mode simulates a physical HID mouse using the AOAv2 protocol.

        To enable AOA mouse, use:

        bash
        scrcpy --mouse=aoa

        Contrary to the other modes, it works at the USB level directly (so it only works over USB).

        It does not use the scrcpy server, and does not require adb (USB debugging). Therefore, it is possible to control the device (but not mirror) even with USB debugging disabled (see OTG).

        Note: On Windows, it may only work in OTG mode, not while mirroring (it is not possible to open a USB device if it is already open by another process like the adb daemon).

        Mouse bindings

        By default, with SDK mouse:

        • right-click triggers BACK (or POWER on)
        • middle-click triggers HOME
        • the 4th click triggers APP_SWITCH
        • the 5th click expands the notification panel

        The secondary clicks may be forwarded to the device instead by pressing the Shift key (e.g. Shift+right-click injects a right click to the device).

        In AOA and UHID mouse modes, the default bindings are reversed: all clicks are forwarded by default, and pressing Shift gives access to the shortcuts (since the cursor is handled on the device side, it makes more sense to forward all mouse buttons by default in these modes).

        The shortcuts can be configured using --mouse-bind=xxxx:xxxx for any mouse mode. The argument must be one or two sequences (separated by :) of exactly 4 characters, one for each secondary click:

                          .---- Shift + right click
                SECONDARY  |.--- Shift + middle click
                 BINDINGS  ||.-- Shift + 4th click
        @@ -40,15 +40,15 @@
                                        # use 4th and 5th for BACK and HOME,
                                        # use Shift+4th and Shift+5th for APP_SWITCH
                                        # and expand notification panel

        The second sequence of bindings may be omitted. In that case, it is the same as the first one:

        bash
        scrcpy --mouse-bind=bhsn
        -scrcpy --mouse-bind=bhsn:bhsn  # equivalent

        +scrcpy --mouse-bind=bhsn:bhsn # equivalent

        Views 0, Visitors 0
        TodayViews 0, TodayVisitors 0
        -

        - +

        + \ No newline at end of file diff --git a/reference/scrcpy/otg.html b/reference/scrcpy/otg.html index 76b665fd9..dfd1d624b 100644 --- a/reference/scrcpy/otg.html +++ b/reference/scrcpy/otg.html @@ -6,14 +6,14 @@ OTG | Escrcpy - + - + - + - + @@ -21,21 +21,21 @@ -
        Skip to content

        OTG

        By default, scrcpy injects input events at the Android API level. As an alternative, it is possible to send HID events, so that scrcpy behaves as if it was a physical keyboard and/or a physical mouse connected to the Android device (see keyboard and mouse).

        A special mode (OTG) allows to control the device using AOA keyboard, mouse and gamepad, without using adb at all (so USB debugging is not necessary). In this mode, video and audio are disabled, and --keyboard=aoa and --mouse=aoa are implicitly set. However, gamepads are disabled by default, so --gamepad=aoa (or -G in OTG mode) must be explicitly set.

        Therefore, it is possible to run scrcpy with only physical keyboard, mouse and gamepad simulation, as if the computer keyboard, mouse and gamepads were plugged directly to the device via an OTG cable.

        To enable OTG mode:

        bash
        scrcpy --otg
        +    
        Skip to content

        OTG

        By default, scrcpy injects input events at the Android API level. As an alternative, it is possible to send HID events, so that scrcpy behaves as if it was a physical keyboard and/or a physical mouse connected to the Android device (see keyboard and mouse).

        A special mode (OTG) allows to control the device using AOA keyboard, mouse and gamepad, without using adb at all (so USB debugging is not necessary). In this mode, video and audio are disabled, and --keyboard=aoa and --mouse=aoa are implicitly set. However, gamepads are disabled by default, so --gamepad=aoa (or -G in OTG mode) must be explicitly set.

        Therefore, it is possible to run scrcpy with only physical keyboard, mouse and gamepad simulation, as if the computer keyboard, mouse and gamepads were plugged directly to the device via an OTG cable.

        To enable OTG mode:

        bash
        scrcpy --otg
         # Pass the serial if several USB devices are available
         scrcpy --otg -s 0123456789abcdef

        It is possible to disable keyboard or mouse:

        bash
        scrcpy --otg --keyboard=disabled
         scrcpy --otg --mouse=disabled

        and to enable gamepads:

        bash
        scrcpy --otg --gamepad=aoa
         scrcpy --otg -G  # short version

        It only works if the device is connected over USB.

        OTG issues on Windows

        See FAQ.

        Control only

        Note that the purpose of OTG is to control the device without USB debugging (adb).

        If you want to solely control the device without mirroring while USB debugging is enabled, then OTG mode is not necessary.

        Instead, disable video and audio, and select UHID (or AOA):

        bash
        scrcpy --no-video --no-audio --keyboard=uhid --mouse=uhid --gamepad=uhid
         scrcpy --no-video --no-audio -KMG  # short version
        -scrcpy --no-video --no-audio --keyboard=aoa --mouse=aoa --gamepad=aoa

        One benefit of UHID is that it also works wirelessly.

        +scrcpy --no-video --no-audio --keyboard=aoa --mouse=aoa --gamepad=aoa

        One benefit of UHID is that it also works wirelessly.

        Views 0, Visitors 0
        TodayViews 0, TodayVisitors 0
        -

        - +

        + \ No newline at end of file diff --git a/reference/scrcpy/recording.html b/reference/scrcpy/recording.html index d41329eca..2bb2677b1 100644 --- a/reference/scrcpy/recording.html +++ b/reference/scrcpy/recording.html @@ -6,14 +6,14 @@ Recording | Escrcpy - + - + - + - + @@ -21,22 +21,22 @@ -
        Skip to content

        Recording

        To record video and audio streams while mirroring:

        bash
        scrcpy --record=file.mp4
        +    
        Skip to content

        Recording

        To record video and audio streams while mirroring:

        bash
        scrcpy --record=file.mp4
         scrcpy -r file.mkv

        To record only the video:

        bash
        scrcpy --no-audio --record=file.mp4

        To record only the audio:

        bash
        scrcpy --no-video --record=file.opus
         scrcpy --no-video --audio-codec=aac --record=file.aac
         scrcpy --no-video --audio-codec=flac --record=file.flac
         scrcpy --no-video --audio-codec=raw --record=file.wav
         # .m4a/.mp4 and .mka/.mkv are also supported for opus, aac and flac

        Timestamps are captured on the device, so packet delay variation does not impact the recorded file, which is always clean (only if you use --record of course, not if you capture your scrcpy window and audio output on the computer).

        Format

        The video and audio streams are encoded on the device, but are muxed on the client side. Several formats (containers) are supported:

        • MP4 (.mp4, .m4a, .aac)
        • Matroska (.mkv, .mka)
        • OPUS (.opus)
        • FLAC (.flac)
        • WAV (.wav)

        The container is automatically selected based on the filename.

        It is also possible to explicitly select a container (in that case the filename needs not end with a known extension):

        scrcpy --record=file --record-format=mkv

        Rotation

        The video can be recorded rotated. See video orientation.

        No playback

        To disable playback and control while recording:

        bash
        scrcpy --no-playback --no-control --record=file.mp4

        It is also possible to disable video and audio playback separately:

        bash
        # Record both video and audio, but only play video
         scrcpy --record=file.mkv --no-audio-playback

        To also disable the window:

        bash
        scrcpy --no-playback --no-window --record=file.mp4
        -# interrupt recording with Ctrl+C

        Time limit

        To limit the recording time:

        bash
        scrcpy --record=file.mkv --time-limit=20  # in seconds

        The --time-limit option is not limited to recording, it also impacts simple mirroring:

        scrcpy --time-limit=20

        +# interrupt recording with Ctrl+C

        Time limit

        To limit the recording time:

        bash
        scrcpy --record=file.mkv --time-limit=20  # in seconds

        The --time-limit option is not limited to recording, it also impacts simple mirroring:

        scrcpy --time-limit=20

        Views 0, Visitors 0
        TodayViews 0, TodayVisitors 0
        -

        - +

        + \ No newline at end of file diff --git a/reference/scrcpy/shortcuts.html b/reference/scrcpy/shortcuts.html index 15707177e..6ca94b5c3 100644 --- a/reference/scrcpy/shortcuts.html +++ b/reference/scrcpy/shortcuts.html @@ -6,14 +6,14 @@ Shortcuts | Escrcpy - + - + - + - + @@ -21,19 +21,19 @@ -
        Skip to content

        Shortcuts

        Actions can be performed on the scrcpy window using keyboard and mouse shortcuts.

        In the following list, MOD is the shortcut modifier. By default, it's (left) Alt or (left) Super.

        It can be changed using --shortcut-mod. Possible keys are lctrl, rctrl, lalt, ralt, lsuper and rsuper. For example:

        bash
        # use RCtrl for shortcuts
        +    
        Skip to content

        Shortcuts

        Actions can be performed on the scrcpy window using keyboard and mouse shortcuts.

        In the following list, MOD is the shortcut modifier. By default, it's (left) Alt or (left) Super.

        It can be changed using --shortcut-mod. Possible keys are lctrl, rctrl, lalt, ralt, lsuper and rsuper. For example:

        bash
        # use RCtrl for shortcuts
         scrcpy --shortcut-mod=rctrl
         
         # use either LCtrl or LSuper for shortcuts
        -scrcpy --shortcut-mod=lctrl,lsuper

        Super is typically the Windows or Cmd key.

        ActionShortcut
        Switch fullscreen modeMOD+f
        Rotate display leftMOD+ (left)
        Rotate display rightMOD+ (right)
        Flip display horizontallyMOD+Shift+ (left) | MOD+Shift+ (right)
        Flip display verticallyMOD+Shift+ (up) | MOD+Shift+ (down)
        Pause or re-pause displayMOD+z
        Unpause displayMOD+Shift+z
        Reset video capture/encodingMOD+Shift+r
        Resize window to 1:1 (pixel-perfect)MOD+g
        Resize window to remove black bordersMOD+w | Double-left-click¹
        Click on HOMEMOD+h | Middle-click
        Click on BACKMOD+b | MOD+Backspace | Right-click²
        Click on APP_SWITCHMOD+s | 4th-click³
        Click on MENU (unlock screen)⁴MOD+m
        Click on VOLUME_UPMOD+ (up)
        Click on VOLUME_DOWNMOD+ (down)
        Click on POWERMOD+p
        Power onRight-click²
        Turn device screen off (keep mirroring)MOD+o
        Turn device screen onMOD+Shift+o
        Rotate device screenMOD+r
        Expand notification panelMOD+n | 5th-click³
        Expand settings panelMOD+n+n | Double-5th-click³
        Collapse panelsMOD+Shift+n
        Copy to clipboard⁵MOD+c
        Cut to clipboard⁵MOD+x
        Synchronize clipboards and paste⁵MOD+v
        Inject computer clipboard textMOD+Shift+v
        Open keyboard settings (HID keyboard only)MOD+k
        Enable/disable FPS counter (on stdout)MOD+i
        Pinch-to-zoom/rotateCtrl+click-and-move
        Tilt vertically (slide with 2 fingers)Shift+click-and-move
        Tilt horizontally (slide with 2 fingers)Ctrl+Shift+click-and-move
        Drag & drop APK fileInstall APK from computer
        Drag & drop non-APK filePush file to device

        ¹Double-click on black borders to remove them.²Right-click turns the screen on if it was off, presses BACK otherwise.³4th and 5th mouse buttons, if your mouse has them.⁴For react-native apps in development, MENU triggers development menu.⁵Only on Android >= 7.

        Shortcuts with repeated keys are executed by releasing and pressing the key a second time. For example, to execute "Expand settings panel":

        1. Press and keep pressing MOD.
        2. Then double-press n.
        3. Finally, release MOD.

        All Ctrl+key shortcuts are forwarded to the device, so they are handled by the active application.

        +scrcpy --shortcut-mod=lctrl,lsuper

        Super is typically the Windows or Cmd key.

        ActionShortcut
        Switch fullscreen modeMOD+f
        Rotate display leftMOD+ (left)
        Rotate display rightMOD+ (right)
        Flip display horizontallyMOD+Shift+ (left) | MOD+Shift+ (right)
        Flip display verticallyMOD+Shift+ (up) | MOD+Shift+ (down)
        Pause or re-pause displayMOD+z
        Unpause displayMOD+Shift+z
        Reset video capture/encodingMOD+Shift+r
        Resize window to 1:1 (pixel-perfect)MOD+g
        Resize window to remove black bordersMOD+w | Double-left-click¹
        Click on HOMEMOD+h | Middle-click
        Click on BACKMOD+b | MOD+Backspace | Right-click²
        Click on APP_SWITCHMOD+s | 4th-click³
        Click on MENU (unlock screen)⁴MOD+m
        Click on VOLUME_UPMOD+ (up)
        Click on VOLUME_DOWNMOD+ (down)
        Click on POWERMOD+p
        Power onRight-click²
        Turn device screen off (keep mirroring)MOD+o
        Turn device screen onMOD+Shift+o
        Rotate device screenMOD+r
        Expand notification panelMOD+n | 5th-click³
        Expand settings panelMOD+n+n | Double-5th-click³
        Collapse panelsMOD+Shift+n
        Copy to clipboard⁵MOD+c
        Cut to clipboard⁵MOD+x
        Synchronize clipboards and paste⁵MOD+v
        Inject computer clipboard textMOD+Shift+v
        Open keyboard settings (HID keyboard only)MOD+k
        Enable/disable FPS counter (on stdout)MOD+i
        Pinch-to-zoom/rotateCtrl+click-and-move
        Tilt vertically (slide with 2 fingers)Shift+click-and-move
        Tilt horizontally (slide with 2 fingers)Ctrl+Shift+click-and-move
        Drag & drop APK fileInstall APK from computer
        Drag & drop non-APK filePush file to device

        ¹Double-click on black borders to remove them.²Right-click turns the screen on if it was off, presses BACK otherwise.³4th and 5th mouse buttons, if your mouse has them.⁴For react-native apps in development, MENU triggers development menu.⁵Only on Android >= 7.

        Shortcuts with repeated keys are executed by releasing and pressing the key a second time. For example, to execute "Expand settings panel":

        1. Press and keep pressing MOD.
        2. Then double-press n.
        3. Finally, release MOD.

        All Ctrl+key shortcuts are forwarded to the device, so they are handled by the active application.

        Views 0, Visitors 0
        TodayViews 0, TodayVisitors 0
        -

        - +

        + \ No newline at end of file diff --git a/reference/scrcpy/tunnels.html b/reference/scrcpy/tunnels.html index 6f0d93499..fbf732c51 100644 --- a/reference/scrcpy/tunnels.html +++ b/reference/scrcpy/tunnels.html @@ -6,14 +6,14 @@ Tunnels | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
        Skip to content

        Tunnels

        Scrcpy is designed to mirror local Android devices. Tunnels allow to connect to a remote device (e.g. over the Internet).

        To connect to a remote device, it is possible to connect a local adb client to a remote adb server (provided they use the same version of the adb protocol).

        Remote ADB server

        To connect to a remote adb server, make the server listen on all interfaces:

        bash
        adb kill-server
        +    
        Skip to content

        Tunnels

        Scrcpy is designed to mirror local Android devices. Tunnels allow to connect to a remote device (e.g. over the Internet).

        To connect to a remote device, it is possible to connect a local adb client to a remote adb server (provided they use the same version of the adb protocol).

        Remote ADB server

        To connect to a remote adb server, make the server listen on all interfaces:

        bash
        adb kill-server
         adb -a nodaemon server start
         # keep this open

        Warning: all communications between clients and the adb server are unencrypted.

        Suppose that this server is accessible at 192.168.1.2. Then, from another terminal, run scrcpy:

        bash
        # in bash
         export ADB_SERVER_SOCKET=tcp:192.168.1.2:5037
        @@ -47,15 +47,15 @@
         set ADB_SERVER_SOCKET=tcp:localhost:5038
         scrcpy --force-adb-forward
        powershell
        # in PowerShell
         $env:ADB_SERVER_SOCKET = 'tcp:localhost:5038'
        -scrcpy --force-adb-forward

        +scrcpy --force-adb-forward

        Views 0, Visitors 0
        TodayViews 0, TodayVisitors 0
        -

        - +

        + \ No newline at end of file diff --git a/reference/scrcpy/v4l2.html b/reference/scrcpy/v4l2.html index b3c991c76..9a1672327 100644 --- a/reference/scrcpy/v4l2.html +++ b/reference/scrcpy/v4l2.html @@ -6,14 +6,14 @@ Video4Linux | Escrcpy - + - + - + - + @@ -21,21 +21,21 @@ -
        Skip to content

        Video4Linux

        On Linux, it is possible to send the video stream to a v4l2 loopback device, so that the Android device can be opened like a webcam by any v4l2-capable tool.

        The module v4l2loopback must be installed:

        bash
        sudo apt install v4l2loopback-dkms

        To create a v4l2 device:

        bash
        sudo modprobe v4l2loopback

        This will create a new video device in /dev/videoN, where N is an integer (more options are available to create several devices or devices with specific IDs).

        If you encounter problems detecting your device with Chrome/WebRTC, you can try exclusive_caps mode:

        sudo modprobe v4l2loopback exclusive_caps=1

        To list the enabled devices:

        bash
        # requires v4l-utils package
        +    
        Skip to content

        Video4Linux

        On Linux, it is possible to send the video stream to a v4l2 loopback device, so that the Android device can be opened like a webcam by any v4l2-capable tool.

        The module v4l2loopback must be installed:

        bash
        sudo apt install v4l2loopback-dkms

        To create a v4l2 device:

        bash
        sudo modprobe v4l2loopback

        This will create a new video device in /dev/videoN, where N is an integer (more options are available to create several devices or devices with specific IDs).

        If you encounter problems detecting your device with Chrome/WebRTC, you can try exclusive_caps mode:

        sudo modprobe v4l2loopback exclusive_caps=1

        To list the enabled devices:

        bash
        # requires v4l-utils package
         v4l2-ctl --list-devices
         
         # simple but might be sufficient
         ls /dev/video*

        To start scrcpy using a v4l2 sink:

        bash
        scrcpy --v4l2-sink=/dev/videoN
         scrcpy --v4l2-sink=/dev/videoN --no-video-playback  # disable playback window

        (replace N with the device ID, check with ls /dev/video*)

        Once enabled, you can open your video stream with a v4l2-capable tool:

        bash
        ffplay -i /dev/videoN
        -vlc v4l2:///dev/videoN   # VLC might add some buffering delay

        For example, you could capture the video within OBS or within your video conference tool.

        Buffering

        By default, there is no video buffering, to get the lowest possible latency.

        As for the video display, it is possible to add buffering to delay the v4l2 stream:

        bash
        scrcpy --v4l2-buffer=300     # add 300ms buffering for v4l2 sink

        +vlc v4l2:///dev/videoN # VLC might add some buffering delay

        For example, you could capture the video within OBS or within your video conference tool.

        Buffering

        By default, there is no video buffering, to get the lowest possible latency.

        As for the video display, it is possible to add buffering to delay the v4l2 stream:

        bash
        scrcpy --v4l2-buffer=300     # add 300ms buffering for v4l2 sink

        Views 0, Visitors 0
        TodayViews 0, TodayVisitors 0
        -

        - +

      + \ No newline at end of file diff --git a/reference/scrcpy/video.html b/reference/scrcpy/video.html index d57037913..d6ea715c7 100644 --- a/reference/scrcpy/video.html +++ b/reference/scrcpy/video.html @@ -6,14 +6,14 @@ Video | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
      Skip to content

      Video

      Source

      By default, scrcpy mirrors the device screen.

      It is possible to capture the device camera instead.

      See the dedicated camera page.

      Size

      By default, scrcpy attempts to mirror at the Android device resolution.

      It might be useful to mirror at a lower definition to increase performance. To limit both width and height to some maximum value (here 1024):

      bash
      scrcpy --max-size=1024
      +    
      Skip to content

      Video

      Source

      By default, scrcpy mirrors the device screen.

      It is possible to capture the device camera instead.

      See the dedicated camera page.

      Size

      By default, scrcpy attempts to mirror at the Android device resolution.

      It might be useful to mirror at a lower definition to increase performance. To limit both width and height to some maximum value (here 1024):

      bash
      scrcpy --max-size=1024
       scrcpy -m 1024   # short version

      The other dimension is computed so that the Android device aspect ratio is preserved. That way, a device in 1920×1080 will be mirrored at 1024×576.

      If encoding fails, scrcpy automatically tries again with a lower definition (unless --no-downsize-on-error is enabled).

      For camera mirroring, the --max-size value is used to select the camera source size instead (among the available resolutions).

      Bit rate

      The default video bit rate is 8 Mbps. To change it:

      bash
      scrcpy --video-bit-rate=2M
       scrcpy --video-bit-rate=2000000  # equivalent
       scrcpy -b 2M                     # short version

      Frame rate

      The capture frame rate can be limited:

      bash
      scrcpy --max-fps=15

      The actual capture frame rate may be printed to the console:

      scrcpy --print-fps

      It may also be enabled or disabled at anytime with MOD+i (see shortcuts).

      The frame rate is intrinsically variable: a new frame is produced only when the screen content changes. For example, if you play a fullscreen video at 24fps on your device, you should not get more than 24 frames per second in scrcpy.

      Codec

      The video codec can be selected. The possible values are h264 (default), h265 and av1:

      bash
      scrcpy --video-codec=h264  # default
      @@ -56,15 +56,15 @@
       scrcpy --v4l2-sink=/dev/video2 --no-video-playback
       
       # Record both video and audio, but only play video
      -scrcpy --record=file.mkv --no-audio-playback

      No video

      To disable video forwarding completely, so that only audio is forwarded:

      scrcpy --no-video

      Video4Linux

      See the dedicated Video4Linux page.

      +scrcpy --record=file.mkv --no-audio-playback

      No video

      To disable video forwarding completely, so that only audio is forwarded:

      scrcpy --no-video

      Video4Linux

      See the dedicated Video4Linux page.

      Views 0, Visitors 0
      TodayViews 0, TodayVisitors 0
      -

      - +

      + \ No newline at end of file diff --git a/reference/scrcpy/virtual_display.html b/reference/scrcpy/virtual_display.html index 32f151c3f..56ca36c4f 100644 --- a/reference/scrcpy/virtual_display.html +++ b/reference/scrcpy/virtual_display.html @@ -6,14 +6,14 @@ Virtual display | Escrcpy - + - + - + - + @@ -21,19 +21,19 @@ -
      Skip to content

      Virtual display

      New display

      To mirror a new virtual display instead of the device screen:

      bash
      scrcpy --new-display=1920x1080
      +    
      Skip to content

      Virtual display

      New display

      To mirror a new virtual display instead of the device screen:

      bash
      scrcpy --new-display=1920x1080
       scrcpy --new-display=1920x1080/420  # force 420 dpi
       scrcpy --new-display         # use the main display size and density
       scrcpy --new-display=/240    # use the main display size and 240 dpi

      The new virtual display is destroyed on exit.

      Start app

      On some devices, a launcher is available in the virtual display.

      When no launcher is available (or if is explicitly disabled by --no-vd-system-decorations), the virtual display is empty. In that case, you must start an Android app.

      For example:

      bash
      scrcpy --new-display=1920x1080 --start-app=org.videolan.vlc

      The app may itself be a launcher. For example, to run the open source Fossify Launcher:

      bash
      scrcpy --new-display=1920x1080 --no-vd-system-decorations --start-app=org.fossify.home

      System decorations

      By default, virtual display system decorations are enabled. To disable them, use --no-vd-system-decorations:

      scrcpy --new-display --no-vd-system-decorations

      This is useful for some devices which might display a broken UI, or to disable any default launcher UI available in virtual displays.

      Note that if no app is started, no content will be rendered, so no video frame will be produced at all.

      Destroy on close

      By default, when the virtual display is closed, the running apps are destroyed.

      To move them to the main display instead, use:

      scrcpy --new-display --no-vd-destroy-content

      Display IME policy

      By default, the virtual display IME appears on the default display.

      To make it appear on the local display, use --display-ime-policy=local:

      bash
      scrcpy --display-id=1 --display-ime-policy=local
      -scrcpy --new-display --display-ime-policy=local

      +scrcpy --new-display --display-ime-policy=local

      Views 0, Visitors 0
      TodayViews 0, TodayVisitors 0
      -

      - +

+ \ No newline at end of file diff --git a/reference/scrcpy/window.html b/reference/scrcpy/window.html index ab702ed7d..a47facbd7 100644 --- a/reference/scrcpy/window.html +++ b/reference/scrcpy/window.html @@ -6,14 +6,14 @@ Window | Escrcpy - + - + - + - + @@ -21,17 +21,17 @@ -
Skip to content

Window

Disable window

To disable window (may be useful for recording or for playing audio only):

bash
scrcpy --no-window --record=file.mp4
+    
Skip to content

Window

Disable window

To disable window (may be useful for recording or for playing audio only):

bash
scrcpy --no-window --record=file.mp4
 # Ctrl+C to interrupt

Title

By default, the window title is the device model. It can be changed:

bash
scrcpy --window-title='My device'

Position and size

The initial window position and size may be specified:

bash
scrcpy --window-x=100 --window-y=100 --window-width=800 --window-height=600

Borderless

To disable window decorations:

bash
scrcpy --window-borderless

Always on top

To keep the window always on top:

bash
scrcpy --always-on-top

Fullscreen

The app may be started directly in fullscreen:

bash
scrcpy --fullscreen
-scrcpy -f   # short version

Fullscreen mode can then be toggled dynamically with MOD+f (see shortcuts).

Disable screensaver

By default, scrcpy does not prevent the screensaver from running on the computer. To disable it:

bash
scrcpy --disable-screensaver

+scrcpy -f # short version

Fullscreen mode can then be toggled dynamically with MOD+f (see shortcuts).

Disable screensaver

By default, scrcpy does not prevent the screensaver from running on the computer. To disable it:

bash
scrcpy --disable-screensaver

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/reference/scrcpy/windows.html b/reference/scrcpy/windows.html index 913c734a0..742bbeb21 100644 --- a/reference/scrcpy/windows.html +++ b/reference/scrcpy/windows.html @@ -6,14 +6,14 @@ On Windows | Escrcpy - + - + - + - + @@ -21,17 +21,17 @@ -
Skip to content

On Windows

Install

From the official release

Download the latest release:

and extract it.

From a package manager

From WinGet (ADB and other dependencies will be installed alongside scrcpy):

bash
winget install --exact Genymobile.scrcpy

From Chocolatey:

bash
choco install scrcpy
+    
Skip to content

On Windows

Install

From the official release

Download the latest release:

and extract it.

From a package manager

From WinGet (ADB and other dependencies will be installed alongside scrcpy):

bash
winget install --exact Genymobile.scrcpy

From Chocolatey:

bash
choco install scrcpy
 choco install adb    # if you don't have it yet

From Scoop:

bash
scoop install scrcpy
-scoop install adb    # if you don't have it yet

See build.md to build and install the app manually.

Run

Make sure that your device meets the prerequisites.

Scrcpy is a command line application: it is mainly intended to be executed from a terminal with command line arguments.

To open a terminal at the expected location, double-click on open_a_terminal_here.bat in your scrcpy directory, then type your command. For example, without arguments:

bash
scrcpy

or with arguments (here to disable audio and record to file.mkv):

scrcpy --no-audio --record=file.mkv

Documentation for command line arguments is available:

To start scrcpy directly without opening a terminal, double-click on one of these files:

  • scrcpy-console.bat: start with a terminal open (it will close when scrcpy terminates, unless an error occurs);
  • scrcpy-noconsole.vbs: start without a terminal (but you won't see any error message).

Avoid double-clicking on scrcpy.exe directly: on error, the terminal would close immediately and you won't have time to read any error message (this executable is intended to be run from the terminal). Use scrcpy-console.bat instead.

If you plan to always use the same arguments, create a file myscrcpy.bat (enable show file extensions to avoid confusion) containing your command, For example:

bash
scrcpy --prefer-text --turn-screen-off --stay-awake

Then just double-click on that file.

You could also edit (a copy of) scrcpy-console.bat or scrcpy-noconsole.vbs to add some arguments.

+scoop install adb # if you don't have it yet

See build.md to build and install the app manually.

Run

Make sure that your device meets the prerequisites.

Scrcpy is a command line application: it is mainly intended to be executed from a terminal with command line arguments.

To open a terminal at the expected location, double-click on open_a_terminal_here.bat in your scrcpy directory, then type your command. For example, without arguments:

bash
scrcpy

or with arguments (here to disable audio and record to file.mkv):

scrcpy --no-audio --record=file.mkv

Documentation for command line arguments is available:

To start scrcpy directly without opening a terminal, double-click on one of these files:

  • scrcpy-console.bat: start with a terminal open (it will close when scrcpy terminates, unless an error occurs);
  • scrcpy-noconsole.vbs: start without a terminal (but you won't see any error message).

Avoid double-clicking on scrcpy.exe directly: on error, the terminal would close immediately and you won't have time to read any error message (this executable is intended to be run from the terminal). Use scrcpy-console.bat instead.

If you plan to always use the same arguments, create a file myscrcpy.bat (enable show file extensions to avoid confusion) containing your command, For example:

bash
scrcpy --prefer-text --turn-screen-off --stay-awake

Then just double-click on that file.

You could also edit (a copy of) scrcpy-console.bat or scrcpy-noconsole.vbs to add some arguments.

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index b723bed21..a2030bd47 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://viarotel.eu.org/changelog2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/changelog2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/contact2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/contact2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/donate2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/donate2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/guide/2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/guide/2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/guide/milestones2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/guide/milestones2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/guide/operation2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/guide/operation2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/guide/preferences2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/guide/preferences2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/guide/started2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/guide/started2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/guide/window-arrangement2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/guide/window-arrangement2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/help/escrcpy2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/help/escrcpy2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/help/2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/help/2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/help/scrcpy2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/help/scrcpy2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/gnirehtet/api2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/gnirehtet/api2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/gnirehtet/2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/gnirehtet/2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/audio2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/audio2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/build2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/build2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/camera2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/camera2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/connection2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/connection2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/control2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/control2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/develop2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/develop2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/device2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/device2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/gamepad2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/gamepad2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/keyboard2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/keyboard2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/linux2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/linux2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/macos2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/macos2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/mouse2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/mouse2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/otg2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/otg2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/recording2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/recording2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/shortcuts2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/shortcuts2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/tunnels2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/tunnels2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/v4l22026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/v4l22026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/video2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/video2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/virtual_display2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/virtual_display2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/window2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/window2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/reference/scrcpy/windows2026-04-23T03:49:30.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/windows2026-04-23T03:49:30.000Z \ No newline at end of file +https://viarotel.eu.org/changelog2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/changelog2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/contact2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/contact2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/donate2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/donate2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/guide/2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/guide/2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/guide/milestones2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/guide/milestones2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/guide/operation2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/guide/operation2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/guide/preferences2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/guide/preferences2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/guide/started2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/guide/started2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/guide/window-arrangement2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/guide/window-arrangement2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/help/escrcpy2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/help/escrcpy2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/help/2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/help/2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/help/scrcpy2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/help/scrcpy2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/gnirehtet/api2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/gnirehtet/api2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/gnirehtet/2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/gnirehtet/2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/audio2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/audio2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/build2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/build2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/camera2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/camera2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/connection2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/connection2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/control2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/control2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/develop2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/develop2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/device2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/device2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/gamepad2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/gamepad2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/keyboard2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/keyboard2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/linux2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/linux2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/macos2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/macos2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/mouse2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/mouse2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/otg2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/otg2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/recording2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/recording2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/shortcuts2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/shortcuts2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/tunnels2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/tunnels2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/v4l22026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/v4l22026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/video2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/video2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/virtual_display2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/virtual_display2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/window2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/window2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/reference/scrcpy/windows2026-05-05T16:51:22.000Zhttps://viarotel.eu.org/zhHans/reference/scrcpy/windows2026-05-05T16:51:22.000Z \ No newline at end of file diff --git a/zhHans/changelog.html b/zhHans/changelog.html index 2034cb47a..d75efb477 100644 --- a/zhHans/changelog.html +++ b/zhHans/changelog.html @@ -6,14 +6,14 @@ 更新日志 | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
Skip to content

Changelog

2.8.1 (2026-04-07)

Bug Fixes

  • 🐛 Fixed the problem of dark theme background not taking effect (ad19695)

Performance Improvements

  • 🎉 Increased free limit for batch automation scripts and device group controls to 5 devices. (11271f2)

2.8.0 (2026-04-06)

Features

  • ✨ Window arrangement supports the automatic arrangement function (696d94b)

Bug Fixes

  • 🐛 Fix i18n errors (e4ad3ec)
  • 🐛 Fix the default value issue of the subscription plan (a19dd9e)
  • 🐛 Fixed the issue where multiple files cannot be pasted when copied to the clipboard under Windows (dcc7a94)

Performance Improvements

  • ♻️ Optimize subscription plan (c12ef9d)
  • ♻️ Optimize the pricing strategy for advanced features to prevent misjudgments by users (4d722b7)
  • 💄 Optimize the display details of the embedded mirror window (6cf4c69)
  • 🚀 Automation script adds random range option (4d73e1a)
  • 🚀 Extended embedded mirroring operable shortcut buttons (19c0de2)
  • 🚀 Optimize subscription configuration (d053bfa)
  • 🚀 Optimize the automation script editor to avoid screen border issues (ffd56a6)
  • 🚀 Refactored file copy function supports batch copying to the clipboard (ccca99a)

Code Refactoring

  • ♻️ Optimize subscription plan default value acquisition (7b9c47f)
  • 🚀 Dynamically configure subscriptions by detecting the environment (d02e1b3)
  • 🚀 Fix typescript configuration (cbc8631)

2.7.3 (2026-04-02)

Bug Fixes

  • 🐛 Fixed an issue where embedded mirroring could not be input due to external activation elements. (058b982)

Performance Improvements

  • 🚀 Optimize the embedded image to open the application list display (7f6b18a)

Code Refactoring

  • 🔊 Optimize the wscrcpy audio cleaning logic (a29cd85)

2.7.2 (2026-04-01)

Bug Fixes

  • 🐛 Fix dependency not updated error (2d8ebfd)

2.7.1 (2026-04-01)

Bug Fixes

  • 🐛 Fixed the problem that the global search shortcut key does not take effect (e7596f9)

2.7.0 (2026-04-01)

Features

  • 🚀 Add wscrcpy cli parameter adapter (ea64b5e)
  • 🚀 Complete more parameters of wscrcpy (c48020b)
  • 🚀 Extend wscrcpy capabilities (0717688)
  • 🚀 Initial implementation of device group control function (4ea4e7d)
  • 🚀 Optimize group control experience (853e53d)
  • 🚀 Optimize the details of the mask layer module (c9da58e)
  • 🚀 Optimize the interaction details of the mask board module (b67582a)
  • 🚀 Redesign the overlay module guide page (c522fcb)
  • 🚀 Refactor the embedded image package to the wscrcpy package (5f8a309)
  • 🚀 Use tango-adb to directly render the device screen in the mask layer module (81d93dd)
  • 🚀 wscrcpy adds support for mouse hover monitoring (eb78931)
  • 🚀 wscrcpy only enables audio forwarding by default in the macos environment (5d510dc)

Bug Fixes

  • 🐛 Fix the issue of resetting the window position of the mirror module (d4c3a74)
  • 🐛 Fix the problem of data echo in automation steps (435c3de)
  • 🐛 Fix the problem of Wscrcpy audio forwarding exception (967a6c2)
  • 🐛 Fix the problem of wscrcpy group control failure (ea74182)
  • 🐛 Fix wscrcpy clipboard synchronization issue (42fee69)
  • 🐛 Fix wscrcpy reconnection problem (a6de9b9)
  • 🐛 Fixed sub-package build conflict and misalignment issue (99b22ba)
  • 🐛 Fixed syntax error in the action bar at the bottom of the overlay (ef0a301)
  • 🐛 Fixed the problem of abnormal calculation of size ratio when switching the main device on the group control page (5ad014f)
  • 🐛 Fixed the problem of abnormal disconnection of wscrcpy video stream when exiting the program (174a01c)
  • 🐛 Fixed the problem of interactive forwarding conflict when group control is enabled for auxiliary devices (60ae2a4)
  • 🐛 Fixed the problem of mask layer adaptation button forwarding (4be239e)
  • 🚀 Fix mask layer test issue (33581df)
  • 🚀 Fixed overlay module screen rotation issue (ad0af45)
  • 🚀 Fixed wscrcpy audio and clipboard synchronization configuration conflict issue (5bb65e0)

Performance Improvements

  • 💄 Optimize the interaction of the embedded image module (7a21fdb)
  • 🚀 Add internationalization to automation script keylist (e7b78c1)
  • 🚀 Device group control expands more operations (08e46b6)
  • 🚀 Enhance the interaction experience of built-in images (e913fee)
  • 🚀 Expand batch opening function for group control function (a38dbde)
  • 🚀 Explicitly declare wscrcpy external dependencies (52924c8)
  • 🚀 Improve group control function subscription capabilities (479b996)
  • 🚀 Improve the stability of the overlay adapter (be0ff8c)
  • 🚀 More embedded startup entries have been added to the device list (24e4fd1)
  • 🚀 Optimize check update pop-up window style (54eaa51)
  • 🚀 Optimize embedded image module error prompts (e26186b)
  • 🚀 Optimize overlay click/swipe event interaction (d7c0500)
  • 🚀 Optimize overlay module details (8ce5937)
  • 🚀 Optimize overlay module details (2799ab0)
  • 🚀 Optimize preference interaction Disable device-dependent options in global mode (ea47604)
  • 🚀 Optimize the directory structure of the group control module (f9a9d67)
  • 🚀 Optimize the empty list style of the device list (95e8e4a)
  • 🚀 Optimize the interaction details of the overlay module (e297850)
  • 🚀 Optimize the interactive experience of group control function (05c8643)
  • 🚀 Optimize the interactive experience of the embedded mirror control bar (ac6159f)
  • 🚀 Optimize the keyboard input experience of the group control module (32b7fa2)
  • 🚀 Optimize the overlay module to organize interaction details (f358348)
  • 🚀 Optimize the video stream freezing problem when wscrcpy starts the same device (7baa53c)
  • 🚀 Optimize universal scroll bar interaction (dd6f3fe)
  • 🚀 Optimize window arrangement function details (91e1a3a)
  • 🚀 Overlay module input function reconstruction (ac19fab)
  • 🚀 The overlay module supports forwarding more key types (05c6faf)

Code Refactoring

  • ♻️ Reconstruct the embedded mirror module directory structure (119a471)
  • 📝 Remove redundant wscrcpy judgments (3d9add8)
  • 🚀 Adjust the group control module naming (3c14c99)
  • 🚀 Expand the embedded image switching function (a49f8b5)
  • 🚀 Optimize and extend wscrcpy type (eec0913)
  • 🚀 Optimize interactive performance of embedded mirroring (ba8bfea)
  • 🚀 Optimize overlay module configuration (08009bf)
  • 🚀 Optimize the details of the overlay layer (59dc702)
  • 🚀 Optimize the directory structure of the group control module (7116264)
  • 🚀 Optimize wscrcpy details (247dc5e)
  • 🚀 Reconstruct the directory structure of the overlay module (668ef67)
  • 🚀 Reconstruct the image window ratio to improve reusability (555e346)
  • 🚀 Reconstruct the mask layer keyboard module (cad077d)
  • 🚀 Reconstruct the overlay module architecture (196cca0)
  • 🚀 Reconstruct the overlay module parameter injection method to solve the problem of responsive loss (3163c60)
  • 🚀 Reconstructed mirror window ratio algorithm is compatible with all platforms (b8377f2)
  • 🚀 Refactor and extend wscrcpy library functionality (4ca2c49)
  • 🚀 Refactor wscrcpy (b537a96)
  • 🚀 Remove redundant code from built-in images (f6bcbf5)
  • 🚀 Remove redundant code from the mask layer module (bdb4f49)

2.6.2 (2026-03-13)

Bug Fixes

  • 🐛 Fix the problem of inaccurate vertical coordinate of window arrangement under Windows (1fa6bd5)
  • 🐛 Fixed the issue of abnormal scaling of the window arrangement function under Windows (87f3596)
  • 🐛 Fixed the issue of redundant scroll bars appearing in the window arrangement tool screen area (ea0b451)

Code Refactoring

  • 🚀 Refactored version build (bd3ec90)

2.6.1 (2026-03-13)

Performance Improvements

  • 🌱 Improve the interactive experience of subscription plans (f3620fd)

2.6.0 (2026-03-12)

Features

  • 🎉 Optimize device window arrangement: By obtaining the actual screen size of the device, canceling fixed ratio scaling, avoiding black border issues, and improving adaptation accuracy and display experience. (35d2028)
  • 🚀 Add a subscription plan for batch automation scripts (efa6e28)
  • 🚀 Add WeChat script template (569099c)
  • 🚀 Improve the international translation of automated script modules (1cb2cb6)
  • 🚀 Optimize automated script interaction (1e61d0f)
  • 🚀 Optimize magic variable interaction support for import and export (b7ba176)
  • 🚀 Preliminary addition of automation script editor support (bc6fdcc)
  • 🚀 Preliminary support for automated script batch execution and scheduled tasks (e14c302)
  • 🚀 Product and optimization of automation script editor (b36f6c6)

Bug Fixes

  • 🐛 Fix custom startup layout and interaction issues (6311364)
  • 🐛 Fixed an issue where the automation script log directory was ignored (8777e63)
  • 🐛 Fixed script template translation issue (01870f7)
  • 🐛 Fixed split automation script editor form variable usage compatibility issue (53da1e9)
  • 🐛 Fixed the issue of abnormal task type penetration display in the scheduled task list (58ced2b)
  • 🐛 Fixed the issue of batch execution image blocking (9e3e17b)
  • 🐛 Fixed the issue where the aspect ratio was not fixed when the window arrangement was adjusted again after being saved. (8977138)
  • 🐛 Fixed the problem of unable to echo after window arrangement (6907762)
  • 🚀 Fixed batch execution automation script variable injection concurrency issue (3b8dae0)
  • 🚀 Fixed the problem that the automation script during switching execution could not confirm the interruption (2162203)
  • 🚀 Optimize subscription configuration (9711e73)
  • Fix automated script editor testing issue (87c6f93)

Performance Improvements

  • 💄 Optimize smart picking interaction (a66fb7a)
  • 🚀 Automate script selectors to support termination logic and interaction optimization (d0a4bb3)
  • 🚀 Automation script editor adds execution selection function (d8f1300)
  • 🚀 Detail optimization of the automated script editor (338ad3e)
  • 🚀 Improve automation script stability (455c11f)
  • 🚀 Integrate the adb keyboard installation universal hook (aca0427)
  • 🚀 Optimize automation script editor details (fb2e4ad)
  • 🚀 Optimize automation script editor interaction details (e371171)
  • 🚀 Optimize automation script editor interaction details (24f0792)
  • 🚀 Optimize automation script function details (f084d08)
  • 🚀 Optimize execution of automation script interaction details (568fedf)
  • 🚀 Optimize international translation (3dd15a9)
  • 🚀 Optimize product details (a3abd2c)
  • 🚀 Optimize the installation of adb keyboard boot (fd4e752)
  • 🚀 Optimize the layout of the execution page for planned tasks (10da149)
  • 🚀 Remove obsolete shell script functionality (dfc505b)
  • 🚀 Template import supports importing magic variables (767c1dd)
  • 🚀 When obtaining the device list, synchronously obtain the screen resolution to optimize the screen arrangement experience (3715e0f)
  • Enhance the stability of the automated script editor (8030668)
  • Optimize script editor interaction (7367d15)

Miscellaneous Chores

Code Refactoring

  • ♻️ Restore version of the system (4a7c653)
  • ➖ Remove redundant printing information (6bd144d)
  • 🔨 Split Automation Script Editor form (98ac71b)
  • 🚀 Extract the common logic of launching the app function into an independent selector and reuse it (583b93f)
  • 🚀 Optimize automation script editor details (06f1ede)
  • 🚀 Optimize international translation (2d07a60)
  • 🚀 Optimize the interaction of script selectors for batch execution (c3e86fd)
  • 🚀 Optimize the size of deleted pop-up windows (a43fc53)
  • 🚀 Project code details optimization (eda1d5a)
  • 🚀 Support adjusting subscription price through environment variables (1867f03)
  • Integrated script editor supports more configuration functions (b0a30f8)
  • Optimize the overall directory and naming conventions (aed80ef)

2.5.1 (2026-02-27)

Bug Fixes

  • Fixed the issue of missing title bar information when launching through the app (e6bcd1e)

2.5.0 (2026-02-27)

Features

  • Add concurrency limit for batch wireless device connections (f048956)

Bug Fixes

  • Fix shell space command parsing problem (e1ab66c)
  • Initialize shell command variables to prevent undefined values (e776c11)

2.4.2 (2026-02-26)

Bug Fixes

  • Fix the problem of abnormal disconnection of adb after changing some configurations (ffbfc40)

2.4.1 (2026-02-26)

Bug Fixes

  • Fix the language detection issue of portable software (9985067)

Code Refactoring

  • Reorganize initialization order to load store before process configuration (9283a45)

2.4.0 (2026-02-26)

Features

  • ✨ Adds fastboot command support and provides experimental integration of scrcpy dependencies for Linux ARM64 platforms. (70f3243)
  • 🎉 Comprehensive migration to the built-in terminal based on xterm to provide a more controllable user experience (a2ee25f)
  • add drag and drop file upload support (d5b969c)
  • add gnirehtet path for mac (8da67c8)
  • add scroll to bottom button in chat (e4e8f80)
  • add terminal shell support with xterm integration (3c7828c)
  • add wireless connection mode switch toggle (161acf4)
  • add wireless pair success message and UI improvements (eccb26e)
  • improve ADB keyboard installation error handling (71f7635)
  • trigger language change callback immediately on init (e0e3d22)
  • update api endpoint and enable adb keyboard (4010b17)
  • Window orchestration component enhancement: Supports manual setting of position and size (e3aa89a)

Bug Fixes

  • 🐛 Migrate fkill to tree-kill to solve windows binary file execution problems (6c89b73)
  • change clipboard tag type to primary (edb8840)
  • enhance xterm terminal styling and resize handling (9e031f5)
  • filter ANSI color codes for Windows PowerShell terminal (9c58f25)
  • Fix i18n race translation (7b37f29)
  • handle terminal exit and error states with reload (e8d93d5)
  • handle Windows terminal line ending for all cases (e06e763)
  • handle Windows terminal line ending for device type (1be1a5e)
  • improve Windows terminal compatibility and session management (7f37f7d)
  • improve Windows terminal cursor sync and resize responsiveness (c16a5f9)
  • improve Windows terminal encoding and scrollbar styling (85d5a96)
  • improve Windows terminal rendering and resize stability (7f05996)
  • improve Windows terminal shell detection and remove debug logs (4a5ebbc)
  • include node-pty in electron build (c98d82d)
  • prioritize pwsh.exe for Windows terminal (a99d830)
  • simplify Windows PowerShell terminal initialization (95c432c)
  • simplify Windows terminal shell initialization (2a3ed6f)
  • Solve the problem that the language of the terminal title cannot be dynamically updated (6e2c030)
  • specify SIGTERM signal for treeKill (d28eb1a)
  • update terminal tip color to custom RGB (156d39b)

Performance Improvements

  • 🚀 Optimize ADB keyboard installation and detection (f312cc2)

Code Refactoring

  • add cleanup handler for window IPC (bad6752)
  • add comment for tray destroy event (12038df)
  • add electron-modularity dependency (d0abc0b)
  • add main window API and type system (778a65f)
  • add plugin warnings and fix module loading order (a5bdbf3)
  • add rendererDir support and update window loading (fac664d)
  • adjust screenshot message and dialog styles (7bbab51)
  • adjust terminal line height to 1.4 (5068f7d)
  • adjust terminal window and device sync settings (6a4bd61)
  • adjust window width and improve error handling (5576d2e)
  • centralize PATH setup and environment configuration (6a6eb80)
  • clean up .gitignore file (3644b3e)
  • clean up main window module (9d1eee9)
  • defer app initialization until ready (9905f41)
  • defer plugin registration until app start (46ac0db)
  • Electron main process architecture reconstruction (f810ecb)
  • emit tray:destroy on window restore (fab9343)
  • expose $platform to window and global properties (9a7ee70)
  • extract terminal logic into useTerminal hook (9d725ca)
  • fix device payload and adjust control bar height (e5981ac)
  • fix failed translation key (fe98a56)
  • fix payload type and resolve target logic (5af60c8)
  • fix preview button visibility class (5a8c97b)
  • implement retained terminal session with cleanup (532a055)
  • implement terminal session management with providers (fa156e1)
  • improve file download progress tracking (51101c7)
  • improve gnirehtet menu handling and options (8d0e85b)
  • improve process killing and error handling (85a080e)
  • improve window bounds persistence logic (5361e24)
  • improve wireless pair input handling and UI (3aea5f6)
  • migrate core helpers to electron-modularity package (630deaa)
  • migrate edger to service (9c64cd5)
  • migrate events to service handlers (c99b1de)
  • migrate plugins to priority-based system (ae4404a)
  • migrate services and modules to explicit app.use (e63de2e)
  • migrate services to plugins (36e2a0d)
  • migrate to ipcx for IPC handling (1b1fd8d)
  • migrate to official plugins and update imports (eb9bead)
  • migrate to window.$preload namespace (41a2342)
  • move i18next-fs-backend to dependencies (f507222)
  • move window-manager to window module (8af97a5)
  • optimize device query and control window (4e2736d)
  • optimize minimized tray and window handling (3765b73)
  • Reconstruct the multi-entry directory structure (0690f4b)
  • Refactor i18n related services (6e882b6)
  • remove app parameter from window manager (f8719f1)
  • remove appium-adb documentation and update github link (f532aab)
  • remove border from preference header (9c97366)
  • remove debug console log for args (e4332c1)
  • remove debug console log for platform paths (e5590f3)
  • remove electron middleware module (3bd462c)
  • remove encoding conversion and use utf8 only (c32cb79)
  • remove fixed width from window configuration (ef3e86b)
  • remove spawnShell and convert arrow functions (66978f1)
  • remove theme plugin README (85a853b)
  • remove trailing whitespace in adb helpers (ec7314c)
  • remove ui-ux-pro-max prompt files (11d41a9)
  • remove unused app-region-drag style (094e0df)
  • remove unused terminalConfig from useTerminal (9db3f24)
  • remove Windows-specific encoding default (534934b)
  • rename app to ctx and update electron app imports (4c7ceba)
  • rename app to ctx in electron app (6707e2d)
  • rename currentStatusType to sessionStatus (8c84464)
  • rename electron-modularity to electron-setup (081a8a5)
  • rename entries to pages for routing structure (863ecd4)
  • rename windowOptions to browserWindow and add mainWindow flag (5093577)
  • reorder plugin registration in electron main (b8ee4ef)
  • reorganize process helpers directory structure (dcdb6d7)
  • replace args-tokenizer with shell-quote (1196263)
  • replace getSize with computed size property (c7edceb)
  • replace IS_PACKAGED with import.meta.env.MODE (521e2ba)
  • replace spawnShell with unified sheller helper (0159bb4)
  • replace tree-kill with fkill for process termination (c50cea6)
  • replace window controls with app header (a5fa218)
  • restructure copilot and explorer modules (74efca1)
  • restructure core helpers and window management (16fc934)
  • restructure electron helpers and modules (f0e4851)
  • restructure main window and singleton modules (7b979d6)
  • restructure terminal session management (19428dd)
  • restructure window management and IPC handlers (59a315f)
  • simplify file list extraction in drag upload (7453a99)
  • simplify gnirehtet trigger handling (f9185c3)
  • simplify main window resolution and remove legacy code (c764f91)
  • simplify restoreAndFocusWindow options (27185f5)
  • simplify window types and return native BrowserWindow (184ab7b)
  • simplify wireless connection UI and remove pair dialog (30e026c)
  • standardize module export structure (8111f6f)
  • throttle download and upload progress callbacks (8a16d22)
  • translate terminal comments to English and add command execution (71a2d7a)
  • unify control bar height configuration (7e6abed)
  • unify shell error handling and lazy loading (98dd91b)
  • update primaryColor value (346df64)
  • update scrollbar styling with Tailwind CSS (6eaf259)
  • update terminal scrollbar styling with custom width and transparency (b2c8f87)
  • update terminal title and locale strings (f0bdf0b)

2.3.1 (2026-01-27)

Bug Fixes

  • 🐛 Fixed the problem of being unable to click to enter the co-pilot entrance under Windows and Linux. (c563d11)

2.3.0 (2026-01-22)

Features

  • 🚀 Optimize portable package configuration and add linux flatpak package support (a7982db)
  • configure electron-log file path in debugger helper (2242668)

Bug Fixes

  • 🐛 handle copilot execution failures and adjust config max steps (3601709)
  • win: fully redirect user data to portable folder and fix CI workflow (fe2fd89)

Performance Improvements

  • ✨ Optimize windows and linux window layout (b63b59c)

Code Refactoring

  • add platform simulation support and adjust window controls layout (9c3a5b1)
  • adjust header and chat layout padding (70fe60d)
  • adjust layout padding for windows and linux platforms (4e153cc)
  • adjust widget dimensions and clear dialog messages (ca6796f)
  • implement immersive title bar and optimize window layout (1e76d11)
  • improve chat retry logic and ADB keyboard detection (8e0e43c)
  • remove dialog width constraints and improve file creation (54e5553)
  • remove quiet config option (76f9d6c)
  • remove redundant success messages and unify dialog titles (b1eac32)
  • reorganize emitter module and update event emitter references (4c3cc2d)
  • reorganize preference form layout with tabs and scroll (7f0f864)
  • replace ExTooltipButton with native el-button title attribute (8056977)

2.2.0 (2026-01-17)

Features

  • 🎉 Improve the accuracy and coverage of Copilot opening applications by obtaining information about installed applications on the device (e2f27da)
  • add keyboard shortcuts for connect and disconnect (39293af)
  • auto-focus input when editing prompt (d58b993)

Bug Fixes

  • 🐛 Fixed the issue where autoglm.js conversation request listener was not cleaned up causing memory overflow (bac2126)

Code Refactoring

  • improve config management and prompt editing (de2f708)
  • improve prompt manager UI and editing experience (1697558)
  • optimize subscribe store initialization and token management (0f00903)

2.1.7 (2026-01-14)

Miscellaneous Chores

2.1.6 (2026-01-14)

Miscellaneous Chores

2.1.5 (2026-01-14)

Miscellaneous Chores

  • remove comments in copilot window handler (f231998)
  • update version to 2.1.4 (9bdf671)

2.1.4 (2026-01-14)

Miscellaneous Chores

  • add release name format to config (6db1b51)
  • update release workflow and build commands (8f5345b)

2.1.3 (2026-01-14)

Miscellaneous Chores

  • add linked-versions plugin to release config (415e4ae)

2.1.2 (2026-01-14)

Bug Fixes

  • 🐛 Fix automatic build issues (aba8f27)

Miscellaneous Chores

  • add GH_TOKEN env to release workflow (078bf18)
  • release 2.1.1 (d1c04ce)
  • release 2.1.2 (91d9bbd)
  • release 2.1.2 (c7c8616)
  • remove release creation step from workflow (b73c179)
  • remove unnecessary comments in App.vue (22e331d)
  • remove unnecessary comments in App.vue (5ae8fbe)
  • update electron-builder config path and publish options (d3b4914)
  • update pull request title pattern (060ad4a)
  • update release configuration and patterns (0054fd4)

2.1.0 (2026-01-14)

Features

  • ✨ Add auto launch functionality and preference option (69c75cc)
  • ✨ Add hidden launch option for auto-start (dd1c2e1)
  • ✨ Add subscribe configuration hook and update UI (80b3534)
  • ✨ Add system tray support and Linux auto-launch (df414b9)
  • 🔖 Copilot adds thinking_stream event support (22623c4)
  • 🚑️ The portable version now supports automatically generating configuration files in the running directory (ba551b7)
  • add custom empty state icon for device list (65b028f)
  • add zip target for macOS builds (f52d3a5)

Bug Fixes

  • 🐛 Fix delete message and config initialization (82a77ea)
  • 🐛 Fixed the issue of failed export and export configuration files (fd32c36)
  • 🐛 Update dependencies and add sharp override in workspace configuration (dbf366a)
  • 💰 Update payment amount handling in subscription (422950c)
  • add background color and improve window initialization (498fc90)
  • adjust empty state icon styling in device list (363bf3d)
  • ensure concurrency limit is numeric (d2c977c)
  • types: allow typed payload handlers by using any[] for handle listener rest params (b4e8058)

Performance Improvements

  • 🚀 Use an external library instead of the built-in autoglm.js (d1f8176)

Code Refactoring

  • ⚡️ Refactor code structure for improved readability and maintainability (f211924)
  • 🌐 Update language labels to native text (cb7ac96)
  • 🌐 Update subscription translations for multiple locales (b4e5780)
  • 🎨 Redesign task dialog with card layout (cd06d3b)
  • 🎨 Simplify config UI layout and update maxSteps (af18241)
  • 🔄 Auto configure Copilot after payment (c00ac1e)
  • 🔄 Move ESLint config to root and clean up dependencies (f2bd345)
  • 🔄 Optimize session callbacks and event handling (ae19570)
  • 🔄 Rename ipc to services for better structure (8212872)
  • 🔄 Rename start module to launch for clarity (5d44ebf)
  • 🔧 Optimize copilot config change detection (2776e8a)
  • 🔧 Replace quick prompts with PromptBar component (9b0c4df)
  • improve theme switching and background handling (b3203af)
  • migrate copilot config to store (e323611)
  • replace rotation icon with outline version (95ad30d)
  • replace send icon with rocket icon (ef9e7d3)
  • replace svg icons with font icons (9eca902)
  • replace trash icon with Delete icon (c59994e)

2.0.1 (2026-01-06)

Bug Fixes

  • 🐛 Fix the problem of abnormal subscription recharge fee (b32043c)

2.0.0 (2026-01-05)

Features

  • ✨ Add system terminal support (e5c157e)
  • ✨ Device lists will now intelligently merge duplicate device entries and share device configurations (52cc4b1)
  • ✨ Integrate scrcpy binaries for macos (85bf096)
  • ✨ Introducing a new file icon display component and enhancing the File Explorer dialog. (11be6f1)
  • ✨ Now supports copying device screenshots and recording files to the clipboard (bdb3644)
  • ✨ Now you can arrange your device windows through a graphical interface (91ad249)
  • ✨ Support edge hiding function (14a81de)
  • ✨ Support floating control bar (8807e50)
  • ✨ Support pairing and connecting to devices via QR code (14306b2)
  • ✨ Support to close the device screen when controlling (a84c775)
  • ✨ Supports starting applications for mirroring (d19e781)
  • ✨ Use the new interface design (b08021b)
  • 💥[Release-As: 2.0.0] major copilot overhaul with AutoGLM and multi-device automation (7ad5ecd)
  • 📸 Enhanced recording (7f10161)
  • 🔍️ Optimize the search function of the app (94ccb7b)
  • 🚀 Split the file manager into independent windows and support multiple instances in parallel (f41d853)
  • 🚀 Support adding the open application action to the desktop shortcut. (Not supported on macOS) (add251f)
  • 🚀 Supports connecting historical devices via device list (e0687e8)
  • 🚀 Supports dragging the device control bar to sort (64a98b2)
  • 🚀 Update to scrcpy v3.3.2 (462536c)
  • 🚚 Support batch startup mirroring (fcfd78e)
  • 🚚 The file manager has been refactored and improved, and more useful features have been added. (5cd5992)

Bug Fixes

  • ♻️ Fixed repeated dependency issues (9777622)
  • 🐛 Fix automatic release (c2254aa)
  • 🐛 Fix device support audio and video encoding cannot be parsed (9b7f6a9)
  • 🐛 Fix for built-in scrcpy not supporting x64 macos (0d60655)
  • 🐛 Fix issue with incorrect address bar path when returning to the previous level in file management (0222675)
  • 🐛 Fix linux build errors (9b43dc0)
  • 🐛 Fix the display ID value type error (2b7ee79)
  • 🐛 Fix the mirror group bug (cd7d9cd)
  • 🐛 Fix the problem of build failure caused by missing dependencies (e34e1c2)
  • 🐛 Fix the problem of Windows calling system terminal failure (194689e)
  • 🐛 Fix the problem of Windows terminal injection command failure (fbf88d0)
  • 🐛 Fix typos (a7a3a17)
  • 🐛 Fixed an issue where macos built-in updates failed (432eceb)
  • 🐛 Fixed an issue where some options in preferences could not be turned off (269bd29)
  • 🐛 Fixed possible sandbox issues on Linux (ff9f9bd)
  • 🐛 Fixed the conflict between device control bar sorting and click events (18a57b9)
  • 🐛 Fixed the issue of abnormal path display in the file manager address bar (2f63f6f)
  • 🐛 Fixed the issue of duplicate filter conditions in the device list (6c4242c)
  • 🐛 Fixed the issue of layout flickering when refreshing the device list page (608b8f3)
  • 🐛 Fixed the issue of saving exceptions after adjusting parameters in preference settings (4a18f61)
  • 🐛 Fixed the issue where activating the program on macOS in certain situations would cause the tray to be created repeatedly (cf8e183)
  • 🐛 Fixed the issue where all configurations would be cleared when resetting the category configuration in preferences (6ee9a92)
  • 🐛 Fixed the issue where Chinese text cannot be saved in file management read and write text (34785dd)
  • 🐛 Fixed the issue where PowerShell failed to call the system terminal (7beb027)
  • 🐛 Fixed the issue where recorded files could not be copied to the clipboard under Windows (119b518)
  • 🐛 Fixed the issue where there is a chance of an error when closing the floating control bar on macOS (5c2c711)
  • 🐛 Fixed the problem of minimizing the visibility of tray icons (b0f42aa)
  • 🐛 Issue not taking effect after restarting the application after switching themes (857c480)
  • 🐛 Make StartApp compatible with scrcpy v3.0 (1082e0d)
  • 🐛 Rename --display-buffer to --video-buffer (b2bb0ae)
  • 🐛 Repair ADB timeout problems (b5bffc5)
  • 🐛 Repair floating action bar start application error (487e7e2)
  • 🐛 Repair part of internationalization Lost dynamics (d18444f)
  • 🐛 Resolve default recording error (358064e)
  • 🐛 Resolved the issue where the device list could not be displayed due to compatibility issues with certain devices (2c53b77)
  • 🐛 Resolving build errors (d21fa29)
  • 🐛 Restore the --display-buffer parameter to solve the mirroring problem (0f3d869)
  • 🐛 Solve the conflict between floating navigation bar and quick APP launch (460aca1)
  • 🐛 Solve the problem of abnormal display timing when recording related functions are successful (67d279e)
  • 🐛 Solve the problem of IPV6 address connection failure (1a95325)
  • 🐛 Solve the problem of startup error of development mode under Linux (5c4f65e)
  • 🐛 Solve the problem of Windows disabling video forwarding and crashing (10b902a)
  • 🐛 Solved the problem that the main window could not be restored after being moved off the screen in some cases (d054f8d)
  • 🐛 Start app to adapt to dark mode (ae13fde)
  • 🐛 Temporarily disable scrcpy integration in macOS (9bf4d5c)
  • 🐛 Update scrcpy-server file to solve the problem of not being able to obtain device APP list (63f7135)
  • 📝 Fixed the issue that special characters in Windows prevented the creation of app shortcut launch (301dac5)
  • 🔧 Camera recording and screen off configuration conflict (4508758)
  • 🔧 Fixed button loading prompt conflict issue (c323ad6)
  • 🩹 Restore the windows build configuration (9491069)
  • 🚀 Fix the issue of abnormal program exit behavior under windows (705f8be)

Performance Improvements

  • ♻️ Adjust the position of the start application button (9833932)
  • ♻️ Code structure optimization (595216b)
  • ♻️ Enhance recording stability (3dd7525)
  • ♻️ Improve ADB connection stability (7655ba6)
  • ♻️ Improve the stability of window arrangement function (7ae3f21)
  • ♻️ Improve wireless connection stability (85be898)
  • ♻️ Improved device connection stability (1d603ab)
  • ♻️ No longer building universal packages for macOS (db5deb4)
  • ♻️ Optimize camera recording (4be2cf4)
  • ♻️ Optimize camera recording stability (952b2a7)
  • ♻️ Optimize device details performance (38d1433)
  • ♻️ Optimize device list interaction logic (3812061)
  • ♻️ Optimize file manager interaction (b168cc3)
  • ♻️ Optimize QR code connection experience (86f5e69)
  • ♻️ Optimize the Russian presentation effect (0d8a8ee)
  • ♻️ Optimized contextBridge related improvements for stability (0e098c3)
  • ♻️ Optimized the adb daemon startup failure detection mechanism (ca6be85)
  • ♻️ Reduce build package size by removing redundant dependencies (7b61b25)
  • ♻️ Refactor configuration related code to improve stability (37bf438)
  • ♻️ Script and directory structure optimization (68378ef)
  • ♻️ Simplify sandbox automatic configuration manager code to improve performance (1b82336)
  • ♻️ Support interruption during waiting for wireless connection (344b385)
  • ♻️ Supports retrieving a list of applications (b1a6ba7)
  • ♻️ Update mirror icon (c214e5a)
  • ♻️ When the application fails to start, display the error message (dbc34d6)
  • ♿️ Supports adjusting the closing method of the application in preferences (e643f8e)
  • ⚗️ Experimental support for turning off screen controls (9555f58)
  • ⚡️ Improve the start APP experience (29e5e1b)
  • ⚡️ Optimize scrcpy parameter conversion performance (18dcd24)
  • ⚡️ Optimize startup application performance (8e94494)
  • ⚡️ Optimize the method of obtaining the available displays of the device (9e31c84)
  • ⚡️ Optimize the stability of options that need to dynamically obtain parameters in preference settings (39bbc98)
  • ✅ A new method is adopted to solve the problem of IP type configuration storage (5488a1e)
  • ✅ File management supports selecting directories for uploading (fd2e639)
  • ✅ Provides the function of detecting and migrating configurations when deleting a device (39e0533)
  • ✅ Support switching devices on the floating control bar (50440f5)
  • ✨ Adjust the position of the wireless connection screen (3e3fc34)
  • ✨ Enable new icon (695e35d)
  • ✨ The floating control bar supports transparent display when inactive (34f27c5)
  • ✨ Update to scrcpy@2.7 to support the gamepad (0053e87)
  • ➖ Remove redundant console (9a67142)
  • ⬆️ Improve QR code connection performance (b413889)
  • ⬆️ Improved performance of automated mirroring (33a03c3)
  • ⬆️ Optimize edge hiding performance (74a91a4)
  • ⬆️ Optimize the performance of the floating control bar (a1c60ec)
  • 🌱 Optimize app icon background color and corner radius. (bc4f492)
  • 🌱 Optimize application icon details (55800be)
  • 🌱 UI details and documentation optimization (5b5bbf7)
  • 🍻 Improve file manager reliability (9063243)
  • 🐛 Improve wireless connection verification method (69fecc3)
  • 👥 Control bar sorting supports state synchronization (88abe95)
  • 👷 Added edge hiding function switch (d25714a)
  • 👷 Explicitly clean up unnecessary child processes on exit (0549dda)
  • 👷 Optimize the edge hiding function (d5caaa9)
  • 👷 Remove redundant code comments (ca4e826)
  • 👽️ Experimental support for adding open application actions to linux desktop shortcuts (6897c0e)
  • 👽️ Experimentally add linux arm64 support (5b033fd)
  • 💄 Improve space utilization of device window layout tools (939a2d2)
  • 💄 Improved Russian display (ca79e1b)
  • 💄 Normalize control window titles and generated file names (ccc7f0e)
  • 💄 Optimization of display effect of device list page (305187d)
  • 💄 Optimize device refresh mode (ea75615)
  • 💄 Optimize dialog display (1813718)
  • 💄 Optimize pairing interface display (df4103b)
  • 💄 Optimize preference setting button layout (47ae53d)
  • 💄 Optimize Russian display effect (5ca39ae)
  • 💄 Optimize the display effect of horizontal screen screenshots (90c7163)
  • 💄 Optimize the interface display effect (c7a5cd4)
  • 💄 Window layout adapted to dark mode theme (eab402b)
  • 💫 Adjust gnirehtet configuration behavior to make it consistent with user operation habits (7507915)
  • 💫 Support appending gnirehtet custom parameters in configuration (206a030)
  • 📌 Standardize the device list lifecycle processing flow. IPv6 addresses must be enclosed in [] and the port number cannot be omitted for wireless connections. (93c059d)
  • 📌 Support saving the main panel window size status (cef022f)
  • 📝 Add docs entry to the program (db5d157)
  • 📝 Add Japanese language support (969378f)
  • 📝 Added Arabic language support (f6c9fa4)
  • 📝 Optimize the scheduled task list (c666709)
  • 📝 Optimize the title of the control interface to solve the problem of duplicate device names (06a151d)
  • 📝 Optimized startup app package name display (22eb718)
  • 📝 Simplified partial translation (7411487)
  • 📦️ Update the upload function to support file and directory selection, and optimize the interface layout (7f5bd35)
  • 📸 Recording camera support (10d0370)
  • 📸 Support viewing real-time images and power information of the device (d262adf)
  • 🔀 Optimize the storage policy configured in preferences (b9faabf)
  • 🔊 Expanded audio source options (fc91f07)
  • 🔍️ Optimize QR code style to avoid scanning problems on some devices (dd3ad6c)
  • 🔖 Adjust the order of quick entry functions (ccb59e1)
  • 🔖 Optimize interaction of preferred terminal options (900dc69)
  • 🔧 Optimized startup APP function interaction (468af22)
  • 🔧 Temporarily disable scheduled tasks that are too far away (be5e639)
  • 🔨 Fixed the problem that some models could not reversely supply the network due to the blocking of installation detection when using Gnirehtet (c5369af)
  • 🔨 Improve the reliability of the linux sandbox configuration tool (6de2538)
  • 🧑‍💻 Improve application performance with VueRouter (6a8c190)
  • 🧑‍💻 Improve device-based terminal experience (88a0356)
  • 🧑‍💻 Optimize application icon size under macOS (066d81f)
  • 🧑‍💻 Optimize the interactive experience of the device control bar (8388646)
  • 🩹 Add an option to enable keyboard fix on app startup to be compatible with older versions of scrcpy (be89b36)
  • 🩹 Closing a screen via the control bar no longer requires creating a help window (84c7be7)
  • 🚀 Adjust options to support scrcpy v3.0 (0602676)
  • 🚀 After getting the device list, query and save the SerialNo of each device in preparation for subsequent integration (4464e7e)
  • 🚀 Clean output when closing built-in terminal (c976d4c)
  • 🚀 Extended floating control bar function (790e703)
  • 🚀 File management supports returning to the root directory (2e27443)
  • 🚀 Improve app icon quality (8a6f4c7)
  • 🚀 Improve performance by asynchronously storing main interface boundary information (d230c15)
  • 🚀 Modify the adb connection method to be compatible with scan connection (e6e8a09)
  • 🚀 Optimization of window arrangement function (33786ab)
  • 🚀 Optimize device connection experience (0690f2d)
  • 🚀 Optimize device list connection behavior and configuration migration strategy (8237058)
  • 🚀 Optimize program performance (9af3988)
  • 🚀 Optimize system terminal stability (2ffc588)
  • 🚀 Optimize the built-in terminal interaction experience (bb56d5b)
  • 🚀 Optimize the default behavior when adding new widgets to the device window arrangement (1be470a)
  • 🚀 Optimize the details of the new version of the icon (db9b19a)
  • 🚀 Optimize the display effect of application icons under windows (e0c221f)
  • 🚀 Optimize the display effect of new icons in smaller sizes (7d91d71)
  • 🚀 Optimize the layout effect of the task list (044cfcd)
  • 🚀 Optimize the menu trigger method for the upload function (8d39f5b)
  • 🚀 Optimize the storage strategy for preference Settings (359b9b9)
  • 🚀 Provide feedback on the application shortcut addition (d7eca8d)
  • 🚀 Supports display of offline devices (dcf817f)
  • 🚀 Supports opening using the main monitor when starting the APP (aec9b78)
  • 🚀 The main panel supports single instance startup (c49d22c)
  • 🚀 Update to scrcpy v3.3.1 (a2bb039)
  • 🚀 Update to scrcpy v3.0 (bf06382)
  • 🚀 Update to scrcpy v3.0.2 (7510548)
  • 🚀 Update to scrcpy v3.1 (7c74c71)
  • 🚀 Update to scrcpy v3.2 (57c11af)
  • 🚀 Update to scrcpy v3.3 (bbf2335)
  • 🚀 Update to scrcpy v3.3.3 (8566644)
  • 🚚 Reduce some unnecessary verifications and increase the speed at which equipment starts reverse network supply (c17aaba)

Miscellaneous Chores

Code Refactoring

  • ♻️ Reconstruct the multi-device batch upload function (dbdaa35)
  • 🔨 Optimize code (f61d820)

1.34.2 (2025-12-08)

Performance Improvements

  • 📦️ Update the upload function to support file and directory selection, and optimize the interface layout (7f5bd35)
  • 🚀 Optimize the menu trigger method for the upload function (8d39f5b)

1.34.1 (2025-12-07)

Performance Improvements

  • 🍻 Improve file manager reliability (9063243)

1.34.0 (2025-12-07)

Features

  • ✨ Introducing a new file icon display component and enhancing the File Explorer dialog. (11be6f1)
  • 🚀 Split the file manager into independent windows and support multiple instances in parallel (f41d853)
  • 🚚 The file manager has been refactored and improved, and more useful features have been added. (5cd5992)

Bug Fixes

  • 🐛 Fixed the conflict between device control bar sorting and click events (18a57b9)
  • 🐛 Fixed the issue of abnormal path display in the file manager address bar (2f63f6f)
  • 🐛 Fixed the issue where Chinese text cannot be saved in file management read and write text (34785dd)

Performance Improvements

  • ♻️ Optimize file manager interaction (b168cc3)
  • ✨ Enable new icon (695e35d)
  • 🌱 Optimize app icon background color and corner radius. (bc4f492)
  • 🌱 Optimize application icon details (55800be)
  • 📝 Optimize the scheduled task list (c666709)
  • 🧑‍💻 Optimize application icon size under macOS (066d81f)
  • 🧑‍💻 Optimize the interactive experience of the device control bar (8388646)
  • 🚀 Improve app icon quality (8a6f4c7)
  • 🚀 Optimize program performance (9af3988)
  • 🚀 Optimize the details of the new version of the icon (db9b19a)
  • 🚀 Optimize the display effect of application icons under windows (e0c221f)
  • 🚀 Optimize the display effect of new icons in smaller sizes (7d91d71)

1.33.0 (2025-11-20)

Features

  • ✨ Add system terminal support (e5c157e)

Bug Fixes

  • 🐛 Fix issue with incorrect address bar path when returning to the previous level in file management (0222675)
  • 🐛 Fix the problem of Windows calling system terminal failure (194689e)
  • 🐛 Fix the problem of Windows terminal injection command failure (fbf88d0)
  • 🐛 Fixed the issue where PowerShell failed to call the system terminal (7beb027)

Performance Improvements

  • 🔖 Optimize interaction of preferred terminal options (900dc69)
  • 🚀 Clean output when closing built-in terminal (c976d4c)
  • 🚀 Optimize system terminal stability (2ffc588)
  • 🚀 Optimize the built-in terminal interaction experience (bb56d5b)

1.32.2 (2025-09-29)

Performance Improvements

  • 🚀 Update to scrcpy v3.3.3 (8566644)

1.32.1 (2025-09-10)

Performance Improvements

  • 🌱 UI details and documentation optimization (5b5bbf7)

1.32.0 (2025-09-08)

Features

  • ✨ Now supports copying device screenshots and recording files to the clipboard (bdb3644)
  • 🚀 Update to scrcpy v3.3.2 (462536c)

Bug Fixes

  • 🐛 Fixed the issue where recorded files could not be copied to the clipboard under Windows (119b518)
  • 🔧 Fixed button loading prompt conflict issue (c323ad6)

Performance Improvements

  • ✅ Provides the function of detecting and migrating configurations when deleting a device (39e0533)
  • 📌 Standardize the device list lifecycle processing flow. IPv6 addresses must be enclosed in [] and the port number cannot be omitted for wireless connections. (93c059d)
  • 🚀 Modify the adb connection method to be compatible with scan connection (e6e8a09)
  • 🚀 Optimize device list connection behavior and configuration migration strategy (8237058)

1.31.3 (2025-09-01)

Performance Improvements

  • 💄 Window layout adapted to dark mode theme (eab402b)

1.31.2 (2025-09-01)

Bug Fixes

  • 🐛 Resolved the issue where the device list could not be displayed due to compatibility issues with certain devices (2c53b77)

Performance Improvements

  • 🚀 Optimization of window arrangement function (33786ab)

1.31.1 (2025-08-29)

Performance Improvements

  • 👷 Remove redundant code comments (ca4e826)

1.31.0 (2025-08-29)

Features

  • ✨ Device lists will now intelligently merge duplicate device entries and share device configurations (52cc4b1)
  • ✨ Now you can arrange your device windows through a graphical interface (91ad249)

Bug Fixes

  • 🐛 Fix typos (a7a3a17)
  • 🐛 Fixed possible sandbox issues on Linux (ff9f9bd)
  • 🐛 Fixed the issue of saving exceptions after adjusting parameters in preference settings (4a18f61)
  • 🐛 Issue not taking effect after restarting the application after switching themes (857c480)

Performance Improvements

  • ♻️ Improve the stability of window arrangement function (7ae3f21)
  • ♻️ Simplify sandbox automatic configuration manager code to improve performance (1b82336)
  • 💄 Improve space utilization of device window layout tools (939a2d2)
  • 🔖 Adjust the order of quick entry functions (ccb59e1)
  • 🔨 Improve the reliability of the linux sandbox configuration tool (6de2538)
  • 🚀 After getting the device list, query and save the SerialNo of each device in preparation for subsequent integration (4464e7e)
  • 🚀 Improve performance by asynchronously storing main interface boundary information (d230c15)
  • 🚀 Optimize the default behavior when adding new widgets to the device window arrangement (1be470a)
  • 🚀 Optimize the layout effect of the task list (044cfcd)
  • 🚀 Optimize the storage strategy for preference Settings (359b9b9)

1.30.2 (2025-07-15)

Performance Improvements

  • ♻️ Optimize device list interaction logic (3812061)
  • 📝 Add Japanese language support (969378f)

1.30.1 (2025-07-14)

Bug Fixes

  • 🐛 Fixed the issue where all configurations would be cleared when resetting the category configuration in preferences (6ee9a92)
  • 🐛 Solve the problem of abnormal display timing when recording related functions are successful (67d279e)
  • 📝 Fixed the issue that special characters in Windows prevented the creation of app shortcut launch (301dac5)

Performance Improvements

  • 📝 Optimized startup app package name display (22eb718)
  • 🔧 Optimized startup APP function interaction (468af22)

1.30.0 (2025-07-14)

Features

  • 🔍️ Optimize the search function of the app (94ccb7b)
  • 🚀 Supports dragging the device control bar to sort (64a98b2)

Bug Fixes

  • 🐛 Fixed the issue of layout flickering when refreshing the device list page (608b8f3)
  • 🐛 Fixed the issue where activating the program on macOS in certain situations would cause the tray to be created repeatedly (cf8e183)
  • 🐛 Fixed the issue where there is a chance of an error when closing the floating control bar on macOS (5c2c711)
  • 🚀 Fix the issue of abnormal program exit behavior under windows (705f8be)

Performance Improvements

  • ♻️ Code structure optimization (595216b)
  • 👥 Control bar sorting supports state synchronization (88abe95)
  • 📝 Optimize the title of the control interface to solve the problem of duplicate device names (06a151d)
  • 🔀 Optimize the storage policy configured in preferences (b9faabf)
  • 🚀 Supports opening using the main monitor when starting the APP (aec9b78)

1.29.9 (2025-06-27)

Performance Improvements

  • 🚀 Update to scrcpy v3.3.1 (a2bb039)

1.29.8 (2025-06-20)

Bug Fixes

  • 🐛 Update scrcpy-server file to solve the problem of not being able to obtain device APP list (63f7135)

1.29.7 (2025-06-16)

Performance Improvements

  • 🚀 Update to scrcpy v3.3 (bbf2335)

1.29.6 (2025-04-27)

Performance Improvements

  • 📝 Added Arabic language support (f6c9fa4)
  • 🚀 File management supports returning to the root directory (2e27443)

1.29.5 (2025-04-17)

Bug Fixes

  • 🐛 Fix the problem of build failure caused by missing dependencies (e34e1c2)

1.29.4 (2025-04-17)

Bug Fixes

  • 🐛 Fixed an issue where some options in preferences could not be turned off (269bd29)

Performance Improvements

  • 💫 Adjust gnirehtet configuration behavior to make it consistent with user operation habits (7507915)
  • 🔍️ Optimize QR code style to avoid scanning problems on some devices (dd3ad6c)
  • 🩹 Add an option to enable keyboard fix on app startup to be compatible with older versions of scrcpy (be89b36)

1.29.3 (2025-04-02)

Performance Improvements

  • 📝 Add docs entry to the program (db5d157)
  • 🚚 Reduce some unnecessary verifications and increase the speed at which equipment starts reverse network supply (c17aaba)

1.29.2 (2025-03-31)

Performance Improvements

  • 🔨 Fixed the problem that some models could not reversely supply the network due to the blocking of installation detection when using Gnirehtet (c5369af)

1.29.1 (2025-03-31)

Performance Improvements

  • 🔊 Expanded audio source options (fc91f07)
  • 🩹 Closing a screen via the control bar no longer requires creating a help window (84c7be7)
  • 🚀 Update to scrcpy v3.2 (57c11af)

1.29.0 (2025-03-27)

Features

  • 🚀 Support adding the open application action to the desktop shortcut. (Not supported on macOS) (add251f)
  • 🚚 Support batch startup mirroring (fcfd78e)

Bug Fixes

  • 🐛 Solve the conflict between floating navigation bar and quick APP launch (460aca1)
  • 🐛 Solve the problem of startup error of development mode under Linux (5c4f65e)

Performance Improvements

  • ✨ The floating control bar supports transparent display when inactive (34f27c5)
  • 👷 Explicitly clean up unnecessary child processes on exit (0549dda)
  • 👽️ Experimental support for adding open application actions to linux desktop shortcuts (6897c0e)
  • 👽️ Experimentally add linux arm64 support (5b033fd)
  • 💄 Optimization of display effect of device list page (305187d)
  • 💫 Support appending gnirehtet custom parameters in configuration (206a030)
  • 🚀 Provide feedback on the application shortcut addition (d7eca8d)

1.28.7 (2025-02-17)

Bug Fixes

  • 🐛 Fixed the issue of duplicate filter conditions in the device list (6c4242c)
  • 🐛 Solved the problem that the main window could not be restored after being moved off the screen in some cases (d054f8d)

Performance Improvements

  • ⬆️ Improved performance of automated mirroring (33a03c3)
  • 💄 Optimize the display effect of horizontal screen screenshots (90c7163)
  • 🚀 The main panel supports single instance startup (c49d22c)

1.28.6 (2025-02-05)

Bug Fixes

  • 🐛 Resolving build errors (d21fa29)

1.28.5 (2025-02-05)

Performance Improvements

  • ✅ File management supports selecting directories for uploading (fd2e639)
  • ⬆️ Improve QR code connection performance (b413889)

1.28.4 (2025-01-13)

Bug Fixes

  • 🐛 Fix the display ID value type error (2b7ee79)
  • 🐛 Solve the problem of IPV6 address connection failure (1a95325)

Performance Improvements

  • ♻️ Improve wireless connection stability (85be898)
  • ⚡️ Optimize the method of obtaining the available displays of the device (9e31c84)
  • 🐛 Improve wireless connection verification method (69fecc3)
  • 👷 Added edge hiding function switch (d25714a)

1.28.3 (2024-12-28)

Performance Improvements

  • ♻️ Optimize device details performance (38d1433)

1.28.2 (2024-12-27)

Performance Improvements

  • 👷 Optimize the edge hiding function (d5caaa9)
  • 📸 Support viewing real-time images and power information of the device (d262adf)

1.28.1 (2024-12-20)

Performance Improvements

  • ♻️ Optimize QR code connection experience (86f5e69)

1.28.0 (2024-12-20)

Features

  • ✨ Support pairing and connecting to devices via QR code (14306b2)
  • 🚀 Supports connecting historical devices via device list (e0687e8)

Bug Fixes

  • 🐛 Solve the problem of Windows disabling video forwarding and crashing (10b902a)

Performance Improvements

  • ♻️ Update mirror icon (c214e5a)
  • ✅ A new method is adopted to solve the problem of IP type configuration storage (5488a1e)
  • 🚀 Optimize device connection experience (0690f2d)
  • 🚀 Supports display of offline devices (dcf817f)

1.27.7 (2024-12-10)

Performance Improvements

  • 🚀 Update to scrcpy v3.1 (7c74c71)

1.27.6 (2024-12-05)

Bug Fixes

  • ♻️ Fixed repeated dependency issues (9777622)

Performance Improvements

  • ♻️ Optimized contextBridge related improvements for stability (0e098c3)
  • ♻️ Reduce build package size by removing redundant dependencies (7b61b25)
  • 🚀 Update to scrcpy v3.0.2 (7510548)

1.27.5 (2024-11-29)

Performance Improvements

  • ➖ Remove redundant console (9a67142)

1.27.4 (2024-11-29)

Bug Fixes

  • 🐛 Fix automatic release (c2254aa)
  • 🐛 Fixed an issue where macos built-in updates failed (432eceb)

1.27.3 (2024-11-28)

Bug Fixes

  • 🐛 Fix for built-in scrcpy not supporting x64 macos (0d60655)

Performance Improvements

  • ♻️ Improved device connection stability (1d603ab)
  • ♻️ Optimized the adb daemon startup failure detection mechanism (ca6be85)
  • 🧑‍💻 Improve device-based terminal experience (88a0356)

1.27.2 (2024-11-26)

Bug Fixes

  • 🐛 Start app to adapt to dark mode (ae13fde)

1.27.1 (2024-11-25)

Bug Fixes

  • 🐛 Make StartApp compatible with scrcpy v3.0 (1082e0d)

Performance Improvements

  • 🚀 Adjust options to support scrcpy v3.0 (0602676)
  • 🚀 Update to scrcpy v3.0 (bf06382)

1.27.0 (2024-11-21)

Features

  • ✨ Support edge hiding function (14a81de)

Performance Improvements

  • ⬆️ Optimize edge hiding performance (74a91a4)

1.26.4 (2024-11-14)

Bug Fixes

  • 🐛 Temporarily disable scrcpy integration in macOS (9bf4d5c)

1.26.3 (2024-11-08)

Bug Fixes

  • 🐛 Fix device support audio and video encoding cannot be parsed (9b7f6a9)
  • 🐛 Restore the --display-buffer parameter to solve the mirroring problem (0f3d869)

Performance Improvements

  • ♻️ Support interruption during waiting for wireless connection (344b385)
  • ♻️ Supports retrieving a list of applications (b1a6ba7)
  • ⚡️ Optimize startup application performance (8e94494)

1.26.2 (2024-11-06)

Bug Fixes

  • 🐛 Fix linux build errors (9b43dc0)

1.26.1 (2024-11-06)

Performance Improvements

  • ♻️ No longer building universal packages for macOS (db5deb4)

1.26.0 (2024-11-06)

Features

  • ✨ Integrate scrcpy binaries for macos (85bf096)
  • ✨ Supports starting applications for mirroring (d19e781)

Bug Fixes

  • 🐛 Rename --display-buffer to --video-buffer (b2bb0ae)
  • 🐛 Repair floating action bar start application error (487e7e2)
  • 🩹 Restore the windows build configuration (9491069)

Performance Improvements

  • ♻️ Adjust the position of the start application button (9833932)
  • ♻️ When the application fails to start, display the error message (dbc34d6)
  • ⚡️ Improve the start APP experience (29e5e1b)

1.25.5 (2024-11-05)

Performance Improvements

  • ⚡️ Optimize the stability of options that need to dynamically obtain parameters in preference settings (39bbc98)

1.25.4 (2024-10-31)

Performance Improvements

  • ♻️ Enhance recording stability (3dd7525)
  • ♻️ Optimize camera recording stability (952b2a7)
  • 💄 Normalize control window titles and generated file names (ccc7f0e)

1.25.3 (2024-10-29)

Bug Fixes

  • 🔧 Camera recording and screen off configuration conflict (4508758)

Performance Improvements

  • 🔧 Temporarily disable scheduled tasks that are too far away (be5e639)

1.25.2 (2024-10-29)

Bug Fixes

  • 🐛 Resolve default recording error (358064e)

1.25.1 (2024-10-28)

Miscellaneous Chores

1.25.0 (2024-10-28)

Features

  • ✨ Support to close the device screen when controlling (a84c775)
  • 📸 Enhanced recording (7f10161)

Performance Improvements

  • ♻️ Optimize camera recording (4be2cf4)
  • ♻️ Script and directory structure optimization (68378ef)
  • ⚗️ Experimental support for turning off screen controls (9555f58)
  • ⚡️ Optimize scrcpy parameter conversion performance (18dcd24)
  • 💄 Improved Russian display (ca79e1b)
  • 📸 Recording camera support (10d0370)

1.24.3 (2024-10-21)

Performance Improvements

  • 💄 Optimize Russian display effect (5ca39ae)

1.24.2 (2024-09-16)

Bug Fixes

  • 🐛 Fix the mirror group bug (cd7d9cd)

1.24.1 (2024-09-16)

Performance Improvements

  • ✨ Update to scrcpy@2.7 to support the gamepad (0053e87)
  • ⬆️ Optimize the performance of the floating control bar (a1c60ec)
  • 🚀 Extended floating control bar function (790e703)

1.24.0 (2024-09-12)

Features

  • ✨ Support floating control bar (8807e50)

Performance Improvements

  • ✅ Support switching devices on the floating control bar (50440f5)
  • 💄 Optimize preference setting button layout (47ae53d)

1.23.6 (2024-09-09)

Bug Fixes

  • 🐛 Fixed the problem of minimizing the visibility of tray icons (b0f42aa)
  • 🐛 Repair ADB timeout problems (b5bffc5)

1.23.5 (2024-09-09)

Performance Improvements

  • ♻️ Improve ADB connection stability (7655ba6)

1.23.4 (2024-09-08)

Bug Fixes

  • 🐛 Repair part of internationalization Lost dynamics (d18444f)

1.23.3 (2024-09-08)

Performance Improvements

  • ♻️ Optimize the performance of equipment interaction column and file manager (41ffcf5)

1.23.2 (2024-09-07)

Performance Improvements

  • 🚀 Support file manager upload to the current directory (737c2a3)

1.23.1 (2024-09-07)

Performance Improvements

  • ⬆️ Update dependencies (8b03862)

1.23.0 (2024-09-07)

Features

  • ✨ Support graphic file manager (8155723)
  • 🚀 Initially add a new file manager (94ee007)

Performance Improvements

1.22.4 (2024-08-03)

Bug Fixes

  • 🐛 plan task Remove operation bug (5205935)

Performance Improvements

1.22.3 (2024-08-03)

Performance Improvements

  • ♻️ Update scrcpy to 2.6.1 (1eef9d2)

1.22.2 (2024-07-25)

Performance Improvements

  • 💄 Optimize the display effect of the dark mode (38f854b)
  • 💄 Optimize the display effect of the quick operation bar (7b3c4db)
  • 💄 Optimize the display effect of the tabs bar (5b2d41c)

1.22.1 (2024-07-25)

Bug Fixes

  • 🐛 Fixed asset publishing issues (222f626)

1.22.0 (2024-07-25)

Features

  • 🚀 Add a scheduled task list (d72202b)
  • 🚀 Add basic timing task function (04a7608)
  • 🚀 Add timing task entrance (8393c85)
  • 🚀 添加定时任务入口 (6ce66d4)

Bug Fixes

  • 🐛 The internationalization problem of repairing path selector (8e6af20)
  • 💄 Optimize wireless connection user interface (50ae742)

Performance Improvements

  • 💄 Optimization of the operation bar at the top of the equipment list (81bd3d9)
  • 💄 Optimized operation button layout (16f9535)

1.21.4 (2024-07-14)

Performance Improvements

  • ♻️ Optimize custom startup performance (abd468b)
  • ♻️ Perfect allSettledWrapper method (5b7d0af)

1.21.3 (2024-07-13)

Bug Fixes

  • Fix the width problem of custom startup pop-up windows (9a7e56b)

1.21.2 (2024-07-13)

Bug Fixes

  • 🐛 Fix terminal style abnormalities in dark theme (3d4dc7c)

Performance Improvements

  • ♻️ Improve code robustness (2f389af)
  • 🚀 Optimize batch operation interaction (343eab2)

1.21.1 (2024-07-13)

Bug Fixes

  • 🐛 Fix dependency build errors (5b02621)

1.21.0 (2024-07-13)

Features

  • 🎉 Support batch execution script function (8097022)
  • 🚀 Support execution script function (2013413)

Bug Fixes

  • 🐛 Repair the problem of equipment width in the English state (25c42d9)
  • 📝 Update Translation (33b0181)

Performance Improvements

  • ✅ Support batch screenshot and other performance optimization (db9e3e7)
  • ✨ Support for custom startup mirroring (677f30c)
  • 🐛 Fix the problem of frequently trigger preservation of preferences (8261916)

1.20.1 (2024-07-04)

Bug Fixes

  • 🐛 Fix batch text spelling errors (062c689)

1.20.0 (2024-07-04)

Features

  • ✨ Add batch installation application function (37ce245)

Performance Improvements

  • 🚀 Add mouse binding options (7ee4ba4)

1.19.4 (2024-07-02)

Bug Fixes

  • 🐛 Fix terminal style problems (9fc1ded)
  • Update Chinese language translations (b8d77e3)

Performance Improvements

  • 🚀 Update to scrcpy v2.5 (22cc5a3)

1.19.3 (2024-06-13)

Bug Fixes

  • 🐛 Abnormal operations cause the program that cannot be closed (b989140)

1.19.2 (2024-06-03)

Bug Fixes

  • 🐛 Automatically apply local languages (0cc8208)

1.19.1 (2024-05-26)

Bug Fixes

  • 🐛 In some cases, the light mode is abnormal (ea227e0)
  • 🐛 Search for shortcut key conflicts (c70e6ca)

Performance Improvements

1.19.0 (2024-05-15)

Features

  • 🚀 Add page search function (6dd8244)
  • 🚀 Update dependencies to support ESM (9f1696f)

Bug Fixes

  • 🐛 Resolving build failures (8460945)
  • 🐛 Tips unavailable (603e4e9)

Performance Improvements

  • ♻️ FindInPage API (fcf8269)
  • ♻️ Optimize dark mode (2f2e1cf)
  • ♻️ Search interaction (a195b7e)
  • ♻️ Search variable name (7c55e50)
  • 🐛 Global search error (091d503)
  • 🚀 优化页面查找工具性能 (8587977)

1.18.4 (2024-05-04)

Bug Fixes

  • 🐛 Wireless adb does not support Spaces (1f27597)

1.18.3 (2024-04-12)

Performance Improvements

  • ♻️ i18n configuration (1ca0469)

1.18.2 (2024-04-11)

Bug Fixes

  • 🐛 zh_TW Language support (885af3a)

1.18.1 (2024-04-11)

Bug Fixes

  • 🔧 Repair merge zh-TW failed (81ff63f)

Performance Improvements

1.18.0 (2024-04-11)

Features

  • Add a simple zh_TW Traditional Chinese locale (cec6539)

1.17.8 (2024-03-29)

Bug Fixes

  • 🐛 Camera configuration conflict (07cc5f3)
  • 🐛 OTG configuration conflict (576d287)
  • 🐛 OTG mode: could not turn screen off (c5bed0e)

1.17.7 (2024-03-27)

Bug Fixes

  • ♻️ Remove the redundant imports (a06708f)

Performance Improvements

  • ♻️ Optimize delete history logic (780e3b9)
  • ♻️ Support delete historical connection (c82560f)
  • 💄 Wireless style optimization (ba51fe3)

1.17.6 (2024-03-21)

Performance Improvements

  • ♻️ Supports automatic execution of mirrors on devices (11e0884)

1.17.5 (2024-03-17)

Performance Improvements

1.17.4 (2024-03-14)

Performance Improvements

  • ♻️ Options in the preference settings (dc711cb)

1.17.3 (2024-03-13)

Performance Improvements

  • ♻️ Remove console log (6e25eb7)

1.17.2 (2024-03-10)

Bug Fixes

  • 🐛 Abnormal built-in terminal adb command (368551a)

Performance Improvements

  • ♻️ Update eslint config (bf2d2b4)

1.17.1 (2024-03-05)

Performance Improvements

  • ♻️ Interactive logic optimization (193f80a)
  • ♻️ Optimize design and code (d507c2d)
  • ♻️ Optimize equipment operation (389ac33)
  • ➖ Remove redundant packages (f9e4a0e)
  • 💄 Optimize dark mode styles (1cac054)

1.17.0 (2024-03-04)

Features

  • 🎉 Update to scrcpy v2.4 (02a4d39)

1.16.8 (2023-12-27)

Bug Fixes

  • 🐛 The maximum size description error (01fd926)

1.16.7 (2023-12-19)

Performance Improvements

1.16.6 (2023-12-19)

Miscellaneous Chores

1.16.5 (2023-12-19)

Performance Improvements

  • 📝 Control in stop charging (8707eb5)

1.16.4 (2023-12-19)

Bug Fixes

  • 🐛 Pairing code type issue (889fe8c)

1.16.3 (2023-12-03)

Performance Improvements

  • 🚀 Update scrcpy v2.3.1 (3566655)

1.16.2 (2023-12-02)

Bug Fixes

1.16.1 (2023-11-26)

Bug Fixes

1.16.0 (2023-11-26)

Performance Improvements

Miscellaneous Chores

1.15.0 (2023-11-18)

Features

  • 添加投屏窗口大小控制 (97d7868)

Performance Improvements

  • 🚀 Add window position option (866aa2c)

1.14.3 (2023-11-17)

Performance Improvements

  • ♻️ Add context menu (f0f25a7)
  • ♻️ Optimize extended menu bar interaction (de9352c)
  • 📝 Optimization preferences description (30eca50)

1.14.2 (2023-11-16)

Performance Improvements

  • ♻️ Optimize autoConnect historical devices (755a130)
  • 💡 Add autoConnect option (a57b847)

1.14.1 (2023-11-14)

Bug Fixes

  • 🐛 Abnormal terminal theme (20d37c1)

1.14.0 (2023-11-14)

Features

  • 🎉 Add Terminal Debugging (fdf40c7)

Performance Improvements

  • ♻️ Optimize terminal performance (d3afc4b)
  • 💄 Update terminal style (5b6b8d1)
  • 🚨 Optimization error prompt (b759502)

1.13.5 (2023-11-11)

Performance Improvements

  • ♻️ Mirror group shutdown logic (296e21d)
  • ♻️ Optimize mirror group (5793c24)

1.13.4 (2023-11-10)

Performance Improvements

  • ♻️ Optimization updater (61ccd4a)
  • ♻️ Optimize mirror group (81c007f)

1.13.3 (2023-11-10)

Bug Fixes

  • 🐛 Recording prompt and file format errors (bfdad9e)

Performance Improvements

  • ♻️ Optimize Batch connection performance (36de67b)
  • ♻️ Optimize file push prompts (4a3575f)
  • ♻️ Optimize historical device connections (83f8c04)
  • ✨ Support bulk connecting to historical devices (b7eb1dd)

1.13.2 (2023-11-09)

Bug Fixes

Performance Improvements

  • ♻️ Configure Incompatible Handling Mechanism (c0e6a01)
  • ♻️ Optimize gnirehtet (de3555b)
  • 💄 Optimize volume control and gnirehtet (b40bdcf)
  • 🚀 Add File push function (70f8b46)
  • 🚀 Add screen rotation shortcut menu (dd601df)

1.13.1 (2023-11-08)

Performance Improvements

  • ♻️ Adjust volume control position (1b3f49e)
  • ♻️ Optimize configuration file logic (5f8cc5a)
  • 🚀 Add volume control (1505518)

1.13.0 (2023-11-07)

Features

  • 🎉 Add mirror group function (0c9d36f)

Bug Fixes

Performance Improvements

  • ♻️ Optimize mirror group (cf9c82d)
  • ♻️ optimize mirror group tips (46defbf)
  • ♻️ Optimize preferences (7a6417e)
  • ♻️ Optimize window control (0530ed3)
  • 💄 Update styles (37da97b)
  • 🚀 Add camera options (5a04b4c)

1.12.4 (2023-11-03)

Bug Fixes

  • 🐛 MacOS reduced to the tray to evoke failure (d7bf83b)

1.12.3 (2023-11-03)

Bug Fixes

  • 🐛 MacOS reduced to the tray to evoke failure (6153bc4)

1.12.2 (2023-11-03)

Bug Fixes

1.12.1 (2023-11-03)

Bug Fixes

  • 🐛 Add gnirehtet fix option (f9c6c32)
  • 🐛 Display options cannot be changed (3046746)
  • 🐛 Preference style (0f72090)
  • 🐛 Reset preferences language not restored (d691780)
  • 🐛 Unable to update path selector (3279c34)
  • 🐛 Video codec preset error (1af9abd)

Performance Improvements

  • ♻️ optimize Codec (6154ffc)
  • ♻️ Optimize recording (f4dfb2c)
  • 🎨 Update preferences style (e9befea)

1.12.0 (2023-11-02)

Features

  • 🎉 Update Scrcpy to v2.2 (5c401a8)

Bug Fixes

Performance Improvements

1.11.9 (2023-10-31)

Performance Improvements

  • ♻️ Optimization gnirehtet and scrcpy (9cf800c)
  • ♻️ Optimize Gnirehtet interaction (a90e570)

1.11.8 (2023-10-31)

Bug Fixes

  • 🎨 修复 macOS 设置主题跟随系统后 某些情况下循环触发导致死循环的问题 (1d7b188)

1.11.7 (2023-10-31)

Bug Fixes

  • 🐛 macOS x64ArchFiles Errors (151cb29)

1.11.6 (2023-10-31)

Bug Fixes

  • 🐛 macOS x64ArchFiles Errors (7dbca01)

1.11.5 (2023-10-31)

Bug Fixes

  • 🐛 macOS x64ArchFiles Errors (ad3f77f)

1.11.4 (2023-10-31)

Bug Fixes

  • 🐛 macOS x64ArchFiles Errors (4b4e116)

1.11.3 (2023-10-31)

Bug Fixes

  • 🐛 Unix permission issues (1279994)
  • 🐛 Unix permission issues (dc9a3c4)
  • 🐛 x64ArchFiles Error (82a99d9)

1.11.2 (2023-10-30)

Bug Fixes

  • 🐛 修复 macOS 打包失败的问题 (1b2236c)

1.11.1 (2023-10-30)

Bug Fixes

  • 🐛 修复 macOS 打包失败的问题 (37e2837)

1.11.0 (2023-10-30)

Features

  • 🎉 Add gnirehtet reverse tethering function (2c97189)

Bug Fixes

  • 🐛 gnirehtet custom dependent paths error (cfd0e1d)

Performance Improvements

  • ♻️ Optimize Gnirehtet interaction (e1237cd)
  • ♻️ 拆分依赖文件禁用冗余的警告信息 (93ad836)
  • ♻️ 目录结构及描述调整 (f9a32d6)
  • ♻️ 补充依赖及目录结构调整 (b18256b)

1.10.2 (2023-10-28)

Bug Fixes

  • 🐛 修复设置主题跟随系统后没有生效的问题 (95a83f4)

1.10.1 (2023-10-28)

Bug Fixes

  • 🐛 修复 linux 无法启动镜像或录制服务以及修改自定义依赖目录的问题 (d815643)

1.10.0 (2023-10-27)

Features

  • 🚀 新增支持 深色模式、国际化语言、运行日志等功能 (4b13f58)

Bug Fixes

  • 🐛 修复 linux 打包后图标丢失的问题 (217d82d)
  • 🐛 修复安装路径包含空格会导致无法启动服务的问题 (29ae786)
  • 🐛 修复录制结束点击取消异常弹窗以及点击重启服务没有反应的问题 (054c55b)
  • 🔧 修复自定义路径功能没有生效的问题 (894b581)

Performance Improvements

1.9.1 (2023-10-24)

Performance Improvements

  • 💄 窗口控制及交互逻辑优化 (52514e2)

1.9.0 (2023-10-24)

Features

  • 🚀 添加 i18n 初步支持 (18d490f)

Bug Fixes

  • 🐛 修复 macOS 最小化到托盘后状态栏图标不显示的问题 (a789826)

1.8.17 (2023-10-23)

Bug Fixes

  • 🐛 尝试修复构建失败 (daeb9e5)

1.8.16 (2023-10-23)

Performance Improvements

  • ✨ 采用新的 Logo 设计 (3bf79d3)

1.8.15 (2023-10-22)

Bug Fixes

  • 🐛 修复 Linux 平台启动白屏无法正常使用的问题 (54e713b)

1.8.14 (2023-10-21)

Bug Fixes

  • 🐛 修复 linux 打包配置错误的问题 (a9668d9)

1.8.13 (2023-10-21)

Performance Improvements

  • 🚀 为 windows 添加 ARM64 软件包编译 (368e8ee)
  • 🚀 支持所有平台在点击关闭按钮时选择是否保存到托盘中的功能 (8360198)

1.8.12 (2023-10-21)

Bug Fixes

  • 🐛 修复 macOS 或 linux 下自定义依赖选项描述错误的问题 (0d4b1ce)

1.8.11 (2023-10-21)

Performance Improvements

  • 🔨 优化窗口默认大小 (393e899)

1.8.10 (2023-10-20)

Bug Fixes

  • 🐛 修复 macOS 窗口问题 (f768566)

1.8.9 (2023-10-20)

Bug Fixes

  • 🐛 修复 macOS 窗口过小导致出现横向滚动条的问题 (8ee34ca)

1.8.8 (2023-10-20)

Bug Fixes

  • 🚀 修复 macOS 简单关闭应用重新打开时报错的问题 (4b259c3)

1.8.7 (2023-10-20)

Bug Fixes

  • 🐛 修复打包多个平台时可能生成重复文件导致发布软件包失败的问题 (e89a7a5)

1.8.6 (2023-10-20)

Bug Fixes

  • 🔧 修复 macOS 无法正确获取系统依赖路径的问题 (2352593)

1.8.5 (2023-10-20)

Bug Fixes

  • 🚑️ 修复 Linux maintainer 问题 (4e1542a)

1.8.4 (2023-10-20)

Bug Fixes

  • 🚑️ 修复 Linux 打包失败的问题 (96f85d8)

1.8.3 (2023-10-20)

Bug Fixes

  • 🚀 修复 MacOS 软件包安装后无线显示 Logo 的问题 (77dd81b)

1.8.2 (2023-10-20)

Bug Fixes

  • 🔧 修复 Linux 及 MacOS 获取默认依赖路径异常的问题 (87b533f)
  • 🔧 修复 MacOS ARM64 版本打包失败的问题 (e9a8fc2)

1.8.1 (2023-10-20)

Performance Improvements

  • 🚀 支持创建更多架构的 MacOS 软件包格式 (4780e7c)

1.8.0 (2023-10-20)

Features

  • 🚀 初步添加对 Linux 以及 MacOS 的支持 (569ed2e)

Bug Fixes

  • 📝 偏好设置描述信息修改 (23d68d4)
  • 🔧 设备列表标签显示细节调整 (4f2f00e)

Performance Improvements

  • 📝 设备备注文本框描述信息调整 (379b325)

1.7.1 (2023-10-20)

Bug Fixes

  • 🚀 修复对设备进行独立配置时的一些问题 (6ccd6d0)

Performance Improvements

  • 🎉 初步支持设置偏好设置的作用域范围 (5dd328c)

1.7.0 (2023-10-19)

Features

  • 🚀 新增支持导入及导出配置 (326a133)
  • 🚀 新增支持添加设备备注 (43f15be)

Performance Improvements

  • ➕ 设备交互栏添加重启设备及打开通知栏功能 (1341fb8)

1.6.10 (2023-10-18)

Performance Improvements

  • 🚀 采用新的方法实现所有进程共享 isPackaged (8a5f7d9)

1.6.9 (2023-10-17)

Bug Fixes

  • 🔧 优化 isPackaged 判断条件解决某些情况下资源路径解析异常的问题 (fbd1885)

1.6.8 (2023-10-17)

Performance Improvements

  • 🚀 支持通过操作栏安装应用并提供相应安装反馈 (3bd2075)

1.6.7 (2023-10-17)

Performance Improvements

  • 📝 去除冗余的依赖项 (a6744dc)

1.6.6 (2023-10-17)

Bug Fixes

  • 🐛 build fix (09c8dee)
  • 🐛 修复 electron 资源路径问题 (955756e)

1.6.5 (2023-10-16)

Bug Fixes

  • 🐛 修复 App NextTick 错误 (79d85eb)

1.6.4 (2023-10-16)

Bug Fixes

  • 🐛 修复 electron-builder 配置异常导致打包的文件无法发布的问题 (9a4efa5)
  • 🚀 修复设备列表按钮状态变更影响布局变化的问题 (83a8043)

1.6.3 (2023-10-16)

Bug Fixes

  • 🐛 修复打包后图标丢失的问题 (58a66f1)

1.6.2 (2023-10-13)

Bug Fixes

  • 🐛 修复USB未授权设备导致无线连接地址变为假值的问题 (9c25325)

1.6.1 (2023-10-13)

Performance Improvements

  • 🔨 自定义通用的文件存储路径相关逻辑完善 (8455e86)

1.6.0 (2023-10-13)

Features

  • 🚀 增加了对设备交互控制栏的支持 (fd20736)

1.5.3 (2023-10-13)

Bug Fixes

  • 🔧 修复点击无线模式没有反应的问题 (9d55ef9)

1.5.2 (2023-10-13)

Bug Fixes

  • 📝 修复高级配置标题语义不明的问题 (218de1c)

Performance Improvements

  • 🚀 添加更多的高级配置并更新文档 (922abd2)

1.5.1 (2023-10-12)

Bug Fixes

  • 🐛 去除页面组件冗余参数 (8e5df15)

1.5.0 (2023-10-12)

Features

  • 🚀 添加音视频录制功能以及更多的高级选项 (b6986d1)

1.4.1 (2023-10-12)

Bug Fixes

  • 🐛 修复检查更新失败没有提示的问题 (6f733ea)

1.4.0 (2023-10-11)

Features

  • 🚀 添加在线检查更新功能 (8de04e0)

Bug Fixes

  • 🔨 修复无线配对时表单验证错误 (7cd9ea3)
  • 🔨 修复直接进行无线连接时没有处理配对设备的问题 (4263d07)

1.3.3 (2023-09-26)

Bug Fixes

  • 🐛 修复触摸点配置描述错误的问题 (4e2be23)

1.3.2 (2023-09-19)

Bug Fixes

  • 🔧 修复旋转屏幕配置异常的问题 (af7a319)

1.3.1 (2023-09-19)

Bug Fixes

  • 🔧 修复图标不透明的问题 (24c011f)

1.3.0 (2023-09-19)

Features

  • ✨ 用户界面进行优化,制作了合适的 Logo (1b96ffc)

1.2.0 (2023-09-19)

Features

  • 🎉 优化设备界面视图并添加虚拟控制栏配置 (3be0682)

1.1.0 (2023-09-18)

Features

  • 🚀 增加了常用的 Scrcpy 高级配置 (ac52df2)

1.0.2 (2023-09-18)

Performance Improvements

  • 🚀 合并无线连接及有线连接到设备列表 (e84f24e)

1.0.1 (2023-09-16)

Bug Fixes

  • 🔧 去除未测试环境的打包以修复构建失败的问题 (d6ec7fd)

1.0.0 (2023-09-16)

Features

  • 📝 添加基本的有线连接支持 (647a0c5)
  • 🚀 添加 Electron 基本支持 (a46a5e1)
  • 🚀 添加初步的构建及发布支持 (c85f8fb)
  • 🚀 添加基本的无线连接功能 (6dd2db9)

Bug Fixes

  • 🔧 修复 ADB 环境变量配置错误导致无法连接的问题 (9ef7203)

+

Skip to content

Changelog

2.8.1 (2026-04-07)

Bug Fixes

  • 🐛 Fixed the problem of dark theme background not taking effect (ad19695)

Performance Improvements

  • 🎉 Increased free limit for batch automation scripts and device group controls to 5 devices. (11271f2)

2.8.0 (2026-04-06)

Features

  • ✨ Window arrangement supports the automatic arrangement function (696d94b)

Bug Fixes

  • 🐛 Fix i18n errors (e4ad3ec)
  • 🐛 Fix the default value issue of the subscription plan (a19dd9e)
  • 🐛 Fixed the issue where multiple files cannot be pasted when copied to the clipboard under Windows (dcc7a94)

Performance Improvements

  • ♻️ Optimize subscription plan (c12ef9d)
  • ♻️ Optimize the pricing strategy for advanced features to prevent misjudgments by users (4d722b7)
  • 💄 Optimize the display details of the embedded mirror window (6cf4c69)
  • 🚀 Automation script adds random range option (4d73e1a)
  • 🚀 Extended embedded mirroring operable shortcut buttons (19c0de2)
  • 🚀 Optimize subscription configuration (d053bfa)
  • 🚀 Optimize the automation script editor to avoid screen border issues (ffd56a6)
  • 🚀 Refactored file copy function supports batch copying to the clipboard (ccca99a)

Code Refactoring

  • ♻️ Optimize subscription plan default value acquisition (7b9c47f)
  • 🚀 Dynamically configure subscriptions by detecting the environment (d02e1b3)
  • 🚀 Fix typescript configuration (cbc8631)

2.7.3 (2026-04-02)

Bug Fixes

  • 🐛 Fixed an issue where embedded mirroring could not be input due to external activation elements. (058b982)

Performance Improvements

  • 🚀 Optimize the embedded image to open the application list display (7f6b18a)

Code Refactoring

  • 🔊 Optimize the wscrcpy audio cleaning logic (a29cd85)

2.7.2 (2026-04-01)

Bug Fixes

  • 🐛 Fix dependency not updated error (2d8ebfd)

2.7.1 (2026-04-01)

Bug Fixes

  • 🐛 Fixed the problem that the global search shortcut key does not take effect (e7596f9)

2.7.0 (2026-04-01)

Features

  • 🚀 Add wscrcpy cli parameter adapter (ea64b5e)
  • 🚀 Complete more parameters of wscrcpy (c48020b)
  • 🚀 Extend wscrcpy capabilities (0717688)
  • 🚀 Initial implementation of device group control function (4ea4e7d)
  • 🚀 Optimize group control experience (853e53d)
  • 🚀 Optimize the details of the mask layer module (c9da58e)
  • 🚀 Optimize the interaction details of the mask board module (b67582a)
  • 🚀 Redesign the overlay module guide page (c522fcb)
  • 🚀 Refactor the embedded image package to the wscrcpy package (5f8a309)
  • 🚀 Use tango-adb to directly render the device screen in the mask layer module (81d93dd)
  • 🚀 wscrcpy adds support for mouse hover monitoring (eb78931)
  • 🚀 wscrcpy only enables audio forwarding by default in the macos environment (5d510dc)

Bug Fixes

  • 🐛 Fix the issue of resetting the window position of the mirror module (d4c3a74)
  • 🐛 Fix the problem of data echo in automation steps (435c3de)
  • 🐛 Fix the problem of Wscrcpy audio forwarding exception (967a6c2)
  • 🐛 Fix the problem of wscrcpy group control failure (ea74182)
  • 🐛 Fix wscrcpy clipboard synchronization issue (42fee69)
  • 🐛 Fix wscrcpy reconnection problem (a6de9b9)
  • 🐛 Fixed sub-package build conflict and misalignment issue (99b22ba)
  • 🐛 Fixed syntax error in the action bar at the bottom of the overlay (ef0a301)
  • 🐛 Fixed the problem of abnormal calculation of size ratio when switching the main device on the group control page (5ad014f)
  • 🐛 Fixed the problem of abnormal disconnection of wscrcpy video stream when exiting the program (174a01c)
  • 🐛 Fixed the problem of interactive forwarding conflict when group control is enabled for auxiliary devices (60ae2a4)
  • 🐛 Fixed the problem of mask layer adaptation button forwarding (4be239e)
  • 🚀 Fix mask layer test issue (33581df)
  • 🚀 Fixed overlay module screen rotation issue (ad0af45)
  • 🚀 Fixed wscrcpy audio and clipboard synchronization configuration conflict issue (5bb65e0)

Performance Improvements

  • 💄 Optimize the interaction of the embedded image module (7a21fdb)
  • 🚀 Add internationalization to automation script keylist (e7b78c1)
  • 🚀 Device group control expands more operations (08e46b6)
  • 🚀 Enhance the interaction experience of built-in images (e913fee)
  • 🚀 Expand batch opening function for group control function (a38dbde)
  • 🚀 Explicitly declare wscrcpy external dependencies (52924c8)
  • 🚀 Improve group control function subscription capabilities (479b996)
  • 🚀 Improve the stability of the overlay adapter (be0ff8c)
  • 🚀 More embedded startup entries have been added to the device list (24e4fd1)
  • 🚀 Optimize check update pop-up window style (54eaa51)
  • 🚀 Optimize embedded image module error prompts (e26186b)
  • 🚀 Optimize overlay click/swipe event interaction (d7c0500)
  • 🚀 Optimize overlay module details (8ce5937)
  • 🚀 Optimize overlay module details (2799ab0)
  • 🚀 Optimize preference interaction Disable device-dependent options in global mode (ea47604)
  • 🚀 Optimize the directory structure of the group control module (f9a9d67)
  • 🚀 Optimize the empty list style of the device list (95e8e4a)
  • 🚀 Optimize the interaction details of the overlay module (e297850)
  • 🚀 Optimize the interactive experience of group control function (05c8643)
  • 🚀 Optimize the interactive experience of the embedded mirror control bar (ac6159f)
  • 🚀 Optimize the keyboard input experience of the group control module (32b7fa2)
  • 🚀 Optimize the overlay module to organize interaction details (f358348)
  • 🚀 Optimize the video stream freezing problem when wscrcpy starts the same device (7baa53c)
  • 🚀 Optimize universal scroll bar interaction (dd6f3fe)
  • 🚀 Optimize window arrangement function details (91e1a3a)
  • 🚀 Overlay module input function reconstruction (ac19fab)
  • 🚀 The overlay module supports forwarding more key types (05c6faf)

Code Refactoring

  • ♻️ Reconstruct the embedded mirror module directory structure (119a471)
  • 📝 Remove redundant wscrcpy judgments (3d9add8)
  • 🚀 Adjust the group control module naming (3c14c99)
  • 🚀 Expand the embedded image switching function (a49f8b5)
  • 🚀 Optimize and extend wscrcpy type (eec0913)
  • 🚀 Optimize interactive performance of embedded mirroring (ba8bfea)
  • 🚀 Optimize overlay module configuration (08009bf)
  • 🚀 Optimize the details of the overlay layer (59dc702)
  • 🚀 Optimize the directory structure of the group control module (7116264)
  • 🚀 Optimize wscrcpy details (247dc5e)
  • 🚀 Reconstruct the directory structure of the overlay module (668ef67)
  • 🚀 Reconstruct the image window ratio to improve reusability (555e346)
  • 🚀 Reconstruct the mask layer keyboard module (cad077d)
  • 🚀 Reconstruct the overlay module architecture (196cca0)
  • 🚀 Reconstruct the overlay module parameter injection method to solve the problem of responsive loss (3163c60)
  • 🚀 Reconstructed mirror window ratio algorithm is compatible with all platforms (b8377f2)
  • 🚀 Refactor and extend wscrcpy library functionality (4ca2c49)
  • 🚀 Refactor wscrcpy (b537a96)
  • 🚀 Remove redundant code from built-in images (f6bcbf5)
  • 🚀 Remove redundant code from the mask layer module (bdb4f49)

2.6.2 (2026-03-13)

Bug Fixes

  • 🐛 Fix the problem of inaccurate vertical coordinate of window arrangement under Windows (1fa6bd5)
  • 🐛 Fixed the issue of abnormal scaling of the window arrangement function under Windows (87f3596)
  • 🐛 Fixed the issue of redundant scroll bars appearing in the window arrangement tool screen area (ea0b451)

Code Refactoring

  • 🚀 Refactored version build (bd3ec90)

2.6.1 (2026-03-13)

Performance Improvements

  • 🌱 Improve the interactive experience of subscription plans (f3620fd)

2.6.0 (2026-03-12)

Features

  • 🎉 Optimize device window arrangement: By obtaining the actual screen size of the device, canceling fixed ratio scaling, avoiding black border issues, and improving adaptation accuracy and display experience. (35d2028)
  • 🚀 Add a subscription plan for batch automation scripts (efa6e28)
  • 🚀 Add WeChat script template (569099c)
  • 🚀 Improve the international translation of automated script modules (1cb2cb6)
  • 🚀 Optimize automated script interaction (1e61d0f)
  • 🚀 Optimize magic variable interaction support for import and export (b7ba176)
  • 🚀 Preliminary addition of automation script editor support (bc6fdcc)
  • 🚀 Preliminary support for automated script batch execution and scheduled tasks (e14c302)
  • 🚀 Product and optimization of automation script editor (b36f6c6)

Bug Fixes

  • 🐛 Fix custom startup layout and interaction issues (6311364)
  • 🐛 Fixed an issue where the automation script log directory was ignored (8777e63)
  • 🐛 Fixed script template translation issue (01870f7)
  • 🐛 Fixed split automation script editor form variable usage compatibility issue (53da1e9)
  • 🐛 Fixed the issue of abnormal task type penetration display in the scheduled task list (58ced2b)
  • 🐛 Fixed the issue of batch execution image blocking (9e3e17b)
  • 🐛 Fixed the issue where the aspect ratio was not fixed when the window arrangement was adjusted again after being saved. (8977138)
  • 🐛 Fixed the problem of unable to echo after window arrangement (6907762)
  • 🚀 Fixed batch execution automation script variable injection concurrency issue (3b8dae0)
  • 🚀 Fixed the problem that the automation script during switching execution could not confirm the interruption (2162203)
  • 🚀 Optimize subscription configuration (9711e73)
  • Fix automated script editor testing issue (87c6f93)

Performance Improvements

  • 💄 Optimize smart picking interaction (a66fb7a)
  • 🚀 Automate script selectors to support termination logic and interaction optimization (d0a4bb3)
  • 🚀 Automation script editor adds execution selection function (d8f1300)
  • 🚀 Detail optimization of the automated script editor (338ad3e)
  • 🚀 Improve automation script stability (455c11f)
  • 🚀 Integrate the adb keyboard installation universal hook (aca0427)
  • 🚀 Optimize automation script editor details (fb2e4ad)
  • 🚀 Optimize automation script editor interaction details (e371171)
  • 🚀 Optimize automation script editor interaction details (24f0792)
  • 🚀 Optimize automation script function details (f084d08)
  • 🚀 Optimize execution of automation script interaction details (568fedf)
  • 🚀 Optimize international translation (3dd15a9)
  • 🚀 Optimize product details (a3abd2c)
  • 🚀 Optimize the installation of adb keyboard boot (fd4e752)
  • 🚀 Optimize the layout of the execution page for planned tasks (10da149)
  • 🚀 Remove obsolete shell script functionality (dfc505b)
  • 🚀 Template import supports importing magic variables (767c1dd)
  • 🚀 When obtaining the device list, synchronously obtain the screen resolution to optimize the screen arrangement experience (3715e0f)
  • Enhance the stability of the automated script editor (8030668)
  • Optimize script editor interaction (7367d15)

Miscellaneous Chores

Code Refactoring

  • ♻️ Restore version of the system (4a7c653)
  • ➖ Remove redundant printing information (6bd144d)
  • 🔨 Split Automation Script Editor form (98ac71b)
  • 🚀 Extract the common logic of launching the app function into an independent selector and reuse it (583b93f)
  • 🚀 Optimize automation script editor details (06f1ede)
  • 🚀 Optimize international translation (2d07a60)
  • 🚀 Optimize the interaction of script selectors for batch execution (c3e86fd)
  • 🚀 Optimize the size of deleted pop-up windows (a43fc53)
  • 🚀 Project code details optimization (eda1d5a)
  • 🚀 Support adjusting subscription price through environment variables (1867f03)
  • Integrated script editor supports more configuration functions (b0a30f8)
  • Optimize the overall directory and naming conventions (aed80ef)

2.5.1 (2026-02-27)

Bug Fixes

  • Fixed the issue of missing title bar information when launching through the app (e6bcd1e)

2.5.0 (2026-02-27)

Features

  • Add concurrency limit for batch wireless device connections (f048956)

Bug Fixes

  • Fix shell space command parsing problem (e1ab66c)
  • Initialize shell command variables to prevent undefined values (e776c11)

2.4.2 (2026-02-26)

Bug Fixes

  • Fix the problem of abnormal disconnection of adb after changing some configurations (ffbfc40)

2.4.1 (2026-02-26)

Bug Fixes

  • Fix the language detection issue of portable software (9985067)

Code Refactoring

  • Reorganize initialization order to load store before process configuration (9283a45)

2.4.0 (2026-02-26)

Features

  • ✨ Adds fastboot command support and provides experimental integration of scrcpy dependencies for Linux ARM64 platforms. (70f3243)
  • 🎉 Comprehensive migration to the built-in terminal based on xterm to provide a more controllable user experience (a2ee25f)
  • add drag and drop file upload support (d5b969c)
  • add gnirehtet path for mac (8da67c8)
  • add scroll to bottom button in chat (e4e8f80)
  • add terminal shell support with xterm integration (3c7828c)
  • add wireless connection mode switch toggle (161acf4)
  • add wireless pair success message and UI improvements (eccb26e)
  • improve ADB keyboard installation error handling (71f7635)
  • trigger language change callback immediately on init (e0e3d22)
  • update api endpoint and enable adb keyboard (4010b17)
  • Window orchestration component enhancement: Supports manual setting of position and size (e3aa89a)

Bug Fixes

  • 🐛 Migrate fkill to tree-kill to solve windows binary file execution problems (6c89b73)
  • change clipboard tag type to primary (edb8840)
  • enhance xterm terminal styling and resize handling (9e031f5)
  • filter ANSI color codes for Windows PowerShell terminal (9c58f25)
  • Fix i18n race translation (7b37f29)
  • handle terminal exit and error states with reload (e8d93d5)
  • handle Windows terminal line ending for all cases (e06e763)
  • handle Windows terminal line ending for device type (1be1a5e)
  • improve Windows terminal compatibility and session management (7f37f7d)
  • improve Windows terminal cursor sync and resize responsiveness (c16a5f9)
  • improve Windows terminal encoding and scrollbar styling (85d5a96)
  • improve Windows terminal rendering and resize stability (7f05996)
  • improve Windows terminal shell detection and remove debug logs (4a5ebbc)
  • include node-pty in electron build (c98d82d)
  • prioritize pwsh.exe for Windows terminal (a99d830)
  • simplify Windows PowerShell terminal initialization (95c432c)
  • simplify Windows terminal shell initialization (2a3ed6f)
  • Solve the problem that the language of the terminal title cannot be dynamically updated (6e2c030)
  • specify SIGTERM signal for treeKill (d28eb1a)
  • update terminal tip color to custom RGB (156d39b)

Performance Improvements

  • 🚀 Optimize ADB keyboard installation and detection (f312cc2)

Code Refactoring

  • add cleanup handler for window IPC (bad6752)
  • add comment for tray destroy event (12038df)
  • add electron-modularity dependency (d0abc0b)
  • add main window API and type system (778a65f)
  • add plugin warnings and fix module loading order (a5bdbf3)
  • add rendererDir support and update window loading (fac664d)
  • adjust screenshot message and dialog styles (7bbab51)
  • adjust terminal line height to 1.4 (5068f7d)
  • adjust terminal window and device sync settings (6a4bd61)
  • adjust window width and improve error handling (5576d2e)
  • centralize PATH setup and environment configuration (6a6eb80)
  • clean up .gitignore file (3644b3e)
  • clean up main window module (9d1eee9)
  • defer app initialization until ready (9905f41)
  • defer plugin registration until app start (46ac0db)
  • Electron main process architecture reconstruction (f810ecb)
  • emit tray:destroy on window restore (fab9343)
  • expose $platform to window and global properties (9a7ee70)
  • extract terminal logic into useTerminal hook (9d725ca)
  • fix device payload and adjust control bar height (e5981ac)
  • fix failed translation key (fe98a56)
  • fix payload type and resolve target logic (5af60c8)
  • fix preview button visibility class (5a8c97b)
  • implement retained terminal session with cleanup (532a055)
  • implement terminal session management with providers (fa156e1)
  • improve file download progress tracking (51101c7)
  • improve gnirehtet menu handling and options (8d0e85b)
  • improve process killing and error handling (85a080e)
  • improve window bounds persistence logic (5361e24)
  • improve wireless pair input handling and UI (3aea5f6)
  • migrate core helpers to electron-modularity package (630deaa)
  • migrate edger to service (9c64cd5)
  • migrate events to service handlers (c99b1de)
  • migrate plugins to priority-based system (ae4404a)
  • migrate services and modules to explicit app.use (e63de2e)
  • migrate services to plugins (36e2a0d)
  • migrate to ipcx for IPC handling (1b1fd8d)
  • migrate to official plugins and update imports (eb9bead)
  • migrate to window.$preload namespace (41a2342)
  • move i18next-fs-backend to dependencies (f507222)
  • move window-manager to window module (8af97a5)
  • optimize device query and control window (4e2736d)
  • optimize minimized tray and window handling (3765b73)
  • Reconstruct the multi-entry directory structure (0690f4b)
  • Refactor i18n related services (6e882b6)
  • remove app parameter from window manager (f8719f1)
  • remove appium-adb documentation and update github link (f532aab)
  • remove border from preference header (9c97366)
  • remove debug console log for args (e4332c1)
  • remove debug console log for platform paths (e5590f3)
  • remove electron middleware module (3bd462c)
  • remove encoding conversion and use utf8 only (c32cb79)
  • remove fixed width from window configuration (ef3e86b)
  • remove spawnShell and convert arrow functions (66978f1)
  • remove theme plugin README (85a853b)
  • remove trailing whitespace in adb helpers (ec7314c)
  • remove ui-ux-pro-max prompt files (11d41a9)
  • remove unused app-region-drag style (094e0df)
  • remove unused terminalConfig from useTerminal (9db3f24)
  • remove Windows-specific encoding default (534934b)
  • rename app to ctx and update electron app imports (4c7ceba)
  • rename app to ctx in electron app (6707e2d)
  • rename currentStatusType to sessionStatus (8c84464)
  • rename electron-modularity to electron-setup (081a8a5)
  • rename entries to pages for routing structure (863ecd4)
  • rename windowOptions to browserWindow and add mainWindow flag (5093577)
  • reorder plugin registration in electron main (b8ee4ef)
  • reorganize process helpers directory structure (dcdb6d7)
  • replace args-tokenizer with shell-quote (1196263)
  • replace getSize with computed size property (c7edceb)
  • replace IS_PACKAGED with import.meta.env.MODE (521e2ba)
  • replace spawnShell with unified sheller helper (0159bb4)
  • replace tree-kill with fkill for process termination (c50cea6)
  • replace window controls with app header (a5fa218)
  • restructure copilot and explorer modules (74efca1)
  • restructure core helpers and window management (16fc934)
  • restructure electron helpers and modules (f0e4851)
  • restructure main window and singleton modules (7b979d6)
  • restructure terminal session management (19428dd)
  • restructure window management and IPC handlers (59a315f)
  • simplify file list extraction in drag upload (7453a99)
  • simplify gnirehtet trigger handling (f9185c3)
  • simplify main window resolution and remove legacy code (c764f91)
  • simplify restoreAndFocusWindow options (27185f5)
  • simplify window types and return native BrowserWindow (184ab7b)
  • simplify wireless connection UI and remove pair dialog (30e026c)
  • standardize module export structure (8111f6f)
  • throttle download and upload progress callbacks (8a16d22)
  • translate terminal comments to English and add command execution (71a2d7a)
  • unify control bar height configuration (7e6abed)
  • unify shell error handling and lazy loading (98dd91b)
  • update primaryColor value (346df64)
  • update scrollbar styling with Tailwind CSS (6eaf259)
  • update terminal scrollbar styling with custom width and transparency (b2c8f87)
  • update terminal title and locale strings (f0bdf0b)

2.3.1 (2026-01-27)

Bug Fixes

  • 🐛 Fixed the problem of being unable to click to enter the co-pilot entrance under Windows and Linux. (c563d11)

2.3.0 (2026-01-22)

Features

  • 🚀 Optimize portable package configuration and add linux flatpak package support (a7982db)
  • configure electron-log file path in debugger helper (2242668)

Bug Fixes

  • 🐛 handle copilot execution failures and adjust config max steps (3601709)
  • win: fully redirect user data to portable folder and fix CI workflow (fe2fd89)

Performance Improvements

  • ✨ Optimize windows and linux window layout (b63b59c)

Code Refactoring

  • add platform simulation support and adjust window controls layout (9c3a5b1)
  • adjust header and chat layout padding (70fe60d)
  • adjust layout padding for windows and linux platforms (4e153cc)
  • adjust widget dimensions and clear dialog messages (ca6796f)
  • implement immersive title bar and optimize window layout (1e76d11)
  • improve chat retry logic and ADB keyboard detection (8e0e43c)
  • remove dialog width constraints and improve file creation (54e5553)
  • remove quiet config option (76f9d6c)
  • remove redundant success messages and unify dialog titles (b1eac32)
  • reorganize emitter module and update event emitter references (4c3cc2d)
  • reorganize preference form layout with tabs and scroll (7f0f864)
  • replace ExTooltipButton with native el-button title attribute (8056977)

2.2.0 (2026-01-17)

Features

  • 🎉 Improve the accuracy and coverage of Copilot opening applications by obtaining information about installed applications on the device (e2f27da)
  • add keyboard shortcuts for connect and disconnect (39293af)
  • auto-focus input when editing prompt (d58b993)

Bug Fixes

  • 🐛 Fixed the issue where autoglm.js conversation request listener was not cleaned up causing memory overflow (bac2126)

Code Refactoring

  • improve config management and prompt editing (de2f708)
  • improve prompt manager UI and editing experience (1697558)
  • optimize subscribe store initialization and token management (0f00903)

2.1.7 (2026-01-14)

Miscellaneous Chores

2.1.6 (2026-01-14)

Miscellaneous Chores

2.1.5 (2026-01-14)

Miscellaneous Chores

  • remove comments in copilot window handler (f231998)
  • update version to 2.1.4 (9bdf671)

2.1.4 (2026-01-14)

Miscellaneous Chores

  • add release name format to config (6db1b51)
  • update release workflow and build commands (8f5345b)

2.1.3 (2026-01-14)

Miscellaneous Chores

  • add linked-versions plugin to release config (415e4ae)

2.1.2 (2026-01-14)

Bug Fixes

  • 🐛 Fix automatic build issues (aba8f27)

Miscellaneous Chores

  • add GH_TOKEN env to release workflow (078bf18)
  • release 2.1.1 (d1c04ce)
  • release 2.1.2 (91d9bbd)
  • release 2.1.2 (c7c8616)
  • remove release creation step from workflow (b73c179)
  • remove unnecessary comments in App.vue (22e331d)
  • remove unnecessary comments in App.vue (5ae8fbe)
  • update electron-builder config path and publish options (d3b4914)
  • update pull request title pattern (060ad4a)
  • update release configuration and patterns (0054fd4)

2.1.0 (2026-01-14)

Features

  • ✨ Add auto launch functionality and preference option (69c75cc)
  • ✨ Add hidden launch option for auto-start (dd1c2e1)
  • ✨ Add subscribe configuration hook and update UI (80b3534)
  • ✨ Add system tray support and Linux auto-launch (df414b9)
  • 🔖 Copilot adds thinking_stream event support (22623c4)
  • 🚑️ The portable version now supports automatically generating configuration files in the running directory (ba551b7)
  • add custom empty state icon for device list (65b028f)
  • add zip target for macOS builds (f52d3a5)

Bug Fixes

  • 🐛 Fix delete message and config initialization (82a77ea)
  • 🐛 Fixed the issue of failed export and export configuration files (fd32c36)
  • 🐛 Update dependencies and add sharp override in workspace configuration (dbf366a)
  • 💰 Update payment amount handling in subscription (422950c)
  • add background color and improve window initialization (498fc90)
  • adjust empty state icon styling in device list (363bf3d)
  • ensure concurrency limit is numeric (d2c977c)
  • types: allow typed payload handlers by using any[] for handle listener rest params (b4e8058)

Performance Improvements

  • 🚀 Use an external library instead of the built-in autoglm.js (d1f8176)

Code Refactoring

  • ⚡️ Refactor code structure for improved readability and maintainability (f211924)
  • 🌐 Update language labels to native text (cb7ac96)
  • 🌐 Update subscription translations for multiple locales (b4e5780)
  • 🎨 Redesign task dialog with card layout (cd06d3b)
  • 🎨 Simplify config UI layout and update maxSteps (af18241)
  • 🔄 Auto configure Copilot after payment (c00ac1e)
  • 🔄 Move ESLint config to root and clean up dependencies (f2bd345)
  • 🔄 Optimize session callbacks and event handling (ae19570)
  • 🔄 Rename ipc to services for better structure (8212872)
  • 🔄 Rename start module to launch for clarity (5d44ebf)
  • 🔧 Optimize copilot config change detection (2776e8a)
  • 🔧 Replace quick prompts with PromptBar component (9b0c4df)
  • improve theme switching and background handling (b3203af)
  • migrate copilot config to store (e323611)
  • replace rotation icon with outline version (95ad30d)
  • replace send icon with rocket icon (ef9e7d3)
  • replace svg icons with font icons (9eca902)
  • replace trash icon with Delete icon (c59994e)

2.0.1 (2026-01-06)

Bug Fixes

  • 🐛 Fix the problem of abnormal subscription recharge fee (b32043c)

2.0.0 (2026-01-05)

Features

  • ✨ Add system terminal support (e5c157e)
  • ✨ Device lists will now intelligently merge duplicate device entries and share device configurations (52cc4b1)
  • ✨ Integrate scrcpy binaries for macos (85bf096)
  • ✨ Introducing a new file icon display component and enhancing the File Explorer dialog. (11be6f1)
  • ✨ Now supports copying device screenshots and recording files to the clipboard (bdb3644)
  • ✨ Now you can arrange your device windows through a graphical interface (91ad249)
  • ✨ Support edge hiding function (14a81de)
  • ✨ Support floating control bar (8807e50)
  • ✨ Support pairing and connecting to devices via QR code (14306b2)
  • ✨ Support to close the device screen when controlling (a84c775)
  • ✨ Supports starting applications for mirroring (d19e781)
  • ✨ Use the new interface design (b08021b)
  • 💥[Release-As: 2.0.0] major copilot overhaul with AutoGLM and multi-device automation (7ad5ecd)
  • 📸 Enhanced recording (7f10161)
  • 🔍️ Optimize the search function of the app (94ccb7b)
  • 🚀 Split the file manager into independent windows and support multiple instances in parallel (f41d853)
  • 🚀 Support adding the open application action to the desktop shortcut. (Not supported on macOS) (add251f)
  • 🚀 Supports connecting historical devices via device list (e0687e8)
  • 🚀 Supports dragging the device control bar to sort (64a98b2)
  • 🚀 Update to scrcpy v3.3.2 (462536c)
  • 🚚 Support batch startup mirroring (fcfd78e)
  • 🚚 The file manager has been refactored and improved, and more useful features have been added. (5cd5992)

Bug Fixes

  • ♻️ Fixed repeated dependency issues (9777622)
  • 🐛 Fix automatic release (c2254aa)
  • 🐛 Fix device support audio and video encoding cannot be parsed (9b7f6a9)
  • 🐛 Fix for built-in scrcpy not supporting x64 macos (0d60655)
  • 🐛 Fix issue with incorrect address bar path when returning to the previous level in file management (0222675)
  • 🐛 Fix linux build errors (9b43dc0)
  • 🐛 Fix the display ID value type error (2b7ee79)
  • 🐛 Fix the mirror group bug (cd7d9cd)
  • 🐛 Fix the problem of build failure caused by missing dependencies (e34e1c2)
  • 🐛 Fix the problem of Windows calling system terminal failure (194689e)
  • 🐛 Fix the problem of Windows terminal injection command failure (fbf88d0)
  • 🐛 Fix typos (a7a3a17)
  • 🐛 Fixed an issue where macos built-in updates failed (432eceb)
  • 🐛 Fixed an issue where some options in preferences could not be turned off (269bd29)
  • 🐛 Fixed possible sandbox issues on Linux (ff9f9bd)
  • 🐛 Fixed the conflict between device control bar sorting and click events (18a57b9)
  • 🐛 Fixed the issue of abnormal path display in the file manager address bar (2f63f6f)
  • 🐛 Fixed the issue of duplicate filter conditions in the device list (6c4242c)
  • 🐛 Fixed the issue of layout flickering when refreshing the device list page (608b8f3)
  • 🐛 Fixed the issue of saving exceptions after adjusting parameters in preference settings (4a18f61)
  • 🐛 Fixed the issue where activating the program on macOS in certain situations would cause the tray to be created repeatedly (cf8e183)
  • 🐛 Fixed the issue where all configurations would be cleared when resetting the category configuration in preferences (6ee9a92)
  • 🐛 Fixed the issue where Chinese text cannot be saved in file management read and write text (34785dd)
  • 🐛 Fixed the issue where PowerShell failed to call the system terminal (7beb027)
  • 🐛 Fixed the issue where recorded files could not be copied to the clipboard under Windows (119b518)
  • 🐛 Fixed the issue where there is a chance of an error when closing the floating control bar on macOS (5c2c711)
  • 🐛 Fixed the problem of minimizing the visibility of tray icons (b0f42aa)
  • 🐛 Issue not taking effect after restarting the application after switching themes (857c480)
  • 🐛 Make StartApp compatible with scrcpy v3.0 (1082e0d)
  • 🐛 Rename --display-buffer to --video-buffer (b2bb0ae)
  • 🐛 Repair ADB timeout problems (b5bffc5)
  • 🐛 Repair floating action bar start application error (487e7e2)
  • 🐛 Repair part of internationalization Lost dynamics (d18444f)
  • 🐛 Resolve default recording error (358064e)
  • 🐛 Resolved the issue where the device list could not be displayed due to compatibility issues with certain devices (2c53b77)
  • 🐛 Resolving build errors (d21fa29)
  • 🐛 Restore the --display-buffer parameter to solve the mirroring problem (0f3d869)
  • 🐛 Solve the conflict between floating navigation bar and quick APP launch (460aca1)
  • 🐛 Solve the problem of abnormal display timing when recording related functions are successful (67d279e)
  • 🐛 Solve the problem of IPV6 address connection failure (1a95325)
  • 🐛 Solve the problem of startup error of development mode under Linux (5c4f65e)
  • 🐛 Solve the problem of Windows disabling video forwarding and crashing (10b902a)
  • 🐛 Solved the problem that the main window could not be restored after being moved off the screen in some cases (d054f8d)
  • 🐛 Start app to adapt to dark mode (ae13fde)
  • 🐛 Temporarily disable scrcpy integration in macOS (9bf4d5c)
  • 🐛 Update scrcpy-server file to solve the problem of not being able to obtain device APP list (63f7135)
  • 📝 Fixed the issue that special characters in Windows prevented the creation of app shortcut launch (301dac5)
  • 🔧 Camera recording and screen off configuration conflict (4508758)
  • 🔧 Fixed button loading prompt conflict issue (c323ad6)
  • 🩹 Restore the windows build configuration (9491069)
  • 🚀 Fix the issue of abnormal program exit behavior under windows (705f8be)

Performance Improvements

  • ♻️ Adjust the position of the start application button (9833932)
  • ♻️ Code structure optimization (595216b)
  • ♻️ Enhance recording stability (3dd7525)
  • ♻️ Improve ADB connection stability (7655ba6)
  • ♻️ Improve the stability of window arrangement function (7ae3f21)
  • ♻️ Improve wireless connection stability (85be898)
  • ♻️ Improved device connection stability (1d603ab)
  • ♻️ No longer building universal packages for macOS (db5deb4)
  • ♻️ Optimize camera recording (4be2cf4)
  • ♻️ Optimize camera recording stability (952b2a7)
  • ♻️ Optimize device details performance (38d1433)
  • ♻️ Optimize device list interaction logic (3812061)
  • ♻️ Optimize file manager interaction (b168cc3)
  • ♻️ Optimize QR code connection experience (86f5e69)
  • ♻️ Optimize the Russian presentation effect (0d8a8ee)
  • ♻️ Optimized contextBridge related improvements for stability (0e098c3)
  • ♻️ Optimized the adb daemon startup failure detection mechanism (ca6be85)
  • ♻️ Reduce build package size by removing redundant dependencies (7b61b25)
  • ♻️ Refactor configuration related code to improve stability (37bf438)
  • ♻️ Script and directory structure optimization (68378ef)
  • ♻️ Simplify sandbox automatic configuration manager code to improve performance (1b82336)
  • ♻️ Support interruption during waiting for wireless connection (344b385)
  • ♻️ Supports retrieving a list of applications (b1a6ba7)
  • ♻️ Update mirror icon (c214e5a)
  • ♻️ When the application fails to start, display the error message (dbc34d6)
  • ♿️ Supports adjusting the closing method of the application in preferences (e643f8e)
  • ⚗️ Experimental support for turning off screen controls (9555f58)
  • ⚡️ Improve the start APP experience (29e5e1b)
  • ⚡️ Optimize scrcpy parameter conversion performance (18dcd24)
  • ⚡️ Optimize startup application performance (8e94494)
  • ⚡️ Optimize the method of obtaining the available displays of the device (9e31c84)
  • ⚡️ Optimize the stability of options that need to dynamically obtain parameters in preference settings (39bbc98)
  • ✅ A new method is adopted to solve the problem of IP type configuration storage (5488a1e)
  • ✅ File management supports selecting directories for uploading (fd2e639)
  • ✅ Provides the function of detecting and migrating configurations when deleting a device (39e0533)
  • ✅ Support switching devices on the floating control bar (50440f5)
  • ✨ Adjust the position of the wireless connection screen (3e3fc34)
  • ✨ Enable new icon (695e35d)
  • ✨ The floating control bar supports transparent display when inactive (34f27c5)
  • ✨ Update to scrcpy@2.7 to support the gamepad (0053e87)
  • ➖ Remove redundant console (9a67142)
  • ⬆️ Improve QR code connection performance (b413889)
  • ⬆️ Improved performance of automated mirroring (33a03c3)
  • ⬆️ Optimize edge hiding performance (74a91a4)
  • ⬆️ Optimize the performance of the floating control bar (a1c60ec)
  • 🌱 Optimize app icon background color and corner radius. (bc4f492)
  • 🌱 Optimize application icon details (55800be)
  • 🌱 UI details and documentation optimization (5b5bbf7)
  • 🍻 Improve file manager reliability (9063243)
  • 🐛 Improve wireless connection verification method (69fecc3)
  • 👥 Control bar sorting supports state synchronization (88abe95)
  • 👷 Added edge hiding function switch (d25714a)
  • 👷 Explicitly clean up unnecessary child processes on exit (0549dda)
  • 👷 Optimize the edge hiding function (d5caaa9)
  • 👷 Remove redundant code comments (ca4e826)
  • 👽️ Experimental support for adding open application actions to linux desktop shortcuts (6897c0e)
  • 👽️ Experimentally add linux arm64 support (5b033fd)
  • 💄 Improve space utilization of device window layout tools (939a2d2)
  • 💄 Improved Russian display (ca79e1b)
  • 💄 Normalize control window titles and generated file names (ccc7f0e)
  • 💄 Optimization of display effect of device list page (305187d)
  • 💄 Optimize device refresh mode (ea75615)
  • 💄 Optimize dialog display (1813718)
  • 💄 Optimize pairing interface display (df4103b)
  • 💄 Optimize preference setting button layout (47ae53d)
  • 💄 Optimize Russian display effect (5ca39ae)
  • 💄 Optimize the display effect of horizontal screen screenshots (90c7163)
  • 💄 Optimize the interface display effect (c7a5cd4)
  • 💄 Window layout adapted to dark mode theme (eab402b)
  • 💫 Adjust gnirehtet configuration behavior to make it consistent with user operation habits (7507915)
  • 💫 Support appending gnirehtet custom parameters in configuration (206a030)
  • 📌 Standardize the device list lifecycle processing flow. IPv6 addresses must be enclosed in [] and the port number cannot be omitted for wireless connections. (93c059d)
  • 📌 Support saving the main panel window size status (cef022f)
  • 📝 Add docs entry to the program (db5d157)
  • 📝 Add Japanese language support (969378f)
  • 📝 Added Arabic language support (f6c9fa4)
  • 📝 Optimize the scheduled task list (c666709)
  • 📝 Optimize the title of the control interface to solve the problem of duplicate device names (06a151d)
  • 📝 Optimized startup app package name display (22eb718)
  • 📝 Simplified partial translation (7411487)
  • 📦️ Update the upload function to support file and directory selection, and optimize the interface layout (7f5bd35)
  • 📸 Recording camera support (10d0370)
  • 📸 Support viewing real-time images and power information of the device (d262adf)
  • 🔀 Optimize the storage policy configured in preferences (b9faabf)
  • 🔊 Expanded audio source options (fc91f07)
  • 🔍️ Optimize QR code style to avoid scanning problems on some devices (dd3ad6c)
  • 🔖 Adjust the order of quick entry functions (ccb59e1)
  • 🔖 Optimize interaction of preferred terminal options (900dc69)
  • 🔧 Optimized startup APP function interaction (468af22)
  • 🔧 Temporarily disable scheduled tasks that are too far away (be5e639)
  • 🔨 Fixed the problem that some models could not reversely supply the network due to the blocking of installation detection when using Gnirehtet (c5369af)
  • 🔨 Improve the reliability of the linux sandbox configuration tool (6de2538)
  • 🧑‍💻 Improve application performance with VueRouter (6a8c190)
  • 🧑‍💻 Improve device-based terminal experience (88a0356)
  • 🧑‍💻 Optimize application icon size under macOS (066d81f)
  • 🧑‍💻 Optimize the interactive experience of the device control bar (8388646)
  • 🩹 Add an option to enable keyboard fix on app startup to be compatible with older versions of scrcpy (be89b36)
  • 🩹 Closing a screen via the control bar no longer requires creating a help window (84c7be7)
  • 🚀 Adjust options to support scrcpy v3.0 (0602676)
  • 🚀 After getting the device list, query and save the SerialNo of each device in preparation for subsequent integration (4464e7e)
  • 🚀 Clean output when closing built-in terminal (c976d4c)
  • 🚀 Extended floating control bar function (790e703)
  • 🚀 File management supports returning to the root directory (2e27443)
  • 🚀 Improve app icon quality (8a6f4c7)
  • 🚀 Improve performance by asynchronously storing main interface boundary information (d230c15)
  • 🚀 Modify the adb connection method to be compatible with scan connection (e6e8a09)
  • 🚀 Optimization of window arrangement function (33786ab)
  • 🚀 Optimize device connection experience (0690f2d)
  • 🚀 Optimize device list connection behavior and configuration migration strategy (8237058)
  • 🚀 Optimize program performance (9af3988)
  • 🚀 Optimize system terminal stability (2ffc588)
  • 🚀 Optimize the built-in terminal interaction experience (bb56d5b)
  • 🚀 Optimize the default behavior when adding new widgets to the device window arrangement (1be470a)
  • 🚀 Optimize the details of the new version of the icon (db9b19a)
  • 🚀 Optimize the display effect of application icons under windows (e0c221f)
  • 🚀 Optimize the display effect of new icons in smaller sizes (7d91d71)
  • 🚀 Optimize the layout effect of the task list (044cfcd)
  • 🚀 Optimize the menu trigger method for the upload function (8d39f5b)
  • 🚀 Optimize the storage strategy for preference Settings (359b9b9)
  • 🚀 Provide feedback on the application shortcut addition (d7eca8d)
  • 🚀 Supports display of offline devices (dcf817f)
  • 🚀 Supports opening using the main monitor when starting the APP (aec9b78)
  • 🚀 The main panel supports single instance startup (c49d22c)
  • 🚀 Update to scrcpy v3.3.1 (a2bb039)
  • 🚀 Update to scrcpy v3.0 (bf06382)
  • 🚀 Update to scrcpy v3.0.2 (7510548)
  • 🚀 Update to scrcpy v3.1 (7c74c71)
  • 🚀 Update to scrcpy v3.2 (57c11af)
  • 🚀 Update to scrcpy v3.3 (bbf2335)
  • 🚀 Update to scrcpy v3.3.3 (8566644)
  • 🚚 Reduce some unnecessary verifications and increase the speed at which equipment starts reverse network supply (c17aaba)

Miscellaneous Chores

Code Refactoring

  • ♻️ Reconstruct the multi-device batch upload function (dbdaa35)
  • 🔨 Optimize code (f61d820)

1.34.2 (2025-12-08)

Performance Improvements

  • 📦️ Update the upload function to support file and directory selection, and optimize the interface layout (7f5bd35)
  • 🚀 Optimize the menu trigger method for the upload function (8d39f5b)

1.34.1 (2025-12-07)

Performance Improvements

  • 🍻 Improve file manager reliability (9063243)

1.34.0 (2025-12-07)

Features

  • ✨ Introducing a new file icon display component and enhancing the File Explorer dialog. (11be6f1)
  • 🚀 Split the file manager into independent windows and support multiple instances in parallel (f41d853)
  • 🚚 The file manager has been refactored and improved, and more useful features have been added. (5cd5992)

Bug Fixes

  • 🐛 Fixed the conflict between device control bar sorting and click events (18a57b9)
  • 🐛 Fixed the issue of abnormal path display in the file manager address bar (2f63f6f)
  • 🐛 Fixed the issue where Chinese text cannot be saved in file management read and write text (34785dd)

Performance Improvements

  • ♻️ Optimize file manager interaction (b168cc3)
  • ✨ Enable new icon (695e35d)
  • 🌱 Optimize app icon background color and corner radius. (bc4f492)
  • 🌱 Optimize application icon details (55800be)
  • 📝 Optimize the scheduled task list (c666709)
  • 🧑‍💻 Optimize application icon size under macOS (066d81f)
  • 🧑‍💻 Optimize the interactive experience of the device control bar (8388646)
  • 🚀 Improve app icon quality (8a6f4c7)
  • 🚀 Optimize program performance (9af3988)
  • 🚀 Optimize the details of the new version of the icon (db9b19a)
  • 🚀 Optimize the display effect of application icons under windows (e0c221f)
  • 🚀 Optimize the display effect of new icons in smaller sizes (7d91d71)

1.33.0 (2025-11-20)

Features

  • ✨ Add system terminal support (e5c157e)

Bug Fixes

  • 🐛 Fix issue with incorrect address bar path when returning to the previous level in file management (0222675)
  • 🐛 Fix the problem of Windows calling system terminal failure (194689e)
  • 🐛 Fix the problem of Windows terminal injection command failure (fbf88d0)
  • 🐛 Fixed the issue where PowerShell failed to call the system terminal (7beb027)

Performance Improvements

  • 🔖 Optimize interaction of preferred terminal options (900dc69)
  • 🚀 Clean output when closing built-in terminal (c976d4c)
  • 🚀 Optimize system terminal stability (2ffc588)
  • 🚀 Optimize the built-in terminal interaction experience (bb56d5b)

1.32.2 (2025-09-29)

Performance Improvements

  • 🚀 Update to scrcpy v3.3.3 (8566644)

1.32.1 (2025-09-10)

Performance Improvements

  • 🌱 UI details and documentation optimization (5b5bbf7)

1.32.0 (2025-09-08)

Features

  • ✨ Now supports copying device screenshots and recording files to the clipboard (bdb3644)
  • 🚀 Update to scrcpy v3.3.2 (462536c)

Bug Fixes

  • 🐛 Fixed the issue where recorded files could not be copied to the clipboard under Windows (119b518)
  • 🔧 Fixed button loading prompt conflict issue (c323ad6)

Performance Improvements

  • ✅ Provides the function of detecting and migrating configurations when deleting a device (39e0533)
  • 📌 Standardize the device list lifecycle processing flow. IPv6 addresses must be enclosed in [] and the port number cannot be omitted for wireless connections. (93c059d)
  • 🚀 Modify the adb connection method to be compatible with scan connection (e6e8a09)
  • 🚀 Optimize device list connection behavior and configuration migration strategy (8237058)

1.31.3 (2025-09-01)

Performance Improvements

  • 💄 Window layout adapted to dark mode theme (eab402b)

1.31.2 (2025-09-01)

Bug Fixes

  • 🐛 Resolved the issue where the device list could not be displayed due to compatibility issues with certain devices (2c53b77)

Performance Improvements

  • 🚀 Optimization of window arrangement function (33786ab)

1.31.1 (2025-08-29)

Performance Improvements

  • 👷 Remove redundant code comments (ca4e826)

1.31.0 (2025-08-29)

Features

  • ✨ Device lists will now intelligently merge duplicate device entries and share device configurations (52cc4b1)
  • ✨ Now you can arrange your device windows through a graphical interface (91ad249)

Bug Fixes

  • 🐛 Fix typos (a7a3a17)
  • 🐛 Fixed possible sandbox issues on Linux (ff9f9bd)
  • 🐛 Fixed the issue of saving exceptions after adjusting parameters in preference settings (4a18f61)
  • 🐛 Issue not taking effect after restarting the application after switching themes (857c480)

Performance Improvements

  • ♻️ Improve the stability of window arrangement function (7ae3f21)
  • ♻️ Simplify sandbox automatic configuration manager code to improve performance (1b82336)
  • 💄 Improve space utilization of device window layout tools (939a2d2)
  • 🔖 Adjust the order of quick entry functions (ccb59e1)
  • 🔨 Improve the reliability of the linux sandbox configuration tool (6de2538)
  • 🚀 After getting the device list, query and save the SerialNo of each device in preparation for subsequent integration (4464e7e)
  • 🚀 Improve performance by asynchronously storing main interface boundary information (d230c15)
  • 🚀 Optimize the default behavior when adding new widgets to the device window arrangement (1be470a)
  • 🚀 Optimize the layout effect of the task list (044cfcd)
  • 🚀 Optimize the storage strategy for preference Settings (359b9b9)

1.30.2 (2025-07-15)

Performance Improvements

  • ♻️ Optimize device list interaction logic (3812061)
  • 📝 Add Japanese language support (969378f)

1.30.1 (2025-07-14)

Bug Fixes

  • 🐛 Fixed the issue where all configurations would be cleared when resetting the category configuration in preferences (6ee9a92)
  • 🐛 Solve the problem of abnormal display timing when recording related functions are successful (67d279e)
  • 📝 Fixed the issue that special characters in Windows prevented the creation of app shortcut launch (301dac5)

Performance Improvements

  • 📝 Optimized startup app package name display (22eb718)
  • 🔧 Optimized startup APP function interaction (468af22)

1.30.0 (2025-07-14)

Features

  • 🔍️ Optimize the search function of the app (94ccb7b)
  • 🚀 Supports dragging the device control bar to sort (64a98b2)

Bug Fixes

  • 🐛 Fixed the issue of layout flickering when refreshing the device list page (608b8f3)
  • 🐛 Fixed the issue where activating the program on macOS in certain situations would cause the tray to be created repeatedly (cf8e183)
  • 🐛 Fixed the issue where there is a chance of an error when closing the floating control bar on macOS (5c2c711)
  • 🚀 Fix the issue of abnormal program exit behavior under windows (705f8be)

Performance Improvements

  • ♻️ Code structure optimization (595216b)
  • 👥 Control bar sorting supports state synchronization (88abe95)
  • 📝 Optimize the title of the control interface to solve the problem of duplicate device names (06a151d)
  • 🔀 Optimize the storage policy configured in preferences (b9faabf)
  • 🚀 Supports opening using the main monitor when starting the APP (aec9b78)

1.29.9 (2025-06-27)

Performance Improvements

  • 🚀 Update to scrcpy v3.3.1 (a2bb039)

1.29.8 (2025-06-20)

Bug Fixes

  • 🐛 Update scrcpy-server file to solve the problem of not being able to obtain device APP list (63f7135)

1.29.7 (2025-06-16)

Performance Improvements

  • 🚀 Update to scrcpy v3.3 (bbf2335)

1.29.6 (2025-04-27)

Performance Improvements

  • 📝 Added Arabic language support (f6c9fa4)
  • 🚀 File management supports returning to the root directory (2e27443)

1.29.5 (2025-04-17)

Bug Fixes

  • 🐛 Fix the problem of build failure caused by missing dependencies (e34e1c2)

1.29.4 (2025-04-17)

Bug Fixes

  • 🐛 Fixed an issue where some options in preferences could not be turned off (269bd29)

Performance Improvements

  • 💫 Adjust gnirehtet configuration behavior to make it consistent with user operation habits (7507915)
  • 🔍️ Optimize QR code style to avoid scanning problems on some devices (dd3ad6c)
  • 🩹 Add an option to enable keyboard fix on app startup to be compatible with older versions of scrcpy (be89b36)

1.29.3 (2025-04-02)

Performance Improvements

  • 📝 Add docs entry to the program (db5d157)
  • 🚚 Reduce some unnecessary verifications and increase the speed at which equipment starts reverse network supply (c17aaba)

1.29.2 (2025-03-31)

Performance Improvements

  • 🔨 Fixed the problem that some models could not reversely supply the network due to the blocking of installation detection when using Gnirehtet (c5369af)

1.29.1 (2025-03-31)

Performance Improvements

  • 🔊 Expanded audio source options (fc91f07)
  • 🩹 Closing a screen via the control bar no longer requires creating a help window (84c7be7)
  • 🚀 Update to scrcpy v3.2 (57c11af)

1.29.0 (2025-03-27)

Features

  • 🚀 Support adding the open application action to the desktop shortcut. (Not supported on macOS) (add251f)
  • 🚚 Support batch startup mirroring (fcfd78e)

Bug Fixes

  • 🐛 Solve the conflict between floating navigation bar and quick APP launch (460aca1)
  • 🐛 Solve the problem of startup error of development mode under Linux (5c4f65e)

Performance Improvements

  • ✨ The floating control bar supports transparent display when inactive (34f27c5)
  • 👷 Explicitly clean up unnecessary child processes on exit (0549dda)
  • 👽️ Experimental support for adding open application actions to linux desktop shortcuts (6897c0e)
  • 👽️ Experimentally add linux arm64 support (5b033fd)
  • 💄 Optimization of display effect of device list page (305187d)
  • 💫 Support appending gnirehtet custom parameters in configuration (206a030)
  • 🚀 Provide feedback on the application shortcut addition (d7eca8d)

1.28.7 (2025-02-17)

Bug Fixes

  • 🐛 Fixed the issue of duplicate filter conditions in the device list (6c4242c)
  • 🐛 Solved the problem that the main window could not be restored after being moved off the screen in some cases (d054f8d)

Performance Improvements

  • ⬆️ Improved performance of automated mirroring (33a03c3)
  • 💄 Optimize the display effect of horizontal screen screenshots (90c7163)
  • 🚀 The main panel supports single instance startup (c49d22c)

1.28.6 (2025-02-05)

Bug Fixes

  • 🐛 Resolving build errors (d21fa29)

1.28.5 (2025-02-05)

Performance Improvements

  • ✅ File management supports selecting directories for uploading (fd2e639)
  • ⬆️ Improve QR code connection performance (b413889)

1.28.4 (2025-01-13)

Bug Fixes

  • 🐛 Fix the display ID value type error (2b7ee79)
  • 🐛 Solve the problem of IPV6 address connection failure (1a95325)

Performance Improvements

  • ♻️ Improve wireless connection stability (85be898)
  • ⚡️ Optimize the method of obtaining the available displays of the device (9e31c84)
  • 🐛 Improve wireless connection verification method (69fecc3)
  • 👷 Added edge hiding function switch (d25714a)

1.28.3 (2024-12-28)

Performance Improvements

  • ♻️ Optimize device details performance (38d1433)

1.28.2 (2024-12-27)

Performance Improvements

  • 👷 Optimize the edge hiding function (d5caaa9)
  • 📸 Support viewing real-time images and power information of the device (d262adf)

1.28.1 (2024-12-20)

Performance Improvements

  • ♻️ Optimize QR code connection experience (86f5e69)

1.28.0 (2024-12-20)

Features

  • ✨ Support pairing and connecting to devices via QR code (14306b2)
  • 🚀 Supports connecting historical devices via device list (e0687e8)

Bug Fixes

  • 🐛 Solve the problem of Windows disabling video forwarding and crashing (10b902a)

Performance Improvements

  • ♻️ Update mirror icon (c214e5a)
  • ✅ A new method is adopted to solve the problem of IP type configuration storage (5488a1e)
  • 🚀 Optimize device connection experience (0690f2d)
  • 🚀 Supports display of offline devices (dcf817f)

1.27.7 (2024-12-10)

Performance Improvements

  • 🚀 Update to scrcpy v3.1 (7c74c71)

1.27.6 (2024-12-05)

Bug Fixes

  • ♻️ Fixed repeated dependency issues (9777622)

Performance Improvements

  • ♻️ Optimized contextBridge related improvements for stability (0e098c3)
  • ♻️ Reduce build package size by removing redundant dependencies (7b61b25)
  • 🚀 Update to scrcpy v3.0.2 (7510548)

1.27.5 (2024-11-29)

Performance Improvements

  • ➖ Remove redundant console (9a67142)

1.27.4 (2024-11-29)

Bug Fixes

  • 🐛 Fix automatic release (c2254aa)
  • 🐛 Fixed an issue where macos built-in updates failed (432eceb)

1.27.3 (2024-11-28)

Bug Fixes

  • 🐛 Fix for built-in scrcpy not supporting x64 macos (0d60655)

Performance Improvements

  • ♻️ Improved device connection stability (1d603ab)
  • ♻️ Optimized the adb daemon startup failure detection mechanism (ca6be85)
  • 🧑‍💻 Improve device-based terminal experience (88a0356)

1.27.2 (2024-11-26)

Bug Fixes

  • 🐛 Start app to adapt to dark mode (ae13fde)

1.27.1 (2024-11-25)

Bug Fixes

  • 🐛 Make StartApp compatible with scrcpy v3.0 (1082e0d)

Performance Improvements

  • 🚀 Adjust options to support scrcpy v3.0 (0602676)
  • 🚀 Update to scrcpy v3.0 (bf06382)

1.27.0 (2024-11-21)

Features

  • ✨ Support edge hiding function (14a81de)

Performance Improvements

  • ⬆️ Optimize edge hiding performance (74a91a4)

1.26.4 (2024-11-14)

Bug Fixes

  • 🐛 Temporarily disable scrcpy integration in macOS (9bf4d5c)

1.26.3 (2024-11-08)

Bug Fixes

  • 🐛 Fix device support audio and video encoding cannot be parsed (9b7f6a9)
  • 🐛 Restore the --display-buffer parameter to solve the mirroring problem (0f3d869)

Performance Improvements

  • ♻️ Support interruption during waiting for wireless connection (344b385)
  • ♻️ Supports retrieving a list of applications (b1a6ba7)
  • ⚡️ Optimize startup application performance (8e94494)

1.26.2 (2024-11-06)

Bug Fixes

  • 🐛 Fix linux build errors (9b43dc0)

1.26.1 (2024-11-06)

Performance Improvements

  • ♻️ No longer building universal packages for macOS (db5deb4)

1.26.0 (2024-11-06)

Features

  • ✨ Integrate scrcpy binaries for macos (85bf096)
  • ✨ Supports starting applications for mirroring (d19e781)

Bug Fixes

  • 🐛 Rename --display-buffer to --video-buffer (b2bb0ae)
  • 🐛 Repair floating action bar start application error (487e7e2)
  • 🩹 Restore the windows build configuration (9491069)

Performance Improvements

  • ♻️ Adjust the position of the start application button (9833932)
  • ♻️ When the application fails to start, display the error message (dbc34d6)
  • ⚡️ Improve the start APP experience (29e5e1b)

1.25.5 (2024-11-05)

Performance Improvements

  • ⚡️ Optimize the stability of options that need to dynamically obtain parameters in preference settings (39bbc98)

1.25.4 (2024-10-31)

Performance Improvements

  • ♻️ Enhance recording stability (3dd7525)
  • ♻️ Optimize camera recording stability (952b2a7)
  • 💄 Normalize control window titles and generated file names (ccc7f0e)

1.25.3 (2024-10-29)

Bug Fixes

  • 🔧 Camera recording and screen off configuration conflict (4508758)

Performance Improvements

  • 🔧 Temporarily disable scheduled tasks that are too far away (be5e639)

1.25.2 (2024-10-29)

Bug Fixes

  • 🐛 Resolve default recording error (358064e)

1.25.1 (2024-10-28)

Miscellaneous Chores

1.25.0 (2024-10-28)

Features

  • ✨ Support to close the device screen when controlling (a84c775)
  • 📸 Enhanced recording (7f10161)

Performance Improvements

  • ♻️ Optimize camera recording (4be2cf4)
  • ♻️ Script and directory structure optimization (68378ef)
  • ⚗️ Experimental support for turning off screen controls (9555f58)
  • ⚡️ Optimize scrcpy parameter conversion performance (18dcd24)
  • 💄 Improved Russian display (ca79e1b)
  • 📸 Recording camera support (10d0370)

1.24.3 (2024-10-21)

Performance Improvements

  • 💄 Optimize Russian display effect (5ca39ae)

1.24.2 (2024-09-16)

Bug Fixes

  • 🐛 Fix the mirror group bug (cd7d9cd)

1.24.1 (2024-09-16)

Performance Improvements

  • ✨ Update to scrcpy@2.7 to support the gamepad (0053e87)
  • ⬆️ Optimize the performance of the floating control bar (a1c60ec)
  • 🚀 Extended floating control bar function (790e703)

1.24.0 (2024-09-12)

Features

  • ✨ Support floating control bar (8807e50)

Performance Improvements

  • ✅ Support switching devices on the floating control bar (50440f5)
  • 💄 Optimize preference setting button layout (47ae53d)

1.23.6 (2024-09-09)

Bug Fixes

  • 🐛 Fixed the problem of minimizing the visibility of tray icons (b0f42aa)
  • 🐛 Repair ADB timeout problems (b5bffc5)

1.23.5 (2024-09-09)

Performance Improvements

  • ♻️ Improve ADB connection stability (7655ba6)

1.23.4 (2024-09-08)

Bug Fixes

  • 🐛 Repair part of internationalization Lost dynamics (d18444f)

1.23.3 (2024-09-08)

Performance Improvements

  • ♻️ Optimize the performance of equipment interaction column and file manager (41ffcf5)

1.23.2 (2024-09-07)

Performance Improvements

  • 🚀 Support file manager upload to the current directory (737c2a3)

1.23.1 (2024-09-07)

Performance Improvements

  • ⬆️ Update dependencies (8b03862)

1.23.0 (2024-09-07)

Features

  • ✨ Support graphic file manager (8155723)
  • 🚀 Initially add a new file manager (94ee007)

Performance Improvements

1.22.4 (2024-08-03)

Bug Fixes

  • 🐛 plan task Remove operation bug (5205935)

Performance Improvements

1.22.3 (2024-08-03)

Performance Improvements

  • ♻️ Update scrcpy to 2.6.1 (1eef9d2)

1.22.2 (2024-07-25)

Performance Improvements

  • 💄 Optimize the display effect of the dark mode (38f854b)
  • 💄 Optimize the display effect of the quick operation bar (7b3c4db)
  • 💄 Optimize the display effect of the tabs bar (5b2d41c)

1.22.1 (2024-07-25)

Bug Fixes

  • 🐛 Fixed asset publishing issues (222f626)

1.22.0 (2024-07-25)

Features

  • 🚀 Add a scheduled task list (d72202b)
  • 🚀 Add basic timing task function (04a7608)
  • 🚀 Add timing task entrance (8393c85)
  • 🚀 添加定时任务入口 (6ce66d4)

Bug Fixes

  • 🐛 The internationalization problem of repairing path selector (8e6af20)
  • 💄 Optimize wireless connection user interface (50ae742)

Performance Improvements

  • 💄 Optimization of the operation bar at the top of the equipment list (81bd3d9)
  • 💄 Optimized operation button layout (16f9535)

1.21.4 (2024-07-14)

Performance Improvements

  • ♻️ Optimize custom startup performance (abd468b)
  • ♻️ Perfect allSettledWrapper method (5b7d0af)

1.21.3 (2024-07-13)

Bug Fixes

  • Fix the width problem of custom startup pop-up windows (9a7e56b)

1.21.2 (2024-07-13)

Bug Fixes

  • 🐛 Fix terminal style abnormalities in dark theme (3d4dc7c)

Performance Improvements

  • ♻️ Improve code robustness (2f389af)
  • 🚀 Optimize batch operation interaction (343eab2)

1.21.1 (2024-07-13)

Bug Fixes

  • 🐛 Fix dependency build errors (5b02621)

1.21.0 (2024-07-13)

Features

  • 🎉 Support batch execution script function (8097022)
  • 🚀 Support execution script function (2013413)

Bug Fixes

  • 🐛 Repair the problem of equipment width in the English state (25c42d9)
  • 📝 Update Translation (33b0181)

Performance Improvements

  • ✅ Support batch screenshot and other performance optimization (db9e3e7)
  • ✨ Support for custom startup mirroring (677f30c)
  • 🐛 Fix the problem of frequently trigger preservation of preferences (8261916)

1.20.1 (2024-07-04)

Bug Fixes

  • 🐛 Fix batch text spelling errors (062c689)

1.20.0 (2024-07-04)

Features

  • ✨ Add batch installation application function (37ce245)

Performance Improvements

  • 🚀 Add mouse binding options (7ee4ba4)

1.19.4 (2024-07-02)

Bug Fixes

  • 🐛 Fix terminal style problems (9fc1ded)
  • Update Chinese language translations (b8d77e3)

Performance Improvements

  • 🚀 Update to scrcpy v2.5 (22cc5a3)

1.19.3 (2024-06-13)

Bug Fixes

  • 🐛 Abnormal operations cause the program that cannot be closed (b989140)

1.19.2 (2024-06-03)

Bug Fixes

  • 🐛 Automatically apply local languages (0cc8208)

1.19.1 (2024-05-26)

Bug Fixes

  • 🐛 In some cases, the light mode is abnormal (ea227e0)
  • 🐛 Search for shortcut key conflicts (c70e6ca)

Performance Improvements

1.19.0 (2024-05-15)

Features

  • 🚀 Add page search function (6dd8244)
  • 🚀 Update dependencies to support ESM (9f1696f)

Bug Fixes

  • 🐛 Resolving build failures (8460945)
  • 🐛 Tips unavailable (603e4e9)

Performance Improvements

  • ♻️ FindInPage API (fcf8269)
  • ♻️ Optimize dark mode (2f2e1cf)
  • ♻️ Search interaction (a195b7e)
  • ♻️ Search variable name (7c55e50)
  • 🐛 Global search error (091d503)
  • 🚀 优化页面查找工具性能 (8587977)

1.18.4 (2024-05-04)

Bug Fixes

  • 🐛 Wireless adb does not support Spaces (1f27597)

1.18.3 (2024-04-12)

Performance Improvements

  • ♻️ i18n configuration (1ca0469)

1.18.2 (2024-04-11)

Bug Fixes

  • 🐛 zh_TW Language support (885af3a)

1.18.1 (2024-04-11)

Bug Fixes

  • 🔧 Repair merge zh-TW failed (81ff63f)

Performance Improvements

1.18.0 (2024-04-11)

Features

  • Add a simple zh_TW Traditional Chinese locale (cec6539)

1.17.8 (2024-03-29)

Bug Fixes

  • 🐛 Camera configuration conflict (07cc5f3)
  • 🐛 OTG configuration conflict (576d287)
  • 🐛 OTG mode: could not turn screen off (c5bed0e)

1.17.7 (2024-03-27)

Bug Fixes

  • ♻️ Remove the redundant imports (a06708f)

Performance Improvements

  • ♻️ Optimize delete history logic (780e3b9)
  • ♻️ Support delete historical connection (c82560f)
  • 💄 Wireless style optimization (ba51fe3)

1.17.6 (2024-03-21)

Performance Improvements

  • ♻️ Supports automatic execution of mirrors on devices (11e0884)

1.17.5 (2024-03-17)

Performance Improvements

1.17.4 (2024-03-14)

Performance Improvements

  • ♻️ Options in the preference settings (dc711cb)

1.17.3 (2024-03-13)

Performance Improvements

  • ♻️ Remove console log (6e25eb7)

1.17.2 (2024-03-10)

Bug Fixes

  • 🐛 Abnormal built-in terminal adb command (368551a)

Performance Improvements

  • ♻️ Update eslint config (bf2d2b4)

1.17.1 (2024-03-05)

Performance Improvements

  • ♻️ Interactive logic optimization (193f80a)
  • ♻️ Optimize design and code (d507c2d)
  • ♻️ Optimize equipment operation (389ac33)
  • ➖ Remove redundant packages (f9e4a0e)
  • 💄 Optimize dark mode styles (1cac054)

1.17.0 (2024-03-04)

Features

  • 🎉 Update to scrcpy v2.4 (02a4d39)

1.16.8 (2023-12-27)

Bug Fixes

  • 🐛 The maximum size description error (01fd926)

1.16.7 (2023-12-19)

Performance Improvements

1.16.6 (2023-12-19)

Miscellaneous Chores

1.16.5 (2023-12-19)

Performance Improvements

  • 📝 Control in stop charging (8707eb5)

1.16.4 (2023-12-19)

Bug Fixes

  • 🐛 Pairing code type issue (889fe8c)

1.16.3 (2023-12-03)

Performance Improvements

  • 🚀 Update scrcpy v2.3.1 (3566655)

1.16.2 (2023-12-02)

Bug Fixes

1.16.1 (2023-11-26)

Bug Fixes

1.16.0 (2023-11-26)

Performance Improvements

Miscellaneous Chores

1.15.0 (2023-11-18)

Features

  • 添加投屏窗口大小控制 (97d7868)

Performance Improvements

  • 🚀 Add window position option (866aa2c)

1.14.3 (2023-11-17)

Performance Improvements

  • ♻️ Add context menu (f0f25a7)
  • ♻️ Optimize extended menu bar interaction (de9352c)
  • 📝 Optimization preferences description (30eca50)

1.14.2 (2023-11-16)

Performance Improvements

  • ♻️ Optimize autoConnect historical devices (755a130)
  • 💡 Add autoConnect option (a57b847)

1.14.1 (2023-11-14)

Bug Fixes

  • 🐛 Abnormal terminal theme (20d37c1)

1.14.0 (2023-11-14)

Features

  • 🎉 Add Terminal Debugging (fdf40c7)

Performance Improvements

  • ♻️ Optimize terminal performance (d3afc4b)
  • 💄 Update terminal style (5b6b8d1)
  • 🚨 Optimization error prompt (b759502)

1.13.5 (2023-11-11)

Performance Improvements

  • ♻️ Mirror group shutdown logic (296e21d)
  • ♻️ Optimize mirror group (5793c24)

1.13.4 (2023-11-10)

Performance Improvements

  • ♻️ Optimization updater (61ccd4a)
  • ♻️ Optimize mirror group (81c007f)

1.13.3 (2023-11-10)

Bug Fixes

  • 🐛 Recording prompt and file format errors (bfdad9e)

Performance Improvements

  • ♻️ Optimize Batch connection performance (36de67b)
  • ♻️ Optimize file push prompts (4a3575f)
  • ♻️ Optimize historical device connections (83f8c04)
  • ✨ Support bulk connecting to historical devices (b7eb1dd)

1.13.2 (2023-11-09)

Bug Fixes

Performance Improvements

  • ♻️ Configure Incompatible Handling Mechanism (c0e6a01)
  • ♻️ Optimize gnirehtet (de3555b)
  • 💄 Optimize volume control and gnirehtet (b40bdcf)
  • 🚀 Add File push function (70f8b46)
  • 🚀 Add screen rotation shortcut menu (dd601df)

1.13.1 (2023-11-08)

Performance Improvements

  • ♻️ Adjust volume control position (1b3f49e)
  • ♻️ Optimize configuration file logic (5f8cc5a)
  • 🚀 Add volume control (1505518)

1.13.0 (2023-11-07)

Features

  • 🎉 Add mirror group function (0c9d36f)

Bug Fixes

Performance Improvements

  • ♻️ Optimize mirror group (cf9c82d)
  • ♻️ optimize mirror group tips (46defbf)
  • ♻️ Optimize preferences (7a6417e)
  • ♻️ Optimize window control (0530ed3)
  • 💄 Update styles (37da97b)
  • 🚀 Add camera options (5a04b4c)

1.12.4 (2023-11-03)

Bug Fixes

  • 🐛 MacOS reduced to the tray to evoke failure (d7bf83b)

1.12.3 (2023-11-03)

Bug Fixes

  • 🐛 MacOS reduced to the tray to evoke failure (6153bc4)

1.12.2 (2023-11-03)

Bug Fixes

1.12.1 (2023-11-03)

Bug Fixes

  • 🐛 Add gnirehtet fix option (f9c6c32)
  • 🐛 Display options cannot be changed (3046746)
  • 🐛 Preference style (0f72090)
  • 🐛 Reset preferences language not restored (d691780)
  • 🐛 Unable to update path selector (3279c34)
  • 🐛 Video codec preset error (1af9abd)

Performance Improvements

  • ♻️ optimize Codec (6154ffc)
  • ♻️ Optimize recording (f4dfb2c)
  • 🎨 Update preferences style (e9befea)

1.12.0 (2023-11-02)

Features

  • 🎉 Update Scrcpy to v2.2 (5c401a8)

Bug Fixes

Performance Improvements

1.11.9 (2023-10-31)

Performance Improvements

  • ♻️ Optimization gnirehtet and scrcpy (9cf800c)
  • ♻️ Optimize Gnirehtet interaction (a90e570)

1.11.8 (2023-10-31)

Bug Fixes

  • 🎨 修复 macOS 设置主题跟随系统后 某些情况下循环触发导致死循环的问题 (1d7b188)

1.11.7 (2023-10-31)

Bug Fixes

  • 🐛 macOS x64ArchFiles Errors (151cb29)

1.11.6 (2023-10-31)

Bug Fixes

  • 🐛 macOS x64ArchFiles Errors (7dbca01)

1.11.5 (2023-10-31)

Bug Fixes

  • 🐛 macOS x64ArchFiles Errors (ad3f77f)

1.11.4 (2023-10-31)

Bug Fixes

  • 🐛 macOS x64ArchFiles Errors (4b4e116)

1.11.3 (2023-10-31)

Bug Fixes

  • 🐛 Unix permission issues (1279994)
  • 🐛 Unix permission issues (dc9a3c4)
  • 🐛 x64ArchFiles Error (82a99d9)

1.11.2 (2023-10-30)

Bug Fixes

  • 🐛 修复 macOS 打包失败的问题 (1b2236c)

1.11.1 (2023-10-30)

Bug Fixes

  • 🐛 修复 macOS 打包失败的问题 (37e2837)

1.11.0 (2023-10-30)

Features

  • 🎉 Add gnirehtet reverse tethering function (2c97189)

Bug Fixes

  • 🐛 gnirehtet custom dependent paths error (cfd0e1d)

Performance Improvements

  • ♻️ Optimize Gnirehtet interaction (e1237cd)
  • ♻️ 拆分依赖文件禁用冗余的警告信息 (93ad836)
  • ♻️ 目录结构及描述调整 (f9a32d6)
  • ♻️ 补充依赖及目录结构调整 (b18256b)

1.10.2 (2023-10-28)

Bug Fixes

  • 🐛 修复设置主题跟随系统后没有生效的问题 (95a83f4)

1.10.1 (2023-10-28)

Bug Fixes

  • 🐛 修复 linux 无法启动镜像或录制服务以及修改自定义依赖目录的问题 (d815643)

1.10.0 (2023-10-27)

Features

  • 🚀 新增支持 深色模式、国际化语言、运行日志等功能 (4b13f58)

Bug Fixes

  • 🐛 修复 linux 打包后图标丢失的问题 (217d82d)
  • 🐛 修复安装路径包含空格会导致无法启动服务的问题 (29ae786)
  • 🐛 修复录制结束点击取消异常弹窗以及点击重启服务没有反应的问题 (054c55b)
  • 🔧 修复自定义路径功能没有生效的问题 (894b581)

Performance Improvements

1.9.1 (2023-10-24)

Performance Improvements

  • 💄 窗口控制及交互逻辑优化 (52514e2)

1.9.0 (2023-10-24)

Features

  • 🚀 添加 i18n 初步支持 (18d490f)

Bug Fixes

  • 🐛 修复 macOS 最小化到托盘后状态栏图标不显示的问题 (a789826)

1.8.17 (2023-10-23)

Bug Fixes

  • 🐛 尝试修复构建失败 (daeb9e5)

1.8.16 (2023-10-23)

Performance Improvements

  • ✨ 采用新的 Logo 设计 (3bf79d3)

1.8.15 (2023-10-22)

Bug Fixes

  • 🐛 修复 Linux 平台启动白屏无法正常使用的问题 (54e713b)

1.8.14 (2023-10-21)

Bug Fixes

  • 🐛 修复 linux 打包配置错误的问题 (a9668d9)

1.8.13 (2023-10-21)

Performance Improvements

  • 🚀 为 windows 添加 ARM64 软件包编译 (368e8ee)
  • 🚀 支持所有平台在点击关闭按钮时选择是否保存到托盘中的功能 (8360198)

1.8.12 (2023-10-21)

Bug Fixes

  • 🐛 修复 macOS 或 linux 下自定义依赖选项描述错误的问题 (0d4b1ce)

1.8.11 (2023-10-21)

Performance Improvements

  • 🔨 优化窗口默认大小 (393e899)

1.8.10 (2023-10-20)

Bug Fixes

  • 🐛 修复 macOS 窗口问题 (f768566)

1.8.9 (2023-10-20)

Bug Fixes

  • 🐛 修复 macOS 窗口过小导致出现横向滚动条的问题 (8ee34ca)

1.8.8 (2023-10-20)

Bug Fixes

  • 🚀 修复 macOS 简单关闭应用重新打开时报错的问题 (4b259c3)

1.8.7 (2023-10-20)

Bug Fixes

  • 🐛 修复打包多个平台时可能生成重复文件导致发布软件包失败的问题 (e89a7a5)

1.8.6 (2023-10-20)

Bug Fixes

  • 🔧 修复 macOS 无法正确获取系统依赖路径的问题 (2352593)

1.8.5 (2023-10-20)

Bug Fixes

  • 🚑️ 修复 Linux maintainer 问题 (4e1542a)

1.8.4 (2023-10-20)

Bug Fixes

  • 🚑️ 修复 Linux 打包失败的问题 (96f85d8)

1.8.3 (2023-10-20)

Bug Fixes

  • 🚀 修复 MacOS 软件包安装后无线显示 Logo 的问题 (77dd81b)

1.8.2 (2023-10-20)

Bug Fixes

  • 🔧 修复 Linux 及 MacOS 获取默认依赖路径异常的问题 (87b533f)
  • 🔧 修复 MacOS ARM64 版本打包失败的问题 (e9a8fc2)

1.8.1 (2023-10-20)

Performance Improvements

  • 🚀 支持创建更多架构的 MacOS 软件包格式 (4780e7c)

1.8.0 (2023-10-20)

Features

  • 🚀 初步添加对 Linux 以及 MacOS 的支持 (569ed2e)

Bug Fixes

  • 📝 偏好设置描述信息修改 (23d68d4)
  • 🔧 设备列表标签显示细节调整 (4f2f00e)

Performance Improvements

  • 📝 设备备注文本框描述信息调整 (379b325)

1.7.1 (2023-10-20)

Bug Fixes

  • 🚀 修复对设备进行独立配置时的一些问题 (6ccd6d0)

Performance Improvements

  • 🎉 初步支持设置偏好设置的作用域范围 (5dd328c)

1.7.0 (2023-10-19)

Features

  • 🚀 新增支持导入及导出配置 (326a133)
  • 🚀 新增支持添加设备备注 (43f15be)

Performance Improvements

  • ➕ 设备交互栏添加重启设备及打开通知栏功能 (1341fb8)

1.6.10 (2023-10-18)

Performance Improvements

  • 🚀 采用新的方法实现所有进程共享 isPackaged (8a5f7d9)

1.6.9 (2023-10-17)

Bug Fixes

  • 🔧 优化 isPackaged 判断条件解决某些情况下资源路径解析异常的问题 (fbd1885)

1.6.8 (2023-10-17)

Performance Improvements

  • 🚀 支持通过操作栏安装应用并提供相应安装反馈 (3bd2075)

1.6.7 (2023-10-17)

Performance Improvements

  • 📝 去除冗余的依赖项 (a6744dc)

1.6.6 (2023-10-17)

Bug Fixes

  • 🐛 build fix (09c8dee)
  • 🐛 修复 electron 资源路径问题 (955756e)

1.6.5 (2023-10-16)

Bug Fixes

  • 🐛 修复 App NextTick 错误 (79d85eb)

1.6.4 (2023-10-16)

Bug Fixes

  • 🐛 修复 electron-builder 配置异常导致打包的文件无法发布的问题 (9a4efa5)
  • 🚀 修复设备列表按钮状态变更影响布局变化的问题 (83a8043)

1.6.3 (2023-10-16)

Bug Fixes

  • 🐛 修复打包后图标丢失的问题 (58a66f1)

1.6.2 (2023-10-13)

Bug Fixes

  • 🐛 修复USB未授权设备导致无线连接地址变为假值的问题 (9c25325)

1.6.1 (2023-10-13)

Performance Improvements

  • 🔨 自定义通用的文件存储路径相关逻辑完善 (8455e86)

1.6.0 (2023-10-13)

Features

  • 🚀 增加了对设备交互控制栏的支持 (fd20736)

1.5.3 (2023-10-13)

Bug Fixes

  • 🔧 修复点击无线模式没有反应的问题 (9d55ef9)

1.5.2 (2023-10-13)

Bug Fixes

  • 📝 修复高级配置标题语义不明的问题 (218de1c)

Performance Improvements

  • 🚀 添加更多的高级配置并更新文档 (922abd2)

1.5.1 (2023-10-12)

Bug Fixes

  • 🐛 去除页面组件冗余参数 (8e5df15)

1.5.0 (2023-10-12)

Features

  • 🚀 添加音视频录制功能以及更多的高级选项 (b6986d1)

1.4.1 (2023-10-12)

Bug Fixes

  • 🐛 修复检查更新失败没有提示的问题 (6f733ea)

1.4.0 (2023-10-11)

Features

  • 🚀 添加在线检查更新功能 (8de04e0)

Bug Fixes

  • 🔨 修复无线配对时表单验证错误 (7cd9ea3)
  • 🔨 修复直接进行无线连接时没有处理配对设备的问题 (4263d07)

1.3.3 (2023-09-26)

Bug Fixes

  • 🐛 修复触摸点配置描述错误的问题 (4e2be23)

1.3.2 (2023-09-19)

Bug Fixes

  • 🔧 修复旋转屏幕配置异常的问题 (af7a319)

1.3.1 (2023-09-19)

Bug Fixes

  • 🔧 修复图标不透明的问题 (24c011f)

1.3.0 (2023-09-19)

Features

  • ✨ 用户界面进行优化,制作了合适的 Logo (1b96ffc)

1.2.0 (2023-09-19)

Features

  • 🎉 优化设备界面视图并添加虚拟控制栏配置 (3be0682)

1.1.0 (2023-09-18)

Features

  • 🚀 增加了常用的 Scrcpy 高级配置 (ac52df2)

1.0.2 (2023-09-18)

Performance Improvements

  • 🚀 合并无线连接及有线连接到设备列表 (e84f24e)

1.0.1 (2023-09-16)

Bug Fixes

  • 🔧 去除未测试环境的打包以修复构建失败的问题 (d6ec7fd)

1.0.0 (2023-09-16)

Features

  • 📝 添加基本的有线连接支持 (647a0c5)
  • 🚀 添加 Electron 基本支持 (a46a5e1)
  • 🚀 添加初步的构建及发布支持 (c85f8fb)
  • 🚀 添加基本的无线连接功能 (6dd2db9)

Bug Fixes

  • 🔧 修复 ADB 环境变量配置错误导致无法连接的问题 (9ef7203)

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/contact.html b/zhHans/contact.html index 53dc894cf..3b646893e 100644 --- a/zhHans/contact.html +++ b/zhHans/contact.html @@ -6,14 +6,14 @@ 联系我们 | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
Skip to content

+

- +

+ \ No newline at end of file diff --git a/zhHans/donate.html b/zhHans/donate.html index 10461d81c..cc5da05f1 100644 --- a/zhHans/donate.html +++ b/zhHans/donate.html @@ -6,14 +6,14 @@ 捐赠项目 | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
Skip to content

捐赠项目♥️

如果该项目帮到你的话,可以请我喝杯咖啡,让我更有精神完善该项目 😛

viarotel-wepayviarotel-alipayviarotel-paypal

+

- +

+ \ No newline at end of file diff --git a/zhHans/guide/index.html b/zhHans/guide/index.html index 20bf3d07c..e35fe30ca 100644 --- a/zhHans/guide/index.html +++ b/zhHans/guide/index.html @@ -6,14 +6,14 @@ 指引 | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
Skip to content

Escrcpy:基于Electron的图形化安卓设备控制工具

什么是Escrcpy?

Escrcpy是一款基于Electron开发的图形化安卓设备控制工具。它基于知名的开源项目Scrcpy构建,为用户提供了更加友好且功能丰富的图形界面。通过Escrcpy,用户可以轻松地在电脑上显示并控制安卓设备,享受高清、低延迟的投屏体验。

核心功能

高效稳定的投屏体验

  • ⚡️ 高性能:支持30-120 fps(取决于设备性能)
  • 🌟 高质量:支持1920×1080或更高分辨率显示
  • 🕒 低延迟:延迟仅35~70毫秒
  • 🚀 快速启动:约1秒即可显示首帧画面

丰富的功能特性

  • 📡 无线连接:支持通过扫码快速连接设备
  • 🤖 自动化:自动连接设备、自动执行投屏、自定义脚本及定时任务
  • 💡 高度可定制:多设备管理、独立配置、自定义备注、配置导入导出
  • 🖥️ 窗口编排:可视化多设备窗口布局管理,支持拖拽调整位置和尺寸
  • 🔗 反向网络共享:内置Gnirehtet反向网络共享功能
  • 🎨 主题切换:支持浅色/深色模式,随系统自动切换

优化的用户体验

  • 😎 轻量化:原生支持,仅显示设备屏幕
  • 🙅‍♂️ 无残留:不会在安卓设备上留下任何痕迹
  • 🤩 纯净体验:无需账户、无广告、无需联网
  • 🗽 完全免费开源

使用场景

Escrcpy非常适合以下场景:

  1. 开发者在电脑上调试安卓应用
  2. 游戏玩家在大屏幕上畅玩手游
  3. 需要录制手机屏幕内容的用户
  4. 工作中需在电脑上操作手机的情况
  5. 教学时演示手机操作

跨平台支持

Escrcpy支持主流操作系统:

  • Windows
  • macOS
  • Linux

技术优势

作为Scrcpy的图形界面版本,Escrcpy保留了Scrcpy的全部优点,同时新增了:

  • 更直观的设备管理界面
  • 更便捷的连接方式
  • 更丰富的自定义选项
  • 更完善的批量操作功能

未来发展

项目团队将持续完善Escrcpy,未来计划包括:

  • 优化投屏窗口位置与大小的设置方式
  • 提升批量设备连接体验
  • 开发图形化脚本编辑工具

如何使用

Escrcpy是一个完全免费的开源项目,具体使用方法请参考:

快速开始 👉

结语

Escrcpy为Scrcpy带来了现代化的图形界面和增强功能,让安卓设备控制变得更简单高效。无论你是开发者还是普通用户,Escrcpy都能为你提供出色的设备控制体验。其开源免费的特性,也让更多人能够毫无顾虑地使用这一优秀工具。

如果你正在寻找一款强大且易用的安卓设备控制工具,Escrcpy绝对值得一试!

+

Skip to content

Escrcpy:基于Electron的图形化安卓设备控制工具

什么是Escrcpy?

Escrcpy是一款基于Electron开发的图形化安卓设备控制工具。它基于知名的开源项目Scrcpy构建,为用户提供了更加友好且功能丰富的图形界面。通过Escrcpy,用户可以轻松地在电脑上显示并控制安卓设备,享受高清、低延迟的投屏体验。

核心功能

高效稳定的投屏体验

  • ⚡️ 高性能:支持30-120 fps(取决于设备性能)
  • 🌟 高质量:支持1920×1080或更高分辨率显示
  • 🕒 低延迟:延迟仅35~70毫秒
  • 🚀 快速启动:约1秒即可显示首帧画面

丰富的功能特性

  • 📡 无线连接:支持通过扫码快速连接设备
  • 🤖 自动化:自动连接设备、自动执行投屏、自定义脚本及定时任务
  • 💡 高度可定制:多设备管理、独立配置、自定义备注、配置导入导出
  • 🖥️ 窗口编排:可视化多设备窗口布局管理,支持拖拽调整位置和尺寸
  • 🔗 反向网络共享:内置Gnirehtet反向网络共享功能
  • 🎨 主题切换:支持浅色/深色模式,随系统自动切换

优化的用户体验

  • 😎 轻量化:原生支持,仅显示设备屏幕
  • 🙅‍♂️ 无残留:不会在安卓设备上留下任何痕迹
  • 🤩 纯净体验:无需账户、无广告、无需联网
  • 🗽 完全免费开源

使用场景

Escrcpy非常适合以下场景:

  1. 开发者在电脑上调试安卓应用
  2. 游戏玩家在大屏幕上畅玩手游
  3. 需要录制手机屏幕内容的用户
  4. 工作中需在电脑上操作手机的情况
  5. 教学时演示手机操作

跨平台支持

Escrcpy支持主流操作系统:

  • Windows
  • macOS
  • Linux

技术优势

作为Scrcpy的图形界面版本,Escrcpy保留了Scrcpy的全部优点,同时新增了:

  • 更直观的设备管理界面
  • 更便捷的连接方式
  • 更丰富的自定义选项
  • 更完善的批量操作功能

未来发展

项目团队将持续完善Escrcpy,未来计划包括:

  • 优化投屏窗口位置与大小的设置方式
  • 提升批量设备连接体验
  • 开发图形化脚本编辑工具

如何使用

Escrcpy是一个完全免费的开源项目,具体使用方法请参考:

快速开始 👉

结语

Escrcpy为Scrcpy带来了现代化的图形界面和增强功能,让安卓设备控制变得更简单高效。无论你是开发者还是普通用户,Escrcpy都能为你提供出色的设备控制体验。其开源免费的特性,也让更多人能够毫无顾虑地使用这一优秀工具。

如果你正在寻找一款强大且易用的安卓设备控制工具,Escrcpy绝对值得一试!

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/guide/milestones.html b/zhHans/guide/milestones.html index c0b7c2ccd..e2e5eebd6 100644 --- a/zhHans/guide/milestones.html +++ b/zhHans/guide/milestones.html @@ -6,14 +6,14 @@ 里程碑 | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
Skip to content

里程碑

优先级从高到低:

  • 优化Logo设计 ✅
  • 软件更新功能 ✅
  • 录制并保存音视频 ✅
  • 设备快捷交互控制栏 ✅
  • 自定义Adb和Scrcpy依赖项 ✅
  • 自定义设备名称 ✅
  • 导出和导入偏好设置 ✅
  • 单独设备配置 ✅
  • 支持macOS和Linux系统 ✅
  • 国际化支持 ✅
  • 深色模式 ✅
  • 反向网络共享(Gnirehtet)✅
  • 摄像头镜像 ✅
  • 多屏协同 ✅
  • 文件推送、屏幕旋转、音频控制 ✅
  • 批量连接历史设备 ✅
  • 内置终端 ✅
  • 自动执行镜像 ✅
  • 灵活启动镜像 ✅
  • 批量处理 ✅
  • 计划任务 ✅
  • 图形化文件管理器 ✅
  • 悬浮控制栏 ✅
  • 增强版录制功能 ✅
  • 启动APP(多线程) ✅
  • 主窗口边缘隐藏 ✅
  • 设备分组(通过备注筛选) ✅
  • 改进历史设备连接体验 ✅
  • 文件管理支持上传目录 ✅
  • 支持添加打开APP到桌面快捷方式(仅Windows) ✅
  • 支持设备批量启动 ✅
  • 支持通过可视化编排工具控制各设备的窗口布局 ✅
  • 整合同一设备的不同连接方式和配置,提升用户体验 ✅
  • 增强设备文件管理器 ✅
  • 集成 AutoGLM 无需脚本使用自然语言控制你的安卓设备 ✅
  • 重构主进程架构,提升性能和稳定性 ✅
  • 通过可视化编排工具支持脚本的自动化 ✅
  • 设备群控功能 ✅
  • 键盘映射功能 🚧

+

Skip to content

里程碑

优先级从高到低:

  • 优化Logo设计 ✅
  • 软件更新功能 ✅
  • 录制并保存音视频 ✅
  • 设备快捷交互控制栏 ✅
  • 自定义Adb和Scrcpy依赖项 ✅
  • 自定义设备名称 ✅
  • 导出和导入偏好设置 ✅
  • 单独设备配置 ✅
  • 支持macOS和Linux系统 ✅
  • 国际化支持 ✅
  • 深色模式 ✅
  • 反向网络共享(Gnirehtet)✅
  • 摄像头镜像 ✅
  • 多屏协同 ✅
  • 文件推送、屏幕旋转、音频控制 ✅
  • 批量连接历史设备 ✅
  • 内置终端 ✅
  • 自动执行镜像 ✅
  • 灵活启动镜像 ✅
  • 批量处理 ✅
  • 计划任务 ✅
  • 图形化文件管理器 ✅
  • 悬浮控制栏 ✅
  • 增强版录制功能 ✅
  • 启动APP(多线程) ✅
  • 主窗口边缘隐藏 ✅
  • 设备分组(通过备注筛选) ✅
  • 改进历史设备连接体验 ✅
  • 文件管理支持上传目录 ✅
  • 支持添加打开APP到桌面快捷方式(仅Windows) ✅
  • 支持设备批量启动 ✅
  • 支持通过可视化编排工具控制各设备的窗口布局 ✅
  • 整合同一设备的不同连接方式和配置,提升用户体验 ✅
  • 增强设备文件管理器 ✅
  • 集成 AutoGLM 无需脚本使用自然语言控制你的安卓设备 ✅
  • 重构主进程架构,提升性能和稳定性 ✅
  • 通过可视化编排工具支持脚本的自动化 ✅
  • 设备群控功能 ✅
  • 键盘映射功能 🚧

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/guide/operation.html b/zhHans/guide/operation.html index 8ec0462bc..16e6bf778 100644 --- a/zhHans/guide/operation.html +++ b/zhHans/guide/operation.html @@ -6,14 +6,14 @@ 操作指南 | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
Skip to content

设备操作指南

批量处理

  • 批量镜像
  • 批量截屏
  • 批量安装应用
  • 批量文件管理
  • 批量执行脚本
  • 批量计划任务

控制模式

  • 镜像模式
  • 录制模式
  • 摄像头录制
  • 音频录制
  • 摄像头
  • 自定义模式
  • OTG模式

设备交互栏

  • 自动操控(AutoGLM)
  • 切换应用
  • 返回主页
  • 返回键
  • 启动APP(镜像组)
  • 关闭屏幕(实验性功能)
  • 通知中心
  • 电源键
  • 屏幕旋转
  • 音量控制
  • 截图
  • 重启设备
  • 安装APP
  • 文件管理器
  • 执行脚本
  • 计划任务
  • Gnirehtet(反向网络共享)

+

Skip to content

设备操作指南

批量处理

  • 批量镜像
  • 批量截屏
  • 批量安装应用
  • 批量文件管理
  • 批量执行脚本
  • 批量计划任务

控制模式

  • 镜像模式
  • 录制模式
  • 摄像头录制
  • 音频录制
  • 摄像头
  • 自定义模式
  • OTG模式

设备交互栏

  • 自动操控(AutoGLM)
  • 切换应用
  • 返回主页
  • 返回键
  • 启动APP(镜像组)
  • 关闭屏幕(实验性功能)
  • 通知中心
  • 电源键
  • 屏幕旋转
  • 音量控制
  • 截图
  • 重启设备
  • 安装APP
  • 文件管理器
  • 执行脚本
  • 计划任务
  • Gnirehtet(反向网络共享)

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/guide/preferences.html b/zhHans/guide/preferences.html index ca5264321..91daed8ab 100644 --- a/zhHans/guide/preferences.html +++ b/zhHans/guide/preferences.html @@ -6,14 +6,14 @@ 偏好设置 | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
Skip to content

偏好设置

持续完善中,目前已支持以下常用配置项

通用设置

  • 主题风格
  • 语言选择
  • 文件存储路径
  • ADB路径
  • Scrcpy路径
  • Gnirehtet路径
  • Scrcpy参数
  • Gnirehtet参数
  • 自动连接设备
  • 自动执行镜像
  • Gnirehtet修复
  • 调试模式
  • 悬浮控制栏
  • 使用系统终端
  • 首选终端
  • 并发上限

视频控制

  • 禁用视频传输
  • 最大分辨率
  • 视频比特率
  • 刷新频率
  • 视频编解码器
  • 显示方向
  • 旋转角度
  • 屏幕裁剪
  • 显示器选择
  • 视频缓冲区
  • 接收端(v4l2)缓冲区

设备控制

  • 显示触摸点
  • 保持唤醒状态
  • 控制时关闭屏幕
  • 控制结束后关闭屏幕
  • 禁用控制时自动亮屏
  • 模拟辅助显示器

窗口控制

  • 窗口宽度
  • 窗口高度
  • 窗口X坐标
  • 窗口Y坐标
  • 无边框模式
  • 全屏模式
  • 窗口置顶
  • 禁用屏幕保护

音频控制

  • 禁用音频传输
  • 保留设备音频
  • 音频源选择
  • 音频编解码器
  • 音频比特率
  • 音频缓冲区
  • 音频输出缓冲区

音视频录制

  • 录制视频格式
  • 录制视频方向
  • 录制时长
  • 禁用视频回放
  • 禁用音频回放

输入控制

  • 鼠标模式
  • 鼠标绑定
  • 键盘模式
  • 键盘注入方式
  • 游戏手柄设置

摄像头控制

  • 摄像头源选择
  • 摄像头尺寸
  • 摄像头比例
  • 摄像头帧率

+

Skip to content

偏好设置

持续完善中,目前已支持以下常用配置项

通用设置

  • 主题风格
  • 语言选择
  • 文件存储路径
  • ADB路径
  • Scrcpy路径
  • Gnirehtet路径
  • Scrcpy参数
  • Gnirehtet参数
  • 自动连接设备
  • 自动执行镜像
  • Gnirehtet修复
  • 调试模式
  • 悬浮控制栏
  • 使用系统终端
  • 首选终端
  • 并发上限

视频控制

  • 禁用视频传输
  • 最大分辨率
  • 视频比特率
  • 刷新频率
  • 视频编解码器
  • 显示方向
  • 旋转角度
  • 屏幕裁剪
  • 显示器选择
  • 视频缓冲区
  • 接收端(v4l2)缓冲区

设备控制

  • 显示触摸点
  • 保持唤醒状态
  • 控制时关闭屏幕
  • 控制结束后关闭屏幕
  • 禁用控制时自动亮屏
  • 模拟辅助显示器

窗口控制

  • 窗口宽度
  • 窗口高度
  • 窗口X坐标
  • 窗口Y坐标
  • 无边框模式
  • 全屏模式
  • 窗口置顶
  • 禁用屏幕保护

音频控制

  • 禁用音频传输
  • 保留设备音频
  • 音频源选择
  • 音频编解码器
  • 音频比特率
  • 音频缓冲区
  • 音频输出缓冲区

音视频录制

  • 录制视频格式
  • 录制视频方向
  • 录制时长
  • 禁用视频回放
  • 禁用音频回放

输入控制

  • 鼠标模式
  • 鼠标绑定
  • 键盘模式
  • 键盘注入方式
  • 游戏手柄设置

摄像头控制

  • 摄像头源选择
  • 摄像头尺寸
  • 摄像头比例
  • 摄像头帧率

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/guide/started.html b/zhHans/guide/started.html index dd2cd8ca8..3f3dbabcd 100644 --- a/zhHans/guide/started.html +++ b/zhHans/guide/started.html @@ -6,14 +6,14 @@ 快速上手 | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
Skip to content

快速上手

安装说明

手动安装(通过发行包)

macOS用户可通过Homebrew安装

详见 homebrew-escrcpy

USB连接方式

注意:若手机弹出调试授权提示,请点击允许

  1. 在安卓设备上启用开发者模式USB调试功能
  2. 启动Escrcpy并将安卓设备通过USB连接电脑
  3. Escrcpy设备列表应已检测到您的设备,点击"开始镜像"
  4. 开始使用!

无线连接方式

扫码连接

  1. 先完成USB连接方式的步骤1-2
  2. 在开发者选项中启用并进入"无线调试"
  3. 点击"通过二维码配对设备"
  4. 开始使用!

IP地址连接

注意:若首次无线连接失败,可能需先进行无线配对,详见常见问题

注意:需在无线调试页面获取设备无线地址(通常为连接WiFi时分配的IP地址)和端口号(默认为5555)

  1. 先完成USB连接方式的步骤1-2
  2. 在Escrcpy中输入设备IP地址和端口号,点击"连接设备"
  3. 此时设备列表应显示您的手机,点击"开始镜像"
  4. 开始使用!

macOS与Linux平台

注意:这些平台未预装Scrcpy,需手动安装

Escrcpy@1.27.1+版本已初步集成scrcpy二进制文件,无需手动安装

  1. Linux用户参考安装文档
  2. macOS用户参考安装文档
  3. 依赖安装成功后,按照USB连接或无线连接的步骤操作即可

Gnirehtet反向网络共享

Windows和Linux应用已内置Gnirehtet功能,可实现PC到安卓设备的网络共享。

设备连接成功后,通过设备->设备控制栏->Gnirehtet启用反向网络功能。

注意:macOS版本未内置Gnirehtet,需手动安装才能使用该功能安装指南

+

Skip to content

快速上手

安装说明

手动安装(通过发行包)

macOS用户可通过Homebrew安装

详见 homebrew-escrcpy

USB连接方式

注意:若手机弹出调试授权提示,请点击允许

  1. 在安卓设备上启用开发者模式USB调试功能
  2. 启动Escrcpy并将安卓设备通过USB连接电脑
  3. Escrcpy设备列表应已检测到您的设备,点击"开始镜像"
  4. 开始使用!

无线连接方式

扫码连接

  1. 先完成USB连接方式的步骤1-2
  2. 在开发者选项中启用并进入"无线调试"
  3. 点击"通过二维码配对设备"
  4. 开始使用!

IP地址连接

注意:若首次无线连接失败,可能需先进行无线配对,详见常见问题

注意:需在无线调试页面获取设备无线地址(通常为连接WiFi时分配的IP地址)和端口号(默认为5555)

  1. 先完成USB连接方式的步骤1-2
  2. 在Escrcpy中输入设备IP地址和端口号,点击"连接设备"
  3. 此时设备列表应显示您的手机,点击"开始镜像"
  4. 开始使用!

macOS与Linux平台

注意:这些平台未预装Scrcpy,需手动安装

Escrcpy@1.27.1+版本已初步集成scrcpy二进制文件,无需手动安装

  1. Linux用户参考安装文档
  2. macOS用户参考安装文档
  3. 依赖安装成功后,按照USB连接或无线连接的步骤操作即可

Gnirehtet反向网络共享

Windows和Linux应用已内置Gnirehtet功能,可实现PC到安卓设备的网络共享。

设备连接成功后,通过设备->设备控制栏->Gnirehtet启用反向网络功能。

注意:macOS版本未内置Gnirehtet,需手动安装才能使用该功能安装指南

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/guide/window-arrangement.html b/zhHans/guide/window-arrangement.html index 012074e7e..27e22d460 100644 --- a/zhHans/guide/window-arrangement.html +++ b/zhHans/guide/window-arrangement.html @@ -6,14 +6,14 @@ 窗口编排 | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
Skip to content

设备窗口编排功能详解

设备窗口编排是 Escrcpy 的高级功能之一,专为多设备管理和屏幕空间优化而设计。通过可视化的拖拽界面,您可以精确控制每个设备窗口的位置、大小和布局,实现高效的多设备协同操作。

功能概述

窗口编排功能提供了一个全屏的可视化编辑界面,让您能够:

  • 同时管理多个设备窗口的布局
  • 通过拖拽方式调整窗口位置和尺寸
  • 设置全局默认配置和设备特定配置
  • 实时预览窗口布局效果
  • 保存和加载自定义布局方案

核心组件

全局配置组件

全局配置组件用于设置所有设备的默认窗口参数,包括:

  • 默认窗口宽度和高度
  • 默认窗口位置坐标
  • 其他通用窗口属性

设备窗口组件

每个连接的设备都可以添加为独立的窗口组件,支持:

  • 独立的位置和尺寸设置
  • 设备特定的窗口配置
  • 继承或覆盖全局配置

详细操作指南

启动窗口编排

  1. 通过主界面启动
    • 在主界面右上角找到"窗口编排"按钮
    • 点击该按钮进入窗口编排界面
    • 系统将打开全屏的窗口编排界面

添加和管理组件

添加全局配置组件

  1. 点击"添加组件"下拉按钮
  2. 选择"全局配置"选项
  3. 全局配置组件将出现在编排区域
  4. 该组件用于设置所有设备的默认参数

注意:每个编排方案中只能有一个全局配置组件。

添加设备窗口组件

  1. 点击"添加组件"下拉按钮
  2. 从设备列表中选择要添加的设备
  3. 设备窗口组件将添加到编排区域
  4. 每个设备只能添加一次

设备显示规则

  • 只显示当前已连接的设备
  • 已添加的设备不会在下拉列表中重复显示
  • 设备名称优先显示自定义名称,其次为设备型号

窗口布局调整

移动窗口位置

  1. 选择目标窗口:点击要移动的窗口组件
  2. 拖拽移动:按住鼠标左键拖拽窗口到目标位置
  3. 实时反馈:拖拽过程中可以看到实时的位置变化
  4. 释放定位:松开鼠标完成位置调整

调整窗口尺寸

  1. 定位调整点:将鼠标移动到窗口的边角位置
  2. 拖拽调整:按住鼠标左键拖拽来改变窗口大小
  3. 比例约束:系统会自动维持合理的窗口比例
  4. 最小尺寸限制:窗口不能小于预设的最小尺寸

尺寸限制说明

  • 最小宽度:容器宽度的 1/6
  • 最小高度:容器高度的 1/4
  • 边界约束:窗口不能拖拽到编排区域外部
  • 重叠处理:允许窗口重叠,但建议避免完全遮挡

布局管理操作

重置布局

  1. 点击控制面板中的"重置布局"按钮
  2. 系统将清除当前所有组件
  3. 重新加载保存的布局配置
  4. 如果没有保存的配置,将显示空白编排区域

清除全部组件

  1. 点击"清除全部"按钮
  2. 系统将弹出确认对话框
  3. 确认后将移除所有窗口组件
  4. 编排区域将变为空白状态

删除单个组件

  1. 将鼠标悬停在目标窗口组件上
  2. 点击窗口右上角的删除按钮(×)
  3. 该组件将立即从编排区域移除
  4. 对应的设备将重新出现在可添加列表中

配置保存和应用

保存布局配置

  1. 完成布局调整:确保所有窗口组件都已调整到满意的位置和尺寸
  2. 点击保存按钮:点击界面底部的"保存布局"按钮
  3. 配置写入:系统将当前布局信息写入配置文件
  4. 成功反馈:显示保存成功的消息提示

配置存储机制

  • 全局配置:存储在 scrcpy.global 配置节点
  • 设备配置:存储在 scrcpy.[设备ID] 配置节点
  • 参数格式
    • --window-width:窗口宽度
    • --window-height:窗口高度
    • --window-x:窗口X坐标
    • --window-y:窗口Y坐标

配置应用时机

  • 启动镜像时:设备开始镜像时自动应用对应的窗口配置
  • 配置继承:设备特定配置优先,未设置的参数继承全局配置
  • 动态更新:保存配置后立即生效,无需重启应用

故障排除

常见问题

问题1:设备不显示在添加列表中

  • 确认设备已正确连接
  • 检查设备是否已经添加到编排中
  • 尝试刷新设备列表

问题2:窗口拖拽不响应

  • 确认鼠标点击在窗口的可拖拽区域
  • 检查是否有其他程序占用鼠标事件
  • 尝试重新打开编排界面

问题3:保存的布局没有生效

  • 确认点击了"保存布局"按钮
  • 检查配置文件是否有写入权限
  • 尝试重启应用后再次测试

问题4:窗口尺寸异常

  • 检查是否超出了最小尺寸限制
  • 确认显示器分辨率设置正确
  • 尝试重置布局后重新配置

通过合理使用窗口编排功能,您可以显著提高多设备管理的效率,创建适合自己工作流程的个性化操作环境。

+

Skip to content

设备窗口编排功能详解

设备窗口编排是 Escrcpy 的高级功能之一,专为多设备管理和屏幕空间优化而设计。通过可视化的拖拽界面,您可以精确控制每个设备窗口的位置、大小和布局,实现高效的多设备协同操作。

功能概述

窗口编排功能提供了一个全屏的可视化编辑界面,让您能够:

  • 同时管理多个设备窗口的布局
  • 通过拖拽方式调整窗口位置和尺寸
  • 设置全局默认配置和设备特定配置
  • 实时预览窗口布局效果
  • 保存和加载自定义布局方案

核心组件

全局配置组件

全局配置组件用于设置所有设备的默认窗口参数,包括:

  • 默认窗口宽度和高度
  • 默认窗口位置坐标
  • 其他通用窗口属性

设备窗口组件

每个连接的设备都可以添加为独立的窗口组件,支持:

  • 独立的位置和尺寸设置
  • 设备特定的窗口配置
  • 继承或覆盖全局配置

详细操作指南

启动窗口编排

  1. 通过主界面启动
    • 在主界面右上角找到"窗口编排"按钮
    • 点击该按钮进入窗口编排界面
    • 系统将打开全屏的窗口编排界面

添加和管理组件

添加全局配置组件

  1. 点击"添加组件"下拉按钮
  2. 选择"全局配置"选项
  3. 全局配置组件将出现在编排区域
  4. 该组件用于设置所有设备的默认参数

注意:每个编排方案中只能有一个全局配置组件。

添加设备窗口组件

  1. 点击"添加组件"下拉按钮
  2. 从设备列表中选择要添加的设备
  3. 设备窗口组件将添加到编排区域
  4. 每个设备只能添加一次

设备显示规则

  • 只显示当前已连接的设备
  • 已添加的设备不会在下拉列表中重复显示
  • 设备名称优先显示自定义名称,其次为设备型号

窗口布局调整

移动窗口位置

  1. 选择目标窗口:点击要移动的窗口组件
  2. 拖拽移动:按住鼠标左键拖拽窗口到目标位置
  3. 实时反馈:拖拽过程中可以看到实时的位置变化
  4. 释放定位:松开鼠标完成位置调整

调整窗口尺寸

  1. 定位调整点:将鼠标移动到窗口的边角位置
  2. 拖拽调整:按住鼠标左键拖拽来改变窗口大小
  3. 比例约束:系统会自动维持合理的窗口比例
  4. 最小尺寸限制:窗口不能小于预设的最小尺寸

尺寸限制说明

  • 最小宽度:容器宽度的 1/6
  • 最小高度:容器高度的 1/4
  • 边界约束:窗口不能拖拽到编排区域外部
  • 重叠处理:允许窗口重叠,但建议避免完全遮挡

布局管理操作

重置布局

  1. 点击控制面板中的"重置布局"按钮
  2. 系统将清除当前所有组件
  3. 重新加载保存的布局配置
  4. 如果没有保存的配置,将显示空白编排区域

清除全部组件

  1. 点击"清除全部"按钮
  2. 系统将弹出确认对话框
  3. 确认后将移除所有窗口组件
  4. 编排区域将变为空白状态

删除单个组件

  1. 将鼠标悬停在目标窗口组件上
  2. 点击窗口右上角的删除按钮(×)
  3. 该组件将立即从编排区域移除
  4. 对应的设备将重新出现在可添加列表中

配置保存和应用

保存布局配置

  1. 完成布局调整:确保所有窗口组件都已调整到满意的位置和尺寸
  2. 点击保存按钮:点击界面底部的"保存布局"按钮
  3. 配置写入:系统将当前布局信息写入配置文件
  4. 成功反馈:显示保存成功的消息提示

配置存储机制

  • 全局配置:存储在 scrcpy.global 配置节点
  • 设备配置:存储在 scrcpy.[设备ID] 配置节点
  • 参数格式
    • --window-width:窗口宽度
    • --window-height:窗口高度
    • --window-x:窗口X坐标
    • --window-y:窗口Y坐标

配置应用时机

  • 启动镜像时:设备开始镜像时自动应用对应的窗口配置
  • 配置继承:设备特定配置优先,未设置的参数继承全局配置
  • 动态更新:保存配置后立即生效,无需重启应用

故障排除

常见问题

问题1:设备不显示在添加列表中

  • 确认设备已正确连接
  • 检查设备是否已经添加到编排中
  • 尝试刷新设备列表

问题2:窗口拖拽不响应

  • 确认鼠标点击在窗口的可拖拽区域
  • 检查是否有其他程序占用鼠标事件
  • 尝试重新打开编排界面

问题3:保存的布局没有生效

  • 确认点击了"保存布局"按钮
  • 检查配置文件是否有写入权限
  • 尝试重启应用后再次测试

问题4:窗口尺寸异常

  • 检查是否超出了最小尺寸限制
  • 确认显示器分辨率设置正确
  • 尝试重置布局后重新配置

通过合理使用窗口编排功能,您可以显著提高多设备管理的效率,创建适合自己工作流程的个性化操作环境。

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/help/escrcpy.html b/zhHans/help/escrcpy.html index 5f772124f..e8ef360c7 100644 --- a/zhHans/help/escrcpy.html +++ b/zhHans/help/escrcpy.html @@ -6,14 +6,14 @@ Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
Skip to content

Escrcpy

电脑连接后无法识别设备

  1. 请重新插拔设备,并确保设备已授权USB调试权限。
  2. 若仍无法识别,可能是电脑缺少必要驱动。请使用驱动精灵等第三方工具安装驱动后重试。

无法输入中文

在Scrcpy@2.4+及以上版本中,解决方案如下:

  1. Escrcpy设置:进入偏好设置输入控制键盘模式,选择uhid模式。
  2. 设备输入法准备:安装支持物理键盘的输入法(推荐微信输入法)并完成设置。
  3. 启动镜像:点击Escrcpy中的开始镜像。验证:设备的设置系统语言与输入中应显示物理键盘屏幕键盘选项。
  4. 设备输入设置:在屏幕键盘设置中启用微信输入法。在物理键盘设置中配置键盘布局与电脑键盘一致(仅需设置一次)。
  5. 电脑输入准备:将输入模式设置为英文(重要)。
  6. 切换输入语言:使用Ctrl + Shift切换中英文。
  7. 开始使用。

下载微信输入法

无线连接提示:目标计算机积极拒绝访问

首次无线连接可能需要配对。或插入USB确保连接建立并授权成功后再使用无线。

数据线连接后点击无线模式无响应

请再次点击,或点击刷新设备。通常不会超过两次点击。若仍无效,请提交设备型号和安卓版本至Issues

为何设备交互控制栏未设计为自动贴边的悬浮菜单?

需注意,原则上Escrcpy只是基于Scrcpy的GUI版本,尽管扩展了部分功能,但这些扩展不影响Scrcpy核心。实现该特性需修改底层Scrcpy代码,这会导致Escrcpy更难同步Scrcpy更新,弊大于利。

因此,经慎重考虑,我们决定采用现有方案,并期待Scrcpy未来原生支持交互控制栏。

部分设备连接后可见画面但无法操作

注:小米手机尤其需注意,除开启USB调试外,还需开启USB调试(安全设置),即允许通过USB调试修改权限或模拟点击。

详细说明请参考鼠标键盘无法工作的原因

下载时提示杀毒检测导致无法正常下载

经反馈,因缺少证书签名,Windows Defender偶会拦截软件包下载。可尝试以下方案:

  1. 打开Windows安全中心
  2. 选择病毒和威胁防护
  3. 病毒和威胁防护设置中点击管理设置
  4. 找到实时保护,若权限允许可尝试点击关闭。若无法关闭实时保护,请跳过此步。
  5. 向下滚动页面,找到排除项,点击添加或删除排除项
  6. 将下载软件包的文件夹路径添加为排除项,即加入排除列表

启动镜像/录制时获取设备列表失败或报错

通常由AdbScrcpy路径错误引起,可尝试以下方案:

  1. 在菜单中选择偏好设置,点击全局模式右上角的重置配置按钮。
  2. 进入设备列表页面重试启用镜像。
  3. 确保已下载安装最新版Escrcpy
  4. Ctrl + Shift + I打开开发者工具检查报错信息。
  5. 若有报错,截图并提交至反馈Issues页面。

macOS窗口最小化至系统托盘图标未找到

通常因系统托盘图标过多溢出隐藏了Escrcpy图标。可尝试使用以下工具:

macOS安装成功后打开提示文件已损坏

通常因软件包未签名导致。可尝试以下方案:

  1. 打开终端执行sudo spctl --master-disable允许任何来源软件。
  2. 打开终端执行sudo xattr -r -d com.apple.quarantine /Applications/Escrcpy.app尝试修复损坏提示。

无法定位程序输入点DiscardvirtualMemory于动态链接库Kernel32.dll上

仅支持Windows 10及以上版本。

音频捕获异常导致镜像失败

通常因电脑缺少音频输出或安卓版本过低(Android 11+)。

请尝试通过偏好设置禁用音频转发功能解决此问题。

微软商店版镜像启动报错

因安装目录文件缺少执行权限引起。

需自定义scrcpyadb的文件路径(确保有执行权限)。若使用反向网络共享,需同样配置gnirehtet

无法执行"adb start-server"

可能是安装路径包含中文或特殊字符。请尝试更改安装路径。

Linux系统安装后无法打开

部分流行发行版(如Ubuntu 24.04)对AppImage应用新增了沙盒使用限制。临时解决方案如下:

shell
sudo chmod 4755 /opt/Escrcpy/chrome-sandbox

调整投屏窗口大小后出现黑边

当调整投屏窗口尺寸后出现黑边时,只需双击黑边区域即可让其自动隐藏。

+

Skip to content

Escrcpy

电脑连接后无法识别设备

  1. 请重新插拔设备,并确保设备已授权USB调试权限。
  2. 若仍无法识别,可能是电脑缺少必要驱动。请使用驱动精灵等第三方工具安装驱动后重试。

无法输入中文

在Scrcpy@2.4+及以上版本中,解决方案如下:

  1. Escrcpy设置:进入偏好设置输入控制键盘模式,选择uhid模式。
  2. 设备输入法准备:安装支持物理键盘的输入法(推荐微信输入法)并完成设置。
  3. 启动镜像:点击Escrcpy中的开始镜像。验证:设备的设置系统语言与输入中应显示物理键盘屏幕键盘选项。
  4. 设备输入设置:在屏幕键盘设置中启用微信输入法。在物理键盘设置中配置键盘布局与电脑键盘一致(仅需设置一次)。
  5. 电脑输入准备:将输入模式设置为英文(重要)。
  6. 切换输入语言:使用Ctrl + Shift切换中英文。
  7. 开始使用。

下载微信输入法

无线连接提示:目标计算机积极拒绝访问

首次无线连接可能需要配对。或插入USB确保连接建立并授权成功后再使用无线。

数据线连接后点击无线模式无响应

请再次点击,或点击刷新设备。通常不会超过两次点击。若仍无效,请提交设备型号和安卓版本至Issues

为何设备交互控制栏未设计为自动贴边的悬浮菜单?

需注意,原则上Escrcpy只是基于Scrcpy的GUI版本,尽管扩展了部分功能,但这些扩展不影响Scrcpy核心。实现该特性需修改底层Scrcpy代码,这会导致Escrcpy更难同步Scrcpy更新,弊大于利。

因此,经慎重考虑,我们决定采用现有方案,并期待Scrcpy未来原生支持交互控制栏。

部分设备连接后可见画面但无法操作

注:小米手机尤其需注意,除开启USB调试外,还需开启USB调试(安全设置),即允许通过USB调试修改权限或模拟点击。

详细说明请参考鼠标键盘无法工作的原因

下载时提示杀毒检测导致无法正常下载

经反馈,因缺少证书签名,Windows Defender偶会拦截软件包下载。可尝试以下方案:

  1. 打开Windows安全中心
  2. 选择病毒和威胁防护
  3. 病毒和威胁防护设置中点击管理设置
  4. 找到实时保护,若权限允许可尝试点击关闭。若无法关闭实时保护,请跳过此步。
  5. 向下滚动页面,找到排除项,点击添加或删除排除项
  6. 将下载软件包的文件夹路径添加为排除项,即加入排除列表

启动镜像/录制时获取设备列表失败或报错

通常由AdbScrcpy路径错误引起,可尝试以下方案:

  1. 在菜单中选择偏好设置,点击全局模式右上角的重置配置按钮。
  2. 进入设备列表页面重试启用镜像。
  3. 确保已下载安装最新版Escrcpy
  4. Ctrl + Shift + I打开开发者工具检查报错信息。
  5. 若有报错,截图并提交至反馈Issues页面。

macOS窗口最小化至系统托盘图标未找到

通常因系统托盘图标过多溢出隐藏了Escrcpy图标。可尝试使用以下工具:

macOS安装成功后打开提示文件已损坏

通常因软件包未签名导致。可尝试以下方案:

  1. 打开终端执行sudo spctl --master-disable允许任何来源软件。
  2. 打开终端执行sudo xattr -r -d com.apple.quarantine /Applications/Escrcpy.app尝试修复损坏提示。

无法定位程序输入点DiscardvirtualMemory于动态链接库Kernel32.dll上

仅支持Windows 10及以上版本。

音频捕获异常导致镜像失败

通常因电脑缺少音频输出或安卓版本过低(Android 11+)。

请尝试通过偏好设置禁用音频转发功能解决此问题。

微软商店版镜像启动报错

因安装目录文件缺少执行权限引起。

需自定义scrcpyadb的文件路径(确保有执行权限)。若使用反向网络共享,需同样配置gnirehtet

无法执行"adb start-server"

可能是安装路径包含中文或特殊字符。请尝试更改安装路径。

Linux系统安装后无法打开

部分流行发行版(如Ubuntu 24.04)对AppImage应用新增了沙盒使用限制。临时解决方案如下:

shell
sudo chmod 4755 /opt/Escrcpy/chrome-sandbox

调整投屏窗口大小后出现黑边

当调整投屏窗口尺寸后出现黑边时,只需双击黑边区域即可让其自动隐藏。

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/help/index.html b/zhHans/help/index.html index b753420b3..6c9d73e96 100644 --- a/zhHans/help/index.html +++ b/zhHans/help/index.html @@ -6,14 +6,14 @@ 帮助 | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
Skip to content

帮助中心

本节为Escrcpy和Scrcpy用户提供了解决常见问题的解决方案。

+

- +

+ \ No newline at end of file diff --git a/zhHans/help/scrcpy.html b/zhHans/help/scrcpy.html index b7379bca5..886f72852 100644 --- a/zhHans/help/scrcpy.html +++ b/zhHans/help/scrcpy.html @@ -6,14 +6,14 @@ Scrcpy | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
Skip to content

Scrcpy

以下是常见问题及其状态报告。 遇到任何错误时,请首先升级至最新版本。

adb 与 USB 问题

scrcpy 通过执行 adb 命令初始化设备连接。若 adb 失败,则 scrcpy 无法工作。 这通常并非 scrcpy 的 bug,而是环境配置问题。

adb 未找到

需确保 adb 位于 PATH 环境变量中。 Windows 版本已默认包含 adb.exe 且当前目录在 PATH 中,因此开箱即用。

设备未检测到

ERROR: 未找到任何 ADB 设备
+    
Skip to content

Scrcpy

以下是常见问题及其状态报告。 遇到任何错误时,请首先升级至最新版本。

adb 与 USB 问题

scrcpy 通过执行 adb 命令初始化设备连接。若 adb 失败,则 scrcpy 无法工作。 这通常并非 scrcpy 的 bug,而是环境配置问题。

adb 未找到

需确保 adb 位于 PATH 环境变量中。 Windows 版本已默认包含 adb.exe 且当前目录在 PATH 中,因此开箱即用。

设备未检测到

ERROR: 未找到任何 ADB 设备
 

请确认已正确启用 adb 调试。 通过以下命令检查设备是否被识别:

adb devices

若设备未列出,可能需要安装驱动(Windows 系统)。Google 设备需单独安装 USB 驱动

设备未授权

ERROR: 设备未授权:
 ERROR:     -->   (usb)  0123456789abcdef          unauthorized
 ERROR: 设备端应弹出授权请求窗口
@@ -44,15 +44,15 @@ WARN: 'adb reverse' 失败,回退至 'adb forward'
 

(或仅检测到无关 USB 设备),可能是驱动问题。 请阅读 #3654,特别是 此评论后续说明

控制问题

鼠标键盘失效

部分设备需启用以下选项: 开发者选项 → USB 调试(安全设置)允许通过 USB 调试授予权限和模拟输入 启用后需重启设备。详见 #70

特殊字符输入异常

默认文本注入仅支持 ASCII 字符。 可通过技巧输入部分 带重音字符,但功能有限(参见 #37)。 解决方案:切换为 物理键盘模拟模式

客户端问题

Wayland 兼容性问题

Linux 默认使用 x11,可通过环境变量切换 视频驱动

bash
export SDL_VIDEODRIVER=wayland
 scrcpy

部分发行版(如 Fedora)需手动安装 libdecor 包。 详见 #2554#2559

KWin 合成器崩溃

Plasma 桌面环境下运行 scrcpy 时会禁用合成器。 临时解决方案:关闭 "阻止合成" 选项。

崩溃问题

MediaCodec 异常

若出现以下异常:

ERROR: 线程 Thread[main,5,main] 抛出异常
 java.lang.IllegalStateException
-        at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)

请尝试更换 编码器

+ at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)

请尝试更换 编码器

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/index.html b/zhHans/index.html index d73236019..15e395d49 100644 --- a/zhHans/index.html +++ b/zhHans/index.html @@ -6,14 +6,14 @@ Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
Skip to content

Escrcpy使用图形化的 scrcpy 显示和控制你的安卓设备

Powered by electron.

Escrcpy

+

Skip to content

Escrcpy使用图形化的 scrcpy 显示和控制你的安卓设备

Powered by electron.

Escrcpy

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/gnirehtet/api.html b/zhHans/reference/gnirehtet/api.html index 54bd00572..1306d7528 100644 --- a/zhHans/reference/gnirehtet/api.html +++ b/zhHans/reference/gnirehtet/api.html @@ -6,14 +6,14 @@ API(接口文档) | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
Skip to content

Gnirehtet API

gnirehtet 是一款用于在安卓设备上实现反向网络共享的工具,允许设备通过USB共享电脑的网络连接。以下是各命令的详细用法及示例。

gnirehtet install [serial]

描述:在指定的安卓设备上安装客户端并退出。若连接了多个设备,必须提供 serial 参数。

示例用法

bash
gnirehtet install

若连接了多个设备,指定设备序列号:

bash
gnirehtet install 1234567890ABCDEF

gnirehtet uninstall [serial]

描述:从指定的安卓设备上卸载客户端并退出。若连接了多个设备,必须提供 serial 参数。

示例用法

bash
gnirehtet uninstall

若连接了多个设备,指定设备序列号:

bash
gnirehtet uninstall 1234567890ABCDEF

gnirehtet reinstall [serial]

描述:先卸载再安装客户端。

示例用法

bash
gnirehtet reinstall

若连接了多个设备,指定设备序列号:

bash
gnirehtet reinstall 1234567890ABCDEF

gnirehtet run [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

描述:为单一设备启用反向网络共享:

  • 必要时安装客户端。
  • 启动客户端。
  • 启动中继服务器。
  • 按下 Ctrl+C 时,停止中继服务器和客户端。

示例用法

bash
gnirehtet run

指定DNS服务器:

bash
gnirehtet run -d 8.8.8.8,8.8.4.4

指定端口:

bash
gnirehtet run -p 8080

指定路由:

bash
gnirehtet run -r 192.168.1.0/24

gnirehtet autorun [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

描述:为所有设备启用反向网络共享:

  • 监控设备并自动启动客户端。
  • 启动中继服务器。

示例用法

bash
gnirehtet autorun

指定DNS服务器:

bash
gnirehtet autorun -d 8.8.8.8,8.8.4.4

指定端口:

bash
gnirehtet autorun -p 8080

指定路由:

bash
gnirehtet autorun -r 192.168.1.0/24

gnirehtet start [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

描述:在安卓设备上启动客户端并退出。

  • 若指定 -d,设备将使用指定的DNS服务器。
  • 若指定 -r,仅反向共享指定的路由。
  • 若指定 -p,中继服务器将监听指定端口。

示例用法

bash
gnirehtet start

指定设备序列号:

bash
gnirehtet start 1234567890ABCDEF

指定DNS服务器:

bash
gnirehtet start -d 8.8.8.8,8.8.4.4

指定端口:

bash
gnirehtet start -p 8080

指定路由:

bash
gnirehtet start -r 192.168.1.0/24

gnirehtet autostart [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

描述:监听设备连接并为每个检测到的设备启动客户端。

  • 参数与 start 命令相同(无需指定序列号,将自动从检测到的设备获取)。

示例用法

bash
gnirehtet autostart

指定DNS服务器:

bash
gnirehtet autostart -d 8.8.8.8,8.8.4.4

指定端口:

bash
gnirehtet autostart -p 8080

指定路由:

bash
gnirehtet autostart -r 192.168.1.0/24

gnirehtet stop [serial]

描述:停止指定安卓设备上的客户端并退出。

示例用法

bash
gnirehtet stop

指定设备序列号:

bash
gnirehtet stop 1234567890ABCDEF

gnirehtet restart [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

描述:停止当前客户端并重新启动。

示例用法

bash
gnirehtet restart

指定设备序列号:

bash
gnirehtet restart 1234567890ABCDEF

指定DNS服务器:

bash
gnirehtet restart -d 8.8.8.8,8.8.4.4

指定端口:

bash
gnirehtet restart -p 8080

指定路由:

bash
gnirehtet restart -r 192.168.1.0/24

gnirehtet tunnel [serial] [-p PORT]

描述:设置 adb reverse 隧道。若设备在 gnirehtet 运行期间断开并重新连接,重置隧道可恢复连接。

示例用法

bash
gnirehtet tunnel

指定设备序列号:

bash
gnirehtet tunnel 1234567890ABCDEF

指定端口:

bash
gnirehtet tunnel -p 8080

gnirehtet relay [-p PORT]

描述:在当前终端启动中继服务器。

示例用法

bash
gnirehtet relay

指定端口:

bash
gnirehtet relay -p 8080

+

Skip to content

Gnirehtet API

gnirehtet 是一款用于在安卓设备上实现反向网络共享的工具,允许设备通过USB共享电脑的网络连接。以下是各命令的详细用法及示例。

gnirehtet install [serial]

描述:在指定的安卓设备上安装客户端并退出。若连接了多个设备,必须提供 serial 参数。

示例用法

bash
gnirehtet install

若连接了多个设备,指定设备序列号:

bash
gnirehtet install 1234567890ABCDEF

gnirehtet uninstall [serial]

描述:从指定的安卓设备上卸载客户端并退出。若连接了多个设备,必须提供 serial 参数。

示例用法

bash
gnirehtet uninstall

若连接了多个设备,指定设备序列号:

bash
gnirehtet uninstall 1234567890ABCDEF

gnirehtet reinstall [serial]

描述:先卸载再安装客户端。

示例用法

bash
gnirehtet reinstall

若连接了多个设备,指定设备序列号:

bash
gnirehtet reinstall 1234567890ABCDEF

gnirehtet run [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

描述:为单一设备启用反向网络共享:

  • 必要时安装客户端。
  • 启动客户端。
  • 启动中继服务器。
  • 按下 Ctrl+C 时,停止中继服务器和客户端。

示例用法

bash
gnirehtet run

指定DNS服务器:

bash
gnirehtet run -d 8.8.8.8,8.8.4.4

指定端口:

bash
gnirehtet run -p 8080

指定路由:

bash
gnirehtet run -r 192.168.1.0/24

gnirehtet autorun [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

描述:为所有设备启用反向网络共享:

  • 监控设备并自动启动客户端。
  • 启动中继服务器。

示例用法

bash
gnirehtet autorun

指定DNS服务器:

bash
gnirehtet autorun -d 8.8.8.8,8.8.4.4

指定端口:

bash
gnirehtet autorun -p 8080

指定路由:

bash
gnirehtet autorun -r 192.168.1.0/24

gnirehtet start [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

描述:在安卓设备上启动客户端并退出。

  • 若指定 -d,设备将使用指定的DNS服务器。
  • 若指定 -r,仅反向共享指定的路由。
  • 若指定 -p,中继服务器将监听指定端口。

示例用法

bash
gnirehtet start

指定设备序列号:

bash
gnirehtet start 1234567890ABCDEF

指定DNS服务器:

bash
gnirehtet start -d 8.8.8.8,8.8.4.4

指定端口:

bash
gnirehtet start -p 8080

指定路由:

bash
gnirehtet start -r 192.168.1.0/24

gnirehtet autostart [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

描述:监听设备连接并为每个检测到的设备启动客户端。

  • 参数与 start 命令相同(无需指定序列号,将自动从检测到的设备获取)。

示例用法

bash
gnirehtet autostart

指定DNS服务器:

bash
gnirehtet autostart -d 8.8.8.8,8.8.4.4

指定端口:

bash
gnirehtet autostart -p 8080

指定路由:

bash
gnirehtet autostart -r 192.168.1.0/24

gnirehtet stop [serial]

描述:停止指定安卓设备上的客户端并退出。

示例用法

bash
gnirehtet stop

指定设备序列号:

bash
gnirehtet stop 1234567890ABCDEF

gnirehtet restart [serial] [-d DNS[,DNS2,...]] [-p PORT] [-r ROUTE[,ROUTE2,...]]

描述:停止当前客户端并重新启动。

示例用法

bash
gnirehtet restart

指定设备序列号:

bash
gnirehtet restart 1234567890ABCDEF

指定DNS服务器:

bash
gnirehtet restart -d 8.8.8.8,8.8.4.4

指定端口:

bash
gnirehtet restart -p 8080

指定路由:

bash
gnirehtet restart -r 192.168.1.0/24

gnirehtet tunnel [serial] [-p PORT]

描述:设置 adb reverse 隧道。若设备在 gnirehtet 运行期间断开并重新连接,重置隧道可恢复连接。

示例用法

bash
gnirehtet tunnel

指定设备序列号:

bash
gnirehtet tunnel 1234567890ABCDEF

指定端口:

bash
gnirehtet tunnel -p 8080

gnirehtet relay [-p PORT]

描述:在当前终端启动中继服务器。

示例用法

bash
gnirehtet relay

指定端口:

bash
gnirehtet relay -p 8080

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/gnirehtet/index.html b/zhHans/reference/gnirehtet/index.html index b1a357adc..80efd4329 100644 --- a/zhHans/reference/gnirehtet/index.html +++ b/zhHans/reference/gnirehtet/index.html @@ -6,14 +6,14 @@ Gnirehtet | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
Skip to content

IMPORTANT

Escrcpy基于以下开源项目构建。相关内容按原样提供,仅供用户参考,并将定期更新。

Gnirehtet (v2.5.1)

该项目通过adb为Android设备提供反向网络共享功能:允许设备使用所连接计算机的网络连接。它不需要任何root权限(设备或计算机均无需)。支持GNU/LinuxWindowsMac OS

目前,它通过IPv4转发TCPUDP流量,但不支持IPv6(未来可能支持?)。

该项目已不再积极维护,仅修复重大阻塞问题(如构建问题)。但功能仍可正常使用。

版本

Gnirehtet提供两种实现:

  • Java版本;
  • Rust版本。

如何选择?

推荐使用Rust版本。原生二进制文件占用更少的CPU和内存资源,且无需安装Java运行时环境。

Gnirehtet的中继服务器最初仅以Java实现,其优势在于支持所有安装了Java 8运行时的平台。目前仍保留该版本,以便在Rust版本出现问题时作为备选方案。

要求

Android应用至少需要API 21(Android 5.0)。

仅针对Java版本,计算机需安装Java 8(JRE)。在基于Debian的系统中,请安装openjdk-8-jre包。

adb

需要较新版本的adb(支持adb reverse命令,1.0.36版本已验证可用)。

可通过Android SDK平台工具获取。

在基于Debian的系统中,也可安装android-tools-adb包。

在Windows上,若仅为此应用需要adb,可直接下载平台工具,并将以下文件解压至gnirehtet目录:

  • adb.exe
  • AdbWinApi.dll
  • AdbWinUsbApi.dll

确保已在设备上启用adb调试

获取应用

Homebrew

若使用Homebrew,安装过程非常简单。安装Rust版本:

brew install gnirehtet

下载

最新发布中下载所需版本。

Rust

下载后解压文件。

Linux和MacOS压缩包包含:

  • gnirehtet.apk
  • gnirehtet

Windows压缩包包含:

  • gnirehtet.apk
  • gnirehtet.exe
  • gnirehtet-run.cmd

Java

解压后包含:

  • gnirehtet.apk
  • gnirehtet.jar
  • gnirehtet
  • gnirehtet.cmd
  • gnirehtet-run.cmd

运行(简单方式)

注意:在Windows上,以下命令中的./gnirehtet需替换为gnirehtet

该应用无用户界面,需通过计算机控制。

若需为单一设备启用反向网络共享,直接执行:

shell
./gnirehtet run

反向网络共享将持续生效,直至按下Ctrl+C终止。

在Windows上,为方便起见,可直接双击gnirehtet-run.cmd(其功能等同于gnirehtet run,无需打开终端)。

首次启动时会弹出权限请求窗口:

request

Gnirehtet激活时,状态栏会显示“钥匙”图标:

key

若需为所有已连接设备(包括后续连接的设备)启用反向网络共享,可执行:

shell
./gnirehtet autorun

运行(分步操作)

可分别执行各步骤(适用于需同时为多台设备启用反向网络共享的场景)。

启动中继服务器并保持运行:

shell
./gnirehtet relay

在Android设备上安装apk

shell
./gnirehtet install [serial]

在另一终端中,为每个客户端执行:

shell
./gnirehtet start [serial]

停止客户端:

shell
./gnirehtet stop [serial]

重置隧道(当设备在Gnirehtet激活时断开并重新连接后,可用于恢复连接):

shell
./gnirehtet tunnel [serial]

仅当adb devices输出多个设备时,才需指定serial参数。

高级选项可通过不带参数的./gnirehtet命令查看详情。

手动运行

gnirehtet程序提供了简单的命令行接口,实际执行的是底层命令。用户也可手动调用这些命令。

启动中继服务器:

shell
./gnirehtet relay

安装apk:

shell
adb install -r gnirehtet.apk

启动客户端:

shell
adb reverse localabstract:gnirehtet tcp:31416
+    
Skip to content

IMPORTANT

Escrcpy基于以下开源项目构建。相关内容按原样提供,仅供用户参考,并将定期更新。

Gnirehtet (v2.5.1)

该项目通过adb为Android设备提供反向网络共享功能:允许设备使用所连接计算机的网络连接。它不需要任何root权限(设备或计算机均无需)。支持GNU/LinuxWindowsMac OS

目前,它通过IPv4转发TCPUDP流量,但不支持IPv6(未来可能支持?)。

该项目已不再积极维护,仅修复重大阻塞问题(如构建问题)。但功能仍可正常使用。

版本

Gnirehtet提供两种实现:

  • Java版本;
  • Rust版本。

如何选择?

推荐使用Rust版本。原生二进制文件占用更少的CPU和内存资源,且无需安装Java运行时环境。

Gnirehtet的中继服务器最初仅以Java实现,其优势在于支持所有安装了Java 8运行时的平台。目前仍保留该版本,以便在Rust版本出现问题时作为备选方案。

要求

Android应用至少需要API 21(Android 5.0)。

仅针对Java版本,计算机需安装Java 8(JRE)。在基于Debian的系统中,请安装openjdk-8-jre包。

adb

需要较新版本的adb(支持adb reverse命令,1.0.36版本已验证可用)。

可通过Android SDK平台工具获取。

在基于Debian的系统中,也可安装android-tools-adb包。

在Windows上,若仅为此应用需要adb,可直接下载平台工具,并将以下文件解压至gnirehtet目录:

  • adb.exe
  • AdbWinApi.dll
  • AdbWinUsbApi.dll

确保已在设备上启用adb调试

获取应用

Homebrew

若使用Homebrew,安装过程非常简单。安装Rust版本:

brew install gnirehtet

下载

最新发布中下载所需版本。

Rust

下载后解压文件。

Linux和MacOS压缩包包含:

  • gnirehtet.apk
  • gnirehtet

Windows压缩包包含:

  • gnirehtet.apk
  • gnirehtet.exe
  • gnirehtet-run.cmd

Java

解压后包含:

  • gnirehtet.apk
  • gnirehtet.jar
  • gnirehtet
  • gnirehtet.cmd
  • gnirehtet-run.cmd

运行(简单方式)

注意:在Windows上,以下命令中的./gnirehtet需替换为gnirehtet

该应用无用户界面,需通过计算机控制。

若需为单一设备启用反向网络共享,直接执行:

shell
./gnirehtet run

反向网络共享将持续生效,直至按下Ctrl+C终止。

在Windows上,为方便起见,可直接双击gnirehtet-run.cmd(其功能等同于gnirehtet run,无需打开终端)。

首次启动时会弹出权限请求窗口:

request

Gnirehtet激活时,状态栏会显示“钥匙”图标:

key

若需为所有已连接设备(包括后续连接的设备)启用反向网络共享,可执行:

shell
./gnirehtet autorun

运行(分步操作)

可分别执行各步骤(适用于需同时为多台设备启用反向网络共享的场景)。

启动中继服务器并保持运行:

shell
./gnirehtet relay

在Android设备上安装apk

shell
./gnirehtet install [serial]

在另一终端中,为每个客户端执行:

shell
./gnirehtet start [serial]

停止客户端:

shell
./gnirehtet stop [serial]

重置隧道(当设备在Gnirehtet激活时断开并重新连接后,可用于恢复连接):

shell
./gnirehtet tunnel [serial]

仅当adb devices输出多个设备时,才需指定serial参数。

高级选项可通过不带参数的./gnirehtet命令查看详情。

手动运行

gnirehtet程序提供了简单的命令行接口,实际执行的是底层命令。用户也可手动调用这些命令。

启动中继服务器:

shell
./gnirehtet relay

安装apk:

shell
adb install -r gnirehtet.apk

启动客户端:

shell
adb reverse localabstract:gnirehtet tcp:31416
 adb shell am start -a com.genymobile.gnirehtet.START \
     -n com.genymobile.gnirehtet/.GnirehtetActivity

停止客户端:

shell
adb shell am start -a com.genymobile.gnirehtet.STOP \
     -n com.genymobile.gnirehtet/.GnirehtetActivity

环境变量

ADB用于指定自定义的adb路径:

shell
ADB=/path/to/my/adb ./gnirehtet run

GNIREHTET_APK用于指定自定义的gnirehtet.apk路径:

shell
GNIREHTET_APK=/usr/share/gnirehtet/gnirehtet.apk ./gnirehtet run

为什么叫gnirehtet

rev <<< tethering
@@ -35,15 +35,15 @@
 
 除非适用法律要求或书面同意,按“原样”分发的软件
 无任何明示或暗示的担保或条件。
-详见许可证中特定语言规定的权限和限制。

相关文章

+详见许可证中特定语言规定的权限和限制。

相关文章

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/index.html b/zhHans/reference/index.html index 3c92620f7..d5441aec7 100644 --- a/zhHans/reference/index.html +++ b/zhHans/reference/index.html @@ -6,14 +6,14 @@ 参考手册 | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
Skip to content

参考手册

Escrcpy 建立在以下开源项目的基础上。提供相关内容以及用户参考,并将定期更新。

+

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/audio.html b/zhHans/reference/scrcpy/audio.html index 597a810a1..2bd688b37 100644 --- a/zhHans/reference/scrcpy/audio.html +++ b/zhHans/reference/scrcpy/audio.html @@ -6,14 +6,14 @@ Audio(音频) | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
Skip to content

音频

音频转发功能支持运行 Android 11 或更高版本的设备,并默认启用:

  • Android 12 或更新版本:开箱即用。
  • Android 11:需要确保在启动 scrcpy 时设备屏幕已解锁。此时会短暂弹出一个虚假窗口,让系统认为 shell 应用处于前台。若不满足此条件,音频捕获将失败。
  • Android 10 或更早版本:无法捕获音频,功能自动禁用。

如果音频捕获失败,镜像会继续仅传输视频(由于音频默认启用,若音频不可用,scrcpy 不会直接失败,除非设置了 --require-audio)。

禁用音频

要禁用音频功能:

scrcpy --no-audio

若仅禁用音频播放,请参阅禁用播放

仅音频模式

要仅播放音频,需禁用视频和控制功能:

bash
scrcpy --no-video --no-control

要在无窗口模式下播放音频:

bash
# --no-video 和 --no-control 会被 --no-window 隐含
+    
Skip to content

音频

音频转发功能支持运行 Android 11 或更高版本的设备,并默认启用:

  • Android 12 或更新版本:开箱即用。
  • Android 11:需要确保在启动 scrcpy 时设备屏幕已解锁。此时会短暂弹出一个虚假窗口,让系统认为 shell 应用处于前台。若不满足此条件,音频捕获将失败。
  • Android 10 或更早版本:无法捕获音频,功能自动禁用。

如果音频捕获失败,镜像会继续仅传输视频(由于音频默认启用,若音频不可用,scrcpy 不会直接失败,除非设置了 --require-audio)。

禁用音频

要禁用音频功能:

scrcpy --no-audio

若仅禁用音频播放,请参阅禁用播放

仅音频模式

要仅播放音频,需禁用视频和控制功能:

bash
scrcpy --no-video --no-control

要在无窗口模式下播放音频:

bash
# --no-video 和 --no-control 会被 --no-window 隐含
 scrcpy --no-window
 # 按 Ctrl+C 中断

无视频时,音频延迟通常不关键,因此可以增加缓冲以减少卡顿:

scrcpy --no-video --audio-buffer=200

音频源

默认情况下,转发的是设备音频输出。

也可以捕获设备麦克风输入:

scrcpy --audio-source=mic

例如,将设备用作录音机并直接在电脑上录制:

scrcpy --audio-source=mic --no-video --no-playback --record=file.opus

支持的音频源包括:

  • output(默认):转发全部音频输出,并禁用设备播放(映射到 REMOTE_SUBMIX)。
  • playback:捕获音频播放(Android 应用可选择退出,因此不一定能捕获全部输出)。
  • mic:捕获麦克风输入(映射到 MIC)。
  • mic-unprocessed:捕获未经处理的麦克风原始音频(映射到 UNPROCESSED)。
  • mic-camcorder:捕获为视频录制优化的麦克风音频,方向与摄像头一致(映射到 CAMCORDER)。
  • mic-voice-recognition:捕获为语音识别优化的麦克风音频(映射到 VOICE_RECOGNITION)。
  • mic-voice-communication:捕获为语音通信优化的麦克风音频(例如支持回声消除或自动增益控制)(映射到 VOICE_COMMUNICATION)。
  • voice-call:捕获语音通话(映射到 VOICE_CALL)。
  • voice-call-uplink:仅捕获语音通话上行链路(映射到 VOICE_UPLINK)。
  • voice-call-downlink:仅捕获语音通话下行链路(映射到 VOICE_DOWNLINK)。
  • voice-performance:捕获适用于实时表演(如卡拉OK)的音频,包括麦克风和设备播放(映射到 VOICE_PERFORMANCE)。

音频复制

另一种设备音频捕获方法(仅限 Android 13 及以上版本):

scrcpy --audio-source=playback

此音频源支持在镜像时保持设备音频播放,通过 --audio-dup 实现:

bash
scrcpy --audio-source=playback --audio-dup
 # 或简写为:
@@ -31,15 +31,15 @@
 scrcpy --audio-codec=raw

如果出现以下错误:

Failed to initialize audio/opus, error 0xfffffffe

说明设备不支持 Opus 编码器,可尝试 scrcpy --audio-codec=aac

高级用法中,可通过 --audio-codec-options 传递自定义参数给 MediaFormat,详见手册或 scrcpy --help

例如,调整 FLAC 压缩级别

bash
scrcpy --audio-codec=flac --audio-codec-options=flac-compression-level=8

编码器

设备上可能有多个编码器可用,可通过以下命令列出:

bash
scrcpy --list-encoders

选择特定编码器:

bash
scrcpy --audio-codec=opus --audio-encoder='c2.android.opus.encoder'

比特率

默认音频比特率为 128Kbps,可通过以下命令调整:

bash
scrcpy --audio-bit-rate=64K
 scrcpy --audio-bit-rate=64000  # 等效

此参数不适用于 RAW 音频编解码器(--audio-codec=raw)。

缓冲

音频缓冲不可避免。需在低延迟(避免卡顿)和足够缓冲(减少欠载)之间平衡。

默认缓冲大小为 50ms,可调整:

bash
scrcpy --audio-buffer=40   # 比默认值小
 scrcpy --audio-buffer=100  # 比默认值大

注意:此选项设置的是目标缓冲值,实际缓冲可能因欠载等原因无法达到目标值。

若不与设备交互(如观看视频),可增加视频和音频缓冲以平滑播放:

scrcpy --video-buffer=200 --audio-buffer=200

还可配置另一音频缓冲(音频输出缓冲),默认为 5ms。除非出现机器人声或卡顿,否则不建议修改:

bash
# 仅在绝对必要时使用
-scrcpy --audio-output-buffer=10

+scrcpy --audio-output-buffer=10

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/build.html b/zhHans/reference/scrcpy/build.html index 553210a93..dc672c0ea 100644 --- a/zhHans/reference/scrcpy/build.html +++ b/zhHans/reference/scrcpy/build.html @@ -6,14 +6,14 @@ Build(编译) | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
Skip to content

编译 scrcpy

以下是编译 scrcpy(客户端和服务器)的说明。

如果只需构建并安装最新版本,请按照 linux.md 中的简化流程操作。

分支

项目有两个主要分支:

  • master:包含最新发布版本。这是 GitHub 上的项目主页。
  • dev:当前开发分支。所有提交到 dev 的代码将包含在下一个版本中。

如需贡献代码,请基于最新的 dev 分支提交。

要求

需要 adb。可从 Android SDK 平台工具 获取,或通过系统包管理器安装(如 adb)。

在 Windows 上,下载 platform-tools 并将以下文件解压到 PATH 可访问的目录:

  • adb.exe
  • AdbWinApi.dll
  • AdbWinUsbApi.dll

scrcpy 的发布版本中也包含这些文件。

客户端需要 FFmpegLibSDL2。请按照说明安装。

系统特定步骤

Linux

通过包管理器安装所需依赖。

Debian/Ubuntu

bash
# 运行时依赖
+    
Skip to content

编译 scrcpy

以下是编译 scrcpy(客户端和服务器)的说明。

如果只需构建并安装最新版本,请按照 linux.md 中的简化流程操作。

分支

项目有两个主要分支:

  • master:包含最新发布版本。这是 GitHub 上的项目主页。
  • dev:当前开发分支。所有提交到 dev 的代码将包含在下一个版本中。

如需贡献代码,请基于最新的 dev 分支提交。

要求

需要 adb。可从 Android SDK 平台工具 获取,或通过系统包管理器安装(如 adb)。

在 Windows 上,下载 platform-tools 并将以下文件解压到 PATH 可访问的目录:

  • adb.exe
  • AdbWinApi.dll
  • AdbWinUsbApi.dll

scrcpy 的发布版本中也包含这些文件。

客户端需要 FFmpegLibSDL2。请按照说明安装。

系统特定步骤

Linux

通过包管理器安装所需依赖。

Debian/Ubuntu

bash
# 运行时依赖
 sudo apt install ffmpeg libsdl2-2.0-0 adb libusb-1.0-0
 
 # 客户端构建依赖
@@ -72,15 +72,15 @@
 set ANDROID_SDK_ROOT=%LOCALAPPDATA%\Android\sdk

然后构建:

bash
meson setup x --buildtype=release --strip -Db_lto=true
 ninja -Cx  # 不要以 root 用户运行

注意:ninja 必须 以非 root 用户运行(只有 ninja install 需要 root 权限)。

选项 2:使用预构建服务器

  • scrcpy-server-v3.2SHA-256: b920e0ea01936bf2482f4ba2fa985c22c13c621999e3d33b45baa5acfc1ea3d0

下载预构建服务器,并在 Meson 配置中指定路径:

bash
meson setup x --buildtype=release --strip -Db_lto=true \
     -Dprebuilt_server=/path/to/scrcpy-server
-ninja -Cx  # 不要以 root 用户运行

服务器仅与匹配的客户端版本兼容(此服务器适用于 master 分支)。

不安装直接运行

bash
./run x [options]

安装

构建成功后,可以安装 scrcpy 到系统:

bash
sudo ninja -Cx install    # Windows 上无需 sudo

安装的文件包括:

  • /usr/local/bin/scrcpy(主程序)
  • /usr/local/share/scrcpy/scrcpy-server(推送到设备的服务器)
  • /usr/local/share/man/man1/scrcpy.1(手册页)
  • /usr/local/share/icons/hicolor/256x256/apps/icon.png(应用图标)
  • /usr/local/share/zsh/site-functions/_scrcpy(zsh 补全)
  • /usr/local/share/bash-completion/completions/scrcpy(bash 补全)

之后可直接运行 scrcpy

卸载

bash
sudo ninja -Cx uninstall  # Windows 上无需 sudo

+ninja -Cx # 不要以 root 用户运行

服务器仅与匹配的客户端版本兼容(此服务器适用于 master 分支)。

不安装直接运行

bash
./run x [options]

安装

构建成功后,可以安装 scrcpy 到系统:

bash
sudo ninja -Cx install    # Windows 上无需 sudo

安装的文件包括:

  • /usr/local/bin/scrcpy(主程序)
  • /usr/local/share/scrcpy/scrcpy-server(推送到设备的服务器)
  • /usr/local/share/man/man1/scrcpy.1(手册页)
  • /usr/local/share/icons/hicolor/256x256/apps/icon.png(应用图标)
  • /usr/local/share/zsh/site-functions/_scrcpy(zsh 补全)
  • /usr/local/share/bash-completion/completions/scrcpy(bash 补全)

之后可直接运行 scrcpy

卸载

bash
sudo ninja -Cx uninstall  # Windows 上无需 sudo

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/camera.html b/zhHans/reference/scrcpy/camera.html index 7ee53b030..bbbcbdcbe 100644 --- a/zhHans/reference/scrcpy/camera.html +++ b/zhHans/reference/scrcpy/camera.html @@ -6,14 +6,14 @@ Camera(相机) | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
Skip to content

相机

支持在运行 Android 12 或更高版本的设备上使用相机镜像功能。

若要捕获相机画面而非设备屏幕,请运行以下命令:

scrcpy --video-source=camera

默认情况下,该命令会自动将音频源切换为麦克风(相当于同时传递了 --audio-source=mic 参数)。

bash
scrcpy --video-source=display  # 默认音频源为输出(output)
+    
Skip to content

相机

支持在运行 Android 12 或更高版本的设备上使用相机镜像功能。

若要捕获相机画面而非设备屏幕,请运行以下命令:

scrcpy --video-source=camera

默认情况下,该命令会自动将音频源切换为麦克风(相当于同时传递了 --audio-source=mic 参数)。

bash
scrcpy --video-source=display  # 默认音频源为输出(output)
 scrcpy --video-source=camera   # 默认音频源为麦克风(mic)
 scrcpy --video-source=display --audio-source=mic    # 强制显示画面并使用麦克风
 scrcpy --video-source=camera --audio-source=output  # 强制使用相机画面并捕获设备音频输出

可以禁用音频:

bash
# 完全不捕获音频
@@ -38,15 +38,15 @@
 scrcpy --video-source=camera --camera-ar=4:3          # 使用宽高比为 4:3(误差 +/- 10%)的最大尺寸
 scrcpy --video-source=camera --camera-ar=1.6          # 使用宽高比为 1.6(误差 +/- 10%)的最大尺寸
 scrcpy --video-source=camera --camera-ar=sensor       # 使用与相机传感器宽高比(误差 +/- 10%)匹配的最大尺寸
-scrcpy --video-source=camera -m1920 --camera-ar=16:9  # 使用不超过 1920 的最大宽度,并最接近 16:9 的宽高比

如果指定了 --camera-size,则禁止使用 -m/--max-size--camera-ar(尺寸已由显式给定的值确定):

bash
scrcpy --video-source=camera --camera-size=1920x1080 -m3000  # 错误

旋转

若要旋转捕获的视频,请使用视频方向选项:

scrcpy --video-source=camera --camera-size=1920x1080 --orientation=90

帧率

默认情况下,相机以 Android 的默认帧率(30 fps)捕获。

若要配置不同的帧率:

scrcpy --video-source=camera --camera-fps=60

高速捕获

Android 相机 API 还支持高速捕获模式

此模式仅限于特定的分辨率和帧率,通过 --list-camera-sizes 列出。

scrcpy --video-source=camera --camera-size=1920x1080 --camera-fps=240

花括号扩展技巧

所有相机选项均以 --camera- 开头,因此如果您的 shell 支持,可以利用花括号扩展(例如,bash 和 zsh 支持):

bash
scrcpy --video-source=camera --camera-{facing=back,ar=16:9,high-speed,fps=120}

这将扩展为:

bash
scrcpy --video-source=camera --camera-facing=back --camera-ar=16:9 --camera-high-speed --camera-fps=120

网络摄像头

在 Linux 上结合 V4L2 功能,可以将 Android 设备相机用作计算机上的网络摄像头。

+scrcpy --video-source=camera -m1920 --camera-ar=16:9 # 使用不超过 1920 的最大宽度,并最接近 16:9 的宽高比

如果指定了 --camera-size,则禁止使用 -m/--max-size--camera-ar(尺寸已由显式给定的值确定):

bash
scrcpy --video-source=camera --camera-size=1920x1080 -m3000  # 错误

旋转

若要旋转捕获的视频,请使用视频方向选项:

scrcpy --video-source=camera --camera-size=1920x1080 --orientation=90

帧率

默认情况下,相机以 Android 的默认帧率(30 fps)捕获。

若要配置不同的帧率:

scrcpy --video-source=camera --camera-fps=60

高速捕获

Android 相机 API 还支持高速捕获模式

此模式仅限于特定的分辨率和帧率,通过 --list-camera-sizes 列出。

scrcpy --video-source=camera --camera-size=1920x1080 --camera-fps=240

花括号扩展技巧

所有相机选项均以 --camera- 开头,因此如果您的 shell 支持,可以利用花括号扩展(例如,bash 和 zsh 支持):

bash
scrcpy --video-source=camera --camera-{facing=back,ar=16:9,high-speed,fps=120}

这将扩展为:

bash
scrcpy --video-source=camera --camera-facing=back --camera-ar=16:9 --camera-high-speed --camera-fps=120

网络摄像头

在 Linux 上结合 V4L2 功能,可以将 Android 设备相机用作计算机上的网络摄像头。

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/connection.html b/zhHans/reference/scrcpy/connection.html index 0e3eeb634..e2b3dc7dc 100644 --- a/zhHans/reference/scrcpy/connection.html +++ b/zhHans/reference/scrcpy/connection.html @@ -6,14 +6,14 @@ Connection(连接) | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
Skip to content

连接

设备选择

如果仅有一台设备已连接(即通过 adb devices 列出),则该设备会被自动选中。

但如果有多台设备连接,您需要通过以下4种方式之一指定要使用的设备:

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/control.html b/zhHans/reference/scrcpy/control.html index 8b109ec65..f46fb5905 100644 --- a/zhHans/reference/scrcpy/control.html +++ b/zhHans/reference/scrcpy/control.html @@ -6,14 +6,14 @@ Control(控制) | Escrcpy - + - + - + - + @@ -21,18 +21,18 @@ -
Skip to content

控制

只读模式

禁用所有控制功能(包括与设备交互的所有操作:输入按键、鼠标事件、拖放文件等):

bash
scrcpy --no-control
+    
Skip to content

控制

只读模式

禁用所有控制功能(包括与设备交互的所有操作:输入按键、鼠标事件、拖放文件等):

bash
scrcpy --no-control
 scrcpy -n   # 简写形式

键盘与鼠标

详见键盘鼠标文档。

仅控制模式

仅控制设备而不显示屏幕镜像:

bash
scrcpy --no-video --no-audio

默认情况下,关闭视频播放时鼠标功能会被禁用。

如需使用相对鼠标模式控制设备,启用UHID鼠标模式:

bash
scrcpy --no-video --no-audio --mouse=uhid
 scrcpy --no-video --no-audio -M  # 简写形式

如需同时使用UHID键盘,需显式设置:

bash
scrcpy --no-video --no-audio --mouse=uhid --keyboard=uhid
-scrcpy --no-video --no-audio -MK  # 简写形式

如需改用AOA模式(仅限USB连接):

bash
scrcpy --no-video --no-audio --keyboard=aoa --mouse=aoa

复制粘贴

Android剪贴板内容变化时会自动同步到电脑剪贴板。

所有Ctrl快捷键都会转发到设备,例如:

  • Ctrl+c 通常执行复制
  • Ctrl+x 通常执行剪切
  • Ctrl+v 通常执行粘贴(在电脑到设备剪贴板同步后)

这些操作通常符合预期,但具体行为取决于当前应用。例如:

  • Termux 会在Ctrl+c时发送SIGINT信号
  • K-9 Mail 会触发新建邮件功能

针对此类情况(仅支持Android 7及以上版本),可通过以下组合键实现复制/剪切/粘贴:

  • MOD+c 注入COPY命令
  • MOD+x 注入CUT命令
  • MOD+v 注入PASTE命令(在电脑到设备剪贴板同步后)

此外,MOD+Shift+v会将电脑剪贴板文本作为按键序列注入。这在组件不支持文本粘贴时(如Termux中)很有用,但可能破坏非ASCII内容。

警告: 将电脑剪贴板内容粘贴到设备(通过Ctrl+vMOD+v)会将该内容存入Android剪贴板,导致任何应用均可读取。应避免以此方式粘贴敏感内容(如密码)。

部分Android设备在编程设置剪贴板时行为异常,可通过--legacy-paste选项修改Ctrl+vMOD+v的行为,使其同样以按键序列方式注入电脑剪贴板文本(与MOD+Shift+v相同)。

如需禁用自动剪贴板同步,使用--no-clipboard-autosync

捏合缩放、旋转与倾斜模拟

模拟"捏合缩放":Ctrl+点击并移动

具体操作:按住Ctrl的同时按下鼠标左键。在左键释放前,所有鼠标移动都会以屏幕中心为基准对内容进行缩放和旋转(如果应用支持)。

https://github.com/Genymobile/scrcpy/assets/543275/26c4a920-9805-43f1-8d4c-608752d04767

模拟垂直倾斜手势:Shift+点击并上下移动

https://github.com/Genymobile/scrcpy/assets/543275/1e252341-4a90-4b29-9d11-9153b324669f

类似地,模拟水平倾斜手势:Ctrl+Shift+点击并左右移动

技术实现上,scrcpy会通过屏幕中心对称点生成"虚拟手指"的额外触摸事件。按下Ctrlxy坐标会反转,单独按下Shift仅反转x,而Ctrl+Shift仅反转y

此功能仅适用于默认鼠标模式(--mouse=sdk)。

文件拖放

安装APK

安装APK时,只需将APK文件(后缀为.apk)拖放到scrcpy窗口。

无视觉反馈,操作日志会打印到控制台。

推送文件到设备

推送文件到设备的/sdcard/Download/目录:将非APK文件拖放到scrcpy窗口。

无视觉反馈,操作日志会打印到控制台。

目标目录可通过启动参数修改:

bash
scrcpy --push-target=/sdcard/Movies/

+scrcpy --no-video --no-audio -MK # 简写形式

如需改用AOA模式(仅限USB连接):

bash
scrcpy --no-video --no-audio --keyboard=aoa --mouse=aoa

复制粘贴

Android剪贴板内容变化时会自动同步到电脑剪贴板。

所有Ctrl快捷键都会转发到设备,例如:

  • Ctrl+c 通常执行复制
  • Ctrl+x 通常执行剪切
  • Ctrl+v 通常执行粘贴(在电脑到设备剪贴板同步后)

这些操作通常符合预期,但具体行为取决于当前应用。例如:

  • Termux 会在Ctrl+c时发送SIGINT信号
  • K-9 Mail 会触发新建邮件功能

针对此类情况(仅支持Android 7及以上版本),可通过以下组合键实现复制/剪切/粘贴:

  • MOD+c 注入COPY命令
  • MOD+x 注入CUT命令
  • MOD+v 注入PASTE命令(在电脑到设备剪贴板同步后)

此外,MOD+Shift+v会将电脑剪贴板文本作为按键序列注入。这在组件不支持文本粘贴时(如Termux中)很有用,但可能破坏非ASCII内容。

警告: 将电脑剪贴板内容粘贴到设备(通过Ctrl+vMOD+v)会将该内容存入Android剪贴板,导致任何应用均可读取。应避免以此方式粘贴敏感内容(如密码)。

部分Android设备在编程设置剪贴板时行为异常,可通过--legacy-paste选项修改Ctrl+vMOD+v的行为,使其同样以按键序列方式注入电脑剪贴板文本(与MOD+Shift+v相同)。

如需禁用自动剪贴板同步,使用--no-clipboard-autosync

捏合缩放、旋转与倾斜模拟

模拟"捏合缩放":Ctrl+点击并移动

具体操作:按住Ctrl的同时按下鼠标左键。在左键释放前,所有鼠标移动都会以屏幕中心为基准对内容进行缩放和旋转(如果应用支持)。

https://github.com/Genymobile/scrcpy/assets/543275/26c4a920-9805-43f1-8d4c-608752d04767

模拟垂直倾斜手势:Shift+点击并上下移动

https://github.com/Genymobile/scrcpy/assets/543275/1e252341-4a90-4b29-9d11-9153b324669f

类似地,模拟水平倾斜手势:Ctrl+Shift+点击并左右移动

技术实现上,scrcpy会通过屏幕中心对称点生成"虚拟手指"的额外触摸事件。按下Ctrlxy坐标会反转,单独按下Shift仅反转x,而Ctrl+Shift仅反转y

此功能仅适用于默认鼠标模式(--mouse=sdk)。

文件拖放

安装APK

安装APK时,只需将APK文件(后缀为.apk)拖放到scrcpy窗口。

无视觉反馈,操作日志会打印到控制台。

推送文件到设备

推送文件到设备的/sdcard/Download/目录:将非APK文件拖放到scrcpy窗口。

无视觉反馈,操作日志会打印到控制台。

目标目录可通过启动参数修改:

bash
scrcpy --push-target=/sdcard/Movies/

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/develop.html b/zhHans/reference/scrcpy/develop.html index 3428ed5b2..dac24ef53 100644 --- a/zhHans/reference/scrcpy/develop.html +++ b/zhHans/reference/scrcpy/develop.html @@ -6,14 +6,14 @@ develop(开发者指南) | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
Skip to content

开发者指南:scrcpy

概述

该应用由两部分组成:

  • 服务端(scrcpy-server),在设备上执行;
  • 客户端(scrcpy 可执行文件),在主机上执行。

客户端负责将服务端推送到设备并启动其执行。

客户端和服务端通过独立的套接字进行视频、音频和控制通信。这些功能可以单独禁用(但不能全部禁用),因此可能使用 1、2 或 3 个套接字。

服务端首先在第一个套接字上发送设备名称(用于 scrcpy 窗口标题),随后每个套接字分别用于其特定用途。客户端和服务端均为每个套接字分配专用线程进行读写操作。

如果启用了视频功能,服务端会发送设备屏幕的原始视频流(默认为 H.264 编码),每个数据包附带额外头部信息。客户端解码视频帧并尽快显示,不进行缓冲(除非指定 --video-buffer=delay)以最小化延迟。客户端不感知设备旋转(由服务端处理),仅知道接收到的视频帧尺寸。

类似地,如果启用了音频功能,服务端会发送设备音频输出(或通过 --audio-source=mic 指定麦克风输入)的原始音频流(默认为 OPUS 编码),每个数据包附带额外头部信息。客户端解码音频流,尝试通过保持最小缓冲来降低延迟。scrcpy v2.0 发布的博客文章详细介绍了音频功能。

如果启用了控制功能,客户端会捕获相关的键盘和鼠标事件,并将其传输到服务端,由服务端注入到设备中。这是唯一一个双向使用的套接字:输入事件从客户端发送到设备,而当设备剪贴板内容变化时,新内容会从设备发送到客户端,以实现无缝复制粘贴。

需要注意的是,客户端和服务端的角色是从应用层面定义的:

  • 服务端提供视频和音频流,并处理客户端的请求;
  • 客户端通过服务端控制设备。

然而,默认情况下(未设置 --force-adb-forward 时),网络层面的角色是相反的:

  • 客户端在启动服务端之前打开服务器套接字并监听端口;
  • 服务端连接到客户端。

这种角色反转避免了因竞态条件导致的连接失败,而无需轮询。


服务端

权限

捕获屏幕需要一些权限,这些权限已授予 shell 用户。

服务端是一个 Java 应用程序(包含 public static void main(String... args) 方法),针对 Android 框架编译,并在 Android 设备上以 shell 用户身份执行。

要运行这样的 Java 应用程序,类必须被 dexed(通常是 classes.dex)。如果 my.package.MainClass 是主类,编译为 classes.dex 并推送到设备的 /data/local/tmp 目录,则可以通过以下命令运行:

bash
adb shell CLASSPATH=/data/local/tmp/classes.dex app_process / my.package.MainClass

路径 /data/local/tmp 是推送服务端的理想选择,因为它对 shell 用户可读写,但对其他用户不可写,因此恶意应用无法在客户端执行前替换服务端。

除了原始的 dex 文件,app_process 还接受包含 classes.dexjar 文件(例如 APK)。为了简化操作并利用 gradle 构建系统,服务端被构建为一个(未签名的)APK(重命名为 scrcpy-server.jar)。

隐藏方法

尽管针对 Android 框架编译,隐藏方法和类无法直接访问(且不同 Android 版本可能有所不同)。

可以通过反射调用这些方法。与隐藏组件的通信由 wrapperaidl 提供。

执行

客户端通过以下命令启动服务端:

bash
adb push scrcpy-server /data/local/tmp/scrcpy-server.jar
+    
Skip to content

开发者指南:scrcpy

概述

该应用由两部分组成:

  • 服务端(scrcpy-server),在设备上执行;
  • 客户端(scrcpy 可执行文件),在主机上执行。

客户端负责将服务端推送到设备并启动其执行。

客户端和服务端通过独立的套接字进行视频、音频和控制通信。这些功能可以单独禁用(但不能全部禁用),因此可能使用 1、2 或 3 个套接字。

服务端首先在第一个套接字上发送设备名称(用于 scrcpy 窗口标题),随后每个套接字分别用于其特定用途。客户端和服务端均为每个套接字分配专用线程进行读写操作。

如果启用了视频功能,服务端会发送设备屏幕的原始视频流(默认为 H.264 编码),每个数据包附带额外头部信息。客户端解码视频帧并尽快显示,不进行缓冲(除非指定 --video-buffer=delay)以最小化延迟。客户端不感知设备旋转(由服务端处理),仅知道接收到的视频帧尺寸。

类似地,如果启用了音频功能,服务端会发送设备音频输出(或通过 --audio-source=mic 指定麦克风输入)的原始音频流(默认为 OPUS 编码),每个数据包附带额外头部信息。客户端解码音频流,尝试通过保持最小缓冲来降低延迟。scrcpy v2.0 发布的博客文章详细介绍了音频功能。

如果启用了控制功能,客户端会捕获相关的键盘和鼠标事件,并将其传输到服务端,由服务端注入到设备中。这是唯一一个双向使用的套接字:输入事件从客户端发送到设备,而当设备剪贴板内容变化时,新内容会从设备发送到客户端,以实现无缝复制粘贴。

需要注意的是,客户端和服务端的角色是从应用层面定义的:

  • 服务端提供视频和音频流,并处理客户端的请求;
  • 客户端通过服务端控制设备。

然而,默认情况下(未设置 --force-adb-forward 时),网络层面的角色是相反的:

  • 客户端在启动服务端之前打开服务器套接字并监听端口;
  • 服务端连接到客户端。

这种角色反转避免了因竞态条件导致的连接失败,而无需轮询。


服务端

权限

捕获屏幕需要一些权限,这些权限已授予 shell 用户。

服务端是一个 Java 应用程序(包含 public static void main(String... args) 方法),针对 Android 框架编译,并在 Android 设备上以 shell 用户身份执行。

要运行这样的 Java 应用程序,类必须被 dexed(通常是 classes.dex)。如果 my.package.MainClass 是主类,编译为 classes.dex 并推送到设备的 /data/local/tmp 目录,则可以通过以下命令运行:

bash
adb shell CLASSPATH=/data/local/tmp/classes.dex app_process / my.package.MainClass

路径 /data/local/tmp 是推送服务端的理想选择,因为它对 shell 用户可读写,但对其他用户不可写,因此恶意应用无法在客户端执行前替换服务端。

除了原始的 dex 文件,app_process 还接受包含 classes.dexjar 文件(例如 APK)。为了简化操作并利用 gradle 构建系统,服务端被构建为一个(未签名的)APK(重命名为 scrcpy-server.jar)。

隐藏方法

尽管针对 Android 框架编译,隐藏方法和类无法直接访问(且不同 Android 版本可能有所不同)。

可以通过反射调用这些方法。与隐藏组件的通信由 wrapperaidl 提供。

执行

客户端通过以下命令启动服务端:

bash
adb push scrcpy-server /data/local/tmp/scrcpy-server.jar
 adb forward tcp:27183 localabstract:scrcpy
 adb shell CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process / com.genymobile.scrcpy.Server 2.1

第一个参数(示例中的 2.1)是客户端的 scrcpy 版本。如果客户端和服务端版本不完全一致,服务端会失败。客户端和服务端之间的协议可能因版本而异(参见协议部分),且没有向后或向前兼容性(使用不同版本的服务端和客户端毫无意义)。此检查用于检测配置错误(意外运行旧版或新版服务端)。

随后可以跟随任意数量的参数,形式为 key=value 对,顺序无关。可能的键及其值类型可以在服务端客户端代码中找到。

例如,如果执行 scrcpy -m1920 --no-audio,则服务端的执行如下:

bash
# scid 是一个随机数,用于区分同一设备上运行的不同客户端
 adb shell CLASSPATH=/data/local/tmp/scrcpy-server.jar app_process / com.genymobile.scrcpy.Server 2.1 scid=12345678 log_level=info audio=false max_size=1920

组件

执行时,其 main() 方法(在“主”线程中运行)会解析参数,建立与客户端的连接,并启动其他“组件”:

  • 视频流:捕获屏幕视频并通过 video 套接字发送编码后的视频数据包(从 video 线程)。
  • 音频流:使用多个线程捕获原始数据包,提交编码并获取编码后的数据包,通过 audio 套接字发送。
  • 控制器:从一个线程接收 control 套接字上的控制消息(通常是输入事件),并从另一个线程通过同一 control 套接字发送设备消息(例如将设备剪贴板内容传输到客户端)。因此,control 套接字是双向使用的(与 videoaudio 套接字不同)。

屏幕视频编码

编码由 ScreenEncoder 管理。

视频使用 MediaCodec API 编码。编码器编码与显示关联的 Surface 内容,并将编码后的数据包写入客户端(通过 video 套接字)。

在设备旋转(或折叠)时,编码会话会重置并重新启动。

仅当 Surface 发生变化时才会生成新帧。这避免了发送不必要的帧,但默认情况下可能存在以下问题:

  • 如果设备屏幕未变化,启动时不会发送任何帧;
  • 快速运动变化后,最后一帧的质量可能较差。

这两个问题通过标志 KEY_REPEAT_PREVIOUS_FRAME_AFTER 解决

音频编码

类似地,音频通过 AudioRecord 捕获,并使用 MediaCodec 异步 API 编码

更多细节请参阅介绍音频功能的博客文章

输入事件注入

控制消息 由客户端通过 Controller(在单独线程中运行)接收。输入事件有多种类型:

  • 键码(参考 KeyEvent);
  • 文本(特殊字符可能无法直接通过键码处理);
  • 鼠标移动/点击;
  • 鼠标滚动;
  • 其他命令(例如开关屏幕或复制剪贴板)。

其中一些需要通过系统注入输入事件。为此,它们使用 隐藏 方法 InputManager.injectInputEvent()(由 InputManager 包装器 暴露)。


客户端

客户端依赖 SDL,它提供了跨平台的 UI、输入事件、线程等 API。

视频和音频流由 FFmpeg 解码。

初始化

客户端解析命令行参数后,运行以下两种代码路径之一

在本文档的剩余部分,我们假设使用的是“正常”模式(OTG 模式的代码请自行阅读)。

启动时,客户端:

  • 打开 videoaudiocontrol 套接字;
  • 推送并启动设备上的服务端;
  • 初始化其组件(解复用器、解码器、录制器等)。

视频和音频流

根据传递给 scrcpy 的参数,可能会使用多个组件。以下是视频和音频组件的概述:

                                                 V4L2 sink
@@ -61,15 +61,15 @@
     raw_stream=true max_size=1920

一旦客户端通过 TCP 连接到端口 1234,设备就会开始流式传输视频。例如,VLC 可以播放视频(尽管会有很高的延迟,更多细节在此):

bash
vlc -Idummy --demux=h264 --network-caching=0 tcp://localhost:1234

黑客指南

更多细节,请阅读代码!

如果发现错误或有绝妙的想法,欢迎讨论和贡献 😉

调试服务端

服务端由客户端在启动时推送到设备。

要调试它,请在配置时启用服务端调试器:

bash
meson setup x -Dserver_debugger=true
 # 或者,如果 x 已配置
 meson configure x -Dserver_debugger=true

然后重新编译并运行 scrcpy。

对于 Android < 11,它会在设备的 5005 端口启动调试器并等待。将该端口重定向到计算机:

bash
adb forward tcp:5005 tcp:5005

对于 Android >= 11,首先找到监听端口:

bash
adb jdwp
-# 按 Ctrl+C 中断

然后重定向结果 PID:

bash
adb forward tcp:5005 jdwp:XXXX  # 替换 XXXX

在 Android Studio 中,Run > Debug > Edit configurations...,在左侧点击 +,选择 Remote,并填写表单:

  • Host: localhost
  • Port: 5005

然后点击 Debug

+# 按 Ctrl+C 中断

然后重定向结果 PID:

bash
adb forward tcp:5005 jdwp:XXXX  # 替换 XXXX

在 Android Studio 中,Run > Debug > Edit configurations...,在左侧点击 +,选择 Remote,并填写表单:

  • Host: localhost
  • Port: 5005

然后点击 Debug

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/device.html b/zhHans/reference/scrcpy/device.html index 14e0c49e1..09fe04c75 100644 --- a/zhHans/reference/scrcpy/device.html +++ b/zhHans/reference/scrcpy/device.html @@ -6,14 +6,14 @@ device(设备控制) | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
Skip to content

设备控制

某些命令行参数可以在scrcpy运行时对设备本身执行操作。

保持唤醒

当设备通过有线连接时,防止设备延迟休眠:

bash
scrcpy --stay-awake
+    
Skip to content

设备控制

某些命令行参数可以在scrcpy运行时对设备本身执行操作。

保持唤醒

当设备通过有线连接时,防止设备延迟休眠:

bash
scrcpy --stay-awake
 scrcpy -w  # 简写形式

scrcpy关闭时将恢复初始状态。

如果设备未通过有线连接(即仅通过TCP/IP连接),--stay-awake参数无效(这是Android系统的特性)。

该功能通过修改stay_on_while_plugged_in设置实现,也可手动调整:

bash
# 获取当前stay_on_while_plugged_in值
 adb shell settings get global stay_on_while_plugged_in
 # 为AC/USB/无线充电器启用保持唤醒
@@ -41,15 +41,15 @@
 # 启用show_touches
 adb shell settings put system show_touches 1
 # 禁用show_touches
-adb shell settings put system show_touches 0

关闭时断电

在关闭scrcpy时关闭设备屏幕:

bash
scrcpy --power-off-on-close

启动时通电

默认情况下,启动时会唤醒设备。禁用此行为:

bash
scrcpy --no-power-on

启动Android应用

列出设备上安装的Android应用:

bash
scrcpy --list-apps

可以通过包名在启动时运行指定应用:

bash
scrcpy --start-app=org.mozilla.firefox

此功能可用于在虚拟显示器中运行应用:

bash
scrcpy --new-display=1920x1080 --start-app=org.videolan.vlc

可以在启动应用前强制停止它,只需添加+前缀:

bash
scrcpy --start-app=+org.mozilla.firefox

为方便起见,也可以通过应用名称选择应用,需添加?前缀:

bash
scrcpy --start-app=?firefox

但检索应用名称可能需要一些时间(有时需要几秒),因此建议直接使用包名。

+?前缀可以组合使用(按此顺序):

bash
scrcpy --start-app=+?firefox

+adb shell settings put system show_touches 0

关闭时断电

在关闭scrcpy时关闭设备屏幕:

bash
scrcpy --power-off-on-close

启动时通电

默认情况下,启动时会唤醒设备。禁用此行为:

bash
scrcpy --no-power-on

启动Android应用

列出设备上安装的Android应用:

bash
scrcpy --list-apps

可以通过包名在启动时运行指定应用:

bash
scrcpy --start-app=org.mozilla.firefox

此功能可用于在虚拟显示器中运行应用:

bash
scrcpy --new-display=1920x1080 --start-app=org.videolan.vlc

可以在启动应用前强制停止它,只需添加+前缀:

bash
scrcpy --start-app=+org.mozilla.firefox

为方便起见,也可以通过应用名称选择应用,需添加?前缀:

bash
scrcpy --start-app=?firefox

但检索应用名称可能需要一些时间(有时需要几秒),因此建议直接使用包名。

+?前缀可以组合使用(按此顺序):

bash
scrcpy --start-app=+?firefox

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/gamepad.html b/zhHans/reference/scrcpy/gamepad.html index 39362bd44..d887a4b42 100644 --- a/zhHans/reference/scrcpy/gamepad.html +++ b/zhHans/reference/scrcpy/gamepad.html @@ -6,14 +6,14 @@ Gamepad(游戏手柄) | Escrcpy - + - + - + - + @@ -21,16 +21,16 @@ -
Skip to content

Gamepad(游戏手柄)

提供多种游戏手柄输入模式:

  • --gamepad=disabled(默认模式)
  • --gamepad=uhid(或简写为 -G):通过设备的 UHID 内核模块模拟物理 HID 游戏手柄
  • --gamepad=aoa:通过 AOAv2 协议模拟物理 HID 游戏手柄

物理游戏手柄模拟

有两种模式可以在设备上模拟物理 HID 游戏手柄,每种模式对应计算机上连接的一个物理游戏手柄。

UHID 模式

此模式通过设备上的 UHID 内核模块模拟物理 HID 游戏手柄。

启用 UHID 游戏手柄模式,请使用以下命令:

bash
scrcpy --gamepad=uhid
-scrcpy -G  # 简写形式

注意:由于权限问题,UHID 在较旧的 Android 版本上可能无法正常工作。

AOA 模式

此模式通过 AOAv2 协议模拟物理 HID 游戏手柄。

启用 AOA 游戏手柄模式,请使用以下命令:

bash
scrcpy --gamepad=aoa

与其他模式不同,此模式直接在 USB 层级工作(因此仅支持通过 USB 连接)。

它不使用 scrcpy 服务端,也不需要 adb(USB 调试)。因此,即使 USB 调试被禁用,也可以控制设备(但无法镜像屏幕,详见 OTG)。

注意:在此模式下,Android 会将多个物理游戏手柄检测为一个行为异常的单一设备。如果需要使用多个游戏手柄,请选择 UHID 模式。

注意:在 Windows 上,此模式可能仅在 OTG 模式 下有效,无法在镜像时使用(如果 USB 设备已被其他进程如 adb 守护进程 占用,则无法打开)。

+

Skip to content

Gamepad(游戏手柄)

提供多种游戏手柄输入模式:

  • --gamepad=disabled(默认模式)
  • --gamepad=uhid(或简写为 -G):通过设备的 UHID 内核模块模拟物理 HID 游戏手柄
  • --gamepad=aoa:通过 AOAv2 协议模拟物理 HID 游戏手柄

物理游戏手柄模拟

有两种模式可以在设备上模拟物理 HID 游戏手柄,每种模式对应计算机上连接的一个物理游戏手柄。

UHID 模式

此模式通过设备上的 UHID 内核模块模拟物理 HID 游戏手柄。

启用 UHID 游戏手柄模式,请使用以下命令:

bash
scrcpy --gamepad=uhid
+scrcpy -G  # 简写形式

注意:由于权限问题,UHID 在较旧的 Android 版本上可能无法正常工作。

AOA 模式

此模式通过 AOAv2 协议模拟物理 HID 游戏手柄。

启用 AOA 游戏手柄模式,请使用以下命令:

bash
scrcpy --gamepad=aoa

与其他模式不同,此模式直接在 USB 层级工作(因此仅支持通过 USB 连接)。

它不使用 scrcpy 服务端,也不需要 adb(USB 调试)。因此,即使 USB 调试被禁用,也可以控制设备(但无法镜像屏幕,详见 OTG)。

注意:在此模式下,Android 会将多个物理游戏手柄检测为一个行为异常的单一设备。如果需要使用多个游戏手柄,请选择 UHID 模式。

注意:在 Windows 上,此模式可能仅在 OTG 模式 下有效,无法在镜像时使用(如果 USB 设备已被其他进程如 adb 守护进程 占用,则无法打开)。

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/index.html b/zhHans/reference/scrcpy/index.html index 1663f3a67..61e0f72d2 100644 --- a/zhHans/reference/scrcpy/index.html +++ b/zhHans/reference/scrcpy/index.html @@ -6,14 +6,14 @@ Scrcpy | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
Skip to content

IMPORTANT

Escrcpy基于以下开源项目构建。相关内容仅供参考,将定期更新。

scrcpy (v3.2)

scrcpy

发音为 "screen copy"

此应用通过USB或TCP/IP连接镜像Android设备(视频和音频),并支持使用计算机的键盘和鼠标进行控制。它不需要root权限,也无需在设备上安装应用。支持LinuxWindowsmacOS

截图

其特点包括:

  • 轻量:原生实现,仅显示设备屏幕
  • 高性能:30~120fps,具体取决于设备
  • 高质量:1920×1080或更高分辨率
  • 低延迟35~70毫秒
  • 快速启动:约1秒显示首帧画面
  • 无侵入性:不会在Android设备上留下任何痕迹
  • 用户友好:无需账户、无广告、无需联网
  • 自由:免费开源软件

功能亮点:

前提条件

Android设备需至少支持API 21(Android 5.0)。

音频转发需API >= 30(Android 11+)。

确保已在设备上启用USB调试

在某些设备(尤其是小米)上,可能会遇到以下错误:

java.lang.SecurityException: Injecting input events requires the caller (or the source of the instrumentation, if any) to have the INJECT_EVENTS permission.

此时,需启用额外选项control USB调试(安全设置)(与USB调试不同),才能使用键盘和鼠标控制设备。启用后需重启设备。

注意:OTG模式下无需开启USB调试。

获取应用

必知技巧

使用示例

提供多种选项,详见文档。以下为常用示例:

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/keyboard.html b/zhHans/reference/scrcpy/keyboard.html index 5f5ad4700..899f742bb 100644 --- a/zhHans/reference/scrcpy/keyboard.html +++ b/zhHans/reference/scrcpy/keyboard.html @@ -6,14 +6,14 @@ keyboard(键盘) | Escrcpy - + - + - + - + @@ -21,16 +21,16 @@ -
Skip to content

键盘

提供多种键盘输入模式:

  • --keyboard=sdk(默认模式)
  • --keyboard=uhid(或简写为 -K):通过设备的 UHID 内核模块模拟物理 HID 键盘
  • --keyboard=aoa:通过 AOAv2 协议模拟物理 HID 键盘
  • --keyboard=disabled 禁用键盘输入

默认使用 sdk 模式,但如果经常使用 scrcpy,建议切换到 uhid 模式并一次性配置键盘布局。


SDK 键盘模式

在此模式下(--keyboard=sdk 或省略参数时),键盘输入事件通过 Android API 层级注入。该模式通用性强,但仅支持 ASCII 和部分其他字符。

注意:某些设备需在开发者选项中启用额外设置才能使此模式正常工作,详见前提条件

以下参数(专用于 --keyboard=sdk)可自定义行为:

文本注入偏好

输入文本时会生成两种事件

  • 按键事件:表示按键的按下或释放;
  • 文本事件:表示文本的输入。

默认情况下,数字和“特殊字符”通过文本事件插入,而字母通过按键事件注入(以便在游戏中正常响应 WASD 等按键)。

但此行为可能导致问题。若遇到此类问题,可强制将字母作为文本注入(或直接切换至 UHID 模式):

bash
scrcpy --prefer-text

(但这会破坏游戏中的键盘行为)

反之,也可强制始终使用原始按键事件:

bash
scrcpy --raw-key-events

按键重复

默认情况下,长按按键会生成重复的按键事件。某些游戏中这些事件无用且可能导致性能问题。

禁用重复按键事件转发:

bash
scrcpy --no-key-repeat

物理键盘模拟

两种模式可在设备上模拟物理 HID 键盘。为确保正常工作,需在设备上一次性配置与计算机匹配的键盘布局。

可通过以下方式打开配置页面:

  • 使用 uhidaoa 模式时,在 scrcpy 窗口中按 MOD+k(见快捷键
  • 在设备上进入:设置 → 系统 → 语言与输入 → 物理键盘
  • 通过计算机终端执行:
    bash
    adb shell am start -a android.settings.HARD_KEYBOARD_SETTINGS

在此配置页面中,还可启用或禁用屏幕键盘。

UHID 模式

此模式通过设备的 UHID 内核模块模拟物理 HID 键盘。

启用 UHID 键盘:

bash
scrcpy --keyboard=uhid
-scrcpy -K  # 简写形式

配置键盘布局后(见上文),这是镜像时使用键盘的最佳模式:

  • 支持所有字符和输入法(与 --keyboard=sdk 不同)
  • 可禁用屏幕键盘(与 --keyboard=sdk 不同)
  • 支持 TCP/IP 无线连接(与 --keyboard=aoa 不同)
  • 在 Windows 上无兼容问题(与 --keyboard=aoa 不同)

缺点是由于权限问题,旧版 Android 可能无法使用此模式。

AOA 模式

此模式通过 AOAv2 协议模拟物理 HID 键盘。

启用 AOA 键盘:

bash
scrcpy --keyboard=aoa

与其他模式不同,AOA 直接在 USB 层级工作(仅支持有线连接)。

它不使用 scrcpy 服务端,且无需 adb(USB 调试)。因此,即使关闭 USB 调试,仍可控制设备(但不支持镜像,见 OTG)。

注意:在 Windows 上,此模式可能仅支持 OTG 模式,镜像时无法使用(若 USB 设备已被其他进程如 adb 守护进程 占用,则无法重复打开)。

+

Skip to content

键盘

提供多种键盘输入模式:

  • --keyboard=sdk(默认模式)
  • --keyboard=uhid(或简写为 -K):通过设备的 UHID 内核模块模拟物理 HID 键盘
  • --keyboard=aoa:通过 AOAv2 协议模拟物理 HID 键盘
  • --keyboard=disabled 禁用键盘输入

默认使用 sdk 模式,但如果经常使用 scrcpy,建议切换到 uhid 模式并一次性配置键盘布局。


SDK 键盘模式

在此模式下(--keyboard=sdk 或省略参数时),键盘输入事件通过 Android API 层级注入。该模式通用性强,但仅支持 ASCII 和部分其他字符。

注意:某些设备需在开发者选项中启用额外设置才能使此模式正常工作,详见前提条件

以下参数(专用于 --keyboard=sdk)可自定义行为:

文本注入偏好

输入文本时会生成两种事件

  • 按键事件:表示按键的按下或释放;
  • 文本事件:表示文本的输入。

默认情况下,数字和“特殊字符”通过文本事件插入,而字母通过按键事件注入(以便在游戏中正常响应 WASD 等按键)。

但此行为可能导致问题。若遇到此类问题,可强制将字母作为文本注入(或直接切换至 UHID 模式):

bash
scrcpy --prefer-text

(但这会破坏游戏中的键盘行为)

反之,也可强制始终使用原始按键事件:

bash
scrcpy --raw-key-events

按键重复

默认情况下,长按按键会生成重复的按键事件。某些游戏中这些事件无用且可能导致性能问题。

禁用重复按键事件转发:

bash
scrcpy --no-key-repeat

物理键盘模拟

两种模式可在设备上模拟物理 HID 键盘。为确保正常工作,需在设备上一次性配置与计算机匹配的键盘布局。

可通过以下方式打开配置页面:

  • 使用 uhidaoa 模式时,在 scrcpy 窗口中按 MOD+k(见快捷键
  • 在设备上进入:设置 → 系统 → 语言与输入 → 物理键盘
  • 通过计算机终端执行:
    bash
    adb shell am start -a android.settings.HARD_KEYBOARD_SETTINGS

在此配置页面中,还可启用或禁用屏幕键盘。

UHID 模式

此模式通过设备的 UHID 内核模块模拟物理 HID 键盘。

启用 UHID 键盘:

bash
scrcpy --keyboard=uhid
+scrcpy -K  # 简写形式

配置键盘布局后(见上文),这是镜像时使用键盘的最佳模式:

  • 支持所有字符和输入法(与 --keyboard=sdk 不同)
  • 可禁用屏幕键盘(与 --keyboard=sdk 不同)
  • 支持 TCP/IP 无线连接(与 --keyboard=aoa 不同)
  • 在 Windows 上无兼容问题(与 --keyboard=aoa 不同)

缺点是由于权限问题,旧版 Android 可能无法使用此模式。

AOA 模式

此模式通过 AOAv2 协议模拟物理 HID 键盘。

启用 AOA 键盘:

bash
scrcpy --keyboard=aoa

与其他模式不同,AOA 直接在 USB 层级工作(仅支持有线连接)。

它不使用 scrcpy 服务端,且无需 adb(USB 调试)。因此,即使关闭 USB 调试,仍可控制设备(但不支持镜像,见 OTG)。

注意:在 Windows 上,此模式可能仅支持 OTG 模式,镜像时无法使用(若 USB 设备已被其他进程如 adb 守护进程 占用,则无法重复打开)。

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/linux.html b/zhHans/reference/scrcpy/linux.html index dc69f7009..ac02e4091 100644 --- a/zhHans/reference/scrcpy/linux.html +++ b/zhHans/reference/scrcpy/linux.html @@ -6,14 +6,14 @@ Linux(平台指南) | Escrcpy - + - + - + - + @@ -21,22 +21,22 @@ -
Skip to content

Linux 平台指南

安装

官方发布版本

下载最新版本的静态构建包:

下载后解压即可。

Linux平台的静态构建版本仍处于实验阶段。

通过包管理器安装

Packaging status

Scrcpy已被多种发行版和包管理器收录:

  • Debian/Ubuntu: apt install scrcpy (版本过旧)
  • Arch Linux: pacman -S scrcpy
  • Fedora: dnf copr enable zeno/scrcpy && dnf install scrcpy
  • Gentoo: emerge scrcpy
  • Snap: snap install scrcpy
  • … (详见 repology)

使用安装脚本

如需安装master分支的最新版本,可按以下简化流程操作:

首先安装依赖包:

bash
# Debian/Ubuntu系统
+    
Skip to content

Linux 平台指南

安装

官方发布版本

下载最新版本的静态构建包:

下载后解压即可。

Linux平台的静态构建版本仍处于实验阶段。

通过包管理器安装

Packaging status

Scrcpy已被多种发行版和包管理器收录:

  • Debian/Ubuntu: apt install scrcpy (版本过旧)
  • Arch Linux: pacman -S scrcpy
  • Fedora: dnf copr enable zeno/scrcpy && dnf install scrcpy
  • Gentoo: emerge scrcpy
  • Snap: snap install scrcpy
  • … (详见 repology)

使用安装脚本

如需安装master分支的最新版本,可按以下简化流程操作:

首先安装依赖包:

bash
# Debian/Ubuntu系统
 sudo apt install ffmpeg libsdl2-2.0-0 adb wget \
                  gcc git pkg-config meson ninja-build libsdl2-dev \
                  libavcodec-dev libavdevice-dev libavformat-dev libavutil-dev \
                  libswresample-dev libusb-1.0-0 libusb-1.0-0-dev

然后克隆仓库并执行安装脚本 (脚本源码):

bash
git clone https://github.com/Genymobile/scrcpy
 cd scrcpy
 ./install_release.sh

当有新版本发布时,更新仓库并重新安装:

bash
git pull
-./install_release.sh

卸载方法:

bash
sudo ninja -Cbuild-auto uninstall

注意:此简化流程仅适用于正式发布版本(脚本会下载预编译的服务器二进制文件),因此无法用于测试开发分支(如dev分支)。

如需手动构建安装,请参阅build.md

运行

请确保设备满足运行要求

安装完成后,在终端中执行:

bash
scrcpy

或带参数运行(以下示例禁用音频并录制到file.mkv):

bash
scrcpy --no-audio --record=file.mkv

命令行参数文档可通过以下方式查看:

+./install_release.sh

卸载方法:

bash
sudo ninja -Cbuild-auto uninstall

注意:此简化流程仅适用于正式发布版本(脚本会下载预编译的服务器二进制文件),因此无法用于测试开发分支(如dev分支)。

如需手动构建安装,请参阅build.md

运行

请确保设备满足运行要求

安装完成后,在终端中执行:

bash
scrcpy

或带参数运行(以下示例禁用音频并录制到file.mkv):

bash
scrcpy --no-audio --record=file.mkv

命令行参数文档可通过以下方式查看:

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/macos.html b/zhHans/reference/scrcpy/macos.html index df61ca6ff..999a2a72a 100644 --- a/zhHans/reference/scrcpy/macos.html +++ b/zhHans/reference/scrcpy/macos.html @@ -6,14 +6,14 @@ MacOS(平台指南) | Escrcpy - + - + - + - + @@ -21,15 +21,15 @@ -
Skip to content

在 macOS 上使用 scrcpy

安装

从官方发布版本安装

下载最新版本的静态构建包:

下载完成后解压即可。

注意:macOS 版的 scrcpy 静态构建包仍处于实验阶段。

通过包管理器安装

Scrcpy 可通过 Homebrew 安装:

bash
brew install scrcpy

你需要确保 adb 工具已在 PATH 环境变量中。如果尚未安装:

bash
brew install --cask android-platform-tools

此外,Scrcpy 也可通过 MacPorts 安装,该工具会自动配置 adb

bash
sudo port install scrcpy

如需手动构建和安装,请参阅 build

运行

请确保你的设备满足使用前提

安装完成后,在终端中运行:

bash
scrcpy

或带参数运行(以下示例为禁用音频并录制到 file.mkv):

bash
scrcpy --no-audio --record=file.mkv

命令行参数的文档可通过以下方式查看:

+

Skip to content

在 macOS 上使用 scrcpy

安装

从官方发布版本安装

下载最新版本的静态构建包:

下载完成后解压即可。

注意:macOS 版的 scrcpy 静态构建包仍处于实验阶段。

通过包管理器安装

Scrcpy 可通过 Homebrew 安装:

bash
brew install scrcpy

你需要确保 adb 工具已在 PATH 环境变量中。如果尚未安装:

bash
brew install --cask android-platform-tools

此外,Scrcpy 也可通过 MacPorts 安装,该工具会自动配置 adb

bash
sudo port install scrcpy

如需手动构建和安装,请参阅 build

运行

请确保你的设备满足使用前提

安装完成后,在终端中运行:

bash
scrcpy

或带参数运行(以下示例为禁用音频并录制到 file.mkv):

bash
scrcpy --no-audio --record=file.mkv

命令行参数的文档可通过以下方式查看:

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/mouse.html b/zhHans/reference/scrcpy/mouse.html index 955eba1a1..9f81e4afd 100644 --- a/zhHans/reference/scrcpy/mouse.html +++ b/zhHans/reference/scrcpy/mouse.html @@ -6,14 +6,14 @@ Mouse(鼠标) | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
Skip to content

鼠标

提供多种鼠标输入模式:

  • --mouse=sdk(默认模式)
  • --mouse=uhid(或 -M):通过设备的 UHID 内核模块模拟物理 HID 鼠标
  • --mouse=aoa:通过 AOAv2 协议模拟物理 HID 鼠标
  • --mouse=disabled

SDK 鼠标模式

在此模式下(--mouse=sdk 或省略参数时),鼠标输入事件会以绝对坐标的形式通过 Android API 注入设备。

注意:在某些设备上,开发者选项中需启用额外选项才能使此模式生效。详见前提条件

鼠标悬停

默认情况下,鼠标悬停(无点击的鼠标移动)事件会被转发到设备。可通过以下命令禁用:

scrcpy --no-mouse-hover

物理鼠标模拟

有两种模式可在设备上模拟物理 HID 鼠标。

在这些模式下,计算机鼠标会被“捕获”:鼠标指针从计算机消失,转而出现在 Android 设备上。

通过快捷键修饰键(默认为 AltSuper)可切换(禁用或启用)鼠标捕获功能。使用其中之一可将鼠标控制权交还给计算机。

UHID 模式

此模式通过设备的 UHID 内核模块模拟物理 HID 鼠标。

启用 UHID 鼠标模式的命令:

bash
scrcpy --mouse=uhid
+    
Skip to content

鼠标

提供多种鼠标输入模式:

  • --mouse=sdk(默认模式)
  • --mouse=uhid(或 -M):通过设备的 UHID 内核模块模拟物理 HID 鼠标
  • --mouse=aoa:通过 AOAv2 协议模拟物理 HID 鼠标
  • --mouse=disabled

SDK 鼠标模式

在此模式下(--mouse=sdk 或省略参数时),鼠标输入事件会以绝对坐标的形式通过 Android API 注入设备。

注意:在某些设备上,开发者选项中需启用额外选项才能使此模式生效。详见前提条件

鼠标悬停

默认情况下,鼠标悬停(无点击的鼠标移动)事件会被转发到设备。可通过以下命令禁用:

scrcpy --no-mouse-hover

物理鼠标模拟

有两种模式可在设备上模拟物理 HID 鼠标。

在这些模式下,计算机鼠标会被“捕获”:鼠标指针从计算机消失,转而出现在 Android 设备上。

通过快捷键修饰键(默认为 AltSuper)可切换(禁用或启用)鼠标捕获功能。使用其中之一可将鼠标控制权交还给计算机。

UHID 模式

此模式通过设备的 UHID 内核模块模拟物理 HID 鼠标。

启用 UHID 鼠标模式的命令:

bash
scrcpy --mouse=uhid
 scrcpy -M  # 简写形式

注意:由于权限问题,UHID 在旧版 Android 上可能无法工作。

AOA 模式

此模式通过 AOAv2 协议模拟物理 HID 鼠标。

启用 AOA 鼠标模式的命令:

bash
scrcpy --mouse=aoa

与其他模式不同,此模式直接在 USB 层面工作(因此仅支持 USB 连接)。

它不使用 scrcpy 服务端,也不依赖 adb(USB 调试)。因此,即使 USB 调试被禁用,仍可控制设备(但无法镜像)。详见 OTG

注意:在 Windows 上,此模式可能仅在 OTG 模式下有效,镜像时无效(如果 USB 设备已被其他进程如 adb 守护进程 占用,则无法打开)。

鼠标按键绑定

默认情况下,在 SDK 鼠标模式下:

  • 右键触发 BACK(或点亮屏幕)
  • 中键触发 HOME
  • 第四键触发 APP_SWITCH
  • 第五键展开通知面板

通过按住 Shift 键,可将次要点击事件转发到设备(例如 Shift+右键会向设备注入右键点击)。

在 AOA 和 UHID 鼠标模式下,默认绑定相反:所有点击默认被转发,按住 Shift 可触发快捷键(由于光标由设备端处理,在此模式下默认转发所有鼠标按键更合理)。

可通过 --mouse-bind=xxxx:xxxx 配置任何鼠标模式的快捷键。参数必须为一或两组(用 : 分隔)共 4 个字符的序列,分别对应每次次要点击:

                .---- Shift + 右键
        次要绑定 |.--- Shift + 中键
                ||.-- Shift + 第四键
@@ -40,15 +40,15 @@
                                # 使用第四键和第五键触发 BACK 和 HOME,
                                # 使用 Shift+第四键 和 Shift+第五键 触发
                                # APP_SWITCH 和展开通知面板

第二组绑定可省略。此时其内容与第一组相同:

bash
scrcpy --mouse-bind=bhsn
-scrcpy --mouse-bind=bhsn:bhsn  # 等效

+scrcpy --mouse-bind=bhsn:bhsn # 等效

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/otg.html b/zhHans/reference/scrcpy/otg.html index 8159ba0ed..cdc4e307d 100644 --- a/zhHans/reference/scrcpy/otg.html +++ b/zhHans/reference/scrcpy/otg.html @@ -6,14 +6,14 @@ OTG | Escrcpy - + - + - + - + @@ -21,21 +21,21 @@ -
Skip to content

OTG

默认情况下,scrcpy 通过 Android API 层级注入输入事件。作为替代方案,它可以发送 HID 事件,使得 scrcpy 的行为类似于连接到 Android 设备的物理键盘和/或物理鼠标(详见键盘鼠标)。

一种特殊模式(OTG)允许使用 AOA 键盘鼠标游戏手柄控制设备,完全无需使用 adb(因此 USB 调试不是必需的)。在此模式下,视频和音频被禁用,且默认启用 --keyboard=aoa--mouse=aoa。但游戏手柄默认禁用,因此需要显式设置 --gamepad=aoa(或在 OTG 模式下使用 -G)。

因此,可以仅通过物理键盘、鼠标和游戏手柄模拟运行 scrcpy,就像计算机的键盘、鼠标和游戏手柄通过 OTG 线缆直接连接到设备一样。

启用 OTG 模式:

bash
scrcpy --otg
+    
Skip to content

OTG

默认情况下,scrcpy 通过 Android API 层级注入输入事件。作为替代方案,它可以发送 HID 事件,使得 scrcpy 的行为类似于连接到 Android 设备的物理键盘和/或物理鼠标(详见键盘鼠标)。

一种特殊模式(OTG)允许使用 AOA 键盘鼠标游戏手柄控制设备,完全无需使用 adb(因此 USB 调试不是必需的)。在此模式下,视频和音频被禁用,且默认启用 --keyboard=aoa--mouse=aoa。但游戏手柄默认禁用,因此需要显式设置 --gamepad=aoa(或在 OTG 模式下使用 -G)。

因此,可以仅通过物理键盘、鼠标和游戏手柄模拟运行 scrcpy,就像计算机的键盘、鼠标和游戏手柄通过 OTG 线缆直接连接到设备一样。

启用 OTG 模式:

bash
scrcpy --otg
 # 如果连接了多个 USB 设备,需指定序列号
 scrcpy --otg -s 0123456789abcdef

可以禁用键盘或鼠标:

bash
scrcpy --otg --keyboard=disabled
 scrcpy --otg --mouse=disabled

并启用游戏手柄:

bash
scrcpy --otg --gamepad=aoa
 scrcpy --otg -G  # 简写形式

此功能仅在设备通过 USB 连接时有效。

Windows 上的 OTG 问题

详见常见问题

仅控制功能

请注意,OTG 的目的是在不启用 USB 调试(adb)的情况下控制设备。

如果仅需在启用 USB 调试时控制设备而不需要镜像功能,则无需使用 OTG 模式。

可以禁用视频和音频,并选择 UHID(或 AOA):

bash
scrcpy --no-video --no-audio --keyboard=uhid --mouse=uhid --gamepad=uhid
 scrcpy --no-video --no-audio -KMG  # 简写形式
-scrcpy --no-video --no-audio --keyboard=aoa --mouse=aoa --gamepad=aoa

UHID 的一个优势是它还可以无线工作。

+scrcpy --no-video --no-audio --keyboard=aoa --mouse=aoa --gamepad=aoa

UHID 的一个优势是它还可以无线工作。

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/recording.html b/zhHans/reference/scrcpy/recording.html index c84cb549a..ddd7fbd3d 100644 --- a/zhHans/reference/scrcpy/recording.html +++ b/zhHans/reference/scrcpy/recording.html @@ -6,14 +6,14 @@ Recording(录制) | Escrcpy - + - + - + - + @@ -21,22 +21,22 @@ -
Skip to content

录制

在镜像时录制视频和音频流:

bash
scrcpy --record=file.mp4
+    
Skip to content

录制

在镜像时录制视频和音频流:

bash
scrcpy --record=file.mp4
 scrcpy -r file.mkv

仅录制视频:

bash
scrcpy --no-audio --record=file.mp4

仅录制音频:

bash
scrcpy --no-video --record=file.opus
 scrcpy --no-video --audio-codec=aac --record=file.aac
 scrcpy --no-video --audio-codec=flac --record=file.flac
 scrcpy --no-video --audio-codec=raw --record=file.wav
 # .m4a/.mp4 和 .mka/.mkv 也支持 opus、aac 和 flac 格式

时间戳在设备端捕获,因此数据包延迟变化不会影响录制的文件(前提是使用 --record 选项,而不是在计算机上捕获 scrcpy 窗口和音频输出时)。

格式

视频和音频流在设备端编码,但在客户端混合。支持多种格式(容器):

  • MP4(.mp4.m4a.aac
  • Matroska(.mkv.mka
  • OPUS(.opus
  • FLAC(.flac
  • WAV(.wav

容器会根据文件名自动选择。

也可以显式选择容器(此时文件名无需以已知扩展名结尾):

bash
scrcpy --record=file --record-format=mkv

旋转

可以录制旋转的视频。参见视频方向

无播放

在录制时禁用播放和控制:

bash
scrcpy --no-playback --no-control --record=file.mp4

也可以分别禁用视频和音频播放:

bash
# 录制视频和音频,但仅播放视频
 scrcpy --record=file.mkv --no-audio-playback

同时禁用窗口:

bash
scrcpy --no-playback --no-window --record=file.mp4
-# 使用 Ctrl+C 中断录制

时间限制

限制录制时间:

bash
scrcpy --record=file.mkv --time-limit=20  # 单位为秒

--time-limit 选项不仅限于录制,也会影响简单的镜像:

bash
scrcpy --time-limit=20

+# 使用 Ctrl+C 中断录制

时间限制

限制录制时间:

bash
scrcpy --record=file.mkv --time-limit=20  # 单位为秒

--time-limit 选项不仅限于录制,也会影响简单的镜像:

bash
scrcpy --time-limit=20

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/shortcuts.html b/zhHans/reference/scrcpy/shortcuts.html index b7ffbbbce..7ce2a0e73 100644 --- a/zhHans/reference/scrcpy/shortcuts.html +++ b/zhHans/reference/scrcpy/shortcuts.html @@ -6,14 +6,14 @@ Shortcuts(快捷键) | Escrcpy - + - + - + - + @@ -21,19 +21,19 @@ -
Skip to content

快捷键

在 scrcpy 窗口中可以通过键盘和鼠标快捷键执行操作。

以下列表中,MOD 是快捷键修饰键。默认情况下是(左)Alt 或(左)Super

可以使用 --shortcut-mod 修改修饰键。可选键包括 lctrlrctrllaltraltlsuperrsuper。例如:

bash
# 使用右Ctrl作为快捷键修饰键
+    
Skip to content

快捷键

在 scrcpy 窗口中可以通过键盘和鼠标快捷键执行操作。

以下列表中,MOD 是快捷键修饰键。默认情况下是(左)Alt 或(左)Super

可以使用 --shortcut-mod 修改修饰键。可选键包括 lctrlrctrllaltraltlsuperrsuper。例如:

bash
# 使用右Ctrl作为快捷键修饰键
 scrcpy --shortcut-mod=rctrl
 
 # 使用左Ctrl或左Super作为快捷键修饰键
-scrcpy --shortcut-mod=lctrl,lsuper

Super 通常是 WindowsCmd 键。

操作快捷键
切换全屏模式MOD+f
向左旋转屏幕MOD+ (左)
向右旋转屏幕MOD+ (右)
水平翻转屏幕MOD+Shift+ (左) | MOD+Shift+ (右)
垂直翻转屏幕MOD+Shift+ (上) | MOD+Shift+ (下)
暂停或恢复显示MOD+z
恢复显示MOD+Shift+z
重置视频捕获/编码MOD+Shift+r
调整窗口至1:1(像素级显示)MOD+g
调整窗口以去除黑边MOD+w | 双击左键¹
点击 HOMEMOD+h | 中键点击
点击 BACKMOD+b | MOD+Backspace | 右键点击²
点击 APP_SWITCHMOD+s | 第4键点击³
点击 MENU(解锁屏幕)⁴MOD+m
点击 VOLUME_UPMOD+ (上)
点击 VOLUME_DOWNMOD+ (下)
点击 POWERMOD+p
开机右键点击²
关闭设备屏幕(保持镜像)MOD+o
打开设备屏幕MOD+Shift+o
旋转设备屏幕MOD+r
展开通知面板MOD+n | 第5键点击³
展开设置面板MOD+n+n | 双击第5键³
折叠面板MOD+Shift+n
复制到剪贴板⁵MOD+c
剪切到剪贴板⁵MOD+x
同步剪贴板并粘贴⁵MOD+v
注入计算机剪贴板文本MOD+Shift+v
打开键盘设置(仅限HID键盘)MOD+k
启用/禁用FPS计数器(输出到stdout)MOD+i
捏合缩放/旋转Ctrl+点击并移动
垂直倾斜(双指滑动)Shift+点击并移动
水平倾斜(双指滑动)Ctrl+Shift+点击并移动
拖放APK文件从电脑安装APK
拖放非APK文件推送文件到设备

¹双击黑边以去除它们。²右键点击会在屏幕关闭时唤醒屏幕,否则执行BACK操作。³第4和第5鼠标按键(如果您的鼠标支持)。⁴对于开发中的React Native应用,MENU 会触发开发菜单。⁵仅在Android 7及以上版本支持。

重复按键的快捷键需要在释放后再次按下该键来执行。例如,执行“展开设置面板”:

  1. 按下并保持按住 MOD
  2. 然后双击 n
  3. 最后释放 MOD

所有 Ctrl+按键 的快捷键会被转发到设备,由当前活动应用处理。

+scrcpy --shortcut-mod=lctrl,lsuper

Super 通常是 WindowsCmd 键。

操作快捷键
切换全屏模式MOD+f
向左旋转屏幕MOD+ (左)
向右旋转屏幕MOD+ (右)
水平翻转屏幕MOD+Shift+ (左) | MOD+Shift+ (右)
垂直翻转屏幕MOD+Shift+ (上) | MOD+Shift+ (下)
暂停或恢复显示MOD+z
恢复显示MOD+Shift+z
重置视频捕获/编码MOD+Shift+r
调整窗口至1:1(像素级显示)MOD+g
调整窗口以去除黑边MOD+w | 双击左键¹
点击 HOMEMOD+h | 中键点击
点击 BACKMOD+b | MOD+Backspace | 右键点击²
点击 APP_SWITCHMOD+s | 第4键点击³
点击 MENU(解锁屏幕)⁴MOD+m
点击 VOLUME_UPMOD+ (上)
点击 VOLUME_DOWNMOD+ (下)
点击 POWERMOD+p
开机右键点击²
关闭设备屏幕(保持镜像)MOD+o
打开设备屏幕MOD+Shift+o
旋转设备屏幕MOD+r
展开通知面板MOD+n | 第5键点击³
展开设置面板MOD+n+n | 双击第5键³
折叠面板MOD+Shift+n
复制到剪贴板⁵MOD+c
剪切到剪贴板⁵MOD+x
同步剪贴板并粘贴⁵MOD+v
注入计算机剪贴板文本MOD+Shift+v
打开键盘设置(仅限HID键盘)MOD+k
启用/禁用FPS计数器(输出到stdout)MOD+i
捏合缩放/旋转Ctrl+点击并移动
垂直倾斜(双指滑动)Shift+点击并移动
水平倾斜(双指滑动)Ctrl+Shift+点击并移动
拖放APK文件从电脑安装APK
拖放非APK文件推送文件到设备

¹双击黑边以去除它们。²右键点击会在屏幕关闭时唤醒屏幕,否则执行BACK操作。³第4和第5鼠标按键(如果您的鼠标支持)。⁴对于开发中的React Native应用,MENU 会触发开发菜单。⁵仅在Android 7及以上版本支持。

重复按键的快捷键需要在释放后再次按下该键来执行。例如,执行“展开设置面板”:

  1. 按下并保持按住 MOD
  2. 然后双击 n
  3. 最后释放 MOD

所有 Ctrl+按键 的快捷键会被转发到设备,由当前活动应用处理。

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/tunnels.html b/zhHans/reference/scrcpy/tunnels.html index 6c6787c0b..48198f4b3 100644 --- a/zhHans/reference/scrcpy/tunnels.html +++ b/zhHans/reference/scrcpy/tunnels.html @@ -6,14 +6,14 @@ Tunnels(隧道连接) | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
Skip to content

隧道连接

Scrcpy 主要用于镜像本地安卓设备。通过隧道技术,可以实现远程设备连接(例如通过互联网)。

要连接远程设备,可以让本地 adb 客户端连接到远程 adb 服务器(需确保双方使用相同版本的 adb 协议)。

远程 ADB 服务器

要连接到远程 adb 服务器,需将服务器设置为监听所有网络接口:

bash
adb kill-server
+    
Skip to content

隧道连接

Scrcpy 主要用于镜像本地安卓设备。通过隧道技术,可以实现远程设备连接(例如通过互联网)。

要连接远程设备,可以让本地 adb 客户端连接到远程 adb 服务器(需确保双方使用相同版本的 adb 协议)。

远程 ADB 服务器

要连接到远程 adb 服务器,需将服务器设置为监听所有网络接口:

bash
adb kill-server
 adb -a nodaemon server start
 # 保持此窗口开启

警告:客户端与 adb 服务器 之间的所有通信均为明文传输。

假设该服务器可通过 IP 地址 192.168.1.2 访问,则在另一终端中运行 scrcpy

bash
# bash 环境
 export ADB_SERVER_SOCKET=tcp:192.168.1.2:5037
@@ -47,15 +47,15 @@
 set ADB_SERVER_SOCKET=tcp:localhost:5038
 scrcpy --force-adb-forward
powershell
# PowerShell 环境
 $env:ADB_SERVER_SOCKET = 'tcp:localhost:5038'
-scrcpy --force-adb-forward

+scrcpy --force-adb-forward

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/v4l2.html b/zhHans/reference/scrcpy/v4l2.html index cda31acf0..cf65490ba 100644 --- a/zhHans/reference/scrcpy/v4l2.html +++ b/zhHans/reference/scrcpy/v4l2.html @@ -6,14 +6,14 @@ Video4Linux(视频流监控) | Escrcpy - + - + - + - + @@ -21,21 +21,21 @@ -
Skip to content

Video4Linux

在 Linux 系统上,可以将视频流发送到 v4l2 回环设备,这样 Android 设备就能像普通摄像头一样被任何支持 v4l2 的工具打开。

需要先安装 v4l2loopback 模块:

bash
sudo apt install v4l2loopback-dkms

创建 v4l2 设备:

bash
sudo modprobe v4l2loopback

这将在 /dev/videoN 路径下创建一个新的视频设备,其中 N 为数字(可通过更多选项创建多个设备或指定设备ID)。

如果在 Chrome/WebRTC 中检测设备时遇到问题,可以尝试 exclusive_caps 模式:

sudo modprobe v4l2loopback exclusive_caps=1

列出已启用的设备:

bash
# 需要安装 v4l-utils 包
+    
Skip to content

Video4Linux

在 Linux 系统上,可以将视频流发送到 v4l2 回环设备,这样 Android 设备就能像普通摄像头一样被任何支持 v4l2 的工具打开。

需要先安装 v4l2loopback 模块:

bash
sudo apt install v4l2loopback-dkms

创建 v4l2 设备:

bash
sudo modprobe v4l2loopback

这将在 /dev/videoN 路径下创建一个新的视频设备,其中 N 为数字(可通过更多选项创建多个设备或指定设备ID)。

如果在 Chrome/WebRTC 中检测设备时遇到问题,可以尝试 exclusive_caps 模式:

sudo modprobe v4l2loopback exclusive_caps=1

列出已启用的设备:

bash
# 需要安装 v4l-utils 包
 v4l2-ctl --list-devices
 
 # 简单方法(通常够用)
 ls /dev/video*

使用 v4l2 接收器启动 scrcpy

bash
scrcpy --v4l2-sink=/dev/videoN
 scrcpy --v4l2-sink=/dev/videoN --no-video-playback  # 禁用播放窗口

(将 N 替换为设备ID,可通过 ls /dev/video* 查看)

启用后,即可使用支持 v4l2 的工具打开视频流:

bash
ffplay -i /dev/videoN
-vlc v4l2:///dev/videoN   # VLC 可能会增加缓冲延迟

例如,可以在 OBS 或视频会议软件中捕获视频。

缓冲

默认情况下不启用视频缓冲,以实现最低延迟。

视频显示类似,可以为 v4l2 流添加缓冲延迟:

bash
scrcpy --v4l2-buffer=300     # 为 v4l2 接收器添加 300ms 缓冲

+vlc v4l2:///dev/videoN # VLC 可能会增加缓冲延迟

例如,可以在 OBS 或视频会议软件中捕获视频。

缓冲

默认情况下不启用视频缓冲,以实现最低延迟。

视频显示类似,可以为 v4l2 流添加缓冲延迟:

bash
scrcpy --v4l2-buffer=300     # 为 v4l2 接收器添加 300ms 缓冲

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/video.html b/zhHans/reference/scrcpy/video.html index 2ca37acf6..bee517077 100644 --- a/zhHans/reference/scrcpy/video.html +++ b/zhHans/reference/scrcpy/video.html @@ -6,14 +6,14 @@ Video(视频) | Escrcpy - + - + - + - + @@ -21,7 +21,7 @@ -
Skip to content

视频

默认情况下,scrcpy 会镜像显示设备屏幕。

也可以选择捕获设备摄像头画面。

详见专门的 摄像头 页面。

尺寸

默认情况下,scrcpy 会尝试以 Android 设备的分辨率进行镜像。

为了提升性能,可以降低分辨率进行镜像。以下命令将宽度和高度限制在最大值(此处为 1024):

bash
scrcpy --max-size=1024
+    
Skip to content

视频

默认情况下,scrcpy 会镜像显示设备屏幕。

也可以选择捕获设备摄像头画面。

详见专门的 摄像头 页面。

尺寸

默认情况下,scrcpy 会尝试以 Android 设备的分辨率进行镜像。

为了提升性能,可以降低分辨率进行镜像。以下命令将宽度和高度限制在最大值(此处为 1024):

bash
scrcpy --max-size=1024
 scrcpy -m 1024   # 简写版本

另一边的尺寸会按比例计算,以保持 Android 设备的宽高比。例如,1920×1080 的设备会被镜像为 1024×576。

如果编码失败,scrcpy 会自动尝试降低分辨率(除非启用了 --no-downsize-on-error)。

对于摄像头镜像,--max-size 值用于选择摄像头源尺寸(在可用分辨率中)。

比特率

默认视频比特率为 8 Mbps。可以通过以下命令修改:

bash
scrcpy --video-bit-rate=2M
 scrcpy --video-bit-rate=2000000  # 等效
 scrcpy -b 2M                     # 简写版本

帧率

可以限制捕获帧率:

bash
scrcpy --max-fps=15

实际捕获帧率可以通过以下命令打印到控制台:

bash
scrcpy --print-fps

也可以通过快捷键 MOD+i 随时启用或禁用(见 快捷键)。

帧率本质上是可变的:只有当屏幕内容发生变化时才会生成新帧。例如,如果在设备上全屏播放 24fps 的视频,scrcpy 的帧率不会超过 24 帧每秒。

编解码器

可以选择视频编解码器,可选值为 h264(默认)、h265av1

bash
scrcpy --video-codec=h264  # 默认
@@ -56,15 +56,15 @@
 scrcpy --v4l2-sink=/dev/video2 --no-video-playback
 
 # 录制视频和音频,但仅播放视频
-scrcpy --record=file.mkv --no-audio-playback

无视频

完全禁用视频转发,仅转发音频:

bash
scrcpy --no-video

Video4Linux

详见专门的 Video4Linux 页面。

+scrcpy --record=file.mkv --no-audio-playback

无视频

完全禁用视频转发,仅转发音频:

bash
scrcpy --no-video

Video4Linux

详见专门的 Video4Linux 页面。

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/virtual_display.html b/zhHans/reference/scrcpy/virtual_display.html index d533567d9..9f48c3fdd 100644 --- a/zhHans/reference/scrcpy/virtual_display.html +++ b/zhHans/reference/scrcpy/virtual_display.html @@ -6,14 +6,14 @@ VirtualDisplay(虚拟显示) | Escrcpy - + - + - + - + @@ -21,19 +21,19 @@ -
Skip to content

虚拟显示屏

新建虚拟显示屏

将画面镜像到新建的虚拟显示屏(而非设备主屏幕):

bash
scrcpy --new-display=1920x1080
+    
Skip to content

虚拟显示屏

新建虚拟显示屏

将画面镜像到新建的虚拟显示屏(而非设备主屏幕):

bash
scrcpy --new-display=1920x1080
 scrcpy --new-display=1920x1080/420  # 强制设为420 dpi
 scrcpy --new-display         # 使用主屏幕尺寸和像素密度
 scrcpy --new-display=/240    # 使用主屏幕尺寸和240 dpi

虚拟显示屏会在程序退出时销毁。

启动应用

部分设备会在虚拟显示屏中显示启动器。

若设备未提供启动器(或通过 --no-vd-system-decorations 参数显式禁用),虚拟显示屏将显示空白内容。此时需要启动安卓应用

例如:

bash
scrcpy --new-display=1920x1080 --start-app=org.videolan.vlc

也可以直接启动启动器应用。例如运行开源启动器 Fossify Launcher

bash
scrcpy --new-display=1920x1080 --no-vd-system-decorations --start-app=org.fossify.home

系统装饰

默认启用虚拟显示屏的系统装饰元素。禁用请使用 --no-vd-system-decorations

bash
scrcpy --new-display --no-vd-system-decorations

该参数适用于解决某些设备可能出现的UI异常,或禁用虚拟显示屏中默认的启动器界面。

注意:若未启动任何应用,虚拟显示屏将不会渲染任何内容,因此不会产生视频帧。

关闭时销毁

默认情况下,关闭虚拟显示屏时,正在运行的应用会被销毁。

若要将应用转移至主屏幕显示,请使用:

bash
scrcpy --new-display --no-vd-destroy-content

输入法策略

默认情况下,虚拟显示屏的输入法会显示在默认屏幕上。

若要在本地显示屏显示输入法,请使用 --display-ime-policy=local

bash
scrcpy --display-id=1 --display-ime-policy=local
-scrcpy --new-display --display-ime-policy=local

+scrcpy --new-display --display-ime-policy=local

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/window.html b/zhHans/reference/scrcpy/window.html index c38adde4f..6b8e91874 100644 --- a/zhHans/reference/scrcpy/window.html +++ b/zhHans/reference/scrcpy/window.html @@ -6,14 +6,14 @@ Window(窗口控制) | Escrcpy - + - + - + - + @@ -21,17 +21,17 @@ -
Skip to content

窗口设置

禁用窗口显示

如需禁用窗口显示(适用于仅需录制或播放音频的场景):

bash
scrcpy --no-window --record=file.mp4
+    
Skip to content

窗口设置

禁用窗口显示

如需禁用窗口显示(适用于仅需录制或播放音频的场景):

bash
scrcpy --no-window --record=file.mp4
 # 按Ctrl+C终止录制

窗口标题

默认窗口标题为设备型号,可通过以下命令修改:

bash
scrcpy --window-title='我的设备'

位置与尺寸

可指定窗口初始位置和尺寸:

bash
scrcpy --window-x=100 --window-y=100 --window-width=800 --window-height=600

无边框模式

禁用窗口装饰边框:

bash
scrcpy --window-borderless

窗口置顶

保持窗口始终在最前端显示:

bash
scrcpy --always-on-top

全屏模式

直接以全屏模式启动:

bash
scrcpy --fullscreen
-scrcpy -f   # 简写形式

全屏模式可通过快捷键 MOD+f 动态切换(参见快捷键说明)。

禁用屏幕保护

默认情况下,scrcpy 不会阻止计算机进入屏幕保护状态。如需禁用:

bash
scrcpy --disable-screensaver

+scrcpy -f # 简写形式

全屏模式可通过快捷键 MOD+f 动态切换(参见快捷键说明)。

禁用屏幕保护

默认情况下,scrcpy 不会阻止计算机进入屏幕保护状态。如需禁用:

bash
scrcpy --disable-screensaver

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file diff --git a/zhHans/reference/scrcpy/windows.html b/zhHans/reference/scrcpy/windows.html index 60cdc5155..bb4464c62 100644 --- a/zhHans/reference/scrcpy/windows.html +++ b/zhHans/reference/scrcpy/windows.html @@ -6,14 +6,14 @@ Windows(平台指南) | Escrcpy - + - + - + - + @@ -21,17 +21,17 @@ -
Skip to content

Windows 平台指南

安装

官方发布版本

下载最新版本

下载后解压即可。

通过包管理器安装

使用 WinGet(将同时安装ADB和其他依赖项):

bash
winget install --exact Genymobile.scrcpy

使用 Chocolatey

bash
choco install scrcpy
+    
Skip to content

Windows 平台指南

安装

官方发布版本

下载最新版本

下载后解压即可。

通过包管理器安装

使用 WinGet(将同时安装ADB和其他依赖项):

bash
winget install --exact Genymobile.scrcpy

使用 Chocolatey

bash
choco install scrcpy
 choco install adb    # 如果尚未安装ADB

使用 Scoop

bash
scoop install scrcpy
-scoop install adb    # 如果尚未安装ADB

如需手动构建和安装应用,请参阅 build

运行

请确保您的设备满足先决条件

Scrcpy是一个命令行应用程序,主要设计为通过终端带参数执行。

在scrcpy目录中双击open_a_terminal_here.bat文件,即可在指定位置打开终端,然后输入命令。例如,不带参数运行:

bash
scrcpy

或带参数运行(以下示例禁用音频并录制到file.mkv):

bash
scrcpy --no-audio --record=file.mkv

命令行参数的文档可通过以下方式查看:

若需直接启动scrcpy而无需打开终端,可双击以下文件之一:

  • scrcpy-console.bat:启动时打开终端(scrcpy终止后终端会关闭,除非发生错误);
  • scrcpy-noconsole.vbs:启动时不显示终端(但错误信息将不可见)。

避免直接双击scrcpy.exe文件:若发生错误,终端会立即关闭,您将无法查看错误信息(该程序设计为通过终端运行)。请使用scrcpy-console.bat替代。

如果希望固定使用某些参数,可以创建一个myscrcpy.bat文件(需先显示文件扩展名以避免混淆),内容为您的命令。例如:

bash
scrcpy --prefer-text --turn-screen-off --stay-awake

之后双击该文件即可运行。您也可以编辑(或复制)scrcpy-console.batscrcpy-noconsole.vbs文件,添加所需的参数。

+scoop install adb # 如果尚未安装ADB

如需手动构建和安装应用,请参阅 build

运行

请确保您的设备满足先决条件

Scrcpy是一个命令行应用程序,主要设计为通过终端带参数执行。

在scrcpy目录中双击open_a_terminal_here.bat文件,即可在指定位置打开终端,然后输入命令。例如,不带参数运行:

bash
scrcpy

或带参数运行(以下示例禁用音频并录制到file.mkv):

bash
scrcpy --no-audio --record=file.mkv

命令行参数的文档可通过以下方式查看:

若需直接启动scrcpy而无需打开终端,可双击以下文件之一:

  • scrcpy-console.bat:启动时打开终端(scrcpy终止后终端会关闭,除非发生错误);
  • scrcpy-noconsole.vbs:启动时不显示终端(但错误信息将不可见)。

避免直接双击scrcpy.exe文件:若发生错误,终端会立即关闭,您将无法查看错误信息(该程序设计为通过终端运行)。请使用scrcpy-console.bat替代。

如果希望固定使用某些参数,可以创建一个myscrcpy.bat文件(需先显示文件扩展名以避免混淆),内容为您的命令。例如:

bash
scrcpy --prefer-text --turn-screen-off --stay-awake

之后双击该文件即可运行。您也可以编辑(或复制)scrcpy-console.batscrcpy-noconsole.vbs文件,添加所需的参数。

Views 0, Visitors 0
TodayViews 0, TodayVisitors 0
-

- +

+ \ No newline at end of file