From 2fd5b7138156ad2b3d2d70504a3d971977cfbc1a Mon Sep 17 00:00:00 2001 From: bittin1ddc447d824349b2 Date: Mon, 17 Jun 2024 04:21:36 +0000 Subject: [PATCH 001/844] Translated using Weblate (Swedish) Currently translated at 100.0% (84 of 84 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/sv/ --- assets/lang/sv-SE.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/lang/sv-SE.json b/assets/lang/sv-SE.json index 0bb1f4a..37cb937 100644 --- a/assets/lang/sv-SE.json +++ b/assets/lang/sv-SE.json @@ -74,13 +74,13 @@ "settings-spellcheck": "Stavningskontroll", "settings-spellcheck-desc": "Hjälper dig att rätta till misstavda ord genom att markera dem.", "setup_question5": "Vill du använda en ikon i systembrickan?", - "settings-mintoTray": "Minimera till systembrickan", + "settings-mintoTray": "Kör i bakgrunden", "settings-mintoTray-desc": "Ifall inaktiverad, Så kommer ArmCord stängas likadant som andra fönster, annar så kommer den hänga \n i din system tray tills vidare.", - "settings-theme-desc4": "transparent fönster med inbyggt titelfält, du behöver ett kompatibelt tema för detta. Windows specifikt.", + "settings-theme-desc4": "transparent fönster med inbyggt titelfält, du behöver ett kompatibelt tema för detta.", "settings-MultiInstance": "Multi instans", "settings-MultiInstance-desc": "När detta är aktiverat kommer du att kunna starta många instanser av ArmCord.", "settings-copyGPUInfo": "Kopiera GPU information", "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll": "Använd mjuk rullning", + "settings-smoothScroll-desc": "Växla mjuk rullning" } From 344f01f136e76ea2512b337f9f275f9dd52f6471 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sat, 22 Jun 2024 21:18:17 +0200 Subject: [PATCH 002/844] fix: theme manager --- src/discord/ipc.ts | 5 +- src/themeManager/main.ts | 67 ++++++++++++-------------- src/themeManager/preload.mts | 92 ++++++++++++++++++------------------ 3 files changed, 77 insertions(+), 87 deletions(-) diff --git a/src/discord/ipc.ts b/src/discord/ipc.ts index fae7e9f..535fbd0 100644 --- a/src/discord/ipc.ts +++ b/src/discord/ipc.ts @@ -1,7 +1,5 @@ //ipc stuff -import {app, clipboard, desktopCapturer, ipcMain, nativeImage, shell, SourcesOptions} from "electron"; -import {BrowserWindow} from "electron"; - +import {app, clipboard, desktopCapturer, ipcMain, nativeImage, shell, SourcesOptions, BrowserWindow} from "electron"; import os from "os"; import fs from "fs"; import path from "path"; @@ -128,7 +126,6 @@ export function registerIpc(passedWindow: BrowserWindow): void { ipcMain.on("mobileMode", (event) => { event.returnValue = getConfig("mobileMode"); }); - // REVIEW - I don't see a reason to await the actual action of running the settings window. The user cannot open more than one anyway, as defined in the function. ipcMain.on("openSettingsWindow", () => { void createSettingsWindow(); }); diff --git a/src/themeManager/main.ts b/src/themeManager/main.ts index c7c8c84..11b063a 100644 --- a/src/themeManager/main.ts +++ b/src/themeManager/main.ts @@ -109,9 +109,6 @@ export async function createTManagerWindow(): Promise { } }); - async function managerLoadPage(): Promise { - await themeWindow.loadFile(`${import.meta.dirname}/manager.html`); - } const userDataPath = app.getPath("userData"); const themesFolder = `${userDataPath}/themes/`; if (!fs.existsSync(themesFolder)) { @@ -129,13 +126,13 @@ export async function createTManagerWindow(): Promise { mainWindow.webContents.reload(); }); }); - ipcMain.on("addToDisabled", (_event, name: string) => { + ipcMain.on("addToDisabled", async (_event, name: string) => { fs.appendFileSync(path.join(userDataPath, "/disabled.txt"), `${name}\n`); }); ipcMain.on("disabled", (e) => { e.returnValue = fs.readFileSync(path.join(userDataPath, "/disabled.txt")).toString(); }); - ipcMain.on("removeFromDisabled", (_event, name: string) => { + ipcMain.on("removeFromDisabled", async (_event, name: string) => { const e = fs.readFileSync(path.join(userDataPath, "/disabled.txt")).toString(); fs.writeFileSync(path.join(userDataPath, "/disabled.txt"), e.replace(name, "")); }); @@ -153,37 +150,35 @@ export async function createTManagerWindow(): Promise { mainWindow.webContents.reload(); }); }); - ipcMain.on("installBDTheme", (_event, link: string) => { - return async () => { - try { - const code = await (await fetch(link)).text(); - const manifest = parseBDManifest(code); - const themePath = path.join(themesFolder, `${manifest.name?.replace(" ", "-")}-BD`); - if (!fs.existsSync(themePath)) { - fs.mkdirSync(themePath); - console.log(`Created ${manifest.name} folder`); - } - manifest.updateSrc = link; - if (code.includes(".titlebar")) manifest.supportsArmCordTitlebar = true; - else manifest.supportsArmCordTitlebar = false; - fs.writeFileSync(path.join(themePath, "manifest.json"), JSON.stringify(manifest)); - fs.writeFileSync(path.join(themePath, "src.css"), code); - dialog.showMessageBoxSync({ - type: "info", - title: "BD Theme import success", - message: "Successfully imported theme from link." - }); - themeWindow.webContents.reload(); - mainWindows.forEach((mainWindow) => { - mainWindow.webContents.reload(); - }); - } catch (e) { - dialog.showErrorBox( - "BD Theme import fail", - "Failed to import theme from link. Please make sure that it's a valid BetterDiscord Theme." - ); + ipcMain.on("installBDTheme", async (_event, link: string) => { + try { + const code = await (await fetch(link)).text(); + const manifest = parseBDManifest(code); + const themePath = path.join(themesFolder, `${manifest.name?.replace(" ", "-")}-BD`); + if (!fs.existsSync(themePath)) { + fs.mkdirSync(themePath); + console.log(`Created ${manifest.name} folder`); } - }; + manifest.updateSrc = link; + if (code.includes(".titlebar")) manifest.supportsArmCordTitlebar = true; + else manifest.supportsArmCordTitlebar = false; + fs.writeFileSync(path.join(themePath, "manifest.json"), JSON.stringify(manifest)); + fs.writeFileSync(path.join(themePath, "src.css"), code); + dialog.showMessageBoxSync({ + type: "info", + title: "BD Theme import success", + message: "Successfully imported theme from link." + }); + themeWindow.webContents.reload(); + mainWindows.forEach((mainWindow) => { + mainWindow.webContents.reload(); + }); + } catch (e) { + dialog.showErrorBox( + "BD Theme import fail", + "Failed to import theme from link. Please make sure that it's a valid BetterDiscord Theme." + ); + } }); themeWindow.webContents.on("did-finish-load", () => { fs.readdirSync(themesFolder).forEach((file) => { @@ -197,7 +192,7 @@ export async function createTManagerWindow(): Promise { }); }); - await managerLoadPage(); + await themeWindow.loadFile(`${import.meta.dirname}/manager.html`); themeWindow.on("close", () => { instance = 0; }); diff --git a/src/themeManager/preload.mts b/src/themeManager/preload.mts index 1da3130..f11c95c 100644 --- a/src/themeManager/preload.mts +++ b/src/themeManager/preload.mts @@ -5,16 +5,15 @@ contextBridge.exposeInMainWorld("themes", { install: (url: string) => ipcRenderer.send("installBDTheme", url), uninstall: (id: string) => ipcRenderer.send("uninstallTheme", id) }); -ipcRenderer.on("themeManifest", (_event, json: string) => { - async () => { - const manifest = JSON.parse(json) as ThemeManifest; - console.log(manifest); - await sleep(1000); // REVIEW - This is all that requires async, would be nice if it could be removed. - const e = document.getElementById("cardBox"); - const id = manifest.name.replace(" ", "-"); - e?.insertAdjacentHTML( - "beforeend", - ` +ipcRenderer.on("themeManifest", async (_event, json: string) => { + const manifest = JSON.parse(json) as ThemeManifest; + console.log(manifest); + await sleep(1000); // REVIEW - This is all that requires async, would be nice if it could be removed. + const e = document.getElementById("cardBox"); + const id = manifest.name.replace(" ", "-"); + e?.insertAdjacentHTML( + "beforeend", + `

${manifest.name}

@@ -24,47 +23,46 @@ ipcRenderer.on("themeManifest", (_event, json: string) => {

${manifest.description}

` - ); - document.getElementById(`${id}header`)!.addEventListener("click", () => { - document.getElementById("themeInfoModal")!.style.display = "block"; - document.getElementById("themeInfoName")!.textContent = `${manifest.name} by ${manifest.author}`; - document.getElementById("themeInfoDesc")!.textContent = `${manifest.description}\n\n${manifest.version}`; - if (manifest.supportsArmCordTitlebar !== undefined) { - document.getElementById("themeInfoButtons")!.innerHTML += - ` + ); + document.getElementById(`${id}header`)!.addEventListener("click", () => { + document.getElementById("themeInfoModal")!.style.display = "block"; + document.getElementById("themeInfoName")!.textContent = `${manifest.name} by ${manifest.author}`; + document.getElementById("themeInfoDesc")!.textContent = `${manifest.description}\n\n${manifest.version}`; + if (manifest.supportsArmCordTitlebar !== undefined) { + document.getElementById("themeInfoButtons")!.innerHTML += + ` `; - console.log("e"); - if (manifest.supportsArmCordTitlebar == true) { - (document.getElementById(`compatibility`) as HTMLImageElement).src = - "https://raw.githubusercontent.com/ArmCord/BrandingStuff/main/Window.png"; - } else { - (document.getElementById(`compatibility`) as HTMLImageElement).src = - "https://raw.githubusercontent.com/ArmCord/BrandingStuff/main/WindowUnsupported.png"; - } - } - if (manifest.source != undefined) - document.getElementById("themeInfoButtons")!.innerHTML += - `Source code`; - if (manifest.website != undefined) - document.getElementById("themeInfoButtons")!.innerHTML += - `Website`; - if (manifest.invite != undefined) - document.getElementById("themeInfoButtons")!.innerHTML += - `Support Discord`; - }); - if (!(ipcRenderer.sendSync("disabled") as string[]).includes(id)) { - (document.getElementById(id) as HTMLInputElement).checked = true; - } - (document.getElementById(id) as HTMLInputElement).addEventListener("input", function () { - ipcRenderer.send("reloadMain"); - if (this.checked) { - ipcRenderer.send("removeFromDisabled", id); + console.log("e"); + if (manifest.supportsArmCordTitlebar == true) { + (document.getElementById(`compatibility`) as HTMLImageElement).src = + "https://raw.githubusercontent.com/ArmCord/BrandingStuff/main/Window.png"; } else { - ipcRenderer.send("addToDisabled", id); + (document.getElementById(`compatibility`) as HTMLImageElement).src = + "https://raw.githubusercontent.com/ArmCord/BrandingStuff/main/WindowUnsupported.png"; } - }); - }; + } + if (manifest.source != undefined) + document.getElementById("themeInfoButtons")!.innerHTML += + `Source code`; + if (manifest.website != undefined) + document.getElementById("themeInfoButtons")!.innerHTML += + `Website`; + if (manifest.invite != undefined) + document.getElementById("themeInfoButtons")!.innerHTML += + `Support Discord`; + }); + if (!(ipcRenderer.sendSync("disabled") as string[]).includes(id)) { + (document.getElementById(id) as HTMLInputElement).checked = true; + } + (document.getElementById(id) as HTMLInputElement).addEventListener("input", function () { + ipcRenderer.send("reloadMain"); + if (this.checked) { + ipcRenderer.send("removeFromDisabled", id); + } else { + ipcRenderer.send("addToDisabled", id); + } + }); }); document.addEventListener("DOMContentLoaded", () => { document.getElementsByClassName("close")[0].addEventListener("click", () => { From 6404c97a0db80cef1e40b3eae1c9911eff2dc55e Mon Sep 17 00:00:00 2001 From: Aiden Date: Tue, 25 Jun 2024 16:30:42 -0400 Subject: [PATCH 003/844] Chore: Update Packages Bugfix: Properly configure prettier + ESLint --- eslint.config.js | 11 +- package.json | 21 +-- pnpm-lock.yaml | 366 +++++++++++++++++++++++++---------------------- 3 files changed, 208 insertions(+), 190 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index 27235c6..cb6e6f6 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -3,15 +3,16 @@ import eslint from "@eslint/js"; import tseslint from "typescript-eslint"; -import prettier from "eslint-plugin-prettier"; +import prettier from "eslint-plugin-prettier/recommended"; import n from "eslint-plugin-n"; export default tseslint.config( eslint.configs.recommended, - {ignores: ["ts-out", "src/discord/content/js"]}, // REVIEW - investigate discord files a bit before finalizing this - I think these are meant to be run in the app console, and this would be difficult to type + {ignores: ["ts-out", "src/discord/content/js"]}, ...tseslint.configs.recommendedTypeChecked, ...tseslint.configs.stylisticTypeChecked, n.configs["flat/recommended"], + prettier, { settings: { n: { @@ -20,7 +21,6 @@ export default tseslint.config( } }, plugins: { - prettier, n }, languageOptions: { @@ -29,7 +29,6 @@ export default tseslint.config( tsconfigRootDir: import.meta.dirname } }, - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment rules: { "no-constant-binary-expression": 0, "n/no-unsupported-features/node-builtins": 1, @@ -40,9 +39,7 @@ export default tseslint.config( varsIgnorePattern: "^_", caughtErrorsIgnorePattern: "^_" } - ], - // @ts-expect-error - Don't worry about it - ...prettier.configs.recommended.rules + ] } } ); diff --git a/package.json b/package.json index 1584342..e9d3d97 100644 --- a/package.json +++ b/package.json @@ -31,19 +31,20 @@ }, "homepage": "https://github.com/armcord/armcord#readme", "devDependencies": { - "@eslint/js": "^9.4.0", + "@eslint/js": "^9.5.0", "@types/eslint__js": "^8.42.3", - "@types/node": "^20.14.2", + "@types/node": "^20.14.8", "@types/ws": "^8.5.10", "copyfiles": "^2.4.1", - "electron": "30.1.1", + "electron": "31.0.2", "electron-builder": "25.0.0-alpha.9", - "eslint": "^9.4.0", - "eslint-plugin-n": "^17.8.1", + "eslint": "^9.5.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-n": "^17.9.0", "eslint-plugin-prettier": "^5.1.3", - "prettier": "^3.3.1", - "typescript": "^5.4.5", - "typescript-eslint": "^7.12.0" + "prettier": "^3.3.2", + "typescript": "^5.5.2", + "typescript-eslint": "^7.14.1" }, "dependencies": { "arrpc": "github:OpenAsar/arrpc#c62ec6a04c8d870530aa6944257fe745f6c59a24", @@ -52,7 +53,7 @@ "electron-is-dev": "^3.0.1", "extract-zip": "^2.0.1", "v8-compile-cache": "^2.4.0", - "ws": "^8.17.0" + "ws": "^8.17.1" }, "build": { "snap": { @@ -95,6 +96,6 @@ "applicationId": "smartfrigde.ArmCord" } }, - "packageManager": "pnpm@9.2.0", + "packageManager": "pnpm@9.4.0", "package-manager-strict": false } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 23cbe5f..258b02c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,18 +27,18 @@ importers: specifier: ^2.4.0 version: 2.4.0 ws: - specifier: ^8.17.0 - version: 8.17.0 + specifier: ^8.17.1 + version: 8.17.1 devDependencies: '@eslint/js': - specifier: ^9.4.0 - version: 9.4.0 + specifier: ^9.5.0 + version: 9.5.0 '@types/eslint__js': specifier: ^8.42.3 version: 8.42.3 '@types/node': - specifier: ^20.14.2 - version: 20.14.2 + specifier: ^20.14.8 + version: 20.14.8 '@types/ws': specifier: ^8.5.10 version: 8.5.10 @@ -46,29 +46,32 @@ importers: specifier: ^2.4.1 version: 2.4.1 electron: - specifier: 30.1.1 - version: 30.1.1 + specifier: 31.0.2 + version: 31.0.2 electron-builder: specifier: 25.0.0-alpha.9 version: 25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9)) eslint: - specifier: ^9.4.0 - version: 9.4.0 + specifier: ^9.5.0 + version: 9.5.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@9.5.0) eslint-plugin-n: - specifier: ^17.8.1 - version: 17.8.1(eslint@9.4.0) + specifier: ^17.9.0 + version: 17.9.0(eslint@9.5.0) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.1.3(@types/eslint@8.56.10)(eslint@9.4.0)(prettier@3.3.1) + version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.5.0))(eslint@9.5.0)(prettier@3.3.2) prettier: - specifier: ^3.3.1 - version: 3.3.1 + specifier: ^3.3.2 + version: 3.3.2 typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.5.2 + version: 5.5.2 typescript-eslint: - specifier: ^7.12.0 - version: 7.12.0(eslint@9.4.0)(typescript@5.4.5) + specifier: ^7.14.1 + version: 7.14.1(eslint@9.5.0)(typescript@5.5.2) packages: @@ -116,20 +119,20 @@ packages: resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.15.1': - resolution: {integrity: sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==} + '@eslint/config-array@0.16.0': + resolution: {integrity: sha512-/jmuSd74i4Czf1XXn7wGRWZCuyaUZ330NH1Bek0Pplatt4Sy1S5haN21SCLLdbeKslQ+S0wEJ+++v5YibSi+Lg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.1.0': resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.4.0': - resolution: {integrity: sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==} + '@eslint/js@9.5.0': + resolution: {integrity: sha512-A7+AOT2ICkodvtsWnxZP4Xxk3NbZ3VMHd8oihydLRGrJgqqdEz1qSeEgXYyT/Cu8h1TWWsQRejIx48mtjZ5y1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.3': - resolution: {integrity: sha512-HAbhAYKfsAC2EkTqve00ibWIZlaU74Z1EHwAjYr4PXF0YU2VEA1zSIKSSpKszRLRWwHzzRZXvK632u+uXzvsvw==} + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@gar/promisify@1.1.3': @@ -226,8 +229,8 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@20.14.2': - resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==} + '@types/node@20.14.8': + resolution: {integrity: sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==} '@types/plist@3.0.5': resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} @@ -244,8 +247,8 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@7.12.0': - resolution: {integrity: sha512-7F91fcbuDf/d3S8o21+r3ZncGIke/+eWk0EpO21LXhDfLahriZF9CGj4fbAetEjlaBdjdSm9a6VeXbpbT6Z40Q==} + '@typescript-eslint/eslint-plugin@7.14.1': + resolution: {integrity: sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -255,8 +258,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.12.0': - resolution: {integrity: sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==} + '@typescript-eslint/parser@7.14.1': + resolution: {integrity: sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -265,12 +268,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@7.12.0': - resolution: {integrity: sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==} + '@typescript-eslint/scope-manager@7.14.1': + resolution: {integrity: sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.12.0': - resolution: {integrity: sha512-lib96tyRtMhLxwauDWUp/uW3FMhLA6D0rJ8T7HmH7x23Gk1Gwwu8UZ94NMXBvOELn6flSPiBrCKlehkiXyaqwA==} + '@typescript-eslint/type-utils@7.14.1': + resolution: {integrity: sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -279,12 +282,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@7.12.0': - resolution: {integrity: sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==} + '@typescript-eslint/types@7.14.1': + resolution: {integrity: sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@7.12.0': - resolution: {integrity: sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==} + '@typescript-eslint/typescript-estree@7.14.1': + resolution: {integrity: sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -292,14 +295,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@7.12.0': - resolution: {integrity: sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ==} + '@typescript-eslint/utils@7.14.1': + resolution: {integrity: sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.12.0': - resolution: {integrity: sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==} + '@typescript-eslint/visitor-keys@7.14.1': + resolution: {integrity: sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==} engines: {node: ^18.18.0 || >=20.0.0} '@xmldom/xmldom@0.8.10': @@ -314,8 +317,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} engines: {node: '>=0.4.0'} hasBin: true @@ -703,8 +706,8 @@ packages: electron-publish@25.0.0-alpha.9: resolution: {integrity: sha512-vdqOXtCjrO72sZCB8hfvd8ZTKmUvWMLQ/f78Qe0UH4B+dCShtHnqbUM9Ed1Igsaw0svm2+cW+ce2yVZglr2Z3A==} - electron@30.1.1: - resolution: {integrity: sha512-D9blhgVoNx82Nsbms+ufX/Az/yJAulkrHZh0CM7hL79TvG35mqJFMNjh8GlJSRK42rVGNGyH3NfhS0VRaGCPcw==} + electron@31.0.2: + resolution: {integrity: sha512-55efQ5yfLN+AQHcFC00AXQqtxC3iAGaxX2GQ3EDbFJ0ca9GHNOdSXkcrdBElLleiDrR2hpXNkQxN1bDn0oxe6w==} engines: {node: '>= 12.20.55'} hasBin: true @@ -767,14 +770,20 @@ packages: peerDependencies: eslint: '>=6.0.0' + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + eslint-plugin-es-x@7.7.0: resolution: {integrity: sha512-aP3qj8BwiEDPttxQkZdI221DLKq9sI/qHolE2YSQL1/9+xk7dTV+tB1Fz8/IaCA+lnLA1bDEnvaS2LKs0k2Uig==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' - eslint-plugin-n@17.8.1: - resolution: {integrity: sha512-KdG0h0voZms8UhndNu8DeWx1eM4sY+A4iXtsNo6kOfJLYHNeTGPacGalJ9GcvrbmOL3r/7QOMwVZDSw+1SqsrA==} + eslint-plugin-n@17.9.0: + resolution: {integrity: sha512-CPSaXDXdrT4nsrOrO4mT4VB6FMUkoySRkHWuuJJHVqsIEjIeZgMY1H7AzSwPbDScikBmLN82KeM1u7ixV7PzGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' @@ -805,13 +814,13 @@ packages: resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.4.0: - resolution: {integrity: sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA==} + eslint@9.5.0: + resolution: {integrity: sha512-+NAOZFrW/jFTS3dASCGBxX1pkFD0/fsO+hfAkJ4TyYKwgsXZbqzrw+seCYFCcPCYXvnD67tAnglU7GQTz6kcVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true - espree@10.0.1: - resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} + espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.5.0: @@ -894,8 +903,8 @@ packages: flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} form-data@4.0.0: @@ -963,8 +972,8 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.1: - resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} + glob@10.4.2: + resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} engines: {node: '>=16 || 14 >=14.18'} hasBin: true @@ -985,8 +994,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.4.0: - resolution: {integrity: sha512-unnwvMZpv0eDUyjNyh9DH/yxUaRYrEjW/qK4QcdrHg3oO11igUQrCSgODHEqxlKg8v2CD2Sd7UkqqEBoz5U7TQ==} + globals@15.6.0: + resolution: {integrity: sha512-UzcJi88Hw//CurUIRa9Jxb0vgOCcuD/MNjwmXp633cyaRKkCWACkoqHCtfZv43b1kqXGg/fpOa8bwgacCeXsVg==} engines: {node: '>=18'} globalthis@1.0.4: @@ -1363,8 +1372,8 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - node-abi@3.63.0: - resolution: {integrity: sha512-vAszCsOUrUxjGAmdnM/pq7gUgie0IRteCQMX6d4A534fQCR93EJU5qgzBvU6EkFfK27s0T3HEV3BOyJIr7OMYw==} + node-abi@3.65.0: + resolution: {integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==} engines: {node: '>=10'} node-addon-api@1.7.2: @@ -1443,6 +1452,9 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1490,8 +1502,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier@3.3.1: - resolution: {integrity: sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg==} + prettier@3.3.2: + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} engines: {node: '>=14'} hasBin: true @@ -1801,8 +1813,8 @@ packages: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} - typescript-eslint@7.12.0: - resolution: {integrity: sha512-D6HKNbQcnNu3BaN4HkQCR16tgG8Q2AMUWPgvhrJksOXu+d6ys07yC06ONiV2kcsEfWC22voB6C3PvK2MqlBZ7w==} + typescript-eslint@7.14.1: + resolution: {integrity: sha512-Eo1X+Y0JgGPspcANKjeR6nIqXl4VL5ldXLc15k4m9upq+eY5fhU2IueiEZL6jmHrKH8aCfbIvM/v3IrX5Hg99w==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1811,8 +1823,8 @@ packages: typescript: optional: true - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + typescript@5.5.2: + resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} engines: {node: '>=14.17'} hasBin: true @@ -1891,8 +1903,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2001,7 +2013,7 @@ snapshots: detect-libc: 2.0.3 fs-extra: 10.1.0 got: 11.8.6 - node-abi: 3.63.0 + node-abi: 3.65.0 node-api-version: 0.2.0 node-gyp: 9.4.1 ora: 5.4.1 @@ -2025,16 +2037,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint-community/eslint-utils@4.4.0(eslint@9.4.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.5.0)': dependencies: - eslint: 9.4.0 + eslint: 9.5.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.10.1': {} - '@eslint/config-array@0.15.1': + '@eslint/config-array@0.16.0': dependencies: - '@eslint/object-schema': 2.1.3 + '@eslint/object-schema': 2.1.4 debug: 4.3.5 minimatch: 3.1.2 transitivePeerDependencies: @@ -2044,7 +2056,7 @@ snapshots: dependencies: ajv: 6.12.6 debug: 4.3.5 - espree: 10.0.1 + espree: 10.1.0 globals: 14.0.0 ignore: 5.3.1 import-fresh: 3.3.0 @@ -2054,9 +2066,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.4.0': {} + '@eslint/js@9.5.0': {} - '@eslint/object-schema@2.1.3': {} + '@eslint/object-schema@2.1.4': {} '@gar/promisify@1.1.3': {} @@ -2125,7 +2137,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.14.2 + '@types/node': 20.14.8 '@types/responselike': 1.0.3 '@types/debug@4.1.12': @@ -2145,7 +2157,7 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 20.14.2 + '@types/node': 20.14.8 '@types/http-cache-semantics@4.0.4': {} @@ -2153,126 +2165,126 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 20.14.2 + '@types/node': 20.14.8 '@types/ms@0.7.34': {} - '@types/node@20.14.2': + '@types/node@20.14.8': dependencies: undici-types: 5.26.5 '@types/plist@3.0.5': dependencies: - '@types/node': 20.14.2 + '@types/node': 20.14.8 xmlbuilder: 15.1.1 optional: true '@types/responselike@1.0.3': dependencies: - '@types/node': 20.14.2 + '@types/node': 20.14.8 '@types/verror@1.10.10': optional: true '@types/ws@8.5.10': dependencies: - '@types/node': 20.14.2 + '@types/node': 20.14.8 '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.14.2 + '@types/node': 20.14.8 optional: true - '@typescript-eslint/eslint-plugin@7.12.0(@typescript-eslint/parser@7.12.0(eslint@9.4.0)(typescript@5.4.5))(eslint@9.4.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(typescript@5.5.2)': dependencies: '@eslint-community/regexpp': 4.10.1 - '@typescript-eslint/parser': 7.12.0(eslint@9.4.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.12.0 - '@typescript-eslint/type-utils': 7.12.0(eslint@9.4.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.12.0(eslint@9.4.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.12.0 - eslint: 9.4.0 + '@typescript-eslint/parser': 7.14.1(eslint@9.5.0)(typescript@5.5.2) + '@typescript-eslint/scope-manager': 7.14.1 + '@typescript-eslint/type-utils': 7.14.1(eslint@9.5.0)(typescript@5.5.2) + '@typescript-eslint/utils': 7.14.1(eslint@9.5.0)(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 7.14.1 + eslint: 9.5.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.4.5) + ts-api-utils: 1.3.0(typescript@5.5.2) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.12.0(eslint@9.4.0)(typescript@5.4.5)': + '@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.5.2)': dependencies: - '@typescript-eslint/scope-manager': 7.12.0 - '@typescript-eslint/types': 7.12.0 - '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.12.0 + '@typescript-eslint/scope-manager': 7.14.1 + '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 7.14.1 debug: 4.3.5 - eslint: 9.4.0 + eslint: 9.5.0 optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.12.0': + '@typescript-eslint/scope-manager@7.14.1': dependencies: - '@typescript-eslint/types': 7.12.0 - '@typescript-eslint/visitor-keys': 7.12.0 + '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/visitor-keys': 7.14.1 - '@typescript-eslint/type-utils@7.12.0(eslint@9.4.0)(typescript@5.4.5)': + '@typescript-eslint/type-utils@7.14.1(eslint@9.5.0)(typescript@5.5.2)': dependencies: - '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.12.0(eslint@9.4.0)(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) + '@typescript-eslint/utils': 7.14.1(eslint@9.5.0)(typescript@5.5.2) debug: 4.3.5 - eslint: 9.4.0 - ts-api-utils: 1.3.0(typescript@5.4.5) + eslint: 9.5.0 + ts-api-utils: 1.3.0(typescript@5.5.2) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.12.0': {} + '@typescript-eslint/types@7.14.1': {} - '@typescript-eslint/typescript-estree@7.12.0(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@7.14.1(typescript@5.5.2)': dependencies: - '@typescript-eslint/types': 7.12.0 - '@typescript-eslint/visitor-keys': 7.12.0 + '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/visitor-keys': 7.14.1 debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.4.5) + ts-api-utils: 1.3.0(typescript@5.5.2) optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.12.0(eslint@9.4.0)(typescript@5.4.5)': + '@typescript-eslint/utils@7.14.1(eslint@9.5.0)(typescript@5.5.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) - '@typescript-eslint/scope-manager': 7.12.0 - '@typescript-eslint/types': 7.12.0 - '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) - eslint: 9.4.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0) + '@typescript-eslint/scope-manager': 7.14.1 + '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) + eslint: 9.5.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.12.0': + '@typescript-eslint/visitor-keys@7.14.1': dependencies: - '@typescript-eslint/types': 7.12.0 + '@typescript-eslint/types': 7.14.1 eslint-visitor-keys: 3.4.3 '@xmldom/xmldom@0.8.10': {} abbrev@1.1.1: {} - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.12.0): dependencies: - acorn: 8.11.3 + acorn: 8.12.0 - acorn@8.11.3: {} + acorn@8.12.0: {} agent-base@6.0.2: dependencies: @@ -2397,7 +2409,7 @@ snapshots: arrpc@https://codeload.github.com/OpenAsar/arrpc/tar.gz/c62ec6a04c8d870530aa6944257fe745f6c59a24: dependencies: - ws: 8.17.0 + ws: 8.17.1 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -2597,13 +2609,13 @@ snapshots: config-file-ts@0.2.6: dependencies: - glob: 10.4.1 - typescript: 5.4.5 + glob: 10.4.2 + typescript: 5.5.2 config-file-ts@0.2.8-rc1: dependencies: - glob: 10.4.1 - typescript: 5.4.5 + glob: 10.4.2 + typescript: 5.5.2 console-control-strings@1.1.0: {} @@ -2792,10 +2804,10 @@ snapshots: transitivePeerDependencies: - supports-color - electron@30.1.1: + electron@31.0.2: dependencies: '@electron/get': 2.0.3 - '@types/node': 20.14.2 + '@types/node': 20.14.8 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -2843,38 +2855,43 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.4.0): + eslint-compat-utils@0.5.1(eslint@9.5.0): dependencies: - eslint: 9.4.0 + eslint: 9.5.0 semver: 7.6.2 - eslint-plugin-es-x@7.7.0(eslint@9.4.0): + eslint-config-prettier@9.1.0(eslint@9.5.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) - '@eslint-community/regexpp': 4.10.1 - eslint: 9.4.0 - eslint-compat-utils: 0.5.1(eslint@9.4.0) + eslint: 9.5.0 - eslint-plugin-n@17.8.1(eslint@9.4.0): + eslint-plugin-es-x@7.7.0(eslint@9.5.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0) + '@eslint-community/regexpp': 4.10.1 + eslint: 9.5.0 + eslint-compat-utils: 0.5.1(eslint@9.5.0) + + eslint-plugin-n@17.9.0(eslint@9.5.0): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0) enhanced-resolve: 5.17.0 - eslint: 9.4.0 - eslint-plugin-es-x: 7.7.0(eslint@9.4.0) + eslint: 9.5.0 + eslint-plugin-es-x: 7.7.0(eslint@9.5.0) get-tsconfig: 4.7.5 - globals: 15.4.0 + globals: 15.6.0 ignore: 5.3.1 minimatch: 9.0.4 semver: 7.6.2 - eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint@9.4.0)(prettier@3.3.1): + eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.5.0))(eslint@9.5.0)(prettier@3.3.2): dependencies: - eslint: 9.4.0 - prettier: 3.3.1 + eslint: 9.5.0 + prettier: 3.3.2 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 optionalDependencies: '@types/eslint': 8.56.10 + eslint-config-prettier: 9.1.0(eslint@9.5.0) eslint-scope@8.0.1: dependencies: @@ -2885,13 +2902,13 @@ snapshots: eslint-visitor-keys@4.0.0: {} - eslint@9.4.0: + eslint@9.5.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0) '@eslint-community/regexpp': 4.10.1 - '@eslint/config-array': 0.15.1 + '@eslint/config-array': 0.16.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.4.0 + '@eslint/js': 9.5.0 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 @@ -2902,7 +2919,7 @@ snapshots: escape-string-regexp: 4.0.0 eslint-scope: 8.0.1 eslint-visitor-keys: 4.0.0 - espree: 10.0.1 + espree: 10.1.0 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -2924,10 +2941,10 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.0.1: + espree@10.1.0: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.0 + acorn-jsx: 5.3.2(acorn@8.12.0) eslint-visitor-keys: 4.0.0 esquery@1.5.0: @@ -3014,7 +3031,7 @@ snapshots: flatted@3.3.1: {} - foreground-child@3.1.1: + foreground-child@3.2.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 @@ -3101,12 +3118,13 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.1: + glob@10.4.2: dependencies: - foreground-child: 3.1.1 + foreground-child: 3.2.1 jackspeak: 3.4.0 minimatch: 9.0.4 minipass: 7.1.2 + package-json-from-dist: 1.0.0 path-scurry: 1.11.1 glob@7.2.3: @@ -3138,7 +3156,7 @@ snapshots: globals@14.0.0: {} - globals@15.4.0: {} + globals@15.6.0: {} globalthis@1.0.4: dependencies: @@ -3498,7 +3516,7 @@ snapshots: negotiator@0.6.3: {} - node-abi@3.63.0: + node-abi@3.65.0: dependencies: semver: 7.6.2 @@ -3598,6 +3616,8 @@ snapshots: dependencies: aggregate-error: 3.1.0 + package-json-from-dist@1.0.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -3633,7 +3653,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.3.1: {} + prettier@3.3.2: {} process-nextick-args@2.0.1: {} @@ -3943,9 +3963,9 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@1.3.0(typescript@5.4.5): + ts-api-utils@1.3.0(typescript@5.5.2): dependencies: - typescript: 5.4.5 + typescript: 5.5.2 tslib@2.6.3: {} @@ -3956,18 +3976,18 @@ snapshots: type-fest@0.13.1: optional: true - typescript-eslint@7.12.0(eslint@9.4.0)(typescript@5.4.5): + typescript-eslint@7.14.1(eslint@9.5.0)(typescript@5.5.2): dependencies: - '@typescript-eslint/eslint-plugin': 7.12.0(@typescript-eslint/parser@7.12.0(eslint@9.4.0)(typescript@5.4.5))(eslint@9.4.0)(typescript@5.4.5) - '@typescript-eslint/parser': 7.12.0(eslint@9.4.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.12.0(eslint@9.4.0)(typescript@5.4.5) - eslint: 9.4.0 + '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(typescript@5.5.2) + '@typescript-eslint/parser': 7.14.1(eslint@9.5.0)(typescript@5.5.2) + '@typescript-eslint/utils': 7.14.1(eslint@9.5.0)(typescript@5.5.2) + eslint: 9.5.0 optionalDependencies: - typescript: 5.4.5 + typescript: 5.5.2 transitivePeerDependencies: - supports-color - typescript@5.4.5: {} + typescript@5.5.2: {} undici-types@5.26.5: {} @@ -4042,7 +4062,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.17.0: {} + ws@8.17.1: {} xmlbuilder@15.1.1: {} From b4f8871a5d18c2a8fe54825e361c6bcd9bb5c5ae Mon Sep 17 00:00:00 2001 From: Aiden Date: Tue, 25 Jun 2024 16:32:24 -0400 Subject: [PATCH 004/844] Bug Maintainers less about package updates --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ca9e9b4..38a7e85 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,7 +7,7 @@ updates: - package-ecosystem: npm directory: "/" schedule: - interval: daily + interval: weekly time: "13:00" open-pull-requests-limit: 99 versioning-strategy: increase From 65b4cc1dd1ee1eafee504f0add07f24540219c05 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 27 Jun 2024 21:16:22 +0200 Subject: [PATCH 005/844] chore: remove wip from arRPC in settings --- src/settings/settings.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/settings/settings.html b/src/settings/settings.html index 2c8c7f6..aa15128 100644 --- a/src/settings/settings.html +++ b/src/settings/settings.html @@ -87,7 +87,7 @@

Uses arRPC to support Discord RPC (Rich - Presence) with local programs on your machine. Work in progress. + Presence) with local programs on your machine.


From 653cc4381af71bbb6eeb3648dd4c3944f3333b38 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 27 Jun 2024 21:30:12 +0200 Subject: [PATCH 006/844] fix: X11 screensharing --- package.json | 2 +- src/discord/screenshare/main.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e9d3d97..d2ae7f9 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "node": ">=22" }, "scripts": { - "build": "tsc && copyfiles -u 1 src/**/*.html src/**/**/*.css src/**/**/*.js ts-out/ && copyfiles package.json ts-out/ && copyfiles assets/**/** ts-out/", + "build": "tsc && copyfiles -u 1 src/**/**/*.html src/**/**/*.css src/**/**/*.js ts-out/ && copyfiles package.json ts-out/ && copyfiles assets/**/** ts-out/", "watch": "tsc -w", "start": "pnpm run build && electron --trace-warnings ./ts-out/main.js", "startThemeManager": "pnpm run build && electron ./ts-out/main.js themes", diff --git a/src/discord/screenshare/main.ts b/src/discord/screenshare/main.ts index 0876117..0b5e8ba 100644 --- a/src/discord/screenshare/main.ts +++ b/src/discord/screenshare/main.ts @@ -65,7 +65,7 @@ function registerCustomHandler(): void { callback({video: result}); } }); - void capturerWindow.loadURL(`file://${import.meta.dirname}/picker.html`); + void capturerWindow.loadFile(path.join(import.meta.dirname, "picker.html")); capturerWindow.webContents.send("getSources", sources); } }); From 0fcf628aa29e48f7d56b753c8d30dcc490c53518 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 27 Jun 2024 21:58:18 +0200 Subject: [PATCH 007/844] fix: use loopback instead of loopbackWithMute --- src/discord/screenshare/main.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/discord/screenshare/main.ts b/src/discord/screenshare/main.ts index 0b5e8ba..0351d02 100644 --- a/src/discord/screenshare/main.ts +++ b/src/discord/screenshare/main.ts @@ -35,7 +35,7 @@ function registerCustomHandler(): void { if (process.platform === "linux" && process.env.XDG_SESSION_TYPE?.toLowerCase() === "wayland") { console.log("WebRTC Capturer detected, skipping window creation."); //assume webrtc capturer is used let options: Electron.Streams = {video: sources[0]}; - if (showAudioDialog() == true) options = {video: sources[0], audio: "loopbackWithMute"}; + if (showAudioDialog() == true) options = {video: sources[0], audio: "loopback"}; callback(options); } else { capturerWindow = new BrowserWindow({ @@ -59,7 +59,7 @@ function registerCustomHandler(): void { const result = {id, name}; if (process.platform === "linux" || process.platform === "win32") { let options: Electron.Streams = {video: sources[0]}; - if (showAudioDialog() == true) options = {video: sources[0], audio: "loopbackWithMute"}; + if (showAudioDialog() == true) options = {video: sources[0], audio: "loopback"}; callback(options); } else { callback({video: result}); From f1c6fcb948b4f5e184ed0f09f497c9dccedf2d5d Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 27 Jun 2024 22:08:16 +0200 Subject: [PATCH 008/844] fix: app not loading --- src/discord/window.ts | 2 +- src/{discord => }/screenshare/main.ts | 2 +- src/{discord => }/screenshare/picker.html | 2 +- src/{discord => }/screenshare/preload.mts | 0 src/{discord/content/css => screenshare}/screenshare.css | 0 5 files changed, 3 insertions(+), 3 deletions(-) rename src/{discord => }/screenshare/main.ts (98%) rename src/{discord => }/screenshare/picker.html (85%) rename src/{discord => }/screenshare/preload.mts (100%) rename src/{discord/content/css => screenshare}/screenshare.css (100%) diff --git a/src/discord/window.ts b/src/discord/window.ts index 2bbfe4d..a73b4ae 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -147,7 +147,7 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { }); if (getConfig("useLegacyCapturer") == false) { console.log("Starting screenshare module..."); - import("./screenshare/main.js"); + import("../screenshare/main.js"); } passedWindow.webContents.session.webRequest.onBeforeRequest( diff --git a/src/discord/screenshare/main.ts b/src/screenshare/main.ts similarity index 98% rename from src/discord/screenshare/main.ts rename to src/screenshare/main.ts index 0351d02..bded61f 100644 --- a/src/discord/screenshare/main.ts +++ b/src/screenshare/main.ts @@ -1,6 +1,6 @@ import {BrowserWindow, MessageBoxOptions, desktopCapturer, dialog, ipcMain, session} from "electron"; import path from "path"; -import {iconPath} from "../../main.js"; +import {iconPath} from "../main.js"; let capturerWindow: BrowserWindow; function showAudioDialog(): boolean { const options: MessageBoxOptions = { diff --git a/src/discord/screenshare/picker.html b/src/screenshare/picker.html similarity index 85% rename from src/discord/screenshare/picker.html rename to src/screenshare/picker.html index 2ae8cfc..a007920 100644 --- a/src/discord/screenshare/picker.html +++ b/src/screenshare/picker.html @@ -6,7 +6,7 @@ ArmCord Screenshare diff --git a/src/discord/screenshare/preload.mts b/src/screenshare/preload.mts similarity index 100% rename from src/discord/screenshare/preload.mts rename to src/screenshare/preload.mts diff --git a/src/discord/content/css/screenshare.css b/src/screenshare/screenshare.css similarity index 100% rename from src/discord/content/css/screenshare.css rename to src/screenshare/screenshare.css From fd79b620880afa5d8d80cde9c3387ad681efc576 Mon Sep 17 00:00:00 2001 From: Aiden Date: Thu, 27 Jun 2024 16:19:23 -0400 Subject: [PATCH 009/844] Implement Autoscrolling toggle (#643) --- assets/lang/en-US.json | 4 +++- src/common/config.ts | 3 ++- src/main.ts | 3 +++ src/settings/settings.html | 8 ++++++++ src/types/settings.d.ts | 1 + 5 files changed, 17 insertions(+), 2 deletions(-) diff --git a/assets/lang/en-US.json b/assets/lang/en-US.json index 3b8d182..c9718b8 100644 --- a/assets/lang/en-US.json +++ b/assets/lang/en-US.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-forceNativeCrash": "Force native crash", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } \ No newline at end of file diff --git a/src/common/config.ts b/src/common/config.ts index 75758e8..905f261 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -129,7 +129,8 @@ export function setup(): void { doneSetup: false, clientName: "ArmCord", customIcon: path.join(import.meta.dirname, "../", "/assets/desktop.png"), - smoothScroll: true + smoothScroll: true, + autoScroll: false }; setConfigBulk({ ...defaults diff --git a/src/main.ts b/src/main.ts index 55ef99b..3c1b077 100644 --- a/src/main.ts +++ b/src/main.ts @@ -110,6 +110,9 @@ if (!app.requestSingleInstanceLock()) { if (getConfig("smoothScroll") === false) { app.commandLine.appendSwitch("disable-smooth-scrolling"); } + if (getConfig("autoScroll")) { + app.commandLine.appendSwitch("enable-blink-features", "MiddleClickAutoscroll"); + } void app.whenReady().then(async () => { // REVIEW - Awaiting the line above will cause a hang at startup if (getConfig("customIcon") !== null) { diff --git a/src/settings/settings.html b/src/settings/settings.html index aa15128..f8b78c5 100644 --- a/src/settings/settings.html +++ b/src/settings/settings.html @@ -108,6 +108,14 @@
+
+ + + +

+
+
+
diff --git a/src/types/settings.d.ts b/src/types/settings.d.ts index bbcd50c..479eb58 100644 --- a/src/types/settings.d.ts +++ b/src/types/settings.d.ts @@ -29,4 +29,5 @@ export interface Settings { doneSetup: boolean; clientName: string; smoothScroll: boolean; + autoScroll: boolean; } From 2a09a41213266eee21fafc9e348432d1b7f1ff1b Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 010/844] Translated using Weblate (French) Currently translated at 89.5% (77 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/fr/ --- assets/lang/fr-FR.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/fr-FR.json b/assets/lang/fr-FR.json index 704ceab..80d0b56 100644 --- a/assets/lang/fr-FR.json +++ b/assets/lang/fr-FR.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copier les informations du GPU", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 79d6e4fd56bb1736bf2952bf508d0dd086f2bdfe Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 011/844] Translated using Weblate (Italian) Currently translated at 93.0% (80 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/it/ --- assets/lang/it-IT.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/it-IT.json b/assets/lang/it-IT.json index cc60fb5..0ea8c4f 100644 --- a/assets/lang/it-IT.json +++ b/assets/lang/it-IT.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copia informazioni sulla GPU", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 68bd29c89f1542aaabaf64736e0c28974d4002d3 Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 012/844] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 77.9% (67 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/nb_NO/ --- assets/lang/nb-NO.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/nb-NO.json b/assets/lang/nb-NO.json index 1be5aa9..7d87b1b 100644 --- a/assets/lang/nb-NO.json +++ b/assets/lang/nb-NO.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Kopier GPU-informasjon", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 0ac4c01a7e355a2ce488daa2d487d81cf6b15216 Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 013/844] Translated using Weblate (Dutch) Currently translated at 43.0% (37 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/nl/ --- assets/lang/nl-NL.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/nl-NL.json b/assets/lang/nl-NL.json index 1824805..5dfe18f 100644 --- a/assets/lang/nl-NL.json +++ b/assets/lang/nl-NL.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 656c85771a89db766ec291f7867a9193354afd07 Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 014/844] Translated using Weblate (Polish) Currently translated at 93.0% (80 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/pl/ --- assets/lang/pl-PL.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/pl-PL.json b/assets/lang/pl-PL.json index 2670022..84ebfad 100644 --- a/assets/lang/pl-PL.json +++ b/assets/lang/pl-PL.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Skopiuj informacje o GPU", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 5c1a1b7a076881e49e71b61e8035d4975338ef0b Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 015/844] Translated using Weblate (Indonesian) Currently translated at 89.5% (77 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/id/ --- assets/lang/id-ID.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/id-ID.json b/assets/lang/id-ID.json index 6d402ac..79b375a 100644 --- a/assets/lang/id-ID.json +++ b/assets/lang/id-ID.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 62f9fed553573252f91324e3373a628362fc52c1 Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 016/844] Translated using Weblate (Spanish (Latin America)) Currently translated at 83.7% (72 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/es_419/ --- assets/lang/es-419.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/es-419.json b/assets/lang/es-419.json index 11a54bd..f2db70b 100644 --- a/assets/lang/es-419.json +++ b/assets/lang/es-419.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 600e79275e61ac7b60ac1d891747e2f405dad48e Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:29 +0000 Subject: [PATCH 017/844] Translated using Weblate (Thai) Currently translated at 26.7% (23 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/th/ --- assets/lang/th-TH.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/th-TH.json b/assets/lang/th-TH.json index 9a5764a..92e3bf4 100644 --- a/assets/lang/th-TH.json +++ b/assets/lang/th-TH.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 92eaf7c51dd7526d20bb3c8ccac2ec96675552e5 Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 018/844] Translated using Weblate (Persian) Currently translated at 73.2% (63 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/fa/ --- assets/lang/fa-IR.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/fa-IR.json b/assets/lang/fa-IR.json index 252c8a1..ed9dd77 100644 --- a/assets/lang/fa-IR.json +++ b/assets/lang/fa-IR.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 5c60202473f93f84ec54e076780135370937756a Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:29 +0000 Subject: [PATCH 019/844] Translated using Weblate (Russian) Currently translated at 91.8% (79 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/ru/ --- assets/lang/ru-RU.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/ru-RU.json b/assets/lang/ru-RU.json index 9ead196..627a864 100644 --- a/assets/lang/ru-RU.json +++ b/assets/lang/ru-RU.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Копировать информацию о GPU", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 5f18c88900de26d319509fcbeb587f9fa2d7af7a Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:29 +0000 Subject: [PATCH 020/844] Translated using Weblate (Portuguese (Brazil)) Currently translated at 90.6% (78 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/pt_BR/ --- assets/lang/pt-BR.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/pt-BR.json b/assets/lang/pt-BR.json index 295f61d..9ddd120 100644 --- a/assets/lang/pt-BR.json +++ b/assets/lang/pt-BR.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copiar informação da GPU", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 510426123b7c5ebf35fba0ce629cad3ec72bb3f8 Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 021/844] Translated using Weblate (Japanese) Currently translated at 89.5% (77 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/ja/ --- assets/lang/ja-JP.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/ja-JP.json b/assets/lang/ja-JP.json index 1e31482..8491947 100644 --- a/assets/lang/ja-JP.json +++ b/assets/lang/ja-JP.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 84687af22360a82e8cbcc1c6f19cefc00ba874ee Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 022/844] Translated using Weblate (Swedish) Currently translated at 97.6% (84 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/sv/ --- assets/lang/sv-SE.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/sv-SE.json b/assets/lang/sv-SE.json index 37cb937..d04ed6b 100644 --- a/assets/lang/sv-SE.json +++ b/assets/lang/sv-SE.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Kopiera GPU information", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Använd mjuk rullning", - "settings-smoothScroll-desc": "Växla mjuk rullning" + "settings-smoothScroll-desc": "Växla mjuk rullning", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 334b26b9f318aabe1c084d062d5e403535c3d71f Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 023/844] Translated using Weblate (Chinese (Simplified)) Currently translated at 91.8% (79 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/zh_Hans/ --- assets/lang/zh-Hans.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/zh-Hans.json b/assets/lang/zh-Hans.json index 425a301..e4dde6c 100644 --- a/assets/lang/zh-Hans.json +++ b/assets/lang/zh-Hans.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "复制显卡信息", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From d49e095f633db647a25ef10db62edbd07b80a21a Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:29 +0000 Subject: [PATCH 024/844] Translated using Weblate (Turkish) Currently translated at 90.6% (78 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/tr/ --- assets/lang/tr-TR.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/tr-TR.json b/assets/lang/tr-TR.json index 0a78415..47bad85 100644 --- a/assets/lang/tr-TR.json +++ b/assets/lang/tr-TR.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "GPU Bilgilerini Kopyala", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From ca8a3de3666d7a42aa223cd9f157ee04056090fd Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 025/844] Translated using Weblate (Korean) Currently translated at 93.0% (80 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/ko/ --- assets/lang/ko-KR.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/ko-KR.json b/assets/lang/ko-KR.json index 759eed9..c741c71 100644 --- a/assets/lang/ko-KR.json +++ b/assets/lang/ko-KR.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 800382b8a9f98b2bc24b6c278390fe7ff5b72ede Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 026/844] Translated using Weblate (Hungarian) Currently translated at 89.5% (77 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/hu/ --- assets/lang/hu-HU.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/hu-HU.json b/assets/lang/hu-HU.json index 106567a..8489d68 100644 --- a/assets/lang/hu-HU.json +++ b/assets/lang/hu-HU.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From a301a0f9f0240f27de1abd7126632fdea54b2da5 Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 027/844] Translated using Weblate (Czech) Currently translated at 76.7% (66 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/cs/ --- assets/lang/cs-CZ.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/cs-CZ.json b/assets/lang/cs-CZ.json index 7ef1461..6bbfc93 100644 --- a/assets/lang/cs-CZ.json +++ b/assets/lang/cs-CZ.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 21f17439c3b32406086823bbb63c7044fdaf2104 Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:29 +0000 Subject: [PATCH 028/844] Translated using Weblate (Lithuanian) Currently translated at 16.2% (14 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/lt/ --- assets/lang/lt-LT.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/lt-LT.json b/assets/lang/lt-LT.json index bb7401c..bfc3c1e 100644 --- a/assets/lang/lt-LT.json +++ b/assets/lang/lt-LT.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 68a6d07ba6074412bd112ad16bc8cdbb6b694e80 Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 029/844] Translated using Weblate (Ukrainian) Currently translated at 91.8% (79 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/uk/ --- assets/lang/uk-UA.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/uk-UA.json b/assets/lang/uk-UA.json index 6b0b834..e9cdd1c 100644 --- a/assets/lang/uk-UA.json +++ b/assets/lang/uk-UA.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Скопіювати інформацію про GPU", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-smoothScroll": "Use smooth scrolling" + "settings-smoothScroll": "Use smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From ffe19d959e0f322f757de43aa3bcb26b33c9256d Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 030/844] Translated using Weblate (Finnish) Currently translated at 36.0% (31 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/fi/ --- assets/lang/fi-FI.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/fi-FI.json b/assets/lang/fi-FI.json index 904b77b..2ca3223 100644 --- a/assets/lang/fi-FI.json +++ b/assets/lang/fi-FI.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 5b3ae3c9741f66acfe846298ae96510d93ba67a9 Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:29 +0000 Subject: [PATCH 031/844] Translated using Weblate (Romanian) Currently translated at 12.7% (11 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/ro/ --- assets/lang/ro-RO.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/ro-RO.json b/assets/lang/ro-RO.json index 1f05ad5..bca8a71 100644 --- a/assets/lang/ro-RO.json +++ b/assets/lang/ro-RO.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From d21be3206b7c4385537b44069ba160f7f34a62d4 Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:29 +0000 Subject: [PATCH 032/844] Translated using Weblate (German) Currently translated at 89.5% (77 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/de/ --- assets/lang/de-DE.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/de-DE.json b/assets/lang/de-DE.json index 64eccfd..693f567 100644 --- a/assets/lang/de-DE.json +++ b/assets/lang/de-DE.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 392f7f32ab64a91aaa9f907354a9091045fe1d2d Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 033/844] Translated using Weblate (Portuguese (Portugal)) Currently translated at 89.5% (77 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/pt_PT/ --- assets/lang/pt-PT.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/pt-PT.json b/assets/lang/pt-PT.json index fe157aa..f77d992 100644 --- a/assets/lang/pt-PT.json +++ b/assets/lang/pt-PT.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From cd83e3aa24d41f7e6bb2b54414c6e8d7cef6f39a Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 034/844] Translated using Weblate (Slovak) Currently translated at 0.0% (0 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/sk/ --- assets/lang/sk-SK.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/sk-SK.json b/assets/lang/sk-SK.json index 7bd7627..0dee3c6 100644 --- a/assets/lang/sk-SK.json +++ b/assets/lang/sk-SK.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From a763c6735d60c7a40ba2a8bc40c7bbbfd1a67c0c Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Thu, 27 Jun 2024 20:19:30 +0000 Subject: [PATCH 035/844] Translated using Weblate (Arabic) Currently translated at 89.5% (77 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/ar/ --- assets/lang/ar-AA.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/ar-AA.json b/assets/lang/ar-AA.json index adf7b16..4483ecf 100644 --- a/assets/lang/ar-AA.json +++ b/assets/lang/ar-AA.json @@ -82,5 +82,7 @@ "settings-copyGPUInfo": "Copy GPU Info", "settings-prfmMode-vaapi": "VAAPI", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-autoScroll": "Allow auto-scroll", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" } From 6f1b8f4c0aa02e9693dbf0b413c1020783bfe662 Mon Sep 17 00:00:00 2001 From: Aiden Date: Thu, 27 Jun 2024 16:22:31 -0400 Subject: [PATCH 036/844] Bump packages --- package.json | 6 ++--- pnpm-lock.yaml | 60 +++++++++++++++++++++++++------------------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index d2ae7f9..0e346dd 100644 --- a/package.json +++ b/package.json @@ -33,10 +33,10 @@ "devDependencies": { "@eslint/js": "^9.5.0", "@types/eslint__js": "^8.42.3", - "@types/node": "^20.14.8", + "@types/node": "^20.14.9", "@types/ws": "^8.5.10", "copyfiles": "^2.4.1", - "electron": "31.0.2", + "electron": "31.1.0", "electron-builder": "25.0.0-alpha.9", "eslint": "^9.5.0", "eslint-config-prettier": "^9.1.0", @@ -49,7 +49,7 @@ "dependencies": { "arrpc": "github:OpenAsar/arrpc#c62ec6a04c8d870530aa6944257fe745f6c59a24", "cross-fetch": "^4.0.0", - "electron-context-menu": "^4.0.0", + "electron-context-menu": "^4.0.1", "electron-is-dev": "^3.0.1", "extract-zip": "^2.0.1", "v8-compile-cache": "^2.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 258b02c..74f8e8a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,8 +15,8 @@ importers: specifier: ^4.0.0 version: 4.0.0(encoding@0.1.13) electron-context-menu: - specifier: ^4.0.0 - version: 4.0.0 + specifier: ^4.0.1 + version: 4.0.1 electron-is-dev: specifier: ^3.0.1 version: 3.0.1 @@ -37,8 +37,8 @@ importers: specifier: ^8.42.3 version: 8.42.3 '@types/node': - specifier: ^20.14.8 - version: 20.14.8 + specifier: ^20.14.9 + version: 20.14.9 '@types/ws': specifier: ^8.5.10 version: 8.5.10 @@ -46,8 +46,8 @@ importers: specifier: ^2.4.1 version: 2.4.1 electron: - specifier: 31.0.2 - version: 31.0.2 + specifier: 31.1.0 + version: 31.1.0 electron-builder: specifier: 25.0.0-alpha.9 version: 25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9)) @@ -229,8 +229,8 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@20.14.8': - resolution: {integrity: sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==} + '@types/node@20.14.9': + resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} '@types/plist@3.0.5': resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} @@ -691,8 +691,8 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - electron-context-menu@4.0.0: - resolution: {integrity: sha512-eUVj+Z2dNqWi7K2sBZMkODk5kVT08vWWE/uxMTedon5gl1cn05OIG883yYq7GuP6QKJqJGv3mbnGIKEuk3NTXQ==} + electron-context-menu@4.0.1: + resolution: {integrity: sha512-tPRzsIK48gm+DDP4FLJeocrFg1rJBH7ZgQx3j4ebt5d6euM2ERAB8pdBmKyhHy7na/BiZfrw4ASMq97oVwQXgw==} engines: {node: '>=18'} electron-dl@4.0.0: @@ -706,8 +706,8 @@ packages: electron-publish@25.0.0-alpha.9: resolution: {integrity: sha512-vdqOXtCjrO72sZCB8hfvd8ZTKmUvWMLQ/f78Qe0UH4B+dCShtHnqbUM9Ed1Igsaw0svm2+cW+ce2yVZglr2Z3A==} - electron@31.0.2: - resolution: {integrity: sha512-55efQ5yfLN+AQHcFC00AXQqtxC3iAGaxX2GQ3EDbFJ0ca9GHNOdSXkcrdBElLleiDrR2hpXNkQxN1bDn0oxe6w==} + electron@31.1.0: + resolution: {integrity: sha512-TBOwqLxSxnx6+pH6GMri7R3JPH2AkuGJHfWZS0p1HsmN+Qr1T9b0IRJnnehSd/3NZAmAre4ft9Ljec7zjyKFJA==} engines: {node: '>= 12.20.55'} hasBin: true @@ -1311,8 +1311,8 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: @@ -2032,7 +2032,7 @@ snapshots: debug: 4.3.5 dir-compare: 4.2.0 fs-extra: 11.2.0 - minimatch: 9.0.4 + minimatch: 9.0.5 plist: 3.1.0 transitivePeerDependencies: - supports-color @@ -2137,7 +2137,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/responselike': 1.0.3 '@types/debug@4.1.12': @@ -2157,7 +2157,7 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/http-cache-semantics@4.0.4': {} @@ -2165,34 +2165,34 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/ms@0.7.34': {} - '@types/node@20.14.8': + '@types/node@20.14.9': dependencies: undici-types: 5.26.5 '@types/plist@3.0.5': dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 xmlbuilder: 15.1.1 optional: true '@types/responselike@1.0.3': dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/verror@1.10.10': optional: true '@types/ws@8.5.10': dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.14.8 + '@types/node': 20.14.9 optional: true '@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(typescript@5.5.2)': @@ -2252,7 +2252,7 @@ snapshots: debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.4 + minimatch: 9.0.5 semver: 7.6.2 ts-api-utils: 1.3.0(typescript@5.5.2) optionalDependencies: @@ -2778,7 +2778,7 @@ snapshots: - electron-builder-squirrel-windows - supports-color - electron-context-menu@4.0.0: + electron-context-menu@4.0.1: dependencies: cli-truncate: 4.0.0 electron-dl: 4.0.0 @@ -2804,10 +2804,10 @@ snapshots: transitivePeerDependencies: - supports-color - electron@31.0.2: + electron@31.1.0: dependencies: '@electron/get': 2.0.3 - '@types/node': 20.14.8 + '@types/node': 20.14.9 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -2880,7 +2880,7 @@ snapshots: get-tsconfig: 4.7.5 globals: 15.6.0 ignore: 5.3.1 - minimatch: 9.0.4 + minimatch: 9.0.5 semver: 7.6.2 eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.5.0))(eslint@9.5.0)(prettier@3.3.2): @@ -3122,7 +3122,7 @@ snapshots: dependencies: foreground-child: 3.2.1 jackspeak: 3.4.0 - minimatch: 9.0.4 + minimatch: 9.0.5 minipass: 7.1.2 package-json-from-dist: 1.0.0 path-scurry: 1.11.1 @@ -3463,7 +3463,7 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.4: + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 From c74184419e1de368d82054f9a7d0bdd86bae5010 Mon Sep 17 00:00:00 2001 From: Aiden Date: Thu, 27 Jun 2024 17:13:46 -0400 Subject: [PATCH 037/844] Fix linting, partially break theme loaders (themes can no longer be hot-loaded, the client must be restarted) --- src/themeManager/main.ts | 6 +++--- src/themeManager/preload.mts | 4 +--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/themeManager/main.ts b/src/themeManager/main.ts index 11b063a..42b8b54 100644 --- a/src/themeManager/main.ts +++ b/src/themeManager/main.ts @@ -126,13 +126,13 @@ export async function createTManagerWindow(): Promise { mainWindow.webContents.reload(); }); }); - ipcMain.on("addToDisabled", async (_event, name: string) => { + ipcMain.on("addToDisabled", (_event, name: string) => { fs.appendFileSync(path.join(userDataPath, "/disabled.txt"), `${name}\n`); }); ipcMain.on("disabled", (e) => { e.returnValue = fs.readFileSync(path.join(userDataPath, "/disabled.txt")).toString(); }); - ipcMain.on("removeFromDisabled", async (_event, name: string) => { + ipcMain.on("removeFromDisabled", (_event, name: string) => { const e = fs.readFileSync(path.join(userDataPath, "/disabled.txt")).toString(); fs.writeFileSync(path.join(userDataPath, "/disabled.txt"), e.replace(name, "")); }); @@ -150,7 +150,7 @@ export async function createTManagerWindow(): Promise { mainWindow.webContents.reload(); }); }); - ipcMain.on("installBDTheme", async (_event, link: string) => { + ipcMain.handle("installBDTheme", async (_event, link: string) => { try { const code = await (await fetch(link)).text(); const manifest = parseBDManifest(code); diff --git a/src/themeManager/preload.mts b/src/themeManager/preload.mts index f11c95c..f59e15d 100644 --- a/src/themeManager/preload.mts +++ b/src/themeManager/preload.mts @@ -1,14 +1,12 @@ import {ipcRenderer, contextBridge} from "electron"; -import {sleep} from "../common/sleep.js"; import {ThemeManifest} from "../types/themeManifest"; contextBridge.exposeInMainWorld("themes", { install: (url: string) => ipcRenderer.send("installBDTheme", url), uninstall: (id: string) => ipcRenderer.send("uninstallTheme", id) }); -ipcRenderer.on("themeManifest", async (_event, json: string) => { +ipcRenderer.on("themeManifest", (_event, json: string) => { const manifest = JSON.parse(json) as ThemeManifest; console.log(manifest); - await sleep(1000); // REVIEW - This is all that requires async, would be nice if it could be removed. const e = document.getElementById("cardBox"); const id = manifest.name.replace(" ", "-"); e?.insertAdjacentHTML( From dee46370a126e55e58b365d034961d1251d186e4 Mon Sep 17 00:00:00 2001 From: "Mads R. Andersen" Date: Mon, 1 Jul 2024 02:25:58 +0200 Subject: [PATCH 038/844] Added translation using Weblate (Danish) --- assets/lang/da-DK.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 assets/lang/da-DK.json diff --git a/assets/lang/da-DK.json b/assets/lang/da-DK.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/da-DK.json @@ -0,0 +1 @@ +{} From dbd6a24395393c35fd818ad7dc213423fa66df89 Mon Sep 17 00:00:00 2001 From: Prefill add-on Date: Mon, 1 Jul 2024 00:26:01 +0000 Subject: [PATCH 039/844] Translated using Weblate (Danish) Currently translated at 100.0% (0 of 0 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/da/ --- assets/lang/da-DK.json | 89 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 1 deletion(-) diff --git a/assets/lang/da-DK.json b/assets/lang/da-DK.json index 0967ef4..f4f7a35 100644 --- a/assets/lang/da-DK.json +++ b/assets/lang/da-DK.json @@ -1 +1,88 @@ -{} +{ + "settings-mod-desc1": "Client mods are programs that allow you customize your Discord experience. They can change appearance of\n the client, modify behaviours or add new features!", + "settings-skipSplash-desc": "Skips ArmCord splash screen when you start up the app.", + "setup_question3": "Should ArmCord handle client mods installation?", + "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of ArmCord.", + "settings-useLegacyCapturer-desc": "Use legacy screenshare module, instead of the new one. If you're experiencing issues with screen sharing, try enabling this.", + "settings-invitewebsocket-desc": "Uses arRPC to support Discord RPC (Rich Presence) with local programs on your machine. Work in progress.", + "settings-theme-transparent": "Transparent", + "settings-crashesFolder": "Open native crashes folder", + "settings-trayIcon-black-plug": "Black Plug", + "settings-prfmMode-desc": "Performance mode is an experimental function that may either increase responsiveness and performance of\n ArmCord or… decrease it. Please try every option and see which fits you the best.", + "settings-channel": "Discord channel", + "settings-mod": "Client mod", + "settings-patches-desk": "Fetches patches distributed if a release turns out to have bugs. Usually\n doesn't need to be turned on continuously (unless notified in support Discord).", + "settings-trayIcon-desc": "Set the icon which will appear in tray menu.", + "settings-advanced": "Advanced user zone", + "loading_screen_start": "Starting ArmCord…", + "settings-theme-desc2": "this is how ArmCord looks when you first launch it. It includes recreation of Discord's\n custom titlebar and ArmCord specific styles injected into Discord.", + "setup_question5": "Do you want to use a tray icon?", + "settings-invitewebsocket": "Rich Presence (Experimental)", + "settings-save": "Save Settings", + "settings-prfmMode-vaapi": "VAAPI", + "settings-tray-desc": "When disabled, ArmCord will close like any other window when closed, otherwise it'll sit back and relax in your system tray for later.", + "settings-useLegacyCapturer": "Use legacy capturer", + "settings-channel-desc3": "this is alpha test release of Discord. By using it you gain access to the newest\n features and fixes.", + "settings-theme-desc4": "transparent window with native titlebar, you need a compatible theme to run this.", + "settings-startMinimized-desc": "ArmCord starts in background and remains out of your way.", + "settings-pluginsFolder": "Open plugins folder", + "settings-dynamicIcon": "Dynamic icon", + "settings-tray": "Tray", + "settings-trayIcon-normal": "Discord Icon", + "settings-copyGPUInfo": "Copy GPU Info", + "settings-mintoTray": "Work in background", + "settings-trayIcon-colored-plug": "Colored Plug", + "settings-trayIcon-classic": "Classic Discord Icon", + "settings-disableAutogain": "Disable autogain", + "loading_screen_update": "A new version of ArmCord is available. Please update to the latest version.", + "settings-experimental": "Experimental", + "settings-smoothScroll-desc": "Toggle smooth scrolling", + "settings-none": "None", + "settings-csp-desc": "ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.", + "loading_screen_offline": "You appear to be offline. Restart in ", + "settings-channel-desc2": "you're probably most familiar with this one. It's the one you see in default Discord\n client!", + "settings-disableAutogain-desc": "Disables autogain.", + "settings-startMinimized": "Start minimized", + "settings-trayIcon-white-plug-alt": "White Plug Alt", + "settings-theme-desc1": "ArmCord \"themes\" manage apps behaviour and looks.", + "settings-trayIcon-dynamic": "Dynamic", + "settings-spellcheck-desc": "Helps you correct misspelled words by highlighting them.", + "settings-theme-default": "Default", + "settings-skipSplash": "Skip Splash Screen (Experimental)", + "settings-forceNativeCrash": "Force native crash", + "settings-trayIcon-white-plug": "White Plug", + "settings-mod-vencord": "lightweight, and easy to use client mod. Features a built-in store for plugins.", + "settings-trayIcon": "Tray icon", + "settings-channel-desc4": "public test build. Receives features earlier than stable but is a bit older than Canary.", + "settings-prfmMode-battery": "Battery", + "settings-prfmMode": "Performance mode", + "settings-trayIcon-black-plug-alt": "Black Plug Alt", + "setup_question2": "Choose your Discord channel/instance:", + "next": "Next", + "settings-spellcheck": "Spellcheck", + "no": "No", + "settings-theme-desc3": "uses native titlebar of OS you're currently running (e.g Windows 7/10). Functions more\n similar to actual Discord app on Linux.", + "settings-autoScroll": "Allow auto-scroll", + "settings-mod-shelter": "is a new generation client mod built to be essentially bulletproof.", + "settings-smoothScroll": "Use smooth scrolling", + "settings-patches": "Automatic Patches", + "settings-updater": "Check for updates", + "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", + "settings-theme": "ArmCord theme", + "settings-mintoTray-desc": "When disabled, ArmCord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.", + "settings-MultiInstance": "Multi Instance", + "settings-storageFolder": "Open storage folder", + "settings-mobileMode-desc": "If you're on a device with touch-screen this feature is for you! It activates Discord's hidden mobile\n mode meant for phones and tablets. Only major feature missing is voice chat support. This is ideal for\n users on PinePhone and similar.", + "settings-restart": "Restart App", + "settings-prfmMode-performance": "Performance", + "yes": "Yes", + "settings-mobileMode": "Mobile mode", + "settings-channel-desc1": "You can use this setting to change current instance of Discord:", + "setup_question4": "Select a client mod you want to install:", + "settings-dynamicIcon-desc": "Following Discord's behaviour on Windows, this shows unread messages/pings count on ArmCord's icon instead of it's tray.", + "settings-theme-native": "Native", + "settings-themesFolder": "Open themes folder", + "setup_offline": "You appear to be offline. Please connect to the internet and restart ArmCord.", + "setup_question1": "Welcome to the ArmCord Setup", + "settings-copyDebugInfo": "Copy Debug Info" +} From a2e41c3df1403c3863f7fef3e6435ffda7227a9f Mon Sep 17 00:00:00 2001 From: Aiden Date: Mon, 1 Jul 2024 20:43:33 -0400 Subject: [PATCH 040/844] Package Updates --- package.json | 8 +- pnpm-lock.yaml | 413 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 273 insertions(+), 148 deletions(-) diff --git a/package.json b/package.json index 0e346dd..d265605 100644 --- a/package.json +++ b/package.json @@ -31,20 +31,20 @@ }, "homepage": "https://github.com/armcord/armcord#readme", "devDependencies": { - "@eslint/js": "^9.5.0", + "@eslint/js": "^9.6.0", "@types/eslint__js": "^8.42.3", "@types/node": "^20.14.9", "@types/ws": "^8.5.10", "copyfiles": "^2.4.1", "electron": "31.1.0", "electron-builder": "25.0.0-alpha.9", - "eslint": "^9.5.0", + "eslint": "^9.6.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-n": "^17.9.0", "eslint-plugin-prettier": "^5.1.3", "prettier": "^3.3.2", - "typescript": "^5.5.2", - "typescript-eslint": "^7.14.1" + "typescript": "^5.5.3", + "typescript-eslint": "^7.15.0" }, "dependencies": { "arrpc": "github:OpenAsar/arrpc#c62ec6a04c8d870530aa6944257fe745f6c59a24", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74f8e8a..c38535d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,8 +31,8 @@ importers: version: 8.17.1 devDependencies: '@eslint/js': - specifier: ^9.5.0 - version: 9.5.0 + specifier: ^9.6.0 + version: 9.6.0 '@types/eslint__js': specifier: ^8.42.3 version: 8.42.3 @@ -50,28 +50,28 @@ importers: version: 31.1.0 electron-builder: specifier: 25.0.0-alpha.9 - version: 25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9)) + version: 25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9)) eslint: - specifier: ^9.5.0 - version: 9.5.0 + specifier: ^9.6.0 + version: 9.6.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@9.5.0) + version: 9.1.0(eslint@9.6.0) eslint-plugin-n: specifier: ^17.9.0 - version: 17.9.0(eslint@9.5.0) + version: 17.9.0(eslint@9.6.0) eslint-plugin-prettier: specifier: ^5.1.3 - version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.5.0))(eslint@9.5.0)(prettier@3.3.2) + version: 5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint@9.6.0)(prettier@3.3.2) prettier: specifier: ^3.3.2 version: 3.3.2 typescript: - specifier: ^5.5.2 - version: 5.5.2 + specifier: ^5.5.3 + version: 5.5.3 typescript-eslint: - specifier: ^7.14.1 - version: 7.14.1(eslint@9.5.0)(typescript@5.5.2) + specifier: ^7.15.0 + version: 7.15.0(eslint@9.6.0)(typescript@5.5.3) packages: @@ -95,6 +95,10 @@ packages: resolution: {integrity: sha512-EiTBU0BwE7HZZjAG1fFWQaiQpCuPrVGn7jPss1kUjD6eTTdXXd29RiZqEqkgN7xqt/Pgn4g3I7Saqovanrfj3w==} engines: {node: '>= 10.0.0'} + '@electron/notarize@2.3.2': + resolution: {integrity: sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg==} + engines: {node: '>= 10.0.0'} + '@electron/osx-sign@1.3.0': resolution: {integrity: sha512-TEXhxlYSDRr9JWK5nWdOv5MtuUdaZ412uxIIEQ0hLt80o0HYWtQJBlW5QmrQDMtebzATaOjKG9UfCzLyA90zWQ==} engines: {node: '>=12.0.0'} @@ -115,20 +119,20 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.1': - resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.16.0': - resolution: {integrity: sha512-/jmuSd74i4Czf1XXn7wGRWZCuyaUZ330NH1Bek0Pplatt4Sy1S5haN21SCLLdbeKslQ+S0wEJ+++v5YibSi+Lg==} + '@eslint/config-array@0.17.0': + resolution: {integrity: sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.1.0': resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.5.0': - resolution: {integrity: sha512-A7+AOT2ICkodvtsWnxZP4Xxk3NbZ3VMHd8oihydLRGrJgqqdEz1qSeEgXYyT/Cu8h1TWWsQRejIx48mtjZ5y1w==} + '@eslint/js@9.6.0': + resolution: {integrity: sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': @@ -247,8 +251,8 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@7.14.1': - resolution: {integrity: sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==} + '@typescript-eslint/eslint-plugin@7.15.0': + resolution: {integrity: sha512-uiNHpyjZtFrLwLDpHnzaDlP3Tt6sGMqTCiqmxaN4n4RP0EfYZDODJyddiFDF44Hjwxr5xAcaYxVKm9QKQFJFLA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -258,8 +262,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.14.1': - resolution: {integrity: sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==} + '@typescript-eslint/parser@7.15.0': + resolution: {integrity: sha512-k9fYuQNnypLFcqORNClRykkGOMOj+pV6V91R4GO/l1FDGwpqmSwoOQrOHo3cGaH63e+D3ZiCAOsuS/D2c99j/A==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -268,12 +272,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@7.14.1': - resolution: {integrity: sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==} + '@typescript-eslint/scope-manager@7.15.0': + resolution: {integrity: sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.14.1': - resolution: {integrity: sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==} + '@typescript-eslint/type-utils@7.15.0': + resolution: {integrity: sha512-SkgriaeV6PDvpA6253PDVep0qCqgbO1IOBiycjnXsszNTVQe5flN5wR5jiczoEoDEnAqYFSFFc9al9BSGVltkg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -282,12 +286,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@7.14.1': - resolution: {integrity: sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==} + '@typescript-eslint/types@7.15.0': + resolution: {integrity: sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@7.14.1': - resolution: {integrity: sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==} + '@typescript-eslint/typescript-estree@7.15.0': + resolution: {integrity: sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -295,14 +299,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@7.14.1': - resolution: {integrity: sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==} + '@typescript-eslint/utils@7.15.0': + resolution: {integrity: sha512-hfDMDqaqOqsUVGiEPSMLR/AjTSCsmJwjpKkYQRo1FNbmW4tBwBspYDwO9eh7sKSTwMQgBw9/T4DHudPaqshRWA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.14.1': - resolution: {integrity: sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==} + '@typescript-eslint/visitor-keys@7.15.0': + resolution: {integrity: sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw==} engines: {node: ^18.18.0 || >=20.0.0} '@xmldom/xmldom@0.8.10': @@ -361,6 +365,16 @@ packages: app-builder-bin@5.0.0-alpha.3: resolution: {integrity: sha512-bWTAF50v4ZAVLq6EPZYhaLsFSJLfZz5s9MIeP5k1RkkBsibyJV/Dv6NxfaDO0I++iBmcLKsuzB5E8b1qaeXqew==} + app-builder-bin@5.0.0-alpha.4: + resolution: {integrity: sha512-4MitKmOtfTdMONrtRoiaqJ6HtlVZXgrNX1PNdEzEHSAoXU85x7s+mo0IhAS9K9qgjyTVuLrM1E/HAMp5qGyoOA==} + + app-builder-lib@25.0.0-alpha.10: + resolution: {integrity: sha512-RrKhTfCJLPrvIJb1+llIqJ8hMYvc+VdM6WqhpAHcwrADy4EBSA4WzqQ1sNBwlYE8AbfSNGJu+wpjqIP+HpkMbg==} + engines: {node: '>=14.0.0'} + peerDependencies: + dmg-builder: 25.0.0-alpha.10 + electron-builder-squirrel-windows: 25.0.0-alpha.10 + app-builder-lib@25.0.0-alpha.9: resolution: {integrity: sha512-rxkOK9QaNVmbB0Al+qA1xN6M6aIB/mMo5s7nrFmRf4p9ZFXuGcaqEBSmOUA1zf4r7pK1IpfOMiV0cS4lvXTZbQ==} engines: {node: '>=14.0.0'} @@ -463,6 +477,13 @@ packages: resolution: {integrity: sha512-/Ln2ddejGj2HNMJ+X66mKHRcOvmRzUO/dSi8t4hSV64J7IA+DE+mqDb+zogIE2gin7p7YwcGiOkKny4nwPPPXg==} engines: {node: '>=12.0.0'} + builder-util-runtime@9.2.5-alpha.3: + resolution: {integrity: sha512-ugXSJSbYBpaYeXpk2Rxa2QZdT67oRz3FFu3Lud4XK0Ijqe+OXwyAyCM4pGXJEO3VSdUn43AOJ5bUZ3gsCdQAIw==} + engines: {node: '>=12.0.0'} + + builder-util@25.0.0-alpha.10: + resolution: {integrity: sha512-SrlawYIKu6UZOPWCGlbzVqbgv81jkeUPlrZbbdGb8ERIHuGR9HjnnQs7FV1QR2TKMjRsg/47I8UDtudj16qldg==} + builder-util@25.0.0-alpha.9: resolution: {integrity: sha512-WR4YsR9YuPADtYN6a3D8qQ0quU7W9EIIVd13xA6gO2hmWxioDmJvxeF73fLfkh0S//C5GK6XXO8lTlPBN9SeFg==} @@ -683,8 +704,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-builder-squirrel-windows@25.0.0-alpha.9: - resolution: {integrity: sha512-IK6r96UPVIQcttJrXJ7Kt4nxQarmlZVsKkqMZQUWPu4Sof5bCe0PEMTIFISvgzo7y4MDdjVsCJ9ljZK19PIKZA==} + electron-builder-squirrel-windows@25.0.0-alpha.10: + resolution: {integrity: sha512-6TJygZGtt7QM3xJUZ98rbY7i/dCUCHamIR3dKZr6GanGIxCFBDwifwRrE7mvjQbfGC2Ac+1HW1ITu1rg93iGRw==} electron-builder@25.0.0-alpha.9: resolution: {integrity: sha512-Jy9r/WZglgi7I9jmMCd7RSeSVBeRkiYDrl8cJxHYM4VtyTerL1E7u/mennZO+x7zDf633OVOGmxfk+lPWRSmKA==} @@ -703,6 +724,9 @@ packages: resolution: {integrity: sha512-8TjjAh8Ec51hUi3o4TaU0mD3GMTOESi866oRNavj9A3IQJ7pmv+MJVmdZBFGw4GFT36X7bkqnuDNYvkQgvyI8Q==} engines: {node: '>=18'} + electron-publish@25.0.0-alpha.10: + resolution: {integrity: sha512-1gaPPPC/TRAG9TYUW02T8+I1BlaiR2zrTA2m6iyOQ1vsa7zUqjE+VABfYBtaBJ9p+WIzwkZO8+L47cvh2dvSqA==} + electron-publish@25.0.0-alpha.9: resolution: {integrity: sha512-vdqOXtCjrO72sZCB8hfvd8ZTKmUvWMLQ/f78Qe0UH4B+dCShtHnqbUM9Ed1Igsaw0svm2+cW+ce2yVZglr2Z3A==} @@ -776,8 +800,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-es-x@7.7.0: - resolution: {integrity: sha512-aP3qj8BwiEDPttxQkZdI221DLKq9sI/qHolE2YSQL1/9+xk7dTV+tB1Fz8/IaCA+lnLA1bDEnvaS2LKs0k2Uig==} + eslint-plugin-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' @@ -814,8 +838,8 @@ packages: resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.5.0: - resolution: {integrity: sha512-+NAOZFrW/jFTS3dASCGBxX1pkFD0/fsO+hfAkJ4TyYKwgsXZbqzrw+seCYFCcPCYXvnD67tAnglU7GQTz6kcVw==} + eslint@9.6.0: + resolution: {integrity: sha512-ElQkdLMEEqQNM9Njff+2Y4q2afHk7JpkPvrd7Xh7xefwgQynqPxwf55J7di9+MEibWUGdNjFF9ITG9Pck5M84w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true @@ -994,8 +1018,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.6.0: - resolution: {integrity: sha512-UzcJi88Hw//CurUIRa9Jxb0vgOCcuD/MNjwmXp633cyaRKkCWACkoqHCtfZv43b1kqXGg/fpOa8bwgacCeXsVg==} + globals@15.7.0: + resolution: {integrity: sha512-ivatRXWwKC6ImcdKO7dOwXuXR5XFrdwo45qFwD7D0qOkEPzzJdLXC3BHceBdyrPOD3p1suPaWi4Y4NMm2D++AQ==} engines: {node: '>=18'} globalthis@1.0.4: @@ -1251,8 +1275,8 @@ packages: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + lru-cache@10.3.0: + resolution: {integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==} engines: {node: 14 || >=16.14} lru-cache@6.0.0: @@ -1483,6 +1507,10 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pe-library@0.4.0: + resolution: {integrity: sha512-JAmVv2jGxmczplhHO7UoFGJ+pM/yMBpny3vNjwNFuaeQfzKlekQidZ8Ss8EJ0qee8wEQN4lY2IwtWx2oRfMsag==} + engines: {node: '>=12', npm: '>=6'} + pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -1573,6 +1601,10 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + resedit@1.7.0: + resolution: {integrity: sha512-dbsZ0gk5opWPFlKMqvxCrLCuMZUVmsW3yTPT0tT4mYwo5fjQM8c4HMN9ZJt6dRDqDV/78m9SU4rv24PN4NiYaA==} + engines: {node: '>=12', npm: '>=6'} + resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -1721,8 +1753,8 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string-width@7.1.0: - resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} string_decoder@0.10.31: @@ -1813,8 +1845,8 @@ packages: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} - typescript-eslint@7.14.1: - resolution: {integrity: sha512-Eo1X+Y0JgGPspcANKjeR6nIqXl4VL5ldXLc15k4m9upq+eY5fhU2IueiEZL6jmHrKH8aCfbIvM/v3IrX5Hg99w==} + typescript-eslint@7.15.0: + resolution: {integrity: sha512-Ta40FhMXBCwHura4X4fncaCVkVcnJ9jnOq5+Lp4lN8F4DzHZtOwZdRvVBiNUGznUDHPwdGnrnwxmUOU2fFQqFA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1823,8 +1855,8 @@ packages: typescript: optional: true - typescript@5.5.2: - resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} + typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} engines: {node: '>=14.17'} hasBin: true @@ -1994,6 +2026,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@electron/notarize@2.3.2': + dependencies: + debug: 4.3.5 + fs-extra: 9.1.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + '@electron/osx-sign@1.3.0': dependencies: compare-version: 0.1.2 @@ -2037,14 +2077,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint-community/eslint-utils@4.4.0(eslint@9.5.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.6.0)': dependencies: - eslint: 9.5.0 + eslint: 9.6.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.1': {} + '@eslint-community/regexpp@4.11.0': {} - '@eslint/config-array@0.16.0': + '@eslint/config-array@0.17.0': dependencies: '@eslint/object-schema': 2.1.4 debug: 4.3.5 @@ -2066,7 +2106,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.5.0': {} + '@eslint/js@9.6.0': {} '@eslint/object-schema@2.1.4': {} @@ -2195,85 +2235,85 @@ snapshots: '@types/node': 20.14.9 optional: true - '@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(typescript@5.5.2)': + '@typescript-eslint/eslint-plugin@7.15.0(@typescript-eslint/parser@7.15.0(eslint@9.6.0)(typescript@5.5.3))(eslint@9.6.0)(typescript@5.5.3)': dependencies: - '@eslint-community/regexpp': 4.10.1 - '@typescript-eslint/parser': 7.14.1(eslint@9.5.0)(typescript@5.5.2) - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/type-utils': 7.14.1(eslint@9.5.0)(typescript@5.5.2) - '@typescript-eslint/utils': 7.14.1(eslint@9.5.0)(typescript@5.5.2) - '@typescript-eslint/visitor-keys': 7.14.1 - eslint: 9.5.0 + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 7.15.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.15.0 + '@typescript-eslint/type-utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 7.15.0 + eslint: 9.6.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.2) + ts-api-utils: 1.3.0(typescript@5.5.3) optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.5.2)': + '@typescript-eslint/parser@7.15.0(eslint@9.6.0)(typescript@5.5.3)': dependencies: - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) - '@typescript-eslint/visitor-keys': 7.14.1 + '@typescript-eslint/scope-manager': 7.15.0 + '@typescript-eslint/types': 7.15.0 + '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 7.15.0 debug: 4.3.5 - eslint: 9.5.0 + eslint: 9.6.0 optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.14.1': + '@typescript-eslint/scope-manager@7.15.0': dependencies: - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/visitor-keys': 7.14.1 + '@typescript-eslint/types': 7.15.0 + '@typescript-eslint/visitor-keys': 7.15.0 - '@typescript-eslint/type-utils@7.14.1(eslint@9.5.0)(typescript@5.5.2)': + '@typescript-eslint/type-utils@7.15.0(eslint@9.6.0)(typescript@5.5.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) - '@typescript-eslint/utils': 7.14.1(eslint@9.5.0)(typescript@5.5.2) + '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) + '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) debug: 4.3.5 - eslint: 9.5.0 - ts-api-utils: 1.3.0(typescript@5.5.2) + eslint: 9.6.0 + ts-api-utils: 1.3.0(typescript@5.5.3) optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.14.1': {} + '@typescript-eslint/types@7.15.0': {} - '@typescript-eslint/typescript-estree@7.14.1(typescript@5.5.2)': + '@typescript-eslint/typescript-estree@7.15.0(typescript@5.5.3)': dependencies: - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/visitor-keys': 7.14.1 + '@typescript-eslint/types': 7.15.0 + '@typescript-eslint/visitor-keys': 7.15.0 debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.5.2) + ts-api-utils: 1.3.0(typescript@5.5.3) optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.14.1(eslint@9.5.0)(typescript@5.5.2)': + '@typescript-eslint/utils@7.15.0(eslint@9.6.0)(typescript@5.5.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0) - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) - eslint: 9.5.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@typescript-eslint/scope-manager': 7.15.0 + '@typescript-eslint/types': 7.15.0 + '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) + eslint: 9.6.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.14.1': + '@typescript-eslint/visitor-keys@7.15.0': dependencies: - '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/types': 7.15.0 eslint-visitor-keys: 3.4.3 '@xmldom/xmldom@0.8.10': {} @@ -2324,7 +2364,46 @@ snapshots: app-builder-bin@5.0.0-alpha.3: {} - app-builder-lib@25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.9))(electron-builder-squirrel-windows@25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9)): + app-builder-bin@5.0.0-alpha.4: {} + + app-builder-lib@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9)): + dependencies: + '@develar/schema-utils': 2.6.5 + '@electron/notarize': 2.3.2 + '@electron/osx-sign': 1.3.0 + '@electron/rebuild': 3.6.0 + '@electron/universal': 2.0.1 + '@malept/flatpak-bundler': 0.4.0 + '@types/fs-extra': 9.0.13 + async-exit-hook: 2.0.1 + bluebird-lst: 1.0.9 + builder-util: 25.0.0-alpha.10 + builder-util-runtime: 9.2.5-alpha.3 + chromium-pickle-js: 0.2.0 + debug: 4.3.5 + dmg-builder: 25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10) + ejs: 3.1.10 + electron-builder-squirrel-windows: 25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9) + electron-publish: 25.0.0-alpha.10 + form-data: 4.0.0 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + is-ci: 3.0.1 + isbinaryfile: 5.0.2 + js-yaml: 4.1.0 + lazy-val: 1.0.5 + minimatch: 5.1.6 + read-config-file: 6.4.0 + resedit: 1.7.0 + sanitize-filename: 1.6.3 + semver: 7.6.2 + tar: 6.2.1 + temp-file: 3.4.0 + transitivePeerDependencies: + - bluebird + - supports-color + + app-builder-lib@25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9)): dependencies: '@develar/schema-utils': 2.6.5 '@electron/notarize': 2.3.0 @@ -2339,9 +2418,9 @@ snapshots: builder-util-runtime: 9.2.5-alpha.2 chromium-pickle-js: 0.2.0 debug: 4.3.5 - dmg-builder: 25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.9) + dmg-builder: 25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10) ejs: 3.1.10 - electron-builder-squirrel-windows: 25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9) + electron-builder-squirrel-windows: 25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9) electron-publish: 25.0.0-alpha.9 form-data: 4.0.0 fs-extra: 10.1.0 @@ -2476,6 +2555,34 @@ snapshots: transitivePeerDependencies: - supports-color + builder-util-runtime@9.2.5-alpha.3: + dependencies: + debug: 4.3.5 + sax: 1.4.1 + transitivePeerDependencies: + - supports-color + + builder-util@25.0.0-alpha.10: + dependencies: + 7zip-bin: 5.2.0 + '@types/debug': 4.1.12 + app-builder-bin: 5.0.0-alpha.4 + bluebird-lst: 1.0.9 + builder-util-runtime: 9.2.5-alpha.3 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.5 + fs-extra: 10.1.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-ci: 3.0.1 + js-yaml: 4.1.0 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + transitivePeerDependencies: + - supports-color + builder-util@25.0.0-alpha.9: dependencies: 7zip-bin: 5.2.0 @@ -2562,7 +2669,7 @@ snapshots: cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 - string-width: 7.1.0 + string-width: 7.2.0 cliui@7.0.4: dependencies: @@ -2610,12 +2717,12 @@ snapshots: config-file-ts@0.2.6: dependencies: glob: 10.4.2 - typescript: 5.5.2 + typescript: 5.5.3 config-file-ts@0.2.8-rc1: dependencies: glob: 10.4.2 - typescript: 5.5.2 + typescript: 5.5.3 console-control-strings@1.1.0: {} @@ -2706,9 +2813,9 @@ snapshots: dependencies: path-type: 4.0.0 - dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.9): + dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10): dependencies: - app-builder-lib: 25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.9))(electron-builder-squirrel-windows@25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9)) + app-builder-lib: 25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9)) builder-util: 25.0.0-alpha.9 builder-util-runtime: 9.2.5-alpha.2 fs-extra: 10.1.0 @@ -2749,24 +2856,24 @@ snapshots: dependencies: jake: 10.9.1 - electron-builder-squirrel-windows@25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9): + electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9): dependencies: - app-builder-lib: 25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.9))(electron-builder-squirrel-windows@25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9)) + app-builder-lib: 25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9)) archiver: 5.3.2 - builder-util: 25.0.0-alpha.9 + builder-util: 25.0.0-alpha.10 fs-extra: 10.1.0 transitivePeerDependencies: - bluebird - dmg-builder - supports-color - electron-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9)): + electron-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9)): dependencies: - app-builder-lib: 25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.9))(electron-builder-squirrel-windows@25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9)) + app-builder-lib: 25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9)) builder-util: 25.0.0-alpha.9 builder-util-runtime: 9.2.5-alpha.2 chalk: 4.1.2 - dmg-builder: 25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.9) + dmg-builder: 25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10) fs-extra: 10.1.0 is-ci: 3.0.1 lazy-val: 1.0.5 @@ -2792,6 +2899,18 @@ snapshots: electron-is-dev@3.0.1: {} + electron-publish@25.0.0-alpha.10: + dependencies: + '@types/fs-extra': 9.0.13 + builder-util: 25.0.0-alpha.10 + builder-util-runtime: 9.2.5-alpha.3 + chalk: 4.1.2 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + electron-publish@25.0.0-alpha.9: dependencies: '@types/fs-extra': 9.0.13 @@ -2855,43 +2974,43 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.5.0): + eslint-compat-utils@0.5.1(eslint@9.6.0): dependencies: - eslint: 9.5.0 + eslint: 9.6.0 semver: 7.6.2 - eslint-config-prettier@9.1.0(eslint@9.5.0): + eslint-config-prettier@9.1.0(eslint@9.6.0): dependencies: - eslint: 9.5.0 + eslint: 9.6.0 - eslint-plugin-es-x@7.7.0(eslint@9.5.0): + eslint-plugin-es-x@7.8.0(eslint@9.6.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0) - '@eslint-community/regexpp': 4.10.1 - eslint: 9.5.0 - eslint-compat-utils: 0.5.1(eslint@9.5.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/regexpp': 4.11.0 + eslint: 9.6.0 + eslint-compat-utils: 0.5.1(eslint@9.6.0) - eslint-plugin-n@17.9.0(eslint@9.5.0): + eslint-plugin-n@17.9.0(eslint@9.6.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) enhanced-resolve: 5.17.0 - eslint: 9.5.0 - eslint-plugin-es-x: 7.7.0(eslint@9.5.0) + eslint: 9.6.0 + eslint-plugin-es-x: 7.8.0(eslint@9.6.0) get-tsconfig: 4.7.5 - globals: 15.6.0 + globals: 15.7.0 ignore: 5.3.1 minimatch: 9.0.5 semver: 7.6.2 - eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.5.0))(eslint@9.5.0)(prettier@3.3.2): + eslint-plugin-prettier@5.1.3(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint@9.6.0)(prettier@3.3.2): dependencies: - eslint: 9.5.0 + eslint: 9.6.0 prettier: 3.3.2 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 optionalDependencies: '@types/eslint': 8.56.10 - eslint-config-prettier: 9.1.0(eslint@9.5.0) + eslint-config-prettier: 9.1.0(eslint@9.6.0) eslint-scope@8.0.1: dependencies: @@ -2902,13 +3021,13 @@ snapshots: eslint-visitor-keys@4.0.0: {} - eslint@9.5.0: + eslint@9.6.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0) - '@eslint-community/regexpp': 4.10.1 - '@eslint/config-array': 0.16.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/config-array': 0.17.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.5.0 + '@eslint/js': 9.6.0 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 @@ -3156,7 +3275,7 @@ snapshots: globals@14.0.0: {} - globals@15.6.0: {} + globals@15.7.0: {} globalthis@1.0.4: dependencies: @@ -3399,7 +3518,7 @@ snapshots: lowercase-keys@2.0.0: {} - lru-cache@10.2.2: {} + lru-cache@10.3.0: {} lru-cache@6.0.0: dependencies: @@ -3632,11 +3751,13 @@ snapshots: path-scurry@1.11.1: dependencies: - lru-cache: 10.2.2 + lru-cache: 10.3.0 minipass: 7.1.2 path-type@4.0.0: {} + pe-library@0.4.0: {} + pend@1.2.0: {} picomatch@2.3.1: {} @@ -3734,6 +3855,10 @@ snapshots: require-directory@2.1.1: {} + resedit@1.7.0: + dependencies: + pe-library: 0.4.0 + resolve-alpn@1.2.1: {} resolve-from@4.0.0: {} @@ -3875,7 +4000,7 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string-width@7.1.0: + string-width@7.2.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 @@ -3963,9 +4088,9 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@1.3.0(typescript@5.5.2): + ts-api-utils@1.3.0(typescript@5.5.3): dependencies: - typescript: 5.5.2 + typescript: 5.5.3 tslib@2.6.3: {} @@ -3976,18 +4101,18 @@ snapshots: type-fest@0.13.1: optional: true - typescript-eslint@7.14.1(eslint@9.5.0)(typescript@5.5.2): + typescript-eslint@7.15.0(eslint@9.6.0)(typescript@5.5.3): dependencies: - '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(typescript@5.5.2) - '@typescript-eslint/parser': 7.14.1(eslint@9.5.0)(typescript@5.5.2) - '@typescript-eslint/utils': 7.14.1(eslint@9.5.0)(typescript@5.5.2) - eslint: 9.5.0 + '@typescript-eslint/eslint-plugin': 7.15.0(@typescript-eslint/parser@7.15.0(eslint@9.6.0)(typescript@5.5.3))(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/parser': 7.15.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) + eslint: 9.6.0 optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color - typescript@5.5.2: {} + typescript@5.5.3: {} undici-types@5.26.5: {} From baddf5649760a7ec3a6cd26d4fe6edb159faf2ab Mon Sep 17 00:00:00 2001 From: awesfdawe Date: Mon, 1 Jul 2024 15:56:51 +0000 Subject: [PATCH 041/844] Translated using Weblate (Russian) Currently translated at 100.0% (86 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/ru/ --- assets/lang/ru-RU.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/assets/lang/ru-RU.json b/assets/lang/ru-RU.json index 627a864..5e64c09 100644 --- a/assets/lang/ru-RU.json +++ b/assets/lang/ru-RU.json @@ -74,15 +74,15 @@ "settings-spellcheck": "Проверка орфографии", "settings-spellcheck-desc": "Помогает исправить неправильно написанные слова, выделяя их.", "setup_question5": "Вы хотите использовать значок в трее?", - "settings-mintoTray": "Свернуть в трей", + "settings-mintoTray": "Работа в фоновом режиме", "settings-mintoTray-desc": "При отключении ArmCord будет закрываться как любое другое окно при закрытии, в противном случае он будет сидеть и отдыхать\n в системном трее.", - "settings-theme-desc4": "прозрачное окно с нативной строкой заголовка, вам нужна совместимая тема для этого. Только для Windows.", + "settings-theme-desc4": "прозрачное окно с нативной строкой заголовка, вам нужна совместимая тема для этого.", "settings-MultiInstance": "Множество Экземпляров", "settings-MultiInstance-desc": "Когда включено, вы можете запустить множество экземпляров ArmCord.", "settings-copyGPUInfo": "Копировать информацию о GPU", "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" + "settings-smoothScroll": "Использовать плавную прокрутку", + "settings-smoothScroll-desc": "Включить плавную прокрутку", + "settings-autoScroll": "Разрешить автоматическую прокрутку", + "settings-autoScroll-desc": "Разрешить автоматическую прокрутку при нажатии средней кнопки мыши (Примечание: ваша среда рабочего стола все еще может переопределить это с помощью другого действия)" } From b4e35434c22234df64c170b1235f06810c0476c9 Mon Sep 17 00:00:00 2001 From: "Mads R. Andersen" Date: Mon, 1 Jul 2024 00:52:48 +0000 Subject: [PATCH 042/844] Translated using Weblate (Danish) Currently translated at 52.3% (45 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/da/ --- assets/lang/da-DK.json | 90 +++++++++++++++++++++--------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/assets/lang/da-DK.json b/assets/lang/da-DK.json index f4f7a35..f5b9d4c 100644 --- a/assets/lang/da-DK.json +++ b/assets/lang/da-DK.json @@ -1,88 +1,88 @@ { "settings-mod-desc1": "Client mods are programs that allow you customize your Discord experience. They can change appearance of\n the client, modify behaviours or add new features!", "settings-skipSplash-desc": "Skips ArmCord splash screen when you start up the app.", - "setup_question3": "Should ArmCord handle client mods installation?", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of ArmCord.", - "settings-useLegacyCapturer-desc": "Use legacy screenshare module, instead of the new one. If you're experiencing issues with screen sharing, try enabling this.", - "settings-invitewebsocket-desc": "Uses arRPC to support Discord RPC (Rich Presence) with local programs on your machine. Work in progress.", - "settings-theme-transparent": "Transparent", + "setup_question3": "Skal ArmCord håndtere klient mods installation?", + "settings-MultiInstance-desc": "Når slået til vil du kunne starte flere instanser af ArmCord.", + "settings-useLegacyCapturer-desc": "Brug gammel/legacy skærmdelings modul, istedet for den nye. Hvis du oplever problemer med skærmdeling, så slå dette til.", + "settings-invitewebsocket-desc": "Bruger arRPC til at understøtte Discord RPC (Rich Presence) med lokale programmer på din maskine. Igangværende Arbejde.", + "settings-theme-transparent": "Gennemsigtig", "settings-crashesFolder": "Open native crashes folder", "settings-trayIcon-black-plug": "Black Plug", "settings-prfmMode-desc": "Performance mode is an experimental function that may either increase responsiveness and performance of\n ArmCord or… decrease it. Please try every option and see which fits you the best.", - "settings-channel": "Discord channel", - "settings-mod": "Client mod", - "settings-patches-desk": "Fetches patches distributed if a release turns out to have bugs. Usually\n doesn't need to be turned on continuously (unless notified in support Discord).", + "settings-channel": "Discord kanal", + "settings-mod": "Klient mod", + "settings-patches-desk": "Skaffer opdateringer hvis en udgivelse viser sig at have problemer. Behøver ikke typisk at være slået til konstant (medmindre notificeret i support Discord)", "settings-trayIcon-desc": "Set the icon which will appear in tray menu.", "settings-advanced": "Advanced user zone", - "loading_screen_start": "Starting ArmCord…", - "settings-theme-desc2": "this is how ArmCord looks when you first launch it. It includes recreation of Discord's\n custom titlebar and ArmCord specific styles injected into Discord.", - "setup_question5": "Do you want to use a tray icon?", - "settings-invitewebsocket": "Rich Presence (Experimental)", + "loading_screen_start": "Starter ArmCord…", + "settings-theme-desc2": "dette er hvordan ArmCord ser ud når du først åbner det. Det inkluderer en rekreation af Discords egen titel bar og ArmCord specifikke stylinger, 'injected' ind i Discord.", + "setup_question5": "Vil du bruge et tray ikon?", + "settings-invitewebsocket": "\"Rich Presence\" (Eksperimentalt)", "settings-save": "Save Settings", "settings-prfmMode-vaapi": "VAAPI", - "settings-tray-desc": "When disabled, ArmCord will close like any other window when closed, otherwise it'll sit back and relax in your system tray for later.", - "settings-useLegacyCapturer": "Use legacy capturer", - "settings-channel-desc3": "this is alpha test release of Discord. By using it you gain access to the newest\n features and fixes.", - "settings-theme-desc4": "transparent window with native titlebar, you need a compatible theme to run this.", - "settings-startMinimized-desc": "ArmCord starts in background and remains out of your way.", + "settings-tray-desc": "Når slået fra, vil ArmCord lukke ligesom alle andre vinduer når lukket, ellers vil det læne sig tilbage og slappe af i din system tray til senere.", + "settings-useLegacyCapturer": "Brug gammel/legacy optager", + "settings-channel-desc3": "dette er en alpha test udgivelse af Discord. Ved at bruge den får du adgang til de nyeste features og fejlrettelser.", + "settings-theme-desc4": "gennemsigtigt vindue med native titelbar, du skal have et kompatibelt tema for at bruge dette.", + "settings-startMinimized-desc": "ArmCord starter i baggrunden og forbliver ude af din vej", "settings-pluginsFolder": "Open plugins folder", - "settings-dynamicIcon": "Dynamic icon", + "settings-dynamicIcon": "Dynamisk ikon", "settings-tray": "Tray", "settings-trayIcon-normal": "Discord Icon", "settings-copyGPUInfo": "Copy GPU Info", - "settings-mintoTray": "Work in background", + "settings-mintoTray": "Arbejd i baggrunden", "settings-trayIcon-colored-plug": "Colored Plug", "settings-trayIcon-classic": "Classic Discord Icon", "settings-disableAutogain": "Disable autogain", - "loading_screen_update": "A new version of ArmCord is available. Please update to the latest version.", + "loading_screen_update": "En ny version af ArmCord er tilgængelig. Venligst opdater til den nyeste version.", "settings-experimental": "Experimental", "settings-smoothScroll-desc": "Toggle smooth scrolling", "settings-none": "None", - "settings-csp-desc": "ArmCord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.", - "loading_screen_offline": "You appear to be offline. Restart in ", - "settings-channel-desc2": "you're probably most familiar with this one. It's the one you see in default Discord\n client!", + "settings-csp-desc": "ArmCord CSP er vores system der håndterer indlæsning af brugerdefineret indhold der bliver indlæst til Discord. Ting som klient mods og temaer er afhængige af det. Slå det fra hvis du vil afskaffe mods og brugerdefinerede stile.", + "loading_screen_offline": "Det virker til du er offline. Prøver igen om ", + "settings-channel-desc2": "du er nok mest bekændt med denne. Det er den du ser i den standardte udgave af Discord!", "settings-disableAutogain-desc": "Disables autogain.", - "settings-startMinimized": "Start minimized", + "settings-startMinimized": "Start minimeret", "settings-trayIcon-white-plug-alt": "White Plug Alt", - "settings-theme-desc1": "ArmCord \"themes\" manage apps behaviour and looks.", + "settings-theme-desc1": "ArmCord \"temaer\" styrer apps opførsel og udseende.", "settings-trayIcon-dynamic": "Dynamic", - "settings-spellcheck-desc": "Helps you correct misspelled words by highlighting them.", - "settings-theme-default": "Default", + "settings-spellcheck-desc": "Hjælper dig med at rette fejlstavede ord ved at highlight dem.", + "settings-theme-default": "Standard", "settings-skipSplash": "Skip Splash Screen (Experimental)", "settings-forceNativeCrash": "Force native crash", "settings-trayIcon-white-plug": "White Plug", "settings-mod-vencord": "lightweight, and easy to use client mod. Features a built-in store for plugins.", "settings-trayIcon": "Tray icon", - "settings-channel-desc4": "public test build. Receives features earlier than stable but is a bit older than Canary.", + "settings-channel-desc4": "offentligt test build. Modtager features tidligere end stable, men er lidt ældre end Canary.", "settings-prfmMode-battery": "Battery", "settings-prfmMode": "Performance mode", "settings-trayIcon-black-plug-alt": "Black Plug Alt", - "setup_question2": "Choose your Discord channel/instance:", - "next": "Next", - "settings-spellcheck": "Spellcheck", - "no": "No", - "settings-theme-desc3": "uses native titlebar of OS you're currently running (e.g Windows 7/10). Functions more\n similar to actual Discord app on Linux.", + "setup_question2": "Vælg din Discord kanal/forekomst:", + "next": "Næste", + "settings-spellcheck": "Stavekontrol", + "no": "Nej", + "settings-theme-desc3": "bruger den indbyggede titel bar fra det OS du bruger (f.eks. Windows 7/10). Fungere mere\n ligesom den faktiske Discord app på Linux.", "settings-autoScroll": "Allow auto-scroll", "settings-mod-shelter": "is a new generation client mod built to be essentially bulletproof.", "settings-smoothScroll": "Use smooth scrolling", - "settings-patches": "Automatic Patches", + "settings-patches": "Automatiske Opdateringer", "settings-updater": "Check for updates", "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme": "ArmCord theme", - "settings-mintoTray-desc": "When disabled, ArmCord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.", + "settings-theme": "ArmCord tema", + "settings-mintoTray-desc": "Når slået fra, vil ArmCord lukke alle andre vinduer når lukket, ellers vil det læne sig tilbage og slappe af i din tray til senere.", "settings-MultiInstance": "Multi Instance", "settings-storageFolder": "Open storage folder", - "settings-mobileMode-desc": "If you're on a device with touch-screen this feature is for you! It activates Discord's hidden mobile\n mode meant for phones and tablets. Only major feature missing is voice chat support. This is ideal for\n users on PinePhone and similar.", + "settings-mobileMode-desc": "Hvis du er på en enhed med touchskærm, så er denne funktion for dig! Den aktiverer Discords gemte mobiltilstand, beregnet til telefoner og tablets. Den eneste store funktion der mangler er stemme opkald. Dette er idealt for brugere på PinePhone og ligende.", "settings-restart": "Restart App", "settings-prfmMode-performance": "Performance", - "yes": "Yes", - "settings-mobileMode": "Mobile mode", - "settings-channel-desc1": "You can use this setting to change current instance of Discord:", - "setup_question4": "Select a client mod you want to install:", - "settings-dynamicIcon-desc": "Following Discord's behaviour on Windows, this shows unread messages/pings count on ArmCord's icon instead of it's tray.", - "settings-theme-native": "Native", + "yes": "Ja", + "settings-mobileMode": "Mobiltilstand", + "settings-channel-desc1": "Du kan bruge denne indstilling til at ændre din nuværende instance af Discord", + "setup_question4": "Vælg en klient mod du vil installere:", + "settings-dynamicIcon-desc": "Ifølge med Discords opførsel på Windows, viser dette mængden af ulæste beskeder/pings på ArmCords ikon, istedet for i tray'en.", + "settings-theme-native": "Indbygget", "settings-themesFolder": "Open themes folder", - "setup_offline": "You appear to be offline. Please connect to the internet and restart ArmCord.", - "setup_question1": "Welcome to the ArmCord Setup", + "setup_offline": "Du virker til at være offline. Venligst forbind til internettet og genstart ArmCord.", + "setup_question1": "Velkommen til ArmCord Installationen", "settings-copyDebugInfo": "Copy Debug Info" } From 6102154a1fed1629b89798dfd3e44ea1c83610f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 22:23:34 -0400 Subject: [PATCH 043/844] chore(deps-dev): bump electron-builder from 25.0.0-alpha.9 to 25.0.0-alpha.10 (#645) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 158 ++++++++----------------------------------------- 2 files changed, 25 insertions(+), 135 deletions(-) diff --git a/package.json b/package.json index d265605..e835556 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@types/ws": "^8.5.10", "copyfiles": "^2.4.1", "electron": "31.1.0", - "electron-builder": "25.0.0-alpha.9", + "electron-builder": "25.0.0-alpha.10", "eslint": "^9.6.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-n": "^17.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c38535d..005005c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: arrpc: specifier: github:OpenAsar/arrpc#c62ec6a04c8d870530aa6944257fe745f6c59a24 - version: https://codeload.github.com/OpenAsar/arrpc/tar.gz/c62ec6a04c8d870530aa6944257fe745f6c59a24 + version: git+https://git@github.com:OpenAsar/arrpc.git#c62ec6a04c8d870530aa6944257fe745f6c59a24 cross-fetch: specifier: ^4.0.0 version: 4.0.0(encoding@0.1.13) @@ -49,8 +49,8 @@ importers: specifier: 31.1.0 version: 31.1.0 electron-builder: - specifier: 25.0.0-alpha.9 - version: 25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9)) + specifier: 25.0.0-alpha.10 + version: 25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10)) eslint: specifier: ^9.6.0 version: 9.6.0 @@ -91,10 +91,6 @@ packages: resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} engines: {node: '>=12'} - '@electron/notarize@2.3.0': - resolution: {integrity: sha512-EiTBU0BwE7HZZjAG1fFWQaiQpCuPrVGn7jPss1kUjD6eTTdXXd29RiZqEqkgN7xqt/Pgn4g3I7Saqovanrfj3w==} - engines: {node: '>= 10.0.0'} - '@electron/notarize@2.3.2': resolution: {integrity: sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg==} engines: {node: '>= 10.0.0'} @@ -362,9 +358,6 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - app-builder-bin@5.0.0-alpha.3: - resolution: {integrity: sha512-bWTAF50v4ZAVLq6EPZYhaLsFSJLfZz5s9MIeP5k1RkkBsibyJV/Dv6NxfaDO0I++iBmcLKsuzB5E8b1qaeXqew==} - app-builder-bin@5.0.0-alpha.4: resolution: {integrity: sha512-4MitKmOtfTdMONrtRoiaqJ6HtlVZXgrNX1PNdEzEHSAoXU85x7s+mo0IhAS9K9qgjyTVuLrM1E/HAMp5qGyoOA==} @@ -375,13 +368,6 @@ packages: dmg-builder: 25.0.0-alpha.10 electron-builder-squirrel-windows: 25.0.0-alpha.10 - app-builder-lib@25.0.0-alpha.9: - resolution: {integrity: sha512-rxkOK9QaNVmbB0Al+qA1xN6M6aIB/mMo5s7nrFmRf4p9ZFXuGcaqEBSmOUA1zf4r7pK1IpfOMiV0cS4lvXTZbQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - dmg-builder: 25.0.0-alpha.9 - electron-builder-squirrel-windows: 25.0.0-alpha.9 - aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -409,8 +395,8 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - arrpc@https://codeload.github.com/OpenAsar/arrpc/tar.gz/c62ec6a04c8d870530aa6944257fe745f6c59a24: - resolution: {tarball: https://codeload.github.com/OpenAsar/arrpc/tar.gz/c62ec6a04c8d870530aa6944257fe745f6c59a24} + arrpc@git+https://git@github.com:OpenAsar/arrpc.git#c62ec6a04c8d870530aa6944257fe745f6c59a24: + resolution: {commit: c62ec6a04c8d870530aa6944257fe745f6c59a24, repo: git@github.com:OpenAsar/arrpc.git, type: git} version: 3.4.0 hasBin: true @@ -473,10 +459,6 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - builder-util-runtime@9.2.5-alpha.2: - resolution: {integrity: sha512-/Ln2ddejGj2HNMJ+X66mKHRcOvmRzUO/dSi8t4hSV64J7IA+DE+mqDb+zogIE2gin7p7YwcGiOkKny4nwPPPXg==} - engines: {node: '>=12.0.0'} - builder-util-runtime@9.2.5-alpha.3: resolution: {integrity: sha512-ugXSJSbYBpaYeXpk2Rxa2QZdT67oRz3FFu3Lud4XK0Ijqe+OXwyAyCM4pGXJEO3VSdUn43AOJ5bUZ3gsCdQAIw==} engines: {node: '>=12.0.0'} @@ -484,9 +466,6 @@ packages: builder-util@25.0.0-alpha.10: resolution: {integrity: sha512-SrlawYIKu6UZOPWCGlbzVqbgv81jkeUPlrZbbdGb8ERIHuGR9HjnnQs7FV1QR2TKMjRsg/47I8UDtudj16qldg==} - builder-util@25.0.0-alpha.9: - resolution: {integrity: sha512-WR4YsR9YuPADtYN6a3D8qQ0quU7W9EIIVd13xA6gO2hmWxioDmJvxeF73fLfkh0S//C5GK6XXO8lTlPBN9SeFg==} - cacache@16.1.3: resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -672,8 +651,8 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dmg-builder@25.0.0-alpha.9: - resolution: {integrity: sha512-8j4ZBcVZStoedNbKKcOvjnvk9Q2RZd+aXgLtl0tpXQaLd/MmcS/IbkwnrPbqo7bguXd8yjrGlvYWiVCu3WovpA==} + dmg-builder@25.0.0-alpha.10: + resolution: {integrity: sha512-o5GMgivvf2C0531Kif5aRtHwbehCjfYA1rALHCUVoeJT4omCdzpOzRf5vpDi6DtsVfUHKjhiiKVH0AjJCQ6GSw==} dmg-license@1.0.11: resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} @@ -707,8 +686,8 @@ packages: electron-builder-squirrel-windows@25.0.0-alpha.10: resolution: {integrity: sha512-6TJygZGtt7QM3xJUZ98rbY7i/dCUCHamIR3dKZr6GanGIxCFBDwifwRrE7mvjQbfGC2Ac+1HW1ITu1rg93iGRw==} - electron-builder@25.0.0-alpha.9: - resolution: {integrity: sha512-Jy9r/WZglgi7I9jmMCd7RSeSVBeRkiYDrl8cJxHYM4VtyTerL1E7u/mennZO+x7zDf633OVOGmxfk+lPWRSmKA==} + electron-builder@25.0.0-alpha.10: + resolution: {integrity: sha512-FHNnYH57XzxRg1kFu+EdJ1+ufTMlOVEd7xrrqEU+sS8iAmjUaMj3NvRGTQYQYtlCwDbpYFoNUh7Tcr1iIWg5Sw==} engines: {node: '>=14.0.0'} hasBin: true @@ -727,9 +706,6 @@ packages: electron-publish@25.0.0-alpha.10: resolution: {integrity: sha512-1gaPPPC/TRAG9TYUW02T8+I1BlaiR2zrTA2m6iyOQ1vsa7zUqjE+VABfYBtaBJ9p+WIzwkZO8+L47cvh2dvSqA==} - electron-publish@25.0.0-alpha.9: - resolution: {integrity: sha512-vdqOXtCjrO72sZCB8hfvd8ZTKmUvWMLQ/f78Qe0UH4B+dCShtHnqbUM9Ed1Igsaw0svm2+cW+ce2yVZglr2Z3A==} - electron@31.1.0: resolution: {integrity: sha512-TBOwqLxSxnx6+pH6GMri7R3JPH2AkuGJHfWZS0p1HsmN+Qr1T9b0IRJnnehSd/3NZAmAre4ft9Ljec7zjyKFJA==} engines: {node: '>= 12.20.55'} @@ -2018,14 +1994,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/notarize@2.3.0': - dependencies: - debug: 4.3.5 - fs-extra: 9.1.0 - promise-retry: 2.0.1 - transitivePeerDependencies: - - supports-color - '@electron/notarize@2.3.2': dependencies: debug: 4.3.5 @@ -2362,11 +2330,9 @@ snapshots: ansi-styles@6.2.1: {} - app-builder-bin@5.0.0-alpha.3: {} - app-builder-bin@5.0.0-alpha.4: {} - app-builder-lib@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9)): + app-builder-lib@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10)): dependencies: '@develar/schema-utils': 2.6.5 '@electron/notarize': 2.3.2 @@ -2381,9 +2347,9 @@ snapshots: builder-util-runtime: 9.2.5-alpha.3 chromium-pickle-js: 0.2.0 debug: 4.3.5 - dmg-builder: 25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10) + dmg-builder: 25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10) ejs: 3.1.10 - electron-builder-squirrel-windows: 25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9) + electron-builder-squirrel-windows: 25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10) electron-publish: 25.0.0-alpha.10 form-data: 4.0.0 fs-extra: 10.1.0 @@ -2403,42 +2369,6 @@ snapshots: - bluebird - supports-color - app-builder-lib@25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9)): - dependencies: - '@develar/schema-utils': 2.6.5 - '@electron/notarize': 2.3.0 - '@electron/osx-sign': 1.3.0 - '@electron/rebuild': 3.6.0 - '@electron/universal': 2.0.1 - '@malept/flatpak-bundler': 0.4.0 - '@types/fs-extra': 9.0.13 - async-exit-hook: 2.0.1 - bluebird-lst: 1.0.9 - builder-util: 25.0.0-alpha.9 - builder-util-runtime: 9.2.5-alpha.2 - chromium-pickle-js: 0.2.0 - debug: 4.3.5 - dmg-builder: 25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10) - ejs: 3.1.10 - electron-builder-squirrel-windows: 25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9) - electron-publish: 25.0.0-alpha.9 - form-data: 4.0.0 - fs-extra: 10.1.0 - hosted-git-info: 4.1.0 - is-ci: 3.0.1 - isbinaryfile: 5.0.2 - js-yaml: 4.1.0 - lazy-val: 1.0.5 - minimatch: 5.1.6 - read-config-file: 6.4.0 - sanitize-filename: 1.6.3 - semver: 7.6.2 - tar: 6.2.1 - temp-file: 3.4.0 - transitivePeerDependencies: - - bluebird - - supports-color - aproba@2.0.0: {} archiver-utils@2.1.0: @@ -2486,7 +2416,7 @@ snapshots: array-union@2.1.0: {} - arrpc@https://codeload.github.com/OpenAsar/arrpc/tar.gz/c62ec6a04c8d870530aa6944257fe745f6c59a24: + arrpc@git+https://git@github.com:OpenAsar/arrpc.git#c62ec6a04c8d870530aa6944257fe745f6c59a24: dependencies: ws: 8.17.1 transitivePeerDependencies: @@ -2548,13 +2478,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - builder-util-runtime@9.2.5-alpha.2: - dependencies: - debug: 4.3.5 - sax: 1.4.1 - transitivePeerDependencies: - - supports-color - builder-util-runtime@9.2.5-alpha.3: dependencies: debug: 4.3.5 @@ -2583,27 +2506,6 @@ snapshots: transitivePeerDependencies: - supports-color - builder-util@25.0.0-alpha.9: - dependencies: - 7zip-bin: 5.2.0 - '@types/debug': 4.1.12 - app-builder-bin: 5.0.0-alpha.3 - bluebird-lst: 1.0.9 - builder-util-runtime: 9.2.5-alpha.2 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.5 - fs-extra: 10.1.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-ci: 3.0.1 - js-yaml: 4.1.0 - source-map-support: 0.5.21 - stat-mode: 1.0.0 - temp-file: 3.4.0 - transitivePeerDependencies: - - supports-color - cacache@16.1.3: dependencies: '@npmcli/fs': 2.1.2 @@ -2813,11 +2715,11 @@ snapshots: dependencies: path-type: 4.0.0 - dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10): + dmg-builder@25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10): dependencies: - app-builder-lib: 25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9)) - builder-util: 25.0.0-alpha.9 - builder-util-runtime: 9.2.5-alpha.2 + app-builder-lib: 25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10)) + builder-util: 25.0.0-alpha.10 + builder-util-runtime: 9.2.5-alpha.3 fs-extra: 10.1.0 iconv-lite: 0.6.3 js-yaml: 4.1.0 @@ -2856,9 +2758,9 @@ snapshots: dependencies: jake: 10.9.1 - electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9): + electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10): dependencies: - app-builder-lib: 25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9)) + app-builder-lib: 25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10)) archiver: 5.3.2 builder-util: 25.0.0-alpha.10 fs-extra: 10.1.0 @@ -2867,13 +2769,13 @@ snapshots: - dmg-builder - supports-color - electron-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9)): + electron-builder@25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10)): dependencies: - app-builder-lib: 25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.9)) - builder-util: 25.0.0-alpha.9 - builder-util-runtime: 9.2.5-alpha.2 + app-builder-lib: 25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10)) + builder-util: 25.0.0-alpha.10 + builder-util-runtime: 9.2.5-alpha.3 chalk: 4.1.2 - dmg-builder: 25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.10) + dmg-builder: 25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10) fs-extra: 10.1.0 is-ci: 3.0.1 lazy-val: 1.0.5 @@ -2911,18 +2813,6 @@ snapshots: transitivePeerDependencies: - supports-color - electron-publish@25.0.0-alpha.9: - dependencies: - '@types/fs-extra': 9.0.13 - builder-util: 25.0.0-alpha.9 - builder-util-runtime: 9.2.5-alpha.2 - chalk: 4.1.2 - fs-extra: 10.1.0 - lazy-val: 1.0.5 - mime: 2.6.0 - transitivePeerDependencies: - - supports-color - electron@31.1.0: dependencies: '@electron/get': 2.0.3 From 4ed397d1adc643be1fa4b3b97e36d5f95e9369e5 Mon Sep 17 00:00:00 2001 From: Aiden Date: Tue, 2 Jul 2024 15:53:21 -0400 Subject: [PATCH 044/844] fix arrpc git not resolving for whatever reason --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index e835556..6a2f3ad 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "typescript-eslint": "^7.15.0" }, "dependencies": { - "arrpc": "github:OpenAsar/arrpc#c62ec6a04c8d870530aa6944257fe745f6c59a24", + "arrpc": "git+https://github.com/OpenAsar/arrpc#c62ec6a04c8d870530aa6944257fe745f6c59a24", "cross-fetch": "^4.0.0", "electron-context-menu": "^4.0.1", "electron-is-dev": "^3.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 005005c..901df1e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: arrpc: - specifier: github:OpenAsar/arrpc#c62ec6a04c8d870530aa6944257fe745f6c59a24 - version: git+https://git@github.com:OpenAsar/arrpc.git#c62ec6a04c8d870530aa6944257fe745f6c59a24 + specifier: git+https://github.com/OpenAsar/arrpc#c62ec6a04c8d870530aa6944257fe745f6c59a24 + version: https://codeload.github.com/OpenAsar/arrpc/tar.gz/c62ec6a04c8d870530aa6944257fe745f6c59a24 cross-fetch: specifier: ^4.0.0 version: 4.0.0(encoding@0.1.13) @@ -395,8 +395,8 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - arrpc@git+https://git@github.com:OpenAsar/arrpc.git#c62ec6a04c8d870530aa6944257fe745f6c59a24: - resolution: {commit: c62ec6a04c8d870530aa6944257fe745f6c59a24, repo: git@github.com:OpenAsar/arrpc.git, type: git} + arrpc@https://codeload.github.com/OpenAsar/arrpc/tar.gz/c62ec6a04c8d870530aa6944257fe745f6c59a24: + resolution: {tarball: https://codeload.github.com/OpenAsar/arrpc/tar.gz/c62ec6a04c8d870530aa6944257fe745f6c59a24} version: 3.4.0 hasBin: true @@ -2416,7 +2416,7 @@ snapshots: array-union@2.1.0: {} - arrpc@git+https://git@github.com:OpenAsar/arrpc.git#c62ec6a04c8d870530aa6944257fe745f6c59a24: + arrpc@https://codeload.github.com/OpenAsar/arrpc/tar.gz/c62ec6a04c8d870530aa6944257fe745f6c59a24: dependencies: ws: 8.17.1 transitivePeerDependencies: From 1dbe5090904847cd46fd22ef12947dd5bb3c3532 Mon Sep 17 00:00:00 2001 From: albanobattistella Date: Mon, 8 Jul 2024 18:37:50 +0000 Subject: [PATCH 045/844] Translated using Weblate (Italian) Currently translated at 100.0% (86 of 86 strings) Translation: ArmCord/ArmCord Translate-URL: https://hosted.weblate.org/projects/armcord/armcord/it/ --- assets/lang/it-IT.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/assets/lang/it-IT.json b/assets/lang/it-IT.json index 0ea8c4f..297e7a8 100644 --- a/assets/lang/it-IT.json +++ b/assets/lang/it-IT.json @@ -74,15 +74,15 @@ "settings-spellcheck": "Controllo ortografico", "settings-spellcheck-desc": "Ti aiuta a correggere le parole errate evidenziandole.", "setup_question5": "Vuoi usare un'icona nella barra delle applicazioni?", - "settings-mintoTray": "Riduci a icona nel barra delle applicazioni", + "settings-mintoTray": "Lavora in background", "settings-mintoTray-desc": "Se disabilitato, ArmCord si chiuderà come qualsiasi altra finestra quando è chiusa, altrimenti si siederà e si rilasserà\n nella barra delle applicazioni per dopo.", - "settings-theme-desc4": "finestra trasparente con barra del titolo nativa, è necessario un tema compatibile per eseguirlo. Solo Windows.", + "settings-theme-desc4": "finestra trasparente con barra del titolo nativa, è necessario un tema compatibile per eseguirlo.", "settings-MultiInstance": "Multi-istanza", "settings-MultiInstance-desc": "Se abilitato sarai in grado di avviare molte istanze di ArmCord.", "settings-copyGPUInfo": "Copia informazioni sulla GPU", "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)" + "settings-smoothScroll": "Utilizza lo scorrimento fluido", + "settings-smoothScroll-desc": "Attiva lo scorrimento fluido", + "settings-autoScroll": "Consenti lo scorrimento automatico", + "settings-autoScroll-desc": "Consenti lo scorrimento automatico con il clic centrale (nota: l'ambiente desktop può comunque sovrascriverlo con un'altra azione)" } From 5258023c50ea3a75e4de171126b29438ad608fbb Mon Sep 17 00:00:00 2001 From: smartfridge <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 12 Jul 2024 12:55:54 -0700 Subject: [PATCH 046/844] feat: rollup (#652) * rollup base * rollup main building * fix preload * fix all browserwindows * add esbuild minify * fix some linting errors * fix linting errors * use correct arrpc repo * [temp] drop pnpm lock * recreate pnpm-lock * flush pnpm lock * clean up rollup building --------- Co-authored-by: Aiden --- eslint.config.js | 2 +- package.json | 22 +- pnpm-lock.yaml | 2677 +++++++++--------------------- rollup.config.js | 116 ++ src/discord/preload/capturer.ts | 2 +- src/discord/preload/preload.mts | 6 +- src/discord/preload/settings.ts | 6 +- src/discord/preload/titlebar.mts | 4 +- src/discord/window.ts | 6 +- src/screenshare/main.ts | 4 +- src/settings/main.ts | 4 +- src/settings/settings.html | 2 +- src/setup/main.ts | 4 +- src/setup/setup.html | 2 +- src/splash/main.ts | 4 +- src/splash/splash.html | 2 +- src/themeManager/main.ts | 4 +- tsconfig.json | 3 +- 18 files changed, 903 insertions(+), 1967 deletions(-) create mode 100644 rollup.config.js diff --git a/eslint.config.js b/eslint.config.js index cb6e6f6..dff2f4f 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,4 +1,3 @@ -/* eslint-disable n/no-unpublished-import */ // @ts-check import eslint from "@eslint/js"; @@ -31,6 +30,7 @@ export default tseslint.config( }, rules: { "no-constant-binary-expression": 0, + "n/no-unpublished-import": 0, "n/no-unsupported-features/node-builtins": 1, "@typescript-eslint/no-unused-vars": [ 2, diff --git a/package.json b/package.json index 6a2f3ad..7cc9d95 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,13 @@ "node": ">=22" }, "scripts": { - "build": "tsc && copyfiles -u 1 src/**/**/*.html src/**/**/*.css src/**/**/*.js ts-out/ && copyfiles package.json ts-out/ && copyfiles assets/**/** ts-out/", - "watch": "tsc -w", - "start": "pnpm run build && electron --trace-warnings ./ts-out/main.js", - "startThemeManager": "pnpm run build && electron ./ts-out/main.js themes", - "startWayland": "pnpm run build && electron ./ts-out/main.js --ozone-platform-hint=auto --enable-features=WebRTCPipeWireCapturer,WaylandWindowDecorations --disable-gpu", + "build:dev": "rollup -c --environment BUILD:dev", + "build": "rollup -c --environment BUILD:prod", + "bundle": "rollup -c", + "start": "pnpm run build:dev && electron --trace-warnings ./ts-out/main.js", + "runElectron": "electron --trace-warnings ./ts-out/main.js", + "startThemeManager": "pnpm run build:dev && electron ./ts-out/main.js themes", + "startWayland": "pnpm run build:dev && electron ./ts-out/main.js --ozone-platform-hint=auto --enable-features=WebRTCPipeWireCapturer,WaylandWindowDecorations --disable-gpu", "package": "pnpm run build && electron-builder", "packageQuick": "pnpm run build && electron-builder --dir", "format": "prettier --write src *.json", @@ -32,17 +34,23 @@ "homepage": "https://github.com/armcord/armcord#readme", "devDependencies": { "@eslint/js": "^9.6.0", + "@rollup/plugin-commonjs": "^26.0.1", + "@rollup/plugin-esm-shim": "^0.1.7", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-typescript": "^11.1.6", "@types/eslint__js": "^8.42.3", "@types/node": "^20.14.9", "@types/ws": "^8.5.10", - "copyfiles": "^2.4.1", "electron": "31.1.0", - "electron-builder": "25.0.0-alpha.10", "eslint": "^9.6.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-n": "^17.9.0", "eslint-plugin-prettier": "^5.1.3", "prettier": "^3.3.2", + "rollup": "^4.18.0", + "rollup-plugin-copy": "^3.5.0", + "rollup-plugin-esbuild": "^6.1.1", "typescript": "^5.5.3", "typescript-eslint": "^7.15.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 901df1e..77a4e9c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,6 +33,21 @@ importers: '@eslint/js': specifier: ^9.6.0 version: 9.6.0 + '@rollup/plugin-commonjs': + specifier: ^26.0.1 + version: 26.0.1(rollup@4.18.0) + '@rollup/plugin-esm-shim': + specifier: ^0.1.7 + version: 0.1.7(rollup@4.18.0) + '@rollup/plugin-json': + specifier: ^6.1.0 + version: 6.1.0(rollup@4.18.0) + '@rollup/plugin-node-resolve': + specifier: ^15.2.3 + version: 15.2.3(rollup@4.18.0) + '@rollup/plugin-typescript': + specifier: ^11.1.6 + version: 11.1.6(rollup@4.18.0)(tslib@2.6.3)(typescript@5.5.3) '@types/eslint__js': specifier: ^8.42.3 version: 8.42.3 @@ -42,15 +57,9 @@ importers: '@types/ws': specifier: ^8.5.10 version: 8.5.10 - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 electron: specifier: 31.1.0 version: 31.1.0 - electron-builder: - specifier: 25.0.0-alpha.10 - version: 25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10)) eslint: specifier: ^9.6.0 version: 9.6.0 @@ -66,48 +75,165 @@ importers: prettier: specifier: ^3.3.2 version: 3.3.2 + rollup: + specifier: ^4.18.0 + version: 4.18.0 + rollup-plugin-copy: + specifier: ^3.5.0 + version: 3.5.0 + rollup-plugin-esbuild: + specifier: ^6.1.1 + version: 6.1.1(esbuild@0.19.12)(rollup@4.18.0) typescript: specifier: ^5.5.3 version: 5.5.3 typescript-eslint: specifier: ^7.15.0 - version: 7.15.0(eslint@9.6.0)(typescript@5.5.3) + version: 7.16.0(eslint@9.6.0)(typescript@5.5.3) packages: - 7zip-bin@5.2.0: - resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} - - '@develar/schema-utils@2.6.5': - resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} - engines: {node: '>= 8.9.0'} - - '@electron/asar@3.2.10': - resolution: {integrity: sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==} - engines: {node: '>=10.12.0'} - hasBin: true - '@electron/get@2.0.3': resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} engines: {node: '>=12'} - '@electron/notarize@2.3.2': - resolution: {integrity: sha512-zfayxCe19euNwRycCty1C7lF7snk9YwfRpB5M8GLr1a4ICH63znxaPNAubrMvj0yDvVozqfgsdYpXVUnpWBDpg==} - engines: {node: '>= 10.0.0'} + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] - '@electron/osx-sign@1.3.0': - resolution: {integrity: sha512-TEXhxlYSDRr9JWK5nWdOv5MtuUdaZ412uxIIEQ0hLt80o0HYWtQJBlW5QmrQDMtebzATaOjKG9UfCzLyA90zWQ==} - engines: {node: '>=12.0.0'} - hasBin: true + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] - '@electron/rebuild@3.6.0': - resolution: {integrity: sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw==} - engines: {node: '>=12.13.0'} - hasBin: true + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] - '@electron/universal@2.0.1': - resolution: {integrity: sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==} - engines: {node: '>=16.4'} + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} @@ -115,8 +241,8 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + '@eslint-community/regexpp@4.10.1': + resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/config-array@0.17.0': @@ -135,9 +261,6 @@ packages: resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@gar/promisify@1.1.3': - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} @@ -150,13 +273,8 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@malept/cross-spawn-promise@2.0.0': - resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} - engines: {node: '>= 12.13.0'} - - '@malept/flatpak-bundler@0.4.0': - resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} - engines: {node: '>= 10.0.0'} + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -170,15 +288,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@npmcli/fs@2.1.2': - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - '@npmcli/move-file@2.0.1': - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -187,6 +296,144 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@rollup/plugin-commonjs@26.0.1': + resolution: {integrity: sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-esm-shim@0.1.7': + resolution: {integrity: sha512-Du+ZohybNzcg9H6iuMZwrjQo7dYetvm6E5rxFf13cUHa7XVZ8Lqz+HTKgwNekLla2wXZsNbv9dhDMW6FotwbSg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@15.2.3': + resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-typescript@11.1.6': + resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.14.0||^3.0.0||^4.0.0 + tslib: '*' + typescript: '>=3.7.0' + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.18.0': + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.18.0': + resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.18.0': + resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.18.0': + resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.18.0': + resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.18.0': + resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.18.0': + resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.18.0': + resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.18.0': + resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.18.0': + resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.18.0': + resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.18.0': + resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + cpu: [x64] + os: [win32] + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -195,16 +442,9 @@ packages: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/eslint@8.56.10': resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} @@ -214,8 +454,11 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/fs-extra@9.0.13': - resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + '@types/fs-extra@8.1.5': + resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} + + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} @@ -226,29 +469,26 @@ packages: '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} '@types/node@20.14.9': resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} - '@types/plist@3.0.5': - resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - '@types/verror@1.10.10': - resolution: {integrity: sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==} - '@types/ws@8.5.10': resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@7.15.0': - resolution: {integrity: sha512-uiNHpyjZtFrLwLDpHnzaDlP3Tt6sGMqTCiqmxaN4n4RP0EfYZDODJyddiFDF44Hjwxr5xAcaYxVKm9QKQFJFLA==} + '@typescript-eslint/eslint-plugin@7.16.0': + resolution: {integrity: sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -258,8 +498,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.15.0': - resolution: {integrity: sha512-k9fYuQNnypLFcqORNClRykkGOMOj+pV6V91R4GO/l1FDGwpqmSwoOQrOHo3cGaH63e+D3ZiCAOsuS/D2c99j/A==} + '@typescript-eslint/parser@7.16.0': + resolution: {integrity: sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -268,12 +508,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@7.15.0': - resolution: {integrity: sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw==} + '@typescript-eslint/scope-manager@7.16.0': + resolution: {integrity: sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.15.0': - resolution: {integrity: sha512-SkgriaeV6PDvpA6253PDVep0qCqgbO1IOBiycjnXsszNTVQe5flN5wR5jiczoEoDEnAqYFSFFc9al9BSGVltkg==} + '@typescript-eslint/type-utils@7.16.0': + resolution: {integrity: sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -282,12 +522,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@7.15.0': - resolution: {integrity: sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw==} + '@typescript-eslint/types@7.16.0': + resolution: {integrity: sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@7.15.0': - resolution: {integrity: sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ==} + '@typescript-eslint/typescript-estree@7.16.0': + resolution: {integrity: sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -295,23 +535,16 @@ packages: typescript: optional: true - '@typescript-eslint/utils@7.15.0': - resolution: {integrity: sha512-hfDMDqaqOqsUVGiEPSMLR/AjTSCsmJwjpKkYQRo1FNbmW4tBwBspYDwO9eh7sKSTwMQgBw9/T4DHudPaqshRWA==} + '@typescript-eslint/utils@7.16.0': + resolution: {integrity: sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.15.0': - resolution: {integrity: sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw==} + '@typescript-eslint/visitor-keys@7.16.0': + resolution: {integrity: sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==} engines: {node: ^18.18.0 || >=20.0.0} - '@xmldom/xmldom@0.8.10': - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} - engines: {node: '>=10.0.0'} - - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -322,23 +555,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -358,36 +574,6 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - app-builder-bin@5.0.0-alpha.4: - resolution: {integrity: sha512-4MitKmOtfTdMONrtRoiaqJ6HtlVZXgrNX1PNdEzEHSAoXU85x7s+mo0IhAS9K9qgjyTVuLrM1E/HAMp5qGyoOA==} - - app-builder-lib@25.0.0-alpha.10: - resolution: {integrity: sha512-RrKhTfCJLPrvIJb1+llIqJ8hMYvc+VdM6WqhpAHcwrADy4EBSA4WzqQ1sNBwlYE8AbfSNGJu+wpjqIP+HpkMbg==} - engines: {node: '>=14.0.0'} - peerDependencies: - dmg-builder: 25.0.0-alpha.10 - electron-builder-squirrel-windows: 25.0.0-alpha.10 - - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - - archiver-utils@2.1.0: - resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} - engines: {node: '>= 6'} - - archiver-utils@3.0.4: - resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} - engines: {node: '>= 10'} - - archiver@5.3.2: - resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} - engines: {node: '>= 10'} - - are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -400,43 +586,9 @@ packages: version: 3.4.0 hasBin: true - assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - - async-exit-hook@2.0.1: - resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} - engines: {node: '>=0.12.0'} - - async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - bluebird-lst@1.0.9: - resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} - - bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} @@ -453,22 +605,9 @@ packages: buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - builder-util-runtime@9.2.5-alpha.3: - resolution: {integrity: sha512-ugXSJSbYBpaYeXpk2Rxa2QZdT67oRz3FFu3Lud4XK0Ijqe+OXwyAyCM4pGXJEO3VSdUn43AOJ5bUZ3gsCdQAIw==} - engines: {node: '>=12.0.0'} - - builder-util@25.0.0-alpha.10: - resolution: {integrity: sha512-SrlawYIKu6UZOPWCGlbzVqbgv81jkeUPlrZbbdGb8ERIHuGR9HjnnQs7FV1QR2TKMjRsg/47I8UDtudj16qldg==} - - cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} @@ -486,51 +625,13 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - - chromium-pickle-js@0.2.0: - resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} - - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - - cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} - cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -538,60 +639,15 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - commander@5.1.0: - resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} - engines: {node: '>= 6'} - - compare-version@0.1.2: - resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} - engines: {node: '>=0.10.0'} - - compress-commons@4.1.2: - resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} - engines: {node: '>= 10'} + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - config-file-ts@0.2.6: - resolution: {integrity: sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==} - - config-file-ts@0.2.8-rc1: - resolution: {integrity: sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==} - - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - - copyfiles@2.4.1: - resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} - hasBin: true - - core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - - crc32-stream@4.0.3: - resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} - engines: {node: '>= 10'} - - crc@3.8.0: - resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} - cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} @@ -615,8 +671,9 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} @@ -630,67 +687,16 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dir-compare@4.2.0: - resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dmg-builder@25.0.0-alpha.10: - resolution: {integrity: sha512-o5GMgivvf2C0531Kif5aRtHwbehCjfYA1rALHCUVoeJT4omCdzpOzRf5vpDi6DtsVfUHKjhiiKVH0AjJCQ6GSw==} - - dmg-license@1.0.11: - resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} - engines: {node: '>=8'} - os: [darwin] - hasBin: true - - dotenv-expand@11.0.6: - resolution: {integrity: sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==} - engines: {node: '>=12'} - - dotenv-expand@5.1.0: - resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} - - dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - - dotenv@9.0.2: - resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} - engines: {node: '>=10'} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - - electron-builder-squirrel-windows@25.0.0-alpha.10: - resolution: {integrity: sha512-6TJygZGtt7QM3xJUZ98rbY7i/dCUCHamIR3dKZr6GanGIxCFBDwifwRrE7mvjQbfGC2Ac+1HW1ITu1rg93iGRw==} - - electron-builder@25.0.0-alpha.10: - resolution: {integrity: sha512-FHNnYH57XzxRg1kFu+EdJ1+ufTMlOVEd7xrrqEU+sS8iAmjUaMj3NvRGTQYQYtlCwDbpYFoNUh7Tcr1iIWg5Sw==} - engines: {node: '>=14.0.0'} - hasBin: true - electron-context-menu@4.0.1: resolution: {integrity: sha512-tPRzsIK48gm+DDP4FLJeocrFg1rJBH7ZgQx3j4ebt5d6euM2ERAB8pdBmKyhHy7na/BiZfrw4ASMq97oVwQXgw==} engines: {node: '>=18'} @@ -703,9 +709,6 @@ packages: resolution: {integrity: sha512-8TjjAh8Ec51hUi3o4TaU0mD3GMTOESi866oRNavj9A3IQJ7pmv+MJVmdZBFGw4GFT36X7bkqnuDNYvkQgvyI8Q==} engines: {node: '>=18'} - electron-publish@25.0.0-alpha.10: - resolution: {integrity: sha512-1gaPPPC/TRAG9TYUW02T8+I1BlaiR2zrTA2m6iyOQ1vsa7zUqjE+VABfYBtaBJ9p+WIzwkZO8+L47cvh2dvSqA==} - electron@31.1.0: resolution: {integrity: sha512-TBOwqLxSxnx6+pH6GMri7R3JPH2AkuGJHfWZS0p1HsmN+Qr1T9b0IRJnnehSd/3NZAmAre4ft9Ljec7zjyKFJA==} engines: {node: '>= 12.20.55'} @@ -734,9 +737,6 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} @@ -745,12 +745,16 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true escape-goat@4.0.0: resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} @@ -776,8 +780,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-es-x@7.8.0: - resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + eslint-plugin-es-x@7.7.0: + resolution: {integrity: sha512-aP3qj8BwiEDPttxQkZdI221DLKq9sI/qHolE2YSQL1/9+xk7dTV+tB1Fz8/IaCA+lnLA1bDEnvaS2LKs0k2Uig==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' @@ -835,13 +839,13 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - ext-list@2.2.2: resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} engines: {node: '>=0.10.0'} @@ -855,10 +859,6 @@ packages: engines: {node: '>= 10.17.0'} hasBin: true - extsprintf@1.4.1: - resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} - engines: {'0': node >=0.6.0} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -885,9 +885,6 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -907,48 +904,21 @@ packages: resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.2.0: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} @@ -972,20 +942,15 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.2: - resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} - engines: {node: '>=16 || 14 >=14.18'} + glob@10.4.3: + resolution: {integrity: sha512-Q38SGlYRpVtDBPSWEylRyctn7uDeTp4NQERTLiCT1FqA9JXPYWqAVmQU6qh4r/zMM5ehxTcbaO8EjhWnvEhmyg==} + engines: {node: '>=18'} hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - global-agent@3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} engines: {node: '>=10.0'} @@ -994,14 +959,18 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.7.0: - resolution: {integrity: sha512-ivatRXWwKC6ImcdKO7dOwXuXR5XFrdwo45qFwD7D0qOkEPzzJdLXC3BHceBdyrPOD3p1suPaWi4Y4NMm2D++AQ==} + globals@15.6.0: + resolution: {integrity: sha512-UzcJi88Hw//CurUIRa9Jxb0vgOCcuD/MNjwmXp633cyaRKkCWACkoqHCtfZv43b1kqXGg/fpOa8bwgacCeXsVg==} engines: {node: '>=18'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} + globby@10.0.1: + resolution: {integrity: sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==} + engines: {node: '>=8'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -1034,47 +1003,21 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - http2-wrapper@1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - iconv-corefoundation@1.1.7: - resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} - engines: {node: ^8.11.2 || >=10} - os: [darwin] - iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} @@ -1087,13 +1030,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -1101,13 +1037,13 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} - is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true + is-core-module@2.14.0: + resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} + engines: {node: '>= 0.4'} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} @@ -1125,12 +1061,8 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - - is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} @@ -1144,43 +1076,24 @@ packages: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + is-plain-object@3.0.1: + resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} + engines: {node: '>=0.10.0'} - isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - isbinaryfile@4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} - - isbinaryfile@5.0.2: - resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==} - engines: {node: '>= 18.0.0'} + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} - - jake@10.9.1: - resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==} - engines: {node: '>=10'} - hasBin: true + jackspeak@3.4.1: + resolution: {integrity: sha512-U23pQPDnmYybVkYjObcuYMk43VRlMLLqLI+RdZy8s8WV8WsxO9SnqSroKaluuvcNOdCAlauKszDwd+umbot5Mg==} + engines: {node: '>=18'} js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -1193,27 +1106,12 @@ packages: json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - lazy-val@1.0.5: - resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} - - lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -1222,50 +1120,19 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - - lodash.difference@4.5.0: - resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} - - lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} - lru-cache@10.3.0: - resolution: {integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==} - engines: {node: 14 || >=16.14} + lru-cache@10.3.1: + resolution: {integrity: sha512-9/8QXrtbGeMB6LxwQd4x1tIMnsmUxMvIH/qWGsccz6bt9Uln3S+sgAaqfQNhbGA8ufzs2fHuP/yqapGgP9Hh2g==} + engines: {node: '>=18'} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - - make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} @@ -1283,19 +1150,6 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} @@ -1307,81 +1161,20 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - - minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - - minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - node-abi@3.65.0: - resolution: {integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==} - engines: {node: '>=10'} - - node-addon-api@1.7.2: - resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} - - node-api-version@0.2.0: - resolution: {integrity: sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==} - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -1391,32 +1184,10 @@ packages: encoding: optional: true - node-gyp@9.4.1: - resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true - - noms@0.0.0: - resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} - - nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} - npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -1424,18 +1195,10 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} @@ -1448,10 +1211,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} @@ -1475,6 +1234,9 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} @@ -1483,10 +1245,6 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pe-library@0.4.0: - resolution: {integrity: sha512-JAmVv2jGxmczplhHO7UoFGJ+pM/yMBpny3vNjwNFuaeQfzKlekQidZ8Ss8EJ0qee8wEQN4lY2IwtWx2oRfMsag==} - engines: {node: '>=12', npm: '>=6'} - pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -1494,10 +1252,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - plist@3.1.0: - resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} - engines: {node: '>=10.4.0'} - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -1511,25 +1265,10 @@ packages: engines: {node: '>=14'} hasBin: true - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} - promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} @@ -1548,39 +1287,6 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - read-binary-file-arch@1.0.6: - resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} - hasBin: true - - read-config-file@6.3.2: - resolution: {integrity: sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==} - engines: {node: '>=12.0.0'} - - read-config-file@6.4.0: - resolution: {integrity: sha512-uB5QOBeF84PT61GlV11OTV4jUGHAO3iDEOP6v9ygxhG6Bs9PLg7WsjNT6mtIX2G+x8lJTr4ZWNeG6LDTKkNf2Q==} - engines: {node: '>=12.0.0'} - - readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - resedit@1.7.0: - resolution: {integrity: sha512-dbsZ0gk5opWPFlKMqvxCrLCuMZUVmsW3yTPT0tT4mYwo5fjQM8c4HMN9ZJt6dRDqDV/78m9SU4rv24PN4NiYaA==} - engines: {node: '>=12', npm: '>=6'} - resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -1591,48 +1297,43 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - roarr@2.15.4: resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} engines: {node: '>=8.0'} + rollup-plugin-copy@3.5.0: + resolution: {integrity: sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==} + engines: {node: '>=8.3'} + + rollup-plugin-esbuild@6.1.1: + resolution: {integrity: sha512-CehMY9FAqJD5OUaE/Mi1r5z0kNeYxItmRO2zG4Qnv2qWKF09J2lTy5GUzjJR354ZPrLkCj4fiBN41lo8PzBUhw==} + engines: {node: '>=14.18.0'} + peerDependencies: + esbuild: '>=0.18.0' + rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + + rollup@4.18.0: + resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sanitize-filename@1.6.3: - resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} - - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} @@ -1649,9 +1350,6 @@ packages: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1660,41 +1358,18 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} - slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} - - socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - sort-keys-length@1.0.1: resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} engines: {node: '>=0.10.0'} @@ -1703,24 +1378,9 @@ packages: resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} engines: {node: '>=0.10.0'} - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - stat-mode@1.0.0: - resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} - engines: {node: '>= 6'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1729,19 +1389,10 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} engines: {node: '>=18'} - string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1762,6 +1413,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + synckit@0.8.8: resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1770,30 +1425,9 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - - temp-file@3.4.0: - resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - - tmp-promise@3.0.3: - resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} - - tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} - engines: {node: '>=14.14'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1801,9 +1435,6 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - truncate-utf8-bytes@1.0.2: - resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -1821,8 +1452,8 @@ packages: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} - typescript-eslint@7.15.0: - resolution: {integrity: sha512-Ta40FhMXBCwHura4X4fncaCVkVcnJ9jnOq5+Lp4lN8F4DzHZtOwZdRvVBiNUGznUDHPwdGnrnwxmUOU2fFQqFA==} + typescript-eslint@7.16.0: + resolution: {integrity: sha512-kaVRivQjOzuoCXU6+hLnjo3/baxyzWVO5GrnExkFzETRYJKVHYkrJglOu2OCm8Hi9RPDWX1PTNNTpU5KRV0+RA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1839,26 +1470,10 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - unused-filename@4.0.1: resolution: {integrity: sha512-ZX6U1J04K1FoSUeoX1OicAhw4d0aro2qo+L8RhJkiGTNtBNkd/Fi1Wxoc9HzcVu6HfOzm0si/N15JjxFmD1z6A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1866,22 +1481,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - utf8-byte-length@1.0.5: - resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - v8-compile-cache@2.4.0: resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} - verror@1.10.1: - resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} - engines: {node: '>=0.6.0'} - - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -1893,9 +1495,6 @@ packages: engines: {node: '>= 8'} hasBin: true - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -1923,37 +1522,6 @@ packages: utf-8-validate: optional: true - xmlbuilder@15.1.1: - resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} - engines: {node: '>=8.0'} - - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} @@ -1961,25 +1529,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zip-stream@4.1.1: - resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} - engines: {node: '>= 10'} - snapshots: - 7zip-bin@5.2.0: {} - - '@develar/schema-utils@2.6.5': - dependencies: - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - '@electron/asar@3.2.10': - dependencies: - commander: 5.1.0 - glob: 7.2.3 - minimatch: 3.1.2 - '@electron/get@2.0.3': dependencies: debug: 4.3.5 @@ -1994,63 +1545,81 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/notarize@2.3.2': - dependencies: - debug: 4.3.5 - fs-extra: 9.1.0 - promise-retry: 2.0.1 - transitivePeerDependencies: - - supports-color + '@esbuild/aix-ppc64@0.19.12': + optional: true - '@electron/osx-sign@1.3.0': - dependencies: - compare-version: 0.1.2 - debug: 4.3.5 - fs-extra: 10.1.0 - isbinaryfile: 4.0.10 - minimist: 1.2.8 - plist: 3.1.0 - transitivePeerDependencies: - - supports-color + '@esbuild/android-arm64@0.19.12': + optional: true - '@electron/rebuild@3.6.0': - dependencies: - '@malept/cross-spawn-promise': 2.0.0 - chalk: 4.1.2 - debug: 4.3.5 - detect-libc: 2.0.3 - fs-extra: 10.1.0 - got: 11.8.6 - node-abi: 3.65.0 - node-api-version: 0.2.0 - node-gyp: 9.4.1 - ora: 5.4.1 - read-binary-file-arch: 1.0.6 - semver: 7.6.2 - tar: 6.2.1 - yargs: 17.7.2 - transitivePeerDependencies: - - bluebird - - supports-color + '@esbuild/android-arm@0.19.12': + optional: true - '@electron/universal@2.0.1': - dependencies: - '@electron/asar': 3.2.10 - '@malept/cross-spawn-promise': 2.0.0 - debug: 4.3.5 - dir-compare: 4.2.0 - fs-extra: 11.2.0 - minimatch: 9.0.5 - plist: 3.1.0 - transitivePeerDependencies: - - supports-color + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true '@eslint-community/eslint-utils@4.4.0(eslint@9.6.0)': dependencies: eslint: 9.6.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.0': {} + '@eslint-community/regexpp@4.10.1': {} '@eslint/config-array@0.17.0': dependencies: @@ -2078,8 +1647,6 @@ snapshots: '@eslint/object-schema@2.1.4': {} - '@gar/promisify@1.1.3': {} - '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.3.0': {} @@ -2093,18 +1660,7 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@malept/cross-spawn-promise@2.0.0': - dependencies: - cross-spawn: 7.0.3 - - '@malept/flatpak-bundler@0.4.0': - dependencies: - debug: 4.3.5 - fs-extra: 9.1.0 - lodash: 4.17.21 - tmp-promise: 3.0.3 - transitivePeerDependencies: - - supports-color + '@jridgewell/sourcemap-codec@1.4.15': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -2118,29 +1674,116 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@npmcli/fs@2.1.2': - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.6.2 - - '@npmcli/move-file@2.0.1': - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - '@pkgjs/parseargs@0.11.0': optional: true '@pkgr/core@0.1.1': {} + '@rollup/plugin-commonjs@26.0.1(rollup@4.18.0)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 10.4.3 + is-reference: 1.2.1 + magic-string: 0.30.10 + optionalDependencies: + rollup: 4.18.0 + + '@rollup/plugin-esm-shim@0.1.7(rollup@4.18.0)': + dependencies: + magic-string: 0.30.10 + optionalDependencies: + rollup: 4.18.0 + + '@rollup/plugin-json@6.1.0(rollup@4.18.0)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + optionalDependencies: + rollup: 4.18.0 + + '@rollup/plugin-node-resolve@15.2.3(rollup@4.18.0)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.8 + optionalDependencies: + rollup: 4.18.0 + + '@rollup/plugin-typescript@11.1.6(rollup@4.18.0)(tslib@2.6.3)(typescript@5.5.3)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + resolve: 1.22.8 + typescript: 5.5.3 + optionalDependencies: + rollup: 4.18.0 + tslib: 2.6.3 + + '@rollup/pluginutils@5.1.0(rollup@4.18.0)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.18.0 + + '@rollup/rollup-android-arm-eabi@4.18.0': + optional: true + + '@rollup/rollup-android-arm64@4.18.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.18.0': + optional: true + + '@rollup/rollup-darwin-x64@4.18.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.18.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.18.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.18.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.18.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.18.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.18.0': + optional: true + '@sindresorhus/is@4.6.0': {} '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 - '@tootallnate/once@2.0.0': {} - '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 @@ -2148,10 +1791,6 @@ snapshots: '@types/node': 20.14.9 '@types/responselike': 1.0.3 - '@types/debug@4.1.12': - dependencies: - '@types/ms': 0.7.34 - '@types/eslint@8.56.10': dependencies: '@types/estree': 1.0.5 @@ -2163,10 +1802,15 @@ snapshots: '@types/estree@1.0.5': {} - '@types/fs-extra@9.0.13': + '@types/fs-extra@8.1.5': dependencies: '@types/node': 20.14.9 + '@types/glob@7.2.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 20.14.9 + '@types/http-cache-semantics@4.0.4': {} '@types/json-schema@7.0.15': {} @@ -2175,25 +1819,18 @@ snapshots: dependencies: '@types/node': 20.14.9 - '@types/ms@0.7.34': {} + '@types/minimatch@5.1.2': {} '@types/node@20.14.9': dependencies: undici-types: 5.26.5 - '@types/plist@3.0.5': - dependencies: - '@types/node': 20.14.9 - xmlbuilder: 15.1.1 - optional: true + '@types/resolve@1.20.2': {} '@types/responselike@1.0.3': dependencies: '@types/node': 20.14.9 - '@types/verror@1.10.10': - optional: true - '@types/ws@8.5.10': dependencies: '@types/node': 20.14.9 @@ -2203,14 +1840,14 @@ snapshots: '@types/node': 20.14.9 optional: true - '@typescript-eslint/eslint-plugin@7.15.0(@typescript-eslint/parser@7.15.0(eslint@9.6.0)(typescript@5.5.3))(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/eslint-plugin@7.16.0(@typescript-eslint/parser@7.16.0(eslint@9.6.0)(typescript@5.5.3))(eslint@9.6.0)(typescript@5.5.3)': dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/type-utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.15.0 + '@eslint-community/regexpp': 4.10.1 + '@typescript-eslint/parser': 7.16.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/type-utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 7.16.0 eslint: 9.6.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -2221,12 +1858,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.15.0(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/parser@7.16.0(eslint@9.6.0)(typescript@5.5.3)': dependencies: - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.15.0 + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 7.16.0 debug: 4.3.5 eslint: 9.6.0 optionalDependencies: @@ -2234,15 +1871,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.15.0': + '@typescript-eslint/scope-manager@7.16.0': dependencies: - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/visitor-keys': 7.15.0 + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/visitor-keys': 7.16.0 - '@typescript-eslint/type-utils@7.15.0(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/type-utils@7.16.0(eslint@9.6.0)(typescript@5.5.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) debug: 4.3.5 eslint: 9.6.0 ts-api-utils: 1.3.0(typescript@5.5.3) @@ -2251,12 +1888,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.15.0': {} + '@typescript-eslint/types@7.16.0': {} - '@typescript-eslint/typescript-estree@7.15.0(typescript@5.5.3)': + '@typescript-eslint/typescript-estree@7.16.0(typescript@5.5.3)': dependencies: - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/visitor-keys': 7.15.0 + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/visitor-keys': 7.16.0 debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 @@ -2268,51 +1905,28 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.15.0(eslint@9.6.0)(typescript@5.5.3)': + '@typescript-eslint/utils@7.16.0(eslint@9.6.0)(typescript@5.5.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - '@typescript-eslint/scope-manager': 7.15.0 - '@typescript-eslint/types': 7.15.0 - '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.16.0 + '@typescript-eslint/types': 7.16.0 + '@typescript-eslint/typescript-estree': 7.16.0(typescript@5.5.3) eslint: 9.6.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.15.0': + '@typescript-eslint/visitor-keys@7.16.0': dependencies: - '@typescript-eslint/types': 7.15.0 + '@typescript-eslint/types': 7.16.0 eslint-visitor-keys: 3.4.3 - '@xmldom/xmldom@0.8.10': {} - - abbrev@1.1.1: {} - acorn-jsx@5.3.2(acorn@8.12.0): dependencies: acorn: 8.12.0 acorn@8.12.0: {} - agent-base@6.0.2: - dependencies: - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - - ajv-keywords@3.5.2(ajv@6.12.6): - dependencies: - ajv: 6.12.6 - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -2330,88 +1944,6 @@ snapshots: ansi-styles@6.2.1: {} - app-builder-bin@5.0.0-alpha.4: {} - - app-builder-lib@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10)): - dependencies: - '@develar/schema-utils': 2.6.5 - '@electron/notarize': 2.3.2 - '@electron/osx-sign': 1.3.0 - '@electron/rebuild': 3.6.0 - '@electron/universal': 2.0.1 - '@malept/flatpak-bundler': 0.4.0 - '@types/fs-extra': 9.0.13 - async-exit-hook: 2.0.1 - bluebird-lst: 1.0.9 - builder-util: 25.0.0-alpha.10 - builder-util-runtime: 9.2.5-alpha.3 - chromium-pickle-js: 0.2.0 - debug: 4.3.5 - dmg-builder: 25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10) - ejs: 3.1.10 - electron-builder-squirrel-windows: 25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10) - electron-publish: 25.0.0-alpha.10 - form-data: 4.0.0 - fs-extra: 10.1.0 - hosted-git-info: 4.1.0 - is-ci: 3.0.1 - isbinaryfile: 5.0.2 - js-yaml: 4.1.0 - lazy-val: 1.0.5 - minimatch: 5.1.6 - read-config-file: 6.4.0 - resedit: 1.7.0 - sanitize-filename: 1.6.3 - semver: 7.6.2 - tar: 6.2.1 - temp-file: 3.4.0 - transitivePeerDependencies: - - bluebird - - supports-color - - aproba@2.0.0: {} - - archiver-utils@2.1.0: - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 2.3.8 - - archiver-utils@3.0.4: - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 3.6.2 - - archiver@5.3.2: - dependencies: - archiver-utils: 2.1.0 - async: 3.2.5 - buffer-crc32: 0.2.13 - readable-stream: 3.6.2 - readdir-glob: 1.1.3 - tar-stream: 2.2.0 - zip-stream: 4.1.1 - - are-we-there-yet@3.0.1: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - argparse@2.0.1: {} array-union@2.1.0: {} @@ -2423,36 +1955,8 @@ snapshots: - bufferutil - utf-8-validate - assert-plus@1.0.0: - optional: true - - astral-regex@2.0.0: - optional: true - - async-exit-hook@2.0.1: {} - - async@3.2.5: {} - - asynckit@0.4.0: {} - - at-least-node@1.0.0: {} - balanced-match@1.0.2: {} - base64-js@1.5.1: {} - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - bluebird-lst@1.0.9: - dependencies: - bluebird: 3.7.2 - - bluebird@3.7.2: {} - boolean@3.2.0: optional: true @@ -2471,63 +1975,7 @@ snapshots: buffer-crc32@0.2.13: {} - buffer-from@1.1.2: {} - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - builder-util-runtime@9.2.5-alpha.3: - dependencies: - debug: 4.3.5 - sax: 1.4.1 - transitivePeerDependencies: - - supports-color - - builder-util@25.0.0-alpha.10: - dependencies: - 7zip-bin: 5.2.0 - '@types/debug': 4.1.12 - app-builder-bin: 5.0.0-alpha.4 - bluebird-lst: 1.0.9 - builder-util-runtime: 9.2.5-alpha.3 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.5 - fs-extra: 10.1.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-ci: 3.0.1 - js-yaml: 4.1.0 - source-map-support: 0.5.21 - stat-mode: 1.0.0 - temp-file: 3.4.0 - transitivePeerDependencies: - - supports-color - - cacache@16.1.3: - dependencies: - '@npmcli/fs': 2.1.2 - '@npmcli/move-file': 2.0.1 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 8.1.0 - infer-owner: 1.0.4 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 9.0.1 - tar: 6.2.1 - unique-filename: 2.0.1 - transitivePeerDependencies: - - bluebird + builtin-modules@3.3.0: {} cacheable-lookup@5.0.4: {} @@ -2548,113 +1996,27 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chownr@2.0.0: {} - - chromium-pickle-js@0.2.0: {} - - ci-info@3.9.0: {} - - clean-stack@2.2.0: {} - - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-spinners@2.9.2: {} - - cli-truncate@2.1.0: - dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 - optional: true - cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 - string-width: 7.2.0 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + string-width: 7.1.0 clone-response@1.0.3: dependencies: mimic-response: 1.0.1 - clone@1.0.4: {} - color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.4: {} - color-support@1.1.3: {} + colorette@1.4.0: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - commander@5.1.0: {} - - compare-version@0.1.2: {} - - compress-commons@4.1.2: - dependencies: - buffer-crc32: 0.2.13 - crc32-stream: 4.0.3 - normalize-path: 3.0.0 - readable-stream: 3.6.2 + commondir@1.0.1: {} concat-map@0.0.1: {} - config-file-ts@0.2.6: - dependencies: - glob: 10.4.2 - typescript: 5.5.3 - - config-file-ts@0.2.8-rc1: - dependencies: - glob: 10.4.2 - typescript: 5.5.3 - - console-control-strings@1.1.0: {} - - copyfiles@2.4.1: - dependencies: - glob: 7.2.3 - minimatch: 3.1.2 - mkdirp: 1.0.4 - noms: 0.0.0 - through2: 2.0.5 - untildify: 4.0.0 - yargs: 16.2.0 - - core-util-is@1.0.2: - optional: true - - core-util-is@1.0.3: {} - - crc-32@1.2.2: {} - - crc32-stream@4.0.3: - dependencies: - crc-32: 1.2.2 - readable-stream: 3.6.2 - - crc@3.8.0: - dependencies: - buffer: 5.7.1 - optional: true - cross-fetch@4.0.0(encoding@0.1.13): dependencies: node-fetch: 2.7.0(encoding@0.1.13) @@ -2677,9 +2039,7 @@ snapshots: deep-is@0.1.4: {} - defaults@1.0.4: - dependencies: - clone: 1.0.4 + deepmerge@4.3.1: {} defer-to-connect@2.0.1: {} @@ -2697,96 +2057,15 @@ snapshots: object-keys: 1.1.1 optional: true - delayed-stream@1.0.0: {} - - delegates@1.0.0: {} - - detect-libc@2.0.3: {} - detect-node@2.1.0: optional: true - dir-compare@4.2.0: - dependencies: - minimatch: 3.1.2 - p-limit: 3.1.0 - dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dmg-builder@25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10): - dependencies: - app-builder-lib: 25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10)) - builder-util: 25.0.0-alpha.10 - builder-util-runtime: 9.2.5-alpha.3 - fs-extra: 10.1.0 - iconv-lite: 0.6.3 - js-yaml: 4.1.0 - optionalDependencies: - dmg-license: 1.0.11 - transitivePeerDependencies: - - bluebird - - electron-builder-squirrel-windows - - supports-color - - dmg-license@1.0.11: - dependencies: - '@types/plist': 3.0.5 - '@types/verror': 1.10.10 - ajv: 6.12.6 - crc: 3.8.0 - iconv-corefoundation: 1.1.7 - plist: 3.1.0 - smart-buffer: 4.2.0 - verror: 1.10.1 - optional: true - - dotenv-expand@11.0.6: - dependencies: - dotenv: 16.4.5 - - dotenv-expand@5.1.0: {} - - dotenv@16.4.5: {} - - dotenv@9.0.2: {} - eastasianwidth@0.2.0: {} - ejs@3.1.10: - dependencies: - jake: 10.9.1 - - electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10): - dependencies: - app-builder-lib: 25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10)) - archiver: 5.3.2 - builder-util: 25.0.0-alpha.10 - fs-extra: 10.1.0 - transitivePeerDependencies: - - bluebird - - dmg-builder - - supports-color - - electron-builder@25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10)): - dependencies: - app-builder-lib: 25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10))(electron-builder-squirrel-windows@25.0.0-alpha.10(dmg-builder@25.0.0-alpha.10)) - builder-util: 25.0.0-alpha.10 - builder-util-runtime: 9.2.5-alpha.3 - chalk: 4.1.2 - dmg-builder: 25.0.0-alpha.10(electron-builder-squirrel-windows@25.0.0-alpha.10) - fs-extra: 10.1.0 - is-ci: 3.0.1 - lazy-val: 1.0.5 - read-config-file: 6.3.2 - simple-update-notifier: 2.0.0 - yargs: 17.7.2 - transitivePeerDependencies: - - bluebird - - electron-builder-squirrel-windows - - supports-color - electron-context-menu@4.0.1: dependencies: cli-truncate: 4.0.0 @@ -2801,18 +2080,6 @@ snapshots: electron-is-dev@3.0.1: {} - electron-publish@25.0.0-alpha.10: - dependencies: - '@types/fs-extra': 9.0.13 - builder-util: 25.0.0-alpha.10 - builder-util-runtime: 9.2.5-alpha.3 - chalk: 4.1.2 - fs-extra: 10.1.0 - lazy-val: 1.0.5 - mime: 2.6.0 - transitivePeerDependencies: - - supports-color - electron@31.1.0: dependencies: '@electron/get': 2.0.3 @@ -2843,8 +2110,6 @@ snapshots: env-paths@2.2.1: {} - err-code@2.0.3: {} - es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 @@ -2853,10 +2118,36 @@ snapshots: es-errors@1.3.0: optional: true + es-module-lexer@1.5.4: {} + es6-error@4.1.1: optional: true - escalade@3.1.2: {} + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 escape-goat@4.0.0: {} @@ -2873,10 +2164,10 @@ snapshots: dependencies: eslint: 9.6.0 - eslint-plugin-es-x@7.8.0(eslint@9.6.0): + eslint-plugin-es-x@7.7.0(eslint@9.6.0): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - '@eslint-community/regexpp': 4.11.0 + '@eslint-community/regexpp': 4.10.1 eslint: 9.6.0 eslint-compat-utils: 0.5.1(eslint@9.6.0) @@ -2885,9 +2176,9 @@ snapshots: '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) enhanced-resolve: 5.17.0 eslint: 9.6.0 - eslint-plugin-es-x: 7.8.0(eslint@9.6.0) + eslint-plugin-es-x: 7.7.0(eslint@9.6.0) get-tsconfig: 4.7.5 - globals: 15.7.0 + globals: 15.6.0 ignore: 5.3.1 minimatch: 9.0.5 semver: 7.6.2 @@ -2914,7 +2205,7 @@ snapshots: eslint@9.6.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - '@eslint-community/regexpp': 4.11.0 + '@eslint-community/regexpp': 4.10.1 '@eslint/config-array': 0.17.0 '@eslint/eslintrc': 3.1.0 '@eslint/js': 9.6.0 @@ -2966,9 +2257,9 @@ snapshots: estraverse@5.3.0: {} - esutils@2.0.3: {} + estree-walker@2.0.2: {} - exponential-backoff@3.1.1: {} + esutils@2.0.3: {} ext-list@2.2.2: dependencies: @@ -2989,9 +2280,6 @@ snapshots: transitivePeerDependencies: - supports-color - extsprintf@1.4.1: - optional: true - fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -3020,10 +2308,6 @@ snapshots: dependencies: flat-cache: 4.0.1 - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -3045,60 +2329,18 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - form-data@4.0.0: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - fs-constants@1.0.0: {} - - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-extra@11.2.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - fs-extra@9.1.0: - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - fs.realpath@1.0.0: {} - function-bind@1.1.2: + fsevents@2.3.3: optional: true - gauge@4.0.4: - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - - get-caller-file@2.0.5: {} + function-bind@1.1.2: {} get-east-asian-width@1.2.0: {} @@ -3127,10 +2369,10 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.2: + glob@10.4.3: dependencies: foreground-child: 3.2.1 - jackspeak: 3.4.0 + jackspeak: 3.4.1 minimatch: 9.0.5 minipass: 7.1.2 package-json-from-dist: 1.0.0 @@ -3145,14 +2387,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - global-agent@3.0.0: dependencies: boolean: 3.2.0 @@ -3165,7 +2399,7 @@ snapshots: globals@14.0.0: {} - globals@15.7.0: {} + globals@15.6.0: {} globalthis@1.0.4: dependencies: @@ -3173,6 +2407,17 @@ snapshots: gopd: 1.0.1 optional: true + globby@10.0.1: + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + glob: 7.2.3 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -3218,54 +2463,21 @@ snapshots: has-symbols@1.0.3: optional: true - has-unicode@2.0.1: {} - hasown@2.0.2: dependencies: function-bind: 1.1.2 - optional: true - - hosted-git-info@4.1.0: - dependencies: - lru-cache: 6.0.0 http-cache-semantics@4.1.1: {} - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - http2-wrapper@1.0.3: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - iconv-corefoundation@1.1.7: - dependencies: - cli-truncate: 2.1.0 - node-addon-api: 1.7.2 - optional: true - iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - - ieee754@1.2.1: {} + optional: true ignore@5.3.1: {} @@ -3276,10 +2488,6 @@ snapshots: imurmurhash@0.1.4: {} - indent-string@4.0.0: {} - - infer-owner@1.0.4: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -3287,14 +2495,13 @@ snapshots: inherits@2.0.4: {} - ip-address@9.0.5: + is-builtin-module@3.2.1: dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 + builtin-modules: 3.3.0 - is-ci@3.0.1: + is-core-module@2.14.0: dependencies: - ci-info: 3.9.0 + hasown: 2.0.2 is-extglob@2.1.1: {} @@ -3306,9 +2513,7 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-interactive@1.0.0: {} - - is-lambda@1.0.1: {} + is-module@1.0.0: {} is-number@7.0.0: {} @@ -3316,37 +2521,24 @@ snapshots: is-plain-obj@1.1.0: {} - is-unicode-supported@0.1.0: {} + is-plain-object@3.0.1: {} - isarray@0.0.1: {} - - isarray@1.0.0: {} - - isbinaryfile@4.0.10: {} - - isbinaryfile@5.0.2: {} + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.5 isexe@2.0.0: {} - jackspeak@3.4.0: + jackspeak@3.4.1: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jake@10.9.1: - dependencies: - async: 3.2.5 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - js-yaml@4.1.0: dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} - json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} @@ -3356,28 +2548,14 @@ snapshots: json-stringify-safe@5.0.1: optional: true - json5@2.2.3: {} - jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - keyv@4.5.4: dependencies: json-buffer: 3.0.1 - lazy-val@1.0.5: {} - - lazystream@1.0.1: - dependencies: - readable-stream: 2.3.8 - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -3387,56 +2565,15 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.defaults@4.2.0: {} - - lodash.difference@4.5.0: {} - - lodash.flatten@4.4.0: {} - - lodash.isplainobject@4.0.6: {} - lodash.merge@4.6.2: {} - lodash.union@4.6.0: {} - - lodash@4.17.21: {} - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - lowercase-keys@2.0.0: {} - lru-cache@10.3.0: {} + lru-cache@10.3.1: {} - lru-cache@6.0.0: + magic-string@0.30.10: dependencies: - yallist: 4.0.0 - - lru-cache@7.18.3: {} - - make-fetch-happen@10.2.1: - dependencies: - agentkeepalive: 4.5.0 - cacache: 16.1.3 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 2.1.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 9.0.1 - transitivePeerDependencies: - - bluebird - - supports-color + '@jridgewell/sourcemap-codec': 1.4.15 matcher@3.0.0: dependencies: @@ -3452,14 +2589,6 @@ snapshots: mime-db@1.52.0: {} - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime@2.6.0: {} - - mimic-fn@2.1.0: {} - mimic-response@1.0.1: {} mimic-response@3.1.0: {} @@ -3468,117 +2597,24 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 - minimist@1.2.8: {} - - minipass-collect@1.0.2: - dependencies: - minipass: 3.3.6 - - minipass-fetch@2.1.2: - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - - minipass-flush@1.0.5: - dependencies: - minipass: 3.3.6 - - minipass-pipeline@1.2.4: - dependencies: - minipass: 3.3.6 - - minipass-sized@1.0.3: - dependencies: - minipass: 3.3.6 - - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - minipass@7.1.2: {} - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - mkdirp@1.0.4: {} - ms@2.1.2: {} - ms@2.1.3: {} - natural-compare@1.4.0: {} - negotiator@0.6.3: {} - - node-abi@3.65.0: - dependencies: - semver: 7.6.2 - - node-addon-api@1.7.2: - optional: true - - node-api-version@0.2.0: - dependencies: - semver: 7.6.2 - node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 optionalDependencies: encoding: 0.1.13 - node-gyp@9.4.1: - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 10.2.1 - nopt: 6.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.6.2 - tar: 6.2.1 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - - noms@0.0.0: - dependencies: - inherits: 2.0.4 - readable-stream: 1.0.34 - - nopt@6.0.0: - dependencies: - abbrev: 1.1.1 - - normalize-path@3.0.0: {} - normalize-url@6.1.0: {} - npmlog@6.0.2: - dependencies: - are-we-there-yet: 3.0.1 - console-control-strings: 1.1.0 - gauge: 4.0.4 - set-blocking: 2.0.0 - object-keys@1.1.1: optional: true @@ -3586,10 +2622,6 @@ snapshots: dependencies: wrappy: 1.0.2 - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -3599,18 +2631,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@5.4.1: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - p-cancelable@2.1.1: {} p-limit@3.1.0: @@ -3621,10 +2641,6 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - package-json-from-dist@1.0.0: {} parent-module@1.0.1: @@ -3639,25 +2655,19 @@ snapshots: path-key@3.1.1: {} + path-parse@1.0.7: {} + path-scurry@1.11.1: dependencies: - lru-cache: 10.3.0 + lru-cache: 10.3.1 minipass: 7.1.2 path-type@4.0.0: {} - pe-library@0.4.0: {} - pend@1.2.0: {} picomatch@2.3.1: {} - plist@3.1.0: - dependencies: - '@xmldom/xmldom': 0.8.10 - base64-js: 1.5.1 - xmlbuilder: 15.1.1 - prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -3666,17 +2676,8 @@ snapshots: prettier@3.3.2: {} - process-nextick-args@2.0.1: {} - progress@2.0.3: {} - promise-inflight@1.0.1: {} - - promise-retry@2.0.1: - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - pump@3.0.0: dependencies: end-of-stream: 1.4.4 @@ -3692,86 +2693,24 @@ snapshots: quick-lru@5.1.1: {} - read-binary-file-arch@1.0.6: - dependencies: - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - - read-config-file@6.3.2: - dependencies: - config-file-ts: 0.2.6 - dotenv: 9.0.2 - dotenv-expand: 5.1.0 - js-yaml: 4.1.0 - json5: 2.2.3 - lazy-val: 1.0.5 - - read-config-file@6.4.0: - dependencies: - config-file-ts: 0.2.8-rc1 - dotenv: 16.4.5 - dotenv-expand: 11.0.6 - js-yaml: 4.1.0 - json5: 2.2.3 - lazy-val: 1.0.5 - - readable-stream@1.0.34: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readdir-glob@1.1.3: - dependencies: - minimatch: 5.1.6 - - require-directory@2.1.1: {} - - resedit@1.7.0: - dependencies: - pe-library: 0.4.0 - resolve-alpn@1.2.1: {} resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} + resolve@1.22.8: + dependencies: + is-core-module: 2.14.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + responselike@2.0.1: dependencies: lowercase-keys: 2.0.0 - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - retry@0.12.0: {} - reusify@1.0.4: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - roarr@2.15.4: dependencies: boolean: 3.2.0 @@ -3782,21 +2721,53 @@ snapshots: sprintf-js: 1.1.3 optional: true + rollup-plugin-copy@3.5.0: + dependencies: + '@types/fs-extra': 8.1.5 + colorette: 1.4.0 + fs-extra: 8.1.0 + globby: 10.0.1 + is-plain-object: 3.0.1 + + rollup-plugin-esbuild@6.1.1(esbuild@0.19.12)(rollup@4.18.0): + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + debug: 4.3.5 + es-module-lexer: 1.5.4 + esbuild: 0.19.12 + get-tsconfig: 4.7.5 + rollup: 4.18.0 + transitivePeerDependencies: + - supports-color + + rollup@4.18.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 + fsevents: 2.3.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - - safer-buffer@2.1.2: {} - - sanitize-filename@1.6.3: - dependencies: - truncate-utf8-bytes: 1.0.2 - - sax@1.4.1: {} + safer-buffer@2.1.2: + optional: true semver-compare@1.0.0: optional: true @@ -3810,51 +2781,21 @@ snapshots: type-fest: 0.13.1 optional: true - set-blocking@2.0.0: {} - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} - simple-update-notifier@2.0.0: - dependencies: - semver: 7.6.2 - slash@3.0.0: {} - slice-ansi@3.0.0: - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - optional: true - slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - smart-buffer@4.2.0: {} - - socks-proxy-agent@7.0.0: - dependencies: - agent-base: 6.0.2 - debug: 4.3.5 - socks: 2.8.3 - transitivePeerDependencies: - - supports-color - - socks@2.8.3: - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - sort-keys-length@1.0.1: dependencies: sort-keys: 1.1.2 @@ -3863,20 +2804,8 @@ snapshots: dependencies: is-plain-obj: 1.1.0 - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - sprintf-js@1.1.3: {} - - ssri@9.0.1: - dependencies: - minipass: 3.3.6 - - stat-mode@1.0.0: {} + sprintf-js@1.1.3: + optional: true string-width@4.2.3: dependencies: @@ -3890,22 +2819,12 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string-width@7.2.0: + string-width@7.1.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - string_decoder@0.10.31: {} - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -3926,6 +2845,8 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} + synckit@0.8.8: dependencies: '@pkgr/core': 0.1.1 @@ -3933,51 +2854,14 @@ snapshots: tapable@2.2.1: {} - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - - temp-file@3.4.0: - dependencies: - async-exit-hook: 2.0.1 - fs-extra: 10.1.0 - text-table@0.2.0: {} - through2@2.0.5: - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - - tmp-promise@3.0.3: - dependencies: - tmp: 0.2.3 - - tmp@0.2.3: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 tr46@0.0.3: {} - truncate-utf8-bytes@1.0.2: - dependencies: - utf8-byte-length: 1.0.5 - ts-api-utils@1.3.0(typescript@5.5.3): dependencies: typescript: 5.5.3 @@ -3991,11 +2875,11 @@ snapshots: type-fest@0.13.1: optional: true - typescript-eslint@7.15.0(eslint@9.6.0)(typescript@5.5.3): + typescript-eslint@7.16.0(eslint@9.6.0)(typescript@5.5.3): dependencies: - '@typescript-eslint/eslint-plugin': 7.15.0(@typescript-eslint/parser@7.15.0(eslint@9.6.0)(typescript@5.5.3))(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/parser': 7.15.0(eslint@9.6.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.15.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/eslint-plugin': 7.16.0(@typescript-eslint/parser@7.16.0(eslint@9.6.0)(typescript@5.5.3))(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/parser': 7.16.0(eslint@9.6.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.16.0(eslint@9.6.0)(typescript@5.5.3) eslint: 9.6.0 optionalDependencies: typescript: 5.5.3 @@ -4006,20 +2890,8 @@ snapshots: undici-types@5.26.5: {} - unique-filename@2.0.1: - dependencies: - unique-slug: 3.0.0 - - unique-slug@3.0.0: - dependencies: - imurmurhash: 0.1.4 - universalify@0.1.2: {} - universalify@2.0.1: {} - - untildify@4.0.0: {} - unused-filename@4.0.1: dependencies: escape-string-regexp: 5.0.0 @@ -4029,23 +2901,8 @@ snapshots: dependencies: punycode: 2.3.1 - utf8-byte-length@1.0.5: {} - - util-deprecate@1.0.2: {} - v8-compile-cache@2.4.0: {} - verror@1.10.1: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.4.1 - optional: true - - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 - webidl-conversions@3.0.1: {} whatwg-url@5.0.0: @@ -4057,10 +2914,6 @@ snapshots: dependencies: isexe: 2.0.0 - wide-align@1.1.5: - dependencies: - string-width: 4.2.3 - word-wrap@1.2.5: {} wrap-ansi@7.0.0: @@ -4079,47 +2932,9 @@ snapshots: ws@8.17.1: {} - xmlbuilder@15.1.1: {} - - xtend@4.0.2: {} - - y18n@5.0.8: {} - - yallist@4.0.0: {} - - yargs-parser@20.2.9: {} - - yargs-parser@21.1.1: {} - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - yauzl@2.10.0: dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 yocto-queue@0.1.0: {} - - zip-stream@4.1.1: - dependencies: - archiver-utils: 3.0.4 - compress-commons: 4.1.2 - readable-stream: 3.6.2 diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..13a1ffe --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,116 @@ +// @ts-check + +import typescript from "@rollup/plugin-typescript"; +import copy from "rollup-plugin-copy"; +import {minify} from "rollup-plugin-esbuild"; +import commonjs from "@rollup/plugin-commonjs"; +import json from "@rollup/plugin-json"; +import esmShim from "@rollup/plugin-esm-shim"; +import {defineConfig} from "rollup"; + +export default defineConfig([ + { + input: "src/main.ts", + output: { + dir: "ts-out", + format: "esm", + sourcemap: true + }, + external: [ + "electron", + "fs", + "path", + "os", + "v8-compile-cache", + "electron-is-dev", + "electron-context-menu", + "arrpc", + "extract-zip", + "stream", + "stream/promises" + ], + plugins: [ + commonjs(), + esmShim(), + json(), + minify({minify: process.env.BUILD === "prod" ? true : false}), + // nodeResolve(), we don't need to bundle node_modules cuz it breaks electron + typescript(), + copy({ + targets: [ + {src: "src/**/**/*.html", dest: "ts-out/html/"}, + {src: "src/**/**/*.css", dest: "ts-out/css/"}, + {src: "src/**/**/*.js", dest: "ts-out/js/"}, + {src: "package.json", dest: "ts-out/"}, + {src: "assets/**/**", dest: "ts-out/assets/"} + ] + }) + ] + }, + { + input: "src/discord/preload/preload.mts", + output: { + dir: "ts-out/discord", + entryFileNames: "[name].mjs", + format: "esm", + sourcemap: true + }, + external: ["electron", "fs", "path", "os"], + plugins: [typescript(), minify({minify: process.env.BUILD === "prod" ? true : false})] + }, + { + input: "src/splash/preload.mts", + output: { + dir: "ts-out/splash", + format: "esm", + entryFileNames: "[name].mjs", + sourcemap: true + }, + external: ["electron"], + plugins: [typescript(), minify({minify: process.env.BUILD === "prod" ? true : false})] + }, + { + input: "src/settings/preload.mts", + output: { + dir: "ts-out/settings", + format: "esm", + entryFileNames: "[name].mjs", + sourcemap: true + }, + external: ["electron"], + plugins: [typescript(), minify({minify: process.env.BUILD === "prod" ? true : false})] + }, + { + input: "src/setup/preload.mts", + output: { + dir: "ts-out/setup", + format: "esm", + entryFileNames: "[name].mjs", + sourcemap: true + }, + external: ["electron", "fs", "path", "os"], + plugins: [typescript(), minify({minify: process.env.BUILD === "prod" ? true : false})] + }, + { + input: "src/themeManager/preload.mts", + output: { + dir: "ts-out/themeManager", + format: "esm", + entryFileNames: "[name].mjs", + sourcemap: true + }, + external: ["electron", "fs", "path", "os"], + plugins: [typescript(), minify({minify: process.env.BUILD === "prod" ? true : false})] + }, + { + input: "src/screenshare/preload.mts", + output: { + dir: "ts-out/screenshare", + format: "esm", + entryFileNames: "[name].mjs", + sourcemap: true + }, + external: ["electron"], + plugins: [typescript(), minify({minify: process.env.BUILD === "prod" ? true : false})] + } +]); diff --git a/src/discord/preload/capturer.ts b/src/discord/preload/capturer.ts index 7216019..118f19e 100644 --- a/src/discord/preload/capturer.ts +++ b/src/discord/preload/capturer.ts @@ -48,7 +48,7 @@ window.navigator.mediaDevices.getDisplayMedia = () => new Promise(async (resolve document.addEventListener("DOMContentLoaded", function () { addScript(screenShareJS); - const screenshareCss = path.join(import.meta.dirname, "../", "/content/css/screenshare.css"); + const screenshareCss = path.join(import.meta.dirname, "../", "/css/screenshare.css"); addStyle(fs.readFileSync(screenshareCss, "utf8")); console.log("Capturer injected."); }); diff --git a/src/discord/preload/preload.mts b/src/discord/preload/preload.mts index 2553635..ba2ec17 100644 --- a/src/discord/preload/preload.mts +++ b/src/discord/preload/preload.mts @@ -59,10 +59,10 @@ await sleep(5000).then(() => { })(); `); if (ipcRenderer.sendSync("disableAutogain")) { - addScript(fs.readFileSync(path.join(import.meta.dirname, "../", "/content/js/disableAutogain.js"), "utf8")); + addScript(fs.readFileSync(path.join(import.meta.dirname, "../", "/js/disableAutogain.js"), "utf8")); } - addScript(fs.readFileSync(path.join(import.meta.dirname, "../", "/content/js/rpc.js"), "utf8")); - const cssPath = path.join(import.meta.dirname, "../", "/content/css/discord.css"); + addScript(fs.readFileSync(path.join(import.meta.dirname, "../", "/js/rpc.js"), "utf8")); + const cssPath = path.join(import.meta.dirname, "../", "/css/discord.css"); addStyle(fs.readFileSync(cssPath, "utf8")); updateLang(); }); diff --git a/src/discord/preload/settings.ts b/src/discord/preload/settings.ts index 8059ba4..9c08175 100644 --- a/src/discord/preload/settings.ts +++ b/src/discord/preload/settings.ts @@ -6,13 +6,11 @@ const webview = ``; @@ -22,7 +20,7 @@ export function injectSettings() { } document.addEventListener("DOMContentLoaded", function (_event) { - const settingsCssPath = path.join(import.meta.dirname, "../", "/content/css/inAppSettings.css"); + const settingsCssPath = path.join(import.meta.dirname, "../", "/css/inAppSettings.css"); addStyle(fs.readFileSync(settingsCssPath, "utf8")); const webview = document.querySelector("webview")!; webview.addEventListener("console-message", (e) => { diff --git a/src/discord/preload/titlebar.mts b/src/discord/preload/titlebar.mts index 48a759f..2fe4a24 100644 --- a/src/discord/preload/titlebar.mts +++ b/src/discord/preload/titlebar.mts @@ -21,8 +21,8 @@ export function injectTitlebar(): void { } else { document.getElementById("app-mount")!.prepend(elem); } - const titlebarcssPath = path.join(import.meta.dirname, "../", "/content/css/titlebar.css"); - const wordmarkcssPath = path.join(import.meta.dirname, "../", "/content/css/logos.css"); + const titlebarcssPath = path.join(import.meta.dirname, "../", "/css/titlebar.css"); + const wordmarkcssPath = path.join(import.meta.dirname, "../", "/css/logos.css"); addStyle(fs.readFileSync(titlebarcssPath, "utf8")); addStyle(fs.readFileSync(wordmarkcssPath, "utf8")); document.body.setAttribute("customTitlebar", ""); diff --git a/src/discord/window.ts b/src/discord/window.ts index a73b4ae..f9e96b4 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -317,7 +317,7 @@ export function createCustomWindow(): void { webPreferences: { webviewTag: true, sandbox: false, - preload: path.join(import.meta.dirname, "preload/preload.mjs"), + preload: path.join(import.meta.dirname, "discord/preload.mjs"), spellcheck: getConfig("spellcheck") } }); @@ -340,7 +340,7 @@ export function createNativeWindow(): void { webPreferences: { webviewTag: true, sandbox: false, - preload: path.join(import.meta.dirname, "preload/preload.mjs"), + preload: path.join(import.meta.dirname, "discord/preload.mjs"), spellcheck: getConfig("spellcheck") } }); @@ -364,7 +364,7 @@ export function createTransparentWindow(): void { webPreferences: { sandbox: false, webviewTag: true, - preload: path.join(import.meta.dirname, "preload/preload.mjs"), + preload: path.join(import.meta.dirname, "discord/preload.mjs"), spellcheck: getConfig("spellcheck") } }); diff --git a/src/screenshare/main.ts b/src/screenshare/main.ts index bded61f..35fb5fb 100644 --- a/src/screenshare/main.ts +++ b/src/screenshare/main.ts @@ -49,7 +49,7 @@ function registerCustomHandler(): void { webPreferences: { sandbox: false, spellcheck: false, - preload: path.join(import.meta.dirname, "preload.mjs") + preload: path.join(import.meta.dirname, "screenshare", "preload.mjs") } }); ipcMain.once("selectScreenshareSource", (_event, id: string, name: string) => { @@ -65,7 +65,7 @@ function registerCustomHandler(): void { callback({video: result}); } }); - void capturerWindow.loadFile(path.join(import.meta.dirname, "picker.html")); + void capturerWindow.loadFile(path.join(import.meta.dirname, "html", "picker.html")); capturerWindow.webContents.send("getSources", sources); } }); diff --git a/src/settings/main.ts b/src/settings/main.ts index 1da41e3..47f88ad 100644 --- a/src/settings/main.ts +++ b/src/settings/main.ts @@ -25,11 +25,11 @@ export async function createSettingsWindow(): Promise { autoHideMenuBar: true, webPreferences: { sandbox: false, - preload: path.join(import.meta.dirname, "preload.mjs") + preload: path.join(import.meta.dirname, "settings", "preload.mjs") } }); async function settingsLoadPage(): Promise { - await settingsWindow.loadURL(`file://${import.meta.dirname}/settings.html`); + await settingsWindow.loadURL(`file://${import.meta.dirname}/html/settings.html`); } const userDataPath = app.getPath("userData"); const themesFolder = `${userDataPath}/themes/`; diff --git a/src/settings/settings.html b/src/settings/settings.html index f8b78c5..dcc05ae 100644 --- a/src/settings/settings.html +++ b/src/settings/settings.html @@ -3,7 +3,7 @@ diff --git a/src/setup/main.ts b/src/setup/main.ts index 896a1c2..3655f7a 100644 --- a/src/setup/main.ts +++ b/src/setup/main.ts @@ -20,7 +20,7 @@ export async function createSetupWindow(): Promise { webPreferences: { sandbox: false, spellcheck: false, - preload: path.join(import.meta.dirname, "preload.mjs") + preload: path.join(import.meta.dirname, "setup", "preload.mjs") } }); ipcMain.on("saveSettings", (_event, args: Settings) => { @@ -42,6 +42,6 @@ export async function createSetupWindow(): Promise { app.quit(); }); }); - void setupWindow.loadURL(`file://${import.meta.dirname}/setup.html`); + void setupWindow.loadURL(`file://${import.meta.dirname}/html/setup.html`); }); } diff --git a/src/setup/setup.html b/src/setup/setup.html index 73fe4b2..1f0277d 100644 --- a/src/setup/setup.html +++ b/src/setup/setup.html @@ -7,7 +7,7 @@ ArmCord Setup diff --git a/src/splash/main.ts b/src/splash/main.ts index e36a7f5..8f5f66e 100644 --- a/src/splash/main.ts +++ b/src/splash/main.ts @@ -17,11 +17,11 @@ export async function createSplashWindow(): Promise { autoHideMenuBar: true, webPreferences: { sandbox: false, - preload: path.join(import.meta.dirname, "preload.mjs") + preload: path.join(import.meta.dirname, "splash", "preload.mjs") } }); ipcMain.on("isDev", (event) => { event.returnValue = isDev; }); - await splashWindow.loadFile(path.join(import.meta.dirname, "splash.html")); + await splashWindow.loadFile(path.join(import.meta.dirname, "html", "splash.html")); } diff --git a/src/splash/splash.html b/src/splash/splash.html index bd0d817..a9c82aa 100644 --- a/src/splash/splash.html +++ b/src/splash/splash.html @@ -4,7 +4,7 @@ ArmCord - diff --git a/src/shelter/armcordSettings/pages/SettingsPage.jsx b/src/shelter/armcordSettings/pages/SettingsPage.jsx index c09e6a3..a8bafa7 100644 --- a/src/shelter/armcordSettings/pages/SettingsPage.jsx +++ b/src/shelter/armcordSettings/pages/SettingsPage.jsx @@ -180,10 +180,6 @@ export function SettingsPage() { > Disable Shelter - -
diff --git a/src/tray.ts b/src/tray.ts index 8b294ab..0d30749 100644 --- a/src/tray.ts +++ b/src/tray.ts @@ -2,7 +2,6 @@ import fs from "fs"; import {Menu, MessageBoxOptions, Tray, app, dialog, nativeImage} from "electron"; import {createInviteWindow, mainWindows} from "./discord/window.js"; import path from "path"; -import {createSettingsWindow} from "./settings/main.js"; import {getConfig, getConfigLocation, setConfig} from "./common/config.js"; import {getDisplayVersion} from "./common/version.js"; import {setForceQuit} from "./common/forceQuit.js"; @@ -74,7 +73,20 @@ void app.whenReady().then(async () => { { label: "Open Settings", click() { - void createSettingsWindow(); + mainWindows.forEach((mainWindow) => { + mainWindow.show(); + + mainWindow.webContents.executeJavaScript(`window.shelter.flux.dispatcher.dispatch({ + "type": "USER_SETTINGS_MODAL_OPEN", + "section": "My Account", + "subsection": null, + "openWithoutBackstack": false + })`); + mainWindow.webContents.executeJavaScript( + `window.shelter.flux.dispatcher.dispatch({type: "LAYER_PUSH", component: "USER_SETTINGS"})` + ); + // TODO - open armcord tab in settings + }); } }, { diff --git a/src/types/armcordWindow.d.ts b/src/types/armcordWindow.d.ts index 8a1fdb5..e27a2ab 100644 --- a/src/types/armcordWindow.d.ts +++ b/src/types/armcordWindow.d.ts @@ -16,6 +16,5 @@ export interface ArmCordWindow { getDisplayMediaSelector: () => Promise; version: string; mods: string; - openSettingsWindow: () => void; openThemesWindow: () => void; } From 6c02ee0788dcf87eeed847cf2dca0cdcb271efc3 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 18 Aug 2024 18:48:14 +0200 Subject: [PATCH 158/844] lint --- src/discord/menu.ts | 4 ++-- src/tray.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/discord/menu.ts b/src/discord/menu.ts index 1768ede..eac4a84 100644 --- a/src/discord/menu.ts +++ b/src/discord/menu.ts @@ -23,13 +23,13 @@ export function setMenu(): void { mainWindows.forEach((mainWindow) => { mainWindow.show(); - mainWindow.webContents.executeJavaScript(`window.shelter.flux.dispatcher.dispatch({ + void mainWindow.webContents.executeJavaScript(`window.shelter.flux.dispatcher.dispatch({ "type": "USER_SETTINGS_MODAL_OPEN", "section": "My Account", "subsection": null, "openWithoutBackstack": false })`); - mainWindow.webContents.executeJavaScript( + void mainWindow.webContents.executeJavaScript( `window.shelter.flux.dispatcher.dispatch({type: "LAYER_PUSH", component: "USER_SETTINGS"})` ); // TODO - open armcord tab in settings diff --git a/src/tray.ts b/src/tray.ts index 0d30749..0954aa5 100644 --- a/src/tray.ts +++ b/src/tray.ts @@ -76,13 +76,13 @@ void app.whenReady().then(async () => { mainWindows.forEach((mainWindow) => { mainWindow.show(); - mainWindow.webContents.executeJavaScript(`window.shelter.flux.dispatcher.dispatch({ + void mainWindow.webContents.executeJavaScript(`window.shelter.flux.dispatcher.dispatch({ "type": "USER_SETTINGS_MODAL_OPEN", "section": "My Account", "subsection": null, "openWithoutBackstack": false })`); - mainWindow.webContents.executeJavaScript( + void mainWindow.webContents.executeJavaScript( `window.shelter.flux.dispatcher.dispatch({type: "LAYER_PUSH", component: "USER_SETTINGS"})` ); // TODO - open armcord tab in settings From 1c9fd5518c08d70fa51bbdab2cc44fc9101b55b4 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Mon, 19 Aug 2024 13:55:22 +0200 Subject: [PATCH 159/844] feat: add quick css --- src/common/themes.ts | 14 ++++++++++++++ src/discord/ipc.ts | 4 ++++ src/discord/preload/bridge.ts | 3 ++- src/discord/window.ts | 4 ++-- src/shelter/armcordSettings/pages/ThemesPage.jsx | 4 ++++ 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/common/themes.ts b/src/common/themes.ts index 6dc716e..b8a5110 100644 --- a/src/common/themes.ts +++ b/src/common/themes.ts @@ -165,3 +165,17 @@ export async function installTheme(linkOrPath: string) { fs.writeFileSync(path.join(themePath, "manifest.json"), JSON.stringify(manifest)); fs.writeFileSync(path.join(themePath, "src.css"), code); } + +export function initQuickCss(browserWindow: BrowserWindow) { + const quickCssPath = path.join(userDataPath, "/quickCss.css"); + if (!fs.existsSync(quickCssPath)) { + fs.writeFileSync(quickCssPath, ""); + } + browserWindow.webContents.send("addTheme", "armcord-quick-css", fs.readFileSync(quickCssPath, "utf-8")); + console.log(`[Theme Manager] Loaded Quick CSS`); + fs.watchFile(quickCssPath, {interval: 1000}, () => { + console.log("[Theme Manager] Quick CSS updated."); + browserWindow.webContents.send("removeTheme", "armcord-quick-css"); + browserWindow.webContents.send("addTheme", "armcord-quick-css", fs.readFileSync(quickCssPath, "utf-8")); + }); +} diff --git a/src/discord/ipc.ts b/src/discord/ipc.ts index 00f29b9..9a13a7d 100644 --- a/src/discord/ipc.ts +++ b/src/discord/ipc.ts @@ -16,6 +16,7 @@ const userDataPath = app.getPath("userData"); const storagePath = path.join(userDataPath, "/storage/"); const themesPath = path.join(userDataPath, "/themes/"); const pluginsPath = path.join(userDataPath, "/plugins/"); +const quickCssPath = path.join(userDataPath, "/quickCss.css"); export function registerIpc(passedWindow: BrowserWindow): void { ipcMain.handle("getShelterBundle", () => { return { @@ -144,6 +145,9 @@ export function registerIpc(passedWindow: BrowserWindow): void { ipcMain.on("openPluginsFolder", () => { shell.showItemInFolder(pluginsPath); }); + ipcMain.on("openQuickCssFile", () => { + void shell.openPath(quickCssPath); + }); ipcMain.on("openCrashesFolder", () => { shell.showItemInFolder(path.join(app.getPath("temp"), `${app.getName()} Crashes`)); }); diff --git a/src/discord/preload/bridge.ts b/src/discord/preload/bridge.ts index ff97270..e4d479a 100644 --- a/src/discord/preload/bridge.ts +++ b/src/discord/preload/bridge.ts @@ -67,7 +67,8 @@ contextBridge.exposeInMainWorld("armcord", { version: ipcRenderer.sendSync("get-app-version", "app-version") as string, mods: ipcRenderer.sendSync("clientmod") as string, restart: () => ipcRenderer.send("restart"), - openThemesWindow: () => ipcRenderer.send("openThemesWindow") + openThemesWindow: () => ipcRenderer.send("openThemesWindow"), + openQuickCssFile: () => ipcRenderer.send("openQuickCssFile") } as ArmCordWindow); let windowCallback: (arg0: object) => void; contextBridge.exposeInMainWorld("ArmCordRPC", { diff --git a/src/discord/window.ts b/src/discord/window.ts index 3278a2a..835c67a 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -16,7 +16,7 @@ import {iconPath, init} from "../main.js"; import {getConfig, setConfig, firstRun} from "../common/config.js"; import {getWindowState, setWindowState} from "../common/windowState.js"; import {forceQuit, setForceQuit} from "../common/forceQuit.js"; -import {injectThemesMain} from "../common/themes.js"; +import {initQuickCss, injectThemesMain} from "../common/themes.js"; export let mainWindows: BrowserWindow[] = []; export let inviteWindow: BrowserWindow; @@ -205,7 +205,7 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { }); }); } - + initQuickCss(passedWindow); passedWindow.webContents.on("page-title-updated", (e, title) => { const armCordSuffix = " - ArmCord"; /* identify */ diff --git a/src/shelter/armcordSettings/pages/ThemesPage.jsx b/src/shelter/armcordSettings/pages/ThemesPage.jsx index 61fed54..2d3fc58 100644 --- a/src/shelter/armcordSettings/pages/ThemesPage.jsx +++ b/src/shelter/armcordSettings/pages/ThemesPage.jsx @@ -10,6 +10,10 @@ export function ThemesPage() { + + ); } From f61474880165491f3a91139df2593cfbc9a5a623 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Mon, 19 Aug 2024 16:49:06 +0200 Subject: [PATCH 160/844] tweak theme manager UI --- src/common/themes.ts | 1 - src/themeManager/main.ts | 25 ++++++++++++++++++++----- src/themeManager/manager.css | 8 ++++---- src/themeManager/preload.mts | 15 +++++++++------ 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/common/themes.ts b/src/common/themes.ts index b8a5110..f156584 100644 --- a/src/common/themes.ts +++ b/src/common/themes.ts @@ -80,7 +80,6 @@ export function injectThemesMain(browserWindow: BrowserWindow): void { fs.mkdirSync(themesFolder); console.log("Created missing theme folder"); } - browserWindow.webContents.on("did-finish-load", () => { fs.readdirSync(themesFolder).forEach((file) => { try { diff --git a/src/themeManager/main.ts b/src/themeManager/main.ts index 096c821..f0b23e6 100644 --- a/src/themeManager/main.ts +++ b/src/themeManager/main.ts @@ -1,4 +1,4 @@ -import {BrowserWindow, app, dialog, ipcMain, shell} from "electron"; +import {BrowserWindow, MessageBoxOptions, app, dialog, ipcMain, shell} from "electron"; import path from "path"; import fs from "fs"; import {createInviteWindow, mainWindows} from "../discord/window.js"; @@ -65,11 +65,26 @@ export async function createTManagerWindow(): Promise { ) as ThemeManifest; void shell.openPath(`${themesFolder}/${id}/${manifest.theme}`); }); + ipcMain.on("openThemeFolder", (_event, id: string) => { + shell.openPath(path.join(themesFolder, id)); + }); ipcMain.on("uninstallTheme", (_event, id: string) => { - uninstallTheme(id); - themeWindow.webContents.reload(); - mainWindows.forEach((mainWindow) => { - mainWindow.webContents.reload(); + const options: MessageBoxOptions = { + type: "warning", + buttons: ["Yes, please", "No, cancel"], + defaultId: 1, + title: "Remove theme", + message: `Are you sure you want to remove this theme?` + }; + + void dialog.showMessageBox(mainWindows[0], options).then(({response}) => { + if (response == 0) { + uninstallTheme(id); + themeWindow.webContents.reload(); + mainWindows.forEach((mainWindow) => { + mainWindow.webContents.reload(); + }); + } }); }); ipcMain.handle("installBDTheme", async (_event, link: string) => { diff --git a/src/themeManager/manager.css b/src/themeManager/manager.css index 70489fe..e5181f0 100644 --- a/src/themeManager/manager.css +++ b/src/themeManager/manager.css @@ -54,17 +54,17 @@ body { justify-content: space-evenly; } -/* Screen larger than 600px? 2 column */ +/* Screen larger than 600px? 1 column */ @media (min-width: 600px) { .cards { - grid-template-columns: repeat(2, 1fr); + grid-template-columns: repeat(1, 1fr); } } -/* Screen larger than 900px? 3 columns */ +/* Screen larger than 900px? 2 columns */ @media (min-width: 900px) { .cards { - grid-template-columns: repeat(3, 1fr); + grid-template-columns: repeat(2, 1fr); } } diff --git a/src/themeManager/preload.mts b/src/themeManager/preload.mts index 85b083c..afcd365 100644 --- a/src/themeManager/preload.mts +++ b/src/themeManager/preload.mts @@ -3,7 +3,8 @@ import {ThemeManifest} from "../types/themeManifest.d.js"; contextBridge.exposeInMainWorld("themes", { install: async (url: string) => ipcRenderer.invoke("installBDTheme", url) as Promise, uninstall: (id: string) => ipcRenderer.send("uninstallTheme", id), - edit: (id: string) => ipcRenderer.send("editTheme", id) + edit: (id: string) => ipcRenderer.send("editTheme", id), + folder: (id: string) => ipcRenderer.send("openThemeFolder", id) }); ipcRenderer.on("themeManifest", (_event, id: string, json: string) => { const manifest = JSON.parse(json) as ThemeManifest; @@ -19,9 +20,15 @@ ipcRenderer.on("themeManifest", (_event, id: string, json: string) => {

${manifest.description}

+
` ); + document.getElementById(`${id}-shortcuts`)!.innerHTML += + ` + + + `; (document.getElementById(id) as HTMLInputElement).checked = manifest.enabled; document.getElementById(`${id}header`)!.addEventListener("click", () => { document.getElementById("themeInfoModal")!.style.display = "block"; @@ -29,11 +36,7 @@ ipcRenderer.on("themeManifest", (_event, id: string, json: string) => { document.getElementById("themeInfoDesc")!.textContent = `${manifest.description}\n\n${manifest.version}`; if (manifest.supportsArmCordTitlebar !== undefined) { document.getElementById("themeInfoButtons")!.innerHTML += - ` - - - `; - console.log("e"); + ``; if (manifest.supportsArmCordTitlebar == true) { (document.getElementById(`compatibility`) as HTMLImageElement).src = "https://raw.githubusercontent.com/ArmCord/BrandingStuff/main/Window.png"; From 71b0c9230ab8dce57562e3d443e492dcf3dfba1c Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Mon, 19 Aug 2024 16:49:41 +0200 Subject: [PATCH 161/844] lint --- src/themeManager/main.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/themeManager/main.ts b/src/themeManager/main.ts index f0b23e6..0ca5efd 100644 --- a/src/themeManager/main.ts +++ b/src/themeManager/main.ts @@ -66,7 +66,7 @@ export async function createTManagerWindow(): Promise { void shell.openPath(`${themesFolder}/${id}/${manifest.theme}`); }); ipcMain.on("openThemeFolder", (_event, id: string) => { - shell.openPath(path.join(themesFolder, id)); + void shell.openPath(path.join(themesFolder, id)); }); ipcMain.on("uninstallTheme", (_event, id: string) => { const options: MessageBoxOptions = { From eb16e714b4f871f40383ac42984130839150e224 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Mon, 19 Aug 2024 17:30:02 +0200 Subject: [PATCH 162/844] switch back to script arRPC --- src/discord/preload/mods/shelter.ts | 2 +- src/discord/preload/preload.mts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/discord/preload/mods/shelter.ts b/src/discord/preload/mods/shelter.ts index 78f28b0..b1436af 100644 --- a/src/discord/preload/mods/shelter.ts +++ b/src/discord/preload/mods/shelter.ts @@ -2,7 +2,7 @@ import {ipcRenderer, webFrame} from "electron"; import {sleep} from "../../../common/sleep.js"; import type {ModBundle} from "../../../types/ModBundle.d.js"; const requiredPlugins: Record = { - "armcord-arrpc": "armcord://plugins/armcordRPC/", + // "armcord-arrpc": "armcord://plugins/armcordRPC/", "armcord-settings": "armcord://plugins/armcordSettings/", "armcord-screenshare": "armcord://plugins/screenshareQualityFix/" }; diff --git a/src/discord/preload/preload.mts b/src/discord/preload/preload.mts index d807afb..6a31e36 100644 --- a/src/discord/preload/preload.mts +++ b/src/discord/preload/preload.mts @@ -63,6 +63,7 @@ await sleep(5000).then(() => { if (ipcRenderer.sendSync("disableAutogain")) { addScript(readFileSync(join(import.meta.dirname, "../", "/js/disableAutogain.js"), "utf8")); } + addScript(readFileSync(join(import.meta.dirname, "../", "/js/rpc.js"), "utf8")); const cssPath = join(import.meta.dirname, "../", "/css/discord.css"); addStyle(readFileSync(cssPath, "utf8")); updateLang(); From c7ade70efd16c9757506e87688f14772af2067b4 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Mon, 19 Aug 2024 18:40:07 +0200 Subject: [PATCH 163/844] make all assets local --- assets/app/Download.png | Bin 0 -> 793 bytes assets/app/Edit.png | Bin 0 -> 3841 bytes assets/app/Folder.png | Bin 0 -> 2734 bytes assets/app/Loading.webm | Bin 0 -> 160381 bytes assets/app/Trash.png | Bin 0 -> 464 bytes assets/app/Update.webp | Bin 0 -> 5830 bytes assets/app/UpgradeArrow.png | Bin 0 -> 609 bytes assets/app/Window.png | Bin 0 -> 529 bytes assets/app/WindowUnsupported.png | Bin 0 -> 957 bytes src/discord/content/css/discord.css | 7 ------ src/protocol.ts | 36 +++++++++++++++++++++------- src/splash/splash.html | 4 ++-- src/themeManager/manager.html | 2 +- src/themeManager/preload.mts | 13 +++++----- 14 files changed, 36 insertions(+), 26 deletions(-) create mode 100644 assets/app/Download.png create mode 100644 assets/app/Edit.png create mode 100644 assets/app/Folder.png create mode 100644 assets/app/Loading.webm create mode 100644 assets/app/Trash.png create mode 100644 assets/app/Update.webp create mode 100644 assets/app/UpgradeArrow.png create mode 100644 assets/app/Window.png create mode 100644 assets/app/WindowUnsupported.png diff --git a/assets/app/Download.png b/assets/app/Download.png new file mode 100644 index 0000000000000000000000000000000000000000..ab77f32df8fba2ac6f5380c56e08c3533abc48a9 GIT binary patch literal 793 zcmV+!1LpjRP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA0k4^vCMbR))h}b~@W*^fkU=Ll$TY16Ao>S%4U>akU@DWPuT35K7apBh~J-&v956 zqq4x5Fo5*r?C4iR(#BxX~Jm?vBTiLxf#N^`mv0GQ20fV9ok7C|YBR(!-#* zk300yddcNO(G^Y-O2YCEA3|k3m9KF*aq!rb_N$eI@k96hk$J8r4vbB80;K#%W1^o= z7vFF-F<`}ov2pdU47FMcr*$WDr)ILpa%X+t&jnZPv)Nkv^lN?P8x^fjZv{d4S9snZ XCs%tQq0HK{00000NkvXXu0mjfJZ)f` literal 0 HcmV?d00001 diff --git a/assets/app/Edit.png b/assets/app/Edit.png new file mode 100644 index 0000000000000000000000000000000000000000..6db6a367bff21d45ab0ac25a07ee74eb52cfa1c9 GIT binary patch literal 3841 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 literal 0 HcmV?d00001 diff --git a/assets/app/Folder.png b/assets/app/Folder.png new file mode 100644 index 0000000000000000000000000000000000000000..4a964e40aed757b455c0947a70d51d1603fd11d8 GIT binary patch literal 2734 zcmeHJi96I=AOFo5GRhKZRQ7Eus-Y>9Wh|kPu}-E8rY<3B&<$go-)O<@;ueh(LrS7h zkGzr5Xpx;OX>MUgVr+LTGh`XY{q_C<_aAuQ^E}_@obUI1zRNk!`J8hyJPF4X6?Q5B z0HEk{+|e5VV0Mt$%gaF)xz1Q+s6$2_KXnNJOx=D8tki~C4jEyWypK5mRo$ACkb(%c zcee+C=h>Ur&d36Q!ciATd*67Na46uS@3EcWx0tw`U7MO~QYW8MD6%*c4bwBZ$5b+m##p6A;Uj_%QT`-tNWN~@5m42&drnmCw@`bVNqw~|w(vkXFHan@Vp&_FB zwtYArlt?62E8o3Je2h{psJw;QrebUZBCtTjTux?%IrFZpi~2llhg>j#yIj;(&bze% z|BTPMlHaHegg^AcVvuA)Le6q+MbZ(Wu?8rBlYXp`1s~b{p*^e%Micdqm`y7$;;iV_ z#}^o-m_}|V;?B}~`z^n<)py=^coF*G*gTQOpVjTPV7^^Atp@9yPaM`CPuZE>qTG%m zrD{)EgEe0w4O*xMy?!QTWo3`z63WFuma~B*#l~+&wQUngsx?_ikRi>?*Dh%NF0}4y zh|LL{GzCNWkF7hgW`=}olefF!@v*V7+yx6$D2aP047;w#go^2P0Z?d8-+Rwf3VoXk z5f~4;cJv_%1aVqSWS|c0+t4$Mr?qpEH>B$i5SbNt7>mWKGA{XRQ6u^ENgI&KiOwyZ zOVddS+jF9(Vm|}rksvkO+J&B;o)#lA%PnDo<$7!VVv(hf+nLk8iO3}MRzm$~oA;gV zL`BLMHCM-4V&KK1Vm+eF#K`zxrq{yVg+|Yi7z~8=5pG+a>?`YQ3m$=oDU`j%-v5fY z^WDPz4+wQE=YVtQPqJr;m7PlU_@PuP6&5A|lY?O%<8JV|tIJzohZ* zju#D3KYX8mdE|OaI7KrR;DjFXxNbGJgGF<-9^~_NKJ^ux0Gq7#bc|{?qjTCuqxoeH zYPxfT?Jr;8;}@s;&#)9;`eY+@=gP>}F$ZqYC#FA=0LF$J@{Dv5cP#29TZ~>z2jH_# zS;HUBo?_=GH~@^LbI(m@x_HF^ocql_Yxuz@91Ky_@j3FaRoF_KEnJ>_529y7M@L6m zrL!l%h#>N0e-#V5jPu?>a}6;LgCi`+w>Huy@kgY|AxD659$LWzW|i7DyW$Ea4`~3} z5y#F>CYcYu&$*9Kd0a)-?tAMEl|^{*Y}Ie*H1_!x$PWpX)Xz6XgLZ1|Lwe=rFvMxE6E%c*!D1N{v&80?*=fQ{lEL4-hv9*DD2KcL(n!VI@+reVl_#uEW5zf zmBHOT0UZ_BTHtm3JVYg1taf&`kC9t>Nn>N<4aA()XD;{21DE5s2(%9>G7~ARMduyWaArRvCZWJ#Z6ICi%nx*IM zt=QRATU(p+^Axv2YJmM!$QLMi#^odH>V-mBV1Cy*+fkRO ze9-gNprql`irdYYwZm#Ez0OmlaTqx$sAybylfFvp%E}5sC`qaQ_&&l+%xFET>~>9~ zy=S$WBmMebN*_-I^OTg7E*2IRt{cFvFzMa4Gb2^mPq5;%3rTy)ELCv`T+YOU?qB)7 zI?Nb!;whUZG6s+uB|`S>67l@;gKooIp-^bkty6@isE9_Fa4psKCiwg<6unf;mdX#+ zVTZwM@(!F@O-@O@@n8Aggq0uiXHUgGxt5s7CmxWA-;)+)K(|(Lm~f>2Smiz9!q|paJ&CkilI{bX zHBrAnaIU&&3ZD)H?$y)Gbf)+4UE|c|UU#9?f@Ybos0SYdfu{>Jss$O($c_O&Ha8|K z@dED7WQlruEo?W|#5u1$68&}r1N>a{J1d&GsUEqDPw87I+6~|E8Hp|U#ZL*FCCZrb z!uPJHr1vHUKzTyq;^IPRG+I7g;+0w~a-Cc*D@s`%|MTdkfB(M$O%1Ck_C6sg_{i|) OpHLSkf@75fCG{V-e39Y+ literal 0 HcmV?d00001 diff --git a/assets/app/Loading.webm b/assets/app/Loading.webm new file mode 100644 index 0000000000000000000000000000000000000000..a345bf77d6a44ab5d35be03e846744e8f3d645f5 GIT binary patch literal 160381 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 axz#$RHLA`RqAB#&7xKana`N04@P7c2qs*HC literal 0 HcmV?d00001 diff --git a/assets/app/Trash.png b/assets/app/Trash.png new file mode 100644 index 0000000000000000000000000000000000000000..af5a5dc08d2246609d3f2f2f4b025ae15536864e GIT binary patch literal 464 zcmV;>0WbcEP)!930WSY1AtZ2w ze<3@zF%ba3f&?^@vMje@7=Dn0wrxL?B-zpkLb@{utlg^bW>r-iK5fX&njCT4U-PqL za{;2(QayfP_=gXM$ z;h3(g__gJ{KpWN$fwdC{=3X_Ync%wokdVt8whyUkdbKe|^r_Sm2ktg~z49^TUW!8< z#GKkNhqiC|k&m2iFX!XAtAp6!?ZX4NCrb5hD+B-lSeSn&W>TxJTmL5j0000Q_WET literal 0 HcmV?d00001 diff --git a/assets/app/Update.webp b/assets/app/Update.webp new file mode 100644 index 0000000000000000000000000000000000000000..fd8e58f0b704a66cf1e3b0559975db32ea116430 GIT binary patch literal 5830 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 QB+P~!qc(E#cmGXj41C8aRsaA1 literal 0 HcmV?d00001 diff --git a/assets/app/UpgradeArrow.png b/assets/app/UpgradeArrow.png new file mode 100644 index 0000000000000000000000000000000000000000..50a98cced5b73f576557178444812305f23ad14a GIT binary patch literal 609 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBxo@5>jv*C{Z*O$_GC2w~JS^PEVEurD_Xd;f zjmDtHjZ7PutsS&CutaTO5bER0U^o}KDY>a&L;uXZdsF|XB=0$pVkgJRaKUl**|cqO z>(dLkC3BMfO1{Xt_#}V-{rAuPr#~}Hs@gqVnYSmb%y^;kKs!QED`Lrm#6)(enJHcT)k|bbaX1rx_>kT{eJ=VTZHc;Mn%=qTpvUBGP zE}OJZUounhQsfu;8PeVF72i+aymLLrFNR~>q92m7InJDU;1d2zeyY;6Ne-{mD;k$K zZOBSE7S!{C>%3F*^2Wni0*8WpUPzq}VdY!xDB)fBb|q8WRRK=#!Z#~z+GTk=BVWur zm3-smgd44IR?4)`mA&M;uUe};ajo;NQ|bPxmTw+S&?~+h9LeV`Z literal 0 HcmV?d00001 diff --git a/assets/app/Window.png b/assets/app/Window.png new file mode 100644 index 0000000000000000000000000000000000000000..58896617a4125dcdf526dbf974690be547e7cd97 GIT binary patch literal 529 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBxn-U%jv*C{Z)e>PJmetIeqEV0fnA3Aycg@G z#)!r!Ae`*CfN3k!2BwdaX&&s$8vYde8~b^D6PP#Y&7XZUXP>_7sCNHt-lrlLpxF-D z7S>yK+A$pOj+*PK`W>%r&fjl4{BTVXe>k6UR^N^re{5?6*DX!is&*<_Y~5Av z_aD?vyCcHd`dXCDbo;m8ejER#$1r@Wv~;nr?vd%2b{fcj%(j1WV(m|3(^SRq=TBqj zsC#ZI5O)-?3E2Gd4|96r+4mw3&na@s&%G4IVe|PrONqj@4{4icPGUOt_~R-o^<^ge zQ>QOs-m^tvjVwnt`=MKn8_IAnV+1A#)f~!xWv88aNnIxBd!)zYMH{x3xynw{JJ)k| z>DK?}qV5%zpFTVHWY*tE?_at{H*kRBk0I)q`Hr9xrR*??KOnBBtDnm{r-UW|tFq>D literal 0 HcmV?d00001 diff --git a/assets/app/WindowUnsupported.png b/assets/app/WindowUnsupported.png new file mode 100644 index 0000000000000000000000000000000000000000..1ebf0608fb1dde41e53f0c2409449fd576066fda GIT binary patch literal 957 zcmV;u148_XP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA15!yuK~!i%?VI0A z6j2n%$8lM*LR=&iBidPar5{AmLr^aT{sGoY6cY9qSQaD%Awp0Y)I(48l06jlWcd(9 zNczxQpn?^-*cw(S6>dbV$<8|0=XUe6Sxo39$z~P=dcUk=0d*|%HT$QrKRGJP_ z)QWCNqmt+$YF|(cl!LTNF+nj&v6rGOq_L&zD8?vEijj5cQl%WED@1DpX=(;2cAJ&z z*r)zmxAk4gM(WpKoH28{t`8-X$;YDaNP#ebw6P)jN?ph{W_Ko(>HF6dBUUX&*@FUn zOw+WHm2N($(gjRro>zSy?2Tqq+m-0M4@!M&r=rgO6r9u^(|nRhB#t6qg~t1+$-5RXb7J!Ia9d%!Kp9(N z);&zTp|BrL=*#RCCgFnng=QF&BNN9W>n5BBq-XA4zC@`lJ=OR06vlw6s)t2tL)ThF z$_lqFZHhFP$;j~An++#B+to#?-c50R`r-A;oa)`Xyu5r5NhA_ELygSsY(cxQz^@o# zi`;vf`%jjW@S3)CF01#n%TE@2+*bIsNL`7JzOSxpyLh4U$NW}3Ry{TSpr>bPhc+*U zSwJh?D^hR36B$LQp1mDcIGs)(5$QkKIP^MJ-+twW`fDL>Y^s|0a;NLu!ht<3_IN6l z8WgEb(M8J%u7%8#qUA)G3YjOuAS}|J34<_5dnydLOM5O1I7|B?47f`BCJZ=A`zj2$ zN&7AgI7tU047f-KCJZ=82PzC?O9w6tWJ*gB2C}532?H6@QiVa#($a-NkkTxKK~U0c zgh3F}tb~Ez((HtRpVBOafnU;Wg@GT^tc8Ks((HwSm(rmS23|?K3Cli-;3nKHT9&L)+B$ymCyv6JreStMD=p59Ilc^cd|kSVI0?{3fiqbw&syfb zs$GgV%zwMu(b{mLrC$t}CSg2@@ZYRUuS=IOf0GW)qh&EvDC0BKG*jSgXp*9dqVy3f fjsMFkR}|$ptujgdi(p?d00000NkvXXu0mjf%E++S literal 0 HcmV?d00001 diff --git a/src/discord/content/css/discord.css b/src/discord/content/css/discord.css index da9d664..00d1640 100644 --- a/src/discord/content/css/discord.css +++ b/src/discord/content/css/discord.css @@ -25,13 +25,6 @@ display: none !important; } -div#acThemes:after, -div#acSettings:after, -div#acForceQuit:after, -div#acKeybinds:after { - content: url("https://raw.githubusercontent.com/ArmCord/BrandingStuff/main/ac_white_plug16x.png"); - margin-right: 5px; -} .container-3jbRo5.info-1hMolH.browserNotice-1u-Y5o { visibility: hidden; display: block !important; diff --git a/src/protocol.ts b/src/protocol.ts index 3ed9060..49b8e89 100644 --- a/src/protocol.ts +++ b/src/protocol.ts @@ -10,21 +10,39 @@ protocol.registerSchemesAsPrivileged([ secure: true, supportFetchAPI: true, corsEnabled: false, - bypassCSP: true + bypassCSP: true, + stream: true } } ]); void app.whenReady().then(() => { protocol.handle("armcord", (req) => { - const url = req.url.replace("armcord://plugins/", "").split("/"); - const filePath = path.join(import.meta.dirname, "plugins", `/${url[0]}/${url[1]}`); - if (filePath.includes("..")) { - return new Response("bad", { - status: 400, - headers: {"content-type": "text/html"} - }); + if (req.url.startsWith("armcord://plugins/")) { + const url = req.url.replace("armcord://plugins/", "").split("/"); + const filePath = path.join(import.meta.dirname, "plugins", `/${url[0]}/${url[1]}`); + if (filePath.includes("..")) { + return new Response("bad", { + status: 400, + headers: {"content-type": "text/html"} + }); + } + return net.fetch(Url.pathToFileURL(filePath).toString()); + } else if (req.url.startsWith("armcord://assets/")) { + const file = req.url.replace("armcord://assets/", ""); + const filePath = path.join(import.meta.dirname, "assets", "app", `${file}`); + console.log(filePath); + if (filePath.includes("..")) { + return new Response("bad", { + status: 400, + headers: {"content-type": "text/html"} + }); + } + return net.fetch(Url.pathToFileURL(filePath).toString()); } - return net.fetch(Url.pathToFileURL(filePath).toString()); + return new Response("bad", { + status: 400, + headers: {"content-type": "text/html"} + }); }); }); diff --git a/src/splash/splash.html b/src/splash/splash.html index 38e0b78..ddeca44 100644 --- a/src/splash/splash.html +++ b/src/splash/splash.html @@ -18,7 +18,7 @@

@@ -44,7 +44,7 @@ if (remoteVersion > window.internal.version.replace(/\./g, "")) { var elem = document.createElement("img"); elem.classList.add("logo"); - elem.src = "https://armcord.app/update.webp"; + elem.src = "armcord://assets/Update.webp"; document.body.prepend(elem); document.getElementById("splashscreen-armcord").remove(); text.innerHTML = await internal.getLang("loading_screen_update"); diff --git a/src/themeManager/manager.html b/src/themeManager/manager.html index 082b626..550b3dd 100644 --- a/src/themeManager/manager.html +++ b/src/themeManager/manager.html @@ -15,7 +15,7 @@ title="BetterDiscord theme format" placeholder="https://raw.githubusercontent.com/... [.theme.css] or drag and drop a theme" /> - +

- +
Venmic
Themes
-
); } + +const rootElement = document.getElementById("root"); +if (rootElement) { + render(Stepper, rootElement); +} else { + console.error("Root element not found"); +} From 145f8b06d91707c77e2bc9b069bc5478f78ebc36 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Tue, 11 Feb 2025 21:53:31 +0100 Subject: [PATCH 581/844] fix: remove ts-expect-error --- src/setup/setup.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/setup/setup.tsx b/src/setup/setup.tsx index 58d4706..3ca8c9a 100644 --- a/src/setup/setup.tsx +++ b/src/setup/setup.tsx @@ -338,7 +338,7 @@ export default function Stepper() { } }; - const handleStateUpdate = (step: keyof typeof stepStates) => (value: string | null) => { + const handleStateUpdate = (step: keyof StepStates) => (value: string | null) => { setStepStates((prev) => ({ ...prev, [step]: value, @@ -359,12 +359,10 @@ export default function Stepper() { isValid={steps[currentStep()].isValid} onStateUpdate={ currentStep() === 1 - ? // @ts-expect-error - handleStateUpdate("windowStyle") + ? handleStateUpdate("windowStyle") : currentStep() === 3 - ? // @ts-expect-error - handleStateUpdate("traySettings") - : undefined + ? handleStateUpdate("traySettings") + : undefined } /> From 1c455296b59bb3ebcdd0e8f64c2017439776a110 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Wed, 12 Feb 2025 13:42:14 +0100 Subject: [PATCH 582/844] feat: new first-time setup UI Co-authored-by: FlintSH --- src/setup/main.ts | 16 +++- src/setup/newSetup.html | 13 --- src/setup/preload.mts | 2 +- src/setup/setup.html | 184 +++++----------------------------------- src/setup/setup.tsx | 135 +++++++++++++---------------- 5 files changed, 93 insertions(+), 257 deletions(-) delete mode 100644 src/setup/newSetup.html diff --git a/src/setup/main.ts b/src/setup/main.ts index 5c7bfde..089e792 100644 --- a/src/setup/main.ts +++ b/src/setup/main.ts @@ -16,12 +16,22 @@ export async function createSetupWindow(): Promise { title: "Legcord Setup", darkTheme: true, icon: getConfig("customIcon") ?? path.join(import.meta.dirname, "../", "/assets/desktop.png"), - frame: true, + trafficLightPosition: { + x: 13, + y: 10, + }, + titleBarStyle: "hidden", + titleBarOverlay: { + color: "#2c2f33", + symbolColor: "#99aab5", + height: 30, + }, resizable: false, + vibrancy: "fullscreen-ui", maximizable: false, autoHideMenuBar: true, webPreferences: { - sandbox: false, + sandbox: true, spellcheck: false, preload: path.join(import.meta.dirname, "setup", "preload.mjs"), }, @@ -56,6 +66,6 @@ export async function createSetupWindow(): Promise { app.relaunch(); app.exit(); }); - void setupWindow.loadFile(path.join(import.meta.dirname, "/html/newSetup.html")); + void setupWindow.loadFile(path.join(import.meta.dirname, "/html/setup.html")); }); } diff --git a/src/setup/newSetup.html b/src/setup/newSetup.html deleted file mode 100644 index c17d81d..0000000 --- a/src/setup/newSetup.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Legcord Setup - - - -
- - - \ No newline at end of file diff --git a/src/setup/preload.mts b/src/setup/preload.mts index 6d124bf..7e8d26f 100644 --- a/src/setup/preload.mts +++ b/src/setup/preload.mts @@ -1,4 +1,4 @@ -import { contextBridge, ipcRenderer } from "electron"; +const { contextBridge, ipcRenderer } = require("electron"); import type { Settings } from "../@types/settings.js"; contextBridge.exposeInMainWorld("legcordinternal", { diff --git a/src/setup/setup.html b/src/setup/setup.html index 52e2967..2f42c56 100644 --- a/src/setup/setup.html +++ b/src/setup/setup.html @@ -1,167 +1,25 @@ - + - - - - - + + + Legcord Setup - - - -
- -
- - - - - - -
-
- - - - + + + + +
+
+ + + \ No newline at end of file diff --git a/src/setup/setup.tsx b/src/setup/setup.tsx index 3ca8c9a..03cf2f4 100644 --- a/src/setup/setup.tsx +++ b/src/setup/setup.tsx @@ -11,18 +11,10 @@ import { Settings, Sparkles, } from "lucide-solid"; -import { For, createSignal } from "solid-js"; +import { For, Show, createSignal } from "solid-js"; import { render } from "solid-js/web"; import { Motion } from "solid-motionone"; -interface StepProps { - currentStep: number; - onNext: () => void; - onBack: () => void; - isValid?: boolean; - onStateUpdate?: ((value: string | null) => void) | undefined; -} - const Welcome = ({ onNext }: { onNext: () => void }) => ( @@ -39,13 +31,17 @@ const Welcome = ({ onNext }: { onNext: () => void }) => ( ); -const WindowStyle = ({ onNext, onBack, isValid, onStateUpdate }: StepProps) => { +const WindowStyle = ({ readyToNext }: { readyToNext: (valid: boolean) => void }) => { const [selectedStyle, setSelectedStyle] = createSignal(null); const handleStyleSelect = (styleId: string) => { const newValue = selectedStyle() === styleId ? null : styleId; setSelectedStyle(newValue); - onStateUpdate?.(newValue); + if (newValue === null) { + readyToNext(false); + } else { + readyToNext(true); + } }; const styles = [ @@ -112,13 +108,17 @@ const WindowStyle = ({ onNext, onBack, isValid, onStateUpdate }: StepProps) => { ); }; -const TraySettings = ({ onNext, onBack, isValid, onStateUpdate }: StepProps) => { +const TraySettings = ({ readyToNext }: { readyToNext: (valid: boolean) => void }) => { const [selectedOption, setSelectedOption] = createSignal(null); const handleOptionSelect = (optionId: string) => { const newValue = selectedOption() === optionId ? null : optionId; setSelectedOption(newValue); - onStateUpdate?.(newValue); + if (newValue === null) { + readyToNext(false); + } else { + readyToNext(true); + } }; const options = [ @@ -194,7 +194,7 @@ const TraySettings = ({ onNext, onBack, isValid, onStateUpdate }: StepProps) => ); }; -const Finish = ({ onNext, onBack }: StepProps) => ( +const Finish = ({ restart }: { restart: () => void }) => (

You're All Set!

@@ -206,7 +206,7 @@ const Finish = ({ onNext, onBack }: StepProps) => (

Launch Legcord @@ -214,9 +214,17 @@ const Finish = ({ onNext, onBack }: StepProps) => ( ); -const ModSelector = ({ onNext, onBack, isValid }: StepProps) => { +const ModSelector = ({ readyToNext }: { readyToNext: (valid: boolean) => void }) => { const [selectedMod, setSelectedMod] = createSignal(null); - + const handleModSelect = (optionId: string) => { + const newValue = selectedMod() === optionId ? null : optionId; + setSelectedMod(newValue); + if (newValue === null) { + readyToNext(false); + } else { + readyToNext(true); + } + }; const mods = [ { id: "vencord", @@ -246,7 +254,7 @@ const ModSelector = ({ onNext, onBack, isValid }: StepProps) => { Loading...}> {(mod) => ( setSelectedMod(selectedMod() === mod.id ? null : mod.id)} + onClick={() => handleModSelect(mod.id)} class={`group relative w-full p-4 rounded-xl transition-all duration-300 text-left ${ selectedMod() === mod.id ? "bg-purple-900/40 border border-purple-500/50 shadow-lg shadow-purple-500/20" @@ -285,10 +293,10 @@ const ModSelector = ({ onNext, onBack, isValid }: StepProps) => { handleModSelect("shelter")} class={`w-full px-6 py-2.5 rounded-xl border transition-colors font-medium ${ - selectedMod() === null + selectedMod() === "shelter" ? "border-purple-500/50 text-purple-400 hover:bg-purple-500/10" : "border-gray-700/30 text-gray-500 hover:border-purple-500/50 hover:text-purple-400 hover:bg-purple-500/10" }`} @@ -299,52 +307,24 @@ const ModSelector = ({ onNext, onBack, isValid }: StepProps) => { ); }; -interface StepStates { - windowStyle: string | null; - modSelector: string | null; - traySettings: string | null; -} - export default function Stepper() { const [currentStep, setCurrentStep] = createSignal(0); - - const [stepStates, setStepStates] = createSignal({ - windowStyle: null, - modSelector: null, - traySettings: null, - }); - - const steps = [ - { component: Welcome, label: "Welcome", isValid: true }, - { component: WindowStyle, label: "Window Style", isValid: stepStates().windowStyle !== null }, - { component: ModSelector, label: "Client Mods", isValid: true }, // Always valid bc Shelter is default - { component: TraySettings, label: "Tray Settings", isValid: stepStates().traySettings !== null }, - { component: Finish, label: "Finish", isValid: true }, - ]; - - const CurrentStepComponent = steps[currentStep()].component; - const isLastStep = currentStep() === steps.length - 1; - const isFirstStep = currentStep() === 0; - + const [isValid, setValid] = createSignal(true); + const maxSteps = 5; const handleNext = () => { - if (currentStep() < steps.length - 1 && steps[currentStep()].isValid) { - setCurrentStep((prev) => prev + 1); - } + if (!isValid()) return; + setCurrentStep((prev) => prev + 1); + setValid(false); }; - const handleBack = () => { - if (currentStep() > 0) { - setCurrentStep((prev) => prev - 1); - } + setCurrentStep((prev) => prev - 1); }; - - const handleStateUpdate = (step: keyof StepStates) => (value: string | null) => { - setStepStates((prev) => ({ - ...prev, - [step]: value, - })); + const setReady = (valid: boolean) => { + setValid(valid); + }; + const restart = () => { + console.log("Restarting..."); }; - return (
- + + + + + + + + + + + + + + + - {!isFirstStep && !isLastStep && ( +
- Step {currentStep() + 1} of {steps.length} + Step {currentStep() + 1} of {maxSteps}
- )} +
); From 1bc4ef49137732c9651f9599933715343625c5f9 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Wed, 12 Feb 2025 20:43:07 +0100 Subject: [PATCH 583/844] feat: first-time setup logic --- assets/app/custom.png | Bin 0 -> 82060 bytes assets/app/equicord.png | Bin 0 -> 13787 bytes assets/app/native.png | Bin 0 -> 93766 bytes assets/app/vencord.png | Bin 0 -> 42385 bytes src/discord/venmic.ts | 1 + src/setup/main.ts | 7 +- src/setup/preload.mts | 15 +++- src/setup/setup.css | 165 ---------------------------------------- src/setup/setup.tsx | 116 +++++++++++++++------------- 9 files changed, 79 insertions(+), 225 deletions(-) create mode 100644 assets/app/custom.png create mode 100644 assets/app/equicord.png create mode 100644 assets/app/native.png create mode 100644 assets/app/vencord.png delete mode 100644 src/setup/setup.css diff --git a/assets/app/custom.png b/assets/app/custom.png new file mode 100644 index 0000000000000000000000000000000000000000..b14cd42f8bfbec901a5b5efc5eee2b70565a013a GIT binary patch literal 82060 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 z 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 EKX$&hWdHyG literal 0 HcmV?d00001 diff --git a/assets/app/equicord.png b/assets/app/equicord.png new file mode 100644 index 0000000000000000000000000000000000000000..bee9e34f3d1c1e33f8a83822b0a2a1c13b905f5e GIT binary patch literal 13787 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
%nw2{I!x|!6* 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 Q9|j;Tp&(u@YWU}W09)nX0RR91 literal 0 HcmV?d00001 diff --git a/assets/app/native.png b/assets/app/native.png new file mode 100644 index 0000000000000000000000000000000000000000..d89a9cc4f0d9bef3a12f1a10f0d68a3a7cead73a GIT binary patch literal 93766 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%0AVIi#@j`d#<<1LG;Xd`DQlSPa3KaEoH_vfP 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
!X|15n*gzbK*?4L!ry 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 Ls>)PJnT7lxddru- literal 0 HcmV?d00001 diff --git a/assets/app/vencord.png b/assets/app/vencord.png new file mode 100644 index 0000000000000000000000000000000000000000..3598e401ffec125052dbbdee09d4e6dab99ee72c GIT binary patch literal 42385 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

;ev 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

    F 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 { if (platform() !== "darwin") import("./tray.js"); - return new Promise((resolve) => { + return new Promise(() => { setupWindow = new BrowserWindow({ width: 800, height: 600, @@ -36,11 +36,6 @@ export async function createSetupWindow(): Promise { preload: path.join(import.meta.dirname, "setup", "preload.mjs"), }, }); - ipcMain.on("saveSettings", (_event, args: Settings) => { - console.log(args); - setConfigBulk(args); - resolve(); - }); ipcMain.on("setup-minimize", () => { setupWindow.minimize(); }); diff --git a/src/setup/preload.mts b/src/setup/preload.mts index 7e8d26f..2d2d4b4 100644 --- a/src/setup/preload.mts +++ b/src/setup/preload.mts @@ -1,12 +1,23 @@ const { contextBridge, ipcRenderer } = require("electron"); import type { Settings } from "../@types/settings.js"; -contextBridge.exposeInMainWorld("legcordinternal", { +contextBridge.exposeInMainWorld("setup", { restart: () => ipcRenderer.send("setup-restart"), - getOS: ipcRenderer.sendSync("setup-getOS") as string, + os: ipcRenderer.sendSync("setup-getOS") as string, saveSettings: (...args: [Settings]) => ipcRenderer.send("setup-saveSettings", ...args), getLang: (toGet: string) => ipcRenderer.invoke("setup-getLang", toGet).then((result: string) => { return result; }), }); + +declare global { + interface Window { + setup: { + // biome-ignore lint/suspicious/noExplicitAny: + saveSettings: (settings: any) => void; + restart: () => void; + getOS: string; + }; + } +} diff --git a/src/setup/setup.css b/src/setup/setup.css deleted file mode 100644 index 5cb4760..0000000 --- a/src/setup/setup.css +++ /dev/null @@ -1,165 +0,0 @@ -/* Meta {{{ */ -:root { - --background-primary: #282b30; - --background-secondary: rgba(255, 255, 255, 0.1); - --background-modifier-hover: rgba(106, 116, 128, 0.16); - --brand-experiment: #7289da; - --brand-experiment-560: #5c6fb1; - --brand-experiment-600: #4e5d94; - --interactive-normal: #b9bbbe; - --interactive-hover: #dcddde; - --text-muted: #72767d; - --font-primary: "Whitney"; -} - -@font-face { - font-family: Whitney; - font-weight: 400; - font-style: normal; - src: url(https://legcord.app/whitney_400.woff) format("woff"); -} - -html, -body { - overflow: hidden; - margin: 0; - width: 100%; - height: 100%; - background: #1e2836; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -* { - font-family: var(--font-primary), sans-serif; - - box-sizing: border-box; - user-select: none; - cursor: default; -} -/* }}} */ - -/* Utility classes {{{ */ -.hidden { - display: none !important; -} -.text-center { - text-align: center; -} -.setup-ask { - font-size: 20px; -} - -.center { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} -/* }}} */ - -#setup { - display: flex; - flex-direction: column; - align-items: center; - - color: white; -} - -/* Warning {{{ */ -#warning { - font-size: 1.5em; - font-weight: bold; - text-align: center; - margin-top: 10px; - margin-bottom: 10px; - - max-width: 328px; - background-color: rgba(255, 0, 0, 0.1); - - border: red solid 2px; - border-radius: 0.5rem; -} -#warning > p { - color: white; - font-weight: bold; - margin: 1rem; -} -/* }}} */ - -/* Titlebar {{{ */ -div { - margin: 0; - padding: 0; - border: 0; - display: block; - font-weight: inherit; - font-style: inherit; - font-family: inherit; - font-size: 100%; - vertical-align: baseline; -} - -/* }}} */ - -/* Buttons {{{ */ -#buttons { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - gap: 1rem; - user-select: all !important; - margin-top: 10px; - margin-bottom: 10px; -} -button { - background: #9739ec; - color: var(--header-primary); - outline: none; - border: none; - border-radius: 4px; - padding: 8px 20px; - transition: 0.17s ease; -} -button:hover { - background: #aa6ce0; - cursor: pointer; - transition: 0.17s ease; -} - -button:active { - background: #d29fff; - cursor: pointer; - transition: 0.17s ease; -} -/* }}} */ - -/* Dropdowns {{{ */ -select { - -webkit-appearance: button; - -moz-appearance: button; - -webkit-padding-end: 20px; - -moz-padding-end: 20px; - -webkit-padding-start: 2px; - -moz-padding-start: 2px; - background-color: #2c2f33; - background-position: center right; - background-repeat: no-repeat; - border: 1px solid #aaa; - border-radius: 2px; - box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1); - color: #fff; - font-size: inherit; - margin: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - text-align: center; -} -option { - text-align: left; -} -/* }}} */ diff --git a/src/setup/setup.tsx b/src/setup/setup.tsx index 03cf2f4..ff67018 100644 --- a/src/setup/setup.tsx +++ b/src/setup/setup.tsx @@ -41,6 +41,7 @@ const WindowStyle = ({ readyToNext }: { readyToNext: (valid: boolean) => void }) readyToNext(false); } else { readyToNext(true); + window.setup.saveSettings({ windowStyle: newValue }); } }; @@ -49,13 +50,13 @@ const WindowStyle = ({ readyToNext }: { readyToNext: (valid: boolean) => void }) id: "native", title: "Native Window", description: "Use your system's default window decorations", - screenshot: "https://placehold.co/600x400", + screenshot: "legcord://assets/native.png", }, { - id: "custom", + id: "default", title: "Custom Titlebar", description: "Use Legcord's custom titlebar design", - screenshot: "https://placehold.co/600x400", + screenshot: "legcord://assets/custom.png", }, ]; @@ -118,18 +119,19 @@ const TraySettings = ({ readyToNext }: { readyToNext: (valid: boolean) => void } readyToNext(false); } else { readyToNext(true); + window.setup.saveSettings({ tray: newValue }); } }; const options = [ { - id: "enable", + id: "dynamic", title: "Enable Tray Icon", description: "Show Legcord in your system tray", icon: LaptopMinimalCheck, }, { - id: "disable", + id: "disabled", title: "Disable Tray Icon", description: "Don't show Legcord in your system tray", icon: LaptopMinimal, @@ -143,53 +145,53 @@ const TraySettings = ({ readyToNext }: { readyToNext: (valid: boolean) => void }

    System Tray

    Choose whether to enable the system tray icon

    - -
    -
    - -
    -

    - System tray functionality may have issues or behave differently on Linux systems. -

    + +
    +
    + +
    +

    + System tray functionality may have issues or behave differently on Linux systems. +

    +
    - - - {(option) => ( - handleOptionSelect(option.id)} - class={`group relative w-full p-4 rounded-xl transition-all duration-300 text-left ${ - selectedOption() === option.id - ? "bg-purple-900/40 border border-purple-500/50 shadow-lg shadow-purple-500/20" - : "bg-gray-800/40 border border-gray-700/30 hover:bg-gray-800/60" - }`} - > -
    -
    - -
    -
    -

    {option.title}

    -

    {option.description}

    -
    -
    - {selectedOption() === option.id && ( -
    - )} -
    + + + {(option) => ( + handleOptionSelect(option.id)} + class={`group relative w-full p-4 rounded-xl transition-all duration-300 text-left ${ + selectedOption() === option.id + ? "bg-purple-900/40 border border-purple-500/50 shadow-lg shadow-purple-500/20" + : "bg-gray-800/40 border border-gray-700/30 hover:bg-gray-800/60" + }`} + > +
    +
    +
    - - )} - -
    +
    +

    {option.title}

    +

    {option.description}

    +
    +
    + {selectedOption() === option.id && ( +
    + )} +
    +
    +
    + )} +
    ); }; @@ -223,6 +225,11 @@ const ModSelector = ({ readyToNext }: { readyToNext: (valid: boolean) => void }) readyToNext(false); } else { readyToNext(true); + if (newValue !== "shelter") { + window.setup.saveSettings({ mods: [newValue] }); + } else { + window.setup.saveSettings({ mods: [] }); + } } }; const mods = [ @@ -230,13 +237,13 @@ const ModSelector = ({ readyToNext }: { readyToNext: (valid: boolean) => void }) id: "vencord", title: "Vencord", description: "Client mod with plugins and themes.", - icon: "/vencord.png", + icon: "legcord://assets/vencord.png", }, { id: "equicord", title: "Equicord", description: "A fork of Vencord with more plugins.", - icon: "/equicord.png", + icon: "legcord://assets/equicord.png", }, ]; @@ -307,7 +314,7 @@ const ModSelector = ({ readyToNext }: { readyToNext: (valid: boolean) => void }) ); }; -export default function Stepper() { +function Stepper() { const [currentStep, setCurrentStep] = createSignal(0); const [isValid, setValid] = createSignal(true); const maxSteps = 5; @@ -318,12 +325,17 @@ export default function Stepper() { }; const handleBack = () => { setCurrentStep((prev) => prev - 1); + if (currentStep() === 0) { + setValid(true); + } }; const setReady = (valid: boolean) => { setValid(valid); }; const restart = () => { console.log("Restarting..."); + window.setup.saveSettings({ doneSetup: true }); + window.setup.restart(); }; return (
    From c819c35e8358ce8c623ee1479abf0b8b73afee79 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Wed, 12 Feb 2025 21:09:44 +0100 Subject: [PATCH 584/844] feat: cross-platform styling in new setup --- assets/app/mockup.jpg | Bin 0 -> 133487 bytes src/setup/main.ts | 33 +++++++++++++++++++-------------- src/setup/preload.mts | 18 +++++++++++++++++- src/setup/setup.html | 1 + src/setup/setup.tsx | 2 +- 5 files changed, 38 insertions(+), 16 deletions(-) create mode 100644 assets/app/mockup.jpg diff --git a/assets/app/mockup.jpg b/assets/app/mockup.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8b89578eb901ef453c388cd0583c8fccf055da7e GIT binary patch literal 133487 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%0DrDnyH$9?RFX}R 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 { if (platform() !== "darwin") import("./tray.js"); return new Promise(() => { - setupWindow = new BrowserWindow({ + const windowOptions: BrowserWindowConstructorOptions = { width: 800, height: 600, title: "Legcord Setup", darkTheme: true, icon: getConfig("customIcon") ?? path.join(import.meta.dirname, "../", "/assets/desktop.png"), - trafficLightPosition: { - x: 13, - y: 10, - }, - titleBarStyle: "hidden", - titleBarOverlay: { - color: "#2c2f33", - symbolColor: "#99aab5", - height: 30, - }, resizable: false, - vibrancy: "fullscreen-ui", + frame: true, maximizable: false, autoHideMenuBar: true, webPreferences: { @@ -35,7 +25,22 @@ export async function createSetupWindow(): Promise { spellcheck: false, preload: path.join(import.meta.dirname, "setup", "preload.mjs"), }, - }); + }; + if (platform() === "darwin") { + windowOptions.titleBarStyle = "hidden"; + windowOptions.titleBarOverlay = { + color: "#2c2f33", + symbolColor: "#99aab5", + height: 30, + }; + windowOptions.trafficLightPosition = { + x: 13, + y: 10, + }; + windowOptions.frame = false; + windowOptions.vibrancy = "fullscreen-ui"; + } + setupWindow = new BrowserWindow(windowOptions); ipcMain.on("setup-minimize", () => { setupWindow.minimize(); }); diff --git a/src/setup/preload.mts b/src/setup/preload.mts index 2d2d4b4..9b979f8 100644 --- a/src/setup/preload.mts +++ b/src/setup/preload.mts @@ -11,13 +11,29 @@ contextBridge.exposeInMainWorld("setup", { }), }); +if (ipcRenderer.sendSync("setup-getOS") !== "darwin") { + document.addEventListener("DOMContentLoaded", () => { + const css = document.createElement("style"); + css.innerHTML = `.bg { + background-image: url("legcord://assets/mockup.jpg"); + background-repeat: round; + height: 100%; + width: 100%; + position: absolute; + outline: 80px solid black; + -webkit-filter: blur(10px); + }`; + document.head.appendChild(css); + }); +} + declare global { interface Window { setup: { // biome-ignore lint/suspicious/noExplicitAny: saveSettings: (settings: any) => void; restart: () => void; - getOS: string; + os: string; }; } } diff --git a/src/setup/setup.html b/src/setup/setup.html index 2f42c56..5347bc2 100644 --- a/src/setup/setup.html +++ b/src/setup/setup.html @@ -19,6 +19,7 @@
    +
    diff --git a/src/setup/setup.tsx b/src/setup/setup.tsx index ff67018..e8dc2f4 100644 --- a/src/setup/setup.tsx +++ b/src/setup/setup.tsx @@ -145,7 +145,7 @@ const TraySettings = ({ readyToNext }: { readyToNext: (valid: boolean) => void }

    System Tray

    Choose whether to enable the system tray icon

    - +
    From 33ca0079c6bc5480c00a570085e986c86ba066cf Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Wed, 12 Feb 2025 21:19:25 +0100 Subject: [PATCH 585/844] chore: bump electron --- package.json | 2 +- pnpm-lock.yaml | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index c68c63a..b957945 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@uwu/lune": "^1.5.1", "@uwu/shelter-defs": "^1.4.1", "babel-preset-solid": "^1.9.3", - "electron": "34.0.1", + "electron": "34.1.1", "electron-builder": "^25.1.8", "lucide-solid": "^0.475.0", "rollup": "^4.27.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8c4c872..40124aa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -71,8 +71,8 @@ importers: specifier: ^1.9.3 version: 1.9.3(@babel/core@7.26.7) electron: - specifier: 34.0.1 - version: 34.0.1 + specifier: 34.1.1 + version: 34.1.1 electron-builder: specifier: ^25.1.8 version: 25.1.8(electron-builder-squirrel-windows@25.1.8) @@ -1692,8 +1692,8 @@ packages: electron-updater@6.3.9: resolution: {integrity: sha512-2PJNONi+iBidkoC5D1nzT9XqsE8Q1X28Fn6xRQhO3YX8qRRyJ3mkV4F1aQsuRnYPqq6Hw+E51y27W75WgDoofw==} - electron@34.0.1: - resolution: {integrity: sha512-aArw5tAM80i3CKwEREnyZSM1SkARf5Jd1yBMTIdOL4pB1M+p/oDeyWSFI9Dl+vujyfJKiK4SS5+j19wna1onMw==} + electron@34.1.1: + resolution: {integrity: sha512-1aDYk9Gsv1/fFeClMrxWGoVMl7uCUgl1pe26BiTnLXmAoqEXCa3f3sCKFWV+cuDzUjQGAZcpkWhGYTgWUSQrLA==} engines: {node: '>= 12.20.55'} hasBin: true @@ -3279,7 +3279,7 @@ snapshots: '@electron/get@2.0.3': dependencies: - debug: 4.3.7 + debug: 4.4.0 env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -4633,7 +4633,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@34.0.1: + electron@34.1.1: dependencies: '@electron/get': 2.0.3 '@types/node': 20.17.9 @@ -4778,7 +4778,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.7 + debug: 4.4.0 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: From 871d29b059bce852af87ece14db04c57b6a45c4e Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Wed, 12 Feb 2025 21:26:39 +0100 Subject: [PATCH 586/844] feat: import touchbar plugin only on macOS --- src/discord/preload/mods/shelter.mts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/discord/preload/mods/shelter.mts b/src/discord/preload/mods/shelter.mts index d26222a..28149c0 100644 --- a/src/discord/preload/mods/shelter.mts +++ b/src/discord/preload/mods/shelter.mts @@ -6,8 +6,10 @@ const requiredPlugins: Record { From 07451f0d7e110cf6d31d0e32abedcefcff256d78 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Wed, 12 Feb 2025 21:26:49 +0100 Subject: [PATCH 587/844] chore: linting --- src/discord/preload/mods/shelter.mts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/discord/preload/mods/shelter.mts b/src/discord/preload/mods/shelter.mts index 28149c0..8e5a881 100644 --- a/src/discord/preload/mods/shelter.mts +++ b/src/discord/preload/mods/shelter.mts @@ -8,7 +8,10 @@ const requiredPlugins: Record Date: Thu, 13 Feb 2025 11:08:06 -0600 Subject: [PATCH 588/844] added macports installation info to README (#834) --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 5cb74e8..b45a9b3 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,13 @@ Legcord is also available on the [Homebrew Cask](https://github.com/Homebrew/hom ```zsh brew install --cask legcord ``` +### MacPorts + +Legcord is available [via MacPorts](https://ports.macports.org/port/Legcord/) + +```sh +sudo port install legcord +``` ### FreeBSD From 1833760c8be5b5fd4a76bbcd0cf1632d7bff0216 Mon Sep 17 00:00:00 2001 From: Fabricio Silva Date: Fri, 14 Feb 2025 16:35:07 +0000 Subject: [PATCH 589/844] fix: move package tsx to devDependencies (#835) --- package.json | 4 ++-- pnpm-lock.yaml | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b957945..74b2c81 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@rollup/plugin-esm-shim": "^0.1.7", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.0", + "@rollup/plugin-replace": "^6.0.2", "@rollup/plugin-typescript": "^12.1.1", "@types/node": "^22.10.1", "@types/ws": "^8.5.13", @@ -48,9 +49,9 @@ "rollup": "^4.27.4", "rollup-plugin-copy": "^3.5.0", "rollup-plugin-esbuild": "^6.1.1", - "@rollup/plugin-replace": "^6.0.2", "solid-js": "^1.9.3", "solid-motionone": "^1.0.3", + "tsx": "^4.19.2", "typescript": "^5.7.2" }, "dependencies": { @@ -58,7 +59,6 @@ "electron-context-menu": "^4.0.4", "electron-is-dev": "^3.0.1", "electron-updater": "^6.3.9", - "tsx": "^4.19.2", "ws": "^8.18.0" }, "optionalDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 40124aa..8d42147 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,9 +20,6 @@ importers: electron-updater: specifier: ^6.3.9 version: 6.3.9 - tsx: - specifier: ^4.19.2 - version: 4.19.2 ws: specifier: ^8.18.0 version: 8.18.0 @@ -94,6 +91,9 @@ importers: solid-motionone: specifier: ^1.0.3 version: 1.0.3(solid-js@1.9.3) + tsx: + specifier: ^4.19.2 + version: 4.19.2 typescript: specifier: ^5.7.2 version: 5.7.2 From e293f9c7353cfda83d7be65841ade9f8c904b346 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sat, 8 Mar 2025 15:00:35 +0100 Subject: [PATCH 590/844] feat: modern macOS transparency --- assets/lang/en-US.json | 2 +- src/discord/window.ts | 14 ++++++++++---- src/shelter/settings/pages/SettingsPage.tsx | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/assets/lang/en-US.json b/assets/lang/en-US.json index 95585b7..f53a667 100644 --- a/assets/lang/en-US.json +++ b/assets/lang/en-US.json @@ -23,7 +23,7 @@ "settings-transparency": "Transparency", "settings-transparency-desc": "Set the transparency mode Legcord uses.", "settings-transparency-universal": "Universal", - "settings-transparency-modern": "Modern (Windows 11 only)", + "settings-transparency-modern": "Modern", "settings-theme-transparent": "Transparent", "settings-popoutPiP": "Call Popout Always on Top", "settings-popoutPiP-desc": "When enabled, the call popout will be in Always on Top mode.", diff --git a/src/discord/window.ts b/src/discord/window.ts index 45f23b0..521077e 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -368,10 +368,16 @@ export function createWindow() { browserWindowOptions.transparent = true; break; case "modern": - browserWindowOptions.backgroundColor = "#00000000"; - browserWindowOptions.transparent = false; - browserWindowOptions.frame = true; - browserWindowOptions.backgroundMaterial = "acrylic"; + if (os.platform() === "win32") { + browserWindowOptions.backgroundColor = "#00000000"; + browserWindowOptions.transparent = false; + browserWindowOptions.frame = true; + browserWindowOptions.backgroundMaterial = "acrylic"; + } else if (os.platform() === "darwin") { + browserWindowOptions.backgroundColor = "#00000000"; + browserWindowOptions.vibrancy = "fullscreen-ui"; + browserWindowOptions.transparent = true; + } break; case "none": break; diff --git a/src/shelter/settings/pages/SettingsPage.tsx b/src/shelter/settings/pages/SettingsPage.tsx index 01a202d..29e3de6 100644 --- a/src/shelter/settings/pages/SettingsPage.tsx +++ b/src/shelter/settings/pages/SettingsPage.tsx @@ -76,7 +76,7 @@ export function SettingsPage() { link="https://github.com/Legcord/Legcord/wiki/Transparency-options" > - + From 94a7185db03a2fadd84d6e5b44133ed7aa605940 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 14 Mar 2025 08:57:42 +0100 Subject: [PATCH 591/844] chore: bump electron --- package.json | 2 +- pnpm-lock.yaml | 24 ++++++------------------ 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 74b2c81..a658b14 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@uwu/lune": "^1.5.1", "@uwu/shelter-defs": "^1.4.1", "babel-preset-solid": "^1.9.3", - "electron": "34.1.1", + "electron": "35.0.1", "electron-builder": "^25.1.8", "lucide-solid": "^0.475.0", "rollup": "^4.27.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d42147..70248e7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,8 +68,8 @@ importers: specifier: ^1.9.3 version: 1.9.3(@babel/core@7.26.7) electron: - specifier: 34.1.1 - version: 34.1.1 + specifier: 35.0.1 + version: 35.0.1 electron-builder: specifier: ^25.1.8 version: 25.1.8(electron-builder-squirrel-windows@25.1.8) @@ -1205,9 +1205,6 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@20.17.9': - resolution: {integrity: sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==} - '@types/node@22.10.1': resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} @@ -1692,8 +1689,8 @@ packages: electron-updater@6.3.9: resolution: {integrity: sha512-2PJNONi+iBidkoC5D1nzT9XqsE8Q1X28Fn6xRQhO3YX8qRRyJ3mkV4F1aQsuRnYPqq6Hw+E51y27W75WgDoofw==} - electron@34.1.1: - resolution: {integrity: sha512-1aDYk9Gsv1/fFeClMrxWGoVMl7uCUgl1pe26BiTnLXmAoqEXCa3f3sCKFWV+cuDzUjQGAZcpkWhGYTgWUSQrLA==} + electron@35.0.1: + resolution: {integrity: sha512-iQonj6lnPhqfqha2KXx6LzV1dnu6UPTCWK+b7f9Zvg828umGemi22DKbcJ3/q+Opn7iUVTWyqp9z1JQqkIi6OA==} engines: {node: '>= 12.20.55'} hasBin: true @@ -2913,9 +2910,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} @@ -3964,10 +3958,6 @@ snapshots: '@types/ms@0.7.34': {} - '@types/node@20.17.9': - dependencies: - undici-types: 6.19.8 - '@types/node@22.10.1': dependencies: undici-types: 6.20.0 @@ -4633,10 +4623,10 @@ snapshots: transitivePeerDependencies: - supports-color - electron@34.1.1: + electron@35.0.1: dependencies: '@electron/get': 2.0.3 - '@types/node': 20.17.9 + '@types/node': 22.10.1 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -5950,8 +5940,6 @@ snapshots: typescript@5.7.2: {} - undici-types@6.19.8: {} - undici-types@6.20.0: {} unique-filename@2.0.1: From 69f89e0884895a1cb5bed5da0a2173d7f5a1a5ab Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 14 Mar 2025 09:11:33 +0100 Subject: [PATCH 592/844] bump: electron-builder --- package.json | 2 +- pnpm-lock.yaml | 237 +++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 210 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index a658b14..7739bf5 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "@uwu/shelter-defs": "^1.4.1", "babel-preset-solid": "^1.9.3", "electron": "35.0.1", - "electron-builder": "^25.1.8", + "electron-builder": "^26.0.11", "lucide-solid": "^0.475.0", "rollup": "^4.27.4", "rollup-plugin-copy": "^3.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 70248e7..145beab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -71,8 +71,8 @@ importers: specifier: 35.0.1 version: 35.0.1 electron-builder: - specifier: ^25.1.8 - version: 25.1.8(electron-builder-squirrel-windows@25.1.8) + specifier: ^26.0.11 + version: 26.0.11(electron-builder-squirrel-windows@25.1.8) lucide-solid: specifier: ^0.475.0 version: 0.475.0(solid-js@1.9.3) @@ -293,15 +293,25 @@ packages: resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} engines: {node: '>= 8.9.0'} - '@electron/asar@3.2.17': - resolution: {integrity: sha512-OcWImUI686w8LkghQj9R2ynZ2ME693Ek6L1SiaAgqGKzBaTIZw3fHDqN82Rcl+EU1Gm9EgkJ5KLIY/q5DCRbbA==} + '@electron/asar@3.2.18': + resolution: {integrity: sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==} engines: {node: '>=10.12.0'} hasBin: true + '@electron/fuses@1.8.0': + resolution: {integrity: sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==} + hasBin: true + '@electron/get@2.0.3': resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} engines: {node: '>=12'} + '@electron/node-gyp@https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2': + resolution: {tarball: https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2} + version: 10.2.0-electron.1 + engines: {node: '>=12.13.0'} + hasBin: true + '@electron/notarize@2.5.0': resolution: {integrity: sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==} engines: {node: '>= 10.0.0'} @@ -316,6 +326,11 @@ packages: engines: {node: '>=12.13.0'} hasBin: true + '@electron/rebuild@3.7.0': + resolution: {integrity: sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw==} + engines: {node: '>=12.13.0'} + hasBin: true + '@electron/universal@2.0.1': resolution: {integrity: sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==} engines: {node: '>=16.4'} @@ -1292,6 +1307,9 @@ packages: app-builder-bin@5.0.0-alpha.10: resolution: {integrity: sha512-Ev4jj3D7Bo+O0GPD2NMvJl+PGiBAfS7pUGawntBNpCbxtpncfUixqFj9z9Jme7V7s3LBGqsWZZP54fxBX3JKJw==} + app-builder-bin@5.0.0-alpha.12: + resolution: {integrity: sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==} + app-builder-lib@25.1.8: resolution: {integrity: sha512-pCqe7dfsQFBABC1jeKZXQWhGcCPF3rPCXDdfqVKjIeWBcXzyC1iOWZdfFhGl+S9MyE/k//DFmC6FzuGAUudNDg==} engines: {node: '>=14.0.0'} @@ -1299,6 +1317,13 @@ packages: dmg-builder: 25.1.8 electron-builder-squirrel-windows: 25.1.8 + app-builder-lib@26.0.11: + resolution: {integrity: sha512-bsfSjSZp9dg7q28+4NPLJ2ldq3j1ESP2LJ+8AibaPqQb2lTIJeQW1JmgdAs9KuYTtkswiZ/+PMyokC9M7hwnjQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + dmg-builder: 26.0.11 + electron-builder-squirrel-windows: 26.0.11 + aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -1417,9 +1442,16 @@ packages: resolution: {integrity: sha512-6p/gfG1RJSQeIbz8TK5aPNkoztgY1q5TgmGFMAXcY8itsGW6Y2ld1ALsZ5UJn8rog7hKF3zHx5iQbNQ8uLcRlw==} engines: {node: '>=12.0.0'} + builder-util-runtime@9.3.1: + resolution: {integrity: sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ==} + engines: {node: '>=12.0.0'} + builder-util@25.1.7: resolution: {integrity: sha512-7jPjzBwEGRbwNcep0gGNpLXG9P94VA3CPAZQCzxkFXiV2GMQKlziMbY//rXPI7WKfhsvGgFXjTcXdBEwgXw9ww==} + builder-util@26.0.11: + resolution: {integrity: sha512-xNjXfsldUEe153h1DraD0XvDOpqGR0L5eKFkdReB7eFW5HqysDZFfly4rckda6y9dF39N3pkPlOblcfHKGw+uA==} + cacache@16.1.3: resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -1635,8 +1667,8 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dmg-builder@25.1.8: - resolution: {integrity: sha512-NoXo6Liy2heSklTI5OIZbCgXC1RzrDQsZkeEwXhdOro3FT1VBOvbubvscdPnjVuQ4AMwwv61oaH96AbiYg9EnQ==} + dmg-builder@26.0.11: + resolution: {integrity: sha512-C+SaRneQ11OxG99EeGp3TvPrlkW9ZaiukxB9Z7+OhhO1ge0nAtq9uD0ILt1JpvNAQ1de3gzX7TFRYJrSGsNe+Q==} dmg-license@1.0.11: resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} @@ -1663,8 +1695,8 @@ packages: electron-builder-squirrel-windows@25.1.8: resolution: {integrity: sha512-2ntkJ+9+0GFP6nAISiMabKt6eqBB0kX1QqHNWFWAXgi0VULKGisM46luRFpIBiU3u/TDmhZMM8tzvo2Abn3ayg==} - electron-builder@25.1.8: - resolution: {integrity: sha512-poRgAtUHHOnlzZnc9PK4nzG53xh74wj2Jy7jkTrqZ0MWPoHGh1M2+C//hGeYdA+4K8w4yiVCNYoLXF7ySj2Wig==} + electron-builder@26.0.11: + resolution: {integrity: sha512-u7Qgge5ue5oOPDbZEseor7RjxKSYAekVflHkbNIY6te1kbtShQFqESq3FZakMBsQf/3SkEycvWhHHRb8zjqBqg==} engines: {node: '>=14.0.0'} hasBin: true @@ -1683,6 +1715,9 @@ packages: electron-publish@25.1.7: resolution: {integrity: sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg==} + electron-publish@26.0.11: + resolution: {integrity: sha512-a8QRH0rAPIWH9WyyS5LbNvW9Ark6qe63/LqDB7vu2JXYpi0Gma5Q60Dh4tmTqhOBQt0xsrzD8qE7C+D7j+B24A==} + electron-to-chromium@1.5.90: resolution: {integrity: sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==} @@ -2537,6 +2572,10 @@ packages: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} + proc-log@2.0.1: + resolution: {integrity: sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -2701,6 +2740,10 @@ packages: semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -2873,6 +2916,9 @@ packages: temp-file@3.4.0: resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} + tiny-async-pool@1.3.0: + resolution: {integrity: sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==} + tiny-typed-emitter@2.1.0: resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==} @@ -3265,12 +3311,18 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - '@electron/asar@3.2.17': + '@electron/asar@3.2.18': dependencies: commander: 5.1.0 glob: 7.2.3 minimatch: 3.1.2 + '@electron/fuses@1.8.0': + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + minimist: 1.2.8 + '@electron/get@2.0.3': dependencies: debug: 4.4.0 @@ -3285,6 +3337,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@electron/node-gyp@https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2': + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + glob: 8.1.0 + graceful-fs: 4.2.11 + make-fetch-happen: 10.2.1 + nopt: 6.0.0 + proc-log: 2.0.1 + semver: 7.7.0 + tar: 6.2.1 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + '@electron/notarize@2.5.0': dependencies: debug: 4.4.0 @@ -3324,9 +3392,29 @@ snapshots: - bluebird - supports-color + '@electron/rebuild@3.7.0': + dependencies: + '@electron/node-gyp': https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2 + '@malept/cross-spawn-promise': 2.0.0 + chalk: 4.1.2 + debug: 4.4.0 + detect-libc: 2.0.3 + fs-extra: 10.1.0 + got: 11.8.6 + node-abi: 3.71.0 + node-api-version: 0.2.0 + ora: 5.4.1 + read-binary-file-arch: 1.0.6 + semver: 7.7.0 + tar: 6.2.1 + yargs: 17.7.2 + transitivePeerDependencies: + - bluebird + - supports-color + '@electron/universal@2.0.1': dependencies: - '@electron/asar': 3.2.17 + '@electron/asar': 3.2.18 '@malept/cross-spawn-promise': 2.0.0 debug: 4.4.0 dir-compare: 4.2.0 @@ -4071,7 +4159,9 @@ snapshots: app-builder-bin@5.0.0-alpha.10: {} - app-builder-lib@25.1.8(dmg-builder@25.1.8)(electron-builder-squirrel-windows@25.1.8): + app-builder-bin@5.0.0-alpha.12: {} + + app-builder-lib@25.1.8(dmg-builder@26.0.11)(electron-builder-squirrel-windows@25.1.8): dependencies: '@develar/schema-utils': 2.6.5 '@electron/notarize': 2.5.0 @@ -4086,12 +4176,12 @@ snapshots: builder-util-runtime: 9.2.10 chromium-pickle-js: 0.2.0 config-file-ts: 0.2.8-rc1 - debug: 4.3.7 - dmg-builder: 25.1.8(electron-builder-squirrel-windows@25.1.8) + debug: 4.4.0 + dmg-builder: 26.0.11(electron-builder-squirrel-windows@25.1.8) dotenv: 16.4.5 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 25.1.8(dmg-builder@25.1.8) + electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.0.11) electron-publish: 25.1.7 form-data: 4.0.1 fs-extra: 10.1.0 @@ -4104,13 +4194,54 @@ snapshots: minimatch: 10.0.1 resedit: 1.7.2 sanitize-filename: 1.6.3 - semver: 7.6.3 + semver: 7.7.0 tar: 6.2.1 temp-file: 3.4.0 transitivePeerDependencies: - bluebird - supports-color + app-builder-lib@26.0.11(dmg-builder@26.0.11)(electron-builder-squirrel-windows@25.1.8): + dependencies: + '@develar/schema-utils': 2.6.5 + '@electron/asar': 3.2.18 + '@electron/fuses': 1.8.0 + '@electron/notarize': 2.5.0 + '@electron/osx-sign': 1.3.1 + '@electron/rebuild': 3.7.0 + '@electron/universal': 2.0.1 + '@malept/flatpak-bundler': 0.4.0 + '@types/fs-extra': 9.0.13 + async-exit-hook: 2.0.1 + builder-util: 26.0.11 + builder-util-runtime: 9.3.1 + chromium-pickle-js: 0.2.0 + config-file-ts: 0.2.8-rc1 + debug: 4.4.0 + dmg-builder: 26.0.11(electron-builder-squirrel-windows@25.1.8) + dotenv: 16.4.5 + dotenv-expand: 11.0.7 + ejs: 3.1.10 + electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.0.11) + electron-publish: 26.0.11 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + is-ci: 3.0.1 + isbinaryfile: 5.0.4 + js-yaml: 4.1.0 + json5: 2.2.3 + lazy-val: 1.0.5 + minimatch: 10.0.1 + plist: 3.1.0 + resedit: 1.7.2 + semver: 7.7.0 + tar: 6.2.1 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + transitivePeerDependencies: + - bluebird + - supports-color + aproba@2.0.0: {} archiver-utils@2.1.0: @@ -4260,6 +4391,13 @@ snapshots: transitivePeerDependencies: - supports-color + builder-util-runtime@9.3.1: + dependencies: + debug: 4.4.0 + sax: 1.4.1 + transitivePeerDependencies: + - supports-color + builder-util@25.1.7: dependencies: 7zip-bin: 5.2.0 @@ -4269,7 +4407,7 @@ snapshots: builder-util-runtime: 9.2.10 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.3.7 + debug: 4.4.0 fs-extra: 10.1.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 @@ -4281,6 +4419,28 @@ snapshots: transitivePeerDependencies: - supports-color + builder-util@26.0.11: + dependencies: + 7zip-bin: 5.2.0 + '@types/debug': 4.1.12 + app-builder-bin: 5.0.0-alpha.12 + builder-util-runtime: 9.3.1 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + fs-extra: 10.1.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + is-ci: 3.0.1 + js-yaml: 4.1.0 + sanitize-filename: 1.6.3 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + transitivePeerDependencies: + - supports-color + cacache@16.1.3: dependencies: '@npmcli/fs': 2.1.2 @@ -4515,11 +4675,11 @@ snapshots: dependencies: path-type: 4.0.0 - dmg-builder@25.1.8(electron-builder-squirrel-windows@25.1.8): + dmg-builder@26.0.11(electron-builder-squirrel-windows@25.1.8): dependencies: - app-builder-lib: 25.1.8(dmg-builder@25.1.8)(electron-builder-squirrel-windows@25.1.8) - builder-util: 25.1.7 - builder-util-runtime: 9.2.10 + app-builder-lib: 26.0.11(dmg-builder@26.0.11)(electron-builder-squirrel-windows@25.1.8) + builder-util: 26.0.11 + builder-util-runtime: 9.3.1 fs-extra: 10.1.0 iconv-lite: 0.6.3 js-yaml: 4.1.0 @@ -4554,9 +4714,9 @@ snapshots: dependencies: jake: 10.9.2 - electron-builder-squirrel-windows@25.1.8(dmg-builder@25.1.8): + electron-builder-squirrel-windows@25.1.8(dmg-builder@26.0.11): dependencies: - app-builder-lib: 25.1.8(dmg-builder@25.1.8)(electron-builder-squirrel-windows@25.1.8) + app-builder-lib: 25.1.8(dmg-builder@26.0.11)(electron-builder-squirrel-windows@25.1.8) archiver: 5.3.2 builder-util: 25.1.7 fs-extra: 10.1.0 @@ -4565,13 +4725,13 @@ snapshots: - dmg-builder - supports-color - electron-builder@25.1.8(electron-builder-squirrel-windows@25.1.8): + electron-builder@26.0.11(electron-builder-squirrel-windows@25.1.8): dependencies: - app-builder-lib: 25.1.8(dmg-builder@25.1.8)(electron-builder-squirrel-windows@25.1.8) - builder-util: 25.1.7 - builder-util-runtime: 9.2.10 + app-builder-lib: 26.0.11(dmg-builder@26.0.11)(electron-builder-squirrel-windows@25.1.8) + builder-util: 26.0.11 + builder-util-runtime: 9.3.1 chalk: 4.1.2 - dmg-builder: 25.1.8(electron-builder-squirrel-windows@25.1.8) + dmg-builder: 26.0.11(electron-builder-squirrel-windows@25.1.8) fs-extra: 10.1.0 is-ci: 3.0.1 lazy-val: 1.0.5 @@ -4608,6 +4768,19 @@ snapshots: transitivePeerDependencies: - supports-color + electron-publish@26.0.11: + dependencies: + '@types/fs-extra': 9.0.13 + builder-util: 26.0.11 + builder-util-runtime: 9.3.1 + chalk: 4.1.2 + form-data: 4.0.1 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + electron-to-chromium@1.5.90: {} electron-updater@6.3.9: @@ -5522,6 +5695,8 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 + proc-log@2.0.1: {} + process-nextick-args@2.0.1: {} progress@2.0.3: {} @@ -5727,6 +5902,8 @@ snapshots: semver-compare@1.0.0: optional: true + semver@5.7.2: {} + semver@6.3.1: {} semver@7.6.3: {} @@ -5758,7 +5935,7 @@ snapshots: simple-update-notifier@2.0.0: dependencies: - semver: 7.6.3 + semver: 7.7.0 slash@3.0.0: {} @@ -5907,6 +6084,10 @@ snapshots: async-exit-hook: 2.0.1 fs-extra: 10.1.0 + tiny-async-pool@1.3.0: + dependencies: + semver: 5.7.2 + tiny-typed-emitter@2.1.0: {} tmp-promise@3.0.3: From 221fcdc1e6f42d33c455be64e6b2fa7e4f135c2f Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 14 Mar 2025 09:13:23 +0100 Subject: [PATCH 593/844] fix: update vaapi flags for e34+ Solves https://github.com/Legcord/Legcord/issues/861 --- src/common/flags.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/flags.ts b/src/common/flags.ts index e7be680..6f7955b 100644 --- a/src/common/flags.ts +++ b/src/common/flags.ts @@ -29,7 +29,7 @@ export function injectElectronFlags(): void { "--enable-gpu-rasterization --enable-zero-copy --ignore-gpu-blocklist --enable-hardware-overlays=single-fullscreen,single-on-top,underlay --enable-features=EnableDrDc,CanvasOopRasterization,BackForwardCache:TimeToLiveInBackForwardCacheInSeconds/300/should_ignore_blocklists/true/enable_same_site/true,ThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes,UseSkiaRenderer,WebAssemblyLazyCompilation --disable-features=Vulkan --force_high_performance_gpu", // Performance battery: "--enable-features=TurnOffStreamingMediaCachingOnBattery --force_low_power_gpu --enable-low-end-device-mode --enable-low-res-tiling --process-per-site", // Known to have better battery life for Chromium? - vaapi: "--ignore-gpu-blocklist --enable-features=VaapiVideoDecoder --enable-gpu-rasterization --enable-zero-copy --force_high_performance_gpu --use-gl=desktop --disable-features=UseChromeOSDirectVideoDecoder", + vaapi: "--ignore-gpu-blocklist --enable-features=AcceleratedVideoDecodeLinuxGL,AcceleratedVideoEncoder,AcceleratedVideoDecoder,AcceleratedVideoDecodeLinuxZeroCopyGL --enable-gpu-rasterization --enable-zero-copy --force_high_performance_gpu --use-gl=desktop --disable-features=UseChromeOSDirectVideoDecoder", }; switch (getConfig("performanceMode")) { case "dynamic": From ec1557d13d09b094bcc0cdf5332889a5bd7c1827 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 14 Mar 2025 09:20:57 +0100 Subject: [PATCH 594/844] feat: 4k screensharing --- src/shelter/screenshare/components/ScreensharePicker.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/shelter/screenshare/components/ScreensharePicker.tsx b/src/shelter/screenshare/components/ScreensharePicker.tsx index 5ac2147..db3b686 100644 --- a/src/shelter/screenshare/components/ScreensharePicker.tsx +++ b/src/shelter/screenshare/components/ScreensharePicker.tsx @@ -121,6 +121,7 @@ export const ScreensharePicker = (props: { +
    From f20e5b83a4c8e1f88ec17fbf799755d06c2725ff Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 14 Mar 2025 09:57:10 +0100 Subject: [PATCH 595/844] fix: handle sigterm/sigint gracefully --- src/main.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.ts b/src/main.ts index f7e23ea..c1f5434 100644 --- a/src/main.ts +++ b/src/main.ts @@ -132,6 +132,8 @@ if (!app.requestSingleInstanceLock() && getConfig("multiInstance") === false) { if (getConfig("disableHttpCache")) app.commandLine.appendSwitch("disable-http-cache"); void app.whenReady().then(async () => { + process.on("SIGINT", () => app.quit()); + process.on("SIGTERM", () => app.quit()); // Patch for linux bug to ensure things are loaded before window creation (fixes transparency on some linux systems) await new Promise((resolve) => setTimeout(() => { From f12d9857a1df15871255d17c63d755b25dabdacf Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Fri, 14 Mar 2025 09:11:13 +0000 Subject: [PATCH 596/844] fix: traffic lights not centered with "overlay" (#860) --- src/discord/window.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/discord/window.ts b/src/discord/window.ts index 521077e..8497f95 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -357,7 +357,7 @@ export function createWindow() { height: 30, }; browserWindowOptions.trafficLightPosition = { - x: 13, + x: 10, y: 10, }; break; From 3575d3298a39d6f2937b9eee45256790db7b62f0 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 14 Mar 2025 10:41:21 +0100 Subject: [PATCH 597/844] feat: bounce on ping --- assets/lang/en-US.json | 2 ++ src/@types/settings.d.ts | 1 + src/common/config.ts | 1 + src/discord/window.ts | 5 ++++- src/shelter/settings/pages/SettingsPage.tsx | 9 +++++++++ 5 files changed, 17 insertions(+), 1 deletion(-) diff --git a/assets/lang/en-US.json b/assets/lang/en-US.json index f53a667..232c199 100644 --- a/assets/lang/en-US.json +++ b/assets/lang/en-US.json @@ -11,6 +11,8 @@ "next": "Next", "setup_question4": "Select a client mod you want to install:", "setup_question5": "Do you want to use a tray icon?", + "settings-bounceOnPing": "Bounce in dock on ping", + "settings-bounceOnPing-desc": "Bounce the app in the dock when you receive a ping.", "settings-theme": "Window style", "settings-theme-desc": "Window style manages what titlebar Legcord uses.", "settings-theme-default": "Default (Custom)", diff --git a/src/@types/settings.d.ts b/src/@types/settings.d.ts index 91b4205..0144652 100644 --- a/src/@types/settings.d.ts +++ b/src/@types/settings.d.ts @@ -58,6 +58,7 @@ export interface Settings { doneSetup: boolean; spellcheckLanguage: string[]; smoothScroll: boolean; + bounceOnPing: boolean; popoutPiP: boolean; sleepInBackground: boolean; useSystemCssEditor: boolean; diff --git a/src/common/config.ts b/src/common/config.ts index a9b436b..9060810 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -7,6 +7,7 @@ export let firstRun: boolean; const defaults: Settings = { windowStyle: "default", channel: "stable", + bounceOnPing: false, legcordCSP: true, minimizeToTray: true, keybinds: [], diff --git a/src/discord/window.ts b/src/discord/window.ts index 8497f95..d0e7a12 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -237,7 +237,10 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { } if (process.platform === "darwin") { if (title.startsWith("•")) return app.dock.setBadge("•"); - if (title.startsWith("(")) return app.setBadgeCount(Number.parseInt(/\((\d+)\)/.exec(title)![1])); + if (title.startsWith("(")) { + if (getConfig("bounceOnPing")) app.dock.bounce(); + return app.setBadgeCount(Number.parseInt(/\((\d+)\)/.exec(title)![1])); + } app.setBadgeCount(0); } if (!title.endsWith(legcordSuffix)) { diff --git a/src/shelter/settings/pages/SettingsPage.tsx b/src/shelter/settings/pages/SettingsPage.tsx index 29e3de6..308b051 100644 --- a/src/shelter/settings/pages/SettingsPage.tsx +++ b/src/shelter/settings/pages/SettingsPage.tsx @@ -90,6 +90,15 @@ export function SettingsPage() { {store.i18n["settings-autoHideMenuBar"]} + + setConfig("bounceOnPing", e, true)} + > + {store.i18n["settings-bounceOnPing"]} + + setConfig("tray", (e.target as HTMLInputElement).value as Settings["tray"], true)} From 13c3ca026bb143ff13d5c560e34603153ab16677 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 14 Mar 2025 11:14:18 +0100 Subject: [PATCH 598/844] feat: rebrand titlebar --- assets/app/css/newTitlebar.css | 367 -------------------- assets/app/css/winTitlebar.css | 3 + src/@types/settings.d.ts | 2 +- src/discord/preload/newTitlebar.mts | 30 +- src/discord/preload/preload.mts | 2 + src/discord/window.ts | 12 + src/shelter/settings/pages/SettingsPage.tsx | 3 + 7 files changed, 33 insertions(+), 386 deletions(-) delete mode 100644 assets/app/css/newTitlebar.css create mode 100644 assets/app/css/winTitlebar.css diff --git a/assets/app/css/newTitlebar.css b/assets/app/css/newTitlebar.css deleted file mode 100644 index d744929..0000000 --- a/assets/app/css/newTitlebar.css +++ /dev/null @@ -1,367 +0,0 @@ -a[href="https://support.discord.com"] { - margin-right: 50px; -} -.titlebar { - display: block; - top: 0; - left: 0; - right: 0; - flex-shrink: 0; - overflow: hidden; - zoom: 1; - box-sizing: border-box; - width: 100%; - clear: both; - height: 30px; - line-height: 30px; - -webkit-app-region: drag !important; - user-select: none; - -webkit-user-select: none; - position: fixed; - z-index: 99999; -} - -.titlebar #window-controls-container { - float: right; - width: 150px; - height: 100%; - line-height: 30px; - -webkit-app-region: no-drag; -} - -.titlebar #window-controls-container #minimize, -.titlebar #window-controls-container #maximize, -.titlebar #window-controls-container #quit { - float: left; - height: 100%; - width: 33.3%; - text-align: center; - color: var(--interactive-normal); - cursor: default; -} -.titlebar #window-controls-container #spacer { - pointer-events: none; -} - -/* Legcord on Linux */ -[legcord-platform="linux"] .container-2RRFHK { - padding-top: 45px; - top: -45px; -} -[legcord-platform="linux"] .titlebar { - height: 45px; - line-height: 45px; -} -[legcord-platform="linux"] .titlebar #window-controls-container { - line-height: 45px; - transform: translateY(-8px); -} -[legcord-platform="linux"] .titlebar #window-controls-container #minimize:hover { - background-color: var(--background-modifier-hover); - transition: 0.2s ease; -} -[legcord-platform="linux"] .titlebar #window-controls-container #maximize:hover { - background-color: var(--background-modifier-hover); - transition: 0.2s ease; -} -[legcord-platform="linux"] .titlebar #window-controls-container #minimize:hover #minimize-icon { - background-color: var(--interactive-hover); - transition: 0.2s ease; -} -[legcord-platform="linux"] .titlebar #window-controls-container #maximize:hover #maximize-icon { - background-color: var(--interactive-hover); - transition: 0.2s ease; -} -[legcord-platform="linux"] .titlebar #window-controls-container #quit:hover { - background-color: var(--brand-experiment-560); - transition: 0.2s ease; -} -[legcord-platform="linux"] .titlebar #window-controls-container #quit #quit-icon { - background-color: #ffffff; - display: list-item; - transition: 0.1s ease; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="linux"] .titlebar #window-controls-container #minimize-icon { - background-color: var(--interactive-normal); - display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="linux"] .titlebar #window-controls-container #maximize-icon { - background-color: var(--interactive-normal); - display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} - -[legcord-platform="linux"][isMaximized] .titlebar #window-controls-container #maximize-icon { - background-color: var(--interactive-normal); - display: list-item; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='9' height='9'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='9' height='9'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="linux"] .titlebar #window-controls-container #minimize { - background-color: transparent; - transition: 0.1s ease; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="linux"] .titlebar #window-controls-container #maximize { - background-color: transparent; - transition: 0.1s ease; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="linux"] .titlebar #window-controls-container #quit { - background-color: var(--brand-experiment); - transition: 0.1s ease; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="linux"] .titlebar #window-controls-container #quit:active { - background-color: var(--brand-experiment-600); - transition: 0.1s ease; -} - -/* Legcord on Windows */ -[legcord-platform="win32"] .titlebar #window-controls-container { - width: 142px; -} -[legcord-platform="win32"] .titlebar #window-controls-container #minimize:hover { - background-color: var(--background-modifier-hover); - transition: 0.2s ease; -} -[legcord-platform="win32"] .titlebar #window-controls-container #maximize:hover { - background-color: var(--background-modifier-hover); - transition: 0.2s ease; -} -[legcord-platform="win32"] .titlebar #window-controls-container #minimize:hover #minimize-icon { - background-color: var(--interactive-hover); - transition: 0.2s ease; -} -[legcord-platform="win32"] .titlebar #window-controls-container #maximize:hover #maximize-icon { - background-color: var(--interactive-hover); - transition: 0.2s ease; -} -[legcord-platform="win32"] .titlebar #window-controls-container #quit:hover { - background-color: #e81123; - transition: 0.2s ease; -} -[legcord-platform="win32"] .titlebar #window-controls-container #quit:hover #quit-icon { - background-color: #ffffff; - transition: 0.1s ease; -} -[legcord-platform="win32"] .titlebar #window-controls-container #minimize { - background-color: transparent; - transition: 0.1s ease; -} -[legcord-platform="win32"] .titlebar #window-controls-container #maximize { - background-color: transparent; - transition: 0.1s ease; -} -[legcord-platform="win32"] .titlebar #window-controls-container #quit { - background-color: transparent; - transition: 0.1s ease; -} -[legcord-platform="win32"] .titlebar #window-controls-container #quit:active { - background-color: #f1707a; - transition: 0.1s ease; -} -[legcord-platform="win32"] .titlebar #window-controls-container #quit:active #quit-icon { - background-color: #000000cc; - transition: 0.1s ease; -} -[legcord-platform="win32"] .titlebar #window-controls-container #quit-icon { - background-color: var(--interactive-normal); - display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="win32"] .titlebar #window-controls-container #minimize-icon { - background-color: var(--interactive-normal); - display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="win32"] .titlebar #window-controls-container #maximize-icon { - background-color: var(--interactive-normal); - display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} - -[legcord-platform="win32"][isMaximized] .titlebar #window-controls-container #maximize-icon { - background-color: var(--interactive-normal); - display: list-item; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} - -/* Legcord on macOS */ - -[legcord-platform="darwin"] .sidebar-1tnWFu { - border-top-left-radius: 0px !important; -} - -[legcord-platform="darwin"] .container__037ed { - overflow: unset !important; - padding-top: 48px; - top: -48px; -} -[legcord-platform="darwin"] .titlebar { - height: 48px; - line-height: 48px; -} - -[legcord-platform="darwin"] .titlebar #window-controls-container { - float: left; - width: 150px; - height: 60%; - line-height: 45px; - transform: translate(-82px, 4px); -} - -[legcord-platform="darwin"] .titlebar #window-controls-container:hover #minimize #minimize-icon, -[legcord-platform="darwin"] .titlebar #window-controls-container:hover #maximize #maximize-icon, -[legcord-platform="darwin"] .titlebar #window-controls-container:hover #quit #quit-icon { - display: list-item; -} - -[legcord-platform="darwin"][unFocused] .titlebar #window-controls-container #minimize, -[legcord-platform="darwin"][unFocused] .titlebar #window-controls-container #maximize, -[legcord-platform="darwin"][unFocused] .titlebar #window-controls-container #quit { - background-color: #d6d6d5 !important; - pointer-events: none; - transition: background-color 0.1s ease-in; -} - -[legcord-platform="darwin"]:not([unFocused]) .titlebar #window-controls-container #quit #quit-icon { - background-color: #79282b; - -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4yOTI4OSA2TDIuODE4MDEgMy41MjUxM0wzLjUyNTEyIDIuODE4MDJMNS45OTk5OSA1LjI5Mjg5TDguNDc0ODcgMi44MTgwMkw5LjE4MTk3IDMuNTI1MTNMNi43MDcxIDZMOS4xODE5NyA4LjQ3NDg3TDguNDc0ODcgOS4xODE5OEw1Ljk5OTk5IDYuNzA3MTFMMy41MjUxMiA5LjE4MTk4TDIuODE4MDEgOC40NzQ4N0w1LjI5Mjg5IDZaIiBmaWxsPSJyZ2JhKDEyOCwgNiwgMCwgMSkiLz48L3N2Zz4=") - no-repeat 50% 50%; - mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4yOTI4OSA2TDIuODE4MDEgMy41MjUxM0wzLjUyNTEyIDIuODE4MDJMNS45OTk5OSA1LjI5Mjg5TDguNDc0ODcgMi44MTgwMkw5LjE4MTk3IDMuNTI1MTNMNi43MDcxIDZMOS4xODE5NyA4LjQ3NDg3TDguNDc0ODcgOS4xODE5OEw1Ljk5OTk5IDYuNzA3MTFMMy41MjUxMiA5LjE4MTk4TDIuODE4MDEgOC40NzQ4N0w1LjI5Mjg5IDZaIiBmaWxsPSJyZ2JhKDEyOCwgNiwgMCwgMSkiLz48L3N2Zz4=") - no-repeat 50% 50%; - transform: translate(-0.3px, -11.7px); -} -[legcord-platform="darwin"]:not([unFocused]) .titlebar #window-controls-container #minimize #minimize-icon { - background-color: #7d631b; - -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNS4zOTk5OUgyVjYuNTk5OTlIMTBWNS4zOTk5OVoiIGZpbGw9IiM5ODY4MDEiLz48L3N2Zz4=") - no-repeat 50% 50%; - mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNS4zOTk5OUgyVjYuNTk5OTlIMTBWNS4zOTk5OVoiIGZpbGw9IiM5ODY4MDEiLz48L3N2Zz4=") - no-repeat 50% 50%; - transform: translate(-0px, -11.7px); -} -[legcord-platform="darwin"]:not([unFocused]) .titlebar #window-controls-container #maximize #maximize-icon { - background-color: #1d7525; - -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOC41ODgyMyA2Ljk5MDE1TDUuMDA5NzkgMy40MTE3QzQuODU1ODMgMy4yNTc3NCA0Ljk1ODYgMi45OTQyMiA1LjE3NjE0IDIuOTg1MTRMOC45MTA0MiAyLjgyOTMxQzkuMDU2NTggMi44MjMyMSA5LjE3NjczIDIuOTQzMzUgOS4xNzA2MyAzLjA4OTUyTDkuMDE0NzkgNi44MjM4QzkuMDA1NzEgNy4wNDEzNCA4Ljc0MjE5IDcuMTQ0MTEgOC41ODgyMyA2Ljk5MDE1WiIgZmlsbD0iIzEyNUUxRSIvPjxwYXRoIGQ9Ik0zLjQxMTc3IDUuMDA5ODJMNi45OTAyMSA4LjU4ODI3QzcuMTQ0MTcgOC43NDIyMyA3LjA0MTQgOS4wMDU3NSA2LjgyMzg2IDkuMDE0ODNMMy4wODk1OCA5LjE3MDY2QzIuOTQzNDIgOS4xNzY3NiAyLjgyMzI3IDkuMDU2NjEgMi44MjkzNyA4LjkxMDQ1TDIuOTg1MjEgNS4xNzYxN0MyLjk5NDI5IDQuOTU4NjMgMy4yNTc4MSA0Ljg1NTg2IDMuNDExNzcgNS4wMDk4MloiIGZpbGw9IiMxMjVFMUUiLz48L3N2Zz4=") - no-repeat 50% 50%; - mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOC41ODgyMyA2Ljk5MDE1TDUuMDA5NzkgMy40MTE3QzQuODU1ODMgMy4yNTc3NCA0Ljk1ODYgMi45OTQyMiA1LjE3NjE0IDIuOTg1MTRMOC45MTA0MiAyLjgyOTMxQzkuMDU2NTggMi44MjMyMSA5LjE3NjczIDIuOTQzMzUgOS4xNzA2MyAzLjA4OTUyTDkuMDE0NzkgNi44MjM4QzkuMDA1NzEgNy4wNDEzNCA4Ljc0MjE5IDcuMTQ0MTEgOC41ODgyMyA2Ljk5MDE1WiIgZmlsbD0iIzEyNUUxRSIvPjxwYXRoIGQ9Ik0zLjQxMTc3IDUuMDA5ODJMNi45OTAyMSA4LjU4ODI3QzcuMTQ0MTcgOC43NDIyMyA3LjA0MTQgOS4wMDU3NSA2LjgyMzg2IDkuMDE0ODNMMy4wODk1OCA5LjE3MDY2QzIuOTQzNDIgOS4xNzY3NiAyLjgyMzI3IDkuMDU2NjEgMi44MjkzNyA4LjkxMDQ1TDIuOTg1MjEgNS4xNzYxN0MyLjk5NDI5IDQuOTU4NjMgMy4yNTc4MSA0Ljg1NTg2IDMuNDExNzcgNS4wMDk4MloiIGZpbGw9IiMxMjVFMUUiLz48L3N2Zz4=") - no-repeat 50% 50%; - transform: translate(-0.2px, -11.7px); -} - -[legcord-platform="darwin"] .titlebar #window-controls-container #minimize { - background-color: #fac536; - transition: background-color 0.1s ease-in; - border: 1px solid #da9e10; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - transform: translateX(-21.5px); -} -[legcord-platform="darwin"] .titlebar #window-controls-container #maximize { - background-color: #39ea49; - transition: background-color 0.1s ease-in; - border: 1px solid #13c11e; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - transform: translateX(21.5px); -} -[legcord-platform="darwin"] .titlebar #window-controls-container #quit { - background-color: #f25056; - transition: background-color 0.1s ease-in; - border: 1px solid #d52735; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="darwin"] .titlebar #window-controls-container:hover #maximize:active { - background-color: #13c11e; -} -[legcord-platform="darwin"] .titlebar #window-controls-container:hover #minimize:active { - background-color: #da9e10; -} -[legcord-platform="darwin"] .titlebar #window-controls-container:hover #quit:active { - background-color: #d52735; -} -[legcord-platform="darwin"] .titlebar #window-controls-container #spacer, -[legcord-platform="darwin"] .titlebar #window-controls-container #minimize, -[legcord-platform="darwin"] .titlebar #window-controls-container #maximize, -[legcord-platform="darwin"] .titlebar #window-controls-container #quit { - float: right; - height: 80%; - width: 13%; - text-align: center; - color: transparent; - cursor: default; -} - -[legcord-platform="darwin"] .titlebar #window-controls-container #minimize-icon, -[legcord-platform="darwin"] .titlebar #window-controls-container #maximize-icon, -[legcord-platform="darwin"] .titlebar #window-controls-container #quit-icon { - display: none; -} - -[legcord-platform="darwin"] .titlebar #window-controls-container #spacer { - display: none; -} - -[legcord-platform="darwin"] .window-title { - float: none; - position: fixed; - left: 50%; -} - -.window-title { - content: url("legcord://assets/Wordmark.png"); - height: 15px; - margin-left: initial; - transform: translate(9px, 9px); - float: left; - padding: 0; - filter: invert(30%); -} - -div#app-mount { - height: calc(100% - 30px); - position: absolute; - bottom: 0; -} diff --git a/assets/app/css/winTitlebar.css b/assets/app/css/winTitlebar.css new file mode 100644 index 0000000..9542efd --- /dev/null +++ b/assets/app/css/winTitlebar.css @@ -0,0 +1,3 @@ +a[href="https://support.discord.com"] { + margin-right: 150px; +} diff --git a/src/@types/settings.d.ts b/src/@types/settings.d.ts index 0144652..72ff45e 100644 --- a/src/@types/settings.d.ts +++ b/src/@types/settings.d.ts @@ -31,7 +31,7 @@ export interface Settings { // Only used for external url warning dialog. ignoreProtocolWarning?: boolean; customIcon: string; - windowStyle: "default" | "native" | "overlay" | "transparent"; + windowStyle: "default" | "native" | "overlay" | "transparent" | "rebrand"; channel: "stable" | "ptb" | "canary"; transparency: "universal" | "modern" | "none"; audio: AudioSettings; diff --git a/src/discord/preload/newTitlebar.mts b/src/discord/preload/newTitlebar.mts index 9ca8c11..8cb0f64 100644 --- a/src/discord/preload/newTitlebar.mts +++ b/src/discord/preload/newTitlebar.mts @@ -1,25 +1,19 @@ +const { ipcRenderer } = require("electron"); import { addStyle } from "../../common/dom.js"; import { sleep } from "../../common/sleep.js"; -// titlebar for discord visual refresh -const titlebarHTML = ` -
    -
    -
    -
    -
    -
    `; document.addEventListener("DOMContentLoaded", () => { + if (ipcRenderer.sendSync("getConfig", "windowStyle") === "rebrand") return; sleep(500); - const targetElement = document.querySelector('a[href="https://support.discord.com"]'); - //if (!targetElement?.classList.toString().includes("anchor")) return; - addStyle("legcord://assets/css/newTitlebar.css"); - - document.body.setAttribute("legcord-platform", "win32"); - if (targetElement) { - targetElement.append(titlebarHTML); - document.body.setAttribute("customTitlebar", ""); - } else { - alert(1); + switch (ipcRenderer.sendSync("getOS")) { + case "darwin": + document.body.setAttribute("class", "platform-osx"); + break; + case "win32": + document.body.setAttribute("class", "platform-win"); + addStyle("legcord://assets/css/winTitlebar.css"); + break; + default: + break; } }); diff --git a/src/discord/preload/preload.mts b/src/discord/preload/preload.mts index 7f33d94..b925c6e 100644 --- a/src/discord/preload/preload.mts +++ b/src/discord/preload/preload.mts @@ -5,8 +5,10 @@ import "./mods/vencord.mjs"; import "./mods/equicord.mjs"; import "./mods/custom.mjs"; import "./patches.mjs"; +import "./newTitlebar.mjs"; import "./titlebar.mjs"; import "./themes.js"; + console.log("Legcord"); window.localStorage.setItem("hideNag", "true"); declare global { diff --git a/src/discord/window.ts b/src/discord/window.ts index d0e7a12..fd78a75 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -364,6 +364,18 @@ export function createWindow() { y: 10, }; break; + case "rebrand": + browserWindowOptions.titleBarStyle = "hidden"; + browserWindowOptions.titleBarOverlay = { + color: "#28282D", + symbolColor: "#99aab5", + height: 36, + }; + browserWindowOptions.trafficLightPosition = { + x: 10, + y: 10, + }; + break; } switch (getConfig("transparency")) { case "universal": diff --git a/src/shelter/settings/pages/SettingsPage.tsx b/src/shelter/settings/pages/SettingsPage.tsx index 308b051..d92372e 100644 --- a/src/shelter/settings/pages/SettingsPage.tsx +++ b/src/shelter/settings/pages/SettingsPage.tsx @@ -65,6 +65,9 @@ export function SettingsPage() { + + +
    Date: Sat, 15 Mar 2025 17:54:06 +0100 Subject: [PATCH 599/844] fix: include venmic on prod too --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7739bf5..7cffd7d 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "scripts": { "build:dev": "rollup -c --environment BUILD:dev && tsx scripts/copyVenmic.mts", "build:plugins": "lune ci --repoSubDir src/shelter --to ts-out/plugins", - "build": "pnpm build:plugins && rollup -c --environment BUILD:prod", + "build": "pnpm build:plugins && rollup -c --environment BUILD:prod && tsx scripts/copyVenmic.mts", "start": "pnpm build:plugins && pnpm run build:dev && electron --trace-warnings --ozone-platform-hint=auto ./ts-out/main.js", "startThemeManager": "pnpm run build:dev && electron ./ts-out/main.js themes", "package": "pnpm run build && electron-builder", From ec3e9e4d1f7623185528ee951640d2d7ea4e222b Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sat, 15 Mar 2025 19:38:41 +0100 Subject: [PATCH 600/844] feat: seperate arRPC into a utility process might help with performance --- assets/app/js/rpc.js | 184 ++++++++---------------------------------- rollup.config.js | 19 +++++ src/discord/window.ts | 33 +++++--- src/rpc.ts | 17 ++++ 4 files changed, 90 insertions(+), 163 deletions(-) create mode 100644 src/rpc.ts diff --git a/assets/app/js/rpc.js b/assets/app/js/rpc.js index 616649f..b132ad9 100644 --- a/assets/app/js/rpc.js +++ b/assets/app/js/rpc.js @@ -1,184 +1,64 @@ (() => { - let Dispatcher, - lookupAsset, + let lookupAsset, lookupApp, apps = {}; console.log("Starting RPC Bridge"); LegcordRPC.listen(async (msg) => { - if (!Dispatcher) { + console.log("RPC Bridge", msg); + try { let wpRequire; - window.webpackChunkdiscord_app.push([[Symbol()], {}, (x) => (wpRequire = x)]); + window.webpackChunkdiscord_app.push([[Symbol()], {}, x => wpRequire = x]); window.webpackChunkdiscord_app.pop(); - + const modules = wpRequire.c; - for (const id in modules) { - const mod = modules[id].exports; - - for (const prop in mod) { - const candidate = mod[prop]; - try { - if (candidate && candidate.register && candidate.wait) { - Dispatcher = candidate; - break; - } - } catch { - continue; - } - } - - if (Dispatcher) break; - } - const factories = wpRequire.m; for (const id in factories) { - if (factories[id].toString().includes("getAssetImage: size must === [number, number] for Twitch")) { + if (factories[id].toString().includes('getAssetImage: size must === [number, number] for Twitch')) { const mod = wpRequire(id); // fetchAssetIds - const _lookupAsset = Object.values(mod).find( - (e) => typeof e === "function" && e.toString().includes("APPLICATION_ASSETS_FETCH_SUCCESS"), - ); - if (_lookupAsset) - lookupAsset = async (appId, name) => (await _lookupAsset(appId, [name, undefined]))[0]; + const _lookupAsset = Object.values(mod).find(e => typeof e === 'function' && e.toString().includes('APPLICATION_ASSETS_FETCH_SUCCESS')); + if (_lookupAsset) lookupAsset = async (appId, name) => (await _lookupAsset(appId, [name, undefined]))[0]; } if (lookupAsset) break; } for (const id in factories) { - if (factories[id].toString().includes("APPLICATION_RPC(")) { + if (factories[id].toString().includes('APPLICATION_RPC(')) { const mod = wpRequire(id); // fetchApplicationsRPC - const _lookupApp = Object.values(mod).find((e) => { - if (typeof e !== "function") return; + const _lookupApp = Object.values(mod).find(e => { + if (typeof e !== 'function') return; const str = e.toString(); - return str.includes(",coverImage:") && str.includes("INVALID_ORIGIN"); + return str.includes(',coverImage:') && str.includes('INVALID_ORIGIN'); }); - if (_lookupApp) - lookupApp = async (appId) => { - const socket = {}; - await _lookupApp(socket, appId); - return socket.application; - }; + if (_lookupApp) lookupApp = async appId => { + let socket = {}; + await _lookupApp(socket, appId); + return socket.application; + }; } if (lookupApp) break; } + + if (msg.activity?.assets?.large_image) msg.activity.assets.large_image = await lookupAsset(msg.activity.application_id, msg.activity.assets.large_image); + if (msg.activity?.assets?.small_image) msg.activity.assets.small_image = await lookupAsset(msg.activity.application_id, msg.activity.assets.small_image); + + if (msg.activity) { + const appId = msg.activity.application_id; + if (!apps[appId]) apps[appId] = await lookupApp(appId); + + const app = apps[appId]; + if (!msg.activity.name) msg.activity.name = app.name; + } + } catch (e) { + console.error(e); } - if (msg.activity?.assets?.large_image) - msg.activity.assets.large_image = await lookupAsset( - msg.activity.application_id, - msg.activity.assets.large_image, - ); - if (msg.activity?.assets?.small_image) - msg.activity.assets.small_image = await lookupAsset( - msg.activity.application_id, - msg.activity.assets.small_image, - ); - - if (msg.activity) { - const appId = msg.activity.application_id; - if (!apps[appId]) apps[appId] = await lookupApp(appId); - - const app = apps[appId]; - if (!msg.activity.name) msg.activity.name = app.name; - } - - Dispatcher.dispatch({ type: "LOCAL_ACTIVITY_UPDATE", ...msg }); // set RPC status + shelter.flux.dispatcher.dispatch({ type: 'LOCAL_ACTIVITY_UPDATE', ...msg }); // set RPC status }); -})(); -(() => { - let Dispatcher, - lookupAsset, - lookupApp, - apps = {}; - console.log("Starting RPC Bridge"); - LegcordRPC.listen(async (msg) => { - if (!Dispatcher) { - let wpRequire; - window.webpackChunkdiscord_app.push([[Symbol()], {}, (x) => (wpRequire = x)]); - window.webpackChunkdiscord_app.pop(); - - const modules = wpRequire.c; - - for (const id in modules) { - const mod = modules[id].exports; - - for (const prop in mod) { - const candidate = mod[prop]; - try { - if (candidate && candidate.register && candidate.wait) { - Dispatcher = candidate; - break; - } - } catch { - continue; - } - } - - if (Dispatcher) break; - } - - const factories = wpRequire.m; - for (const id in factories) { - if (factories[id].toString().includes("getAssetImage: size must === [number, number] for Twitch")) { - const mod = wpRequire(id); - - // fetchAssetIds - const _lookupAsset = Object.values(mod).find( - (e) => typeof e === "function" && e.toString().includes("APPLICATION_ASSETS_FETCH_SUCCESS") - ); - if (_lookupAsset) - lookupAsset = async (appId, name) => (await _lookupAsset(appId, [name, undefined]))[0]; - } - - if (lookupAsset) break; - } - - for (const id in factories) { - if (factories[id].toString().includes("APPLICATION_RPC(")) { - const mod = wpRequire(id); - - // fetchApplicationsRPC - const _lookupApp = Object.values(mod).find((e) => { - if (typeof e !== "function") return; - const str = e.toString(); - return str.includes(",coverImage:") && str.includes("INVALID_ORIGIN"); - }); - if (_lookupApp) - lookupApp = async (appId) => { - let socket = {}; - await _lookupApp(socket, appId); - return socket.application; - }; - } - - if (lookupApp) break; - } - } - - if (msg.activity?.assets?.large_image) - msg.activity.assets.large_image = await lookupAsset( - msg.activity.application_id, - msg.activity.assets.large_image - ); - if (msg.activity?.assets?.small_image) - msg.activity.assets.small_image = await lookupAsset( - msg.activity.application_id, - msg.activity.assets.small_image - ); - - if (msg.activity) { - const appId = msg.activity.application_id; - if (!apps[appId]) apps[appId] = await lookupApp(appId); - - const app = apps[appId]; - if (!msg.activity.name) msg.activity.name = app.name; - } - - Dispatcher.dispatch({type: "LOCAL_ACTIVITY_UPDATE", ...msg}); // set RPC status - }); -})(); +})(); \ No newline at end of file diff --git a/rollup.config.js b/rollup.config.js index 1417b17..ad6ecee 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -51,6 +51,25 @@ export default defineConfig([ }), ], }, + { + input: "src/rpc.ts", + output: { + dir: "ts-out", + format: "esm", + sourcemap: true, + }, + external: [ + ...electronExternals, + "arrpc", + ], + plugins: [ + commonjs(), + esmShim(), + json(), + minify({ minify: prodEnv }), + typescript(), + ], + }, { input: "src/discord/preload/preload.mts", output: { diff --git a/src/discord/window.ts b/src/discord/window.ts index fd78a75..0b4f623 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -1,11 +1,6 @@ import { readFileSync } from "node:fs"; import os from "node:os"; import path from "node:path"; -import RPCServer from "arrpc"; -// To allow seamless switching between custom titlebar and native os titlebar, -// I had to add most of the window creation code here to split both into separate functions -// WHY? Because I can't use the same code for both due to annoying bug with value `frame` not responding to variables -// I'm sorry for this mess but I'm not sure how to fix it. import { BrowserWindow, type BrowserWindowConstructorOptions, @@ -14,6 +9,7 @@ import { dialog, nativeImage, shell, + utilityProcess, } from "electron"; import contextMenu from "electron-context-menu"; import { firstRun, getConfig, setConfig } from "../common/config.js"; @@ -293,13 +289,28 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { void passedWindow.webContents.executeJavaScript(`document.body.removeAttribute("isMaximized");`); }); if (getConfig("inviteWebsocket") && mainWindows.length === 1) { - const RPC = new RPCServer(); + const child = utilityProcess.fork(path.join(import.meta.dirname, 'rpc.js')) - RPC.on("activity", (data: string) => passedWindow.webContents.send("rpc", data)); - RPC.on("invite", (code: string) => { - console.log(code); - createInviteWindow(code); - }); + child.on('spawn', () => { + console.log("arRPC process started") + console.log(child.pid) + }) + + child.on('message', (message) => { + const json = JSON.parse(message) + if (json.type === "invite") { + createInviteWindow(json.code); + } else if (json.type === "activity") { + console.log("activity pulse") + console.log(json.data) + passedWindow.webContents.send("rpc", json.data); + } + }) + + child.on('exit', () => { + console.log("arRPC process exited") + console.log(child.pid) + }) } if (firstRun) { passedWindow.close(); diff --git a/src/rpc.ts b/src/rpc.ts new file mode 100644 index 0000000..3da0688 --- /dev/null +++ b/src/rpc.ts @@ -0,0 +1,17 @@ +// this file is executed in the utility process +// check window.ts for more details +// see more here https://www.electronjs.org/docs/latest/api/utility-process +import RPCServer from "arrpc"; + +const RPC = new RPCServer(); + +RPC.on("activity", (data: string) => { + console.log(data); + const response = {type: "activity", data: data}; + process.parentPort.postMessage(JSON.stringify(response)); +}); +RPC.on("invite", (code: string) => { + console.log(code); + const response = {type: "invite", code: code}; + process.parentPort.postMessage(JSON.stringify(response)); +}); From 24410982534c9fcc83fe4448433547da4c9f4121 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sat, 15 Mar 2025 19:38:55 +0100 Subject: [PATCH 601/844] chore: linting --- rollup.config.js | 13 ++----------- src/discord/window.ts | 28 ++++++++++++++-------------- src/rpc.ts | 4 ++-- 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/rollup.config.js b/rollup.config.js index ad6ecee..8ee4650 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -58,17 +58,8 @@ export default defineConfig([ format: "esm", sourcemap: true, }, - external: [ - ...electronExternals, - "arrpc", - ], - plugins: [ - commonjs(), - esmShim(), - json(), - minify({ minify: prodEnv }), - typescript(), - ], + external: [...electronExternals, "arrpc"], + plugins: [commonjs(), esmShim(), json(), minify({ minify: prodEnv }), typescript()], }, { input: "src/discord/preload/preload.mts", diff --git a/src/discord/window.ts b/src/discord/window.ts index 0b4f623..64a65c9 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -289,28 +289,28 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { void passedWindow.webContents.executeJavaScript(`document.body.removeAttribute("isMaximized");`); }); if (getConfig("inviteWebsocket") && mainWindows.length === 1) { - const child = utilityProcess.fork(path.join(import.meta.dirname, 'rpc.js')) + const child = utilityProcess.fork(path.join(import.meta.dirname, "rpc.js")); - child.on('spawn', () => { - console.log("arRPC process started") - console.log(child.pid) - }) + child.on("spawn", () => { + console.log("arRPC process started"); + console.log(child.pid); + }); - child.on('message', (message) => { - const json = JSON.parse(message) + child.on("message", (message) => { + const json = JSON.parse(message); if (json.type === "invite") { createInviteWindow(json.code); } else if (json.type === "activity") { - console.log("activity pulse") - console.log(json.data) + console.log("activity pulse"); + console.log(json.data); passedWindow.webContents.send("rpc", json.data); } - }) + }); - child.on('exit', () => { - console.log("arRPC process exited") - console.log(child.pid) - }) + child.on("exit", () => { + console.log("arRPC process exited"); + console.log(child.pid); + }); } if (firstRun) { passedWindow.close(); diff --git a/src/rpc.ts b/src/rpc.ts index 3da0688..2d3fce2 100644 --- a/src/rpc.ts +++ b/src/rpc.ts @@ -7,11 +7,11 @@ const RPC = new RPCServer(); RPC.on("activity", (data: string) => { console.log(data); - const response = {type: "activity", data: data}; + const response = { type: "activity", data: data }; process.parentPort.postMessage(JSON.stringify(response)); }); RPC.on("invite", (code: string) => { console.log(code); - const response = {type: "invite", code: code}; + const response = { type: "invite", code: code }; process.parentPort.postMessage(JSON.stringify(response)); }); From ed2c44542707dabe257b52963e12fc8f965691ac Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sat, 15 Mar 2025 21:24:15 +0100 Subject: [PATCH 602/844] feat: enable speech dispatcher on linux --- src/main.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.ts b/src/main.ts index c1f5434..55fccd4 100644 --- a/src/main.ts +++ b/src/main.ts @@ -73,6 +73,7 @@ if (!app.requestSingleInstanceLock() && getConfig("multiInstance") === false) { if (process.platform === "linux") { app.commandLine.appendSwitch("enable-features", "PulseaudioLoopbackForScreenShare"); app.commandLine.appendSwitch("disable-features", "WebRtcAllowInputVolumeAdjustment"); + app.commandLine.appendSwitch("enable-speech-dispatcher"); } // enable webrtc capturer for wayland if (process.platform === "linux" && process.env.XDG_SESSION_TYPE?.toLowerCase() === "wayland") { From 26f784c5c924312fa07e8ceebec0d6a77197dc00 Mon Sep 17 00:00:00 2001 From: Patrick <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 16 Mar 2025 10:12:40 +0100 Subject: [PATCH 603/844] chore: bump electron fixes windows builds --- package.json | 5 +++-- pnpm-lock.yaml | 35 ++++++++++++++--------------------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 7cffd7d..4b61d60 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "packageQuick": "pnpm run build && electron-builder --dir", "lint": "biome check", "lint:fix": "biome check --write", + "postinstall": "electron-builder install-app-deps", "CIbuild": "pnpm run build && electron-builder --linux zip && electron-builder --windows zip && electron-builder --macos zip" }, "repository": { @@ -43,7 +44,7 @@ "@uwu/lune": "^1.5.1", "@uwu/shelter-defs": "^1.4.1", "babel-preset-solid": "^1.9.3", - "electron": "35.0.1", + "electron": "35.0.2", "electron-builder": "^26.0.11", "lucide-solid": "^0.475.0", "rollup": "^4.27.4", @@ -58,7 +59,7 @@ "arrpc": "https://github.com/Legcord/arrpc.git", "electron-context-menu": "^4.0.4", "electron-is-dev": "^3.0.1", - "electron-updater": "^6.3.9", + "electron-updater": "^6.6.2", "ws": "^8.18.0" }, "optionalDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 145beab..e92aa99 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,8 +18,8 @@ importers: specifier: ^3.0.1 version: 3.0.1 electron-updater: - specifier: ^6.3.9 - version: 6.3.9 + specifier: ^6.6.2 + version: 6.6.2 ws: specifier: ^8.18.0 version: 8.18.0 @@ -68,8 +68,8 @@ importers: specifier: ^1.9.3 version: 1.9.3(@babel/core@7.26.7) electron: - specifier: 35.0.1 - version: 35.0.1 + specifier: 35.0.2 + version: 35.0.2 electron-builder: specifier: ^26.0.11 version: 26.0.11(electron-builder-squirrel-windows@25.1.8) @@ -1721,11 +1721,11 @@ packages: electron-to-chromium@1.5.90: resolution: {integrity: sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==} - electron-updater@6.3.9: - resolution: {integrity: sha512-2PJNONi+iBidkoC5D1nzT9XqsE8Q1X28Fn6xRQhO3YX8qRRyJ3mkV4F1aQsuRnYPqq6Hw+E51y27W75WgDoofw==} + electron-updater@6.6.2: + resolution: {integrity: sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==} - electron@35.0.1: - resolution: {integrity: sha512-iQonj6lnPhqfqha2KXx6LzV1dnu6UPTCWK+b7f9Zvg828umGemi22DKbcJ3/q+Opn7iUVTWyqp9z1JQqkIi6OA==} + electron@35.0.2: + resolution: {integrity: sha512-jo8S4GfBpVIBDGitUrv+Vo/I/ZEEs6IvWprG2KJlxayYIKpufulbQaxDt78cC/79FwFo8MA0JOIwx/b9r5NRag==} engines: {node: '>= 12.20.55'} hasBin: true @@ -2748,11 +2748,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.0: resolution: {integrity: sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==} engines: {node: '>=10'} @@ -4386,7 +4381,7 @@ snapshots: builder-util-runtime@9.2.10: dependencies: - debug: 4.3.7 + debug: 4.4.0 sax: 1.4.1 transitivePeerDependencies: - supports-color @@ -4546,7 +4541,7 @@ snapshots: node-api-headers: 1.5.0 npmlog: 6.0.2 rc: 1.2.8 - semver: 7.6.3 + semver: 7.7.0 tar: 6.2.1 url-join: 4.0.1 which: 2.0.2 @@ -4783,20 +4778,20 @@ snapshots: electron-to-chromium@1.5.90: {} - electron-updater@6.3.9: + electron-updater@6.6.2: dependencies: - builder-util-runtime: 9.2.10 + builder-util-runtime: 9.3.1 fs-extra: 10.1.0 js-yaml: 4.1.0 lazy-val: 1.0.5 lodash.escaperegexp: 4.1.2 lodash.isequal: 4.5.0 - semver: 7.6.3 + semver: 7.7.0 tiny-typed-emitter: 2.1.0 transitivePeerDependencies: - supports-color - electron@35.0.1: + electron@35.0.2: dependencies: '@electron/get': 2.0.3 '@types/node': 22.10.1 @@ -5906,8 +5901,6 @@ snapshots: semver@6.3.1: {} - semver@7.6.3: {} - semver@7.7.0: {} serialize-error@7.0.1: From d974d27fb6d424e9c50c95675fa56ae8d952b42b Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 16 Mar 2025 10:16:30 +0100 Subject: [PATCH 604/844] v1.1.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4b61d60..71c9cb7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "legcord", - "version": "1.1.0", + "version": "1.1.1", "description": "Legcord is a custom client designed to enhance your Discord experience while keeping everything lightweight.", "main": "ts-out/main.js", "engines": { From 2f6beb8bf24d117c30877025d246fcc3cf727664 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 27 Mar 2025 10:19:05 +0100 Subject: [PATCH 605/844] feat: remove the download apps button correctly + some css fixes --- assets/app/css/discord.css | 6 +++--- src/common/dom.ts | 2 +- src/discord/preload/patches.mts | 5 ----- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/assets/app/css/discord.css b/assets/app/css/discord.css index e8aaf00..4e3bf63 100644 --- a/assets/app/css/discord.css +++ b/assets/app/css/discord.css @@ -10,16 +10,16 @@ color: var(--text-muted); } -[data-list-item-id="guildsnav___app-download-button"] { +div:has(:has(:has([data-list-item-id="guildsnav___app-download-button"]))) { display: none !important; } /* custom keybinds are not supported on web information */ -.container_be45f6.info_be45f6.browserNotice_f916fc { +.container__6436f.info__6436f.browserNotice__740f2 { visibility: hidden; display: block !important; } -.container_be45f6.info_be45f6.browserNotice_f916fc:after { +.container__6436f.info__6436f.browserNotice__740f2:after { content: "You can modify global keybinds using the keybind maker on the left sidebar"; visibility: visible; } diff --git a/src/common/dom.ts b/src/common/dom.ts index 53aafee..b690acd 100644 --- a/src/common/dom.ts +++ b/src/common/dom.ts @@ -15,7 +15,7 @@ export function addTheme(id: string, styleString: string): void { export function addScript(scriptString: string): void { const script = document.createElement("script"); - script.src = scriptString; + script.appendChild(document.createTextNode(scriptString)); document.body.append(script); } diff --git a/src/discord/preload/patches.mts b/src/discord/preload/patches.mts index 3fdd65b..7f6afbb 100644 --- a/src/discord/preload/patches.mts +++ b/src/discord/preload/patches.mts @@ -52,11 +52,6 @@ async function load() { }); })(); `); - - // remove the annoying "download the app" button - addScript( - "document.querySelector('.guilds_a4d4d9 .scroller_fea3ef').lastChild.previousSibling.style.display = 'none';", - ); addScript(` shelter.plugins.removePlugin("armcord-settings") shelter.plugins.removePlugin("armcord-screenshare") From 2d2b9e3bb29a6bb7ac591a33d32c1df24e19bc7b Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 27 Mar 2025 10:19:20 +0100 Subject: [PATCH 606/844] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 71c9cb7..3fc5174 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "legcord", - "version": "1.1.1", + "version": "1.1.2", "description": "Legcord is a custom client designed to enhance your Discord experience while keeping everything lightweight.", "main": "ts-out/main.js", "engines": { From 06468a51c07fee6484e64a57c51556a5d957bda2 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 27 Mar 2025 10:30:27 +0100 Subject: [PATCH 607/844] bump electron --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- src/discord/preload/bridge.ts | 1 - 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 3fc5174..fe03a55 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "@uwu/lune": "^1.5.1", "@uwu/shelter-defs": "^1.4.1", "babel-preset-solid": "^1.9.3", - "electron": "35.0.2", + "electron": "35.1.1", "electron-builder": "^26.0.11", "lucide-solid": "^0.475.0", "rollup": "^4.27.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e92aa99..ae0c8a5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,8 +68,8 @@ importers: specifier: ^1.9.3 version: 1.9.3(@babel/core@7.26.7) electron: - specifier: 35.0.2 - version: 35.0.2 + specifier: 35.1.1 + version: 35.1.1 electron-builder: specifier: ^26.0.11 version: 26.0.11(electron-builder-squirrel-windows@25.1.8) @@ -1724,8 +1724,8 @@ packages: electron-updater@6.6.2: resolution: {integrity: sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==} - electron@35.0.2: - resolution: {integrity: sha512-jo8S4GfBpVIBDGitUrv+Vo/I/ZEEs6IvWprG2KJlxayYIKpufulbQaxDt78cC/79FwFo8MA0JOIwx/b9r5NRag==} + electron@35.1.1: + resolution: {integrity: sha512-0c4q8SuYsec9uqb1d2B/FDP/pifAT/Rc7721EjUdRfTKABFqXgYKAtyEKIlmFPjxPbwQt2EMfL35zVmpEAGI3A==} engines: {node: '>= 12.20.55'} hasBin: true @@ -4791,7 +4791,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@35.0.2: + electron@35.1.1: dependencies: '@electron/get': 2.0.3 '@types/node': 22.10.1 diff --git a/src/discord/preload/bridge.ts b/src/discord/preload/bridge.ts index 16a414b..93e83ac 100644 --- a/src/discord/preload/bridge.ts +++ b/src/discord/preload/bridge.ts @@ -88,7 +88,6 @@ contextBridge.exposeInMainWorld("legcord", { let windowCallback: (arg0: object) => void; contextBridge.exposeInMainWorld("LegcordRPC", { - // REVIEW - I don't think this is right listen: (callback: () => void) => { windowCallback = callback; }, From 98b583160d131223abc1b34365df19e20f7790b9 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 27 Mar 2025 11:17:46 +0100 Subject: [PATCH 608/844] feat: rolldown bundler will replace rollup in the future, 8x faster builds --- package.json | 5 +- pnpm-lock.yaml | 196 +++++++++++++++++++++++++++++++++++++++++++++ rolldown.config.js | 112 ++++++++++++++++++++++++++ 3 files changed, 312 insertions(+), 1 deletion(-) create mode 100644 rolldown.config.js diff --git a/package.json b/package.json index fe03a55..fa67401 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "build:dev": "rollup -c --environment BUILD:dev && tsx scripts/copyVenmic.mts", "build:plugins": "lune ci --repoSubDir src/shelter --to ts-out/plugins", "build": "pnpm build:plugins && rollup -c --environment BUILD:prod && tsx scripts/copyVenmic.mts", - "start": "pnpm build:plugins && pnpm run build:dev && electron --trace-warnings --ozone-platform-hint=auto ./ts-out/main.js", + "buildNew": "rolldown -c rolldown.config.js && tsx scripts/copyVenmic.mts", + "start": "pnpm build:plugins && pnpm run buildNew && electron --trace-warnings --ozone-platform-hint=auto ./ts-out/main.js", "startThemeManager": "pnpm run build:dev && electron ./ts-out/main.js themes", "package": "pnpm run build && electron-builder", "packageQuick": "pnpm run build && electron-builder --dir", @@ -31,6 +32,7 @@ }, "homepage": "https://github.com/Legcord/Legcord#readme", "devDependencies": { + "@babel/preset-flow": "^7.25.9", "@biomejs/biome": "1.9.4", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^28.0.1", @@ -47,6 +49,7 @@ "electron": "35.1.1", "electron-builder": "^26.0.11", "lucide-solid": "^0.475.0", + "rolldown": "1.0.0-beta.7", "rollup": "^4.27.4", "rollup-plugin-copy": "^3.5.0", "rollup-plugin-esbuild": "^6.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ae0c8a5..20145c4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,6 +28,9 @@ importers: specifier: ^6.1.0 version: 6.1.0 devDependencies: + '@babel/preset-flow': + specifier: ^7.25.9 + version: 7.25.9(@babel/core@7.26.7) '@biomejs/biome': specifier: 1.9.4 version: 1.9.4 @@ -76,6 +79,9 @@ importers: lucide-solid: specifier: ^0.475.0 version: 0.475.0(solid-js@1.9.3) + rolldown: + specifier: 1.0.0-beta.7 + version: 1.0.0-beta.7(typescript@5.7.2) rollup: specifier: ^4.27.4 version: 4.27.4 @@ -194,6 +200,12 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/plugin-syntax-flow@7.26.0': + resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.25.9': resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} engines: {node: '>=6.9.0'} @@ -206,6 +218,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-flow-strip-types@7.26.5': + resolution: {integrity: sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-modules-commonjs@7.26.3': resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} engines: {node: '>=6.9.0'} @@ -218,6 +236,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/preset-flow@7.25.9': + resolution: {integrity: sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/preset-typescript@7.26.0': resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} engines: {node: '>=6.9.0'} @@ -839,6 +863,9 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This functionality has been moved to @npmcli/fs + '@oxc-project/types@0.61.2': + resolution: {integrity: sha512-rfuwJwvwn9MRthHNXlSo9Eka/u7gC0MhnWAoX3BhE1+rwPOl22nq0K0Y997Hof0tHCOuD7H3/Z8HTfCVhB4c5Q==} + '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} @@ -930,61 +957,121 @@ packages: cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.0.0-beta.7': + resolution: {integrity: sha512-spVRMdG9NotVYfrc94W8zMKEqLFbxm/dzkBjTfKzXMqhyBryo1lwZ14o8xFb3lM/ON/ZUT7laR9y+r6SIUtFrg==} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.1': resolution: {integrity: sha512-+WHRLrogJl99EQ6HtYhy7EwIZ1wicD0RSX2T5mjfOM6AmPwPTXQ0n6MKOs1abU6ZyCj5Izlo6rLsao0h9FMUDA==} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.7': + resolution: {integrity: sha512-6d6PicpBNLWJUyGO1b87QOBtQuqL1X9qVugi+kyGcChxW2bL87/CIBAJDu1g3mM62xSzxUitGa2YWRMhMJu2OA==} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0-beta.1': resolution: {integrity: sha512-ZP9Q1q4IfvJ8dfWTHOF3cquNpAKuQQ+kZJQTxo85fGnKqtqMWFNouaBVd79pqCxU3w4oIjuZ8o55qNDomMTbVA==} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.0.0-beta.7': + resolution: {integrity: sha512-RCKUAMUr1+F1wDSUmWUoGimCNAoQ9km5SRIEhrTlCOXe4wv+rY4o07cTaBjehBm+GtT+u0r36SW2gOmikivj9Q==} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.1': resolution: {integrity: sha512-B/R4Vt8f8z/WmW9Y9NMgA+t5bCfRLmgZohs5mWf8KoD5FRlpvJtCo/SnD7fEg9npHEP5A28+Cikiyd7aCcKPSA==} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.7': + resolution: {integrity: sha512-SRGp4RaUC2oFZTDtLSRePWWE5F4C5vrlsr/a3+/mBlBVUdSrB7341hqAEcezW3YYHQOT/j9CPXu2NULENSywwQ==} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.1': resolution: {integrity: sha512-xkGD+YLH+vQZiqxKEsXe8xS/owQXkyARaNB9NfFrAacLoNIRZM5UEZGNKxXyRWd1kSEkYkJ3/WiqvGGCcqUg1A==} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.7': + resolution: {integrity: sha512-q6Szr5o54lJWir2uYxwxDoOUdSCrA2Nb8sKqQRnJHP9985o0uxeq85LKvMubFRgTKq9Q71ZZPrZBs7pwr4ji1Q==} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.1': resolution: {integrity: sha512-Ey2UxKFL74JuWpdNl9stpV0kxHZIgCWCEUnDnpQ1hcBwO9KwDM5qicLtXfsjozD6vt+xzbrL2D/uTrziYZ7IDQ==} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.7': + resolution: {integrity: sha512-MiEE4ReEw7jdxKE8eKTdt3z7N1sucgSb1J0BUY3Dd8YKLjh2jNYHhJu13/tCo2DBMZxT+FDJE3WJ5kCxZA7+YA==} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.1': resolution: {integrity: sha512-a8QP35x/3mggWqCpFtaF3/PbWl5P9QKpP/muk3iMPgzrXto8zPsEl3imsP3EBh4KwanBVHIf8pEkBQ+/7iMTgQ==} cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.7': + resolution: {integrity: sha512-2yDNUKQidgcZr/VSJCUy9IGvtcF/GfBEBrCsqvSkVKMNLNySICvybAwKtCNPeZSOwf875CWnnyKNeg5vwV6rMg==} + cpu: [x64] + os: [linux] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.1': resolution: {integrity: sha512-uIqKwnkZjTY8FmqGMaSjwtWlCdV88LV9bjdkv+mb7I+BBw+9cJlIQy0P8YnGEOEcnDPis/SiraCpkJ/eHYaSZw==} cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.7': + resolution: {integrity: sha512-72LjHkY9Sqav35qopNh4fabhSsqKWmOwMtjmrNgONTtC5LhALjNZlaXkAaFvQRJ8N7ftT8BOITzaZeqrF6BYdg==} + cpu: [x64] + os: [linux] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.1': resolution: {integrity: sha512-RB+gbhwZtTbKbvHzUcaRFva2ONCUTuxDEb/b3/rd3O82OTPUZzOY24mqreiXH1XG09p6WFXSE8dzUrN120Q29w==} engines: {node: '>=14.21.3'} cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.7': + resolution: {integrity: sha512-sR8q2p3j5ZCkFWPbm6LUIYE7SHfmrVqXu0n4CFpzmAM95pDhFRx8SzT/oL5tkFN+mCdnPpzcvpn9OioVXQ8CxA==} + engines: {node: '>=14.21.3'} + cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.1': resolution: {integrity: sha512-NSccQD7+9vhEfDMc8HyODuUU1jLYEsEiICc1zwmbeg0FXx1pwpFpZZQby4bAMnK2obav7D9FfsruYWodhNdIqQ==} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.7': + resolution: {integrity: sha512-eeSNGdZt01NelYGl5LZc3cSwN4iYG5XE8zMqkILErfW6ndpc74DKeDWI0aG8jmtjz5VerLA4B9DzOkhuFj4lNg==} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.1': resolution: {integrity: sha512-bUQOqqHfqgX9gHGZFGVYQRtc4+9diFDS/f85dKrzzUg7MF91ZU9mJUoemL4eyyj3B83N3FlHZtAPvDX3N2Zz8A==} cpu: [ia32] os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.7': + resolution: {integrity: sha512-d7Uhs3LWirrE4+TRa2N25AqrZaZjYZdOrKSYbZFMF42tFkWIgGWPCQouTqjMgjVGX0feJpF7+9dwVhjZFzZbYA==} + cpu: [ia32] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.1': resolution: {integrity: sha512-k8Ld05OlxkzR/+Ob8+IESaZ4uFcgLwbbwtUZLoryn3S6lCogkclcN/4m1wo/PyWtUAWF5mdz83SrkRL8dS4AqA==} cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.7': + resolution: {integrity: sha512-Z3P1JHx+U7Sr73v5wJtEygxboF2VR9ds4eSAgFfslhIxFI48FFm+WEMeuLLeqnx0tiq1UL6cIIg5+h3mlaG6UA==} + cpu: [x64] + os: [win32] + '@rollup/plugin-babel@6.0.4': resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} engines: {node: '>=14.0.0'} @@ -1248,6 +1335,11 @@ packages: '@uwu/shelter-defs@1.4.1': resolution: {integrity: sha512-KDQQf7S8yT1/ZxBZ8Ch5zHZ1ps9QcVtRWfnzK0pqrQb++5Tb2hqD0RiL5IrdS765/ZXglq0cgKWB6xesHVCZKg==} + '@valibot/to-json-schema@1.0.0': + resolution: {integrity: sha512-/9crJgPptVsGCL6X+JPDQyaJwkalSZ/52WuF8DiRUxJgcmpNdzYRfZ+gqMEP8W3CTVfuMWPqqvIgfwJ97f9Etw==} + peerDependencies: + valibot: ^1.0.0 + '@vencord/venmic@6.1.0': resolution: {integrity: sha512-YiCtzml/W8tYbGhu3jm5jfbbEnl2slKKARNK0jO+8qV979k9eFnfIRTxvhMN/SWq1h8ZNJdXVwvXpffQwq0RuA==} engines: {node: '>=14.15'} @@ -2698,6 +2790,15 @@ packages: '@babel/runtime': optional: true + rolldown@1.0.0-beta.7: + resolution: {integrity: sha512-IUa/9lZVqgFilYggiY7jxUbmvU4Q8wVvVqsru+AeMldBccBEhTYZ6/XP6cWsznb8Fv49zfYGaeEpJ5WeVdo6Mg==} + hasBin: true + peerDependencies: + '@oxc-project/runtime': 0.61.2 + peerDependenciesMeta: + '@oxc-project/runtime': + optional: true + rollup-plugin-copy@3.5.0: resolution: {integrity: sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==} engines: {node: '>=8.3'} @@ -2992,6 +3093,14 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + valibot@1.0.0: + resolution: {integrity: sha512-1Hc0ihzWxBar6NGeZv7fPLY0QuxFMyxwYR2sF1Blu7Wq7EnremwY2W02tit2ij2VJT8HcSkHAQqmFfl77f73Yw==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + validate-html-nesting@1.2.2: resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} @@ -3203,6 +3312,11 @@ snapshots: dependencies: '@babel/types': 7.26.7 + '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.7)': dependencies: '@babel/core': 7.26.7 @@ -3213,6 +3327,12 @@ snapshots: '@babel/core': 7.26.7 '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-flow-strip-types@7.26.5(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.7) + '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.7)': dependencies: '@babel/core': 7.26.7 @@ -3232,6 +3352,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-flow@7.25.9(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.26.7) + '@babel/preset-typescript@7.26.0(@babel/core@7.26.7)': dependencies: '@babel/core': 7.26.7 @@ -3750,6 +3877,8 @@ snapshots: mkdirp: 1.0.4 rimraf: 3.0.2 + '@oxc-project/types@0.61.2': {} + '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -3817,41 +3946,79 @@ snapshots: '@rolldown/binding-darwin-arm64@1.0.0-beta.1': optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.7': + optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.1': optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.7': + optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.1': optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.7': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.1': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.7': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.1': optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.7': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.1': optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.7': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.1': optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.7': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.1': optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.7': + optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.1': dependencies: '@napi-rs/wasm-runtime': 0.2.6 optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.7': + dependencies: + '@napi-rs/wasm-runtime': 0.2.6 + optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.1': optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.7': + optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.1': optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.7': + optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.1': optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.7': + optional: true + '@rollup/plugin-babel@6.0.4(@babel/core@7.26.7)(rollup@4.27.4)': dependencies: '@babel/core': 7.26.7 @@ -4092,6 +4259,10 @@ snapshots: solid-js: 1.6.16 spitroast: 1.4.4 + '@valibot/to-json-schema@1.0.0(valibot@1.0.0(typescript@5.7.2))': + dependencies: + valibot: 1.0.0(typescript@5.7.2) + '@vencord/venmic@6.1.0': dependencies: cmake-js: 7.3.0 @@ -5827,6 +5998,27 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.1 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.1 + rolldown@1.0.0-beta.7(typescript@5.7.2): + dependencies: + '@oxc-project/types': 0.61.2 + '@valibot/to-json-schema': 1.0.0(valibot@1.0.0(typescript@5.7.2)) + valibot: 1.0.0(typescript@5.7.2) + optionalDependencies: + '@rolldown/binding-darwin-arm64': 1.0.0-beta.7 + '@rolldown/binding-darwin-x64': 1.0.0-beta.7 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.7 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.7 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.7 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.7 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.7 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.7 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.7 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.7 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.7 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.7 + transitivePeerDependencies: + - typescript + rollup-plugin-copy@3.5.0: dependencies: '@types/fs-extra': 8.1.5 @@ -6150,6 +6342,10 @@ snapshots: util-deprecate@1.0.2: {} + valibot@1.0.0(typescript@5.7.2): + optionalDependencies: + typescript: 5.7.2 + validate-html-nesting@1.2.2: {} verror@1.10.1: diff --git a/rolldown.config.js b/rolldown.config.js new file mode 100644 index 0000000..5bbb8d7 --- /dev/null +++ b/rolldown.config.js @@ -0,0 +1,112 @@ +import babel from "@rollup/plugin-babel"; +import esmShim from "@rollup/plugin-esm-shim"; +import json from "@rollup/plugin-json"; +import { defineConfig } from "rolldown"; +import copy from "rollup-plugin-copy"; + +const electronExternals = ["electron", "node:fs", "node:path", "node:os", "node:url", "@vencord/venmic"]; + +export default defineConfig([ + { + input: "src/main.ts", + output: { + dir: "ts-out", + format: "esm", + sourcemap: true, + }, + platform: "node", + external: [ + ...electronExternals, + "electron", + "electron-is-dev", + "electron-updater", + "electron-context-menu", + "arrpc", + "path", + "stream", + "stream/promises", + ], + plugins: [ + esmShim(), + json(), + copy({ + targets: [ + { src: "src/**/**/*.html", dest: "ts-out/html/" }, + { src: "src/**/**/*.css", dest: "ts-out/css/" }, + { src: "src/**/**/*.js", dest: "ts-out/js/" }, + { src: "package.json", dest: "ts-out/" }, + { src: "assets/**/**", dest: "ts-out/assets/" }, + ], + }), + ], + }, + { + input: "src/rpc.ts", + output: { + dir: "ts-out", + format: "esm", + sourcemap: true, + }, + external: [...electronExternals, "arrpc"], + plugins: [esmShim(), json()], + }, + { + input: "src/discord/preload/preload.mts", + output: { + dir: "ts-out/discord", + entryFileNames: "[name].mjs", + format: "esm", + sourcemap: true, + }, + external: electronExternals, + }, + { + input: "src/splash/preload.mts", + output: { + dir: "ts-out/splash", + format: "esm", + entryFileNames: "[name].mjs", + sourcemap: true, + }, + external: electronExternals, + }, + { + input: "src/setup/preload.mts", + output: { + dir: "ts-out/setup", + format: "esm", + entryFileNames: "[name].mjs", + sourcemap: true, + }, + external: electronExternals, + }, + { + input: "src/cssEditor/preload.mts", + output: { + dir: "ts-out/cssEditor", + format: "esm", + entryFileNames: "[name].mjs", + sourcemap: true, + }, + external: electronExternals, + }, + { + input: "src/setup/setup.tsx", + output: { + dir: "ts-out/html", + format: "esm", + entryFileNames: "[name].js", + sourcemap: true, + }, + platform: "browser", + external: electronExternals, + plugins: [ + babel({ + presets: ["solid", "@babel/preset-flow"], + babelHelpers: "bundled", + exclude: "node_modules/**", + extensions: [".ts", ".tsx"], + }), + ], + }, +]); From 3dda27c303fe4fb1c2a6870ee4f68d2515ec6cd5 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 27 Mar 2025 16:20:06 +0100 Subject: [PATCH 609/844] fix: rebrand css --- src/discord/preload/newTitlebar.mts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/discord/preload/newTitlebar.mts b/src/discord/preload/newTitlebar.mts index 8cb0f64..66e0f66 100644 --- a/src/discord/preload/newTitlebar.mts +++ b/src/discord/preload/newTitlebar.mts @@ -3,7 +3,7 @@ import { addStyle } from "../../common/dom.js"; import { sleep } from "../../common/sleep.js"; document.addEventListener("DOMContentLoaded", () => { - if (ipcRenderer.sendSync("getConfig", "windowStyle") === "rebrand") return; + if (ipcRenderer.sendSync("getConfig", "windowStyle") !== "rebrand") return; sleep(500); switch (ipcRenderer.sendSync("getOS")) { case "darwin": From 8f222227edc4893dc42cbb996ede4e691046965d Mon Sep 17 00:00:00 2001 From: Patrick <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 4 Apr 2025 08:12:27 +0200 Subject: [PATCH 610/844] feat: overlay rebrand adaptation --- assets/app/css/winTitlebar.css | 31 +++++++++++++++++++++ src/@types/settings.d.ts | 1 + src/common/config.ts | 1 + src/discord/preload/mods/shelter.mts | 1 + src/discord/window.ts | 18 ++---------- src/shelter/titlebar/index.ts | 41 ++++++++++++++++++++++++++++ src/shelter/titlebar/plugin.json | 5 ++++ 7 files changed, 83 insertions(+), 15 deletions(-) create mode 100644 src/shelter/titlebar/index.ts create mode 100644 src/shelter/titlebar/plugin.json diff --git a/assets/app/css/winTitlebar.css b/assets/app/css/winTitlebar.css index 9542efd..9b59204 100644 --- a/assets/app/css/winTitlebar.css +++ b/assets/app/css/winTitlebar.css @@ -1,3 +1,34 @@ a[href="https://support.discord.com"] { margin-right: 150px; } + +.titlebar { + display: block; + top: 0; + left: 0; + right: 0; + flex-shrink: 0; + overflow: hidden; + zoom: 1; + box-sizing: border-box; + width: 100%; + clear: both; + height: 36px; + line-height: 30px; + -webkit-app-region: drag !important; + user-select: none; + background-color: var(--background-base-lowest); + -webkit-user-select: none; + position: fixed; + z-index: 99999; +} + +.window-title { + content: url("legcord://assets/Wordmark.png"); + height: 15px; + margin-left: initial; + transform: translate(9px, 9px); + float: left; + padding: 0; + filter: invert(30%); +} \ No newline at end of file diff --git a/src/@types/settings.d.ts b/src/@types/settings.d.ts index 72ff45e..852f723 100644 --- a/src/@types/settings.d.ts +++ b/src/@types/settings.d.ts @@ -65,5 +65,6 @@ export interface Settings { autoScroll: boolean; additionalArguments: string; noBundleUpdates: boolean; + overlayButtonColor: string; modCache?: Record; } diff --git a/src/common/config.ts b/src/common/config.ts index 9060810..c547234 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -10,6 +10,7 @@ const defaults: Settings = { bounceOnPing: false, legcordCSP: true, minimizeToTray: true, + overlayButtonColor: "#121214", keybinds: [], audio: { workaround: false, diff --git a/src/discord/preload/mods/shelter.mts b/src/discord/preload/mods/shelter.mts index 8e5a881..213f3ec 100644 --- a/src/discord/preload/mods/shelter.mts +++ b/src/discord/preload/mods/shelter.mts @@ -6,6 +6,7 @@ const requiredPlugins: Record + +const { + util: { log }, + flux: { dispatcher }, +} = shelter; +const titlebarOverlayHTML = ``; + +let isTitlebarOn = false; + +function layerPush(payload: {type: string, component: string}) { + console.log(payload.component) + if (payload.component === "USER_SETTINGS") { + const elem = document.createElement("div"); + elem.innerHTML = titlebarOverlayHTML; + elem.id = "legcordTitlebar" + isTitlebarOn = true; + document.body.prepend(elem); + } +} + +function layerPop() { + console.log("pop!") + document.getElementById("legcordTitlebar")?.remove() + isTitlebarOn = false; +} + +export function onLoad() { + if (window.legcord.platform === "win32") { + log("Legcord Titlebar Controller"); + dispatcher.subscribe("LAYER_PUSH", layerPush); + dispatcher.subscribe("LAYER_POP", layerPop); + } +} + +export function onUnload() { + dispatcher.unsubscribe("LAYER_PUSH", layerPush); + dispatcher.unsubscribe("LAYER_POP", layerPop); +} diff --git a/src/shelter/titlebar/plugin.json b/src/shelter/titlebar/plugin.json new file mode 100644 index 0000000..88e4fec --- /dev/null +++ b/src/shelter/titlebar/plugin.json @@ -0,0 +1,5 @@ +{ + "name": "Legcord Titlebar Controller", + "author": "smartfrigde", + "description": "Useful hooks into Discord for our custom titlebar implementation" +} \ No newline at end of file From fcf4881b4a8c32bef3ac7f5e318b046a872d1158 Mon Sep 17 00:00:00 2001 From: Patrick <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 4 Apr 2025 09:26:30 +0200 Subject: [PATCH 611/844] feat: custom rebrand titlebar --- assets/app/css/winTitlebar.css | 106 +++++++++++++++++++- src/@types/legcordWindow.d.ts | 4 + src/@types/settings.d.ts | 2 +- src/discord/preload/bridge.ts | 4 + src/discord/preload/newTitlebar.mts | 2 +- src/discord/preload/titlebar.mts | 11 +- src/shelter/settings/pages/SettingsPage.tsx | 8 +- src/shelter/titlebar/index.ts | 71 +++++++++++-- src/shelter/titlebar/plugin.json | 2 +- 9 files changed, 180 insertions(+), 30 deletions(-) diff --git a/assets/app/css/winTitlebar.css b/assets/app/css/winTitlebar.css index 9b59204..f629f7d 100644 --- a/assets/app/css/winTitlebar.css +++ b/assets/app/css/winTitlebar.css @@ -31,4 +31,108 @@ a[href="https://support.discord.com"] { float: left; padding: 0; filter: invert(30%); -} \ No newline at end of file +} + +/* Legcord on Windows */ +[legcord-platform="win32"] #window-controls-container { + width: 142px; +} +[legcord-platform="win32"] #window-controls-container #minimize:hover { + background-color: var(--background-modifier-hover); + transition: 0.2s ease; +} +[legcord-platform="win32"] #window-controls-container #maximize:hover { + background-color: var(--background-modifier-hover); + transition: 0.2s ease; +} +[legcord-platform="win32"] #window-controls-container #minimize:hover #minimize-icon { + background-color: var(--interactive-hover); + transition: 0.2s ease; +} +[legcord-platform="win32"] #window-controls-container #maximize:hover #maximize-icon { + background-color: var(--interactive-hover); + transition: 0.2s ease; +} +[legcord-platform="win32"] #window-controls-container #quit:hover { + background-color: #e81123; + transition: 0.2s ease; +} +[legcord-platform="win32"] #window-controls-container #quit:hover #quit-icon { + background-color: #ffffff; + transition: 0.1s ease; +} +[legcord-platform="win32"] #window-controls-container #minimize { + background-color: transparent; + transition: 0.1s ease; +} +[legcord-platform="win32"] #window-controls-container #maximize { + background-color: transparent; + transition: 0.1s ease; +} +[legcord-platform="win32"] #window-controls-container #quit { + background-color: transparent; + transition: 0.1s ease; +} +[legcord-platform="win32"] #window-controls-container #quit:active { + background-color: #f1707a; + transition: 0.1s ease; +} +[legcord-platform="win32"] #window-controls-container #quit:active #quit-icon { + background-color: #000000cc; + transition: 0.1s ease; +} +[legcord-platform="win32"] #window-controls-container #quit-icon { + background-color: var(--interactive-normal); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} +[legcord-platform="win32"] #window-controls-container #minimize-icon { + background-color: var(--interactive-normal); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} +[legcord-platform="win32"] #window-controls-container #maximize-icon { + background-color: var(--interactive-normal); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} + +[legcord-platform="win32"][isMaximized] #window-controls-container #maximize-icon { + background-color: var(--interactive-normal); + display: list-item; + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} +#window-controls-container { + float: right; + display: flex; + height: 100%; + position: sticky; + right: 0; + top: 0; + z-index: 99999999; + line-height: 36px; + -webkit-app-region: no-drag; +} + +#window-controls-container #minimize, +#window-controls-container #maximize, +#window-controls-container #quit { + float: left; + height: 100%; + width: 33.3%; + text-align: center; + color: var(--interactive-normal); + cursor: default; +} diff --git a/src/@types/legcordWindow.d.ts b/src/@types/legcordWindow.d.ts index 3c455bb..75ab3b7 100644 --- a/src/@types/legcordWindow.d.ts +++ b/src/@types/legcordWindow.d.ts @@ -9,6 +9,10 @@ export interface LegcordWindow { hide: () => void; minimize: () => void; maximize: () => void; + unmaximize: () => void; + quit: () => void; + maximized: () => boolean; + isNormal: () => boolean; }; electron: string; getLang: (toGet: string) => Promise; diff --git a/src/@types/settings.d.ts b/src/@types/settings.d.ts index 852f723..e261d3a 100644 --- a/src/@types/settings.d.ts +++ b/src/@types/settings.d.ts @@ -31,7 +31,7 @@ export interface Settings { // Only used for external url warning dialog. ignoreProtocolWarning?: boolean; customIcon: string; - windowStyle: "default" | "native" | "overlay" | "transparent" | "rebrand"; + windowStyle: "default" | "native" | "overlay" | "transparent" | "legacy"; channel: "stable" | "ptb" | "canary"; transparency: "universal" | "modern" | "none"; audio: AudioSettings; diff --git a/src/discord/preload/bridge.ts b/src/discord/preload/bridge.ts index 93e83ac..1314abb 100644 --- a/src/discord/preload/bridge.ts +++ b/src/discord/preload/bridge.ts @@ -17,6 +17,10 @@ contextBridge.exposeInMainWorld("legcord", { hide: () => ipcRenderer.send("win-hide"), minimize: () => ipcRenderer.send("win-minimize"), maximize: () => ipcRenderer.send("win-maximize"), + unmaximize: () => ipcRenderer.send("win-unmaximize"), + maximized: () => ipcRenderer.sendSync("win-isMaximized"), + isNormal: () => ipcRenderer.sendSync("win-isNormal"), + quit: () => ipcRenderer.send("win-quit"), }, settings: { getConfig: () => ipcRenderer.sendSync("getEntireConfig") as Settings, diff --git a/src/discord/preload/newTitlebar.mts b/src/discord/preload/newTitlebar.mts index 66e0f66..9ef5410 100644 --- a/src/discord/preload/newTitlebar.mts +++ b/src/discord/preload/newTitlebar.mts @@ -3,7 +3,7 @@ import { addStyle } from "../../common/dom.js"; import { sleep } from "../../common/sleep.js"; document.addEventListener("DOMContentLoaded", () => { - if (ipcRenderer.sendSync("getConfig", "windowStyle") !== "rebrand") return; + document.body.setAttribute("legcord-platform", ipcRenderer.sendSync("getOS")); sleep(500); switch (ipcRenderer.sendSync("getOS")) { case "darwin": diff --git a/src/discord/preload/titlebar.mts b/src/discord/preload/titlebar.mts index 961283b..04679f8 100644 --- a/src/discord/preload/titlebar.mts +++ b/src/discord/preload/titlebar.mts @@ -25,9 +25,6 @@ function injectTitlebar(isOverlay?: boolean): void { } document.body.prepend(elem); addStyle("legcord://assets/css/titlebar.css"); - document.body.setAttribute("customTitlebar", ""); - - document.body.setAttribute("legcord-platform", ipcRenderer.sendSync("getOS")); const minimize = document.getElementById("minimize"); const maximize = document.getElementById("maximize"); @@ -65,15 +62,9 @@ function injectTitlebar(isOverlay?: boolean): void { } switch (ipcRenderer.sendSync("getConfig", "windowStyle")) { - case "default": + case "legacy": injectTitlebar(false); break; - case "transparent": - injectTitlebar(false); - break; - case "overlay": - injectTitlebar(true); - break; default: break; } diff --git a/src/shelter/settings/pages/SettingsPage.tsx b/src/shelter/settings/pages/SettingsPage.tsx index d92372e..bfa21aa 100644 --- a/src/shelter/settings/pages/SettingsPage.tsx +++ b/src/shelter/settings/pages/SettingsPage.tsx @@ -62,12 +62,8 @@ export function SettingsPage() { > - - - - - - + + - const { util: { log }, flux: { dispatcher }, @@ -8,30 +7,82 @@ const titlebarOverlayHTML = ``; +const titlebarNavControls = ` +
    +
    +
    +
    +
    +
    +`; + let isTitlebarOn = false; -function layerPush(payload: {type: string, component: string}) { - console.log(payload.component) +const settings = window.legcord.settings.getConfig(); + +function injectButtonControls() { + const elem = document.createElement("div"); + elem.innerHTML = titlebarNavControls; + elem.id = "legcordNavControls"; + document.body.prepend(elem); + const minimize = document.getElementById("minimize"); + const maximize = document.getElementById("maximize"); + const quit = document.getElementById("quit"); + + minimize!.addEventListener("click", () => { + window.legcord.window.minimize(); + }); + + maximize!.addEventListener("click", () => { + if (window.legcord.window.maximized() === true) { + window.legcord.window.unmaximize(); + document.body.removeAttribute("isMaximized"); + } else if (window.legcord.window.isNormal() === true) { + window.legcord.window.maximize(); + } + }); + const minimizeToTray = settings.minimizeToTray; + quit!.addEventListener("click", () => { + if (minimizeToTray === true) { + window.legcord.window.hide(); + } else if (minimizeToTray === false) { + window.legcord.window.quit(); + } + }); +} + +function layerPush(payload: { type: string; component: string }) { + console.log(payload.component); if (payload.component === "USER_SETTINGS") { const elem = document.createElement("div"); elem.innerHTML = titlebarOverlayHTML; - elem.id = "legcordTitlebar" + elem.id = "legcordTitlebar"; isTitlebarOn = true; document.body.prepend(elem); } } function layerPop() { - console.log("pop!") - document.getElementById("legcordTitlebar")?.remove() + console.log("pop!"); + document.getElementById("legcordTitlebar")?.remove(); isTitlebarOn = false; } export function onLoad() { - if (window.legcord.platform === "win32") { - log("Legcord Titlebar Controller"); - dispatcher.subscribe("LAYER_PUSH", layerPush); - dispatcher.subscribe("LAYER_POP", layerPop); + if (window.legcord.platform !== "win32") return; + log("Legcord Titlebar Controller"); + switch (settings.windowStyle) { + case "default": + document.body.setAttribute("customTitlebar", ""); + injectButtonControls(); + break; + case "overlay": + document.body.setAttribute("customTitlebar", ""); + dispatcher.subscribe("LAYER_PUSH", layerPush); + dispatcher.subscribe("LAYER_POP", layerPop); + break; + default: + log("Unsupported window style"); } } diff --git a/src/shelter/titlebar/plugin.json b/src/shelter/titlebar/plugin.json index 88e4fec..bffa8de 100644 --- a/src/shelter/titlebar/plugin.json +++ b/src/shelter/titlebar/plugin.json @@ -2,4 +2,4 @@ "name": "Legcord Titlebar Controller", "author": "smartfrigde", "description": "Useful hooks into Discord for our custom titlebar implementation" -} \ No newline at end of file +} From 8791e9cbde8090f2be7b998f632ff1a3dac72aa4 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 4 Apr 2025 09:39:00 +0200 Subject: [PATCH 612/844] bump electron --- package.json | 4 ++-- pnpm-lock.yaml | 56 +++++++++++++++++++++++++------------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index fa67401..c84fa66 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,8 @@ "@uwu/lune": "^1.5.1", "@uwu/shelter-defs": "^1.4.1", "babel-preset-solid": "^1.9.3", - "electron": "35.1.1", - "electron-builder": "^26.0.11", + "electron": "35.1.3", + "electron-builder": "^26.0.12", "lucide-solid": "^0.475.0", "rolldown": "1.0.0-beta.7", "rollup": "^4.27.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 20145c4..7130905 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -71,11 +71,11 @@ importers: specifier: ^1.9.3 version: 1.9.3(@babel/core@7.26.7) electron: - specifier: 35.1.1 - version: 35.1.1 + specifier: 35.1.3 + version: 35.1.3 electron-builder: - specifier: ^26.0.11 - version: 26.0.11(electron-builder-squirrel-windows@25.1.8) + specifier: ^26.0.12 + version: 26.0.12(electron-builder-squirrel-windows@25.1.8) lucide-solid: specifier: ^0.475.0 version: 0.475.0(solid-js@1.9.3) @@ -1409,12 +1409,12 @@ packages: dmg-builder: 25.1.8 electron-builder-squirrel-windows: 25.1.8 - app-builder-lib@26.0.11: - resolution: {integrity: sha512-bsfSjSZp9dg7q28+4NPLJ2ldq3j1ESP2LJ+8AibaPqQb2lTIJeQW1JmgdAs9KuYTtkswiZ/+PMyokC9M7hwnjQ==} + app-builder-lib@26.0.12: + resolution: {integrity: sha512-+/CEPH1fVKf6HowBUs6LcAIoRcjeqgvAeoSE+cl7Y7LndyQ9ViGPYibNk7wmhMHzNgHIuIbw4nWADPO+4mjgWw==} engines: {node: '>=14.0.0'} peerDependencies: - dmg-builder: 26.0.11 - electron-builder-squirrel-windows: 26.0.11 + dmg-builder: 26.0.12 + electron-builder-squirrel-windows: 26.0.12 aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -1759,8 +1759,8 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dmg-builder@26.0.11: - resolution: {integrity: sha512-C+SaRneQ11OxG99EeGp3TvPrlkW9ZaiukxB9Z7+OhhO1ge0nAtq9uD0ILt1JpvNAQ1de3gzX7TFRYJrSGsNe+Q==} + dmg-builder@26.0.12: + resolution: {integrity: sha512-59CAAjAhTaIMCN8y9kD573vDkxbs1uhDcrFLHSgutYdPcGOU35Rf95725snvzEOy4BFB7+eLJ8djCNPmGwG67w==} dmg-license@1.0.11: resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} @@ -1787,8 +1787,8 @@ packages: electron-builder-squirrel-windows@25.1.8: resolution: {integrity: sha512-2ntkJ+9+0GFP6nAISiMabKt6eqBB0kX1QqHNWFWAXgi0VULKGisM46luRFpIBiU3u/TDmhZMM8tzvo2Abn3ayg==} - electron-builder@26.0.11: - resolution: {integrity: sha512-u7Qgge5ue5oOPDbZEseor7RjxKSYAekVflHkbNIY6te1kbtShQFqESq3FZakMBsQf/3SkEycvWhHHRb8zjqBqg==} + electron-builder@26.0.12: + resolution: {integrity: sha512-cD1kz5g2sgPTMFHjLxfMjUK5JABq3//J4jPswi93tOPFz6btzXYtK5NrDt717NRbukCUDOrrvmYVOWERlqoiXA==} engines: {node: '>=14.0.0'} hasBin: true @@ -1816,8 +1816,8 @@ packages: electron-updater@6.6.2: resolution: {integrity: sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==} - electron@35.1.1: - resolution: {integrity: sha512-0c4q8SuYsec9uqb1d2B/FDP/pifAT/Rc7721EjUdRfTKABFqXgYKAtyEKIlmFPjxPbwQt2EMfL35zVmpEAGI3A==} + electron@35.1.3: + resolution: {integrity: sha512-z7zZtvoK40ynKmgZ5dfD5xhsAXHxNShWgx9vIpC/ZMawBB93sBTWU83gHrjSzAcY9n0Io1WJCyUt/UIQHzlDXA==} engines: {node: '>= 12.20.55'} hasBin: true @@ -4327,7 +4327,7 @@ snapshots: app-builder-bin@5.0.0-alpha.12: {} - app-builder-lib@25.1.8(dmg-builder@26.0.11)(electron-builder-squirrel-windows@25.1.8): + app-builder-lib@25.1.8(dmg-builder@26.0.12)(electron-builder-squirrel-windows@25.1.8): dependencies: '@develar/schema-utils': 2.6.5 '@electron/notarize': 2.5.0 @@ -4343,11 +4343,11 @@ snapshots: chromium-pickle-js: 0.2.0 config-file-ts: 0.2.8-rc1 debug: 4.4.0 - dmg-builder: 26.0.11(electron-builder-squirrel-windows@25.1.8) + dmg-builder: 26.0.12(electron-builder-squirrel-windows@25.1.8) dotenv: 16.4.5 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.0.11) + electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.0.12) electron-publish: 25.1.7 form-data: 4.0.1 fs-extra: 10.1.0 @@ -4367,7 +4367,7 @@ snapshots: - bluebird - supports-color - app-builder-lib@26.0.11(dmg-builder@26.0.11)(electron-builder-squirrel-windows@25.1.8): + app-builder-lib@26.0.12(dmg-builder@26.0.12)(electron-builder-squirrel-windows@25.1.8): dependencies: '@develar/schema-utils': 2.6.5 '@electron/asar': 3.2.18 @@ -4384,11 +4384,11 @@ snapshots: chromium-pickle-js: 0.2.0 config-file-ts: 0.2.8-rc1 debug: 4.4.0 - dmg-builder: 26.0.11(electron-builder-squirrel-windows@25.1.8) + dmg-builder: 26.0.12(electron-builder-squirrel-windows@25.1.8) dotenv: 16.4.5 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.0.11) + electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.0.12) electron-publish: 26.0.11 fs-extra: 10.1.0 hosted-git-info: 4.1.0 @@ -4841,9 +4841,9 @@ snapshots: dependencies: path-type: 4.0.0 - dmg-builder@26.0.11(electron-builder-squirrel-windows@25.1.8): + dmg-builder@26.0.12(electron-builder-squirrel-windows@25.1.8): dependencies: - app-builder-lib: 26.0.11(dmg-builder@26.0.11)(electron-builder-squirrel-windows@25.1.8) + app-builder-lib: 26.0.12(dmg-builder@26.0.12)(electron-builder-squirrel-windows@25.1.8) builder-util: 26.0.11 builder-util-runtime: 9.3.1 fs-extra: 10.1.0 @@ -4880,9 +4880,9 @@ snapshots: dependencies: jake: 10.9.2 - electron-builder-squirrel-windows@25.1.8(dmg-builder@26.0.11): + electron-builder-squirrel-windows@25.1.8(dmg-builder@26.0.12): dependencies: - app-builder-lib: 25.1.8(dmg-builder@26.0.11)(electron-builder-squirrel-windows@25.1.8) + app-builder-lib: 25.1.8(dmg-builder@26.0.12)(electron-builder-squirrel-windows@25.1.8) archiver: 5.3.2 builder-util: 25.1.7 fs-extra: 10.1.0 @@ -4891,13 +4891,13 @@ snapshots: - dmg-builder - supports-color - electron-builder@26.0.11(electron-builder-squirrel-windows@25.1.8): + electron-builder@26.0.12(electron-builder-squirrel-windows@25.1.8): dependencies: - app-builder-lib: 26.0.11(dmg-builder@26.0.11)(electron-builder-squirrel-windows@25.1.8) + app-builder-lib: 26.0.12(dmg-builder@26.0.12)(electron-builder-squirrel-windows@25.1.8) builder-util: 26.0.11 builder-util-runtime: 9.3.1 chalk: 4.1.2 - dmg-builder: 26.0.11(electron-builder-squirrel-windows@25.1.8) + dmg-builder: 26.0.12(electron-builder-squirrel-windows@25.1.8) fs-extra: 10.1.0 is-ci: 3.0.1 lazy-val: 1.0.5 @@ -4962,7 +4962,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@35.1.1: + electron@35.1.3: dependencies: '@electron/get': 2.0.3 '@types/node': 22.10.1 From f5f43211f78e49dde566984ad460b72fcf9d3fa5 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 4 Apr 2025 10:33:17 +0200 Subject: [PATCH 613/844] feat: linux button css --- assets/app/css/winTitlebar.css | 89 +++++++++++++++++++++++++++++ src/discord/preload/newTitlebar.mts | 4 ++ 2 files changed, 93 insertions(+) diff --git a/assets/app/css/winTitlebar.css b/assets/app/css/winTitlebar.css index f629f7d..b98a38e 100644 --- a/assets/app/css/winTitlebar.css +++ b/assets/app/css/winTitlebar.css @@ -136,3 +136,92 @@ a[href="https://support.discord.com"] { color: var(--interactive-normal); cursor: default; } + +/* Legcord on Linux */ + +[legcord-platform="linux"] #window-controls-container { + line-height: 45px; + transform: translateY(-8px); +} +[legcord-platform="linux"] #window-controls-container #minimize:hover { + background-color: var(--background-modifier-hover); + transition: 0.2s ease; +} +[legcord-platform="linux"] #window-controls-container #maximize:hover { + background-color: var(--background-modifier-hover); + transition: 0.2s ease; +} +[legcord-platform="linux"] #window-controls-container #minimize:hover #minimize-icon { + background-color: var(--interactive-hover); + transition: 0.2s ease; +} +[legcord-platform="linux"] #window-controls-container #maximize:hover #maximize-icon { + background-color: var(--interactive-hover); + transition: 0.2s ease; +} +[legcord-platform="linux"] #window-controls-container #quit:hover { + background-color: var(--brand-experiment-560); + transition: 0.2s ease; +} +[legcord-platform="linux"] #window-controls-container #quit #quit-icon { + background-color: #ffffff; + display: list-item; + transition: 0.1s ease; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} +[legcord-platform="linux"] #window-controls-container #minimize-icon { + background-color: var(--interactive-normal); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} +[legcord-platform="linux"] #window-controls-container #maximize-icon { + background-color: var(--interactive-normal); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} + +[legcord-platform="linux"][isMaximized] #window-controls-container #maximize-icon { + background-color: var(--interactive-normal); + display: list-item; + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='9' height='9'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='9' height='9'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} +[legcord-platform="linux"] #window-controls-container #minimize { + background-color: transparent; + transition: 0.1s ease; + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} +[legcord-platform="linux"] #window-controls-container #maximize { + background-color: transparent; + transition: 0.1s ease; + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} +[legcord-platform="linux"] #window-controls-container #quit { + background-color: var(--brand-experiment); + transition: 0.1s ease; + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} +[legcord-platform="linux"] #window-controls-container #quit:active { + background-color: var(--brand-experiment-600); + transition: 0.1s ease; +} diff --git a/src/discord/preload/newTitlebar.mts b/src/discord/preload/newTitlebar.mts index 9ef5410..495a38e 100644 --- a/src/discord/preload/newTitlebar.mts +++ b/src/discord/preload/newTitlebar.mts @@ -13,6 +13,10 @@ document.addEventListener("DOMContentLoaded", () => { document.body.setAttribute("class", "platform-win"); addStyle("legcord://assets/css/winTitlebar.css"); break; + case "linux": + document.body.setAttribute("class", "platform-linux"); + addStyle("legcord://assets/css/winTitlebar.css"); + break; default: break; } From 728750f37b921f2374855b598010d18bec1aef2a Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 4 Apr 2025 10:40:35 +0200 Subject: [PATCH 614/844] fix: enable titlebar plugin on all platforms --- src/shelter/titlebar/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/shelter/titlebar/index.ts b/src/shelter/titlebar/index.ts index 6198968..1db05db 100644 --- a/src/shelter/titlebar/index.ts +++ b/src/shelter/titlebar/index.ts @@ -69,7 +69,6 @@ function layerPop() { } export function onLoad() { - if (window.legcord.platform !== "win32") return; log("Legcord Titlebar Controller"); switch (settings.windowStyle) { case "default": From f1ae18c3363013ed93bea3d2d4af22ddb2b077d0 Mon Sep 17 00:00:00 2001 From: Liam Rooney <80072393+lbrooney@users.noreply.github.com> Date: Fri, 4 Apr 2025 02:30:50 -0700 Subject: [PATCH 615/844] fix: make it so switch flags set all at once (#884) Co-authored-by: Lemon --- src/common/flags.ts | 83 +++++++++++++++++++++++++++++++++------------ src/main.ts | 75 +++++++++++++++++++++++++++++++++------- 2 files changed, 123 insertions(+), 35 deletions(-) diff --git a/src/common/flags.ts b/src/common/flags.ts index 6f7955b..ca6c830 100644 --- a/src/common/flags.ts +++ b/src/common/flags.ts @@ -1,8 +1,61 @@ -import { app, powerMonitor } from "electron"; +import { powerMonitor } from "electron"; import { getConfig } from "./config.js"; -export let transparency: boolean; -export function injectElectronFlags(): void { +interface Preset { + switches: [string, string?][]; + enableFeatures: string[]; + disableFeatures: string[]; +} + +const performance: Preset = { + switches: [ + ["enable-gpu-rasterization"], + ["enable-zero-copy"], + ["ignore-gpu-blocklist"], + ["enable-hardware-overlays", "single-fullscreen,single-on-top,underlay"], + ["force_high_performance_gpu"], + ], + enableFeatures: [ + "EnableDrDc", + "CanvasOopRasterization", + "BackForwardCache:TimeToLiveInBackForwardCacheInSeconds/300/should_ignore_blocklists/true/enable_same_site/true", + "ThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes", + "UseSkiaRenderer", + "WebAssemblyLazyCompilation", + ], + disableFeatures: ["Vulkan"], +}; + +const battery: Preset = { + // Known to have better battery life for Chromium? + switches: [ + ["force_low_power_gpu"], + ["enable-low-end-device-mode"], + ["enable-low-res-tiling"], + ["process-per-site"], + ], + enableFeatures: ["TurnOffStreamingMediaCachingOnBattery"], + disableFeatures: [], +}; + +const vaapi: Preset = { + switches: [ + ["ignore-gpu-blocklist"], + ["enable-gpu-rasterization"], + ["enable-zero-copy"], + ["force_high_performance_gpu"], + ["use-gl", "desktop"], + ], + enableFeatures: [ + "AcceleratedVideoDecodeLinuxGL", + "AcceleratedVideoEncoder", + "AcceleratedVideoDecoder", + "AcceleratedVideoDecodeLinuxZeroCopyGL", + ], + disableFeatures: ["UseChromeOSDirectVideoDecoder"], +}; + +export function getPreset(): Preset | undefined { // MIT License // Copyright (c) 2022 GooseNest @@ -24,39 +77,25 @@ export function injectElectronFlags(): void { // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. - const presets = { - performance: - "--enable-gpu-rasterization --enable-zero-copy --ignore-gpu-blocklist --enable-hardware-overlays=single-fullscreen,single-on-top,underlay --enable-features=EnableDrDc,CanvasOopRasterization,BackForwardCache:TimeToLiveInBackForwardCacheInSeconds/300/should_ignore_blocklists/true/enable_same_site/true,ThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes,UseSkiaRenderer,WebAssemblyLazyCompilation --disable-features=Vulkan --force_high_performance_gpu", // Performance - battery: - "--enable-features=TurnOffStreamingMediaCachingOnBattery --force_low_power_gpu --enable-low-end-device-mode --enable-low-res-tiling --process-per-site", // Known to have better battery life for Chromium? - vaapi: "--ignore-gpu-blocklist --enable-features=AcceleratedVideoDecodeLinuxGL,AcceleratedVideoEncoder,AcceleratedVideoDecoder,AcceleratedVideoDecodeLinuxZeroCopyGL --enable-gpu-rasterization --enable-zero-copy --force_high_performance_gpu --use-gl=desktop --disable-features=UseChromeOSDirectVideoDecoder", - }; switch (getConfig("performanceMode")) { case "dynamic": if (powerMonitor.isOnBatteryPower()) { console.log("Battery mode enabled"); - app.commandLine.appendArgument(presets.battery); + return battery; } else { console.log("Performance mode enabled"); - app.commandLine.appendArgument(presets.performance); + return performance; } - break; case "performance": console.log("Performance mode enabled"); - app.commandLine.appendArgument(presets.performance); - break; + return performance; case "battery": console.log("Battery mode enabled"); - app.commandLine.appendArgument(presets.battery); - break; + return battery; case "vaapi": console.log("VAAPI mode enabled"); - app.commandLine.appendArgument(presets.vaapi); - break; + return vaapi; default: console.log("No performance modes set"); } - if (getConfig("windowStyle") === "transparent" && process.platform === "win32") { - transparency = true; - } } diff --git a/src/main.ts b/src/main.ts index 55fccd4..73c7ac5 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,7 +14,7 @@ import { setConfig, } from "./common/config.js"; import "./updater.js"; -import { injectElectronFlags } from "./common/flags.js"; +import { getPreset } from "./common/flags.js"; import { setLang } from "./common/lang.js"; import { fetchMods } from "./discord/extensions/modloader.js"; import { createWindow } from "./discord/window.js"; @@ -61,24 +61,36 @@ if (!app.requestSingleInstanceLock() && getConfig("multiInstance") === false) { app.quit(); } else { app.setAppUserModelId("app.legcord.Legcord"); + + const enableFeatures = new Set(app.commandLine.getSwitchValue("enable-features").split(",")); + const disableFeatures = new Set(app.commandLine.getSwitchValue("disable-features").split(",")); + const enableBlinkFeatures = new Set(app.commandLine.getSwitchValue("enable-blink-features").split(",")); + const disableBlinkFeatures = new Set(app.commandLine.getSwitchValue("disable-blink-features").split(",")); + // unneeded as the last switch is the applied one, however cleans up the commandline + app.commandLine.removeSwitch("enable-features"); + app.commandLine.removeSwitch("disable-features"); + app.commandLine.removeSwitch("enable-blink-features"); + app.commandLine.removeSwitch("disable-blink-features"); + // WinRetrieveSuggestionsOnlyOnDemand: Work around electron 13 bug w/ async spellchecking on Windows. // HardwareMediaKeyHandling,MediaSessionService: Prevent Discord from registering as a media service. - app.commandLine.appendSwitch( - "disable-features", - "WidgetLayering,WinRetrieveSuggestionsOnlyOnDemand,HardwareMediaKeyHandling,MediaSessionService", - ); // fix dev tools layers + disableFeatures + .add("WidgetLayering") + .add("WinRetrieveSuggestionsOnlyOnDemand") + .add("HardwareMediaKeyHandling") + .add("MediaSessionService"); // Your data now belongs to CCP crashReporter.start({ uploadToServer: false }); // enable pulseaudio audio sharing on linux if (process.platform === "linux") { - app.commandLine.appendSwitch("enable-features", "PulseaudioLoopbackForScreenShare"); - app.commandLine.appendSwitch("disable-features", "WebRtcAllowInputVolumeAdjustment"); + enableFeatures.add("PulseaudioLoopbackForScreenShare"); + disableFeatures.add("WebRtcAllowInputVolumeAdjustment"); app.commandLine.appendSwitch("enable-speech-dispatcher"); } // enable webrtc capturer for wayland if (process.platform === "linux" && process.env.XDG_SESSION_TYPE?.toLowerCase() === "wayland") { - app.commandLine.appendSwitch("disable-features", "UseMultiPlaneFormatForSoftwareVideo"); - app.commandLine.appendSwitch("enable-features", "WebRTCPipeWireCapturer"); + enableFeatures.add("WebRTCPipeWireCapturer"); + disableFeatures.add("UseMultiPlaneFormatForSoftwareVideo"); console.log("Wayland detected, using PipeWire for video capture."); } if (process.platform === "darwin") { @@ -90,7 +102,12 @@ if (!app.requestSingleInstanceLock() && getConfig("multiInstance") === false) { app.commandLine.appendSwitch("enable-transparent-visuals"); checkIfConfigIsBroken(); - injectElectronFlags(); + const preset = getPreset(); + if (preset) { + preset.switches.forEach(([key, val]) => app.commandLine.appendSwitch(key, val)); + preset.enableFeatures.forEach((val) => enableFeatures.add(val)); + preset.disableFeatures.forEach((val) => disableFeatures.add(val)); + } await fetchMods(); void import("./discord/extensions/plugin.js"); // load chrome extensions console.log(`[Config Manager] Current config: ${readFileSync(getConfigLocation(), "utf-8")}`); @@ -126,12 +143,44 @@ if (!app.requestSingleInstanceLock() && getConfig("multiInstance") === false) { setConfig("tray", "disabled"); } } - if (getConfig("additionalArguments") !== undefined) - app.commandLine.appendArgument(getConfig("additionalArguments")); + if (getConfig("additionalArguments") !== undefined) { + for (const arg of getConfig("additionalArguments").split(" ")) { + if (arg.startsWith("--")) { + const [key, val] = arg.substring(2).split("=", 1) as [string, string?]; + if (val === undefined) { + app.commandLine.appendSwitch(key); + } else { + if (key === "enable-features") { + val.split(",").forEach((flag) => enableFeatures.add(flag)); + } else if (key === "disable-features") { + val.split(",").forEach((flag) => disableFeatures.add(flag)); + } else if (key === "enable-blink-features") { + val.split(",").forEach((flag) => enableBlinkFeatures.add(flag)); + } else if (key === "disable-blink-features") { + val.split(",").forEach((flag) => disableBlinkFeatures.add(flag)); + } else { + app.commandLine.appendSwitch(key, val); + } + } + } + } + } if (getConfig("smoothScroll") === false) app.commandLine.appendSwitch("disable-smooth-scrolling"); - if (getConfig("autoScroll")) app.commandLine.appendSwitch("enable-blink-features", "MiddleClickAutoscroll"); + if (getConfig("autoScroll")) enableBlinkFeatures.add("MiddleClickAutoscroll"); if (getConfig("disableHttpCache")) app.commandLine.appendSwitch("disable-http-cache"); + enableFeatures.delete(""); + disableFeatures.delete(""); + enableBlinkFeatures.delete(""); + disableBlinkFeatures.delete(""); + if (enableFeatures.size > 0) app.commandLine.appendSwitch("enable-features", Array.from(enableFeatures).join(",")); + if (disableFeatures.size > 0) + app.commandLine.appendSwitch("disable-features", Array.from(disableFeatures).join(",")); + if (enableBlinkFeatures.size > 0) + app.commandLine.appendSwitch("enable-blink-features", Array.from(enableBlinkFeatures).join(",")); + if (disableBlinkFeatures.size > 0) + app.commandLine.appendSwitch("disable-blink-features", Array.from(disableBlinkFeatures).join(",")); + void app.whenReady().then(async () => { process.on("SIGINT", () => app.quit()); process.on("SIGTERM", () => app.quit()); From 2bccfe6e9af5cbcc78fc154bfe038810fd97da19 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Tue, 8 Apr 2025 19:04:27 +0200 Subject: [PATCH 616/844] fix: store and discover not loading --- src/discord/window.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/discord/window.ts b/src/discord/window.ts index 3e6cd00..9e165e0 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -169,12 +169,18 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { registerCustomHandler(); - passedWindow.webContents.session.webRequest.onBeforeRequest( - { - urls: ["https://*/api/v*/science", "https://sentry.io/*", "https://*.nel.cloudflare.com/*"], - }, - (_, callback) => callback({ cancel: true }), - ); + const blockedPatterns = [ + /https:\/\/.*\/api\/v\d+\/science/, + /https:\/\/sentry\.io\/.*/, + /https:\/\/.*\.nel\.cloudflare\.com\/.*/, + ]; + passedWindow.webContents.session.webRequest.onBeforeRequest((details, callback) => { + if (details.url.startsWith("ws://") || blockedPatterns.some((pattern) => pattern.test(details.url))) { + return callback({ cancel: true }); + } + return callback({}); + }); + // fix UMG video playback passedWindow.webContents.session.webRequest.onBeforeSendHeaders( { urls: ["https://www.youtube.com/embed/*"] }, From 4280257fc61a6113a397536700374026330241af Mon Sep 17 00:00:00 2001 From: Ven0m0 <82972344+Ven0m0@users.noreply.github.com> Date: Thu, 10 Apr 2025 11:51:07 +0200 Subject: [PATCH 617/844] Update README.md (#887) skip-ci --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index b45a9b3..6e2f21f 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,10 @@ Legcord is also available in [Pi-Apps](https://github.com/Botspot/pi-apps). - We utilize the official web app and package it within Electron. While this approach may seem familiar, our focus is on delivering a truly customized and enhanced experience. Unlike many others, we provide seamless integration for loading themes and mods without the need for installers or injectors. You can easily enable transparency effects and adopt Windows' Fluent Design, offering a modern and sleek interface. Though it's fundamentally a web wrapper, we have implemented numerous optimizations and patches to ensure a smooth and tailored experience for you. +## Does Legcord have a portable mode for windows? + +- Yes it does! Simply add a folder called "legcord-data" in the folder where your legcord executable is located and start Legcord. Make sure to download the archive/zip file. + ## Where can I find the source code? - The source code is on [GitHub](https://github.com/Legcord/Legcord/). From a5e0c2e5ae7d2be97bf8407eb5d2bfc89671b5dd Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Mon, 21 Apr 2025 22:37:52 +0200 Subject: [PATCH 618/844] wip: macOS titlebar --- assets/app/css/winTitlebar.css | 120 ++++++++++++++++++++++++++++ src/discord/preload/newTitlebar.mts | 1 + 2 files changed, 121 insertions(+) diff --git a/assets/app/css/winTitlebar.css b/assets/app/css/winTitlebar.css index b98a38e..5103dc1 100644 --- a/assets/app/css/winTitlebar.css +++ b/assets/app/css/winTitlebar.css @@ -225,3 +225,123 @@ a[href="https://support.discord.com"] { background-color: var(--brand-experiment-600); transition: 0.1s ease; } + + +/* Legcord on macOS */ + +[legcord-platform="darwin"] .sidebar-1tnWFu { + border-top-left-radius: 0px !important; +} + +.platform-osx .wrapper_ef3116 { + margin-top: 0px !important; +} + +[legcord-platform="darwin"] #window-controls-container { + float: left; + width: 150px; + height: 40px; + display: block; + line-height: 45px; + left: 0; + transform: translate(-82px, 4px); +} + +[legcord-platform="darwin"] #window-controls-container:hover #minimize #minimize-icon, +[legcord-platform="darwin"] #window-controls-container:hover #maximize #maximize-icon, +[legcord-platform="darwin"] #window-controls-container:hover #quit #quit-icon { + display: list-item; +} + +[legcord-platform="darwin"][unFocused] #window-controls-container #minimize, +[legcord-platform="darwin"][unFocused] #window-controls-container #maximize, +[legcord-platform="darwin"][unFocused] #window-controls-container #quit { + background-color: #d6d6d5 !important; + pointer-events: none; + transition: background-color 0.1s ease-in; +} + +[legcord-platform="darwin"]:not([unFocused]) #window-controls-container #quit #quit-icon { + background-color: #79282b; + -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4yOTI4OSA2TDIuODE4MDEgMy41MjUxM0wzLjUyNTEyIDIuODE4MDJMNS45OTk5OSA1LjI5Mjg5TDguNDc0ODcgMi44MTgwMkw5LjE4MTk3IDMuNTI1MTNMNi43MDcxIDZMOS4xODE5NyA4LjQ3NDg3TDguNDc0ODcgOS4xODE5OEw1Ljk5OTk5IDYuNzA3MTFMMy41MjUxMiA5LjE4MTk4TDIuODE4MDEgOC40NzQ4N0w1LjI5Mjg5IDZaIiBmaWxsPSJyZ2JhKDEyOCwgNiwgMCwgMSkiLz48L3N2Zz4=") + no-repeat 50% 50%; + mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4yOTI4OSA2TDIuODE4MDEgMy41MjUxM0wzLjUyNTEyIDIuODE4MDJMNS45OTk5OSA1LjI5Mjg5TDguNDc0ODcgMi44MTgwMkw5LjE4MTk3IDMuNTI1MTNMNi43MDcxIDZMOS4xODE5NyA4LjQ3NDg3TDguNDc0ODcgOS4xODE5OEw1Ljk5OTk5IDYuNzA3MTFMMy41MjUxMiA5LjE4MTk4TDIuODE4MDEgOC40NzQ4N0w1LjI5Mjg5IDZaIiBmaWxsPSJyZ2JhKDEyOCwgNiwgMCwgMSkiLz48L3N2Zz4=") + no-repeat 50% 50%; + transform: translate(-0.3px, -9px); +} +[legcord-platform="darwin"]:not([unFocused]) #window-controls-container #minimize #minimize-icon { + background-color: #7d631b; + -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNS4zOTk5OUgyVjYuNTk5OTlIMTBWNS4zOTk5OVoiIGZpbGw9IiM5ODY4MDEiLz48L3N2Zz4=") + no-repeat 50% 50%; + mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNS4zOTk5OUgyVjYuNTk5OTlIMTBWNS4zOTk5OVoiIGZpbGw9IiM5ODY4MDEiLz48L3N2Zz4=") + no-repeat 50% 50%; + transform: translate(-0px, -9px); +} +[legcord-platform="darwin"]:not([unFocused]) #window-controls-container #maximize #maximize-icon { + background-color: #1d7525; + -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOC41ODgyMyA2Ljk5MDE1TDUuMDA5NzkgMy40MTE3QzQuODU1ODMgMy4yNTc3NCA0Ljk1ODYgMi45OTQyMiA1LjE3NjE0IDIuOTg1MTRMOC45MTA0MiAyLjgyOTMxQzkuMDU2NTggMi44MjMyMSA5LjE3NjczIDIuOTQzMzUgOS4xNzA2MyAzLjA4OTUyTDkuMDE0NzkgNi44MjM4QzkuMDA1NzEgNy4wNDEzNCA4Ljc0MjE5IDcuMTQ0MTEgOC41ODgyMyA2Ljk5MDE1WiIgZmlsbD0iIzEyNUUxRSIvPjxwYXRoIGQ9Ik0zLjQxMTc3IDUuMDA5ODJMNi45OTAyMSA4LjU4ODI3QzcuMTQ0MTcgOC43NDIyMyA3LjA0MTQgOS4wMDU3NSA2LjgyMzg2IDkuMDE0ODNMMy4wODk1OCA5LjE3MDY2QzIuOTQzNDIgOS4xNzY3NiAyLjgyMzI3IDkuMDU2NjEgMi44MjkzNyA4LjkxMDQ1TDIuOTg1MjEgNS4xNzYxN0MyLjk5NDI5IDQuOTU4NjMgMy4yNTc4MSA0Ljg1NTg2IDMuNDExNzcgNS4wMDk4MloiIGZpbGw9IiMxMjVFMUUiLz48L3N2Zz4=") + no-repeat 50% 50%; + mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOC41ODgyMyA2Ljk5MDE1TDUuMDA5NzkgMy40MTE3QzQuODU1ODMgMy4yNTc3NCA0Ljk1ODYgMi45OTQyMiA1LjE3NjE0IDIuOTg1MTRMOC45MTA0MiAyLjgyOTMxQzkuMDU2NTggMi44MjMyMSA5LjE3NjczIDIuOTQzMzUgOS4xNzA2MyAzLjA4OTUyTDkuMDE0NzkgNi44MjM4QzkuMDA1NzEgNy4wNDEzNCA4Ljc0MjE5IDcuMTQ0MTEgOC41ODgyMyA2Ljk5MDE1WiIgZmlsbD0iIzEyNUUxRSIvPjxwYXRoIGQ9Ik0zLjQxMTc3IDUuMDA5ODJMNi45OTAyMSA4LjU4ODI3QzcuMTQ0MTcgOC43NDIyMyA3LjA0MTQgOS4wMDU3NSA2LjgyMzg2IDkuMDE0ODNMMy4wODk1OCA5LjE3MDY2QzIuOTQzNDIgOS4xNzY3NiAyLjgyMzI3IDkuMDU2NjEgMi44MjkzNyA4LjkxMDQ1TDIuOTg1MjEgNS4xNzYxN0MyLjk5NDI5IDQuOTU4NjMgMy4yNTc4MSA0Ljg1NTg2IDMuNDExNzcgNS4wMDk4MloiIGZpbGw9IiMxMjVFMUUiLz48L3N2Zz4=") + no-repeat 50% 50%; + transform: translate(0.1px, -9px); +} + +[legcord-platform="darwin"] #window-controls-container #minimize { + background-color: #fac536; + transition: background-color 0.1s ease-in; + border: 1px solid #da9e10; + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; + transform: translateX(-21.5px); +} +[legcord-platform="darwin"] #window-controls-container #maximize { + background-color: #39ea49; + transition: background-color 0.1s ease-in; + border: 1px solid #13c11e; + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; + transform: translateX(21.5px); +} +[legcord-platform="darwin"] #window-controls-container #quit { + background-color: #f25056; + transition: background-color 0.1s ease-in; + border: 1px solid #d52735; + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} +[legcord-platform="darwin"] #window-controls-container:hover #maximize:active { + background-color: #13c11e; +} +[legcord-platform="darwin"] #window-controls-container:hover #minimize:active { + background-color: #da9e10; +} +[legcord-platform="darwin"] #window-controls-container:hover #quit:active { + background-color: #d52735; +} +[legcord-platform="darwin"] #window-controls-container #spacer, +[legcord-platform="darwin"] #window-controls-container #minimize, +[legcord-platform="darwin"] #window-controls-container #maximize, +[legcord-platform="darwin"] #window-controls-container #quit { + float: right; + height: 80%; + width: 13%; + text-align: center; + color: transparent; + cursor: default; +} + +[legcord-platform="darwin"] #window-controls-container #minimize-icon, +[legcord-platform="darwin"] #window-controls-container #maximize-icon, +[legcord-platform="darwin"] #window-controls-container #quit-icon { + display: none; +} + +[legcord-platform="darwin"] #window-controls-container #spacer { + display: none; +} diff --git a/src/discord/preload/newTitlebar.mts b/src/discord/preload/newTitlebar.mts index 495a38e..8a0586f 100644 --- a/src/discord/preload/newTitlebar.mts +++ b/src/discord/preload/newTitlebar.mts @@ -8,6 +8,7 @@ document.addEventListener("DOMContentLoaded", () => { switch (ipcRenderer.sendSync("getOS")) { case "darwin": document.body.setAttribute("class", "platform-osx"); + addStyle("legcord://assets/css/winTitlebar.css"); break; case "win32": document.body.setAttribute("class", "platform-win"); From c7963dddaf126124a4731d5dfa8d02aeab62f83b Mon Sep 17 00:00:00 2001 From: Poseidon <92352131+DoYouEvenSheesh@users.noreply.github.com> Date: Fri, 2 May 2025 16:29:53 +0530 Subject: [PATCH 619/844] add pacstall link and install commands (#893) --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6e2f21f..77346fa 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,11 @@ Not available yet. ### Debian, Ubuntu and Raspbian repository -Not available yet. +legcord-deb is available on [pacstall](https://pacstall.dev/packages/legcord-deb) +```sh +sudo bash -c "$(wget -q https://pacstall.dev/q/install -O -)" # Install pacstall if not installed +pacstall -I legcord-deb +``` ### Snap package From af4bcfae386543854be07651cab52b28f3df407f Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 4 May 2025 13:26:13 +0200 Subject: [PATCH 620/844] fix: macOS rebrand titlebar --- assets/app/css/winTitlebar.css | 5 +++++ src/discord/preload/newTitlebar.mts | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/assets/app/css/winTitlebar.css b/assets/app/css/winTitlebar.css index 5103dc1..7b7a852 100644 --- a/assets/app/css/winTitlebar.css +++ b/assets/app/css/winTitlebar.css @@ -345,3 +345,8 @@ a[href="https://support.discord.com"] { [legcord-platform="darwin"] #window-controls-container #spacer { display: none; } + +div[class*="bar__"][class*="hidden__"] { + pointer-events: unset !important; + visibility: unset !important; + } \ No newline at end of file diff --git a/src/discord/preload/newTitlebar.mts b/src/discord/preload/newTitlebar.mts index 8a0586f..4f5745d 100644 --- a/src/discord/preload/newTitlebar.mts +++ b/src/discord/preload/newTitlebar.mts @@ -7,7 +7,8 @@ document.addEventListener("DOMContentLoaded", () => { sleep(500); switch (ipcRenderer.sendSync("getOS")) { case "darwin": - document.body.setAttribute("class", "platform-osx"); + // breaks traffic lights with bar__ and hidden__ classes + // document.body.setAttribute("class", "platform-osx"); addStyle("legcord://assets/css/winTitlebar.css"); break; case "win32": From a5d259e3c1aa0e44bfb90056ace3109cff9ac612 Mon Sep 17 00:00:00 2001 From: Alyxia Sother Date: Sun, 4 May 2025 13:54:26 +0200 Subject: [PATCH 621/844] chore: formatting --- assets/app/css/winTitlebar.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/assets/app/css/winTitlebar.css b/assets/app/css/winTitlebar.css index 7b7a852..890a98b 100644 --- a/assets/app/css/winTitlebar.css +++ b/assets/app/css/winTitlebar.css @@ -226,7 +226,6 @@ a[href="https://support.discord.com"] { transition: 0.1s ease; } - /* Legcord on macOS */ [legcord-platform="darwin"] .sidebar-1tnWFu { @@ -349,4 +348,4 @@ a[href="https://support.discord.com"] { div[class*="bar__"][class*="hidden__"] { pointer-events: unset !important; visibility: unset !important; - } \ No newline at end of file +} From a329978945ee6d15a407f15786abc477cd7a852c Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 4 May 2025 13:57:35 +0200 Subject: [PATCH 622/844] feat: linux rebrand titlebar --- assets/app/css/winTitlebar.css | 149 +++++++++------------------------ 1 file changed, 39 insertions(+), 110 deletions(-) diff --git a/assets/app/css/winTitlebar.css b/assets/app/css/winTitlebar.css index 890a98b..6344ae3 100644 --- a/assets/app/css/winTitlebar.css +++ b/assets/app/css/winTitlebar.css @@ -1,7 +1,3 @@ -a[href="https://support.discord.com"] { - margin-right: 150px; -} - .titlebar { display: block; top: 0; @@ -33,55 +29,74 @@ a[href="https://support.discord.com"] { filter: invert(30%); } -/* Legcord on Windows */ -[legcord-platform="win32"] #window-controls-container { +/* Legcord on Windows and Linux */ + +[legcord-platform="win32"], +[legcord-platform="linux"] a[href="https://support.discord.com"] { + margin-right: 150px; +} + +[legcord-platform="win32"], +[legcord-platform="linux"] #window-controls-container { width: 142px; } -[legcord-platform="win32"] #window-controls-container #minimize:hover { +[legcord-platform="win32"], +[legcord-platform="linux"] #window-controls-container #minimize:hover { background-color: var(--background-modifier-hover); transition: 0.2s ease; } -[legcord-platform="win32"] #window-controls-container #maximize:hover { +[legcord-platform="win32"], +[legcord-platform="linux"] #window-controls-container #maximize:hover { background-color: var(--background-modifier-hover); transition: 0.2s ease; } -[legcord-platform="win32"] #window-controls-container #minimize:hover #minimize-icon { +[legcord-platform="win32"], +[legcord-platform="linux"] #window-controls-container #minimize:hover #minimize-icon { background-color: var(--interactive-hover); transition: 0.2s ease; } -[legcord-platform="win32"] #window-controls-container #maximize:hover #maximize-icon { +[legcord-platform="win32"], +[legcord-platform="linux"] #window-controls-container #maximize:hover #maximize-icon { background-color: var(--interactive-hover); transition: 0.2s ease; } -[legcord-platform="win32"] #window-controls-container #quit:hover { +[legcord-platform="win32"], +[legcord-platform="linux"] #window-controls-container #quit:hover { background-color: #e81123; transition: 0.2s ease; } -[legcord-platform="win32"] #window-controls-container #quit:hover #quit-icon { +[legcord-platform="win32"], +[legcord-platform="linux"] #window-controls-container #quit:hover #quit-icon { background-color: #ffffff; transition: 0.1s ease; } -[legcord-platform="win32"] #window-controls-container #minimize { +[legcord-platform="win32"], +[legcord-platform="linux"] #window-controls-container #minimize { background-color: transparent; transition: 0.1s ease; } -[legcord-platform="win32"] #window-controls-container #maximize { +[legcord-platform="win32"], +[legcord-platform="linux"] #window-controls-container #maximize { background-color: transparent; transition: 0.1s ease; } -[legcord-platform="win32"] #window-controls-container #quit { +[legcord-platform="win32"], +[legcord-platform="linux"] #window-controls-container #quit { background-color: transparent; transition: 0.1s ease; } -[legcord-platform="win32"] #window-controls-container #quit:active { +[legcord-platform="win32"], +[legcord-platform="linux"] #window-controls-container #quit:active { background-color: #f1707a; transition: 0.1s ease; } -[legcord-platform="win32"] #window-controls-container #quit:active #quit-icon { +[legcord-platform="win32"], +[legcord-platform="linux"] #window-controls-container #quit:active #quit-icon { background-color: #000000cc; transition: 0.1s ease; } -[legcord-platform="win32"] #window-controls-container #quit-icon { +[legcord-platform="win32"], +[legcord-platform="linux"] #window-controls-container #quit-icon { background-color: var(--interactive-normal); display: list-item; -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") @@ -89,7 +104,8 @@ a[href="https://support.discord.com"] { mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; } -[legcord-platform="win32"] #window-controls-container #minimize-icon { +[legcord-platform="win32"], +[legcord-platform="linux"] #window-controls-container #minimize-icon { background-color: var(--interactive-normal); display: list-item; -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") @@ -97,7 +113,8 @@ a[href="https://support.discord.com"] { mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; } -[legcord-platform="win32"] #window-controls-container #maximize-icon { +[legcord-platform="win32"], +[legcord-platform="linux"] #window-controls-container #maximize-icon { background-color: var(--interactive-normal); display: list-item; -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") @@ -106,7 +123,8 @@ a[href="https://support.discord.com"] { no-repeat 50% 50%; } -[legcord-platform="win32"][isMaximized] #window-controls-container #maximize-icon { +[legcord-platform="win32"], +[legcord-platform="linux"][isMaximized] #window-controls-container #maximize-icon { background-color: var(--interactive-normal); display: list-item; -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") @@ -137,95 +155,6 @@ a[href="https://support.discord.com"] { cursor: default; } -/* Legcord on Linux */ - -[legcord-platform="linux"] #window-controls-container { - line-height: 45px; - transform: translateY(-8px); -} -[legcord-platform="linux"] #window-controls-container #minimize:hover { - background-color: var(--background-modifier-hover); - transition: 0.2s ease; -} -[legcord-platform="linux"] #window-controls-container #maximize:hover { - background-color: var(--background-modifier-hover); - transition: 0.2s ease; -} -[legcord-platform="linux"] #window-controls-container #minimize:hover #minimize-icon { - background-color: var(--interactive-hover); - transition: 0.2s ease; -} -[legcord-platform="linux"] #window-controls-container #maximize:hover #maximize-icon { - background-color: var(--interactive-hover); - transition: 0.2s ease; -} -[legcord-platform="linux"] #window-controls-container #quit:hover { - background-color: var(--brand-experiment-560); - transition: 0.2s ease; -} -[legcord-platform="linux"] #window-controls-container #quit #quit-icon { - background-color: #ffffff; - display: list-item; - transition: 0.1s ease; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="linux"] #window-controls-container #minimize-icon { - background-color: var(--interactive-normal); - display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="linux"] #window-controls-container #maximize-icon { - background-color: var(--interactive-normal); - display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} - -[legcord-platform="linux"][isMaximized] #window-controls-container #maximize-icon { - background-color: var(--interactive-normal); - display: list-item; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='9' height='9'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='9' height='9'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="linux"] #window-controls-container #minimize { - background-color: transparent; - transition: 0.1s ease; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="linux"] #window-controls-container #maximize { - background-color: transparent; - transition: 0.1s ease; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="linux"] #window-controls-container #quit { - background-color: var(--brand-experiment); - transition: 0.1s ease; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="linux"] #window-controls-container #quit:active { - background-color: var(--brand-experiment-600); - transition: 0.1s ease; -} - /* Legcord on macOS */ [legcord-platform="darwin"] .sidebar-1tnWFu { From 30a305057de817aa28eaefc28a59946e7db77cf0 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 4 May 2025 14:02:07 +0200 Subject: [PATCH 623/844] fix: migrate rebrand windowStyle --- src/@types/settings.d.ts | 2 +- src/main.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/@types/settings.d.ts b/src/@types/settings.d.ts index e261d3a..b91ee29 100644 --- a/src/@types/settings.d.ts +++ b/src/@types/settings.d.ts @@ -31,7 +31,7 @@ export interface Settings { // Only used for external url warning dialog. ignoreProtocolWarning?: boolean; customIcon: string; - windowStyle: "default" | "native" | "overlay" | "transparent" | "legacy"; + windowStyle: "default" | "native" | "overlay" | "transparent" | "legacy" | "rebrand"; channel: "stable" | "ptb" | "canary"; transparency: "universal" | "modern" | "none"; audio: AudioSettings; diff --git a/src/main.ts b/src/main.ts index 73c7ac5..cab8f1a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -134,6 +134,7 @@ if (!app.requestSingleInstanceLock() && getConfig("multiInstance") === false) { if (getConfig("additionalArguments") === undefined) setConfig("additionalArguments", ""); if (getConfig("transparency") === undefined) setConfig("transparency", "none"); if (getConfig("windowStyle") === "transparent") setConfig("windowStyle", "default"); + if (getConfig("windowStyle") === "rebrand") setConfig("windowStyle", "default"); if (typeof getConfig("tray") === "boolean") { //@ts-expect-error if (getConfig("tray") === true) { From f1c484c70363c56ffafcff3c26e4694a100a36f6 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 4 May 2025 14:18:23 +0200 Subject: [PATCH 624/844] bump to electron v36 --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index c84fa66..152cc4f 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "@uwu/lune": "^1.5.1", "@uwu/shelter-defs": "^1.4.1", "babel-preset-solid": "^1.9.3", - "electron": "35.1.3", + "electron": "36.1.0", "electron-builder": "^26.0.12", "lucide-solid": "^0.475.0", "rolldown": "1.0.0-beta.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7130905..991182a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -71,8 +71,8 @@ importers: specifier: ^1.9.3 version: 1.9.3(@babel/core@7.26.7) electron: - specifier: 35.1.3 - version: 35.1.3 + specifier: 36.1.0 + version: 36.1.0 electron-builder: specifier: ^26.0.12 version: 26.0.12(electron-builder-squirrel-windows@25.1.8) @@ -1816,8 +1816,8 @@ packages: electron-updater@6.6.2: resolution: {integrity: sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==} - electron@35.1.3: - resolution: {integrity: sha512-z7zZtvoK40ynKmgZ5dfD5xhsAXHxNShWgx9vIpC/ZMawBB93sBTWU83gHrjSzAcY9n0Io1WJCyUt/UIQHzlDXA==} + electron@36.1.0: + resolution: {integrity: sha512-gnp3BnbKdGsVc7cm1qlEaZc8pJsR08mIs8H/yTo8gHEtFkGGJbDTVZOYNAfbQlL0aXh+ozv+CnyiNeDNkT1Upg==} engines: {node: '>= 12.20.55'} hasBin: true @@ -4962,7 +4962,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@35.1.3: + electron@36.1.0: dependencies: '@electron/get': 2.0.3 '@types/node': 22.10.1 From e165356c6f9ff5805ad6ad23cb18cb6bfeb1ec44 Mon Sep 17 00:00:00 2001 From: Patrick <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 4 May 2025 19:54:34 +0200 Subject: [PATCH 625/844] fix: broken titlebar on windows --- assets/app/css/baseTitlebar.css | 52 +++++++ assets/app/css/darwinTitlebar.css | 121 +++++++++++++++ assets/app/css/linuxTitlebar.css | 84 ++++++++++ assets/app/css/winTitlebar.css | 230 +++------------------------- src/discord/preload/newTitlebar.mts | 5 +- 5 files changed, 278 insertions(+), 214 deletions(-) create mode 100644 assets/app/css/baseTitlebar.css create mode 100644 assets/app/css/darwinTitlebar.css create mode 100644 assets/app/css/linuxTitlebar.css diff --git a/assets/app/css/baseTitlebar.css b/assets/app/css/baseTitlebar.css new file mode 100644 index 0000000..5667282 --- /dev/null +++ b/assets/app/css/baseTitlebar.css @@ -0,0 +1,52 @@ +.titlebar { + display: block; + top: 0; + left: 0; + right: 0; + flex-shrink: 0; + overflow: hidden; + zoom: 1; + box-sizing: border-box; + width: 100%; + clear: both; + height: 36px; + line-height: 30px; + -webkit-app-region: drag !important; + user-select: none; + background-color: var(--background-base-lowest); + -webkit-user-select: none; + position: fixed; + z-index: 99999; +} + +.window-title { + content: url("legcord://assets/Wordmark.png"); + height: 15px; + margin-left: initial; + transform: translate(9px, 9px); + float: left; + padding: 0; + filter: invert(30%); +} +#window-controls-container { + float: right; + display: flex; + height: 100%; + position: sticky; + right: 0; + top: 0; + z-index: 99999999; + line-height: 36px; + -webkit-app-region: no-drag; +} + +#window-controls-container #minimize, +#window-controls-container #maximize, +#window-controls-container #quit { + float: left; + height: 100%; + width: 33.3%; + text-align: center; + color: var(--interactive-normal); + cursor: default; +} diff --git a/assets/app/css/darwinTitlebar.css b/assets/app/css/darwinTitlebar.css new file mode 100644 index 0000000..396387a --- /dev/null +++ b/assets/app/css/darwinTitlebar.css @@ -0,0 +1,121 @@ +[legcord-platform="darwin"] .sidebar-1tnWFu { + border-top-left-radius: 0px !important; +} + +.platform-osx .wrapper_ef3116 { + margin-top: 0px !important; +} + +[legcord-platform="darwin"] #window-controls-container { + float: left; + width: 150px; + height: 40px; + display: block; + line-height: 45px; + left: 0; + transform: translate(-82px, 4px); +} + +[legcord-platform="darwin"] #window-controls-container:hover #minimize #minimize-icon, +[legcord-platform="darwin"] #window-controls-container:hover #maximize #maximize-icon, +[legcord-platform="darwin"] #window-controls-container:hover #quit #quit-icon { + display: list-item; +} + +[legcord-platform="darwin"][unFocused] #window-controls-container #minimize, +[legcord-platform="darwin"][unFocused] #window-controls-container #maximize, +[legcord-platform="darwin"][unFocused] #window-controls-container #quit { + background-color: #d6d6d5 !important; + pointer-events: none; + transition: background-color 0.1s ease-in; +} + +[legcord-platform="darwin"]:not([unFocused]) #window-controls-container #quit #quit-icon { + background-color: #79282b; + -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4yOTI4OSA2TDIuODE4MDEgMy41MjUxM0wzLjUyNTEyIDIuODE4MDJMNS45OTk5OSA1LjI5Mjg5TDguNDc0ODcgMi44MTgwMkw5LjE4MTk3IDMuNTI1MTNMNi43MDcxIDZMOS4xODE5NyA4LjQ3NDg3TDguNDc0ODcgOS4xODE5OEw1Ljk5OTk5IDYuNzA3MTFMMy41MjUxMiA5LjE4MTk4TDIuODE4MDEgOC40NzQ4N0w1LjI5Mjg5IDZaIiBmaWxsPSJyZ2JhKDEyOCwgNiwgMCwgMSkiLz48L3N2Zz4=") + no-repeat 50% 50%; + mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4yOTI4OSA2TDIuODE4MDEgMy41MjUxM0wzLjUyNTEyIDIuODE4MDJMNS45OTk5OSA1LjI5Mjg5TDguNDc0ODcgMi44MTgwMkw5LjE4MTk3IDMuNTI1MTNMNi43MDcxIDZMOS4xODE5NyA4LjQ3NDg3TDguNDc0ODcgOS4xODE5OEw1Ljk5OTk5IDYuNzA3MTFMMy41MjUxMiA5LjE4MTk4TDIuODE4MDEgOC40NzQ4N0w1LjI5Mjg5IDZaIiBmaWxsPSJyZ2JhKDEyOCwgNiwgMCwgMSkiLz48L3N2Zz4=") + no-repeat 50% 50%; + transform: translate(-0.3px, -9px); +} +[legcord-platform="darwin"]:not([unFocused]) #window-controls-container #minimize #minimize-icon { + background-color: #7d631b; + -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNS4zOTk5OUgyVjYuNTk5OTlIMTBWNS4zOTk5OVoiIGZpbGw9IiM5ODY4MDEiLz48L3N2Zz4=") + no-repeat 50% 50%; + mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNS4zOTk5OUgyVjYuNTk5OTlIMTBWNS4zOTk5OVoiIGZpbGw9IiM5ODY4MDEiLz48L3N2Zz4=") + no-repeat 50% 50%; + transform: translate(-0px, -9px); +} +[legcord-platform="darwin"]:not([unFocused]) #window-controls-container #maximize #maximize-icon { + background-color: #1d7525; + -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOC41ODgyMyA2Ljk5MDE1TDUuMDA5NzkgMy40MTE3QzQuODU1ODMgMy4yNTc3NCA0Ljk1ODYgMi45OTQyMiA1LjE3NjE0IDIuOTg1MTRMOC45MTA0MiAyLjgyOTMxQzkuMDU2NTggMi44MjMyMSA5LjE3NjczIDIuOTQzMzUgOS4xNzA2MyAzLjA4OTUyTDkuMDE0NzkgNi44MjM4QzkuMDA1NzEgNy4wNDEzNCA4Ljc0MjE5IDcuMTQ0MTEgOC41ODgyMyA2Ljk5MDE1WiIgZmlsbD0iIzEyNUUxRSIvPjxwYXRoIGQ9Ik0zLjQxMTc3IDUuMDA5ODJMNi45OTAyMSA4LjU4ODI3QzcuMTQ0MTcgOC43NDIyMyA3LjA0MTQgOS4wMDU3NSA2LjgyMzg2IDkuMDE0ODNMMy4wODk1OCA5LjE3MDY2QzIuOTQzNDIgOS4xNzY3NiAyLjgyMzI3IDkuMDU2NjEgMi44MjkzNyA4LjkxMDQ1TDIuOTg1MjEgNS4xNzYxN0MyLjk5NDI5IDQuOTU4NjMgMy4yNTc4MSA0Ljg1NTg2IDMuNDExNzcgNS4wMDk4MloiIGZpbGw9IiMxMjVFMUUiLz48L3N2Zz4=") + no-repeat 50% 50%; + mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOC41ODgyMyA2Ljk5MDE1TDUuMDA5NzkgMy40MTE3QzQuODU1ODMgMy4yNTc3NCA0Ljk1ODYgMi45OTQyMiA1LjE3NjE0IDIuOTg1MTRMOC45MTA0MiAyLjgyOTMxQzkuMDU2NTggMi44MjMyMSA5LjE3NjczIDIuOTQzMzUgOS4xNzA2MyAzLjA4OTUyTDkuMDE0NzkgNi44MjM4QzkuMDA1NzEgNy4wNDEzNCA4Ljc0MjE5IDcuMTQ0MTEgOC41ODgyMyA2Ljk5MDE1WiIgZmlsbD0iIzEyNUUxRSIvPjxwYXRoIGQ9Ik0zLjQxMTc3IDUuMDA5ODJMNi45OTAyMSA4LjU4ODI3QzcuMTQ0MTcgOC43NDIyMyA3LjA0MTQgOS4wMDU3NSA2LjgyMzg2IDkuMDE0ODNMMy4wODk1OCA5LjE3MDY2QzIuOTQzNDIgOS4xNzY3NiAyLjgyMzI3IDkuMDU2NjEgMi44MjkzNyA4LjkxMDQ1TDIuOTg1MjEgNS4xNzYxN0MyLjk5NDI5IDQuOTU4NjMgMy4yNTc4MSA0Ljg1NTg2IDMuNDExNzcgNS4wMDk4MloiIGZpbGw9IiMxMjVFMUUiLz48L3N2Zz4=") + no-repeat 50% 50%; + transform: translate(0.1px, -9px); +} + +[legcord-platform="darwin"] #window-controls-container #minimize { + background-color: #fac536; + transition: background-color 0.1s ease-in; + border: 1px solid #da9e10; + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; + transform: translateX(-21.5px); +} +[legcord-platform="darwin"] #window-controls-container #maximize { + background-color: #39ea49; + transition: background-color 0.1s ease-in; + border: 1px solid #13c11e; + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; + transform: translateX(21.5px); +} +[legcord-platform="darwin"] #window-controls-container #quit { + background-color: #f25056; + transition: background-color 0.1s ease-in; + border: 1px solid #d52735; + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} +[legcord-platform="darwin"] #window-controls-container:hover #maximize:active { + background-color: #13c11e; +} +[legcord-platform="darwin"] #window-controls-container:hover #minimize:active { + background-color: #da9e10; +} +[legcord-platform="darwin"] #window-controls-container:hover #quit:active { + background-color: #d52735; +} +[legcord-platform="darwin"] #window-controls-container #spacer, +[legcord-platform="darwin"] #window-controls-container #minimize, +[legcord-platform="darwin"] #window-controls-container #maximize, +[legcord-platform="darwin"] #window-controls-container #quit { + float: right; + height: 80%; + width: 13%; + text-align: center; + color: transparent; + cursor: default; +} + +[legcord-platform="darwin"] #window-controls-container #minimize-icon, +[legcord-platform="darwin"] #window-controls-container #maximize-icon, +[legcord-platform="darwin"] #window-controls-container #quit-icon { + display: none; +} + +[legcord-platform="darwin"] #window-controls-container #spacer { + display: none; +} + +div[class*="bar__"][class*="hidden__"] { + pointer-events: unset !important; + visibility: unset !important; +} diff --git a/assets/app/css/linuxTitlebar.css b/assets/app/css/linuxTitlebar.css new file mode 100644 index 0000000..1e2eaf8 --- /dev/null +++ b/assets/app/css/linuxTitlebar.css @@ -0,0 +1,84 @@ +[legcord-platform="linux"] a[href="https://support.discord.com"] { + margin-right: 150px; +} + +[legcord-platform="linux"] #window-controls-container { + width: 142px; +} +[legcord-platform="linux"] #window-controls-container #minimize:hover { + background-color: var(--background-modifier-hover); + transition: 0.2s ease; +} +[legcord-platform="linux"] #window-controls-container #maximize:hover { + background-color: var(--background-modifier-hover); + transition: 0.2s ease; +} +[legcord-platform="linux"] #window-controls-container #minimize:hover #minimize-icon { + background-color: var(--interactive-hover); + transition: 0.2s ease; +} +[legcord-platform="linux"] #window-controls-container #maximize:hover #maximize-icon { + background-color: var(--interactive-hover); + transition: 0.2s ease; +} +[legcord-platform="linux"] #window-controls-container #quit:hover { + background-color: #e81123; + transition: 0.2s ease; +} +[legcord-platform="linux"] #window-controls-container #quit:hover #quit-icon { + background-color: #ffffff; + transition: 0.1s ease; +} +[legcord-platform="linux"] #window-controls-container #minimize { + background-color: transparent; + transition: 0.1s ease; +} +[legcord-platform="linux"] #window-controls-container #maximize { + background-color: transparent; + transition: 0.1s ease; +} +[legcord-platform="linux"] #window-controls-container #quit { + background-color: transparent; + transition: 0.1s ease; +} +[legcord-platform="linux"] #window-controls-container #quit:active { + background-color: #f1707a; + transition: 0.1s ease; +} +[legcord-platform="linux"] #window-controls-container #quit:active #quit-icon { + background-color: #000000cc; + transition: 0.1s ease; +} +[legcord-platform="linux"] #window-controls-container #quit-icon { + background-color: var(--interactive-normal); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} +[legcord-platform="linux"] #window-controls-container #minimize-icon { + background-color: var(--interactive-normal); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} +[legcord-platform="linux"] #window-controls-container #maximize-icon { + background-color: var(--interactive-normal); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} + +[legcord-platform="linux"][isMaximized] #window-controls-container #maximize-icon { + background-color: var(--interactive-normal); + display: list-item; + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") + no-repeat 50% 50%; +} diff --git a/assets/app/css/winTitlebar.css b/assets/app/css/winTitlebar.css index 6344ae3..99ab9cf 100644 --- a/assets/app/css/winTitlebar.css +++ b/assets/app/css/winTitlebar.css @@ -1,102 +1,57 @@ -.titlebar { - display: block; - top: 0; - left: 0; - right: 0; - flex-shrink: 0; - overflow: hidden; - zoom: 1; - box-sizing: border-box; - width: 100%; - clear: both; - height: 36px; - line-height: 30px; - -webkit-app-region: drag !important; - user-select: none; - background-color: var(--background-base-lowest); - -webkit-user-select: none; - position: fixed; - z-index: 99999; -} +/* Legcord on Windows */ -.window-title { - content: url("legcord://assets/Wordmark.png"); - height: 15px; - margin-left: initial; - transform: translate(9px, 9px); - float: left; - padding: 0; - filter: invert(30%); -} - -/* Legcord on Windows and Linux */ - -[legcord-platform="win32"], -[legcord-platform="linux"] a[href="https://support.discord.com"] { +[legcord-platform="win32"] a[href="https://support.discord.com"] { margin-right: 150px; } -[legcord-platform="win32"], -[legcord-platform="linux"] #window-controls-container { +[legcord-platform="win32"] #window-controls-container { width: 142px; } -[legcord-platform="win32"], -[legcord-platform="linux"] #window-controls-container #minimize:hover { +[legcord-platform="win32"] #window-controls-container #minimize:hover { background-color: var(--background-modifier-hover); transition: 0.2s ease; } -[legcord-platform="win32"], -[legcord-platform="linux"] #window-controls-container #maximize:hover { +[legcord-platform="win32"] #window-controls-container #maximize:hover { background-color: var(--background-modifier-hover); transition: 0.2s ease; } -[legcord-platform="win32"], -[legcord-platform="linux"] #window-controls-container #minimize:hover #minimize-icon { +[legcord-platform="win32"] #window-controls-container #minimize:hover #minimize-icon { background-color: var(--interactive-hover); transition: 0.2s ease; } -[legcord-platform="win32"], -[legcord-platform="linux"] #window-controls-container #maximize:hover #maximize-icon { +[legcord-platform="win32"] #window-controls-container #maximize:hover #maximize-icon { background-color: var(--interactive-hover); transition: 0.2s ease; } -[legcord-platform="win32"], -[legcord-platform="linux"] #window-controls-container #quit:hover { +[legcord-platform="win32"] #window-controls-container #quit:hover { background-color: #e81123; transition: 0.2s ease; } -[legcord-platform="win32"], -[legcord-platform="linux"] #window-controls-container #quit:hover #quit-icon { +[legcord-platform="win32"] #window-controls-container #quit:hover #quit-icon { background-color: #ffffff; transition: 0.1s ease; } -[legcord-platform="win32"], -[legcord-platform="linux"] #window-controls-container #minimize { +[legcord-platform="win32"] #window-controls-container #minimize { background-color: transparent; transition: 0.1s ease; } -[legcord-platform="win32"], -[legcord-platform="linux"] #window-controls-container #maximize { +[legcord-platform="win32"] #window-controls-container #maximize { background-color: transparent; transition: 0.1s ease; } -[legcord-platform="win32"], -[legcord-platform="linux"] #window-controls-container #quit { +[legcord-platform="win32"] #window-controls-container #quit { background-color: transparent; transition: 0.1s ease; } -[legcord-platform="win32"], -[legcord-platform="linux"] #window-controls-container #quit:active { +[legcord-platform="win32"] #window-controls-container #quit:active { background-color: #f1707a; transition: 0.1s ease; } -[legcord-platform="win32"], -[legcord-platform="linux"] #window-controls-container #quit:active #quit-icon { +[legcord-platform="win32"] #window-controls-container #quit:active #quit-icon { background-color: #000000cc; transition: 0.1s ease; } -[legcord-platform="win32"], -[legcord-platform="linux"] #window-controls-container #quit-icon { +[legcord-platform="win32"] #window-controls-container #quit-icon { background-color: var(--interactive-normal); display: list-item; -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") @@ -104,8 +59,7 @@ mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; } -[legcord-platform="win32"], -[legcord-platform="linux"] #window-controls-container #minimize-icon { +[legcord-platform="win32"] #window-controls-container #minimize-icon { background-color: var(--interactive-normal); display: list-item; -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") @@ -113,8 +67,7 @@ mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") no-repeat 50% 50%; } -[legcord-platform="win32"], -[legcord-platform="linux"] #window-controls-container #maximize-icon { +[legcord-platform="win32"] #window-controls-container #maximize-icon { background-color: var(--interactive-normal); display: list-item; -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") @@ -123,8 +76,7 @@ no-repeat 50% 50%; } -[legcord-platform="win32"], -[legcord-platform="linux"][isMaximized] #window-controls-container #maximize-icon { +[legcord-platform="win32"][isMaximized] #window-controls-container #maximize-icon { background-color: var(--interactive-normal); display: list-item; -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") @@ -132,149 +84,3 @@ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") no-repeat 50% 50%; } -#window-controls-container { - float: right; - display: flex; - height: 100%; - position: sticky; - right: 0; - top: 0; - z-index: 99999999; - line-height: 36px; - -webkit-app-region: no-drag; -} - -#window-controls-container #minimize, -#window-controls-container #maximize, -#window-controls-container #quit { - float: left; - height: 100%; - width: 33.3%; - text-align: center; - color: var(--interactive-normal); - cursor: default; -} - -/* Legcord on macOS */ - -[legcord-platform="darwin"] .sidebar-1tnWFu { - border-top-left-radius: 0px !important; -} - -.platform-osx .wrapper_ef3116 { - margin-top: 0px !important; -} - -[legcord-platform="darwin"] #window-controls-container { - float: left; - width: 150px; - height: 40px; - display: block; - line-height: 45px; - left: 0; - transform: translate(-82px, 4px); -} - -[legcord-platform="darwin"] #window-controls-container:hover #minimize #minimize-icon, -[legcord-platform="darwin"] #window-controls-container:hover #maximize #maximize-icon, -[legcord-platform="darwin"] #window-controls-container:hover #quit #quit-icon { - display: list-item; -} - -[legcord-platform="darwin"][unFocused] #window-controls-container #minimize, -[legcord-platform="darwin"][unFocused] #window-controls-container #maximize, -[legcord-platform="darwin"][unFocused] #window-controls-container #quit { - background-color: #d6d6d5 !important; - pointer-events: none; - transition: background-color 0.1s ease-in; -} - -[legcord-platform="darwin"]:not([unFocused]) #window-controls-container #quit #quit-icon { - background-color: #79282b; - -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4yOTI4OSA2TDIuODE4MDEgMy41MjUxM0wzLjUyNTEyIDIuODE4MDJMNS45OTk5OSA1LjI5Mjg5TDguNDc0ODcgMi44MTgwMkw5LjE4MTk3IDMuNTI1MTNMNi43MDcxIDZMOS4xODE5NyA4LjQ3NDg3TDguNDc0ODcgOS4xODE5OEw1Ljk5OTk5IDYuNzA3MTFMMy41MjUxMiA5LjE4MTk4TDIuODE4MDEgOC40NzQ4N0w1LjI5Mjg5IDZaIiBmaWxsPSJyZ2JhKDEyOCwgNiwgMCwgMSkiLz48L3N2Zz4=") - no-repeat 50% 50%; - mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4yOTI4OSA2TDIuODE4MDEgMy41MjUxM0wzLjUyNTEyIDIuODE4MDJMNS45OTk5OSA1LjI5Mjg5TDguNDc0ODcgMi44MTgwMkw5LjE4MTk3IDMuNTI1MTNMNi43MDcxIDZMOS4xODE5NyA4LjQ3NDg3TDguNDc0ODcgOS4xODE5OEw1Ljk5OTk5IDYuNzA3MTFMMy41MjUxMiA5LjE4MTk4TDIuODE4MDEgOC40NzQ4N0w1LjI5Mjg5IDZaIiBmaWxsPSJyZ2JhKDEyOCwgNiwgMCwgMSkiLz48L3N2Zz4=") - no-repeat 50% 50%; - transform: translate(-0.3px, -9px); -} -[legcord-platform="darwin"]:not([unFocused]) #window-controls-container #minimize #minimize-icon { - background-color: #7d631b; - -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNS4zOTk5OUgyVjYuNTk5OTlIMTBWNS4zOTk5OVoiIGZpbGw9IiM5ODY4MDEiLz48L3N2Zz4=") - no-repeat 50% 50%; - mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNS4zOTk5OUgyVjYuNTk5OTlIMTBWNS4zOTk5OVoiIGZpbGw9IiM5ODY4MDEiLz48L3N2Zz4=") - no-repeat 50% 50%; - transform: translate(-0px, -9px); -} -[legcord-platform="darwin"]:not([unFocused]) #window-controls-container #maximize #maximize-icon { - background-color: #1d7525; - -webkit-mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOC41ODgyMyA2Ljk5MDE1TDUuMDA5NzkgMy40MTE3QzQuODU1ODMgMy4yNTc3NCA0Ljk1ODYgMi45OTQyMiA1LjE3NjE0IDIuOTg1MTRMOC45MTA0MiAyLjgyOTMxQzkuMDU2NTggMi44MjMyMSA5LjE3NjczIDIuOTQzMzUgOS4xNzA2MyAzLjA4OTUyTDkuMDE0NzkgNi44MjM4QzkuMDA1NzEgNy4wNDEzNCA4Ljc0MjE5IDcuMTQ0MTEgOC41ODgyMyA2Ljk5MDE1WiIgZmlsbD0iIzEyNUUxRSIvPjxwYXRoIGQ9Ik0zLjQxMTc3IDUuMDA5ODJMNi45OTAyMSA4LjU4ODI3QzcuMTQ0MTcgOC43NDIyMyA3LjA0MTQgOS4wMDU3NSA2LjgyMzg2IDkuMDE0ODNMMy4wODk1OCA5LjE3MDY2QzIuOTQzNDIgOS4xNzY3NiAyLjgyMzI3IDkuMDU2NjEgMi44MjkzNyA4LjkxMDQ1TDIuOTg1MjEgNS4xNzYxN0MyLjk5NDI5IDQuOTU4NjMgMy4yNTc4MSA0Ljg1NTg2IDMuNDExNzcgNS4wMDk4MloiIGZpbGw9IiMxMjVFMUUiLz48L3N2Zz4=") - no-repeat 50% 50%; - mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOC41ODgyMyA2Ljk5MDE1TDUuMDA5NzkgMy40MTE3QzQuODU1ODMgMy4yNTc3NCA0Ljk1ODYgMi45OTQyMiA1LjE3NjE0IDIuOTg1MTRMOC45MTA0MiAyLjgyOTMxQzkuMDU2NTggMi44MjMyMSA5LjE3NjczIDIuOTQzMzUgOS4xNzA2MyAzLjA4OTUyTDkuMDE0NzkgNi44MjM4QzkuMDA1NzEgNy4wNDEzNCA4Ljc0MjE5IDcuMTQ0MTEgOC41ODgyMyA2Ljk5MDE1WiIgZmlsbD0iIzEyNUUxRSIvPjxwYXRoIGQ9Ik0zLjQxMTc3IDUuMDA5ODJMNi45OTAyMSA4LjU4ODI3QzcuMTQ0MTcgOC43NDIyMyA3LjA0MTQgOS4wMDU3NSA2LjgyMzg2IDkuMDE0ODNMMy4wODk1OCA5LjE3MDY2QzIuOTQzNDIgOS4xNzY3NiAyLjgyMzI3IDkuMDU2NjEgMi44MjkzNyA4LjkxMDQ1TDIuOTg1MjEgNS4xNzYxN0MyLjk5NDI5IDQuOTU4NjMgMy4yNTc4MSA0Ljg1NTg2IDMuNDExNzcgNS4wMDk4MloiIGZpbGw9IiMxMjVFMUUiLz48L3N2Zz4=") - no-repeat 50% 50%; - transform: translate(0.1px, -9px); -} - -[legcord-platform="darwin"] #window-controls-container #minimize { - background-color: #fac536; - transition: background-color 0.1s ease-in; - border: 1px solid #da9e10; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - transform: translateX(-21.5px); -} -[legcord-platform="darwin"] #window-controls-container #maximize { - background-color: #39ea49; - transition: background-color 0.1s ease-in; - border: 1px solid #13c11e; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - transform: translateX(21.5px); -} -[legcord-platform="darwin"] #window-controls-container #quit { - background-color: #f25056; - transition: background-color 0.1s ease-in; - border: 1px solid #d52735; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") - no-repeat 50% 50%; -} -[legcord-platform="darwin"] #window-controls-container:hover #maximize:active { - background-color: #13c11e; -} -[legcord-platform="darwin"] #window-controls-container:hover #minimize:active { - background-color: #da9e10; -} -[legcord-platform="darwin"] #window-controls-container:hover #quit:active { - background-color: #d52735; -} -[legcord-platform="darwin"] #window-controls-container #spacer, -[legcord-platform="darwin"] #window-controls-container #minimize, -[legcord-platform="darwin"] #window-controls-container #maximize, -[legcord-platform="darwin"] #window-controls-container #quit { - float: right; - height: 80%; - width: 13%; - text-align: center; - color: transparent; - cursor: default; -} - -[legcord-platform="darwin"] #window-controls-container #minimize-icon, -[legcord-platform="darwin"] #window-controls-container #maximize-icon, -[legcord-platform="darwin"] #window-controls-container #quit-icon { - display: none; -} - -[legcord-platform="darwin"] #window-controls-container #spacer { - display: none; -} - -div[class*="bar__"][class*="hidden__"] { - pointer-events: unset !important; - visibility: unset !important; -} diff --git a/src/discord/preload/newTitlebar.mts b/src/discord/preload/newTitlebar.mts index 4f5745d..59b1433 100644 --- a/src/discord/preload/newTitlebar.mts +++ b/src/discord/preload/newTitlebar.mts @@ -4,12 +4,13 @@ import { sleep } from "../../common/sleep.js"; document.addEventListener("DOMContentLoaded", () => { document.body.setAttribute("legcord-platform", ipcRenderer.sendSync("getOS")); + addStyle("legcord://assets/css/baseTitlebar.css"); sleep(500); switch (ipcRenderer.sendSync("getOS")) { case "darwin": // breaks traffic lights with bar__ and hidden__ classes // document.body.setAttribute("class", "platform-osx"); - addStyle("legcord://assets/css/winTitlebar.css"); + addStyle("legcord://assets/css/darwinTitlebar.css"); break; case "win32": document.body.setAttribute("class", "platform-win"); @@ -17,7 +18,7 @@ document.addEventListener("DOMContentLoaded", () => { break; case "linux": document.body.setAttribute("class", "platform-linux"); - addStyle("legcord://assets/css/winTitlebar.css"); + addStyle("legcord://assets/css/linuxTitlebar.css"); break; default: break; From 77e2ccafb221936a99654c237cb385d486780bc7 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 4 May 2025 20:16:36 +0200 Subject: [PATCH 626/844] 1.1.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 152cc4f..c78369c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "legcord", - "version": "1.1.2", + "version": "1.1.3", "description": "Legcord is a custom client designed to enhance your Discord experience while keeping everything lightweight.", "main": "ts-out/main.js", "engines": { From d973796b141b61a2bb8a6bd28f447c8c9aea3520 Mon Sep 17 00:00:00 2001 From: Zachary Lowery Date: Sat, 17 May 2025 02:31:04 -0400 Subject: [PATCH 627/844] fix: better selector for version injecting + bypassSetup flag (#917) --- src/common/config.ts | 4 ++++ src/discord/preload/patches.mts | 6 ++++++ src/main.ts | 22 ++++++++++++++++++---- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/common/config.ts b/src/common/config.ts index c547234..c1d74d1 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -179,3 +179,7 @@ export function setup(): void { ...defaults, }); } + +export function setFirstRun(value: boolean): void { + firstRun = value; +} diff --git a/src/discord/preload/patches.mts b/src/discord/preload/patches.mts index 7f6afbb..a58e771 100644 --- a/src/discord/preload/patches.mts +++ b/src/discord/preload/patches.mts @@ -68,6 +68,12 @@ async function load() { if (!host || host.querySelector("#ac-ver")) { return; } + + const discordVersionInfoPattern = /(stable|ptb|canary) \d+|Electron|Chromium/i; + if (!discordVersionInfoPattern.test(host.textContent || "")) { + return; + } + const el = host.firstElementChild!.cloneNode() as HTMLSpanElement; el.id = "ac-ver"; el.textContent = `Legcord Version: ${version}`; diff --git a/src/main.ts b/src/main.ts index cab8f1a..45e4573 100644 --- a/src/main.ts +++ b/src/main.ts @@ -12,6 +12,8 @@ import { getConfig, getConfigLocation, setConfig, + setFirstRun, + setup, } from "./common/config.js"; import "./updater.js"; import { getPreset } from "./common/flags.js"; @@ -21,6 +23,7 @@ import { createWindow } from "./discord/window.js"; import { createSetupWindow } from "./setup/main.js"; import { createSplashWindow } from "./splash/main.js"; export let settings: Settings; +export let bypassSetup = false; checkForDataFolder(); checkIfConfigExists(); @@ -30,6 +33,16 @@ app.on("render-process-gone", (_event, _webContents, details) => { } }); function args(): void { + // check for bypass-setup flag + if (process.argv.includes("--bypass-setup")) { + console.log("Bypassing setup and generating default config..."); + setup(); // default settings + setConfig("doneSetup", true); + setFirstRun(false); + bypassSetup = true; + return; + } + let argNum = 2; if (process.argv[0] === "electron") argNum++; const args = process.argv[argNum]; @@ -44,14 +57,15 @@ function args(): void { } } export async function init(): Promise { - if (firstRun === true || undefined) { - setLang(new Intl.DateTimeFormat().resolvedOptions().locale); - await createSetupWindow(); - } else { + // Skip setup if bypass flag was used + if (bypassSetup || !(firstRun === true || undefined)) { if (getConfig("skipSplash") === false) { void createSplashWindow(); // NOTE - Awaiting will hang at start } createWindow(); + } else { + setLang(new Intl.DateTimeFormat().resolvedOptions().locale); + await createSetupWindow(); } } args(); From 822f14e41ce04f7590ee982e07735084c28a5915 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 18 May 2025 21:18:06 +0200 Subject: [PATCH 628/844] feat: move to shelter rpc plugin --- assets/app/js/rpc.js | 64 ---------------------------- src/discord/preload/mods/shelter.mts | 2 +- src/discord/preload/patches.mts | 1 - src/shelter/rpc/index.js | 28 +++++------- 4 files changed, 12 insertions(+), 83 deletions(-) delete mode 100644 assets/app/js/rpc.js diff --git a/assets/app/js/rpc.js b/assets/app/js/rpc.js deleted file mode 100644 index b132ad9..0000000 --- a/assets/app/js/rpc.js +++ /dev/null @@ -1,64 +0,0 @@ -(() => { - let lookupAsset, - lookupApp, - apps = {}; - console.log("Starting RPC Bridge"); - LegcordRPC.listen(async (msg) => { - console.log("RPC Bridge", msg); - try { - let wpRequire; - window.webpackChunkdiscord_app.push([[Symbol()], {}, x => wpRequire = x]); - window.webpackChunkdiscord_app.pop(); - - const modules = wpRequire.c; - - const factories = wpRequire.m; - for (const id in factories) { - if (factories[id].toString().includes('getAssetImage: size must === [number, number] for Twitch')) { - const mod = wpRequire(id); - - // fetchAssetIds - const _lookupAsset = Object.values(mod).find(e => typeof e === 'function' && e.toString().includes('APPLICATION_ASSETS_FETCH_SUCCESS')); - if (_lookupAsset) lookupAsset = async (appId, name) => (await _lookupAsset(appId, [name, undefined]))[0]; - } - - if (lookupAsset) break; - } - - for (const id in factories) { - if (factories[id].toString().includes('APPLICATION_RPC(')) { - const mod = wpRequire(id); - - // fetchApplicationsRPC - const _lookupApp = Object.values(mod).find(e => { - if (typeof e !== 'function') return; - const str = e.toString(); - return str.includes(',coverImage:') && str.includes('INVALID_ORIGIN'); - }); - if (_lookupApp) lookupApp = async appId => { - let socket = {}; - await _lookupApp(socket, appId); - return socket.application; - }; - } - - if (lookupApp) break; - } - - if (msg.activity?.assets?.large_image) msg.activity.assets.large_image = await lookupAsset(msg.activity.application_id, msg.activity.assets.large_image); - if (msg.activity?.assets?.small_image) msg.activity.assets.small_image = await lookupAsset(msg.activity.application_id, msg.activity.assets.small_image); - - if (msg.activity) { - const appId = msg.activity.application_id; - if (!apps[appId]) apps[appId] = await lookupApp(appId); - - const app = apps[appId]; - if (!msg.activity.name) msg.activity.name = app.name; - } - } catch (e) { - console.error(e); - } - - shelter.flux.dispatcher.dispatch({ type: 'LOCAL_ACTIVITY_UPDATE', ...msg }); // set RPC status - }); -})(); \ No newline at end of file diff --git a/src/discord/preload/mods/shelter.mts b/src/discord/preload/mods/shelter.mts index 213f3ec..6b00dc1 100644 --- a/src/discord/preload/mods/shelter.mts +++ b/src/discord/preload/mods/shelter.mts @@ -2,7 +2,7 @@ const { ipcRenderer, webFrame } = require("electron"); import type { ModBundle } from "../../../@types/ModBundle.js"; const requiredPlugins: Record }]> = { - // "legcord-arrpc": "legcord://plugins/rpc/", + "legcord-arrpc": ["legcord://plugins/rpc/", { isVisible: false, allowedActions: {} }], "legcord-settings": ["legcord://plugins/settings/", { isVisible: false, allowedActions: {} }], "legcord-power": ["legcord://plugins/power/", { isVisible: false, allowedActions: {} }], "legcord-screenshare": ["legcord://plugins/screenshare/", { isVisible: false, allowedActions: {} }], diff --git a/src/discord/preload/patches.mts b/src/discord/preload/patches.mts index a58e771..a604611 100644 --- a/src/discord/preload/patches.mts +++ b/src/discord/preload/patches.mts @@ -59,7 +59,6 @@ async function load() { if (ipcRenderer.sendSync("getConfig", "disableAutogain")) { injectJS("legcord://assets/js/disableAutogain.js"); } - injectJS("legcord://assets/js/rpc.js"); addStyle("legcord://assets/css/discord.css"); }); // Settings info version injection diff --git a/src/shelter/rpc/index.js b/src/shelter/rpc/index.js index 7f473c8..56f31c9 100644 --- a/src/shelter/rpc/index.js +++ b/src/shelter/rpc/index.js @@ -30,32 +30,26 @@ const fetchAssetId = async (applicationId, assetName) => { const resource = assetCache[applicationId].find((item) => item.name === assetName); return resource ? resource.id : null; }; -// https://images-ext-1.discordapp.net/external/1u9jSonO6pasZ41RA1LGqSbTysKHHF0MzoL0YDeTJg0/https/lh3.googleusercontent.com/fhDgRO0LrPPo9CDqsLQlxR3CVZc8xPmSi9Ja8DKAS5zhoWsZKdj2scyWqBUU2t4DHxK1xcbWKY2Q7cpj%3Dw544-h544-l90-rj?format=webp&width=300&height=300 + export function onLoad() { LegcordRPC.listen(async (msg) => { - if (msg.activity?.assets?.large_image.startsWith("https://")) { - msg.activity.assets.large_image = `https://images-ext-1.discordapp.net/external/${msg.activity.assets.large_image.replace("https://", "https/")}?format=webp&width=300&height=300`; - } else { - if (msg.activity?.assets?.large_image) - msg.activity.assets.large_image = await fetchAssetId( - msg.activity.application_id, - msg.activity.assets.large_image, - ); - if (msg.activity?.assets?.small_image) - msg.activity.assets.small_image = await fetchAssetId( - msg.activity.application_id, - msg.activity.assets.small_image, - ); - } + if (msg.activity?.assets?.large_image) + msg.activity.assets.large_image = await fetchAssetId( + msg.activity.application_id, + msg.activity.assets.large_image, + ); + if (msg.activity?.assets?.small_image) + msg.activity.assets.small_image = await fetchAssetId( + msg.activity.application_id, + msg.activity.assets.small_image, + ); if (msg.activity) { - // TODO - Support games from DB too lool const appId = msg.activity.application_id; if (!apps[appId]) apps[appId] = (await ApplicationStore.getApplication(appId)) || "Unknown"; const app = apps[appId]; if (!msg.activity.name) msg.activity.name = app.name; } - console.warn(msg); FluxDispatcher.dispatch({ type: "LOCAL_ACTIVITY_UPDATE", ...msg }); // set RPC status }); } From 8e22b911afd4480333d903deb77d64824e0b36a3 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 18 May 2025 21:22:30 +0200 Subject: [PATCH 629/844] fix: enable websocket on main discord window --- package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- src/discord/window.ts | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index c78369c..4f52ea5 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "@uwu/lune": "^1.5.1", "@uwu/shelter-defs": "^1.4.1", "babel-preset-solid": "^1.9.3", - "electron": "36.1.0", + "electron": "36.2.1", "electron-builder": "^26.0.12", "lucide-solid": "^0.475.0", "rolldown": "1.0.0-beta.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 991182a..ec187aa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: arrpc: specifier: https://github.com/Legcord/arrpc.git - version: https://codeload.github.com/Legcord/arrpc/tar.gz/acfb7e8b61c442e089c522653f8fdcb1c3989eb0 + version: https://codeload.github.com/Legcord/arrpc/tar.gz/3275152dfe7d3d4f7ae41cbca01257deba15a446 electron-context-menu: specifier: ^4.0.4 version: 4.0.4 @@ -71,8 +71,8 @@ importers: specifier: ^1.9.3 version: 1.9.3(@babel/core@7.26.7) electron: - specifier: 36.1.0 - version: 36.1.0 + specifier: 36.2.1 + version: 36.2.1 electron-builder: specifier: ^26.0.12 version: 26.0.12(electron-builder-squirrel-windows@25.1.8) @@ -1443,8 +1443,8 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/acfb7e8b61c442e089c522653f8fdcb1c3989eb0: - resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/acfb7e8b61c442e089c522653f8fdcb1c3989eb0} + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/3275152dfe7d3d4f7ae41cbca01257deba15a446: + resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/3275152dfe7d3d4f7ae41cbca01257deba15a446} version: 3.5.0 hasBin: true @@ -1816,8 +1816,8 @@ packages: electron-updater@6.6.2: resolution: {integrity: sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==} - electron@36.1.0: - resolution: {integrity: sha512-gnp3BnbKdGsVc7cm1qlEaZc8pJsR08mIs8H/yTo8gHEtFkGGJbDTVZOYNAfbQlL0aXh+ozv+CnyiNeDNkT1Upg==} + electron@36.2.1: + resolution: {integrity: sha512-mm1Y+Ms46xcOTA69h8hpqfX392HfV4lga9aEkYkd/Syx1JBStvcACOIouCgGrnZpxNZPVS1jM8NTcMkNjuK6BQ==} engines: {node: '>= 12.20.55'} hasBin: true @@ -4455,7 +4455,7 @@ snapshots: array-union@2.1.0: {} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/acfb7e8b61c442e089c522653f8fdcb1c3989eb0: + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/3275152dfe7d3d4f7ae41cbca01257deba15a446: dependencies: ws: 8.18.0 transitivePeerDependencies: @@ -4962,7 +4962,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@36.1.0: + electron@36.2.1: dependencies: '@electron/get': 2.0.3 '@types/node': 22.10.1 diff --git a/src/discord/window.ts b/src/discord/window.ts index 9e165e0..39fcb27 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -175,7 +175,7 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { /https:\/\/.*\.nel\.cloudflare\.com\/.*/, ]; passedWindow.webContents.session.webRequest.onBeforeRequest((details, callback) => { - if (details.url.startsWith("ws://") || blockedPatterns.some((pattern) => pattern.test(details.url))) { + if (blockedPatterns.some((pattern) => pattern.test(details.url))) { return callback({ cancel: true }); } return callback({}); From 024d38bcb342458258b41445fa741ac447fef89a Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 18 May 2025 21:23:33 +0200 Subject: [PATCH 630/844] chore: update arRPC --- package.json | 2 +- pnpm-lock.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4f52ea5..215cc66 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "typescript": "^5.7.2" }, "dependencies": { - "arrpc": "https://github.com/Legcord/arrpc.git", + "arrpc": "https://github.com/Legcord/arrpc.git#3275152dfe7d3d4f7ae41cbca01257deba15a446", "electron-context-menu": "^4.0.4", "electron-is-dev": "^3.0.1", "electron-updater": "^6.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec187aa..dd93760 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ importers: .: dependencies: arrpc: - specifier: https://github.com/Legcord/arrpc.git + specifier: https://github.com/Legcord/arrpc.git#3275152dfe7d3d4f7ae41cbca01257deba15a446 version: https://codeload.github.com/Legcord/arrpc/tar.gz/3275152dfe7d3d4f7ae41cbca01257deba15a446 electron-context-menu: specifier: ^4.0.4 From 9b5506a23e0b51271136c56b6a4e4579a455d143 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 18 May 2025 21:24:47 +0200 Subject: [PATCH 631/844] fix: add GTK flag on linux --- src/main.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.ts b/src/main.ts index 45e4573..e78b401 100644 --- a/src/main.ts +++ b/src/main.ts @@ -97,6 +97,7 @@ if (!app.requestSingleInstanceLock() && getConfig("multiInstance") === false) { crashReporter.start({ uploadToServer: false }); // enable pulseaudio audio sharing on linux if (process.platform === "linux") { + app.commandLine.appendSwitch("gtk-version", "3"); enableFeatures.add("PulseaudioLoopbackForScreenShare"); disableFeatures.add("WebRtcAllowInputVolumeAdjustment"); app.commandLine.appendSwitch("enable-speech-dispatcher"); From 5f3208bab231b67ee7019f875e7dc1be116c0731 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 18 May 2025 21:35:44 +0200 Subject: [PATCH 632/844] fix: download buttons appearing --- assets/app/css/discord.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/app/css/discord.css b/assets/app/css/discord.css index 4e3bf63..1712677 100644 --- a/assets/app/css/discord.css +++ b/assets/app/css/discord.css @@ -10,7 +10,7 @@ color: var(--text-muted); } -div:has(:has(:has([data-list-item-id="guildsnav___app-download-button"]))) { +div[class^="listItem__"]:has([data-list-item-id="guildsnav___app-download-button"]) { display: none !important; } From a0f771e899f36d4af3305307e9ede0988d34e731 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 18 May 2025 21:38:18 +0200 Subject: [PATCH 633/844] chore: bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 215cc66..1c3b71b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "legcord", - "version": "1.1.3", + "version": "1.1.4", "description": "Legcord is a custom client designed to enhance your Discord experience while keeping everything lightweight.", "main": "ts-out/main.js", "engines": { From 088920e8f06241e8ffd8005a3f6c1e753ea00879 Mon Sep 17 00:00:00 2001 From: imide Date: Sun, 18 May 2025 13:42:11 -0600 Subject: [PATCH 634/844] Appstream metadata for later flatpak builds (#912) --- .github/workflows/meta.yml | 47 ++++++++ electron-builder.ts | 6 +- meta/app.legcord.Legcord.metainfo.xml | 165 ++++++++++++++++++++++++++ package.json | 8 +- pnpm-lock.yaml | 25 +++- pnpm-workspace.yaml | 5 + scripts/build/sandboxFix.js | 74 ++++++++++++ scripts/utils/updateMeta.mts | 93 +++++++++++++++ 8 files changed, 411 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/meta.yml create mode 100644 meta/app.legcord.Legcord.metainfo.xml create mode 100644 pnpm-workspace.yaml create mode 100644 scripts/build/sandboxFix.js create mode 100644 scripts/utils/updateMeta.mts diff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml new file mode 100644 index 0000000..5ad73c6 --- /dev/null +++ b/.github/workflows/meta.yml @@ -0,0 +1,47 @@ +name: Update metainfo on release + +on: + release: + types: + - published + workflow_dispatch: + +permissions: + contents: write + +jobs: + update: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.ETOKEN }} + + - name: Prepare PNPM + uses: pnpm/action-setup@v4 + + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version-file: package.json + cache: pnpm + + - name: Install dependencies + run: pnpm i + + - name: Update metainfo + run: pnpm updateMeta + + - name: Commit and merge in changes + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + gh release upload "${{ github.event.release.tag_name }}" meta/app.legcord.Legcord.metainfo.xml + + git add meta/app.legcord.Legcord.metainfo.xml + git commit -m "metainfo: add entry for ${{ github.event.release.tag_name }}" + git push origin main + env: + GITHUB_TOKEN: ${{ secrets.ETOKEN }} diff --git a/electron-builder.ts b/electron-builder.ts index 0180234..1f43b3b 100644 --- a/electron-builder.ts +++ b/electron-builder.ts @@ -4,6 +4,7 @@ export const config: Configuration = { appId: "app.legcord.Legcord", productName: "Legcord", artifactName: "Legcord-${version}-${os}-${arch}.${ext}", + beforePack: "./scripts/build/sandboxFix.js", mac: { category: "public.app-category.social-networking", @@ -62,11 +63,6 @@ export const config: Configuration = { electronDownload: { cache: ".cache", }, - - flatpak: { - baseVersion: "24.08", - runtimeVersion: "24.08", - }, }; export default config; diff --git a/meta/app.legcord.Legcord.metainfo.xml b/meta/app.legcord.Legcord.metainfo.xml new file mode 100644 index 0000000..cef4ee5 --- /dev/null +++ b/meta/app.legcord.Legcord.metainfo.xml @@ -0,0 +1,165 @@ + + + + app.legcord.Legcord + Legcord + Legcord is a custom client designed to enhance your Discord experience while keeping everything lightweight. + + Legcord Contributors + + CC0-1.0 + OSL-3.0 + Legcord + +

    Legcord is a custom client designed to enhance your Discord experience while keeping everything lightweight.

    +

    Legcord comes bundled with Shelter, Vencord, Equicord and Venmic.

    +
    + + + Legcord settings page on MacOS + https://github.com/Legcord/Legcord/blob/77e2ccafb221936a99654c237cb385d486780bc7/assets/screenshots/settings.png + + + Legcord settings open with Shelter configs + https://github.com/Legcord/Legcord/blob/77e2ccafb221936a99654c237cb385d486780bc7/assets/screenshots/shelter.png + + + Legcord settings open with custom keybind settings shown + https://github.com/Legcord/Legcord/blob/77e2ccafb221936a99654c237cb385d486780bc7/assets/screenshots/keybinds.png + + + + + https://github.com/Legcord/Legcord/releases/tag/v1.1.3 + +

    Improvements & Fixes

    +
      +
    • 🔧 **Fixed the app showing a blank screen on some platforms**.
    • +
    +

    Special Thanks ❤️

    +
    +
    + + https://github.com/Legcord/Legcord/releases/tag/v1.1.2 + +

    Improvements & Fixes

    +
      +
    • 🌈 **Full Discord rebrand support - proper styling of custom/overlay titlebars**
    • +
    • 🚀 **Improved how Blink feature flags are set — now done only once for better reliability.**.
    • +
    +

    New Contributors 👋

    +

    Special Thanks ❤️

    +
    +
    + + https://github.com/Legcord/Legcord/releases/tag/v1.1.1 + +

    Improvements & Fixes

    +
      +
    • 🛠️ **arRPC now runs in a separate process**, resolving #808
    • +
    • 🌈 **Added modern macOS transparency support**.
    • +
    • 🚀 **Upgraded Electron**, fixing #839
    • +
    • 📦 Moved tsx to devDependencies #835
    • +
    • 🎛️ Fixed traffic lights not being centered in "overlay" mode #860
    • +
    • 📖 Added MacPorts installation instructions to the README #834
    • +
    +

    New Contributors 👋

    +
      +
    • @akierig - #834
    • +
    • @fabricionaweb - #835
    • +
    • @nihaals - #860
    • +
    +

    Special Thanks ❤️

    +
    +
    + + https://github.com/Legcord/Legcord/releases/tag/v1.1.0 + +
      +
    • **Theme Manager v2:**
    • +
    • **Screenshare v3 (rewrite of the rewrite):**
    • +
    • **macOS Touch Bar integration:**
    • +
    • **New built-in Quick CSS Editor**
    • +
    • **New first-time setup by @FlintSH**
    • +
    • **New power management features**
    • +
    • **New settings:**
    • +
    • **Rewritten preload to be sandboxed**
    • +
    +
    +
    + + https://github.com/Legcord/Legcord/releases/tag/v1.0.8 + + + + https://github.com/Legcord/Legcord/releases/tag/v1.0.7 + + + + https://github.com/Legcord/Legcord/releases/tag/v1.0.6 + + + + https://github.com/Legcord/Legcord/releases/tag/v1.0.5 + + + + https://github.com/Legcord/Legcord/releases/tag/v1.0.4 + + + + https://github.com/Legcord/Legcord/releases/tag/v1.0.3 + + + + https://github.com/Legcord/Legcord/releases/tag/v1.0.2 + + + + https://github.com/Legcord/Legcord/releases/tag/devbuild + + + + https://github.com/Legcord/Legcord/releases/tag/v1.0.0 + + +
    + https://legcord.app + https://github.com/Legcord/Legcord/issues + https://legcord.app/faq + https://github.com/sponsors/smartfrigde + https://discord.com/invite/TnhxcqynZ2 + https://github.com/Legcord/Legcord + + InstantMessaging + Network + + + pointing + keyboard + 420 + always + + + voice + 760 + 1200 + + + moderate + mild + intense + intense + intense + intense + + app.legcord.Legcord.desktop + + Discord + Vencord + Privacy + Mod + Legcord + Equicord + +
    diff --git a/package.json b/package.json index 1c3b71b..8d47297 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "lint": "biome check", "lint:fix": "biome check --write", "postinstall": "electron-builder install-app-deps", - "CIbuild": "pnpm run build && electron-builder --linux zip && electron-builder --windows zip && electron-builder --macos zip" + "CIbuild": "pnpm run build && electron-builder --linux zip && electron-builder --windows zip && electron-builder --macos zip", + "updateMeta": "tsx scripts/utils/updateMeta.mts" }, "repository": { "type": "git", @@ -56,7 +57,8 @@ "solid-js": "^1.9.3", "solid-motionone": "^1.0.3", "tsx": "^4.19.2", - "typescript": "^5.7.2" + "typescript": "^5.7.2", + "xml-formatter": "^3.6.6" }, "dependencies": { "arrpc": "https://github.com/Legcord/arrpc.git#3275152dfe7d3d4f7ae41cbca01257deba15a446", @@ -68,6 +70,6 @@ "optionalDependencies": { "@vencord/venmic": "^6.1.0" }, - "packageManager": "pnpm@10.0.0-beta.1+sha512.629de0531b9ae9a3f8e372d014ef8f5a57906d9a48095ced54bbfbd246b4136381478032c8d13819fd1eedde8330517a799ea6756eedd9a136e36524fa3083cf", + "packageManager": "pnpm@10.11.0", "package-manager-strict": false } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dd93760..dba042b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,10 +23,6 @@ importers: ws: specifier: ^8.18.0 version: 8.18.0 - optionalDependencies: - '@vencord/venmic': - specifier: ^6.1.0 - version: 6.1.0 devDependencies: '@babel/preset-flow': specifier: ^7.25.9 @@ -103,6 +99,13 @@ importers: typescript: specifier: ^5.7.2 version: 5.7.2 + xml-formatter: + specifier: ^3.6.6 + version: 3.6.6 + optionalDependencies: + '@vencord/venmic': + specifier: ^6.1.0 + version: 6.1.0 packages: @@ -3142,6 +3145,14 @@ packages: utf-8-validate: optional: true + xml-formatter@3.6.6: + resolution: {integrity: sha512-yfofQht42x2sN1YThT6Er6GFXiQinfDAsMTNvMPi2uZw5/Vtc2PYHfvALR8U+b2oN2ekBxLd2tGWV06rAM8nQA==} + engines: {node: '>= 16'} + + xml-parser-xo@4.1.4: + resolution: {integrity: sha512-wo+yWDNeMwd1ctzH4CsiGXaAappDsxuR+VnmPewOzHk/zvefksT2ZlcWpAePl11THOWgnIZM4GjvumevurNWZw==} + engines: {node: '>= 16'} + xmlbuilder@15.1.1: resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} engines: {node: '>=8.0'} @@ -6383,6 +6394,12 @@ snapshots: ws@8.18.0: {} + xml-formatter@3.6.6: + dependencies: + xml-parser-xo: 4.1.4 + + xml-parser-xo@4.1.4: {} + xmlbuilder@15.1.1: {} y18n@5.0.8: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..1a6e4ef --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,5 @@ +onlyBuiltDependencies: + - '@biomejs/biome' + - '@parcel/watcher' + - electron + - esbuild diff --git a/scripts/build/sandboxFix.js b/scripts/build/sandboxFix.js new file mode 100644 index 0000000..b0a4c40 --- /dev/null +++ b/scripts/build/sandboxFix.js @@ -0,0 +1,74 @@ +/* + * Vesktop, a desktop app aiming to give you a snappier Discord Experience + * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +// Based on https://github.com/gergof/electron-builder-sandbox-fix/blob/master/lib/index.js + +import { join } from "node:path"; +import { chmod, cp, rename, rm, writeFile } from "node:fs/promises"; +let isApplied = false; + +const hook = async () => { + if (isApplied) return; + isApplied = true; + if (process.platform !== "linux") { + // this fix is only required on linux + return; + } + const AppImageTarget = require("app-builder-lib/out/targets/AppImageTarget"); + const oldBuildMethod = AppImageTarget.default.prototype.build; + AppImageTarget.default.prototype.build = async function (...args) { + console.log("Running AppImage builder hook", args); + const oldPath = args[0]; + const newPath = `${oldPath}-appimage-sandbox-fix`; + // just in case + try { + await rm(newPath, { + recursive: true, + }); + } catch { } + + console.log("Copying to apply appimage fix", oldPath, newPath); + await cp(oldPath, newPath, { + recursive: true, + }); + args[0] = newPath; + + const executable = join(newPath, this.packager.executableName); + + const loaderScript = ` +#!/usr/bin/env bash + +SCRIPT_DIR="$( cd "$( dirname "\${BASH_SOURCE[0]}" )" && pwd )" +IS_STEAMOS=0 + +if [[ "$SteamOS" == "1" && "$SteamGamepadUI" == "1" ]]; then + echo "Running Legcord on SteamOS, disabling sandbox" + IS_STEAMOS=1 +fi + +exec "$SCRIPT_DIR/${this.packager.executableName}.bin" "$([ "$IS_STEAMOS" == 1 ] && echo '--no-sandbox')" "$@" + `.trim(); + + try { + await rename(executable, `${executable}.bin`); + await writeFile(executable, loaderScript); + await chmod(executable, 0o755); + } catch (e) { + console.error(`failed to create loder for sandbox fix: ${e.message}`); + throw new Error("Failed to create loader for sandbox fix"); + } + + const ret = await oldBuildMethod.apply(this, args); + + await rm(newPath, { + recursive: true, + }); + + return ret; + }; +}; + +export default hook; diff --git a/scripts/utils/updateMeta.mts b/scripts/utils/updateMeta.mts new file mode 100644 index 0000000..788dfd8 --- /dev/null +++ b/scripts/utils/updateMeta.mts @@ -0,0 +1,93 @@ +/* + * Vesktop, a desktop app aiming to give you a snappier Discord Experience + * Copyright (c) 2023 Vendicated and Vencord contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { promises as fs } from "node:fs"; + +import { DOMParser, XMLSerializer } from "@xmldom/xmldom"; +import xmlFormat from "xml-formatter"; + +function generateDescription(description: string, descriptionNode: Element) { + const lines = description.replace(/\r/g, "").split("\n"); + let currentList: Element | null = null; + + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + + if (line.includes("New Contributors")) { + // we're done, don't parse any more since the new contributors section is the last one + break; + } + + if (line.startsWith("## ")) { + const pNode = descriptionNode.ownerDocument.createElement("p"); + pNode.textContent = line.slice(3); + descriptionNode.appendChild(pNode); + } else if (line.startsWith("* ")) { + const liNode = descriptionNode.ownerDocument.createElement("li"); + liNode.textContent = line.slice(2).split("in https://github.com")[0].trim(); // don't include links to github + + if (!currentList) { + currentList = descriptionNode.ownerDocument.createElement("ul"); + } + + currentList.appendChild(liNode); + } + + if (currentList && !lines[i + 1].startsWith("* ")) { + descriptionNode.appendChild(currentList); + currentList = null; + } + } +} + +const latestReleaseInformation = await fetch("https://api.github.com/repos/Legcord/Legcord/releases/latest", { + headers: { + Accept: "application/vnd.github+json", + "X-Github-Api-Version": "2022-11-28", + }, +}).then((res) => res.json()); + +const metaInfo = await fs.readFile("./meta/app.legcord.Legcord.metainfo.xml", "utf-8"); + +const parser = new DOMParser().parseFromString(metaInfo, "text/xml"); + +const releaseList = parser.getElementsByTagName("releases")[0]; + +for (let i = 0; i < releaseList.childNodes.length; i++) { + const release = releaseList.childNodes[i] as Element; + + if (release.nodeType === 1 && release.getAttribute("version") === latestReleaseInformation.name) { + console.log("Latest release already added, nothing to be done"); + process.exit(0); + } +} + +const release = parser.createElement("release"); +release.setAttribute("version", latestReleaseInformation.name); +release.setAttribute("date", latestReleaseInformation.published_at.split("T")[0]); +release.setAttribute("type", "stable"); + +const releaseUrl = parser.createElement("url"); +releaseUrl.textContent = latestReleaseInformation.html_url; + +release.appendChild(releaseUrl); + +const description = parser.createElement("description"); + +// we're not using a full markdown parser here since we don't have a lot of formatting options to begin with +generateDescription(latestReleaseInformation.body, description); + +release.appendChild(description); + +releaseList.insertBefore(release, releaseList.childNodes[0]); + +const output = xmlFormat(new XMLSerializer().serializeToString(parser), { + lineSeparator: "\n", + collapseContent: true, + indentation: " ", +}); + +await fs.writeFile("./meta/app.legcord.Legcord.metainfo.xml", output, "utf-8"); From 9894218dedcce694b5f6757d987bfba03f0298a8 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 18 May 2025 21:43:34 +0200 Subject: [PATCH 635/844] chore: lint --- scripts/build/sandboxFix.js | 80 ++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/scripts/build/sandboxFix.js b/scripts/build/sandboxFix.js index b0a4c40..53d1773 100644 --- a/scripts/build/sandboxFix.js +++ b/scripts/build/sandboxFix.js @@ -6,39 +6,39 @@ // Based on https://github.com/gergof/electron-builder-sandbox-fix/blob/master/lib/index.js -import { join } from "node:path"; import { chmod, cp, rename, rm, writeFile } from "node:fs/promises"; +import { join } from "node:path"; let isApplied = false; const hook = async () => { - if (isApplied) return; - isApplied = true; - if (process.platform !== "linux") { - // this fix is only required on linux - return; - } - const AppImageTarget = require("app-builder-lib/out/targets/AppImageTarget"); - const oldBuildMethod = AppImageTarget.default.prototype.build; - AppImageTarget.default.prototype.build = async function (...args) { - console.log("Running AppImage builder hook", args); - const oldPath = args[0]; - const newPath = `${oldPath}-appimage-sandbox-fix`; - // just in case - try { - await rm(newPath, { - recursive: true, - }); - } catch { } + if (isApplied) return; + isApplied = true; + if (process.platform !== "linux") { + // this fix is only required on linux + return; + } + const AppImageTarget = require("app-builder-lib/out/targets/AppImageTarget"); + const oldBuildMethod = AppImageTarget.default.prototype.build; + AppImageTarget.default.prototype.build = async function (...args) { + console.log("Running AppImage builder hook", args); + const oldPath = args[0]; + const newPath = `${oldPath}-appimage-sandbox-fix`; + // just in case + try { + await rm(newPath, { + recursive: true, + }); + } catch {} - console.log("Copying to apply appimage fix", oldPath, newPath); - await cp(oldPath, newPath, { - recursive: true, - }); - args[0] = newPath; + console.log("Copying to apply appimage fix", oldPath, newPath); + await cp(oldPath, newPath, { + recursive: true, + }); + args[0] = newPath; - const executable = join(newPath, this.packager.executableName); + const executable = join(newPath, this.packager.executableName); - const loaderScript = ` + const loaderScript = ` #!/usr/bin/env bash SCRIPT_DIR="$( cd "$( dirname "\${BASH_SOURCE[0]}" )" && pwd )" @@ -52,23 +52,23 @@ fi exec "$SCRIPT_DIR/${this.packager.executableName}.bin" "$([ "$IS_STEAMOS" == 1 ] && echo '--no-sandbox')" "$@" `.trim(); - try { - await rename(executable, `${executable}.bin`); - await writeFile(executable, loaderScript); - await chmod(executable, 0o755); - } catch (e) { - console.error(`failed to create loder for sandbox fix: ${e.message}`); - throw new Error("Failed to create loader for sandbox fix"); - } + try { + await rename(executable, `${executable}.bin`); + await writeFile(executable, loaderScript); + await chmod(executable, 0o755); + } catch (e) { + console.error(`failed to create loder for sandbox fix: ${e.message}`); + throw new Error("Failed to create loader for sandbox fix"); + } - const ret = await oldBuildMethod.apply(this, args); + const ret = await oldBuildMethod.apply(this, args); - await rm(newPath, { - recursive: true, - }); + await rm(newPath, { + recursive: true, + }); - return ret; - }; + return ret; + }; }; export default hook; From b4d0abce4f35ab7ecfad62d5e1b1025eddf944b2 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 18 May 2025 22:09:15 +0200 Subject: [PATCH 636/844] fix: use import() --- scripts/build/sandboxFix.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build/sandboxFix.js b/scripts/build/sandboxFix.js index 53d1773..ae46bc0 100644 --- a/scripts/build/sandboxFix.js +++ b/scripts/build/sandboxFix.js @@ -17,7 +17,7 @@ const hook = async () => { // this fix is only required on linux return; } - const AppImageTarget = require("app-builder-lib/out/targets/AppImageTarget"); + const AppImageTarget = import("app-builder-lib/out/targets/AppImageTarget"); const oldBuildMethod = AppImageTarget.default.prototype.build; AppImageTarget.default.prototype.build = async function (...args) { console.log("Running AppImage builder hook", args); From f5894a734d0f23826e987f45fdf35490e3da955a Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 18 May 2025 22:13:34 +0200 Subject: [PATCH 637/844] fix: correct import path --- scripts/build/sandboxFix.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build/sandboxFix.js b/scripts/build/sandboxFix.js index ae46bc0..902ff08 100644 --- a/scripts/build/sandboxFix.js +++ b/scripts/build/sandboxFix.js @@ -17,7 +17,7 @@ const hook = async () => { // this fix is only required on linux return; } - const AppImageTarget = import("app-builder-lib/out/targets/AppImageTarget"); + const AppImageTarget = import("app-builder-lib/out/targets/AppImageTarget.js"); const oldBuildMethod = AppImageTarget.default.prototype.build; AppImageTarget.default.prototype.build = async function (...args) { console.log("Running AppImage builder hook", args); From 6c9e7c2385c840670a87dd13200169a61ca7cf2b Mon Sep 17 00:00:00 2001 From: imide Date: Mon, 19 May 2025 11:12:43 -0600 Subject: [PATCH 638/844] fix: sandboxFix error (maybe) (#918) --- pnpm-workspace.yaml | 1 + scripts/build/sandboxFix.js | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1a6e4ef..227d42b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ onlyBuiltDependencies: - '@biomejs/biome' - '@parcel/watcher' + - '@vencord/venmic' - electron - esbuild diff --git a/scripts/build/sandboxFix.js b/scripts/build/sandboxFix.js index 902ff08..802a4b9 100644 --- a/scripts/build/sandboxFix.js +++ b/scripts/build/sandboxFix.js @@ -18,8 +18,9 @@ const hook = async () => { return; } const AppImageTarget = import("app-builder-lib/out/targets/AppImageTarget.js"); - const oldBuildMethod = AppImageTarget.default.prototype.build; - AppImageTarget.default.prototype.build = async function (...args) { + const AppImageTargetClass = (await AppImageTarget).default; + const oldBuildMethod = AppImageTargetClass.prototype.build; + AppImageTargetClass.prototype.build = async function (...args) { console.log("Running AppImage builder hook", args); const oldPath = args[0]; const newPath = `${oldPath}-appimage-sandbox-fix`; From a54e083632574214e968431214f5e7ad784f313e Mon Sep 17 00:00:00 2001 From: imide Date: Mon, 19 May 2025 14:39:09 -0600 Subject: [PATCH 639/844] fix: convert sandboxFix back to cjs (#920) --- electron-builder.ts | 2 +- .../build/{sandboxFix.js => sandboxFix.cjs} | 27 +++++++++---------- 2 files changed, 14 insertions(+), 15 deletions(-) rename scripts/build/{sandboxFix.js => sandboxFix.cjs} (69%) diff --git a/electron-builder.ts b/electron-builder.ts index 1f43b3b..6e51afa 100644 --- a/electron-builder.ts +++ b/electron-builder.ts @@ -4,7 +4,7 @@ export const config: Configuration = { appId: "app.legcord.Legcord", productName: "Legcord", artifactName: "Legcord-${version}-${os}-${arch}.${ext}", - beforePack: "./scripts/build/sandboxFix.js", + beforePack: "./scripts/build/sandboxFix.cjs", mac: { category: "public.app-category.social-networking", diff --git a/scripts/build/sandboxFix.js b/scripts/build/sandboxFix.cjs similarity index 69% rename from scripts/build/sandboxFix.js rename to scripts/build/sandboxFix.cjs index 802a4b9..bf118fd 100644 --- a/scripts/build/sandboxFix.js +++ b/scripts/build/sandboxFix.cjs @@ -6,8 +6,8 @@ // Based on https://github.com/gergof/electron-builder-sandbox-fix/blob/master/lib/index.js -import { chmod, cp, rename, rm, writeFile } from "node:fs/promises"; -import { join } from "node:path"; +const fs = require("node:fs/promises"); +const path = require("node:path"); let isApplied = false; const hook = async () => { @@ -17,27 +17,26 @@ const hook = async () => { // this fix is only required on linux return; } - const AppImageTarget = import("app-builder-lib/out/targets/AppImageTarget.js"); - const AppImageTargetClass = (await AppImageTarget).default; - const oldBuildMethod = AppImageTargetClass.prototype.build; - AppImageTargetClass.prototype.build = async function (...args) { + const AppImageTarget = require("app-builder-lib/out/targets/AppImageTarget.js"); + const oldBuildMethod = AppImageTarget.default.prototype.build; + AppImageTarget.default.prototype.build = async function (...args) { console.log("Running AppImage builder hook", args); const oldPath = args[0]; const newPath = `${oldPath}-appimage-sandbox-fix`; // just in case try { - await rm(newPath, { + await fs.rm(newPath, { recursive: true, }); } catch {} console.log("Copying to apply appimage fix", oldPath, newPath); - await cp(oldPath, newPath, { + await fs.cp(oldPath, newPath, { recursive: true, }); args[0] = newPath; - const executable = join(newPath, this.packager.executableName); + const executable = path.join(newPath, this.packager.executableName); const loaderScript = ` #!/usr/bin/env bash @@ -54,9 +53,9 @@ exec "$SCRIPT_DIR/${this.packager.executableName}.bin" "$([ "$IS_STEAMOS" == 1 ] `.trim(); try { - await rename(executable, `${executable}.bin`); - await writeFile(executable, loaderScript); - await chmod(executable, 0o755); + await fs.rename(executable, `${executable}.bin`); + await fs.writeFile(executable, loaderScript); + await fs.chmod(executable, 0o755); } catch (e) { console.error(`failed to create loder for sandbox fix: ${e.message}`); throw new Error("Failed to create loader for sandbox fix"); @@ -64,7 +63,7 @@ exec "$SCRIPT_DIR/${this.packager.executableName}.bin" "$([ "$IS_STEAMOS" == 1 ] const ret = await oldBuildMethod.apply(this, args); - await rm(newPath, { + await fs.rm(newPath, { recursive: true, }); @@ -72,4 +71,4 @@ exec "$SCRIPT_DIR/${this.packager.executableName}.bin" "$([ "$IS_STEAMOS" == 1 ] }; }; -export default hook; +module.exports = hook; From 8fc35a3b13f4dd64ffef7cc89221db61d36c8c78 Mon Sep 17 00:00:00 2001 From: imide Date: Sat, 24 May 2025 11:03:24 -0600 Subject: [PATCH 640/844] fix: update meta.yml (#921) --- .github/workflows/meta.yml | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml index 5ad73c6..fe657e5 100644 --- a/.github/workflows/meta.yml +++ b/.github/workflows/meta.yml @@ -12,20 +12,18 @@ permissions: jobs: update: runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} steps: - uses: actions/checkout@v4 - with: - token: ${{ secrets.ETOKEN }} + - uses: pnpm/action-setup@v4 # Install pnpm using packageManager key in package.json - - name: Prepare PNPM - uses: pnpm/action-setup@v4 - - - name: Use Node.js + - name: Use Node.js 22 uses: actions/setup-node@v4 with: - node-version-file: package.json - cache: pnpm + node-version-file: package.json + cache: pnpm - name: Install dependencies run: pnpm i @@ -36,12 +34,12 @@ jobs: - name: Commit and merge in changes run: | git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" gh release upload "${{ github.event.release.tag_name }}" meta/app.legcord.Legcord.metainfo.xml git add meta/app.legcord.Legcord.metainfo.xml git commit -m "metainfo: add entry for ${{ github.event.release.tag_name }}" - git push origin main + git push env: - GITHUB_TOKEN: ${{ secrets.ETOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From b3c2d43081b00ff8371223cba1121be85de354c7 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Mon, 26 May 2025 18:54:07 +0200 Subject: [PATCH 641/844] feat: rewrite RPC --- src/shelter/rpc/asset.ts | 57 ++++++++++++++++++++++++++++++++++++++++ src/shelter/rpc/index.js | 55 -------------------------------------- src/shelter/rpc/index.ts | 39 +++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 55 deletions(-) create mode 100644 src/shelter/rpc/asset.ts delete mode 100644 src/shelter/rpc/index.js create mode 100644 src/shelter/rpc/index.ts diff --git a/src/shelter/rpc/asset.ts b/src/shelter/rpc/asset.ts new file mode 100644 index 0000000..05eb9b3 --- /dev/null +++ b/src/shelter/rpc/asset.ts @@ -0,0 +1,57 @@ +const { http } = shelter; + +const cache = new Map(); +type Asset = { id: string; name: string; [key: string]: unknown }; +const assetCache: { [key: number]: Asset[] } = {}; +const appCache: { [key: number]: { id: number; name: string } } = {}; +export async function fetchExternalAsset(applicationId: number, url: string) { + await http.ready; + if (cache.has(url)) { + return cache.get(url); + } + const res = await http.post!({ + url: `/applications/${applicationId}/external-assets`, + body: { urls: [url] }, + oldFormErrors: false, + }); + + if (res.ok) { + const path = `mp:${res.body[0].external_asset_path}`; + cache.set(url, path); + return path; + } + cache.set(url, undefined); +} + +export async function fetchAssetId(applicationId: number, assetName: string): Promise { + await http.ready; + if (!assetCache[applicationId]) { + try { + const response = await http.get!(`/oauth2/applications/${applicationId}/assets`); + if (response.status !== 200) { + console.error("Error fetching resources"); + return null; + } + assetCache[applicationId] = response.body; + } catch (error) { + console.error("Request failed", error); + return null; + } + } + const resource = assetCache[applicationId].find((item) => item.name === assetName); + return resource ? resource.id : null; +} + +export async function fetchApp(applicationId: number): Promise<{ id: number; name: string }> { + await http.ready; + if (!appCache[applicationId]) { + try { + const response = await http.get!(`/oauth2/applications/${applicationId}/rpc`); + appCache[applicationId] = response.body; + } catch (error) { + console.error("Request failed", error); + return { id: applicationId, name: "Unknown" }; + } + } + return appCache[applicationId] || { id: applicationId, name: "Unknown" }; +} diff --git a/src/shelter/rpc/index.js b/src/shelter/rpc/index.js deleted file mode 100644 index 56f31c9..0000000 --- a/src/shelter/rpc/index.js +++ /dev/null @@ -1,55 +0,0 @@ -const { - flux: { - dispatcher: FluxDispatcher, - stores: { ApplicationStore }, - }, - http, -} = shelter; -const apps = {}; -const assetCache = {}; - -const fetchAssetId = async (applicationId, assetName) => { - // TO-DO Use APPLICATION_ASSETS_UPDATE and APPLICATION_ASSETS_FETCH - if (!assetCache[applicationId]) { - try { - const response = await http.get(`/oauth2/applications/${applicationId}/assets`); - - if (response.status !== 200) { - console.error("Error fetching resources"); - return null; - } - - assetCache[applicationId] = response.body; - } catch (error) { - console.error("Request failed", error); - return null; - } - } - - // Find the resource ID by its name in the cached resources - const resource = assetCache[applicationId].find((item) => item.name === assetName); - return resource ? resource.id : null; -}; - -export function onLoad() { - LegcordRPC.listen(async (msg) => { - if (msg.activity?.assets?.large_image) - msg.activity.assets.large_image = await fetchAssetId( - msg.activity.application_id, - msg.activity.assets.large_image, - ); - if (msg.activity?.assets?.small_image) - msg.activity.assets.small_image = await fetchAssetId( - msg.activity.application_id, - msg.activity.assets.small_image, - ); - if (msg.activity) { - const appId = msg.activity.application_id; - if (!apps[appId]) apps[appId] = (await ApplicationStore.getApplication(appId)) || "Unknown"; - - const app = apps[appId]; - if (!msg.activity.name) msg.activity.name = app.name; - } - FluxDispatcher.dispatch({ type: "LOCAL_ACTIVITY_UPDATE", ...msg }); // set RPC status - }); -} diff --git a/src/shelter/rpc/index.ts b/src/shelter/rpc/index.ts new file mode 100644 index 0000000..f7a9e9e --- /dev/null +++ b/src/shelter/rpc/index.ts @@ -0,0 +1,39 @@ +import { fetchApp, fetchAssetId, fetchExternalAsset } from "./asset.js"; + +const { + flux: { dispatcher: FluxDispatcher }, +} = shelter; + +export function onLoad() { + window.LegcordRPC.listen( + async (msg: { + activity: { + assets: { large_image: string | null; small_image: string | null }; + application_id: number; + name: string; + }; + }) => { + if (msg.activity?.assets?.large_image?.startsWith("https://")) { + console.log(fetchExternalAsset(msg.activity.application_id, msg.activity.assets.large_image)); + } else { + if (msg.activity?.assets?.large_image) + msg.activity.assets.large_image = await fetchAssetId( + msg.activity.application_id, + msg.activity.assets.large_image, + ); + if (msg.activity?.assets?.small_image) + msg.activity.assets.small_image = await fetchAssetId( + msg.activity.application_id, + msg.activity.assets.small_image, + ); + } + if (msg.activity) { + const appId = msg.activity.application_id; + const app = await fetchApp(appId); + if (!msg.activity.name) msg.activity.name = app.name; + console.log("RPC activity update", msg.activity); + } + FluxDispatcher.dispatch({ type: "LOCAL_ACTIVITY_UPDATE", ...msg }); // set RPC status + }, + ); +} From 5cb27b13639526b5ee8894f44e437b30c5808b9c Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Mon, 26 May 2025 18:54:58 +0200 Subject: [PATCH 642/844] fix: types for LegcordRPC --- src/discord/preload/preload.mts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/discord/preload/preload.mts b/src/discord/preload/preload.mts index b925c6e..cc4525f 100644 --- a/src/discord/preload/preload.mts +++ b/src/discord/preload/preload.mts @@ -14,5 +14,16 @@ window.localStorage.setItem("hideNag", "true"); declare global { interface Window { legcord: LegcordWindow; + LegcordRPC: { + listen: ( + callback: (msg: { + activity: { + assets: { large_image: string | null; small_image: string | null }; + application_id: number; + name: string; + }; + }) => void, + ) => void; + }; } } From a21c22f3e3e99494a4fc679309008fa2ce222411 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Mon, 26 May 2025 18:56:57 +0200 Subject: [PATCH 643/844] feat: hero view updater --- .../components/HeroUpdater.module.css | 13 +++++ .../settings/components/HeroUpdater.tsx | 53 +++++++++++++++++++ src/shelter/settings/index.ts | 3 ++ .../settings/pages/RegisteredGamesPage.tsx | 12 +++++ src/shelter/settings/pages/SettingsPage.tsx | 6 +-- 5 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 src/shelter/settings/components/HeroUpdater.module.css create mode 100644 src/shelter/settings/components/HeroUpdater.tsx create mode 100644 src/shelter/settings/pages/RegisteredGamesPage.tsx diff --git a/src/shelter/settings/components/HeroUpdater.module.css b/src/shelter/settings/components/HeroUpdater.module.css new file mode 100644 index 0000000..c20cd31 --- /dev/null +++ b/src/shelter/settings/components/HeroUpdater.module.css @@ -0,0 +1,13 @@ +.hero { + background: var(--background-surface-high); + border-radius: 0.5rem; + box-shadow: var(--shadow-elevation-2); + color: var(--text-on-surface); + display: flex; + flex-direction: column; + gap: 1rem; + padding: 2rem; + position: relative; + width: 100%; + z-index: 1; +} diff --git a/src/shelter/settings/components/HeroUpdater.tsx b/src/shelter/settings/components/HeroUpdater.tsx new file mode 100644 index 0000000..1e1d123 --- /dev/null +++ b/src/shelter/settings/components/HeroUpdater.tsx @@ -0,0 +1,53 @@ +import { createSignal } from "solid-js"; +import classes from "./HeroUpdater.module.css"; +const LOGO_URL = "https://github.com/Legcord/Branding/raw/main/assets/legcord-banner.png"; // Replace with your logo + +function checkForUpdates() { + // Simulate checking for updates + return new Promise((resolve) => setTimeout(() => resolve(Math.random() > 0.5), 1200)); +} + +const DOWNLOAD_URL = "https://example.com/download"; // Replace with your download page + +const HeroUpdater = () => { + const [checking, setChecking] = createSignal(false); + const [updateAvailable, setUpdateAvailable] = createSignal(null); + + const handleCheck = async () => { + setChecking(true); + setUpdateAvailable(null); + const available = await checkForUpdates(); + setUpdateAvailable(available); + setChecking(false); + }; + + const handleDownload = () => { + window.open(DOWNLOAD_URL, "_blank"); + }; + + return ( +
    + Logo +

    Update Checker

    +

    Check if a new version is available and download updates easily.

    + + {updateAvailable() === true && ( +
    +

    Update available!

    + +
    + )} + {updateAvailable() === false && ( +
    +

    Your app is up to date.

    +
    + )} +
    + ); +}; + +export default HeroUpdater; diff --git a/src/shelter/settings/index.ts b/src/shelter/settings/index.ts index 2e2e6c8..8759562 100644 --- a/src/shelter/settings/index.ts +++ b/src/shelter/settings/index.ts @@ -1,7 +1,9 @@ /// import { KeybindsPage } from "./pages/KeybindsPage.jsx"; +import { RegisteredGamesPage } from "./pages/RegisteredGamesPage.jsx"; import { SettingsPage } from "./pages/SettingsPage.jsx"; import { ThemesPage } from "./pages/ThemesPage.jsx"; + import { isRestartRequired, refreshSettings, refreshThemes } from "./settings.js"; const { plugin: { store }, @@ -12,6 +14,7 @@ const { } = shelter; const settingsPages = [ + registerSection("section", "legcord-games", "Registered Games", RegisteredGamesPage), registerSection("divider"), registerSection("header", "Legcord"), registerSection("section", "legcord-settings", "Settings", SettingsPage), diff --git a/src/shelter/settings/pages/RegisteredGamesPage.tsx b/src/shelter/settings/pages/RegisteredGamesPage.tsx new file mode 100644 index 0000000..bc71153 --- /dev/null +++ b/src/shelter/settings/pages/RegisteredGamesPage.tsx @@ -0,0 +1,12 @@ +const { + ui: { Header, HeaderTags, Divider }, +} = shelter; + +export function RegisteredGamesPage() { + return ( + <> +
    Registered Games
    + + + ); +} diff --git a/src/shelter/settings/pages/SettingsPage.tsx b/src/shelter/settings/pages/SettingsPage.tsx index bfa21aa..d53ed22 100644 --- a/src/shelter/settings/pages/SettingsPage.tsx +++ b/src/shelter/settings/pages/SettingsPage.tsx @@ -1,13 +1,14 @@ import { Show } from "solid-js"; import type { Settings } from "../../../@types/settings.js"; import { DropdownItem } from "../components/DropdownItem.jsx"; +import HeroUpdater from "../components/HeroUpdater.jsx"; import { TextBoxItem } from "../components/TextBoxItem.jsx"; import { setConfig, toggleMod } from "../settings.js"; import classes from "./SettingsPage.module.css"; const { plugin: { store }, - ui: { SwitchItem, Header, Divider, HeaderTags, Button, ButtonSizes }, + ui: { SwitchItem, Header, HeaderTags, Button, ButtonSizes }, } = shelter; const settings = store.settings as Settings; @@ -15,8 +16,7 @@ const settings = store.settings as Settings; export function SettingsPage() { return ( <> -
    Settings
    - +
    {store.i18n["settings-category-mods"]}
    From 77a5e7213786c0282589bb2e71cc2e2d9bad146a Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Mon, 26 May 2025 19:02:47 +0200 Subject: [PATCH 644/844] feat: add smooth screenshare performance mode --- src/@types/settings.d.ts | 2 +- src/common/flags.ts | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/@types/settings.d.ts b/src/@types/settings.d.ts index b91ee29..a585f81 100644 --- a/src/@types/settings.d.ts +++ b/src/@types/settings.d.ts @@ -42,7 +42,7 @@ export interface Settings { mods: ValidMods[]; mobileMode: boolean; skipSplash: boolean; - performanceMode: "battery" | "dynamic" | "performance" | "vaapi" | "none"; + performanceMode: "battery" | "dynamic" | "performance" | "vaapi" | "smoothScreenshare" | "none"; customJsBundle: RequestInfo | URL | string; customCssBundle: RequestInfo | URL | string; startMinimized: boolean; diff --git a/src/common/flags.ts b/src/common/flags.ts index ca6c830..d5337bb 100644 --- a/src/common/flags.ts +++ b/src/common/flags.ts @@ -26,6 +26,32 @@ const performance: Preset = { disableFeatures: ["Vulkan"], }; +const smoothExperiment: Preset = { + switches: [ + ["enable-gpu-rasterization"], + ["enable-zero-copy"], + ["ignore-gpu-blocklist"], + ["disable-background-timer-throttling"], + ["disable-renderer-backgrounding"], + ["enable-hardware-overlays", "single-fullscreen,single-on-top,underlay"], + ["force_high_performance_gpu"], + ["use-gl", "desktop"], + ], + enableFeatures: [ + "EnableDrDc", + "CanvasOopRasterization", + "BackForwardCache:TimeToLiveInBackForwardCacheInSeconds/300/should_ignore_blocklists/true/enable_same_site/true", + "ThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes", + "UseSkiaRenderer", + "WebAssemblyLazyCompilation", + "AcceleratedVideoDecodeLinuxGL", + "AcceleratedVideoEncoder", + "AcceleratedVideoDecoder", + "AcceleratedVideoDecodeLinuxZeroCopyGL", + ], + disableFeatures: ["Vulkan", "UseChromeOSDirectVideoDecoder"], +}; + const battery: Preset = { // Known to have better battery life for Chromium? switches: [ @@ -95,6 +121,9 @@ export function getPreset(): Preset | undefined { case "vaapi": console.log("VAAPI mode enabled"); return vaapi; + case "smoothScreenshare": + console.log("Smooth screenshare mode enabled"); + return smoothExperiment; default: console.log("No performance modes set"); } From 325663c51e6ac0f02bcca397d744229f45512a87 Mon Sep 17 00:00:00 2001 From: imide Date: Tue, 27 May 2025 12:28:02 -0600 Subject: [PATCH 645/844] fix(ci): push history to dev (#922) --- .github/workflows/meta.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml index fe657e5..b5225d5 100644 --- a/.github/workflows/meta.yml +++ b/.github/workflows/meta.yml @@ -40,6 +40,6 @@ jobs: git add meta/app.legcord.Legcord.metainfo.xml git commit -m "metainfo: add entry for ${{ github.event.release.tag_name }}" - git push + git push origin HEAD:dev env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From c8449c05b1f39936424c616cdee34bab670063ce Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Mon, 26 May 2025 19:52:43 +0200 Subject: [PATCH 646/844] chore: bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8d47297..4873390 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "legcord", - "version": "1.1.4", + "version": "1.2.0", "description": "Legcord is a custom client designed to enhance your Discord experience while keeping everything lightweight.", "main": "ts-out/main.js", "engines": { From cc6b582c8b5cdcd81c856a2916f88776d37a7b46 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 29 May 2025 18:59:32 +0200 Subject: [PATCH 647/844] fix: rpc external asset fetching fixes https://github.com/Legcord/Legcord/issues/923 --- src/shelter/rpc/asset.ts | 3 ++- src/shelter/rpc/index.ts | 20 +++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/shelter/rpc/asset.ts b/src/shelter/rpc/asset.ts index 05eb9b3..f7e5f9a 100644 --- a/src/shelter/rpc/asset.ts +++ b/src/shelter/rpc/asset.ts @@ -4,7 +4,7 @@ const cache = new Map(); type Asset = { id: string; name: string; [key: string]: unknown }; const assetCache: { [key: number]: Asset[] } = {}; const appCache: { [key: number]: { id: number; name: string } } = {}; -export async function fetchExternalAsset(applicationId: number, url: string) { +export async function fetchExternalAsset(applicationId: number, url: string): Promise { await http.ready; if (cache.has(url)) { return cache.get(url); @@ -21,6 +21,7 @@ export async function fetchExternalAsset(applicationId: number, url: string) { return path; } cache.set(url, undefined); + return ""; } export async function fetchAssetId(applicationId: number, assetName: string): Promise { diff --git a/src/shelter/rpc/index.ts b/src/shelter/rpc/index.ts index f7a9e9e..b95b455 100644 --- a/src/shelter/rpc/index.ts +++ b/src/shelter/rpc/index.ts @@ -8,13 +8,27 @@ export function onLoad() { window.LegcordRPC.listen( async (msg: { activity: { - assets: { large_image: string | null; small_image: string | null }; + assets: { large_image: string | null | undefined; small_image: string | null | undefined }; application_id: number; name: string; }; }) => { - if (msg.activity?.assets?.large_image?.startsWith("https://")) { - console.log(fetchExternalAsset(msg.activity.application_id, msg.activity.assets.large_image)); + if ( + msg.activity?.assets?.large_image?.startsWith("https://") ?? + msg.activity?.assets?.small_image?.startsWith("https://") + ) { + if (typeof msg.activity.assets.large_image === "string") { + msg.activity.assets.large_image = await fetchExternalAsset( + msg.activity.application_id, + msg.activity.assets.large_image, + ); + } + if (typeof msg.activity.assets.small_image === "string") { + msg.activity.assets.small_image = await fetchExternalAsset( + msg.activity.application_id, + msg.activity.assets.small_image, + ); + } } else { if (msg.activity?.assets?.large_image) msg.activity.assets.large_image = await fetchAssetId( From b08755c480b88fe95dbc797085410ffdcfd3e6b8 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 1 Jun 2025 20:34:37 +0200 Subject: [PATCH 648/844] feat: custom detectables --- src/common/detectables.ts | 30 ++++++++++++++++++++++++++++++ src/discord/window.ts | 5 ++++- src/rpc.ts | 5 +++-- 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 src/common/detectables.ts diff --git a/src/common/detectables.ts b/src/common/detectables.ts new file mode 100644 index 0000000..2614652 --- /dev/null +++ b/src/common/detectables.ts @@ -0,0 +1,30 @@ +import fs from "node:fs"; +import path from "node:path"; +import { app } from "electron"; + +import type { Game, GameList } from "arrpc"; +export function getDetectablesPath() { + const userDataPath = app.getPath("userData"); + const storagePath = path.join(userDataPath, "/storage/"); + return `${storagePath}detectables.json`; +} +export function setDetectables(object: GameList): void { + const toSave = JSON.stringify(object, null, 4); + fs.writeFileSync(getDetectablesPath(), toSave, "utf-8"); +} + +export function addDetectable(object: Game): void { + const currentDetectables = getDetectables(); + currentDetectables.push(object); + setDetectables(currentDetectables); +} + +export function getDetectables(): GameList { + if (!fs.existsSync(getDetectablesPath())) { + fs.writeFileSync(getDetectablesPath(), "[]", "utf-8"); + } + const rawData = fs.readFileSync(getDetectablesPath(), "utf-8"); + const returnData = JSON.parse(rawData) as GameList; + console.log(`[Detectables] Loaded ${returnData.length} custom detectables`); + return returnData; +} diff --git a/src/discord/window.ts b/src/discord/window.ts index 39fcb27..fe38159 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -13,6 +13,7 @@ import { } from "electron"; import contextMenu from "electron-context-menu"; import { firstRun, getConfig, setConfig } from "../common/config.js"; +import { getDetectables } from "../common/detectables.js"; import { forceQuit, setForceQuit } from "../common/forceQuit.js"; import { initQuickCss, injectThemesMain } from "../common/themes.js"; import { getWindowState, setWindowState } from "../common/windowState.js"; @@ -295,7 +296,9 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { void passedWindow.webContents.executeJavaScript(`document.body.removeAttribute("isMaximized");`); }); if (getConfig("inviteWebsocket") && mainWindows.length === 1) { - const child = utilityProcess.fork(path.join(import.meta.dirname, "rpc.js")); + const child = utilityProcess.fork(path.join(import.meta.dirname, "rpc.js"), undefined, { + env: { detectables: getDetectables().toString() }, + }); child.on("spawn", () => { console.log("arRPC process started"); diff --git a/src/rpc.ts b/src/rpc.ts index 2d3fce2..559364b 100644 --- a/src/rpc.ts +++ b/src/rpc.ts @@ -1,9 +1,10 @@ // this file is executed in the utility process // check window.ts for more details // see more here https://www.electronjs.org/docs/latest/api/utility-process -import RPCServer from "arrpc"; +import RPCServer, { type GameList } from "arrpc"; -const RPC = new RPCServer(); +const detectables: GameList = process.env.detectables ? JSON.parse(process.env.detectables) : []; +const RPC = new RPCServer(detectables); RPC.on("activity", (data: string) => { console.log(data); From 774311e9473dbf7741f0daced1bad98ddac17de8 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 13 Jun 2025 21:12:51 +0200 Subject: [PATCH 649/844] feat: macOS game detection detectables fixes --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- src/discord/window.ts | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 4873390..6607f51 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "xml-formatter": "^3.6.6" }, "dependencies": { - "arrpc": "https://github.com/Legcord/arrpc.git#3275152dfe7d3d4f7ae41cbca01257deba15a446", + "arrpc": "https://github.com/Legcord/arrpc.git#4a026ad17f9507851d47248f967a3bb7f0ef0ede", "electron-context-menu": "^4.0.4", "electron-is-dev": "^3.0.1", "electron-updater": "^6.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dba042b..a5b8bf0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: arrpc: - specifier: https://github.com/Legcord/arrpc.git#3275152dfe7d3d4f7ae41cbca01257deba15a446 - version: https://codeload.github.com/Legcord/arrpc/tar.gz/3275152dfe7d3d4f7ae41cbca01257deba15a446 + specifier: https://github.com/Legcord/arrpc.git#4a026ad17f9507851d47248f967a3bb7f0ef0ede + version: https://codeload.github.com/Legcord/arrpc/tar.gz/4a026ad17f9507851d47248f967a3bb7f0ef0ede electron-context-menu: specifier: ^4.0.4 version: 4.0.4 @@ -1446,8 +1446,8 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/3275152dfe7d3d4f7ae41cbca01257deba15a446: - resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/3275152dfe7d3d4f7ae41cbca01257deba15a446} + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/4a026ad17f9507851d47248f967a3bb7f0ef0ede: + resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/4a026ad17f9507851d47248f967a3bb7f0ef0ede} version: 3.5.0 hasBin: true @@ -4466,7 +4466,7 @@ snapshots: array-union@2.1.0: {} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/3275152dfe7d3d4f7ae41cbca01257deba15a446: + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/4a026ad17f9507851d47248f967a3bb7f0ef0ede: dependencies: ws: 8.18.0 transitivePeerDependencies: diff --git a/src/discord/window.ts b/src/discord/window.ts index fe38159..3bc8595 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -297,7 +297,7 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { }); if (getConfig("inviteWebsocket") && mainWindows.length === 1) { const child = utilityProcess.fork(path.join(import.meta.dirname, "rpc.js"), undefined, { - env: { detectables: getDetectables().toString() }, + env: { detectables: JSON.stringify(getDetectables()) }, }); child.on("spawn", () => { From e80884b4d3ca9b914f3d91dcdd3d76622f698c80 Mon Sep 17 00:00:00 2001 From: Patrick <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 20 Jun 2025 17:47:52 +0200 Subject: [PATCH 650/844] chore: bump arRPC --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6607f51..5e5843f 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "xml-formatter": "^3.6.6" }, "dependencies": { - "arrpc": "https://github.com/Legcord/arrpc.git#4a026ad17f9507851d47248f967a3bb7f0ef0ede", + "arrpc": "https://github.com/Legcord/arrpc.git#2b89dd0a7d01b26dcb1daa4d47ce21cefbf340a3", "electron-context-menu": "^4.0.4", "electron-is-dev": "^3.0.1", "electron-updater": "^6.6.2", From 3c820a2c38d4a47d940f061007b5b21f4c0b96bd Mon Sep 17 00:00:00 2001 From: Patrick <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 20 Jun 2025 17:55:53 +0200 Subject: [PATCH 651/844] fix: inject titlebar related css only when titlebar is enabled --- pnpm-lock.yaml | 10 +++---- src/discord/preload/newTitlebar.mts | 46 +++++++++++++++-------------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a5b8bf0..ee89bf4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: arrpc: - specifier: https://github.com/Legcord/arrpc.git#4a026ad17f9507851d47248f967a3bb7f0ef0ede - version: https://codeload.github.com/Legcord/arrpc/tar.gz/4a026ad17f9507851d47248f967a3bb7f0ef0ede + specifier: https://github.com/Legcord/arrpc.git#2b89dd0a7d01b26dcb1daa4d47ce21cefbf340a3 + version: https://codeload.github.com/Legcord/arrpc/tar.gz/2b89dd0a7d01b26dcb1daa4d47ce21cefbf340a3 electron-context-menu: specifier: ^4.0.4 version: 4.0.4 @@ -1446,8 +1446,8 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/4a026ad17f9507851d47248f967a3bb7f0ef0ede: - resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/4a026ad17f9507851d47248f967a3bb7f0ef0ede} + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/2b89dd0a7d01b26dcb1daa4d47ce21cefbf340a3: + resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/2b89dd0a7d01b26dcb1daa4d47ce21cefbf340a3} version: 3.5.0 hasBin: true @@ -4466,7 +4466,7 @@ snapshots: array-union@2.1.0: {} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/4a026ad17f9507851d47248f967a3bb7f0ef0ede: + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/2b89dd0a7d01b26dcb1daa4d47ce21cefbf340a3: dependencies: ws: 8.18.0 transitivePeerDependencies: diff --git a/src/discord/preload/newTitlebar.mts b/src/discord/preload/newTitlebar.mts index 59b1433..e975ac2 100644 --- a/src/discord/preload/newTitlebar.mts +++ b/src/discord/preload/newTitlebar.mts @@ -2,25 +2,27 @@ const { ipcRenderer } = require("electron"); import { addStyle } from "../../common/dom.js"; import { sleep } from "../../common/sleep.js"; -document.addEventListener("DOMContentLoaded", () => { - document.body.setAttribute("legcord-platform", ipcRenderer.sendSync("getOS")); - addStyle("legcord://assets/css/baseTitlebar.css"); - sleep(500); - switch (ipcRenderer.sendSync("getOS")) { - case "darwin": - // breaks traffic lights with bar__ and hidden__ classes - // document.body.setAttribute("class", "platform-osx"); - addStyle("legcord://assets/css/darwinTitlebar.css"); - break; - case "win32": - document.body.setAttribute("class", "platform-win"); - addStyle("legcord://assets/css/winTitlebar.css"); - break; - case "linux": - document.body.setAttribute("class", "platform-linux"); - addStyle("legcord://assets/css/linuxTitlebar.css"); - break; - default: - break; - } -}); +if (ipcRenderer.sendSync("getConfig", "windowStyle") !== "default") { + document.addEventListener("DOMContentLoaded", () => { + document.body.setAttribute("legcord-platform", ipcRenderer.sendSync("getOS")); + addStyle("legcord://assets/css/baseTitlebar.css"); + sleep(500); + switch (ipcRenderer.sendSync("getOS")) { + case "darwin": + // breaks traffic lights with bar__ and hidden__ classes + // document.body.setAttribute("class", "platform-osx"); + addStyle("legcord://assets/css/darwinTitlebar.css"); + break; + case "win32": + document.body.setAttribute("class", "platform-win"); + addStyle("legcord://assets/css/winTitlebar.css"); + break; + case "linux": + document.body.setAttribute("class", "platform-linux"); + addStyle("legcord://assets/css/linuxTitlebar.css"); + break; + default: + break; + } + }); +} From af0378147ec8af502b8d957e5d308e03714a641c Mon Sep 17 00:00:00 2001 From: Patrick <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 20 Jun 2025 22:35:16 +0200 Subject: [PATCH 652/844] feat: windows game detection v2 --- package.json | 2 +- pnpm-lock.yaml | 19 ++++--------- pnpm-workspace.yaml | 2 ++ src/@types/legcordWindow.d.ts | 13 +++++++++ src/discord/ipc.ts | 7 +++++ src/discord/preload/bridge.ts | 14 +++++----- src/discord/preload/newTitlebar.mts | 5 +++- src/discord/preload/preload.mts | 11 -------- src/discord/rpcProcess.ts | 42 +++++++++++++++++++++++++++++ src/discord/window.ts | 28 ++----------------- src/rpc.ts | 9 +++++++ src/shelter/rpc/index.ts | 2 +- 12 files changed, 94 insertions(+), 60 deletions(-) create mode 100644 src/discord/rpcProcess.ts diff --git a/package.json b/package.json index 5e5843f..724cdac 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "xml-formatter": "^3.6.6" }, "dependencies": { - "arrpc": "https://github.com/Legcord/arrpc.git#2b89dd0a7d01b26dcb1daa4d47ce21cefbf340a3", + "arrpc": "https://github.com/Legcord/arrpc.git#9abda032465847724d29db9aeeacc0b375c55a86", "electron-context-menu": "^4.0.4", "electron-is-dev": "^3.0.1", "electron-updater": "^6.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee89bf4..3b05689 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,13 +4,16 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + arrpc: link:../arrpc + importers: .: dependencies: arrpc: - specifier: https://github.com/Legcord/arrpc.git#2b89dd0a7d01b26dcb1daa4d47ce21cefbf340a3 - version: https://codeload.github.com/Legcord/arrpc/tar.gz/2b89dd0a7d01b26dcb1daa4d47ce21cefbf340a3 + specifier: link:../arrpc + version: link:../arrpc electron-context-menu: specifier: ^4.0.4 version: 4.0.4 @@ -1446,11 +1449,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/2b89dd0a7d01b26dcb1daa4d47ce21cefbf340a3: - resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/2b89dd0a7d01b26dcb1daa4d47ce21cefbf340a3} - version: 3.5.0 - hasBin: true - assert-plus@1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} @@ -4466,13 +4464,6 @@ snapshots: array-union@2.1.0: {} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/2b89dd0a7d01b26dcb1daa4d47ce21cefbf340a3: - dependencies: - ws: 8.18.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - assert-plus@1.0.0: optional: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 227d42b..d983166 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,3 +4,5 @@ onlyBuiltDependencies: - '@vencord/venmic' - electron - esbuild +overrides: + arrpc: link:../arrpc diff --git a/src/@types/legcordWindow.d.ts b/src/@types/legcordWindow.d.ts index 75ab3b7..7c78b91 100644 --- a/src/@types/legcordWindow.d.ts +++ b/src/@types/legcordWindow.d.ts @@ -62,4 +62,17 @@ export interface LegcordWindow { edit: (id: string) => void; folder: (id: string) => void; }; + rpc: { + listen: ( + callback: (msg: { + activity: { + assets: { large_image: string | null; small_image: string | null }; + application_id: number; + name: string; + }; + }) => void, + ) => void; + getProcessList: () => void; + refreshProcessList: () => void; + }; } diff --git a/src/discord/ipc.ts b/src/discord/ipc.ts index 298a778..0ca3553 100644 --- a/src/discord/ipc.ts +++ b/src/discord/ipc.ts @@ -15,6 +15,7 @@ import { isPowerSavingEnabled, setPowerSaving } from "../power.js"; import constPaths from "../shared/consts/paths.js"; import { splashWindow } from "../splash/main.js"; import { refreshGlobalKeybinds } from "./globalKeybinds.js"; +import { processList, refreshProcessList } from "./rpcProcess.js"; import { importGuilds, mainTouchBar, setVoiceState, voiceTouchBar } from "./touchbar.js"; const userDataPath = app.getPath("userData"); @@ -289,4 +290,10 @@ export function registerIpc(passedWindow: BrowserWindow): void { ipcMain.on("getConstPaths", (event) => { event.returnValue = constPaths; }); + ipcMain.on("getProcessList", (event) => { + event.returnValue = processList; + }); + ipcMain.on("refreshProcessList", () => { + refreshProcessList(); + }); } diff --git a/src/discord/preload/bridge.ts b/src/discord/preload/bridge.ts index 1314abb..3ecbcc4 100644 --- a/src/discord/preload/bridge.ts +++ b/src/discord/preload/bridge.ts @@ -4,6 +4,7 @@ import type { LegcordWindow } from "../../@types/legcordWindow.d.ts"; import type { Settings } from "../../@types/settings.js"; import type { ThemeManifest } from "../../@types/themeManifest.js"; import type { venmicListObject } from "../venmic.js"; +let windowCallback: (arg0: object) => void; interface IPCSources { id: string; @@ -88,14 +89,15 @@ contextBridge.exposeInMainWorld("legcord", { folder: (id: string) => ipcRenderer.send("openThemeFolder", id), openQuickCss: () => ipcRenderer.send("openQuickCss"), }, + rpc: { + listen: (callback: () => void) => { + windowCallback = callback; + }, + refreshProcessList: () => ipcRenderer.send("refreshProcessList"), + getProcessList: () => ipcRenderer.sendSync("getProcessList"), + }, } as unknown as LegcordWindow); -let windowCallback: (arg0: object) => void; -contextBridge.exposeInMainWorld("LegcordRPC", { - listen: (callback: () => void) => { - windowCallback = callback; - }, -}); ipcRenderer.on("rpc", (_event, data: object) => { console.log(data); windowCallback(data); diff --git a/src/discord/preload/newTitlebar.mts b/src/discord/preload/newTitlebar.mts index e975ac2..a68c1a7 100644 --- a/src/discord/preload/newTitlebar.mts +++ b/src/discord/preload/newTitlebar.mts @@ -2,7 +2,10 @@ const { ipcRenderer } = require("electron"); import { addStyle } from "../../common/dom.js"; import { sleep } from "../../common/sleep.js"; -if (ipcRenderer.sendSync("getConfig", "windowStyle") !== "default") { +if ( + ipcRenderer.sendSync("getConfig", "windowStyle") === "default" || + ipcRenderer.sendSync("getConfig", "windowStyle") === "overlay" +) { document.addEventListener("DOMContentLoaded", () => { document.body.setAttribute("legcord-platform", ipcRenderer.sendSync("getOS")); addStyle("legcord://assets/css/baseTitlebar.css"); diff --git a/src/discord/preload/preload.mts b/src/discord/preload/preload.mts index cc4525f..b925c6e 100644 --- a/src/discord/preload/preload.mts +++ b/src/discord/preload/preload.mts @@ -14,16 +14,5 @@ window.localStorage.setItem("hideNag", "true"); declare global { interface Window { legcord: LegcordWindow; - LegcordRPC: { - listen: ( - callback: (msg: { - activity: { - assets: { large_image: string | null; small_image: string | null }; - application_id: number; - name: string; - }; - }) => void, - ) => void; - }; } } diff --git a/src/discord/rpcProcess.ts b/src/discord/rpcProcess.ts new file mode 100644 index 0000000..575a509 --- /dev/null +++ b/src/discord/rpcProcess.ts @@ -0,0 +1,42 @@ +import path from "node:path"; +import { type BrowserWindow, utilityProcess } from "electron"; +import { getDetectables } from "../common/detectables.js"; +import { createInviteWindow } from "./window.js"; + +let child: Electron.UtilityProcess; +export let processList = []; + +export function startRPC(window: BrowserWindow) { + child = utilityProcess.fork(path.join(import.meta.dirname, "rpc.js"), undefined, { + env: { detectables: JSON.stringify(getDetectables()) }, + }); + + child.on("spawn", () => { + console.log("[arRPC] process started"); + console.log(child.pid); + }); + + child.on("message", (message) => { + const json = JSON.parse(message); + if (json.type === "invite") { + createInviteWindow(json.code); + } else if (json.type === "activity") { + console.log("activity pulse"); + console.log(json.data); + window.webContents.send("rpc", json.data); + } else if (json.type === "processList") { + console.log("[arRPC] updating process list"); + console.log(json.data); + processList = json.data; + } + }); + + child.on("exit", () => { + console.log("[arRPC] process exited"); + console.log(child.pid); + }); +} + +export function refreshProcessList() { + child.postMessage({ message: "refreshProcessList" }); +} diff --git a/src/discord/window.ts b/src/discord/window.ts index 3bc8595..b755a4c 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -9,11 +9,9 @@ import { dialog, nativeImage, shell, - utilityProcess, } from "electron"; import contextMenu from "electron-context-menu"; import { firstRun, getConfig, setConfig } from "../common/config.js"; -import { getDetectables } from "../common/detectables.js"; import { forceQuit, setForceQuit } from "../common/forceQuit.js"; import { initQuickCss, injectThemesMain } from "../common/themes.js"; import { getWindowState, setWindowState } from "../common/windowState.js"; @@ -21,6 +19,7 @@ import { init } from "../main.js"; import { registerGlobalKeybinds } from "./globalKeybinds.js"; import { registerIpc } from "./ipc.js"; import { setMenu } from "./menu.js"; +import { startRPC } from "./rpcProcess.js"; import { registerCustomHandler } from "./screenshare.js"; import { mainTouchBar } from "./touchbar.js"; import { createTray, tray } from "./tray.js"; @@ -296,30 +295,7 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { void passedWindow.webContents.executeJavaScript(`document.body.removeAttribute("isMaximized");`); }); if (getConfig("inviteWebsocket") && mainWindows.length === 1) { - const child = utilityProcess.fork(path.join(import.meta.dirname, "rpc.js"), undefined, { - env: { detectables: JSON.stringify(getDetectables()) }, - }); - - child.on("spawn", () => { - console.log("arRPC process started"); - console.log(child.pid); - }); - - child.on("message", (message) => { - const json = JSON.parse(message); - if (json.type === "invite") { - createInviteWindow(json.code); - } else if (json.type === "activity") { - console.log("activity pulse"); - console.log(json.data); - passedWindow.webContents.send("rpc", json.data); - } - }); - - child.on("exit", () => { - console.log("arRPC process exited"); - console.log(child.pid); - }); + startRPC(passedWindow); } if (firstRun) { passedWindow.close(); diff --git a/src/rpc.ts b/src/rpc.ts index 559364b..3ed3d60 100644 --- a/src/rpc.ts +++ b/src/rpc.ts @@ -16,3 +16,12 @@ RPC.on("invite", (code: string) => { const response = { type: "invite", code: code }; process.parentPort.postMessage(JSON.stringify(response)); }); + +process.parentPort.once("message", async (e) => { + if (e.data.message === "refreshProcessList") { + const processes = await RPC.getProcessesList(); + console.log(processes); + const response = { type: "processList", data: processes }; + process.parentPort.postMessage(JSON.stringify(response)); + } +}); diff --git a/src/shelter/rpc/index.ts b/src/shelter/rpc/index.ts index b95b455..800b426 100644 --- a/src/shelter/rpc/index.ts +++ b/src/shelter/rpc/index.ts @@ -5,7 +5,7 @@ const { } = shelter; export function onLoad() { - window.LegcordRPC.listen( + window.legcord.rpc.listen( async (msg: { activity: { assets: { large_image: string | null | undefined; small_image: string | null | undefined }; From 0d9959e1bbe1dc1a5d4a479add3690ff8955ed65 Mon Sep 17 00:00:00 2001 From: Patrick <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 20 Jun 2025 22:37:07 +0200 Subject: [PATCH 653/844] chore: update package lock --- pnpm-lock.yaml | 25 ++++++++++++++++++++----- pnpm-workspace.yaml | 4 +--- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b05689..001bb86 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,16 +4,13 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - arrpc: link:../arrpc - importers: .: dependencies: arrpc: - specifier: link:../arrpc - version: link:../arrpc + specifier: https://github.com/Legcord/arrpc.git#9abda032465847724d29db9aeeacc0b375c55a86 + version: https://codeload.github.com/Legcord/arrpc/tar.gz/9abda032465847724d29db9aeeacc0b375c55a86 electron-context-menu: specifier: ^4.0.4 version: 4.0.4 @@ -1449,6 +1446,11 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/9abda032465847724d29db9aeeacc0b375c55a86: + resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/9abda032465847724d29db9aeeacc0b375c55a86} + version: 3.5.0 + hasBin: true + assert-plus@1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} @@ -2296,6 +2298,9 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + koffi@2.12.0: + resolution: {integrity: sha512-J886y/bvoGG4ZhMVstB2Nh6/q9tzAYn0kaH7Ss8DWavGIxP5jOLzUY9IZzw9pMuXArj0SLSpl0MYsKRURPAv7g==} + lazy-val@1.0.5: resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} @@ -4464,6 +4469,14 @@ snapshots: array-union@2.1.0: {} + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/9abda032465847724d29db9aeeacc0b375c55a86: + dependencies: + koffi: 2.12.0 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + assert-plus@1.0.0: optional: true @@ -5524,6 +5537,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + koffi@2.12.0: {} + lazy-val@1.0.5: {} lazystream@1.0.1: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d983166..c4e89fc 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,6 +3,4 @@ onlyBuiltDependencies: - '@parcel/watcher' - '@vencord/venmic' - electron - - esbuild -overrides: - arrpc: link:../arrpc + - esbuild \ No newline at end of file From 6787b243ffa42890397e02ddba0dbfe42fd0d62e Mon Sep 17 00:00:00 2001 From: Patrick <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 20 Jun 2025 23:04:47 +0200 Subject: [PATCH 654/844] chore: bump electron --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 724cdac..e6a6a15 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@uwu/lune": "^1.5.1", "@uwu/shelter-defs": "^1.4.1", "babel-preset-solid": "^1.9.3", - "electron": "36.2.1", + "electron": "36.5.0", "electron-builder": "^26.0.12", "lucide-solid": "^0.475.0", "rolldown": "1.0.0-beta.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 001bb86..c30051d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -67,8 +67,8 @@ importers: specifier: ^1.9.3 version: 1.9.3(@babel/core@7.26.7) electron: - specifier: 36.2.1 - version: 36.2.1 + specifier: 36.5.0 + version: 36.5.0 electron-builder: specifier: ^26.0.12 version: 26.0.12(electron-builder-squirrel-windows@25.1.8) @@ -1819,8 +1819,8 @@ packages: electron-updater@6.6.2: resolution: {integrity: sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==} - electron@36.2.1: - resolution: {integrity: sha512-mm1Y+Ms46xcOTA69h8hpqfX392HfV4lga9aEkYkd/Syx1JBStvcACOIouCgGrnZpxNZPVS1jM8NTcMkNjuK6BQ==} + electron@36.5.0: + resolution: {integrity: sha512-ouVtHbHDFsRBHPGx9G6RDm4ccPaSCmrrR8tbUGZuqbJhqIClVBkVMz94Spjihag2Zo1eHtYD+KevALrc/94g1g==} engines: {node: '>= 12.20.55'} hasBin: true @@ -4977,7 +4977,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@36.2.1: + electron@36.5.0: dependencies: '@electron/get': 2.0.3 '@types/node': 22.10.1 From 5a7b6fe7e086a795ab9bd77b06f73ffe97d8e575 Mon Sep 17 00:00:00 2001 From: Patrick <37928912+smartfrigde@users.noreply.github.com> Date: Sat, 21 Jun 2025 12:07:36 +0200 Subject: [PATCH 655/844] feat: safe mode enable with --safe-mode --- src/common/config.ts | 12 ++++++++++++ src/common/themes.ts | 2 ++ 2 files changed, 14 insertions(+) diff --git a/src/common/config.ts b/src/common/config.ts index c1d74d1..a2ea050 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -52,6 +52,15 @@ const defaults: Settings = { autoScroll: false, useSystemCssEditor: false, }; + +const safeMode: Settings = { + ...defaults, + mods: [], + windowStyle: "native", + hardwareAcceleration: false, + disableHttpCache: true, +}; + export function checkForDataFolder(): void { const dataPath = join(dirname(app.getPath("exe")), "legcord-data"); if (existsSync(dataPath) && statSync(dataPath).isDirectory()) { @@ -67,6 +76,9 @@ export function getConfigLocation(): string { } export function getConfig(object: K): Settings[K] { + if (process.argv.includes("--safe-mode")) { + return safeMode[object]; + } const rawData = readFileSync(getConfigLocation(), "utf-8"); const returnData = JSON.parse(rawData) as Settings; return returnData[object]; diff --git a/src/common/themes.ts b/src/common/themes.ts index 1adf125..4c31ce8 100644 --- a/src/common/themes.ts +++ b/src/common/themes.ts @@ -83,6 +83,7 @@ function parseBDManifest(content: string) { return manifest; } export function injectThemesMain(browserWindow: BrowserWindow): void { + if (process.argv.includes("--safe-mode")) return; if (!fs.existsSync(themesFolder)) { fs.mkdirSync(themesFolder); console.log("Created missing theme folder"); @@ -183,6 +184,7 @@ export async function installTheme(linkOrPath: string) { } export function initQuickCss(browserWindow: BrowserWindow) { + if (process.argv.includes("--safe-mode")) return; const quickCssPath = path.join(userDataPath, "/quickCss.css"); browserWindow.webContents.on("did-finish-load", () => { if (!fs.existsSync(quickCssPath)) { From 0b1a005936552abd5aed144bdc0ca5a82f2fa682 Mon Sep 17 00:00:00 2001 From: Patrick <37928912+smartfrigde@users.noreply.github.com> Date: Sat, 21 Jun 2025 14:56:34 +0200 Subject: [PATCH 656/844] feat: detectable list UI --- src/@types/legcordWindow.d.ts | 5 +- src/discord/ipc.ts | 10 +++ src/discord/preload/bridge.ts | 3 + .../components/AddDetectableModal.tsx | 72 +++++++++++++++++++ .../settings/pages/RegisteredGames.module.css | 6 ++ .../settings/pages/RegisteredGamesPage.tsx | 44 +++++++++++- 6 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 src/shelter/settings/components/AddDetectableModal.tsx create mode 100644 src/shelter/settings/pages/RegisteredGames.module.css diff --git a/src/@types/legcordWindow.d.ts b/src/@types/legcordWindow.d.ts index 7c78b91..9aad550 100644 --- a/src/@types/legcordWindow.d.ts +++ b/src/@types/legcordWindow.d.ts @@ -1,4 +1,5 @@ import type { Node } from "@vencord/venmic"; +import type { Game, GameList, ProcessInfo } from "arrpc"; import type { Keybind } from "./keybind.js"; import type { Settings } from "./settings.js"; import type { ThemeManifest } from "./themeManifest.js"; @@ -72,7 +73,9 @@ export interface LegcordWindow { }; }) => void, ) => void; - getProcessList: () => void; + getProcessList: () => ProcessInfo[]; refreshProcessList: () => void; + addDetectable: (e: Game) => void; + getDetectables: () => GameList; }; } diff --git a/src/discord/ipc.ts b/src/discord/ipc.ts index 0ca3553..a997a01 100644 --- a/src/discord/ipc.ts +++ b/src/discord/ipc.ts @@ -1,12 +1,14 @@ import { existsSync, readFileSync, readdirSync } from "node:fs"; import os from "node:os"; import path from "node:path"; +import type { Game } from "arrpc"; import { type BrowserWindow, app, clipboard, dialog, ipcMain, shell } from "electron"; import isDev from "electron-is-dev"; import type { Keybind } from "../@types/keybind.js"; import type { Settings } from "../@types/settings.js"; import type { ThemeManifest } from "../@types/themeManifest.js"; import { getConfig, getConfigLocation, setConfig, setConfigBulk } from "../common/config.js"; +import { addDetectable, getDetectables } from "../common/detectables.js"; import { getLang, getLangName, getRawLang, setLang } from "../common/lang.js"; import { installTheme, setThemeEnabled, uninstallTheme } from "../common/themes.js"; import { getDisplayVersion, getVersion } from "../common/version.js"; @@ -293,7 +295,15 @@ export function registerIpc(passedWindow: BrowserWindow): void { ipcMain.on("getProcessList", (event) => { event.returnValue = processList; }); + + // custom detectables control ipcMain.on("refreshProcessList", () => { refreshProcessList(); }); + ipcMain.on("getDetectables", (event) => { + event.returnValue = getDetectables(); + }); + ipcMain.on("addDetectable", (_event, game: Game) => { + addDetectable(game); + }); } diff --git a/src/discord/preload/bridge.ts b/src/discord/preload/bridge.ts index 3ecbcc4..8d4eaf6 100644 --- a/src/discord/preload/bridge.ts +++ b/src/discord/preload/bridge.ts @@ -1,4 +1,5 @@ const { contextBridge, ipcRenderer } = require("electron"); +import type { Game } from "arrpc"; import type { Keybind } from "../../@types/keybind.js"; import type { LegcordWindow } from "../../@types/legcordWindow.d.ts"; import type { Settings } from "../../@types/settings.js"; @@ -95,6 +96,8 @@ contextBridge.exposeInMainWorld("legcord", { }, refreshProcessList: () => ipcRenderer.send("refreshProcessList"), getProcessList: () => ipcRenderer.sendSync("getProcessList"), + addDetectable: (detectable: Game) => ipcRenderer.send("addDetectable", detectable), + getDetectables: () => ipcRenderer.sendSync("getDetectables") as Game[], }, } as unknown as LegcordWindow); diff --git a/src/shelter/settings/components/AddDetectableModal.tsx b/src/shelter/settings/components/AddDetectableModal.tsx new file mode 100644 index 0000000..0ad3cbf --- /dev/null +++ b/src/shelter/settings/components/AddDetectableModal.tsx @@ -0,0 +1,72 @@ +import { Show, createSignal } from "solid-js"; +import type { KeybindActions } from "../../../@types/keybind.js"; +import { Dropdown } from "./Dropdown.jsx"; +import classes from "./KeybindMaker.module.css"; +const { + ui: { + ModalRoot, + ModalBody, + ModalConfirmFooter, + ModalSizes, + ModalHeader, + TextBox, + Header, + HeaderTags, + Divider, + showToast, + }, + plugin: { store }, +} = shelter; +export const AddDetectableModal = (props: { close: () => void }) => { + const [appName, setAppName] = createSignal(""); + const [appId, setAppId] = createSignal(""); + const [executable, setExecutable] = createSignal(""); + const [enabled, setEnabled] = createSignal(true); + + function save() { + if (!appName().trim() || !appId().trim() || !executable().trim()) { + return showToast({ + title: "Missing fields", + content: "Please fill in all fields before adding.", + duration: 3000, + }); + } + const current = store.settings.detectables || []; + const detectable = { + name: appName().trim(), + id: appId().trim(), + executable: executable().trim(), + enabled: enabled(), + }; + current.push(detectable); + store.settings.detectables = current; + window.legcord.rpc.addDetectable(detectable); + props.close(); + } + + return ( + + Add Detectable Application + +
    App Name
    + + +
    App ID
    + + +
    Executable
    + + + +
    + +
    + ); +}; diff --git a/src/shelter/settings/pages/RegisteredGames.module.css b/src/shelter/settings/pages/RegisteredGames.module.css new file mode 100644 index 0000000..224bed9 --- /dev/null +++ b/src/shelter/settings/pages/RegisteredGames.module.css @@ -0,0 +1,6 @@ +.addBox { + display: flex; + justify-content: space-between; + padding: 3px; + margin-top: 1rem; +} diff --git a/src/shelter/settings/pages/RegisteredGamesPage.tsx b/src/shelter/settings/pages/RegisteredGamesPage.tsx index bc71153..a624d93 100644 --- a/src/shelter/settings/pages/RegisteredGamesPage.tsx +++ b/src/shelter/settings/pages/RegisteredGamesPage.tsx @@ -1,12 +1,54 @@ +import type { ProcessInfo } from "arrpc"; +import { For, createSignal } from "solid-js"; +import { sleep } from "../../../common/sleep.js"; +import { Dropdown } from "../components/Dropdown.jsx"; +import classes from "./RegisteredGames.module.css"; const { - ui: { Header, HeaderTags, Divider }, + ui: { Header, HeaderTags, Divider, Button, ButtonSizes }, } = shelter; export function RegisteredGamesPage() { + const [detectables, setDetectables] = createSignal(); + const [selectedDetectable, setSelectedDetectable] = createSignal(""); + function getDetectables() { + window.legcord.rpc.refreshProcessList(); + sleep(500).then(() => { + setDetectables(window.legcord.rpc.getProcessList()); + }); + } + getDetectables(); + function addGame() { + // Logic to add a game + console.log("Game added"); + } return ( <>
    Registered Games
    +
    + { + const detectable = e.currentTarget.value; + if (detectable === "refresh") { + getDetectables(); + setSelectedDetectable(""); + console.log("Detectables refreshed"); + } else { + console.log("Selected detectable:", detectable); + setSelectedDetectable(e.currentTarget.value); + } + }} + > + + {(process: ProcessInfo) => } + + + + +
    ); } From 7faf0bab041a26ffc215eb27760a7c7f75125d63 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 8 Aug 2025 23:17:14 +0200 Subject: [PATCH 657/844] feat: remove rollup and move to rolldown fully --- package.json | 20 +- pnpm-lock.yaml | 1154 +++++++++++++++++++------------------------ pnpm-workspace.yaml | 6 - rolldown.config.js | 4 +- rollup.config.js | 133 ----- 5 files changed, 518 insertions(+), 799 deletions(-) delete mode 100644 pnpm-workspace.yaml delete mode 100644 rollup.config.js diff --git a/package.json b/package.json index e6a6a15..1ab21bb 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,8 @@ "scripts": { "build:dev": "rollup -c --environment BUILD:dev && tsx scripts/copyVenmic.mts", "build:plugins": "lune ci --repoSubDir src/shelter --to ts-out/plugins", - "build": "pnpm build:plugins && rollup -c --environment BUILD:prod && tsx scripts/copyVenmic.mts", - "buildNew": "rolldown -c rolldown.config.js && tsx scripts/copyVenmic.mts", - "start": "pnpm build:plugins && pnpm run buildNew && electron --trace-warnings --ozone-platform-hint=auto ./ts-out/main.js", + "build": "pnpm build:plugins && rolldown -c rolldown.config.js && tsx scripts/copyVenmic.mts", + "start": "pnpm build:plugins && pnpm run build && electron --trace-warnings --ozone-platform-hint=auto ./ts-out/main.js", "startThemeManager": "pnpm run build:dev && electron ./ts-out/main.js themes", "package": "pnpm run build && electron-builder", "packageQuick": "pnpm run build && electron-builder --dir", @@ -34,26 +33,21 @@ "homepage": "https://github.com/Legcord/Legcord#readme", "devDependencies": { "@babel/preset-flow": "^7.25.9", + "@babel/preset-typescript": "^7.27.1", "@biomejs/biome": "1.9.4", "@rollup/plugin-babel": "^6.0.4", - "@rollup/plugin-commonjs": "^28.0.1", - "@rollup/plugin-esm-shim": "^0.1.7", "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^16.0.0", - "@rollup/plugin-replace": "^6.0.2", - "@rollup/plugin-typescript": "^12.1.1", + "@rollup/plugin-esm-shim": "^0.1.7", "@types/node": "^22.10.1", "@types/ws": "^8.5.13", "@uwu/lune": "^1.5.1", "@uwu/shelter-defs": "^1.4.1", "babel-preset-solid": "^1.9.3", - "electron": "36.5.0", - "electron-builder": "^26.0.12", + "electron": "37.2.6", + "electron-builder": "^26.0.18", "lucide-solid": "^0.475.0", - "rolldown": "1.0.0-beta.7", - "rollup": "^4.27.4", + "rolldown": "1.0.0-beta.31", "rollup-plugin-copy": "^3.5.0", - "rollup-plugin-esbuild": "^6.1.1", "solid-js": "^1.9.3", "solid-motionone": "^1.0.3", "tsx": "^4.19.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c30051d..1ed0331 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,34 +23,29 @@ importers: ws: specifier: ^8.18.0 version: 8.18.0 + optionalDependencies: + '@vencord/venmic': + specifier: ^6.1.0 + version: 6.1.0 devDependencies: '@babel/preset-flow': specifier: ^7.25.9 version: 7.25.9(@babel/core@7.26.7) + '@babel/preset-typescript': + specifier: ^7.27.1 + version: 7.27.1(@babel/core@7.26.7) '@biomejs/biome': specifier: 1.9.4 version: 1.9.4 '@rollup/plugin-babel': specifier: ^6.0.4 version: 6.0.4(@babel/core@7.26.7)(rollup@4.27.4) - '@rollup/plugin-commonjs': - specifier: ^28.0.1 - version: 28.0.1(rollup@4.27.4) '@rollup/plugin-esm-shim': specifier: ^0.1.7 version: 0.1.7(rollup@4.27.4) '@rollup/plugin-json': specifier: ^6.1.0 version: 6.1.0(rollup@4.27.4) - '@rollup/plugin-node-resolve': - specifier: ^16.0.0 - version: 16.0.0(rollup@4.27.4) - '@rollup/plugin-replace': - specifier: ^6.0.2 - version: 6.0.2(rollup@4.27.4) - '@rollup/plugin-typescript': - specifier: ^12.1.1 - version: 12.1.1(rollup@4.27.4)(tslib@2.8.1)(typescript@5.7.2) '@types/node': specifier: ^22.10.1 version: 22.10.1 @@ -67,26 +62,20 @@ importers: specifier: ^1.9.3 version: 1.9.3(@babel/core@7.26.7) electron: - specifier: 36.5.0 - version: 36.5.0 + specifier: 37.2.6 + version: 37.2.6 electron-builder: - specifier: ^26.0.12 - version: 26.0.12(electron-builder-squirrel-windows@25.1.8) + specifier: ^26.0.18 + version: 26.0.19(electron-builder-squirrel-windows@25.1.8) lucide-solid: specifier: ^0.475.0 version: 0.475.0(solid-js@1.9.3) rolldown: - specifier: 1.0.0-beta.7 - version: 1.0.0-beta.7(typescript@5.7.2) - rollup: - specifier: ^4.27.4 - version: 4.27.4 + specifier: 1.0.0-beta.31 + version: 1.0.0-beta.31 rollup-plugin-copy: specifier: ^3.5.0 version: 3.5.0 - rollup-plugin-esbuild: - specifier: ^6.1.1 - version: 6.1.1(esbuild@0.24.0)(rollup@4.27.4) solid-js: specifier: ^1.9.3 version: 1.9.3 @@ -102,10 +91,6 @@ importers: xml-formatter: specifier: ^3.6.6 version: 3.6.6 - optionalDependencies: - '@vencord/venmic': - specifier: ^6.1.0 - version: 6.1.0 packages: @@ -120,6 +105,10 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.26.5': resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} engines: {node: '>=6.9.0'} @@ -132,22 +121,30 @@ packages: resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.26.5': resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.25.9': - resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.18.6': @@ -158,42 +155,68 @@ packages: resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.26.0': resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} '@babel/helper-plugin-utils@7.26.5': resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} - '@babel/helper-replace-supers@7.26.5': - resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.9': resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.26.7': resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==} engines: {node: '>=6.9.0'} @@ -203,6 +226,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-syntax-flow@7.26.0': resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} engines: {node: '>=6.9.0'} @@ -215,8 +243,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.9': - resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -227,14 +261,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.26.7': - resolution: {integrity: sha512-5cJurntg+AT+cgelGP9Bt788DKiAw9gIMSMU2NJrLAilnj0m8WZWUNZPSLOmadYsujHutpgElO+50foX+ib/Wg==} + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -245,8 +279,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.26.0': - resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -255,14 +289,26 @@ packages: resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.26.7': resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + engines: {node: '>=6.9.0'} + '@babel/types@7.26.7': resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + '@biomejs/biome@1.9.4': resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} engines: {node: '>=14.21.3'} @@ -320,8 +366,8 @@ packages: resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} engines: {node: '>= 8.9.0'} - '@electron/asar@3.2.18': - resolution: {integrity: sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==} + '@electron/asar@3.4.1': + resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} engines: {node: '>=10.12.0'} hasBin: true @@ -348,13 +394,18 @@ packages: engines: {node: '>=12.0.0'} hasBin: true + '@electron/osx-sign@1.3.3': + resolution: {integrity: sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==} + engines: {node: '>=12.0.0'} + hasBin: true + '@electron/rebuild@3.6.1': resolution: {integrity: sha512-f6596ZHpEq/YskUd8emYvOUne89ij8mQgjYFA5ru25QwbrRO+t1SImofdDv7kKOuWCmVOuU5tvfkbgGxIl3E/w==} engines: {node: '>=12.13.0'} hasBin: true - '@electron/rebuild@3.7.0': - resolution: {integrity: sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw==} + '@electron/rebuild@3.7.2': + resolution: {integrity: sha512-19/KbIR/DAxbsCkiaGMXIdPnMCJLkcf8AvGnduJtWBs/CBwiAjY1apCqOLVxrXg+rtXFCngbXhBanWjxLUt1Mg==} engines: {node: '>=12.13.0'} hasBin: true @@ -362,27 +413,34 @@ packages: resolution: {integrity: sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==} engines: {node: '>=16.4'} + '@electron/universal@2.0.3': + resolution: {integrity: sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==} + engines: {node: '>=16.4'} + '@emnapi/core@1.3.1': resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==} + '@emnapi/core@1.4.5': + resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@emnapi/wasi-threads@1.0.1': resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} + '@emnapi/wasi-threads@1.0.4': + resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@esbuild/aix-ppc64@0.23.1': resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/android-arm64@0.17.19': resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -395,12 +453,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm@0.17.19': resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} engines: {node: '>=12'} @@ -413,12 +465,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-x64@0.17.19': resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} engines: {node: '>=12'} @@ -431,12 +477,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/darwin-arm64@0.17.19': resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} engines: {node: '>=12'} @@ -449,12 +489,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-x64@0.17.19': resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} engines: {node: '>=12'} @@ -467,12 +501,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/freebsd-arm64@0.17.19': resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} engines: {node: '>=12'} @@ -485,12 +513,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-x64@0.17.19': resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} engines: {node: '>=12'} @@ -503,12 +525,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/linux-arm64@0.17.19': resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} engines: {node: '>=12'} @@ -521,12 +537,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm@0.17.19': resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} engines: {node: '>=12'} @@ -539,12 +549,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-ia32@0.17.19': resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} engines: {node: '>=12'} @@ -557,12 +561,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-loong64@0.17.19': resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} engines: {node: '>=12'} @@ -575,12 +573,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-mips64el@0.17.19': resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} engines: {node: '>=12'} @@ -593,12 +585,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-ppc64@0.17.19': resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} engines: {node: '>=12'} @@ -611,12 +597,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-riscv64@0.17.19': resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} engines: {node: '>=12'} @@ -629,12 +609,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-s390x@0.17.19': resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} engines: {node: '>=12'} @@ -647,12 +621,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-x64@0.17.19': resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} engines: {node: '>=12'} @@ -665,12 +633,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/netbsd-x64@0.17.19': resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} @@ -683,24 +645,12 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/openbsd-arm64@0.23.1': resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-x64@0.17.19': resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} @@ -713,12 +663,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/sunos-x64@0.17.19': resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} engines: {node: '>=12'} @@ -731,12 +675,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/win32-arm64@0.17.19': resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} engines: {node: '>=12'} @@ -749,12 +687,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-ia32@0.17.19': resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} engines: {node: '>=12'} @@ -767,12 +699,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-x64@0.17.19': resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} engines: {node: '>=12'} @@ -785,19 +711,24 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@gar/promisify@1.1.3': resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -816,6 +747,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@malept/cross-spawn-promise@2.0.0': resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} engines: {node: '>= 12.13.0'} @@ -845,6 +779,9 @@ packages: '@napi-rs/wasm-runtime@0.2.6': resolution: {integrity: sha512-z8YVS3XszxFTO73iwvFDNpQIzdMmSDTP/mB3E/ucR37V3Sx57hSExcXyMoNwaucWxnsWf4xfbZv0iZ30jr0M4Q==} + '@napi-rs/wasm-runtime@1.0.1': + resolution: {integrity: sha512-KVlQ/jgywZpixGCKMNwxStmmbYEMyokZpCf2YuIChhfJA2uqfAKNEM8INz7zzTo55iEXfBhIIs3VqYyqzDLj8g==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -866,8 +803,12 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This functionality has been moved to @npmcli/fs - '@oxc-project/types@0.61.2': - resolution: {integrity: sha512-rfuwJwvwn9MRthHNXlSo9Eka/u7gC0MhnWAoX3BhE1+rwPOl22nq0K0Y997Hof0tHCOuD7H3/Z8HTfCVhB4c5Q==} + '@oxc-project/runtime@0.80.0': + resolution: {integrity: sha512-3rzy1bJAZ4s7zV9TKT60x119RwJDCDqEtCwK/Zc2qlm7wGhiIUxLLYUhE/mN91yB0u1kxm5sh4NjU12sPqQTpg==} + engines: {node: '>=6.9.0'} + + '@oxc-project/types@0.80.0': + resolution: {integrity: sha512-xxHQm8wfCv2e8EmtaDwpMeAHOWqgQDAYg+BJouLXSQt5oTKu9TIXrgNMGSrM2fLvKmECsRd9uUFAAD+hPyootA==} '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} @@ -955,13 +896,18 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@rolldown/binding-android-arm64@1.0.0-beta.31': + resolution: {integrity: sha512-0mFtKwOG7smn0HkvQ6h8j0m/ohkR7Fp5eMTJ2Pns/HSbePHuDpxMaQ4TjZ6arlVXxpeWZlAHeT5BeNsOA3iWTg==} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.0-beta.1': resolution: {integrity: sha512-e4QpTp7eu61JilK958i21RK/HniwVLjZgfShqoQY1VM+KDYz90cNuopKQ3Z3oCkvyAN3xI8IaRhy02nlxdR/DA==} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.0.0-beta.7': - resolution: {integrity: sha512-spVRMdG9NotVYfrc94W8zMKEqLFbxm/dzkBjTfKzXMqhyBryo1lwZ14o8xFb3lM/ON/ZUT7laR9y+r6SIUtFrg==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.31': + resolution: {integrity: sha512-BHfHJ8Nb5G7ZKJl6pimJacupONT4F7w6gmQHw41rouAnJF51ORDwGefWeb6OMLzGmJwzxlIVPERfnJf1EsMM7A==} cpu: [arm64] os: [darwin] @@ -970,8 +916,8 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.7': - resolution: {integrity: sha512-6d6PicpBNLWJUyGO1b87QOBtQuqL1X9qVugi+kyGcChxW2bL87/CIBAJDu1g3mM62xSzxUitGa2YWRMhMJu2OA==} + '@rolldown/binding-darwin-x64@1.0.0-beta.31': + resolution: {integrity: sha512-4MiuRtExC08jHbSU/diIL+IuQP+3Ck1FbWAplK+ysQJ7fxT3DMxy5FmnIGfmhaqow8oTjb2GEwZJKgTRjZL1Vw==} cpu: [x64] os: [darwin] @@ -980,8 +926,8 @@ packages: cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.0.0-beta.7': - resolution: {integrity: sha512-RCKUAMUr1+F1wDSUmWUoGimCNAoQ9km5SRIEhrTlCOXe4wv+rY4o07cTaBjehBm+GtT+u0r36SW2gOmikivj9Q==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.31': + resolution: {integrity: sha512-nffC1u7ccm12qlAea8ExY3AvqlaHy/o/3L4p5Es8JFJ3zJSs6e3DyuxGZZVdl9EVwsLxPPTvioIl4tEm2afwyw==} cpu: [x64] os: [freebsd] @@ -990,8 +936,8 @@ packages: cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.7': - resolution: {integrity: sha512-SRGp4RaUC2oFZTDtLSRePWWE5F4C5vrlsr/a3+/mBlBVUdSrB7341hqAEcezW3YYHQOT/j9CPXu2NULENSywwQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.31': + resolution: {integrity: sha512-LHmAaB3rB1GOJuHscKcL2Ts/LKLcb3YWTh2uQ/876rg/J9WE9kQ0kZ+3lRSYbth/YL8ln54j4JZmHpqQY3xptQ==} cpu: [arm] os: [linux] @@ -1000,8 +946,8 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.7': - resolution: {integrity: sha512-q6Szr5o54lJWir2uYxwxDoOUdSCrA2Nb8sKqQRnJHP9985o0uxeq85LKvMubFRgTKq9Q71ZZPrZBs7pwr4ji1Q==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.31': + resolution: {integrity: sha512-oTDZVfqIAjLB2I1yTiLyyhfPPO6dky33sTblxTCpe+ZT55WizN3KDoBKJ4yXG8shI6I4bRShVu29Xg0yAjyQYw==} cpu: [arm64] os: [linux] @@ -1010,18 +956,23 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.7': - resolution: {integrity: sha512-MiEE4ReEw7jdxKE8eKTdt3z7N1sucgSb1J0BUY3Dd8YKLjh2jNYHhJu13/tCo2DBMZxT+FDJE3WJ5kCxZA7+YA==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.31': + resolution: {integrity: sha512-duJ3IkEBj9Xe9NYW1n8Y3483VXHGi8zQ0ZsLbK8464EJUXLF7CXM8Ry+jkkUw+ZvA+Zu1E/+C6p2Y6T9el0C9g==} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-ohos@1.0.0-beta.31': + resolution: {integrity: sha512-qdbmU5QSZ0uoLZBYMxiHsMQmizqtzFGTVPU5oyU1n0jU0Mo+mkSzqZuL8VBnjHOHzhVxZsoAGH9JjiRzCnoGVA==} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.1': resolution: {integrity: sha512-a8QP35x/3mggWqCpFtaF3/PbWl5P9QKpP/muk3iMPgzrXto8zPsEl3imsP3EBh4KwanBVHIf8pEkBQ+/7iMTgQ==} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.7': - resolution: {integrity: sha512-2yDNUKQidgcZr/VSJCUy9IGvtcF/GfBEBrCsqvSkVKMNLNySICvybAwKtCNPeZSOwf875CWnnyKNeg5vwV6rMg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.31': + resolution: {integrity: sha512-H7+r34TSV8udB2gAsebFM/YuEeNCkPGEAGJ1JE7SgI9XML6FflqcdKfrRSneQFsPaom/gCEc1g0WW5MZ0O3blw==} cpu: [x64] os: [linux] @@ -1030,8 +981,8 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.7': - resolution: {integrity: sha512-72LjHkY9Sqav35qopNh4fabhSsqKWmOwMtjmrNgONTtC5LhALjNZlaXkAaFvQRJ8N7ftT8BOITzaZeqrF6BYdg==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.31': + resolution: {integrity: sha512-zRm2YmzFVqbsmUsyyZnHfJrOlQUcWS/FJ5ZWL8Q1kZh5PnLBrTVZNpakIWwAxpN5gNEi9MmFd5YHocVJp8ps1Q==} cpu: [x64] os: [linux] @@ -1040,9 +991,9 @@ packages: engines: {node: '>=14.21.3'} cpu: [wasm32] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.7': - resolution: {integrity: sha512-sR8q2p3j5ZCkFWPbm6LUIYE7SHfmrVqXu0n4CFpzmAM95pDhFRx8SzT/oL5tkFN+mCdnPpzcvpn9OioVXQ8CxA==} - engines: {node: '>=14.21.3'} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.31': + resolution: {integrity: sha512-fM1eUIuHLsNJXRlWOuIIex1oBJ89I0skFWo5r/D3KSJ5gD9MBd3g4Hp+v1JGohvyFE+7ylnwRxSUyMEeYpA69A==} + engines: {node: '>=14.0.0'} cpu: [wasm32] '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.1': @@ -1050,8 +1001,8 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.7': - resolution: {integrity: sha512-eeSNGdZt01NelYGl5LZc3cSwN4iYG5XE8zMqkILErfW6ndpc74DKeDWI0aG8jmtjz5VerLA4B9DzOkhuFj4lNg==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.31': + resolution: {integrity: sha512-4nftR9V2KHH3zjBwf6leuZZJQZ7v0d70ogjHIqB3SDsbDLvVEZiGSsSn2X6blSZRZeJSFzK0pp4kZ67zdZXwSw==} cpu: [arm64] os: [win32] @@ -1060,8 +1011,8 @@ packages: cpu: [ia32] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.7': - resolution: {integrity: sha512-d7Uhs3LWirrE4+TRa2N25AqrZaZjYZdOrKSYbZFMF42tFkWIgGWPCQouTqjMgjVGX0feJpF7+9dwVhjZFzZbYA==} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.31': + resolution: {integrity: sha512-0TQcKu9xZVHYALit+WJsSuADGlTFfOXhnZoIHWWQhTk3OgbwwbYcSoZUXjRdFmR6Wswn4csHtJGN1oYKeQ6/2g==} cpu: [ia32] os: [win32] @@ -1070,11 +1021,14 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.7': - resolution: {integrity: sha512-Z3P1JHx+U7Sr73v5wJtEygxboF2VR9ds4eSAgFfslhIxFI48FFm+WEMeuLLeqnx0tiq1UL6cIIg5+h3mlaG6UA==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.31': + resolution: {integrity: sha512-3zMICWwpZh1jrkkKDYIUCx/2wY3PXLICAS0AnbeLlhzfWPhCcpNK9eKhiTlLAZyTp+3kyipoi/ZSVIh+WDnBpQ==} cpu: [x64] os: [win32] + '@rolldown/pluginutils@1.0.0-beta.31': + resolution: {integrity: sha512-IaDZ9NhjOIOkYtm+hH0GX33h3iVZ2OeSUnFF0+7Z4+1GuKs4Kj5wK3+I2zNV9IPLfqV4XlwWif8SXrZNutxciQ==} + '@rollup/plugin-babel@6.0.4': resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} engines: {node: '>=14.0.0'} @@ -1088,15 +1042,6 @@ packages: rollup: optional: true - '@rollup/plugin-commonjs@28.0.1': - resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==} - engines: {node: '>=16.0.0 || 14 >= 14.17'} - peerDependencies: - rollup: ^2.68.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/plugin-esm-shim@0.1.7': resolution: {integrity: sha512-Du+ZohybNzcg9H6iuMZwrjQo7dYetvm6E5rxFf13cUHa7XVZ8Lqz+HTKgwNekLla2wXZsNbv9dhDMW6FotwbSg==} engines: {node: '>=14.0.0'} @@ -1115,37 +1060,6 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@16.0.0': - resolution: {integrity: sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/plugin-replace@6.0.2': - resolution: {integrity: sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/plugin-typescript@12.1.1': - resolution: {integrity: sha512-t7O653DpfB5MbFrqPe/VcKFFkvRuFNp9qId3xq4Eth5xlyymzxNpye2z8Hrl0RIMuXTSr5GGcFpkdlMeacUiFQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.14.0||^3.0.0||^4.0.0 - tslib: '*' - typescript: '>=3.7.0' - peerDependenciesMeta: - rollup: - optional: true - tslib: - optional: true - '@rollup/pluginutils@5.1.3': resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} engines: {node: '>=14.0.0'} @@ -1277,6 +1191,9 @@ packages: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} + '@tybys/wasm-util@0.10.0': + resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} @@ -1316,9 +1233,6 @@ packages: '@types/plist@3.0.5': resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} - '@types/resolve@1.20.2': - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -1338,11 +1252,6 @@ packages: '@uwu/shelter-defs@1.4.1': resolution: {integrity: sha512-KDQQf7S8yT1/ZxBZ8Ch5zHZ1ps9QcVtRWfnzK0pqrQb++5Tb2hqD0RiL5IrdS765/ZXglq0cgKWB6xesHVCZKg==} - '@valibot/to-json-schema@1.0.0': - resolution: {integrity: sha512-/9crJgPptVsGCL6X+JPDQyaJwkalSZ/52WuF8DiRUxJgcmpNdzYRfZ+gqMEP8W3CTVfuMWPqqvIgfwJ97f9Etw==} - peerDependencies: - valibot: ^1.0.0 - '@vencord/venmic@6.1.0': resolution: {integrity: sha512-YiCtzml/W8tYbGhu3jm5jfbbEnl2slKKARNK0jO+8qV979k9eFnfIRTxvhMN/SWq1h8ZNJdXVwvXpffQwq0RuA==} engines: {node: '>=14.15'} @@ -1395,6 +1304,10 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + ansis@4.1.0: + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + engines: {node: '>=14'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1412,12 +1325,12 @@ packages: dmg-builder: 25.1.8 electron-builder-squirrel-windows: 25.1.8 - app-builder-lib@26.0.12: - resolution: {integrity: sha512-+/CEPH1fVKf6HowBUs6LcAIoRcjeqgvAeoSE+cl7Y7LndyQ9ViGPYibNk7wmhMHzNgHIuIbw4nWADPO+4mjgWw==} + app-builder-lib@26.0.19: + resolution: {integrity: sha512-z7SaBAqwCG0sYYhimleOChJlu1gRMT7LVhzKt1rxQ4mkUOntQJEdkgclLYuJqIBGIwh9dat3LQbvOr504J0e6w==} engines: {node: '>=14.0.0'} peerDependencies: - dmg-builder: 26.0.12 - electron-builder-squirrel-windows: 26.0.12 + dmg-builder: 26.0.19 + electron-builder-squirrel-windows: 26.0.19 aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -1541,11 +1454,15 @@ packages: resolution: {integrity: sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ==} engines: {node: '>=12.0.0'} + builder-util-runtime@9.3.3: + resolution: {integrity: sha512-8AE+77tdJ9XTsK96e55EXJR+ZEK54r8rb0BS8PbEXw57tOX0EWV4BluGW3xkIn+Xvbp+bmQ8gECa15wlcEQxlg==} + engines: {node: '>=12.0.0'} + builder-util@25.1.7: resolution: {integrity: sha512-7jPjzBwEGRbwNcep0gGNpLXG9P94VA3CPAZQCzxkFXiV2GMQKlziMbY//rXPI7WKfhsvGgFXjTcXdBEwgXw9ww==} - builder-util@26.0.11: - resolution: {integrity: sha512-xNjXfsldUEe153h1DraD0XvDOpqGR0L5eKFkdReB7eFW5HqysDZFfly4rckda6y9dF39N3pkPlOblcfHKGw+uA==} + builder-util@26.0.19: + resolution: {integrity: sha512-fKHgkdq6Ra3bv7ly69o32L3ZrOhaq2qzSnQn9rUzWMEpsZ8FfZy9XOYQZ7qIdwB6iqJ4uZhjlPD8ZsGb7LYMZA==} cacache@16.1.3: resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} @@ -1585,6 +1502,10 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + ci-info@4.3.0: + resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} + engines: {node: '>=8'} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -1643,9 +1564,6 @@ packages: resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} engines: {node: '>= 6'} - commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - compare-version@0.1.2: resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} engines: {node: '>=0.10.0'} @@ -1717,10 +1635,6 @@ packages: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -1762,8 +1676,8 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dmg-builder@26.0.12: - resolution: {integrity: sha512-59CAAjAhTaIMCN8y9kD573vDkxbs1uhDcrFLHSgutYdPcGOU35Rf95725snvzEOy4BFB7+eLJ8djCNPmGwG67w==} + dmg-builder@26.0.19: + resolution: {integrity: sha512-lZyqfdM0SPqNydGtq06B7LRSxUcKU4v/p2xU0kmKqTM9WXZaQELOZ0OH/gbLCmeZz6zWEDSA31MmTJ8b/X8nYg==} dmg-license@1.0.11: resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} @@ -1790,8 +1704,8 @@ packages: electron-builder-squirrel-windows@25.1.8: resolution: {integrity: sha512-2ntkJ+9+0GFP6nAISiMabKt6eqBB0kX1QqHNWFWAXgi0VULKGisM46luRFpIBiU3u/TDmhZMM8tzvo2Abn3ayg==} - electron-builder@26.0.12: - resolution: {integrity: sha512-cD1kz5g2sgPTMFHjLxfMjUK5JABq3//J4jPswi93tOPFz6btzXYtK5NrDt717NRbukCUDOrrvmYVOWERlqoiXA==} + electron-builder@26.0.19: + resolution: {integrity: sha512-0xkN9UcIBgrbNAqeurB+CyBARZPkfiILPK0nvbioX+S86B3fgRfJnjIh+T+zowyPTTY85NN5kLfItM8twVRy5w==} engines: {node: '>=14.0.0'} hasBin: true @@ -1810,8 +1724,8 @@ packages: electron-publish@25.1.7: resolution: {integrity: sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg==} - electron-publish@26.0.11: - resolution: {integrity: sha512-a8QRH0rAPIWH9WyyS5LbNvW9Ark6qe63/LqDB7vu2JXYpi0Gma5Q60Dh4tmTqhOBQt0xsrzD8qE7C+D7j+B24A==} + electron-publish@26.0.19: + resolution: {integrity: sha512-tcQUIRuHOwaQxi+CrbpaB/5Q+vonj9fEeWkaVa3oM0DcdYHZK/nCLgWKu0kHgPheAU1ovfjVcXBpuyuFBLp2lA==} electron-to-chromium@1.5.90: resolution: {integrity: sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==} @@ -1819,8 +1733,8 @@ packages: electron-updater@6.6.2: resolution: {integrity: sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==} - electron@36.5.0: - resolution: {integrity: sha512-ouVtHbHDFsRBHPGx9G6RDm4ccPaSCmrrR8tbUGZuqbJhqIClVBkVMz94Spjihag2Zo1eHtYD+KevALrc/94g1g==} + electron@37.2.6: + resolution: {integrity: sha512-Ns6xyxE+hIK5UlujtRlw7w4e2Ju/ImCWXf1Q/PoOhc0N3/6SN6YW7+ujCarsHbxWnolbW+1RlkHtdklUJpjbPA==} engines: {node: '>= 12.20.55'} hasBin: true @@ -1858,9 +1772,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} @@ -1874,11 +1785,6 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1934,14 +1840,6 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -2185,10 +2083,6 @@ packages: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} - engines: {node: '>= 0.4'} - is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} @@ -2216,9 +2110,6 @@ packages: is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2231,9 +2122,6 @@ packages: resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} engines: {node: '>=0.10.0'} - is-reference@1.2.1: - resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -2252,6 +2140,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -2260,6 +2152,10 @@ packages: engines: {node: '>=10'} hasBin: true + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + hasBin: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2475,8 +2371,8 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} minimatch@3.1.2: @@ -2759,10 +2655,6 @@ packages: engines: {node: '>= 0.4'} hasBin: true - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} @@ -2796,26 +2688,14 @@ packages: '@babel/runtime': optional: true - rolldown@1.0.0-beta.7: - resolution: {integrity: sha512-IUa/9lZVqgFilYggiY7jxUbmvU4Q8wVvVqsru+AeMldBccBEhTYZ6/XP6cWsznb8Fv49zfYGaeEpJ5WeVdo6Mg==} + rolldown@1.0.0-beta.31: + resolution: {integrity: sha512-M2Q+RfG0FMJeSW3RSFTbvtjGVTcQpTQvN247D0EMSsPkpZFoinopR9oAnQiwgogQyzDuvKNnbyCbQQlmNAzSoQ==} hasBin: true - peerDependencies: - '@oxc-project/runtime': 0.61.2 - peerDependenciesMeta: - '@oxc-project/runtime': - optional: true rollup-plugin-copy@3.5.0: resolution: {integrity: sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==} engines: {node: '>=8.3'} - rollup-plugin-esbuild@6.1.1: - resolution: {integrity: sha512-CehMY9FAqJD5OUaE/Mi1r5z0kNeYxItmRO2zG4Qnv2qWKF09J2lTy5GUzjJR354ZPrLkCj4fiBN41lo8PzBUhw==} - engines: {node: '>=14.18.0'} - peerDependencies: - esbuild: '>=0.18.0' - rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - rollup@4.27.4: resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3099,14 +2979,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - valibot@1.0.0: - resolution: {integrity: sha512-1Hc0ihzWxBar6NGeZv7fPLY0QuxFMyxwYR2sF1Blu7Wq7EnremwY2W02tit2ij2VJT8HcSkHAQqmFfl77f73Yw==} - peerDependencies: - typescript: '>=5' - peerDependenciesMeta: - typescript: - optional: true - validate-html-nesting@1.2.2: resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} @@ -3122,6 +2994,11 @@ packages: engines: {node: '>= 8'} hasBin: true + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} @@ -3207,6 +3084,12 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.26.5': {} '@babel/core@7.26.7': @@ -3237,9 +3120,17 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.25.9': + '@babel/generator@7.28.0': dependencies: - '@babel/types': 7.26.7 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.2 '@babel/helper-compilation-targets@7.26.5': dependencies: @@ -3249,23 +3140,25 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.7)': + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.26.7)': dependencies: '@babel/core': 7.26.7 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.7) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.26.7 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-member-expression-to-functions@7.25.9': + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.26.7 - '@babel/types': 7.26.7 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color @@ -3280,6 +3173,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.7)': dependencies: '@babel/core': 7.26.7 @@ -3289,34 +3189,51 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.25.9': - dependencies: - '@babel/types': 7.26.7 - - '@babel/helper-plugin-utils@7.26.5': {} - - '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.7)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.26.7)': dependencies: '@babel/core': 7.26.7 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.26.7 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/traverse': 7.26.7 - '@babel/types': 7.26.7 + '@babel/types': 7.28.2 + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-validator-option@7.27.1': {} + '@babel/helpers@7.26.7': dependencies: '@babel/template': 7.25.9 @@ -3326,6 +3243,10 @@ snapshots: dependencies: '@babel/types': 7.26.7 + '@babel/parser@7.28.0': + dependencies: + '@babel/types': 7.28.2 + '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.7)': dependencies: '@babel/core': 7.26.7 @@ -3336,10 +3257,15 @@ snapshots: '@babel/core': 7.26.7 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.7)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.26.7)': dependencies: '@babel/core': 7.26.7 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.26.7)': + dependencies: + '@babel/core': 7.26.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-flow-strip-types@7.26.5(@babel/core@7.26.7)': dependencies: @@ -3347,22 +3273,22 @@ snapshots: '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.7) - '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.7)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.26.7)': dependencies: '@babel/core': 7.26.7 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.7) - '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.26.7) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.26.7(@babel/core@7.26.7)': + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.26.7)': dependencies: '@babel/core': 7.26.7 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.7) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.7) + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.26.7) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.26.7) transitivePeerDependencies: - supports-color @@ -3373,14 +3299,14 @@ snapshots: '@babel/helper-validator-option': 7.25.9 '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.26.7) - '@babel/preset-typescript@7.26.0(@babel/core@7.26.7)': + '@babel/preset-typescript@7.27.1(@babel/core@7.26.7)': dependencies: '@babel/core': 7.26.7 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.7) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.7) - '@babel/plugin-transform-typescript': 7.26.7(@babel/core@7.26.7) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.26.7) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.26.7) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.26.7) transitivePeerDependencies: - supports-color @@ -3390,6 +3316,12 @@ snapshots: '@babel/parser': 7.26.7 '@babel/types': 7.26.7 + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.2 + '@babel/traverse@7.26.7': dependencies: '@babel/code-frame': 7.26.2 @@ -3402,11 +3334,28 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.28.0': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.26.7': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@babel/types@7.28.2': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@biomejs/biome@1.9.4': optionalDependencies: '@biomejs/cli-darwin-arm64': 1.9.4 @@ -3447,7 +3396,7 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - '@electron/asar@3.2.18': + '@electron/asar@3.4.1': dependencies: commander: 5.1.0 glob: 7.2.3 @@ -3508,6 +3457,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@electron/osx-sign@1.3.3': + dependencies: + compare-version: 0.1.2 + debug: 4.4.0 + fs-extra: 10.1.0 + isbinaryfile: 4.0.10 + minimist: 1.2.8 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + '@electron/rebuild@3.6.1': dependencies: '@malept/cross-spawn-promise': 2.0.0 @@ -3528,7 +3488,7 @@ snapshots: - bluebird - supports-color - '@electron/rebuild@3.7.0': + '@electron/rebuild@3.7.2': dependencies: '@electron/node-gyp': https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2 '@malept/cross-spawn-promise': 2.0.0 @@ -3550,7 +3510,19 @@ snapshots: '@electron/universal@2.0.1': dependencies: - '@electron/asar': 3.2.18 + '@electron/asar': 3.4.1 + '@malept/cross-spawn-promise': 2.0.0 + debug: 4.4.0 + dir-compare: 4.2.0 + fs-extra: 11.2.0 + minimatch: 9.0.5 + plist: 3.1.0 + transitivePeerDependencies: + - supports-color + + '@electron/universal@2.0.3': + dependencies: + '@electron/asar': 3.4.1 '@malept/cross-spawn-promise': 2.0.0 debug: 4.4.0 dir-compare: 4.2.0 @@ -3566,20 +3538,33 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.4.5': + dependencies: + '@emnapi/wasi-threads': 1.0.4 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.3.1': dependencies: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.4.5': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.0.1': dependencies: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.23.1': + '@emnapi/wasi-threads@1.0.4': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.24.0': + '@esbuild/aix-ppc64@0.23.1': optional: true '@esbuild/android-arm64@0.17.19': @@ -3588,206 +3573,143 @@ snapshots: '@esbuild/android-arm64@0.23.1': optional: true - '@esbuild/android-arm64@0.24.0': - optional: true - '@esbuild/android-arm@0.17.19': optional: true '@esbuild/android-arm@0.23.1': optional: true - '@esbuild/android-arm@0.24.0': - optional: true - '@esbuild/android-x64@0.17.19': optional: true '@esbuild/android-x64@0.23.1': optional: true - '@esbuild/android-x64@0.24.0': - optional: true - '@esbuild/darwin-arm64@0.17.19': optional: true '@esbuild/darwin-arm64@0.23.1': optional: true - '@esbuild/darwin-arm64@0.24.0': - optional: true - '@esbuild/darwin-x64@0.17.19': optional: true '@esbuild/darwin-x64@0.23.1': optional: true - '@esbuild/darwin-x64@0.24.0': - optional: true - '@esbuild/freebsd-arm64@0.17.19': optional: true '@esbuild/freebsd-arm64@0.23.1': optional: true - '@esbuild/freebsd-arm64@0.24.0': - optional: true - '@esbuild/freebsd-x64@0.17.19': optional: true '@esbuild/freebsd-x64@0.23.1': optional: true - '@esbuild/freebsd-x64@0.24.0': - optional: true - '@esbuild/linux-arm64@0.17.19': optional: true '@esbuild/linux-arm64@0.23.1': optional: true - '@esbuild/linux-arm64@0.24.0': - optional: true - '@esbuild/linux-arm@0.17.19': optional: true '@esbuild/linux-arm@0.23.1': optional: true - '@esbuild/linux-arm@0.24.0': - optional: true - '@esbuild/linux-ia32@0.17.19': optional: true '@esbuild/linux-ia32@0.23.1': optional: true - '@esbuild/linux-ia32@0.24.0': - optional: true - '@esbuild/linux-loong64@0.17.19': optional: true '@esbuild/linux-loong64@0.23.1': optional: true - '@esbuild/linux-loong64@0.24.0': - optional: true - '@esbuild/linux-mips64el@0.17.19': optional: true '@esbuild/linux-mips64el@0.23.1': optional: true - '@esbuild/linux-mips64el@0.24.0': - optional: true - '@esbuild/linux-ppc64@0.17.19': optional: true '@esbuild/linux-ppc64@0.23.1': optional: true - '@esbuild/linux-ppc64@0.24.0': - optional: true - '@esbuild/linux-riscv64@0.17.19': optional: true '@esbuild/linux-riscv64@0.23.1': optional: true - '@esbuild/linux-riscv64@0.24.0': - optional: true - '@esbuild/linux-s390x@0.17.19': optional: true '@esbuild/linux-s390x@0.23.1': optional: true - '@esbuild/linux-s390x@0.24.0': - optional: true - '@esbuild/linux-x64@0.17.19': optional: true '@esbuild/linux-x64@0.23.1': optional: true - '@esbuild/linux-x64@0.24.0': - optional: true - '@esbuild/netbsd-x64@0.17.19': optional: true '@esbuild/netbsd-x64@0.23.1': optional: true - '@esbuild/netbsd-x64@0.24.0': - optional: true - '@esbuild/openbsd-arm64@0.23.1': optional: true - '@esbuild/openbsd-arm64@0.24.0': - optional: true - '@esbuild/openbsd-x64@0.17.19': optional: true '@esbuild/openbsd-x64@0.23.1': optional: true - '@esbuild/openbsd-x64@0.24.0': - optional: true - '@esbuild/sunos-x64@0.17.19': optional: true '@esbuild/sunos-x64@0.23.1': optional: true - '@esbuild/sunos-x64@0.24.0': - optional: true - '@esbuild/win32-arm64@0.17.19': optional: true '@esbuild/win32-arm64@0.23.1': optional: true - '@esbuild/win32-arm64@0.24.0': - optional: true - '@esbuild/win32-ia32@0.17.19': optional: true '@esbuild/win32-ia32@0.23.1': optional: true - '@esbuild/win32-ia32@0.24.0': - optional: true - '@esbuild/win32-x64@0.17.19': optional: true '@esbuild/win32-x64@0.23.1': optional: true - '@esbuild/win32-x64@0.24.0': - optional: true - '@gar/promisify@1.1.3': {} + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -3797,6 +3719,11 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jridgewell/gen-mapping@0.3.12': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -3814,6 +3741,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping@0.3.29': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@malept/cross-spawn-promise@2.0.0': dependencies: cross-spawn: 7.0.6 @@ -3869,6 +3801,13 @@ snapshots: '@tybys/wasm-util': 0.9.0 optional: true + '@napi-rs/wasm-runtime@1.0.1': + dependencies: + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@tybys/wasm-util': 0.10.0 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3891,7 +3830,9 @@ snapshots: mkdirp: 1.0.4 rimraf: 3.0.2 - '@oxc-project/types@0.61.2': {} + '@oxc-project/runtime@0.80.0': {} + + '@oxc-project/types@0.80.0': {} '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -3957,52 +3898,58 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@rolldown/binding-android-arm64@1.0.0-beta.31': + optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.1': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.7': + '@rolldown/binding-darwin-arm64@1.0.0-beta.31': optional: true '@rolldown/binding-darwin-x64@1.0.0-beta.1': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.7': + '@rolldown/binding-darwin-x64@1.0.0-beta.31': optional: true '@rolldown/binding-freebsd-x64@1.0.0-beta.1': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.7': + '@rolldown/binding-freebsd-x64@1.0.0-beta.31': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.1': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.7': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.31': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.1': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.7': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.31': optional: true '@rolldown/binding-linux-arm64-musl@1.0.0-beta.1': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.7': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.31': + optional: true + + '@rolldown/binding-linux-arm64-ohos@1.0.0-beta.31': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-beta.1': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.7': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.31': optional: true '@rolldown/binding-linux-x64-musl@1.0.0-beta.1': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.7': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.31': optional: true '@rolldown/binding-wasm32-wasi@1.0.0-beta.1': @@ -4010,29 +3957,31 @@ snapshots: '@napi-rs/wasm-runtime': 0.2.6 optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.7': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.31': dependencies: - '@napi-rs/wasm-runtime': 0.2.6 + '@napi-rs/wasm-runtime': 1.0.1 optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.1': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.7': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.31': optional: true '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.1': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.7': + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.31': optional: true '@rolldown/binding-win32-x64-msvc@1.0.0-beta.1': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.7': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.31': optional: true + '@rolldown/pluginutils@1.0.0-beta.31': {} + '@rollup/plugin-babel@6.0.4(@babel/core@7.26.7)(rollup@4.27.4)': dependencies: '@babel/core': 7.26.7 @@ -4043,18 +3992,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@rollup/plugin-commonjs@28.0.1(rollup@4.27.4)': - dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.27.4) - commondir: 1.0.1 - estree-walker: 2.0.2 - fdir: 6.4.2(picomatch@4.0.2) - is-reference: 1.2.1 - magic-string: 0.30.14 - picomatch: 4.0.2 - optionalDependencies: - rollup: 4.27.4 - '@rollup/plugin-esm-shim@0.1.7(rollup@4.27.4)': dependencies: magic-string: 0.30.14 @@ -4067,32 +4004,6 @@ snapshots: optionalDependencies: rollup: 4.27.4 - '@rollup/plugin-node-resolve@16.0.0(rollup@4.27.4)': - dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.27.4) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.10 - optionalDependencies: - rollup: 4.27.4 - - '@rollup/plugin-replace@6.0.2(rollup@4.27.4)': - dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.27.4) - magic-string: 0.30.14 - optionalDependencies: - rollup: 4.27.4 - - '@rollup/plugin-typescript@12.1.1(rollup@4.27.4)(tslib@2.8.1)(typescript@5.7.2)': - dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.27.4) - resolve: 1.22.8 - typescript: 5.7.2 - optionalDependencies: - rollup: 4.27.4 - tslib: 2.8.1 - '@rollup/pluginutils@5.1.3(rollup@4.27.4)': dependencies: '@types/estree': 1.0.6 @@ -4181,6 +4092,11 @@ snapshots: '@tootallnate/once@2.0.0': {} + '@tybys/wasm-util@0.10.0': + dependencies: + tslib: 2.8.1 + optional: true + '@tybys/wasm-util@0.9.0': dependencies: tslib: 2.8.1 @@ -4232,8 +4148,6 @@ snapshots: xmlbuilder: 15.1.1 optional: true - '@types/resolve@1.20.2': {} - '@types/responselike@1.0.3': dependencies: '@types/node': 22.10.1 @@ -4253,7 +4167,7 @@ snapshots: '@uwu/lune@1.5.1': dependencies: '@babel/core': 7.26.7 - '@babel/preset-typescript': 7.26.0(@babel/core@7.26.7) + '@babel/preset-typescript': 7.27.1(@babel/core@7.26.7) chokidar: 3.6.0 esbuild: 0.17.19 lightningcss: 1.29.1 @@ -4273,10 +4187,6 @@ snapshots: solid-js: 1.6.16 spitroast: 1.4.4 - '@valibot/to-json-schema@1.0.0(valibot@1.0.0(typescript@5.7.2))': - dependencies: - valibot: 1.0.0(typescript@5.7.2) - '@vencord/venmic@6.1.0': dependencies: cmake-js: 7.3.0 @@ -4332,6 +4242,8 @@ snapshots: ansi-styles@6.2.1: {} + ansis@4.1.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -4341,7 +4253,7 @@ snapshots: app-builder-bin@5.0.0-alpha.12: {} - app-builder-lib@25.1.8(dmg-builder@26.0.12)(electron-builder-squirrel-windows@25.1.8): + app-builder-lib@25.1.8(dmg-builder@26.0.19)(electron-builder-squirrel-windows@25.1.8): dependencies: '@develar/schema-utils': 2.6.5 '@electron/notarize': 2.5.0 @@ -4357,11 +4269,11 @@ snapshots: chromium-pickle-js: 0.2.0 config-file-ts: 0.2.8-rc1 debug: 4.4.0 - dmg-builder: 26.0.12(electron-builder-squirrel-windows@25.1.8) + dmg-builder: 26.0.19(electron-builder-squirrel-windows@25.1.8) dotenv: 16.4.5 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.0.12) + electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.0.19) electron-publish: 25.1.7 form-data: 4.0.1 fs-extra: 10.1.0 @@ -4371,7 +4283,7 @@ snapshots: js-yaml: 4.1.0 json5: 2.2.3 lazy-val: 1.0.5 - minimatch: 10.0.1 + minimatch: 10.0.3 resedit: 1.7.2 sanitize-filename: 1.6.3 semver: 7.7.0 @@ -4381,43 +4293,44 @@ snapshots: - bluebird - supports-color - app-builder-lib@26.0.12(dmg-builder@26.0.12)(electron-builder-squirrel-windows@25.1.8): + app-builder-lib@26.0.19(dmg-builder@26.0.19)(electron-builder-squirrel-windows@25.1.8): dependencies: '@develar/schema-utils': 2.6.5 - '@electron/asar': 3.2.18 + '@electron/asar': 3.4.1 '@electron/fuses': 1.8.0 '@electron/notarize': 2.5.0 - '@electron/osx-sign': 1.3.1 - '@electron/rebuild': 3.7.0 - '@electron/universal': 2.0.1 + '@electron/osx-sign': 1.3.3 + '@electron/rebuild': 3.7.2 + '@electron/universal': 2.0.3 '@malept/flatpak-bundler': 0.4.0 '@types/fs-extra': 9.0.13 async-exit-hook: 2.0.1 - builder-util: 26.0.11 - builder-util-runtime: 9.3.1 + builder-util: 26.0.19 + builder-util-runtime: 9.3.3 chromium-pickle-js: 0.2.0 - config-file-ts: 0.2.8-rc1 + ci-info: 4.3.0 debug: 4.4.0 - dmg-builder: 26.0.12(electron-builder-squirrel-windows@25.1.8) + dmg-builder: 26.0.19(electron-builder-squirrel-windows@25.1.8) dotenv: 16.4.5 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.0.12) - electron-publish: 26.0.11 + electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.0.19) + electron-publish: 26.0.19 fs-extra: 10.1.0 hosted-git-info: 4.1.0 - is-ci: 3.0.1 isbinaryfile: 5.0.4 + jiti: 2.5.1 js-yaml: 4.1.0 json5: 2.2.3 lazy-val: 1.0.5 - minimatch: 10.0.1 + minimatch: 10.0.3 plist: 3.1.0 resedit: 1.7.2 semver: 7.7.0 tar: 6.2.1 temp-file: 3.4.0 tiny-async-pool: 1.3.0 + which: 5.0.0 transitivePeerDependencies: - bluebird - supports-color @@ -4579,6 +4492,13 @@ snapshots: transitivePeerDependencies: - supports-color + builder-util-runtime@9.3.3: + dependencies: + debug: 4.4.0 + sax: 1.4.1 + transitivePeerDependencies: + - supports-color + builder-util@25.1.7: dependencies: 7zip-bin: 5.2.0 @@ -4600,19 +4520,19 @@ snapshots: transitivePeerDependencies: - supports-color - builder-util@26.0.11: + builder-util@26.0.19: dependencies: 7zip-bin: 5.2.0 '@types/debug': 4.1.12 app-builder-bin: 5.0.0-alpha.12 - builder-util-runtime: 9.3.1 + builder-util-runtime: 9.3.3 chalk: 4.1.2 + ci-info: 4.3.0 cross-spawn: 7.0.6 debug: 4.4.0 fs-extra: 10.1.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 - is-ci: 3.0.1 js-yaml: 4.1.0 sanitize-filename: 1.6.3 source-map-support: 0.5.21 @@ -4686,6 +4606,8 @@ snapshots: ci-info@3.9.0: {} + ci-info@4.3.0: {} + clean-stack@2.2.0: {} cli-cursor@3.1.0: @@ -4752,8 +4674,6 @@ snapshots: commander@5.1.0: {} - commondir@1.0.1: {} - compare-version@0.1.2: {} compress-commons@4.1.2: @@ -4802,6 +4722,7 @@ snapshots: debug@4.3.7: dependencies: ms: 2.1.3 + optional: true debug@4.4.0: dependencies: @@ -4814,8 +4735,6 @@ snapshots: deep-extend@0.6.0: optional: true - deepmerge@4.3.1: {} - defaults@1.0.4: dependencies: clone: 1.0.4 @@ -4856,11 +4775,10 @@ snapshots: dependencies: path-type: 4.0.0 - dmg-builder@26.0.12(electron-builder-squirrel-windows@25.1.8): + dmg-builder@26.0.19(electron-builder-squirrel-windows@25.1.8): dependencies: - app-builder-lib: 26.0.12(dmg-builder@26.0.12)(electron-builder-squirrel-windows@25.1.8) - builder-util: 26.0.11 - builder-util-runtime: 9.3.1 + app-builder-lib: 26.0.19(dmg-builder@26.0.19)(electron-builder-squirrel-windows@25.1.8) + builder-util: 26.0.19 fs-extra: 10.1.0 iconv-lite: 0.6.3 js-yaml: 4.1.0 @@ -4895,9 +4813,9 @@ snapshots: dependencies: jake: 10.9.2 - electron-builder-squirrel-windows@25.1.8(dmg-builder@26.0.12): + electron-builder-squirrel-windows@25.1.8(dmg-builder@26.0.19): dependencies: - app-builder-lib: 25.1.8(dmg-builder@26.0.12)(electron-builder-squirrel-windows@25.1.8) + app-builder-lib: 25.1.8(dmg-builder@26.0.19)(electron-builder-squirrel-windows@25.1.8) archiver: 5.3.2 builder-util: 25.1.7 fs-extra: 10.1.0 @@ -4906,15 +4824,15 @@ snapshots: - dmg-builder - supports-color - electron-builder@26.0.12(electron-builder-squirrel-windows@25.1.8): + electron-builder@26.0.19(electron-builder-squirrel-windows@25.1.8): dependencies: - app-builder-lib: 26.0.12(dmg-builder@26.0.12)(electron-builder-squirrel-windows@25.1.8) - builder-util: 26.0.11 - builder-util-runtime: 9.3.1 + app-builder-lib: 26.0.19(dmg-builder@26.0.19)(electron-builder-squirrel-windows@25.1.8) + builder-util: 26.0.19 + builder-util-runtime: 9.3.3 chalk: 4.1.2 - dmg-builder: 26.0.12(electron-builder-squirrel-windows@25.1.8) + ci-info: 4.3.0 + dmg-builder: 26.0.19(electron-builder-squirrel-windows@25.1.8) fs-extra: 10.1.0 - is-ci: 3.0.1 lazy-val: 1.0.5 simple-update-notifier: 2.0.0 yargs: 17.7.2 @@ -4949,11 +4867,11 @@ snapshots: transitivePeerDependencies: - supports-color - electron-publish@26.0.11: + electron-publish@26.0.19: dependencies: '@types/fs-extra': 9.0.13 - builder-util: 26.0.11 - builder-util-runtime: 9.3.1 + builder-util: 26.0.19 + builder-util-runtime: 9.3.3 chalk: 4.1.2 form-data: 4.0.1 fs-extra: 10.1.0 @@ -4977,7 +4895,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@36.5.0: + electron@37.2.6: dependencies: '@electron/get': 2.0.3 '@types/node': 22.10.1 @@ -5014,8 +4932,6 @@ snapshots: es-errors@1.3.0: optional: true - es-module-lexer@1.5.4: {} - es6-error@4.1.1: optional: true @@ -5071,33 +4987,6 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 - esbuild@0.24.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 - escalade@3.2.0: {} escape-goat@4.0.0: {} @@ -5153,10 +5042,6 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.4.2(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - filelist@1.0.4: dependencies: minimatch: 5.1.6 @@ -5447,10 +5332,6 @@ snapshots: dependencies: ci-info: 3.9.0 - is-core-module@2.15.1: - dependencies: - hasown: 2.0.2 - is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -5469,18 +5350,12 @@ snapshots: is-lambda@1.0.1: {} - is-module@1.0.0: {} - is-number@7.0.0: {} is-plain-obj@1.1.0: {} is-plain-object@3.0.1: {} - is-reference@1.2.1: - dependencies: - '@types/estree': 1.0.6 - is-unicode-supported@0.1.0: {} isarray@1.0.0: {} @@ -5491,6 +5366,8 @@ snapshots: isexe@2.0.0: {} + isexe@3.1.1: {} + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -5504,6 +5381,8 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + jiti@2.5.1: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -5688,9 +5567,9 @@ snapshots: mimic-response@3.1.0: {} - minimatch@10.0.1: + minimatch@10.0.3: dependencies: - brace-expansion: 2.0.1 + '@isaacs/brace-expansion': 5.0.0 minimatch@3.1.2: dependencies: @@ -5965,12 +5844,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@1.22.8: - dependencies: - is-core-module: 2.15.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - responselike@2.0.1: dependencies: lowercase-keys: 2.0.0 @@ -6015,26 +5888,27 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.1 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.1 - rolldown@1.0.0-beta.7(typescript@5.7.2): + rolldown@1.0.0-beta.31: dependencies: - '@oxc-project/types': 0.61.2 - '@valibot/to-json-schema': 1.0.0(valibot@1.0.0(typescript@5.7.2)) - valibot: 1.0.0(typescript@5.7.2) + '@oxc-project/runtime': 0.80.0 + '@oxc-project/types': 0.80.0 + '@rolldown/pluginutils': 1.0.0-beta.31 + ansis: 4.1.0 optionalDependencies: - '@rolldown/binding-darwin-arm64': 1.0.0-beta.7 - '@rolldown/binding-darwin-x64': 1.0.0-beta.7 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.7 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.7 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.7 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.7 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.7 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.7 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.7 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.7 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.7 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.7 - transitivePeerDependencies: - - typescript + '@rolldown/binding-android-arm64': 1.0.0-beta.31 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.31 + '@rolldown/binding-darwin-x64': 1.0.0-beta.31 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.31 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.31 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.31 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.31 + '@rolldown/binding-linux-arm64-ohos': 1.0.0-beta.31 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.31 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.31 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.31 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.31 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.31 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.31 rollup-plugin-copy@3.5.0: dependencies: @@ -6044,17 +5918,6 @@ snapshots: globby: 10.0.1 is-plain-object: 3.0.1 - rollup-plugin-esbuild@6.1.1(esbuild@0.24.0)(rollup@4.27.4): - dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.27.4) - debug: 4.3.7 - es-module-lexer: 1.5.4 - esbuild: 0.24.0 - get-tsconfig: 4.8.1 - rollup: 4.27.4 - transitivePeerDependencies: - - supports-color - rollup@4.27.4: dependencies: '@types/estree': 1.0.6 @@ -6078,6 +5941,7 @@ snapshots: '@rollup/rollup-win32-ia32-msvc': 4.27.4 '@rollup/rollup-win32-x64-msvc': 4.27.4 fsevents: 2.3.3 + optional: true run-parallel@1.2.0: dependencies: @@ -6359,10 +6223,6 @@ snapshots: util-deprecate@1.0.2: {} - valibot@1.0.0(typescript@5.7.2): - optionalDependencies: - typescript: 5.7.2 - validate-html-nesting@1.2.2: {} verror@1.10.1: @@ -6380,6 +6240,10 @@ snapshots: dependencies: isexe: 2.0.0 + which@5.0.0: + dependencies: + isexe: 3.1.1 + wide-align@1.1.5: dependencies: string-width: 4.2.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index c4e89fc..0000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,6 +0,0 @@ -onlyBuiltDependencies: - - '@biomejs/biome' - - '@parcel/watcher' - - '@vencord/venmic' - - electron - - esbuild \ No newline at end of file diff --git a/rolldown.config.js b/rolldown.config.js index 5bbb8d7..93a8238 100644 --- a/rolldown.config.js +++ b/rolldown.config.js @@ -102,8 +102,8 @@ export default defineConfig([ external: electronExternals, plugins: [ babel({ - presets: ["solid", "@babel/preset-flow"], - babelHelpers: "bundled", + presets: ["solid", "@babel/preset-flow", "@babel/preset-typescript"], + babelHelpers: "inline", exclude: "node_modules/**", extensions: [".ts", ".tsx"], }), diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index 8ee4650..0000000 --- a/rollup.config.js +++ /dev/null @@ -1,133 +0,0 @@ -// @ts-check - -import babel from "@rollup/plugin-babel"; -import commonjs from "@rollup/plugin-commonjs"; -import esmShim from "@rollup/plugin-esm-shim"; -import json from "@rollup/plugin-json"; -import nodeResolve from "@rollup/plugin-node-resolve"; -import replace from "@rollup/plugin-replace"; -import typescript from "@rollup/plugin-typescript"; -import { defineConfig } from "rollup"; -import copy from "rollup-plugin-copy"; -import { minify } from "rollup-plugin-esbuild"; - -const prodEnv = process.env.BUILD === "prod"; - -const electronExternals = ["electron", "node:fs", "node:path", "node:os", "node:url", "@vencord/venmic"]; - -export default defineConfig([ - { - input: "src/main.ts", - output: { - dir: "ts-out", - format: "esm", - sourcemap: true, - }, - external: [ - ...electronExternals, - "electron", - "electron-is-dev", - "electron-updater", - "electron-context-menu", - "arrpc", - "path", - "stream", - "stream/promises", - ], - plugins: [ - commonjs(), - esmShim(), - json(), - minify({ minify: prodEnv }), - typescript(), - copy({ - targets: [ - { src: "src/**/**/*.html", dest: "ts-out/html/" }, - { src: "src/**/**/*.css", dest: "ts-out/css/" }, - { src: "src/**/**/*.js", dest: "ts-out/js/" }, - { src: "package.json", dest: "ts-out/" }, - { src: "assets/**/**", dest: "ts-out/assets/" }, - ], - }), - ], - }, - { - input: "src/rpc.ts", - output: { - dir: "ts-out", - format: "esm", - sourcemap: true, - }, - external: [...electronExternals, "arrpc"], - plugins: [commonjs(), esmShim(), json(), minify({ minify: prodEnv }), typescript()], - }, - { - input: "src/discord/preload/preload.mts", - output: { - dir: "ts-out/discord", - entryFileNames: "[name].mjs", - format: "esm", - sourcemap: true, - }, - external: electronExternals, - plugins: [typescript(), minify({ minify: prodEnv })], - }, - { - input: "src/splash/preload.mts", - output: { - dir: "ts-out/splash", - format: "esm", - entryFileNames: "[name].mjs", - sourcemap: true, - }, - external: electronExternals, - plugins: [typescript(), minify({ minify: prodEnv })], - }, - { - input: "src/setup/preload.mts", - output: { - dir: "ts-out/setup", - format: "esm", - entryFileNames: "[name].mjs", - sourcemap: true, - }, - external: electronExternals, - plugins: [typescript(), minify({ minify: prodEnv })], - }, - { - input: "src/cssEditor/preload.mts", - output: { - dir: "ts-out/cssEditor", - format: "esm", - entryFileNames: "[name].mjs", - sourcemap: true, - }, - external: electronExternals, - plugins: [typescript(), minify({ minify: prodEnv })], - }, - { - input: "src/setup/setup.tsx", - output: { - dir: "ts-out/html", - format: "esm", - entryFileNames: "[name].js", - sourcemap: true, - }, - external: electronExternals, - plugins: [ - commonjs(), - replace({ - "process.env.NODE_ENV": JSON.stringify("production"), - }), - nodeResolve({ browser: true }), - typescript(), - minify({ minify: prodEnv }), - babel({ - presets: ["solid"], - babelHelpers: "bundled", - exclude: "node_modules/**", - extensions: [".ts", ".tsx"], - }), - ], - }, -]); From f2d9dc0fa9a422e9d7380d6bf7e67c492707f602 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 8 Aug 2025 23:29:55 +0200 Subject: [PATCH 658/844] fix: fallback to english in settings if key is missing fixes: https://github.com/Legcord/Legcord/issues/944 --- src/common/lang.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/common/lang.ts b/src/common/lang.ts index 1c9e4f9..cf6f367 100644 --- a/src/common/lang.ts +++ b/src/common/lang.ts @@ -67,8 +67,16 @@ export function getRawLang(): i18nStrings { if (!fs.existsSync(langPath)) { langPath = path.join(import.meta.dirname, "../", "/assets/lang/en-US.json"); } + const fallbackPath = path.join(import.meta.dirname, "../", "/assets/lang/en-US.json"); const rawData = fs.readFileSync(langPath, "utf-8"); const parsed = JSON.parse(rawData) as i18nStrings; + const fallbackData = fs.readFileSync(fallbackPath, "utf-8"); + const fallbackParsed = JSON.parse(fallbackData) as i18nStrings; + for (const key in fallbackParsed) { + if (parsed[key] === undefined) { + parsed[key] = fallbackParsed[key]; + } + } return parsed; } export function getLangName(): string { From 837265953fe001b1d54d2f25672306b1dc007487 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sat, 9 Aug 2025 16:31:34 +0200 Subject: [PATCH 659/844] chore: refresh i18n --- assets/lang/ar-AA.json | 91 ---------------------------------------- assets/lang/cs-CZ.json | 91 ---------------------------------------- assets/lang/da-DK.json | 91 ---------------------------------------- assets/lang/de-DE.json | 91 ---------------------------------------- assets/lang/es-419.json | 91 ---------------------------------------- assets/lang/fa-IR.json | 91 ---------------------------------------- assets/lang/fi-FI.json | 91 ---------------------------------------- assets/lang/fil.json | 91 ---------------------------------------- assets/lang/fr-FR.json | 91 ---------------------------------------- assets/lang/hu-HU.json | 91 ---------------------------------------- assets/lang/id-ID.json | 91 ---------------------------------------- assets/lang/it-IT.json | 91 ---------------------------------------- assets/lang/ja-JP.json | 91 ---------------------------------------- assets/lang/ko-KR.json | 91 ---------------------------------------- assets/lang/lt-LT.json | 91 ---------------------------------------- assets/lang/nb-NO.json | 91 ---------------------------------------- assets/lang/nl-NL.json | 91 ---------------------------------------- assets/lang/pl-PL.json | 91 ---------------------------------------- assets/lang/pt-BR.json | 91 ---------------------------------------- assets/lang/pt-PT.json | 91 ---------------------------------------- assets/lang/ro-RO.json | 91 ---------------------------------------- assets/lang/ru-RU.json | 91 ---------------------------------------- assets/lang/sk-SK.json | 91 ---------------------------------------- assets/lang/sv-SE.json | 91 ---------------------------------------- assets/lang/th-TH.json | 91 ---------------------------------------- assets/lang/tr-TR.json | 91 ---------------------------------------- assets/lang/uk-UA.json | 91 ---------------------------------------- assets/lang/zh-Hans.json | 91 ---------------------------------------- assets/lang/zh-Hant.json | 91 ---------------------------------------- 29 files changed, 2639 deletions(-) delete mode 100644 assets/lang/ar-AA.json delete mode 100644 assets/lang/cs-CZ.json delete mode 100644 assets/lang/da-DK.json delete mode 100644 assets/lang/de-DE.json delete mode 100644 assets/lang/es-419.json delete mode 100644 assets/lang/fa-IR.json delete mode 100644 assets/lang/fi-FI.json delete mode 100644 assets/lang/fil.json delete mode 100644 assets/lang/fr-FR.json delete mode 100644 assets/lang/hu-HU.json delete mode 100644 assets/lang/id-ID.json delete mode 100644 assets/lang/it-IT.json delete mode 100644 assets/lang/ja-JP.json delete mode 100644 assets/lang/ko-KR.json delete mode 100644 assets/lang/lt-LT.json delete mode 100644 assets/lang/nb-NO.json delete mode 100644 assets/lang/nl-NL.json delete mode 100644 assets/lang/pl-PL.json delete mode 100644 assets/lang/pt-BR.json delete mode 100644 assets/lang/pt-PT.json delete mode 100644 assets/lang/ro-RO.json delete mode 100644 assets/lang/ru-RU.json delete mode 100644 assets/lang/sk-SK.json delete mode 100644 assets/lang/sv-SE.json delete mode 100644 assets/lang/th-TH.json delete mode 100644 assets/lang/tr-TR.json delete mode 100644 assets/lang/uk-UA.json delete mode 100644 assets/lang/zh-Hans.json delete mode 100644 assets/lang/zh-Hant.json diff --git a/assets/lang/ar-AA.json b/assets/lang/ar-AA.json deleted file mode 100644 index 7cd8eae..0000000 --- a/assets/lang/ar-AA.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_offline": "يبدو أنك غير متصل. يجب عليك الاتصال بالانترنت والمحاولة مرة أخرى.", - "settings-disableAutogain-desc": "تعطيل الكسب التلقائي.", - "settings-startMinimized": "ابدأ مصغر", - "settings-trayIcon-white-plug-alt": "المكونات البيضاء بديل", - "settings-trayIcon-dynamic": "متحرك", - "settings-spellcheck-desc": "يساعدك على تصحيح الكلمات التي بها أخطاء إملائية من خلال تمييزها.", - "settings-theme-default": "الافتراضى", - "settings-skipSplash": "تخطي شاشة البداية (تجريبية)", - "settings-forceNativeCrash": "فرض تحطم الأصلي", - "settings-trayIcon-white-plug": "المكونات البيضاء", - "settings-mod-vencord": "خفيف الوزن وسهل الاستخدام. يتميز بمتجر مدمج للمكونات الإضافية.", - "settings-trayIcon": "ايقونة واجهة المستخدم", - "settings-prfmMode-battery": "البطارية", - "settings-prfmMode": "وضع الاداء", - "settings-trayIcon-black-plug-alt": "المكونات السوداء بديل", - "setup_question2": "اختر قناة/مثال Discord الخاص بك:", - "next": "التالى", - "settings-spellcheck": "فحص اللغة", - "no": "لا", - "settings-updater": "افحص التحديثات", - "settings-theme": "مظهر Legcord", - "settings-mintoTray-desc": "عند تعطيله، سيتم إغلاق Legcord مثل أي نافذة أخرى عند إغلاقه، وإلا فإنه سيجلس ويسترخي\n في علبة النظام الخاص بك في وقت لاحق.", - "settings-MultiInstance": "تعدد اللحظات", - "settings-storageFolder": "افتح مجلد التخزين", - "settings-mobileMode-desc": "إذا كنت تستخدم جهازًا مزودًا بشاشة تعمل باللمس، فهذه الميزة تناسبك! يقوم بتنشيط هاتف Discord المخفي\n الوضع مخصص للهواتف والأجهزة اللوحية. الميزة الرئيسية الوحيدة المفقودة هي دعم الدردشة الصوتية. هذا مثالي ل\n المستخدمين على PinePhone وما شابه ذلك.", - "settings-restart": "اعد التشغيل", - "settings-prfmMode-performance": "الاداء", - "yes": "نعم", - "settings-mobileMode": "وضع المحمول", - "setup_question4": "اختار client mod الذى تريد تسطيبه:", - "settings-theme-native": "التطبيق", - "settings-themesFolder": "افتح ملف الثيمات", - "setup_offline": "يبدو أنك غير متصل. يجب عليك الاتصال بالانترنت واعادة تشغيل Legcord.", - "setup_question1": "مرحبا بك فى اعداد Legcord", - "settings-copyDebugInfo": "انسخ معلومات التصحيح", - "settings-mod-desc1": "تعديلات العميل هي برامج تسمح لك بتخصيص تجربة Discord الخاصة بك. يمكنهم تغيير مظهر\n العميل، تعديل سلوكياته أو إضافة ميزات جديدة!", - "settings-skipSplash-desc": "يتخطى شاشة بداية Legcord عند بدء تشغيل التطبيق.", - "setup_question3": "هل يجب ان يقوم Legcord بتولى تسطيب client mods؟", - "settings-MultiInstance-desc": "عند التمكين، ستتمكن من بدء تشغيل العديد من مثيلات Legcord.", - "settings-useLegacyCapturer-desc": "استخدم وحدة مشاركة الشاشة القديمة، بدلاً من الوحدة الجديدة. إذا كنت تواجه مشكلات في مشاركة الشاشة، فحاول تمكين هذا.", - "settings-invitewebsocket-desc": "يستخدم
    arRPC لدعم Discord RPC (التواجد الغني) مع البرامج المحلية على جهازك. أعمال جارية.", - "settings-theme-transparent": "شفاف", - "settings-crashesFolder": "افتح مجلد الأعطال الأصلي", - "settings-trayIcon-black-plug": "المكونات السوداء", - "settings-prfmMode-desc": "وضع الأداء هو وظيفة تجريبية قد تؤدي إما إلى زيادة الاستجابة والأداء\n Legcord أو ... قم بتقليله. يرجى تجربة كل خيار ومعرفة ما يناسبك بشكل أفضل.", - "settings-channel": "Discord قناة", - "settings-mod": "اضافة العميل", - "settings-trayIcon-desc": "قم بتعيين الرمز الذي سيظهر في قائمة الدرج.", - "settings-advanced": "منطقة المستخدم المتقدمة", - "loading_screen_start": "يبدأ Legcord …", - "setup_question5": "هل تريد استخدام أيقونة واجهة المستخدم؟", - "settings-invitewebsocket": "حضور غني (تجريبي)", - "settings-save": "احفظ الاعدادات", - "settings-tray-desc": "عند تعطيله، سيتم إغلاق Legcord مثل أي نافذة أخرى عند إغلاقه، وإلا فإنه سيجلس ويسترخي في علبة النظام لديك لوقت لاحق.", - "settings-useLegacyCapturer": "استخدم الماسك القديم", - "settings-startMinimized-desc": "يبدأ Legcord في الخلفية ويظل بعيدًا عن طريقك.", - "settings-pluginsFolder": "افتح ملف الاضافات", - "settings-tray": "واجهة", - "settings-trayIcon-normal": "Discord ايقونة", - "settings-mintoTray": "التصغير الى واجهة المستخدم", - "settings-trayIcon-colored-plug": "المكونات الملونة", - "settings-trayIcon-classic": "أيقونة Discord الكلاسيكية", - "settings-disableAutogain": "وقف الدخول التلقائى", - "loading_screen_update": "نسخة جديدة متوفرة من Legcord.من فضلك قم بالتحديث الى آخر نسخة.", - "settings-experimental": "تجريبى", - "settings-none": "لا شئ", - "settings-csp-desc": "Legcord CSP هو نظامنا الذي يدير تحميل المحتوى المخصص في تطبيق Discord. أشياء من هذا القبيل\n تعتمد تعديلات العميل وموضوعاته على ذلك. قم بتعطيله إذا كنت تريد التخلص من التعديلات والأنماط المخصصة.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/cs-CZ.json b/assets/lang/cs-CZ.json deleted file mode 100644 index 8a4808b..0000000 --- a/assets/lang/cs-CZ.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "settings-invitewebsocket": "Rich Presence (Experimentalní)", - "loading_screen_start": "Spouštění Legcordu…", - "loading_screen_offline": "Zdá se, že jste offline. Připojte se k internetu a zkuste to znovu.", - "loading_screen_update": "Je nová verze Legcordu k dispozici. Prosím aktualizujte na nejnovější verzi.", - "setup_question1": "Vyberte, jaký druh instalace chcete provést:", - "setup_offline": "Zdá se, že jste offline. Připojte se k internetu a restartujte Legcord.", - "setup_question2": "Vyberte svůj Discord kanál/instanci:", - "setup_question3": "Měl by Legcord nainstalovat klientské mody?", - "yes": "Ano", - "no": "Ne", - "next": "Další", - "setup_question4": "Vyberte klientský mod, který chcete nainstalovat:", - "settings-theme": "Legcord motiv", - "settings-theme-default": "Výchozí", - "settings-theme-native": "Nativní", - "settings-theme-transparent": "Transparentní (Experimentální)", - "settings-csp-desc": "Legcord CSP je náš systém, který spravuje načítání vlastního obsahu načítání do aplikace Discord. Věci jako\n klientské mody a témata závisí na tom. Pokud se chcete zbavit modů a vlastních stylů, vypněte tuto možnost.", - "settings-tray": "Minimalizovat do lišty", - "settings-tray-desc": "Pokud vypnuto, Legcord se zavře jako každé jiné okno, bude\n v systémové liště na později.", - "settings-startMinimized": "Spuštění minimalizováno", - "settings-startMinimized-desc": "Legcord se spustí na pozadí a zůstane vám z cesty.", - "settings-useLegacyCapturer": "Použijte starší zachytávač", - "settings-useLegacyCapturer-desc": "Místo nového použijte starší modul pro sdílení obrazovky. Pokud máte problémy se sdílením obrazovky, zkuste tohle povolit.", - "settings-mobileMode": "Mobilní mód", - "settings-mobileMode-desc": "Pokud používáte zařízení s dotykovou obrazovkou, tato funkce je pro vás! Aktivuje skrytý mobil Discordu\n režim určený pro telefony a tablety. Jedinou hlavní funkcí, která chybí, je podpora hlasového chatu. Toto je ideální pro\n uživatelé PinePhone a podobně.", - "settings-channel": "Discord kanál", - "settings-invitewebsocket-desc": "Používá arRPC k podpoře Discord RPC (Rich Presence) s místními programy na vašem počítači. Není dokončeno.", - "settings-mod": "Mód klienta", - "settings-mod-desc1": "Klientské mody jsou programy, které vám umožňují přizpůsobit si zážitek z aplikace Discord. Mohou změnit vzhled\n klienta, upravit chování nebo přidat nové funkce!", - "settings-mod-vencord": "lehký a snadno použitelný klientský mod. Obsahuje vestavěný obchod pro pluginy.", - "settings-prfmMode": "Výkonový režim", - "settings-prfmMode-desc": "Režim výkonu je experimentální funkce, která může snížit odezvu a zvýšit výkon\n Legcordu nebo... snížit. Vyzkoušejte prosím každou možnost a uvidíte, která vám vyhovuje nejlépe.", - "settings-prfmMode-performance": "Výkon", - "settings-prfmMode-battery": "Baterie", - "settings-disableAutogain": "Vypne funkci autogain", - "settings-disableAutogain-desc": "Vypnout autogain.", - "settings-trayIcon": "Ikona zásobníku", - "settings-trayIcon-desc": "Nastavte ikonu, která se zobrazí v nabídce zásobníku.", - "settings-trayIcon-dynamic": "Dynamická", - "settings-trayIcon-normal": "Discord Ikona", - "settings-trayIcon-classic": "Classická Discord Icona", - "settings-trayIcon-colored-plug": "Barevná zástrčka", - "settings-trayIcon-white-plug": "Bílá zástrčka", - "settings-trayIcon-white-plug-alt": "Alternativa bílá zástrčka", - "settings-trayIcon-black-plug": "Černá zástrčka", - "settings-trayIcon-black-plug-alt": "Alternativa černá zástrčka", - "settings-advanced": "Pokročilá uživatelská zóna", - "settings-pluginsFolder": "Otevřít složku pluginů", - "settings-crashesFolder": "Otevřít složku nativních selhání", - "settings-themesFolder": "Otevřít složku motivů", - "settings-storageFolder": "Otevřít složku úložiště", - "settings-none": "Nic", - "settings-save": "Uložit nastavení", - "settings-experimental": "Experimentalní", - "settings-restart": "Restartovat aplikaci", - "settings-updater": "Kontrola aktualizací", - "settings-skipSplash": "Přeskočit úvodní obrazovku (Experimentální)", - "settings-skipSplash-desc": "Při spuštění aplikace přeskočí úvodní obrazovku Legcord.", - "settings-copyDebugInfo": "Kopírovat informace o ladění", - "settings-forceNativeCrash": "Vynutit nativní havárii", - "settings-spellcheck": "Spellcheck", - "settings-spellcheck-desc": "Helps you correct misspelled words by highlighting them.", - "setup_question5": "Do you want to use a tray icon?", - "settings-mintoTray": "Minimize to tray", - "settings-mintoTray-desc": "When disabled, Legcord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.", - "settings-MultiInstance": "Multi Instance", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of Legcord.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio": "Audio", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/da-DK.json b/assets/lang/da-DK.json deleted file mode 100644 index 6ca8774..0000000 --- a/assets/lang/da-DK.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "settings-mod-desc1": "Client mods are programs that allow you customize your Discord experience. They can change appearance of\n the client, modify behaviours or add new features!", - "settings-skipSplash-desc": "Skips Legcord splash screen when you start up the app.", - "setup_question3": "Skal Legcord håndtere klient mods installation?", - "settings-MultiInstance-desc": "Når slået til vil du kunne starte flere instanser af Legcord.", - "settings-useLegacyCapturer-desc": "Brug gammel/legacy skærmdelings modul, istedet for den nye. Hvis du oplever problemer med skærmdeling, så slå dette til.", - "settings-invitewebsocket-desc": "Bruger arRPC til at understøtte Discord RPC (Rich Presence) med lokale programmer på din maskine. Igangværende Arbejde.", - "settings-theme-transparent": "Gennemsigtig", - "settings-crashesFolder": "Open native crashes folder", - "settings-trayIcon-black-plug": "Black Plug", - "settings-prfmMode-desc": "Performance mode is an experimental function that may either increase responsiveness and performance of\n Legcord or… decrease it. Please try every option and see which fits you the best.", - "settings-channel": "Discord kanal", - "settings-mod": "Klient mod", - "settings-trayIcon-desc": "Set the icon which will appear in tray menu.", - "settings-advanced": "Advanced user zone", - "loading_screen_start": "Starter Legcord…", - "setup_question5": "Vil du bruge et tray ikon?", - "settings-invitewebsocket": "\"Rich Presence\" (Eksperimentalt)", - "settings-save": "Save Settings", - "settings-prfmMode-vaapi": "VAAPI", - "settings-tray-desc": "Når slået fra, vil Legcord lukke ligesom alle andre vinduer når lukket, ellers vil det læne sig tilbage og slappe af i din system tray til senere.", - "settings-useLegacyCapturer": "Brug gammel/legacy optager", - "settings-startMinimized-desc": "Legcord starter i baggrunden og forbliver ude af din vej", - "settings-pluginsFolder": "Open plugins folder", - "settings-tray": "Tray", - "settings-trayIcon-normal": "Discord Icon", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-mintoTray": "Arbejd i baggrunden", - "settings-trayIcon-colored-plug": "Colored Plug", - "settings-trayIcon-classic": "Classic Discord Icon", - "settings-disableAutogain": "Disable autogain", - "loading_screen_update": "En ny version af Legcord er tilgængelig. Venligst opdater til den nyeste version.", - "settings-experimental": "Experimental", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-none": "None", - "settings-csp-desc": "Legcord CSP er vores system der håndterer indlæsning af brugerdefineret indhold der bliver indlæst til Discord. Ting som klient mods og temaer er afhængige af det. Slå det fra hvis du vil afskaffe mods og brugerdefinerede stile.", - "loading_screen_offline": "Det virker til du er offline. Prøver igen om ", - "settings-disableAutogain-desc": "Disables autogain.", - "settings-startMinimized": "Start minimeret", - "settings-trayIcon-white-plug-alt": "White Plug Alt", - "settings-trayIcon-dynamic": "Dynamic", - "settings-spellcheck-desc": "Hjælper dig med at rette fejlstavede ord ved at highlight dem.", - "settings-theme-default": "Standard", - "settings-skipSplash": "Skip Splash Screen (Experimental)", - "settings-forceNativeCrash": "Force native crash", - "settings-trayIcon-white-plug": "White Plug", - "settings-mod-vencord": "lightweight, and easy to use client mod. Features a built-in store for plugins.", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-trayIcon": "Tray icon", - "settings-prfmMode-battery": "Battery", - "settings-prfmMode": "Performance mode", - "settings-trayIcon-black-plug-alt": "Black Plug Alt", - "setup_question2": "Vælg din Discord kanal/forekomst:", - "next": "Næste", - "settings-spellcheck": "Stavekontrol", - "no": "Nej", - "settings-autoScroll": "Allow auto-scroll", - "settings-smoothScroll": "Use smooth scrolling", - "settings-updater": "Check for updates", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme": "Legcord tema", - "settings-mintoTray-desc": "Når slået fra, vil Legcord lukke alle andre vinduer når lukket, ellers vil det læne sig tilbage og slappe af i din tray til senere.", - "settings-MultiInstance": "Multi Instance", - "settings-storageFolder": "Open storage folder", - "settings-mobileMode-desc": "Hvis du er på en enhed med touchskærm, så er denne funktion for dig! Den aktiverer Discords gemte mobiltilstand, beregnet til telefoner og tablets. Den eneste store funktion der mangler er stemme opkald. Dette er idealt for brugere på PinePhone og ligende.", - "settings-restart": "Restart App", - "settings-prfmMode-performance": "Performance", - "yes": "Ja", - "settings-mobileMode": "Mobiltilstand", - "setup_question4": "Vælg en klient mod du vil installere:", - "settings-theme-native": "Indbygget", - "settings-themesFolder": "Open themes folder", - "setup_offline": "Du virker til at være offline. Venligst forbind til internettet og genstart Legcord.", - "setup_question1": "Velkommen til Legcord Installationen", - "settings-copyDebugInfo": "Copy Debug Info", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/de-DE.json b/assets/lang/de-DE.json deleted file mode 100644 index 406dc3d..0000000 --- a/assets/lang/de-DE.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "yes": "Ja", - "settings-theme-default": "Standard", - "settings-startMinimized": "Minimiert starten", - "settings-startMinimized-desc": "Legcord startet im Hintergrund und bleibt dir aus dem Weg.", - "settings-channel": "Discord-Kanal", - "settings-prfmMode": "Leistungsmodus", - "settings-pluginsFolder": "Plugins-Ordner öffnen", - "settings-none": "Keine", - "settings-save": "Einstellungen speichern", - "settings-experimental": "Experimentell", - "settings-restart": "App neustarten", - "loading_screen_start": "Starte Legcord…", - "settings-copyDebugInfo": "Debug-Informationen kopieren", - "loading_screen_update": "Eine neue Version von Legcord ist verfügbar. Bitte aktualisiere auf die neuste Version.", - "setup_question1": "Willkommen bei der Einrichtung von Legcord", - "loading_screen_offline": "Du scheinst offline zu sein. Neustart in ", - "setup_offline": "Du scheinst offline zu sein. Bitte verbinde dich mit dem Internet und starte Legcord neu.", - "setup_question2": "Wähle deinen Discord Kanal/Instanz:", - "setup_question3": "Soll Legcord die Installation von Client-Mods übernehmen?", - "setup_question4": "Wähle einen Client-Mod, den du installieren möchtest:", - "no": "Nein", - "next": "Weiter", - "setup_question5": "Möchten du ein Taskleistensymbol verwenden?", - "settings-theme": "Windows-Stil", - "settings-theme-native": "Nativ", - "settings-theme-transparent": "Transparent", - "settings-mintoTray": "Im Hintergrund arbeiten", - "settings-mintoTray-desc": "Wenn diese Funktion deaktiviert ist, wird Legcord wie jedes andere Fenster geschlossen, andernfalls bleibt es in deiner Systemablage.", - "settings-csp-desc": "Legcord CSP ist unser System, das das Laden von benutzerdefinierten Inhalten in die Discord-App verwaltet.\nDinge wie Client-Mods und Themes hängen davon ab. Deaktiviere es, wenn du Mods und benutzerdefinierte Stile deaktivieren möchtest.", - "settings-useLegacyCapturer": "Legacy-Capturer verwenden", - "settings-useLegacyCapturer-desc": "Verwende das alte Modul für die Bildschirmfreigabe anstelle des neuen Moduls. Wenn du Probleme mit der Bildschirmfreigabe hast, versuche, dies zu aktivieren.", - "settings-mobileMode": "Mobiler Modus", - "settings-mobileMode-desc": "Wenn du ein Gerät mit Touchscreen verwendest, ist diese Funktion genau das Richtige für dich!\nSie aktiviert den versteckten mobilen Modus von Discord, der für Handys und Tablets gedacht ist.\nDie einzige wichtige Funktion, die fehlt, ist die Unterstützung von Voice-Chat. Dies ist ideal für Benutzer von PinePhone und ähnlichen Geräten.", - "settings-spellcheck": "Rechtschreibprüfung", - "settings-tray-desc": "Toggle whether Legcord will have a tray icon", - "settings-spellcheck-desc": "Hilft dir, falsch geschriebene Wörter zu korrigieren, indem es sie hervorhebt.", - "settings-tray": "Tray", - "settings-invitewebsocket": "Rich Presence", - "settings-invitewebsocket-desc": "Nutzt arRPC, um Discord RPC (Rich Presence) mit lokalen Programmen auf deinem Rechner zu unterstützen.", - "settings-mod": "Client-Mod", - "settings-mod-desc1": "Client-Mods sind Programme, mit denen du dein Discord-Erlebnis individuell gestalten kannst. Du kannst das Aussehen des Clients ändern,\nVerhaltensweisen modifizieren oder neue Funktionen hinzufügen!", - "settings-mod-vencord": "Leichtgewichtiger und einfach zu bedienender Client-Mod. Verfügt über einen eingebauten Speicher für Plugins.", - "settings-prfmMode-desc": "Der Leistungsmodus ist eine experimentelle Funktion, die entweder die Reaktionsfähigkeit und Leistung von Legcord erhöhen oder verringern kann. \nBitte probiere alle Optionen aus und schaue, welches dir am besten passt.", - "settings-prfmMode-performance": "Leistung", - "settings-prfmMode-battery": "Batterie", - "settings-disableAutogain": "Autogain deaktivieren", - "settings-disableAutogain-desc": "Deaktiviert Autogain.", - "settings-trayIcon": "Tray-Symbol", - "settings-trayIcon-desc": "Lege das Symbol fest, das im Tray-Menü erscheinen soll.", - "settings-trayIcon-dynamic": "Dynamisch", - "settings-trayIcon-normal": "Discord-Symbol", - "settings-trayIcon-classic": "Klassisches Discord-Symbol", - "settings-trayIcon-colored-plug": "Farbiger Stecker", - "settings-trayIcon-white-plug": "Weißer Stecker", - "settings-trayIcon-white-plug-alt": "Weißer Stecker Alt", - "settings-trayIcon-black-plug": "Schwarzer Stecker", - "settings-trayIcon-black-plug-alt": "Schwarzer Stecker Alt", - "settings-advanced": "Erweiterter Benutzerbereich", - "settings-crashesFolder": "Ordner \"Native Crashes\" öffnen", - "settings-themesFolder": "Themen-Ordner öffnen", - "settings-storageFolder": "Speicherverzeichnis öffnen", - "settings-updater": "Auf Updates überprüfen", - "settings-skipSplash": "Begrüßungsbildschirm überspringen", - "settings-skipSplash-desc": "Überspringt den Legcord-Startbildschirm beim Starten der Anwendung.", - "settings-forceNativeCrash": "Nativen Absturz erzwingen", - "settings-MultiInstance": "Mehrere Instanzen", - "settings-MultiInstance-desc": "Wenn diese Funktion aktiviert ist, können Sie mehrere Instanzen von Legcord starten.", - "settings-copyGPUInfo": "GPU-Info kopieren", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Sanften Bildlauf verwenden", - "settings-smoothScroll-desc": "Sanften Bildlauf umschalten", - "settings-autoScroll": "Automatischen Bildlauf erlauben", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-theme-overlay": "Overlay", - "settings-category-lookAndFeel": "Look and feel", - "settings-clearClientModCache": "Clear client mod cache", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options" -} diff --git a/assets/lang/es-419.json b/assets/lang/es-419.json deleted file mode 100644 index 1d3610a..0000000 --- a/assets/lang/es-419.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_start": "Cargando Legcord…", - "loading_screen_offline": "Parece que no estás conectado a la Internet. Por favor conectate e intentalo de nuevo.", - "loading_screen_update": "Una nueva version de Legcord está disponible. Por favor actualiza a la última version.", - "setup_question1": "Bienvenido a la instalación de Legcord", - "yes": "Sí", - "setup_question2": "Escoge tu version de Discord:", - "setup_question3": "Dejar que Legcord se encargue de la instalacion de modificaciones?", - "setup_offline": "Parece que no estás conectado a Internet. Por favor conéctate a Internet y reinicia Legcord.", - "no": "No", - "next": "Siguiente", - "setup_question4": "Selecciona una modificación que te gustaría instalar:", - "settings-theme": "Tema de Legcord", - "settings-theme-default": "Por Defecto", - "settings-theme-native": "Nativa", - "settings-tray": "Bandeja", - "settings-channel": "Version de Discord", - "settings-invitewebsocket": "Rich Presence (Experimental)", - "settings-mod": "Modificación", - "settings-prfmMode": "Modo de Rendimiento", - "settings-prfmMode-performance": "Rendimiento", - "settings-prfmMode-battery": "Batería", - "settings-none": "Ninguna", - "settings-save": "Guardar ajustes", - "settings-updater": "Buscar una actualización", - "settings-mobileMode": "Modo de dispositivo movil", - "settings-csp-desc": "Legcord CSP es nuestro sistema que se encarga de cargar contenido dentro de la aplicación de Discord. Cosas como\n las modificaciones y temas dependen de esto. Deshabilitalo si quieres deshacerte de modificaciones o estilos personalizados.", - "settings-tray-desc": "Cuando no está activado, Legcord se cerrá como cualquier otra ventana, de lo contrario, Legcord se minimizará a la bandeja de la sistema.", - "settings-mobileMode-desc": "¡Si estás en un dispositivo con pantalla táctil, este modo es para tí! Habilita un modo escondido dentro de Discord hecho para los dispositivos moviles y tabletas.\n La única característica faltante es Chat por Voz- Esto es ideal para \n usuários en PinePhone o parecido..", - "settings-themesFolder": "Abrir carpeta de temas", - "settings-storageFolder": "Abrir carpeta de almacenamiento", - "settings-invitewebsocket-desc": "Utiliza arRPC para habilitar soporte de Discord RPC (Rich Presence) junto con programas locales en tu computadora. Inestable.", - "settings-mod-desc1": "Los mods son programas que le permiten personalizar su experiencia de Discord. ¡Pueden cambiar la apariencia, modificar comportamientos o añadir nuevas características!", - "settings-trayIcon": "Ícono en la bandeja", - "settings-trayIcon-desc": "Escoge el ícono que aparecerá en la bandeja", - "settings-advanced": "Zona de usuario avanzada", - "settings-pluginsFolder": "Abrir carpeta de plugins", - "settings-restart": "Reiniciar App", - "settings-mod-vencord": "programa modificado ligero y fácil de usar. Cuenta con una tienda de plugins integrada.", - "settings-mod-equicord": "tomado y nacido de los colaboradores de vencord, viene un cliente bastante rico en plugins.", - "settings-prfmMode-desc": "El modo de rendimiento es una función experimental que puede aumentar la capacidad de respuesta y el rendimiento de\nLegcord o... puede disminuirla. Por favor, prueba cada opción y vea lo que te queda mejor.", - "settings-trayIcon-dynamic": "Dinámico", - "settings-trayIcon-normal": "Ícono de Discord", - "settings-trayIcon-classic": "Ícono Clásico de Discord", - "settings-trayIcon-colored-plug": "Cable Colorido", - "settings-trayIcon-white-plug": "Cable Blanco", - "settings-trayIcon-white-plug-alt": "Cable Blanco Alternativo", - "settings-trayIcon-black-plug": "Black Plug", - "settings-trayIcon-black-plug-alt": "Black Plug Alt", - "settings-experimental": "Experimental", - "settings-skipSplash": "Omitir Pantalla de Inicio (Experimental)", - "settings-skipSplash-desc": "Saltar la pantalla de inicio de Legcord al cargar la aplicación.", - "settings-copyDebugInfo": "Copiar Información de Depuración", - "settings-startMinimized": "Cargar minimizado", - "settings-startMinimized-desc": "Legcord se inicia en segundo plano y se mantiene fuera de tu camino.", - "settings-crashesFolder": "Abrir carpeta de native crashes", - "settings-forceNativeCrash": "Forzar error nativo", - "settings-disableAutogain": "Desactiva el control automático de ganancia", - "settings-disableAutogain-desc": "Desactiva el control automático de ganancia.", - "settings-theme-transparent": "Transparente", - "settings-useLegacyCapturer": "Usar captura antigua", - "settings-useLegacyCapturer-desc": "Utilice el módulo de compartir pantallas antiguo en lugar del nuevo. Si estás experimentando problemas al compartir pantallas, intenta habilitar esto.", - "settings-spellcheck": "Revisión ortográfica", - "settings-spellcheck-desc": "Destaca las palabras mal escritas para ayudarte a corregirlas.", - "setup_question5": "¿Quieres utilizar un ícono en la barra de tareas?", - "settings-mintoTray": "Minimizar a la bandeja", - "settings-mintoTray-desc": "Cuando no está activado, se cerrá Legcord como cualquier otra ventana, de lo contrario, se cerrá Legcord a la bandeja de la sistema para más tarde.", - "settings-MultiInstance": "Varias instancias", - "settings-MultiInstance-desc": "Cuando se activa permite iniciar varias instancias de Legcord.", - "settings-copyGPUInfo": "Copiar información de la GPU", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Utilizar desplazamiento suave", - "settings-smoothScroll-desc": "Activar desplazamiento suave", - "settings-autoScroll": "Permitir auto-desplazamiento", - "settings-autoScroll-desc": "Permitir auto-desplazamiento con click medio (Nota: Tu sistema aun puede sobreescribir esta opción con otra acción)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-audio": "Audio", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/fa-IR.json b/assets/lang/fa-IR.json deleted file mode 100644 index 03f65ac..0000000 --- a/assets/lang/fa-IR.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_start": "درحال پیاده سازی Legcord…", - "loading_screen_offline": "به نظر می‌رسد شما آفلاین هستید. لطفا به اینترنت متصل شده و سپس دوباره تلاش کنید.", - "loading_screen_update": "نسخه جدید Legcord در دسترس است. لطفا به آخرین نسخه بروزرسانی کنید.", - "setup_question1": "به برپایی Legcord خوش آمدید", - "setup_offline": "به نظر می‌رسد شما آفلاین هستید. لطفا به اینترنت وصل شده و سپس Legcord را مجددا راه‌اندازی کنید.", - "setup_question2": "کانال/نمونه دیسکورد خود را انتخاب کنید:", - "setup_question3": "آیا میخواهید Legcord تغییرات کلاینت را خودکار اعمال کند؟", - "yes": "بله", - "no": "خیر", - "next": "بعدی", - "setup_question4": "نوع اصلاح‌ساز برنامه که میخواهید نصب کنید انتخاب کنید:", - "settings-theme": "تم Legcord", - "settings-theme-default": "پیش‌فرض", - "settings-theme-native": "محلی", - "settings-tray": "سینی", - "settings-channel": "کانال دیسکورد", - "settings-invitewebsocket": "حضور غنی (تجربی)", - "settings-mod": "نوع اصلاح‌ساز کلاینت", - "settings-prfmMode": "حالت عملکرد", - "settings-prfmMode-performance": "قدرت بیشتر", - "settings-prfmMode-battery": "ذخیره برای باتری", - "settings-none": "هیچکدام", - "settings-save": "ذخیره تنظیمات", - "settings-updater": "بررسی برای بروزرسانی", - "settings-mobileMode": "حالت موبایل", - "settings-tray-desc": "زمانی که غیرفعال است، Legcord مانند هر پنجره دیگری بسته می شود، در غیر این صورت در سینی سیستم شما می نشیند و برای بعداً نگه می‌دارد.", - "settings-invitewebsocket-desc": "از arRPC برای پشتیبانی از دیسکورد آرپی‌سی (Rich Presence) با برنامه‌های محلی روی دستگاه شما استفاده می‌کند. کار در حال انجام است.", - "settings-mod-desc1": "Client mods are programs that allow you customize your Discord experience. They can change appearance of\n the client, modify behaviours or add new features!", - "settings-csp-desc": "Legcord CSP سیستم ما است که بارگیری محتوای سفارشی را در برنامه دیسکورد مدیریت می کند. چیزهایی مانند\n ‌حالت‌ها و تم‌های کلاینت به آن بستگی دارد. اگر می‌خواهید از حالت‌ها و استایل‌های سفارشی خلاص شوید، غیرفعال کنید.", - "settings-mobileMode-desc": "If you're on a device with touch-screen this feature is for you! It activates Discord's hidden mobile\n mode meant for phones and tablets. Only major feature missing is voice chat support. This is ideal for\n users on PinePhone and similar.", - "settings-trayIcon": "آیکون سینی", - "settings-trayIcon-desc": "نمادی را که در منوی سینی ظاهر می شود را تنظیم کنید.", - "settings-advanced": "️️منطقه کاربری پیشرفته", - "settings-pluginsFolder": "بازکردن پوشه افزونه‌ها", - "settings-themesFolder": "بازکردن پوشه تم‌ها", - "settings-storageFolder": "بازکردن پوشه ذخیره‌سازی", - "settings-restart": "راه‌اندازی مجدد برنامه", - "settings-mod-vencord": "lightweight, and easy to use client mod. Features a built-in store for plugins.", - "settings-prfmMode-desc": "Performance mode is an experimental function that may either increase responsiveness and performance of\n Legcord or... decrease it. Please try every option and see which fits you the best.", - "settings-trayIcon-dynamic": "پویا", - "settings-trayIcon-normal": "آیکون دیسکورد", - "settings-trayIcon-classic": "آیکون دیسکورد کلاسیک", - "settings-trayIcon-colored-plug": "دوشاخه رنگی", - "settings-trayIcon-white-plug": "دوشاخه سفید", - "settings-trayIcon-white-plug-alt": "دوشاخه سفید Alt", - "settings-trayIcon-black-plug": "دوشاخه سیاه", - "settings-trayIcon-black-plug-alt": "دوشاخه سیاه Alt", - "settings-experimental": "تجربی", - "settings-skipSplash": "Skip Splash Screen (Experimental)", - "settings-skipSplash-desc": "Skips Legcord splash screen when you start up the app.", - "settings-copyDebugInfo": "کپی اطلاعات اشکال‌زدایی", - "settings-startMinimized": "مینیمایز شده شروع شود", - "settings-startMinimized-desc": "Legcord در پس‌زمینه شروع می شود و در سرراه شما باقی می ماند.", - "settings-forceNativeCrash": "Force native crash", - "settings-crashesFolder": "بازکردن پوشه کرش‌های بومی", - "settings-disableAutogain": "غیرفعال کردن autogain", - "settings-disableAutogain-desc": "autogain را غیرفعال میکند.", - "settings-theme-transparent": "شفاف", - "settings-useLegacyCapturer": "استفاده از ضبط‌کننده قدیمی", - "settings-useLegacyCapturer-desc": "Use legacy screenshare module, instead of the new one. If you're experiencing issues with screen sharing, try enabling this.", - "settings-spellcheck": "بررسی املا", - "settings-spellcheck-desc": "با برجسته کردن کلمات غلط املایی به شما کمک می کند آنها را تصحیح کنید.", - "setup_question5": "آیا می خواهید از آیکون سینی استفاده کنید؟", - "settings-mintoTray": "به سینی مینیمایز کنید", - "settings-mintoTray-desc": "هنگامی که غیرفعال است، Legcord مانند هر پنجره دیگری بسته می شود، در غیر این صورت می نشیند و\n در سینی سیستم خود را برای بعدا استراحت می‌کند.", - "settings-MultiInstance": "چند نمونه", - "settings-MultiInstance-desc": "وقتی فعال باشد، می‌توانید بسیاری از نمونه‌های Legcord را راه‌اندازی کنید.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-theme-overlay": "Overlay", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/fi-FI.json b/assets/lang/fi-FI.json deleted file mode 100644 index 75c6dfa..0000000 --- a/assets/lang/fi-FI.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "yes": "Kyllä", - "no": "Ei", - "settings-theme": "Legcord-teema", - "settings-spellcheck-desc": "Helps you correct misspelled words by highlighting them.", - "settings-channel": "Discord-kanava", - "settings-invitewebsocket": "Rikas läsnäolo (kokeellinen)", - "settings-prfmMode-performance": "Suorituskyky", - "setup_question1": "Valitse minkälaisen määrityksen haluat suorittaa:", - "loading_screen_start": "Käynnistetään Legcord…", - "loading_screen_offline": "Vaikuttaa siltä, ettet ole yhteydessä verkkoon. Yhdistä Internetiin ja yritä uudelleen.", - "loading_screen_update": "Uusi versio Legcordista on saatavilla. Päivitä uusimpaan versioon.", - "setup_offline": "Vaikuttaa siltä, ettet ole yhteydessä verkkoon. Yhdistä Internetiin ja käynnistä Legcord uudelleen.", - "setup_question2": "Valitse Discord-kanava/-instanssi:", - "setup_question3": "Pitäisikö Legcordin käsitellä asiakasmodien asennukset?", - "next": "Seuraava", - "setup_question4": "Valitse asiakasmodi asennettavaksi:", - "settings-theme-default": "Oletus", - "settings-theme-native": "Natiivi", - "settings-theme-transparent": "Läpinäkyvä (kokeellinen)", - "settings-csp-desc": "Legcord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.", - "settings-tray": "Pienennä ilmoitusalueelle", - "settings-tray-desc": "When disabled, Legcord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.", - "settings-startMinimized": "Käynnistä pienennettynä", - "settings-startMinimized-desc": "Legcord käynnistyy taustalla ja pysyy poissa näkyvistä.", - "settings-useLegacyCapturer": "Use legacy capturer", - "settings-useLegacyCapturer-desc": "Use legacy screenshare module, instead of the new one. If you're experiencing issues with screen sharing, try enabling this.", - "settings-mobileMode": "Mobiilitila", - "settings-mobileMode-desc": "If you're on a device with touch-screen this feature is for you! It activates Discord's hidden mobile\n mode meant for phones and tablets. Only major feature missing is voice chat support. This is ideal for\n users on PinePhone and similar.", - "settings-spellcheck": "Oikoluku", - "settings-invitewebsocket-desc": "Uses arRPC to support Discord RPC (Rich Presence) with local programs on your machine. Work in progress.", - "settings-mod": "Client mod", - "settings-mod-desc1": "Client mods are programs that allow you customize your Discord experience. They can change appearance of\n the client, modify behaviours or add new features!", - "settings-mod-vencord": "lightweight, and easy to use client mod. Features a built-in store for plugins.", - "settings-prfmMode": "Suorituskykytila", - "settings-prfmMode-desc": "Performance mode is an experimental function that may either increase responsiveness and performance of\n Legcord or… decrease it. Please try every option and see which fits you the best.", - "settings-prfmMode-battery": "Battery", - "settings-disableAutogain": "Disable autogain", - "settings-disableAutogain-desc": "Disables autogain.", - "settings-trayIcon": "Ilmoitusalueen kuvake", - "settings-trayIcon-desc": "Set the icon which will appear in tray menu.", - "settings-trayIcon-dynamic": "Dynaaminen", - "settings-trayIcon-normal": "Discord-kuvake", - "settings-trayIcon-classic": "Klassinen Discord-kuvake", - "settings-none": "Ei mitään", - "settings-trayIcon-colored-plug": "Colored Plug", - "settings-save": "Tallenna asetukset", - "settings-trayIcon-white-plug": "White Plug", - "settings-trayIcon-white-plug-alt": "White Plug Alt", - "settings-trayIcon-black-plug": "Black Plug", - "settings-trayIcon-black-plug-alt": "Black Plug Alt", - "settings-advanced": "Advanced user zone", - "settings-pluginsFolder": "Open plugins folder", - "settings-crashesFolder": "Open native crashes folder", - "settings-themesFolder": "Open themes folder", - "settings-storageFolder": "Open storage folder", - "settings-experimental": "Kokeellinen", - "settings-restart": "Käynnistä sovellus uudelleen", - "settings-updater": "Tarkista päivitykset", - "settings-skipSplash": "Skip Splash Screen (Experimental)", - "settings-skipSplash-desc": "Skips Legcord splash screen when you start up the app.", - "settings-copyDebugInfo": "Copy Debug Info", - "settings-forceNativeCrash": "Force native crash", - "setup_question5": "Do you want to use a tray icon?", - "settings-mintoTray": "Minimize to tray", - "settings-mintoTray-desc": "When disabled, Legcord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.", - "settings-MultiInstance": "Multi Instance", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of Legcord.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-clearClientModCache": "Clear client mod cache", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options" -} diff --git a/assets/lang/fil.json b/assets/lang/fil.json deleted file mode 100644 index 5ee176a..0000000 --- a/assets/lang/fil.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "settings-startMinimized": "Start minimized", - "settings-theme-default": "Default", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-MultiInstance": "Multi Instance", - "settings-mobileMode": "Mobile mode", - "settings-spellcheck-desc": "Helps you correct misspelled words by highlighting them.", - "settings-spellcheck": "Spellcheck", - "settings-channel": "Discord channel", - "settings-tray-desc": "Toggle whether Legcord will have a tray icon", - "settings-mod-desc1": "Client mods are programs that allow you customize your Discord experience. They can change appearance of the client, modify behaviours or add new features!", - "settings-invitewebsocket-desc": "Uses arRPC to support Discord RPC (Rich Presence) with local programs on your machine.", - "loading_screen_offline": "You appear to be offline. Restart in ", - "settings-disableAutogain-desc": "Disables autogain.", - "settings-trayIcon-white-plug-alt": "White Plug Alt", - "settings-trayIcon-dynamic": "Dynamic", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-skipSplash": "Skip Splash Screen", - "settings-forceNativeCrash": "Force native crash", - "settings-trayIcon-white-plug": "White Plug", - "settings-mod-vencord": "lightweight, and easy to use client mod. Features a built-in store for plugins.", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-trayIcon": "Tray icon", - "settings-prfmMode-battery": "Battery", - "settings-prfmMode": "Performance mode", - "settings-trayIcon-black-plug-alt": "Black Plug Alt", - "setup_question2": "Choose your Discord channel/instance:", - "next": "Next", - "no": "No", - "settings-autoScroll": "Allow auto-scroll", - "settings-smoothScroll": "Use smooth scrolling", - "settings-updater": "Check for updates", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme": "Window style", - "settings-mintoTray-desc": "When disabled, Legcord will close like any other window when closed, otherwise it'll sit back and relax in your system tray for later.", - "settings-storageFolder": "Open storage folder", - "settings-restart": "Restart App", - "settings-copyDebugInfo": "Copy Debug Info", - "settings-save": "Save Settings", - "settings-mobileMode-desc": "If you're on a device with touch-screen this feature is for you! It activates Discord's hidden mobile mode meant for phones and tablets. Only major feature missing is voice chat support. This is ideal for\n users on PinePhone and similar.", - "settings-prfmMode-performance": "Performance", - "yes": "Yes", - "setup_question4": "Select a client mod you want to install:", - "settings-theme-native": "Native", - "settings-themesFolder": "Open themes folder", - "setup_offline": "You appear to be offline. Please connect to the internet and restart Legcord.", - "setup_question1": "Welcome to the Legcord Setup", - "settings-skipSplash-desc": "Skips Legcord splash screen when you start up the app.", - "setup_question3": "Should Legcord handle client mods installation?", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of Legcord.", - "settings-theme-transparent": "Transparent", - "settings-crashesFolder": "Open native crashes folder", - "settings-useLegacyCapturer-desc": "Use legacy screenshare module, instead of the new one. If you're experiencing issues with screen sharing, try enabling this.", - "settings-trayIcon-black-plug": "Black Plug", - "settings-mod": "Client mod", - "settings-prfmMode-desc": "Performance mode is an experimental function that may either increase responsiveness and performance of Legcord or… decrease it. Please try every option and see which fits you the best.", - "settings-trayIcon-desc": "Set the icon which will appear in tray menu.", - "settings-advanced": "Advanced user zone", - "loading_screen_start": "Starting Legcord…", - "setup_question5": "Do you want to use a tray icon?", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-invitewebsocket": "Rich Presence", - "settings-prfmMode-vaapi": "VAAPI", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-useLegacyCapturer": "Use legacy capturer", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-startMinimized-desc": "Legcord starts in background and remains out of your way.", - "settings-pluginsFolder": "Open plugins folder", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-tray": "Tray", - "settings-trayIcon-normal": "Discord Icon", - "settings-mintoTray": "Work in background", - "settings-trayIcon-colored-plug": "Colored Plug", - "settings-trayIcon-classic": "Classic Discord Icon", - "settings-disableAutogain": "Disable autogain", - "loading_screen_update": "A new version of Legcord is available. Please update to the latest version.", - "settings-experimental": "Experimental", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-none": "None", - "settings-csp-desc": "Legcord CSP is our system that manages loading custom content loading into the Discord app. Stuff like client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.", - "settings-audio": "Audio", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/fr-FR.json b/assets/lang/fr-FR.json deleted file mode 100644 index 5e780b2..0000000 --- a/assets/lang/fr-FR.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_start": "Démarrage d'Legcord…", - "loading_screen_update": "Une nouvelle version d'Legcord est disponible. Merci de le mettre à jour vers la dernière version.", - "setup_question1": "Bienvenue dans la configuration d'Legcord", - "setup_question2": "Choisissez votre canal/instance Discord :", - "setup_question3": "Legcord doit-il s'occuper de l'installation des mods clients ?", - "yes": "Oui", - "no": "Non", - "next": "Suivant", - "setup_question4": "Sélectionnez le mod client que vous souhaitez installer :", - "loading_screen_offline": "Vous semblez être hors ligne. Veuillez réessayer dans ", - "setup_offline": "Vous semblez être hors ligne. Veuillez vous connecter à internet et redémarrer Legcord.", - "settings-tray": "Zone de notification", - "settings-channel": "Canal Discord", - "settings-mod": "Modification client :", - "settings-save": "Sauvegarder les Paramètres", - "settings-updater": "Vérifier les mises à jour", - "settings-theme": "Style de fenêtre", - "settings-theme-default": "Default", - "settings-theme-native": "Native", - "settings-invitewebsocket": "Rich Presence", - "settings-prfmMode": "mode Performance", - "settings-prfmMode-performance": "Performance", - "settings-prfmMode-battery": "Batterie", - "settings-none": "Aucun", - "settings-mobileMode": "mode mobile", - "settings-storageFolder": "Ouvrir le dossier de stockage", - "settings-csp-desc": "Legcord CSP est notre système qui gère le chargement du contenu customisé dans l'appli Discord. Les choses comme\n les mods clients et les thèmes en dépendent. Désactiver si vous voulez vous débarrasser des mods et styles customisés.", - "settings-tray-desc": "Indiquer si Legcord aura une icône dans la barre des tâches.", - "settings-mobileMode-desc": "Si vous avez un dispositif avec un écran tactile, cette fonction est pour vous ! Elle active le mode mobile caché de Discord\n destiné aux portables et tablettes. La seule fonctionnalité majeure manquante est la prise en charge du chat vocal. C'est idéal pour les utilisateurs\n sur PinePhone et autres.", - "settings-invitewebsocket-desc": "Utilise arRPC pour prendre en charge le Discord RPC (Rich Presence) avec des programmes en local.", - "settings-mod-desc1": "Les mods client sont des programmes qui permettent de personnaliser votre expérience Discord. Ils peuvent changer l'apparence du\n client, modifier le comportement ou ajouter d'autres fonctionnalités !", - "settings-trayIcon": "icône Tray", - "settings-trayIcon-desc": "place l'icône qui apparaîtra dans le menu tray.", - "settings-advanced": "Zone utilisateur avancée", - "settings-pluginsFolder": "Ouvrir dossier plugin", - "settings-themesFolder": "Ouvrir le dossier des thèmes", - "settings-restart": "Redémarrer l'Application", - "settings-copyDebugInfo": "Copier les informations de débogage", - "settings-mod-vencord": "Client léger et facile à utiliser. Dispose d'un magasin intégré pour les plugins.", - "settings-prfmMode-desc": "Le mode performance est expérimental . Il peut améliorer la rapidité ou la performance d'Legcord ou… les empirer.\n Merci d'essayer toutes les options afin de voir lesquelles vous conviennent le mieux.", - "settings-trayIcon-dynamic": "Dynamique", - "settings-trayIcon-normal": "Icone Discord", - "settings-trayIcon-classic": "Icone classique Discord", - "settings-trayIcon-colored-plug": "Colored Plug", - "settings-trayIcon-white-plug": "White Plug", - "settings-trayIcon-white-plug-alt": "White Plug Alt", - "settings-trayIcon-black-plug": "Black Plug", - "settings-trayIcon-black-plug-alt": "Black Plug Alt", - "settings-experimental": "Expérimental", - "settings-skipSplash": "Ignorer l'écran de chargement", - "settings-skipSplash-desc": "Ignorer l'écran de chargement d'Legcord au démarrage de l'application.", - "settings-startMinimized": "Démarrage en mode réduit", - "settings-startMinimized-desc": "Legcord démarre en fond et reste hors de ton chemin.", - "settings-crashesFolder": "Ouvrir le dossier plantage natif", - "settings-forceNativeCrash": "Forcer le crash natif", - "settings-disableAutogain": "Désactiver le gain automatique", - "settings-disableAutogain-desc": "Désactive le gain automatique.", - "settings-theme-transparent": "Transparent", - "settings-useLegacyCapturer": "Utiliser l'ancien système de capture", - "settings-useLegacyCapturer-desc": "Utilisez l'ancien module de partage d'écran plutôt que le nouveau. Si vous rencontrez des problèmes avec le partage d'écran, essayez de l'activer.", - "settings-spellcheck": "Correcteur d'orthographe", - "settings-spellcheck-desc": "Vous aide à corriger des mots mal orthographiés en les surlignant.", - "setup_question5": "Voulez-vous activer l'icône de la barre d'état ?", - "settings-mintoTray": "Laisser en arrière-plan", - "settings-mintoTray-desc": "Lorsqu'il est désactivé, Legcord se fermera comme n'importe quelle autre fenêtre lorsqu'il est fermé, sinon il s'asseoira et se détendra\n dans votre barre d'état système pour plus tard.", - "settings-MultiInstance": "Multi-instances", - "settings-MultiInstance-desc": "Une fois activé vous pourrez lancer plusieurs instances d'Legcord", - "settings-copyGPUInfo": "Copier les informations du GPU", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Utiliser le défilement fluide", - "settings-smoothScroll-desc": "Activer/désactiver défilement fluide", - "settings-autoScroll": "Autoriser le défilement automatique", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Le style de fenêtre gère la barre de titre utilisée par Legcord.", - "settings-channel-desc": "Utilisez ce paramètre pour changer l'instance Discord qu'Legcord est en train d'exécuter.", - "settings-hardwareAcceleration": "Accélération matérielle", - "settings-hardwareAcceleration-desc": "L'accélération utilise votre carte graphique rendre Legcord plus rapide. Si vous rencontrez des problèmes d'affichage, essayez de le désactiver.", - "settings-disableHttpCache": "Désactiver le cache HTTP", - "settings-disableHttpCache-desc": "Désactive le cache HTTP de Chromium. À utiliser si mods du client ne se chargent pas.", - "settings-mod-equicord": "bifurqué et né de contributeurs de vencord, qui dispose d'un client rempli de plugins.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-theme-overlay": "Overlay", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/hu-HU.json b/assets/lang/hu-HU.json deleted file mode 100644 index e6d0669..0000000 --- a/assets/lang/hu-HU.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_start": "Legcord indítása…", - "loading_screen_offline": "Úgy tűnik offline vagy. Kérlek csatlakozz az internetre és próbáld újra.", - "loading_screen_update": "Egy új verzió elérhető az Legcord-hoz. Kérlek frissítsd a legújabb verzióra.", - "setup_question1": "Üdvözöljük az Legcord telepítésénél", - "setup_offline": "Úgy tűnik, offline vagy. Kérlek csatlakozz az internetre, és indítsd újra az Legcord-ot.", - "setup_question2": "Válaszd ki a Discord frissítési csatornáját:", - "setup_question3": "Az Legcord kezelje a kliens modok telepítését?", - "yes": "Igen", - "no": "Nem", - "next": "Következő", - "setup_question4": "Válaszd ki a telepíteni kívánt kliens modot:", - "settings-theme": "Legcord téma", - "settings-theme-default": "Alapértelmezett", - "settings-theme-native": "Anyanyelvi", - "settings-theme-transparent": "Átlátszó", - "settings-csp-desc": "Az Legcord CSP a rendszerünk, amely kezeli az egyéni tartalom betöltését a Discord alkalmazásba. Olyan dolgok, mint\n a kliens modok és témák attól függnek. Kapcsold ki, ha meg akarsz szabadulni a modoktól és az egyéni stílusoktól.", - "settings-tray": "Tálca", - "settings-tray-desc": "Ha le van tiltva, az Legcord bezáródik, mint bármely más ablak, ha bezárja, egyébként pedig a rendszer tálcáján fog pihenni a későbbiekre.", - "settings-startMinimized": "Indítás minimalizálva", - "settings-startMinimized-desc": "Az Legcord a háttérben indul.", - "settings-useLegacyCapturer": "Használjon legacy rögzítőt", - "settings-useLegacyCapturer-desc": "Használd a régi képernyőmegosztási modult az új helyett. Ha problémákat tapasztalsz a képernyőmegosztással kapcsolatban, próbáld meg engedélyezni ezt.", - "settings-mobileMode": "Mobil mód", - "settings-mobileMode-desc": "Ha érintőképernyős készüléket használ, ez a funkció önnek van! Aktiválja a Discord rejtett mobil\n módját telefonokhoz és táblagépekhez. Csak eggyetlen fontos funkció hiányzik, a hang csevegés támogatása. Ez ideális a\n PinePhone és hasonló eszközök felhasználóinak.", - "settings-channel": "Discord csatorna", - "settings-invitewebsocket": "Rich Presence (Kisérleti)", - "settings-invitewebsocket-desc": "Az arRPC-t használja a Discord RPC (Rich Presence) támogatására a számítógépén lévő helyi programokkal. Fejlesztés alatt.", - "settings-mod": "Kliens mod", - "settings-mod-desc1": "A kliens modok olyan programok, amelyek lehetővé teszik a Discord-élmény testreszabását. Megváltoztatják a megjelenését\n a kliensnek, megváltoztatják a viselkedését és új funkciókat adnak hozzá!", - "settings-mod-vencord": "könnyű és könnyen használható kliens mod. Beépített boltot tartalmaz a bővítmények számára.", - "settings-prfmMode": "Teljesítmény mód", - "settings-prfmMode-desc": "A teljesítmény mód egy kísérleti funkció, amely vagy növelheti az\n Legcord reaakcióképességét és teljesítményét, vagy… csökkentheti azt. Kérjük, próbáljon ki minden lehetőséget, és nézze meg, melyik felel meg önnek a legjobban.", - "settings-prfmMode-performance": "Teljesítmény", - "settings-prfmMode-battery": "Akkumulátor", - "settings-disableAutogain": "Az automatikus erősítés letiltása", - "settings-disableAutogain-desc": "Az automatikus erősítés letiltása.", - "settings-trayIcon": "Tálca ikon", - "settings-trayIcon-desc": "Állítsa be a tálca menüben megjelenő ikont.", - "settings-trayIcon-dynamic": "Dinamikus", - "settings-trayIcon-normal": "Discord Ikon", - "settings-trayIcon-classic": "Klasszikus Discord Ikon", - "settings-trayIcon-colored-plug": "Színes Csatlakozó", - "settings-trayIcon-white-plug": "Fehér Csatlakozó", - "settings-trayIcon-white-plug-alt": "Fehér Plug Alternativa", - "settings-trayIcon-black-plug": "Fekete Plug", - "settings-trayIcon-black-plug-alt": "Fekete Plug Alternatíva", - "settings-advanced": "Haladó felhasználói zóna", - "settings-pluginsFolder": "Nyissa meg a bőitmények mappáját", - "settings-crashesFolder": "Nyissa meg a natív összeomlások mappát", - "settings-themesFolder": "Nyissa meg a témák mappát", - "settings-storageFolder": "Tárolómappa megnyitása", - "settings-none": "Egyik sem", - "settings-save": "Beállítások mentése", - "settings-experimental": "Kísérleti", - "settings-restart": "App újraindítása", - "settings-updater": "Frissítések keresése", - "settings-skipSplash": "Indítóképernyő kihagyása (kísérleti)", - "settings-skipSplash-desc": "Az alkalmazás indításakor kihagyja az Legcord indítóképernyőt.", - "settings-copyDebugInfo": "Hibakeresési infó másolása", - "settings-forceNativeCrash": "A natív összeomlás kényszerítése", - "settings-spellcheck": "Helyesírás ellenőrzés", - "settings-spellcheck-desc": "Segít abban, hogy kijelölve kiemelje a helytelenül leírt szavakat, segít megjavítani őket.", - "setup_question5": "Szeretnél egy tálca ikont használni?", - "settings-mintoTray": "Minimalizálás tálcára", - "settings-mintoTray-desc": "Ha le van tiltva, az Legcord bezáródik, mint bármely más ablak, ha bezárják, különben hátradől és pihen.\n a rendszer tálcáján a későbbiekre.", - "settings-MultiInstance": "Több példány", - "settings-MultiInstance-desc": "Ha engedélyezve van, akkor az Legcord több példányát is el tudja indítani.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/id-ID.json b/assets/lang/id-ID.json deleted file mode 100644 index e7a44c3..0000000 --- a/assets/lang/id-ID.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_start": "Memulai Legcord…", - "loading_screen_offline": "Anda tampaknya offline. Silakan terhubung ke Internet dan coba lagi.", - "loading_screen_update": "Versi baru Legcord tersedia. Silakan perbarui ke versi terbaru.", - "setup_question1": "Selamat datang di laman Penyiapan Legcord", - "setup_question2": "pilih saluran Discord anda/instansi:", - "setup_offline": "tampaknya anda sedang offline. silahkan sambungkan ke internet dan muat ulang Legcord.", - "setup_question3": "bolehkah Legcord menangani pemasangan mods klien?", - "yes": "iya", - "no": "tidak", - "next": "berikutnya", - "setup_question4": "Pilih mod klien yang ingin anda pasang:", - "settings-theme": "Tema Legcord", - "settings-theme-default": "Bawaan", - "settings-theme-native": "asli", - "settings-tray": "Baki", - "settings-channel": "Saluran Discord", - "settings-invitewebsocket": "Rich Presence (Eksperimental)", - "settings-mod": "Mod klien", - "settings-save": "Simpan setelan", - "settings-updater": "Periksa pembaharuan", - "settings-prfmMode": "Mode kinerja", - "settings-prfmMode-performance": "Kinerja tinggi", - "settings-prfmMode-battery": "Baterai", - "settings-none": "Tidak disetel", - "settings-mobileMode": "Mode seluler", - "settings-tray-desc": "Ketika dinonaktifkan, Legcord akan menutup seperti jendela lain ketika ditutup, jika tidak, ia akan duduk dan bersantai di baki sistem Anda untuk nanti.", - "settings-csp-desc": "Legcord CSP merupakan sistem kami yang mengatur pemuatan konten kustom ke aplikasi Discord. Hal seperti\n modifikasi klien dan tema bergantung ke fitur ini. Nonaktifkan jika kamu mau menghilangkan modifikasi dan tema kustom.", - "settings-invitewebsocket-desc": "Menggunakan arRPC untuk mendukung Discord RPC (Rich Presence) dengan program lokal di perangkat anda. WIP.", - "settings-mobileMode-desc": "Jika perangkat kamu mempunyai layar sentuh, fitur ini untukmu! Fitur ini mengaktifkan mode\n tersembunyi Discord yang diperuntukkan untuk telepon dan tablet. Obrolan suara tidak tersedia di mode ini. \n Mode ini ideal untuk pengguna di PinePhone dan sejenisnya.", - "settings-themesFolder": "Buka folder tema", - "settings-storageFolder": "Buka folder penyimpanan", - "settings-mod-desc1": "Mod klien merupakan program yang memungkinkan kamu untuk menyesuaikan pengalaman Discord mu. Program \n ini dapat mengubah tampilan atau perilaku klien, bahkan menambah fitur!", - "settings-trayIcon": "Ikon baki", - "settings-trayIcon-desc": "Memilih ikon yang akan ditampilkan di menu baki.", - "settings-advanced": "Zona pengguna lanjutan", - "settings-pluginsFolder": "Buka folder plugin", - "settings-restart": "Mulai Ulang Aplikasi", - "settings-skipSplash": "Lewati Layar Awalan (Eksperimental)", - "settings-mod-vencord": "mod klien yang ringan dan mudah digunakan. Mempunyai kedai bawaan untuk plugin.", - "settings-prfmMode-desc": "Mode Kinerja adalah fungsi eksperimental yang dapat meningkatkan tingkat responsif dan performa\n Legcord atau... menurunkannya. Coba setiap opsi dan lihat mana yang paling cocok untuk kamu.", - "settings-trayIcon-dynamic": "Dinamis", - "settings-trayIcon-normal": "Ikon Discord", - "settings-trayIcon-classic": "Ikon Discord Klasik", - "settings-trayIcon-colored-plug": "Steker Berwarna", - "settings-trayIcon-white-plug": "Steker Putih", - "settings-trayIcon-white-plug-alt": "Steker Putih Alt.", - "settings-trayIcon-black-plug": "Steker Hitam", - "settings-trayIcon-black-plug-alt": "Steker Hitam Alt.", - "settings-experimental": "Eksperimental", - "settings-skipSplash-desc": "Melewati layar awalan Legcord saat kamu memulai aplikasi.", - "settings-copyDebugInfo": "Salin info Debug", - "settings-startMinimized": "Mulai diminimalkan", - "settings-startMinimized-desc": "Legcord berjalan di latar belakang dan akan tetap tidak mengganggu anda.", - "settings-crashesFolder": "Buka folder kegagalan native", - "settings-forceNativeCrash": "Paksa kegagalan native", - "settings-disableAutogain": "Matikan gain otomatis", - "settings-disableAutogain-desc": "Mematikan gain otomatis.", - "settings-theme-transparent": "Transparan", - "settings-useLegacyCapturer": "Gunakan penangkap layar lama", - "settings-useLegacyCapturer-desc": "Gunakan modul penangkap layar lama dibanding yang lebih baru. Jika kamu mendapatkan isu dengan berbagi layar, coba nyalakan ini.", - "settings-spellcheck": "Pengecekan ejaan", - "settings-spellcheck-desc": "Membantu kamu memperbaiki kesalahan kata dengan menyoroti kesalahannya.", - "setup_question5": "Apakah kamu mau menggunakan ikon baki?", - "settings-mintoTray": "Perkecil ke baki", - "settings-mintoTray-desc": "Saat dinonaktifkan, Legcord akan keluar seperti jendela lain saat dikeluarkan, jika tidak maka akan bersantai\n di baki sistem untuk nanti.", - "settings-MultiInstance": "Multi Instans", - "settings-MultiInstance-desc": "Ketika diaktifkan, Anda akan dapat memulai banyak contoh Legcord.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/it-IT.json b/assets/lang/it-IT.json deleted file mode 100644 index f704a0e..0000000 --- a/assets/lang/it-IT.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_update": "Una nuova versione di Legcord è disponibile. Per favore aggiorna all'ultima versione.", - "loading_screen_start": "Avvio di Legcord…", - "loading_screen_offline": "Sembra che tu sia offline. Ricomincia ", - "setup_question1": "Benvenuto nella configurazione di Legcord", - "setup_question2": "Seleziona il tuo canale/istanza di Discord:", - "setup_question3": "Legcord dovrebbe gestire l'installazione di client mod?", - "yes": "Sì", - "no": "No", - "next": "Avanti", - "setup_question4": "Seleziona una client mod che vuoi installare:", - "setup_offline": "Sembri essere offline. Per favore connettiti ad Internet e riavvia la configurazione di Legcord.", - "settings-tray": "Icona", - "settings-channel": "Canale Discord", - "settings-save": "Salva Impostazioni", - "settings-updater": "Controlla gli aggiornamenti", - "settings-mod": "Mod Client", - "settings-theme": "Stile della finestra", - "settings-theme-default": "Default", - "settings-theme-native": "Nativo", - "settings-invitewebsocket": "Rich Presence (sperimentale)", - "settings-prfmMode": "Modalità Performance", - "settings-prfmMode-performance": "Performance", - "settings-prfmMode-battery": "Battery", - "settings-none": "None", - "settings-mobileMode": "Modalità telefono", - "settings-csp-desc": "Legcord CSP è il nostro sistema che gestisce il caricamento di contenuti personalizzati nell'app Discord. Elementi come\n le mod e i temi del client dipendono da questo. Disabilita se vuoi sbarazzarti di mod e stili personalizzati.", - "settings-mobileMode-desc": "Se sei su un dispositivo con touch-screen questa funzione è per te! Attiva sul cellulare la modalità nascosta \n di Discord pensata per telefoni e tablet. L'unica caratteristica importante che manca è il supporto della chat vocale. Questo è l'ideale per\n utenti su PinePhone e simili.", - "settings-tray-desc": "Se disabilitato, Legcord si chiuderà come qualsiasi altra finestra quando è chiuso, altrimenti si siederà e si rilasserà nella barra delle applicazioni per dopo.", - "settings-invitewebsocket-desc": "Utilizza arRPC per supportare Discord RPC (Rich Presence) con programmi locali sulla tua macchina. Lavori in corso.", - "settings-mod-desc1": "Le mod client sono programmi che ti consentono di personalizzare la tua esperienza su Discord. Possono cambiare l'aspetto del\n client, modificare i comportamenti o aggiungere nuove funzionalità!", - "settings-trayIcon": "Icona della barra", - "settings-trayIcon-desc": "Impostare l'icona che apparirà nel menu della barra delle applicazioni.", - "settings-advanced": "Zona utenti avanzati", - "settings-pluginsFolder": "Apri la cartella dei plugin", - "settings-themesFolder": "Apri la cartella dei temi", - "settings-storageFolder": "Apri la cartella di archiviazione", - "settings-restart": "Riavvia App", - "settings-mod-vencord": "mod client leggera e facile da usare. Dispone di uno store integrato per i plugin.", - "settings-prfmMode-desc": "La modalità Performance è una funzione sperimentale che può aumentare la reattività e le prestazioni di\n Legcord o... diminuirle. Si prega di provare tutte le opzioni e vedere quale si adatta meglio.", - "settings-trayIcon-dynamic": "Dinamica", - "settings-trayIcon-normal": "Icona Discord", - "settings-trayIcon-classic": "Icona Discord classica", - "settings-trayIcon-colored-plug": "Plug colorato", - "settings-trayIcon-white-plug": "Plug bianco", - "settings-trayIcon-white-plug-alt": "Plug Bianco Alt", - "settings-trayIcon-black-plug": "Plug nero", - "settings-trayIcon-black-plug-alt": "Plug Nero Alt", - "settings-experimental": "Sperimentale", - "settings-skipSplash": "Salta schermata iniziale (sperimentale)", - "settings-skipSplash-desc": "Salta la schermata iniziale di Legcord all'avvio dell'app.", - "settings-copyDebugInfo": "Copia informazioni di debug", - "settings-startMinimized": "Inizia ridotto a icona", - "settings-startMinimized-desc": "Legcord si avvia in background e rimane fuori dai piedi.", - "settings-crashesFolder": "Apri la cartella dei crash nativi", - "settings-forceNativeCrash": "Forza crash nativo", - "settings-disableAutogain": "Disabilita il guadagno automatico", - "settings-disableAutogain-desc": "Disabilita il guadagno automatico.", - "settings-theme-transparent": "Trasparente", - "settings-useLegacyCapturer": "Usa l'acquisitore legacy", - "settings-useLegacyCapturer-desc": "Usa il modulo di condivisione dello schermo precedente, invece di quello nuovo. Se riscontri problemi con la condivisione dello schermo, prova ad abilitarla.", - "settings-spellcheck": "Controllo ortografico", - "settings-spellcheck-desc": "Ti aiuta a correggere le parole errate evidenziandole.", - "setup_question5": "Vuoi usare un'icona nella barra delle applicazioni?", - "settings-mintoTray": "Lavora in background", - "settings-mintoTray-desc": "Se disabilitato, Legcord si chiuderà come qualsiasi altra finestra quando è chiusa, altrimenti si siederà e si rilasserà\n nella barra delle applicazioni per dopo.", - "settings-MultiInstance": "Multi-istanza", - "settings-MultiInstance-desc": "Se abilitato sarai in grado di avviare molte istanze di Legcord.", - "settings-copyGPUInfo": "Copia informazioni sulla GPU", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Utilizza lo scorrimento fluido", - "settings-smoothScroll-desc": "Attiva lo scorrimento fluido", - "settings-autoScroll": "Consenti lo scorrimento automatico", - "settings-autoScroll-desc": "Consenti lo scorrimento automatico con il clic centrale (nota: l'ambiente desktop può comunque sovrascriverlo con un'altra azione)", - "settings-theme-desc": "Lo stile della finestra determina quale barra del titolo verrà usata da Legcord", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Accelerazione hardware", - "settings-hardwareAcceleration-desc": "L'accelerazione hardware usa la tua GPU per far sì che Legcord sia più veloce. Se dovessi notare dei glitch visivi, prova a disabilitare questa opzione", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/ja-JP.json b/assets/lang/ja-JP.json deleted file mode 100644 index e9a7c75..0000000 --- a/assets/lang/ja-JP.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "yes": "はい", - "settings-theme-default": "デフォルト", - "settings-invitewebsocket": "リッチプレゼンス(実験的)", - "loading_screen_start": "Legcordを起動中…", - "loading_screen_offline": "現在オフラインのようです。インターネットに接続し、再度お試しください。", - "loading_screen_update": "新しいバージョンのLegcordが見つかりました。最新版へ更新してください。", - "setup_question1": "Legcordセットアップへようこそ", - "setup_offline": "現在オフラインのようです。インターネットへ接続し、Legcordを再起動してください。", - "setup_question2": "Discordチャネル/インスタンスを選択してください:", - "setup_question3": "Legcordでクライアントmodのインストールを処理する必要がありますか?", - "no": "いいえ", - "next": "次へ", - "setup_question4": "インストールしたいクライアントmodを選択してください:", - "settings-theme": "Legcordテーマ", - "settings-theme-native": "ネイティブ", - "settings-csp-desc": "Legcord CSPは、Discordアプリへのカスタムコンテンツの読み込みを管理するシステムです。\nクライアントmodやテーマはこれに依存します。modやカスタムスタイルを取り除きたい場合は無効にしてください。", - "settings-tray": "トレイ", - "settings-tray-desc": "無効にした場合、Legcordを閉じると、他のウィンドウと同じように閉じます。それ以外の場合、Legcordはシステムトレイに待機して後で使用できます。", - "settings-mobileMode": "モバイルモード", - "settings-mobileMode-desc": "もしタッチスクリーン対応のデバイスをお使いであれば、この機能はあなたのためのものです!\nこれはスマートフォンやタブレット向けの隠されたDiscordのモバイルモードを有効にします。唯一欠けている主要な機能はボイスチャットのサポートのみです。\nこれは、PinePhoneや類似のデバイスをお使いのユーザーに最適です。", - "settings-channel": "Discordチャネル", - "settings-invitewebsocket-desc": "arRPC を使用して、マシン上のローカルプログラムでDiscord RPC(リッチプレゼンス)をサポートします。WIPです。", - "settings-mod": "クライアントmod", - "settings-mod-desc1": "クライアントmodは、あなたのDiscord体験をカスタマイズできるプログラムです。\nクライアントの見た目を調整したり、動作を変更したり、新しい機能を追加することもできます!", - "settings-prfmMode": "パフォーマンスモード", - "settings-prfmMode-performance": "パフォーマンス", - "settings-prfmMode-battery": "バッテリー", - "settings-trayIcon": "トレイアイコン", - "settings-trayIcon-desc": "トレイメニューに表示されるアイコンを設定します。", - "settings-advanced": "高度なユーザー向け区域", - "settings-pluginsFolder": "プラグインフォルダを開く", - "settings-themesFolder": "テーマフォルダを開く", - "settings-storageFolder": "ストレージフォルダを開く", - "settings-none": "無効", - "settings-save": "設定を保存", - "settings-updater": "アップデートを確認する", - "settings-restart": "アプリを再起動する", - "settings-trayIcon-dynamic": "ダイナミック", - "settings-mod-vencord": "軽量で使いやすいクライアントmod。プラグイン用の組み込みストアを備えています。", - "settings-prfmMode-desc": "パフォーマンスモードは、Legcordの応答性とパフォーマンスを改善する...か、低下させる可能性がある実験的な機能です。\nすべてのオプションを試して、どれが最適か確認してください。", - "settings-trayIcon-normal": "Discordアイコン", - "settings-trayIcon-classic": "クラシックDiscordアイコン", - "settings-trayIcon-colored-plug": "色の付いたプラグ", - "settings-trayIcon-white-plug": "白いプラグ", - "settings-trayIcon-white-plug-alt": "白いプラグ2", - "settings-trayIcon-black-plug": "黒いプラグ", - "settings-trayIcon-black-plug-alt": "黒いプラグ2", - "settings-experimental": "実験的", - "settings-skipSplash": "スプラッシュ画面をスキップする(実験的)", - "settings-skipSplash-desc": "Legcordを起動した時のスプラッシュ画面をスキップします。", - "settings-copyDebugInfo": "デバッグ情報をコピーする", - "settings-startMinimized": "最小化状態で起動", - "settings-startMinimized-desc": "邪魔にならないように、Legcordをバックグラウンドで起動します。", - "settings-crashesFolder": "ネイティブのクラッシュフォルダを開く", - "settings-forceNativeCrash": "強制的にクラッシュを発生させる", - "settings-disableAutogain": "オートゲインを無効化", - "settings-disableAutogain-desc": "自動ゲイン制御を無効化します。", - "settings-theme-transparent": "透過", - "settings-useLegacyCapturer": "レガシーキャプチャを使用する", - "settings-useLegacyCapturer-desc": "新しい画面共有モジュールの代わりに、従来の画面共有モジュールを使用します。もし画面共有で問題が発生している場合は、これを有効にしてみてください。", - "settings-spellcheck": "スペルチェック", - "settings-spellcheck-desc": "スペルミスを修正できるように、ミスのある単語をハイライト表示します。", - "setup_question5": "トレイアイコンを使用しますか?", - "settings-mintoTray": "トレイに最小化", - "settings-mintoTray-desc": "無効にすると、Legcordを閉じた際は他のウィンドウと同じように閉じますが。\nそれ以外の場合はシステムトレイで待機し、後で使用できるようになります。", - "settings-MultiInstance": "マルチインスタンス", - "settings-MultiInstance-desc": "これを有効にすると、同時に複数のLegcordインスタンスを起動できるようになります。", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-category-behaviour": "Behaviour", - "settings-category-legacy": "Legacy features", - "settings-theme-overlay": "Overlay", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/ko-KR.json b/assets/lang/ko-KR.json deleted file mode 100644 index 734d0bb..0000000 --- a/assets/lang/ko-KR.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_start": "Legcord 시작 중…", - "loading_screen_offline": "오프라인 상태인 것 같습니다. 인터넷에 연결하고 다시 시도해 주세요. ", - "settings-prfmMode": "성능 모드", - "setup_question1": "Legcord 설정에 오신 것을 환영합니다.", - "setup_offline": "오프라인 상태인 것 같습니다. 인터넷에 연결하고 Legcord를 다시 시작해 주세요.", - "loading_screen_update": "Legcord의 새 버전을 사용할 수 있습니다. 최신 버전으로 업데이트해 주세요.", - "setup_question2": "Discord 채널/인스턴스를 선택:", - "setup_question3": "Legcord가 클라이언트 모드 설치를 처리할까요?", - "yes": "예", - "no": "아니오", - "next": "다음", - "setup_question4": "설치할 클라이언트 모드 선택:", - "settings-theme": "Legcord 테마", - "settings-theme-default": "기본값", - "settings-theme-native": "OS 기본", - "settings-csp-desc": "Legcord CSP는 디스코드 앱에 불러오는 맞춤형 콘텐츠 로드를 관리하는 시스템입니다. 이런\n 클라이언트 모드 및 테마는 이에 따라 다릅니다. 모드 및 사용자 정의 스타일을 제거하려면 비활성화하세요.", - "settings-tray": "트레이", - "settings-tray-desc": "비활성화하면 Legcord는 닫을 때 다른 창처럼 닫히며, 그렇지 않으면 나중에 사용할 수 있도록 시스템 트레이에 대기 상태로 남아 있습니다.", - "settings-mobileMode": "모바일 모드", - "settings-invitewebsocket": "활동 상태 (실험적)", - "settings-mobileMode-desc": "터치 스크린이 있는 장치를 사용하는 경우 이 기능이 적합합니다! 디스코드의 숨겨진 모바일을 활성화하며\n 휴대전화와 태블릿을 위한 모드입니다. 이것은\n PinePhone 및 이와 유사한 사용자에게 이상적입니다.", - "settings-channel": "디스코드 채널", - "settings-invitewebsocket-desc": "arRPC를 사용하여 컴퓨터의 로컬 프로그램과 함께 디스코드 RPC (활동 상태)를 지원합니다. 진행중인 작업입니다.", - "settings-mod": "클라이언트 모드", - "settings-mod-desc1": "클라이언트 모드는 디스코드 경험을 사용자 지정할 수 있는 프로그램입니다. 클라이언트의 모양을 변경하거나 동작을 수정하거나\n 새로운 기능을 추가할 수 있습니다!", - "settings-prfmMode-performance": "성능", - "settings-prfmMode-battery": "배터리", - "settings-trayIcon": "트레이 아이콘", - "settings-trayIcon-desc": "트레이 메뉴에 나타날 아이콘을 설정합니다.", - "settings-advanced": "고급 사용자 영역", - "settings-pluginsFolder": "플러그인 폴더 열기", - "settings-themesFolder": "테마 폴더 열기", - "settings-storageFolder": "저장소 폴더 열기", - "settings-none": "없음", - "settings-save": "설정 저장", - "settings-restart": "앱 다시 시작", - "settings-updater": "업데이트 확인", - "settings-mod-vencord": "가볍고 사용하기 쉬운 클라이언트 모드입니다. 플러그인을 위한 내장 저장소를 제공합니다.", - "settings-prfmMode-desc": "성능 모드는 Legcord의 응답성과 성능을 증가시키거나…\n 감소시킬 수 있는 실험적 기능입니다. 모든 옵션을 시도하고 가장 적합한 옵션을 확인하세요.", - "settings-trayIcon-dynamic": "동적", - "settings-trayIcon-normal": "디스코드 아이콘", - "settings-trayIcon-classic": "클래식 디스코드 아이콘", - "settings-trayIcon-colored-plug": "컬러 플러그", - "settings-trayIcon-white-plug": "흰색 플러그", - "settings-trayIcon-white-plug-alt": "흰색 플러그 대체", - "settings-trayIcon-black-plug": "검은색 플러그", - "settings-trayIcon-black-plug-alt": "검은색 플러그 대체", - "settings-experimental": "실험적", - "settings-skipSplash": "시작 화면 건너뛰기 (실험적)", - "settings-skipSplash-desc": "앱을 시작할 때 Legcord 시작 화면을 건너뜁니다.", - "settings-copyDebugInfo": "디버그 정보 복사", - "settings-startMinimized": "최소화 시작", - "settings-startMinimized-desc": "Legcord는 백그라운드에서 시작되며 방해가 되지 않습니다.", - "settings-crashesFolder": "네이티브 충돌 폴더 열기", - "settings-forceNativeCrash": "강제 네이티브 충돌", - "settings-disableAutogain": "자동 획득 비활성화", - "settings-disableAutogain-desc": "자동게인을 비활성화합니다.", - "settings-theme-transparent": "투명", - "settings-useLegacyCapturer": "레거시 캡처 프로그램 사용", - "settings-useLegacyCapturer-desc": "새로운 화면 공유 모듈 대신 레거시 화면 공유 모듈을 사용하세요. 화면 공유에 문제가 있는 경우 이를 활성화해 보세요.", - "settings-spellcheck": "맞춤법검사", - "settings-spellcheck-desc": "철자가 틀린 단어를 강조 표시하여 수정할 수 있도록 도와줍니다.", - "setup_question5": "트레이 아이콘을 사용하겠습니까?", - "settings-mintoTray": "트레이로 최소화", - "settings-mintoTray-desc": "비활성화하면 Legcord는 닫을 때 다른 창처럼 닫히지만, 그렇지 않으면 시스템 트레이에 편안하게\n 나중에 사용할 수 있도록 시스템 트레이에 보관됩니다.", - "settings-MultiInstance": "다중 인스턴스", - "settings-MultiInstance-desc": "활성화되면 Legcord의 많은 인스턴스를 시작할 수 있습니다.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache", - "settings-theme-overlay": "Overlay" -} diff --git a/assets/lang/lt-LT.json b/assets/lang/lt-LT.json deleted file mode 100644 index 4d914aa..0000000 --- a/assets/lang/lt-LT.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "next": "Kitas", - "settings-theme": "Legcord tema", - "settings-theme-default": "Numatytas", - "settings-theme-native": "Vietinis", - "setup_question1": "Pasirinkite, koki diegimą jūs norėtumėt atlikti:", - "loading_screen_start": "Legcord paleidžiamas…", - "loading_screen_offline": "Atrodo, kad jūs dar esate neprisijungę. Prašome prisijungti prie interneto ir bandyti vėl.", - "loading_screen_update": "Nauja Legcord versija jau išleista. Prašome atsiusti atnaujinimą.", - "setup_offline": "Atrodo, kad jūs nesate prisijungę prie interneto. Prašome prisijungti prie interneto ir paleisti Legcord iš naujo.", - "setup_question2": "Pasirinkite pageidaujamą Discord versiją/kanalą:", - "setup_question3": "Ar Legcord turėtų tvarkyti kliento modifikacijų diegimą?", - "yes": "Taip", - "no": "Ne", - "setup_question4": "Pasirinkite kliento modifikaciją, kurią norite įdiegti:", - "settings-theme-transparent": "Permatomas (Eksperimentinis)", - "settings-csp-desc": "Legcord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.", - "settings-tray": "Minimize to tray", - "settings-tray-desc": "When disabled, Legcord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.", - "settings-startMinimized": "Start minimized", - "settings-startMinimized-desc": "Legcord starts in background and remains out of your way.", - "settings-useLegacyCapturer": "Use legacy capturer", - "settings-useLegacyCapturer-desc": "Use legacy screenshare module, instead of the new one. If you're experiencing issues with screen sharing, try enabling this.", - "settings-mobileMode": "Mobile mode", - "settings-mobileMode-desc": "If you're on a device with touch-screen this feature is for you! It activates Discord's hidden mobile\n mode meant for phones and tablets. Only major feature missing is voice chat support. This is ideal for\n users on PinePhone and similar.", - "settings-channel": "Discord channel", - "settings-trayIcon-dynamic": "Dynamic", - "settings-invitewebsocket": "Rich Presence (Experimental)", - "settings-invitewebsocket-desc": "Uses arRPC to support Discord RPC (Rich Presence) with local programs on your machine. Work in progress.", - "settings-mod": "Client mod", - "settings-mod-desc1": "Client mods are programs that allow you customize your Discord experience. They can change appearance of\n the client, modify behaviours or add new features!", - "settings-mod-vencord": "lightweight, and easy to use client mod. Features a built-in store for plugins.", - "settings-prfmMode": "Performance mode", - "settings-prfmMode-desc": "Performance mode is an experimental function that may either increase responsiveness and performance of\n Legcord or… decrease it. Please try every option and see which fits you the best.", - "settings-prfmMode-performance": "Performance", - "settings-prfmMode-battery": "Battery", - "settings-disableAutogain": "Disable autogain", - "settings-disableAutogain-desc": "Disables autogain.", - "settings-trayIcon": "Tray icon", - "settings-trayIcon-desc": "Set the icon which will appear in tray menu.", - "settings-trayIcon-normal": "Discord Icon", - "settings-trayIcon-classic": "Classic Discord Icon", - "settings-trayIcon-colored-plug": "Colored Plug", - "settings-trayIcon-white-plug": "White Plug", - "settings-trayIcon-white-plug-alt": "White Plug Alt", - "settings-trayIcon-black-plug": "Black Plug", - "settings-trayIcon-black-plug-alt": "Black Plug Alt", - "settings-advanced": "Advanced user zone", - "settings-pluginsFolder": "Open plugins folder", - "settings-crashesFolder": "Open native crashes folder", - "settings-themesFolder": "Open themes folder", - "settings-storageFolder": "Open storage folder", - "settings-none": "None", - "settings-save": "Save Settings", - "settings-experimental": "Experimental", - "settings-restart": "Restart App", - "settings-updater": "Check for updates", - "settings-skipSplash": "Skip Splash Screen (Experimental)", - "settings-skipSplash-desc": "Skips Legcord splash screen when you start up the app.", - "settings-copyDebugInfo": "Copy Debug Info", - "settings-forceNativeCrash": "Force native crash", - "settings-spellcheck": "Spellcheck", - "settings-spellcheck-desc": "Helps you correct misspelled words by highlighting them.", - "setup_question5": "Do you want to use a tray icon?", - "settings-mintoTray-desc": "When disabled, Legcord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.", - "settings-mintoTray": "Minimize to tray", - "settings-MultiInstance": "Multi Instance", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of Legcord.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/nb-NO.json b/assets/lang/nb-NO.json deleted file mode 100644 index b3aff40..0000000 --- a/assets/lang/nb-NO.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_start": "Starter Legcord …", - "loading_screen_offline": "Du er uten internett. Starter på nytt om ", - "loading_screen_update": "En ny versjon av Legcord er tilgjengelig. Oppgrader til siste versjon.", - "setup_question1": "Velkommen til Legcord-oppsettet", - "setup_question2": "Velg din Discor-kanal/instans:", - "yes": "Ja", - "no": "Nei", - "setup_question3": "Skal Legcord håndtere installasjon av klient-modifikasjoner?", - "setup_offline": "Det ser ut til at du er frakoblet. Koblet til Internett og start Legcord på ny.", - "next": "Neste", - "setup_question4": "Velg en klient-modifikasjon du ønsker å installere:", - "settings-tray": "Skuffe", - "settings-channel": "Discord-kanal:", - "settings-mod": "Klient-modifikasjon:", - "settings-save": "Lagre innstillingene", - "settings-updater": "Check for updates", - "settings-theme": "Legcord-drakt", - "settings-theme-default": "Default", - "settings-theme-native": "Native", - "settings-invitewebsocket": "discord.gg support", - "settings-prfmMode": "Ytelsesmodus", - "settings-prfmMode-performance": "Performance", - "settings-prfmMode-battery": "Battery", - "settings-none": "None", - "settings-mobileMode": "Mobilmodus", - "settings-csp-desc": "Legcord CSP er systemet vårt brukt til innlasting av egendefinert innhold i Discord-programmet. Ting som\n klient-modifikasjoner og drakter trenger det. Skru dette av for å bli kvitt modifikasjoner og stilendriner.", - "settings-tray-desc": "Når avskrudd vil Legcord lukkes som ethvert annet vindu. Ellers vil det være i systemkurven din for senere bruk.", - "settings-mobileMode-desc": "For enheter med pekeskjerm. Aktiverer Discord sitt skjulte modbilmodus tiltenkt telefoner og nettbrett.\n Den eneste store funksjonen som mangler er stemmesludring. Ideelt for PinePhone-brukere og lign.", - "settings-invitewebsocket-desc": "Når dette er påskrudd støtter Legcord Discord.gg-lenker, noe som betyr at Legcord automatisk godtar\n invitasjoner hvis du åpner dem i nettleseren. Kan til tider slutte å svare.", - "settings-mod-desc1": "Klientmodifikasjoner er prorammer som lar de endre Discord-opplevelsen. De kan endre klientens\n utseende, endre adferden, eller legge til nye funksjoner.", - "settings-trayIcon": "Systemkurvsikon", - "settings-trayIcon-desc": "Sett ikonet som vises i systemkurven.", - "settings-advanced": "Sone for avanserte brukere", - "settings-pluginsFolder": "Åpne programtilleggsmappen", - "settings-themesFolder": "Åpne draktmappen", - "settings-storageFolder": "Åpne lagringsmappen", - "settings-restart": "Start appen på nytt", - "settings-mod-vencord": "lett og brukervennlig klient-mod. Har en innebygd butikk for plugins.", - "settings-prfmMode-desc": "Performance mode is an experimental function that may either increase responsiveness and performance of\n Legcord or... decrease it. Please try every option and see which fits you the best.", - "settings-trayIcon-dynamic": "Dynamisk", - "settings-trayIcon-normal": "Discord-ikon", - "settings-trayIcon-classic": "Klassisk Discord-ikon", - "settings-trayIcon-colored-plug": "Farget plugg", - "settings-trayIcon-white-plug": "Hvit plugg", - "settings-trayIcon-white-plug-alt": "Hvit Plugg Alt", - "settings-trayIcon-black-plug": "Black Plug", - "settings-trayIcon-black-plug-alt": "Black Plug Alt", - "settings-experimental": "Eksperimental", - "settings-skipSplash": "Hopp over velkomstskjerm (Eksperimentell)", - "settings-skipSplash-desc": "Hopper over Legcord-velkomstskjermen når du starter opp appen.", - "settings-copyDebugInfo": "Kopier feilsøkingsinformasjon", - "settings-startMinimized-desc": "Legcord starter i bakgrunnen og er utenfor din sikt.", - "settings-startMinimized": "Start minimert", - "settings-crashesFolder": "Open native crashes folder", - "settings-forceNativeCrash": "Tving \"native\" krasj", - "settings-disableAutogain": "Deaktiver autogain", - "settings-disableAutogain-desc": "Skrur av autogain", - "settings-theme-transparent": "Gjennomsiktig", - "settings-useLegacyCapturer": "Bruk eldre fanger", - "settings-useLegacyCapturer-desc": "Bruk den eldre skjermdelingsmodulen i stedet for den nye. Hvis du opplever problemer med skjermdeling, prøv å aktivere dette.", - "settings-spellcheck": "Stavekontroll", - "settings-spellcheck-desc": "Hjelper deg å rette feilstavede ord ved å utheve dem.", - "setup_question5": "Har du lyst å bruke et skuffeikon?", - "settings-mintoTray": "Minimer til skuffe", - "settings-mintoTray-desc": "Når avskurdd vil Legcord lukkes som andre vinduer vanligvis gjør, ellers vil den sitte å slappe av\n i skuffen for senere bruk.", - "settings-MultiInstance": "Flerinstans", - "settings-MultiInstance-desc": "Når avskurdd vil du ha muligheten til å starte mange instanser med Legcord.", - "settings-copyGPUInfo": "Kopier GPU-informasjon", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio": "Audio", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-clearClientModCache": "Clear client mod cache", - "settings-category-behaviour": "Behaviour", - "settings-theme-overlay": "Overlay", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options" -} diff --git a/assets/lang/nl-NL.json b/assets/lang/nl-NL.json deleted file mode 100644 index a6d6ae7..0000000 --- a/assets/lang/nl-NL.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "setup_question1": "Welkom bij de Legcord Setup", - "setup_question3": "Moet Legcord client mods installeren?", - "yes": "Ja", - "no": "Nee", - "setup_offline": "Het lijkt erop alsof je offline bent. Verbind met het internet en herstart Legcord setup.", - "loading_screen_start": "Legcord starten…", - "next": "Volgende", - "setup_question4": "Selecteer een client mod om te installeren:", - "loading_screen_offline": "Het lijkt erop alsof je offline bent. Verbind met het Internet en probeer opnieuw.", - "loading_screen_update": "Een nieuwe versie van Legcord is beschikbaar. Update alstublieft naar de nieuwste versie.", - "setup_question2": "Kies je Discord kanaal/instantie:", - "settings-tray": "Minimaliseer naar pictogram in het systeemvak", - "settings-channel": "Discord kanaal:", - "settings-mod": "Client mod:", - "settings-save": "Instellingen opslaan", - "settings-updater": "Check voor updates", - "settings-theme": "Legcord Thema", - "settings-theme-default": "Standaard", - "settings-theme-native": "oorspronkelijk", - "settings-invitewebsocket": "discord.gg support", - "settings-none": "Geen", - "settings-prfmMode": "Performance mode:", - "settings-prfmMode-performance": "Performance", - "settings-prfmMode-battery": "batterij", - "settings-mobileMode": "Mobiele modus", - "settings-invitewebsocket-desc": "When enabled Legcord will support Discord.gg links which means that if you open an invite link in your\n browser, Legcord will automatically accept the invite. Can be unresponsive at times.", - "settings-csp-desc": "Legcord CSP is ons systeem dat aangepaste content dat in de Discord app laad beheert. Dingen zoals cliënt mods en thema's steunen hierop. Deactiveer dit als je alle mods en aangepaste stijlen weg wilt halen.", - "settings-tray-desc": "When disabled, Legcord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.", - "settings-mobileMode-desc": "If you're on a device with touch-screen this feature is for you! It activates Discord's hidden mobile\n mode meant for phones and tablets. Only major feature missing is voice chat support. This is ideal for\n users on PinePhone and similar.", - "settings-mod-desc1": "Client mods are programs that allow you customize your Discord experience. They can change appearance of\n the client, modify behaviours or add new features!", - "settings-trayIcon": "Tray icon", - "settings-trayIcon-desc": "Set the icon which will appear in tray menu.", - "settings-advanced": "Geavanceerde gebruikers zone", - "settings-pluginsFolder": "Open plugins folder", - "settings-themesFolder": "Open thema's map", - "settings-storageFolder": "Open storage folder", - "settings-restart": "Start App opnieuw op", - "settings-experimental": "Experimenteel", - "settings-skipSplash-desc": "Skips Legcord splash screen when you start up the app.", - "settings-mod-vencord": "lightweight, and easy to use client mod. Features a built-in store for plugins.", - "settings-prfmMode-desc": "Performance mode is an experimental function that may either increase responsiveness and performance of\n Legcord or... decrease it. Please try every option and see which fits you the best.", - "settings-trayIcon-dynamic": "Dynamisch", - "settings-trayIcon-normal": "Discord Icoon", - "settings-trayIcon-classic": "Klassiek Discord Icoon", - "settings-trayIcon-colored-plug": "Gekleurde stekker", - "settings-trayIcon-white-plug": "Witte Stekker", - "settings-trayIcon-white-plug-alt": "White Plug Alt", - "settings-trayIcon-black-plug": "Zwarte Stekker", - "settings-trayIcon-black-plug-alt": "Black Plug Alt", - "settings-skipSplash": "Skip Splash Screen (Experimental)", - "settings-copyDebugInfo": "Kopier Debug Informatie", - "settings-startMinimized": "Start geminimaliseert", - "settings-startMinimized-desc": "Legcord starts in background and remains out of your way.", - "settings-forceNativeCrash": "Force native crash", - "settings-crashesFolder": "Open native crashes folder", - "settings-disableAutogain": "Disable autogain", - "settings-disableAutogain-desc": "Disables autogain.", - "settings-theme-transparent": "Transparant", - "settings-useLegacyCapturer": "Use legacy capturer", - "settings-useLegacyCapturer-desc": "Use legacy screenshare module, instead of the new one. If you're experiencing issues with screen sharing, try enabling this.", - "settings-spellcheck": "Spellcheck", - "settings-spellcheck-desc": "Helps you correct misspelled words by highlighting them.", - "setup_question5": "Wilt u een een pictogram in het systeemvak gebruiken?", - "settings-mintoTray": "Minimaliseren naar systeemvak", - "settings-mintoTray-desc": "When disabled, Legcord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.", - "settings-MultiInstance": "Multi Instance", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of Legcord.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/pl-PL.json b/assets/lang/pl-PL.json deleted file mode 100644 index 2e41b51..0000000 --- a/assets/lang/pl-PL.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_update": "Nowa wersja Legcord jest dostępna. Proszę zaktualizować do najnowszej wersji.", - "setup_question2": "Wybierz swój kanał/odmianę Discorda:", - "setup_question3": "Czy Legcord powinienem zajmować sie instalacją modyfikacji klienta?", - "yes": "Tak", - "no": "Nie", - "next": "Dalej", - "setup_question4": "Wybierz modyfikację klienta którą chcesz zainstalować:", - "loading_screen_start": "Uruchamianie Legcord…", - "loading_screen_offline": "Wygląda na to, że jesteś offline. Uruchom ponownie za ", - "setup_question1": "Witaj w konfiguracji Legcord'a", - "setup_offline": "Wygląda na to, że jesteś offline. Połącz się z Internetem i uruchom ponownie Legcord.", - "settings-channel": "Kanał Discorda", - "settings-updater": "Sprawdź aktualizacje", - "settings-tray": "Zminimalizuj do ikony zasobnika", - "settings-save": "Zapisz Ustawienia", - "settings-mod": "Modyfikacja klienta", - "settings-theme": "Motyw Legcord", - "settings-theme-default": "Domyślny", - "settings-theme-native": "Natywny", - "settings-invitewebsocket": "Rich Presence (Eksperymentalna opcja)", - "settings-prfmMode": "Tryb wydajności", - "settings-prfmMode-performance": "Wydajny", - "settings-prfmMode-battery": "Bateria", - "settings-none": "Nic/Brak", - "settings-mobileMode": "Tryb mobilny", - "settings-csp-desc": "Legcord CSP to nasz autorski system który zarządza ładowaniem niestandardowych rzeczy do klienta. Na przykład\n modyfikacje klienta lub motywy wymagają jego obecności. Wyłącz jeśli chcesz się pozbyć modyfikacji i motywów Discorda.", - "settings-tray-desc": "Kiedy wyłączone, Legcord zamknie swoje okno jak każda inna aplikacja, jednak gdy jest włączone usiądzie i odpocznie w zasobniku systemowym.", - "settings-mobileMode-desc": "Jeśli jesteś na urządzeniu z dotykowym ekranem, ta opcja jest dla ciebie! Aktywuje ona ukryty tryb Discord\n przeznaczony tylko na telefony i tablety. Jedną z brakujących funkcji to kanał głosowy. Jest to idealne rozwiązanie dla\n użytkowników PinePhone i podobnych.", - "settings-invitewebsocket-desc": "Używa arRPC aby wspierać Discord RPC (Rich Presence) z lokalnymi programami na twoim komputerze. Praca w toku.", - "settings-mod-desc1": "Modyfikacje klienta to programy, które pozwalają Ci dostosować Twoje doświadczenie z Discordem. Mogą zmienić wygląd\n klienta, modyfikować zachowanie lub dodać nowe funkcje!", - "settings-trayIcon": "Ikona w trayu", - "settings-trayIcon-desc": "Ustaw ikonę, która pojawi się w trayu systemowym.", - "settings-advanced": "Strefa zaawansowanego użytkownika", - "settings-pluginsFolder": "Otwórz folder z wtyczkami", - "settings-themesFolder": "Otwórz folder motywów", - "settings-storageFolder": "Otwórz folder magazynu", - "settings-restart": "Zrestartuj Aplikację", - "settings-mod-vencord": "lekka i łatwa do użycia modyfikacja klienta. Posiada wbudowany sklep z wtyczkami.", - "settings-prfmMode-desc": "Tryb wydajności to eksperymentalna funkcja, która może albo zwiększyć responsywność i wydajność\n Legcorda lub... je zmniejszyć. Proszę, wypróbuj każdą opcję i zobacz, która najlepiej Ci odpowiada.", - "settings-trayIcon-dynamic": "Dynamiczny", - "settings-trayIcon-normal": "Ikona Discorda", - "settings-trayIcon-classic": "Klasyczna Ikona Discorda", - "settings-trayIcon-colored-plug": "Kolorowa Wtyczka", - "settings-trayIcon-white-plug": "Biała wtyczka", - "settings-trayIcon-white-plug-alt": "Alternatywna Biała Wtyczka", - "settings-trayIcon-black-plug": "Czarna wtyczka", - "settings-trayIcon-black-plug-alt": "Alternatywna Czarna Wtyczka", - "settings-experimental": "Eksperymentalny", - "settings-skipSplash": "Pomiń Ekran Powitalny (Eksperymentalny)", - "settings-skipSplash-desc": "Pomija ekran powitalny Legcorda kiedy uruchamiasz aplikację.", - "settings-copyDebugInfo": "Skopiuj Informacje Debugowania", - "settings-startMinimized": "Uruchamiaj zminimalizowany", - "settings-startMinimized-desc": "Legcord uruchamia się w tle i nie przeszkadza po uruchomieniu.", - "settings-crashesFolder": "Otwórz folder natywnych crashów", - "settings-forceNativeCrash": "Wymuś natywny crash", - "settings-disableAutogain": "Wyłącz automatyczną regulację wzmocnienia", - "settings-disableAutogain-desc": "Wyłącza automatyczną regulację wzmocnienia.", - "settings-theme-transparent": "Przeźroczysty", - "settings-useLegacyCapturer": "Używaj starszej metody przechwytywania", - "settings-useLegacyCapturer-desc": "Używaj starszego modułu udostępniania ekranu, zamiast nowego. Jeżeli doświadczasz problemy z udostępnianiem ekranu, możesz spróbować włączyć tą opcję.", - "settings-spellcheck": "Sprawdzanie pisowni", - "settings-spellcheck-desc": "Pomaga poprawiać błędnie napisane słowa, podświetlając je.", - "setup_question5": "Chcesz używać ikony zasobnika?", - "settings-mintoTray": "Zminimalizuj do zasobnika systemowego", - "settings-mintoTray-desc": "Po wyłączeniu, Legcord zamknie się jak każde inne okno po zamknięciu. Następnie poczeka w zasobniku\n systemowym na później.", - "settings-MultiInstance": "Wiele instancji", - "settings-MultiInstance-desc": "Kiedy ta opcja jest włączona możliwe jest uruchomienie wielu instancji Legcord.", - "settings-copyGPUInfo": "Skopiuj informacje o GPU", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/pt-BR.json b/assets/lang/pt-BR.json deleted file mode 100644 index 26711e5..0000000 --- a/assets/lang/pt-BR.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "no": "Não", - "loading_screen_start": "Iniciando Legcord…", - "loading_screen_offline": "Você parece estar offline. Por favor, conecte-se à internet e tente novamente.", - "loading_screen_update": "Uma nova versão do Legcord está disponível. Por favor, atualize para a versão mais recente.", - "setup_question1": "Bem-vindo à configuração do Legcord", - "setup_offline": "Você parece estar offline. Por favor, conecte-se à internet e reinicie o Legcord.", - "setup_question2": "Escolha o canal/instância do seu Discord:", - "setup_question3": "O Legcord deve lidar com a instalação de mods do cliente?", - "yes": "Sim", - "next": "Próximo", - "setup_question4": "Selecione um mod de cliente que você deseja instalar:", - "settings-theme": "Tema do Legcord", - "settings-theme-default": "Padrão", - "settings-theme-native": "Nativo", - "settings-tray": "Minimizar para a Bandeja", - "settings-channel": "Canal do Discord", - "settings-invitewebsocket": "Rich Presence (Experimental)", - "settings-mod": "Modificação de cliente", - "settings-prfmMode": "Modo de performance", - "settings-prfmMode-performance": "Desempenho", - "settings-prfmMode-battery": "Bateria", - "settings-none": "Nenhum", - "settings-save": "Salvar configurações", - "settings-updater": "Verificar atualizações", - "settings-mobileMode": "Modo móvel", - "settings-csp-desc": "Legcord CSP é o nosso sistema que gerencia o carregamento de conteúdo personalizado no aplicativo do Discord. Coisas como\n mods de cliente e temas dependem disso. Desative se você quiser se livrar de mods e estilos personalizados.", - "settings-mobileMode-desc": "Se estiver em um dispositivo com tela sensível ao toque, este recurso é para você! Ele ativa o modo móvel oculto do Discord\n destinado a celulares e tablets. A única característica importante ausente é o suporte ao bate-papo por voz. Isso é ideal para\n usuários do PinePhone e similares.", - "settings-tray-desc": "Quando desativado, o Legcord irá encerrar como qualquer outra janela quando for fechado, caso contrário, permanecerá em repouso na bandeja do seu sistema para mais tarde.", - "settings-invitewebsocket-desc": "Usa arRPC para dar suporte ao Discord RPC (Rich Presence) com programas locais na sua máquina. Trabalho em andamento.", - "settings-mod-desc1": "Mods de cliente são programas que permitem personalizar sua experiência no Discord. Eles podem alterar a aparência\n do cliente, modificar comportamentos ou adicionar novos recursos!", - "settings-trayIcon": "Ícone da bandeja", - "settings-trayIcon-desc": "Defina o ícone que aparecerá no menu da bandeja.", - "settings-advanced": "Área para usuários avançados", - "settings-pluginsFolder": "Abrir pasta de plugins", - "settings-themesFolder": "Abrir pasta de temas", - "settings-storageFolder": "Abrir pasta de armazenamento", - "settings-restart": "Reiniciar Aplicativo", - "settings-mod-vencord": "mod leve e fácil de usar. Possui uma loja integrada para plugins.", - "settings-prfmMode-desc": "O modo de performance é uma função experimental que pode ou melhorar a capacidade de resposta e performance do \n Legcord, ou... reduzi-la. Por favor, tente todas opções e veja qual te serve melhor.", - "settings-trayIcon-dynamic": "Dinâmico", - "settings-trayIcon-normal": "Ícone do Discord", - "settings-trayIcon-classic": "Ícone Clássico do Discord", - "settings-trayIcon-colored-plug": "Plugue Colorido", - "settings-trayIcon-white-plug": "Plugue Branco", - "settings-trayIcon-white-plug-alt": "Plugue Branco Alternativo", - "settings-trayIcon-black-plug": "Plugue Preto", - "settings-trayIcon-black-plug-alt": "Plugue Preto Alternativo", - "settings-experimental": "Experimental", - "settings-skipSplash": "Pular Tela Inicial (Experimental)", - "settings-skipSplash-desc": "Pula a tela inicial do Legcord quando você abre o aplicativo.", - "settings-copyDebugInfo": "Copiar Informação de Depuração", - "settings-startMinimized": "Iniciar minimizado", - "settings-startMinimized-desc": "Legcord abre em segundo plano sem te incomodar.", - "settings-crashesFolder": "Abrir pasta nativa de crashes", - "settings-forceNativeCrash": "Forçar crash nativo", - "settings-disableAutogain": "Desabilitar ganho automático", - "settings-disableAutogain-desc": "Desabilita ganho automático.", - "settings-theme-transparent": "Transparente", - "settings-useLegacyCapturer": "Usar capturador antigo", - "settings-useLegacyCapturer-desc": "Usar módulo de compartilhamento de tela antigo, ao invés do novo. Se você estiver tendo problemas com o compartilhamento de tela, tente ativar isto.", - "settings-spellcheck": "Correção ortográfica", - "settings-spellcheck-desc": "Ajuda a corrigir palavras com erros ortográficos destacando-as.", - "setup_question5": "Você pretende usar o ícone de programa?", - "settings-mintoTray": "Minimize o programa", - "settings-mintoTray-desc": "Quando desativado, Legcord irá fechar igual qualquer outra janela quando fechada, por outro lado irá só sentar e relaxar\n na bandeja do seu sistema para mais tarde.", - "settings-MultiInstance": "Multi Instância", - "settings-MultiInstance-desc": "Quando ativado você será capaz de iniciar múltiplas instâncias do Legcord.", - "settings-copyGPUInfo": "Copiar informação da GPU", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Usar scroll suave", - "settings-smoothScroll-desc": "Ativar/desativar scroll suave", - "settings-autoScroll": "Permitir scroll automático", - "settings-autoScroll-desc": "Permitir scroll do mouse com clique do scroll (Obs: Seu ambiente de trabalho pode substituir esta ação.)", - "settings-theme-desc": "Muda o estilo de janela que o Legcord utiliza.", - "settings-channel-desc": "Use essa configuração para alterar a instância do Discord que Legcord roda.", - "settings-hardwareAcceleration": "Aceleração de hardware", - "settings-hardwareAcceleration-desc": "Aceleração de hardware usa sua GPU para melhor desempenho do Legcord. Caso você experiencie problemas visuais, opte por desabilitar esta opção.", - "settings-disableHttpCache-desc": "Desativa cache HTTP do Chromium. Desabilite esta opção caso modificações do client não carreguem para você.", - "settings-disableHttpCache": "Desativa cache HTTP", - "settings-mod-equicord": "inspirado e nascido pelos contribuidores do Vencord, contribuindo com um cliente bonito e repleto de plugins.", - "settings-audio": "Áudio", - "settings-audio-desc": "Selecione qual método Legcord utiliza para capturar áudio do seu sistema durante transmissões de tela.", - "settings-category-legacy": "Funções herdadas/preexistentes.", - "settings-category-debug": "Opções de debug", - "settings-theme-overlay": "Sobreposição", - "settings-category-behaviour": "Comportamento", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Aspecto visual", - "settings-clearClientModCache": "Limpar cache do client e seus mods" -} diff --git a/assets/lang/pt-PT.json b/assets/lang/pt-PT.json deleted file mode 100644 index 33e3529..0000000 --- a/assets/lang/pt-PT.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_offline": "Parece estar offline. Por favor, conecte à internet e tente novamente.", - "settings-disableAutogain-desc": "Desativa ganho automático.", - "settings-startMinimized": "Iniciar minimizado", - "settings-trayIcon-white-plug-alt": "Plugue Branco Alternativo", - "settings-trayIcon-dynamic": "Dinâmico", - "settings-spellcheck-desc": "Ajuda a corrigir palavras com erros ortográficos destacando-as.", - "settings-theme-default": "Padrão", - "settings-skipSplash": "Pular Ecrã Inicial (Experimental)", - "settings-forceNativeCrash": "Forçar crash nativo", - "settings-trayIcon-white-plug": "Plugue Branco", - "settings-mod-vencord": "mod leve e fácil de usar. Possui uma loja integrada para plugins.", - "settings-trayIcon": "Ícone da bandeja", - "settings-prfmMode-battery": "Pilha", - "settings-prfmMode": "Modo de performance", - "settings-trayIcon-black-plug-alt": "Plugue Preto Alternativo", - "setup_question2": "Escolha o canal/instância do seu Discord:", - "next": "Próximo", - "settings-spellcheck": "Verificação ortográfica", - "no": "Não", - "settings-updater": "Verificar atualizações", - "settings-theme": "Tema do Legcord", - "settings-mintoTray-desc": "Quando desativado, Legcord irá fechar igual qualquer outra janela quando fechada, por outro lado irá só sentar e relaxar\n na bandeja do seu sistema para mais tarde.", - "settings-MultiInstance": "Multi Instância", - "settings-storageFolder": "Abrir pasta de armazenamento", - "settings-mobileMode-desc": "Se estiver num dispositivo com um ecrã sensível ao toque, este recurso é para si! Ele ativa o modo móvel oculto do Discord\n destinado a telemóveis e tablets. A única característica importante ausente é o suporte ao bate-papo por voz. Isso é ideal para\n utilizadores do PinePhone e similares.", - "settings-restart": "Reiniciar App", - "settings-prfmMode-performance": "Desempenho", - "yes": "Sim", - "settings-mobileMode": "Modo móvel", - "setup_question4": "Selecione um mod de cliente que deseja instalar:", - "settings-theme-native": "Nativo", - "settings-themesFolder": "Abrir pasta de temas", - "setup_offline": "Parece estar offline. Por favor, conecte à internet e reinicie o Legcord.", - "setup_question1": "Bem-vindo à configuração do Legcord", - "settings-copyDebugInfo": "Copiar Informação de Depuração", - "settings-mod-desc1": "Mods de cliente são programas que permitem personalizar a sua experiência no Discord. Eles podem alterar a aparência\n do cliente, modificar comportamentos ou adicionar novos recursos!", - "settings-skipSplash-desc": "Pula o ecrã inicial do Legcord quando abre a app.", - "setup_question3": "O Legcord deve lidar com a instalação de mods do cliente?", - "settings-MultiInstance-desc": "Quando ativado será capaz de iniciar múltiplas instâncias do Legcord.", - "settings-useLegacyCapturer-desc": "Usar módulo de compartilhamento de ecrã antigo, ao invés do novo. Se tem problemas com a partilha do ecrã, tente ativar isto.", - "settings-invitewebsocket-desc": "Usa arRPC para dar suporte ao Discord RPC (Rich Presence) com programas locais na sua máquina. Trabalho em andamento.", - "settings-theme-transparent": "Transparente", - "settings-crashesFolder": "Abrir pasta nativa de crashes", - "settings-trayIcon-black-plug": "Plugue Preto", - "settings-prfmMode-desc": "O modo de performance é uma função experimental que pode ou melhorar a capacidade de resposta e performance do \n Legcord, ou... reduzi-la. Por favor, tente todas opções e veja qual te serve melhor.", - "settings-channel": "Canal do Discord", - "settings-mod": "Modificação de cliente", - "settings-trayIcon-desc": "Defina o ícone que aparecerá no menu da bandeja.", - "settings-advanced": "Área para utilizadores avançados", - "loading_screen_start": "A iniciar o Legcord…", - "setup_question5": "Pretende usar o ícone de programa?", - "settings-invitewebsocket": "Rich Presence (Experimental)", - "settings-save": "Gravar configurações", - "settings-tray-desc": "Quando desativado, o Legcord irá encerrar como qualquer outra janela quando for fechado, caso contrário, permanecerá em repouso na bandeja do seu sistema para mais tarde.", - "settings-useLegacyCapturer": "Usar capturador antigo", - "settings-startMinimized-desc": "Legcord abre em segundo plano sem te incomodar.", - "settings-pluginsFolder": "Abrir pasta de plugins", - "settings-tray": "Minimizar para a Bandeja", - "settings-trayIcon-normal": "Ícone do Discord", - "settings-mintoTray": "Minimize o programa", - "settings-trayIcon-colored-plug": "Plugue Colorido", - "settings-trayIcon-classic": "Ícone Clássico do Discord", - "settings-disableAutogain": "Desativar ganho automático", - "loading_screen_update": "Uma nova versão do Legcord está disponível. Por favor, atualize à versão mais recente.", - "settings-experimental": "Experimental", - "settings-none": "Nenhum", - "settings-csp-desc": "Legcord CSP é o nosso sistema que gerencia o carregamento de conteúdo personalizado na app do Discord. Coisas como\n mods de cliente e temas dependem disso. Desative se quiser livrar-se de mods e estilos personalizados.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio": "Audio", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/ro-RO.json b/assets/lang/ro-RO.json deleted file mode 100644 index 885f3c3..0000000 --- a/assets/lang/ro-RO.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_start": "Începând Legcord…", - "settings-theme-default": "Implicit", - "settings-spellcheck": "Spellcheck", - "settings-invitewebsocket": "Rich Presence (Experimental)", - "settings-invitewebsocket-desc": "Uses arRPC to support Discord RPC (Rich Presence) with local programs on your machine. Work in progress.", - "settings-prfmMode-desc": "Performance mode is an experimental function that may either increase responsiveness and performance of\n Legcord or… decrease it. Please try every option and see which fits you the best.", - "settings-prfmMode-performance": "Performance", - "settings-advanced": "Advanced user zone", - "loading_screen_offline": "Se pare ca voi sunteți offline. Conectați-va la internet și incercați din nou. ", - "loading_screen_update": "O versiune noua de Legcord este disponibilă. Va rugăm sa instalați noua versiune", - "setup_question1": "Bine ați venit la configurarea pentru Legcord", - "setup_offline": "You appear to be offline. Please connect to the internet and restart Legcord.", - "setup_question2": "Alegeți versiunea/instanța de Discord:", - "setup_question3": "Ar trebui ca Legcord sa instaleze modificări?", - "yes": "Da", - "no": "Nu", - "next": "Următorul", - "setup_question4": "Alegeți o modificare pe care dorești să o instalezi:", - "settings-theme": "Temă Legcord", - "settings-theme-native": "Nativ", - "settings-theme-transparent": "Transparent (Experimental)", - "settings-csp-desc": "Legcord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.", - "settings-tray": "Minimize to tray", - "settings-tray-desc": "When disabled, Legcord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.", - "settings-startMinimized": "Incepe minimalizat", - "settings-startMinimized-desc": "Legcord incepe in background și rămâne inafara faței tale.", - "settings-useLegacyCapturer": "Folosește capturator-ul legacy", - "settings-useLegacyCapturer-desc": "Use legacy screenshare module, instead of the new one. If you're experiencing issues with screen sharing, try enabling this.", - "settings-mobileMode": "Mobile mode", - "settings-mobileMode-desc": "If you're on a device with touch-screen this feature is for you! It activates Discord's hidden mobile\n mode meant for phones and tablets. Only major feature missing is voice chat support. This is ideal for\n users on PinePhone and similar.", - "settings-spellcheck-desc": "Helps you correct misspelled words by highlighting them.", - "settings-channel": "Discord channel", - "settings-mod": "Client mod", - "settings-mod-desc1": "Client mods are programs that allow you customize your Discord experience. They can change appearance of\n the client, modify behaviours or add new features!", - "settings-mod-vencord": "lightweight, and easy to use client mod. Features a built-in store for plugins.", - "settings-prfmMode": "Performance mode", - "settings-prfmMode-battery": "Battery", - "settings-disableAutogain": "Disable autogain", - "settings-disableAutogain-desc": "Disables autogain.", - "settings-trayIcon": "Tray icon", - "settings-trayIcon-desc": "Set the icon which will appear in tray menu.", - "settings-trayIcon-dynamic": "Dynamic", - "settings-trayIcon-normal": "Discord Icon", - "settings-trayIcon-classic": "Classic Discord Icon", - "settings-trayIcon-colored-plug": "Colored Plug", - "settings-trayIcon-white-plug": "White Plug", - "settings-trayIcon-white-plug-alt": "White Plug Alt", - "settings-trayIcon-black-plug": "Black Plug", - "settings-trayIcon-black-plug-alt": "Black Plug Alt", - "settings-pluginsFolder": "Open plugins folder", - "settings-crashesFolder": "Open native crashes folder", - "settings-themesFolder": "Open themes folder", - "settings-storageFolder": "Open storage folder", - "settings-none": "None", - "settings-save": "Save Settings", - "settings-experimental": "Experimental", - "settings-restart": "Reporniți aplicația", - "settings-updater": "Verificați actualizările", - "settings-skipSplash": "Omiteți ecranul de prezentare (Experimental)", - "settings-skipSplash-desc": "Skips Legcord splash screen when you start up the app.", - "settings-copyDebugInfo": "Copy Debug Info", - "settings-forceNativeCrash": "Force native crash", - "setup_question5": "Vrei să folosești o iconiță de tray?", - "settings-mintoTray": "Mergi in background", - "settings-mintoTray-desc": "When disabled, Legcord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.", - "settings-MultiInstance": "Mai multe instanțe", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of Legcord.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio": "Audio", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/ru-RU.json b/assets/lang/ru-RU.json deleted file mode 100644 index 1cd7223..0000000 --- a/assets/lang/ru-RU.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_start": "Запуск Legcord…", - "loading_screen_offline": "Видимо, вы не в сети. Перезапуск через ", - "loading_screen_update": "Доступна новая версия Legcord. Пожалуйста, обновитесь до последней версии.", - "setup_question1": "Добро пожаловать на установку Legcord", - "setup_offline": "Видимо, вы не в сети. Подключитесь к Интернету и перезапустите Legcord.", - "setup_question2": "Выберите свой канал/экземпляр Discord:", - "setup_question3": "Должен ли Legcord заниматься установкой клиентских модов?", - "yes": "Да", - "no": "Нет", - "next": "Далее", - "setup_question4": "Выберите клиентский мод, который хотите установить:", - "settings-theme": "Стиль окна", - "settings-theme-default": "По умолчанию", - "settings-theme-native": "Системная", - "settings-tray": "Трей", - "settings-channel": "Канал Discord", - "settings-invitewebsocket": "Статус активности", - "settings-mod": "Клиентский мод", - "settings-prfmMode": "Режим производительности", - "settings-prfmMode-performance": "Производительность", - "settings-prfmMode-battery": "Экономия батареи", - "settings-none": "Не используется", - "settings-save": "Сохранить настройки", - "settings-updater": "Проверить наличие обновлений", - "settings-mobileMode": "Мобильный режим", - "settings-csp-desc": "Legcord CSP это наша система, которая управляет загрузкой пользовательского контента в приложение Discord. Такие вещи как клиентские моды и темы зависят от неё. Отключите, если хотите избавиться от модов и пользовательских стилей.", - "settings-tray-desc": "Переключатель для значка Legcord в трее", - "settings-pluginsFolder": "Открыть папку плагинов", - "settings-themesFolder": "Открыть папку тем", - "settings-storageFolder": "Открыть папку хранилища", - "settings-mobileMode-desc": "Если вы пользуетесь устройством с сенсорным экраном, эта функция для вас! Она активирует скрытый мобильный режим, предназначенный для телефонов и планшетов. Единственная недостающая функция - поддержка голосового чата. Это идеально подходит\n для пользователей PinePhone и подобных устройств.", - "settings-invitewebsocket-desc": "Использует arRPC чтобы поддерживать Discord RPC (Статус активности) с локальными программами на вашем компьютере.", - "settings-mod-desc1": "Клиентские моды - это программы, которые позволяют вам настроить работу с Discord. Они могут изменять внешний вид клиента, изменять поведение или добавлять новые возможности!", - "settings-trayIcon": "Иконка области уведомлений", - "settings-trayIcon-desc": "Установите значок, который будет отображаться в области уведомлений.", - "settings-advanced": "️ Расширенная пользовательская зона", - "settings-restart": "Перезапустить приложение", - "settings-mod-vencord": "легкий и простой в использовании клиентский мод. Имеет встроенный магазин для плагинов.", - "settings-copyDebugInfo": "Скопировать отладочную информацию", - "settings-prfmMode-desc": "Режим производительности - это экспериментальная функция, которая может либо увеличить отзывчивость и производительность Legcord, либо. . . снизить их. Пожалуйста, попробуйте все варианты и посмотрите, какой подходит вам больше всего.", - "settings-trayIcon-dynamic": "Динамический", - "settings-trayIcon-normal": "Значок Discord", - "settings-trayIcon-classic": "Классический значок Discord", - "settings-trayIcon-colored-plug": "Цветная вилка", - "settings-trayIcon-white-plug": "Белый штекер", - "settings-trayIcon-white-plug-alt": "Белый штекер Alt", - "settings-trayIcon-black-plug": "Черная вилка", - "settings-trayIcon-black-plug-alt": "Черный штекер Alt", - "settings-experimental": "Экспериментальный", - "settings-skipSplash": "Пропустить заставку", - "settings-skipSplash-desc": "Пропускает экран-заставку Legcord при запуске приложения.", - "settings-startMinimized": "Запуск свернутым", - "settings-startMinimized-desc": "Legcord запускается в фоновом режиме и не мешает вам.", - "settings-crashesFolder": "Открыть родную папку сбоев", - "settings-forceNativeCrash": "Принудительный сбой", - "settings-disableAutogain": "Отключение автогейна", - "settings-disableAutogain-desc": "Отключает автогейн.", - "settings-theme-transparent": "Прозрачный", - "settings-useLegacyCapturer": "Использование устаревшего устройства захвата", - "settings-useLegacyCapturer-desc": "Использовать устаревший модуль screenshare вместо нового. Если у вас возникли проблемы с общим доступом к экрану, попробуйте включить эту функцию.", - "settings-spellcheck": "Проверка орфографии", - "settings-spellcheck-desc": "Помогает исправить неправильно написанные слова, выделяя их.", - "setup_question5": "Вы хотите использовать значок в трее?", - "settings-mintoTray": "Работа в фоновом режиме", - "settings-mintoTray-desc": "При отключении Legcord будет закрываться как любое другое окно при закрытии, в противном случае он будет сидеть и отдыхать в системном трее.", - "settings-MultiInstance": "Множество Экземпляров", - "settings-MultiInstance-desc": "Когда включено, вы можете запустить множество экземпляров Legcord.", - "settings-copyGPUInfo": "Копировать информацию о GPU", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Использовать плавную прокрутку", - "settings-smoothScroll-desc": "Включить плавную прокрутку", - "settings-autoScroll": "Разрешить автоматическую прокрутку", - "settings-autoScroll-desc": "Разрешить автоматическую прокрутку при нажатии средней кнопки мыши (Примечание: ваша среда рабочего стола все еще может переопределить это с помощью другого действия)", - "settings-theme-desc": "Стиль окна определяет какой заголовок окна будет использовать Legcord.", - "settings-channel-desc": "Используйте эту настройку, чтобы изменить текущий экземпляр Discord, запущенный Legcord.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio": "Audio", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/sk-SK.json b/assets/lang/sk-SK.json deleted file mode 100644 index 5c8663a..0000000 --- a/assets/lang/sk-SK.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_offline": "Zdá sa, že ste offline. Pripojte sa k internetu a skúste to znova.", - "settings-disableAutogain-desc": "Disables autogain.", - "settings-startMinimized": "Start minimized", - "settings-trayIcon-white-plug-alt": "White Plug Alt", - "settings-trayIcon-dynamic": "Dynamic", - "settings-spellcheck-desc": "Helps you correct misspelled words by highlighting them.", - "settings-theme-default": "Default", - "settings-skipSplash": "Skip Splash Screen (Experimental)", - "settings-forceNativeCrash": "Force native crash", - "settings-trayIcon-white-plug": "White Plug", - "settings-mod-vencord": "lightweight, and easy to use client mod. Features a built-in store for plugins.", - "settings-trayIcon": "Tray icon", - "settings-prfmMode-battery": "Battery", - "settings-prfmMode": "Performance mode", - "settings-trayIcon-black-plug-alt": "Black Plug Alt", - "setup_question2": "Choose your Discord channel/instance:", - "next": "Next", - "settings-spellcheck": "Spellcheck", - "no": "No", - "settings-updater": "Check for updates", - "settings-theme": "Legcord theme", - "settings-mintoTray-desc": "When disabled, Legcord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.", - "settings-MultiInstance": "Multi Instance", - "settings-storageFolder": "Open storage folder", - "settings-mobileMode-desc": "If you're on a device with touch-screen this feature is for you! It activates Discord's hidden mobile\n mode meant for phones and tablets. Only major feature missing is voice chat support. This is ideal for\n users on PinePhone and similar.", - "settings-restart": "Restart App", - "settings-prfmMode-performance": "Performance", - "yes": "Yes", - "settings-mobileMode": "Mobile mode", - "setup_question4": "Select a client mod you want to install:", - "settings-theme-native": "Native", - "settings-themesFolder": "Open themes folder", - "setup_offline": "You appear to be offline. Please connect to the internet and restart Legcord.", - "setup_question1": "Welcome to the Legcord Setup", - "settings-copyDebugInfo": "Copy Debug Info", - "settings-mod-desc1": "Client mods are programs that allow you customize your Discord experience. They can change appearance of\n the client, modify behaviours or add new features!", - "settings-skipSplash-desc": "Skips Legcord splash screen when you start up the app.", - "setup_question3": "Should Legcord handle client mods installation?", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of Legcord.", - "settings-useLegacyCapturer-desc": "Use legacy screenshare module, instead of the new one. If you're experiencing issues with screen sharing, try enabling this.", - "settings-invitewebsocket-desc": "Uses arRPC to support Discord RPC (Rich Presence) with local programs on your machine. Work in progress.", - "settings-theme-transparent": "Transparent", - "settings-crashesFolder": "Open native crashes folder", - "settings-trayIcon-black-plug": "Black Plug", - "settings-prfmMode-desc": "Performance mode is an experimental function that may either increase responsiveness and performance of\n Legcord or… decrease it. Please try every option and see which fits you the best.", - "settings-channel": "Discord channel", - "settings-mod": "Client mod", - "settings-trayIcon-desc": "Set the icon which will appear in tray menu.", - "settings-advanced": "Advanced user zone", - "loading_screen_start": "Začiatok Legcord..", - "setup_question5": "Do you want to use a tray icon?", - "settings-invitewebsocket": "Rich Presence (Experimental)", - "settings-save": "Save Settings", - "settings-tray-desc": "When disabled, Legcord will close like any other window when closed, otherwise it'll sit back and relax in your system tray for later.", - "settings-useLegacyCapturer": "Use legacy capturer", - "settings-startMinimized-desc": "Legcord starts in background and remains out of your way.", - "settings-pluginsFolder": "Open plugins folder", - "settings-tray": "Tray", - "settings-trayIcon-normal": "Discord Icon", - "settings-mintoTray": "Minimize to tray", - "settings-trayIcon-colored-plug": "Colored Plug", - "settings-trayIcon-classic": "Classic Discord Icon", - "settings-disableAutogain": "Disable autogain", - "loading_screen_update": "A new version of Legcord is available. Please update to the latest version.", - "settings-experimental": "Experimental", - "settings-none": "None", - "settings-csp-desc": "Legcord CSP is our system that manages loading custom content loading into the Discord app. Stuff like\n client mods and themes depend on it. Disable if you want to get rid of mods and custom styles.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-theme-overlay": "Overlay", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-clearClientModCache": "Clear client mod cache", - "settings-category-behaviour": "Behaviour", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options" -} diff --git a/assets/lang/sv-SE.json b/assets/lang/sv-SE.json deleted file mode 100644 index f86c129..0000000 --- a/assets/lang/sv-SE.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_start": "Startar Legcord…", - "loading_screen_offline": "Du verkar vara offline. Starta om i ", - "loading_screen_update": "En ny version av Legcord är tillgänglig. Var snäll och uppdatera till den senaste versionen.", - "setup_question1": "Välkommen till Legcord Setup", - "setup_offline": "Du verkar vara offline. Var snäll och anslut till internet och omstarta Legcord.", - "setup_question2": "Välj din Discord kanal/instans:", - "setup_question3": "Ska Legcord ta hantera installationen av klientmodifikationer?", - "yes": "Ja", - "no": "Nej", - "next": "Nästa", - "setup_question4": "Välj en klientmodifikation som du vill installera:", - "settings-theme": "Legcord tema", - "settings-theme-default": "Standard", - "settings-theme-native": "Inbyggd", - "settings-mod": "Klientmodifikation", - "settings-prfmMode-performance": "Prestanda", - "settings-csp-desc": "Legcord CSP är vårt system som hanterar laddning av custom innehåll i the Discord appen. Saker som\n klientmodifikationer och teman beror på det. Inaktivera ifall du vill ta bort modikationer och custom stiler.", - "settings-tray": "Tray", - "settings-tray-desc": "Ifall inaktiverad, Så kommer Legcord stängas likadant som andra fönster, annar så kommer den hänga i din system tray tills vidare.", - "settings-mobileMode": "Mobilt läge", - "settings-mobileMode-desc": "Ifall du är på en enhet med touch skärm denna funktionen är till dig! Den aktiverar Discords hemliga mobil läge\n menat för mobiler och plattor. Den enda stora funktionen som saknas är voice chat support. Detta är passande för\n användare av PinePhone eller liknande.", - "settings-channel": "Discordkanal", - "settings-invitewebsocket": "Rich Presence (Experimentell)", - "settings-invitewebsocket-desc": "Använder sig av arRPC för Discord RPC (Rich Presence) funktionalitet, med lokala program på din enhet. Work in progress.", - "settings-mod-desc1": "Klientmodifikationer är program som tillåter dig att anpassa din Discord upplevelse. De kan ändra utseende på\n klienten, modifiera beteende eller lägga till nya funktioner!", - "settings-prfmMode": "Prestandaläge", - "settings-prfmMode-battery": "Batteri", - "settings-trayIcon": "Tray ikonen", - "settings-trayIcon-desc": "Sätter ikonen som visas i traymenyn.", - "settings-advanced": "️Avancerade användarzonen", - "settings-pluginsFolder": "Öppna plugins mappen", - "settings-themesFolder": "Öppna themes mappen", - "settings-storageFolder": "Öppna storage mappen", - "settings-none": "None", - "settings-save": "Spara Inställningarna", - "settings-updater": "Sök efter uppdateringar", - "settings-restart": "Starta om appen", - "settings-mod-vencord": "En klientmodifikation som är lätt och enkel att använda. Har en inbyggd plugin-butik.", - "settings-prfmMode-desc": "Prestandaläget är en experimentell funktion som kan antigen öka responsiviteten eller prestandan i\n Legcord eller... sänka det. Försök varje inställning för att se vad som passar bäst.", - "settings-trayIcon-dynamic": "Dynamisk", - "settings-trayIcon-normal": "Discord Ikonen", - "settings-trayIcon-classic": "Klassiska Discord Ikonen", - "settings-trayIcon-colored-plug": "Färgad kontakt", - "settings-trayIcon-white-plug": "Vit Kontakt", - "settings-trayIcon-white-plug-alt": "Vit Kontakt Alt", - "settings-trayIcon-black-plug": "Svart Kontakt", - "settings-trayIcon-black-plug-alt": "Svart Kontakt Alt", - "settings-experimental": "Experimentell", - "settings-skipSplash": "Skippa Splashskärmen (Experimentell)", - "settings-skipSplash-desc": "Skippar Legcord splashskärmen när du startar appen.", - "settings-copyDebugInfo": "Kopiera Debug Info", - "settings-startMinimized": "Kör minimerad", - "settings-startMinimized-desc": "Legcord kör i bakgunden och håller sig ur vägen för dig.", - "settings-crashesFolder": "Öppna native crashes mappen", - "settings-forceNativeCrash": "Tvinga native crash", - "settings-disableAutogain": "Inaktivera autogain", - "settings-disableAutogain-desc": "Inaktiverar autogain.", - "settings-theme-transparent": "Transparent", - "settings-useLegacyCapturer": "Använd legacy capturer", - "settings-useLegacyCapturer-desc": "Använd legacy skärmdelnings modulen, istället för den nya. Ifall du har problem med skärmdelning, försöka att aktivera detta.", - "settings-spellcheck": "Stavningskontroll", - "settings-spellcheck-desc": "Hjälper dig att rätta till misstavda ord genom att markera dem.", - "setup_question5": "Vill du använda en ikon i systembrickan?", - "settings-mintoTray": "Kör i bakgrunden", - "settings-mintoTray-desc": "Ifall inaktiverad, Så kommer Legcord stängas likadant som andra fönster, annar så kommer den hänga \n i din system tray tills vidare.", - "settings-MultiInstance": "Multi instans", - "settings-MultiInstance-desc": "När detta är aktiverat kommer du att kunna starta många instanser av Legcord.", - "settings-copyGPUInfo": "Kopiera GPU information", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Använd mjuk rullning", - "settings-smoothScroll-desc": "Växla mjuk rullning", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio": "Audio", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/th-TH.json b/assets/lang/th-TH.json deleted file mode 100644 index 7b50c14..0000000 --- a/assets/lang/th-TH.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_start": "กำลังเริ่มต้น Legcord…", - "loading_screen_offline": "ดูเหมือนว่าคุณออฟไลน์อยู่ โปรดเชื่อมต่ออินเทอร์เน็ตและลองใหม่อีกครั้ง", - "loading_screen_update": "Legcord เวอร์ชันใหม่พร้อมใช้งานแล้ว โปรดอัปเดตเป็นเวอร์ชันล่าสุด", - "setup_question1": "เลือกประเภทการติดตั้งที่คุณต้องการ:", - "setup_offline": "ดูเหมือนว่าคุณออฟไลน์อยู่ โปรดเชื่อมต่ออินเทอร์เน็ตและลองเริ่ม Legcord ใหม่อีกครั้ง", - "setup_question2": "เลือกช่อง/อินสแตนส์ Discord:", - "setup_question3": "ต้องการให้ Legcord จัดการการติดตั้งมอดของไคลเอนต์หรือไม่?", - "yes": "ใช่", - "no": "ไม่ใช่", - "next": "ถัดไป", - "setup_question4": "เลือกไคลเอนต์มอดที่ต้องการติดตั้ง:", - "settings-prfmMode-battery": "ประหยัดแบตเตอรี่", - "settings-theme": "ธีม Legcord", - "settings-theme-default": "ค่าเริ่มต้น", - "settings-theme-native": "ดั้งเดิม", - "settings-tray": "ย่อขนาดหน้าต่าง", - "settings-channel": "ช่อง Discord:", - "settings-invitewebsocket": "ใช้ Websocket สำหรับการเชิญ", - "settings-prfmMode": "โหมดประสิทธิภาพ:", - "settings-prfmMode-performance": "ประสิทธิภาพสูงสุด", - "settings-mod": "ไคลแอนต์มอด:", - "settings-none": "ไม่มี", - "settings-save": "บันทึกการตั้งค่า", - "settings-updater": "ตรวจหาการอัปเดต", - "settings-mobileMode": "โหมดมือถือ", - "settings-mobileMode-desc": "If you're on a device with touch-screen this feature is for you! It activates Discord's hidden mobile\n mode meant for phones and tablets. Only major feature missing is voice chat support. This is ideal for\n users on PinePhone and similar.", - "settings-trayIcon": "Tray icon", - "settings-csp-desc": "Legcord CSP คือระบบที่จัดการการโหลดเนื้อหากำหนดเองลงไปในแอป Discord สิ่งอย่างเช่น สิ่งอย่างเช่น\n ไคลแอนต์มอด ธีม ต้องใช้มัน สามารถปิดใช้งานได้หากต้องการปิดมอดและหน้าตากำหนดเอง", - "settings-tray-desc": "เมื่อปิด Legcord จะปิดเหมือนหน้าตาอื่น ๆ เมื่อปิด ไม่อย่างนั้นมันจะนั่งนิ่ง\n ในถาดระบบภายหลัง", - "settings-invitewebsocket-desc": "When enabled Legcord will support Discord.gg links which means that if you open an invite link in your\n browser, Legcord will automatically accept the invite. Can be unresponsive at times.", - "settings-mod-desc1": "Client mods are programs that allow you customize your Discord experience. They can change appearance of\n the client, modify behaviours or add new features!", - "settings-trayIcon-desc": "Set the icon which will appear in tray menu.", - "settings-advanced": "️Advanced user zone", - "settings-pluginsFolder": "Open plugins folder", - "settings-themesFolder": "Open themes folder", - "settings-storageFolder": "Open storage folder", - "settings-restart": "Restart App", - "settings-mod-vencord": "lightweight, and easy to use client mod. Features a built-in store for plugins.", - "settings-prfmMode-desc": "Performance mode is an experimental function that may either increase responsiveness and performance of\n Legcord or... decrease it. Please try every option and see which fits you the best.", - "settings-trayIcon-dynamic": "Dynamic", - "settings-trayIcon-normal": "Discord Icon", - "settings-trayIcon-classic": "Classic Discord Icon", - "settings-trayIcon-colored-plug": "Colored Plug", - "settings-trayIcon-white-plug": "White Plug", - "settings-trayIcon-white-plug-alt": "White Plug Alt", - "settings-trayIcon-black-plug": "Black Plug", - "settings-trayIcon-black-plug-alt": "Black Plug Alt", - "settings-experimental": "Experimental", - "settings-skipSplash": "Skip Splash Screen (Experimental)", - "settings-skipSplash-desc": "Skips Legcord splash screen when you start up the app.", - "settings-copyDebugInfo": "Copy Debug Info", - "settings-startMinimized": "Start minimized", - "settings-startMinimized-desc": "Legcord starts in background and remains out of your way.", - "settings-crashesFolder": "Open native crashes folder", - "settings-forceNativeCrash": "Force native crash", - "settings-disableAutogain": "Disable autogain", - "settings-disableAutogain-desc": "Disables autogain.", - "settings-theme-transparent": "Transparent (Experimental)", - "settings-useLegacyCapturer": "Use legacy capturer", - "settings-useLegacyCapturer-desc": "Use legacy screenshare module, instead of the new one. If you're experiencing issues with screen sharing, try enabling this.", - "settings-spellcheck": "Spellcheck", - "settings-spellcheck-desc": "Helps you correct misspelled words by highlighting them.", - "setup_question5": "Do you want to use a tray icon?", - "settings-mintoTray": "Minimize to tray", - "settings-mintoTray-desc": "When disabled, Legcord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.", - "settings-MultiInstance": "Multi Instance", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of Legcord.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/tr-TR.json b/assets/lang/tr-TR.json deleted file mode 100644 index 4351368..0000000 --- a/assets/lang/tr-TR.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "setup_question4": "Yüklemek istediğiniz bir istemci modunu seçin:", - "settings-channel": "Discord kanalı", - "settings-prfmMode-performance": "Performans", - "loading_screen_start": "Legcord Başlatılıyor…", - "loading_screen_offline": "Çevrimdışı görünüyorsunuz. Lütfen internete bağlanın ve tekrar deneyin. ", - "loading_screen_update": "Legcord'un yeni bir sürümü mevcut. Lütfen son sürüme güncelleyin.", - "settings-storageFolder": "Depolama klasörünü aç", - "setup_question1": "Legcord Kurulumuna Hoş Geldiniz", - "setup_offline": "Çevrimdışı görünüyorsunuz. Lütfen internete bağlanın ve Legcord'u yeniden başlatın.", - "setup_question2": "Discord türünüzü seçiniz:", - "setup_question3": "Legcord istemci modlarının kurulumunu yapmalı mı?", - "yes": "Evet", - "no": "Hayır", - "next": "İleri", - "settings-theme": "Pencere stili", - "settings-theme-default": "Varsayılan", - "settings-theme-native": "Sistem", - "settings-csp-desc": "Legcord CSP, Discord uygulamasına özel içerik yükleme işlemini yöneten sistemimizdir. İstemci modları ve temalar buna bağlıdır. Modlardan ve özel stillerden kurtulmak istiyorsanız devre dışı bırakın.", - "settings-tray": "Görev çubuğuna küçült", - "settings-tray-desc": "Legcord'un bir tepsi simgesine sahip olup olmayacağını ayarla", - "settings-mobileMode": "Mobil mod", - "settings-mobileMode-desc": "Eğer dokunmatik ekranı olan bir cihazdaysanız bu özellik tam size göre! Discord'un telefonlar ve tabler için yapılmış gizli mobil modunu aktif eder. Olmayan tek büyük özellik sesli sohbet desteği. PinePhone'da ve benzeri cihazlarda olan kullanıcıları için ideal.", - "settings-invitewebsocket": "Zengin Varlık", - "settings-invitewebsocket-desc": "Makinenizdeki yerel programlarla Discord RPC'yi (Zengin Varlık) desteklemek için arRPC kullanır.", - "settings-mod": "Uygulama modu", - "settings-mod-desc1": "Uygulama modları Discord deneyiminizi düzenlemenizi sağlayan programlardır. Uygulamanın\ngörünüşünü ve davranışını değiştirir veya yeni özellikler ekler!", - "settings-prfmMode": "Performans modu", - "settings-prfmMode-battery": "Pil", - "settings-trayIcon": "Tepsi simgesi", - "settings-trayIcon-desc": "Görev çubuğunda kullanılacak simgeyi belirleyin.", - "settings-advanced": "Gelişmiş kullanıcı bölgesi", - "settings-pluginsFolder": "Eklenti klasörünü aç", - "settings-themesFolder": "Tema klasörünü aç", - "settings-none": "Hiçbiri", - "settings-save": "Ayarları Kaydet", - "settings-updater": "Güncellemeleri kontrol et", - "settings-restart": "Uygulamayı Yeniden Başlat", - "settings-mod-vencord": "Hafif yükte, kullanımı kolay bir uygulama modu. Pluginler için uygulama içine yerleşmiş bir mağazaya sahip.", - "settings-prfmMode-desc": "Performans modu, yanıt süresini ve Legcord'un performansını geliştiren ya da azaltan deneysel bir özelliktir.\nLütfen bütün seçenekleri deneyin ve hangisi size daha uygun görün.", - "settings-trayIcon-dynamic": "Dinamik", - "settings-trayIcon-normal": "Discord Simgesi", - "settings-trayIcon-classic": "Klasik Discord Simgesi", - "settings-trayIcon-colored-plug": "Renkli Fiş", - "settings-trayIcon-white-plug": "Beyaz Fiş", - "settings-trayIcon-white-plug-alt": "Beyaz Fiş Alt", - "settings-trayIcon-black-plug": "Siyah Fiş", - "settings-trayIcon-black-plug-alt": "Siyah Fiş Alt", - "settings-experimental": "Deneysel", - "settings-skipSplash": "Uygulama Öncesi Ekranı Atla (Deneysel)", - "settings-skipSplash-desc": "Uygulamayı başlatınca, Legcord uygulama öncesi ekranını atlar.", - "settings-copyDebugInfo": "Hata Ayıklama Bilgisini Kopyala", - "settings-startMinimized": "Simge durumuna küçültülmüş olarak başlat", - "settings-startMinimized-desc": "Legcord arka planda başlar ve ayak altında dolaşmaz.", - "settings-crashesFolder": "Yerel crash dosyalarını aç", - "settings-forceNativeCrash": "Yerel crash zorla", - "settings-disableAutogain": "Autogain'i devre dışı bırak", - "settings-disableAutogain-desc": "Autogain'i kapatır.", - "settings-theme-transparent": "Şeffaf", - "settings-useLegacyCapturer": "Eski yakalayıcıyı kullanın", - "settings-useLegacyCapturer-desc": "Yeni modül yerine eski ekran paylaşımı modülünü kullanın. Ekran paylaşımı ile ilgili sorunlar yaşıyorsanız, bunu etkinleştirmeyi deneyin.", - "settings-spellcheck": "Yazım Denetimi", - "settings-spellcheck-desc": "Yanlış yazılmış kelimeleri işaretleyerek onları düzeltmenize yardım eder.", - "setup_question5": "Tepsi simgesi kullanmak istiyor musunuz?", - "settings-mintoTray": "Arkaplanda çalış", - "settings-mintoTray-desc": "Devre dışı bırakıldığında, Legcord kapatıldığında diğer pencereler gibi kapanacaktır. Aksi takdirde, sistem tepsinizde sonrası için beklerken arkasına yaslanıp keyfine bakacaktır.", - "settings-MultiInstance": "Çoklu oturum", - "settings-MultiInstance-desc": "Etkinleştirildiğinde Legcord'un birçok oturum ile başlatabileceksiniz.", - "settings-copyGPUInfo": "GPU Bilgilerini Kopyala", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Yumuşak kaydırmayı kullan", - "settings-smoothScroll-desc": "Yumuşak kaydırmayı aç/kapat", - "settings-autoScroll": "Otomatik kaydırmaya izin ver", - "settings-autoScroll-desc": "Orta tuş ile otomatik kaydırmaya izin ver (Not: Masaüstü ortamınız bunu başka bir eylemle geçersiz kılabilir)", - "settings-theme-desc": "Pencere stili Legcord'un kullandığı başlık çubuğunu kontrol eder.", - "settings-channel-desc": "Legcord'un çalıştırdığı mevcut Discord örneğini değiştirmek için bu ayarı kullanın.", - "settings-hardwareAcceleration": "Donanım ivmelendirmesi", - "settings-hardwareAcceleration-desc": "Donanım hızlandırma, Legcord'u daha hızlı çalıştırmak için GPU'nuzu kullanır. Eğer görüntü sorunları yaşıyorsanız, bunu kapatmayı deneyin.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/uk-UA.json b/assets/lang/uk-UA.json deleted file mode 100644 index 9cf6db2..0000000 --- a/assets/lang/uk-UA.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "loading_screen_start": "Запуск Legcord…", - "loading_screen_offline": "Здається, ви не в мережі. Перезапуск через ", - "settings-channel": "\"Екземпляр\" Discord", - "settings-invitewebsocket": "Rich Presence (Експерементально)", - "loading_screen_update": "Доступна нова версія Legcord. Будь ласка, оновіться до останньої версії.", - "setup_question1": "Вітаємо до Legcord", - "setup_offline": "Здається, ви не в мережі. Перевірте підключення до Інтернету та перезавантажте Legcord.", - "setup_question2": "Оберіть \"екземпляр\" Discord:", - "setup_question3": "Чи має Legcord займатися встановленням клієнтських модифікацій?", - "yes": "Так", - "no": "Ні", - "next": "Наступне", - "setup_question4": "Оберіть клієнтський мод який ви хочете встановити:", - "settings-theme": "Стіль вікна", - "settings-theme-default": "Стандартна", - "settings-theme-native": "Нативна", - "settings-theme-transparent": "Прозора", - "settings-csp-desc": "Legcord CSP це наша система, яка керує завантаженням контенту користувача в додаток Discord. Такі речі як клієнтські модіфікації та теми залежать від неї. Відключіть, якщо хочете позбутися модів і стилів користувача.", - "settings-tray": "Трей", - "settings-tray-desc": "Якщо вимкнено, Legcord закриватиметься, як і будь-яке інше вікно, коли буде закрито, інакше він візме і розслабиться у системному треї.", - "settings-startMinimized": "Запускати Legcord згорнутим у трей", - "settings-startMinimized-desc": "Legcord запускається у фоновому режимі та не заважає вам.", - "settings-useLegacyCapturer": "Використовувати застарілий спосіб захоплення екрану", - "settings-mobileMode-desc": "Якщо ви використовуєте пристрій з сенсорним єкраном ця функція для вас! Ця функція активує скриту мобільну версію Discord. Нажаль, у цьому режимі не працює голосовий чат. Це ідеально підходить для користувачів з PinePhone і аналогічних.", - "settings-invitewebsocket-desc": "Використовує arRPC для підтримки Discord RPC (Rich Presence) з програмами на вашому комп'ютері. В роботі.", - "settings-useLegacyCapturer-desc": "Використовуйте застарілий спосіб захоплення екрану замість нового. Якщо у вас виникли проблеми із захопленням екрану, спробуйте увімкнути цю функцію.", - "settings-mobileMode": "Мобільна версія Discord", - "settings-mod": "Клієнтський мод", - "settings-mod-desc1": "Клієнтські модифікації — це програми, які дозволяють налаштовувати ваш досвід з Discord. Вони можуть змінювати зовнішній вигляд та поведінку або додати нові функції до Discord!", - "settings-mod-vencord": "легкий і простий у використанні клієнтський мод. Має вбудований магазин для плагінів.", - "settings-prfmMode": "Режим продуктивності", - "settings-prfmMode-desc": "Режим продуктивності – це експериментальна функція, яка може підвищити швидкість реакції та продуктивність\n Legcord або… змаеншити. Будь ласка, спробуйте кожен варіант і виберіть, який вам підходить найкраще.", - "settings-prfmMode-performance": "Продуктивність", - "settings-prfmMode-battery": "Батарея", - "settings-disableAutogain": "Вимкнути автоматичне посилення", - "settings-disableAutogain-desc": "Вимикає автоматичне посилення.", - "settings-trayIcon": "Значок у треї", - "settings-trayIcon-desc": "Встановлює значок, який з’являтиметься в треї.", - "settings-trayIcon-dynamic": "Динамічний", - "settings-trayIcon-normal": "Значок Discord", - "settings-trayIcon-classic": "Класичний значок Discord", - "settings-trayIcon-colored-plug": "Кольоровий штекер", - "settings-trayIcon-white-plug": "Білий штекер", - "settings-trayIcon-white-plug-alt": "Альт. білий штекер", - "settings-trayIcon-black-plug": "Чорний штекер", - "settings-trayIcon-black-plug-alt": "Альт. чорний штекер", - "settings-advanced": "Зона для досвідчених", - "settings-pluginsFolder": "Відкрити теку з плагінами", - "settings-crashesFolder": "Відкрити рідну папку збоїв", - "settings-themesFolder": "Відкрити теку з темами", - "settings-storageFolder": "Відкрити теку зберігання", - "settings-none": "Жоден", - "settings-save": "Зберегти налаштування", - "settings-experimental": "Експереминтальні", - "settings-restart": "Перезапустити", - "settings-updater": "Перевірити наявність оновлень", - "settings-skipSplash": "Пропустити заставку (Експериментально)", - "settings-skipSplash-desc": "Пропускає заставку Legcord під час запуску програми.", - "settings-copyDebugInfo": "Копіювати інформацію про налагодження", - "settings-forceNativeCrash": "Примусовий нативний збій", - "settings-spellcheck": "Перевірка орфографії", - "settings-spellcheck-desc": "Допомагає виправити неправильно написані слова, виділяючи їх.", - "setup_question5": "Ви бажаєте використовувати піктограму в треї?", - "settings-mintoTray": "Згорнути в трей", - "settings-mintoTray-desc": "Коли вимкнено, Legcord закриється, як і будь-яке інше вікно, інакше він буде відпочивати в системному треї до кращих часів.", - "settings-MultiInstance": "Кілька екземплярів", - "settings-MultiInstance-desc": "Якщо увімкнено, ви зможете запустити багато екземплярів Legcord.", - "settings-copyGPUInfo": "Скопіювати інформацію про GPU", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll-desc": "Перемкнути м'яку прокрутку", - "settings-smoothScroll": "Використовувати м'яку прокрутку", - "settings-autoScroll": "Дозволити авто-прокрутку", - "settings-autoScroll-desc": "Дозволити авто-прокрутку середньої кнопкою миші (Помітка: ваша оболочка рабочого стола все ще може замініти це іншою дією)", - "settings-channel-desc": "Використовуйте це налаштування, щоб змінити поточний канал Discord наразі запущенний Discord.", - "settings-theme-desc": "Стиль вікна керує тим, яку заголовочну строку використовує Legcord.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} diff --git a/assets/lang/zh-Hans.json b/assets/lang/zh-Hans.json deleted file mode 100644 index 7710a9c..0000000 --- a/assets/lang/zh-Hans.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "settings-theme-default": "默认", - "settings-tray": "托盘", - "loading_screen_update": "发现Legcord新版本。请更新至最新版。", - "loading_screen_start": "正在启动Legcord…", - "setup_question1": "欢迎进入Legcord安装向导", - "loading_screen_offline": "您看起来离线了,即将自动重启: ", - "setup_offline": "您看起来离线了。请连接至网络并重启Legcord。", - "setup_question2": "选择您的Discord频道或实例:", - "settings-updater": "检查更新", - "setup_question3": "需要Legcord来处理客户端模组的安装吗?", - "yes": "是", - "no": "否", - "next": "下一步", - "setup_question4": "选择您想安装的客户端模组:", - "settings-theme": "Legcord主题", - "settings-theme-native": "原生", - "settings-csp-desc": "Legcord CSP是我们用以管理读取加载至 Discord app的定制内容的系统. 诸如\n 客户端模组与主题依赖该系统的支持. 若您想关闭模组与定制内容,请禁用它.", - "settings-tray-desc": "当被禁用时,Legcord将和其他窗口一样在关闭时退出,否则它将在您的系统托盘里稍稍休憩。", - "settings-mobileMode": "移动端模式", - "settings-mobileMode-desc": "如果您正使用触摸屏设备,该功能正适合您!它能启用Discord为手机与平板设计的\n 移动端模式。唯一缺失的主要功能为语音聊天。\n 此功能最适合使用PinePhone或类似设备的用户。", - "settings-channel": "Discord频道", - "settings-invitewebsocket": "Rich Presence(实验性功能)", - "settings-invitewebsocket-desc": "使用 arRPC 以支持Discord RPC(Rich Presence)连接本地程序。正在实现中。", - "settings-mod": "客户端模组", - "settings-mod-desc1": "客户端模组是用来帮助您定制Discord使用体验的程序。\n 它们可以更改客户端的外观,修改一些行为或添加新的功能!", - "settings-prfmMode": "性能模式", - "settings-prfmMode-performance": "性能模式", - "settings-prfmMode-battery": "省电模式", - "settings-trayIcon": "托盘图标", - "settings-trayIcon-desc": "设置在托盘菜单显示的图标.", - "settings-advanced": "高级用户区域", - "settings-pluginsFolder": "打开插件文件夹", - "settings-themesFolder": "打开主题文件夹", - "settings-storageFolder": "打开存储文件夹", - "settings-none": "无", - "settings-save": "保存设置", - "settings-restart": "重启App", - "settings-mod-vencord": "轻量且易用的客户端模组,具有内置的插件商店。", - "settings-prfmMode-desc": "性能模式是一种可能增强Legcord响应速度与表现的实验性功能\n 但也有可能…出现相反的效果。请试试各种设定并找到最适合您与您设备的设置。", - "settings-trayIcon-dynamic": "动态", - "settings-trayIcon-normal": "Discord图标", - "settings-trayIcon-classic": "经典Discord图标", - "settings-trayIcon-colored-plug": "彩色插头", - "settings-trayIcon-white-plug": "白色插头", - "settings-trayIcon-white-plug-alt": "白色插头Alt", - "settings-trayIcon-black-plug": "黑色插头", - "settings-trayIcon-black-plug-alt": "黑色插头Alt", - "settings-experimental": "实验性的", - "settings-skipSplash": "跳过启动画面(实验性功能)", - "settings-skipSplash-desc": "启动时跳过Legcord的启动画面。", - "settings-copyDebugInfo": "复制调试信息", - "settings-startMinimized": "启动时最小化", - "settings-startMinimized-desc": "Legcord在后台启动,不对您造成影响。", - "settings-crashesFolder": "打开原生崩溃文件夹", - "settings-forceNativeCrash": "强制原生崩溃", - "settings-disableAutogain": "禁用自动增益", - "settings-disableAutogain-desc": "禁用自动增益。", - "settings-theme-transparent": "透明", - "settings-useLegacyCapturer": "使用旧版屏幕捕获", - "settings-useLegacyCapturer-desc": "使用旧版屏幕分享模块替换新版。如果您在分享屏幕时遇到问题,可以尝试启用此选项。", - "settings-spellcheck": "拼写检查", - "settings-spellcheck-desc": "高亮显示拼写错误的词语以便于改正。", - "setup_question5": "您希望使用托盘图标吗?", - "settings-mintoTray": "最小化至托盘", - "settings-mintoTray-desc": "禁用后,Legcord 将和其他窗口一样在关闭时退出,\n 否则它将在您的系统托盘里稍稍休憩。", - "settings-MultiInstance": "允许多实例", - "settings-MultiInstance-desc": "启用后,您将可以启动多个Legcord实例。", - "settings-copyGPUInfo": "复制显卡信息", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-autoScroll": "Allow auto-scroll", - "settings-autoScroll-desc": "Allow auto-scrolling with middle-click (Note: Your desktop environment can still override this with another action)", - "settings-theme-desc": "Window style manages what titlebar Legcord uses.", - "settings-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", - "settings-hardwareAcceleration": "Hardware acceleration", - "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio": "Audio", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-clearClientModCache": "Clear client mod cache", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options" -} diff --git a/assets/lang/zh-Hant.json b/assets/lang/zh-Hant.json deleted file mode 100644 index 2dce860..0000000 --- a/assets/lang/zh-Hant.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "setup_question1": "歡迎來到 Legcord 設定精靈", - "settings-startMinimized": "啟動時隱藏視窗", - "settings-theme-native": "系統主題", - "settings-MultiInstance": "多重視窗", - "settings-mobileMode": "手機模式", - "settings-spellcheck": "拼字檢查", - "loading_screen_offline": "目前沒有網路連接。將重新啟動的剩餘秒數: ", - "settings-disableAutogain-desc": "停用自動增加音量", - "settings-trayIcon-white-plug-alt": "白色 Legcord 圖示(替代)", - "settings-trayIcon-dynamic": "動態", - "settings-spellcheck-desc": "幫助修正拼字錯誤的單字。", - "settings-theme-desc": "視窗風格管理 Legcord 的視窗外觀", - "settings-theme-default": "預設", - "settings-skipSplash": "跳過啟動視窗", - "settings-forceNativeCrash": "強制崩潰", - "settings-trayIcon-white-plug": "白色 Legcord 圖示", - "settings-mod-vencord": "輕量好用的模組管理器。擁有豐富的模組商店。", - "settings-trayIcon": "狀態欄圖示", - "settings-prfmMode-battery": "省電", - "settings-prfmMode": "性能模式", - "settings-trayIcon-black-plug-alt": "黑色 Legcord 圖示(替代)", - "setup_question2": "請選擇 Discord 發行版種類", - "next": "繼續", - "no": "否", - "settings-autoScroll": "允許自動捲動", - "settings-smoothScroll": "使用滑順捲動", - "settings-updater": "檢查更新", - "settings-autoScroll-desc": "允許中鍵點擊自動捲動(可能不會產生效果)", - "settings-mintoTray-desc": "此將在不開啟視窗下顯示於狀態欄。停用後,Legcord 將如同其他應用程式般關閉視窗", - "settings-theme": "視窗風格", - "settings-storageFolder": "開啟 Legcord 資料夾", - "settings-mobileMode-desc": "將介面改為為手機使用者所設計的介面。", - "settings-restart": "重新啟動應用程式", - "settings-prfmMode-performance": "性能", - "yes": "是", - "setup_question4": "選擇模組管理器:", - "settings-themesFolder": "開啟主題資料夾", - "setup_offline": "目前沒有網路連接。請重新連接網路並重新啟動 Legcord。", - "settings-copyDebugInfo": "複製除錯資訊", - "settings-mod-desc1": "模組管理器能給 Discord 帶來更多的客製化。它們能改變 Discord 外觀、行為、以及新增更多功能!", - "settings-skipSplash-desc": "開啟 Legcord 時跳過啟動畫面。", - "settings-invitewebsocket-desc": "利用 arRPC 以支援 Discord RPC", - "setup_question3": "Legcord 應該管理模組安裝過程嗎?", - "settings-MultiInstance-desc": "允許 Legcord 一次啟動多個視窗", - "settings-useLegacyCapturer-desc": "若在螢幕分享時發生問題可以啟用此設定", - "settings-theme-transparent": "透明", - "settings-crashesFolder": "開啟崩潰日誌", - "settings-trayIcon-black-plug": "黑色 Legcord 圖示", - "settings-channel": "Discord 發行版", - "settings-prfmMode-desc": "性能模式為實驗性功能。它雖然有可能能如字面上的提升性能,但也可能反過來降低性能。您可以自行測試看看哪種模式對您而言是最好的。", - "settings-mod": "模組管理器", - "settings-trayIcon-desc": "選擇將於狀態欄中顯示的圖示。", - "settings-advanced": "進階設定", - "loading_screen_start": "正在啟動…", - "setup_question5": "您想要使用狀態欄圖示嗎?", - "settings-invitewebsocket": "個人「正在玩遊戲」狀態(Rich Presence)", - "settings-save": "儲存設定", - "settings-prfmMode-vaapi": "VAAPI", - "settings-tray-desc": "在狀態欄中顯示 Legcord 圖示", - "settings-useLegacyCapturer": "使用舊版螢幕分享", - "settings-startMinimized-desc": "Legcord 在背景中啟動並且不佔到您的工作空間。", - "settings-pluginsFolder": "開啟模組資料夾", - "settings-tray": "狀態欄", - "settings-trayIcon-normal": "Discord 圖示", - "settings-mintoTray": "在背景中執行", - "settings-copyGPUInfo": "複製顯卡資訊", - "settings-trayIcon-colored-plug": "彩色 Legcord 圖示", - "settings-trayIcon-classic": "經典 Discord 圖示", - "settings-disableAutogain": "停用自動增加音量", - "loading_screen_update": "有新的 Legcord 版本。請更新到最新版本。", - "settings-none": "無", - "settings-experimental": "實驗性", - "settings-smoothScroll-desc": "開啟滑順捲動", - "settings-channel-desc": "在此更改 Discord 發行版本。", - "settings-csp-desc": "Legcord CSP 是載入自訂內容到 Discord 應用程式的系統,如模組與主題。關閉以刪除所有自訂主題與模組。", - "settings-hardwareAcceleration": "硬體加速", - "settings-hardwareAcceleration-desc": "開啟硬體加速功能,透過GPU 使 Legcord 更順暢。若您遇到畫面播放速率下降的問題,請關閉此功能。", - "settings-disableHttpCache": "Disable HTTP cache", - "settings-disableHttpCache-desc": "Disables HTTP cache of Chromium. Turn this on if client mods don't load for you.", - "settings-mod-equicord": "forked and born from vencord contributors, featuring a pretty plugin-rich client.", - "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", - "settings-audio": "Audio", - "settings-theme-overlay": "Overlay", - "settings-category-behaviour": "Behaviour", - "settings-category-mods": "Mods", - "settings-category-lookAndFeel": "Look and feel", - "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options", - "settings-clearClientModCache": "Clear client mod cache" -} From fd686e73998ab37ee0d924e16dd79a82967d3fee Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 9 Aug 2025 16:40:00 +0200 Subject: [PATCH 660/844] chore: translations update [skip ci] Co-authored-by: smartfridge --- assets/lang/pl.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 assets/lang/pl.json diff --git a/assets/lang/pl.json b/assets/lang/pl.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/pl.json @@ -0,0 +1 @@ +{} From a7f548af15ada8ed302ad4dd2d3dd553edb6cac9 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sat, 9 Aug 2025 16:55:18 +0200 Subject: [PATCH 661/844] feat: patch vencord quick css with legcord's --- assets/app/js/patchVencordQuickCSS.js | 8 ++++++++ src/discord/preload/patches.mts | 1 + 2 files changed, 9 insertions(+) create mode 100644 assets/app/js/patchVencordQuickCSS.js diff --git a/assets/app/js/patchVencordQuickCSS.js b/assets/app/js/patchVencordQuickCSS.js new file mode 100644 index 0000000..50fb58b --- /dev/null +++ b/assets/app/js/patchVencordQuickCSS.js @@ -0,0 +1,8 @@ +// dirty hack to replace Vencord's quick css editor with Legcord's +// fixes the white window bug + +if (window.VencordNative) { + VencordNative.quickCss.openEditor = function openEditor() { + window.legcord.themes.openQuickCss() + } +} \ No newline at end of file diff --git a/src/discord/preload/patches.mts b/src/discord/preload/patches.mts index a604611..449fe6d 100644 --- a/src/discord/preload/patches.mts +++ b/src/discord/preload/patches.mts @@ -61,6 +61,7 @@ async function load() { } addStyle("legcord://assets/css/discord.css"); }); + injectJS("legcord://assets/js/patchVencordQuickCSS.js"); // Settings info version injection setInterval(() => { const host = document.querySelector('[class*="sidebar"] [class*="info"]'); From 33256006ed7d1a7d2511b868306accb6db063a20 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sat, 9 Aug 2025 17:06:00 +0200 Subject: [PATCH 662/844] fix: lint CI --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 06225b2..6c9f7ec 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,6 +11,6 @@ jobs: - name: Setup Biome uses: biomejs/setup-biome@v2 with: - version: latest + version: 1.9.4 - name: Run Biome run: biome ci . --reporter=github From 0231884f3111ea8b48b179a0a983e85a29e1a5d3 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 10 Aug 2025 07:47:57 +0200 Subject: [PATCH 663/844] chore: translations update [skip ci] Co-authored-by: Hosted Weblate Co-authored-by: Languages add-on Co-authored-by: smartfridge Translate-URL: https://hosted.weblate.org/projects/armcord/client/pl/ Translation: Legcord/Client --- assets/lang/ar.json | 1 + assets/lang/cs.json | 1 + assets/lang/da.json | 1 + assets/lang/de.json | 1 + assets/lang/es_419.json | 1 + assets/lang/fa.json | 1 + assets/lang/fi.json | 1 + assets/lang/fil.json | 1 + assets/lang/fr.json | 1 + assets/lang/hu.json | 1 + assets/lang/id.json | 1 + assets/lang/it.json | 1 + assets/lang/ja.json | 1 + assets/lang/ko.json | 1 + assets/lang/lt.json | 1 + assets/lang/nb_NO.json | 1 + assets/lang/nl.json | 1 + assets/lang/pl.json | 6 +++++- assets/lang/pt_BR.json | 1 + assets/lang/pt_PT.json | 1 + assets/lang/ro.json | 1 + assets/lang/ru.json | 1 + assets/lang/sk.json | 1 + assets/lang/sv.json | 1 + assets/lang/ta.json | 1 + assets/lang/th.json | 1 + assets/lang/tr.json | 1 + assets/lang/uk.json | 1 + assets/lang/zh_Hans.json | 1 + assets/lang/zh_Hant.json | 1 + 30 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 assets/lang/ar.json create mode 100644 assets/lang/cs.json create mode 100644 assets/lang/da.json create mode 100644 assets/lang/de.json create mode 100644 assets/lang/es_419.json create mode 100644 assets/lang/fa.json create mode 100644 assets/lang/fi.json create mode 100644 assets/lang/fil.json create mode 100644 assets/lang/fr.json create mode 100644 assets/lang/hu.json create mode 100644 assets/lang/id.json create mode 100644 assets/lang/it.json create mode 100644 assets/lang/ja.json create mode 100644 assets/lang/ko.json create mode 100644 assets/lang/lt.json create mode 100644 assets/lang/nb_NO.json create mode 100644 assets/lang/nl.json create mode 100644 assets/lang/pt_BR.json create mode 100644 assets/lang/pt_PT.json create mode 100644 assets/lang/ro.json create mode 100644 assets/lang/ru.json create mode 100644 assets/lang/sk.json create mode 100644 assets/lang/sv.json create mode 100644 assets/lang/ta.json create mode 100644 assets/lang/th.json create mode 100644 assets/lang/tr.json create mode 100644 assets/lang/uk.json create mode 100644 assets/lang/zh_Hans.json create mode 100644 assets/lang/zh_Hant.json diff --git a/assets/lang/ar.json b/assets/lang/ar.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/ar.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/cs.json b/assets/lang/cs.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/cs.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/da.json b/assets/lang/da.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/da.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/de.json b/assets/lang/de.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/de.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/es_419.json b/assets/lang/es_419.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/es_419.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/fa.json b/assets/lang/fa.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/fa.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/fi.json b/assets/lang/fi.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/fi.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/fil.json b/assets/lang/fil.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/fil.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/fr.json b/assets/lang/fr.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/fr.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/hu.json b/assets/lang/hu.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/hu.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/id.json b/assets/lang/id.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/id.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/it.json b/assets/lang/it.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/it.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/ja.json b/assets/lang/ja.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/ja.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/ko.json b/assets/lang/ko.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/ko.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/lt.json b/assets/lang/lt.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/lt.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/nb_NO.json b/assets/lang/nb_NO.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/nb_NO.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/nl.json b/assets/lang/nl.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/nl.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/pl.json b/assets/lang/pl.json index 0967ef4..a59af8d 100644 --- a/assets/lang/pl.json +++ b/assets/lang/pl.json @@ -1 +1,5 @@ -{} +{ + "loading_screen_start": "Uruchamianie Legcord…", + "loading_screen_offline": "Wygląda na to, że jesteś offline. Ponowne uruchomienie za ", + "loading_screen_update": "Nowa wersja Legcord jest dostępna. Proszę zaktualizować do najnowszej wersji." +} diff --git a/assets/lang/pt_BR.json b/assets/lang/pt_BR.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/pt_BR.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/pt_PT.json b/assets/lang/pt_PT.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/pt_PT.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/ro.json b/assets/lang/ro.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/ro.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/ru.json b/assets/lang/ru.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/ru.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/sk.json b/assets/lang/sk.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/sk.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/sv.json b/assets/lang/sv.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/sv.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/ta.json b/assets/lang/ta.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/ta.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/th.json b/assets/lang/th.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/th.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/tr.json b/assets/lang/tr.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/tr.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/uk.json b/assets/lang/uk.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/uk.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/zh_Hans.json b/assets/lang/zh_Hans.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/zh_Hans.json @@ -0,0 +1 @@ +{} diff --git a/assets/lang/zh_Hant.json b/assets/lang/zh_Hant.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/assets/lang/zh_Hant.json @@ -0,0 +1 @@ +{} From 79edb1422137983961c18e3adc267363a254e7df Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 16 Aug 2025 02:01:57 +0200 Subject: [PATCH 664/844] chore: translations update [skip ci] Co-authored-by: Mirko P Translate-URL: https://hosted.weblate.org/projects/armcord/client/de/ Translation: Legcord/Client --- assets/lang/de.json | 135 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 134 insertions(+), 1 deletion(-) diff --git a/assets/lang/de.json b/assets/lang/de.json index 0967ef4..4ae4dc2 100644 --- a/assets/lang/de.json +++ b/assets/lang/de.json @@ -1 +1,134 @@ -{} +{ + "loading_screen_start": "Legcord starten…", + "loading_screen_offline": "Sie scheinen offline zu sein. Starten Sie neu in ", + "loading_screen_update": "Eine neue Version von Legcord ist verfügbar. Bitte aktualisieren Sie auf die neueste Version.", + "setup_question1": "Willkommen bei der Legcord-Einrichtung", + "setup_offline": "Sie scheinen offline zu sein. Bitte stellen Sie eine Verbindung zum Internet her und starten Sie Legcord neu.", + "setup_question2": "Wählen Sie Ihren Discord-Kanal/Ihre Discord-Instanz aus:", + "setup_question3": "Sollte Legcord die Installation von Client-Mods übernehmen?", + "yes": "Ja", + "no": "Nein", + "next": "Weiter", + "setup_question4": "Wählen Sie einen Client-Mod aus, den Sie installieren möchten:", + "setup_question5": "Möchten Sie ein Taskleistensymbol verwenden?", + "settings-bounceOnPing": "Bounce im Dock bei Ping", + "settings-bounceOnPing-desc": "Wenn Sie einen Ping erhalten, lassen Sie die App im Dock aufspringen.", + "settings-theme": "Fenster-Design", + "settings-theme-desc": "Der Fensterstil legt fest, welche Titelleiste Legcord verwendet.", + "settings-theme-default": "Standard (Benutzerdefiniert)", + "settings-theme-native": "Native", + "settings-theme-overlay": "Überlagerung", + "settings-autoHideMenuBar": "Menüleiste automatisch ausblenden", + "settings-autoHideMenuBar-desc": "Menüleiste automatisch ausblenden, wenn sie nicht verwendet wird.", + "settings-sleepInBackground": "Im Hintergrund schlafen", + "settings-sleepInBackground-desc": "Aktiviert die Hintergrunddrosselung von Chromium. Dies kann dazu beitragen, die Akkulaufzeit zu verlängern, führt jedoch auch dazu, dass Benachrichtigungen nicht mehr funktionieren.", + "settings-transparency": "Transparenz", + "settings-transparency-desc": "Legen Sie den von Legcord verwendeten Transparenzmodus fest.", + "settings-transparency-universal": "Universell", + "settings-transparency-modern": "Modern", + "settings-theme-transparent": "Transparent", + "settings-popoutPiP": "Popup-Fenster immer im Vordergrund anzeigen", + "settings-popoutPiP-desc": "Wenn diese Option aktiviert ist, wird das Anruf-Popup im Modus „Immer im Vordergrund“ angezeigt.", + "settings-venmic-workaround": "Umgehungslösung", + "settings-venmic-workaround-desc": "Aktivieren oder deaktivieren Sie die Problemumgehung für ein Problem, das dazu führt, dass das Mikrofon anstelle des korrekten Audiosignals geteilt wird.", + "settings-venmic-deviceSelect": "Geräteauswahl", + "settings-venmic-deviceSelect-desc": "Wählen Sie ein Audiogerät aus.", + "settings-venmic-granularSelect": "Granulare Auswahl", + "settings-venmic-granularSelect-desc": "Ermöglicht die Auswahl einer Audioeingangsquelle.", + "settings-venmic-ignoreVirtual": "Virtuelle Geräte ignorieren", + "settings-venmic-ignoreVirtual-desc": "Virtuelle Audiogeräte ignorieren.", + "settings-venmic-ignoreDevices": "Geräte ignorieren", + "settings-venmic-ignoreDevices-desc": "Bestimmte Audiogeräte ignorieren.", + "settings-venmic-ignoreInputMedia": "Eingabemedien ignorieren", + "settings-venmic-ignoreInputMedia-desc": "Audioeingänge von Medienquellen ignorieren.", + "settings-venmic-onlySpeakers": "Nur Lautsprecher", + "settings-venmic-onlySpeakers-desc": "Verwenden Sie Lautsprecher nur für die Audioauswahl.", + "settings-venmic-onlyDefaultSpeakers": "Nur Standardlautsprecher", + "settings-venmic-onlyDefaultSpeakers-desc": "Verwenden Sie für die Audioauswahl nur die Standardlautsprecher.", + "settings-audio": "Audio", + "settings-audio-desc": "Wählen Sie aus, welche Methode Legcord verwendet, um während der Bildschirmfreigabe Audio von Ihrem System aufzunehmen.", + "settings-openCustomIconDialog": "Desktop-Symbol festlegen", + "settings-csp-desc": "Legcord CSP ist unser System, der das Laden von benutzerdefinierten Inhalten in die Discord-App verwaltet. Dinge wie Client-Mods und Designs hängen davon ab. Deaktivieren Sie es, wenn Sie Mods und benutzerdefinierte Stile entfernen möchten.", + "settings-mintoTray": "Im Hintergrund arbeiten", + "settings-mintoTray-desc": "Wenn diese Option deaktiviert ist, wird Legcord wie jedes andere Fenster geschlossen, wenn es geschlossen wird. Andernfalls bleibt es in Ihrer Taskleiste für später gespeichert.", + "settings-startMinimized": "Minimiert starten", + "settings-startMinimized-desc": "Legcord startet im Hintergrund und bleibt Ihnen nicht im Weg.", + "settings-useSystemCssEditor": "System-CSS-Editor verwenden", + "settings-useSystemCssEditor-desc": "Verwenden Sie den System-CSS-Editor, um CSS zu bearbeiten.", + "settings-MultiInstance": "Mehrfachinstanz", + "settings-MultiInstance-desc": "Wenn diese Option aktiviert ist, können Sie mehrere Instanzen von Legcord starten.", + "settings-noBundleUpdates": "Keine Paket-Updates", + "settings-noBundleUpdates-desc": "Deaktiviert automatische Updates für Client-Mods.", + "settings-hardwareAcceleration": "Hardwarebeschleunigung", + "settings-hardwareAcceleration-desc": "Die Hardwarebeschleunigung nutzt Ihre GPU, um Legcord schneller laufen zu lassen. Wenn Sie Bildstörungen feststellen, deaktivieren Sie diese Funktion.", + "settings-blockPowerSavingInVoiceChat": "Energiesparmodus im Voice-Chat deaktivieren", + "settings-blockPowerSavingInVoiceChat-desc": "Verhindert, dass Legcord angehalten wird. Hält das System aktiv, ermöglicht jedoch das Ausschalten des Bildschirms.", + "settings-mobileMode": "Mobilmodus", + "settings-mobileMode-desc": "Wenn Sie ein Gerät mit Touchscreen verwenden, ist diese Funktion genau das Richtige für Sie! Sie aktiviert den versteckten Mobilmodus von Discord, der für Smartphones und Tablets gedacht ist. Die einzige wichtige Funktion, die fehlt, ist die Unterstützung für Voice-Chat. Dies ist ideal für\n Benutzer von PinePhone und ähnlichen Geräten.", + "settings-spellcheck": "Rechtschreibprüfung", + "settings-spellcheck-desc": "Hilft Ihnen, falsch geschriebene Wörter zu korrigieren, indem es sie hervorhebt.", + "settings-channel": "Discord-Kanal", + "settings-channel-desc": "Verwenden Sie diese Einstellung, um die aktuelle Instanz von Discord zu ändern, die Legcord ausführt.", + "settings-bitrateMin": "Mindestbitrate", + "settings-bitrateMin-desc": "Mindestbitrate für Bildschirmfreigabe.", + "settings-bitrateMax": "Maximale Bitrate", + "settings-bitrateMax-desc": "Maximale Bitrate für Bildschirmfreigabe.", + "settings-bitrateTarget": "Zielbitrate", + "settings-bitrateTarget-desc": "Zielbitrate für Bildschirmfreigabe.", + "settings-invitewebsocket": "Umfassende Präsenz", + "settings-invitewebsocket-desc": "Verwendet arRPC, um Discord RPC (Rich Presence) mit lokalen Programmen auf Ihrem Computer zu unterstützen.", + "settings-useMacSystemPicker": "Verwenden Sie die macOS-Systemauswahl", + "settings-useMacSystemPicker-desc": "Verwenden Sie nach Möglichkeit die native Bildschirmfreigabe von macOS. Nur macOS 15+", + "settings-additionalArguments": "Weitere Argumente", + "settings-additionalArguments-desc": "Zusätzliche Argumente sind zusätzliche Befehle, die Sie an Legcord übergeben können. Sie können verwendet werden, um Funktionen zu aktivieren oder zu deaktivieren oder um Probleme zu beheben.", + "settings-mod": "Client-Modifikation", + "settings-mod-desc1": "Client-Mods sind Programme, mit denen Sie Ihr Discord-Erlebnis individuell anpassen können. Sie können das Erscheinungsbild des Clients ändern, Verhaltensweisen modifizieren oder neue Funktionen hinzufügen!", + "settings-mod-vencord": "Leichter und benutzerfreundlicher Client-Mod. Mit integriertem Store für Plugins.", + "settings-mod-equicord": "Aus vencord-Mitwirkenden hervorgegangen, mit einem Client, der über zahlreiche Plugins verfügt.", + "settings-prfmMode": "Leistungsmodus", + "settings-prfmMode-desc": "Der Leistungsmodus ist eine experimentelle Funktion in Legcord, die darauf ausgelegt ist, die Reaktionsfähigkeit und Leistung entsprechend Ihren Anforderungen zu optimieren. Die Auswirkungen können je nach Ihrer Hardware und Nutzung variieren. Wir empfehlen Ihnen daher, jeden Modus auszuprobieren, um herauszufinden, welcher für Sie am besten geeignet ist.", + "settings-prfmMode-performance": "Leistung", + "settings-prfmMode-battery": "Batterie", + "settings-prfmMode-dynamic": "Dynamisch", + "settings-prfmMode-vaapi": "VAAPI", + "settings-disableAutogain": "Automatische Verstärkung deaktivieren", + "settings-disableAutogain-desc": "Deaktiviert die automatische Verstärkung.", + "settings-disableHttpCache": "HTTP-Cache deaktivieren", + "settings-disableHttpCache-desc": "Deaktiviert den HTTP-Cache von Chromium. Aktivieren Sie diese Option, wenn Client-Mods bei Ihnen nicht geladen werden.", + "settings-trayIcon": "Systemleistensymbol", + "settings-trayIcon-desc": "Legen Sie das Symbol fest, das im Tray-Menü angezeigt werden soll.", + "settings-trayIcon-disabled": "Deaktivieren Sie die Ablage", + "settings-trayIcon-dynamic": "Dynamisch", + "settings-trayIcon-normal": "Discord-Symbol", + "settings-trayIcon-classic": "Klassisches Discord-Symbol", + "settings-trayIcon-colored-plug": "Colored Plug", + "settings-trayIcon-white-plug": "White Plug", + "settings-trayIcon-white-plug-alt": "White Plug Alt", + "settings-trayIcon-black-plug": "Black Plug", + "settings-trayIcon-black-plug-alt": "Black Plug Alt", + "settings-advanced": "Fortgeschrittener Benutzerbereich", + "settings-pluginsFolder": "Plugins-Ordner öffnen", + "settings-crashesFolder": "Öffnen des Ordner Native Abstürze", + "settings-themesFolder": "Themenordner öffnen", + "settings-storageFolder": "Speicherordner öffnen", + "settings-none": "Keine", + "settings-save": "Einstellungen speichern", + "settings-experimental": "Experimentell", + "settings-restart": "App neu starten", + "settings-updater": "Auf Updates prüfen", + "settings-skipSplash": "Startbildschirm überspringen", + "settings-skipSplash-desc": "Überspringt den Legcord-Begrüßungsbildschirm beim Starten der App.", + "settings-copyDebugInfo": "Debug-Informationen kopieren", + "settings-copyGPUInfo": "GPU-Informationen kopieren", + "settings-clearClientModCache": "Client-Mod-Cache löschen", + "settings-forceNativeCrash": "Erzwinge systemeigenen Absturz", + "settings-smoothScroll": "Gleichmäßiges Scrollen verwenden", + "settings-smoothScroll-desc": "Reibungsloses Scrollen umschalten", + "settings-autoScroll": "Automatisches Scrollen zulassen", + "settings-autoScroll-desc": "Automatisches Scrollen mit der mittleren Maustaste zulassen (Hinweis: Ihre Desktop-Umgebung kann dies weiterhin mit einer anderen Aktion überschreiben)", + "settings-category-lookAndFeel": "Aussehen und Haptik", + "settings-category-mods": "Mods", + "settings-category-behaviour": "Verhalten", + "settings-category-legacy": "Legacy-Funktionen", + "settings-category-debug": "Fehlerbehebungsoptionen" +} From 319c6f08130d7d54508b7abffe9cdef6f55def17 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sat, 16 Aug 2025 15:09:25 +0200 Subject: [PATCH 665/844] fix: macOS game detection --- .gitignore | 3 ++- package.json | 4 ++-- pnpm-lock.yaml | 28 ++++++++++++++-------------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 938d34c..6114dc2 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ ts-out/ package-lock.json .pnpm-store .cache -.DS_Store \ No newline at end of file +.DS_Store +pnpm-workspace.yaml \ No newline at end of file diff --git a/package.json b/package.json index 1ab21bb..a141a9c 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@uwu/lune": "^1.5.1", "@uwu/shelter-defs": "^1.4.1", "babel-preset-solid": "^1.9.3", - "electron": "37.2.6", + "electron": "37.3.0", "electron-builder": "^26.0.18", "lucide-solid": "^0.475.0", "rolldown": "1.0.0-beta.31", @@ -55,7 +55,7 @@ "xml-formatter": "^3.6.6" }, "dependencies": { - "arrpc": "https://github.com/Legcord/arrpc.git#9abda032465847724d29db9aeeacc0b375c55a86", + "arrpc": "https://github.com/Legcord/arrpc.git#015c803a80288e3345ec55f8963015a626509007", "electron-context-menu": "^4.0.4", "electron-is-dev": "^3.0.1", "electron-updater": "^6.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ed0331..dce5667 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: arrpc: - specifier: https://github.com/Legcord/arrpc.git#9abda032465847724d29db9aeeacc0b375c55a86 - version: https://codeload.github.com/Legcord/arrpc/tar.gz/9abda032465847724d29db9aeeacc0b375c55a86 + specifier: https://github.com/Legcord/arrpc.git#015c803a80288e3345ec55f8963015a626509007 + version: https://codeload.github.com/Legcord/arrpc/tar.gz/015c803a80288e3345ec55f8963015a626509007 electron-context-menu: specifier: ^4.0.4 version: 4.0.4 @@ -23,10 +23,6 @@ importers: ws: specifier: ^8.18.0 version: 8.18.0 - optionalDependencies: - '@vencord/venmic': - specifier: ^6.1.0 - version: 6.1.0 devDependencies: '@babel/preset-flow': specifier: ^7.25.9 @@ -62,8 +58,8 @@ importers: specifier: ^1.9.3 version: 1.9.3(@babel/core@7.26.7) electron: - specifier: 37.2.6 - version: 37.2.6 + specifier: 37.3.0 + version: 37.3.0 electron-builder: specifier: ^26.0.18 version: 26.0.19(electron-builder-squirrel-windows@25.1.8) @@ -91,6 +87,10 @@ importers: xml-formatter: specifier: ^3.6.6 version: 3.6.6 + optionalDependencies: + '@vencord/venmic': + specifier: ^6.1.0 + version: 6.1.0 packages: @@ -1359,8 +1359,8 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/9abda032465847724d29db9aeeacc0b375c55a86: - resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/9abda032465847724d29db9aeeacc0b375c55a86} + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/015c803a80288e3345ec55f8963015a626509007: + resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/015c803a80288e3345ec55f8963015a626509007} version: 3.5.0 hasBin: true @@ -1733,8 +1733,8 @@ packages: electron-updater@6.6.2: resolution: {integrity: sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==} - electron@37.2.6: - resolution: {integrity: sha512-Ns6xyxE+hIK5UlujtRlw7w4e2Ju/ImCWXf1Q/PoOhc0N3/6SN6YW7+ujCarsHbxWnolbW+1RlkHtdklUJpjbPA==} + electron@37.3.0: + resolution: {integrity: sha512-cPOPUD26DwCh+PZ9q+gMyVBvdBN75SnekI6u5zcOeoLVIXQpzrCm1ewz9BcrkWkVW7oOtfQAEo1G1SffvXrSSw==} engines: {node: '>= 12.20.55'} hasBin: true @@ -4382,7 +4382,7 @@ snapshots: array-union@2.1.0: {} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/9abda032465847724d29db9aeeacc0b375c55a86: + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/015c803a80288e3345ec55f8963015a626509007: dependencies: koffi: 2.12.0 ws: 8.18.0 @@ -4895,7 +4895,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@37.2.6: + electron@37.3.0: dependencies: '@electron/get': 2.0.3 '@types/node': 22.10.1 From 53299982c074d3b8f2b2ddacc9babf9971f3aef7 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 25 Aug 2025 08:03:01 +0200 Subject: [PATCH 666/844] chore: translations update [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Максим Горпиніч Translate-URL: https://hosted.weblate.org/projects/armcord/client/uk/ Translation: Legcord/Client --- assets/lang/uk.json | 135 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 134 insertions(+), 1 deletion(-) diff --git a/assets/lang/uk.json b/assets/lang/uk.json index 0967ef4..841af47 100644 --- a/assets/lang/uk.json +++ b/assets/lang/uk.json @@ -1 +1,134 @@ -{} +{ + "loading_screen_start": "Початковий легкорд…", + "loading_screen_offline": "Схоже, ви не в мережі. Перезавантажте через ", + "loading_screen_update": "Доступна нова версія Legcord. Будь ласка, оновіть її до останньої версії.", + "setup_question1": "Ласкаво просимо до налаштування Legcord", + "setup_offline": "Схоже, ви не в мережі. Підключіться до Інтернету та перезапустіть Legcord.", + "setup_question2": "Оберіть свій канал/екземпляр Discord:", + "setup_question3": "Чи повинен Legcord займатися встановленням клієнтських модів?", + "yes": "Так", + "no": "Ні", + "next": "Далі", + "setup_question4": "Виберіть клієнтський мод, який ви хочете встановити:", + "setup_question5": "Ви хочете використовувати значок у треї?", + "settings-bounceOnPing": "Відскок у доці при пінг-інгу", + "settings-bounceOnPing-desc": "Перезавантажте додаток у доці, коли отримаєте пінг.", + "settings-theme": "Стиль вікна", + "settings-theme-desc": "Стиль вікна керує тим, що використовує Legcord у рядку заголовка.", + "settings-theme-default": "За замовчуванням (налаштування)", + "settings-theme-native": "Рідний", + "settings-theme-overlay": "Накладання", + "settings-autoHideMenuBar": "Автоматично приховувати рядок меню", + "settings-autoHideMenuBar-desc": "Автоматично приховувати рядок меню, коли він не використовується.", + "settings-sleepInBackground": "Сон у фоновому режимі", + "settings-sleepInBackground-desc": "Вмикає фонове регулювання Chromium. Це може допомогти заощадити заряд батареї, але також перериває сповіщення.", + "settings-transparency": "Прозорість", + "settings-transparency-desc": "Встановіть режим прозорості, який використовуватиме Legcord.", + "settings-transparency-universal": "Універсальний", + "settings-transparency-modern": "Сучасний", + "settings-theme-transparent": "Прозорий", + "settings-popoutPiP": "Виклик спливаючого вікна завжди зверху", + "settings-popoutPiP-desc": "Коли цю функцію ввімкнено, спливаюче вікно виклику буде в режимі «Завжди зверху».", + "settings-venmic-workaround": "Тимчасове вирішення", + "settings-venmic-workaround-desc": "Увімкнути або вимкнути тимчасове рішення для проблеми, яка призводить до спільного використання мікрофона замість правильного аудіо.", + "settings-venmic-deviceSelect": "Вибір пристрою", + "settings-venmic-deviceSelect-desc": "Дозволити вибір аудіопристрою.", + "settings-venmic-granularSelect": "Детальний вибір", + "settings-venmic-granularSelect-desc": "Дозволити вибір джерела аудіовхідного сигналу.", + "settings-venmic-ignoreVirtual": "Ігнорувати віртуальні пристрої", + "settings-venmic-ignoreVirtual-desc": "Ігноруйте віртуальні аудіопристрої.", + "settings-venmic-ignoreDevices": "Ігнорувати пристрої", + "settings-venmic-ignoreDevices-desc": "Ігноруйте певні аудіопристрої.", + "settings-venmic-ignoreInputMedia": "Ігнорувати вхідні медіафайли", + "settings-venmic-ignoreInputMedia-desc": "Ігноруйте аудіовхід з медіа-джерел.", + "settings-venmic-onlySpeakers": "Тільки динаміки", + "settings-venmic-onlySpeakers-desc": "Використовуйте динаміки лише для вибору аудіо.", + "settings-venmic-onlyDefaultSpeakers": "Тільки динаміки за замовчуванням", + "settings-venmic-onlyDefaultSpeakers-desc": "Використовуйте лише динаміки за замовчуванням для вибору аудіо.", + "settings-audio": "Аудіо", + "settings-audio-desc": "Виберіть метод, який Legcord використовуватиме для захоплення аудіо з вашої системи під час демонстрації екрана.", + "settings-openCustomIconDialog": "Встановити значок на робочому столі", + "settings-csp-desc": "Legcord CSP – це наша система, яка керує завантаженням користувацького контенту в додаток Discord. Від неї залежать такі речі, як клієнтські моди та теми. Вимкніть, якщо хочете позбутися модів та користувацьких стилів.", + "settings-mintoTray": "Робота у фоновому режимі", + "settings-mintoTray-desc": "Якщо вимкнено, Legcord закриється, як і будь-яке інше вікно, якщо його закрити, інакше він залишиться в системному треї на потім.", + "settings-startMinimized": "Почати згорнутий", + "settings-startMinimized-desc": "Легкорд починається на задньому плані та залишається поза вашими перешкодами.", + "settings-useSystemCssEditor": "Використовуйте системний редактор CSS", + "settings-useSystemCssEditor-desc": "Використовуйте системний редактор CSS для редагування CSS.", + "settings-MultiInstance": "Багато екземплярів", + "settings-MultiInstance-desc": "Після ввімкнення ви зможете запустити багато екземплярів Legcord.", + "settings-noBundleUpdates": "Немає оновлень пакетів", + "settings-noBundleUpdates-desc": "Вимикає автоматичні оновлення для клієнтських модів.", + "settings-hardwareAcceleration": "Апаратне прискорення", + "settings-hardwareAcceleration-desc": "Апаратне прискорення використовує ваш графічний процесор для пришвидшення роботи Legcord. Якщо у вас виникають візуальні збої, спробуйте вимкнути цю функцію.", + "settings-blockPowerSavingInVoiceChat": "Блокування енергозбереження в голосовому чаті", + "settings-blockPowerSavingInVoiceChat-desc": "Запобігає призупиненню Legcord. Залишає систему активною, але дозволяє вимкнути екран.", + "settings-mobileMode": "Мобільний режим", + "settings-mobileMode-desc": "Якщо ви користуєтеся пристроєм із сенсорним екраном, ця функція саме для вас! Вона активує прихований мобільний режим Discord, призначений для телефонів і планшетів. Єдина головна функція, якої бракує, — це підтримка голосового чату.\n Це ідеально підходить для користувачів PinePhone та подібних пристроїв.", + "settings-spellcheck": "Spellcheck'", + "settings-spellcheck-desc": "Допомагає виправити слова з орфографічними помилками, виділяючи їх.", + "settings-channel": "Канал Discord", + "settings-channel-desc": "Використовуйте цей параметр, щоб змінити поточний екземпляр Discord, на якому запущено Legcord.", + "settings-bitrateMin": "Мінімальний бітрейт", + "settings-bitrateMin-desc": "Мінімальний бітрейт для спільного використання екрана.", + "settings-bitrateMax": "Максимальний бітрейт", + "settings-bitrateMax-desc": "Максимальний бітрейт для спільного використання екрана.", + "settings-bitrateTarget": "Цільовий бітрейт", + "settings-bitrateTarget-desc": "Цільовий бітрейт для спільного використання екрана.", + "settings-invitewebsocket": "Багата присутність", + "settings-invitewebsocket-desc": "Використовує arRPC для підтримки Discord RPC (Rich Presence) з локальними програмами на вашому комп'ютері.", + "settings-useMacSystemPicker": "Використовуйте засіб вибору системи macOS", + "settings-useMacSystemPicker-desc": "Використовуйте вбудований спільний доступ до екрана macOS, коли це можливо. Тільки для macOS 15+", + "settings-additionalArguments": "Додаткові аргументи", + "settings-additionalArguments-desc": "Додаткові аргументи – це додаткові команди, які ви можете передавати Legcord. Їх можна використовувати для ввімкнення або вимкнення функцій або для виправлення проблем.", + "settings-mod": "Модифікація клієнта", + "settings-mod-desc1": "Модифікації клієнта – це програми, які дозволяють вам налаштувати ваш досвід користування Discord. Вони можуть змінювати зовнішній вигляд клієнта, модифікувати поведінку або додавати нові функції!", + "settings-mod-vencord": "Легкий та простий у використанні клієнтський мод. Має вбудований магазин плагінів.", + "settings-mod-equicord": "Розгалужений та створений завдяки розробникам Vencord, з досить багатим на плагіни клієнтом.", + "settings-prfmMode": "Режим продуктивності", + "settings-prfmMode-desc": "Режим продуктивності – це експериментальна функція в Legcord, розроблена для оптимізації швидкості реагування та продуктивності відповідно до ваших потреб. Вплив може відрізнятися залежно від вашого обладнання та використання, тому ми рекомендуємо вам спробувати кожен режим, щоб визначити, який найкраще підходить саме вам.", + "settings-prfmMode-performance": "Продуктивність", + "settings-prfmMode-battery": "Батарея", + "settings-prfmMode-dynamic": "Динамічний", + "settings-prfmMode-vaapi": "VAAPI", + "settings-disableAutogain": "Вимкнути автоматичне посилення", + "settings-disableAutogain-desc": "Вимикає автоматичне посилення.", + "settings-disableHttpCache": "Вимкнути кеш HTTP", + "settings-disableHttpCache-desc": "Вимикає HTTP-кеш Chromium. Увімкніть цю опцію, якщо клієнтські моди не завантажуються.", + "settings-trayIcon": "Піктограма трея", + "settings-trayIcon-desc": "Встановіть значок, який відображатиметься в меню трея.", + "settings-trayIcon-disabled": "Вимкнути лоток", + "settings-trayIcon-dynamic": "Динамічний", + "settings-trayIcon-normal": "Ікона Discord", + "settings-trayIcon-classic": "Класична ікона Discord", + "settings-trayIcon-colored-plug": "Кольорова вилка", + "settings-trayIcon-white-plug": "Біла вилка", + "settings-trayIcon-white-plug-alt": "Білий штекер Alt", + "settings-trayIcon-black-plug": "Чорна вилка", + "settings-trayIcon-black-plug-alt": "Чорний штекер Alt", + "settings-advanced": "Зона розширеного користувача", + "settings-pluginsFolder": "Відкрити папку плагінів", + "settings-crashesFolder": "Відкрити папку збоїв нативної системи", + "settings-themesFolder": "Відкрити папку тем", + "settings-storageFolder": "Відкрити папку сховища", + "settings-none": "Жоден", + "settings-save": "Зберегти налаштування", + "settings-experimental": "Експериментальний", + "settings-restart": "Перезапустіть програму", + "settings-updater": "Перевірити наявність оновлень", + "settings-skipSplash": "Пропустити заставку", + "settings-skipSplash-desc": "Пропускає заставку Legcord під час запуску програми.", + "settings-copyDebugInfo": "Копіювати інформацію про налагодження", + "settings-copyGPUInfo": "Копіювати інформацію про графічний процесор", + "settings-clearClientModCache": "Очистити кеш клієнтських модів", + "settings-forceNativeCrash": "Примусове збійне оновлення нативної системи", + "settings-smoothScroll": "Використовуйте плавне прокручування", + "settings-smoothScroll-desc": "Увімкнути/вимкнути плавне прокручування", + "settings-autoScroll": "Дозволити автоматичне прокручування", + "settings-autoScroll-desc": "Дозволити автоматичне прокручування клацанням середньою кнопкою миші (Примітка: ваше середовище робочого столу все ще може замінити це іншою дією)", + "settings-category-lookAndFeel": "Зовнішній вигляд і відчуття", + "settings-category-mods": "Моди", + "settings-category-behaviour": "Поведінка", + "settings-category-legacy": "Застарілі функції", + "settings-category-debug": "Параметри налагодження" +} From 75d8d235c3d7b502356e985b3ad1557b18399efd Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Wed, 10 Sep 2025 11:02:09 +0200 Subject: [PATCH 667/844] chore: translations update [skip ci] Co-authored-by: Nathan Translate-URL: https://hosted.weblate.org/projects/armcord/client/fr/ Translation: Legcord/Client --- assets/lang/fr.json | 134 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 133 insertions(+), 1 deletion(-) diff --git a/assets/lang/fr.json b/assets/lang/fr.json index 0967ef4..495eea4 100644 --- a/assets/lang/fr.json +++ b/assets/lang/fr.json @@ -1 +1,133 @@ -{} +{ + "loading_screen_start": "Démarrage de Legcord…", + "loading_screen_offline": "Vous semblez être hors-ligne. Redémarrage dans ", + "loading_screen_update": "Une nouvelle version de Legcord est disponible. Veuillez effectuer la mise à jour vers la dernière version.", + "setup_question1": "Bienvenue dans l'installation de Legcord", + "setup_offline": "Vous semblez être hors-ligne. Veuillez vous connecter à Internet et relancer Legcord.", + "setup_question2": "Sélectionnez votre canal/instance Discord :", + "yes": "Oui", + "no": "Non", + "next": "Suivant", + "settings-theme": "Style de fenêtre", + "settings-theme-desc": "Le style de fenêtre gère la barre de titre que doit utiliser Legcord.", + "settings-theme-default": "Par défaut (Personnalisé)", + "settings-theme-native": "Natif", + "settings-autoHideMenuBar": "Masquer automatiquement la barre de menu", + "settings-autoHideMenuBar-desc": "Masquer automatiquement la barre de menu lorsqu'elle n'est pas utilisée.", + "settings-transparency": "Transparence", + "settings-transparency-desc": "Définit le mode de transparence utilisé par Legcord.", + "settings-transparency-universal": "Universel", + "settings-transparency-modern": "Moderne", + "settings-theme-transparent": "Transparent", + "settings-venmic-deviceSelect": "Sélection du périphérique", + "settings-venmic-deviceSelect-desc": "Autoriser la sélection d'un périphérique audio.", + "settings-venmic-granularSelect-desc": "Autoriser la sélection d'une source d'entrée audio.", + "settings-venmic-ignoreVirtual": "Ignorer les périphériques virtuels", + "settings-venmic-ignoreVirtual-desc": "Ignorer les périphériques audio virtuels.", + "settings-venmic-ignoreDevices": "Ignorer les périphériques", + "settings-venmic-ignoreDevices-desc": "Ignorer des périphériques audio spécifiques.", + "settings-venmic-onlySpeakers": "Haut-parleurs uniquement", + "settings-venmic-onlySpeakers-desc": "Utiliser uniquement les hauts-parleurs pour la sélection audio.", + "settings-venmic-onlyDefaultSpeakers": "Hauts-parleurs par défaut uniquement", + "settings-venmic-onlyDefaultSpeakers-desc": "Utiliser uniquement les hauts-parleurs par défaut pour la sélection audio.", + "settings-audio": "Audio", + "settings-audio-desc": "Sélectionner la méthode utilisée par Legcord pour capter le son de votre système lors du partage d'écran.", + "settings-openCustomIconDialog": "Définir une icône de bureau", + "settings-startMinimized-desc": "Legcord démarre en arrière-plan sans vous déranger.", + "settings-useSystemCssEditor": "Utiliser l'éditeur CSS du système", + "settings-useSystemCssEditor-desc": "Utiliser l'éditeur CSS du système pour modifier le CSS.", + "settings-MultiInstance": "Multi-instances", + "settings-MultiInstance-desc": "Si activez vous pourrez lancer plusieurs instances de Legcord.", + "settings-hardwareAcceleration": "Accélération matérielle", + "settings-hardwareAcceleration-desc": "L'accélération matérielle utilise votre carte graphique pour rendre Legcord plus rapide. Si vous rencontrez des problèmes visuels, essayez de désactiver ceci.", + "settings-blockPowerSavingInVoiceChat": "Bloquer le mode économie d'énergie en tchat vocal", + "settings-blockPowerSavingInVoiceChat-desc": "Empêche Legcord d'être mis en veille. Laisse le système actif mais permet à l'écran de s'éteindre.", + "settings-mobileMode": "Mode mobile", + "settings-spellcheck": "Correction orthographique", + "settings-spellcheck-desc": "Aide à corriger les fautes d'orthographe en les mettant en avant.", + "settings-channel": "Canal Discord", + "settings-channel-desc": "Utiliser ce paramètre pour modifier l'instance Discord exécutée par Legcord.", + "settings-useMacSystemPicker": "Utiliser le sélecteur de macOS", + "settings-useMacSystemPicker-desc": "Utiliser le partage d'écran natif de macOS si possible. macOS 15+ uniquement", + "settings-additionalArguments": "Arguments supplémentaires", + "settings-additionalArguments-desc": "Les arguments supplémentaires sont des commandes additionnelles que vous pouvez passer à Legcord. Ils peuvent être utilisés pour activer ou désactiver des fonctionnalités, ou corriger des problèmes.", + "settings-prfmMode": "Mode performance", + "settings-prfmMode-desc": "Le mode performance est une fonctionnalité expérimentale de Legcord conçue pour optimiser la réactivité et les performances selon vos besoins. Son impact peut varier selon votre matériel et votre utilisation, c'est pourquoi nous vous encourageons à essayer chaque mode pour déterminer lequel vous correspond le mieux.", + "settings-prfmMode-performance": "Performance", + "settings-prfmMode-battery": "Batterie", + "settings-prfmMode-dynamic": "Dynamique", + "settings-prfmMode-vaapi": "VAAPI", + "settings-disableHttpCache": "Désactiver le cache HTTP", + "settings-trayIcon-dynamic": "Dynamique", + "settings-trayIcon-normal": "Icône Discord", + "settings-trayIcon-classic": "Icône Discord classique", + "settings-advanced": "Zone pour les utilisateurs avancés", + "settings-pluginsFolder": "Ouvrir le dossier des extensions", + "settings-themesFolder": "Ouvrir le dossier des thèmes", + "settings-none": "Aucun", + "settings-save": "Enregistrer les paramètres", + "settings-experimental": "Expérimental", + "settings-restart": "Relancer l'application", + "settings-updater": "Vérifier les mises à jour", + "settings-skipSplash": "Ignorer l'écran de chargement", + "settings-skipSplash-desc": "Ignore l'écran de chargement de Legcord lorsque vous lancez l'application.", + "settings-copyDebugInfo": "Copier les informations de débogage", + "settings-copyGPUInfo": "Copier les informations de la carte graphique", + "settings-smoothScroll": "Utiliser le défilement naturel", + "settings-smoothScroll-desc": "Activer ou désactiver le défilement naturel", + "settings-autoScroll": "Autoriser le défilement automatique", + "settings-autoScroll-desc": "Autoriser le défilement automatique avec un clic central (Note : Votre environnement de bureau peut toujours écraser ceci avec une autre action)", + "settings-category-lookAndFeel": "Apparence", + "settings-category-mods": "Mods", + "settings-category-behaviour": "Comportement", + "settings-category-legacy": "Fonctionnalités obsolètes", + "settings-category-debug": "Options de débogage", + "setup_question3": "Legcord doit-il gérer l'installation de mods ?", + "setup_question4": "Sélectionnez un mod que vous souhaitez installer :", + "setup_question5": "Voulez-vous afficher une icône dans la barre d'état ?", + "settings-bounceOnPing": "Rebondir dans le dock en cas de mention", + "settings-bounceOnPing-desc": "Fait rebondir l'application dans le dock lorsque vous recevez une mention.", + "settings-theme-overlay": "Overlay", + "settings-sleepInBackground": "Veille en arrière-plan", + "settings-sleepInBackground-desc": "Active la limitation en arrière-plan de Chromium. Ceci peut aider à économiser de la batterie mais désactive les notifications.", + "settings-popoutPiP": "Fenêtre d'appel toujours au premier plan", + "settings-popoutPiP-desc": "Si activé, la fenêtre d'appel sera toujours au premier plan.", + "settings-venmic-workaround": "Correctif", + "settings-venmic-workaround-desc": "Activer ou désactiver un correctif pour un problème partageant le micro au lieu de l'audio souhaité.", + "settings-venmic-ignoreInputMedia": "Ignorer les entrées de média", + "settings-venmic-ignoreInputMedia-desc": "Ignorer les entrées audio des sources de média.", + "settings-csp-desc": "Legcord CSP est notre système qui gère le chargement du contenu personnalisé dans l'application Discord. Des éléments tels que les mods et les thèmes en dépendent. Désactivez-le si vous souhaitez vous débarrasser des mods et des styles personnalisés.", + "settings-mintoTray": "Actif en arrière-plan", + "settings-mintoTray-desc": "Si désactivé, Legcord se fermera comme n'importe quelle autre fenêtre, sinon il restera actif dans la barre d'état pour plus tard.", + "settings-startMinimized": "Démarrer en mode minimisé", + "settings-noBundleUpdates": "Pas de mises à jour", + "settings-noBundleUpdates-desc": "Désactive les mises à jour automatique des mods.", + "settings-mobileMode-desc": "Si vous êtes sur un appareil doté d'un écran tactile cette fonctionnalité est faite pour vous ! Elle active le mode mobile caché de Discord conçu pour les téléphones et tablettes. La seule fonction majeure manquante est le tchat vocal. Idéal pour les utilisateurs de PinePhone ou équivalents.", + "settings-bitrateMin": "Débit minimal", + "settings-bitrateMin-desc": "Débit minimal pour le partage d'écran.", + "settings-bitrateMax": "Débit maximal", + "settings-bitrateMax-desc": "Débit maximal pour le partage d'écran.", + "settings-bitrateTarget": "Débit cible", + "settings-bitrateTarget-desc": "Débit cible pour le partage d'écran.", + "settings-invitewebsocket": "Rich Presence", + "settings-invitewebsocket-desc": "Utiliser arRPC pour prendre en charge Discord RPC (Rich Presebce) avec des programmes locaux sur votre machine.", + "settings-mod": "Mod", + "settings-mod-desc1": "Les mods sont des programmes qui vous permettent de personnaliser votre expérience dans Discord. Ils peuvent modifier l'apparence du client, modifier des comportements ou ajouter de nouvelles fonctionnalités !", + "settings-mod-vencord": "Mod client léger et facile à utiliser. Comporte une boutique intégrée pour les extensions.", + "settings-mod-equicord": "Issu des contributeurs de vencord, il dispose d'un client riche en extensions.", + "settings-disableAutogain": "Désactiver le gain automatique", + "settings-disableAutogain-desc": "Désactive le gain automatique.", + "settings-disableHttpCache-desc": "Désactive le cache HTTP de Chromium. Activez ceci si les mods ne chargent pas pour vous.", + "settings-trayIcon": "Icône dans la barre d'état", + "settings-trayIcon-desc": "Définir l'icône qui apparaîtra dans la barre d'état.", + "settings-trayIcon-disabled": "Désactiver l'icône dans la barre d'état", + "settings-trayIcon-colored-plug": "Prise colorée", + "settings-trayIcon-white-plug": "Prise blanche", + "settings-trayIcon-white-plug-alt": "Prise blanche alt", + "settings-trayIcon-black-plug": "Prise noire", + "settings-trayIcon-black-plug-alt": "Prise noire alt", + "settings-crashesFolder": "Ouvrir le dossier des plantages natifs", + "settings-storageFolder": "Ouvrir le dossier de stockage", + "settings-clearClientModCache": "Effacer le cache des mods", + "settings-forceNativeCrash": "Forcer un plantage natif" +} From b55a0f58bae0c633498948ddab054f96da6da2d0 Mon Sep 17 00:00:00 2001 From: googhigg <55514534+googhigg@users.noreply.github.com> Date: Wed, 10 Sep 2025 12:16:36 +0300 Subject: [PATCH 668/844] fix: change Dropdown module's colors to adapt to the chosen theme (#950) --- src/shelter/settings/components/Dropdown.module.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shelter/settings/components/Dropdown.module.css b/src/shelter/settings/components/Dropdown.module.css index bea5ec1..03b0d70 100644 --- a/src/shelter/settings/components/Dropdown.module.css +++ b/src/shelter/settings/components/Dropdown.module.css @@ -1,5 +1,5 @@ .acDropdown option { - color: #fff; + color: var(--text-secondary); font-weight: 400; font-style: normal; } @@ -18,7 +18,7 @@ background-repeat: no-repeat; border: 1px solid var(--background-floating); border-radius: 2px; - color: #fff; + color: var(--text-default); font-size: 1.2em; overflow: hidden; text-overflow: ellipsis; From 0fe7e2f2ac8d813fb858917096692c312245a64d Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 5 Oct 2025 15:17:15 +0200 Subject: [PATCH 669/844] feat: hero updater css --- .../components/HeroUpdater.module.css | 22 ++++--- .../settings/components/HeroUpdater.tsx | 61 ++++++++++++------- .../settings/components/ThemesCard.module.css | 7 ++- .../settings/components/ThemesCard.tsx | 2 +- 4 files changed, 56 insertions(+), 36 deletions(-) diff --git a/src/shelter/settings/components/HeroUpdater.module.css b/src/shelter/settings/components/HeroUpdater.module.css index c20cd31..ae8fb7d 100644 --- a/src/shelter/settings/components/HeroUpdater.module.css +++ b/src/shelter/settings/components/HeroUpdater.module.css @@ -1,13 +1,17 @@ .hero { - background: var(--background-surface-high); - border-radius: 0.5rem; - box-shadow: var(--shadow-elevation-2); - color: var(--text-on-surface); + background: var(--card-primary-bg); + border-radius: 8px; + box-shadow: 0 1.5px 6px rgba(0,0,0,0.08); + padding: 16px 20px; display: flex; flex-direction: column; - gap: 1rem; - padding: 2rem; - position: relative; - width: 100%; - z-index: 1; + align-items: center; + max-width: 400px; + margin: 32px auto; + border-radius: 8px; } + +.checkButton { + width: 120px !important; + max-width: 120px !important; +} \ No newline at end of file diff --git a/src/shelter/settings/components/HeroUpdater.tsx b/src/shelter/settings/components/HeroUpdater.tsx index 1e1d123..9d01a8b 100644 --- a/src/shelter/settings/components/HeroUpdater.tsx +++ b/src/shelter/settings/components/HeroUpdater.tsx @@ -1,15 +1,31 @@ import { createSignal } from "solid-js"; import classes from "./HeroUpdater.module.css"; -const LOGO_URL = "https://github.com/Legcord/Branding/raw/main/assets/legcord-banner.png"; // Replace with your logo +const { + ui: { + Button, + ButtonSizes, + Header, + HeaderTags, + Text, + ButtonColors, + }, +} = shelter; +const LOGO_URL = "https://github.com/Legcord/Branding/raw/main/assets/legcord-banner.png"; -function checkForUpdates() { - // Simulate checking for updates - return new Promise((resolve) => setTimeout(() => resolve(Math.random() > 0.5), 1200)); +async function checkForUpdates() { + const response = await fetch("https://legcord.app/latest.json"); + const data = await response.json(); + const remoteVersion = data.version.replace(/\./g, ""); // easy to compare + if (remoteVersion > window.legcord.version.replace(/\./g, "")) { + return true; + } else { + return false; + } } -const DOWNLOAD_URL = "https://example.com/download"; // Replace with your download page +const DOWNLOAD_URL = "https://legcord.app/download"; -const HeroUpdater = () => { +export const HeroUpdater = () => { const [checking, setChecking] = createSignal(false); const [updateAvailable, setUpdateAvailable] = createSignal(null); @@ -26,28 +42,27 @@ const HeroUpdater = () => { }; return ( -
    - Logo -

    Update Checker

    -

    Check if a new version is available and download updates easily.

    - +
    + Logo +
    Update Checker
    + Check if a new version is available and download updates easily. + {updateAvailable() === null && ( + + )} + {updateAvailable() === true && ( -
    -

    Update available!

    - -
    + + )} {updateAvailable() === false && ( -
    -

    Your app is up to date.

    -
    + Your app is up to date. )}
    ); }; - -export default HeroUpdater; diff --git a/src/shelter/settings/components/ThemesCard.module.css b/src/shelter/settings/components/ThemesCard.module.css index 392e622..9c7f529 100644 --- a/src/shelter/settings/components/ThemesCard.module.css +++ b/src/shelter/settings/components/ThemesCard.module.css @@ -35,9 +35,10 @@ filter: brightness(0) invert(1); } .mainInfo { - display: flex; flex-wrap: wrap; + align-items: baseline; + justify-content: center; gap: 5px; - align-items: center; - margin-bottom: 0.5rem; + margin-bottom: -0.5em; + display: flex; } diff --git a/src/shelter/settings/components/ThemesCard.tsx b/src/shelter/settings/components/ThemesCard.tsx index 49d62de..2cb5ee0 100644 --- a/src/shelter/settings/components/ThemesCard.tsx +++ b/src/shelter/settings/components/ThemesCard.tsx @@ -50,7 +50,7 @@ export const ThemesCard = (props: { theme: ThemeManifest }) => {
    -
    {props.theme.name}
    +
    {props.theme.name}
    by
    {props.theme.author} From 552004bdadacd0f8aac62e67cd53ae40b11d1ed3 Mon Sep 17 00:00:00 2001 From: Patrick <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 5 Oct 2025 15:43:48 +0200 Subject: [PATCH 670/844] fix: match titlebar height, with the topbar --- assets/app/css/baseTitlebar.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/app/css/baseTitlebar.css b/assets/app/css/baseTitlebar.css index 5667282..2cf840c 100644 --- a/assets/app/css/baseTitlebar.css +++ b/assets/app/css/baseTitlebar.css @@ -9,7 +9,7 @@ box-sizing: border-box; width: 100%; clear: both; - height: 36px; + height: var(--custom-app-top-bar-height); line-height: 30px; -webkit-app-region: drag !important; user-select: none; @@ -36,7 +36,7 @@ right: 0; top: 0; z-index: 99999999; - line-height: 36px; + line-height: var(--custom-app-top-bar-height); -webkit-app-region: no-drag; } From 90b23fa672517ead3fd0fc0b5eb7fee3dbe5f3c1 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sun, 5 Oct 2025 15:44:48 +0200 Subject: [PATCH 671/844] chore: bump electron --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index a141a9c..a3a11e8 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@uwu/lune": "^1.5.1", "@uwu/shelter-defs": "^1.4.1", "babel-preset-solid": "^1.9.3", - "electron": "37.3.0", + "electron": "38.2.1", "electron-builder": "^26.0.18", "lucide-solid": "^0.475.0", "rolldown": "1.0.0-beta.31", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dce5667..cbbe71b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,8 +58,8 @@ importers: specifier: ^1.9.3 version: 1.9.3(@babel/core@7.26.7) electron: - specifier: 37.3.0 - version: 37.3.0 + specifier: 38.2.1 + version: 38.2.1 electron-builder: specifier: ^26.0.18 version: 26.0.19(electron-builder-squirrel-windows@25.1.8) @@ -1733,8 +1733,8 @@ packages: electron-updater@6.6.2: resolution: {integrity: sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==} - electron@37.3.0: - resolution: {integrity: sha512-cPOPUD26DwCh+PZ9q+gMyVBvdBN75SnekI6u5zcOeoLVIXQpzrCm1ewz9BcrkWkVW7oOtfQAEo1G1SffvXrSSw==} + electron@38.2.1: + resolution: {integrity: sha512-P4pE2RpRg3kM8IeOK+heg6iAxR5wcXnNHrbVchn7M3GBnYAhjfJRkROusdOro5PlKzdtfKjesbbqaG4MqQXccg==} engines: {node: '>= 12.20.55'} hasBin: true @@ -4895,7 +4895,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@37.3.0: + electron@38.2.1: dependencies: '@electron/get': 2.0.3 '@types/node': 22.10.1 From e68610a3ecee4235666fd170eb8021d8447bfa1c Mon Sep 17 00:00:00 2001 From: avarayr <7735415+avarayr@users.noreply.github.com> Date: Sun, 5 Oct 2025 14:34:41 -0400 Subject: [PATCH 672/844] fix: macos build error (#959) --- electron-builder.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/electron-builder.ts b/electron-builder.ts index 6e51afa..9674804 100644 --- a/electron-builder.ts +++ b/electron-builder.ts @@ -16,6 +16,7 @@ export const config: Configuration = { "com.apple.security.device.audio-input": true, "com.apple.security.device.camera": true, }, + x64ArchFiles: '{**/koffi.node}', }, linux: { From 53f383b487bd2e043b4e34a3c40057e85fe4aab8 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Thu, 9 Oct 2025 20:07:24 +0200 Subject: [PATCH 673/844] chore: translations update [skip ci] Co-authored-by: anukadszep Translate-URL: https://hosted.weblate.org/projects/armcord/client/hu/ Translation: Legcord/Client --- assets/lang/hu.json | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/assets/lang/hu.json b/assets/lang/hu.json index 0967ef4..48e9701 100644 --- a/assets/lang/hu.json +++ b/assets/lang/hu.json @@ -1 +1,26 @@ -{} +{ + "loading_screen_start": "Legcord indítása…", + "loading_screen_update": "Egy új Legcord verzió érhető el. Kérlek frissítsd a legújabb verzióra.", + "setup_question1": "Üdvözöllek a Legcord Setup-ban", + "setup_offline": "Úgy tűnik hogy offline vagy. Kérlek csatlakozz internethez és inditsd újra a Legcordot.", + "setup_question2": "Válassz egy Discord csatornát/esetet:", + "setup_question3": "Vegye át a Legcord a kliens modok telepítését?", + "yes": "Igen", + "no": "Nem", + "next": "Következő", + "setup_question4": "Válassz egy kliens modot amit telepíteni szeretnél:", + "setup_question5": "Szeretnéd használni a tálcán lévő ikont?", + "settings-bounceOnPing": "Ugráljon a dock-ban pingeléskor", + "settings-bounceOnPing-desc": "Ugráljon az app a dock-ban hogyha megpingelnek.", + "settings-theme": "Ablakstílus", + "settings-theme-default": "Alapértelmezett (Egyedi)", + "settings-theme-native": "Natív", + "settings-theme-overlay": "Átfedés", + "settings-autoHideMenuBar": "Auto-elrejtse a menüsort", + "settings-autoHideMenuBar-desc": "Automatikusan elrejti a menüsort amikor nincsen használatban.", + "settings-sleepInBackground": "Aludjon a háttérben", + "settings-transparency": "Átláthatóság", + "settings-transparency-universal": "Univerzális", + "settings-transparency-modern": "Modern", + "settings-theme-transparent": "Átlátható" +} From d9e2b8fbdb7d96bfda558270098fd8589e6ab910 Mon Sep 17 00:00:00 2001 From: avarayr <7735415+avarayr@users.noreply.github.com> Date: Tue, 14 Oct 2025 05:25:59 -0400 Subject: [PATCH 674/844] feat: add transparency warning for MacOS 26 Tahoe in multiple languages and update LegcordWindow interface to include osRelease (#961) --- assets/lang/de.json | 1 + assets/lang/en-US.json | 1 + assets/lang/fr.json | 1 + assets/lang/uk.json | 1 + src/@types/legcordWindow.d.ts | 1 + src/discord/ipc.ts | 3 +++ src/discord/preload/bridge.ts | 1 + .../settings/components/DropdownItem.tsx | 4 ++++ src/shelter/settings/pages/SettingsPage.tsx | 20 +++++++++++++++++++ 9 files changed, 33 insertions(+) diff --git a/assets/lang/de.json b/assets/lang/de.json index 4ae4dc2..5a8951c 100644 --- a/assets/lang/de.json +++ b/assets/lang/de.json @@ -27,6 +27,7 @@ "settings-transparency-universal": "Universell", "settings-transparency-modern": "Modern", "settings-theme-transparent": "Transparent", + "settings-transparency-tahoe-warning": "Transparenz kann zu großem Lags auf MacOS 26 Tahoe führen.", "settings-popoutPiP": "Popup-Fenster immer im Vordergrund anzeigen", "settings-popoutPiP-desc": "Wenn diese Option aktiviert ist, wird das Anruf-Popup im Modus „Immer im Vordergrund“ angezeigt.", "settings-venmic-workaround": "Umgehungslösung", diff --git a/assets/lang/en-US.json b/assets/lang/en-US.json index 232c199..7180b58 100644 --- a/assets/lang/en-US.json +++ b/assets/lang/en-US.json @@ -27,6 +27,7 @@ "settings-transparency-universal": "Universal", "settings-transparency-modern": "Modern", "settings-theme-transparent": "Transparent", + "settings-transparency-tahoe-warning": "Transparency may cause excessive lag on MacOS 26 Tahoe.", "settings-popoutPiP": "Call Popout Always on Top", "settings-popoutPiP-desc": "When enabled, the call popout will be in Always on Top mode.", "settings-venmic-workaround": "Workaround", diff --git a/assets/lang/fr.json b/assets/lang/fr.json index 495eea4..d4e7750 100644 --- a/assets/lang/fr.json +++ b/assets/lang/fr.json @@ -19,6 +19,7 @@ "settings-transparency-universal": "Universel", "settings-transparency-modern": "Moderne", "settings-theme-transparent": "Transparent", + "settings-transparency-tahoe-warning": "La transparence peut causer un lag excessif sur MacOS 26 Tahoe.", "settings-venmic-deviceSelect": "Sélection du périphérique", "settings-venmic-deviceSelect-desc": "Autoriser la sélection d'un périphérique audio.", "settings-venmic-granularSelect-desc": "Autoriser la sélection d'une source d'entrée audio.", diff --git a/assets/lang/uk.json b/assets/lang/uk.json index 841af47..bb5a00e 100644 --- a/assets/lang/uk.json +++ b/assets/lang/uk.json @@ -27,6 +27,7 @@ "settings-transparency-universal": "Універсальний", "settings-transparency-modern": "Сучасний", "settings-theme-transparent": "Прозорий", + "settings-transparency-tahoe-warning": "Прозорість може призвести до надмірного лагу на MacOS 26 Tahoe.", "settings-popoutPiP": "Виклик спливаючого вікна завжди зверху", "settings-popoutPiP-desc": "Коли цю функцію ввімкнено, спливаюче вікно виклику буде в режимі «Завжди зверху».", "settings-venmic-workaround": "Тимчасове вирішення", diff --git a/src/@types/legcordWindow.d.ts b/src/@types/legcordWindow.d.ts index 9aad550..a043711 100644 --- a/src/@types/legcordWindow.d.ts +++ b/src/@types/legcordWindow.d.ts @@ -19,6 +19,7 @@ export interface LegcordWindow { getLang: (toGet: string) => Promise; version: string; platform: string; + osRelease: string; restart: () => void; translations: string; settings: { diff --git a/src/discord/ipc.ts b/src/discord/ipc.ts index a997a01..b59cb88 100644 --- a/src/discord/ipc.ts +++ b/src/discord/ipc.ts @@ -266,6 +266,9 @@ export function registerIpc(passedWindow: BrowserWindow): void { ipcMain.on("getOS", (event) => { event.returnValue = process.platform; }); + ipcMain.on("getOSRelease", (event) => { + event.returnValue = os.release(); + }); ipcMain.on("copyDebugInfo", () => { const settingsFileContent = readFileSync(getConfigLocation(), "utf-8"); clipboard.writeText( diff --git a/src/discord/preload/bridge.ts b/src/discord/preload/bridge.ts index 8d4eaf6..7c1be43 100644 --- a/src/discord/preload/bridge.ts +++ b/src/discord/preload/bridge.ts @@ -79,6 +79,7 @@ contextBridge.exposeInMainWorld("legcord", { }, version: ipcRenderer.sendSync("get-app-version", "app-version") as string, platform: ipcRenderer.sendSync("getOS") as string, + osRelease: ipcRenderer.sendSync("getOSRelease") as string, restart: () => ipcRenderer.send("restart"), themes: { install: async (url: string) => ipcRenderer.invoke("installBDTheme", url) as Promise, diff --git a/src/shelter/settings/components/DropdownItem.tsx b/src/shelter/settings/components/DropdownItem.tsx index 4dcc181..f438497 100644 --- a/src/shelter/settings/components/DropdownItem.tsx +++ b/src/shelter/settings/components/DropdownItem.tsx @@ -12,6 +12,7 @@ export const DropdownItem = (props: { value: string; onChange: JSX.EventHandler; children: JSXElement[]; + extraItems?: JSXElement; }) => { return (
    @@ -24,6 +25,9 @@ export const DropdownItem = (props: { {/* biome-ignore lint/correctness/noChildrenProp: FIX-ME, couldn't figure out proper types */} + + {props.extraItems} +
    ); diff --git a/src/shelter/settings/pages/SettingsPage.tsx b/src/shelter/settings/pages/SettingsPage.tsx index d53ed22..39f1d40 100644 --- a/src/shelter/settings/pages/SettingsPage.tsx +++ b/src/shelter/settings/pages/SettingsPage.tsx @@ -73,6 +73,26 @@ export function SettingsPage() { title={store.i18n["settings-transparency"]} note={store.i18n["settings-transparency-desc"]} link="https://github.com/Legcord/Legcord/wiki/Transparency-options" + extraItems={ + = 25 + } + > +
    + {store.i18n["settings-transparency-tahoe-warning"]} +
    +
    + } > From 71a73d9ac15b3c50c80f1a4cffd657f304da79a8 Mon Sep 17 00:00:00 2001 From: avarayr <7735415+avarayr@users.noreply.github.com> Date: Tue, 14 Oct 2025 05:26:18 -0400 Subject: [PATCH 675/844] fix: macos build error (#960) --- .github/workflows/package.yml | 4 ---- src/shelter/settings/pages/SettingsPage.tsx | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index c2027f7..3e50acf 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -60,10 +60,6 @@ jobs: APPLE_APP_SPECIFIC_PASSWORD: ${{secrets.APPLE_ID_PASSWORD}} APPLE_TEAM_ID: ${{secrets.APPLE_TEAM_ID}} - - name: Build Electron for Linux (Snap) - if: matrix.os == 'macos-latest' - run: pnpm electron-builder --x64 -l snap --publish always - - name: Build Electron for Windows (NSIS, AppX, & ZIP) if: matrix.os == 'windows-latest' run: pnpm electron-builder --ia32 --arm64 --x64 -w nsis appx zip diff --git a/src/shelter/settings/pages/SettingsPage.tsx b/src/shelter/settings/pages/SettingsPage.tsx index 39f1d40..2ac83af 100644 --- a/src/shelter/settings/pages/SettingsPage.tsx +++ b/src/shelter/settings/pages/SettingsPage.tsx @@ -1,7 +1,7 @@ import { Show } from "solid-js"; import type { Settings } from "../../../@types/settings.js"; import { DropdownItem } from "../components/DropdownItem.jsx"; -import HeroUpdater from "../components/HeroUpdater.jsx"; +import { HeroUpdater } from "../components/HeroUpdater.jsx"; import { TextBoxItem } from "../components/TextBoxItem.jsx"; import { setConfig, toggleMod } from "../settings.js"; import classes from "./SettingsPage.module.css"; From bce196b3918e0fc1f4b3e7b63a63d19fa2738b6e Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Wed, 5 Nov 2025 12:25:34 +0100 Subject: [PATCH 676/844] chore: update electron --- package.json | 4 +- pnpm-lock.yaml | 424 ++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 335 insertions(+), 93 deletions(-) diff --git a/package.json b/package.json index a3a11e8..bda5191 100644 --- a/package.json +++ b/package.json @@ -43,8 +43,8 @@ "@uwu/lune": "^1.5.1", "@uwu/shelter-defs": "^1.4.1", "babel-preset-solid": "^1.9.3", - "electron": "38.2.1", - "electron-builder": "^26.0.18", + "electron": "39.1.0", + "electron-builder": "^26.0.20", "lucide-solid": "^0.475.0", "rolldown": "1.0.0-beta.31", "rollup-plugin-copy": "^3.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cbbe71b..c35792a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,10 @@ importers: ws: specifier: ^8.18.0 version: 8.18.0 + optionalDependencies: + '@vencord/venmic': + specifier: ^6.1.0 + version: 6.1.0 devDependencies: '@babel/preset-flow': specifier: ^7.25.9 @@ -58,11 +62,11 @@ importers: specifier: ^1.9.3 version: 1.9.3(@babel/core@7.26.7) electron: - specifier: 38.2.1 - version: 38.2.1 + specifier: 39.1.0 + version: 39.1.0 electron-builder: - specifier: ^26.0.18 - version: 26.0.19(electron-builder-squirrel-windows@25.1.8) + specifier: ^26.0.20 + version: 26.1.0(electron-builder-squirrel-windows@25.1.8) lucide-solid: specifier: ^0.475.0 version: 0.475.0(solid-js@1.9.3) @@ -87,10 +91,6 @@ importers: xml-formatter: specifier: ^3.6.6 version: 3.6.6 - optionalDependencies: - '@vencord/venmic': - specifier: ^6.1.0 - version: 6.1.0 packages: @@ -379,12 +379,6 @@ packages: resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} engines: {node: '>=12'} - '@electron/node-gyp@https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2': - resolution: {tarball: https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2} - version: 10.2.0-electron.1 - engines: {node: '>=12.13.0'} - hasBin: true - '@electron/notarize@2.5.0': resolution: {integrity: sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==} engines: {node: '>= 10.0.0'} @@ -404,9 +398,9 @@ packages: engines: {node: '>=12.13.0'} hasBin: true - '@electron/rebuild@3.7.2': - resolution: {integrity: sha512-19/KbIR/DAxbsCkiaGMXIdPnMCJLkcf8AvGnduJtWBs/CBwiAjY1apCqOLVxrXg+rtXFCngbXhBanWjxLUt1Mg==} - engines: {node: '>=12.13.0'} + '@electron/rebuild@4.0.1': + resolution: {integrity: sha512-iMGXb6Ib7H/Q3v+BKZJoETgF9g6KMNZVbsO4b7Dmpgb5qTFqyFTzqW9F3TOSHdybv2vKYKzSS9OiZL+dcJb+1Q==} + engines: {node: '>=22.12.0'} hasBin: true '@electron/universal@2.0.1': @@ -726,6 +720,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} @@ -794,10 +792,18 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@npmcli/agent@3.0.0': + resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==} + engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/fs@2.1.2': resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + '@npmcli/fs@4.0.0': + resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} + engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/move-file@2.0.1': resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -1264,6 +1270,10 @@ packages: abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -1272,6 +1282,10 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + agentkeepalive@4.5.0: resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} @@ -1325,12 +1339,12 @@ packages: dmg-builder: 25.1.8 electron-builder-squirrel-windows: 25.1.8 - app-builder-lib@26.0.19: - resolution: {integrity: sha512-z7SaBAqwCG0sYYhimleOChJlu1gRMT7LVhzKt1rxQ4mkUOntQJEdkgclLYuJqIBGIwh9dat3LQbvOr504J0e6w==} + app-builder-lib@26.1.0: + resolution: {integrity: sha512-dxWEGIgTTPD8OiYN8X6n3PV31+DFwvP9pyXCFDsV5fyt6g+0TMZUVXrCRrSPj0+X/phBPad5sNPLLvBRDVDPaQ==} engines: {node: '>=14.0.0'} peerDependencies: - dmg-builder: 26.0.19 - electron-builder-squirrel-windows: 26.0.19 + dmg-builder: 26.1.0 + electron-builder-squirrel-windows: 26.1.0 aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -1454,20 +1468,24 @@ packages: resolution: {integrity: sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ==} engines: {node: '>=12.0.0'} - builder-util-runtime@9.3.3: - resolution: {integrity: sha512-8AE+77tdJ9XTsK96e55EXJR+ZEK54r8rb0BS8PbEXw57tOX0EWV4BluGW3xkIn+Xvbp+bmQ8gECa15wlcEQxlg==} + builder-util-runtime@9.5.0: + resolution: {integrity: sha512-7qmRMH8X/IzDM+1TysKNFo5cNWBbfacdLX4EqkuE5aiRTECAlYiKHSqEc6cc3c4Lrmpgk0utbxOPkj0iYaWAWQ==} engines: {node: '>=12.0.0'} builder-util@25.1.7: resolution: {integrity: sha512-7jPjzBwEGRbwNcep0gGNpLXG9P94VA3CPAZQCzxkFXiV2GMQKlziMbY//rXPI7WKfhsvGgFXjTcXdBEwgXw9ww==} - builder-util@26.0.19: - resolution: {integrity: sha512-fKHgkdq6Ra3bv7ly69o32L3ZrOhaq2qzSnQn9rUzWMEpsZ8FfZy9XOYQZ7qIdwB6iqJ4uZhjlPD8ZsGb7LYMZA==} + builder-util@26.1.0: + resolution: {integrity: sha512-BTUhmpkCuEAAUmc8EJkJOg7fMGsDSSRMPn1QTpoUpYpGp3SjyJV18LlCPTu3+UBfuQ/5ua7KqDLrsK9NAXO7fg==} cacache@16.1.3: resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + cacache@19.0.1: + resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} + engines: {node: ^18.17.0 || >=20.5.0} + cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -1495,6 +1513,10 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + chromium-pickle-js@0.2.0: resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} @@ -1676,8 +1698,8 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dmg-builder@26.0.19: - resolution: {integrity: sha512-lZyqfdM0SPqNydGtq06B7LRSxUcKU4v/p2xU0kmKqTM9WXZaQELOZ0OH/gbLCmeZz6zWEDSA31MmTJ8b/X8nYg==} + dmg-builder@26.1.0: + resolution: {integrity: sha512-0eXB7qX9YHiQ2o83EMgC8A6VQ7BfCFP8zxlhUtqtvqy1nEVIZa8XbOAcIiP8ne58RhwLYKV2LCcfN1OImXFEWg==} dmg-license@1.0.11: resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} @@ -1704,8 +1726,8 @@ packages: electron-builder-squirrel-windows@25.1.8: resolution: {integrity: sha512-2ntkJ+9+0GFP6nAISiMabKt6eqBB0kX1QqHNWFWAXgi0VULKGisM46luRFpIBiU3u/TDmhZMM8tzvo2Abn3ayg==} - electron-builder@26.0.19: - resolution: {integrity: sha512-0xkN9UcIBgrbNAqeurB+CyBARZPkfiILPK0nvbioX+S86B3fgRfJnjIh+T+zowyPTTY85NN5kLfItM8twVRy5w==} + electron-builder@26.1.0: + resolution: {integrity: sha512-dvy9sODWE7uqz7l68copgAtO2EKumdkLqCgooNWl7bSFjrubMmjf2hVS6iwSrcb7hLHL02OULBPNp45aeGAcpA==} engines: {node: '>=14.0.0'} hasBin: true @@ -1724,8 +1746,8 @@ packages: electron-publish@25.1.7: resolution: {integrity: sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg==} - electron-publish@26.0.19: - resolution: {integrity: sha512-tcQUIRuHOwaQxi+CrbpaB/5Q+vonj9fEeWkaVa3oM0DcdYHZK/nCLgWKu0kHgPheAU1ovfjVcXBpuyuFBLp2lA==} + electron-publish@26.1.0: + resolution: {integrity: sha512-GwghDIOk5vzNtbiMeXHEIRN+9hPR8cqTOSzMidX4vCC7U9GFh8whruhFhAyaI6MY5YlyTNmT7z6LpLlO8ncOWw==} electron-to-chromium@1.5.90: resolution: {integrity: sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==} @@ -1733,8 +1755,8 @@ packages: electron-updater@6.6.2: resolution: {integrity: sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==} - electron@38.2.1: - resolution: {integrity: sha512-P4pE2RpRg3kM8IeOK+heg6iAxR5wcXnNHrbVchn7M3GBnYAhjfJRkROusdOro5PlKzdtfKjesbbqaG4MqQXccg==} + electron@39.1.0: + resolution: {integrity: sha512-vPRbKKQUzKWZZX68fuYdz4iS/eavGcQkHOGK4ylv0YJLbBRxxUlflPRdqRGflFjwid+sja7gbNul2lArevYwrw==} engines: {node: '>= 12.20.55'} hasBin: true @@ -1840,6 +1862,15 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -1887,6 +1918,10 @@ packages: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2327,6 +2362,10 @@ packages: resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + make-fetch-happen@14.0.3: + resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} + engines: {node: ^18.17.0 || >=20.5.0} + matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} @@ -2393,10 +2432,18 @@ packages: resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} engines: {node: '>= 8'} + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + minipass-fetch@2.1.2: resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + minipass-fetch@4.0.1: + resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==} + engines: {node: ^18.17.0 || >=20.5.0} + minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} @@ -2425,6 +2472,10 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -2437,10 +2488,18 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + node-abi@3.71.0: resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} engines: {node: '>=10'} + node-abi@4.17.0: + resolution: {integrity: sha512-ljZ7PiChMA2O3sGPX5/bpBhW0O9rXn+orb2xo3Z0vleSlil7G65WZjSFjmIeAtHZHa2GXiTOMdFCsiyImMEIMg==} + engines: {node: '>=22.12.0'} + node-addon-api@1.7.2: resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} @@ -2457,6 +2516,14 @@ packages: node-api-version@0.2.0: resolution: {integrity: sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==} + node-api-version@0.2.1: + resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} + + node-gyp@11.5.0: + resolution: {integrity: sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + node-gyp@9.4.1: resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} engines: {node: ^12.13 || ^14.13 || >=16} @@ -2470,6 +2537,11 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} hasBin: true + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -2510,6 +2582,10 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} + p-map@7.0.3: + resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + engines: {node: '>=18'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -2557,6 +2633,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pkg-prebuilds@0.2.1: resolution: {integrity: sha512-FdOlDiRqRL7i9aYzQflhGWCoiJf/8u6Qgzq48gKsRDYejtfjvGb1U5QGSzllcqpNg2a8Swx/9fMgtuVefwU+zw==} engines: {node: '>= 14.15.0'} @@ -2566,9 +2646,9 @@ packages: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} - proc-log@2.0.1: - resolution: {integrity: sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + proc-log@5.0.0: + resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} + engines: {node: ^18.17.0 || >=20.5.0} process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -2740,6 +2820,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + serialize-error@7.0.1: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} @@ -2796,6 +2881,10 @@ packages: resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} engines: {node: '>= 10'} + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + socks@2.8.3: resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} @@ -2837,6 +2926,10 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + ssri@12.0.0: + resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} + engines: {node: ^18.17.0 || >=20.5.0} + ssri@9.0.1: resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -2895,6 +2988,10 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + tar@7.5.2: + resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} + engines: {node: '>=18'} + temp-file@3.4.0: resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} @@ -2904,6 +3001,10 @@ packages: tiny-typed-emitter@2.1.0: resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + tmp-promise@3.0.3: resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} @@ -2945,10 +3046,18 @@ packages: resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + unique-filename@4.0.0: + resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} + engines: {node: ^18.17.0 || >=20.5.0} + unique-slug@3.0.0: resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + unique-slug@5.0.0: + resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} + engines: {node: ^18.17.0 || >=20.5.0} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -3047,6 +3156,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -3422,22 +3535,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/node-gyp@https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2': - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.1 - glob: 8.1.0 - graceful-fs: 4.2.11 - make-fetch-happen: 10.2.1 - nopt: 6.0.0 - proc-log: 2.0.1 - semver: 7.7.0 - tar: 6.2.1 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - '@electron/notarize@2.5.0': dependencies: debug: 4.4.0 @@ -3488,24 +3585,23 @@ snapshots: - bluebird - supports-color - '@electron/rebuild@3.7.2': + '@electron/rebuild@4.0.1': dependencies: - '@electron/node-gyp': https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2 '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 debug: 4.4.0 detect-libc: 2.0.3 - fs-extra: 10.1.0 got: 11.8.6 - node-abi: 3.71.0 - node-api-version: 0.2.0 + graceful-fs: 4.2.11 + node-abi: 4.17.0 + node-api-version: 0.2.1 + node-gyp: 11.5.0 ora: 5.4.1 read-binary-file-arch: 1.0.6 - semver: 7.7.0 + semver: 7.7.2 tar: 6.2.1 yargs: 17.7.2 transitivePeerDependencies: - - bluebird - supports-color '@electron/universal@2.0.1': @@ -3719,6 +3815,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + '@jridgewell/gen-mapping@0.3.12': dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -3820,11 +3920,25 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@npmcli/agent@3.0.0': + dependencies: + agent-base: 7.1.1 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + lru-cache: 10.4.3 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 semver: 7.7.0 + '@npmcli/fs@4.0.0': + dependencies: + semver: 7.7.2 + '@npmcli/move-file@2.0.1': dependencies: mkdirp: 1.0.4 @@ -4200,6 +4314,8 @@ snapshots: abbrev@1.1.1: {} + abbrev@3.0.1: {} + agent-base@6.0.2: dependencies: debug: 4.4.0 @@ -4212,6 +4328,8 @@ snapshots: transitivePeerDependencies: - supports-color + agent-base@7.1.4: {} + agentkeepalive@4.5.0: dependencies: humanize-ms: 1.2.1 @@ -4253,7 +4371,7 @@ snapshots: app-builder-bin@5.0.0-alpha.12: {} - app-builder-lib@25.1.8(dmg-builder@26.0.19)(electron-builder-squirrel-windows@25.1.8): + app-builder-lib@25.1.8(dmg-builder@26.1.0)(electron-builder-squirrel-windows@25.1.8): dependencies: '@develar/schema-utils': 2.6.5 '@electron/notarize': 2.5.0 @@ -4269,11 +4387,11 @@ snapshots: chromium-pickle-js: 0.2.0 config-file-ts: 0.2.8-rc1 debug: 4.4.0 - dmg-builder: 26.0.19(electron-builder-squirrel-windows@25.1.8) + dmg-builder: 26.1.0(electron-builder-squirrel-windows@25.1.8) dotenv: 16.4.5 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.0.19) + electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.1.0) electron-publish: 25.1.7 form-data: 4.0.1 fs-extra: 10.1.0 @@ -4293,29 +4411,29 @@ snapshots: - bluebird - supports-color - app-builder-lib@26.0.19(dmg-builder@26.0.19)(electron-builder-squirrel-windows@25.1.8): + app-builder-lib@26.1.0(dmg-builder@26.1.0)(electron-builder-squirrel-windows@25.1.8): dependencies: '@develar/schema-utils': 2.6.5 '@electron/asar': 3.4.1 '@electron/fuses': 1.8.0 '@electron/notarize': 2.5.0 '@electron/osx-sign': 1.3.3 - '@electron/rebuild': 3.7.2 + '@electron/rebuild': 4.0.1 '@electron/universal': 2.0.3 '@malept/flatpak-bundler': 0.4.0 '@types/fs-extra': 9.0.13 async-exit-hook: 2.0.1 - builder-util: 26.0.19 - builder-util-runtime: 9.3.3 + builder-util: 26.1.0 + builder-util-runtime: 9.5.0 chromium-pickle-js: 0.2.0 ci-info: 4.3.0 debug: 4.4.0 - dmg-builder: 26.0.19(electron-builder-squirrel-windows@25.1.8) + dmg-builder: 26.1.0(electron-builder-squirrel-windows@25.1.8) dotenv: 16.4.5 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.0.19) - electron-publish: 26.0.19 + electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.1.0) + electron-publish: 26.1.0 fs-extra: 10.1.0 hosted-git-info: 4.1.0 isbinaryfile: 5.0.4 @@ -4326,13 +4444,12 @@ snapshots: minimatch: 10.0.3 plist: 3.1.0 resedit: 1.7.2 - semver: 7.7.0 + semver: 7.7.2 tar: 6.2.1 temp-file: 3.4.0 tiny-async-pool: 1.3.0 which: 5.0.0 transitivePeerDependencies: - - bluebird - supports-color aproba@2.0.0: {} @@ -4492,7 +4609,7 @@ snapshots: transitivePeerDependencies: - supports-color - builder-util-runtime@9.3.3: + builder-util-runtime@9.5.0: dependencies: debug: 4.4.0 sax: 1.4.1 @@ -4520,12 +4637,12 @@ snapshots: transitivePeerDependencies: - supports-color - builder-util@26.0.19: + builder-util@26.1.0: dependencies: 7zip-bin: 5.2.0 '@types/debug': 4.1.12 app-builder-bin: 5.0.0-alpha.12 - builder-util-runtime: 9.3.3 + builder-util-runtime: 9.5.0 chalk: 4.1.2 ci-info: 4.3.0 cross-spawn: 7.0.6 @@ -4565,6 +4682,21 @@ snapshots: transitivePeerDependencies: - bluebird + cacache@19.0.1: + dependencies: + '@npmcli/fs': 4.0.0 + fs-minipass: 3.0.3 + glob: 10.4.5 + lru-cache: 10.4.3 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 7.0.3 + ssri: 12.0.0 + tar: 7.5.2 + unique-filename: 4.0.0 + cacheable-lookup@5.0.4: {} cacheable-request@7.0.4: @@ -4602,6 +4734,8 @@ snapshots: chownr@2.0.0: {} + chownr@3.0.0: {} + chromium-pickle-js@0.2.0: {} ci-info@3.9.0: {} @@ -4775,17 +4909,16 @@ snapshots: dependencies: path-type: 4.0.0 - dmg-builder@26.0.19(electron-builder-squirrel-windows@25.1.8): + dmg-builder@26.1.0(electron-builder-squirrel-windows@25.1.8): dependencies: - app-builder-lib: 26.0.19(dmg-builder@26.0.19)(electron-builder-squirrel-windows@25.1.8) - builder-util: 26.0.19 + app-builder-lib: 26.1.0(dmg-builder@26.1.0)(electron-builder-squirrel-windows@25.1.8) + builder-util: 26.1.0 fs-extra: 10.1.0 iconv-lite: 0.6.3 js-yaml: 4.1.0 optionalDependencies: dmg-license: 1.0.11 transitivePeerDependencies: - - bluebird - electron-builder-squirrel-windows - supports-color @@ -4813,9 +4946,9 @@ snapshots: dependencies: jake: 10.9.2 - electron-builder-squirrel-windows@25.1.8(dmg-builder@26.0.19): + electron-builder-squirrel-windows@25.1.8(dmg-builder@26.1.0): dependencies: - app-builder-lib: 25.1.8(dmg-builder@26.0.19)(electron-builder-squirrel-windows@25.1.8) + app-builder-lib: 25.1.8(dmg-builder@26.1.0)(electron-builder-squirrel-windows@25.1.8) archiver: 5.3.2 builder-util: 25.1.7 fs-extra: 10.1.0 @@ -4824,20 +4957,19 @@ snapshots: - dmg-builder - supports-color - electron-builder@26.0.19(electron-builder-squirrel-windows@25.1.8): + electron-builder@26.1.0(electron-builder-squirrel-windows@25.1.8): dependencies: - app-builder-lib: 26.0.19(dmg-builder@26.0.19)(electron-builder-squirrel-windows@25.1.8) - builder-util: 26.0.19 - builder-util-runtime: 9.3.3 + app-builder-lib: 26.1.0(dmg-builder@26.1.0)(electron-builder-squirrel-windows@25.1.8) + builder-util: 26.1.0 + builder-util-runtime: 9.5.0 chalk: 4.1.2 ci-info: 4.3.0 - dmg-builder: 26.0.19(electron-builder-squirrel-windows@25.1.8) + dmg-builder: 26.1.0(electron-builder-squirrel-windows@25.1.8) fs-extra: 10.1.0 lazy-val: 1.0.5 simple-update-notifier: 2.0.0 yargs: 17.7.2 transitivePeerDependencies: - - bluebird - electron-builder-squirrel-windows - supports-color @@ -4867,11 +4999,11 @@ snapshots: transitivePeerDependencies: - supports-color - electron-publish@26.0.19: + electron-publish@26.1.0: dependencies: '@types/fs-extra': 9.0.13 - builder-util: 26.0.19 - builder-util-runtime: 9.3.3 + builder-util: 26.1.0 + builder-util-runtime: 9.5.0 chalk: 4.1.2 form-data: 4.0.1 fs-extra: 10.1.0 @@ -4895,7 +5027,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@38.2.1: + electron@39.1.0: dependencies: '@electron/get': 2.0.3 '@types/node': 22.10.1 @@ -5042,6 +5174,10 @@ snapshots: dependencies: pend: 1.2.0 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + filelist@1.0.4: dependencies: minimatch: 5.1.6 @@ -5097,6 +5233,10 @@ snapshots: dependencies: minipass: 3.3.6 + fs-minipass@3.0.3: + dependencies: + minipass: 7.1.2 + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -5534,6 +5674,22 @@ snapshots: - bluebird - supports-color + make-fetch-happen@14.0.3: + dependencies: + '@npmcli/agent': 3.0.0 + cacache: 19.0.1 + http-cache-semantics: 4.1.1 + minipass: 7.1.2 + minipass-fetch: 4.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 5.0.0 + promise-retry: 2.0.1 + ssri: 12.0.0 + transitivePeerDependencies: + - supports-color + matcher@3.0.0: dependencies: escape-string-regexp: 4.0.0 @@ -5589,6 +5745,10 @@ snapshots: dependencies: minipass: 3.3.6 + minipass-collect@2.0.1: + dependencies: + minipass: 7.1.2 + minipass-fetch@2.1.2: dependencies: minipass: 3.3.6 @@ -5597,6 +5757,14 @@ snapshots: optionalDependencies: encoding: 0.1.13 + minipass-fetch@4.0.1: + dependencies: + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 3.1.0 + optionalDependencies: + encoding: 0.1.13 + minipass-flush@1.0.5: dependencies: minipass: 3.3.6 @@ -5622,16 +5790,26 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + mkdirp@1.0.4: {} ms@2.1.3: {} negotiator@0.6.4: {} + negotiator@1.0.0: {} + node-abi@3.71.0: dependencies: semver: 7.7.0 + node-abi@4.17.0: + dependencies: + semver: 7.7.2 + node-addon-api@1.7.2: optional: true @@ -5648,6 +5826,25 @@ snapshots: dependencies: semver: 7.7.0 + node-api-version@0.2.1: + dependencies: + semver: 7.7.2 + + node-gyp@11.5.0: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + graceful-fs: 4.2.11 + make-fetch-happen: 14.0.3 + nopt: 8.1.0 + proc-log: 5.0.0 + semver: 7.7.2 + tar: 7.5.2 + tinyglobby: 0.2.15 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + node-gyp@9.4.1: dependencies: env-paths: 2.2.1 @@ -5671,6 +5868,10 @@ snapshots: dependencies: abbrev: 1.1.1 + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + normalize-path@3.0.0: {} normalize-url@6.1.0: {} @@ -5715,6 +5916,8 @@ snapshots: dependencies: aggregate-error: 3.1.0 + p-map@7.0.3: {} + package-json-from-dist@1.0.1: {} parse5@7.2.1: @@ -5746,6 +5949,8 @@ snapshots: picomatch@4.0.2: {} + picomatch@4.0.3: {} + pkg-prebuilds@0.2.1: dependencies: yargs: 17.7.2 @@ -5757,7 +5962,7 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 - proc-log@2.0.1: {} + proc-log@5.0.0: {} process-nextick-args@2.0.1: {} @@ -5976,6 +6181,8 @@ snapshots: semver@7.7.0: {} + semver@7.7.2: {} + serialize-error@7.0.1: dependencies: type-fest: 0.13.1 @@ -6027,6 +6234,14 @@ snapshots: transitivePeerDependencies: - supports-color + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.0 + socks: 2.8.3 + transitivePeerDependencies: + - supports-color + socks@2.8.3: dependencies: ip-address: 9.0.5 @@ -6073,6 +6288,10 @@ snapshots: sprintf-js@1.1.3: {} + ssri@12.0.0: + dependencies: + minipass: 7.1.2 + ssri@9.0.1: dependencies: minipass: 3.3.6 @@ -6145,6 +6364,14 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tar@7.5.2: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + temp-file@3.4.0: dependencies: async-exit-hook: 2.0.1 @@ -6156,6 +6383,11 @@ snapshots: tiny-typed-emitter@2.1.0: {} + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + tmp-promise@3.0.3: dependencies: tmp: 0.2.3 @@ -6193,10 +6425,18 @@ snapshots: dependencies: unique-slug: 3.0.0 + unique-filename@4.0.0: + dependencies: + unique-slug: 5.0.0 + unique-slug@3.0.0: dependencies: imurmurhash: 0.1.4 + unique-slug@5.0.0: + dependencies: + imurmurhash: 0.1.4 + universalify@0.1.2: {} universalify@2.0.1: {} @@ -6278,6 +6518,8 @@ snapshots: yallist@4.0.0: {} + yallist@5.0.0: {} + yargs-parser@21.1.1: {} yargs@17.7.2: From b32454b5857dcd1506faeb85eaeb186c74588d43 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Wed, 5 Nov 2025 12:26:29 +0100 Subject: [PATCH 677/844] chore: linting --- electron-builder.ts | 2 +- .../settings/components/HeroUpdater.module.css | 4 ++-- src/shelter/settings/components/HeroUpdater.tsx | 17 ++++------------- src/shelter/settings/components/ThemesCard.tsx | 4 +++- src/shelter/settings/pages/SettingsPage.tsx | 2 +- 5 files changed, 11 insertions(+), 18 deletions(-) diff --git a/electron-builder.ts b/electron-builder.ts index 9674804..561658b 100644 --- a/electron-builder.ts +++ b/electron-builder.ts @@ -16,7 +16,7 @@ export const config: Configuration = { "com.apple.security.device.audio-input": true, "com.apple.security.device.camera": true, }, - x64ArchFiles: '{**/koffi.node}', + x64ArchFiles: "{**/koffi.node}", }, linux: { diff --git a/src/shelter/settings/components/HeroUpdater.module.css b/src/shelter/settings/components/HeroUpdater.module.css index ae8fb7d..0f72df4 100644 --- a/src/shelter/settings/components/HeroUpdater.module.css +++ b/src/shelter/settings/components/HeroUpdater.module.css @@ -1,7 +1,7 @@ .hero { background: var(--card-primary-bg); border-radius: 8px; - box-shadow: 0 1.5px 6px rgba(0,0,0,0.08); + box-shadow: 0 1.5px 6px rgba(0, 0, 0, 0.08); padding: 16px 20px; display: flex; flex-direction: column; @@ -14,4 +14,4 @@ .checkButton { width: 120px !important; max-width: 120px !important; -} \ No newline at end of file +} diff --git a/src/shelter/settings/components/HeroUpdater.tsx b/src/shelter/settings/components/HeroUpdater.tsx index 9d01a8b..ab1b950 100644 --- a/src/shelter/settings/components/HeroUpdater.tsx +++ b/src/shelter/settings/components/HeroUpdater.tsx @@ -1,14 +1,7 @@ import { createSignal } from "solid-js"; import classes from "./HeroUpdater.module.css"; const { - ui: { - Button, - ButtonSizes, - Header, - HeaderTags, - Text, - ButtonColors, - }, + ui: { Button, ButtonSizes, Header, HeaderTags, Text, ButtonColors }, } = shelter; const LOGO_URL = "https://github.com/Legcord/Branding/raw/main/assets/legcord-banner.png"; @@ -51,18 +44,16 @@ export const HeroUpdater = () => { Check for Updates )} - + {updateAvailable() === true && ( - <> + <> Update available! )} - {updateAvailable() === false && ( - Your app is up to date. - )} + {updateAvailable() === false && Your app is up to date.}
    ); }; diff --git a/src/shelter/settings/components/ThemesCard.tsx b/src/shelter/settings/components/ThemesCard.tsx index 2cb5ee0..fabbe0d 100644 --- a/src/shelter/settings/components/ThemesCard.tsx +++ b/src/shelter/settings/components/ThemesCard.tsx @@ -50,7 +50,9 @@ export const ThemesCard = (props: { theme: ThemeManifest }) => {
    -
    {props.theme.name}
    +
    + {props.theme.name} +
    by
    {props.theme.author} diff --git a/src/shelter/settings/pages/SettingsPage.tsx b/src/shelter/settings/pages/SettingsPage.tsx index 2ac83af..e368542 100644 --- a/src/shelter/settings/pages/SettingsPage.tsx +++ b/src/shelter/settings/pages/SettingsPage.tsx @@ -78,7 +78,7 @@ export function SettingsPage() { when={ store.settings.transparency !== "none" && window.legcord.platform === "darwin" && - parseInt(window.legcord.osRelease) >= 25 + Number.parseInt(window.legcord.osRelease) >= 25 } >
    Date: Wed, 5 Nov 2025 12:41:14 +0100 Subject: [PATCH 678/844] fix: macOS builds --- electron-builder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/electron-builder.ts b/electron-builder.ts index 561658b..3f5e8fd 100644 --- a/electron-builder.ts +++ b/electron-builder.ts @@ -16,7 +16,7 @@ export const config: Configuration = { "com.apple.security.device.audio-input": true, "com.apple.security.device.camera": true, }, - x64ArchFiles: "{**/koffi.node}", + x64ArchFiles: "{**darwin_x64/koffi.node}", }, linux: { From 4cbc2f613f6c2777ad6bbeca4f8ebc48f906d9aa Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Wed, 5 Nov 2025 12:44:45 +0100 Subject: [PATCH 679/844] fix: macOS builds attempt 2 --- electron-builder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/electron-builder.ts b/electron-builder.ts index 3f5e8fd..34e85a6 100644 --- a/electron-builder.ts +++ b/electron-builder.ts @@ -16,7 +16,7 @@ export const config: Configuration = { "com.apple.security.device.audio-input": true, "com.apple.security.device.camera": true, }, - x64ArchFiles: "{**darwin_x64/koffi.node}", + x64ArchFiles: "{Contents/Resources/app.asar.unpacked/node_modules/koffi/build/koffi/darwin_x64/koffi.node}", }, linux: { From 8df00f39911f5b80bc58011b0f8625b41fb4fb58 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Wed, 5 Nov 2025 12:56:25 +0100 Subject: [PATCH 680/844] fix: koffi macOS builds --- electron-builder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/electron-builder.ts b/electron-builder.ts index 34e85a6..f85cdbd 100644 --- a/electron-builder.ts +++ b/electron-builder.ts @@ -16,7 +16,7 @@ export const config: Configuration = { "com.apple.security.device.audio-input": true, "com.apple.security.device.camera": true, }, - x64ArchFiles: "{Contents/Resources/app.asar.unpacked/node_modules/koffi/build/koffi/darwin_x64/koffi.node}", + x64ArchFiles: "**/node_modules/koffi/**", }, linux: { From fc154d09ae8bdcec1cccd9fad837b1cf192eac54 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 8 Nov 2025 14:51:16 +0100 Subject: [PATCH 681/844] chore: translations update [skip ci] Co-authored-by: Daniel Nylander Translate-URL: https://hosted.weblate.org/projects/armcord/client/sv/ Translation: Legcord/Client --- assets/lang/sv.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/assets/lang/sv.json b/assets/lang/sv.json index 0967ef4..473d228 100644 --- a/assets/lang/sv.json +++ b/assets/lang/sv.json @@ -1 +1,6 @@ -{} +{ + "loading_screen_start": "Startar Legcord…", + "settings-theme-default": "Standard (Anpassad)", + "settings-theme-native": "Inbyggd", + "settings-theme-overlay": "Överlägg" +} From 2398c68c51c19d7301ac7ae2129f35c10adc98a7 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 10 Nov 2025 13:51:38 +0100 Subject: [PATCH 682/844] chore: translations update [skip ci] Co-authored-by: Atopona Translate-URL: https://hosted.weblate.org/projects/armcord/client/zh_Hans/ Translation: Legcord/Client --- assets/lang/zh_Hans.json | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/assets/lang/zh_Hans.json b/assets/lang/zh_Hans.json index 0967ef4..f078935 100644 --- a/assets/lang/zh_Hans.json +++ b/assets/lang/zh_Hans.json @@ -1 +1,30 @@ -{} +{ + "loading_screen_start": "正在启动 Legcord…", + "loading_screen_offline": "你似乎处于离线状态。正在重新启动 ", + "loading_screen_update": "有新版本的 Legcord 可用。请更新到最新版本。", + "setup_question1": "欢迎使用 Legcord 初始化程序", + "setup_offline": "你似乎处于离线状态。请连接到互联网并重新启动 Legcord。", + "setup_question2": "请选择你的 Discord 频道/会话:", + "setup_question3": "是否让 Legcord 处理客户端模组的安装?", + "next": "下一步", + "setup_question4": "请选择你想安装的客户端模组:", + "setup_question5": "你想使用托盘图标吗?", + "settings-bounceOnPing": "收到提醒时在程序坞中弹跳图标", + "settings-bounceOnPing-desc": "收到提及时在程序坞中弹跳应用图标。", + "settings-theme": "窗口样式", + "settings-theme-desc": "窗口样式用于管理 Legcord 所使用的标题栏样式。", + "settings-theme-default": "默认(自定义)", + "settings-theme-native": "原生", + "settings-theme-overlay": "覆盖", + "settings-autoHideMenuBar": "自动隐藏菜单栏", + "settings-autoHideMenuBar-desc": "未使用时自动隐藏菜单栏。", + "settings-sleepInBackground": "后台休眠", + "settings-sleepInBackground-desc": "启用 Chromium 后台节流。启用后可节省电量,但可能导致通知失效。", + "settings-transparency": "透明度", + "settings-transparency-desc": "设置 Legcord 使用的透明模式。", + "settings-transparency-universal": "通用", + "settings-transparency-modern": "现代", + "settings-theme-transparent": "透明", + "settings-transparency-tahoe-warning": "在 MacOS 26 Tahoe 上,启用透明效果可能会导致明显卡顿。", + "settings-popoutPiP": "通话窗口弹出时保持置顶" +} From ee6574804f657908a0cda21c14560b0980ff44fc Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 11 Nov 2025 16:51:24 +0100 Subject: [PATCH 683/844] chore: translations update [skip ci] Co-authored-by: Samuel Translate-URL: https://hosted.weblate.org/projects/armcord/client/pt_BR/ Translation: Legcord/Client --- assets/lang/pt_BR.json | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/assets/lang/pt_BR.json b/assets/lang/pt_BR.json index 0967ef4..f612bfb 100644 --- a/assets/lang/pt_BR.json +++ b/assets/lang/pt_BR.json @@ -1 +1,22 @@ -{} +{ + "loading_screen_start": "Iniciando Legcord…", + "loading_screen_update": "Uma nova versão do Legcord está disponível. Por favor, atualize para a versão mais recente.", + "setup_question1": "Bem-vindo à configuração do Legcord", + "setup_offline": "Você parece estar offline. Por favor, conecte-se à internet e reinicie o Legcord.", + "setup_question2": "Escolha o canal/instância do seu Discord:", + "yes": "Sim", + "no": "Não", + "next": "Próximo", + "settings-theme": "Estilo de janela", + "settings-transparency": "Transparência", + "settings-transparency-desc": "Defina o modo de transparência que o Legcord usa.", + "settings-transparency-universal": "Universal", + "settings-theme-transparent": "Transparente", + "settings-venmic-ignoreVirtual": "Ignorar Dispositivos Virtuais", + "settings-venmic-ignoreVirtual-desc": "Ignorar dispositivos de áudio virtuais.", + "settings-venmic-ignoreDevices": "Ignorar Dispositivos", + "settings-venmic-ignoreDevices-desc": "Ignorar dispositivos de áudio específicos.", + "settings-venmic-onlySpeakers": "Apenas Alto-falantes", + "settings-audio": "Áudio", + "settings-audio-desc": "Selecione o método que o Legcord usa para capturar o áudio do seu sistema durante o compartilhamento de tela." +} From 94128d8fbcac0a14af4c529b29e0d91b0b997796 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Thu, 13 Nov 2025 04:51:29 +0100 Subject: [PATCH 684/844] chore: translations update [skip ci] Co-authored-by: Arif Budiman Translate-URL: https://hosted.weblate.org/projects/armcord/client/id/ Translation: Legcord/Client --- assets/lang/id.json | 136 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 135 insertions(+), 1 deletion(-) diff --git a/assets/lang/id.json b/assets/lang/id.json index 0967ef4..b8e1902 100644 --- a/assets/lang/id.json +++ b/assets/lang/id.json @@ -1 +1,135 @@ -{} +{ + "loading_screen_start": "Mulai Legcord…", + "loading_screen_offline": "Anda tampaknya sedang offline. Silakan restart. ", + "loading_screen_update": "Versi baru Legcord kini tersedia. Silakan perbarui ke versi terbaru.", + "setup_question1": "Selamat datang di Pengaturan Legcord", + "setup_offline": "Anda tampaknya sedang offline. Silakan sambungkan ke internet dan restart Legcord.", + "setup_question2": "Pilih saluran/instans Discord Anda:", + "setup_question3": "Apakah Legcord harus menangani instalasi modifikasi klien?", + "yes": "Ya", + "no": "Tidak", + "next": "Selanjutnya", + "setup_question4": "Pilih mod klien yang ingin Anda instal:", + "setup_question5": "Apakah Anda ingin menggunakan ikon tray?", + "settings-bounceOnPing": "Memantul di dock saat ping", + "settings-bounceOnPing-desc": "Ketuk aplikasi di dock saat Anda menerima notifikasi.", + "settings-theme": "Gaya jendela", + "settings-theme-desc": "Gaya jendela menentukan bilah judul yang digunakan oleh Legcord.", + "settings-theme-default": "Default (Kustom)", + "settings-theme-native": "Asli", + "settings-theme-overlay": "Tumpang tindih", + "settings-autoHideMenuBar": "Sembunyikan bilah menu secara otomatis", + "settings-autoHideMenuBar-desc": "Sembunyikan bilah menu secara otomatis saat tidak digunakan.", + "settings-sleepInBackground": "Tidur di latar belakang", + "settings-sleepInBackground-desc": "Mengaktifkan pembatasan kecepatan latar belakang Chromium. Hal ini dapat membantu menghemat daya baterai, tetapi juga dapat mengganggu notifikasi.", + "settings-transparency": "Transparansi", + "settings-transparency-desc": "Atur mode transparansi yang digunakan oleh Legcord.", + "settings-transparency-universal": "Universal", + "settings-transparency-modern": "Modern", + "settings-theme-transparent": "Transparan", + "settings-transparency-tahoe-warning": "Transparansi dapat menyebabkan lag berlebihan pada MacOS 26 Tahoe.", + "settings-popoutPiP": "Panggilan Popout Selalu di Atas", + "settings-popoutPiP-desc": "Saat diaktifkan, jendela popout panggilan akan berada dalam mode Selalu di Atas.", + "settings-venmic-workaround": "Solusi sementara", + "settings-venmic-workaround-desc": "Aktifkan atau nonaktifkan solusi sementara untuk masalah yang menyebabkan mikrofon dibagikan alih-alih audio yang benar.", + "settings-venmic-deviceSelect": "Pilih Perangkat", + "settings-venmic-deviceSelect-desc": "Izinkan pemilihan perangkat audio.", + "settings-venmic-granularSelect": "Pilihan Granular", + "settings-venmic-granularSelect-desc": "Izinkan pemilihan sumber masukan audio.", + "settings-venmic-ignoreVirtual": "Abaikan Perangkat Virtual", + "settings-venmic-ignoreVirtual-desc": "Abaikan perangkat audio virtual.", + "settings-venmic-ignoreDevices": "Abaikan Perangkat", + "settings-venmic-ignoreDevices-desc": "Abaikan perangkat audio tertentu.", + "settings-venmic-ignoreInputMedia": "Abaikan Media Masukan", + "settings-venmic-ignoreInputMedia-desc": "Abaikan masukan audio dari sumber media.", + "settings-venmic-onlySpeakers": "Hanya Pembicara", + "settings-venmic-onlySpeakers-desc": "Hanya gunakan speaker untuk pemilihan audio.", + "settings-venmic-onlyDefaultSpeakers": "Hanya Pengeras Suara Default", + "settings-venmic-onlyDefaultSpeakers-desc": "Hanya gunakan speaker bawaan untuk pemilihan audio.", + "settings-audio": "Audio", + "settings-audio-desc": "Pilih metode yang digunakan Legcord untuk mengambil audio dari sistem Anda selama berbagi layar.", + "settings-openCustomIconDialog": "Atur ikon desktop", + "settings-csp-desc": "Legcord CSP adalah sistem kami yang mengelola pemuatan konten kustom ke dalam aplikasi Discord. Fitur seperti mod klien dan tema bergantung padanya. Nonaktifkan jika Anda ingin menghapus mod dan gaya kustom.", + "settings-mintoTray": "Bekerja di latar belakang", + "settings-mintoTray-desc": "Ketika dinonaktifkan, Legcord akan ditutup seperti jendela lainnya saat ditutup, sedangkan jika tidak, ia akan tetap berada di area sistem tray Anda untuk digunakan nanti.", + "settings-startMinimized": "Mulai dalam mode minimized", + "settings-startMinimized-desc": "Legcord berjalan di latar belakang dan tidak mengganggu Anda.", + "settings-useSystemCssEditor": "Gunakan editor CSS sistem", + "settings-useSystemCssEditor-desc": "Gunakan editor CSS sistem untuk mengedit CSS.", + "settings-MultiInstance": "Multi Instans", + "settings-MultiInstance-desc": "Ketika diaktifkan, Anda akan dapat menjalankan banyak instance Legcord.", + "settings-noBundleUpdates": "Tidak ada pembaruan paket", + "settings-noBundleUpdates-desc": "Menonaktifkan pembaruan otomatis untuk mod klien.", + "settings-hardwareAcceleration": "Percepatan perangkat keras", + "settings-hardwareAcceleration-desc": "Peningkatan kinerja perangkat keras menggunakan GPU Anda untuk membuat Legcord berjalan lebih cepat. Jika Anda mengalami gangguan visual, coba nonaktifkan fitur ini.", + "settings-blockPowerSavingInVoiceChat": "Nonaktifkan penghematan daya dalam obrolan suara", + "settings-blockPowerSavingInVoiceChat-desc": "Mencegah Legcord agar tidak ditangguhkan. Menjaga sistem tetap aktif tetapi memungkinkan layar dimatikan.", + "settings-mobileMode": "Mode seluler", + "settings-mobileMode-desc": "Jika Anda menggunakan perangkat dengan layar sentuh, fitur ini cocok untuk Anda! Fitur ini mengaktifkan mode seluler tersembunyi Discord yang dirancang untuk ponsel dan tablet. Satu-satunya fitur utama yang tidak tersedia adalah dukungan obrolan suara. Ini ideal untuk\n pengguna PinePhone dan perangkat serupa.", + "settings-spellcheck": "Pemeriksa ejaan", + "settings-spellcheck-desc": "Membantu Anda memperbaiki kata-kata yang salah eja dengan menyorotinya.", + "settings-channel": "Saluran Discord", + "settings-channel-desc": "Gunakan pengaturan ini untuk mengubah instance Discord yang sedang dijalankan oleh Legcord.", + "settings-bitrateMin": "Bitrate minimum", + "settings-bitrateMin-desc": "Bitrate minimum untuk berbagi layar.", + "settings-bitrateMax": "Bitrate maksimum", + "settings-bitrateMax-desc": "Bitrate maksimum untuk berbagi layar.", + "settings-bitrateTarget": "Bitrate target", + "settings-bitrateTarget-desc": "Bitrate target untuk berbagi layar.", + "settings-invitewebsocket": "Rich Presence", + "settings-invitewebsocket-desc": "Menggunakan arRPC untuk mendukung Discord RPC (Rich Presence) dengan program lokal di mesin Anda.", + "settings-useMacSystemPicker": "Gunakan pemilih sistem macOS", + "settings-useMacSystemPicker-desc": "Gunakan fitur berbagi layar bawaan macOS jika memungkinkan. Hanya untuk macOS 15 ke atas", + "settings-additionalArguments": "Argumen tambahan", + "settings-additionalArguments-desc": "Argumen tambahan adalah perintah tambahan yang dapat Anda berikan ke Legcord. Argumen ini dapat digunakan untuk mengaktifkan atau menonaktifkan fitur, atau untuk memperbaiki masalah.", + "settings-mod": "Modifikasi klien", + "settings-mod-desc1": "Modifikasi klien adalah program yang memungkinkan Anda menyesuaikan pengalaman Discord Anda. Mereka dapat mengubah tampilan klien, memodifikasi perilaku, atau menambahkan fitur baru!", + "settings-mod-vencord": "Mod klien yang ringan dan mudah digunakan. Dilengkapi dengan toko bawaan untuk plugin.", + "settings-mod-equicord": "Bercabang dan dikembangkan oleh kontributor vencord, dengan klien yang kaya akan plugin.", + "settings-prfmMode": "Mode kinerja", + "settings-prfmMode-desc": "Mode Kinerja adalah fitur eksperimental di Legcord yang dirancang untuk mengoptimalkan responsivitas dan kinerja sesuai dengan kebutuhan Anda. Dampak yang dihasilkan dapat bervariasi tergantung pada spesifikasi perangkat keras dan pola penggunaan Anda, jadi kami menyarankan Anda untuk mencoba setiap mode untuk menentukan mana yang paling sesuai dengan kebutuhan Anda.", + "settings-prfmMode-performance": "Kinerja", + "settings-prfmMode-battery": "Baterai", + "settings-prfmMode-dynamic": "Dinamis", + "settings-prfmMode-vaapi": "VAAPI", + "settings-disableAutogain": "Nonaktifkan autogain", + "settings-disableAutogain-desc": "Menonaktifkan autogain.", + "settings-disableHttpCache": "Nonaktifkan cache HTTP", + "settings-disableHttpCache-desc": "Menonaktifkan cache HTTP Chromium. Aktifkan opsi ini jika mod klien tidak termuat untuk Anda.", + "settings-trayIcon": "Ikon tray", + "settings-trayIcon-desc": "Tentukan ikon yang akan muncul di menu tray.", + "settings-trayIcon-disabled": "Nonaktifkan tray", + "settings-trayIcon-dynamic": "Dinamis", + "settings-trayIcon-normal": "Ikon Discord", + "settings-trayIcon-classic": "Ikon Discord Klasik", + "settings-trayIcon-colored-plug": "Soket Berwarna", + "settings-trayIcon-white-plug": "Soket Putih", + "settings-trayIcon-white-plug-alt": "Soket Putih Alternatif", + "settings-trayIcon-black-plug": "Soket Hitam", + "settings-trayIcon-black-plug-alt": "Soket Hitam Alternatif", + "settings-advanced": "Zona Pengguna Lanjutan", + "settings-pluginsFolder": "Buka folder plugin", + "settings-crashesFolder": "Buka folder crash asli", + "settings-themesFolder": "Buka folder tema", + "settings-storageFolder": "Buka folder penyimpanan", + "settings-none": "Tidak ada", + "settings-save": "Simpan Pengaturan", + "settings-experimental": "Eksperimental", + "settings-restart": "Mulai Ulang Aplikasi", + "settings-updater": "Periksa pembaruan", + "settings-skipSplash": "Lewati Layar Pembuka", + "settings-skipSplash-desc": "Lewati layar splash Legcord saat Anda membuka aplikasi.", + "settings-copyDebugInfo": "Salin Informasi Debug", + "settings-copyGPUInfo": "Salin Informasi GPU", + "settings-clearClientModCache": "Hapus cache mod klien", + "settings-forceNativeCrash": "Paksa crash aplikasi asli", + "settings-smoothScroll": "Gunakan pengguliran halus", + "settings-smoothScroll-desc": "Aktifkan/nonaktifkan pengguliran halus", + "settings-autoScroll": "Izinkan gulir otomatis", + "settings-autoScroll-desc": "Izinkan pengguliran otomatis dengan klik tengah (Catatan: Lingkungan desktop Anda masih dapat mengganti pengaturan ini dengan tindakan lain)", + "settings-category-lookAndFeel": "Penampilan dan nuansa", + "settings-category-mods": "Modifikasi", + "settings-category-behaviour": "Perilaku", + "settings-category-legacy": "Fitur warisan", + "settings-category-debug": "Opsi debug" +} From d35183a89aa9734e5cdefc28ced24b9f79cbb458 Mon Sep 17 00:00:00 2001 From: Kamerzystanasyt <91615271+Alangopro@users.noreply.github.com> Date: Wed, 10 Dec 2025 12:21:52 +0100 Subject: [PATCH 685/844] fix: youtube adblock issue. (#979) --- src/discord/window.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/discord/window.ts b/src/discord/window.ts index b755a4c..5f4a620 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -105,7 +105,7 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { frame.url.includes("youtube.com/embed/") || (frame.url.includes("discordsays") && frame.url.includes("youtube.com")) ) { - await frame.executeJavaScript(readFileSync(path.join(__dirname, "js/adguard.js"), "utf-8")); + await frame.executeJavaScript(readFileSync(path.join(__dirname, "assets/js/adguard.js"), "utf-8")); } }); }); From 77c11f65d1e0844cd795bb7c92636177d3947279 Mon Sep 17 00:00:00 2001 From: Pierre Kancir Date: Wed, 10 Dec 2025 12:22:38 +0100 Subject: [PATCH 686/844] chore: add installation instructions for Deb (#972) [skip ci] --- README.md | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 77346fa..aec2315 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,37 @@ winget install --id=smartfrigde.Legcord -e Not available yet. -### Debian, Ubuntu and Raspbian repository +### Debian, Ubuntu and Raspbian + +#### Install via .deb from GitHub Releases + +You can install Legcord directly using the `.deb` packages published on the GitHub Releases page. + +1. Go to the Releases page: https://github.com/Legcord/Legcord/releases +2. Download the `.deb` that matches your architecture: + - `amd64` (most Intel/AMD 64‑bit PCs) + - `arm64` (AArch64, e.g. Raspberry Pi 4/5 64‑bit, ARM laptops) +3. Install the downloaded file (this resolves dependencies automatically): + +```sh +sudo apt install ./.deb +``` + +Alternatively, you can copy the asset link from the release and install via terminal: + +```sh +# Replace the URL below with the copied link to the .deb asset from the Releases page +wget -O legcord.deb "https://github.com/Legcord/Legcord/releases/download//.deb" +sudo apt install legcord.deb +``` + +If your system reports missing dependencies, you can also use this fallback: + +```sh +sudo dpkg -i .deb || sudo apt -f install +``` + +#### Alternative: pacstall legcord-deb is available on [pacstall](https://pacstall.dev/packages/legcord-deb) ```sh From 57102c1d368d863741c598ac67dce750c78f1c0c Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Wed, 10 Dec 2025 12:58:24 +0100 Subject: [PATCH 687/844] chore: bump dependencies electron and electron-builder --- package.json | 4 +- pnpm-lock.yaml | 159 ++++++++++++++++++++++++------------------------- 2 files changed, 79 insertions(+), 84 deletions(-) diff --git a/package.json b/package.json index bda5191..5666351 100644 --- a/package.json +++ b/package.json @@ -43,8 +43,8 @@ "@uwu/lune": "^1.5.1", "@uwu/shelter-defs": "^1.4.1", "babel-preset-solid": "^1.9.3", - "electron": "39.1.0", - "electron-builder": "^26.0.20", + "electron": "39.2.6", + "electron-builder": "^26.3.5", "lucide-solid": "^0.475.0", "rolldown": "1.0.0-beta.31", "rollup-plugin-copy": "^3.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c35792a..9e14e27 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -62,11 +62,11 @@ importers: specifier: ^1.9.3 version: 1.9.3(@babel/core@7.26.7) electron: - specifier: 39.1.0 - version: 39.1.0 + specifier: 39.2.6 + version: 39.2.6 electron-builder: - specifier: ^26.0.20 - version: 26.1.0(electron-builder-squirrel-windows@25.1.8) + specifier: ^26.3.5 + version: 26.3.5(electron-builder-squirrel-windows@25.1.8) lucide-solid: specifier: ^0.475.0 version: 0.475.0(solid-js@1.9.3) @@ -1278,10 +1278,6 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} - agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -1339,12 +1335,12 @@ packages: dmg-builder: 25.1.8 electron-builder-squirrel-windows: 25.1.8 - app-builder-lib@26.1.0: - resolution: {integrity: sha512-dxWEGIgTTPD8OiYN8X6n3PV31+DFwvP9pyXCFDsV5fyt6g+0TMZUVXrCRrSPj0+X/phBPad5sNPLLvBRDVDPaQ==} + app-builder-lib@26.3.5: + resolution: {integrity: sha512-AluSgBV7oWEE6wqC80S4drTTBWB8opxBgRGa8kSClRhULttN7pKiRz5K/74rCUi7XkstggtdQALsI6zCqenNzA==} engines: {node: '>=14.0.0'} peerDependencies: - dmg-builder: 26.1.0 - electron-builder-squirrel-windows: 26.1.0 + dmg-builder: 26.3.5 + electron-builder-squirrel-windows: 26.3.5 aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -1468,15 +1464,15 @@ packages: resolution: {integrity: sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ==} engines: {node: '>=12.0.0'} - builder-util-runtime@9.5.0: - resolution: {integrity: sha512-7qmRMH8X/IzDM+1TysKNFo5cNWBbfacdLX4EqkuE5aiRTECAlYiKHSqEc6cc3c4Lrmpgk0utbxOPkj0iYaWAWQ==} + builder-util-runtime@9.5.1: + resolution: {integrity: sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==} engines: {node: '>=12.0.0'} builder-util@25.1.7: resolution: {integrity: sha512-7jPjzBwEGRbwNcep0gGNpLXG9P94VA3CPAZQCzxkFXiV2GMQKlziMbY//rXPI7WKfhsvGgFXjTcXdBEwgXw9ww==} - builder-util@26.1.0: - resolution: {integrity: sha512-BTUhmpkCuEAAUmc8EJkJOg7fMGsDSSRMPn1QTpoUpYpGp3SjyJV18LlCPTu3+UBfuQ/5ua7KqDLrsK9NAXO7fg==} + builder-util@26.3.4: + resolution: {integrity: sha512-aRn88mYMktHxzdqDMF6Ayj0rKoX+ZogJ75Ck7RrIqbY/ad0HBvnS2xA4uHfzrGr5D2aLL3vU6OBEH4p0KMV2XQ==} cacache@16.1.3: resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} @@ -1528,6 +1524,10 @@ packages: resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} engines: {node: '>=8'} + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + engines: {node: '>=8'} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -1698,8 +1698,8 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dmg-builder@26.1.0: - resolution: {integrity: sha512-0eXB7qX9YHiQ2o83EMgC8A6VQ7BfCFP8zxlhUtqtvqy1nEVIZa8XbOAcIiP8ne58RhwLYKV2LCcfN1OImXFEWg==} + dmg-builder@26.3.5: + resolution: {integrity: sha512-3qXWrP5zWswQi3EqFQyQWMkAHpwMdNDoVaJfqbfLPqX1umq7m+Fav30mQd6Sk7nXH+YvrrjjoeIfif/PH/l1mQ==} dmg-license@1.0.11: resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} @@ -1726,8 +1726,8 @@ packages: electron-builder-squirrel-windows@25.1.8: resolution: {integrity: sha512-2ntkJ+9+0GFP6nAISiMabKt6eqBB0kX1QqHNWFWAXgi0VULKGisM46luRFpIBiU3u/TDmhZMM8tzvo2Abn3ayg==} - electron-builder@26.1.0: - resolution: {integrity: sha512-dvy9sODWE7uqz7l68copgAtO2EKumdkLqCgooNWl7bSFjrubMmjf2hVS6iwSrcb7hLHL02OULBPNp45aeGAcpA==} + electron-builder@26.3.5: + resolution: {integrity: sha512-I0HNjrWEGnCKDsQ9GkFa92E1hW/FmKe88bh75jucBoHRIcZUvTwbqJFGn9kKG6cFq9eOWCXOEVs+RvXT/Ma49Q==} engines: {node: '>=14.0.0'} hasBin: true @@ -1746,8 +1746,8 @@ packages: electron-publish@25.1.7: resolution: {integrity: sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg==} - electron-publish@26.1.0: - resolution: {integrity: sha512-GwghDIOk5vzNtbiMeXHEIRN+9hPR8cqTOSzMidX4vCC7U9GFh8whruhFhAyaI6MY5YlyTNmT7z6LpLlO8ncOWw==} + electron-publish@26.3.4: + resolution: {integrity: sha512-5/ouDPb73SkKuay2EXisPG60LTFTMNHWo2WLrK5GDphnWK9UC+yzYrzVeydj078Yk4WUXi0+TaaZsNd6Zt5k/A==} electron-to-chromium@1.5.90: resolution: {integrity: sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==} @@ -1755,8 +1755,8 @@ packages: electron-updater@6.6.2: resolution: {integrity: sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==} - electron@39.1.0: - resolution: {integrity: sha512-vPRbKKQUzKWZZX68fuYdz4iS/eavGcQkHOGK4ylv0YJLbBRxxUlflPRdqRGflFjwid+sja7gbNul2lArevYwrw==} + electron@39.2.6: + resolution: {integrity: sha512-dHBgTodWBZd+tL1Dt0PSh/CFLHeDkFCTKCTXu1dgPhlE9Z3k2zzlBQ9B2oW55CFsKanBDHiUomHJNw0XaSdQpA==} engines: {node: '>= 12.20.55'} hasBin: true @@ -2513,9 +2513,6 @@ packages: node-api-headers@1.5.0: resolution: {integrity: sha512-Yi/FgnN8IU/Cd6KeLxyHkylBUvDTsSScT0Tna2zTrz8klmc8qF2ppj6Q1LHsmOueJWhigQwR4cO2p0XBGW5IaQ==} - node-api-version@0.2.0: - resolution: {integrity: sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==} - node-api-version@0.2.1: resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} @@ -2825,6 +2822,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + serialize-error@7.0.1: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} @@ -3574,11 +3576,11 @@ snapshots: fs-extra: 10.1.0 got: 11.8.6 node-abi: 3.71.0 - node-api-version: 0.2.0 + node-api-version: 0.2.1 node-gyp: 9.4.1 ora: 5.4.1 read-binary-file-arch: 1.0.6 - semver: 7.7.0 + semver: 7.7.2 tar: 6.2.1 yargs: 17.7.2 transitivePeerDependencies: @@ -3598,7 +3600,7 @@ snapshots: node-gyp: 11.5.0 ora: 5.4.1 read-binary-file-arch: 1.0.6 - semver: 7.7.2 + semver: 7.7.3 tar: 6.2.1 yargs: 17.7.2 transitivePeerDependencies: @@ -3922,7 +3924,7 @@ snapshots: '@npmcli/agent@3.0.0': dependencies: - agent-base: 7.1.1 + agent-base: 7.1.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 lru-cache: 10.4.3 @@ -3933,11 +3935,11 @@ snapshots: '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 - semver: 7.7.0 + semver: 7.7.2 '@npmcli/fs@4.0.0': dependencies: - semver: 7.7.2 + semver: 7.7.3 '@npmcli/move-file@2.0.1': dependencies: @@ -4322,12 +4324,6 @@ snapshots: transitivePeerDependencies: - supports-color - agent-base@7.1.1: - dependencies: - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - agent-base@7.1.4: {} agentkeepalive@4.5.0: @@ -4371,7 +4367,7 @@ snapshots: app-builder-bin@5.0.0-alpha.12: {} - app-builder-lib@25.1.8(dmg-builder@26.1.0)(electron-builder-squirrel-windows@25.1.8): + app-builder-lib@25.1.8(dmg-builder@26.3.5)(electron-builder-squirrel-windows@25.1.8): dependencies: '@develar/schema-utils': 2.6.5 '@electron/notarize': 2.5.0 @@ -4387,11 +4383,11 @@ snapshots: chromium-pickle-js: 0.2.0 config-file-ts: 0.2.8-rc1 debug: 4.4.0 - dmg-builder: 26.1.0(electron-builder-squirrel-windows@25.1.8) + dmg-builder: 26.3.5(electron-builder-squirrel-windows@25.1.8) dotenv: 16.4.5 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.1.0) + electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.3.5) electron-publish: 25.1.7 form-data: 4.0.1 fs-extra: 10.1.0 @@ -4404,14 +4400,14 @@ snapshots: minimatch: 10.0.3 resedit: 1.7.2 sanitize-filename: 1.6.3 - semver: 7.7.0 + semver: 7.7.2 tar: 6.2.1 temp-file: 3.4.0 transitivePeerDependencies: - bluebird - supports-color - app-builder-lib@26.1.0(dmg-builder@26.1.0)(electron-builder-squirrel-windows@25.1.8): + app-builder-lib@26.3.5(dmg-builder@26.3.5)(electron-builder-squirrel-windows@25.1.8): dependencies: '@develar/schema-utils': 2.6.5 '@electron/asar': 3.4.1 @@ -4423,17 +4419,17 @@ snapshots: '@malept/flatpak-bundler': 0.4.0 '@types/fs-extra': 9.0.13 async-exit-hook: 2.0.1 - builder-util: 26.1.0 - builder-util-runtime: 9.5.0 + builder-util: 26.3.4 + builder-util-runtime: 9.5.1 chromium-pickle-js: 0.2.0 - ci-info: 4.3.0 + ci-info: 4.3.1 debug: 4.4.0 - dmg-builder: 26.1.0(electron-builder-squirrel-windows@25.1.8) + dmg-builder: 26.3.5(electron-builder-squirrel-windows@25.1.8) dotenv: 16.4.5 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.1.0) - electron-publish: 26.1.0 + electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.3.5) + electron-publish: 26.3.4 fs-extra: 10.1.0 hosted-git-info: 4.1.0 isbinaryfile: 5.0.4 @@ -4444,7 +4440,7 @@ snapshots: minimatch: 10.0.3 plist: 3.1.0 resedit: 1.7.2 - semver: 7.7.2 + semver: 7.7.3 tar: 6.2.1 temp-file: 3.4.0 tiny-async-pool: 1.3.0 @@ -4609,7 +4605,7 @@ snapshots: transitivePeerDependencies: - supports-color - builder-util-runtime@9.5.0: + builder-util-runtime@9.5.1: dependencies: debug: 4.4.0 sax: 1.4.1 @@ -4637,14 +4633,13 @@ snapshots: transitivePeerDependencies: - supports-color - builder-util@26.1.0: + builder-util@26.3.4: dependencies: 7zip-bin: 5.2.0 '@types/debug': 4.1.12 app-builder-bin: 5.0.0-alpha.12 - builder-util-runtime: 9.5.0 + builder-util-runtime: 9.5.1 chalk: 4.1.2 - ci-info: 4.3.0 cross-spawn: 7.0.6 debug: 4.4.0 fs-extra: 10.1.0 @@ -4742,6 +4737,8 @@ snapshots: ci-info@4.3.0: {} + ci-info@4.3.1: {} + clean-stack@2.2.0: {} cli-cursor@3.1.0: @@ -4909,10 +4906,10 @@ snapshots: dependencies: path-type: 4.0.0 - dmg-builder@26.1.0(electron-builder-squirrel-windows@25.1.8): + dmg-builder@26.3.5(electron-builder-squirrel-windows@25.1.8): dependencies: - app-builder-lib: 26.1.0(dmg-builder@26.1.0)(electron-builder-squirrel-windows@25.1.8) - builder-util: 26.1.0 + app-builder-lib: 26.3.5(dmg-builder@26.3.5)(electron-builder-squirrel-windows@25.1.8) + builder-util: 26.3.4 fs-extra: 10.1.0 iconv-lite: 0.6.3 js-yaml: 4.1.0 @@ -4946,9 +4943,9 @@ snapshots: dependencies: jake: 10.9.2 - electron-builder-squirrel-windows@25.1.8(dmg-builder@26.1.0): + electron-builder-squirrel-windows@25.1.8(dmg-builder@26.3.5): dependencies: - app-builder-lib: 25.1.8(dmg-builder@26.1.0)(electron-builder-squirrel-windows@25.1.8) + app-builder-lib: 25.1.8(dmg-builder@26.3.5)(electron-builder-squirrel-windows@25.1.8) archiver: 5.3.2 builder-util: 25.1.7 fs-extra: 10.1.0 @@ -4957,14 +4954,14 @@ snapshots: - dmg-builder - supports-color - electron-builder@26.1.0(electron-builder-squirrel-windows@25.1.8): + electron-builder@26.3.5(electron-builder-squirrel-windows@25.1.8): dependencies: - app-builder-lib: 26.1.0(dmg-builder@26.1.0)(electron-builder-squirrel-windows@25.1.8) - builder-util: 26.1.0 - builder-util-runtime: 9.5.0 + app-builder-lib: 26.3.5(dmg-builder@26.3.5)(electron-builder-squirrel-windows@25.1.8) + builder-util: 26.3.4 + builder-util-runtime: 9.5.1 chalk: 4.1.2 ci-info: 4.3.0 - dmg-builder: 26.1.0(electron-builder-squirrel-windows@25.1.8) + dmg-builder: 26.3.5(electron-builder-squirrel-windows@25.1.8) fs-extra: 10.1.0 lazy-val: 1.0.5 simple-update-notifier: 2.0.0 @@ -4999,11 +4996,11 @@ snapshots: transitivePeerDependencies: - supports-color - electron-publish@26.1.0: + electron-publish@26.3.4: dependencies: '@types/fs-extra': 9.0.13 - builder-util: 26.1.0 - builder-util-runtime: 9.5.0 + builder-util: 26.3.4 + builder-util-runtime: 9.5.1 chalk: 4.1.2 form-data: 4.0.1 fs-extra: 10.1.0 @@ -5027,7 +5024,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@39.1.0: + electron@39.2.6: dependencies: '@electron/get': 2.0.3 '@types/node': 22.10.1 @@ -5314,7 +5311,7 @@ snapshots: es6-error: 4.1.1 matcher: 3.0.0 roarr: 2.15.4 - semver: 7.7.0 + semver: 7.7.2 serialize-error: 7.0.1 optional: true @@ -5397,7 +5394,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.1 + agent-base: 7.1.4 debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -5416,7 +5413,7 @@ snapshots: https-proxy-agent@7.0.5: dependencies: - agent-base: 7.1.1 + agent-base: 7.1.4 debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -5804,11 +5801,11 @@ snapshots: node-abi@3.71.0: dependencies: - semver: 7.7.0 + semver: 7.7.2 node-abi@4.17.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 node-addon-api@1.7.2: optional: true @@ -5822,13 +5819,9 @@ snapshots: node-api-headers@1.5.0: optional: true - node-api-version@0.2.0: - dependencies: - semver: 7.7.0 - node-api-version@0.2.1: dependencies: - semver: 7.7.2 + semver: 7.7.3 node-gyp@11.5.0: dependencies: @@ -5838,7 +5831,7 @@ snapshots: make-fetch-happen: 14.0.3 nopt: 8.1.0 proc-log: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 tar: 7.5.2 tinyglobby: 0.2.15 which: 5.0.0 @@ -5855,7 +5848,7 @@ snapshots: nopt: 6.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.7.0 + semver: 7.7.2 tar: 6.2.1 which: 2.0.2 transitivePeerDependencies: @@ -6183,6 +6176,8 @@ snapshots: semver@7.7.2: {} + semver@7.7.3: {} + serialize-error@7.0.1: dependencies: type-fest: 0.13.1 @@ -6208,7 +6203,7 @@ snapshots: simple-update-notifier@2.0.0: dependencies: - semver: 7.7.0 + semver: 7.7.2 slash@3.0.0: {} From eb61840f6aee72a135e928c273e86d195839c391 Mon Sep 17 00:00:00 2001 From: Liam Rooney <80072393+lbrooney@users.noreply.github.com> Date: Sun, 14 Dec 2025 22:15:34 -0800 Subject: [PATCH 688/844] equicord added new headerbar api which collides with exit buttons (#990) --- assets/app/css/linuxTitlebar.css | 2 +- assets/app/css/winTitlebar.css | 2 +- src/shelter/titlebar/index.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/app/css/linuxTitlebar.css b/assets/app/css/linuxTitlebar.css index 1e2eaf8..ff67592 100644 --- a/assets/app/css/linuxTitlebar.css +++ b/assets/app/css/linuxTitlebar.css @@ -1,4 +1,4 @@ -[legcord-platform="linux"] a[href="https://support.discord.com"] { +[legcord-platform="linux"] div[class^="trailing_"] { margin-right: 150px; } diff --git a/assets/app/css/winTitlebar.css b/assets/app/css/winTitlebar.css index 99ab9cf..6d62976 100644 --- a/assets/app/css/winTitlebar.css +++ b/assets/app/css/winTitlebar.css @@ -1,6 +1,6 @@ /* Legcord on Windows */ -[legcord-platform="win32"] a[href="https://support.discord.com"] { +[legcord-platform="win32"] div[class^="trailing_"] { margin-right: 150px; } diff --git a/src/shelter/titlebar/index.ts b/src/shelter/titlebar/index.ts index 1db05db..e038783 100644 --- a/src/shelter/titlebar/index.ts +++ b/src/shelter/titlebar/index.ts @@ -24,7 +24,7 @@ function injectButtonControls() { const elem = document.createElement("div"); elem.innerHTML = titlebarNavControls; elem.id = "legcordNavControls"; - document.body.prepend(elem); + document.body.append(elem); const minimize = document.getElementById("minimize"); const maximize = document.getElementById("maximize"); const quit = document.getElementById("quit"); From baf407ce7cf37b279999ca22ca03b06a44415da7 Mon Sep 17 00:00:00 2001 From: Liam Rooney <80072393+lbrooney@users.noreply.github.com> Date: Sun, 14 Dec 2025 22:16:12 -0800 Subject: [PATCH 689/844] css var name fixed (#989) --- assets/app/css/baseTitlebar.css | 2 +- assets/app/css/darwinTitlebar.css | 12 +-- assets/app/css/linuxTitlebar.css | 32 +++---- assets/app/css/titlebar.css | 88 +++++++++---------- assets/app/css/winTitlebar.css | 32 +++---- .../components/KeybindCard.module.css | 4 +- .../settings/components/ThemesCard.module.css | 4 +- 7 files changed, 87 insertions(+), 87 deletions(-) diff --git a/assets/app/css/baseTitlebar.css b/assets/app/css/baseTitlebar.css index 2cf840c..1d00859 100644 --- a/assets/app/css/baseTitlebar.css +++ b/assets/app/css/baseTitlebar.css @@ -47,6 +47,6 @@ height: 100%; width: 33.3%; text-align: center; - color: var(--interactive-normal); + color: var(--interactive-icon-default); cursor: default; } diff --git a/assets/app/css/darwinTitlebar.css b/assets/app/css/darwinTitlebar.css index 396387a..a9aeb11 100644 --- a/assets/app/css/darwinTitlebar.css +++ b/assets/app/css/darwinTitlebar.css @@ -59,9 +59,9 @@ background-color: #fac536; transition: background-color 0.1s ease-in; border: 1px solid #da9e10; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml,") no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml,") no-repeat 50% 50%; transform: translateX(-21.5px); } @@ -69,9 +69,9 @@ background-color: #39ea49; transition: background-color 0.1s ease-in; border: 1px solid #13c11e; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml,") no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml,") no-repeat 50% 50%; transform: translateX(21.5px); } @@ -79,9 +79,9 @@ background-color: #f25056; transition: background-color 0.1s ease-in; border: 1px solid #d52735; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml,") no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml,") no-repeat 50% 50%; } [legcord-platform="darwin"] #window-controls-container:hover #maximize:active { diff --git a/assets/app/css/linuxTitlebar.css b/assets/app/css/linuxTitlebar.css index ff67592..2d2a369 100644 --- a/assets/app/css/linuxTitlebar.css +++ b/assets/app/css/linuxTitlebar.css @@ -6,19 +6,19 @@ width: 142px; } [legcord-platform="linux"] #window-controls-container #minimize:hover { - background-color: var(--background-modifier-hover); + background-color: var(--interactive-background-hover); transition: 0.2s ease; } [legcord-platform="linux"] #window-controls-container #maximize:hover { - background-color: var(--background-modifier-hover); + background-color: var(--interactive-background-hover); transition: 0.2s ease; } [legcord-platform="linux"] #window-controls-container #minimize:hover #minimize-icon { - background-color: var(--interactive-hover); + background-color: var(--interactive-text-hover); transition: 0.2s ease; } [legcord-platform="linux"] #window-controls-container #maximize:hover #maximize-icon { - background-color: var(--interactive-hover); + background-color: var(--interactive-text-hover); transition: 0.2s ease; } [legcord-platform="linux"] #window-controls-container #quit:hover { @@ -50,35 +50,35 @@ transition: 0.1s ease; } [legcord-platform="linux"] #window-controls-container #quit-icon { - background-color: var(--interactive-normal); + background-color: var(--interactive-icon-default); display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; } [legcord-platform="linux"] #window-controls-container #minimize-icon { - background-color: var(--interactive-normal); + background-color: var(--interactive-icon-default); display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; } [legcord-platform="linux"] #window-controls-container #maximize-icon { - background-color: var(--interactive-normal); + background-color: var(--interactive-icon-default); display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; } [legcord-platform="linux"][isMaximized] #window-controls-container #maximize-icon { - background-color: var(--interactive-normal); + background-color: var(--interactive-icon-default); display: list-item; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml,") no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml,") no-repeat 50% 50%; } diff --git a/assets/app/css/titlebar.css b/assets/app/css/titlebar.css index 296dc97..21cc620 100644 --- a/assets/app/css/titlebar.css +++ b/assets/app/css/titlebar.css @@ -38,7 +38,7 @@ height: 100%; width: 33.3%; text-align: center; - color: var(--interactive-normal); + color: var(--interactive-icon-default); cursor: default; } .titlebar #window-controls-container #spacer { @@ -59,19 +59,19 @@ transform: translateY(-8px); } [legcord-platform="linux"] .titlebar #window-controls-container #minimize:hover { - background-color: var(--background-modifier-hover); + background-color: var(--interactive-background-hover); transition: 0.2s ease; } [legcord-platform="linux"] .titlebar #window-controls-container #maximize:hover { - background-color: var(--background-modifier-hover); + background-color: var(--interactive-background-hover); transition: 0.2s ease; } [legcord-platform="linux"] .titlebar #window-controls-container #minimize:hover #minimize-icon { - background-color: var(--interactive-hover); + background-color: var(--interactive-text-hover); transition: 0.2s ease; } [legcord-platform="linux"] .titlebar #window-controls-container #maximize:hover #maximize-icon { - background-color: var(--interactive-hover); + background-color: var(--interactive-text-hover); transition: 0.2s ease; } [legcord-platform="linux"] .titlebar #window-controls-container #quit:hover { @@ -82,58 +82,58 @@ background-color: #ffffff; display: list-item; transition: 0.1s ease; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; } [legcord-platform="linux"] .titlebar #window-controls-container #minimize-icon { - background-color: var(--interactive-normal); + background-color: var(--interactive-icon-default); display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; } [legcord-platform="linux"] .titlebar #window-controls-container #maximize-icon { - background-color: var(--interactive-normal); + background-color: var(--interactive-icon-default); display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='9' height='9' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; } [legcord-platform="linux"][isMaximized] .titlebar #window-controls-container #maximize-icon { - background-color: var(--interactive-normal); + background-color: var(--interactive-icon-default); display: list-item; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='9' height='9'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml,") no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='9' height='9'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml,") no-repeat 50% 50%; } [legcord-platform="linux"] .titlebar #window-controls-container #minimize { background-color: transparent; transition: 0.1s ease; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml,") no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml,") no-repeat 50% 50%; } [legcord-platform="linux"] .titlebar #window-controls-container #maximize { background-color: transparent; transition: 0.1s ease; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml,") no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml,") no-repeat 50% 50%; } [legcord-platform="linux"] .titlebar #window-controls-container #quit { background-color: var(--brand-experiment); transition: 0.1s ease; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml,") no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='25' height='25'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml,") no-repeat 50% 50%; } [legcord-platform="linux"] .titlebar #window-controls-container #quit:active { @@ -146,19 +146,19 @@ width: 142px; } [legcord-platform="win32"] .titlebar #window-controls-container #minimize:hover { - background-color: var(--background-modifier-hover); + background-color: var(--interactive-background-hover); transition: 0.2s ease; } [legcord-platform="win32"] .titlebar #window-controls-container #maximize:hover { - background-color: var(--background-modifier-hover); + background-color: var(--interactive-background-hover); transition: 0.2s ease; } [legcord-platform="win32"] .titlebar #window-controls-container #minimize:hover #minimize-icon { - background-color: var(--interactive-hover); + background-color: var(--interactive-text-hover); transition: 0.2s ease; } [legcord-platform="win32"] .titlebar #window-controls-container #maximize:hover #maximize-icon { - background-color: var(--interactive-hover); + background-color: var(--interactive-text-hover); transition: 0.2s ease; } [legcord-platform="win32"] .titlebar #window-controls-container #quit:hover { @@ -190,36 +190,36 @@ transition: 0.1s ease; } [legcord-platform="win32"] .titlebar #window-controls-container #quit-icon { - background-color: var(--interactive-normal); + background-color: var(--interactive-icon-default); display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; } [legcord-platform="win32"] .titlebar #window-controls-container #minimize-icon { - background-color: var(--interactive-normal); + background-color: var(--interactive-icon-default); display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; } [legcord-platform="win32"] .titlebar #window-controls-container #maximize-icon { - background-color: var(--interactive-normal); + background-color: var(--interactive-icon-default); display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; } [legcord-platform="win32"][isMaximized] .titlebar #window-controls-container #maximize-icon { - background-color: var(--interactive-normal); + background-color: var(--interactive-icon-default); display: list-item; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml,") no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml,") no-repeat 50% 50%; } @@ -290,9 +290,9 @@ background-color: #fac536; transition: background-color 0.1s ease-in; border: 1px solid #da9e10; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml,") no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml,") no-repeat 50% 50%; transform: translateX(-21.5px); } @@ -300,9 +300,9 @@ background-color: #39ea49; transition: background-color 0.1s ease-in; border: 1px solid #13c11e; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml,") no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml,") no-repeat 50% 50%; transform: translateX(21.5px); } @@ -310,9 +310,9 @@ background-color: #f25056; transition: background-color 0.1s ease-in; border: 1px solid #d52735; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml,") no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='13' height='13'%3E%3Cstyle%3E.a%7Bfill:%23808080%7D%3C/style%3E%3Ccircle class='a' cx='15' cy='15' r='15'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml,") no-repeat 50% 50%; } [legcord-platform="darwin"] .titlebar #window-controls-container:hover #maximize:active { diff --git a/assets/app/css/winTitlebar.css b/assets/app/css/winTitlebar.css index 6d62976..793a6ed 100644 --- a/assets/app/css/winTitlebar.css +++ b/assets/app/css/winTitlebar.css @@ -8,19 +8,19 @@ width: 142px; } [legcord-platform="win32"] #window-controls-container #minimize:hover { - background-color: var(--background-modifier-hover); + background-color: var(--interactive-background-hover); transition: 0.2s ease; } [legcord-platform="win32"] #window-controls-container #maximize:hover { - background-color: var(--background-modifier-hover); + background-color: var(--interactive-background-hover); transition: 0.2s ease; } [legcord-platform="win32"] #window-controls-container #minimize:hover #minimize-icon { - background-color: var(--interactive-hover); + background-color: var(--interactive-text-hover); transition: 0.2s ease; } [legcord-platform="win32"] #window-controls-container #maximize:hover #maximize-icon { - background-color: var(--interactive-hover); + background-color: var(--interactive-text-hover); transition: 0.2s ease; } [legcord-platform="win32"] #window-controls-container #quit:hover { @@ -52,35 +52,35 @@ transition: 0.1s ease; } [legcord-platform="win32"] #window-controls-container #quit-icon { - background-color: var(--interactive-normal); + background-color: var(--interactive-icon-default); display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.279 5.5L11 10.221l-.779.779L5.5 6.279.779 11 0 10.221 4.721 5.5 0 .779.779 0 5.5 4.721 10.221 0 11 .779 6.279 5.5z' fill='%23000'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; } [legcord-platform="win32"] #window-controls-container #minimize-icon { - background-color: var(--interactive-normal); + background-color: var(--interactive-icon-default); display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 4.399V5.5H0V4.399h11z' fill='%23000'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; } [legcord-platform="win32"] #window-controls-container #maximize-icon { - background-color: var(--interactive-normal); + background-color: var(--interactive-icon-default); display: list-item; - -webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; - mask: url("data:image/svg+xml;charset=utf-8,%3Csvg width='11' height='11' viewBox='0 0 11 11' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 0v11H0V0h11zM9.899 1.101H1.1V9.9h8.8V1.1z' fill='%23000'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml;charset=utf-8,") no-repeat 50% 50%; } [legcord-platform="win32"][isMaximized] #window-controls-container #maximize-icon { - background-color: var(--interactive-normal); + background-color: var(--interactive-icon-default); display: list-item; - -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") + -webkit-mask: url("data:image/svg+xml,") no-repeat 50% 50%; - mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30' width='11' height='11'%3E%3Cstyle%3E%3C/style%3E%3Cpath fill-rule='evenodd' d='m6 0h24v24h-6v6h-24v-24h6zm3 6h15v15h3v-18h-18zm-6 21h18v-18h-18z'/%3E%3C/svg%3E") + mask: url("data:image/svg+xml,") no-repeat 50% 50%; } diff --git a/src/shelter/settings/components/KeybindCard.module.css b/src/shelter/settings/components/KeybindCard.module.css index 1da3563..2f76ff9 100644 --- a/src/shelter/settings/components/KeybindCard.module.css +++ b/src/shelter/settings/components/KeybindCard.module.css @@ -21,12 +21,12 @@ .btn { border: none; background: none; - color: var(--interactive-active); + color: var(--interactive-text-active); transition: opacity 250ms; &:hover { - color: var(--interactive-hover); + color: var(--interactive-text-hover); } } diff --git a/src/shelter/settings/components/ThemesCard.module.css b/src/shelter/settings/components/ThemesCard.module.css index 9c7f529..ebeb749 100644 --- a/src/shelter/settings/components/ThemesCard.module.css +++ b/src/shelter/settings/components/ThemesCard.module.css @@ -20,12 +20,12 @@ .btn { border: none; background: none; - color: var(--interactive-active); + color: var(--interactive-text-active); transition: opacity 250ms; &:hover { - color: var(--interactive-hover); + color: var(--interactive-text-hover); } } From 677506b6aaf853152b84d30b33505cebe9eb50b8 Mon Sep 17 00:00:00 2001 From: Liam Rooney <80072393+lbrooney@users.noreply.github.com> Date: Thu, 1 Jan 2026 11:13:59 -0800 Subject: [PATCH 690/844] fix trailing bar collision with nav bar (#993) --- assets/app/css/linuxTitlebar.css | 2 +- assets/app/css/winTitlebar.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/app/css/linuxTitlebar.css b/assets/app/css/linuxTitlebar.css index 2d2a369..7935faa 100644 --- a/assets/app/css/linuxTitlebar.css +++ b/assets/app/css/linuxTitlebar.css @@ -1,4 +1,4 @@ -[legcord-platform="linux"] div[class^="trailing_"] { +[legcord-platform="linux"] div[class*="title"] + div[class*="trailing"] { margin-right: 150px; } diff --git a/assets/app/css/winTitlebar.css b/assets/app/css/winTitlebar.css index 793a6ed..1586911 100644 --- a/assets/app/css/winTitlebar.css +++ b/assets/app/css/winTitlebar.css @@ -1,6 +1,6 @@ /* Legcord on Windows */ -[legcord-platform="win32"] div[class^="trailing_"] { +[legcord-platform="win32"] div[class*="title"] + div[class*="trailing"] { margin-right: 150px; } From 485e560a562d30b329a8821bef724f3c4ac199e3 Mon Sep 17 00:00:00 2001 From: MahmodZE <97690050+MahmodZE@users.noreply.github.com> Date: Thu, 1 Jan 2026 11:15:55 -0800 Subject: [PATCH 691/844] fix: YouTube embeds in chat and watch together activity (#994) --- src/discord/window.ts | 4 ++-- src/shelter/settings/components/DropdownItem.module.css | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/discord/window.ts b/src/discord/window.ts index 5f4a620..a60ba9d 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -184,8 +184,8 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { // fix UMG video playback passedWindow.webContents.session.webRequest.onBeforeSendHeaders( { urls: ["https://www.youtube.com/embed/*"] }, - ({ requestHeaders, url }, callback) => { - requestHeaders.Referer = url; + ({ requestHeaders }, callback) => { + requestHeaders.Referer = "https://google.com"; callback({ requestHeaders }); }, ); diff --git a/src/shelter/settings/components/DropdownItem.module.css b/src/shelter/settings/components/DropdownItem.module.css index 78207cb..89f7ad7 100644 --- a/src/shelter/settings/components/DropdownItem.module.css +++ b/src/shelter/settings/components/DropdownItem.module.css @@ -1,6 +1,6 @@ .note { margin-top: 8px; - color: var(--header-secondary); + color: var(--text-subtle); font-size: 14px; line-height: 20px; font-weight: 400; @@ -11,7 +11,7 @@ display: block; overflow: hidden; margin: 0; - color: var(--header-primary); + color: var(--text-strong); line-height: 24px; font-weight: 500; word-wrap: break-word; From 004bc9244f501cc5c6a95da57ac9bc766138d7c4 Mon Sep 17 00:00:00 2001 From: MahmodZE <97690050+MahmodZE@users.noreply.github.com> Date: Thu, 1 Jan 2026 11:17:23 -0800 Subject: [PATCH 692/844] feat: refactored and redesigned some ui components (#995) --- .../components/ScreensharePicker.module.css | 11 +- .../components/ScreensharePicker.tsx | 77 ++++++------ .../settings/components/Dropdown.module.css | 83 +++++++++---- src/shelter/settings/components/Dropdown.tsx | 72 +++++++++-- .../settings/components/DropdownItem.tsx | 20 +-- .../settings/components/KeybindMaker.tsx | 22 ++-- .../components/SegmentedControl.module.css | 32 +++++ .../settings/components/SegmentedControl.tsx | 24 ++++ .../settings/pages/RegisteredGamesPage.tsx | 24 ++-- src/shelter/settings/pages/SettingsPage.tsx | 116 ++++++++---------- 10 files changed, 317 insertions(+), 164 deletions(-) create mode 100644 src/shelter/settings/components/SegmentedControl.module.css create mode 100644 src/shelter/settings/components/SegmentedControl.tsx diff --git a/src/shelter/screenshare/components/ScreensharePicker.module.css b/src/shelter/screenshare/components/ScreensharePicker.module.css index 746a356..bc90300 100644 --- a/src/shelter/screenshare/components/ScreensharePicker.module.css +++ b/src/shelter/screenshare/components/ScreensharePicker.module.css @@ -1,6 +1,6 @@ .sources { grid-template-columns: auto auto; - max-height: 300px; + max-height: 260px; overflow: hidden; display: grid; overflow-y: scroll; @@ -12,10 +12,15 @@ padding: 10px; } .qualityBox { - gap: 10%; - display: flex; + display: grid; + grid-template-columns: auto auto; + gap: 10px 10%; } .checkbox { padding-top: 10px; } +.header { + margin-bottom: 5px; + margin-left: 5px; +} \ No newline at end of file diff --git a/src/shelter/screenshare/components/ScreensharePicker.tsx b/src/shelter/screenshare/components/ScreensharePicker.tsx index db3b686..206ddcc 100644 --- a/src/shelter/screenshare/components/ScreensharePicker.tsx +++ b/src/shelter/screenshare/components/ScreensharePicker.tsx @@ -3,6 +3,8 @@ import { For, Show, createSignal } from "solid-js"; import { Dropdown } from "../../settings/components/Dropdown.jsx"; import classes from "./ScreensharePicker.module.css"; import { type IPCSources, SourceCard } from "./SourceCard.jsx"; +import { SegmentedControl } from "../../settings/components/SegmentedControl.jsx"; + const { ui: { ModalRoot, @@ -87,7 +89,7 @@ export const ScreensharePicker = (props: { props.close(); } return ( - + Screenshare
    @@ -110,42 +112,44 @@ export const ScreensharePicker = (props: {
    -
    Resolution
    - Resolution
    + { - store.resolution = Number(e.currentTarget.value); + onChange={(v) => { + store.resolution = Number(v); }} - > - - - - - - -
    -
    -
    FPS
    - { - store.fps = Number(e.currentTarget.value); - }} - > - - - - - + options={[ + { label: "480p", value: "480" }, + { label: "720p", value: "720" }, + { label: "1080p", value: "1080" }, + { label: "1440p", value: "1440" }, + { label: "2160p", value: "2160" }, + ]} + />
    -
    Audio
    +
    Audio
    +
    +
    FPS
    + { + store.fps = Number(v); + }} + options={[ + { label: "5", value: "5" }, + { label: "15", value: "15" }, + { label: "30", value: "30" }, + { label: "60", value: "60" }, + ]} + /> +
    @@ -153,19 +157,18 @@ export const ScreensharePicker = (props: {
    Venmic
    { - const source = props.audioSources!.find( - (node) => node["node.name"] === e.currentTarget.value, - ); + onChange={(v) => { + const source = props.audioSources!.find((node) => node["node.name"] === v); if (!source) return; setAudioSource(source); }} - > - - - {(source: Node) => } - - + limitHeight + options={[ + { label: "Venmic disabled", value: "Venmic disabled" }, + ...(props.audioSources?.map((s) => ({ label: s["node.name"], value: s["node.name"] })) ?? + []), + ]} + />
    diff --git a/src/shelter/settings/components/Dropdown.module.css b/src/shelter/settings/components/Dropdown.module.css index 03b0d70..c6e1857 100644 --- a/src/shelter/settings/components/Dropdown.module.css +++ b/src/shelter/settings/components/Dropdown.module.css @@ -1,27 +1,68 @@ -.acDropdown option { - color: var(--text-secondary); - font-weight: 400; - font-style: normal; +.container { + margin-top: 8px; + margin-bottom: 24px; + position: relative; } -.acDropdown { - margin-top: 10px; - margin-bottom: 20px; - padding-top: 5px; - padding-bottom: 5px; - width: 100%; - font-size: 25px; - -webkit-appearance: button; - -moz-appearance: button; - appearance: button; - background-color: var(--background-secondary-alt); - background-position: center right; - background-repeat: no-repeat; - border: 1px solid var(--background-floating); - border-radius: 2px; +.valuewrapper { + display: flex; + justify-content: space-between; + align-items: center; + cursor: pointer; + padding: 8px; + color: var(--text-default); - font-size: 1.2em; + font-weight: var(--font-weight-medium); + background-color: var(--input-background-default); + border: 1px solid var(--input-border-default); + border-radius: var(--radius-sm); + color: var(--input-text-default); + transition: border-color .1s ease; + box-sizing: border-box; + min-height: var(--control-input-height-md); + + &::hover { + border-color: var(--input-border-hover); + transition: border-color .1s ease; + } +} +.value { + align-items: center; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; - outline: none !important; + color: var(--text-default); + font-family: var(--font-primary); + font-size: 16px; + font-weight: 500; + line-height: 1.25; } +.list { + min-height: 0; + margin: 0; + margin-top: 8px; + background-color: var(--background-surface-higher); + border: 1px solid var(--border-subtle); + border-radius: 8px; + position: absolute; + width: 100%; + z-index: 100; + overflow-y: auto; +} +option { + color: var(--text-subtle); + font-size: 16px; + font-weight: 400; + line-height: 20px; + align-items: center; + padding: 12px; + cursor: pointer; + + &:hover { + background-color: var(--interactive-background-hover); + color: var(--interactive-text-hover); + } + &[aria-selected="true"] { + background-color: var(--interactive-background-selected); + color: var(--interactive-text-active); + } +} \ No newline at end of file diff --git a/src/shelter/settings/components/Dropdown.tsx b/src/shelter/settings/components/Dropdown.tsx index ab74ad7..a80a373 100644 --- a/src/shelter/settings/components/Dropdown.tsx +++ b/src/shelter/settings/components/Dropdown.tsx @@ -1,14 +1,70 @@ -import type { JSX, JSXElement } from "solid-js"; +import { createSignal, onMount, onCleanup, createMemo, For, createEffect } from "solid-js"; import classes from "./Dropdown.module.css"; export const Dropdown = (props: { - value: string | number | string[]; - onChange: JSX.EventHandler; - children: JSXElement[]; + value: string | number; + onChange: (val: string) => void; + options: { label: string; value: string | number }[]; + limitHeight?: boolean | undefined; }) => { + const [open, set] = createSignal(false); + const [maxHeight, setMaxHeight] = createSignal(""); + let container: HTMLDivElement | undefined; + + const handler = (e: MouseEvent) => !container?.contains(e.target as Node) && set(false); + + onMount(() => document.addEventListener("click", handler)); + onCleanup(() => document.removeEventListener("click", handler)); + + createEffect(() => { + if (!open() || !props.limitHeight) return; + + const rect = container?.parentElement?.getBoundingClientRect(); + if(!rect) return; + + setMaxHeight(`${rect.bottom - container!.getBoundingClientRect().bottom - 20}px`); + }); + + const text = createMemo(() => props.options.find((o) => o.value == props.value)?.label ?? props.value); + return ( - +
    +
    set(!open())}> +
    + {text()} +
    +
    + +
    +
    + {open() && ( +
    + + {(opt) => ( + + )} + +
    + )} +
    ); -}; +}; \ No newline at end of file diff --git a/src/shelter/settings/components/DropdownItem.tsx b/src/shelter/settings/components/DropdownItem.tsx index f438497..8b99b50 100644 --- a/src/shelter/settings/components/DropdownItem.tsx +++ b/src/shelter/settings/components/DropdownItem.tsx @@ -1,4 +1,4 @@ -import { type JSX, type JSXElement, Show } from "solid-js"; +import { type JSXElement, Show } from "solid-js"; import { Dropdown } from "./Dropdown.jsx"; import classes from "./DropdownItem.module.css"; const { @@ -10,8 +10,9 @@ export const DropdownItem = (props: { note: string; link?: string; value: string; - onChange: JSX.EventHandler; - children: JSXElement[]; + onChange: (val: string) => void; + options: { label: string; value: string | number }[]; + limitHeight?: boolean | undefined; extraItems?: JSXElement; }) => { return ( @@ -19,12 +20,13 @@ export const DropdownItem = (props: {
    {props.title}
    -
    {props.note}
    - - Learn more here. - - {/* biome-ignore lint/correctness/noChildrenProp: FIX-ME, couldn't figure out proper types */} - +
    + {props.note} + + Learn more here. + +
    + {props.extraItems} diff --git a/src/shelter/settings/components/KeybindMaker.tsx b/src/shelter/settings/components/KeybindMaker.tsx index e85de17..2f2ca74 100644 --- a/src/shelter/settings/components/KeybindMaker.tsx +++ b/src/shelter/settings/components/KeybindMaker.tsx @@ -95,16 +95,18 @@ export const KeybindMaker = (props: { close: () => void }) => {
    Action
    setAction((e.target as HTMLInputElement).value as KeybindActions)} - > - - - - - - - - + onChange={(v) => setAction(v as KeybindActions)} + limitHeight + options={[ + { label: "Mute", value: "mute" }, + { label: "Deafen", value: "deafen" }, + { label: "Leave call", value: "leaveCall" }, + { label: "Navigate forward", value: "navigateForward" }, + { label: "Navigate back", value: "navigateBack" }, + { label: "Run Javascript", value: "runJavascript" }, + { label: "Open Quick CSS", value: "openQuickCss" }, + ]} + /> void; + options: { label: string; value: string | number }[]; +}) => { + return ( +
    + + {(opt) => ( +
    props.onChange(String(opt.value))} + > + {opt.label} +
    + )} +
    +
    + ); +}; \ No newline at end of file diff --git a/src/shelter/settings/pages/RegisteredGamesPage.tsx b/src/shelter/settings/pages/RegisteredGamesPage.tsx index a624d93..1bc1e83 100644 --- a/src/shelter/settings/pages/RegisteredGamesPage.tsx +++ b/src/shelter/settings/pages/RegisteredGamesPage.tsx @@ -1,5 +1,5 @@ import type { ProcessInfo } from "arrpc"; -import { For, createSignal } from "solid-js"; +import { createSignal } from "solid-js"; import { sleep } from "../../../common/sleep.js"; import { Dropdown } from "../components/Dropdown.jsx"; import classes from "./RegisteredGames.module.css"; @@ -9,7 +9,7 @@ const { export function RegisteredGamesPage() { const [detectables, setDetectables] = createSignal(); - const [selectedDetectable, setSelectedDetectable] = createSignal(""); + const [selectedDetectable, setSelectedDetectable] = createSignal("refresh"); function getDetectables() { window.legcord.rpc.refreshProcessList(); sleep(500).then(() => { @@ -28,23 +28,21 @@ export function RegisteredGamesPage() {
    { - const detectable = e.currentTarget.value; - if (detectable === "refresh") { + onChange={(v) => { + if (v === "refresh") { getDetectables(); setSelectedDetectable(""); console.log("Detectables refreshed"); } else { - console.log("Selected detectable:", detectable); - setSelectedDetectable(e.currentTarget.value); + console.log("Selected detectable:", v); + setSelectedDetectable(v); } }} - > - - {(process: ProcessInfo) => } - - - + options={[ + ...(detectables()?.map((p) => ({ label: p[1], value: p[1] })) ?? []), + { label: "Refresh list", value: "refresh" }, + ]} + /> diff --git a/src/shelter/settings/pages/SettingsPage.tsx b/src/shelter/settings/pages/SettingsPage.tsx index e368542..670660c 100644 --- a/src/shelter/settings/pages/SettingsPage.tsx +++ b/src/shelter/settings/pages/SettingsPage.tsx @@ -48,28 +48,22 @@ export function SettingsPage() { > {store.i18n["settings-invitewebsocket"]} -
    - {store.i18n["settings-category-lookAndFeel"]} -
    - setConfig("windowStyle", (e.target as HTMLInputElement).value as Settings["windowStyle"], true) - } + onChange={(v) => setConfig("windowStyle", v as Settings["windowStyle"], true)} title={store.i18n["settings-theme"]} note={store.i18n["settings-theme-desc"]} link="https://github.com/Legcord/Legcord/wiki/Settings-%5Bwip%5D#legcord-theme" - > - - - - - + options={[ + { label: store.i18n["settings-theme-default"], value: "default" }, + { label: store.i18n["settings-theme-native"], value: "native" }, + { label: store.i18n["settings-theme-overlay"], value: "overlay" }, + { label: "Legacy", value: "legacy" }, + ]} + /> - setConfig("transparency", (e.target as HTMLInputElement).value as Settings["transparency"], true) - } + onChange={(v) => setConfig("transparency", v as Settings["transparency"], true)} title={store.i18n["settings-transparency"]} note={store.i18n["settings-transparency-desc"]} link="https://github.com/Legcord/Legcord/wiki/Transparency-options" @@ -93,13 +87,14 @@ export function SettingsPage() {
    } - > - - - - - - + options={[ + { label: store.i18n["settings-transparency-universal"], value: "universal" }, + ...(window.legcord.platform === "win32" || window.legcord.platform === "darwin" + ? [{ label: store.i18n["settings-transparency-modern"], value: "modern" }] + : []), + { label: store.i18n["settings-none"], value: "none" }, + ]} + /> setConfig("tray", (e.target as HTMLInputElement).value as Settings["tray"], true)} + onChange={(v) => setConfig("tray", v as Settings["tray"], true)} title={store.i18n["settings-trayIcon"]} note={store.i18n["settings-trayIcon-desc"]} - > - - - - - - - - - - + options={[ + { label: store.i18n["settings-trayIcon-dynamic"], value: "dynamic" }, + { label: store.i18n["settings-trayIcon-disabled"], value: "disabled" }, + { label: store.i18n["settings-trayIcon-normal"], value: "dsc-tray" }, + { label: store.i18n["settings-trayIcon-classic"], value: "clsc-dsc-tray" }, + { label: store.i18n["settings-trayIcon-colored-plug"], value: "ac_plug_colored" }, + { label: store.i18n["settings-trayIcon-white-plug"], value: "ac_white_plug" }, + { label: store.i18n["settings-trayIcon-white-plug-alt"], value: "ac_white_plug_hollow" }, + { label: store.i18n["settings-trayIcon-black-plug"], value: "ac_black_plug" }, + { label: store.i18n["settings-trayIcon-black-plug-alt"], value: "ac_black_plug_hollow" }, + ]} + /> - setConfig("channel", (e.target as HTMLInputElement).value as Settings["channel"], true) - } + onChange={(v) => setConfig("channel", v as Settings["channel"], true)} title={store.i18n["settings-channel"]} note={store.i18n["settings-channel-desc"]} link="https://support.discord.com/hc/en-us/articles/360035675191-Discord-Testing-Clients" - > - - - - + options={[ + { label: "Stable", value: "stable" }, + { label: "Canary", value: "canary" }, + { label: "PTB", value: "ptb" }, + ]} + /> - setConfig( - "performanceMode", - (e.target as HTMLInputElement).value as Settings["performanceMode"], - true, - ) - } + onChange={(v) => setConfig("performanceMode", v as Settings["performanceMode"], true)} title={store.i18n["settings-prfmMode"]} note={store.i18n["settings-prfmMode-desc"]} link="https://github.com/Legcord/Legcord/blob/dev/src/common/flags.ts" - > - - - - - - + options={[ + { label: store.i18n["settings-prfmMode-dynamic"], value: "dynamic" }, + { label: store.i18n["settings-prfmMode-performance"], value: "performance" }, + { label: store.i18n["settings-prfmMode-battery"], value: "battery" }, + { label: store.i18n["settings-prfmMode-vaapi"], value: "vaapi" }, + { label: store.i18n["settings-none"], value: "none" }, + ]} + /> { + onChange={(v) => { const audioSettings = structuredClone({ ...settings.audio }); - audioSettings.loopbackType = (e.target as HTMLInputElement) - .value as Settings["audio"]["loopbackType"]; + audioSettings.loopbackType = v as Settings["audio"]["loopbackType"]; setConfig("audio", audioSettings); }} title={store.i18n["settings-audio"]} note={store.i18n["settings-audio-desc"]} link="https://www.electronjs.org/docs/latest/api/session#sessetdisplaymediarequesthandlerhandler-opts" - > - - - + options={[ + { label: "Loopback", value: "loopback" }, + { label: "Loopback with mute", value: "loopbackWithMute" }, + ]} + /> Date: Thu, 1 Jan 2026 11:18:08 -0800 Subject: [PATCH 693/844] fix: improve the keybind maker (#996) --- .../components/KeybindMaker.module.css | 17 ++++ .../settings/components/KeybindMaker.tsx | 99 ++++++++++++------- 2 files changed, 78 insertions(+), 38 deletions(-) diff --git a/src/shelter/settings/components/KeybindMaker.module.css b/src/shelter/settings/components/KeybindMaker.module.css index 1ae2dd7..5e819c4 100644 --- a/src/shelter/settings/components/KeybindMaker.module.css +++ b/src/shelter/settings/components/KeybindMaker.module.css @@ -1,5 +1,22 @@ .grabBox { + position: relative; flex-direction: row; flex: 1; display: flex; } +.recBtn { + position: absolute; + width: auto; + top: 50%; + right: 0; + transform: translate(-7px, -50%); +} +.error { + color: var(--control-critical-secondary-text-default); + font-size: 14px; + line-height: 20px; + font-weight: 400; + + margin: 0; + margin-left: 5px; +} \ No newline at end of file diff --git a/src/shelter/settings/components/KeybindMaker.tsx b/src/shelter/settings/components/KeybindMaker.tsx index 2f2ca74..a09f7f6 100644 --- a/src/shelter/settings/components/KeybindMaker.tsx +++ b/src/shelter/settings/components/KeybindMaker.tsx @@ -1,7 +1,8 @@ -import { Show, createSignal } from "solid-js"; +import { Show, createSignal, onCleanup } from "solid-js"; import type { KeybindActions } from "../../../@types/keybind.js"; import { Dropdown } from "./Dropdown.jsx"; import classes from "./KeybindMaker.module.css"; + const { ui: { ModalRoot, @@ -12,57 +13,64 @@ const { TextBox, Button, ButtonSizes, + ButtonColors, Header, HeaderTags, Divider, SwitchItem, - genId, - showToast, + genId }, plugin: { store }, } = shelter; + export const KeybindMaker = (props: { close: () => void }) => { + const [recording, setRecording] = createSignal(false); const [accelerator, setAccelerator] = createSignal(""); const [global, setGlobal] = createSignal(true); const [action, setAction] = createSignal("mute"); const [javascriptCode, setJavascriptCode] = createSignal(""); const [enabled, setEnabled] = createSignal(true); + let logged: string[] = []; - let lock = false; - function grabKeys() { - if (lock) return; - lock = true; + let containsNonModifier = false; + let timeout: NodeJS.Timeout | null = null; + function log(event: KeyboardEvent) { + const key = event.key.replace(" ", "Space"); + if (logged.includes(key) || logged.length > 3) { + console.log("already in array"); + } else { + console.log(key); + logged.unshift(key); + if(event.location == 0) containsNonModifier = true; + setAccelerator(logged.join("+")); + } + if(timeout) clearTimeout(timeout); + timeout = setTimeout(stopRecording, 3000); + }; + function stopRecording() { + if (!recording()) return; + setRecording(false); + if(timeout) { + clearTimeout(timeout); + timeout = null; + }; + + document.body.removeEventListener("keyup", log); + console.log("Recording stop"); + }; + onCleanup(() => recording() && stopRecording()); + + function startRecording() { + if (recording()) return; + setRecording(true); + logged = []; + containsNonModifier = false; setAccelerator(""); console.log("Recording start"); - document.body.addEventListener("keyup", function log(event) { - const key = event.key; - if (logged.includes(key) || logged.length > 3) { - console.log("already in array"); - } else { - key.replace(" ", "Space"); - console.log(key); - logged.push(key); - setAccelerator(`${key}+${accelerator()}`); - } - setTimeout(() => { - if (lock) { - lock = false; - document.body.removeEventListener("keyup", log); - console.log("Recording stop"); - setAccelerator(accelerator().slice(0, -1)); - } - }, 3000); - }); + document.body.addEventListener("keyup", log); } function save() { - if (lock) - return showToast({ - title: "Slow down!", - content: "Pause for a few seconds after recording a keybind before saving it.", - duration: 3000, - }); - if (accelerator() === "") return; const current = store.settings.keybinds; const keybind = { accelerator: accelerator(), @@ -78,18 +86,33 @@ export const KeybindMaker = (props: { close: () => void }) => { console.log(store.settings.keybinds); window.legcord.settings.addKeybind(keybind); } + return ( Add a keybind -
    Accelerator
    + +
    + Accelerator +
    + +

    Modifier-only shortcuts are not supported.

    +
    +
    {/* FIXME - I have no idea what this `disabled` tag is, its not in the typedefs // @ts-expect-error*/} - + { + recording() ? + + : + + }
    Action
    @@ -123,7 +146,7 @@ export const KeybindMaker = (props: { close: () => void }) => {
    - + ); }; From 0e215e6aae0a9f5dc9e7ce1fbeb34674280c7b40 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 1 Jan 2026 20:46:43 +0100 Subject: [PATCH 694/844] feat: fix macOS titlebar CSS --- assets/app/css/darwinTitlebar.css | 8 +-- biome.jsonc | 3 ++ package.json | 2 +- pnpm-lock.yaml | 30 ++++++------ .../components/ScreensharePicker.module.css | 2 +- .../components/ScreensharePicker.tsx | 20 +++++--- .../settings/components/Dropdown.module.css | 2 +- src/shelter/settings/components/Dropdown.tsx | 38 +++++++------- .../settings/components/DropdownItem.tsx | 7 ++- .../components/KeybindMaker.module.css | 2 +- .../settings/components/KeybindMaker.tsx | 49 +++++++++++-------- .../components/SegmentedControl.module.css | 2 +- .../settings/components/SegmentedControl.tsx | 4 +- 13 files changed, 98 insertions(+), 71 deletions(-) diff --git a/assets/app/css/darwinTitlebar.css b/assets/app/css/darwinTitlebar.css index a9aeb11..f355555 100644 --- a/assets/app/css/darwinTitlebar.css +++ b/assets/app/css/darwinTitlebar.css @@ -13,7 +13,7 @@ display: block; line-height: 45px; left: 0; - transform: translate(-82px, 4px); + transform: translate(-82px, 0px); } [legcord-platform="darwin"] #window-controls-container:hover #minimize #minimize-icon, @@ -36,7 +36,7 @@ no-repeat 50% 50%; mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4yOTI4OSA2TDIuODE4MDEgMy41MjUxM0wzLjUyNTEyIDIuODE4MDJMNS45OTk5OSA1LjI5Mjg5TDguNDc0ODcgMi44MTgwMkw5LjE4MTk3IDMuNTI1MTNMNi43MDcxIDZMOS4xODE5NyA4LjQ3NDg3TDguNDc0ODcgOS4xODE5OEw1Ljk5OTk5IDYuNzA3MTFMMy41MjUxMiA5LjE4MTk4TDIuODE4MDEgOC40NzQ4N0w1LjI5Mjg5IDZaIiBmaWxsPSJyZ2JhKDEyOCwgNiwgMCwgMSkiLz48L3N2Zz4=") no-repeat 50% 50%; - transform: translate(-0.3px, -9px); + transform: translate(-0.4px, -7px); } [legcord-platform="darwin"]:not([unFocused]) #window-controls-container #minimize #minimize-icon { background-color: #7d631b; @@ -44,7 +44,7 @@ no-repeat 50% 50%; mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNS4zOTk5OUgyVjYuNTk5OTlIMTBWNS4zOTk5OVoiIGZpbGw9IiM5ODY4MDEiLz48L3N2Zz4=") no-repeat 50% 50%; - transform: translate(-0px, -9px); + transform: translate(-0px, -7px); } [legcord-platform="darwin"]:not([unFocused]) #window-controls-container #maximize #maximize-icon { background-color: #1d7525; @@ -52,7 +52,7 @@ no-repeat 50% 50%; mask: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNOC41ODgyMyA2Ljk5MDE1TDUuMDA5NzkgMy40MTE3QzQuODU1ODMgMy4yNTc3NCA0Ljk1ODYgMi45OTQyMiA1LjE3NjE0IDIuOTg1MTRMOC45MTA0MiAyLjgyOTMxQzkuMDU2NTggMi44MjMyMSA5LjE3NjczIDIuOTQzMzUgOS4xNzA2MyAzLjA4OTUyTDkuMDE0NzkgNi44MjM4QzkuMDA1NzEgNy4wNDEzNCA4Ljc0MjE5IDcuMTQ0MTEgOC41ODgyMyA2Ljk5MDE1WiIgZmlsbD0iIzEyNUUxRSIvPjxwYXRoIGQ9Ik0zLjQxMTc3IDUuMDA5ODJMNi45OTAyMSA4LjU4ODI3QzcuMTQ0MTcgOC43NDIyMyA3LjA0MTQgOS4wMDU3NSA2LjgyMzg2IDkuMDE0ODNMMy4wODk1OCA5LjE3MDY2QzIuOTQzNDIgOS4xNzY3NiAyLjgyMzI3IDkuMDU2NjEgMi44MjkzNyA4LjkxMDQ1TDIuOTg1MjEgNS4xNzYxN0MyLjk5NDI5IDQuOTU4NjMgMy4yNTc4MSA0Ljg1NTg2IDMuNDExNzcgNS4wMDk4MloiIGZpbGw9IiMxMjVFMUUiLz48L3N2Zz4=") no-repeat 50% 50%; - transform: translate(0.1px, -9px); + transform: translate(0px, -7px); } [legcord-platform="darwin"] #window-controls-container #minimize { diff --git a/biome.jsonc b/biome.jsonc index 21a09f5..da9bc49 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -27,6 +27,9 @@ "style": { "noNonNullAssertion": "off", "noUselessElse": "off" // NOTE - This rule seems broken + }, + "a11y": { + "useKeyWithClickEvents": "off" } } } diff --git a/package.json b/package.json index 5666351..f8ad0f5 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@uwu/lune": "^1.5.1", "@uwu/shelter-defs": "^1.4.1", "babel-preset-solid": "^1.9.3", - "electron": "39.2.6", + "electron": "39.2.7", "electron-builder": "^26.3.5", "lucide-solid": "^0.475.0", "rolldown": "1.0.0-beta.31", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e14e27..53dac3a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,10 +23,6 @@ importers: ws: specifier: ^8.18.0 version: 8.18.0 - optionalDependencies: - '@vencord/venmic': - specifier: ^6.1.0 - version: 6.1.0 devDependencies: '@babel/preset-flow': specifier: ^7.25.9 @@ -62,8 +58,8 @@ importers: specifier: ^1.9.3 version: 1.9.3(@babel/core@7.26.7) electron: - specifier: 39.2.6 - version: 39.2.6 + specifier: 39.2.7 + version: 39.2.7 electron-builder: specifier: ^26.3.5 version: 26.3.5(electron-builder-squirrel-windows@25.1.8) @@ -91,6 +87,10 @@ importers: xml-formatter: specifier: ^3.6.6 version: 3.6.6 + optionalDependencies: + '@vencord/venmic': + specifier: ^6.1.0 + version: 6.1.0 packages: @@ -1755,8 +1755,8 @@ packages: electron-updater@6.6.2: resolution: {integrity: sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==} - electron@39.2.6: - resolution: {integrity: sha512-dHBgTodWBZd+tL1Dt0PSh/CFLHeDkFCTKCTXu1dgPhlE9Z3k2zzlBQ9B2oW55CFsKanBDHiUomHJNw0XaSdQpA==} + electron@39.2.7: + resolution: {integrity: sha512-KU0uFS6LSTh4aOIC3miolcbizOFP7N1M46VTYVfqIgFiuA2ilfNaOHLDS9tCMvwwHRowAsvqBrh9NgMXcTOHCQ==} engines: {node: '>= 12.20.55'} hasBin: true @@ -3580,7 +3580,7 @@ snapshots: node-gyp: 9.4.1 ora: 5.4.1 read-binary-file-arch: 1.0.6 - semver: 7.7.2 + semver: 7.7.3 tar: 6.2.1 yargs: 17.7.2 transitivePeerDependencies: @@ -3935,7 +3935,7 @@ snapshots: '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 - semver: 7.7.2 + semver: 7.7.3 '@npmcli/fs@4.0.0': dependencies: @@ -4400,7 +4400,7 @@ snapshots: minimatch: 10.0.3 resedit: 1.7.2 sanitize-filename: 1.6.3 - semver: 7.7.2 + semver: 7.7.3 tar: 6.2.1 temp-file: 3.4.0 transitivePeerDependencies: @@ -5024,7 +5024,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@39.2.6: + electron@39.2.7: dependencies: '@electron/get': 2.0.3 '@types/node': 22.10.1 @@ -5311,7 +5311,7 @@ snapshots: es6-error: 4.1.1 matcher: 3.0.0 roarr: 2.15.4 - semver: 7.7.2 + semver: 7.7.3 serialize-error: 7.0.1 optional: true @@ -5801,7 +5801,7 @@ snapshots: node-abi@3.71.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 node-abi@4.17.0: dependencies: @@ -5848,7 +5848,7 @@ snapshots: nopt: 6.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.7.2 + semver: 7.7.3 tar: 6.2.1 which: 2.0.2 transitivePeerDependencies: diff --git a/src/shelter/screenshare/components/ScreensharePicker.module.css b/src/shelter/screenshare/components/ScreensharePicker.module.css index bc90300..14bf8a5 100644 --- a/src/shelter/screenshare/components/ScreensharePicker.module.css +++ b/src/shelter/screenshare/components/ScreensharePicker.module.css @@ -23,4 +23,4 @@ .header { margin-bottom: 5px; margin-left: 5px; -} \ No newline at end of file +} diff --git a/src/shelter/screenshare/components/ScreensharePicker.tsx b/src/shelter/screenshare/components/ScreensharePicker.tsx index 206ddcc..08b673a 100644 --- a/src/shelter/screenshare/components/ScreensharePicker.tsx +++ b/src/shelter/screenshare/components/ScreensharePicker.tsx @@ -1,9 +1,9 @@ import type { Node } from "@vencord/venmic"; import { For, Show, createSignal } from "solid-js"; import { Dropdown } from "../../settings/components/Dropdown.jsx"; +import { SegmentedControl } from "../../settings/components/SegmentedControl.jsx"; import classes from "./ScreensharePicker.module.css"; import { type IPCSources, SourceCard } from "./SourceCard.jsx"; -import { SegmentedControl } from "../../settings/components/SegmentedControl.jsx"; const { ui: { @@ -112,7 +112,9 @@ export const ScreensharePicker = (props: {
    -
    Resolution
    +
    + Resolution +
    { @@ -129,14 +131,18 @@ export const ScreensharePicker = (props: {
    -
    Audio
    +
    + Audio +
    -
    FPS
    +
    + FPS +
    { @@ -165,8 +171,10 @@ export const ScreensharePicker = (props: { limitHeight options={[ { label: "Venmic disabled", value: "Venmic disabled" }, - ...(props.audioSources?.map((s) => ({ label: s["node.name"], value: s["node.name"] })) ?? - []), + ...(props.audioSources?.map((s) => ({ + label: s["node.name"], + value: s["node.name"], + })) ?? []), ]} /> diff --git a/src/shelter/settings/components/Dropdown.module.css b/src/shelter/settings/components/Dropdown.module.css index c6e1857..d5b13db 100644 --- a/src/shelter/settings/components/Dropdown.module.css +++ b/src/shelter/settings/components/Dropdown.module.css @@ -65,4 +65,4 @@ option { background-color: var(--interactive-background-selected); color: var(--interactive-text-active); } -} \ No newline at end of file +} diff --git a/src/shelter/settings/components/Dropdown.tsx b/src/shelter/settings/components/Dropdown.tsx index a80a373..af61f23 100644 --- a/src/shelter/settings/components/Dropdown.tsx +++ b/src/shelter/settings/components/Dropdown.tsx @@ -1,4 +1,4 @@ -import { createSignal, onMount, onCleanup, createMemo, For, createEffect } from "solid-js"; +import { For, createEffect, createMemo, createSignal, onCleanup, onMount } from "solid-js"; import classes from "./Dropdown.module.css"; export const Dropdown = (props: { @@ -20,30 +20,34 @@ export const Dropdown = (props: { if (!open() || !props.limitHeight) return; const rect = container?.parentElement?.getBoundingClientRect(); - if(!rect) return; + if (!rect) return; setMaxHeight(`${rect.bottom - container!.getBoundingClientRect().bottom - 20}px`); }); - const text = createMemo(() => props.options.find((o) => o.value == props.value)?.label ?? props.value); + const text = createMemo(() => props.options.find((o) => o.value === props.value)?.label ?? props.value); return ( -
    + // biome-ignore lint/a11y/useSemanticElements: FIX-ME +
    set(!open())}> -
    +
    {text()}
    -
    @@ -53,7 +57,7 @@ export const Dropdown = (props: { {(opt) => (
    ); -}; \ No newline at end of file +}; diff --git a/src/shelter/settings/components/DropdownItem.tsx b/src/shelter/settings/components/DropdownItem.tsx index 8b99b50..7bae47f 100644 --- a/src/shelter/settings/components/DropdownItem.tsx +++ b/src/shelter/settings/components/DropdownItem.tsx @@ -26,7 +26,12 @@ export const DropdownItem = (props: { Learn more here.
    - + {props.extraItems} diff --git a/src/shelter/settings/components/KeybindMaker.module.css b/src/shelter/settings/components/KeybindMaker.module.css index 5e819c4..40d8c5d 100644 --- a/src/shelter/settings/components/KeybindMaker.module.css +++ b/src/shelter/settings/components/KeybindMaker.module.css @@ -19,4 +19,4 @@ margin: 0; margin-left: 5px; -} \ No newline at end of file +} diff --git a/src/shelter/settings/components/KeybindMaker.tsx b/src/shelter/settings/components/KeybindMaker.tsx index a09f7f6..d541cbb 100644 --- a/src/shelter/settings/components/KeybindMaker.tsx +++ b/src/shelter/settings/components/KeybindMaker.tsx @@ -18,7 +18,7 @@ const { HeaderTags, Divider, SwitchItem, - genId + genId, }, plugin: { store }, } = shelter; @@ -41,23 +41,23 @@ export const KeybindMaker = (props: { close: () => void }) => { } else { console.log(key); logged.unshift(key); - if(event.location == 0) containsNonModifier = true; + if (event.location === 0) containsNonModifier = true; setAccelerator(logged.join("+")); } - if(timeout) clearTimeout(timeout); + if (timeout) clearTimeout(timeout); timeout = setTimeout(stopRecording, 3000); - }; + } function stopRecording() { if (!recording()) return; setRecording(false); - if(timeout) { + if (timeout) { clearTimeout(timeout); timeout = null; - }; + } document.body.removeEventListener("keyup", log); console.log("Recording stop"); - }; + } onCleanup(() => recording() && stopRecording()); function startRecording() { @@ -92,9 +92,7 @@ export const KeybindMaker = (props: { close: () => void }) => { Add a keybind -
    - Accelerator -
    +
    Accelerator

    Modifier-only shortcuts are not supported.

    @@ -103,16 +101,20 @@ export const KeybindMaker = (props: { close: () => void }) => { {/* FIXME - I have no idea what this `disabled` tag is, its not in the typedefs // @ts-expect-error*/} - { - recording() ? - - : - - } + {recording() ? ( + + ) : ( + + )}
    Action
    @@ -146,7 +148,12 @@ export const KeybindMaker = (props: { close: () => void }) => { - + ); }; diff --git a/src/shelter/settings/components/SegmentedControl.module.css b/src/shelter/settings/components/SegmentedControl.module.css index aeaad2b..dbc0b3b 100644 --- a/src/shelter/settings/components/SegmentedControl.module.css +++ b/src/shelter/settings/components/SegmentedControl.module.css @@ -29,4 +29,4 @@ .item[aria-selected="true"] { background-color: var(--interactive-background-selected); color: var(--interactive-text-active); -} \ No newline at end of file +} diff --git a/src/shelter/settings/components/SegmentedControl.tsx b/src/shelter/settings/components/SegmentedControl.tsx index d296fb7..b5fff3c 100644 --- a/src/shelter/settings/components/SegmentedControl.tsx +++ b/src/shelter/settings/components/SegmentedControl.tsx @@ -12,7 +12,7 @@ export const SegmentedControl = (props: { {(opt) => (
    props.onChange(String(opt.value))} > {opt.label} @@ -21,4 +21,4 @@ export const SegmentedControl = (props: {
    ); -}; \ No newline at end of file +}; From 64d08d5fc660632054c3da5c0b5b1180379f8188 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 1 Jan 2026 21:09:42 +0100 Subject: [PATCH 695/844] fix: download apps button --- assets/app/css/discord.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/app/css/discord.css b/assets/app/css/discord.css index 1712677..7c17ba2 100644 --- a/assets/app/css/discord.css +++ b/assets/app/css/discord.css @@ -10,7 +10,7 @@ color: var(--text-muted); } -div[class^="listItem__"]:has([data-list-item-id="guildsnav___app-download-button"]) { +div:has(> span [data-list-item-id="guildsnav___app-download-button"]) { display: none !important; } From 2144463c50ff3dbaad4edb7f658dded00412ec0c Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 2 Jan 2026 14:40:24 +0100 Subject: [PATCH 696/844] chore: update arRPC --- assets/lang/en-US.json | 6 +++ package.json | 2 +- pnpm-lock.yaml | 18 ++++----- src/@types/settings.d.ts | 3 ++ src/common/config.ts | 3 ++ src/discord/rpcProcess.ts | 11 +++++- src/rpc.ts | 7 +++- src/shelter/settings/pages/SettingsPage.tsx | 43 ++++++++++++++++----- 8 files changed, 71 insertions(+), 22 deletions(-) diff --git a/assets/lang/en-US.json b/assets/lang/en-US.json index 7180b58..86b6b38 100644 --- a/assets/lang/en-US.json +++ b/assets/lang/en-US.json @@ -62,6 +62,12 @@ "settings-noBundleUpdates-desc": "Disables automatic updates for client mods.", "settings-hardwareAcceleration": "Hardware acceleration", "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", + "settings-processScanning": "Process scanning", + "settings-processScanning-desc": "Enables scanning for running games to improve Rich Presence detection.", + "settings-windowsLegacyScanning": "Windows legacy scanning", + "settings-windowsLegacyScanning-desc": "Uses legacy method for scanning processes on Windows (pre v1.1.6). May improve compatibility on some systems but is less efficient.", + "settings-scanInterval": "Scan interval (ms)", + "settings-scanInterval-desc": "Sets how often (in milliseconds) the process scanning occurs. Lower values may improve detection speed but can increase CPU usage.", "settings-blockPowerSavingInVoiceChat": "Block power saving in voice chat", "settings-blockPowerSavingInVoiceChat-desc": "Prevent Legcord from being suspended. Keeps system active but allows screen to be turned off.", "settings-mobileMode": "Mobile mode", diff --git a/package.json b/package.json index f8ad0f5..330d99f 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "xml-formatter": "^3.6.6" }, "dependencies": { - "arrpc": "https://github.com/Legcord/arrpc.git#015c803a80288e3345ec55f8963015a626509007", + "arrpc": "https://github.com/Legcord/arrpc.git#f7ab641ad3386d44364e227d97ba0dc847de08d1", "electron-context-menu": "^4.0.4", "electron-is-dev": "^3.0.1", "electron-updater": "^6.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 53dac3a..20c9519 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: arrpc: - specifier: https://github.com/Legcord/arrpc.git#015c803a80288e3345ec55f8963015a626509007 - version: https://codeload.github.com/Legcord/arrpc/tar.gz/015c803a80288e3345ec55f8963015a626509007 + specifier: https://github.com/Legcord/arrpc.git#f7ab641ad3386d44364e227d97ba0dc847de08d1 + version: https://codeload.github.com/Legcord/arrpc/tar.gz/f7ab641ad3386d44364e227d97ba0dc847de08d1 electron-context-menu: specifier: ^4.0.4 version: 4.0.4 @@ -1369,8 +1369,8 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/015c803a80288e3345ec55f8963015a626509007: - resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/015c803a80288e3345ec55f8963015a626509007} + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/f7ab641ad3386d44364e227d97ba0dc847de08d1: + resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/f7ab641ad3386d44364e227d97ba0dc847de08d1} version: 3.5.0 hasBin: true @@ -2229,8 +2229,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - koffi@2.12.0: - resolution: {integrity: sha512-J886y/bvoGG4ZhMVstB2Nh6/q9tzAYn0kaH7Ss8DWavGIxP5jOLzUY9IZzw9pMuXArj0SLSpl0MYsKRURPAv7g==} + koffi@2.15.0: + resolution: {integrity: sha512-174BTuWK7L42Om7nDWy9YOTXj6Dkm14veuFf5yhVS5VU6GjtOI1Wjf+K16Z0JvSuZ3/NpkVzFBjE1oKbthTIEA==} lazy-val@1.0.5: resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} @@ -4495,9 +4495,9 @@ snapshots: array-union@2.1.0: {} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/015c803a80288e3345ec55f8963015a626509007: + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/f7ab641ad3386d44364e227d97ba0dc847de08d1: dependencies: - koffi: 2.12.0 + koffi: 2.15.0 ws: 8.18.0 transitivePeerDependencies: - bufferutil @@ -5553,7 +5553,7 @@ snapshots: dependencies: json-buffer: 3.0.1 - koffi@2.12.0: {} + koffi@2.15.0: {} lazy-val@1.0.5: {} diff --git a/src/@types/settings.d.ts b/src/@types/settings.d.ts index a585f81..b5a05be 100644 --- a/src/@types/settings.d.ts +++ b/src/@types/settings.d.ts @@ -66,5 +66,8 @@ export interface Settings { additionalArguments: string; noBundleUpdates: boolean; overlayButtonColor: string; + processScanning: boolean; + windowsLegacyScanning: boolean; + scanInterval: number; modCache?: Record; } diff --git a/src/common/config.ts b/src/common/config.ts index a2ea050..2173567 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -10,6 +10,9 @@ const defaults: Settings = { bounceOnPing: false, legcordCSP: true, minimizeToTray: true, + processScanning: true, + windowsLegacyScanning: false, + scanInterval: 5000, overlayButtonColor: "#121214", keybinds: [], audio: { diff --git a/src/discord/rpcProcess.ts b/src/discord/rpcProcess.ts index 575a509..23286f9 100644 --- a/src/discord/rpcProcess.ts +++ b/src/discord/rpcProcess.ts @@ -1,5 +1,6 @@ import path from "node:path"; import { type BrowserWindow, utilityProcess } from "electron"; +import { getConfig } from "../common/config.js"; import { getDetectables } from "../common/detectables.js"; import { createInviteWindow } from "./window.js"; @@ -8,7 +9,15 @@ export let processList = []; export function startRPC(window: BrowserWindow) { child = utilityProcess.fork(path.join(import.meta.dirname, "rpc.js"), undefined, { - env: { detectables: JSON.stringify(getDetectables()) }, + env: { + detectables: JSON.stringify(getDetectables()), + settings: JSON.stringify({ + processScanning: getConfig("processScanning"), + windowsLegacyScanning: getConfig("windowsLegacyScanning"), + scanInterval: getConfig("scanInterval"), + }), + }, + serviceName: "legcord-rpc", }); child.on("spawn", () => { diff --git a/src/rpc.ts b/src/rpc.ts index 3ed3d60..4b593ac 100644 --- a/src/rpc.ts +++ b/src/rpc.ts @@ -1,10 +1,13 @@ // this file is executed in the utility process // check window.ts for more details // see more here https://www.electronjs.org/docs/latest/api/utility-process -import RPCServer, { type GameList } from "arrpc"; +import RPCServer, { type ServerSettings, type GameList } from "arrpc"; const detectables: GameList = process.env.detectables ? JSON.parse(process.env.detectables) : []; -const RPC = new RPCServer(detectables); +const settings: ServerSettings = process.env.settings + ? JSON.parse(process.env.settings) + : { processScanning: true, windowsLegacyScanning: false, scanInterval: 5000 }; +const RPC = new RPCServer(detectables, settings); RPC.on("activity", (data: string) => { console.log(data); diff --git a/src/shelter/settings/pages/SettingsPage.tsx b/src/shelter/settings/pages/SettingsPage.tsx index 670660c..10751ac 100644 --- a/src/shelter/settings/pages/SettingsPage.tsx +++ b/src/shelter/settings/pages/SettingsPage.tsx @@ -1,7 +1,6 @@ import { Show } from "solid-js"; import type { Settings } from "../../../@types/settings.js"; import { DropdownItem } from "../components/DropdownItem.jsx"; -import { HeroUpdater } from "../components/HeroUpdater.jsx"; import { TextBoxItem } from "../components/TextBoxItem.jsx"; import { setConfig, toggleMod } from "../settings.js"; import classes from "./SettingsPage.module.css"; @@ -16,7 +15,6 @@ const settings = store.settings as Settings; export function SettingsPage() { return ( <> -
    {store.i18n["settings-category-mods"]}
    @@ -41,13 +39,6 @@ export function SettingsPage() { > Equicord - setConfig("inviteWebsocket", e, true)} - > - {store.i18n["settings-invitewebsocket"]} - setConfig("windowStyle", v as Settings["windowStyle"], true)} @@ -262,6 +253,40 @@ export function SettingsPage() { > {store.i18n["settings-sleepInBackground"]} +
    + arRPC +
    + setConfig("inviteWebsocket", e, true)} + > + {store.i18n["settings-invitewebsocket"]} + + + setConfig("processScanning", e, true)} + > + {store.i18n["settings-processScanning"]} + + + setConfig("windowsLegacyScanning", e, true)} + > + {store.i18n["settings-windowsLegacyScanning"]} + + + setConfig("scanInterval", Number(v))} + /> +
    {store.i18n["settings-category-debug"]}
    From ce8f8c1b5b46f316eb9dcc17c1f7c66a233e3a7f Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 2 Jan 2026 15:55:01 +0100 Subject: [PATCH 697/844] chore: bump arrpc --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 330d99f..7c96aa6 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "xml-formatter": "^3.6.6" }, "dependencies": { - "arrpc": "https://github.com/Legcord/arrpc.git#f7ab641ad3386d44364e227d97ba0dc847de08d1", + "arrpc": "https://github.com/Legcord/arrpc.git#811ed990be17a10ac5c6e992133f4172c6ec8640", "electron-context-menu": "^4.0.4", "electron-is-dev": "^3.0.1", "electron-updater": "^6.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 20c9519..7a8b59c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: arrpc: - specifier: https://github.com/Legcord/arrpc.git#f7ab641ad3386d44364e227d97ba0dc847de08d1 - version: https://codeload.github.com/Legcord/arrpc/tar.gz/f7ab641ad3386d44364e227d97ba0dc847de08d1 + specifier: https://github.com/Legcord/arrpc.git#811ed990be17a10ac5c6e992133f4172c6ec8640 + version: https://codeload.github.com/Legcord/arrpc/tar.gz/811ed990be17a10ac5c6e992133f4172c6ec8640 electron-context-menu: specifier: ^4.0.4 version: 4.0.4 @@ -1369,8 +1369,8 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/f7ab641ad3386d44364e227d97ba0dc847de08d1: - resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/f7ab641ad3386d44364e227d97ba0dc847de08d1} + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/811ed990be17a10ac5c6e992133f4172c6ec8640: + resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/811ed990be17a10ac5c6e992133f4172c6ec8640} version: 3.5.0 hasBin: true @@ -4495,7 +4495,7 @@ snapshots: array-union@2.1.0: {} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/f7ab641ad3386d44364e227d97ba0dc847de08d1: + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/811ed990be17a10ac5c6e992133f4172c6ec8640: dependencies: koffi: 2.15.0 ws: 8.18.0 From 5ce1fb67f67ab8654abeee83f85b213d449947ca Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 2 Jan 2026 16:09:24 +0100 Subject: [PATCH 698/844] fix: SegmentedControl not updating visually --- .../settings/components/SegmentedControl.tsx | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/shelter/settings/components/SegmentedControl.tsx b/src/shelter/settings/components/SegmentedControl.tsx index b5fff3c..039690e 100644 --- a/src/shelter/settings/components/SegmentedControl.tsx +++ b/src/shelter/settings/components/SegmentedControl.tsx @@ -9,15 +9,21 @@ export const SegmentedControl = (props: { return (
    - {(opt) => ( -
    props.onChange(String(opt.value))} - > - {opt.label} -
    - )} + {(opt) => { + const isSelected = () => String(opt.value) === String(props.value); + + return ( + // biome-ignore lint/a11y/useFocusableInteractive: FIX-ME + + ); + }}
    ); From a255e4e06b8611b0d1c9b2a2e1648a2c5a376ba2 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 2 Jan 2026 22:46:53 +0100 Subject: [PATCH 699/844] fix: partial stream quality fix --- src/shelter/screenshare/index.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/shelter/screenshare/index.tsx b/src/shelter/screenshare/index.tsx index ced781a..65d0385 100644 --- a/src/shelter/screenshare/index.tsx +++ b/src/shelter/screenshare/index.tsx @@ -7,6 +7,7 @@ const { flux: { stores: { UserStore, MediaEngineStore }, dispatcher, + intercept }, ui: { openModal }, plugin: { store }, @@ -72,6 +73,19 @@ export function onLoad() { )); }); + intercept((dispatch) => { + if (dispatch.type === "MEDIA_ENGINE_SET_GO_LIVE_SOURCE") { + console.log("Intercepted stream quality change dispatch"); + console.log(dispatch) + dispatch.settings.qualityOptions = { + fps: store.fps, + resolution: store.resolution, + preset: 0 + }; + return dispatch; + } + + }); dispatcher.subscribe("MEDIA_ENGINE_VIDEO_SOURCE_QUALITY_CHANGED", onStreamQualityChange); dispatcher.subscribe("STREAM_DELETE", onStreamEnd); } From cb6072a853d7fc36fe1a6d5b666ee3ef7e238566 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 2 Jan 2026 22:50:04 +0100 Subject: [PATCH 700/844] fix: splash coming up when start minimized is on --- src/shelter/screenshare/index.tsx | 7 +++---- src/splash/main.ts | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/shelter/screenshare/index.tsx b/src/shelter/screenshare/index.tsx index 65d0385..3e44f5e 100644 --- a/src/shelter/screenshare/index.tsx +++ b/src/shelter/screenshare/index.tsx @@ -7,7 +7,7 @@ const { flux: { stores: { UserStore, MediaEngineStore }, dispatcher, - intercept + intercept, }, ui: { openModal }, plugin: { store }, @@ -76,15 +76,14 @@ export function onLoad() { intercept((dispatch) => { if (dispatch.type === "MEDIA_ENGINE_SET_GO_LIVE_SOURCE") { console.log("Intercepted stream quality change dispatch"); - console.log(dispatch) + console.log(dispatch); dispatch.settings.qualityOptions = { fps: store.fps, resolution: store.resolution, - preset: 0 + preset: 0, }; return dispatch; } - }); dispatcher.subscribe("MEDIA_ENGINE_VIDEO_SOURCE_QUALITY_CHANGED", onStreamQualityChange); dispatcher.subscribe("STREAM_DELETE", onStreamEnd); diff --git a/src/splash/main.ts b/src/splash/main.ts index 5bd1e57..ee49b58 100644 --- a/src/splash/main.ts +++ b/src/splash/main.ts @@ -5,6 +5,7 @@ import { getConfig } from "../common/config.js"; export let splashWindow: BrowserWindow; export async function createSplashWindow(): Promise { + if (getConfig("startMinimized")) return; splashWindow = new BrowserWindow({ width: 300, height: 350, From a9d30eb0dfd0fbe6defc2664bfc7c94d09e3c55b Mon Sep 17 00:00:00 2001 From: MahmodZE <97690050+MahmodZE@users.noreply.github.com> Date: Wed, 7 Jan 2026 09:16:16 -0800 Subject: [PATCH 701/844] fixed a launch failure related to global shortcuts (#1004) --- src/discord/globalKeybinds.ts | 8 +++++--- src/shelter/settings/components/KeybindMaker.tsx | 14 ++++++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/discord/globalKeybinds.ts b/src/discord/globalKeybinds.ts index 297281d..40d6e76 100644 --- a/src/discord/globalKeybinds.ts +++ b/src/discord/globalKeybinds.ts @@ -8,9 +8,11 @@ export function registerGlobalKeybinds() { const keybinds = getConfig("keybinds"); keybinds.forEach((keybind: Keybind) => { if (keybind.enabled && keybind.global) { - globalShortcut.register(keybind.accelerator, () => { - runAction(keybind); - }); + try { + globalShortcut.register(keybind.accelerator, () => { + runAction(keybind); + }); + } catch {} } }); } diff --git a/src/shelter/settings/components/KeybindMaker.tsx b/src/shelter/settings/components/KeybindMaker.tsx index d541cbb..b8a8e8b 100644 --- a/src/shelter/settings/components/KeybindMaker.tsx +++ b/src/shelter/settings/components/KeybindMaker.tsx @@ -33,6 +33,7 @@ export const KeybindMaker = (props: { close: () => void }) => { let logged: string[] = []; let containsNonModifier = false; + let containsNumpadKey = false; let timeout: NodeJS.Timeout | null = null; function log(event: KeyboardEvent) { const key = event.key.replace(" ", "Space"); @@ -41,7 +42,11 @@ export const KeybindMaker = (props: { close: () => void }) => { } else { console.log(key); logged.unshift(key); - if (event.location === 0) containsNonModifier = true; + if (event.location === 0) { + containsNonModifier = true; + } else if (event.location === 3) { + containsNumpadKey = true; + } setAccelerator(logged.join("+")); } if (timeout) clearTimeout(timeout); @@ -66,6 +71,7 @@ export const KeybindMaker = (props: { close: () => void }) => { logged = []; containsNonModifier = false; + containsNumpadKey = false; setAccelerator(""); console.log("Recording start"); document.body.addEventListener("keyup", log); @@ -93,8 +99,8 @@ export const KeybindMaker = (props: { close: () => void }) => {
    Accelerator
    - -

    Modifier-only shortcuts are not supported.

    + +

    This key combination is invalid or not supported.

    @@ -152,7 +158,7 @@ export const KeybindMaker = (props: { close: () => void }) => { confirmText="Add" onConfirm={save} close={props.close} - disabled={recording() || !accelerator() || !containsNonModifier} + disabled={recording() || !accelerator() || !containsNonModifier || containsNumpadKey} /> ); From 1382acd0c5f8f83954d04a63a60906df2c7c16e4 Mon Sep 17 00:00:00 2001 From: MahmodZE <97690050+MahmodZE@users.noreply.github.com> Date: Thu, 8 Jan 2026 10:37:43 -0800 Subject: [PATCH 702/844] =?UTF-8?q?fix:=20screenshare=20picker=20modal=20c?= =?UTF-8?q?loses=20on=20click-outside=20and=20won=E2=80=99t=20reopen=20(#1?= =?UTF-8?q?002)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/@types/legcordWindow.d.ts | 5 ++++- src/shelter/screenshare/components/ScreensharePicker.tsx | 4 +++- src/shelter/screenshare/components/SourceCard.tsx | 4 +++- src/shelter/screenshare/index.tsx | 3 +-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/@types/legcordWindow.d.ts b/src/@types/legcordWindow.d.ts index a043711..1923e8f 100644 --- a/src/@types/legcordWindow.d.ts +++ b/src/@types/legcordWindow.d.ts @@ -1,5 +1,6 @@ import type { Node } from "@vencord/venmic"; import type { Game, GameList, ProcessInfo } from "arrpc"; +import type { IPCSources } from "../shelter/screenshare/components/SourceCard.tsx"; import type { Keybind } from "./keybind.js"; import type { Settings } from "./settings.js"; import type { ThemeManifest } from "./themeManifest.js"; @@ -45,7 +46,9 @@ export interface LegcordWindow { isPowerSavingEnabled: () => boolean; }; screenshare: { - getSources: undefined; + getSources: ( + callback: (event: Electron.IpcRendererEvent, sources: Array, ...args: unknown[]) => void, + ) => void; start: (id: string, name: string, audio: boolean) => void; venmicStart: (include: Node[]) => Promise; venmicSystemStart: (exclude: Node[]) => Promise; diff --git a/src/shelter/screenshare/components/ScreensharePicker.tsx b/src/shelter/screenshare/components/ScreensharePicker.tsx index 08b673a..9521b8a 100644 --- a/src/shelter/screenshare/components/ScreensharePicker.tsx +++ b/src/shelter/screenshare/components/ScreensharePicker.tsx @@ -1,5 +1,5 @@ import type { Node } from "@vencord/venmic"; -import { For, Show, createSignal } from "solid-js"; +import { For, Show, createSignal, onCleanup } from "solid-js"; import { Dropdown } from "../../settings/components/Dropdown.jsx"; import { SegmentedControl } from "../../settings/components/SegmentedControl.jsx"; import classes from "./ScreensharePicker.module.css"; @@ -88,6 +88,8 @@ export const ScreensharePicker = (props: { window.legcord.screenshare.start("none", "", false); props.close(); } + onCleanup(closeAndSave); + return ( Screenshare diff --git a/src/shelter/screenshare/components/SourceCard.tsx b/src/shelter/screenshare/components/SourceCard.tsx index 3e842c9..ee817fc 100644 --- a/src/shelter/screenshare/components/SourceCard.tsx +++ b/src/shelter/screenshare/components/SourceCard.tsx @@ -1,9 +1,11 @@ +import type { NativeImage } from "electron"; import type { Accessor } from "solid-js"; import classes from "./SourceCard.module.css"; + export interface IPCSources { id: string; name: string; - thumbnail: HTMLCanvasElement; + thumbnail: NativeImage; } interface SourceCardProps { source: IPCSources; diff --git a/src/shelter/screenshare/index.tsx b/src/shelter/screenshare/index.tsx index 3e44f5e..7645b79 100644 --- a/src/shelter/screenshare/index.tsx +++ b/src/shelter/screenshare/index.tsx @@ -57,8 +57,7 @@ function onStreamEnd(dispatch: StreamDispatch) { export function onLoad() { log("Legcord Screenshare Module"); - // @ts-expect-error fix types - window.legcord.screenshare.getSources(async (_event: Event, sources: IPCSources[]) => { + window.legcord.screenshare.getSources(async (_event: Electron.IpcRendererEvent, sources: IPCSources[]) => { let audioSources: Node[] | undefined; if (window.legcord.platform === "linux") { const venmic = await window.legcord.screenshare.venmicList(); From 239fa917da3fbb9e81ad7c208084088068f7aa77 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 8 Jan 2026 21:00:07 +0100 Subject: [PATCH 703/844] chore: update arRPC --- package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- src/rpc.ts | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 7c96aa6..93be189 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "xml-formatter": "^3.6.6" }, "dependencies": { - "arrpc": "https://github.com/Legcord/arrpc.git#811ed990be17a10ac5c6e992133f4172c6ec8640", + "arrpc": "https://github.com/Legcord/arrpc.git#0605ca72fda920919e4e75e80945512b9fb347f1", "electron-context-menu": "^4.0.4", "electron-is-dev": "^3.0.1", "electron-updater": "^6.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7a8b59c..d825686 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: arrpc: - specifier: https://github.com/Legcord/arrpc.git#811ed990be17a10ac5c6e992133f4172c6ec8640 - version: https://codeload.github.com/Legcord/arrpc/tar.gz/811ed990be17a10ac5c6e992133f4172c6ec8640 + specifier: https://github.com/Legcord/arrpc.git#0605ca72fda920919e4e75e80945512b9fb347f1 + version: https://codeload.github.com/Legcord/arrpc/tar.gz/0605ca72fda920919e4e75e80945512b9fb347f1 electron-context-menu: specifier: ^4.0.4 version: 4.0.4 @@ -23,6 +23,10 @@ importers: ws: specifier: ^8.18.0 version: 8.18.0 + optionalDependencies: + '@vencord/venmic': + specifier: ^6.1.0 + version: 6.1.0 devDependencies: '@babel/preset-flow': specifier: ^7.25.9 @@ -87,10 +91,6 @@ importers: xml-formatter: specifier: ^3.6.6 version: 3.6.6 - optionalDependencies: - '@vencord/venmic': - specifier: ^6.1.0 - version: 6.1.0 packages: @@ -1369,8 +1369,8 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/811ed990be17a10ac5c6e992133f4172c6ec8640: - resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/811ed990be17a10ac5c6e992133f4172c6ec8640} + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/0605ca72fda920919e4e75e80945512b9fb347f1: + resolution: {tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/0605ca72fda920919e4e75e80945512b9fb347f1} version: 3.5.0 hasBin: true @@ -4495,7 +4495,7 @@ snapshots: array-union@2.1.0: {} - arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/811ed990be17a10ac5c6e992133f4172c6ec8640: + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/0605ca72fda920919e4e75e80945512b9fb347f1: dependencies: koffi: 2.15.0 ws: 8.18.0 diff --git a/src/rpc.ts b/src/rpc.ts index 4b593ac..6185877 100644 --- a/src/rpc.ts +++ b/src/rpc.ts @@ -7,7 +7,7 @@ const detectables: GameList = process.env.detectables ? JSON.parse(process.env.d const settings: ServerSettings = process.env.settings ? JSON.parse(process.env.settings) : { processScanning: true, windowsLegacyScanning: false, scanInterval: 5000 }; -const RPC = new RPCServer(detectables, settings); +const RPC = await new RPCServer(detectables, settings); RPC.on("activity", (data: string) => { console.log(data); From 933006f321e851c860daa6a7fcb0773e694c891f Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 8 Jan 2026 21:44:44 +0100 Subject: [PATCH 704/844] feat: rewrite rpc to use node worker threads Co-authored by: BMT --- src/discord/rpcProcess.ts | 37 +++++++++++++++++++------------------ src/rpc.ts | 26 +++++++++++++++++--------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/discord/rpcProcess.ts b/src/discord/rpcProcess.ts index 23286f9..68302ba 100644 --- a/src/discord/rpcProcess.ts +++ b/src/discord/rpcProcess.ts @@ -1,31 +1,29 @@ import path from "node:path"; -import { type BrowserWindow, utilityProcess } from "electron"; -import { getConfig } from "../common/config.js"; +import { Worker } from "node:worker_threads"; +import type { GameList } from "arrpc"; +import type { BrowserWindow } from "electron"; import { getDetectables } from "../common/detectables.js"; import { createInviteWindow } from "./window.js"; -let child: Electron.UtilityProcess; -export let processList = []; +let rpcWorker: Worker; +export let processList: GameList[] = []; export function startRPC(window: BrowserWindow) { - child = utilityProcess.fork(path.join(import.meta.dirname, "rpc.js"), undefined, { + const rpcPath = path.join(__dirname, "rpc.js"); + + rpcWorker = new Worker(rpcPath, { env: { + ...process.env, detectables: JSON.stringify(getDetectables()), - settings: JSON.stringify({ - processScanning: getConfig("processScanning"), - windowsLegacyScanning: getConfig("windowsLegacyScanning"), - scanInterval: getConfig("scanInterval"), - }), }, - serviceName: "legcord-rpc", }); - child.on("spawn", () => { + rpcWorker.on("online", () => { console.log("[arRPC] process started"); - console.log(child.pid); + console.log(rpcWorker.threadId); }); - child.on("message", (message) => { + rpcWorker.on("message", (message: string) => { const json = JSON.parse(message); if (json.type === "invite") { createInviteWindow(json.code); @@ -40,12 +38,15 @@ export function startRPC(window: BrowserWindow) { } }); - child.on("exit", () => { - console.log("[arRPC] process exited"); - console.log(child.pid); + rpcWorker.on("error", (err) => { + console.error("[arRPC] worker error:", err); + }); + + rpcWorker.on("exit", (code) => { + console.log("[arRPC] worker exited with code", code); }); } export function refreshProcessList() { - child.postMessage({ message: "refreshProcessList" }); + rpcWorker.postMessage({ message: "refreshProcessList" }); } diff --git a/src/rpc.ts b/src/rpc.ts index 6185877..56cf679 100644 --- a/src/rpc.ts +++ b/src/rpc.ts @@ -1,3 +1,4 @@ +import { parentPort } from "node:worker_threads"; // this file is executed in the utility process // check window.ts for more details // see more here https://www.electronjs.org/docs/latest/api/utility-process @@ -7,24 +8,31 @@ const detectables: GameList = process.env.detectables ? JSON.parse(process.env.d const settings: ServerSettings = process.env.settings ? JSON.parse(process.env.settings) : { processScanning: true, windowsLegacyScanning: false, scanInterval: 5000 }; + const RPC = await new RPCServer(detectables, settings); +// Guard parentPort +if (!parentPort) { + console.error("rpc.ts must be run inside a Worker!"); + process.exit(1); +} RPC.on("activity", (data: string) => { console.log(data); - const response = { type: "activity", data: data }; - process.parentPort.postMessage(JSON.stringify(response)); -}); -RPC.on("invite", (code: string) => { - console.log(code); - const response = { type: "invite", code: code }; - process.parentPort.postMessage(JSON.stringify(response)); + const response = { type: "activity", data }; + parentPort?.postMessage(JSON.stringify(response)); }); -process.parentPort.once("message", async (e) => { +RPC.on("invite", (code: string) => { + console.log(code); + const response = { type: "invite", code }; + parentPort?.postMessage(JSON.stringify(response)); +}); + +parentPort.once("message", async (e) => { if (e.data.message === "refreshProcessList") { const processes = await RPC.getProcessesList(); console.log(processes); const response = { type: "processList", data: processes }; - process.parentPort.postMessage(JSON.stringify(response)); + parentPort?.postMessage(JSON.stringify(response)); } }); From 4104aea0b89e600203e3b3d189649714877bcd70 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 8 Jan 2026 21:55:28 +0100 Subject: [PATCH 705/844] fix: refreshing processes --- src/rpc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpc.ts b/src/rpc.ts index 56cf679..d29c2a4 100644 --- a/src/rpc.ts +++ b/src/rpc.ts @@ -29,7 +29,7 @@ RPC.on("invite", (code: string) => { }); parentPort.once("message", async (e) => { - if (e.data.message === "refreshProcessList") { + if (e.message === "refreshProcessList") { const processes = await RPC.getProcessesList(); console.log(processes); const response = { type: "processList", data: processes }; From 90da98c5640d624f257ab605b7eaed40d5fd5d1a Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 9 Jan 2026 08:22:37 +0100 Subject: [PATCH 706/844] feat: discord deeplink protocol --- src/common/dom.ts | 10 ++++++++++ src/discord/window.ts | 13 ++++++++++++- src/main.ts | 2 +- src/protocol.ts | 1 + 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/common/dom.ts b/src/common/dom.ts index b690acd..af5af84 100644 --- a/src/common/dom.ts +++ b/src/common/dom.ts @@ -1,3 +1,5 @@ +import type { BrowserWindow } from "electron"; + export function addStyle(styleUrl: string): void { const style = document.createElement("link"); style.rel = "stylesheet"; @@ -28,3 +30,11 @@ export async function injectJS(inject: string): Promise { document.body.appendChild(el); } + +export function navigateTo(passedWindow: BrowserWindow, url: string): void { + console.log(`[legcord deeplink] Navigating to ${url}`); + passedWindow.webContents.executeJavaScript(` + history.pushState({}, null, "${url}"); + window.dispatchEvent(new PopStateEvent("popstate", {})); + `); +} diff --git a/src/discord/window.ts b/src/discord/window.ts index a60ba9d..c184cbf 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -12,6 +12,7 @@ import { } from "electron"; import contextMenu from "electron-context-menu"; import { firstRun, getConfig, setConfig } from "../common/config.js"; +import { navigateTo } from "../common/dom.js"; import { forceQuit, setForceQuit } from "../common/forceQuit.js"; import { initQuickCss, injectThemesMain } from "../common/themes.js"; import { getWindowState, setWindowState } from "../common/windowState.js"; @@ -75,7 +76,7 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { passedWindow.webContents.userAgent = userAgent; } if (mainWindows.length === 1) { - app.on("second-instance", (_event, _commandLine, _workingDirectory, additionalData) => { + app.on("second-instance", (_event, commandLine, _workingDirectory, additionalData) => { void (async () => { // Print out data received from the second instance. console.log(additionalData); @@ -87,6 +88,12 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { passedWindow.show(); passedWindow.focus(); } + if (commandLine && commandLine.length > 0) { + const lastArg = commandLine.pop(); + if (lastArg?.startsWith("discord://-")) { + navigateTo(passedWindow, lastArg.replace("discord://-", "")); + } + } } else { await init(); } @@ -211,6 +218,10 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { } initQuickCss(passedWindow); passedWindow.setTouchBar(mainTouchBar); + app.on("open-url", (_event, url) => { + navigateTo(passedWindow, url.replace("discord://-", "")); + }); + passedWindow.webContents.on("page-title-updated", (e, title) => { const legcordSuffix = " - Legcord"; /* identify */ diff --git a/src/main.ts b/src/main.ts index e78b401..5c8c80a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -26,7 +26,7 @@ export let settings: Settings; export let bypassSetup = false; checkForDataFolder(); checkIfConfigExists(); - +app.setAsDefaultProtocolClient("discord"); app.on("render-process-gone", (_event, _webContents, details) => { if (details.reason === "crashed") { app.relaunch(); diff --git a/src/protocol.ts b/src/protocol.ts index 030a628..9c721c9 100644 --- a/src/protocol.ts +++ b/src/protocol.ts @@ -16,6 +16,7 @@ protocol.registerSchemesAsPrivileged([ ]); void app.whenReady().then(() => { + // Legcord custom internal protocol protocol.handle("legcord", (req) => { if (req.url.startsWith("legcord://plugins/")) { const url = req.url.replace("legcord://plugins/", "").split("/"); From d218831593bfd376fd54f84bd3fb25e4830407e6 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 9 Jan 2026 08:25:15 +0100 Subject: [PATCH 707/844] fix: include discord protocol in build config --- electron-builder.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/electron-builder.ts b/electron-builder.ts index f85cdbd..492941f 100644 --- a/electron-builder.ts +++ b/electron-builder.ts @@ -5,7 +5,12 @@ export const config: Configuration = { productName: "Legcord", artifactName: "Legcord-${version}-${os}-${arch}.${ext}", beforePack: "./scripts/build/sandboxFix.cjs", - + protocols: [ + { + name: "Discord", + schemes: ["discord"], + }, + ], mac: { category: "public.app-category.social-networking", darkModeSupport: true, From 0cbe94ff0bf910039870d962f6ab568dba7f0abf Mon Sep 17 00:00:00 2001 From: Patrick <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 9 Jan 2026 08:55:04 +0100 Subject: [PATCH 708/844] feat: open discord invites inside discord remove old invite manager --- src/common/dom.ts | 1 + src/discord/rpcProcess.ts | 4 ++-- src/discord/tray.ts | 7 +++++-- src/discord/window.ts | 36 +++++------------------------------- 4 files changed, 13 insertions(+), 35 deletions(-) diff --git a/src/common/dom.ts b/src/common/dom.ts index af5af84..5e210b5 100644 --- a/src/common/dom.ts +++ b/src/common/dom.ts @@ -37,4 +37,5 @@ export function navigateTo(passedWindow: BrowserWindow, url: string): void { history.pushState({}, null, "${url}"); window.dispatchEvent(new PopStateEvent("popstate", {})); `); + passedWindow.focus(); } diff --git a/src/discord/rpcProcess.ts b/src/discord/rpcProcess.ts index 68302ba..084ee3a 100644 --- a/src/discord/rpcProcess.ts +++ b/src/discord/rpcProcess.ts @@ -3,7 +3,7 @@ import { Worker } from "node:worker_threads"; import type { GameList } from "arrpc"; import type { BrowserWindow } from "electron"; import { getDetectables } from "../common/detectables.js"; -import { createInviteWindow } from "./window.js"; +import { navigateTo } from "../common/dom.js"; let rpcWorker: Worker; export let processList: GameList[] = []; @@ -26,7 +26,7 @@ export function startRPC(window: BrowserWindow) { rpcWorker.on("message", (message: string) => { const json = JSON.parse(message); if (json.type === "invite") { - createInviteWindow(json.code); + navigateTo(window, `/invite/${json.code}`); } else if (json.type === "activity") { console.log("activity pulse"); console.log(json.data); diff --git a/src/discord/tray.ts b/src/discord/tray.ts index 5f6b1c0..68c7a35 100644 --- a/src/discord/tray.ts +++ b/src/discord/tray.ts @@ -1,9 +1,10 @@ import { join } from "node:path"; import { Menu, Tray, app, nativeImage } from "electron"; import { getConfig } from "../common/config.js"; +import { navigateTo } from "../common/dom.js"; import { setForceQuit } from "../common/forceQuit.js"; import { getDisplayVersion } from "../common/version.js"; -import { createInviteWindow, mainWindows } from "./window.js"; +import { mainWindows } from "./window.js"; export let tray: Tray; export function createTray() { @@ -66,7 +67,9 @@ export function createTray() { { label: "Support Discord Server", click() { - void createInviteWindow("TnhxcqynZ2"); + mainWindows.forEach((mainWindow) => { + navigateTo(mainWindow, "/invite/TnhxcqynZ2"); + }); }, }, { diff --git a/src/discord/window.ts b/src/discord/window.ts index c184cbf..37f4ca6 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -89,6 +89,7 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { passedWindow.focus(); } if (commandLine && commandLine.length > 0) { + console.log(commandLine); const lastArg = commandLine.pop(); if (lastArg?.startsWith("discord://-")) { navigateTo(passedWindow, lastArg.replace("discord://-", "")); @@ -292,6 +293,10 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { }); setForceQuit(true); }); + passedWindow.webContents.session.webRequest.onBeforeRequest((details, callback) => { + if (details.url.includes("ws://127.0.0.1:")) return callback({ cancel: true }); + return callback({}); + }); passedWindow.on("focus", () => { void passedWindow.webContents.executeJavaScript(`document.body.removeAttribute("unFocused");`); }); @@ -396,34 +401,3 @@ export function createWindow() { mainWindows.push(mainWindow); doAfterDefiningTheWindow(mainWindow); } - -export function createInviteWindow(code: string): void { - inviteWindow = new BrowserWindow({ - width: 800, - height: 600, - title: "Legcord Invite Manager", - darkTheme: true, - icon: getConfig("customIcon") ?? path.join(import.meta.dirname, "../", "/assets/desktop.png"), - frame: true, - autoHideMenuBar: getConfig("autoHideMenuBar"), - webPreferences: { - sandbox: false, - spellcheck: getConfig("spellcheck"), - }, - }); - const formInviteURL = `https://discord.com/invite/${code}`; - inviteWindow.webContents.session.webRequest.onBeforeRequest((details, callback) => { - if (details.url.includes("ws://")) return callback({ cancel: true }); - return callback({}); - }); - // NOTE - This shouldn't matter, since below we have an event on it - void inviteWindow.loadURL(formInviteURL); - inviteWindow.webContents.once("did-finish-load", () => { - if (!mainWindows[0].webContents.isLoading()) { - inviteWindow.show(); - inviteWindow.webContents.once("will-navigate", () => { - inviteWindow.close(); - }); - } - }); -} From 14143820bf066d9681f86d9c839e859ceb2efd90 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 9 Jan 2026 09:04:27 +0100 Subject: [PATCH 709/844] feat: better touchbar handling --- src/discord/touchbar.ts | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/discord/touchbar.ts b/src/discord/touchbar.ts index aad3792..f9f0e73 100644 --- a/src/discord/touchbar.ts +++ b/src/discord/touchbar.ts @@ -1,6 +1,7 @@ import { existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs"; import { join } from "node:path"; import { TouchBar, app, nativeImage } from "electron"; +import { navigateTo } from "../common/dom.js"; import { deafenToggle, leaveCall, muteToggle } from "../common/keybindActions.js"; import { mainWindows } from "./window.js"; @@ -16,20 +17,8 @@ const scrollableList = new TouchBar({ select(selectedIndex) { //@ts-expect-error Electron types are wrong const guildID = guildItems[selectedIndex].accessibilityLabel; - - mainWindows.forEach((mainWindow) => { - mainWindow.webContents.executeJavaScript(`shelter.flux.dispatcher.dispatch({ - "type": "CHANNEL_PRELOAD", - "guildId": "${guildID}", - "channelId": null, - "context": "APP" - })`); - mainWindow.webContents.executeJavaScript(`shelter.flux.dispatcher.dispatch({ - "type": "CHANNEL_SELECT", - "guildId": "${guildID}", - "channelId": null, - "messageId": null - })`); + mainWindows.forEach((win) => { + navigateTo(win, `/channels/${guildID}`); }); }, }), From 938dd5f948fb2f7310e2220f24580e86cfd841e4 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 9 Jan 2026 09:13:18 +0100 Subject: [PATCH 710/844] fix: exit arrpc gracefully --- src/discord/rpcProcess.ts | 7 +++++++ src/discord/window.ts | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/discord/rpcProcess.ts b/src/discord/rpcProcess.ts index 084ee3a..2816be6 100644 --- a/src/discord/rpcProcess.ts +++ b/src/discord/rpcProcess.ts @@ -47,6 +47,13 @@ export function startRPC(window: BrowserWindow) { }); } +export function stopRPC() { + if (rpcWorker) { + rpcWorker.terminate(); + console.log("[arRPC] process terminated"); + } +} + export function refreshProcessList() { rpcWorker.postMessage({ message: "refreshProcessList" }); } diff --git a/src/discord/window.ts b/src/discord/window.ts index 37f4ca6..79d51d5 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -20,7 +20,7 @@ import { init } from "../main.js"; import { registerGlobalKeybinds } from "./globalKeybinds.js"; import { registerIpc } from "./ipc.js"; import { setMenu } from "./menu.js"; -import { startRPC } from "./rpcProcess.js"; +import { startRPC, stopRPC } from "./rpcProcess.js"; import { registerCustomHandler } from "./screenshare.js"; import { mainTouchBar } from "./touchbar.js"; import { createTray, tray } from "./tray.js"; @@ -283,6 +283,7 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { } }); app.on("before-quit", () => { + stopRPC(); const [width, height] = passedWindow.getSize(); setWindowState({ width, From 42aa4b30f3c9ef44f8a48bc09fa4d0c982d03ada Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 9 Jan 2026 09:45:25 +0100 Subject: [PATCH 711/844] feat: add detectable modal --- .../components/AddDetectableModal.tsx | 53 +++++++++++++------ .../settings/pages/RegisteredGamesPage.tsx | 25 +++++---- 2 files changed, 51 insertions(+), 27 deletions(-) diff --git a/src/shelter/settings/components/AddDetectableModal.tsx b/src/shelter/settings/components/AddDetectableModal.tsx index 0ad3cbf..2793045 100644 --- a/src/shelter/settings/components/AddDetectableModal.tsx +++ b/src/shelter/settings/components/AddDetectableModal.tsx @@ -1,7 +1,5 @@ -import { Show, createSignal } from "solid-js"; -import type { KeybindActions } from "../../../@types/keybind.js"; -import { Dropdown } from "./Dropdown.jsx"; -import classes from "./KeybindMaker.module.css"; +import type { Game } from "arrpc"; +import { createSignal } from "solid-js"; const { ui: { ModalRoot, @@ -17,14 +15,15 @@ const { }, plugin: { store }, } = shelter; -export const AddDetectableModal = (props: { close: () => void }) => { +export const AddDetectableModal = (props: { close: () => void; executable: string }) => { const [appName, setAppName] = createSignal(""); const [appId, setAppId] = createSignal(""); - const [executable, setExecutable] = createSignal(""); + const [themes, setThemes] = createSignal(""); + const [aliases, setAliases] = createSignal(""); const [enabled, setEnabled] = createSignal(true); function save() { - if (!appName().trim() || !appId().trim() || !executable().trim()) { + if (!appName().trim() || !appId().trim() || !props.executable) { return showToast({ title: "Missing fields", content: "Please fill in all fields before adding.", @@ -32,15 +31,33 @@ export const AddDetectableModal = (props: { close: () => void }) => { }); } const current = store.settings.detectables || []; - const detectable = { + const game: Game = { name: appName().trim(), + executables: [ + { + name: props.executable, + is_launcher: false, + os: window.legcord.platform as "win32" | "linux" | "darwin", + }, + ], id: appId().trim(), - executable: executable().trim(), - enabled: enabled(), + aliases: + aliases() + .split(",") + .map((a) => a.trim()) || [], + hook: false, + overlay: true, + overlay_compatibility_hook: false, + overlay_methods: null, + overlay_warn: false, + themes: + themes() + .split(",") + .map((t) => t.trim()) || [], }; - current.push(detectable); + current.push(game); store.settings.detectables = current; - window.legcord.rpc.addDetectable(detectable); + window.legcord.rpc.addDetectable(game); props.close(); } @@ -48,16 +65,18 @@ export const AddDetectableModal = (props: { close: () => void }) => { Add Detectable Application -
    App Name
    +
    App Name*
    -
    App ID
    +
    App ID*
    -
    Executable
    - +
    Themes
    + -
    + {(detectable) =>
    {detectable.name}
    }
    ); } From b37f65ffcc6cb196141f2635df66e32821c04a8e Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Fri, 9 Jan 2026 10:03:08 +0100 Subject: [PATCH 712/844] fix: theme/keybind card styling --- src/shelter/settings/components/KeybindCard.module.css | 2 ++ src/shelter/settings/components/ThemesCard.module.css | 1 + 2 files changed, 3 insertions(+) diff --git a/src/shelter/settings/components/KeybindCard.module.css b/src/shelter/settings/components/KeybindCard.module.css index 2f76ff9..d30cfd1 100644 --- a/src/shelter/settings/components/KeybindCard.module.css +++ b/src/shelter/settings/components/KeybindCard.module.css @@ -17,7 +17,9 @@ .eyebrow { margin-bottom: 0px !important; + color: var(--text-strong); } + .btn { border: none; background: none; diff --git a/src/shelter/settings/components/ThemesCard.module.css b/src/shelter/settings/components/ThemesCard.module.css index ebeb749..10583f9 100644 --- a/src/shelter/settings/components/ThemesCard.module.css +++ b/src/shelter/settings/components/ThemesCard.module.css @@ -16,6 +16,7 @@ .eyebrow { margin-bottom: 0px !important; + color: var(--text-strong); } .btn { border: none; From b1e8e208f85093b7cbfd3ae7d180b09b4bba13ae Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 11 Jan 2026 10:01:48 +0100 Subject: [PATCH 713/844] chore: translations update [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Максим Горпиніч Translate-URL: https://hosted.weblate.org/projects/armcord/client/uk/ Translation: Legcord/Client --- assets/lang/uk.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/assets/lang/uk.json b/assets/lang/uk.json index bb5a00e..ce6cdf4 100644 --- a/assets/lang/uk.json +++ b/assets/lang/uk.json @@ -131,5 +131,11 @@ "settings-category-mods": "Моди", "settings-category-behaviour": "Поведінка", "settings-category-legacy": "Застарілі функції", - "settings-category-debug": "Параметри налагодження" + "settings-category-debug": "Параметри налагодження", + "settings-processScanning": "Сканування процесу", + "settings-processScanning-desc": "Увімкнення сканування запущених ігор для покращення виявлення Rich Presence.", + "settings-windowsLegacyScanning": "Сканування застарілих версій Windows", + "settings-windowsLegacyScanning-desc": "Використовує застарілий метод для процесів сканування у Windows (до версії 1.1.6). Може покращити сумісність у деяких системах, але менш ефективний.", + "settings-scanInterval": "Інтервал сканування (мс)", + "settings-scanInterval-desc": "Встановлює частоту (у мілісекундах) сканування процесу. Нижчі значення можуть покращити швидкість виявлення, але можуть збільшити використання процесора." } From 4a7fc671a74ce64dee63d3c7ee8b809137a619cc Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sat, 17 Jan 2026 21:19:51 +0100 Subject: [PATCH 714/844] feat: settings cache --- src/common/config.ts | 33 +++++++++++++ src/common/lang.ts | 66 +++++++++++++++++++++++-- src/common/themes.ts | 100 +++++++++++++++++++++++++++++++++----- src/common/windowState.ts | 21 ++++++++ 4 files changed, 205 insertions(+), 15 deletions(-) diff --git a/src/common/config.ts b/src/common/config.ts index 2173567..9bcf46d 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -4,6 +4,11 @@ import { app, dialog } from "electron"; import type { Settings } from "../@types/settings.js"; import { getWindowStateLocation } from "./windowState.js"; export let firstRun: boolean; + +// Performance optimization: Cache config to avoid reading file on every call +let configCache: Settings | null = null; +let configCacheTime = 0; +const CONFIG_CACHE_TTL = 1000; // Cache for 1 second const defaults: Settings = { windowStyle: "default", channel: "stable", @@ -82,8 +87,17 @@ export function getConfig(object: K): Settings[K] { if (process.argv.includes("--safe-mode")) { return safeMode[object]; } + + // Performance optimization: Use cached config if available and fresh + const now = Date.now(); + if (configCache && (now - configCacheTime) < CONFIG_CACHE_TTL) { + return configCache[object]; + } + const rawData = readFileSync(getConfigLocation(), "utf-8"); const returnData = JSON.parse(rawData) as Settings; + configCache = returnData; + configCacheTime = now; return returnData[object]; } export function setConfig(object: K, toSet: Settings[K]): void { @@ -92,6 +106,10 @@ export function setConfig(object: K, toSet: Settings[K parsed[object] = toSet; const toSave = JSON.stringify(parsed, null, 4); writeFileSync(getConfigLocation(), toSave, "utf-8"); + + // Performance optimization: Update cache immediately + configCache = parsed; + configCacheTime = Date.now(); } export function setConfigBulk(object: Settings): void { let existingData = {}; @@ -106,6 +124,10 @@ export function setConfigBulk(object: Settings): void { // Write the merged data back to the file const toSave = JSON.stringify(mergedData, null, 4); writeFileSync(getConfigLocation(), toSave, "utf-8"); + + // Performance optimization: Update cache immediately + configCache = mergedData as Settings; + configCacheTime = Date.now(); } export function checkIfConfigExists(): void { const userDataPath = app.getPath("userData"); @@ -141,6 +163,10 @@ export function checkIfConfigIsBroken(): void { try { const settingsData = readFileSync(getConfigLocation(), "utf-8"); const settingsObject = JSON.parse(settingsData) as Settings; + + // Performance optimization: Update cache after validation + configCache = settingsObject; + configCacheTime = Date.now(); let configWasFine = true; const settingsKeys = Object.keys(settingsObject) as (keyof Settings)[]; @@ -166,6 +192,13 @@ export function checkIfConfigIsBroken(): void { console.log(`Missing config root entry ${missingKey}, setting default config for this entry...`); setConfig(missingKey, defaults[missingKey]); }); + + // Performance optimization: Ensure cache is updated after fixes + if (!configWasFine) { + const updatedData = readFileSync(getConfigLocation(), "utf-8"); + configCache = JSON.parse(updatedData) as Settings; + configCacheTime = Date.now(); + } console.log(configWasFine ? "Config is fine" : "Config is now fine"); } catch (e) { diff --git a/src/common/lang.ts b/src/common/lang.ts index cf6f367..d23811e 100644 --- a/src/common/lang.ts +++ b/src/common/lang.ts @@ -2,6 +2,14 @@ import fs from "node:fs"; import path from "node:path"; import { app } from "electron"; import type { i18nStrings } from "../@types/i18nStrings.js"; + +// Performance optimization: Cache language files to avoid reading on every call +let languageCache: i18nStrings | null = null; +let languageCacheTime = 0; +let languageConfigCache: string | null = null; +let languageConfigCacheTime = 0; +const LANGUAGE_CACHE_TTL = 5000; // Cache for 5 seconds + export function setLang(language: string): void { const langConfigFile = `${path.join(app.getPath("userData"), "/storage/")}lang.json`; if (!fs.existsSync(langConfigFile)) { @@ -13,10 +21,19 @@ export function setLang(language: string): void { const toSave = JSON.stringify(parsed, null, 4); console.log(`Setting language to ${language}`); fs.writeFileSync(langConfigFile, toSave, "utf-8"); + + // Performance optimization: Invalidate cache when language changes + languageConfigCache = language; + languageConfigCacheTime = Date.now(); + languageCache = null; // Invalidate language file cache } let language: string; export function getLang(object: string): string { - if (language === undefined) { + // Performance optimization: Use cached language config if available + const now = Date.now(); + if (languageConfigCache && (now - languageConfigCacheTime) < LANGUAGE_CACHE_TTL) { + language = languageConfigCache; + } else if (language === undefined) { try { const userDataPath = app.getPath("userData"); const storagePath = path.join(userDataPath, "/storage/"); @@ -24,29 +41,53 @@ export function getLang(object: string): string { const rawData = fs.readFileSync(langConfigFile, "utf-8"); const parsed = JSON.parse(rawData) as i18nStrings; language = parsed.lang; + languageConfigCache = language; + languageConfigCacheTime = now; } catch (_e) { console.log("Language config file doesn't exist. Fallback to English."); language = "en-US"; + languageConfigCache = language; + languageConfigCacheTime = now; } } if (language.length === 2) { language = `${language}-${language.toUpperCase()}`; } - let langPath = path.join(import.meta.dirname, "../", `/assets/lang/${language}.json`); + + // Performance optimization: Use cached language file if available + const normalizedLang = language; + if (languageCache && (now - languageCacheTime) < LANGUAGE_CACHE_TTL) { + if (languageCache[object] !== undefined) { + return languageCache[object]; + } + } + + let langPath = path.join(import.meta.dirname, "../", `/assets/lang/${normalizedLang}.json`); if (!fs.existsSync(langPath)) { langPath = path.join(import.meta.dirname, "../", "/assets/lang/en-US.json"); } let rawData = fs.readFileSync(langPath, "utf-8"); let parsed = JSON.parse(rawData) as i18nStrings; if (parsed[object] === undefined) { - console.log(`${object} is undefined in ${language}`); + console.log(`${object} is undefined in ${normalizedLang}`); langPath = path.join(import.meta.dirname, "../", "/assets/lang/en-US.json"); rawData = fs.readFileSync(langPath, "utf-8"); parsed = JSON.parse(rawData) as i18nStrings; } + + // Update cache + languageCache = parsed; + languageCacheTime = now; + return parsed[object]; } export function getRawLang(): i18nStrings { + // Performance optimization: Use cached result if available + const now = Date.now(); + if (languageCache && (now - languageCacheTime) < LANGUAGE_CACHE_TTL) { + return languageCache; + } + if (language === undefined) { try { const userDataPath = app.getPath("userData"); @@ -55,9 +96,13 @@ export function getRawLang(): i18nStrings { const rawData = fs.readFileSync(langConfigFile, "utf-8"); const parsed = JSON.parse(rawData) as i18nStrings; language = parsed.lang; + languageConfigCache = language; + languageConfigCacheTime = now; } catch (_e) { console.log("Language config file doesn't exist. Fallback to English."); language = "en-US"; + languageConfigCache = language; + languageConfigCacheTime = now; } } if (language.length === 2) { @@ -77,9 +122,20 @@ export function getRawLang(): i18nStrings { parsed[key] = fallbackParsed[key]; } } + + // Update cache + languageCache = parsed; + languageCacheTime = now; + return parsed; } export function getLangName(): string { + // Performance optimization: Use cached language config if available + const now = Date.now(); + if (languageConfigCache && (now - languageConfigCacheTime) < LANGUAGE_CACHE_TTL) { + return languageConfigCache; + } + if (language === undefined) { try { const userDataPath = app.getPath("userData"); @@ -88,9 +144,13 @@ export function getLangName(): string { const rawData = fs.readFileSync(langConfigFile, "utf-8"); const parsed = JSON.parse(rawData) as i18nStrings; language = parsed.lang; + languageConfigCache = language; + languageConfigCacheTime = now; } catch (_e) { console.log("Language config file doesn't exist. Fallback to English."); language = "en-US"; + languageConfigCache = language; + languageConfigCacheTime = now; } } if (language.length === 2) { diff --git a/src/common/themes.ts b/src/common/themes.ts index 4c31ce8..20f769e 100644 --- a/src/common/themes.ts +++ b/src/common/themes.ts @@ -3,6 +3,11 @@ import path from "node:path"; import { type BrowserWindow, app } from "electron"; import type { ThemeManifest } from "../@types/themeManifest.js"; import { mainWindows } from "../discord/window.js"; + +// Performance optimization: Cache theme manifests to avoid reading on every call +const themeManifestCache = new Map(); +let quickCssWatcher: fs.FSWatcher | null = null; + const userDataPath = app.getPath("userData"); const themesFolder = path.join(userDataPath, "/themes/"); function parseBDManifest(content: string) { @@ -82,6 +87,34 @@ function parseBDManifest(content: string) { return manifest; } +// Performance optimization: Get theme manifest with caching +function getThemeManifest(themeId: string): ThemeManifest | null { + const themePath = path.join(themesFolder, themeId); + const manifestPath = path.join(themePath, "manifest.json"); + + if (!fs.existsSync(manifestPath)) { + return null; + } + + // Check cache + const stats = fs.statSync(manifestPath); + const cached = themeManifestCache.get(themeId); + if (cached && cached.mtime === stats.mtimeMs) { + return cached.manifest; + } + + // Read and cache + try { + const manifestContent = fs.readFileSync(manifestPath, "utf8"); + const manifest = JSON.parse(manifestContent) as ThemeManifest; + themeManifestCache.set(themeId, { manifest, mtime: stats.mtimeMs }); + return manifest; + } catch (err) { + console.error(`Error reading theme manifest for ${themeId}:`, err); + return null; + } +} + export function injectThemesMain(browserWindow: BrowserWindow): void { if (process.argv.includes("--safe-mode")) return; if (!fs.existsSync(themesFolder)) { @@ -89,7 +122,8 @@ export function injectThemesMain(browserWindow: BrowserWindow): void { console.log("Created missing theme folder"); } browserWindow.webContents.on("did-finish-load", () => { - fs.readdirSync(themesFolder).forEach((file) => { + const files = fs.readdirSync(themesFolder); + for (const file of files) { const themePath = path.join(themesFolder, file); if (fs.statSync(themePath).isFile() && file.endsWith(".DS_Store")) { console.log(`[Theme Manager] Local theme detected: ${themePath}`); @@ -98,10 +132,12 @@ export function injectThemesMain(browserWindow: BrowserWindow): void { }); } else { try { - const manifest = fs.readFileSync(path.join(themePath, "manifest.json"), "utf8"); - const themeFile = JSON.parse(manifest) as ThemeManifest; + const themeFile = getThemeManifest(file); + if (!themeFile) continue; + if (themeFile.enabled === undefined) { - if (fs.readFileSync(`${userDataPath}/disabled.txt`).toString().includes(file)) { + const disabledPath = `${userDataPath}/disabled.txt`; + if (fs.existsSync(disabledPath) && fs.readFileSync(disabledPath).toString().includes(file)) { themeFile.enabled = false; } else { themeFile.enabled = true; @@ -121,7 +157,7 @@ export function injectThemesMain(browserWindow: BrowserWindow): void { console.error(err); } } - }); + } }); } @@ -137,9 +173,14 @@ export function uninstallTheme(id: string) { } export function setThemeEnabled(id: string, enabled: boolean) { - const manifest = JSON.parse( - fs.readFileSync(path.join(themesFolder, id, "/manifest.json"), "utf8"), - ) as ThemeManifest; + // Performance optimization: Use cached manifest if available + let manifest = getThemeManifest(id); + if (!manifest) { + manifest = JSON.parse( + fs.readFileSync(path.join(themesFolder, id, "/manifest.json"), "utf8"), + ) as ThemeManifest; + } + if (enabled !== manifest.enabled) { mainWindows.every((passedWindow) => { if (enabled) { @@ -157,6 +198,9 @@ export function setThemeEnabled(id: string, enabled: boolean) { } manifest.enabled = enabled; fs.writeFileSync(`${themesFolder}/${id}/manifest.json`, JSON.stringify(manifest)); + + // Performance optimization: Invalidate cache + themeManifestCache.delete(id); } export async function installTheme(linkOrPath: string) { @@ -192,10 +236,42 @@ export function initQuickCss(browserWindow: BrowserWindow) { } browserWindow.webContents.send("addTheme", "legcord-quick-css", fs.readFileSync(quickCssPath, "utf-8")); console.log("[Theme Manager] Loaded Quick CSS"); - fs.watchFile(quickCssPath, { interval: 1000 }, () => { - console.log("[Theme Manager] Quick CSS updated."); - browserWindow.webContents.send("removeTheme", "legcord-quick-css"); - browserWindow.webContents.send("addTheme", "legcord-quick-css", fs.readFileSync(quickCssPath, "utf-8")); + + // Performance optimization: Use fs.watch instead of fs.watchFile for better performance + // Clean up existing watcher if any + if (quickCssWatcher) { + quickCssWatcher.close(); + } + + // Performance optimization: Debounce file changes to avoid excessive updates + let updateTimeout: NodeJS.Timeout | null = null; + quickCssWatcher = fs.watch(quickCssPath, (eventType) => { + if (eventType === "change") { + // Debounce: wait 300ms before updating to batch rapid changes + if (updateTimeout) { + clearTimeout(updateTimeout); + } + updateTimeout = setTimeout(() => { + try { + console.log("[Theme Manager] Quick CSS updated."); + browserWindow.webContents.send("removeTheme", "legcord-quick-css"); + browserWindow.webContents.send("addTheme", "legcord-quick-css", fs.readFileSync(quickCssPath, "utf-8")); + } catch (err) { + console.error("[Theme Manager] Error updating Quick CSS:", err); + } + }, 300); + } + }); + + // Clean up watcher when window is closed + browserWindow.on("closed", () => { + if (quickCssWatcher) { + quickCssWatcher.close(); + quickCssWatcher = null; + } + if (updateTimeout) { + clearTimeout(updateTimeout); + } }); }); } diff --git a/src/common/windowState.ts b/src/common/windowState.ts index e4422ad..a68e4bb 100644 --- a/src/common/windowState.ts +++ b/src/common/windowState.ts @@ -2,6 +2,12 @@ import fs from "node:fs"; import path from "node:path"; import { app } from "electron"; import type { WindowState } from "../@types/windowState.js"; + +// Performance optimization: Cache window state to avoid reading file on every call +let windowStateCache: WindowState | null = null; +let windowStateCacheTime = 0; +const WINDOW_STATE_CACHE_TTL = 1000; // Cache for 1 second + export function getWindowStateLocation() { const userDataPath = app.getPath("userData"); const storagePath = path.join(userDataPath, "/storage/"); @@ -13,11 +19,21 @@ export function setWindowState(object: WindowState): void { const saveFile = `${storagePath}window.json`; const toSave = JSON.stringify(object, null, 4); fs.writeFileSync(saveFile, toSave, "utf-8"); + + // Performance optimization: Update cache immediately + windowStateCache = object; + windowStateCacheTime = Date.now(); } // NOTE - Similar to getConfig, this seems to return a promise when it has no async. Originally Promise export function getWindowState(object: K): WindowState[K] { + // Performance optimization: Use cached window state if available + const now = Date.now(); + if (windowStateCache && (now - windowStateCacheTime) < WINDOW_STATE_CACHE_TTL) { + return windowStateCache[object]; + } + const userDataPath = app.getPath("userData"); const storagePath = path.join(userDataPath, "/storage/"); const settingsFile = `${storagePath}window.json`; @@ -27,5 +43,10 @@ export function getWindowState(object: K): WindowSt const rawData = fs.readFileSync(settingsFile, "utf-8"); const returnData = JSON.parse(rawData) as WindowState; console.log(`[Window state manager] ${JSON.stringify(returnData)}`); + + // Update cache + windowStateCache = returnData; + windowStateCacheTime = now; + return returnData[object]; } From fa15156e04105bc749152cae9c2ce13da43d4429 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Sat, 17 Jan 2026 21:20:06 +0100 Subject: [PATCH 715/844] chore: linting --- src/common/config.ts | 14 +++++++------- src/common/lang.ts | 26 +++++++++++++------------- src/common/themes.ts | 28 +++++++++++++++------------- src/common/windowState.ts | 10 +++++----- 4 files changed, 40 insertions(+), 38 deletions(-) diff --git a/src/common/config.ts b/src/common/config.ts index 9bcf46d..0f086f1 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -87,13 +87,13 @@ export function getConfig(object: K): Settings[K] { if (process.argv.includes("--safe-mode")) { return safeMode[object]; } - + // Performance optimization: Use cached config if available and fresh const now = Date.now(); - if (configCache && (now - configCacheTime) < CONFIG_CACHE_TTL) { + if (configCache && now - configCacheTime < CONFIG_CACHE_TTL) { return configCache[object]; } - + const rawData = readFileSync(getConfigLocation(), "utf-8"); const returnData = JSON.parse(rawData) as Settings; configCache = returnData; @@ -106,7 +106,7 @@ export function setConfig(object: K, toSet: Settings[K parsed[object] = toSet; const toSave = JSON.stringify(parsed, null, 4); writeFileSync(getConfigLocation(), toSave, "utf-8"); - + // Performance optimization: Update cache immediately configCache = parsed; configCacheTime = Date.now(); @@ -124,7 +124,7 @@ export function setConfigBulk(object: Settings): void { // Write the merged data back to the file const toSave = JSON.stringify(mergedData, null, 4); writeFileSync(getConfigLocation(), toSave, "utf-8"); - + // Performance optimization: Update cache immediately configCache = mergedData as Settings; configCacheTime = Date.now(); @@ -163,7 +163,7 @@ export function checkIfConfigIsBroken(): void { try { const settingsData = readFileSync(getConfigLocation(), "utf-8"); const settingsObject = JSON.parse(settingsData) as Settings; - + // Performance optimization: Update cache after validation configCache = settingsObject; configCacheTime = Date.now(); @@ -192,7 +192,7 @@ export function checkIfConfigIsBroken(): void { console.log(`Missing config root entry ${missingKey}, setting default config for this entry...`); setConfig(missingKey, defaults[missingKey]); }); - + // Performance optimization: Ensure cache is updated after fixes if (!configWasFine) { const updatedData = readFileSync(getConfigLocation(), "utf-8"); diff --git a/src/common/lang.ts b/src/common/lang.ts index d23811e..d39c80f 100644 --- a/src/common/lang.ts +++ b/src/common/lang.ts @@ -21,7 +21,7 @@ export function setLang(language: string): void { const toSave = JSON.stringify(parsed, null, 4); console.log(`Setting language to ${language}`); fs.writeFileSync(langConfigFile, toSave, "utf-8"); - + // Performance optimization: Invalidate cache when language changes languageConfigCache = language; languageConfigCacheTime = Date.now(); @@ -31,7 +31,7 @@ let language: string; export function getLang(object: string): string { // Performance optimization: Use cached language config if available const now = Date.now(); - if (languageConfigCache && (now - languageConfigCacheTime) < LANGUAGE_CACHE_TTL) { + if (languageConfigCache && now - languageConfigCacheTime < LANGUAGE_CACHE_TTL) { language = languageConfigCache; } else if (language === undefined) { try { @@ -53,15 +53,15 @@ export function getLang(object: string): string { if (language.length === 2) { language = `${language}-${language.toUpperCase()}`; } - + // Performance optimization: Use cached language file if available const normalizedLang = language; - if (languageCache && (now - languageCacheTime) < LANGUAGE_CACHE_TTL) { + if (languageCache && now - languageCacheTime < LANGUAGE_CACHE_TTL) { if (languageCache[object] !== undefined) { return languageCache[object]; } } - + let langPath = path.join(import.meta.dirname, "../", `/assets/lang/${normalizedLang}.json`); if (!fs.existsSync(langPath)) { langPath = path.join(import.meta.dirname, "../", "/assets/lang/en-US.json"); @@ -74,20 +74,20 @@ export function getLang(object: string): string { rawData = fs.readFileSync(langPath, "utf-8"); parsed = JSON.parse(rawData) as i18nStrings; } - + // Update cache languageCache = parsed; languageCacheTime = now; - + return parsed[object]; } export function getRawLang(): i18nStrings { // Performance optimization: Use cached result if available const now = Date.now(); - if (languageCache && (now - languageCacheTime) < LANGUAGE_CACHE_TTL) { + if (languageCache && now - languageCacheTime < LANGUAGE_CACHE_TTL) { return languageCache; } - + if (language === undefined) { try { const userDataPath = app.getPath("userData"); @@ -122,20 +122,20 @@ export function getRawLang(): i18nStrings { parsed[key] = fallbackParsed[key]; } } - + // Update cache languageCache = parsed; languageCacheTime = now; - + return parsed; } export function getLangName(): string { // Performance optimization: Use cached language config if available const now = Date.now(); - if (languageConfigCache && (now - languageConfigCacheTime) < LANGUAGE_CACHE_TTL) { + if (languageConfigCache && now - languageConfigCacheTime < LANGUAGE_CACHE_TTL) { return languageConfigCache; } - + if (language === undefined) { try { const userDataPath = app.getPath("userData"); diff --git a/src/common/themes.ts b/src/common/themes.ts index 20f769e..8f8de2d 100644 --- a/src/common/themes.ts +++ b/src/common/themes.ts @@ -91,18 +91,18 @@ function parseBDManifest(content: string) { function getThemeManifest(themeId: string): ThemeManifest | null { const themePath = path.join(themesFolder, themeId); const manifestPath = path.join(themePath, "manifest.json"); - + if (!fs.existsSync(manifestPath)) { return null; } - + // Check cache const stats = fs.statSync(manifestPath); const cached = themeManifestCache.get(themeId); if (cached && cached.mtime === stats.mtimeMs) { return cached.manifest; } - + // Read and cache try { const manifestContent = fs.readFileSync(manifestPath, "utf8"); @@ -134,7 +134,7 @@ export function injectThemesMain(browserWindow: BrowserWindow): void { try { const themeFile = getThemeManifest(file); if (!themeFile) continue; - + if (themeFile.enabled === undefined) { const disabledPath = `${userDataPath}/disabled.txt`; if (fs.existsSync(disabledPath) && fs.readFileSync(disabledPath).toString().includes(file)) { @@ -176,11 +176,9 @@ export function setThemeEnabled(id: string, enabled: boolean) { // Performance optimization: Use cached manifest if available let manifest = getThemeManifest(id); if (!manifest) { - manifest = JSON.parse( - fs.readFileSync(path.join(themesFolder, id, "/manifest.json"), "utf8"), - ) as ThemeManifest; + manifest = JSON.parse(fs.readFileSync(path.join(themesFolder, id, "/manifest.json"), "utf8")) as ThemeManifest; } - + if (enabled !== manifest.enabled) { mainWindows.every((passedWindow) => { if (enabled) { @@ -198,7 +196,7 @@ export function setThemeEnabled(id: string, enabled: boolean) { } manifest.enabled = enabled; fs.writeFileSync(`${themesFolder}/${id}/manifest.json`, JSON.stringify(manifest)); - + // Performance optimization: Invalidate cache themeManifestCache.delete(id); } @@ -236,13 +234,13 @@ export function initQuickCss(browserWindow: BrowserWindow) { } browserWindow.webContents.send("addTheme", "legcord-quick-css", fs.readFileSync(quickCssPath, "utf-8")); console.log("[Theme Manager] Loaded Quick CSS"); - + // Performance optimization: Use fs.watch instead of fs.watchFile for better performance // Clean up existing watcher if any if (quickCssWatcher) { quickCssWatcher.close(); } - + // Performance optimization: Debounce file changes to avoid excessive updates let updateTimeout: NodeJS.Timeout | null = null; quickCssWatcher = fs.watch(quickCssPath, (eventType) => { @@ -255,14 +253,18 @@ export function initQuickCss(browserWindow: BrowserWindow) { try { console.log("[Theme Manager] Quick CSS updated."); browserWindow.webContents.send("removeTheme", "legcord-quick-css"); - browserWindow.webContents.send("addTheme", "legcord-quick-css", fs.readFileSync(quickCssPath, "utf-8")); + browserWindow.webContents.send( + "addTheme", + "legcord-quick-css", + fs.readFileSync(quickCssPath, "utf-8"), + ); } catch (err) { console.error("[Theme Manager] Error updating Quick CSS:", err); } }, 300); } }); - + // Clean up watcher when window is closed browserWindow.on("closed", () => { if (quickCssWatcher) { diff --git a/src/common/windowState.ts b/src/common/windowState.ts index a68e4bb..9ff063b 100644 --- a/src/common/windowState.ts +++ b/src/common/windowState.ts @@ -19,7 +19,7 @@ export function setWindowState(object: WindowState): void { const saveFile = `${storagePath}window.json`; const toSave = JSON.stringify(object, null, 4); fs.writeFileSync(saveFile, toSave, "utf-8"); - + // Performance optimization: Update cache immediately windowStateCache = object; windowStateCacheTime = Date.now(); @@ -30,10 +30,10 @@ export function setWindowState(object: WindowState): void { export function getWindowState(object: K): WindowState[K] { // Performance optimization: Use cached window state if available const now = Date.now(); - if (windowStateCache && (now - windowStateCacheTime) < WINDOW_STATE_CACHE_TTL) { + if (windowStateCache && now - windowStateCacheTime < WINDOW_STATE_CACHE_TTL) { return windowStateCache[object]; } - + const userDataPath = app.getPath("userData"); const storagePath = path.join(userDataPath, "/storage/"); const settingsFile = `${storagePath}window.json`; @@ -43,10 +43,10 @@ export function getWindowState(object: K): WindowSt const rawData = fs.readFileSync(settingsFile, "utf-8"); const returnData = JSON.parse(rawData) as WindowState; console.log(`[Window state manager] ${JSON.stringify(returnData)}`); - + // Update cache windowStateCache = returnData; windowStateCacheTime = now; - + return returnData[object]; } From 4ccb21b88c39a387701cf65d31330a7572abd45d Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 19 Jan 2026 23:08:15 +0100 Subject: [PATCH 716/844] chore: translations update [skip ci] Co-authored-by: Morkovka21Vek Translate-URL: https://hosted.weblate.org/projects/armcord/client/ru/ Translation: Legcord/Client --- assets/lang/ru.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/assets/lang/ru.json b/assets/lang/ru.json index 0967ef4..7942905 100644 --- a/assets/lang/ru.json +++ b/assets/lang/ru.json @@ -1 +1,12 @@ -{} +{ + "loading_screen_start": "Запуск Legcord…", + "loading_screen_update": "Доступна новая версия Legcord. Пожалуйста, обновитесь до последней версии.", + "setup_question1": "Добро пожаловать в установку Legcord", + "setup_offline": "Похоже, вы офлайн. Пожалуйста, подключитесь к интернету и перезапустите Legcord.", + "yes": "Да", + "no": "Нет", + "next": "Далее", + "settings-category-mods": "Модификации", + "settings-save": "Сохранить настройки", + "loading_screen_offline": "Похоже, вы офлайн. Перезапуск через " +} From 5f0016bf51bd2d71c45ddd6fdbe6a4d29eb37dfe Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 26 Jan 2026 17:01:21 +0100 Subject: [PATCH 717/844] chore: translations update [skip ci] Co-authored-by: Loposmo Translate-URL: https://hosted.weblate.org/projects/armcord/client/es_419/ Translation: Legcord/Client --- assets/lang/es_419.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/lang/es_419.json b/assets/lang/es_419.json index 0967ef4..73e729c 100644 --- a/assets/lang/es_419.json +++ b/assets/lang/es_419.json @@ -1 +1,3 @@ -{} +{ + "loading_screen_start": "Iniciando Legcord…" +} From d679a0ac9ca1b2cc0c7814ee6fb93c7824fb72c5 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 27 Jan 2026 18:01:54 +0100 Subject: [PATCH 718/844] chore: translations update [skip ci] Co-authored-by: Blueberry Co-authored-by: Loposmo Co-authored-by: brknstasis Translate-URL: https://hosted.weblate.org/projects/armcord/client/es_419/ Translate-URL: https://hosted.weblate.org/projects/armcord/client/ru/ Translation: Legcord/Client --- assets/lang/es_419.json | 50 ++++++++++++++++++++++++++++++++++++++++- assets/lang/ru.json | 8 +++++-- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/assets/lang/es_419.json b/assets/lang/es_419.json index 73e729c..1ed4c46 100644 --- a/assets/lang/es_419.json +++ b/assets/lang/es_419.json @@ -1,3 +1,51 @@ { - "loading_screen_start": "Iniciando Legcord…" + "loading_screen_start": "Iniciando Legcord…", + "loading_screen_offline": "Parece que estás desconectado. Reiniciando en ", + "loading_screen_update": "Una nueva versión de Legcord está disponible. Por favor actualiza a la versión más reciente.", + "setup_question1": "Bienvenido/a a la configuración de Legcord", + "setup_offline": "Apareces sin conexión. Conéctate a internet y reinicia Legcord.", + "setup_question2": "Elige tu canal/instancia de Discord:", + "setup_question3": "Debería Legcord manejar la instalación de mods de cliente?", + "yes": "Sí", + "no": "No", + "next": "Siguiente", + "setup_question4": "Elige un mod de cliente que quieras instalar:", + "setup_question5": "¿Quieres usar un ícono en la barra de tareas?", + "settings-bounceOnPing": "Rebota en la barra durante notificación", + "settings-bounceOnPing-desc": "Hace rebotar el icono de la app en la barra cuando recibes una notificación.", + "settings-theme": "Estilo de ventana", + "settings-theme-desc": "El estilo de ventana controla qué barra de título utiliza Legcord.", + "settings-theme-default": "Predeterminado (Perzonalizado)", + "settings-theme-native": "Nativo", + "settings-theme-overlay": "Superposición", + "settings-autoHideMenuBar": "Ocultar automáticamente la barra de menús", + "settings-autoHideMenuBar-desc": "Ocultar automáticamente la barra de menús cuando no se utilice.", + "settings-sleepInBackground": "Suspender en segundo plano", + "settings-sleepInBackground-desc": "Habilita la limitación de fondo de Chromium. Esto puede ayudar a ahorrar batería, pero también interrumpe las notificaciones.", + "settings-transparency": "Transparencia", + "settings-transparency-desc": "Elige el modo de transparencia que utiliza Legcord.", + "settings-transparency-universal": "Universal", + "settings-transparency-modern": "Moderna", + "settings-theme-transparent": "Transparente", + "settings-transparency-tahoe-warning": "La transparencia puede provocar lag excesivo en MacOS 26 Tahoe.", + "settings-popoutPiP": "Ventana emergente siempre visible", + "settings-popoutPiP-desc": "Cuanto está habilitado, la ventana emergente estará en modo siempre visible.", + "settings-venmic-workaround": "Workaraound", + "settings-venmic-workaround-desc": "Activar o desactivar el workaround para un problema que hace que el micrófono se comparta en lugar del audio correcto.", + "settings-venmic-deviceSelect": "Seleccionar dispositivo", + "settings-venmic-deviceSelect-desc": "Permite seleccionar un dispositivo de audio.", + "settings-venmic-granularSelect": "Selección Granular", + "settings-venmic-granularSelect-desc": "Permite seleccionar una fuente de entrada de audio.", + "settings-venmic-ignoreVirtual": "Ignorar dispositivos virtuales", + "settings-venmic-ignoreVirtual-desc": "Ignora los dispositivos de audio virtuales.", + "settings-venmic-ignoreDevices": "Ignorar dispositivos", + "settings-venmic-ignoreDevices-desc": "Ignora dispositivos de audio específicos.", + "settings-venmic-ignoreInputMedia": "Ignorar entradas multimedia", + "settings-venmic-ignoreInputMedia-desc": "Ignora la entrada de audio de las fuentes multimedia.", + "settings-venmic-onlySpeakers": "Solo altavoces", + "settings-venmic-onlySpeakers-desc": "Utiliza únicamente los altavoces para la selección de audio.", + "settings-venmic-onlyDefaultSpeakers": "Solo altavoces predeterminados", + "settings-venmic-onlyDefaultSpeakers-desc": "Utilice únicamente los altavoces predeterminados para la selección de audio.", + "settings-audio": "Audio", + "settings-audio-desc": "Seleccione el método que Legcord utilizará para capturar el audio de su sistema al compartir pantalla." } diff --git a/assets/lang/ru.json b/assets/lang/ru.json index 7942905..a0bb8e8 100644 --- a/assets/lang/ru.json +++ b/assets/lang/ru.json @@ -2,11 +2,15 @@ "loading_screen_start": "Запуск Legcord…", "loading_screen_update": "Доступна новая версия Legcord. Пожалуйста, обновитесь до последней версии.", "setup_question1": "Добро пожаловать в установку Legcord", - "setup_offline": "Похоже, вы офлайн. Пожалуйста, подключитесь к интернету и перезапустите Legcord.", + "setup_offline": "Похоже, вы не в сети. Пожалуйста, подключитесь к интернету и перезапустите Legcord.", "yes": "Да", "no": "Нет", "next": "Далее", "settings-category-mods": "Модификации", "settings-save": "Сохранить настройки", - "loading_screen_offline": "Похоже, вы офлайн. Перезапуск через " + "loading_screen_offline": "Похоже, вы не в сети. Перезапуск через ", + "setup_question2": "Выберите свой канал/экземпляр Discord:", + "setup_question3": "Должен ли Legcord заниматься установкой модификаций клиента?", + "setup_question4": "Выберите модификацию клиента, которую хотите установить:", + "setup_question5": "Хотите использовать значок в трее?" } From 49a908370037c18a5129de701e6bf6e686630520 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 29 Jan 2026 17:23:57 +0100 Subject: [PATCH 719/844] fix: better vencord quickcss handling --- assets/app/js/patchVencordQuickCSS.js | 18 +++++++++++++++++- src/@types/legcordWindow.d.ts | 1 + src/discord/ipc.ts | 7 ++++++- src/discord/preload/bridge.ts | 1 + 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/assets/app/js/patchVencordQuickCSS.js b/assets/app/js/patchVencordQuickCSS.js index 50fb58b..3d914af 100644 --- a/assets/app/js/patchVencordQuickCSS.js +++ b/assets/app/js/patchVencordQuickCSS.js @@ -3,6 +3,22 @@ if (window.VencordNative) { VencordNative.quickCss.openEditor = function openEditor() { - window.legcord.themes.openQuickCss() + shelter.ui.openConfirmationModal({ + header: () => "Vencord QuickCSS is not compatible", + body: () => `Vencord’s QuickCSS editor is not supported in Legcord. Legcord uses its own Quick CSS editor instead which can be found in it's respective themes section. + Would you like to import your existing Vencord CSS into Legcord?`, + type: "danger", + confirmText: "Import CSS", + cancelText: "Cancel" + }).then( + async () => { + const css = await VencordNative.quickCss.get(); + window.legcord.themes.importQuickCss(css); + await VencordNative.quickCss.set(""); + window.legcord.themes.openQuickCss() + }, + () => console.log("Cancel.") + ); + } } \ No newline at end of file diff --git a/src/@types/legcordWindow.d.ts b/src/@types/legcordWindow.d.ts index 1923e8f..abed16a 100644 --- a/src/@types/legcordWindow.d.ts +++ b/src/@types/legcordWindow.d.ts @@ -66,6 +66,7 @@ export interface LegcordWindow { openQuickCss: () => void; edit: (id: string) => void; folder: (id: string) => void; + importQuickCss: (css: string) => void; }; rpc: { listen: ( diff --git a/src/discord/ipc.ts b/src/discord/ipc.ts index b59cb88..d9d5cdb 100644 --- a/src/discord/ipc.ts +++ b/src/discord/ipc.ts @@ -1,4 +1,4 @@ -import { existsSync, readFileSync, readdirSync } from "node:fs"; +import { existsSync, readFileSync, readdirSync, writeFileSync } from "node:fs"; import os from "node:os"; import path from "node:path"; import type { Game } from "arrpc"; @@ -70,6 +70,11 @@ export function registerIpc(passedWindow: BrowserWindow): void { openCssEditor(quickCssPath); } }); + ipcMain.on("importQuickCss", (_event, css: string) => { + let currentCss = readFileSync(quickCssPath, "utf-8"); + currentCss += `\n/* Imported CSS */\n${css}`; + writeFileSync(quickCssPath, currentCss, "utf-8"); + }); ipcMain.on("openThemesFolder", () => { shell.showItemInFolder(themesPath); }); diff --git a/src/discord/preload/bridge.ts b/src/discord/preload/bridge.ts index 7c1be43..3363edb 100644 --- a/src/discord/preload/bridge.ts +++ b/src/discord/preload/bridge.ts @@ -90,6 +90,7 @@ contextBridge.exposeInMainWorld("legcord", { set: (id: string, state: boolean) => ipcRenderer.send("setThemeEnabled", id, state), folder: (id: string) => ipcRenderer.send("openThemeFolder", id), openQuickCss: () => ipcRenderer.send("openQuickCss"), + importQuickCss: (css: string) => ipcRenderer.send("importQuickCss", css), }, rpc: { listen: (callback: () => void) => { From 56a39ece47457b340101b183becc9399b6345096 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 29 Jan 2026 17:45:47 +0100 Subject: [PATCH 720/844] chore: add missing i18n strings --- assets/lang/en-US.json | 144 ++++++++++++++++- src/common/config.ts | 6 +- src/discord/ipc.ts | 10 +- src/discord/menu.ts | 63 ++++---- src/discord/touchbar.ts | 3 +- src/discord/tray.ts | 15 +- src/discord/window.ts | 22 +-- src/setup/main.ts | 7 +- src/setup/preload.mts | 3 + src/setup/setup.tsx | 146 +++++++++++------- .../components/ScreensharePicker.tsx | 13 +- .../components/AddDetectableModal.tsx | 27 ++-- .../settings/components/KeybindCard.tsx | 6 +- .../settings/components/KeybindMaker.tsx | 41 +++-- .../settings/components/ThemesCard.tsx | 23 +-- src/shelter/settings/index.ts | 8 +- .../settings/pages/RegisteredGamesPage.tsx | 7 +- src/shelter/settings/pages/SettingsPage.tsx | 16 +- src/shelter/settings/pages/ThemesPage.tsx | 15 +- src/splash/main.ts | 3 +- 20 files changed, 389 insertions(+), 189 deletions(-) diff --git a/assets/lang/en-US.json b/assets/lang/en-US.json index 86b6b38..9898199 100644 --- a/assets/lang/en-US.json +++ b/assets/lang/en-US.json @@ -137,5 +137,147 @@ "settings-category-mods": "Mods", "settings-category-behaviour": "Behaviour", "settings-category-legacy": "Legacy features", - "settings-category-debug": "Debug options" + "settings-category-debug": "Debug options", + "menu-about": "About Legcord", + "menu-developerTools": "Developer tools", + "menu-openSettings": "Open settings", + "menu-reload": "Reload", + "menu-restart": "Restart", + "menu-quit": "Quit", + "menu-edit": "Edit", + "menu-undo": "Undo", + "menu-redo": "Redo", + "menu-cut": "Cut", + "menu-copy": "Copy", + "menu-paste": "Paste", + "menu-selectAll": "Select All", + "menu-view": "View", + "menu-toggleFullscreen": "Toggle Fullscreen", + "menu-zoomIn": "Zoom in", + "menu-zoomOut": "Zoom out", + "menu-resetZoom": "Reset zoom", + "menu-window": "Window", + "menu-minimize": "Minimize", + "menu-close": "Close", + "menu-keybind": "Keybind", + "menu-legcord": "Legcord", + "tray-openLegcord": "Open Legcord", + "tray-openSettings": "Open Settings", + "tray-supportServer": "Support Discord Server", + "tray-restartLegcord": "Restart Legcord", + "tray-quitLegcord": "Quit Legcord", + "tray-tooltip": "Legcord", + "dialog-openUrl-title": "Do you want to open this link?", + "dialog-openUrl-message": "Do you want to open {url}?", + "dialog-openUrl-detail": "This url was detected to not use normal browser protocols. It could mean that this url leads to a local program on your computer. Please check if you recognise it, before proceeding!", + "dialog-openUrl-checkbox": "Remember my answer and ignore this warning for future sessions", + "dialog-openUrl-yes": "Yes, please", + "dialog-openUrl-no": "No, I don't", + "title-unreadMessages": "You have some unread messages.", + "title-legcordSuffix": " - Legcord", + "dialog-importTheme-title": "Select a theme you want to import", + "dialog-importTheme-button": "Import", + "dialog-importTheme-discordStyles": "Discord styles", + "dialog-importTheme-allFiles": "All Files", + "dialog-customIcon-filters": "Icons", + "config-corrupted-title": "Oops, something went wrong.", + "config-corrupted-message": "Legcord has detected that your configuration file is corrupted, please restart the app and set your settings again. If this issue persists, report it on the support server/Github issues.", + "setup-welcomeTitle": "Welcome to Legcord", + "setup-welcomeSubtitle": "Let's get you set up with your perfect configuration.", + "setup-getStarted": "Get Started", + "setup-windowStyle-nativeTitle": "Native Window", + "setup-windowStyle-nativeDesc": "Use your system's default window decorations", + "setup-windowStyle-customTitle": "Custom Titlebar", + "setup-windowStyle-customDesc": "Use Legcord's custom titlebar design", + "setup-chooseWindowStyle": "Choose Window Style", + "setup-selectAppearance": "Select how Legcord appears on your machine", + "setup-systemTray": "System Tray", + "setup-trayChoose": "Choose whether to enable the system tray icon", + "setup-trayEnableTitle": "Enable Tray Icon", + "setup-trayEnableDesc": "Show Legcord in your system tray", + "setup-trayDisableTitle": "Disable Tray Icon", + "setup-trayDisableDesc": "Don't show Legcord in your system tray", + "setup-linuxTrayWarning": "System tray functionality may have issues or behave differently on Linux systems.", + "setup-finishTitle": "You're All Set!", + "setup-finishSubtitle": "Your Legcord configuration is complete and personalized to your preferences.", + "setup-finishSettingsNote": "Need to make changes later? You'll find all these options in Discord's settings menu under Legcord.", + "setup-launchLegcord": "Launch Legcord", + "setup-modSelectorTitle": "Choose Your Client Mod", + "setup-modSelectorSubtitle": "Legcord includes Shelter out of the box, but you can also choose another client mod if wanted.", + "setup-vencordTitle": "Vencord", + "setup-vencordDesc": "Client mod with plugins and themes.", + "setup-equicordTitle": "Equicord", + "setup-equicordDesc": "A fork of Vencord with more plugins.", + "setup-useShelterOnly": "Use Shelter Only", + "setup-back": "Back", + "setup-next": "Next", + "setup-stepOf": "Step {current} of {total}", + "setup-loading": "Loading...", + "setup-windowTitle": "Legcord Setup", + "settings-restartRequired": "Restart required", + "settings-restartRequiredBody": "You need to restart to apply these changes.", + "settings-restartLater": "I'll do it later", + "settings-theme-legacy": "Legacy", + "settings-channel-stable": "Stable", + "settings-channel-canary": "Canary", + "settings-channel-ptb": "PTB", + "settings-category-powerManagement": "Power Management", + "settings-category-arrpc": "arRPC", + "settings-audio-loopback": "Loopback", + "settings-audio-loopbackWithMute": "Loopback with mute", + "keybind-addKeybind": "Add a keybind", + "keybind-accelerator": "Accelerator", + "keybind-invalidCombo": "This key combination is invalid or not supported.", + "keybind-recording": "Recording", + "keybind-record": "Record", + "keybind-action": "Action", + "keybind-mute": "Mute", + "keybind-deafen": "Deafen", + "keybind-leaveCall": "Leave call", + "keybind-navigateForward": "Navigate forward", + "keybind-navigateBack": "Navigate back", + "keybind-runJavascript": "Run Javascript", + "keybind-openQuickCss": "Open Quick CSS", + "keybind-globalNote": "Allows you to assign a specific keyboard shortcut that can be used across different applications and programs.", + "keybind-global": "Global", + "keybind-enabled": "Enabled", + "keybind-jsCode": "Javascript code", + "keybind-add": "Add", + "keybind-delete": "Delete", + "detectable-missingFields": "Missing fields", + "detectable-fillAllFields": "Please fill in all fields before adding.", + "detectable-addApp": "Add Detectable Application", + "detectable-appName": "App Name*", + "detectable-appId": "App ID*", + "detectable-themes": "Themes", + "detectable-aliases": "Aliases", + "detectable-enabled": "Enabled", + "detectable-placeholderName": "e.g. Discord", + "detectable-placeholderId": "e.g. 1234567890", + "detectable-placeholderThemes": "Action, Adventure", + "detectable-placeholderAliases": "Alias1, Alias2", + "themes-success": "Success!", + "themes-updated": "Theme successfully updated!", + "themes-bdInstalled": "BD theme successfully installed!", + "themes-delete": "Delete", + "themes-edit": "Edit", + "themes-update": "Update", + "themes-open": "Open", + "themes-by": "by", + "themes-openQuickCss": "Open Quick CSS file", + "themes-importFromFile": "Import from file", + "themes-openThemesFolder": "Open themes folder", + "themes-import": "Import", + "themes-importUrlPlaceholder": "https://raw.githubusercontent.com/... [.theme.css]", + "games-registeredGames": "Registered Games", + "games-refreshList": "Refresh list", + "games-add": "Add", + "screenshare-selectSource": "Please select a source", + "screenshare-venmicDisabled": "Venmic disabled", + "screenshare-share": "Share", + "screenshare-title": "Screenshare", + "contextMenu-searchGoogle": "Search with Google", + "contextMenu-searchDuckDuckGo": "Search with DuckDuckGo", + "touchbar-servers": "Servers", + "splash-title": "Legcord" } diff --git a/src/common/config.ts b/src/common/config.ts index 0f086f1..d75031d 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -2,6 +2,7 @@ import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "no import { dirname, join } from "node:path"; import { app, dialog } from "electron"; import type { Settings } from "../@types/settings.js"; +import { getLang } from "./lang.js"; import { getWindowStateLocation } from "./windowState.js"; export let firstRun: boolean; @@ -205,10 +206,7 @@ export function checkIfConfigIsBroken(): void { console.error(e); console.log("Detected a corrupted config"); setup(); - dialog.showErrorBox( - "Oops, something went wrong.", - "Legcord has detected that your configuration file is corrupted, please restart the app and set your settings again. If this issue persists, report it on the support server/Github issues.", - ); + dialog.showErrorBox(getLang("config-corrupted-title"), getLang("config-corrupted-message")); } try { const windowData = readFileSync(getWindowStateLocation(), "utf-8"); diff --git a/src/discord/ipc.ts b/src/discord/ipc.ts index d9d5cdb..afbd200 100644 --- a/src/discord/ipc.ts +++ b/src/discord/ipc.ts @@ -81,12 +81,12 @@ export function registerIpc(passedWindow: BrowserWindow): void { ipcMain.on("openImportPicker", () => { dialog .showOpenDialog({ - title: "Select a theme you want to import", - buttonLabel: "Import", + title: getLang("dialog-importTheme-title"), + buttonLabel: getLang("dialog-importTheme-button"), properties: ["openFile", "multiSelections"], filters: [ - { name: "Discord styles", extensions: ["scss", "css"] }, - { name: "All Files", extensions: ["*"] }, + { name: getLang("dialog-importTheme-discordStyles"), extensions: ["scss", "css"] }, + { name: getLang("dialog-importTheme-allFiles"), extensions: ["*"] }, ], }) .then((result) => { @@ -289,7 +289,7 @@ export function registerIpc(passedWindow: BrowserWindow): void { dialog .showOpenDialog({ properties: ["openFile"], - filters: [{ name: "Icons", extensions: ["ico", "png", "icns"] }], + filters: [{ name: getLang("dialog-customIcon-filters"), extensions: ["ico", "png", "icns"] }], }) .then((result) => { if (result.canceled) return; diff --git a/src/discord/menu.ts b/src/discord/menu.ts index 36fb8cf..90d97e8 100644 --- a/src/discord/menu.ts +++ b/src/discord/menu.ts @@ -3,15 +3,26 @@ import type { Keybind, KeybindActions } from "../@types/keybind.js"; import { getConfig } from "../common/config.js"; import { setForceQuit } from "../common/forceQuit.js"; import { runAction } from "../common/keybindActions.js"; +import { getLang } from "../common/lang.js"; import { mainWindows } from "./window.js"; +const keybindActionLabels: Record = { + mute: "keybind-mute", + deafen: "keybind-deafen", + leaveCall: "keybind-leaveCall", + navigateForward: "keybind-navigateForward", + navigateBack: "keybind-navigateBack", + runJavascript: "keybind-runJavascript", + openQuickCss: "keybind-openQuickCss", +}; + export function setMenu(): void { const keybinds = getConfig("keybinds"); - const keybindSubMenu: { label: KeybindActions; accelerator: string; click: () => void }[] = []; + const keybindSubMenu: { label: string; accelerator: string; click: () => void }[] = []; keybinds.forEach((keybind: Keybind) => { if (!keybind.global && keybind.enabled) { keybindSubMenu.push({ - label: keybind.action, + label: getLang(keybindActionLabels[keybind.action]), accelerator: keybind.accelerator, click: () => { runAction(keybind); @@ -22,21 +33,21 @@ export function setMenu(): void { const template: MenuItemConstructorOptions[] = [ { - label: "Legcord", + label: getLang("menu-legcord"), submenu: [ - { label: "About Legcord", role: "about" }, + { label: getLang("menu-about"), role: "about" }, { type: "separator" }, { role: "services" }, { type: "separator" }, { - label: "Developer tools", + label: getLang("menu-developerTools"), accelerator: process.platform === "darwin" ? "Cmd+Option+I" : "Ctrl+Shift+I", click() { BrowserWindow.getFocusedWindow()!.webContents.toggleDevTools(); }, }, { - label: "Open settings", + label: getLang("menu-openSettings"), accelerator: "Cmd+,", click() { mainWindows.forEach((mainWindow) => { @@ -55,7 +66,7 @@ export function setMenu(): void { }, }, { - label: "Reload", + label: getLang("menu-reload"), accelerator: "CmdOrCtrl+R", click() { mainWindows.forEach((mainWindow) => { @@ -64,7 +75,7 @@ export function setMenu(): void { }, }, { - label: "Restart", + label: getLang("menu-restart"), accelerator: "CmdOrCtrl+Shift+R", click() { app.relaunch(); @@ -77,7 +88,7 @@ export function setMenu(): void { { role: "unhide" }, { type: "separator" }, { - label: "Quit", + label: getLang("menu-quit"), accelerator: "CmdOrCtrl+Q", click() { setForceQuit(true); @@ -87,54 +98,54 @@ export function setMenu(): void { ], }, { - label: "Edit", + label: getLang("menu-edit"), submenu: [ { - label: "Undo", + label: getLang("menu-undo"), accelerator: "CmdOrCtrl+Z", click() { BrowserWindow.getFocusedWindow()!.webContents.undo(); }, }, { - label: "Redo", + label: getLang("menu-redo"), accelerator: "Shift+CmdOrCtrl+Z", click() { BrowserWindow.getFocusedWindow()!.webContents.redo(); }, }, { type: "separator" }, - { label: "Cut", accelerator: "CmdOrCtrl+X", role: "cut" }, - { label: "Copy", accelerator: "CmdOrCtrl+C", role: "copy" }, - { label: "Paste", accelerator: "CmdOrCtrl+V", role: "paste" }, - { label: "Select All", accelerator: "CmdOrCtrl+A", role: "selectAll" }, + { label: getLang("menu-cut"), accelerator: "CmdOrCtrl+X", role: "cut" }, + { label: getLang("menu-copy"), accelerator: "CmdOrCtrl+C", role: "copy" }, + { label: getLang("menu-paste"), accelerator: "CmdOrCtrl+V", role: "paste" }, + { label: getLang("menu-selectAll"), accelerator: "CmdOrCtrl+A", role: "selectAll" }, ], }, { - label: "View", + label: getLang("menu-view"), submenu: [ { - label: "Toggle Fullscreen", + label: getLang("menu-toggleFullscreen"), role: "togglefullscreen", }, - { label: "Zoom in", accelerator: "CmdOrCtrl+Plus", role: "zoomIn" }, + { label: getLang("menu-zoomIn"), accelerator: "CmdOrCtrl+Plus", role: "zoomIn" }, // Fix for zoom in on keyboards with dedicated + like QWERTZ (or numpad) // See https://github.com/electron/electron/issues/14742 and https://github.com/electron/electron/issues/5256 - { label: "Zoom in", accelerator: "CmdOrCtrl+=", role: "zoomIn", visible: false }, - { label: "Zoom out", accelerator: "CmdOrCtrl+-", role: "zoomOut" }, + { label: getLang("menu-zoomIn"), accelerator: "CmdOrCtrl+=", role: "zoomIn", visible: false }, + { label: getLang("menu-zoomOut"), accelerator: "CmdOrCtrl+-", role: "zoomOut" }, { type: "separator" }, - { label: "Reset zoom", accelerator: "CmdOrCtrl+0", role: "resetZoom" }, + { label: getLang("menu-resetZoom"), accelerator: "CmdOrCtrl+0", role: "resetZoom" }, ], }, { - label: "Window", + label: getLang("menu-window"), submenu: [ - { label: "Minimize", accelerator: "Cmd+M", role: "minimize" }, - { label: "Close", accelerator: "Cmd+W", role: "close" }, + { label: getLang("menu-minimize"), accelerator: "Cmd+M", role: "minimize" }, + { label: getLang("menu-close"), accelerator: "Cmd+W", role: "close" }, ], }, { - label: "Keybind", + label: getLang("menu-keybind"), submenu: keybindSubMenu, }, ]; diff --git a/src/discord/touchbar.ts b/src/discord/touchbar.ts index f9f0e73..cc4dec0 100644 --- a/src/discord/touchbar.ts +++ b/src/discord/touchbar.ts @@ -3,6 +3,7 @@ import { join } from "node:path"; import { TouchBar, app, nativeImage } from "electron"; import { navigateTo } from "../common/dom.js"; import { deafenToggle, leaveCall, muteToggle } from "../common/keybindActions.js"; +import { getLang } from "../common/lang.js"; import { mainWindows } from "./window.js"; const { TouchBarButton, TouchBarSpacer, TouchBarPopover, TouchBarScrubber } = TouchBar; @@ -96,5 +97,5 @@ export const voiceTouchBar = new TouchBar({ }); export const mainTouchBar = new TouchBar({ - items: [new TouchBarPopover({ label: "Servers", showCloseButton: true, items: scrollableList })], + items: [new TouchBarPopover({ label: getLang("touchbar-servers"), showCloseButton: true, items: scrollableList })], }); diff --git a/src/discord/tray.ts b/src/discord/tray.ts index 68c7a35..e555609 100644 --- a/src/discord/tray.ts +++ b/src/discord/tray.ts @@ -3,6 +3,7 @@ import { Menu, Tray, app, nativeImage } from "electron"; import { getConfig } from "../common/config.js"; import { navigateTo } from "../common/dom.js"; import { setForceQuit } from "../common/forceQuit.js"; +import { getLang } from "../common/lang.js"; import { getDisplayVersion } from "../common/version.js"; import { mainWindows } from "./window.js"; export let tray: Tray; @@ -31,7 +32,7 @@ export function createTray() { tray = new Tray(trayImg); const contextMenu = Menu.buildFromTemplate([ { - label: `Legcord ${getDisplayVersion()}`, + label: `${getLang("menu-legcord")} ${getDisplayVersion()}`, icon: trayImg, enabled: false, }, @@ -39,7 +40,7 @@ export function createTray() { type: "separator", }, { - label: "Open Legcord", + label: getLang("tray-openLegcord"), click() { mainWindows.forEach((mainWindow) => { mainWindow.show(); @@ -47,7 +48,7 @@ export function createTray() { }, }, { - label: "Open Settings", + label: getLang("tray-openSettings"), click() { mainWindows.forEach((mainWindow) => { mainWindow.show(); @@ -65,7 +66,7 @@ export function createTray() { }, }, { - label: "Support Discord Server", + label: getLang("tray-supportServer"), click() { mainWindows.forEach((mainWindow) => { navigateTo(mainWindow, "/invite/TnhxcqynZ2"); @@ -76,7 +77,7 @@ export function createTray() { type: "separator", }, { - label: "Restart Legcord", + label: getLang("tray-restartLegcord"), click() { app.relaunch(); setForceQuit(true); @@ -84,7 +85,7 @@ export function createTray() { }, }, { - label: "Quit Legcord", + label: getLang("tray-quitLegcord"), click() { setForceQuit(true); app.quit(); @@ -93,7 +94,7 @@ export function createTray() { ]); tray.setContextMenu(contextMenu); - tray.setToolTip("Legcord"); + tray.setToolTip(getLang("tray-tooltip")); tray.on("click", () => { mainWindows.forEach((mainWindow) => { mainWindow.show(); diff --git a/src/discord/window.ts b/src/discord/window.ts index 79d51d5..5b685b9 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -14,6 +14,7 @@ import contextMenu from "electron-context-menu"; import { firstRun, getConfig, setConfig } from "../common/config.js"; import { navigateTo } from "../common/dom.js"; import { forceQuit, setForceQuit } from "../common/forceQuit.js"; +import { getLang } from "../common/lang.js"; import { initQuickCss, injectThemesMain } from "../common/themes.js"; import { getWindowState, setWindowState } from "../common/windowState.js"; import { init } from "../main.js"; @@ -34,7 +35,7 @@ contextMenu({ showSearchWithGoogle: false, prepend: (_defaultActions, parameters) => [ { - label: "Search with Google", + label: getLang("contextMenu-searchGoogle"), // Only show it when right-clicking text visible: parameters.selectionText.trim().length > 0, click: () => { @@ -42,7 +43,7 @@ contextMenu({ }, }, { - label: "Search with DuckDuckGo", + label: getLang("contextMenu-searchDuckDuckGo"), // Only show it when right-clicking text visible: parameters.selectionText.trim().length > 0, click: () => { @@ -146,12 +147,12 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { } else { const options: MessageBoxOptions = { type: "question", - buttons: ["Yes, please", "No, I don't"], + buttons: [getLang("dialog-openUrl-yes"), getLang("dialog-openUrl-no")], defaultId: 1, - title: url, - message: `Do you want to open ${url}?`, - detail: "This url was detected to not use normal browser protocols. It could mean that this url leads to a local program on your computer. Please check if you recognise it, before proceeding!", - checkboxLabel: "Remember my answer and ignore this warning for future sessions", + title: getLang("dialog-openUrl-title"), + message: getLang("dialog-openUrl-message").replace("{url}", url), + detail: getLang("dialog-openUrl-detail"), + checkboxLabel: getLang("dialog-openUrl-checkbox"), checkboxChecked: false, }; @@ -225,25 +226,26 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { passedWindow.webContents.on("page-title-updated", (e, title) => { const legcordSuffix = " - Legcord"; /* identify */ + const unreadMessages = getLang("title-unreadMessages"); // FIXME - This is a bit of a mess. I'm not sure how to clean it up. if (process.platform === "win32") { if (title.startsWith("•")) return passedWindow.setOverlayIcon( nativeImage.createFromPath(path.join(import.meta.dirname, "../", "/assets/badge-11.ico")), - "You have some unread messages.", + unreadMessages, ); if (title.startsWith("(")) { const pings = Number.parseInt(/\((\d+)\)/.exec(title)![1]); if (pings > 9) { return passedWindow.setOverlayIcon( nativeImage.createFromPath(path.join(import.meta.dirname, "../", "/assets/badge-10.ico")), - "You have some unread messages.", + unreadMessages, ); } else { return passedWindow.setOverlayIcon( nativeImage.createFromPath(path.join(import.meta.dirname, "../", `/assets/badge-${pings}.ico`)), - "You have some unread messages.", + unreadMessages, ); } } diff --git a/src/setup/main.ts b/src/setup/main.ts index e18ab4f..8760967 100644 --- a/src/setup/main.ts +++ b/src/setup/main.ts @@ -4,7 +4,7 @@ import path from "node:path"; import { BrowserWindow, type BrowserWindowConstructorOptions, app, ipcMain } from "electron"; import type { Settings } from "../@types/settings.js"; import { getConfig, getConfigLocation, setConfigBulk } from "../common/config.js"; -import { getLang } from "../common/lang.js"; +import { getLang, getRawLang } from "../common/lang.js"; let setupWindow: BrowserWindow; export async function createSetupWindow(): Promise { @@ -13,7 +13,7 @@ export async function createSetupWindow(): Promise { const windowOptions: BrowserWindowConstructorOptions = { width: 800, height: 600, - title: "Legcord Setup", + title: getLang("setup-windowTitle"), darkTheme: true, icon: getConfig("customIcon") ?? path.join(import.meta.dirname, "../", "/assets/desktop.png"), resizable: false, @@ -62,6 +62,9 @@ export async function createSetupWindow(): Promise { ipcMain.handle("setup-getLang", (_event, toGet: string) => { return getLang(toGet); }); + ipcMain.handle("setup-getRawLang", () => { + return getRawLang(); + }); ipcMain.on("setup-restart", () => { app.relaunch(); app.exit(); diff --git a/src/setup/preload.mts b/src/setup/preload.mts index 9b979f8..3266b46 100644 --- a/src/setup/preload.mts +++ b/src/setup/preload.mts @@ -9,6 +9,7 @@ contextBridge.exposeInMainWorld("setup", { ipcRenderer.invoke("setup-getLang", toGet).then((result: string) => { return result; }), + getRawLang: () => ipcRenderer.invoke("setup-getRawLang") as Promise>, }); if (ipcRenderer.sendSync("setup-getOS") !== "darwin") { @@ -34,6 +35,8 @@ declare global { saveSettings: (settings: any) => void; restart: () => void; os: string; + getLang: (toGet: string) => Promise; + getRawLang: () => Promise>; }; } } diff --git a/src/setup/setup.tsx b/src/setup/setup.tsx index e8dc2f4..a6c3a72 100644 --- a/src/setup/setup.tsx +++ b/src/setup/setup.tsx @@ -11,27 +11,32 @@ import { Settings, Sparkles, } from "lucide-solid"; -import { For, Show, createSignal } from "solid-js"; +import { For, Show, createResource, createSignal } from "solid-js"; import { render } from "solid-js/web"; import { Motion } from "solid-motionone"; -const Welcome = ({ onNext }: { onNext: () => void }) => ( +const Welcome = ({ onNext, t }: { onNext: () => void; t: () => Record | undefined }) => (

    - Welcome to Legcord + {t()?.["setup-welcomeTitle"] ?? "Welcome to Legcord"}

    -

    Let's get you set up with your perfect configuration.

    +

    + {t()?.["setup-welcomeSubtitle"] ?? "Let's get you set up with your perfect configuration."} +

    - Get Started + {t()?.["setup-getStarted"] ?? "Get Started"}
    ); -const WindowStyle = ({ readyToNext }: { readyToNext: (valid: boolean) => void }) => { +const WindowStyle = ({ + readyToNext, + t, +}: { readyToNext: (valid: boolean) => void; t: () => Record | undefined }) => { const [selectedStyle, setSelectedStyle] = createSignal(null); const handleStyleSelect = (styleId: string) => { @@ -48,24 +53,29 @@ const WindowStyle = ({ readyToNext }: { readyToNext: (valid: boolean) => void }) const styles = [ { id: "native", - title: "Native Window", - description: "Use your system's default window decorations", + titleKey: "setup-windowStyle-nativeTitle", + descKey: "setup-windowStyle-nativeDesc", screenshot: "legcord://assets/native.png", }, { id: "default", - title: "Custom Titlebar", - description: "Use Legcord's custom titlebar design", + titleKey: "setup-windowStyle-customTitle", + descKey: "setup-windowStyle-customDesc", screenshot: "legcord://assets/custom.png", }, ]; + const lang = t(); return (
    -

    Choose Window Style

    -

    Select how Legcord appears on your machine

    +

    + {lang?.["setup-chooseWindowStyle"] ?? "Choose Window Style"} +

    +

    + {lang?.["setup-selectAppearance"] ?? "Select how Legcord appears on your machine"} +

    @@ -83,13 +93,15 @@ const WindowStyle = ({ readyToNext }: { readyToNext: (valid: boolean) => void })
    {`${item.title}
    -

    {item.title}

    -

    {item.description}

    +

    + {lang?.[item.titleKey] ?? item.titleKey} +

    +

    {lang?.[item.descKey] ?? item.descKey}

    void }) ); }; -const TraySettings = ({ readyToNext }: { readyToNext: (valid: boolean) => void }) => { +const TraySettings = ({ + readyToNext, + t, +}: { readyToNext: (valid: boolean) => void; t: () => Record | undefined }) => { const [selectedOption, setSelectedOption] = createSignal(null); const handleOptionSelect = (optionId: string) => { @@ -124,26 +139,19 @@ const TraySettings = ({ readyToNext }: { readyToNext: (valid: boolean) => void } }; const options = [ - { - id: "dynamic", - title: "Enable Tray Icon", - description: "Show Legcord in your system tray", - icon: LaptopMinimalCheck, - }, - { - id: "disabled", - title: "Disable Tray Icon", - description: "Don't show Legcord in your system tray", - icon: LaptopMinimal, - }, + { id: "dynamic", titleKey: "setup-trayEnableTitle", descKey: "setup-trayEnableDesc", icon: LaptopMinimalCheck }, + { id: "disabled", titleKey: "setup-trayDisableTitle", descKey: "setup-trayDisableDesc", icon: LaptopMinimal }, ]; + const lang = t(); return (
    -

    System Tray

    -

    Choose whether to enable the system tray icon

    +

    {lang?.["setup-systemTray"] ?? "System Tray"}

    +

    + {lang?.["setup-trayChoose"] ?? "Choose whether to enable the system tray icon"} +

    @@ -151,7 +159,8 @@ const TraySettings = ({ readyToNext }: { readyToNext: (valid: boolean) => void }

    - System tray functionality may have issues or behave differently on Linux systems. + {lang?.["setup-linuxTrayWarning"] ?? + "System tray functionality may have issues or behave differently on Linux systems."}

    @@ -176,8 +185,10 @@ const TraySettings = ({ readyToNext }: { readyToNext: (valid: boolean) => void }
    -

    {option.title}

    -

    {option.description}

    +

    + {lang?.[option.titleKey] ?? option.titleKey} +

    +

    {lang?.[option.descKey] ?? option.descKey}

    void } ); }; -const Finish = ({ restart }: { restart: () => void }) => ( +const Finish = ({ restart, t }: { restart: () => void; t: () => Record | undefined }) => (
    -

    You're All Set!

    -

    Your Legcord configuration is complete and personalized to your preferences.

    +

    {t()?.["setup-finishTitle"] ?? "You're All Set!"}

    +

    + {t()?.["setup-finishSubtitle"] ?? + "Your Legcord configuration is complete and personalized to your preferences."} +

    - Need to make changes later? You'll find all these options in Discord's settings menu under Legcord. + {t()?.["setup-finishSettingsNote"] ?? + "Need to make changes later? You'll find all these options in Discord's settings menu under Legcord."}

    - Launch Legcord + {t()?.["setup-launchLegcord"] ?? "Launch Legcord"}
    ); -const ModSelector = ({ readyToNext }: { readyToNext: (valid: boolean) => void }) => { +const ModSelector = ({ + readyToNext, + t, +}: { readyToNext: (valid: boolean) => void; t: () => Record | undefined }) => { const [selectedMod, setSelectedMod] = createSignal(null); const handleModSelect = (optionId: string) => { const newValue = selectedMod() === optionId ? null : optionId; @@ -235,30 +253,34 @@ const ModSelector = ({ readyToNext }: { readyToNext: (valid: boolean) => void }) const mods = [ { id: "vencord", - title: "Vencord", - description: "Client mod with plugins and themes.", + titleKey: "setup-vencordTitle", + descKey: "setup-vencordDesc", icon: "legcord://assets/vencord.png", }, { id: "equicord", - title: "Equicord", - description: "A fork of Vencord with more plugins.", + titleKey: "setup-equicordTitle", + descKey: "setup-equicordDesc", icon: "legcord://assets/equicord.png", }, ]; + const lang = t(); return (
    -

    Choose Your Client Mod

    +

    + {lang?.["setup-modSelectorTitle"] ?? "Choose Your Client Mod"} +

    - Legcord includes Shelter out of the box, but you can also choose another client mod if wanted. + {lang?.["setup-modSelectorSubtitle"] ?? + "Legcord includes Shelter out of the box, but you can also choose another client mod if wanted."}

    - Loading...
    }> + {lang?.["setup-loading"] ?? "Loading..."}
    }> {(mod) => ( handleModSelect(mod.id)} @@ -276,13 +298,15 @@ const ModSelector = ({ readyToNext }: { readyToNext: (valid: boolean) => void }) > {`${mod.title}
    -

    {mod.title}

    -

    {mod.description}

    +

    + {lang?.[mod.titleKey] ?? mod.titleKey} +

    +

    {lang?.[mod.descKey] ?? mod.descKey}

    void }) : "border-gray-700/30 text-gray-500 hover:border-purple-500/50 hover:text-purple-400 hover:bg-purple-500/10" }`} > - Use Shelter Only + {lang?.["setup-useShelterOnly"] ?? "Use Shelter Only"}
    ); }; function Stepper() { + const [t] = createResource(() => window.setup.getRawLang()); const [currentStep, setCurrentStep] = createSignal(0); const [isValid, setValid] = createSignal(true); const maxSteps = 5; @@ -337,6 +362,11 @@ function Stepper() { window.setup.saveSettings({ doneSetup: true }); window.setup.restart(); }; + const stepOfText = () => { + const lang = t(); + const template = lang?.["setup-stepOf"] ?? "Step {current} of {total}"; + return template.replace("{current}", String(currentStep() + 1)).replace("{total}", String(maxSteps)); + }; return (
    - + - + - + - + - + @@ -367,11 +397,11 @@ function Stepper() { class="px-6 py-2.5 rounded-xl bg-gray-800 hover:bg-gray-700 text-white font-medium transition-colors inline-flex items-center gap-2" > - Back + {t()?.["setup-back"] ?? "Back"}
    - Step {currentStep() + 1} of {maxSteps} + {stepOfText()}
    - Next + {t()?.["setup-next"] ?? "Next"}
    diff --git a/src/shelter/screenshare/components/ScreensharePicker.tsx b/src/shelter/screenshare/components/ScreensharePicker.tsx index 9521b8a..1f34103 100644 --- a/src/shelter/screenshare/components/ScreensharePicker.tsx +++ b/src/shelter/screenshare/components/ScreensharePicker.tsx @@ -66,9 +66,10 @@ export const ScreensharePicker = (props: { setSource(props.sources[0].id); setName(props.sources[0].name); } + const t = store.i18n; function startScreenshare() { if (source() === "") { - showToast("Please select a source", "error"); + showToast(t["screenshare-selectSource"], "error"); } console.log(source(), name(), audio()); if (audioSource() !== undefined && audio()) { @@ -92,7 +93,7 @@ export const ScreensharePicker = (props: { return ( - Screenshare + {t["screenshare-title"]}
    @@ -172,7 +173,7 @@ export const ScreensharePicker = (props: { }} limitHeight options={[ - { label: "Venmic disabled", value: "Venmic disabled" }, + { label: t["screenshare-venmicDisabled"], value: "Venmic disabled" }, ...(props.audioSources?.map((s) => ({ label: s["node.name"], value: s["node.name"], @@ -182,7 +183,11 @@ export const ScreensharePicker = (props: {
    - +
    ); }; diff --git a/src/shelter/settings/components/AddDetectableModal.tsx b/src/shelter/settings/components/AddDetectableModal.tsx index 2793045..adbf0c3 100644 --- a/src/shelter/settings/components/AddDetectableModal.tsx +++ b/src/shelter/settings/components/AddDetectableModal.tsx @@ -25,8 +25,8 @@ export const AddDetectableModal = (props: { close: () => void; executable: strin function save() { if (!appName().trim() || !appId().trim() || !props.executable) { return showToast({ - title: "Missing fields", - content: "Please fill in all fields before adding.", + title: store.i18n["detectable-missingFields"], + content: store.i18n["detectable-fillAllFields"], duration: 3000, }); } @@ -61,31 +61,32 @@ export const AddDetectableModal = (props: { close: () => void; executable: strin props.close(); } + const t = store.i18n; return ( - Add Detectable Application + {t["detectable-addApp"]} -
    App Name*
    - +
    {t["detectable-appName"]}
    + -
    App ID*
    - +
    {t["detectable-appId"]}
    + -
    Themes
    - +
    {t["detectable-themes"]}
    + -
    Aliases
    - +
    {t["detectable-aliases"]}
    +
    - +
    ); }; diff --git a/src/shelter/settings/components/KeybindCard.tsx b/src/shelter/settings/components/KeybindCard.tsx index 28463dc..6f54518 100644 --- a/src/shelter/settings/components/KeybindCard.tsx +++ b/src/shelter/settings/components/KeybindCard.tsx @@ -25,13 +25,15 @@ export const KeybindCard = (props: { keybind: Keybind }) => { return (
    -
    {props.keybind.action}
    +
    + {store.i18n[`keybind-${props.keybind.action}`] ?? props.keybind.action} +
    {props.keybind.accelerator}
    -
    diff --git a/src/shelter/settings/components/KeybindMaker.tsx b/src/shelter/settings/components/KeybindMaker.tsx index b8a8e8b..f8d37a6 100644 --- a/src/shelter/settings/components/KeybindMaker.tsx +++ b/src/shelter/settings/components/KeybindMaker.tsx @@ -93,14 +93,15 @@ export const KeybindMaker = (props: { close: () => void }) => { window.legcord.settings.addKeybind(keybind); } + const t = store.i18n; return ( - Add a keybind + {t["keybind-addKeybind"]} -
    Accelerator
    +
    {t["keybind-accelerator"]}
    -

    This key combination is invalid or not supported.

    +

    {t["keybind-invalidCombo"]}

    @@ -114,48 +115,44 @@ export const KeybindMaker = (props: { close: () => void }) => { size={ButtonSizes.SMALL} color={ButtonColors.RED} > - Recording + {t["keybind-recording"]} ) : ( )}
    -
    Action
    +
    {t["keybind-action"]}
    setAction(v as KeybindActions)} limitHeight options={[ - { label: "Mute", value: "mute" }, - { label: "Deafen", value: "deafen" }, - { label: "Leave call", value: "leaveCall" }, - { label: "Navigate forward", value: "navigateForward" }, - { label: "Navigate back", value: "navigateBack" }, - { label: "Run Javascript", value: "runJavascript" }, - { label: "Open Quick CSS", value: "openQuickCss" }, + { label: t["keybind-mute"], value: "mute" }, + { label: t["keybind-deafen"], value: "deafen" }, + { label: t["keybind-leaveCall"], value: "leaveCall" }, + { label: t["keybind-navigateForward"], value: "navigateForward" }, + { label: t["keybind-navigateBack"], value: "navigateBack" }, + { label: t["keybind-runJavascript"], value: "runJavascript" }, + { label: t["keybind-openQuickCss"], value: "openQuickCss" }, ]} /> - - Global + + {t["keybind-global"]} - Enabled + {t["keybind-enabled"]} -
    Javascript code
    +
    {t["keybind-jsCode"]}
    { @@ -36,8 +37,8 @@ export const ThemesCard = (props: { theme: ThemeManifest }) => { refreshThemes(); }, 1000); showToast({ - title: "Success!", - content: "Theme successfully updated!", + title: store.i18n["themes-success"], + content: store.i18n["themes-updated"], duration: 3000, }); } @@ -53,7 +54,7 @@ export const ThemesCard = (props: { theme: ThemeManifest }) => {
    {props.theme.name}
    -
    by
    +
    {store.i18n["themes-by"]}
    {props.theme.author}
    @@ -63,17 +64,17 @@ export const ThemesCard = (props: { theme: ThemeManifest }) => {
    {props.theme.description}
    - - - -
    ); diff --git a/src/shelter/settings/index.ts b/src/shelter/settings/index.ts index 8759562..facb008 100644 --- a/src/shelter/settings/index.ts +++ b/src/shelter/settings/index.ts @@ -27,11 +27,11 @@ function restartRequired(payload: { event: string; properties: { origin_pane: st if (payload.properties.origin_pane === "legcord-settings") { if (isRestartRequired) { openConfirmationModal({ - header: () => "Restart required", - body: () => "You need to restart to apply these changes.", + header: () => store.i18n["settings-restartRequired"], + body: () => store.i18n["settings-restartRequiredBody"], type: "danger", - confirmText: "Restart", - cancelText: "I'll do it later", + confirmText: store.i18n["settings-restart"], + cancelText: store.i18n["settings-restartLater"], }).then( () => window.legcord.restart(), () => console.log("restart skipped"), diff --git a/src/shelter/settings/pages/RegisteredGamesPage.tsx b/src/shelter/settings/pages/RegisteredGamesPage.tsx index 52c1b3a..cd21572 100644 --- a/src/shelter/settings/pages/RegisteredGamesPage.tsx +++ b/src/shelter/settings/pages/RegisteredGamesPage.tsx @@ -25,9 +25,10 @@ export function RegisteredGamesPage() { )); } + const t = shelter.plugin.store.i18n; return ( <> -
    Registered Games
    +
    {t["games-registeredGames"]}
    ({ label: p[1], value: p[1] })) ?? []), - { label: "Refresh list", value: "refresh" }, + { label: t["games-refreshList"], value: "refresh" }, ]} />
    {(detectable) =>
    {detectable.name}
    }
    diff --git a/src/shelter/settings/pages/SettingsPage.tsx b/src/shelter/settings/pages/SettingsPage.tsx index 10751ac..5d15674 100644 --- a/src/shelter/settings/pages/SettingsPage.tsx +++ b/src/shelter/settings/pages/SettingsPage.tsx @@ -49,7 +49,7 @@ export function SettingsPage() { { label: store.i18n["settings-theme-default"], value: "default" }, { label: store.i18n["settings-theme-native"], value: "native" }, { label: store.i18n["settings-theme-overlay"], value: "overlay" }, - { label: "Legacy", value: "legacy" }, + { label: store.i18n["settings-theme-legacy"], value: "legacy" }, ]} />
    - Power Management + {store.i18n["settings-category-powerManagement"]}
    - arRPC + {store.i18n["settings-category-arrpc"]}
    Themes
    {(theme: ThemeManifest) => } diff --git a/src/splash/main.ts b/src/splash/main.ts index ee49b58..c4d5433 100644 --- a/src/splash/main.ts +++ b/src/splash/main.ts @@ -2,6 +2,7 @@ import path from "node:path"; import { BrowserWindow, ipcMain } from "electron"; import isDev from "electron-is-dev"; import { getConfig } from "../common/config.js"; +import { getLang } from "../common/lang.js"; export let splashWindow: BrowserWindow; export async function createSplashWindow(): Promise { @@ -9,7 +10,7 @@ export async function createSplashWindow(): Promise { splashWindow = new BrowserWindow({ width: 300, height: 350, - title: "Legcord", + title: getLang("splash-title"), show: true, darkTheme: true, icon: getConfig("customIcon") ?? path.join(import.meta.dirname, "../", "/assets/desktop.png"), From 366c4d474c12aaf04d2bb6c9bf9e19a0ee747143 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 29 Jan 2026 17:56:25 +0100 Subject: [PATCH 721/844] feat: add detectable game card --- assets/lang/en-US.json | 5 ++ src/@types/legcordWindow.d.ts | 1 + src/common/detectables.ts | 5 ++ src/discord/ipc.ts | 5 +- src/discord/preload/bridge.ts | 1 + .../components/DetectableCard.module.css | 50 ++++++++++++++++++ .../settings/components/DetectableCard.tsx | 52 +++++++++++++++++++ src/shelter/settings/index.ts | 27 +++++----- .../settings/pages/RegisteredGames.module.css | 9 ++++ .../settings/pages/RegisteredGamesPage.tsx | 48 +++++++++++++---- src/shelter/settings/settings.ts | 4 ++ 11 files changed, 182 insertions(+), 25 deletions(-) create mode 100644 src/shelter/settings/components/DetectableCard.module.css create mode 100644 src/shelter/settings/components/DetectableCard.tsx diff --git a/assets/lang/en-US.json b/assets/lang/en-US.json index 9898199..d9efb3a 100644 --- a/assets/lang/en-US.json +++ b/assets/lang/en-US.json @@ -272,6 +272,11 @@ "games-registeredGames": "Registered Games", "games-refreshList": "Refresh list", "games-add": "Add", + "games-remove": "Remove", + "games-removeConfirmHeader": "Remove game?", + "games-removeConfirmBody": "This game will be removed from rich presence. The client must be restarted for changes to take effect.", + "games-noExecutables": "No executables", + "games-empty": "No registered games. Add one using the dropdown above.", "screenshare-selectSource": "Please select a source", "screenshare-venmicDisabled": "Venmic disabled", "screenshare-share": "Share", diff --git a/src/@types/legcordWindow.d.ts b/src/@types/legcordWindow.d.ts index abed16a..6052631 100644 --- a/src/@types/legcordWindow.d.ts +++ b/src/@types/legcordWindow.d.ts @@ -81,6 +81,7 @@ export interface LegcordWindow { getProcessList: () => ProcessInfo[]; refreshProcessList: () => void; addDetectable: (e: Game) => void; + removeDetectable: (id: string) => void; getDetectables: () => GameList; }; } diff --git a/src/common/detectables.ts b/src/common/detectables.ts index 2614652..49f913a 100644 --- a/src/common/detectables.ts +++ b/src/common/detectables.ts @@ -19,6 +19,11 @@ export function addDetectable(object: Game): void { setDetectables(currentDetectables); } +export function removeDetectable(id: string): void { + const currentDetectables = getDetectables().filter((g) => g.id !== id); + setDetectables(currentDetectables); +} + export function getDetectables(): GameList { if (!fs.existsSync(getDetectablesPath())) { fs.writeFileSync(getDetectablesPath(), "[]", "utf-8"); diff --git a/src/discord/ipc.ts b/src/discord/ipc.ts index afbd200..1e6354c 100644 --- a/src/discord/ipc.ts +++ b/src/discord/ipc.ts @@ -8,7 +8,7 @@ import type { Keybind } from "../@types/keybind.js"; import type { Settings } from "../@types/settings.js"; import type { ThemeManifest } from "../@types/themeManifest.js"; import { getConfig, getConfigLocation, setConfig, setConfigBulk } from "../common/config.js"; -import { addDetectable, getDetectables } from "../common/detectables.js"; +import { addDetectable, getDetectables, removeDetectable } from "../common/detectables.js"; import { getLang, getLangName, getRawLang, setLang } from "../common/lang.js"; import { installTheme, setThemeEnabled, uninstallTheme } from "../common/themes.js"; import { getDisplayVersion, getVersion } from "../common/version.js"; @@ -314,4 +314,7 @@ export function registerIpc(passedWindow: BrowserWindow): void { ipcMain.on("addDetectable", (_event, game: Game) => { addDetectable(game); }); + ipcMain.on("removeDetectable", (_event, id: string) => { + removeDetectable(id); + }); } diff --git a/src/discord/preload/bridge.ts b/src/discord/preload/bridge.ts index 3363edb..ca7fb8e 100644 --- a/src/discord/preload/bridge.ts +++ b/src/discord/preload/bridge.ts @@ -99,6 +99,7 @@ contextBridge.exposeInMainWorld("legcord", { refreshProcessList: () => ipcRenderer.send("refreshProcessList"), getProcessList: () => ipcRenderer.sendSync("getProcessList"), addDetectable: (detectable: Game) => ipcRenderer.send("addDetectable", detectable), + removeDetectable: (id: string) => ipcRenderer.send("removeDetectable", id), getDetectables: () => ipcRenderer.sendSync("getDetectables") as Game[], }, } as unknown as LegcordWindow); diff --git a/src/shelter/settings/components/DetectableCard.module.css b/src/shelter/settings/components/DetectableCard.module.css new file mode 100644 index 0000000..c12df94 --- /dev/null +++ b/src/shelter/settings/components/DetectableCard.module.css @@ -0,0 +1,50 @@ +.card { + border: 1px solid var(--background-accent); + border-radius: 4px; + padding: 0.5rem; + margin-top: 0.5rem; + flex-wrap: wrap; + display: flex; + align-items: flex-start; + gap: 0.5rem; +} + +.info { + align-self: flex-start; + flex: 1; + min-width: 0; +} + +.eyebrow { + margin-bottom: 0px !important; + color: var(--text-strong); +} + +.btn { + border: none; + background: none; + color: var(--interactive-text-active); + transition: opacity 250ms; +} + +.btn:hover { + color: var(--interactive-text-hover); +} + +.icon { + height: 20px; + margin-top: 2px; + filter: brightness(0) invert(1); +} + +.mainInfo { + flex-wrap: wrap; + align-items: baseline; + gap: 5px; + margin-bottom: -0.5em; + display: flex; +} + +.title { + margin-right: 0.25rem; +} diff --git a/src/shelter/settings/components/DetectableCard.tsx b/src/shelter/settings/components/DetectableCard.tsx new file mode 100644 index 0000000..18684c7 --- /dev/null +++ b/src/shelter/settings/components/DetectableCard.tsx @@ -0,0 +1,52 @@ +import type { Game } from "arrpc"; +import { setRestartRequired } from "../settings.js"; +import classes from "./DetectableCard.module.css"; + +const { + ui: { Header, HeaderTags, openConfirmationModal }, + plugin: { store }, +} = shelter; + +export const DetectableCard = (props: { + detectable: Game; + onRemove: () => void; +}) => { + function removeDetectable() { + openConfirmationModal({ + header: () => store.i18n["games-removeConfirmHeader"], + body: () => store.i18n["games-removeConfirmBody"], + type: "danger", + confirmText: store.i18n["games-remove"], + cancelText: store.i18n["settings-restartLater"], + }).then( + () => { + window.legcord.rpc.removeDetectable(props.detectable.id); + setRestartRequired(); + props.onRemove(); + }, + () => {}, + ); + } + + const executablesLabel = + props.detectable.executables.map((e) => e.name).join(", ") || store.i18n["games-noExecutables"]; + + return ( +
    +
    +
    +
    + {props.detectable.name} +
    +
    + {props.detectable.id} +
    +
    +
    {executablesLabel}
    +
    + +
    + ); +}; diff --git a/src/shelter/settings/index.ts b/src/shelter/settings/index.ts index facb008..7d673df 100644 --- a/src/shelter/settings/index.ts +++ b/src/shelter/settings/index.ts @@ -14,29 +14,28 @@ const { } = shelter; const settingsPages = [ - registerSection("section", "legcord-games", "Registered Games", RegisteredGamesPage), registerSection("divider"), registerSection("header", "Legcord"), registerSection("section", "legcord-settings", "Settings", SettingsPage), registerSection("section", "legcord-themes", "Themes", ThemesPage), registerSection("section", "legcord-keybinds", "Keybinds", KeybindsPage), + registerSection("section", "legcord-games", "Registered Games", RegisteredGamesPage), ]; function restartRequired(payload: { event: string; properties: { origin_pane: string } }) { if (payload.event === "settings_pane_viewed" && typeof payload.properties.origin_pane !== "undefined") { - if (payload.properties.origin_pane === "legcord-settings") { - if (isRestartRequired) { - openConfirmationModal({ - header: () => store.i18n["settings-restartRequired"], - body: () => store.i18n["settings-restartRequiredBody"], - type: "danger", - confirmText: store.i18n["settings-restart"], - cancelText: store.i18n["settings-restartLater"], - }).then( - () => window.legcord.restart(), - () => console.log("restart skipped"), - ); - } + const pane = payload.properties.origin_pane; + if ((pane === "legcord-settings" || pane === "legcord-games") && isRestartRequired) { + openConfirmationModal({ + header: () => store.i18n["settings-restartRequired"], + body: () => store.i18n["settings-restartRequiredBody"], + type: "danger", + confirmText: store.i18n["settings-restart"], + cancelText: store.i18n["settings-restartLater"], + }).then( + () => window.legcord.restart(), + () => console.log("restart skipped"), + ); } } } diff --git a/src/shelter/settings/pages/RegisteredGames.module.css b/src/shelter/settings/pages/RegisteredGames.module.css index 224bed9..82f2ded 100644 --- a/src/shelter/settings/pages/RegisteredGames.module.css +++ b/src/shelter/settings/pages/RegisteredGames.module.css @@ -1,6 +1,15 @@ .addBox { display: flex; justify-content: space-between; + align-items: center; + gap: 0.5rem; padding: 3px; margin-top: 1rem; + border: 1px solid var(--background-modifier-accent); + border-radius: 6px; +} + +.empty { + margin-top: 1rem; + color: var(--text-muted); } diff --git a/src/shelter/settings/pages/RegisteredGamesPage.tsx b/src/shelter/settings/pages/RegisteredGamesPage.tsx index cd21572..6bf5aee 100644 --- a/src/shelter/settings/pages/RegisteredGamesPage.tsx +++ b/src/shelter/settings/pages/RegisteredGamesPage.tsx @@ -1,31 +1,46 @@ import type { GameList, ProcessInfo } from "arrpc"; -import { For, createSignal } from "solid-js"; +import { For, Show, createSignal, onMount } from "solid-js"; import { sleep } from "../../../common/sleep.js"; import { AddDetectableModal } from "../components/AddDetectableModal.jsx"; +import { DetectableCard } from "../components/DetectableCard.jsx"; import { Dropdown } from "../components/Dropdown.jsx"; import classes from "./RegisteredGames.module.css"; + const { ui: { Header, HeaderTags, Divider, Button, ButtonSizes, openModal }, } = shelter; export function RegisteredGamesPage() { const [processList, setProcessList] = createSignal(); - const [detectables, setDetectables] = createSignal(); + const [detectables, setDetectables] = createSignal([]); const [selectedDetectable, setSelectedDetectable] = createSignal("refresh"); - function getDetectables() { + + function refreshDetectables() { window.legcord.rpc.refreshProcessList(); setDetectables(window.legcord.rpc.getDetectables()); sleep(500).then(() => { setProcessList(window.legcord.rpc.getProcessList()); }); } - getDetectables(); + + onMount(() => { + refreshDetectables(); + }); + function addNewGame() { openModal(({ close }: { close: () => void }) => ( - + { + close(); + refreshDetectables(); + }} + executable={selectedDetectable()} + /> )); } + const t = shelter.plugin.store.i18n; + return ( <>
    {t["games-registeredGames"]}
    @@ -35,11 +50,9 @@ export function RegisteredGamesPage() { value={selectedDetectable()} onChange={(v) => { if (v === "refresh") { - getDetectables(); + refreshDetectables(); setSelectedDetectable(""); - console.log("Detectables refreshed"); } else { - console.log("Selected detectable:", v); setSelectedDetectable(v); } }} @@ -48,11 +61,26 @@ export function RegisteredGamesPage() { { label: t["games-refreshList"], value: "refresh" }, ]} /> -
    - {(detectable) =>
    {detectable.name}
    }
    + 0} + fallback={ +
    + {t["games-empty"]} +
    + } + > + + {(detectable) => } + +
    ); } diff --git a/src/shelter/settings/settings.ts b/src/shelter/settings/settings.ts index 414e90f..e2307c5 100644 --- a/src/shelter/settings/settings.ts +++ b/src/shelter/settings/settings.ts @@ -8,6 +8,10 @@ const settings = store.settings as Settings; export let isRestartRequired = false; +export function setRestartRequired() { + isRestartRequired = true; +} + export function refreshSettings() { store.settings = window.legcord.settings.getConfig(); } From 450d167d94845d95b2dcb9f645bfa42850b2b726 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 29 Jan 2026 18:01:13 +0100 Subject: [PATCH 722/844] chore: bump dependencies --- package.json | 10 +- pnpm-lock.yaml | 433 +++++++++++++++++++++++++------------------------ 2 files changed, 229 insertions(+), 214 deletions(-) diff --git a/package.json b/package.json index 93be189..32e3b58 100644 --- a/package.json +++ b/package.json @@ -40,13 +40,13 @@ "@rollup/plugin-esm-shim": "^0.1.7", "@types/node": "^22.10.1", "@types/ws": "^8.5.13", - "@uwu/lune": "^1.5.1", - "@uwu/shelter-defs": "^1.4.1", + "@uwu/lune": "^1.6.2", + "@uwu/shelter-defs": "^1.5.1", "babel-preset-solid": "^1.9.3", - "electron": "39.2.7", - "electron-builder": "^26.3.5", + "electron": "40.1.0", + "electron-builder": "^26.4.0", "lucide-solid": "^0.475.0", - "rolldown": "1.0.0-beta.31", + "rolldown": "1.0.0-rc.2", "rollup-plugin-copy": "^3.5.0", "solid-js": "^1.9.3", "solid-motionone": "^1.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d825686..aa14965 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,10 +23,6 @@ importers: ws: specifier: ^8.18.0 version: 8.18.0 - optionalDependencies: - '@vencord/venmic': - specifier: ^6.1.0 - version: 6.1.0 devDependencies: '@babel/preset-flow': specifier: ^7.25.9 @@ -53,26 +49,26 @@ importers: specifier: ^8.5.13 version: 8.5.13 '@uwu/lune': + specifier: ^1.6.2 + version: 1.6.2 + '@uwu/shelter-defs': specifier: ^1.5.1 version: 1.5.1 - '@uwu/shelter-defs': - specifier: ^1.4.1 - version: 1.4.1 babel-preset-solid: specifier: ^1.9.3 version: 1.9.3(@babel/core@7.26.7) electron: - specifier: 39.2.7 - version: 39.2.7 + specifier: 40.1.0 + version: 40.1.0 electron-builder: - specifier: ^26.3.5 - version: 26.3.5(electron-builder-squirrel-windows@25.1.8) + specifier: ^26.4.0 + version: 26.4.0(electron-builder-squirrel-windows@25.1.8) lucide-solid: specifier: ^0.475.0 version: 0.475.0(solid-js@1.9.3) rolldown: - specifier: 1.0.0-beta.31 - version: 1.0.0-beta.31 + specifier: 1.0.0-rc.2 + version: 1.0.0-rc.2 rollup-plugin-copy: specifier: ^3.5.0 version: 3.5.0 @@ -91,6 +87,10 @@ importers: xml-formatter: specifier: ^3.6.6 version: 3.6.6 + optionalDependencies: + '@vencord/venmic': + specifier: ^6.1.0 + version: 6.1.0 packages: @@ -159,12 +159,6 @@ packages: resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.27.3': resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} engines: {node: '>=6.9.0'} @@ -411,24 +405,24 @@ packages: resolution: {integrity: sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==} engines: {node: '>=16.4'} - '@emnapi/core@1.3.1': - resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==} - '@emnapi/core@1.4.5': resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} - '@emnapi/runtime@1.3.1': - resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} '@emnapi/runtime@1.4.5': resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} - '@emnapi/wasi-threads@1.0.1': - resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} '@emnapi/wasi-threads@1.0.4': resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@esbuild/aix-ppc64@0.23.1': resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} engines: {node: '>=18'} @@ -777,8 +771,8 @@ packages: '@napi-rs/wasm-runtime@0.2.6': resolution: {integrity: sha512-z8YVS3XszxFTO73iwvFDNpQIzdMmSDTP/mB3E/ucR37V3Sx57hSExcXyMoNwaucWxnsWf4xfbZv0iZ30jr0M4Q==} - '@napi-rs/wasm-runtime@1.0.1': - resolution: {integrity: sha512-KVlQ/jgywZpixGCKMNwxStmmbYEMyokZpCf2YuIChhfJA2uqfAKNEM8INz7zzTo55iEXfBhIIs3VqYyqzDLj8g==} + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -809,12 +803,8 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This functionality has been moved to @npmcli/fs - '@oxc-project/runtime@0.80.0': - resolution: {integrity: sha512-3rzy1bJAZ4s7zV9TKT60x119RwJDCDqEtCwK/Zc2qlm7wGhiIUxLLYUhE/mN91yB0u1kxm5sh4NjU12sPqQTpg==} - engines: {node: '>=6.9.0'} - - '@oxc-project/types@0.80.0': - resolution: {integrity: sha512-xxHQm8wfCv2e8EmtaDwpMeAHOWqgQDAYg+BJouLXSQt5oTKu9TIXrgNMGSrM2fLvKmECsRd9uUFAAD+hPyootA==} + '@oxc-project/types@0.111.0': + resolution: {integrity: sha512-bh54LJMafgRGl2cPQ/QM+tI5rWaShm/wK9KywEj/w36MhiPKXYM67H2y3q+9pr4YO7ufwg2AKdBAZkhHBD8ClA==} '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} @@ -902,8 +892,9 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@rolldown/binding-android-arm64@1.0.0-beta.31': - resolution: {integrity: sha512-0mFtKwOG7smn0HkvQ6h8j0m/ohkR7Fp5eMTJ2Pns/HSbePHuDpxMaQ4TjZ6arlVXxpeWZlAHeT5BeNsOA3iWTg==} + '@rolldown/binding-android-arm64@1.0.0-rc.2': + resolution: {integrity: sha512-AGV80viZ4Hil4C16GFH+PSwq10jclV9oyRFhD+5HdowPOCJ+G+99N5AClQvMkUMIahTY8cX0SQpKEEWcCg6fSA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] @@ -912,8 +903,9 @@ packages: cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.0.0-beta.31': - resolution: {integrity: sha512-BHfHJ8Nb5G7ZKJl6pimJacupONT4F7w6gmQHw41rouAnJF51ORDwGefWeb6OMLzGmJwzxlIVPERfnJf1EsMM7A==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.2': + resolution: {integrity: sha512-PYR+PQu1mMmQiiKHN2JiOctvH32Xc/Mf+Su2RSmWtC9BbIqlqsVWjbulnShk0imjRim0IsbkMMCN5vYQwiuqaA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] @@ -922,8 +914,9 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.31': - resolution: {integrity: sha512-4MiuRtExC08jHbSU/diIL+IuQP+3Ck1FbWAplK+ysQJ7fxT3DMxy5FmnIGfmhaqow8oTjb2GEwZJKgTRjZL1Vw==} + '@rolldown/binding-darwin-x64@1.0.0-rc.2': + resolution: {integrity: sha512-X2G36Z6oh5ynoYpE2JAyG+uQ4kO/3N7XydM/I98FNk8VVgDKjajFF+v7TXJ2FMq6xa7Xm0UIUKHW2MRQroqoUA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] @@ -932,8 +925,9 @@ packages: cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.0.0-beta.31': - resolution: {integrity: sha512-nffC1u7ccm12qlAea8ExY3AvqlaHy/o/3L4p5Es8JFJ3zJSs6e3DyuxGZZVdl9EVwsLxPPTvioIl4tEm2afwyw==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.2': + resolution: {integrity: sha512-XpiFTsl9qjiDfrmJF6CE3dgj1nmSbxUIT+p2HIbXV6WOj/32btO8FKkWSsOphUwVinEt3R8HVkVrcLtFNruMMQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] @@ -942,8 +936,9 @@ packages: cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.31': - resolution: {integrity: sha512-LHmAaB3rB1GOJuHscKcL2Ts/LKLcb3YWTh2uQ/876rg/J9WE9kQ0kZ+3lRSYbth/YL8ln54j4JZmHpqQY3xptQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.2': + resolution: {integrity: sha512-zjYZ99e47Wlygs4hW+sQ+kshlO8ake9OoY2ecnJ9cwpDGiiIB9rQ3LgP3kt8j6IeVyMSksu//VEhc8Mrd1lRIw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -952,8 +947,9 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.31': - resolution: {integrity: sha512-oTDZVfqIAjLB2I1yTiLyyhfPPO6dky33sTblxTCpe+ZT55WizN3KDoBKJ4yXG8shI6I4bRShVu29Xg0yAjyQYw==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.2': + resolution: {integrity: sha512-Piso04EZ9IHV1aZSsLQVMOPTiCq4Ps2UPL3pchjNXHGJGFiB9U42s22LubPaEBFS+i6tCawS5EarIwex1zC4BA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -962,23 +958,20 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.31': - resolution: {integrity: sha512-duJ3IkEBj9Xe9NYW1n8Y3483VXHGi8zQ0ZsLbK8464EJUXLF7CXM8Ry+jkkUw+ZvA+Zu1E/+C6p2Y6T9el0C9g==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.2': + resolution: {integrity: sha512-OwJCeMZlmjKsN9pfJfTmqYpe3JC+L6RO87+hu9ajRLr1Lh6cM2FRQ8e48DLRyRDww8Ti695XQvqEANEMmsuzLw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-ohos@1.0.0-beta.31': - resolution: {integrity: sha512-qdbmU5QSZ0uoLZBYMxiHsMQmizqtzFGTVPU5oyU1n0jU0Mo+mkSzqZuL8VBnjHOHzhVxZsoAGH9JjiRzCnoGVA==} - cpu: [arm64] - os: [openharmony] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.1': resolution: {integrity: sha512-a8QP35x/3mggWqCpFtaF3/PbWl5P9QKpP/muk3iMPgzrXto8zPsEl3imsP3EBh4KwanBVHIf8pEkBQ+/7iMTgQ==} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.31': - resolution: {integrity: sha512-H7+r34TSV8udB2gAsebFM/YuEeNCkPGEAGJ1JE7SgI9XML6FflqcdKfrRSneQFsPaom/gCEc1g0WW5MZ0O3blw==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.2': + resolution: {integrity: sha512-uQqBmA8dTWbKvfqbeSsXNUssRGfdgQCc0hkGfhQN7Pf85wG2h0Fd/z2d+ykyT4YbcsjQdgEGxBNsg3v4ekOuEA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -987,18 +980,25 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.31': - resolution: {integrity: sha512-zRm2YmzFVqbsmUsyyZnHfJrOlQUcWS/FJ5ZWL8Q1kZh5PnLBrTVZNpakIWwAxpN5gNEi9MmFd5YHocVJp8ps1Q==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.2': + resolution: {integrity: sha512-ItZabVsICCYWHbP+jcAgNzjPAYg5GIVQp/NpqT6iOgWctaMYtobClc5m0kNtxwqfNrLXoyt998xUey4AvcxnGQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + '@rolldown/binding-openharmony-arm64@1.0.0-rc.2': + resolution: {integrity: sha512-U4UYANwafcMXSUC0VqdrqTAgCo2v8T7SiuTYwVFXgia0KOl8jiv3okwCFqeZNuw/G6EWDiqhT8kK1DLgyLsxow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.1': resolution: {integrity: sha512-RB+gbhwZtTbKbvHzUcaRFva2ONCUTuxDEb/b3/rd3O82OTPUZzOY24mqreiXH1XG09p6WFXSE8dzUrN120Q29w==} engines: {node: '>=14.21.3'} cpu: [wasm32] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.31': - resolution: {integrity: sha512-fM1eUIuHLsNJXRlWOuIIex1oBJ89I0skFWo5r/D3KSJ5gD9MBd3g4Hp+v1JGohvyFE+7ylnwRxSUyMEeYpA69A==} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.2': + resolution: {integrity: sha512-ZIWCjQsMon4tqRoao0Vzowjwx0cmFT3kublh2nNlgeasIJMWlIGHtr0d4fPypm57Rqx4o1h4L8SweoK2q6sMGA==} engines: {node: '>=14.0.0'} cpu: [wasm32] @@ -1007,8 +1007,9 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.31': - resolution: {integrity: sha512-4nftR9V2KHH3zjBwf6leuZZJQZ7v0d70ogjHIqB3SDsbDLvVEZiGSsSn2X6blSZRZeJSFzK0pp4kZ67zdZXwSw==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.2': + resolution: {integrity: sha512-NIo7vwRUPEzZ4MuZGr5YbDdjJ84xdiG+YYf8ZBfTgvIsk9wM0sZamJPEXvaLkzVIHpOw5uqEHXS85Gqqb7aaqQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] @@ -1017,23 +1018,19 @@ packages: cpu: [ia32] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.31': - resolution: {integrity: sha512-0TQcKu9xZVHYALit+WJsSuADGlTFfOXhnZoIHWWQhTk3OgbwwbYcSoZUXjRdFmR6Wswn4csHtJGN1oYKeQ6/2g==} - cpu: [ia32] - os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.1': resolution: {integrity: sha512-k8Ld05OlxkzR/+Ob8+IESaZ4uFcgLwbbwtUZLoryn3S6lCogkclcN/4m1wo/PyWtUAWF5mdz83SrkRL8dS4AqA==} cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.31': - resolution: {integrity: sha512-3zMICWwpZh1jrkkKDYIUCx/2wY3PXLICAS0AnbeLlhzfWPhCcpNK9eKhiTlLAZyTp+3kyipoi/ZSVIh+WDnBpQ==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.2': + resolution: {integrity: sha512-bLKzyLFbvngeNPZocuLo3LILrKwCrkyMxmRXs6fZYDrvh7cyZRw9v56maDL9ipPas0OOmQK1kAKYwvTs30G21Q==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-beta.31': - resolution: {integrity: sha512-IaDZ9NhjOIOkYtm+hH0GX33h3iVZ2OeSUnFF0+7Z4+1GuKs4Kj5wK3+I2zNV9IPLfqV4XlwWif8SXrZNutxciQ==} + '@rolldown/pluginutils@1.0.0-rc.2': + resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} '@rollup/plugin-babel@6.0.4': resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} @@ -1197,8 +1194,8 @@ packages: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} - '@tybys/wasm-util@0.10.0': - resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} @@ -1236,6 +1233,9 @@ packages: '@types/node@22.10.1': resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} + '@types/node@24.10.9': + resolution: {integrity: sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==} + '@types/plist@3.0.5': resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} @@ -1251,12 +1251,12 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@uwu/lune@1.5.1': - resolution: {integrity: sha512-q+xfFZagj+TKaC4l6mHiHxR83/CfzGeqo9sIsh99M5B71c0qpP4dR8SOm5/QfH0pdk5Fpfjf/7LTrYnUy+uoTg==} + '@uwu/lune@1.6.2': + resolution: {integrity: sha512-0/e1zFGm7pBISyuNvhKMqdg4gEQOpBtf8wdquJaUDqA0enrV55iwMWrrCdJHlfx77K1D8hjnAUGvCXxwFebg5Q==} hasBin: true - '@uwu/shelter-defs@1.4.1': - resolution: {integrity: sha512-KDQQf7S8yT1/ZxBZ8Ch5zHZ1ps9QcVtRWfnzK0pqrQb++5Tb2hqD0RiL5IrdS765/ZXglq0cgKWB6xesHVCZKg==} + '@uwu/shelter-defs@1.5.1': + resolution: {integrity: sha512-bO3M5SgqEpuNZkjd/LZFtTNNATpmVle5uznVp0QNgi3o1w2ej/ieYmwFK6nBZqnZHd8/4aJN1Njl/JbTnZcY5A==} '@vencord/venmic@6.1.0': resolution: {integrity: sha512-YiCtzml/W8tYbGhu3jm5jfbbEnl2slKKARNK0jO+8qV979k9eFnfIRTxvhMN/SWq1h8ZNJdXVwvXpffQwq0RuA==} @@ -1314,10 +1314,6 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - ansis@4.1.0: - resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} - engines: {node: '>=14'} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1335,12 +1331,12 @@ packages: dmg-builder: 25.1.8 electron-builder-squirrel-windows: 25.1.8 - app-builder-lib@26.3.5: - resolution: {integrity: sha512-AluSgBV7oWEE6wqC80S4drTTBWB8opxBgRGa8kSClRhULttN7pKiRz5K/74rCUi7XkstggtdQALsI6zCqenNzA==} + app-builder-lib@26.4.0: + resolution: {integrity: sha512-Uas6hNe99KzP3xPWxh5LGlH8kWIVjZixzmMJHNB9+6hPyDpjc7NQMkVgi16rQDdpCFy22ZU5sp8ow7tvjeMgYQ==} engines: {node: '>=14.0.0'} peerDependencies: - dmg-builder: 26.3.5 - electron-builder-squirrel-windows: 26.3.5 + dmg-builder: 26.4.0 + electron-builder-squirrel-windows: 26.4.0 aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -1520,10 +1516,6 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - ci-info@4.3.0: - resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} - engines: {node: '>=8'} - ci-info@4.3.1: resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} engines: {node: '>=8'} @@ -1631,6 +1623,9 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -1698,8 +1693,8 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dmg-builder@26.3.5: - resolution: {integrity: sha512-3qXWrP5zWswQi3EqFQyQWMkAHpwMdNDoVaJfqbfLPqX1umq7m+Fav30mQd6Sk7nXH+YvrrjjoeIfif/PH/l1mQ==} + dmg-builder@26.4.0: + resolution: {integrity: sha512-ce4Ogns4VMeisIuCSK0C62umG0lFy012jd8LMZ6w/veHUeX4fqfDrGe+HTWALAEwK6JwKP+dhPvizhArSOsFbg==} dmg-license@1.0.11: resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} @@ -1726,8 +1721,8 @@ packages: electron-builder-squirrel-windows@25.1.8: resolution: {integrity: sha512-2ntkJ+9+0GFP6nAISiMabKt6eqBB0kX1QqHNWFWAXgi0VULKGisM46luRFpIBiU3u/TDmhZMM8tzvo2Abn3ayg==} - electron-builder@26.3.5: - resolution: {integrity: sha512-I0HNjrWEGnCKDsQ9GkFa92E1hW/FmKe88bh75jucBoHRIcZUvTwbqJFGn9kKG6cFq9eOWCXOEVs+RvXT/Ma49Q==} + electron-builder@26.4.0: + resolution: {integrity: sha512-FCUqvdq2AULL+Db2SUGgjOYTbrgkPxZtCjqIZGnjH9p29pTWyesQqBIfvQBKa6ewqde87aWl49n/WyI/NyUBog==} engines: {node: '>=14.0.0'} hasBin: true @@ -1755,8 +1750,8 @@ packages: electron-updater@6.6.2: resolution: {integrity: sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==} - electron@39.2.7: - resolution: {integrity: sha512-KU0uFS6LSTh4aOIC3miolcbizOFP7N1M46VTYVfqIgFiuA2ilfNaOHLDS9tCMvwwHRowAsvqBrh9NgMXcTOHCQ==} + electron@40.1.0: + resolution: {integrity: sha512-2j/kvw7uF0H1PnzYBzw2k2Q6q16J8ToKrtQzZfsAoXbbMY0l5gQi2DLOauIZLzwp4O01n8Wt/74JhSRwG0yj9A==} engines: {node: '>= 12.20.55'} hasBin: true @@ -2005,6 +2000,11 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -2492,6 +2492,9 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + node-abi@3.71.0: resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} engines: {node: '>=10'} @@ -2765,8 +2768,9 @@ packages: '@babel/runtime': optional: true - rolldown@1.0.0-beta.31: - resolution: {integrity: sha512-M2Q+RfG0FMJeSW3RSFTbvtjGVTcQpTQvN247D0EMSsPkpZFoinopR9oAnQiwgogQyzDuvKNnbyCbQQlmNAzSoQ==} + rolldown@1.0.0-rc.2: + resolution: {integrity: sha512-1g/8Us9J8sgJGn3hZfBecX1z4U3y5KO7V/aV2U1M/9UUzLNqHA8RfFQ/NPT7HLxOIldyIgrcjaYTRvA81KhJIg==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true rollup-plugin-copy@3.5.0: @@ -2817,11 +2821,6 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} @@ -2922,8 +2921,8 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - spitroast@1.4.4: - resolution: {integrity: sha512-S69rzIFjbGoEW5YCLpm1kEdqMEYqC09lmE1ZMY4gyUXfke0wi9qZjKYa0DDSv5eIy/D+/UGJT8yxgJddU3oqlA==} + spitroast@2.1.4: + resolution: {integrity: sha512-IA987I3wS8RbrKrgag+NsxLUAttrqONF7UGOL+uQFmLLXlMhZl42LomTAltBQaev0jUXIaRiqShZ3hnJYT7OCQ==} sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} @@ -2989,10 +2988,12 @@ packages: tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me tar@7.5.2: resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} engines: {node: '>=18'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me temp-file@3.4.0: resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} @@ -3041,9 +3042,17 @@ packages: engines: {node: '>=14.17'} hasBin: true + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + unique-filename@2.0.1: resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -3113,6 +3122,9 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -3190,8 +3202,8 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 '@babel/code-frame@7.26.2': dependencies: @@ -3210,15 +3222,15 @@ snapshots: '@babel/core@7.26.7': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.5 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.7) + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.26.7) '@babel/helpers': 7.26.7 - '@babel/parser': 7.26.7 - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.7 - '@babel/types': 7.26.7 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.2 convert-source-map: 2.0.0 debug: 4.4.0 gensync: 1.0.0-beta.2 @@ -3250,7 +3262,7 @@ snapshots: '@babel/helper-compilation-targets@7.26.5': dependencies: '@babel/compat-data': 7.26.5 - '@babel/helper-validator-option': 7.25.9 + '@babel/helper-validator-option': 7.27.1 browserslist: 4.24.4 lru-cache: 5.1.1 semver: 6.3.1 @@ -3295,15 +3307,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.7)': - dependencies: - '@babel/core': 7.26.7 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.7 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.26.7)': dependencies: '@babel/core': 7.26.7 @@ -3351,8 +3354,8 @@ snapshots: '@babel/helpers@7.26.7': dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.7 + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 '@babel/parser@7.26.7': dependencies: @@ -3630,20 +3633,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@emnapi/core@1.3.1': - dependencies: - '@emnapi/wasi-threads': 1.0.1 - tslib: 2.8.1 - optional: true - '@emnapi/core@1.4.5': dependencies: '@emnapi/wasi-threads': 1.0.4 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.3.1': + '@emnapi/core@1.8.1': dependencies: + '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true @@ -3652,7 +3650,7 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.0.1': + '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 optional: true @@ -3662,6 +3660,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.23.1': optional: true @@ -3830,7 +3833,7 @@ snapshots: dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 '@jridgewell/resolve-uri@3.1.2': {} @@ -3898,16 +3901,16 @@ snapshots: '@napi-rs/wasm-runtime@0.2.6': dependencies: - '@emnapi/core': 1.3.1 - '@emnapi/runtime': 1.3.1 + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 '@tybys/wasm-util': 0.9.0 optional: true - '@napi-rs/wasm-runtime@1.0.1': + '@napi-rs/wasm-runtime@1.1.1': dependencies: - '@emnapi/core': 1.4.5 - '@emnapi/runtime': 1.4.5 - '@tybys/wasm-util': 0.10.0 + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 optional: true '@nodelib/fs.scandir@2.1.5': @@ -3946,9 +3949,7 @@ snapshots: mkdirp: 1.0.4 rimraf: 3.0.2 - '@oxc-project/runtime@0.80.0': {} - - '@oxc-project/types@0.80.0': {} + '@oxc-project/types@0.111.0': {} '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -4014,58 +4015,58 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@rolldown/binding-android-arm64@1.0.0-beta.31': + '@rolldown/binding-android-arm64@1.0.0-rc.2': optional: true '@rolldown/binding-darwin-arm64@1.0.0-beta.1': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.31': + '@rolldown/binding-darwin-arm64@1.0.0-rc.2': optional: true '@rolldown/binding-darwin-x64@1.0.0-beta.1': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.31': + '@rolldown/binding-darwin-x64@1.0.0-rc.2': optional: true '@rolldown/binding-freebsd-x64@1.0.0-beta.1': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.31': + '@rolldown/binding-freebsd-x64@1.0.0-rc.2': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.1': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.31': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.2': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.1': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.31': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.2': optional: true '@rolldown/binding-linux-arm64-musl@1.0.0-beta.1': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.31': - optional: true - - '@rolldown/binding-linux-arm64-ohos@1.0.0-beta.31': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.2': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-beta.1': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.31': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.2': optional: true '@rolldown/binding-linux-x64-musl@1.0.0-beta.1': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.31': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.2': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.2': optional: true '@rolldown/binding-wasm32-wasi@1.0.0-beta.1': @@ -4073,30 +4074,27 @@ snapshots: '@napi-rs/wasm-runtime': 0.2.6 optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.31': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.2': dependencies: - '@napi-rs/wasm-runtime': 1.0.1 + '@napi-rs/wasm-runtime': 1.1.1 optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.1': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.31': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.2': optional: true '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.1': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.31': - optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.1': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.31': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.2': optional: true - '@rolldown/pluginutils@1.0.0-beta.31': {} + '@rolldown/pluginutils@1.0.0-rc.2': {} '@rollup/plugin-babel@6.0.4(@babel/core@7.26.7)(rollup@4.27.4)': dependencies: @@ -4208,7 +4206,7 @@ snapshots: '@tootallnate/once@2.0.0': {} - '@tybys/wasm-util@0.10.0': + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true @@ -4258,6 +4256,10 @@ snapshots: dependencies: undici-types: 6.20.0 + '@types/node@24.10.9': + dependencies: + undici-types: 7.16.0 + '@types/plist@3.0.5': dependencies: '@types/node': 22.10.1 @@ -4280,12 +4282,14 @@ snapshots: '@types/node': 22.10.1 optional: true - '@uwu/lune@1.5.1': + '@uwu/lune@1.6.2': dependencies: '@babel/core': 7.26.7 '@babel/preset-typescript': 7.27.1(@babel/core@7.26.7) chokidar: 3.6.0 + date-fns: 4.1.0 esbuild: 0.17.19 + handlebars: 4.7.8 lightningcss: 1.29.1 resolve: 1.22.10 rolldown: 1.0.0-beta.1 @@ -4297,11 +4301,11 @@ snapshots: - supports-color - utf-8-validate - '@uwu/shelter-defs@1.4.1': + '@uwu/shelter-defs@1.5.1': dependencies: idb: 7.1.1 solid-js: 1.6.16 - spitroast: 1.4.4 + spitroast: 2.1.4 '@vencord/venmic@6.1.0': dependencies: @@ -4356,8 +4360,6 @@ snapshots: ansi-styles@6.2.1: {} - ansis@4.1.0: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -4367,7 +4369,7 @@ snapshots: app-builder-bin@5.0.0-alpha.12: {} - app-builder-lib@25.1.8(dmg-builder@26.3.5)(electron-builder-squirrel-windows@25.1.8): + app-builder-lib@25.1.8(dmg-builder@26.4.0)(electron-builder-squirrel-windows@25.1.8): dependencies: '@develar/schema-utils': 2.6.5 '@electron/notarize': 2.5.0 @@ -4383,11 +4385,11 @@ snapshots: chromium-pickle-js: 0.2.0 config-file-ts: 0.2.8-rc1 debug: 4.4.0 - dmg-builder: 26.3.5(electron-builder-squirrel-windows@25.1.8) + dmg-builder: 26.4.0(electron-builder-squirrel-windows@25.1.8) dotenv: 16.4.5 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.3.5) + electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.4.0) electron-publish: 25.1.7 form-data: 4.0.1 fs-extra: 10.1.0 @@ -4407,7 +4409,7 @@ snapshots: - bluebird - supports-color - app-builder-lib@26.3.5(dmg-builder@26.3.5)(electron-builder-squirrel-windows@25.1.8): + app-builder-lib@26.4.0(dmg-builder@26.4.0)(electron-builder-squirrel-windows@25.1.8): dependencies: '@develar/schema-utils': 2.6.5 '@electron/asar': 3.4.1 @@ -4424,11 +4426,11 @@ snapshots: chromium-pickle-js: 0.2.0 ci-info: 4.3.1 debug: 4.4.0 - dmg-builder: 26.3.5(electron-builder-squirrel-windows@25.1.8) + dmg-builder: 26.4.0(electron-builder-squirrel-windows@25.1.8) dotenv: 16.4.5 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.3.5) + electron-builder-squirrel-windows: 25.1.8(dmg-builder@26.4.0) electron-publish: 26.3.4 fs-extra: 10.1.0 hosted-git-info: 4.1.0 @@ -4735,8 +4737,6 @@ snapshots: ci-info@3.9.0: {} - ci-info@4.3.0: {} - ci-info@4.3.1: {} clean-stack@2.2.0: {} @@ -4850,6 +4850,8 @@ snapshots: csstype@3.1.3: {} + date-fns@4.1.0: {} + debug@4.3.7: dependencies: ms: 2.1.3 @@ -4906,9 +4908,9 @@ snapshots: dependencies: path-type: 4.0.0 - dmg-builder@26.3.5(electron-builder-squirrel-windows@25.1.8): + dmg-builder@26.4.0(electron-builder-squirrel-windows@25.1.8): dependencies: - app-builder-lib: 26.3.5(dmg-builder@26.3.5)(electron-builder-squirrel-windows@25.1.8) + app-builder-lib: 26.4.0(dmg-builder@26.4.0)(electron-builder-squirrel-windows@25.1.8) builder-util: 26.3.4 fs-extra: 10.1.0 iconv-lite: 0.6.3 @@ -4943,9 +4945,9 @@ snapshots: dependencies: jake: 10.9.2 - electron-builder-squirrel-windows@25.1.8(dmg-builder@26.3.5): + electron-builder-squirrel-windows@25.1.8(dmg-builder@26.4.0): dependencies: - app-builder-lib: 25.1.8(dmg-builder@26.3.5)(electron-builder-squirrel-windows@25.1.8) + app-builder-lib: 25.1.8(dmg-builder@26.4.0)(electron-builder-squirrel-windows@25.1.8) archiver: 5.3.2 builder-util: 25.1.7 fs-extra: 10.1.0 @@ -4954,14 +4956,14 @@ snapshots: - dmg-builder - supports-color - electron-builder@26.3.5(electron-builder-squirrel-windows@25.1.8): + electron-builder@26.4.0(electron-builder-squirrel-windows@25.1.8): dependencies: - app-builder-lib: 26.3.5(dmg-builder@26.3.5)(electron-builder-squirrel-windows@25.1.8) + app-builder-lib: 26.4.0(dmg-builder@26.4.0)(electron-builder-squirrel-windows@25.1.8) builder-util: 26.3.4 builder-util-runtime: 9.5.1 chalk: 4.1.2 - ci-info: 4.3.0 - dmg-builder: 26.3.5(electron-builder-squirrel-windows@25.1.8) + ci-info: 4.3.1 + dmg-builder: 26.4.0(electron-builder-squirrel-windows@25.1.8) fs-extra: 10.1.0 lazy-val: 1.0.5 simple-update-notifier: 2.0.0 @@ -5024,10 +5026,10 @@ snapshots: transitivePeerDependencies: - supports-color - electron@39.2.7: + electron@40.1.0: dependencies: '@electron/get': 2.0.3 - '@types/node': 22.10.1 + '@types/node': 24.10.9 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -5355,6 +5357,15 @@ snapshots: graceful-fs@4.2.11: {} + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -5799,6 +5810,8 @@ snapshots: negotiator@1.0.0: {} + neo-async@2.6.2: {} + node-abi@3.71.0: dependencies: semver: 7.7.3 @@ -6086,27 +6099,24 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.1 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.1 - rolldown@1.0.0-beta.31: + rolldown@1.0.0-rc.2: dependencies: - '@oxc-project/runtime': 0.80.0 - '@oxc-project/types': 0.80.0 - '@rolldown/pluginutils': 1.0.0-beta.31 - ansis: 4.1.0 + '@oxc-project/types': 0.111.0 + '@rolldown/pluginutils': 1.0.0-rc.2 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.31 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.31 - '@rolldown/binding-darwin-x64': 1.0.0-beta.31 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.31 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.31 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.31 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.31 - '@rolldown/binding-linux-arm64-ohos': 1.0.0-beta.31 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.31 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.31 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.31 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.31 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.31 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.31 + '@rolldown/binding-android-arm64': 1.0.0-rc.2 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.2 + '@rolldown/binding-darwin-x64': 1.0.0-rc.2 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.2 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.2 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.2 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.2 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.2 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.2 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.2 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.2 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.2 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.2 rollup-plugin-copy@3.5.0: dependencies: @@ -6174,8 +6184,6 @@ snapshots: semver@7.7.0: {} - semver@7.7.2: {} - semver@7.7.3: {} serialize-error@7.0.1: @@ -6203,7 +6211,7 @@ snapshots: simple-update-notifier@2.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 slash@3.0.0: {} @@ -6279,7 +6287,7 @@ snapshots: source-map@0.6.1: {} - spitroast@1.4.4: {} + spitroast@2.1.4: {} sprintf-js@1.1.3: {} @@ -6414,8 +6422,13 @@ snapshots: typescript@5.7.2: {} + uglify-js@3.19.3: + optional: true + undici-types@6.20.0: {} + undici-types@7.16.0: {} + unique-filename@2.0.1: dependencies: unique-slug: 3.0.0 @@ -6483,6 +6496,8 @@ snapshots: dependencies: string-width: 4.2.3 + wordwrap@1.0.0: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 From afac1b094b38edc27567167044185d3471f609f4 Mon Sep 17 00:00:00 2001 From: smartfrigde <37928912+smartfrigde@users.noreply.github.com> Date: Thu, 29 Jan 2026 18:18:05 +0100 Subject: [PATCH 723/844] feat: functional add detectable modal --- .../components/AddDetectableModal.tsx | 57 +++++++++++++------ src/shelter/settings/components/Dropdown.tsx | 21 +++++-- src/shelter/settings/index.ts | 2 +- .../settings/pages/RegisteredGames.module.css | 5 +- .../settings/pages/RegisteredGamesPage.tsx | 1 + 5 files changed, 62 insertions(+), 24 deletions(-) diff --git a/src/shelter/settings/components/AddDetectableModal.tsx b/src/shelter/settings/components/AddDetectableModal.tsx index adbf0c3..d525976 100644 --- a/src/shelter/settings/components/AddDetectableModal.tsx +++ b/src/shelter/settings/components/AddDetectableModal.tsx @@ -1,5 +1,7 @@ import type { Game } from "arrpc"; import { createSignal } from "solid-js"; +import { setRestartRequired } from "../settings.js"; + const { ui: { ModalRoot, @@ -11,10 +13,13 @@ const { Header, HeaderTags, Divider, + SwitchItem, showToast, + openConfirmationModal, }, plugin: { store }, } = shelter; + export const AddDetectableModal = (props: { close: () => void; executable: string }) => { const [appName, setAppName] = createSignal(""); const [appId, setAppId] = createSignal(""); @@ -41,27 +46,44 @@ export const AddDetectableModal = (props: { close: () => void; executable: strin }, ], id: appId().trim(), - aliases: - aliases() - .split(",") - .map((a) => a.trim()) || [], + aliases: aliases() + .split(",") + .map((a) => a.trim()) + .filter(Boolean), hook: false, overlay: true, overlay_compatibility_hook: false, overlay_methods: null, overlay_warn: false, - themes: - themes() - .split(",") - .map((t) => t.trim()) || [], + themes: themes() + .split(",") + .map((t) => t.trim()) + .filter(Boolean), }; current.push(game); store.settings.detectables = current; - window.legcord.rpc.addDetectable(game); + // Send a plain object so IPC structured clone does not fail (store may wrap with proxies) + window.legcord.rpc.addDetectable(JSON.parse(JSON.stringify(game)) as Game); + setRestartRequired(); + props.close(); + + openConfirmationModal({ + header: () => store.i18n["settings-restartRequired"], + body: () => store.i18n["settings-restartRequiredBody"], + type: "danger", + confirmText: store.i18n["settings-restart"], + cancelText: store.i18n["settings-restartLater"], + }).then( + () => window.legcord.restart(), + () => {}, + ); } const t = store.i18n; + const canSave = () => + Boolean(appName().trim() && appId().trim() && props.executable && props.executable !== "refresh"); + return ( {t["detectable-addApp"]} @@ -77,16 +99,17 @@ export const AddDetectableModal = (props: { close: () => void; executable: strin
    {t["detectable-aliases"]}
    - +
    - + ); }; diff --git a/src/shelter/settings/components/Dropdown.tsx b/src/shelter/settings/components/Dropdown.tsx index af61f23..85b3ff9 100644 --- a/src/shelter/settings/components/Dropdown.tsx +++ b/src/shelter/settings/components/Dropdown.tsx @@ -5,7 +5,9 @@ export const Dropdown = (props: { value: string | number; onChange: (val: string) => void; options: { label: string; value: string | number }[]; + styles?: { [key: string]: string }; limitHeight?: boolean | undefined; + class?: string; }) => { const [open, set] = createSignal(false); const [maxHeight, setMaxHeight] = createSignal(""); @@ -28,10 +30,16 @@ export const Dropdown = (props: { const text = createMemo(() => props.options.find((o) => o.value === props.value)?.label ?? props.value); return ( - // biome-ignore lint/a11y/useSemanticElements: FIX-ME -
    -
    set(!open())}> -
    +
    +
    set(!open())} style={props.styles?.valuewrapper}> +
    {text()}
    @@ -52,7 +60,10 @@ export const Dropdown = (props: {
    {open() && ( -
    +
    {(opt) => (