diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index b7c20a2..0000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "image": "mcr.microsoft.com/devcontainers/universal:2", - "features": { - "ghcr.io/devcontainers/features/desktop-lite:1": {} -} -} diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 6313b56..0000000 --- a/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto eol=lf diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..419d264 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,28 @@ +## Summary + + + +## Problem + + + +## Solution + + + +## Risk + + + +## Testing + + + +- [ ] `pnpm lint` +- [ ] `pnpm build` if this PR touches runtime, bundling, or packaging code +- [ ] Manual verification for affected flows +- [ ] Screenshots or recordings for UI changes + +## Notes + + diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index ca9e9b4..0000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,13 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "weekly" - - package-ecosystem: npm - directory: "/" - schedule: - interval: daily - time: "13:00" - open-pull-requests-limit: 99 - versioning-strategy: increase diff --git a/.github/FUNDING.yml b/.github/funding.yml similarity index 100% rename from .github/FUNDING.yml rename to .github/funding.yml diff --git a/.github/release.md b/.github/release.md index 4d274f0..3f355aa 100644 --- a/.github/release.md +++ b/.github/release.md @@ -1,4 +1,4 @@ -# Thanks for checking out ArmCord dev builds! +# Thanks for checking out Legcord dev builds! These builds are unstable and not ready for full release. They contain new experimental features and changes. We provide no official support for them. -Make sure to join our [Discord server](https://discord.gg/uaW5vMY3V6) to share opinions, or to chat with ArmCord developers! +Make sure to join our [Discord server](https://discord.gg/uaW5vMY3V6) to share opinions, or to chat with Legcord developers! diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml deleted file mode 100644 index 32cc83d..0000000 --- a/.github/workflows/dev.yml +++ /dev/null @@ -1,105 +0,0 @@ -name: Dev build -on: - push: - branches: - - dev -jobs: - build: - strategy: - matrix: - os: [windows-latest, ubuntu-latest, macos-latest] - arch: [arm64, amd64] - include: - - arch: arm64 - os: windows-latest - flags: "--arm64 --windows" - target: "arm64-win" - - - arch: amd64 - os: windows-latest - flags: "--x64 --windows" - target: "amd64-win" - - - arch: arm64 - os: ubuntu-latest - flags: "--arm64 --linux" - target: "arm64-linux" - - - arch: amd64 - os: ubuntu-latest - flags: "--x64 --linux" - target: "amd64-linux" - - - arch: arm64 - os: macos-latest - flags: "--arm64 --macos" - target: "arm64-mac" - - - arch: amd64 - os: macos-latest - flags: "--x64 --macos" - target: "amd64-mac" - - runs-on: ${{matrix.os}} - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Prepeare PNPM - uses: pnpm/action-setup@v4 - - - name: Prepare Node.js - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: pnpm - - - name: Install dependencies - run: pnpm i - - - name: Build TypeScript - run: pnpm build - - - name: Build Electron - run: pnpm electron-builder ${{matrix.flags}} zip - env: - GH_TOKEN: ${{secrets.GITHUB_TOKEN}} # MacOS needs the token or it will fail to build - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: ${{matrix.target}} - path: dist/ - - release: - runs-on: ubuntu-latest - needs: build - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Download artifacts - uses: actions/download-artifact@v4 - with: - path: release-files - - - name: Get short commit hash - id: vars - run: echo "sha_short=$(git rev-parse --short "$GITHUB_SHA")" >> $GITHUB_OUTPUT - - - name: Delete old devbuild - run: gh release delete devbuild -y --cleanup-tag - env: - GH_TOKEN: ${{secrets.GITHUB_TOKEN}} - - - name: Create release - uses: ncipollo/release-action@v1 - env: - GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} - with: - bodyFile: .github/release.md - name: Dev Build ${{steps.vars.outputs.sha_short}} - prerelease: true - draft: false - tag: devbuild - artifacts: release-files/**/*.zip diff --git a/.github/workflows/eslint.yml b/.github/workflows/eslint.yml deleted file mode 100644 index 1663a6a..0000000 --- a/.github/workflows/eslint.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Lint - -on: - push: - branches: - - "*" - pull_request: - branches: - - "*" - -jobs: - run-linters: - name: Run linters - runs-on: ubuntu-latest - - steps: - - name: Check out Git repository - uses: actions/checkout@v4 - - - uses: pnpm/action-setup@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: pnpm - - - name: Install Node.js dependencies - run: pnpm install - - - name: Run linters - run: pnpm run lint diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..7c38240 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,14 @@ +name: Code quality + +on: [push, pull_request] + +jobs: + quality: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Setup Biome + uses: biomejs/setup-biome@v2 + - name: Run Biome + run: biome ci . --reporter=github diff --git a/.github/workflows/meta.yml b/.github/workflows/meta.yml new file mode 100644 index 0000000..b199551 --- /dev/null +++ b/.github/workflows/meta.yml @@ -0,0 +1,45 @@ +name: Update metainfo on release + +on: + release: + types: + - published + workflow_dispatch: + +permissions: + contents: write + +jobs: + update: + runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + + steps: + - uses: actions/checkout@v6 + - uses: pnpm/action-setup@v6 # Install pnpm using packageManager key in package.json + + - name: Use Node.js 22 + uses: actions/setup-node@v6 + 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 "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 HEAD:dev + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml new file mode 100644 index 0000000..326c821 --- /dev/null +++ b/.github/workflows/package.yml @@ -0,0 +1,121 @@ +name: Package +on: + push: + branches: + - dev + - stable +jobs: + package: + continue-on-error: true + strategy: + matrix: + os: [macos-latest, windows-latest, ubuntu-latest] + runs-on: ${{matrix.os}} + env: + SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_TOKEN }} + GH_TOKEN: ${{secrets.GITHUB_TOKEN}} + + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Add commit to version + if: github.ref_name == 'dev' + run: cat <<< $(jq --arg ver "$(jq -r '.version' package.json)-$(git rev-parse --short HEAD)" '.version = $ver' package.json) > package.json + shell: bash + + - name: Prepare PNPM + uses: pnpm/action-setup@v6 + + - name: Prepare Node.js + uses: actions/setup-node@v6 + with: + node-version-file: package.json + cache: pnpm + + - name: Install dependencies + run: pnpm i + + - name: Build TypeScript + run: pnpm build + + - name: Install SnapCraft + if: matrix.os == 'macos-latest' + uses: samuelmeuli/action-snapcraft@v3 + + - name: Load Electron cache + uses: actions/cache/restore@v5 + with: + path: .cache + key: electron-zips.${{matrix.os}} + + # Sadly, it makes more sense to separate builds per platform + - name: Build Electron for MacOS (DMG & ZIP) + if: matrix.os == 'macos-latest' + run: pnpm electron-builder --universal -m zip dmg + env: + CSC_LINK: "https://legcord.app/NewSign.p12" + CSC_KEY_PASSWORD: ${{ secrets.MACOS_SIGN_PASS }} + APPLE_ID: ${{secrets.APPLE_ID}} + APPLE_APP_SPECIFIC_PASSWORD: ${{secrets.APPLE_ID_PASSWORD}} + APPLE_TEAM_ID: ${{secrets.APPLE_TEAM_ID}} + + - name: Build Electron for Windows (NSIS, AppX, & ZIP) + if: matrix.os == 'windows-latest' + run: pnpm electron-builder --ia32 --arm64 --x64 -w nsis appx zip + + - name: Build Electron for Linux (RPM, DEB, AppImage & ZIP) + if: matrix.os == 'ubuntu-latest' + run: pnpm electron-builder --armv7l --arm64 --x64 -l rpm deb appimage zip tar.gz + + - name: Save Electron Cache + uses: actions/cache/save@v5 + with: + path: .cache + key: electron-zips.${{matrix.os}} + + - name: Collect artifacts + run: mkdir artifacts | + find dist/. -maxdepth 1 -type f -exec mv {} artifacts \; + shell: bash + + - name: Upload artifactsstable + uses: actions/upload-artifact@v6 + with: + name: ${{matrix.os}}-artifacts + path: artifacts/* + + release: + runs-on: ubuntu-latest + needs: + - package + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + steps: + - name: Download artifacts + uses: actions/download-artifact@v6 + with: + path: release-files + + - name: Create release + if: github.ref_name == 'dev' + uses: ncipollo/release-action@v1 + with: + name: Rolling Dev Build + allowUpdates: true + removeArtifacts: true + prerelease: true + body: "Built against https://github.com/Legcord/Legcord/tree/dev on every commit. NOTE: tarballs do not update." + draft: false + tag: devbuild + artifacts: release-files/**/* + + - name: Create release + if: github.ref_name == 'stable' + uses: ncipollo/release-action@v1 + with: + name: Stable Release Draft + prerelease: false + tag: stable + draft: true + artifacts: release-files/**/* diff --git a/.github/workflows/stable.yml b/.github/workflows/stable.yml deleted file mode 100644 index fdd400a..0000000 --- a/.github/workflows/stable.yml +++ /dev/null @@ -1,238 +0,0 @@ -name: Release build -on: - push: - branches: - - stable - -env: - FORCE_COLOR: true - -jobs: - build-linux: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - uses: pnpm/action-setup@v4 - - - name: Use Node.js 22 - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: "pnpm" - - - name: Install Node dependencies - run: pnpm i -g cargo-cp-artifact electron-builder && pnpm i - - - name: Build - run: pnpm run build && electron-builder --linux && electron-builder --arm64 --linux && electron-builder --armv7l --linux - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: List all files in the dist directory - run: ls -l dist - - - name: Delete unpacked builds - run: rm -rf dist/linux-unpacked && rm -rf dist/linux-arm64-unpacked && rm -rf dist/linux-armv7l-unpacked - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: ArmCordLinux - path: dist/ - - build-mac: - runs-on: macos-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - uses: pnpm/action-setup@v4 - - - name: Use Node.js 22 - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: "pnpm" - - - name: Install Node dependencies - run: pnpm i -g cargo-cp-artifact electron-builder && pnpm i - - - name: Build - run: pnpm run build && electron-builder --macos --x64 --arm64 - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: List all files in the dist directory - run: ls -l dist - - - name: Delete unpacked builds - run: rm -rf dist/macos-unpacked - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: ArmCordMac - path: dist/ - - build-windows: - runs-on: windows-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - uses: pnpm/action-setup@v4 - - - name: Use Node.js 22 - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: "pnpm" - - - name: Install Node dependencies - run: pnpm i -g cargo-cp-artifact electron-builder && pnpm i - - - name: Build - run: pnpm run build && electron-builder --windows - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Delete unpacked builds - run: Remove-Item -LiteralPath ".\dist\win-unpacked" -Force -Recurse - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: ArmCordWindows - path: dist/ - - build-windowsOnARM: - runs-on: windows-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - uses: pnpm/action-setup@v4 - - - uses: actions/setup-node@v4 - with: - node-version: "22" - cache: "pnpm" - - - name: Set architecture - run: set npm_config_arch=arm64 - - - name: Install Node dependencies - run: pnpm install -g cargo-cp-artifact electron-builder && pnpm install - - - name: Build - run: pnpm run build && electron-builder --windows --arm64 - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Delete unpacked builds - run: Remove-Item -LiteralPath ".\dist\win-arm64-unpacked" -Force -Recurse - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: ArmCordWindowsArm64 - path: dist/ - release: - runs-on: ubuntu-latest - needs: [build-linux, build-mac, build-windows, build-windowsOnARM] - - steps: - - uses: actions/download-artifact@v4 - with: - name: ArmCordMac - path: macos - - - uses: actions/download-artifact@v4 - with: - name: ArmCordWindows - path: windows - - - uses: actions/download-artifact@v4 - with: - name: ArmCordWindowsArm64 - path: windows - - - uses: actions/download-artifact@v4 - with: - name: ArmCordLinux - path: linux - - - name: ls - run: ls - - - name: Delete unwanted directories - run: rm -rf {linux,macos,windows}/*/ - rm -rf {linux,macos,windows}/.icon* - rm -rf {linux,macos,windows}/builder-debug.yml - - - name: ls dirs - run: ls linux && ls macos && ls windows - - - name: Get some values needed for the release - id: vars - shell: bash - run: | - echo "::set-output name=releaseTag::$(git describe --tags --abbrev=0)" - - - name: Create Release - uses: actions/github-script@v7 - with: - github-token: ${{secrets.GITHUB_TOKEN}} - script: | - console.log('environment', process.versions); - - const fs = require('fs').promises; - - const { repo: { owner, repo }, sha } = context; - console.log({ owner, repo, sha }); - - const release = await github.repos.createRelease({ - owner, repo, - tag_name: process.env.releaseTag, - draft: true, - target_commitish: sha - }); - - console.log('created release', { release }); - - for (let file of await fs.readdir('linux')) { - // do whatever filtering you want here, I'm just uploading all the files - console.log('uploading', file); - await github.repos.uploadReleaseAsset({ - owner, repo, - release_id: release.data.id, - name: file, - data: await fs.readFile(`./linux/${file}`) - }); - } - for (let file of await fs.readdir('windows')) { - // do whatever filtering you want here, I'm just uploading all the files - console.log('uploading', file); - await github.repos.uploadReleaseAsset({ - owner, repo, - release_id: release.data.id, - name: file, - data: await fs.readFile(`./windows/${file}`) - }); - } - for (let file of await fs.readdir('macos')) { - // do whatever filtering you want here, I'm just uploading all the files - console.log('uploading', file); - await github.repos.uploadReleaseAsset({ - owner, repo, - release_id: release.data.id, - name: file, - data: await fs.readFile(`./macos/${file}`) - }); - } - env: - releaseTag: ${{ steps.vars.outputs.releaseTag }} diff --git a/.github/workflows/winget.yml b/.github/workflows/winget.yml index 9d8e518..8adc3f7 100644 --- a/.github/workflows/winget.yml +++ b/.github/workflows/winget.yml @@ -1,13 +1,13 @@ -name: Publish to WinGet -on: - release: - types: [released] - -jobs: - publish: - runs-on: ubuntu-latest - steps: - - uses: vedantmgoyal2009/winget-releaser@v2 - with: - identifier: ArmCord.ArmCord - token: ${{ secrets.WINGET_TOKEN }} +name: Publish to WinGet +on: + release: + types: [released] +jobs: + publish: + runs-on: windows-latest + steps: + - uses: vedantmgoyal9/winget-releaser@main + with: + identifier: smartfrigde.Legcord + installers-regex: '-win-\w+\.exe$' + token: ${{secrets.PUBLIC_REPO_READ}} diff --git a/.gitignore b/.gitignore index 4d1d86c..938d34c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,8 @@ -node_modules +node_modules/ out/ -dist +dist/ ts-out/ -ts-out package-lock.json -.pnpm-store \ No newline at end of file +.pnpm-store +.cache +.DS_Store \ No newline at end of file diff --git a/.hooks/pre-commit b/.hooks/pre-commit deleted file mode 100755 index e21d833..0000000 --- a/.hooks/pre-commit +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -set -e - -pnpm run format -git add -A diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index b58b603..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/.idea/ArmCord.iml b/.idea/ArmCord.iml deleted file mode 100644 index 0c8867d..0000000 --- a/.idea/ArmCord.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index f042d21..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 0f0b0aa..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 49688bd..0000000 --- a/.prettierignore +++ /dev/null @@ -1,12 +0,0 @@ -# Some prettier-specific files so it doesn't die. -**/*.png -**/*.ico -**/*.woff -LICENSE -.gitignore - -node_modules -out/ -dist -ts-out/ -ts-out \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index cea5430..08d1d1b 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,5 +1,3 @@ { - "recommendations": [ - "ExodiusStudios.comment-anchors" - ] -} \ No newline at end of file + "recommendations": ["ExodiusStudios.comment-anchors", "biomejs.biome"] +} diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 185ccfc..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "node", - "request": "launch", - "name": "Debug ArmCord via NPM", - "runtimeExecutable": "npm", - "runtimeArgs": ["start", "debug"], - "port": 9229, - "skipFiles": ["/**"] - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json index 89d6efb..f0af64b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,21 +1,26 @@ { "cSpell.words": [ - "armcord", - "armcordinternal", + "legcord", + "legcordinternal", "arrpc", "Autogain", "clientmod", "copyfiles", + "discordsays", "Ducko", + "equicord", "modloader", "nsis", "smartfridge", "smartfrigde", + "Tnhxcqyn", "togglefullscreen", "unmaximize", "vaapi" ], - "cSpell.ignorePaths": [ - "assets/lang" - ] -} \ No newline at end of file + "cSpell.ignorePaths": ["assets/lang"], + "editor.defaultFormatter": "biomejs.biome", + "[html]": { + "editor.defaultFormatter": "vscode.html-language-features" + } +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..27466d7 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,109 @@ +# Contributing to Legcord + +Legcord is an opinionated project. We welcome contributions from everyone, but we want your effort to land successfully and match the direction of the project. + +This guide explains what maintainers look for in pull requests, based on existing code patterns and CI rules. + +## How to contribute + +Contributions are accepted through pull requests. + +Pull requests should target the `dev` branch. +If you are fixing a critical bug or security issue, you may open fixes for both `stable` and `dev`. + +## Before you start a feature + +- Check open pull requests for overlap. +- Check [GitHub enhancement issues](https://github.com/Legcord/Legcord/issues?q=label%3Aenhancement) and the [feature requests Discord channel](https://discord.com/channels/820732039253852171/1261471243123818566). +- If the feature does not exist yet, [open an issue](https://github.com/Legcord/Legcord/issues), say you want to implement it, and wait for feedback before writing large changes. +- Familiarize yourself with the codebase rules below. + +## Codebase rules + +### Tooling and quality + +- Use modern ESM (not CommonJS aka require) where possible. +- Use pnpm (see `packageManager` in `package.json`). +- Run `pnpm lint` before opening a PR. +- Run `pnpm build` when your change touches runtime code, build output, bundling, or packaging behavior. +- Avoid introducing new dependencies unless absolutely necessary. + +### TypeScript and linting expectations + +- Keep TypeScript strictness intact. Do not weaken compiler settings. +- Avoid `@ts-ignore` and broad type escapes. If suppression is unavoidable, use the narrowest suppression possible and include a short reason. +- Any lint suppression (`biome-ignore`, `eslint-disable`, etc.) must include a clear explanation and preferably a tracking issue/URL when relevant. + +### Electron security expectations + +- Follow Electron security best practices. +- Keep preload APIs minimal and explicit when exposing APIs through `contextBridge`. +- Do not add broad permissions or relax security defaults without a strong reason. +- Be careful with injected JavaScript and user-controlled strings. Sanitize inputs (for example, use safe serialization patterns). +- Be extra cautious when changing CSP handling, protocol handling, permission handlers, or web request hooks. + +### Performance expectations + +- Preserve existing performance patterns (config/lang/theme/window-state caching, debounce behavior, startup order). +- Avoid changes that add repeated synchronous I/O in hot paths. +- Be careful with startup flow: some existing operations intentionally use `void` or deferred execution to avoid startup hangs. + +### Config and migration expectations + +- If you change settings shape/defaults, update related migration logic and defaults together. +- Keep backward compatibility with older config formats where possible. +- If your PR changes user data behavior, explain migration and fallback behavior in the PR description. + +### Cross-platform expectations + +- Legcord ships on Linux, macOS, and Windows. Keep platform-specific behavior safe and scoped. +- If your change is platform-specific, explicitly mention tested platform(s) in your PR. +- If you cannot test a platform, state that clearly so reviewers know what remains unverified. + +### i18n expectations + +- Add manual translation changes only to `assets/lang/en-US.json`. +- Update other translations on [Weblate](https://hosted.weblate.org/projects/armcord/). + +## Pull request rules + +### Scope and size + +- Keep PRs focused on one concern. +- Split unrelated refactors from feature or bugfix work. +- Prefer small, reviewable PRs over large mixed changes. + +### PR description (required) + +Include these sections in your PR body: + +- Problem: what user or developer issue is being solved. +- Solution: what changed and why this approach was chosen. +- Risk: what might regress. +- Validation: what you tested (`pnpm lint`, `pnpm build`, manual scenarios, and platform coverage). + +### Verification checklist + +Before requesting review, verify: + +- `pnpm lint` passes. +- `pnpm build` passes for runtime/build-affecting changes. +- Manual smoke test for affected flows is done (for example: startup, settings save/load, themes/mods behavior, tray/window behavior, CSP/security-sensitive paths if touched). +- For UI changes, include screenshots or short recordings. + +### Review readiness + +- Mark breaking changes clearly. +- Call out follow-up work explicitly if a workaround is temporary. +- Reference related issues and prior discussions. +- If you added a workaround/suppression, include the reason in code comments and in the PR description. + +## Documentation + +We are still improving project and codebase documentation. +If you have experience building docs systems or contributor docs, contact @smartfrigde on Discord. + +## Help users in the Discord community + +We have an open support channel in our [Discord community](https://discord.gg/F25bc4RYDt). +Helping users there is always appreciated. diff --git a/README.md b/README.md index f470c3a..e0c052c 100644 --- a/README.md +++ b/README.md @@ -1,158 +1,149 @@ -
- -
ArmCord is a custom client designed to enhance your Discord experience while keeping everything lightweight. -
+![Legcord](https://github.com/user-attachments/assets/f7b007d4-44fa-4c88-96e4-0a448b568b5d) # Features - **Standalone client** - ArmCord is built as a standalone client and doesn't rely on the original Discord client in any way. + Legcord is built as a standalone client and doesn't rely on the original Discord client in any way. - **Various mods built-in** - Enjoy [Vencord](https://github.com/Vendicated/Vencord), [Shelter](https://github.com/uwu/shelter) and their many features, or have a more vanilla experience, it's your choice! + Enjoy [Vencord](https://github.com/Vendicated/Vencord), [Equicord](https://github.com/Equicord/Equicord), [Shelter](https://github.com/uwu/shelter) and their many features, or have a more vanilla experience, it's your choice! - **Themes** - ArmCord natively supports theming of the entire app, you can easily import BetterDiscord themes and manage them + Legcord natively supports theming of the entire app, you can easily import BetterDiscord themes and manage them - **Made for Privacy™** - ArmCord automatically blocks all of Discord's trackers; even without any client mods, you can feel safe and secure! + Legcord automatically blocks all of Discord's trackers; even without any client mods, you can feel safe and secure! - **Supports Rich Presence** - Unlike other clients, ArmCord supports rich presence (game activity) out of the box thanks to [arRPC](https://arrpc.openasar.dev). + Unlike other clients, Legcord supports rich presence (game activity) out of the box thanks to [arRPC](https://arrpc.openasar.dev). - **Mobile support** - ArmCord has **experimental** mobile support for phones running Linux such as the PinePhone. While this is still far from an ideal solution, we're slowly trying to improve it. + Legcord has **experimental** mobile support for phones running Linux such as the PinePhone. While this is still far from an ideal solution, we're slowly trying to improve it. - **Much more stable** - ArmCord is using a newer build of Electron than the stock Discord app. This means you can have a much more stable and secure experience, along with slightly better performance. + Legcord is using a newer build of Electron than the stock Discord app. This means you can have a much more stable and secure experience, along with slightly better performance. - **Cross-platform support!** - ArmCord was originally created for ARM64 Linux devices since Discord doesn't support them. We soon decided to support every platform that [Electron supports](https://github.com/electron/electron#platform-support)! + Legcord was originally created for AArch64 Linux devices since Discord doesn't support them. We soon decided to support every platform that [Electron supports](https://github.com/electron/electron#platform-support)! # How to run/install it? ## Packaging status -[![Packaging status](https://repology.org/badge/vertical-allrepos/armcord.svg)](https://repology.org/project/armcord/versions) +[![Packaging status](https://repology.org/badge/vertical-allrepos/legcord.svg)](https://repology.org/project/legcord/versions) ### Windows +[Get the .exe installer](https://www.legcord.app/download) - - Download ArmCord - +[](https://winstall.app/apps/smartfrigde.Legcord) -If you're using an older version of Windows, you need to use [pre-built installers](https://www.armcord.app/download). +```pwsh +winget install --id=smartfrigde.Legcord -e +``` + +[](https://apps.microsoft.com/detail/9pdkjpv0wxlg?ocid=webpdpshare) ### Flatpak -Download on Flathub +Not available yet. -### Debian, Ubuntu and Raspbian repository +### Debian, Ubuntu and Raspbian -ArmCord is available on our official repositories for `apt` package manager. By using this method you'll receive automatic updates and get all the dependencies. Run the following commands to install ArmCord from them: +#### 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 -curl -fsSL https://apt.armcord.app/public.gpg | sudo gpg --dearmor -o /usr/share/keyrings/armcord.gpg -echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/armcord.gpg] https://apt.armcord.app/ stable main" | sudo tee /etc/apt/sources.list.d/armcord.list -sudo apt update -sudo apt install armcord +sudo apt install ./.deb ``` -If you previously used old ArmCord apt repo, here's how you can remove it: +Alternatively, you can copy the asset link from the release and install via terminal: ```sh -sudo rm /etc/apt/sources.list.d/armcord.list -sudo rm /usr/share/keyrings/armcord.gpg -sudo apt update +# 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 +sudo bash -c "$(wget -q https://pacstall.dev/q/install -O -)" # Install pacstall if not installed +pacstall -I legcord-deb ``` ### Snap package -ArmCord is also available on the Snap store [here](https://snapcraft.io/armcord). - -Get it from the Snap Store - - -Similar to `armcord-git` on AUR, you can install the latest dev builds through snaps by running this command: - -```shell -sudo snap install armcord --channel=latest/edge -``` - -Snapd will automatically update the app including developer builds. - -### Winget Package - -ArmCord is also available on the [winget-pkgs](https://github.com/microsoft/winget-pkgs) repository: - -```ps1 -winget install ArmCord.ArmCord -``` +[![Get it from the Snap store](https://assets.ubuntu.com/v1/b16729d2-snap-store-black.svg)](https://snapcraft.io/legcord) ### Scoop package -ArmCord is also available on [Scoop extras](https://github.com/ScoopInstaller/Extras) repo: +Legcord is also available on the [Extras](https://github.com/ScoopInstaller/Extras) repo -```ps1 -scoop bucket add extras -``` - -```ps1 -scoop install armcord +```powershell +scoop bucket add extras # Ensure bucket is added first +scoop install legcord ``` ### AUR Package -ArmCord is also available on the Arch User Repository (AUR): - -- [armcord-bin](https://aur.archlinux.org/packages/armcord-bin) - ArmCord Release ~ Static binary from release, stable release only - -- [armcord-git](https://aur.archlinux.org/packages/armcord-git) - ArmCord Dev ~ Latest devbuild built from source (takes ~1 minute) using the system electron - -Install it via an AUR helper tool like `yay`. - -**Example:** `yay -S armcord-bin` +- [legcord-git](https://aur.archlinux.org/packages/legcord-git) Built locally against dev branch ### Homebrew repository -ArmCord also has a homebrew repository +Legcord is also available on the [Homebrew Cask](https://github.com/Homebrew/homebrew-cask) repo ```zsh -brew tap armcord/armcord +brew install --cask legcord ``` +### MacPorts -```zsh -brew install --cask armcord +Legcord is available [via MacPorts](https://ports.macports.org/port/Legcord/) + +```sh +sudo port install legcord ``` ### FreeBSD -You can also get ArmCord running on FreeBSD by following [these instructions](https://gist.github.com/axyiee/4d29c982ac85d5d26f98a51040b5de37). +You can also get Legcord running on FreeBSD by following [these instructions](https://gist.github.com/axyiee/4d29c982ac85d5d26f98a51040b5de37). ### Pi-Apps -ArmCord is also available in [Pi-Apps](https://github.com/Botspot/pi-apps). +Legcord is also available in [Pi-Apps](https://github.com/Botspot/pi-apps). [![badge](https://github.com/Botspot/pi-apps/blob/master/icons/badge.png?raw=true)](https://github.com/Botspot/pi-apps) -### Pre-built binaries: +### Pre-built binaries - Check the **releases tab** for precompiled packages for Linux, Windows, and Mac OS. Alternatively, use our Sourceforge mirror. - Download ArmCord + Check the **[releases tab](https://github.com/Legcord/Legcord/releases)** for precompiled packages for Linux, Windows, and macOS. -### Compiling: +### Compiling - Alternatively, you can run ArmCord from source ([NodeJS](https://nodejs.dev), [pnpm](https://pnpm.io/installation#using-npm), and [rust toolchain](https://www.rust-lang.org/tools/install) are required): + Alternatively, you can run Legcord from source ([NodeJS v26 and newer](https://nodejs.dev) and [pnpm](https://pnpm.io/installation#using-npm)) are required: - 1. Clone ArmCord repo: `git clone https://github.com/ArmCord/ArmCord.git` + 1. Clone Legcord repo: `git clone https://github.com/Legcord/Legcord.git` 2. Run `pnpm install` to install dependencies 3. Build with `pnpm run build` 4. Compile/Package with `pnpm run package` @@ -161,46 +152,38 @@ ArmCord is also available in [Pi-Apps](https://github.com/Botspot/pi-apps). ## Do you have a support Discord? -[![](https://dcbadge.vercel.app/api/server/TnhxcqynZ2)](https://discord.gg/TnhxcqynZ2) +[![Discord Server](https://dcbadge.vercel.app/api/server/TnhxcqynZ2)](https://discord.gg/TnhxcqynZ2) ## Will I get banned for using this? -- You are breaking [Discord ToS](https://discord.com/terms#software-in-discord%E2%80%99s-services) by using ArmCord, but no one has been banned from using it or any of the client mods included. - -## Can I use this on anything other than ARM? - -- Yes! ArmCord should work normally under Windows, MacOS, and Linux as long as it has Electron support. +- You are breaking [Discord ToS](https://discord.com/terms#software-in-discord%E2%80%99s-services) by using Legcord, but no one has been banned from using it or any of the client mods included. ## How can I access the settings? -- Open Discord settings and there should be a button `ArmCord Settings` button with a white Discord icon, you can also right click on the tray icon and click `Open Settings` +- Open Discord settings and there should be a button `Legcord Settings` button with a white Discord icon, you can also right click on the tray icon and click `Open Settings` ## How does this work? -- We are using the official web app and wrapping it up in Electron. While you may think this is lame and done like thousands of times before, what makes us unique is that we actually strive for creating a customized experience. You can very easily load themes and mods with no installers/injectors. You can even make the client have transparency effects and follow the fluent design of Windows! At its core, it's just a simple web wrapper, however, we applied many patches to make this work well for you <3 +- 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. -## Why is MacOS support lacking? +## Does Legcord have a portable mode for windows? -- Due to me not owning any macOS device, I can't easily debug/test or do anything related to it. Of course, VMs and Hackintosh machines exist but from my experience, these are unreliable or very time-consuming to set up and maintain. While ArmCord "works" on macOS you may encounter weird issues or inconsistencies with other apps in terms of how they behave (for example macOS lack of tray). +- 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/ArmCord/ArmCord/). +- The source code is on [GitHub](https://github.com/Legcord/Legcord/). ## Where can I translate this? -- Translations are done using our [Weblate page](https://hosted.weblate.org/projects/armcord/armcord/). +- Translations are done using our [Weblate page](https://hosted.weblate.org/projects/armcord/). # Credits -- [ArmCord UI design, branding, and a few features](https://github.com/kckarnige) +- [Legcord UI design, branding, and a few features](https://github.com/kckarnige) - [OpenAsar](https://github.com/GooseMod/OpenAsar) - [arRPC (for Rich Presence)](https://github.com/OpenAsar/arrpc) -- (pre v3.1.0) [Cumcord](https://github.com/Cumcord/Cumcord) -- (pre v3.1.0) [GooseMod](https://github.com/GooseMod/GooseMod) -- (pre v3.1.0) [GooseMod Extension](https://github.com/GooseMod/extension) -- (pre v3.1.0) [FlickerMod](https://github.com/FlickerMod) -- (Pre v3.0.0) [custom-electron-titlebar](https://github.com/AlexTorresSk/custom-electron-titlebar) - [electron-builder](https://electron.build) -Discord is trademark of Discord Inc. ArmCord is not affiliated with or endorsed by Discord Inc. +Discord is trademark of Discord Inc. Legcord is not affiliated with or endorsed by Discord Inc. +Legcord is not affiliated with or endorsed by ARM Limited. diff --git a/assets/Square150x150Logo.png b/assets/Square150x150Logo.png index f5a207a..ad212ed 100644 Binary files a/assets/Square150x150Logo.png and b/assets/Square150x150Logo.png differ diff --git a/assets/Square44x44Logo.png b/assets/Square44x44Logo.png index 7ff2ffb..2881e91 100644 Binary files a/assets/Square44x44Logo.png and b/assets/Square44x44Logo.png differ diff --git a/assets/StoreLogo.png b/assets/StoreLogo.png index ff28e52..5f81725 100644 Binary files a/assets/StoreLogo.png and b/assets/StoreLogo.png differ diff --git a/assets/Wide310x150Logo.png b/assets/Wide310x150Logo.png index a1e623d..19f1047 100644 Binary files a/assets/Wide310x150Logo.png and b/assets/Wide310x150Logo.png differ diff --git a/assets/ac_black_plug.png b/assets/ac_black_plug.png index 15fe2ec..62bdc91 100644 Binary files a/assets/ac_black_plug.png and b/assets/ac_black_plug.png differ diff --git a/assets/ac_icon.png b/assets/ac_icon.png index ff28e52..917d0ca 100644 Binary files a/assets/ac_icon.png and b/assets/ac_icon.png differ diff --git a/assets/ac_icon_transparent.png b/assets/ac_icon_transparent.png index b2693c4..8e62c4a 100644 Binary files a/assets/ac_icon_transparent.png and b/assets/ac_icon_transparent.png differ diff --git a/assets/ac_plug_classic.png b/assets/ac_plug_classic.png new file mode 100644 index 0000000..0136478 Binary files /dev/null and b/assets/ac_plug_classic.png differ diff --git a/assets/ac_plug_colored.png b/assets/ac_plug_colored.png index 8083841..fe10aa2 100644 Binary files a/assets/ac_plug_colored.png and b/assets/ac_plug_colored.png differ diff --git a/assets/app/Download.png b/assets/app/Download.png new file mode 100644 index 0000000..ab77f32 Binary files /dev/null and b/assets/app/Download.png differ diff --git a/assets/app/Edit.png b/assets/app/Edit.png new file mode 100644 index 0000000..6db6a36 Binary files /dev/null and b/assets/app/Edit.png differ diff --git a/assets/app/Folder.png b/assets/app/Folder.png new file mode 100644 index 0000000..4a964e4 Binary files /dev/null and b/assets/app/Folder.png differ diff --git a/assets/app/Loading.webm b/assets/app/Loading.webm new file mode 100644 index 0000000..a345bf7 Binary files /dev/null and b/assets/app/Loading.webm differ diff --git a/assets/app/Trash.png b/assets/app/Trash.png new file mode 100644 index 0000000..af5a5dc Binary files /dev/null and b/assets/app/Trash.png differ diff --git a/assets/app/Update.webp b/assets/app/Update.webp new file mode 100644 index 0000000..fd8e58f Binary files /dev/null and b/assets/app/Update.webp differ diff --git a/assets/app/UpgradeArrow.png b/assets/app/UpgradeArrow.png new file mode 100644 index 0000000..50a98cc Binary files /dev/null and b/assets/app/UpgradeArrow.png differ diff --git a/assets/app/Window.png b/assets/app/Window.png new file mode 100644 index 0000000..5889661 Binary files /dev/null and b/assets/app/Window.png differ diff --git a/assets/app/WindowUnsupported.png b/assets/app/WindowUnsupported.png new file mode 100644 index 0000000..1ebf060 Binary files /dev/null and b/assets/app/WindowUnsupported.png differ diff --git a/assets/app/Wordmark.png b/assets/app/Wordmark.png new file mode 100644 index 0000000..542456a Binary files /dev/null and b/assets/app/Wordmark.png differ diff --git a/assets/app/css/baseTitlebar.css b/assets/app/css/baseTitlebar.css new file mode 100644 index 0000000..c1b83e4 --- /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: var(--custom-app-top-bar-height); + line-height: 30px; + -webkit-app-region: drag; + 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: var(--custom-app-top-bar-height); + -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-icon-default); + cursor: default; +} diff --git a/assets/app/css/darwinTitlebar.css b/assets/app/css/darwinTitlebar.css new file mode 100644 index 0000000..292d852 --- /dev/null +++ b/assets/app/css/darwinTitlebar.css @@ -0,0 +1,121 @@ +[legcord-platform="darwin"] .sidebar-1tnWFu { + border-top-left-radius: 0px; +} + +.platform-osx .wrapper_ef3116 { + margin-top: 0px; +} + +[legcord-platform="darwin"] #window-controls-container { + float: left; + width: 150px; + height: 40px; + display: block; + line-height: 45px; + left: 0; + transform: translate(-82px, 0px); +} + +[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; + 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.4px, -7px); +} +[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, -7px); +} +[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(0px, -7px); +} + +[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,") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,") + 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,") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,") + 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,") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,") + 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; + visibility: unset; +} diff --git a/assets/app/css/discord.css b/assets/app/css/discord.css new file mode 100644 index 0000000..1a0f318 --- /dev/null +++ b/assets/app/css/discord.css @@ -0,0 +1,30 @@ +* { + outline: none; +} +[class^="socialLinks-"] + [class^="info-"] { + padding-right: 0; +} +#ac-ver { + text-transform: none; + cursor: pointer; + color: var(--text-muted); +} + +div:has(> span [data-list-item-id="guildsnav___app-download-button"]) { + display: none; +} + +/* custom keybinds are not supported on web information */ +.container__6436f.info__6436f.browserNotice__740f2 { + visibility: hidden; + display: block; +} +.container__6436f.info__6436f.browserNotice__740f2:after { + content: "You can modify global keybinds using the keybind maker on the left sidebar"; + visibility: visible; +} + +[class*="textContainer"]:has(code) { + scrollbar-color: var(--scrollbar-auto-scrollbar-color-thumb) var(--scrollbar-auto-scrollbar-color-track); + scrollbar-width: thin; +} diff --git a/assets/app/css/editor.css b/assets/app/css/editor.css new file mode 100644 index 0000000..a2f62c7 --- /dev/null +++ b/assets/app/css/editor.css @@ -0,0 +1,11 @@ +html, +body { + margin: 0; + padding: 0; +} + +#editorCode { + height: 100%; + width: 100%; + position: absolute; +} diff --git a/assets/app/css/linuxTitlebar.css b/assets/app/css/linuxTitlebar.css new file mode 100644 index 0000000..7935faa --- /dev/null +++ b/assets/app/css/linuxTitlebar.css @@ -0,0 +1,84 @@ +[legcord-platform="linux"] div[class*="title"] + div[class*="trailing"] { + margin-right: 150px; +} + +[legcord-platform="linux"] #window-controls-container { + width: 142px; +} +[legcord-platform="linux"] #window-controls-container #minimize:hover { + background-color: var(--interactive-background-hover); + transition: 0.2s ease; +} +[legcord-platform="linux"] #window-controls-container #maximize: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-text-hover); + transition: 0.2s ease; +} +[legcord-platform="linux"] #window-controls-container #maximize:hover #maximize-icon { + background-color: var(--interactive-text-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-icon-default); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") + no-repeat 50% 50%; + 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-icon-default); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") + no-repeat 50% 50%; + 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-icon-default); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") + no-repeat 50% 50%; + 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-icon-default); + display: list-item; + -webkit-mask: url("data:image/svg+xml,") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,") + no-repeat 50% 50%; +} diff --git a/assets/app/css/titlebar.css b/assets/app/css/titlebar.css new file mode 100644 index 0000000..f4a6531 --- /dev/null +++ b/assets/app/css/titlebar.css @@ -0,0 +1,369 @@ +.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; + user-select: none; + -webkit-user-select: none; + position: fixed; + z-index: 99999; +} + +.container-2RRFHK { + padding-top: 30px; + top: -30px; +} + +.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-icon-default); + 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(--interactive-background-hover); + transition: 0.2s ease; +} +[legcord-platform="linux"] .titlebar #window-controls-container #maximize: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-text-hover); + transition: 0.2s ease; +} +[legcord-platform="linux"] .titlebar #window-controls-container #maximize:hover #maximize-icon { + background-color: var(--interactive-text-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,") + no-repeat 50% 50%; + 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-icon-default); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") + no-repeat 50% 50%; + 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-icon-default); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") + no-repeat 50% 50%; + 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-icon-default); + display: list-item; + -webkit-mask: url("data:image/svg+xml,") + no-repeat 50% 50%; + 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,") + no-repeat 50% 50%; + 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,") + no-repeat 50% 50%; + 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,") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,") + 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(--interactive-background-hover); + transition: 0.2s ease; +} +[legcord-platform="win32"] .titlebar #window-controls-container #maximize: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-text-hover); + transition: 0.2s ease; +} +[legcord-platform="win32"] .titlebar #window-controls-container #maximize:hover #maximize-icon { + background-color: var(--interactive-text-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-icon-default); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") + no-repeat 50% 50%; + 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-icon-default); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") + no-repeat 50% 50%; + 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-icon-default); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") + no-repeat 50% 50%; + 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-icon-default); + display: list-item; + -webkit-mask: url("data:image/svg+xml,") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,") + no-repeat 50% 50%; +} + +/* Legcord on macOS */ + +[legcord-platform="darwin"] .sidebar-1tnWFu { + border-top-left-radius: 0px; +} + +[legcord-platform="darwin"] .container__037ed { + overflow: unset; + 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; + 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,") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,") + 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,") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,") + 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,") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,") + 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..a947c74 --- /dev/null +++ b/assets/app/css/winTitlebar.css @@ -0,0 +1,86 @@ +/* Legcord on Windows */ + +[legcord-platform="win32"] div[class*="title"] + div[class*="trailing"] { + margin-right: 173px; +} + +[legcord-platform="win32"] #window-controls-container { + width: 165px; +} +[legcord-platform="win32"] #window-controls-container #minimize:hover { + background-color: var(--interactive-background-hover); + transition: 0.2s ease; +} +[legcord-platform="win32"] #window-controls-container #maximize: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-text-hover); + transition: 0.2s ease; +} +[legcord-platform="win32"] #window-controls-container #maximize:hover #maximize-icon { + background-color: var(--interactive-text-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-icon-default); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") + no-repeat 50% 50%; + 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-icon-default); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") + no-repeat 50% 50%; + 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-icon-default); + display: list-item; + -webkit-mask: url("data:image/svg+xml;charset=utf-8,") + no-repeat 50% 50%; + 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-icon-default); + display: list-item; + -webkit-mask: url("data:image/svg+xml,") + no-repeat 50% 50%; + mask: url("data:image/svg+xml,") + no-repeat 50% 50%; +} diff --git a/assets/app/custom.png b/assets/app/custom.png new file mode 100644 index 0000000..b14cd42 Binary files /dev/null and b/assets/app/custom.png differ diff --git a/assets/app/equicord.png b/assets/app/equicord.png new file mode 100644 index 0000000..bee9e34 Binary files /dev/null and b/assets/app/equicord.png differ diff --git a/assets/app/js/adguard.js b/assets/app/js/adguard.js new file mode 100644 index 0000000..b1a9a99 --- /dev/null +++ b/assets/app/js/adguard.js @@ -0,0 +1,214 @@ +/** + * This file is part of AdGuard's Block YouTube Ads (https://github.com/AdguardTeam/BlockYouTubeAdsShortcut). + * + * Copyright (C) AdGuard Team + * + * AdGuard's Block YouTube Ads is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AdGuard's Block YouTube Ads is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AdGuard's Block YouTube Ads. If not, see . + */ + +const hiddenCSS = [ + "#__ffYoutube1", + "#__ffYoutube2", + "#__ffYoutube3", + "#__ffYoutube4", + "#feed-pyv-container", + "#feedmodule-PRO", + "#homepage-chrome-side-promo", + "#merch-shelf", + "#offer-module", + '#pla-shelf > ytd-pla-shelf-renderer[class="style-scope ytd-watch"]', + "#pla-shelf", + "#premium-yva", + "#promo-info", + "#promo-list", + "#promotion-shelf", + "#related > ytd-watch-next-secondary-results-renderer > #items > ytd-compact-promoted-video-renderer.ytd-watch-next-secondary-results-renderer", + "#search-pva", + "#shelf-pyv-container", + "#video-masthead", + "#watch-branded-actions", + "#watch-buy-urls", + "#watch-channel-brand-div", + "#watch7-branded-banner", + "#YtKevlarVisibilityIdentifier", + "#YtSparklesVisibilityIdentifier", + ".carousel-offer-url-container", + ".companion-ad-container", + ".GoogleActiveViewElement", + '.list-view[style="margin: 7px 0pt;"]', + ".promoted-sparkles-text-search-root-container", + ".promoted-videos", + ".searchView.list-view", + ".sparkles-light-cta", + ".watch-extra-info-column", + ".watch-extra-info-right", + ".ytd-carousel-ad-renderer", + ".ytd-compact-promoted-video-renderer", + ".ytd-companion-slot-renderer", + ".ytd-merch-shelf-renderer", + ".ytd-player-legacy-desktop-watch-ads-renderer", + ".ytd-promoted-sparkles-text-search-renderer", + ".ytd-promoted-video-renderer", + ".ytd-search-pyv-renderer", + ".ytd-video-masthead-ad-v3-renderer", + ".ytp-ad-action-interstitial-background-container", + ".ytp-ad-action-interstitial-slot", + ".ytp-ad-image-overlay", + ".ytp-ad-overlay-container", + ".ytp-ad-progress", + ".ytp-ad-progress-list", + '[class*="ytd-display-ad-"]', + '[layout*="display-ad-"]', + 'a[href^="http://www.youtube.com/cthru?"]', + 'a[href^="https://www.youtube.com/cthru?"]', + "ytd-action-companion-ad-renderer", + "ytd-banner-promo-renderer", + "ytd-compact-promoted-video-renderer", + "ytd-companion-slot-renderer", + "ytd-display-ad-renderer", + "ytd-promoted-sparkles-text-search-renderer", + "ytd-promoted-sparkles-web-renderer", + "ytd-search-pyv-renderer", + "ytd-single-option-survey-renderer", + "ytd-video-masthead-ad-advertiser-info-renderer", + "ytd-video-masthead-ad-v3-renderer", + "YTM-PROMOTED-VIDEO-RENDERER", +]; +/** + * Adds CSS to the page + */ +const hideElements = () => { + const selectors = hiddenCSS; + if (!selectors) { + return; + } + const rule = selectors.join(", ") + " { display: none!important; }"; + const style = document.createElement("style"); + style.textContent = rule; + document.head.appendChild(style); +}; +/** + * Calls the "callback" function on every DOM change, but not for the tracked events + * @param {Function} callback callback function + */ +const observeDomChanges = (callback) => { + const domMutationObserver = new MutationObserver((mutations) => { + callback(mutations); + }); + domMutationObserver.observe(document.documentElement, { + childList: true, + subtree: true, + }); +}; +/** + * This function is supposed to be called on every DOM change + */ +const hideDynamicAds = () => { + const elements = document.querySelectorAll("#contents > ytd-rich-item-renderer ytd-display-ad-renderer"); + if (elements.length === 0) { + return; + } + elements.forEach((el) => { + if (el.parentNode && el.parentNode.parentNode) { + const parent = el.parentNode.parentNode; + if (parent.localName === "ytd-rich-item-renderer") { + parent.style.display = "none"; + } + } + }); +}; +/** + * This function checks if the video ads are currently running + * and auto-clicks the skip button. + */ +const autoSkipAds = () => { + // If there's a video that plays the ad at this moment, scroll this ad + if (document.querySelector(".ad-showing")) { + const video = document.querySelector("video"); + if (video && video.duration) { + video.currentTime = video.duration; + // Skip button should appear after that, + // now simply click it automatically + setTimeout(() => { + const skipBtn = document.querySelector("button.ytp-ad-skip-button"); + if (skipBtn) { + skipBtn.click(); + } + }, 100); + } + } +}; +/** + * This function overrides a property on the specified object. + * + * @param {object} obj object to look for properties in + * @param {string} propertyName property to override + * @param {*} overrideValue value to set + */ +const overrideObject = (obj, propertyName, overrideValue) => { + if (!obj) { + return false; + } + let overriden = false; + for (const key in obj) { + if (obj.hasOwnProperty(key) && key === propertyName) { + obj[key] = overrideValue; + overriden = true; + } else if (obj.hasOwnProperty(key) && typeof obj[key] === "object") { + if (overrideObject(obj[key], propertyName, overrideValue)) { + overriden = true; + } + } + } + return overriden; +}; +/** + * Overrides JSON.parse and Response.json functions. + * Examines these functions arguments, looks for properties with the specified name there + * and if it exists, changes it's value to what was specified. + * + * @param {string} propertyName name of the property + * @param {*} overrideValue new value for the property + */ +const jsonOverride = (propertyName, overrideValue) => { + const nativeJSONParse = JSON.parse; + JSON.parse = (...args) => { + const obj = nativeJSONParse.apply(this, args); + // Override it's props and return back to the caller + overrideObject(obj, propertyName, overrideValue); + return obj; + }; + // Override Response.prototype.json + Response.prototype.json = new Proxy(Response.prototype.json, { + async apply(...args) { + // Call the target function, get the original Promise + const result = await Reflect.apply(...args); + // Create a new one and override the JSON inside + overrideObject(result, propertyName, overrideValue); + return result; + }, + }); +}; +// Removes ads metadata from YouTube XHR requests +jsonOverride("adPlacements", []); +jsonOverride("playerAds", []); +// Applies CSS that hides YouTube ad elements +hideElements(); +// Some changes should be re-evaluated on every page change +hideDynamicAds(); +autoSkipAds(); +observeDomChanges(() => { + hideDynamicAds(); + autoSkipAds(); +}); diff --git a/assets/app/js/monacoLoader.js b/assets/app/js/monacoLoader.js new file mode 100644 index 0000000..0ba3cc3 --- /dev/null +++ b/assets/app/js/monacoLoader.js @@ -0,0 +1,11 @@ +"use strict";/*!----------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) + * Released under the MIT license + * https://github.com/microsoft/vscode/blob/main/LICENSE.txt + *-----------------------------------------------------------*/const _amdLoaderGlobal=this,_commonjsGlobal=typeof global=="object"?global:{};var AMDLoader;(function(u){u.global=_amdLoaderGlobal;class y{get isWindows(){return this._detect(),this._isWindows}get isNode(){return this._detect(),this._isNode}get isElectronRenderer(){return this._detect(),this._isElectronRenderer}get isWebWorker(){return this._detect(),this._isWebWorker}get isElectronNodeIntegrationWebWorker(){return this._detect(),this._isElectronNodeIntegrationWebWorker}constructor(){this._detected=!1,this._isWindows=!1,this._isNode=!1,this._isElectronRenderer=!1,this._isWebWorker=!1,this._isElectronNodeIntegrationWebWorker=!1}_detect(){this._detected||(this._detected=!0,this._isWindows=y._isWindows(),this._isNode=typeof module<"u"&&!!module.exports,this._isElectronRenderer=typeof process<"u"&&typeof process.versions<"u"&&typeof process.versions.electron<"u"&&process.type==="renderer",this._isWebWorker=typeof u.global.importScripts=="function",this._isElectronNodeIntegrationWebWorker=this._isWebWorker&&typeof process<"u"&&typeof process.versions<"u"&&typeof process.versions.electron<"u"&&process.type==="worker")}static _isWindows(){return typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.indexOf("Windows")>=0?!0:typeof process<"u"?process.platform==="win32":!1}}u.Environment=y})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(u){class y{constructor(r,c,a){this.type=r,this.detail=c,this.timestamp=a}}u.LoaderEvent=y;class m{constructor(r){this._events=[new y(1,"",r)]}record(r,c){this._events.push(new y(r,c,u.Utilities.getHighPerformanceTimestamp()))}getEvents(){return this._events}}u.LoaderEventRecorder=m;class p{record(r,c){}getEvents(){return[]}}p.INSTANCE=new p,u.NullLoaderEventRecorder=p})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(u){class y{static fileUriToFilePath(p,h){if(h=decodeURI(h).replace(/%23/g,"#"),p){if(/^file:\/\/\//.test(h))return h.substr(8);if(/^file:\/\//.test(h))return h.substr(5)}else if(/^file:\/\//.test(h))return h.substr(7);return h}static startsWith(p,h){return p.length>=h.length&&p.substr(0,h.length)===h}static endsWith(p,h){return p.length>=h.length&&p.substr(p.length-h.length)===h}static containsQueryString(p){return/^[^\#]*\?/gi.test(p)}static isAbsolutePath(p){return/^((http:\/\/)|(https:\/\/)|(file:\/\/)|(\/))/.test(p)}static forEachProperty(p,h){if(p){let r;for(r in p)p.hasOwnProperty(r)&&h(r,p[r])}}static isEmpty(p){let h=!0;return y.forEachProperty(p,()=>{h=!1}),h}static recursiveClone(p){if(!p||typeof p!="object"||p instanceof RegExp||!Array.isArray(p)&&Object.getPrototypeOf(p)!==Object.prototype)return p;let h=Array.isArray(p)?[]:{};return y.forEachProperty(p,(r,c)=>{c&&typeof c=="object"?h[r]=y.recursiveClone(c):h[r]=c}),h}static generateAnonymousModule(){return"===anonymous"+y.NEXT_ANONYMOUS_ID+++"==="}static isAnonymousModule(p){return y.startsWith(p,"===anonymous")}static getHighPerformanceTimestamp(){return this.PERFORMANCE_NOW_PROBED||(this.PERFORMANCE_NOW_PROBED=!0,this.HAS_PERFORMANCE_NOW=u.global.performance&&typeof u.global.performance.now=="function"),this.HAS_PERFORMANCE_NOW?u.global.performance.now():Date.now()}}y.NEXT_ANONYMOUS_ID=1,y.PERFORMANCE_NOW_PROBED=!1,y.HAS_PERFORMANCE_NOW=!1,u.Utilities=y})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(u){function y(h){if(h instanceof Error)return h;const r=new Error(h.message||String(h)||"Unknown Error");return h.stack&&(r.stack=h.stack),r}u.ensureError=y;class m{static validateConfigurationOptions(r){function c(a){if(a.phase==="loading"){console.error('Loading "'+a.moduleId+'" failed'),console.error(a),console.error("Here are the modules that depend on it:"),console.error(a.neededBy);return}if(a.phase==="factory"){console.error('The factory function of "'+a.moduleId+'" has thrown an exception'),console.error(a),console.error("Here are the modules that depend on it:"),console.error(a.neededBy);return}}if(r=r||{},typeof r.baseUrl!="string"&&(r.baseUrl=""),typeof r.isBuild!="boolean"&&(r.isBuild=!1),typeof r.paths!="object"&&(r.paths={}),typeof r.config!="object"&&(r.config={}),typeof r.catchError>"u"&&(r.catchError=!1),typeof r.recordStats>"u"&&(r.recordStats=!1),typeof r.urlArgs!="string"&&(r.urlArgs=""),typeof r.onError!="function"&&(r.onError=c),Array.isArray(r.ignoreDuplicateModules)||(r.ignoreDuplicateModules=[]),r.baseUrl.length>0&&(u.Utilities.endsWith(r.baseUrl,"/")||(r.baseUrl+="/")),typeof r.cspNonce!="string"&&(r.cspNonce=""),typeof r.preferScriptTags>"u"&&(r.preferScriptTags=!1),r.nodeCachedData&&typeof r.nodeCachedData=="object"&&(typeof r.nodeCachedData.seed!="string"&&(r.nodeCachedData.seed="seed"),(typeof r.nodeCachedData.writeDelay!="number"||r.nodeCachedData.writeDelay<0)&&(r.nodeCachedData.writeDelay=1e3*7),!r.nodeCachedData.path||typeof r.nodeCachedData.path!="string")){const a=y(new Error("INVALID cached data configuration, 'path' MUST be set"));a.phase="configuration",r.onError(a),r.nodeCachedData=void 0}return r}static mergeConfigurationOptions(r=null,c=null){let a=u.Utilities.recursiveClone(c||{});return u.Utilities.forEachProperty(r,(t,e)=>{t==="ignoreDuplicateModules"&&typeof a.ignoreDuplicateModules<"u"?a.ignoreDuplicateModules=a.ignoreDuplicateModules.concat(e):t==="paths"&&typeof a.paths<"u"?u.Utilities.forEachProperty(e,(i,s)=>a.paths[i]=s):t==="config"&&typeof a.config<"u"?u.Utilities.forEachProperty(e,(i,s)=>a.config[i]=s):a[t]=u.Utilities.recursiveClone(e)}),m.validateConfigurationOptions(a)}}u.ConfigurationOptionsUtil=m;class p{constructor(r,c){if(this._env=r,this.options=m.mergeConfigurationOptions(c),this._createIgnoreDuplicateModulesMap(),this._createSortedPathsRules(),this.options.baseUrl===""&&this.options.nodeRequire&&this.options.nodeRequire.main&&this.options.nodeRequire.main.filename&&this._env.isNode){let a=this.options.nodeRequire.main.filename,t=Math.max(a.lastIndexOf("/"),a.lastIndexOf("\\"));this.options.baseUrl=a.substring(0,t+1)}}_createIgnoreDuplicateModulesMap(){this.ignoreDuplicateModulesMap={};for(let r=0;r{Array.isArray(c)?this.sortedPathsRules.push({from:r,to:c}):this.sortedPathsRules.push({from:r,to:[c]})}),this.sortedPathsRules.sort((r,c)=>c.from.length-r.from.length)}cloneAndMerge(r){return new p(this._env,m.mergeConfigurationOptions(r,this.options))}getOptionsLiteral(){return this.options}_applyPaths(r){let c;for(let a=0,t=this.sortedPathsRules.length;athis.triggerCallback(i),d=>this.triggerErrorback(i,d))}triggerCallback(e){let i=this._callbackMap[e];delete this._callbackMap[e];for(let s=0;s{e.removeEventListener("load",l),e.removeEventListener("error",d)},l=o=>{n(),i()},d=o=>{n(),s(o)};e.addEventListener("load",l),e.addEventListener("error",d)}load(e,i,s,n){if(/^node\|/.test(i)){let l=e.getConfig().getOptionsLiteral(),d=c(e.getRecorder(),l.nodeRequire||u.global.nodeRequire),o=i.split("|"),_=null;try{_=d(o[1])}catch(f){n(f);return}e.enqueueDefineAnonymousModule([],()=>_),s()}else{let l=document.createElement("script");l.setAttribute("async","async"),l.setAttribute("type","text/javascript"),this.attachListeners(l,s,n);const{trustedTypesPolicy:d}=e.getConfig().getOptionsLiteral();d&&(i=d.createScriptURL(i)),l.setAttribute("src",i);const{cspNonce:o}=e.getConfig().getOptionsLiteral();o&&l.setAttribute("nonce",o),document.getElementsByTagName("head")[0].appendChild(l)}}}function p(t){const{trustedTypesPolicy:e}=t.getConfig().getOptionsLiteral();try{return(e?self.eval(e.createScript("","true")):new Function("true")).call(self),!0}catch{return!1}}class h{constructor(){this._cachedCanUseEval=null}_canUseEval(e){return this._cachedCanUseEval===null&&(this._cachedCanUseEval=p(e)),this._cachedCanUseEval}load(e,i,s,n){if(/^node\|/.test(i)){const l=e.getConfig().getOptionsLiteral(),d=c(e.getRecorder(),l.nodeRequire||u.global.nodeRequire),o=i.split("|");let _=null;try{_=d(o[1])}catch(f){n(f);return}e.enqueueDefineAnonymousModule([],function(){return _}),s()}else{const{trustedTypesPolicy:l}=e.getConfig().getOptionsLiteral();if(!(/^((http:)|(https:)|(file:))/.test(i)&&i.substring(0,self.origin.length)!==self.origin)&&this._canUseEval(e)){fetch(i).then(o=>{if(o.status!==200)throw new Error(o.statusText);return o.text()}).then(o=>{o=`${o} +//# sourceURL=${i}`,(l?self.eval(l.createScript("",o)):new Function(o)).call(self),s()}).then(void 0,n);return}try{l&&(i=l.createScriptURL(i)),importScripts(i),s()}catch(o){n(o)}}}}class r{constructor(e){this._env=e,this._didInitialize=!1,this._didPatchNodeRequire=!1}_init(e){this._didInitialize||(this._didInitialize=!0,this._fs=e("fs"),this._vm=e("vm"),this._path=e("path"),this._crypto=e("crypto"))}_initNodeRequire(e,i){const{nodeCachedData:s}=i.getConfig().getOptionsLiteral();if(!s||this._didPatchNodeRequire)return;this._didPatchNodeRequire=!0;const n=this,l=e("module");function d(o){const _=o.constructor;let f=function(v){try{return o.require(v)}finally{}};return f.resolve=function(v,E){return _._resolveFilename(v,o,!1,E)},f.resolve.paths=function(v){return _._resolveLookupPaths(v,o)},f.main=process.mainModule,f.extensions=_._extensions,f.cache=_._cache,f}l.prototype._compile=function(o,_){const f=l.wrap(o.replace(/^#!.*/,"")),g=i.getRecorder(),v=n._getCachedDataPath(s,_),E={filename:_};let I;try{const D=n._fs.readFileSync(v);I=D.slice(0,16),E.cachedData=D.slice(16),g.record(60,v)}catch{g.record(61,v)}const C=new n._vm.Script(f,E),P=C.runInThisContext(E),w=n._path.dirname(_),R=d(this),U=[this.exports,R,this,_,w,process,_commonjsGlobal,Buffer],b=P.apply(this.exports,U);return n._handleCachedData(C,f,v,!E.cachedData,i),n._verifyCachedData(C,f,v,I,i),b}}load(e,i,s,n){const l=e.getConfig().getOptionsLiteral(),d=c(e.getRecorder(),l.nodeRequire||u.global.nodeRequire),o=l.nodeInstrumenter||function(f){return f};this._init(d),this._initNodeRequire(d,e);let _=e.getRecorder();if(/^node\|/.test(i)){let f=i.split("|"),g=null;try{g=d(f[1])}catch(v){n(v);return}e.enqueueDefineAnonymousModule([],()=>g),s()}else{i=u.Utilities.fileUriToFilePath(this._env.isWindows,i);const f=this._path.normalize(i),g=this._getElectronRendererScriptPathOrUri(f),v=!!l.nodeCachedData,E=v?this._getCachedDataPath(l.nodeCachedData,i):void 0;this._readSourceAndCachedData(f,E,_,(I,C,P,w)=>{if(I){n(I);return}let R;C.charCodeAt(0)===r._BOM?R=r._PREFIX+C.substring(1)+r._SUFFIX:R=r._PREFIX+C+r._SUFFIX,R=o(R,f);const U={filename:g,cachedData:P},b=this._createAndEvalScript(e,R,U,s,n);this._handleCachedData(b,R,E,v&&!P,e),this._verifyCachedData(b,R,E,w,e)})}}_createAndEvalScript(e,i,s,n,l){const d=e.getRecorder();d.record(31,s.filename);const o=new this._vm.Script(i,s),_=o.runInThisContext(s),f=e.getGlobalAMDDefineFunc();let g=!1;const v=function(){return g=!0,f.apply(null,arguments)};return v.amd=f.amd,_.call(u.global,e.getGlobalAMDRequireFunc(),v,s.filename,this._path.dirname(s.filename)),d.record(32,s.filename),g?n():l(new Error(`Didn't receive define call in ${s.filename}!`)),o}_getElectronRendererScriptPathOrUri(e){if(!this._env.isElectronRenderer)return e;let i=e.match(/^([a-z])\:(.*)/i);return i?`file:///${(i[1].toUpperCase()+":"+i[2]).replace(/\\/g,"/")}`:`file://${e}`}_getCachedDataPath(e,i){const s=this._crypto.createHash("md5").update(i,"utf8").update(e.seed,"utf8").update(process.arch,"").digest("hex"),n=this._path.basename(i).replace(/\.js$/,"");return this._path.join(e.path,`${n}-${s}.code`)}_handleCachedData(e,i,s,n,l){e.cachedDataRejected?this._fs.unlink(s,d=>{l.getRecorder().record(62,s),this._createAndWriteCachedData(e,i,s,l),d&&l.getConfig().onError(d)}):n&&this._createAndWriteCachedData(e,i,s,l)}_createAndWriteCachedData(e,i,s,n){let l=Math.ceil(n.getConfig().getOptionsLiteral().nodeCachedData.writeDelay*(1+Math.random())),d=-1,o=0,_;const f=()=>{setTimeout(()=>{_||(_=this._crypto.createHash("md5").update(i,"utf8").digest());const g=e.createCachedData();if(!(g.length===0||g.length===d||o>=5)){if(g.length{v&&n.getConfig().onError(v),n.getRecorder().record(63,s),f()})}},l*Math.pow(4,o++))};f()}_readSourceAndCachedData(e,i,s,n){if(!i)this._fs.readFile(e,{encoding:"utf8"},n);else{let l,d,o,_=2;const f=g=>{g?n(g):--_===0&&n(void 0,l,d,o)};this._fs.readFile(e,{encoding:"utf8"},(g,v)=>{l=v,f(g)}),this._fs.readFile(i,(g,v)=>{!g&&v&&v.length>0?(o=v.slice(0,16),d=v.slice(16),s.record(60,i)):s.record(61,i),f()})}}_verifyCachedData(e,i,s,n,l){n&&(e.cachedDataRejected||setTimeout(()=>{const d=this._crypto.createHash("md5").update(i,"utf8").digest();n.equals(d)||(l.getConfig().onError(new Error(`FAILED TO VERIFY CACHED DATA, deleting stale '${s}' now, but a RESTART IS REQUIRED`)),this._fs.unlink(s,o=>{o&&l.getConfig().onError(o)}))},Math.ceil(5e3*(1+Math.random()))))}}r._BOM=65279,r._PREFIX="(function (require, define, __filename, __dirname) { ",r._SUFFIX=` +});`;function c(t,e){if(e.__$__isRecorded)return e;const i=function(n){t.record(33,n);try{return e(n)}finally{t.record(34,n)}};return i.__$__isRecorded=!0,i}u.ensureRecordedNodeRequire=c;function a(t){return new y(t)}u.createScriptLoader=a})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(u){class y{constructor(t){let e=t.lastIndexOf("/");e!==-1?this.fromModulePath=t.substr(0,e+1):this.fromModulePath=""}static _normalizeModuleId(t){let e=t,i;for(i=/\/\.\//;i.test(e);)e=e.replace(i,"/");for(e=e.replace(/^\.\//g,""),i=/\/(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//;i.test(e);)e=e.replace(i,"/");return e=e.replace(/^(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//,""),e}resolveModule(t){let e=t;return u.Utilities.isAbsolutePath(e)||(u.Utilities.startsWith(e,"./")||u.Utilities.startsWith(e,"../"))&&(e=y._normalizeModuleId(this.fromModulePath+e)),e}}y.ROOT=new y(""),u.ModuleIdResolver=y;class m{constructor(t,e,i,s,n,l){this.id=t,this.strId=e,this.dependencies=i,this._callback=s,this._errorback=n,this.moduleIdResolver=l,this.exports={},this.error=null,this.exportsPassedIn=!1,this.unresolvedDependenciesCount=this.dependencies.length,this._isComplete=!1}static _safeInvokeFunction(t,e){try{return{returnedValue:t.apply(u.global,e),producedError:null}}catch(i){return{returnedValue:null,producedError:i}}}static _invokeFactory(t,e,i,s){return t.shouldInvokeFactory(e)?t.shouldCatchError()?this._safeInvokeFunction(i,s):{returnedValue:i.apply(u.global,s),producedError:null}:{returnedValue:null,producedError:null}}complete(t,e,i,s){this._isComplete=!0;let n=null;if(this._callback)if(typeof this._callback=="function"){t.record(21,this.strId);let l=m._invokeFactory(e,this.strId,this._callback,i);n=l.producedError,t.record(22,this.strId),!n&&typeof l.returnedValue<"u"&&(!this.exportsPassedIn||u.Utilities.isEmpty(this.exports))&&(this.exports=l.returnedValue)}else this.exports=this._callback;if(n){let l=u.ensureError(n);l.phase="factory",l.moduleId=this.strId,l.neededBy=s(this.id),this.error=l,e.onError(l)}this.dependencies=null,this._callback=null,this._errorback=null,this.moduleIdResolver=null}onDependencyError(t){return this._isComplete=!0,this.error=t,this._errorback?(this._errorback(t),!0):!1}isComplete(){return this._isComplete}}u.Module=m;class p{constructor(){this._nextId=0,this._strModuleIdToIntModuleId=new Map,this._intModuleIdToStrModuleId=[],this.getModuleId("exports"),this.getModuleId("module"),this.getModuleId("require")}getMaxModuleId(){return this._nextId}getModuleId(t){let e=this._strModuleIdToIntModuleId.get(t);return typeof e>"u"&&(e=this._nextId++,this._strModuleIdToIntModuleId.set(t,e),this._intModuleIdToStrModuleId[e]=t),e}getStrModuleId(t){return this._intModuleIdToStrModuleId[t]}}class h{constructor(t){this.id=t}}h.EXPORTS=new h(0),h.MODULE=new h(1),h.REQUIRE=new h(2),u.RegularDependency=h;class r{constructor(t,e,i){this.id=t,this.pluginId=e,this.pluginParam=i}}u.PluginDependency=r;class c{constructor(t,e,i,s,n=0){this._env=t,this._scriptLoader=e,this._loaderAvailableTimestamp=n,this._defineFunc=i,this._requireFunc=s,this._moduleIdProvider=new p,this._config=new u.Configuration(this._env),this._hasDependencyCycle=!1,this._modules2=[],this._knownModules2=[],this._inverseDependencies2=[],this._inversePluginDependencies2=new Map,this._currentAnonymousDefineCall=null,this._recorder=null,this._buildInfoPath=[],this._buildInfoDefineStack=[],this._buildInfoDependencies=[],this._requireFunc.moduleManager=this}reset(){return new c(this._env,this._scriptLoader,this._defineFunc,this._requireFunc,this._loaderAvailableTimestamp)}getGlobalAMDDefineFunc(){return this._defineFunc}getGlobalAMDRequireFunc(){return this._requireFunc}static _findRelevantLocationInStack(t,e){let i=l=>l.replace(/\\/g,"/"),s=i(t),n=e.split(/\n/);for(let l=0;lthis._moduleIdProvider.getStrModuleId(_.id))),this._resolve(o)}_normalizeDependency(t,e){if(t==="exports")return h.EXPORTS;if(t==="module")return h.MODULE;if(t==="require")return h.REQUIRE;let i=t.indexOf("!");if(i>=0){let s=e.resolveModule(t.substr(0,i)),n=e.resolveModule(t.substr(i+1)),l=this._moduleIdProvider.getModuleId(s+"!"+n),d=this._moduleIdProvider.getModuleId(s);return new r(l,d,n)}return new h(this._moduleIdProvider.getModuleId(e.resolveModule(t)))}_normalizeDependencies(t,e){let i=[],s=0;for(let n=0,l=t.length;nthis._moduleIdProvider.getStrModuleId(l));const n=u.ensureError(e);return n.phase="loading",n.moduleId=i,n.neededBy=s,n}_onLoadError(t,e){const i=this._createLoadError(t,e);this._modules2[t]||(this._modules2[t]=new m(t,this._moduleIdProvider.getStrModuleId(t),[],()=>{},null,null));let s=[];for(let d=0,o=this._moduleIdProvider.getMaxModuleId();d0;){let d=l.shift(),o=this._modules2[d];o&&(n=o.onDependencyError(i)||n);let _=this._inverseDependencies2[d];if(_)for(let f=0,g=_.length;f0;){let d=n.shift().dependencies;if(d)for(let o=0,_=d.length;o<_;o++){let f=d[o];if(f.id===e)return!0;let g=this._modules2[f.id];g&&!s[f.id]&&(s[f.id]=!0,n.push(g))}}return!1}_findCyclePath(t,e,i){if(t===e||i===50)return[t];let s=this._modules2[t];if(!s)return null;let n=s.dependencies;if(n)for(let l=0,d=n.length;lthis._relativeRequire(t,i,s,n);return e.toUrl=i=>this._config.requireToUrl(t.resolveModule(i)),e.getStats=()=>this.getLoaderEvents(),e.hasDependencyCycle=()=>this._hasDependencyCycle,e.config=(i,s=!1)=>{this.configure(i,s)},e.__$__nodeRequire=u.global.nodeRequire,e}_loadModule(t){if(this._modules2[t]||this._knownModules2[t])return;this._knownModules2[t]=!0;let e=this._moduleIdProvider.getStrModuleId(t),i=this._config.moduleIdToPaths(e),s=/^@[^\/]+\/[^\/]+$/;this._env.isNode&&(e.indexOf("/")===-1||s.test(e))&&i.push("node|"+e);let n=-1,l=d=>{if(n++,n>=i.length)this._onLoadError(t,d);else{let o=i[n],_=this.getRecorder();if(this._config.isBuild()&&o==="empty:"){this._buildInfoPath[t]=o,this.defineModule(this._moduleIdProvider.getStrModuleId(t),[],null,null,null),this._onLoad(t);return}_.record(10,o),this._scriptLoader.load(this,o,()=>{this._config.isBuild()&&(this._buildInfoPath[t]=o),_.record(11,o),this._onLoad(t)},f=>{_.record(12,o),l(f)})}};l(null)}_loadPluginDependency(t,e){if(this._modules2[e.id]||this._knownModules2[e.id])return;this._knownModules2[e.id]=!0;let i=s=>{this.defineModule(this._moduleIdProvider.getStrModuleId(e.id),[],s,null,null)};i.error=s=>{this._config.onError(this._createLoadError(e.id,s))},t.load(e.pluginParam,this._createRequire(y.ROOT),i,this._config.getOptionsLiteral())}_resolve(t){let e=t.dependencies;if(e)for(let i=0,s=e.length;ithis._moduleIdProvider.getStrModuleId(o)).join(` => +`)),t.unresolvedDependenciesCount--;continue}if(this._inverseDependencies2[n.id]=this._inverseDependencies2[n.id]||[],this._inverseDependencies2[n.id].push(t.id),n instanceof r){let d=this._modules2[n.pluginId];if(d&&d.isComplete()){this._loadPluginDependency(d.exports,n);continue}let o=this._inversePluginDependencies2.get(n.pluginId);o||(o=[],this._inversePluginDependencies2.set(n.pluginId,o)),o.push(n),this._loadModule(n.pluginId);continue}this._loadModule(n.id)}t.unresolvedDependenciesCount===0&&this._onModuleComplete(t)}_onModuleComplete(t){let e=this.getRecorder();if(t.isComplete())return;let i=t.dependencies,s=[];if(i)for(let o=0,_=i.length;o<_;o++){let f=i[o];if(f===h.EXPORTS){s[o]=t.exports;continue}if(f===h.MODULE){s[o]={id:t.strId,config:()=>this._config.getConfigForModule(t.strId)};continue}if(f===h.REQUIRE){s[o]=this._createRequire(t.moduleIdResolver);continue}let g=this._modules2[f.id];if(g){s[o]=g.exports;continue}s[o]=null}const n=o=>(this._inverseDependencies2[o]||[]).map(_=>this._moduleIdProvider.getStrModuleId(_));t.complete(e,this._config,s,n);let l=this._inverseDependencies2[t.id];if(this._inverseDependencies2[t.id]=null,l)for(let o=0,_=l.length;o<_;o++){let f=l[o],g=this._modules2[f];g.unresolvedDependenciesCount--,g.unresolvedDependenciesCount===0&&this._onModuleComplete(g)}let d=this._inversePluginDependencies2.get(t.id);if(d){this._inversePluginDependencies2.delete(t.id);for(let o=0,_=d.length;o<_;o++)this._loadPluginDependency(t.exports,d[o])}}}u.ModuleManager=c})(AMDLoader||(AMDLoader={}));var define,AMDLoader;(function(u){const y=new u.Environment;let m=null;const p=function(a,t,e){typeof a!="string"&&(e=t,t=a,a=null),(typeof t!="object"||!Array.isArray(t))&&(e=t,t=null),t||(t=["require","exports","module"]),a?m.defineModule(a,t,e,null,null):m.enqueueDefineAnonymousModule(t,e)};p.amd={jQuery:!0};const h=function(a,t=!1){m.configure(a,t)},r=function(){if(arguments.length===1){if(arguments[0]instanceof Object&&!Array.isArray(arguments[0])){h(arguments[0]);return}if(typeof arguments[0]=="string")return m.synchronousRequire(arguments[0])}if((arguments.length===2||arguments.length===3)&&Array.isArray(arguments[0])){m.defineModule(u.Utilities.generateAnonymousModule(),arguments[0],arguments[1],arguments[2],null);return}throw new Error("Unrecognized require call")};r.config=h,r.getConfig=function(){return m.getConfig().getOptionsLiteral()},r.reset=function(){m=m.reset()},r.getBuildInfo=function(){return m.getBuildInfo()},r.getStats=function(){return m.getLoaderEvents()},r.define=p;function c(){if(typeof u.global.require<"u"||typeof require<"u"){const a=u.global.require||require;if(typeof a=="function"&&typeof a.resolve=="function"){const t=u.ensureRecordedNodeRequire(m.getRecorder(),a);u.global.nodeRequire=t,r.nodeRequire=t,r.__$__nodeRequire=t}}y.isNode&&!y.isElectronRenderer&&!y.isElectronNodeIntegrationWebWorker?module.exports=r:(y.isElectronRenderer||(u.global.define=p),u.global.require=r)}u.init=c,(typeof u.global.define!="function"||!u.global.define.amd)&&(m=new u.ModuleManager(y,u.createScriptLoader(y),p,r,u.Utilities.getHighPerformanceTimestamp()),typeof u.global.require<"u"&&typeof u.global.require!="function"&&r.config(u.global.require),define=function(){return p.apply(null,arguments)},define.amd=p.amd,typeof doNotInitLoader>"u"&&c())})(AMDLoader||(AMDLoader={})); + +//# sourceMappingURL=../../min-maps/vs/loader.js.map \ No newline at end of file diff --git a/assets/app/js/patchVencordQuickCSS.js b/assets/app/js/patchVencordQuickCSS.js new file mode 100644 index 0000000..3bf02f1 --- /dev/null +++ b/assets/app/js/patchVencordQuickCSS.js @@ -0,0 +1,27 @@ +// dirty hack to replace Vencord's quick css editor with Legcord's +// fixes the white window bug + +if (window.VencordNative) { + Vencord.Settings.useQuickCss = false; + let settings = VencordNative.settings.get() + settings.useQuickCss = false; + VencordNative.settings.set(settings) + VencordNative.quickCss.openEditor = function openEditor() { + 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); + window.legcord.themes.openQuickCss() + }, + () => console.log("Cancel.") + ); + + } +} \ No newline at end of file diff --git a/assets/app/mockup.jpg b/assets/app/mockup.jpg new file mode 100644 index 0000000..8b89578 Binary files /dev/null and b/assets/app/mockup.jpg differ diff --git a/assets/app/native.png b/assets/app/native.png new file mode 100644 index 0000000..d89a9cc Binary files /dev/null and b/assets/app/native.png differ diff --git a/assets/app/vencord.png b/assets/app/vencord.png new file mode 100644 index 0000000..3598e40 Binary files /dev/null and b/assets/app/vencord.png differ diff --git a/assets/badge-1.ico b/assets/badge-1.ico new file mode 100644 index 0000000..0e2003f Binary files /dev/null and b/assets/badge-1.ico differ diff --git a/assets/badge-10.ico b/assets/badge-10.ico new file mode 100644 index 0000000..1e02de3 Binary files /dev/null and b/assets/badge-10.ico differ diff --git a/assets/badge-11.ico b/assets/badge-11.ico new file mode 100644 index 0000000..7ebd2ed Binary files /dev/null and b/assets/badge-11.ico differ diff --git a/assets/badge-2.ico b/assets/badge-2.ico new file mode 100644 index 0000000..d7b6f44 Binary files /dev/null and b/assets/badge-2.ico differ diff --git a/assets/badge-3.ico b/assets/badge-3.ico new file mode 100644 index 0000000..43ce7cf Binary files /dev/null and b/assets/badge-3.ico differ diff --git a/assets/badge-4.ico b/assets/badge-4.ico new file mode 100644 index 0000000..91bd61f Binary files /dev/null and b/assets/badge-4.ico differ diff --git a/assets/badge-5.ico b/assets/badge-5.ico new file mode 100644 index 0000000..1d6bf8f Binary files /dev/null and b/assets/badge-5.ico differ diff --git a/assets/badge-6.ico b/assets/badge-6.ico new file mode 100644 index 0000000..d0c0cd6 Binary files /dev/null and b/assets/badge-6.ico differ diff --git a/assets/badge-7.ico b/assets/badge-7.ico new file mode 100644 index 0000000..b50750c Binary files /dev/null and b/assets/badge-7.ico differ diff --git a/assets/badge-8.ico b/assets/badge-8.ico new file mode 100644 index 0000000..8d0ca36 Binary files /dev/null and b/assets/badge-8.ico differ diff --git a/assets/badge-9.ico b/assets/badge-9.ico new file mode 100644 index 0000000..c153779 Binary files /dev/null and b/assets/badge-9.ico differ diff --git a/assets/deafen-off.png b/assets/deafen-off.png new file mode 100644 index 0000000..4ad8c80 Binary files /dev/null and b/assets/deafen-off.png differ diff --git a/assets/deafen.png b/assets/deafen.png new file mode 100644 index 0000000..fe3718e Binary files /dev/null and b/assets/deafen.png differ diff --git a/assets/desktop.png b/assets/desktop.png index 940c594..4ad0ad5 100644 Binary files a/assets/desktop.png and b/assets/desktop.png differ diff --git a/assets/disconnect.png b/assets/disconnect.png new file mode 100644 index 0000000..f7e42ed Binary files /dev/null and b/assets/disconnect.png differ diff --git a/assets/lang/ar-AA.json b/assets/lang/ar-AA.json deleted file mode 100644 index adf7b16..0000000 --- a/assets/lang/ar-AA.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_offline": "يبدو أنك غير متصل. يجب عليك الاتصال بالانترنت والمحاولة مرة أخرى.", - "settings-channel-desc2": "ربما تكون أكثر دراية بهذا. إنه الذي تراه في عميل Discord \nالافتراضي!", - "settings-disableAutogain-desc": "تعطيل الكسب التلقائي.", - "settings-startMinimized": "ابدأ مصغر", - "settings-trayIcon-white-plug-alt": "المكونات البيضاء بديل", - "settings-theme-desc1": "تتحكم ثيمات ArmCord بمظهر واداء التطبيقات.", - "settings-trayIcon-dynamic": "متحرك", - "settings-spellcheck-desc": "يساعدك على تصحيح الكلمات التي بها أخطاء إملائية من خلال تمييزها.", - "settings-theme-default": "الافتراضى", - "settings-skipSplash": "تخطي شاشة البداية (تجريبية)", - "settings-forceNativeCrash": "فرض تحطم الأصلي", - "settings-trayIcon-white-plug": "المكونات البيضاء", - "settings-mod-vencord": "خفيف الوزن وسهل الاستخدام. يتميز بمتجر مدمج للمكونات الإضافية.", - "settings-trayIcon": "ايقونة واجهة المستخدم", - "settings-channel-desc4": "بناء الاختبار العام. يتلقى ميزات أقدم من المستقر ولكنه أقدم قليلاً من Canary.", - "settings-prfmMode-battery": "البطارية", - "settings-prfmMode": "وضع الاداء", - "settings-trayIcon-black-plug-alt": "المكونات السوداء بديل", - "setup_question2": "اختر قناة/مثال Discord الخاص بك:", - "next": "التالى", - "settings-spellcheck": "فحص اللغة", - "no": "لا", - "settings-theme-desc3": "يستخدم شريط العنوان الأصلي لنظام التشغيل الذي تقوم بتشغيله حاليًا (مثل Windows 7/10). وظائف أكثر\n مشابه لتطبيق Discord الفعلي على Linux.", - "settings-mod-shelter": "هو جيل جديد من أجهزة العميل المصممة لتكون مقاومة للرصاص بشكل أساسي.", - "settings-patches": "التصحيحات التلقائية", - "settings-updater": "افحص التحديثات", - "settings-theme": "مظهر ArmCord", - "settings-mintoTray-desc": "عند تعطيله، سيتم إغلاق ArmCord مثل أي نافذة أخرى عند إغلاقه، وإلا فإنه سيجلس ويسترخي\n في علبة النظام الخاص بك في وقت لاحق.", - "settings-MultiInstance": "تعدد اللحظات", - "settings-storageFolder": "افتح مجلد التخزين", - "settings-mobileMode-desc": "إذا كنت تستخدم جهازًا مزودًا بشاشة تعمل باللمس، فهذه الميزة تناسبك! يقوم بتنشيط هاتف Discord المخفي\n الوضع مخصص للهواتف والأجهزة اللوحية. الميزة الرئيسية الوحيدة المفقودة هي دعم الدردشة الصوتية. هذا مثالي ل\n المستخدمين على PinePhone وما شابه ذلك.", - "settings-restart": "اعد التشغيل", - "settings-prfmMode-performance": "الاداء", - "yes": "نعم", - "settings-mobileMode": "وضع المحمول", - "settings-channel-desc1": "يمكنك استخدام هذا الإعداد لتغيير المثيل الحالي لـ Discord:", - "setup_question4": "اختار client mod الذى تريد تسطيبه:", - "settings-dynamicIcon-desc": "باتباع سلوك Discord على نظام التشغيل Windows، يُظهر هذا عدد الرسائل/الأصوات غير المقروءة على أيقونة ArmCord بدلاً من درجه.", - "settings-theme-native": "التطبيق", - "settings-themesFolder": "افتح ملف الثيمات", - "setup_offline": "يبدو أنك غير متصل. يجب عليك الاتصال بالانترنت واعادة تشغيل ArmCord.", - "setup_question1": "مرحبا بك فى اعداد ArmCord", - "settings-copyDebugInfo": "انسخ معلومات التصحيح", - "settings-mod-desc1": "تعديلات العميل هي برامج تسمح لك بتخصيص تجربة Discord الخاصة بك. يمكنهم تغيير مظهر\n العميل، تعديل سلوكياته أو إضافة ميزات جديدة!", - "settings-skipSplash-desc": "يتخطى شاشة بداية ArmCord عند بدء تشغيل التطبيق.", - "setup_question3": "هل يجب ان يقوم ArmCord بتولى تسطيب client mods؟", - "settings-MultiInstance-desc": "عند التمكين، ستتمكن من بدء تشغيل العديد من مثيلات ArmCord.", - "settings-useLegacyCapturer-desc": "استخدم وحدة مشاركة الشاشة القديمة، بدلاً من الوحدة الجديدة. إذا كنت تواجه مشكلات في مشاركة الشاشة، فحاول تمكين هذا.", - "settings-invitewebsocket-desc": "يستخدم arRPC لدعم Discord RPC (التواجد الغني) مع البرامج المحلية على جهازك. أعمال جارية.", - "settings-theme-transparent": "شفاف", - "settings-crashesFolder": "افتح مجلد الأعطال الأصلي", - "settings-trayIcon-black-plug": "المكونات السوداء", - "settings-prfmMode-desc": "وضع الأداء هو وظيفة تجريبية قد تؤدي إما إلى زيادة الاستجابة والأداء\n ArmCord أو ... قم بتقليله. يرجى تجربة كل خيار ومعرفة ما يناسبك بشكل أفضل.", - "settings-channel": "Discord قناة", - "settings-mod": "اضافة العميل", - "settings-patches-desk": "جلب التصحيحات الموزعة إذا تبين أن الإصدار يحتوي على أخطاء. عادة\n لا يلزم تشغيله بشكل مستمر (ما لم يتم إخطارك بذلك في دعم Discord).", - "settings-trayIcon-desc": "قم بتعيين الرمز الذي سيظهر في قائمة الدرج.", - "settings-advanced": "منطقة المستخدم المتقدمة", - "loading_screen_start": "يبدأ ArmCord …", - "settings-theme-desc2": "هذه هي الطريقة التي يبدو بها ArmCord عند تشغيله لأول مرة. يتضمن الترفيه عن Discord\n تم إدخال شريط عنوان مخصص وأنماط خاصة بـ ArmCord في Discord.", - "setup_question5": "هل تريد استخدام أيقونة واجهة المستخدم؟", - "settings-invitewebsocket": "حضور غني (تجريبي)", - "settings-save": "احفظ الاعدادات", - "settings-tray-desc": "عند تعطيله، سيتم إغلاق ArmCord مثل أي نافذة أخرى عند إغلاقه، وإلا فإنه سيجلس ويسترخي في علبة النظام لديك لوقت لاحق.", - "settings-useLegacyCapturer": "استخدم الماسك القديم", - "settings-channel-desc3": "هذا هو إصدار اختبار ألفا لـ Discord. باستخدامه يمكنك الوصول إلى الأحدث\n الميزات والإصلاحات.", - "settings-theme-desc4": "نافذة شفافة مع شريط عنوان أصلي، فأنت بحاجة إلى سمة متوافقة لتشغيلها. ويندوز فقط.", - "settings-startMinimized-desc": "يبدأ ArmCord في الخلفية ويظل بعيدًا عن طريقك.", - "settings-pluginsFolder": "افتح ملف الاضافات", - "settings-dynamicIcon": "ايقونة متغيرة", - "settings-tray": "واجهة", - "settings-trayIcon-normal": "Discord ايقونة", - "settings-mintoTray": "التصغير الى واجهة المستخدم", - "settings-trayIcon-colored-plug": "المكونات الملونة", - "settings-trayIcon-classic": "أيقونة Discord الكلاسيكية", - "settings-disableAutogain": "وقف الدخول التلقائى", - "loading_screen_update": "نسخة جديدة متوفرة من ArmCord.من فضلك قم بالتحديث الى آخر نسخة.", - "settings-experimental": "تجريبى", - "settings-none": "لا شئ", - "settings-csp-desc": "ArmCord CSP هو نظامنا الذي يدير تحميل المحتوى المخصص في تطبيق Discord. أشياء من هذا القبيل\n تعتمد تعديلات العميل وموضوعاته على ذلك. قم بتعطيله إذا كنت تريد التخلص من التعديلات والأنماط المخصصة.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} 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-CZ.json b/assets/lang/cs-CZ.json deleted file mode 100644 index 7ef1461..0000000 --- a/assets/lang/cs-CZ.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "settings-theme-desc1": "ArmCord \"motivy\" spravují chování a vzhled aplikací.", - "settings-invitewebsocket": "Rich Presence (Experimentalní)", - "loading_screen_start": "Spouštění ArmCordu…", - "loading_screen_offline": "Zdá se, že jste offline. Připojte se k internetu a zkuste to znovu.", - "loading_screen_update": "Je nová verze ArmCordu 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 ArmCord.", - "setup_question2": "Vyberte svůj Discord kanál/instanci:", - "setup_question3": "Měl by ArmCord nainstalovat klientské mody?", - "yes": "Ano", - "no": "Ne", - "next": "Další", - "setup_question4": "Vyberte klientský mod, který chcete nainstalovat:", - "settings-theme": "ArmCord motiv", - "settings-theme-desc2": "takto vypadá ArmCord při prvním spuštění. Zahrnuje rekreaci Discordu\n vlastní titulek a specifické motivy ArmCord vložené do Discordu.", - "settings-theme-desc3": "používá nativní záhlaví operačního systému, který aktuálně používáte (např. Windows 7/10). Funguje\n podobně jako ve skutečné aplikaci Discord na Linuxu.", - "settings-theme-default": "Výchozí", - "settings-theme-native": "Nativní", - "settings-theme-transparent": "Transparentní (Experimentální)", - "settings-csp-desc": "ArmCord 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, ArmCord 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": "ArmCord se spustí na pozadí a zůstane vám z cesty.", - "settings-patches": "Automatické záplaty", - "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-patches-desk": "Načte automatické opravy, které jsou distribuovány, pokud se ukáže, že vydání obsahuje chyby po vydání. Obvykle\n nemusíte tuto možnost ponechat povolenou, pokud o tom nebudete informováni v podpoře.", - "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-dynamicIcon": "Dynamická ikona", - "settings-dynamicIcon-desc": "Podle chování Discordu ve Windows se ukazuje počet nepřečtených zpráv/pingů na ikoně ArmCordu místo na jejím panelu.", - "settings-channel": "Discord kanál", - "settings-channel-desc1": "Toto nastavení můžete použít ke změně aktuální instanci Discordu:", - "settings-channel-desc2": "tuhle znáte asi nejvíc. Je to ten, který vidíte ve výchozím Discordu\n klient!", - "settings-channel-desc3": "toto je alfa testovací vydání Discordu. Jeho používáním získáte přístup k nejnovějším\n funkce a opravy.", - "settings-channel-desc4": "veřejný testovací kanál. Dostává funkce dříve než stabilní, ale je o něco starší než Canary.", - "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-mod-shelter": "je klientský mod nové generace vytvořený tak, aby byl v podstatě neprůstřelný.", - "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 ArmCordu 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 ArmCord.", - "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, 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-desc4": "transparent window with native titlebar, you need a compatible theme to run this. Windows only.", - "settings-MultiInstance": "Multi Instance", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of ArmCord.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} 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-DE.json b/assets/lang/de-DE.json deleted file mode 100644 index 64eccfd..0000000 --- a/assets/lang/de-DE.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "yes": "Ja", - "settings-theme-default": "Standard", - "settings-startMinimized": "Minimiert starten", - "settings-startMinimized-desc": "ArmCord startet im Hintergrund und bleibt dir aus dem Weg.", - "settings-patches": "Automatische Patches", - "settings-channel": "Discord-Kanal", - "settings-channel-desc4": "Öffentliche Testversion. Erhält Funktionen früher als Stable, ist aber ein bisschen älter als Canary.", - "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 ArmCord…", - "settings-copyDebugInfo": "Debug-Informationen kopieren", - "loading_screen_update": "Eine neue Version von ArmCord ist verfügbar. Bitte aktualisiere auf die neuste Version.", - "setup_question1": "Willkommen bei der Einrichtung von ArmCord", - "loading_screen_offline": "Du scheinst offline zu sein. Bitte verbinde dich mit dem Internet und versuche es erneut.", - "setup_offline": "Du scheinst offline zu sein. Bitte verbinde dich mit dem Internet und starte ArmCord neu.", - "setup_question2": "Wähle deinen Discord Kanal/Instanz:", - "setup_question3": "Soll ArmCord 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": "ArmCord-Thema", - "settings-theme-desc1": "ArmCord \"Themen\" verwalten das Verhalten und das Aussehen der Anwendungen.", - "settings-theme-desc3": "Verwendet die native Titelleiste des Betriebssystems, das du gerade verwendest (z. B. Windows 7/10).\nDie Funktionen sind ähnlich wie die aktuelle Discord-App unter Linux.", - "settings-theme-desc4": "Transparentes Fenster mit nativer Titelleiste. Du benötigst ein kompatibles Thema, um es auszuführen. Nur für Windows.", - "settings-theme-native": "Nativ", - "settings-theme-desc2": "So sieht ArmCord aus, wenn du es zum ersten Mal startest. Es enthält eine Nachbildung von Discords \nbenutzerdefinierten Titelleiste und ArmCord-spezifischen Stilen, die in Discord eingefügt wurden.", - "settings-theme-transparent": "Transparent", - "settings-mintoTray": "In die Taskleiste minimieren", - "settings-mintoTray-desc": "Wenn diese Funktion deaktiviert ist, wird ArmCord wie jedes andere \nFenster geschlossen, andernfalls bleibt es in deiner Systemablage.", - "settings-csp-desc": "ArmCord 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-patches-desk": "Holt Patches, die veröffentlicht werden, wenn sich herausstellt, dass eine Version Fehler enthält.\nNormalerweise muss dies nicht eingeschaltet sein (Es sei denn, es wird im Discord des Supports gemeldet).", - "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-dynamicIcon": "Dynamisches Icon", - "settings-dynamicIcon-desc": "In Anlehnung an das Verhalten von Discord unter Windows wird die Anzahl der ungelesenen Nachrichten/Pings auf dem ArmCord-Symbol und nicht in der Taskleiste angezeigt.", - "settings-spellcheck": "Rechtschreibprüfung", - "settings-tray-desc": "Wenn es deaktiviert ist, schließt sich ArmCord wie jedes andere Fenster, wenn es geschlossen wird, andernfalls minimiert es sich in die Taskleiste.", - "settings-spellcheck-desc": "Hilft dir, falsch geschriebene Wörter zu korrigieren, indem es sie hervorhebt.", - "settings-tray": "Tray", - "settings-channel-desc2": "Du bist wahrscheinlich am meisten mit diesem hier vertraut.\nEs ist die stabilste Version von Discord.", - "settings-channel-desc1": "Du kannst diese Einstellung verwenden, um die aktuelle Instanz von Discord zu ändern:", - "settings-channel-desc3": "Dies ist die Alpha-Testversion von Discord. Durch die Verwendung dieser Version erhältst du Zugang zu\nden neuesten Funktionen und Fehlerbehebungen.", - "settings-invitewebsocket": "Rich Presence (Experimentell)", - "settings-invitewebsocket-desc": "Nutzt arRPC, um Discord RPC (Rich Presence) mit lokalen Programmen auf Ihrem Rechner zu unterstützen. Derzeit in Arbeit.", - "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-mod-shelter": "ist ein Client-Mod der neuen Generation, der im Wesentlichen kugelsicher ist.", - "settings-prfmMode-desc": "Der Leistungsmodus ist eine experimentelle Funktion, die entweder die Reaktionsfähigkeit und Leistung von ArmCord 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": "Splash-Screen überspringen (experimentell)", - "settings-skipSplash-desc": "Überspringt den ArmCord-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 ArmCord starten.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} diff --git a/assets/lang/de.json b/assets/lang/de.json new file mode 100644 index 0000000..8b8206a --- /dev/null +++ b/assets/lang/de.json @@ -0,0 +1,242 @@ +{ + "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-transparency-tahoe-warning": "Transparenz kann zu großem Lags auf MacOS 26 Tahoe führen.", + "settings-popoutPiP": "Anruf 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", + "games-application": "Anwendung", + "screenshare-selectSource": "Bitte eine Quelle auswählen", + "screenshare-venmicDisabled": "Venmic deaktiviert", + "screenshare-share": "Teilen", + "contextMenu-searchGoogle": "Mit Google suchen", + "contextMenu-searchDuckDuckGo": "Mit DuckDuckGo suchen", + "touchbar-servers": "Server", + "splash-title": "Legcord", + "menu-about": "Über Legcord", + "menu-developerTools": "Entwicklerwerkzeuge", + "menu-openSettings": "Einstellungen öffnen", + "menu-reload": "Neu laden", + "menu-restart": "Neu starten", + "menu-quit": "Beenden", + "menu-edit": "Bearbeiten", + "menu-undo": "Rückgängig", + "menu-redo": "Wiederherstellen", + "menu-cut": "Ausschneiden", + "menu-copy": "Kopieren", + "menu-paste": "Einfügen", + "menu-selectAll": "Alles auswählen", + "menu-view": "Ansicht", + "menu-toggleFullscreen": "Vollbild umschalten", + "menu-zoomIn": "Vergrößern", + "menu-zoomOut": "Verkleinern", + "menu-window": "Fenster", + "menu-minimize": "Minimieren", + "menu-close": "Schließen", + "menu-legcord": "Legcord", + "tray-openLegcord": "Legcord öffnen", + "tray-openSettings": "Einstellungen öffnen", + "tray-supportServer": "Discord-Server unterstützen", + "tray-restartLegcord": "Legcord neu starten", + "tray-quitLegcord": "Legcord beenden", + "tray-tooltip": "Legcord", + "dialog-openUrl-title": "Möchtest du diesen Link öffnen?", + "dialog-openUrl-message": "Möchtest du {url} öffnen?", + "dialog-openUrl-yes": "Ja, bitte", + "dialog-openUrl-no": "Nein, möchte ich nicht", + "title-legcordSuffix": " - Legcord", + "dialog-importTheme-button": "Importieren", + "dialog-importTheme-discordStyles": "Discord-Stile", + "dialog-importTheme-allFiles": "Alle Dateien", + "dialog-customIcon-filters": "Symbole", + "setup-welcomeTitle": "Willkommen bei Legcord", + "setup-windowStyle-nativeTitle": "Natives Fenster", + "setup-windowStyle-customTitle": "Benutzerdefinierte Titelleiste", + "setup-chooseWindowStyle": "Fensterstil auswählen", + "setup-launchLegcord": "Legcord starten", + "setup-vencordTitle": "Vencord", + "setup-equicordTitle": "Equicord", + "setup-back": "Zurück", + "setup-next": "Weiter", + "setup-stepOf": "Schritt {current} von {total}", + "setup-loading": "Wird geladen ...", + "setup-windowTitle": "Legcord-Einrichtung", + "settings-restartRequired": "Neustart erforderlich", + "settings-restartLater": "Ich mache es später", + "settings-channel-stable": "Stabil", + "settings-category-powerManagement": "Energieverwaltung", + "keybind-action": "Aktion", + "keybind-mute": "Stummschalten", + "keybind-leaveCall": "Anruf verlassen", + "keybind-runJavascript": "Javascript ausführen", + "keybind-global": "Global", + "keybind-enabled": "Aktiviert", + "keybind-jsCode": "Javascript-Code", + "keybind-add": "Hinzufügen", + "keybind-delete": "Löschen", + "detectable-missingFields": "Fehlende Felder", + "detectable-appName": "App-Name*", + "detectable-appId": "App-Kennung*", + "detectable-themes": "Themen", + "detectable-aliases": "Aliase", + "detectable-enabled": "Aktiviert", + "detectable-placeholderName": "z.B. Discord", + "detectable-placeholderId": "z.B. 1234567890", + "detectable-placeholderThemes": "Aktion, Abenteuer", + "detectable-placeholderAliases": "Alias1, Alias2", + "themes-success": "Erfolg!", + "themes-updated": "Thema erfolgreich aktualisiert!", + "themes-bdInstalled": "BD-Thema erfolgreich installiert!", + "themes-delete": "Löschen", + "themes-edit": "Bearbeiten", + "themes-update": "Aktualisieren", + "themes-open": "Öffnen", + "themes-by": "von", + "themes-importFromFile": "Aus Datei importieren", + "themes-openThemesFolder": "Themenordner öffnen", + "themes-import": "Importieren", + "games-registeredGames": "Registrierte Spiele", + "games-refreshList": "Liste auffrischen", + "games-add": "Hinzufügen", + "games-remove": "Entfernen", + "games-removeConfirmHeader": "Spiel entfernen?", + "games-noExecutables": "Keine ausführbaren Dateien", + "games-lastDetected": "Zuletzt erkannte Spiele", + "games-removeFromBlacklist": "Entfernen", + "settings-material": "Fenster Material", + "settings-material-acrylic": "Acryl", + "settings-material-none": "Keine", + "settings-csp-strict": "Strikt", + "settings-csp-none": "Keine", + "settings-csp-vanilla": "Vanilla", + "settings-firstTimeCrash": "Wir richten Dinge für sie ein!", + "settings-automaticClientUpdates": "Automatische client updates", + "settings-automaticClientUpdates-desc": "Deaktiviert automatische Legcord Updates" +} diff --git a/assets/lang/en-US.json b/assets/lang/en-US.json index 3b8d182..6948db9 100644 --- a/assets/lang/en-US.json +++ b/assets/lang/en-US.json @@ -1,63 +1,128 @@ { - "loading_screen_start": "Starting ArmCord…", + "loading_screen_start": "Starting Legcord…", "loading_screen_offline": "You appear to be offline. Restart in ", - "loading_screen_update": "A new version of ArmCord is available. Please update to the latest version.", - "setup_question1": "Welcome to the ArmCord Setup", - "setup_offline": "You appear to be offline. Please connect to the internet and restart ArmCord.", + "loading_screen_update": "A new version of Legcord is available. Please update to the latest version.", + "setup_question1": "Welcome to the Legcord Setup", + "setup_offline": "You appear to be offline. Please connect to the internet and restart Legcord.", "setup_question2": "Choose your Discord channel/instance:", - "setup_question3": "Should ArmCord handle client mods installation?", + "setup_question3": "Should Legcord handle client mods installation?", "yes": "Yes", "no": "No", "next": "Next", "setup_question4": "Select a client mod you want to install:", "setup_question5": "Do you want to use a tray icon?", - "settings-theme": "ArmCord theme", - "settings-theme-desc1": "ArmCord \"themes\" manage apps behaviour and looks.", - "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.", - "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-theme-desc4": "transparent window with native titlebar, you need a compatible theme to run this.", - "settings-theme-default": "Default", + "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)", "settings-theme-native": "Native", + "settings-theme-overlay": "Overlay", + "settings-autoHideMenuBar": "Auto-hide menu bar", + "settings-autoHideMenuBar-desc": "Auto-hide menu bar when not in use.", + "settings-sleepInBackground": "Sleep in background", + "settings-sleepInBackground-desc": "Enables Chromiums background throttling. This can help save battery life but also breaks notifications.", + "settings-transparency": "Transparency", + "settings-transparency-desc": "Set the transparency mode Legcord uses.", + "settings-transparency-universal": "Universal", + "settings-transparency-modern": "Modern", "settings-theme-transparent": "Transparent", - "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.", + "settings-transparency-tahoe-warning": "Transparency may cause excessive lag on MacOS 26 Tahoe.", + "settings-material": "Window Material", + "settings-material-desc": "Set the Windows background material Legcord uses.", + "settings-material-mica": "Mica", + "settings-material-mica-alt": "Mica Alt", + "settings-material-acrylic": "Acrylic", + "settings-material-none": "None", + "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", + "settings-venmic-workaround-desc": "Enable or disable workaround for an issue that causes the microphone to be shared instead of the correct audio.", + "settings-venmic-deviceSelect": "Device Select", + "settings-venmic-deviceSelect-desc": "Allow selecting an audio device.", + "settings-venmic-granularSelect": "Granular Select", + "settings-venmic-granularSelect-desc": "Allow selecting an audio input source.", + "settings-venmic-ignoreVirtual": "Ignore Virtual Devices", + "settings-venmic-ignoreVirtual-desc": "Ignore virtual audio devices.", + "settings-venmic-ignoreDevices": "Ignore Devices", + "settings-venmic-ignoreDevices-desc": "Ignore specific audio devices.", + "settings-venmic-ignoreInputMedia": "Ignore Input Media", + "settings-venmic-ignoreInputMedia-desc": "Ignore audio input from media sources.", + "settings-venmic-onlySpeakers": "Only Speakers", + "settings-venmic-onlySpeakers-desc": "Only use speakers for audio selection.", + "settings-venmic-onlyDefaultSpeakers": "Only Default Speakers", + "settings-venmic-onlyDefaultSpeakers-desc": "Only use the default speakers for audio selection.", + "settings-audio": "Audio", + "settings-audio-desc": "Select which method Legcord uses to grab audio from your system during screenshare.", + "settings-openCustomIconDialog": "Set desktop icon", "settings-mintoTray": "Work in background", - "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-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-startMinimized": "Start minimized", - "settings-startMinimized-desc": "ArmCord starts in background and remains out of your way.", + "settings-startMinimized-desc": "Legcord starts in background and remains out of your way.", + "settings-csp": "Content Security Policy", + "settings-csp-desc": "Set the strictness of Legcord's Content Security Policy. Strict CSP provides better security but may cause compatibility issues with some client mods/themes/plugins.", + "settings-csp-strict": "Strict", + "settings-csp-none": "None", + "settings-csp-vanilla": "Vanilla", + "settings-firstTimeCrash": "We're setting things up for you!", + "settings-firstTimeCrash-desc": "Settings are not available on a first-time launch. Please use a button below to restart and settings should be ready after the restart.", + "settings-useSystemCssEditor": "Use system CSS editor", + "settings-useSystemCssEditor-desc": "Use system CSS editor to edit CSS.", "settings-MultiInstance": "Multi Instance", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of ArmCord.", - "settings-patches": "Automatic Patches", - "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-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-MultiInstance-desc": "When enabled you'll be able to start up many instances of Legcord.", + "settings-noBundleUpdates": "No bundle updates", + "settings-noBundleUpdates-desc": "Disables automatic updates for client mods.", + "settings-automaticClientUpdates": "Automatic client updates", + "settings-automaticClientUpdates-desc": "Disables automatic Legcord updates", + "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", - "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-dynamicIcon": "Dynamic icon", - "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-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-spellcheck": "Spellcheck", "settings-spellcheck-desc": "Helps you correct misspelled words by highlighting them.", - "settings-tray": "Tray", - "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-vaapi": "VAAPI", + "settings-vaapi-desc": "Use VAAPI (HW acceleration) for video decoding on Linux. This greatly reduces CPU usage during screenshare but may cause issues on some systems. Disable if you experience crashes or black screens during screenshare.", "settings-channel": "Discord channel", - "settings-channel-desc1": "You can use this setting to change current instance of Discord:", - "settings-channel-desc2": "you're probably most familiar with this one. It's the one you see in default Discord\n client!", - "settings-channel-desc3": "this is alpha test release of Discord. By using it you gain access to the newest\n features and fixes.", - "settings-channel-desc4": "public test build. Receives features earlier than stable but is a bit older than Canary.", - "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-channel-desc": "Use this setting to change current instance of Discord that Legcord is running.", + "settings-bitrateMin": "Minimum bitrate", + "settings-bitrateMin-desc": "Minimum bitrate for screenshare.", + "settings-bitrateMax": "Maximum bitrate", + "settings-bitrateMax-desc": "Maximum bitrate for screenshare.", + "settings-bitrateTarget": "Target bitrate", + "settings-bitrateTarget-desc": "Target bitrate for screenshare.", + "settings-invitewebsocket": "Rich Presence", + "settings-invitewebsocket-desc": "Uses arRPC to support Discord RPC (Rich Presence) with local programs on your machine.", + "settings-useMacSystemPicker": "Use macOS system picker", + "settings-useMacSystemPicker-desc": "Use native macOS screenshare when possible. macOS 15+ only", + "settings-additionalArguments": "Additional arguments", + "settings-additionalArguments-desc": "Additional arguments are extra commands that you can pass to Legcord. They can be used to enable or disable features, or to fix issues.", "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-mod-shelter": "is a new generation client mod built to be essentially bulletproof.", + "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-mod-shelter": "Shelter", + "settings-mod-custom": "Custom", + "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-prfmMode": "Performance mode", - "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-prfmMode-desc": "Performance Mode is an experimental feature in Legcord designed to optimize responsiveness and performance based on your needs. The impact may vary depending on your hardware and usage, so we encourage you to try each mode to determine which works best for you.", "settings-prfmMode-performance": "Performance", "settings-prfmMode-battery": "Battery", + "settings-prfmMode-dynamic": "Dynamic", "settings-prfmMode-vaapi": "VAAPI", "settings-disableAutogain": "Disable autogain", "settings-disableAutogain-desc": "Disables autogain.", + "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-trayIcon": "Tray icon", "settings-trayIcon-desc": "Set the icon which will appear in tray menu.", + "settings-trayIcon-disabled": "Disable the tray", "settings-trayIcon-dynamic": "Dynamic", "settings-trayIcon-normal": "Discord Icon", "settings-trayIcon-classic": "Classic Discord Icon", @@ -76,11 +141,210 @@ "settings-experimental": "Experimental", "settings-restart": "Restart App", "settings-updater": "Check for updates", - "settings-skipSplash": "Skip Splash Screen (Experimental)", - "settings-skipSplash-desc": "Skips ArmCord splash screen when you start up the app.", + "settings-skipSplash": "Skip Splash Screen", + "settings-skipSplash-desc": "Skips Legcord splash screen when you start up the app.", "settings-copyDebugInfo": "Copy Debug Info", "settings-copyGPUInfo": "Copy GPU Info", + "settings-clearClientModCache": "Clear client mod cache", "settings-forceNativeCrash": "Force native crash", "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} \ No newline at end of file + "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-quickCss": "Quick CSS", + "settings-quickCss-desc": "Quickly edit your CSS in a simple text editor. Changes are applied immediately after saving the file.", + "settings-category-lookAndFeel": "Look and feel", + "settings-category-mods": "Mods", + "settings-category-behaviour": "Behaviour", + "settings-category-legacy": "Legacy features", + "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-extendedPluginAbilities": "Extended plugin abilities", + "settings-extendedPluginAbilities-desc": "Allows plugins to read and write files in a scoped folder on your computer (e.g. for caching deleted messages). Only enable for plugins you trust—they can store data locally. Data is stored per plugin in Legcord's plugin-storage folder.", + "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-pushToTalk": "Push to talk", + "keybind-leaveCall": "Leave call", + "keybind-navigateForward": "Navigate forward", + "keybind-navigateBack": "Navigate back", + "keybind-runJavascript": "Run Javascript", + "keybind-openQuickCss": "Open Quick CSS", + "keybind-openSettings": "Open Settings", + "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", + "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.", + "games-lastDetected": "Last detected games", + "games-lastDetectedEmpty": "No games detected yet. Start a game with rich presence to see them here.", + "games-blacklist": "Blacklist", + "games-blacklisted": "Blacklisted games", + "games-blacklistedEmpty": "No blacklisted games.", + "games-removeFromBlacklist": "Remove", + "games-application": "Application", + "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", + "backup-dialogSave-title": "Save Legcord backup", + "backup-dialogOpen-title": "Open Legcord backup", + "backup-pageTitle": "Backup and restore", + "backup-pageSubtitle": "Save or restore your Legcord setup, including settings, themes, plugins, and mod data—all in one file.", + "backup-createBackup": "Create backup", + "backup-restore": "Restore", + "backup-modalTitle": "Choose what goes into this backup", + "backup-includeLegcordConfig": "Settings", + "backup-includeLegcordThemes": "Themes and Quick CSS", + "backup-includeLegcordPlugins": "Chrome extensions/Plugin storage", + "backup-includeVencord": "Vencord data (current session)", + "backup-includeEquicord": "Equicord data (current session)", + "backup-includeShelter": "Shelter plugins", + "backup-includeModBundles": "Downloaded client mod files (Vencord, Equicord, Shelter, custom bundles)", + "backup-confirmBackup": "Export", + "backup-successTitle": "Backup saved", + "backup-successBody": "Your backup has been saved successfully.", + "backup-cancelledTitle": "Cancelled", + "backup-cancelledBody": "No file was saved.", + "backup-failedTitle": "Backup failed", + "backup-invalidFile": "Could not read that backup file.", + "backup-unknownError": "Something went wrong.", + "backup-restoreConfirmHeader": "Restore from backup?", + "backup-restoreConfirmBody": "Files on disk will be replaced where this backup contains data. You may need to restart Legcord for everything to apply.", + "backup-restoreConfirm": "Restore", + "backup-restoreCancel": "Cancel", + "backup-restoreDoneTitle": "Restore complete", + "backup-restoreDoneBody": "Your data has been restored. Restart Legcord for all changes to take effect.", + "supportBanner-title": "Support the Project", + "supportBanner-subtitle": "Help us continue developing Legcord. Your support keeps the project alive and lets us ship more features.", + "supportBanner-donate": "Donate" +} diff --git a/assets/lang/es-419.json b/assets/lang/es-419.json deleted file mode 100644 index 11a54bd..0000000 --- a/assets/lang/es-419.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_start": "Cargando ArmCord…", - "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 ArmCord está disponible. Por favor actualiza a la última version.", - "setup_question1": "Bienvenido a la instalación de ArmCord", - "yes": "Sí", - "setup_question2": "Escoge tu version de Discord:", - "setup_question3": "Dejar que ArmCord 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 ArmCord.", - "no": "No", - "next": "Siguiente", - "setup_question4": "Selecciona una modificación que te gustaría instalar:", - "settings-theme": "Tema de ArmCord", - "settings-theme-default": "Por Defecto", - "settings-theme-native": "Nativa", - "settings-tray": "Bandeja", - "settings-patches": "Automatizar Parches", - "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-theme-desc1": "Los \"temas\" de ArmCord se encargan del comportamiento de la aplicación y como se ve", - "settings-theme-desc2": "así es como ArmCord se ve cuando lo cargas por primera vez. Incluye una recreación de la ventana de Discord\n , y estilos personalizados inyectados dentro de la aplicación.", - "settings-theme-desc3": "usa la ventana nativa del sistema operativo que estás usando (p. ej. Windows 7/10. Funciona parecido\n a la aplicación de Discord en Linux.", - "settings-csp-desc": "ArmCord 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, ArmCord se cerrá como cualquier otra ventana, de lo contrario, ArmCord se minimizará a la bandeja de la sistema.", - "settings-patches-desk": "Busca parches automáticos distribuídos si la versión publicada tiene fallas. En general\n no tendrás que mantener esto habilitado constantemente (a menos que se solicite en el Discord de soporte de ArmCord).", - "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-channel-desc1": "Puedes usar esta opción para cambiar la versión de Discord actual:", - "settings-channel-desc2": "¡quizás este te es familiar. Es el que ves en la aplicación normal de\n Discord!", - "settings-channel-desc3": "ésta es la versión alfa de prueba. Al usarlo, accedes a las más nuevas\n características y arreglos para Discord.", - "settings-channel-desc4": "Versión Pública de Prueba (PTB). Recibe características nuevas antes que la versíon normal, pero es más viejo que Canary.", - "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-shelter": "es una nueva generación de programa construido para ser esencialmente a prueba de balas.", - "settings-prfmMode-desc": "El modo de rendimiento es una función experimental que puede aumentar la capacidad de respuesta y el rendimiento de\nArmCord 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 ArmCord al cargar la aplicación.", - "settings-copyDebugInfo": "Copiar Información de Depuración", - "settings-startMinimized": "Cargar minimizado", - "settings-startMinimized-desc": "ArmCord 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-dynamicIcon": "Icono dinámico", - "settings-dynamicIcon-desc": "Imitando el comportamiento de Discord en Windows, esto muestra el número de mensajes/pings no leídos sobre el icono de ArmCord en lugar de en la bandeja.", - "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á ArmCord como cualquier otra ventana, de lo contrario, se cerrá ArmCord a la bandeja de la sistema para más tarde.", - "settings-theme-desc4": "ventana transparente con barra de tareas nativa, necesitarás un tema compatible para ello. Exclusivo de Windows.", - "settings-MultiInstance": "Varias instancias", - "settings-MultiInstance-desc": "Cuando se activa permite iniciar varias instancias de ArmCord.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} diff --git a/assets/lang/es.json b/assets/lang/es.json new file mode 100644 index 0000000..73e729c --- /dev/null +++ b/assets/lang/es.json @@ -0,0 +1,3 @@ +{ + "loading_screen_start": "Iniciando Legcord…" +} diff --git a/assets/lang/es_419.json b/assets/lang/es_419.json new file mode 100644 index 0000000..84674ae --- /dev/null +++ b/assets/lang/es_419.json @@ -0,0 +1,302 @@ +{ + "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.", + "settings-openCustomIconDialog": "Establecer icono de escritorio", + "settings-csp-desc": "Legcord CSP es nuestro sistema que gestiona la carga de contenido personalizado en la aplicación Discord. Elementos como los mods y los temas del cliente dependen de él. Desactívalo si quieres deshacerte de los mods y los estilos personalizados.", + "settings-mintoTray": "Trabajar en segundo plano", + "settings-mintoTray-desc": "Cuando está desactivado, Legcord se cerrará como cualquier otra ventana al cerrarlo; de lo contrario, permanecerá en la bandeja del sistema para su uso posterior.", + "settings-startMinimized": "Iniciar minimizado", + "settings-startMinimized-desc": "Legcord se inicia en segundo plano y no interfiere en tu trabajo.", + "settings-useSystemCssEditor": "Utilizar el editor CSS del sistema", + "settings-useSystemCssEditor-desc": "Utilice el editor CSS del sistema para editar CSS.", + "settings-MultiInstance": "Múltiples instancias", + "settings-MultiInstance-desc": "Cuando está activado, podrás iniciar muchas instancias de Legcord.", + "settings-noBundleUpdates": "Sin actualizaciones de paquetes", + "settings-noBundleUpdates-desc": "Desactiva las actualizaciones automáticas para los mods del cliente.", + "settings-hardwareAcceleration": "Aceleración por hardware", + "settings-hardwareAcceleration-desc": "La aceleración por hardware usa la GPU para que Legcord funcione más rápido. Si experimentas fallos visuales, prueba desactivando esta opción.", + "settings-processScanning": "Escaneo de procesos", + "settings-processScanning-desc": "Permite escanear los juegos en ejecución para mejorar la detección de Presencia Enriquecida.", + "settings-windowsLegacyScanning": "Escaneo heredado de Windows", + "settings-windowsLegacyScanning-desc": "Utiliza el método heredado para los procesos de escaneo en Windows (antes de la versión 1.1.6). Puede mejorar la compatibilidad en algunos sistemas, pero es menos eficiente.", + "settings-scanInterval": "Intervalo de escaneo (ms)", + "settings-scanInterval-desc": "Establece la frecuencia (en milisegundos) con la que se realiza el proceso de escaneo. Los valores más bajos mejoran la velocidad de detección, pero pueden aumentar el uso de la CPU.", + "settings-blockPowerSavingInVoiceChat": "Bloquear el ahorro de energía en el chat de voz", + "settings-blockPowerSavingInVoiceChat-desc": "Evita que Legcord se suspenda. Mantiene el sistema activo, pero permite apagar la pantalla.", + "settings-mobileMode": "Modo celular", + "settings-mobileMode-desc": "Si utilizas un dispositivo con pantalla táctil, ¡esta función es para ti! Activa el modo móvil oculto de Discord, diseñado para teléfonos y tabletas. La única función importante que falta es la compatibilidad con el chat de voz. Es ideal para\n usuarios de PinePhone y similares.", + "settings-spellcheck": "Corrector ortográfico", + "settings-spellcheck-desc": "Te ayuda a corregir las palabras mal escritas resaltándolas.", + "settings-channel": "Canal de Discord", + "settings-channel-desc": "Utilice esta configuración para cambiar la instancia actual de Discord que está ejecutando Legcord.", + "settings-bitrateMin": "Bitrate mínimo", + "settings-bitrateMin-desc": "La cantidad mínima de bitrate para compartir pantalla.", + "settings-bitrateMax": "Bitrate máximo", + "settings-bitrateMax-desc": "La cantidad máxima de bitrate para compartir pantalla.", + "settings-bitrateTarget": "Bitrate promedio", + "settings-bitrateTarget-desc": "La cantidad de bitrate promedio para compartir pantalla.", + "settings-invitewebsocket": "Presencia Enriquecida", + "settings-invitewebsocket-desc": "Utiliza arRPC para admitir Discord RPC (Presencia Enriquecida) con programas locales de tu dispositivo.", + "settings-useMacSystemPicker": "Usar selector del sistema de macOS", + "settings-useMacSystemPicker-desc": "Utilice la función nativa de compartir pantalla de macOS siempre que sea posible. Solo macOS 15+", + "settings-additionalArguments": "Argumentos adicionales", + "settings-additionalArguments-desc": "Los argumentos adicionales son comandos extra que puedes pasar a Legcord. Se pueden utilizar para habilitar o deshabilitar funciones, o para solucionar problemas.", + "settings-mod": "Mod de cliente", + "settings-mod-desc1": "Los mods de cliente son programas que permiten personalizar tu experiencia de Discord. Pueden cambiar la apariencia del cliente, modificar comportamientos o añadir funciones nuevas!", + "settings-mod-vencord": "Mod de cliente, ligero y fácil de usar. Cuenta con una tienda integrada para complementos.", + "settings-mod-equicord": "Bifurcado y creado a partir de colaboradores de vencord, con un cliente bastante rico en complementos.", + "settings-prfmMode": "Modo rendimiento", + "settings-prfmMode-desc": "El modo de rendimiento es una función experimental de Legcord diseñada para optimizar la capacidad de respuesta y el rendimiento en función de tus necesidades. El impacto puede variar en función de tu hardware y uso, por lo que te recomendamos que pruebes cada modo para determinar cuál te conviene más.", + "settings-prfmMode-performance": "Rendimiento", + "settings-prfmMode-battery": "Batería", + "settings-prfmMode-dynamic": "Dinámico", + "settings-prfmMode-vaapi": "VAAPI", + "settings-disableAutogain": "Desactivar ganancia automática", + "settings-disableAutogain-desc": "Desactiva el aumento automático de volumen.", + "settings-disableHttpCache": "Desactivar el caché HTTP", + "settings-disableHttpCache-desc": "Desactiva la caché HTTP de Chromium. Actívela si los mods del cliente no se cargan correctamente.", + "settings-category-mods": "Mods", + "setup-modSelectorTitle": "Elija su mod de cliente", + "setup-modSelectorSubtitle": "Legcord incluye Shelter desde el primer momento, pero también puedes elegir otro mod de cliente si lo deseas.", + "settings-trayIcon": "Icono de la bandeja", + "settings-trayIcon-desc": "Configure el ícono que aparecerá en el menú de la bandeja.", + "settings-trayIcon-disabled": "Desactivar la bandeja", + "settings-trayIcon-dynamic": "Dinámico", + "settings-trayIcon-normal": "Ícono de Discord", + "settings-trayIcon-classic": "Ícono clásico de Discord", + "settings-advanced": "Zona de usuario avanzado", + "settings-pluginsFolder": "Abrir carpeta de plugins", + "settings-crashesFolder": "Abrir carpeta nativa de fallos", + "settings-themesFolder": "Abrir carpeta de temas", + "settings-storageFolder": "Abrir carpeta de almacenamiento", + "settings-none": "Ninguno", + "settings-save": "Guardar configuración", + "settings-experimental": "Experimental", + "settings-restart": "Reiniciar aplicación", + "settings-updater": "Buscar actualizaciones", + "settings-skipSplash": "Omitir pantalla de inicio", + "settings-skipSplash-desc": "Omite la pantalla de inicio de Legcord al iniciar la aplicación.", + "settings-copyDebugInfo": "Copiar información de depuración", + "settings-copyGPUInfo": "Copiar información de la GPU", + "settings-clearClientModCache": "Borrar caché del mod de cliente", + "settings-forceNativeCrash": "Forzar bloqueo nativo", + "settings-smoothScroll": "Usar desplazamiento suave", + "settings-smoothScroll-desc": "Alternar desplazamiento suave", + "settings-autoScroll": "Permitir desplazamiento automático", + "settings-autoScroll-desc": "Permite el desplazamiento automático con el clic central (Nota: Tu entorno de escritorio aún puede anular esto con otra acción.)", + "settings-category-lookAndFeel": "Apariencia", + "settings-category-behaviour": "Comportamiento", + "settings-category-legacy": "Características heredadas", + "settings-category-debug": "Opciones de depuración", + "menu-about": "Acerca de Legcord", + "menu-developerTools": "Herramientas de desarrollador", + "menu-openSettings": "Abrir configuración", + "menu-reload": "Recargar", + "menu-restart": "Reiniciar", + "menu-quit": "Salir", + "menu-edit": "Editar", + "menu-undo": "Deshacer", + "menu-redo": "Rehacer", + "menu-cut": "Cortar", + "menu-copy": "Copiar", + "menu-paste": "Pegar", + "menu-selectAll": "Seleccionar todo", + "menu-view": "Ver", + "menu-toggleFullscreen": "Alternar pantalla completa", + "menu-zoomIn": "Acercar", + "menu-zoomOut": "Alejar", + "menu-resetZoom": "Reiniciar zoom", + "menu-window": "Ventana", + "menu-minimize": "Minimizar", + "menu-close": "Cerrar", + "menu-keybind": "Atajos del teclado", + "menu-legcord": "Legcord", + "tray-openLegcord": "Abrir Legcord", + "tray-openSettings": "Abrir configuración", + "tray-supportServer": "Servidor de Discord de soporte", + "tray-restartLegcord": "Reiniciar Legcord", + "tray-quitLegcord": "Salir de Legcord", + "tray-tooltip": "Legcord", + "dialog-openUrl-title": "¿Desea abrir este enlace?", + "dialog-openUrl-message": "¿Desea abrir {url}?", + "dialog-openUrl-detail": "Se ha detectado que esta URL no utiliza los protocolos normales del navegador. Esto podría significar que esta URL conduce a un programa local en su computadora. ¡Compruebe si lo reconoce antes de continuar!", + "dialog-openUrl-checkbox": "Recordar mi elección e ignorar esta advertencia en futuras sesiones", + "dialog-openUrl-yes": "Sí, por favor", + "dialog-openUrl-no": "No, no lo creo", + "title-unreadMessages": "Tienes algunos mensajes sin leer.", + "title-legcordSuffix": " - Legcord", + "dialog-importTheme-title": "Selecciona el tema que desea importar", + "dialog-importTheme-button": "Importar", + "dialog-importTheme-discordStyles": "Estilos de Discord", + "dialog-importTheme-allFiles": "Todos los archivos", + "dialog-customIcon-filters": "Íconos", + "config-corrupted-title": "Vaya, algo salió mal.", + "config-corrupted-message": "Legcord detectó que el archivo de configuración está dañado, reinicie la aplicación y vuelva a configurar los ajustes. Si el problema persiste, repórtelo en el servidor de soporte/GitHub.", + "setup-welcomeTitle": "Bienvenido a Legcord", + "setup-welcomeSubtitle": "Vamos a elegir la configuración ideal para ti.", + "setup-getStarted": "Comenzar", + "setup-windowStyle-nativeTitle": "Ventana nativa", + "setup-windowStyle-nativeDesc": "Utilice las decoraciones de ventana predeterminadas de su sistema", + "setup-windowStyle-customTitle": "Barra de título personalizada", + "setup-windowStyle-customDesc": "Utiliza el diseño personalizado de la barra de título de Legcord", + "setup-chooseWindowStyle": "Elija el estilo de ventana", + "setup-selectAppearance": "Seleccione cómo desea que Legcord aparezca en su máquina", + "setup-systemTray": "Bandeja del sistema", + "setup-trayChoose": "Elija si desea habilitar el ícono de la bandeja del sistema", + "setup-trayEnableTitle": "Habilitar ícono en bandeja", + "setup-trayEnableDesc": "Mostrar Legcord en la bandeja del sistema", + "setup-trayDisableTitle": "Desactivar ícono en bandeja", + "setup-trayDisableDesc": "No mostrar Legcord en la bandeja del sistema", + "setup-linuxTrayWarning": "La funcionalidad de la bandeja del sistema puede presentar problemas o comportamientos distintos en sistemas Linux.", + "setup-finishTitle": "¡Ya está todo listo!", + "setup-finishSubtitle": "La configuración de Legcord está completa y personalizada según sus preferencias.", + "setup-finishSettingsNote": "¿Necesitas hacer cambios más adelante? Encontrarás todas estas opciones en el menú de configuración de Discord, en Legcord.", + "setup-launchLegcord": "Iniciar Legcord", + "setup-vencordTitle": "Vencord", + "setup-vencordDesc": "Mod de cliente con temas y plugins.", + "setup-equicordTitle": "Equicord", + "setup-equicordDesc": "Una bifurcación de Vencord con más plugins.", + "setup-useShelterOnly": "Usar Shelter únicamente", + "setup-back": "Atrás", + "setup-next": "Siguiente", + "setup-stepOf": "Paso {current} de {total}", + "setup-loading": "Cargando...", + "setup-windowTitle": "Configuración de Legcord", + "settings-restartRequired": "Se requiere reiniciar", + "settings-restartRequiredBody": "Es necesario reiniciar para aplicar estos cambios.", + "settings-restartLater": "Lo haré más tarde", + "settings-theme-legacy": "Legacy", + "settings-channel-stable": "Estable", + "settings-channel-canary": "Canary", + "settings-channel-ptb": "PTB", + "settings-category-powerManagement": "Administración de energía", + "settings-category-arrpc": "arRPC", + "settings-extendedPluginAbilities": "Capacidad ampliada de los plugins", + "settings-extendedPluginAbilities-desc": "Permite a los plugins leer y escribir archivos en una carpeta específica de tu computadora (por ejemplo, para almacenar en caché los mensajes eliminados). Activa esta opción solo para los plugins en los que confías, ya que pueden almacenar datos localmente. Los datos se almacenan por plugin en la carpeta de almacenamiento de plugins de Legcord.", + "settings-trayIcon-colored-plug": "Colorido", + "settings-trayIcon-white-plug": "Blanco", + "settings-trayIcon-white-plug-alt": "Blanco (Alternativo)", + "settings-trayIcon-black-plug": "Negro", + "settings-trayIcon-black-plug-alt": "Negro (Alternativo)", + "settings-audio-loopback": "Loopback", + "settings-audio-loopbackWithMute": "Loopback con silencio", + "keybind-addKeybind": "Añadir asignación de teclas", + "keybind-accelerator": "Acelerador", + "keybind-invalidCombo": "Esta combinación de teclas no es válida o no es compatible.", + "keybind-recording": "Grabando", + "keybind-record": "Grabar", + "keybind-action": "Acción", + "keybind-mute": "Silenciar", + "keybind-deafen": "Ensordecer", + "keybind-leaveCall": "Dejar llamada", + "keybind-navigateForward": "Avanzar", + "keybind-navigateBack": "Volver atrás", + "keybind-runJavascript": "Ejecutar Javascript", + "keybind-openQuickCss": "Abre CSS rápido", + "keybind-globalNote": "Le permite asignar un atajo de teclado específico que se puede utilizar en diferentes aplicaciones y programas.", + "keybind-global": "Global", + "keybind-enabled": "Habilitado", + "keybind-jsCode": "Código de Javascript", + "keybind-add": "Añadir", + "keybind-delete": "Eliminar", + "detectable-missingFields": "Campos faltantes", + "detectable-fillAllFields": "Rellene todos los campos antes de añadir.", + "detectable-addApp": "Agregar aplicación detectable", + "contextMenu-searchDuckDuckGo": "Buscar con DuckDuckGo", + "detectable-appName": "Nombre de la aplicación*", + "detectable-appId": "ID de la aplicación*", + "detectable-themes": "Temas", + "detectable-aliases": "Alias", + "detectable-enabled": "Habilitado", + "detectable-placeholderName": "Por ejemplo, Discord", + "detectable-placeholderId": "Por ejemplo, 1234567890", + "detectable-placeholderThemes": "Acción, Aventura", + "detectable-placeholderAliases": "Alias1, Alias2", + "themes-success": "¡Éxito!", + "themes-updated": "¡Tema actualizado correctamente!", + "themes-bdInstalled": "¡Tema de BD instalado correctamente!", + "themes-delete": "Eliminar", + "themes-edit": "Editar", + "themes-update": "Actualizar", + "themes-open": "Abrir", + "themes-by": "por", + "themes-openQuickCss": "Abrir archivo Quick CSS", + "themes-importFromFile": "importar desde archivo", + "themes-openThemesFolder": "Abrir carpeta de temas", + "themes-import": "Importar", + "themes-importUrlPlaceholder": "https://raw.githubusercontent.com/... [.theme.css]", + "games-registeredGames": "Juegos registrados", + "games-refreshList": "Actualizar lista", + "games-add": "Añadir", + "games-remove": "Eliminar", + "games-removeConfirmHeader": "¿Eliminar el juego?", + "games-removeConfirmBody": "Este juego se eliminará de la presencia enriquecida. Es necesario reiniciar el cliente para que los cambios surtan efecto.", + "games-noExecutables": "No hay ejecutables", + "games-empty": "No hay juegos registrados. Añade uno utilizando el menú desplegable de arriba.", + "screenshare-selectSource": "Seleccione una fuente", + "screenshare-share": "Compartir", + "screenshare-title": "Compartir pantalla", + "contextMenu-searchGoogle": "Buscar con Google", + "touchbar-servers": "Servidores", + "splash-title": "Legcord", + "screenshare-venmicDisabled": "Venmic desactivado", + "settings-quickCss": "CSS rápido", + "settings-quickCss-desc": "Edita rápidamente tu CSS en un sencillo editor de texto. Los cambios se aplican inmediatamente después de guardar el archivo.", + "keybind-pushToTalk": "Presionar para hablar", + "games-lastDetected": "Últimos juegos detectados", + "games-lastDetectedEmpty": "Aún no se han detectado juegos. Inicie un juego con presencia enriquecida para verlos aquí.", + "games-blacklist": "Lista negra", + "games-blacklisted": "Juegos incluidos en la lista negra", + "games-blacklistedEmpty": "No hay juegos en la lista negra.", + "games-removeFromBlacklist": "Eliminar", + "games-application": "Aplicación", + "settings-vaapi": "VAAPI", + "settings-vaapi-desc": "Utiliza VAAPI (aceleración por hardware) para la decodificación de vídeo en Linux. Esto reduce considerablemente el uso de la CPU durante el uso compartido de pantalla, pero puede causar problemas en algunos sistemas. Desactívalo si experimentas bloqueos o pantallas en negro durante el uso compartido de pantalla." +} diff --git a/assets/lang/fa-IR.json b/assets/lang/fa-IR.json deleted file mode 100644 index 252c8a1..0000000 --- a/assets/lang/fa-IR.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_start": "درحال پیاده سازی ArmCord…", - "loading_screen_offline": "به نظر می‌رسد شما آفلاین هستید. لطفا به اینترنت متصل شده و سپس دوباره تلاش کنید.", - "loading_screen_update": "نسخه جدید ArmCord در دسترس است. لطفا به آخرین نسخه بروزرسانی کنید.", - "setup_question1": "به برپایی ArmCord خوش آمدید", - "setup_offline": "به نظر می‌رسد شما آفلاین هستید. لطفا به اینترنت وصل شده و سپس ArmCord را مجددا راه‌اندازی کنید.", - "setup_question2": "کانال/نمونه دیسکورد خود را انتخاب کنید:", - "setup_question3": "آیا میخواهید ArmCord تغییرات کلاینت را خودکار اعمال کند؟", - "yes": "بله", - "no": "خیر", - "next": "بعدی", - "setup_question4": "نوع اصلاح‌ساز برنامه که میخواهید نصب کنید انتخاب کنید:", - "settings-theme": "تم ArmCord", - "settings-theme-default": "پیش‌فرض", - "settings-theme-native": "محلی", - "settings-tray": "سینی", - "settings-patches": "اعمال تغییرات به صورت خودکار", - "settings-channel": "کانال دیسکورد", - "settings-invitewebsocket": "حضور غنی (تجربی)", - "settings-mod": "نوع اصلاح‌ساز کلاینت", - "settings-prfmMode": "حالت عملکرد", - "settings-prfmMode-performance": "قدرت بیشتر", - "settings-prfmMode-battery": "ذخیره برای باتری", - "settings-none": "هیچکدام", - "settings-save": "ذخیره تنظیمات", - "settings-updater": "بررسی برای بروزرسانی", - "settings-mobileMode": "حالت موبایل", - "settings-theme-desc1": "\"تم‌های\" 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.", - "settings-tray-desc": "زمانی که غیرفعال است، ArmCord مانند هر پنجره دیگری بسته می شود، در غیر این صورت در سینی سیستم شما می نشیند و برای بعداً نگه می‌دارد.", - "settings-patches-desk": "Fetches automatic patches that are distributed if release turns out to have bugs after release. Usually\n you don't have to keep this enabled, unless notified in support Discord.", - "settings-channel-desc4": "ساخت تست عمومی. ویژگی‌ها را زودتر از پایدار دریافت می کند اما کمی قدیمی تر از قناری است.", - "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-theme-desc3": "از نوار عنوان اصلی سیستم عاملی که در حال حاضر در حال اجرا هستید استفاده می کند (مثلاً ویندوز 7/10). عملکرد بیشتری دارد\n شبیه به برنامه اصلی دیسکورد در لینوکس.", - "settings-csp-desc": "ArmCord 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-channel-desc1": "می توانید از این تنظیم برای تغییر نمونه فعلی دیسکورد استفاده کنید:", - "settings-channel-desc2": "you're probably most familiar with this one. It's the one you see in default Discord\n client!", - "settings-channel-desc3": "this is alpha test release of Discord. By using it you gain access to the newest\n features and fixes.", - "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-mod-shelter": "is a new generation client mod built to be essentially bulletproof.", - "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-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 ArmCord splash screen when you start up the app.", - "settings-copyDebugInfo": "کپی اطلاعات اشکال‌زدایی", - "settings-startMinimized": "مینیمایز شده شروع شود", - "settings-startMinimized-desc": "ArmCord در پس‌زمینه شروع می شود و در سرراه شما باقی می ماند.", - "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-dynamicIcon": "آیکون پویا", - "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-spellcheck": "بررسی املا", - "settings-spellcheck-desc": "با برجسته کردن کلمات غلط املایی به شما کمک می کند آنها را تصحیح کنید.", - "setup_question5": "آیا می خواهید از آیکون سینی استفاده کنید؟", - "settings-mintoTray": "به سینی مینیمایز کنید", - "settings-mintoTray-desc": "هنگامی که غیرفعال است، ArmCord مانند هر پنجره دیگری بسته می شود، در غیر این صورت می نشیند و\n در سینی سیستم خود را برای بعدا استراحت می‌کند.", - "settings-theme-desc4": "پنجره شفاف با نوار عنوان بومی، برای اجرای آن به یک تم سازگار نیاز دارید. فقط ویندوز.", - "settings-MultiInstance": "چند نمونه", - "settings-MultiInstance-desc": "وقتی فعال باشد، می‌توانید بسیاری از نمونه‌های ArmCord را راه‌اندازی کنید.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} 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-FI.json b/assets/lang/fi-FI.json deleted file mode 100644 index 904b77b..0000000 --- a/assets/lang/fi-FI.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "yes": "Kyllä", - "no": "Ei", - "settings-theme": "ArmCord-teema", - "settings-patches": "Automatic Patches", - "settings-spellcheck-desc": "Helps you correct misspelled words by highlighting them.", - "settings-channel": "Discord-kanava", - "settings-channel-desc1": "You can use this setting to change current instance of Discord:", - "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 ArmCord…", - "loading_screen_offline": "Vaikuttaa siltä, ettet ole yhteydessä verkkoon. Yhdistä Internetiin ja yritä uudelleen.", - "loading_screen_update": "Uusi versio ArmCordista on saatavilla. Päivitä uusimpaan versioon.", - "setup_offline": "Vaikuttaa siltä, ettet ole yhteydessä verkkoon. Yhdistä Internetiin ja käynnistä ArmCord uudelleen.", - "setup_question2": "Valitse Discord-kanava/-instanssi:", - "setup_question3": "Pitäisikö ArmCordin käsitellä asiakasmodien asennukset?", - "next": "Seuraava", - "setup_question4": "Valitse asiakasmodi asennettavaksi:", - "settings-theme-desc1": "ArmCord-teemat määrittävät sovelluksen toimintaa ja ulkoasua.", - "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.", - "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-theme-default": "Oletus", - "settings-theme-native": "Natiivi", - "settings-theme-transparent": "Läpinäkyvä (kokeellinen)", - "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.", - "settings-tray": "Pienennä ilmoitusalueelle", - "settings-tray-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-startMinimized": "Käynnistä pienennettynä", - "settings-startMinimized-desc": "ArmCord 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-patches-desk": "Fetches automatic patches that are distributed if release turns out to have bugs after release. Usually\n you don't have to keep this enabled, unless notified in support Discord.", - "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-dynamicIcon": "Dynaaminen kuvake", - "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-spellcheck": "Oikoluku", - "settings-channel-desc2": "you're probably most familiar with this one. It's the one you see in default Discord\n client!", - "settings-channel-desc3": "this is alpha test release of Discord. By using it you gain access to the newest\n features and fixes.", - "settings-channel-desc4": "public test build. Receives features earlier than stable but is a bit older than Canary.", - "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-mod-shelter": "is a new generation client mod built to be essentially bulletproof.", - "settings-prfmMode": "Suorituskykytila", - "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-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 ArmCord 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, 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-desc4": "transparent window with native titlebar, you need a compatible theme to run this. Windows only.", - "settings-MultiInstance": "Multi Instance", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of ArmCord.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} 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-FR.json b/assets/lang/fr-FR.json deleted file mode 100644 index 704ceab..0000000 --- a/assets/lang/fr-FR.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_start": "Démarrage d'ArmCord…", - "loading_screen_update": "Une nouvelle version d'ArmCord est disponible. Merci de le mettre à jour vers la dernière version.", - "setup_question1": "Bienvenue dans la configuration d'ArmCord", - "setup_question2": "Choisissez votre canal/instance Discord :", - "setup_question3": "ArmCord 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 ArmCord.", - "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": "Thème ArmCord", - "settings-theme-default": "Default", - "settings-theme-native": "Native", - "settings-patches": "Correctifs automatiques", - "settings-invitewebsocket": "Rich Presence (Expérimental)", - "settings-prfmMode": "mode Performance", - "settings-prfmMode-performance": "Performance", - "settings-prfmMode-battery": "Batterie", - "settings-none": "Aucun", - "settings-mobileMode": "mode mobile", - "settings-theme-desc1": "Les \"thèmes\" d'ArmCord gèrent le comportement et l'apparence des applications.", - "settings-channel-desc4": "version d'essai publique. Recevant la fonctionnalité plus tôt que plus stable mais est plus vieux que le Canary.", - "settings-storageFolder": "Ouvrir le dossier de stockage", - "settings-theme-desc2": "voilà à quoi ressemble ArmCord quand vous le lancez pour la première fois. Cela inclut une reconstitution de\n la barre de titre de Discord, ainsi que les styles spécifiques de ArmCord administrés sur Discord.", - "settings-theme-desc3": "utilise la barre de titre native de l'OS que vous faites tourner (e.g Windows 7/10). Fonctionne plus\n similairement à Discord sur Linux.", - "settings-csp-desc": "ArmCord 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": "Quand désactivé, ArmCord se fermera comme une fenêtre classique, autrement il s'assoira et se relaxera\n dans votre plaque système pour plus tard.", - "settings-patches-desk": "Extrait des correctifs distribués si une mise à jour contient des bugs. Normalement\n n'a pas à être activé en continu (sauf si notifié dans le support Discord.)", - "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-channel-desc1": "Vous pouvez utiliser ce paramètre pour changer l'instance actuelle de Discord :", - "settings-channel-desc2": "vous êtes probablement familier avec celui-là. C'est celui que vous voyez sur le client Discord\n par défaut !", - "settings-channel-desc3": "c'est un test de sortie alpha de Dirscord. en l'utilisant vous gagnez l'accès aux dernières\n fonctionnalités et correctifs.", - "settings-invitewebsocket-desc": "Utilise arRPC pour prendre en charge le Discord RPC (Rich Presence) avec des programmes en local. Travail en cours.", - "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-mod-shelter": "est un client de nouvelle génération conçu pour être essentiellement à toutes épreuves.", - "settings-prfmMode-desc": "Le mode performance est expérimental . Il peut améliorer la rapidité ou la performance d'ArmCord 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 (Expérimental)", - "settings-skipSplash-desc": "Ignorer l'écran de chargement d'ArmCord au démarrage de l'application.", - "settings-startMinimized": "Démarrage en mode réduit", - "settings-startMinimized-desc": "ArmCord 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-dynamicIcon": "Icône dynamique", - "settings-dynamicIcon-desc": "Suivant le comportement de Discord sous Windows, cela affiche le nombre de messages/pings non lus sur l'icône d'ArmCord au lieu de sa barre d'état.", - "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": "Minimiser dans la barre d'état", - "settings-mintoTray-desc": "Lorsqu'il est désactivé, ArmCord 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-theme-desc4": "fenêtre transparente avec barre de titre native, vous avez besoin d'un thème compatible pour l'exécuter. Windows seulement.", - "settings-MultiInstance": "Multi-instances", - "settings-MultiInstance-desc": "Une fois activé vous pourrez lancer plusieurs instances d'Armcord", - "settings-copyGPUInfo": "Copier les informations du GPU", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} diff --git a/assets/lang/fr.json b/assets/lang/fr.json new file mode 100644 index 0000000..734ec4d --- /dev/null +++ b/assets/lang/fr.json @@ -0,0 +1,343 @@ +{ + "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-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.", + "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-audio-loopback": "Loopback", + "settings-audio-loopbackWithMute": "Loopback avec sourdine", + "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", + "settings-category-powerManagement": "Gestion de l'énergie", + "settings-category-arrpc": "arRPC", + "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-extendedPluginAbilities": "Capacités étendues des plugins", + "settings-extendedPluginAbilities-desc": "Permet aux plugins de lire et d'écrire des fichiers dans un dossier spécifique de votre ordinateur (par exemple pour mettre en cache les messages supprimés). Activez uniquement pour les plugins que vous faites confiance - ils peuvent stocker des données localement. Les données sont stockées par plugin dans le dossier plugin-storage de Legcord.", + "settings-processScanning": "Analyse des processus", + "settings-processScanning-desc": "Active l'analyse des jeux en cours d'exécution pour améliorer la détection Rich Presence.", + "settings-windowsLegacyScanning": "Analyse héritée Windows", + "settings-windowsLegacyScanning-desc": "Utilise la méthode héritée pour l'analyse des processus sur Windows (pré v1.1.6). Peut améliorer la compatibilité sur certains systèmes mais est moins efficace.", + "settings-scanInterval": "Intervalle d'analyse (ms)", + "settings-scanInterval-desc": "Définit la fréquence (en millisecondes) de l'analyse des processus. Des valeurs plus faibles peuvent améliorer la vitesse de détection mais peuvent augmenter l'utilisation du CPU.", + "settings-forceNativeCrash": "Forcer un plantage natif", + "settings-venmic-granularSelect": "Sélection granulaire", + "settings-automaticClientUpdates": "Mises à jour automatiques du client", + "settings-automaticClientUpdates-desc": "Désactive les mises à jour automatiques de Legcord", + "settings-vaapi": "VAAPI", + "settings-vaapi-desc": "Utiliser VAAPI (accélération matérielle) pour le décodage vidéo sur Linux. Cela réduit considérablement l’utilisation du CPU lors du partage d’écran, mais peut provoquer des problèmes sur certains systèmes. Désactivez-le si vous rencontrez des plantages ou des écrans noirs pendant le partage d’écran.", + "settings-mod-shelter": "Shelter", + "settings-mod-custom": "Personnalisé", + "settings-quickCss": "CSS rapide", + "settings-quickCss-desc": "Modifiez rapidement votre CSS dans un éditeur de texte simple. Les modifications sont appliquées immédiatement après l’enregistrement du fichier.", + "menu-about": "À propos de Legcord", + "menu-developerTools": "Outils de développement", + "menu-openSettings": "Ouvrir les paramètres", + "menu-reload": "Recharger", + "menu-restart": "Redémarrer", + "menu-quit": "Quitter", + "menu-edit": "Modifier", + "menu-undo": "Annuler", + "menu-redo": "Rétablir", + "menu-cut": "Couper", + "menu-copy": "Copier", + "menu-paste": "Coller", + "menu-selectAll": "Tout sélectionner", + "menu-view": "Affichage", + "menu-toggleFullscreen": "Basculer en plein écran", + "menu-zoomIn": "Agrandir", + "menu-zoomOut": "Rétrécir", + "menu-resetZoom": "Réinitialiser le zoom", + "menu-window": "Fenêtre", + "menu-minimize": "Réduire", + "menu-close": "Fermer", + "menu-keybind": "Raccourci clavier", + "menu-legcord": "Legcord", + "tray-openLegcord": "Ouvrir Legcord", + "tray-openSettings": "Ouvrir les paramètres", + "tray-supportServer": "Serveur Discord de support", + "tray-restartLegcord": "Redémarrer Legcord", + "tray-quitLegcord": "Quitter Legcord", + "tray-tooltip": "Legcord", + "dialog-openUrl-title": "Voulez-vous ouvrir ce lien ?", + "dialog-openUrl-message": "Voulez-vous ouvrir {url} ?", + "dialog-openUrl-detail": "Cette URL a été détectée comme n’utilisant pas les protocoles standards du navigateur. Cela peut signifier que cette URL mène à un programme local sur votre ordinateur. Veuillez vérifier si vous la reconnaissez avant de continuer !", + "dialog-openUrl-checkbox": "Se souvenir de ma réponse et ignorer cet avertissement pour les sessions futures", + "dialog-importTheme-button": "Importer", + "dialog-importTheme-discordStyles": "Styles Discord", + "dialog-importTheme-allFiles": "Tous les fichiers", + "dialog-customIcon-filters": "Icônes", + "dialog-openUrl-yes": "Oui, s’il vous plaît", + "dialog-openUrl-no": "Non, je ne veux pas", + "title-unreadMessages": "Vous avez des messages non lus.", + "title-legcordSuffix": " - Legcord", + "dialog-importTheme-title": "Sélectionnez un thème à importer", + "config-corrupted-title": "Oups, quelque chose s’est mal passé.", + "config-corrupted-message": "Legcord a détecté que votre fichier de configuration est corrompu. Veuillez redémarrer l’application et reconfigurer vos paramètres. Si le problème persiste, signalez-le sur le serveur de support ou sur GitHub.", + "setup-welcomeTitle": "Bienvenue sur Legcord", + "setup-welcomeSubtitle": "Configurons votre application avec les paramètres qui vous conviennent parfaitement.", + "setup-getStarted": "Commencer", + "setup-windowStyle-nativeTitle": "Fenêtre native", + "setup-windowStyle-nativeDesc": "Utiliser les décorations de fenêtre par défaut de votre système", + "setup-windowStyle-customTitle": "Barre de titre personnalisée", + "setup-windowStyle-customDesc": "Utiliser le design personnalisé de la barre de titre de Legcord", + "setup-chooseWindowStyle": "Choisir le style de fenêtre", + "setup-selectAppearance": "Choisissez comment Legcord apparaît sur votre machine", + "setup-systemTray": "Zone de notification système", + "setup-trayChoose": "Choisissez si vous souhaitez activer l’icône dans la zone de notification système", + "setup-trayEnableTitle": "Activer l’icône dans la zone de notification système", + "setup-trayEnableDesc": "Afficher Legcord dans votre zone de notification système", + "setup-trayDisableTitle": "Désactiver l’icône dans la zone de notification système", + "setup-trayDisableDesc": "Ne pas afficher Legcord dans la zone de notification système", + "setup-linuxTrayWarning": "La fonctionnalité de la zone de notification système peut présenter des problèmes ou se comporter différemment sur les systèmes Linux.", + "setup-finishTitle": "Vous êtes prêt !", + "setup-finishSubtitle": "La configuration de Legcord est terminée et personnalisée selon vos préférences.", + "setup-finishSettingsNote": "Besoin de modifier des paramètres plus tard ? Vous retrouverez toutes ces options dans le menu des paramètres de Legcord.", + "setup-launchLegcord": "Lancer Legcord", + "setup-modSelectorTitle": "Choisissez votre client modifié", + "setup-modSelectorSubtitle": "Legcord inclut Shelter par défaut, mais vous pouvez également choisir un autre client mod si vous le souhaitez.", + "setup-vencordTitle": "Vencord", + "setup-vencordDesc": "Client mod avec des plugins et des thèmes.", + "setup-equicordTitle": "Equicord", + "setup-equicordDesc": "Un fork de Vencord avec davantage de plugins.", + "setup-useShelterOnly": "Utiliser uniquement Shelter", + "setup-back": "Retour", + "setup-next": "Suivant", + "setup-stepOf": "Étape {current} sur {total}", + "setup-loading": "Chargement…", + "setup-windowTitle": "Configuration de Legcord", + "settings-restartRequired": "Redémarrage requis", + "settings-restartRequiredBody": "Vous devez redémarrer pour appliquer ces modifications.", + "settings-restartLater": "Je le ferai plus tard", + "settings-theme-legacy": "Ancien système", + "settings-channel-stable": "Version stable", + "settings-channel-canary": "Canary", + "settings-channel-ptb": "PTB", + "keybind-addKeybind": "Ajouter un raccourci clavier", + "keybind-accelerator": "Raccourci clavier", + "keybind-invalidCombo": "Cette combinaison de touches est invalide ou non prise en charge.", + "keybind-recording": "Enregistrement", + "keybind-record": "Enregistrer", + "keybind-action": "Action", + "keybind-mute": "Couper le son", + "keybind-deafen": "Désactiver l’écoute", + "keybind-pushToTalk": "Appuyer pour parler", + "keybind-leaveCall": "Quitter l’appel", + "keybind-navigateForward": "Aller en avant", + "keybind-navigateBack": "Aller en arrière", + "keybind-runJavascript": "Exécuter du JavaScript", + "settings-material": "Matériau de fenêtre", + "settings-material-desc": "Définit le matériau d’arrière-plan Windows utilisé par Legcord.", + "settings-material-mica": "Mica", + "settings-material-mica-alt": "Mica Alt", + "settings-material-acrylic": "Acrylique", + "settings-material-none": "Aucun", + "keybind-openQuickCss": "Ouvrir le CSS rapide", + "keybind-globalNote": "Permet d’attribuer un raccourci clavier spécifique utilisable dans différentes applications et programmes.", + "keybind-global": "Global", + "keybind-jsCode": "Code JavaScript", + "keybind-add": "Ajouter", + "keybind-delete": "Supprimer", + "detectable-missingFields": "Champs manquants", + "detectable-fillAllFields": "Veuillez remplir tous les champs avant d’ajouter.", + "detectable-addApp": "Ajouter une application détectable", + "detectable-appName": "Nom de l’application*", + "detectable-appId": "ID de l’application*", + "detectable-themes": "Thèmes", + "detectable-aliases": "Alias", + "detectable-enabled": "Activé", + "detectable-placeholderName": "ex. Discord", + "detectable-placeholderId": "ex. 1234567890", + "detectable-placeholderThemes": "Action, Aventure", + "detectable-placeholderAliases": "Alias1, Alias2", + "themes-success": "Succès !", + "themes-updated": "Thème mis à jour avec succès !", + "themes-bdInstalled": "Thème BD installé avec succès !", + "themes-delete": "Supprimer", + "themes-edit": "Modifier", + "themes-update": "Mettre à jour", + "themes-open": "Ouvrir", + "themes-by": "par", + "themes-openQuickCss": "Ouvrir le fichier CSS rapide", + "themes-importFromFile": "Importer depuis un fichier", + "themes-openThemesFolder": "Ouvrir le dossier des thèmes", + "themes-import": "Importer", + "themes-importUrlPlaceholder": "https://raw.githubusercontent.com/... [.theme.css]", + "games-registeredGames": "Jeux enregistrés", + "games-refreshList": "Actualiser la liste", + "games-add": "Ajouter", + "games-remove": "Retirer", + "games-removeConfirmHeader": "Supprimer le jeu ?", + "games-removeConfirmBody": "Ce jeu sera retiré du Rich Presence. Le client doit être redémarré pour que les changements prennent effet.", + "games-noExecutables": "Aucun exécutable", + "games-empty": "Aucun jeu enregistré. Ajoutez-en un via le menu déroulant ci-dessus.", + "games-lastDetected": "Derniers jeux détectés", + "games-lastDetectedEmpty": "Aucun jeu détecté pour le moment. Lancez un jeu avec le Rich Presence pour les voir ici.", + "games-blacklist": "Liste noire", + "games-blacklisted": "Jeux en liste noire", + "games-blacklistedEmpty": "Aucun jeu en liste noire.", + "games-removeFromBlacklist": "Retirer", + "games-application": "Application", + "screenshare-selectSource": "Veuillez sélectionner une source", + "screenshare-venmicDisabled": "Venmic désactivé", + "screenshare-share": "Partager", + "screenshare-title": "Partage d’écran", + "contextMenu-searchGoogle": "Rechercher avec Google", + "contextMenu-searchDuckDuckGo": "Rechercher avec DuckDuckGo", + "touchbar-servers": "Serveurs", + "splash-title": "Legcord", + "backup-dialogSave-title": "Sauvegarder la sauvegarde de Legcord", + "backup-dialogOpen-title": "Ouvrir la sauvegarde de Legcord", + "backup-pageTitle": "Sauvegarde et restauration", + "backup-pageSubtitle": "Sauvegardez ou restaurez votre configuration Legcord, y compris les paramètres, thèmes, plugins et données de mod — le tout dans un seul fichier.", + "backup-createBackup": "Créer une sauvegarde", + "backup-restore": "Restaurer", + "backup-modalTitle": "Choisissez ce qui sera inclus dans cette sauvegarde", + "backup-includeLegcordConfig": "Paramètres", + "backup-includeLegcordThemes": "Thèmes et CSS rapide", + "backup-includeLegcordPlugins": "Extensions Chrome / stockage des plugins", + "backup-includeVencord": "Données Vencord (session actuelle)", + "backup-includeEquicord": "Données Equicord (session actuelle)", + "backup-includeShelter": "Plugins Shelter", + "backup-includeModBundles": "Fichiers de mods client téléchargés (Vencord, Equicord, Shelter, bundles personnalisés)", + "backup-confirmBackup": "Exporter", + "backup-successTitle": "Sauvegarde enregistrée", + "backup-successBody": "Votre sauvegarde a été enregistrée avec succès.", + "backup-cancelledTitle": "Annulé", + "backup-cancelledBody": "Aucun fichier n'a été enregistré.", + "backup-failedTitle": "La sauvegarde a échoué", + "backup-invalidFile": "Impossible de lire ce fichier de sauvegarde.", + "backup-unknownError": "Impossible de lire ce fichier de sauvegarde.", + "backup-restoreConfirmHeader": "Restaurer à partir de la sauvegarde ?", + "backup-restoreConfirmBody": "Les fichiers sur le disque seront remplacés là où cette sauvegarde contient des données. Vous devrez peut-être redémarrer Legcord pour que tout soit appliqué.", + "backup-restoreConfirm": "Restaurer", + "backup-restoreCancel": "Annuler", + "backup-restoreDoneTitle": "Restauration terminée", + "backup-restoreDoneBody": "Vos données ont été restaurées. Redémarrez Legcord pour que toutes les modifications prennent effet.", + "supportBanner-title": "Soutenir le projet", + "supportBanner-subtitle": "Aidez-nous à continuer le développement de Legcord. Votre soutien permet de maintenir le projet en vie et nous permet de proposer plus de fonctionnalités.", + "supportBanner-donate": "Faire un don", + "keybind-enabled": "Activé" +} diff --git a/assets/lang/hu-HU.json b/assets/lang/hu-HU.json deleted file mode 100644 index 106567a..0000000 --- a/assets/lang/hu-HU.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_start": "ArmCord 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 ArmCord-hoz. Kérlek frissítsd a legújabb verzióra.", - "setup_question1": "Üdvözöljük az ArmCord telepítésénél", - "setup_offline": "Úgy tűnik, offline vagy. Kérlek csatlakozz az internetre, és indítsd újra az ArmCord-ot.", - "setup_question2": "Válaszd ki a Discord frissítési csatornáját:", - "setup_question3": "Az ArmCord 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": "ArmCord téma", - "settings-theme-desc1": "Az ArmCord „témái” kezelik az alkalmazások viselkedését és megjelenését.", - "settings-theme-desc2": "így néz ki az ArmCord, amikor először elindítja. Ez magában foglalja a Discord \n egyéni címsorát és ArmCord-specifikus stílusok beillesztve a Discordba.", - "settings-theme-desc3": "a jelenleg futó operációs rendszer natív címsorát használja (pl. Windows 7/10). Több funkció\n hasonló a tényleges Discord alkalmazáshoz Linuxon.", - "settings-theme-default": "Alapértelmezett", - "settings-theme-native": "Anyanyelvi", - "settings-theme-transparent": "Átlátszó", - "settings-csp-desc": "Az ArmCord 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 ArmCord 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 ArmCord a háttérben indul.", - "settings-patches": "Automatikus javítások", - "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-patches-desk": "A kiadott javítások összegyűjtése, ha egy kiadásról kiderül, hogy hibás. Általában\n nem kell folyamatosan bekapcsolva lenni (kivéve, ha a Discordon értesítik a támogatást).", - "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-dynamicIcon": "Dinamikus ikon", - "settings-dynamicIcon-desc": "A Discord viselkedését követve a Windows rendszeren, az olvasatlan üzenetek/pingek száma az ArmCord ikonján jelenik meg a tálcája helyett.", - "settings-channel": "Discord csatorna", - "settings-channel-desc1": "Ezzel a beállítással módosíthatja a Discord aktuális példányát:", - "settings-channel-desc2": "valószínűleg ezt ismered a legjobban. Ezt az egyet látod az alapértelmezett Discord\n kliensben!", - "settings-channel-desc3": "ez a Discord alfa teszt kiadása. Használatával hozzáférhet a legújabb\n funkciók-és javításokhoz.", - "settings-channel-desc4": "nyilvános teszt build. Korábban kapja meg a funkciókat, mint a stabil, de egy kicsit később, mint a Canary.", - "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-mod-shelter": "egy új generációs kliens mod, amely lényegében golyóállóra készült.", - "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 ArmCord 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 ArmCord 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 ArmCord 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-theme-desc4": "átlátszó ablak natív címsorral, ennek futtatásához kompatibilis témára van szükség. Csak Windows.", - "settings-MultiInstance": "Több példány", - "settings-MultiInstance-desc": "Ha engedélyezve van, akkor az ArmCord 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" -} diff --git a/assets/lang/hu.json b/assets/lang/hu.json new file mode 100644 index 0000000..0a81c97 --- /dev/null +++ b/assets/lang/hu.json @@ -0,0 +1,350 @@ +{ + "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ó", + "loading_screen_offline": "Úgy tűnik, offline állapotban van. Indítsa újra. ", + "settings-theme-desc": "Az ablakstílus kezeli, hogy a Legcord milyen fejlécet használ.", + "settings-sleepInBackground-desc": "Engedélyezi a Chromium háttérben történő lassítását. Ez segíthet az akkumulátor élettartamának megőrzésében, de egyben megszünteti az értesítéseket.", + "settings-transparency-desc": "Állítsd be, milyen átlátszósági módot használjon a Legcord.", + "settings-transparency-tahoe-warning": "Az átlátszóság késleltetést okozhat MacOS 26 Tahoe rendszeren.", + "settings-popoutPiP": "A hívás felugró ablaka mindig felül", + "settings-popoutPiP-desc": "Ha engedélyezve van, a hívás felugró ablaka mindig felül lesz.", + "settings-venmic-workaround": "Ideiglenes megoldás", + "settings-venmic-workaround-desc": "Engedélyezd vagy tiltsd le a javítást, amely miatt a mikrofon kerül megosztásra a helyes hang helyett.", + "settings-venmic-deviceSelect": "Eszköz kiválasztása", + "settings-venmic-deviceSelect-desc": "Hangeszköz kiválasztásának engedélyezése.", + "settings-venmic-granularSelect-desc": "Engedélyezze a hangbemeneti forrás kiválasztását.", + "settings-venmic-ignoreVirtual": "Virtuális eszközök figyelmen kívül hagyása", + "settings-venmic-ignoreVirtual-desc": "Virtuális hangeszközök figyelmen kívül hagyása.", + "settings-venmic-ignoreDevices": "Eszközök figyelmen kívül hagyása", + "settings-venmic-ignoreDevices-desc": "Speciális hangeszközök figyelmen kívül hagyása.", + "settings-venmic-ignoreInputMedia": "Beviteli média figyelmen kívül hagyása", + "settings-venmic-ignoreInputMedia-desc": "A médiaforrásokból származó hangbemenet figyelmen kívül hagyása.", + "settings-venmic-onlySpeakers": "Csak hangszóró", + "settings-venmic-onlySpeakers-desc": "Csak a hangszórókat használja a hangkiválasztáshoz.", + "settings-venmic-onlyDefaultSpeakers": "Csak alapértelmezett hangeszközök", + "settings-venmic-onlyDefaultSpeakers-desc": "Csak az alapértelmezett hangeszközöket használja a hangkiválasztáshoz.", + "settings-audio": "Hang", + "settings-audio-desc": "Válassza ki, hogy a Legcord melyik módszert használja a hang rögzítéséhez a képernyőmegosztás közben.", + "settings-openCustomIconDialog": "Asztali ikon beállítása", + "settings-csp-desc": "Állítsd be a Legcord tartalombiztonsági szabályzatának szigorúságát. A szigorú CSP jobb biztonságot nyújt, de kompatibilitási problémákat okozhat egyes kliens modokkal/témákkal/bővítményekkel.", + "settings-mintoTray": "Futás a háttérben", + "settings-mintoTray-desc": "Ha le van tiltva, a Legcord a többi ablakhoz hasonlóan bezáródik, különben csak a tálcára csukódik le.", + "settings-startMinimized": "Kisablakos indítás", + "settings-startMinimized-desc": "A Legcord a háttérben indul el, és nem zavar.", + "settings-useSystemCssEditor": "Használja a rendszer CSS-szerkesztőjét", + "settings-useSystemCssEditor-desc": "A CSS szerkesztéséhez használja a rendszer CSS-szerkesztőjét.", + "settings-MultiInstance": "Több példány", + "settings-MultiInstance-desc": "Ha engedélyezve van, a Legcordot több példányban is el lehet indítani.", + "settings-noBundleUpdates": "Nincs csomagfrissítés", + "settings-noBundleUpdates-desc": "Letiltja a kliens bővítmények automatikus frissítéseit.", + "settings-hardwareAcceleration": "Hardveres gyorsítás", + "settings-hardwareAcceleration-desc": "A hardveres gyorsítás a GPU-t használja a Legcord gyorsabb futtatásához. Ha vizuális hibákat tapasztal, próbálja meg kikapcsolni ezt.", + "settings-processScanning": "Folyamatok vizsgálata", + "settings-processScanning-desc": "Lehetővé teszi a futó játékok keresését a Rich Presence észlelésének javítása érdekében.", + "settings-windowsLegacyScanning": "Windows régi beolvasás", + "settings-windowsLegacyScanning-desc": "Régi módszert használ a Windows rendszeren futó folyamatok vizsgálatához (1.1.6-os verzió előtt). Javíthatja a kompatibilitást egyes rendszereken, de kevésbé hatékony.", + "settings-scanInterval": "Szkennelési intervallum (ms)", + "settings-scanInterval-desc": "Beállítja, hogy milyen gyakran (milliszekundumban) történjen a folyamatellenőrzés. Az alacsonyabb értékek javíthatják az észlelési sebességet, de növelhetik a CPU-használatot.", + "settings-blockPowerSavingInVoiceChat": "Energiatakarékosság letiltása a hangcsevegésben", + "settings-blockPowerSavingInVoiceChat-desc": "Megakadályozza az Legcord felfüggesztését. Aktívan tartja a Legcordot, de lehetővé teszi a képernyő kikapcsolását.", + "settings-mobileMode": "Mobil mód", + "settings-mobileMode-desc": "Ha érintőképernyős eszközt használsz, ez a funkció neked való! Aktiválja a Discord rejtett mobil módját, amely telefonokhoz és tabletekhez készült. Az egyetlen fő funkció, ami hiányzik, a hangcsevegés támogatása. Ez ideális a\nPinePhone és hasonló eszközök felhasználói számára.", + "settings-spellcheck": "Helyesírás-ellenőrzés", + "settings-spellcheck-desc": "Segít a helytelenül írt szavak javításában a kiemelésükkel.", + "settings-channel": "Discord csatorna", + "settings-channel-desc": "Ezzel a beállítással módosíthatja a Legcord által futtatott Discord aktuális példányát.", + "settings-bitrateMin": "Minimális bitráta", + "settings-bitrateMin-desc": "Minimális bitráta képernyőmegosztáshoz.", + "settings-bitrateMax": "Maximális bitráta", + "settings-bitrateMax-desc": "Maximális bitráta képernyőmegosztáshoz.", + "settings-bitrateTarget": "Cél bitráta", + "settings-bitrateTarget-desc": "Cél bitráta képernyőmegosztáshoz.", + "settings-invitewebsocket": "Rich Presence", + "settings-invitewebsocket-desc": "Az arRPC-t használja a Discord RPC (Rich Presence) támogatásához a gépeden futó helyi programokkal.", + "settings-useMacSystemPicker": "MacOS rendszerválasztó használata", + "settings-useMacSystemPicker-desc": "Amikor csak lehetséges, natív MacOS képernyőmegosztást használjon. Csak MacOS 15+ rendszeren.", + "settings-additionalArguments": "További argumentumok", + "settings-additionalArguments-desc": "A további argumentumok extra parancsok, amelyeket átadhatsz a Legcordnak. Használhatók funkciók engedélyezésére vagy letiltására, illetve problémák megoldására.", + "settings-mod": "Kliens bővítmény", + "settings-mod-desc1": "A kliens bővítmények olyan programok, amelyek lehetővé teszik a Discord élményed személyre szabását. Megváltoztathatják a kliens megjelenését, módosíthatják a viselkedését, vagy új funkciókat adhatnak hozzá!", + "settings-mod-vencord": "Könnyű és könnyen használható bővítmény. Beépített tárolót tartalmaz a bővítmények számára.", + "settings-mod-equicord": "A Vencord fejlesztőitől származó kliens, mely sok bővítményt kínál.", + "settings-prfmMode": "Teljesítmény mód", + "settings-prfmMode-desc": "A Teljesítmény mód egy kísérleti funkció a Legcordban, melynek célja a válaszidő és a teljesítmény optimalizálása az Ön igényei alapján. A hatás a hardvertől és a használattól függően változhat, ezért javasoljuk, hogy próbálja ki az egyes módokat, hogy megállapítsa, melyik működik legjobban az Ön számára.", + "settings-prfmMode-performance": "Teljesítmény", + "settings-prfmMode-battery": "Akkumulátor", + "settings-prfmMode-dynamic": "Dinamikus", + "settings-prfmMode-vaapi": "VAAPI", + "settings-disableAutogain": "Automatikus erősítés letiltása", + "settings-disableAutogain-desc": "Automatikus erősítés letiltása.", + "settings-disableHttpCache": "HTTP gyorsítótár letiltása", + "settings-disableHttpCache-desc": "Letiltja a Chromium HTTP gyorsítótárát. Kapcsolja be, ha a kliens bővítmények nem töltődnek be.", + "settings-trayIcon": "Tálcaikon", + "settings-trayIcon-desc": "Állítsa be a tálcán megjelenő ikont.", + "settings-trayIcon-disabled": "Tiltsa le a tálcát", + "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-advanced": "Haladó felhasználói zóna", + "settings-pluginsFolder": "Nyissa meg a bővítmények mappát", + "settings-crashesFolder": "Nyissa meg a natív összeomlások mappáját", + "settings-themesFolder": "Nyissa meg a témák mappáját", + "settings-storageFolder": "Nyissa meg a tárolómappát", + "settings-none": "Egyik sem", + "settings-save": "Beállítások mentése", + "settings-experimental": "Kísérleti", + "settings-restart": "Applikáció újraindítása", + "settings-updater": "Frissítések ellenőrzése", + "settings-skipSplash": "Indítóképernyő kihagyása", + "settings-skipSplash-desc": "Átugorja a Legcord kezdőképernyőjét az alkalmazás indításakor.", + "settings-copyDebugInfo": "Hibakeresési információk másolása", + "settings-copyGPUInfo": "GPU információk másolása", + "settings-clearClientModCache": "Kliens gyorsítótárának törlése", + "settings-forceNativeCrash": "Natív összeomlás kényszerítése", + "settings-smoothScroll": "Simább görgetés használata", + "settings-smoothScroll-desc": "A simább görgetés be- és kikapcsolása", + "settings-autoScroll": "Automatikus görgetés engedélyezése", + "settings-autoScroll-desc": "Engedélyezi az automatikus görgetést középső kattintással (Megjegyzés: Az asztali környezet ezt továbbra is felülbírálhatja egy másik művelettel)", + "settings-quickCss": "Egyéni CSS", + "settings-quickCss-desc": "Egyéni változtatásokat adhatsz hozzá a CSS-edhez egy egyszerű szövegszerkesztőben. A módosítások a fájl mentése után azonnal érvénybe lépnek.", + "settings-category-lookAndFeel": "Nézd és érezd", + "settings-category-mods": "Bővítmények", + "settings-category-behaviour": "Viselkedés", + "settings-category-legacy": "Régi funkciók", + "settings-category-debug": "Hibakeresési lehetőségek", + "menu-about": "A Legcordról", + "menu-developerTools": "Fejlesztői eszközök", + "menu-openSettings": "Beállítások megnyitása", + "menu-reload": "Újratöltés", + "menu-restart": "Újraindítás", + "menu-quit": "Kilépés", + "menu-edit": "Szerkesztés", + "menu-undo": "Visszavonás", + "menu-cut": "Kivágás", + "menu-copy": "Másolás", + "menu-paste": "Beillesztés", + "menu-selectAll": "Összes kijelölése", + "menu-view": "Nézet", + "menu-toggleFullscreen": "Teljes képernyő be- és kikapcsolása", + "menu-zoomIn": "Nagyítás", + "menu-zoomOut": "Kicsinyítés", + "menu-resetZoom": "Nagyítás alaphelyzetbe állítása", + "menu-window": "Ablak", + "menu-minimize": "Lekicsinyítés", + "menu-close": "Bezárás", + "menu-keybind": "Billentyűparancs", + "menu-legcord": "Legcord", + "tray-openLegcord": "Legcord megnyitása", + "tray-openSettings": "Beállítások megnyitása", + "tray-supportServer": "Támogatási Discord szerver", + "tray-restartLegcord": "Legcord újraindítása", + "tray-quitLegcord": "Legcord bezárása", + "tray-tooltip": "Legcord", + "dialog-openUrl-title": "Meg szeretnéd nyitni ezt a linket?", + "dialog-openUrl-message": "Meg szeretné nyitni a(z) {url} oldalt?", + "dialog-openUrl-detail": "Ez az URL nem a szokásos böngészőprotokollokat használja. Ez azt jelentheti, hogy az URL egy helyi programhoz vezet a számítógépén. Kérjük, ellenőrizze, hogy felismeri-e, mielőtt folytatná!", + "dialog-openUrl-checkbox": "Emlékezz, és hagyd figyelmen kívül ezt a figyelmeztetést a jövőben", + "dialog-openUrl-yes": "Igen, kérlek", + "dialog-openUrl-no": "Nem", + "title-unreadMessages": "Van néhány olvasatlan üzeneted.", + "title-legcordSuffix": " - Legcord", + "dialog-importTheme-title": "Válasszon ki egy importálni kívánt témát", + "dialog-importTheme-button": "Importálás", + "dialog-importTheme-discordStyles": "Discord stílus", + "dialog-importTheme-allFiles": "Összes fájl", + "dialog-customIcon-filters": "Ikonok", + "config-corrupted-title": "Hoppá, valami hiba történt.", + "config-corrupted-message": "A Legcord észlelte, hogy a konfigurációs fájl sérült, kérjük, indítsa újra az alkalmazást, és adja meg újra a beállításokat. Ha a probléma továbbra is fennáll, jelentse a támogató szerveren vagy Githubon.", + "setup-welcomeTitle": "Üdvözöljük a Legcordban", + "setup-welcomeSubtitle": "Állítsuk be a tökéletes konfigurációt.", + "setup-getStarted": "Kezdd el", + "setup-windowStyle-nativeTitle": "Natív ablak", + "setup-windowStyle-nativeDesc": "Használja a rendszer alapértelmezett ablakdekorációit", + "setup-windowStyle-customTitle": "Egyéni fejléc", + "setup-windowStyle-customDesc": "Használja a Legcord egyéni fejlécét", + "setup-chooseWindowStyle": "Ablakstílus kiválasztása", + "setup-selectAppearance": "Válassza ki, hogyan jelenjen meg a Legcord a készülékén", + "setup-systemTray": "Rendszertálca", + "setup-trayChoose": "Válassza ki, hogy engedélyezi-e a tálcaikont", + "setup-trayEnableTitle": "Tálca-ikon engedélyezése", + "setup-trayEnableDesc": "Legcord megjelenítése a tálcán", + "setup-trayDisableTitle": "Tálcaikon letiltása", + "setup-trayDisableDesc": "Ne jelenítse meg a Legcord-ot a tálcán", + "setup-linuxTrayWarning": "A tálcafunkciók Linux rendszereken problémákba ütközhetnek, vagy eltérően viselkedhetnek.", + "setup-finishTitle": "Készen állsz!", + "setup-finishSubtitle": "A Legcord konfigurációja készen áll és személyre szabott az Ön preferenciái szerint.", + "setup-finishSettingsNote": "Később szeretnél változtatni? Minden beállítást megtalálsz a Discord beállításai között, a Legcord menüpont alatt.", + "setup-launchLegcord": "Legcord indítása", + "setup-modSelectorTitle": "Válaszd ki a kliensedet", + "setup-modSelectorSubtitle": "A Legcord alapból tartalmazza a Sheltert, de igény szerint választhatsz másik klienset is.", + "setup-vencordTitle": "Vencord", + "setup-vencordDesc": "Kliens bővítményekkel és témákkal.", + "setup-equicordTitle": "Equicord", + "setup-equicordDesc": "Egy Vencord-elágazás további bővítményekkel.", + "setup-useShelterOnly": "Csak Sheltert használjon", + "setup-back": "Vissza", + "setup-next": "Következő", + "setup-loading": "Betöltés...", + "setup-windowTitle": "Legcord beállítások", + "settings-restartRequired": "Újraindítás szükséges", + "settings-restartRequiredBody": "A módosítások alkalmazásához újra kell indítani a klienset.", + "settings-restartLater": "Inkább később", + "settings-theme-legacy": "Elavult", + "settings-channel-stable": "Stabil", + "settings-channel-canary": "Canary", + "settings-channel-ptb": "PTB", + "settings-category-powerManagement": "Energiagazdálkodás", + "settings-category-arrpc": "arRPC", + "settings-extendedPluginAbilities": "Kiterjesztett plugin-funkciók", + "settings-extendedPluginAbilities-desc": "Lehetővé teszi a bővítmények számára, hogy fájlokat olvassanak és írjanak a számítógép egy mappájában (pl. törölt üzenetek gyorsítótárazásához). Csak az Ön által megbízható bővítményeknél engedélyezze – ezek helyben is tárolhatják az adatokat. Az adatokat bővítményenként tárolja a Legcord plugin-storage mappája.", + "settings-audio-loopback": "Visszacsatolás", + "settings-audio-loopbackWithMute": "Visszacsatolás némítással", + "keybind-addKeybind": "Gyorsbillentyű hozzáadása", + "keybind-accelerator": "Billentyűparancs-gyorsító", + "keybind-invalidCombo": "Ez a billentyűkombináció érvénytelen vagy nem támogatott.", + "keybind-recording": "Felvétel", + "keybind-record": "Felvétel", + "keybind-action": "Művelet", + "keybind-mute": "Némítás", + "keybind-pushToTalk": "Push to talk", + "keybind-leaveCall": "Hívás elhagyása", + "keybind-navigateForward": "Navigáljon előre", + "keybind-navigateBack": "Navigáljon vissza", + "keybind-runJavascript": "Javascript futtatása", + "keybind-openQuickCss": "Egyéni CSS megnyitása", + "keybind-globalNote": "Lehetővé teszi egy adott billentyűparancs hozzárendelését, amely különböző alkalmazásokban és programokban használható.", + "keybind-global": "Globális", + "keybind-enabled": "Engedélyezett", + "keybind-jsCode": "Javascript kód", + "keybind-add": "Hozzáadás", + "keybind-delete": "Törlés", + "detectable-missingFields": "Hiányzó mezők", + "detectable-fillAllFields": "Kérjük, hozzáadás előtt töltse ki az összes mezőt.", + "detectable-addApp": "Érzékelhető alkalmazás hozzáadása", + "detectable-appName": "Alkalmazásnév*", + "detectable-appId": "Alkalmazásazonosító", + "detectable-themes": "Témák", + "detectable-aliases": "Álnevek", + "detectable-enabled": "Engedélyezve", + "detectable-placeholderName": "pl. Discord", + "detectable-placeholderId": "pl. 1234567890", + "detectable-placeholderAliases": "Álnév1, Álnév2", + "themes-success": "Sikeres!", + "themes-updated": "A téma sikeresen frissítve!", + "themes-bdInstalled": "A BD téma sikeresen telepítve!", + "themes-delete": "Törlés", + "themes-edit": "Szerkesztés", + "themes-update": "Frissítés", + "themes-open": "Megnyitás", + "themes-by": "-tól, -től", + "themes-openQuickCss": "Egyéni CSS fájl megnyitása", + "themes-importFromFile": "Importálás fájlból", + "themes-openThemesFolder": "Témák mappa megnyitása", + "themes-import": "Importálás", + "themes-importUrlPlaceholder": "https://raw.githubusercontent.com/... [.tema.css]", + "games-registeredGames": "Regisztrált játékok", + "games-refreshList": "Lista frissítése", + "games-add": "Hozzáadás", + "games-remove": "Eltávolítás", + "games-removeConfirmHeader": "Játék törlése?", + "games-removeConfirmBody": "Ez a játék eltávolításra kerül a rich presenceből. A változtatások érvénybe lépéséhez újra kell indítani a klienset.", + "games-noExecutables": "Nincsenek végrehajtható fájlok", + "games-empty": "Nincsenek regisztrált játékok. Adj hozzá egyet a legördülő menü segítségével.", + "games-lastDetected": "Utoljára észlelt játékok", + "games-lastDetectedEmpty": "Még nincsenek észlelhető játékok. Indítson el egy rich presence kompatibilis játékot, hogy itt láthassa őket.", + "games-blacklist": "Feketelista", + "games-blacklisted": "Feketelistás játékok", + "games-blacklistedEmpty": "Nincsenek feketelistás játékok.", + "games-removeFromBlacklist": "Eltávolítás", + "games-application": "Applikáció", + "screenshare-selectSource": "Kérlek, válassz egy forrást", + "screenshare-venmicDisabled": "Venmic letiltva", + "screenshare-share": "Megosztás", + "screenshare-title": "Képernyőmegosztás", + "contextMenu-searchGoogle": "Keressen a Google-on", + "contextMenu-searchDuckDuckGo": "Keressen a DuckDuckGo-n", + "touchbar-servers": "Szerverek", + "splash-title": "Legcord", + "settings-venmic-granularSelect": "Részletes kiválasztás", + "settings-trayIcon-white-plug-alt": "Fehér csatlakozó alternatíva", + "settings-trayIcon-black-plug": "Fekete csatlakozó", + "settings-trayIcon-black-plug-alt": "Fekete csatlakozó alternatíva", + "menu-redo": "Újra", + "setup-stepOf": "{current} / {total} lépés", + "keybind-deafen": "Süketítés", + "detectable-placeholderThemes": "Akció, kaland", + "settings-vaapi": "VAAPI", + "settings-vaapi-desc": "VAAPI (hardvergyorsítás) használata videó dekódolásához Linuxon. Ez jelentősen csökkenti a CPU-használatot képernyőmegosztás közben, de egyes rendszereken problémákat okozhat. Kapcsolja ki, ha képernyőmegosztás közben összeomlásokat vagy fekete képernyőt tapasztal.", + "settings-automaticClientUpdates": "Automatikus kliens frissítések", + "settings-automaticClientUpdates-desc": "Automatikus Legcord frissítések kikapcsolása", + "supportBanner-donate": "Adományozás", + "settings-mod-shelter": "Shelter", + "settings-mod-custom": "Egyéni", + "backup-dialogSave-title": "Legcord biztonsági mentés készítése", + "backup-dialogOpen-title": "Legcord biztonsági mentés megnyitása", + "backup-pageTitle": "Biztonsági mentés és visszaállítás", + "backup-pageSubtitle": "Mentsd el, vagy állítsd vissza a Legcord beállításaidat – beleértve a beállításokat, témákat, bővítményeket és mod adatokat – mindezt egyetlen fájlban.", + "backup-createBackup": "Biztonsági mentés készítése", + "backup-restore": "Visszaállítás", + "backup-modalTitle": "Válaszd ki, mi kerüljön bele a biztonsági mentésbe", + "backup-includeLegcordConfig": "Beállítások", + "backup-includeLegcordThemes": "Témák és Egyéni CSS", + "backup-includeLegcordPlugins": "Chrome-bővítmények / plugin tároló", + "backup-includeVencord": "Vencord adatok (aktuális munkamenet)", + "backup-includeEquicord": "Equicord adatok (aktuális munkamenet)", + "backup-includeShelter": "Shelter bővítmények", + "backup-includeModBundles": "Letöltött kliensmod fájlok (Vencord, Equicord, Shelter, egyedi csomagok)", + "backup-confirmBackup": "Exportálás", + "backup-successTitle": "Biztonsági mentés elmentve", + "backup-successBody": "A biztonsági mentésed sikeresen el lett mentve.", + "backup-cancelledTitle": "Megszakítva", + "backup-cancelledBody": "Nincs fájl elmentve.", + "backup-failedTitle": "A biztonsági mentés sikertelen volt", + "backup-invalidFile": "Nem sikerült beolvasni a biztonsági mentést.", + "backup-unknownError": "Valami hiba történt.", + "backup-restoreConfirmHeader": "Biztonsági mentés visszaállítása?", + "backup-restoreConfirmBody": "A lemezen lévő fájlok fel lesznek cserélve azzal, amit jelen biztonsági mentés tartalmaz. Előfordulhat, hogy újra kell indítanod a Legcordot, hogy minden változtatás érvénybe lépjen.", + "backup-restoreConfirm": "Visszaállítás", + "backup-restoreCancel": "Mégse", + "backup-restoreDoneTitle": "Visszaállítás sikeres", + "backup-restoreDoneBody": "Az adataid vissza lettek állítva. Indítsd újra a Legcordot, hogy minden változtatás érvénybe lépjen.", + "supportBanner-title": "Támogasd a projektet", + "supportBanner-subtitle": "Segíts a Legcord fejlesztésének folytatásában. A támogatásod életben tartja a projektet, és lehetővé teszi, hogy még több funkciót készítsünk és adjunk ki.", + "settings-material": "Ablak kinézet", + "settings-material-desc": "Beállítja a Legcord által használt ablak kinézetet.", + "settings-material-mica": "Mica", + "settings-material-mica-alt": "Mica Alt", + "settings-material-acrylic": "Akril", + "settings-material-none": "Egyik sem", + "settings-csp-vanilla": "Vanilla", + "settings-csp": "Tartalombiztonsági irányelv", + "settings-csp-strict": "Szigorú", + "settings-csp-none": "Egyik sem", + "keybind-openSettings": "Beállítások megnyitása", + "settings-firstTimeCrash": "Mindent előkészítünk számodra!", + "settings-firstTimeCrash-desc": "Az első indításkor a beállítások még nem érhetők el. Kérjük, használd az alábbi gombot az újraindításhoz, és a beállítások az újraindítás után már elérhetőek lesznek." +} diff --git a/assets/lang/id-ID.json b/assets/lang/id-ID.json deleted file mode 100644 index 6d402ac..0000000 --- a/assets/lang/id-ID.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_start": "Memulai ArmCord…", - "loading_screen_offline": "Anda tampaknya offline. Silakan terhubung ke Internet dan coba lagi.", - "loading_screen_update": "Versi baru ArmCord tersedia. Silakan perbarui ke versi terbaru.", - "setup_question1": "Selamat datang di laman Penyiapan ArmCord", - "setup_question2": "pilih saluran Discord anda/instansi:", - "setup_offline": "tampaknya anda sedang offline. silahkan sambungkan ke internet dan muat ulang ArmCord.", - "setup_question3": "bolehkah ArmCord menangani pemasangan mods klien?", - "yes": "iya", - "no": "tidak", - "next": "berikutnya", - "setup_question4": "Pilih mod klien yang ingin anda pasang:", - "settings-theme": "Tema ArmCord", - "settings-theme-default": "Bawaan", - "settings-theme-native": "asli", - "settings-tray": "Baki", - "settings-patches": "Patch otomatis", - "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-theme-desc1": "\"Tema\" ArmCord menata perilaku dan penampilan aplikasi.", - "settings-theme-desc2": "beginilah ArmCord terlihat saat kamu memulainya pertama kali. Terlihat bar judul\n kustom Discord dan ragam spesifik ArmCord yang diinjeksi ke Discord.", - "settings-theme-desc3": "menggunakan bar judul bawaan dari OS yang kamu gunakan (contoh Windows 7/10). Berfungsi mirip\n seperti aplikasi Discord di Linux.", - "settings-tray-desc": "Ketika dinonaktifkan, ArmCord akan menutup seperti jendela lain ketika ditutup, jika tidak, ia akan duduk dan bersantai di baki sistem Anda untuk nanti.", - "settings-patches-desk": "Mengambil patch yang didistribusikan jika sebuah rilis ternyata memiliki bug. Biasanya \n tidak perlu dinyalakan terus menerus (kecuali jika diberitahukan dalam dukungan Discord).", - "settings-csp-desc": "ArmCord 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-channel-desc1": "Kamu dapat menggunakan setelan ini untuk mengubah instansi Discord yang digunakan:", - "settings-channel-desc2": "kamu mungkin paling familiar dengan yang satu ini. Ini adalah pilihan bawaan untuk\n klien Discord!", - "settings-channel-desc3": "ini merupakan test alfa untuk Discord. Kamu akan mendapatkan akses fitur dan \n perbaikan terbaru.", - "settings-channel-desc4": "build uji coba publik. Dapatkan fitur lebih awal dari stable namun lebih lama dari Canary.", - "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-mod-shelter": "merupakan mod klien generasi baru yang dibuat seperti anti peluru.", - "settings-prfmMode-desc": "Mode Kinerja adalah fungsi eksperimental yang dapat meningkatkan tingkat responsif dan performa\n ArmCord 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 ArmCord saat kamu memulai aplikasi.", - "settings-copyDebugInfo": "Salin info Debug", - "settings-startMinimized": "Mulai diminimalkan", - "settings-startMinimized-desc": "ArmCord 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-dynamicIcon": "Ikon dinamis", - "settings-dynamicIcon-desc": "Mengikuti perilaku Discord di Windows, opsi ini menunjukkan pesan/jumlah ping pada ikon ArmCord daripada di baki.", - "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, ArmCord akan keluar seperti jendela lain saat dikeluarkan, jika tidak maka akan bersantai\n di baki sistem untuk nanti.", - "settings-theme-desc4": "jendela transparan dengan bilah judul asli, Anda memerlukan tema yang kompatibel untuk menjalankannya. Hanya untuk Windows.", - "settings-MultiInstance": "Multi Instans", - "settings-MultiInstance-desc": "Ketika diaktifkan, Anda akan dapat memulai banyak contoh ArmCord.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} diff --git a/assets/lang/id.json b/assets/lang/id.json new file mode 100644 index 0000000..08a583c --- /dev/null +++ b/assets/lang/id.json @@ -0,0 +1,347 @@ +{ + "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": "Atur tingkat keketatan Kebijakan Keamanan Konten Legcord. CSP ketat memberikan keamanan lebih baik tetapi dapat menyebabkan masalah kompatibilitas dengan beberapa mod/tema/plugin klien.", + "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", + "settings-processScanning": "Pemindaian proses", + "settings-processScanning-desc": "Mengaktifkan pemindaian untuk game yang sedang berjalan untuk meningkatkan deteksi Rich Presence.", + "settings-windowsLegacyScanning": "Pemindaian legacy Windows", + "settings-windowsLegacyScanning-desc": "Menggunakan metode legacy untuk memindai proses di Windows (sebelum v1.1.6). Dapat meningkatkan kompatibilitas pada beberapa sistem tetapi kurang efisien.", + "settings-scanInterval": "Interval pemindaian (ms)", + "settings-scanInterval-desc": "Mengatur seberapa sering (dalam milidetik) pemindaian proses terjadi. Nilai yang lebih rendah dapat meningkatkan kecepatan deteksi tetapi dapat meningkatkan penggunaan CPU.", + "menu-about": "Tentang Legcord", + "menu-developerTools": "Alat pengembang", + "menu-openSettings": "Buka pengaturan", + "menu-reload": "Muat ulang", + "menu-restart": "Mulai ulang", + "menu-quit": "Keluar", + "menu-edit": "Edit", + "menu-undo": "Batalkan", + "menu-redo": "Ulangi", + "menu-cut": "Potong", + "menu-copy": "Salin", + "menu-paste": "Tempel", + "menu-selectAll": "Pilih Semua", + "menu-view": "Tampilan", + "menu-toggleFullscreen": "Alihkan Layar Penuh", + "menu-zoomIn": "Perbesar", + "menu-zoomOut": "Perkecil", + "menu-resetZoom": "Atur ulang zoom", + "menu-window": "Jendela", + "menu-minimize": "Minimalkan", + "menu-close": "Tutup", + "menu-keybind": "Keybind", + "menu-legcord": "Legcord", + "tray-openLegcord": "Buka Legcord", + "tray-openSettings": "Buka Pengaturan", + "tray-supportServer": "Server Discord Dukungan", + "tray-restartLegcord": "Mulai Ulang Legcord", + "tray-quitLegcord": "Keluar dari Legcord", + "tray-tooltip": "Legcord", + "dialog-openUrl-title": "Apakah Anda ingin membuka tautan ini?", + "dialog-openUrl-message": "Apakah Anda ingin membuka {url}?", + "dialog-openUrl-detail": "URL ini terdeteksi tidak menggunakan protokol browser normal. Ini dapat berarti bahwa URL ini mengarah ke program lokal di komputer Anda. Harap periksa apakah Anda mengenalinya, sebelum melanjutkan!", + "dialog-openUrl-checkbox": "Ingat jawaban saya dan abaikan peringatan ini untuk sesi mendatang", + "dialog-openUrl-yes": "Ya, silakan", + "dialog-openUrl-no": "Tidak", + "title-unreadMessages": "Anda memiliki beberapa pesan yang belum dibaca.", + "title-legcordSuffix": " - Legcord", + "dialog-importTheme-title": "Pilih tema yang ingin Anda impor", + "dialog-importTheme-button": "Impor", + "dialog-importTheme-discordStyles": "Gaya Discord", + "dialog-importTheme-allFiles": "Semua File", + "dialog-customIcon-filters": "Ikon", + "config-corrupted-title": "Ups, terjadi kesalahan.", + "config-corrupted-message": "Legcord telah mendeteksi bahwa file konfigurasi Anda rusak, harap mulai ulang aplikasi dan atur pengaturan Anda lagi. Jika masalah ini berlanjut, laporkan di server dukungan/isu Github.", + "setup-welcomeTitle": "Selamat datang di Legcord", + "setup-welcomeSubtitle": "Mari siapkan konfigurasi sempurna Anda.", + "setup-getStarted": "Mulai", + "setup-windowStyle-nativeTitle": "Jendela Native", + "setup-windowStyle-nativeDesc": "Gunakan dekorasi jendela default sistem Anda", + "setup-windowStyle-customTitle": "Titlebar Kustom", + "setup-windowStyle-customDesc": "Gunakan desain titlebar kustom Legcord", + "setup-chooseWindowStyle": "Pilih Gaya Jendela", + "setup-selectAppearance": "Pilih bagaimana Legcord muncul di perangkat Anda", + "setup-systemTray": "System Tray", + "setup-trayChoose": "Pilih apakah akan mengaktifkan ikon system tray", + "setup-trayEnableTitle": "Aktifkan Ikon Tray", + "setup-trayEnableDesc": "Tampilkan Legcord di system tray Anda", + "setup-trayDisableTitle": "Nonaktifkan Ikon Tray", + "setup-trayDisableDesc": "Jangan tampilkan Legcord di system tray Anda", + "setup-linuxTrayWarning": "Fungsionalitas system tray mungkin memiliki masalah atau berperilaku berbeda pada sistem Linux.", + "setup-finishTitle": "Semua Sudah Siap!", + "setup-finishSubtitle": "Konfigurasi Legcord Anda lengkap dan dipersonalisasi sesuai preferensi Anda.", + "setup-finishSettingsNote": "Perlu membuat perubahan nanti? Anda akan menemukan semua opsi ini di menu pengaturan Discord di bawah Legcord.", + "setup-launchLegcord": "Luncurkan Legcord", + "setup-modSelectorTitle": "Pilih Mod Klien Anda", + "setup-modSelectorSubtitle": "Legcord menyertakan Shelter secara default, tetapi Anda juga dapat memilih mod klien lain jika diinginkan.", + "setup-vencordTitle": "Vencord", + "setup-vencordDesc": "Mod klien dengan plugin dan tema.", + "setup-equicordTitle": "Equicord", + "setup-equicordDesc": "Fork dari Vencord dengan lebih banyak plugin.", + "setup-useShelterOnly": "Gunakan Shelter Saja", + "setup-back": "Kembali", + "setup-next": "Berikutnya", + "setup-stepOf": "Langkah {current} dari {total}", + "setup-loading": "Memuat...", + "setup-windowTitle": "Pengaturan Legcord", + "settings-restartRequired": "Perlu dimulai ulang", + "settings-restartRequiredBody": "Anda perlu memulai ulang untuk menerapkan perubahan ini.", + "settings-restartLater": "Saya akan melakukannya nanti", + "settings-theme-legacy": "Legacy", + "settings-channel-stable": "Stable", + "settings-channel-canary": "Canary", + "settings-channel-ptb": "PTB", + "settings-category-powerManagement": "Manajemen Daya", + "settings-category-arrpc": "arRPC", + "settings-extendedPluginAbilities": "Kemampuan plugin diperluas", + "settings-extendedPluginAbilities-desc": "Memungkinkan plugin membaca dan menulis file dalam folder terbatas di komputer Anda (misalnya untuk menyimpan cache pesan yang dihapus). Hanya aktifkan untuk plugin yang Anda percayai—mereka dapat menyimpan data secara lokal. Data disimpan per plugin dalam folder plugin-storage Legcord.", + "settings-audio-loopback": "Loopback", + "settings-audio-loopbackWithMute": "Loopback dengan bisukan", + "keybind-addKeybind": "Tambahkan keybind", + "keybind-accelerator": "Accelerator", + "keybind-invalidCombo": "Kombinasi tombol ini tidak valid atau tidak didukung.", + "keybind-recording": "Merekam", + "keybind-record": "Rekam", + "keybind-action": "Tindakan", + "keybind-mute": "Bisukan", + "keybind-deafen": "Deafen", + "keybind-leaveCall": "Tinggalkan panggilan", + "keybind-navigateForward": "Navigasi maju", + "keybind-navigateBack": "Navigasi mundur", + "keybind-runJavascript": "Jalankan Javascript", + "keybind-openQuickCss": "Buka Quick CSS", + "keybind-globalNote": "Memungkinkan Anda menetapkan pintasan keyboard spesifik yang dapat digunakan di berbagai aplikasi dan program.", + "keybind-global": "Global", + "keybind-enabled": "Diaktifkan", + "keybind-jsCode": "Kode Javascript", + "keybind-add": "Tambah", + "keybind-delete": "Hapus", + "detectable-missingFields": "Kolom tidak lengkap", + "detectable-fillAllFields": "Harap isi semua kolom sebelum menambahkan.", + "detectable-addApp": "Tambahkan Aplikasi yang Dapat Dideteksi", + "detectable-appName": "Nama Aplikasi*", + "detectable-appId": "ID Aplikasi*", + "detectable-themes": "Tema", + "detectable-aliases": "Alias", + "detectable-enabled": "Diaktifkan", + "detectable-placeholderName": "contoh Discord", + "detectable-placeholderId": "contoh 1234567890", + "detectable-placeholderThemes": "Aksi, Petualangan", + "detectable-placeholderAliases": "Alias1, Alias2", + "themes-success": "Berhasil!", + "themes-updated": "Tema berhasil diperbarui!", + "themes-bdInstalled": "Tema BD berhasil diinstal!", + "themes-delete": "Hapus", + "themes-edit": "Edit", + "themes-update": "Perbarui", + "themes-open": "Buka", + "themes-by": "oleh", + "themes-openQuickCss": "Buka file Quick CSS", + "themes-importFromFile": "Impor dari file", + "themes-openThemesFolder": "Buka folder tema", + "themes-import": "Impor", + "themes-importUrlPlaceholder": "[https://raw.githubusercontent.com/](https://raw.githubusercontent.com/)... [.theme.css]", + "games-registeredGames": "Game Terdaftar", + "games-refreshList": "Refresh daftar", + "games-add": "Tambah", + "games-remove": "Hapus", + "games-removeConfirmHeader": "Hapus game?", + "games-removeConfirmBody": "Game ini akan dihapus dari rich presence. Klien harus dimulai ulang agar perubahan berlaku.", + "games-noExecutables": "Tidak ada executable", + "games-empty": "Tidak ada game terdaftar. Tambahkan satu menggunakan dropdown di atas.", + "screenshare-selectSource": "Harap pilih sumber", + "screenshare-venmicDisabled": "Venmic dinonaktifkan", + "screenshare-share": "Bagikan", + "screenshare-title": "Screenshare", + "contextMenu-searchGoogle": "Cari dengan Google", + "contextMenu-searchDuckDuckGo": "Cari dengan DuckDuckGo", + "touchbar-servers": "Server", + "splash-title": "Legcord", + "settings-material": "Material Jendela", + "settings-material-desc": "Atur material latar belakang Jendela yang digunakan Legcord.", + "settings-material-mica": "Mica", + "settings-material-mica-alt": "Mica Alt", + "settings-material-acrylic": "Acrylic", + "settings-material-none": "Tidak ada", + "settings-csp": "Kebijakan Keamanan Konten", + "settings-csp-strict": "Ketat", + "settings-csp-none": "Tidak ada", + "settings-csp-vanilla": "Vanilla", + "settings-automaticClientUpdates": "Pembaruan klien otomatis", + "settings-automaticClientUpdates-desc": "Menonaktifkan pembaruan Legcord otomatis", + "settings-vaapi": "VAAPI", + "settings-vaapi-desc": "Gunakan VAAPI (akselerasi HW) untuk decoding video di Linux. Ini sangat mengurangi penggunaan CPU selama berbagi layar tetapi dapat menyebabkan masalah pada beberapa sistem. Nonaktifkan jika Anda mengalami crash atau layar hitam selama berbagi layar.", + "settings-mod-shelter": "Shelter", + "settings-mod-custom": "Kustom", + "settings-quickCss": "CSS Cepat", + "settings-quickCss-desc": "Edit CSS Anda dengan cepat di editor teks sederhana. Perubahan diterapkan segera setelah menyimpan file.", + "keybind-pushToTalk": "Tekan untuk berbicara", + "games-lastDetected": "Game yang terakhir terdeteksi", + "games-lastDetectedEmpty": "Belum ada game yang terdeteksi. Mulai game dengan rich presence untuk melihatnya di sini.", + "games-blacklist": "Daftar hitam", + "games-blacklisted": "Game yang masuk daftar hitam", + "games-blacklistedEmpty": "Tidak ada game yang masuk daftar hitam.", + "games-removeFromBlacklist": "Hapus", + "games-application": "Aplikasi", + "backup-dialogSave-title": "Simpan cadangan Legcord", + "backup-dialogOpen-title": "Buka cadangan Legcord", + "backup-pageTitle": "Cadangan dan pemulihan", + "backup-pageSubtitle": "Simpan atau pulihkan pengaturan Legcord Anda, termasuk setelan, tema, plugin, dan data mod—semua dalam satu file.", + "backup-createBackup": "Buat cadangan", + "backup-restore": "Pulihkan", + "backup-modalTitle": "Pilih apa yang masuk ke dalam cadangan ini", + "backup-includeLegcordConfig": "Setelan", + "backup-includeLegcordThemes": "Tema dan CSS Cepat", + "backup-includeLegcordPlugins": "Ekstensi Chrome/Penyimpanan plugin", + "backup-includeVencord": "Data Vencord (sesi saat ini)", + "backup-includeEquicord": "Data Equicord (sesi saat ini)", + "backup-includeShelter": "Plugin Shelter", + "backup-includeModBundles": "File mod klien yang diunduh (Vencord, Equicord, Shelter, bundel kustom)", + "backup-confirmBackup": "Ekspor", + "backup-successTitle": "Cadangan tersimpan", + "backup-successBody": "Cadangan Anda telah berhasil disimpan.", + "backup-cancelledTitle": "Dibatalkan", + "backup-cancelledBody": "Tidak ada file yang disimpan.", + "backup-failedTitle": "Cadangan gagal", + "backup-invalidFile": "Tidak dapat membaca file cadangan tersebut.", + "backup-unknownError": "Terjadi kesalahan.", + "backup-restoreConfirmHeader": "Pulihkan dari cadangan?", + "backup-restoreConfirmBody": "File di disk akan diganti di mana cadangan ini memiliki data. Anda mungkin perlu memulai ulang Legcord agar semua perubahan diterapkan.", + "backup-restoreConfirm": "Pulihkan", + "backup-restoreCancel": "Batal", + "backup-restoreDoneTitle": "Pemulihan selesai", + "backup-restoreDoneBody": "Data Anda telah dipulihkan. Mulai ulang Legcord agar semua perubahan berlaku.", + "supportBanner-title": "Dukung Proyek", + "supportBanner-subtitle": "Bantu kami terus mengembangkan Legcord. Dukungan Anda menjaga proyek tetap hidup dan memungkinkan kami menghadirkan lebih banyak fitur.", + "supportBanner-donate": "Donasi" +} diff --git a/assets/lang/it-IT.json b/assets/lang/it-IT.json deleted file mode 100644 index cc60fb5..0000000 --- a/assets/lang/it-IT.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_update": "Una nuova versione di ArmCord è disponibile. Per favore aggiorna all'ultima versione.", - "loading_screen_start": "Avvio di Armcord…", - "loading_screen_offline": "Sembra che tu sia offline. Ricomincia ", - "setup_question1": "Benvenuto nella configurazione di ArmCord", - "setup_question2": "Seleziona il tuo canale/istanza di Discord:", - "setup_question3": "ArmCord 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 ArmCord.", - "settings-tray": "Icona", - "settings-channel": "Canale Discord", - "settings-save": "Salva Impostazioni", - "settings-updater": "Controlla gli aggiornamenti", - "settings-mod": "Mod Client", - "settings-theme": "Tema ArmCord", - "settings-theme-default": "Default", - "settings-theme-native": "Nativo", - "settings-patches": "Patch automatiche", - "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-theme-desc1": "I \"Temi\" ArmCord personalizzano la funzione e il look dell'app.", - "settings-theme-desc2": "ecco come appare ArmCord quando lo avvii per la prima volta. Include la ricreazione di Discord\n barra del titolo personalizzata e stili specifici di ArmCord inseriti in Discord.", - "settings-theme-desc3": "utilizza la barra del titolo nativa del sistema operativo attualmente in esecuzione (ad esempio Windows 7/10). Funzioni più\n simile all'attuale app Discord su Linux.", - "settings-csp-desc": "ArmCord CSP è il nostro sistema che gestisce il caricamento di contenuti personalizzati nell'app Discord. Cose come\n le mod e i temi del client dipendono da questo. Disabilita se vuoi sbarazzarti di mod e stili personalizzati.", - "settings-patches-desk": "Recupera le patch distribuite se una versione risulta avere dei bug. Generalmente\n non ha bisogno di essere acceso continuamente (a meno che non venga notificato nel supporto Discord).", - "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-channel-desc1": "Puoi utilizzare questa impostazione per modificare l'istanza corrente di Discord:", - "settings-channel-desc2": "probabilmente hai più familiarità con questo. È quello che vedi in Discord nel client\n predefinito!", - "settings-channel-desc3": "questa è la versione di test alfa di Discord. Usandolo si ottiene l'accesso alle più recenti\n funzionalità e correzioni.", - "settings-channel-desc4": "build di prova pubblica. Riceve le funzionalità prima di stable ma è un po' più vecchio di Canary.", - "settings-tray-desc": "Se disabilitato, ArmCord 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-mod-shelter": "è una mod client di nuova generazione creata per essere essenzialmente a prova di proiettile.", - "settings-prfmMode-desc": "La modalità Performance è una funzione sperimentale che può aumentare la reattività e le prestazioni di\n ArmCord 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 ArmCord all'avvio dell'app.", - "settings-copyDebugInfo": "Copia informazioni di debug", - "settings-startMinimized": "Inizia ridotto a icona", - "settings-startMinimized-desc": "ArmCord 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-dynamicIcon": "Icona dinamica", - "settings-dynamicIcon-desc": "Seguendo il comportamento di Discord su Windows, questo mostra il numero di messaggi/ping non letti sull'icona di ArmCord anziché sulla barra delle applicazioni.", - "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-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-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" -} 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-JP.json b/assets/lang/ja-JP.json deleted file mode 100644 index 1e31482..0000000 --- a/assets/lang/ja-JP.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "yes": "はい", - "settings-theme-default": "デフォルト", - "settings-invitewebsocket": "リッチプレゼンス(実験的)", - "loading_screen_start": "ArmCordを起動中…", - "loading_screen_offline": "現在オフラインのようです。インターネットに接続し、再度お試しください。", - "loading_screen_update": "新しいバージョンのArmCordが見つかりました。最新版へ更新してください。", - "setup_question1": "ArmCordセットアップへようこそ", - "setup_offline": "現在オフラインのようです。インターネットへ接続し、ArmCordを再起動してください。", - "setup_question2": "Discordチャネル/インスタンスを選択してください:", - "setup_question3": "ArmCordでクライアントmodのインストールを処理する必要がありますか?", - "no": "いいえ", - "next": "次へ", - "setup_question4": "インストールしたいクライアントmodを選択してください:", - "settings-theme": "ArmCordテーマ", - "settings-theme-desc1": "ArmCord \"テーマ\" はアプリの機能と見た目を管理できます。", - "settings-theme-desc2": "これはArmCordを最初に起動する時の外観です。\nDiscordのカスタムタイトルバーと、ArmCordスタイルの再構築を含みます。", - "settings-theme-desc3": "現在実行しているOS( Windows 7/10 など)のネイティブタイトルバーを使用します。\nこれはLinux上でのDiscordアプリと似た機能です。", - "settings-theme-native": "ネイティブ", - "settings-csp-desc": "ArmCord CSPは、Discordアプリへのカスタムコンテンツの読み込みを管理するシステムです。\nクライアントmodやテーマはこれに依存します。modやカスタムスタイルを取り除きたい場合は無効にしてください。", - "settings-tray": "トレイ", - "settings-tray-desc": "無効にした場合、ArmCordを閉じると、他のウィンドウと同じように閉じます。それ以外の場合、ArmCordはシステムトレイに待機して後で使用できます。", - "settings-patches": "自動パッチ", - "settings-patches-desk": "リリースにバグがあることが判明した際に、パッチを取得します。\n通常は継続的に有効にする必要はありません(サポートDiscordで通知されていない限り)。", - "settings-mobileMode": "モバイルモード", - "settings-mobileMode-desc": "もしタッチスクリーン対応のデバイスをお使いであれば、この機能はあなたのためのものです!\nこれはスマートフォンやタブレット向けの隠されたDiscordのモバイルモードを有効にします。唯一欠けている主要な機能はボイスチャットのサポートのみです。\nこれは、PinePhoneや類似のデバイスをお使いのユーザーに最適です。", - "settings-channel": "Discordチャネル", - "settings-channel-desc1": "この設定を使用して、Discordのインスタンスを変更できます。", - "settings-channel-desc2": "おそらくこれが一番馴染みがあるでしょう。\nこれはデフォルトのDiscordクライアントで使用されるものです!", - "settings-channel-desc3": "これはDiscordのアルファテスト版です。\nこれを使用すると、最新の機能と修正にアクセスできるようになります。", - "settings-channel-desc4": "公開テスト版ビルドです。安定版より早く機能を受け取るようになりますが、Canaryよりは少し古いものです。", - "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-mod-shelter": "は、基本的に防弾仕様となるように構築された、新世代のクライアントmodです。", - "settings-prfmMode-desc": "パフォーマンスモードは、ArmCordの応答性とパフォーマンスを改善する...か、低下させる可能性がある実験的な機能です。\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": "ArmCordを起動した時のスプラッシュ画面をスキップします。", - "settings-copyDebugInfo": "デバッグ情報をコピーする", - "settings-startMinimized": "最小化状態で起動", - "settings-startMinimized-desc": "邪魔にならないように、ArmCordをバックグラウンドで起動します。", - "settings-crashesFolder": "ネイティブのクラッシュフォルダを開く", - "settings-forceNativeCrash": "強制的にクラッシュを発生させる", - "settings-disableAutogain": "オートゲインを無効化", - "settings-disableAutogain-desc": "自動ゲイン制御を無効化します。", - "settings-theme-transparent": "透過", - "settings-useLegacyCapturer": "レガシーキャプチャを使用する", - "settings-useLegacyCapturer-desc": "新しい画面共有モジュールの代わりに、従来の画面共有モジュールを使用します。もし画面共有で問題が発生している場合は、これを有効にしてみてください。", - "settings-dynamicIcon": "ダイナミックアイコン", - "settings-dynamicIcon-desc": "Windows版Discordの動作にならって、トレイの代わりにArmCordのアイコンに未読メッセージ/メンション数を表示します。", - "settings-spellcheck": "スペルチェック", - "settings-spellcheck-desc": "スペルミスを修正できるように、ミスのある単語をハイライト表示します。", - "setup_question5": "トレイアイコンを使用しますか?", - "settings-mintoTray": "トレイに最小化", - "settings-mintoTray-desc": "無効にすると、ArmCordを閉じた際は他のウィンドウと同じように閉じますが。\nそれ以外の場合はシステムトレイで待機し、後で使用できるようになります。", - "settings-theme-desc4": "ネイティブなタイトルバーを使用した透過ウィンドウ。これを使用するには互換性のあるテーマが必要です。Windowsのみ。", - "settings-MultiInstance": "マルチインスタンス", - "settings-MultiInstance-desc": "これを有効にすると、同時に複数のArmCordインスタンスを起動できるようになります。", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} diff --git a/assets/lang/ja.json b/assets/lang/ja.json new file mode 100644 index 0000000..bc37a7a --- /dev/null +++ b/assets/lang/ja.json @@ -0,0 +1,36 @@ +{ + "loading_screen_start": "Legcordを起動しています…", + "loading_screen_offline": "オフラインのようです。再起動まで ", + "loading_screen_update": "新しいバージョンのLegcordがあります。最新バージョンにアップデートしてください。", + "setup_question1": "Legcordセットアップへようこそ", + "setup_offline": "オフラインのようです。インターネットに接続してLegcordを再起動してください。", + "setup_question2": "Discordチャンネル/インスタンスを選択してください:", + "yes": "はい", + "no": "いいえ", + "next": "次", + "setup_question4": "インストールするクライアントmodを選択してください。", + "setup_question5": "トレイアイコンを使用しますか?", + "settings-csp-desc": "Legcord CSPは、Discordアプリへのカスタムコンテンツの読み込みを管理するシステムです。クライアントmodやテーマなどは、このシステムに依存しています。modやカスタムスタイルを削除したい場合は、これを無効にしてください。", + "settings-mod-vencord": "軽量で使いやすいクライアントmodです。プラグイン用の内蔵ストアを備えています。", + "settings-mod-equicord": "Vencordのコントリビューターによってフォークされ誕生した、非常にプラグインが充実したクライアントです。", + "settings-extendedPluginAbilities": "拡張プラグイン機能", + "settings-extendedPluginAbilities-desc": "プラグインがコンピュータ上の専用フォルダ(例: 削除されたメッセージのキャッシュ用)内のファイルを読み書きできるようにします。信頼できるプラグインに対してのみ有効にしてください。データはローカルに保存されます。データはLegcordの plugin-storage フォルダ内にプラグインごとに保存されます。", + "settings-theme": "ウィンドウスタイル", + "settings-theme-desc": "ウィンドウスタイルはLegcordのタイトルバーを設定します。", + "setup-windowStyle-nativeTitle": "ネイティブウィンドウ", + "setup-windowStyle-nativeDesc": "システムデフォルトのウィンドウ装飾を使用する", + "setup-windowStyle-customTitle": "カスタムタイトルバー", + "setup-windowStyle-customDesc": "Legcordのカスタムタイトルバーデザインを使用", + "setup-chooseWindowStyle": "ウィンドウスタイルを選択", + "settings-theme-native": "ネイティブ", + "settings-theme-default": "デフォルト(カスタム)", + "settings-theme-overlay": "オーバーレイ", + "settings-theme-transparent": "透明", + "settings-theme-legacy": "レガシー", + "settings-transparency": "透明化", + "settings-transparency-desc": "Legcordの透明化モードを設定します。", + "settings-transparency-universal": "ユニバーサル", + "settings-transparency-modern": "モダン", + "settings-transparency-tahoe-warning": "MacOS 26 Tahoeにおいて、透明化は過度なラグを引き起こす可能性があります。", + "detectable-themes": "テーマ" +} diff --git a/assets/lang/ko-KR.json b/assets/lang/ko-KR.json deleted file mode 100644 index 759eed9..0000000 --- a/assets/lang/ko-KR.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_start": "ArmCord 시작 중…", - "loading_screen_offline": "오프라인 상태인 것 같습니다. 인터넷에 연결하고 다시 시도해 주세요. ", - "settings-channel-desc4": "공개 테스트 빌드입니다. 안정적인 기능보다 먼저 기능을 수신하지만 Canary보다 약간 오래되었습니다.", - "settings-prfmMode": "성능 모드", - "setup_question1": "ArmCord 설정에 오신 것을 환영합니다.", - "setup_offline": "오프라인 상태인 것 같습니다. 인터넷에 연결하고 ArmCord를 다시 시작해 주세요.", - "loading_screen_update": "ArmCord의 새 버전을 사용할 수 있습니다. 최신 버전으로 업데이트해 주세요.", - "setup_question2": "Discord 채널/인스턴스를 선택:", - "setup_question3": "ArmCord가 클라이언트 모드 설치를 처리할까요?", - "yes": "예", - "no": "아니오", - "next": "다음", - "setup_question4": "설치할 클라이언트 모드 선택:", - "settings-theme": "ArmCord 테마", - "settings-theme-desc1": "ArmCord \"테마\"는 앱 동작과 모양을 관리합니다.", - "settings-theme-desc2": "ArmCord를 처음 실행할 때의 모습입니다. 여기에는 Discord의 커스텀\n 제목 표시줄의 구현과 ArmCord만의 스타일이 포함됩니다.", - "settings-theme-desc3": "현재 실행 중인 OS의 기본 제목 표시줄을 사용합니다 (예: Windows 7/10).\n Linux의 실제 Discord 앱과 더 유사하게 작동합니다.", - "settings-theme-default": "기본값", - "settings-theme-native": "OS 기본", - "settings-csp-desc": "ArmCord CSP는 디스코드 앱에 불러오는 맞춤형 콘텐츠 로드를 관리하는 시스템입니다. 이런\n 클라이언트 모드 및 테마는 이에 따라 다릅니다. 모드 및 사용자 정의 스타일을 제거하려면 비활성화하세요.", - "settings-tray": "트레이", - "settings-tray-desc": "비활성화하면 ArmCord는 닫을 때 다른 창처럼 닫히며, 그렇지 않으면 나중에 사용할 수 있도록 시스템 트레이에 대기 상태로 남아 있습니다.", - "settings-patches": "자동 패치", - "settings-patches-desk": "릴리스에 버그가 있는 것으로 판명된 경우 배포된 패치를 가져옵니다. 일반적으로\n(지원 디스코드에서 알림을 받지 않는 한) 을 계속 켜 놓을 필요는 없습니다.", - "settings-mobileMode": "모바일 모드", - "settings-channel-desc3": "이것은 디스코드의 알파 테스트 릴리스입니다. 그것을 사용하면 최신 정보\n 기능 및 수정 사항에 접속할 수 있습니다.", - "settings-invitewebsocket": "활동 상태 (실험적)", - "settings-mobileMode-desc": "터치 스크린이 있는 장치를 사용하는 경우 이 기능이 적합합니다! 디스코드의 숨겨진 모바일을 활성화하며\n 휴대전화와 태블릿을 위한 모드입니다. 이것은\n PinePhone 및 이와 유사한 사용자에게 이상적입니다.", - "settings-channel": "디스코드 채널", - "settings-channel-desc1": "이 설정을 사용하여 디스코드의 현재 인스턴스를 변경할 수 있음:", - "settings-channel-desc2": "당신은 아마도 이것을 가장 잘 알고 있을 것입니다. 기본 디스코드 클라이언트에서\n 볼 수 있는 것입니다!", - "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-mod-shelter": "기본적으로 방탄 기능을 갖춘 차세대 클라이언트 모드입니다.", - "settings-prfmMode-desc": "성능 모드는 ArmCord의 응답성과 성능을 증가시키거나…\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": "앱을 시작할 때 ArmCord 시작 화면을 건너뜁니다.", - "settings-copyDebugInfo": "디버그 정보 복사", - "settings-startMinimized": "최소화 시작", - "settings-startMinimized-desc": "ArmCord는 백그라운드에서 시작되며 방해가 되지 않습니다.", - "settings-crashesFolder": "네이티브 충돌 폴더 열기", - "settings-forceNativeCrash": "강제 네이티브 충돌", - "settings-disableAutogain": "자동 획득 비활성화", - "settings-disableAutogain-desc": "자동게인을 비활성화합니다.", - "settings-theme-transparent": "투명", - "settings-useLegacyCapturer": "레거시 캡처 프로그램 사용", - "settings-useLegacyCapturer-desc": "새로운 화면 공유 모듈 대신 레거시 화면 공유 모듈을 사용하세요. 화면 공유에 문제가 있는 경우 이를 활성화해 보세요.", - "settings-dynamicIcon": "다이내믹 아이콘", - "settings-dynamicIcon-desc": "윈도우즈에서 디스코드의 동작에 따라 트레이 대신 ArmCord 아이콘에 읽지 않은 메시지/핑 수가 표시됩니다.", - "settings-spellcheck": "맞춤법검사", - "settings-spellcheck-desc": "철자가 틀린 단어를 강조 표시하여 수정할 수 있도록 도와줍니다.", - "setup_question5": "트레이 아이콘을 사용하겠습니까?", - "settings-mintoTray": "트레이로 최소화", - "settings-mintoTray-desc": "비활성화하면 ArmCord는 닫을 때 다른 창처럼 닫히지만, 그렇지 않으면 시스템 트레이에 편안하게\n 나중에 사용할 수 있도록 시스템 트레이에 보관됩니다.", - "settings-theme-desc4": "기본 제목 표시줄이 있는 투명 창을 실행하려면 호환되는 테마가 필요합니다. 윈도우만 해당됩니다.", - "settings-MultiInstance": "다중 인스턴스", - "settings-MultiInstance-desc": "활성화되면 ArmCord의 많은 인스턴스를 시작할 수 있습니다.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} diff --git a/assets/lang/ko.json b/assets/lang/ko.json new file mode 100644 index 0000000..678621b --- /dev/null +++ b/assets/lang/ko.json @@ -0,0 +1,6 @@ +{ + "loading_screen_start": "Legcord 시작 중…", + "loading_screen_offline": "오프라인 상태인 것 같습니다. 재시작까지 남은 시간: ", + "loading_screen_update": "Legcord의 새 버전이 있습니다. 최신 버전으로 업데이트해주세요.", + "setup_question1": "Legcord 설치에 오신 것을 환영합니다" +} diff --git a/assets/lang/lt-LT.json b/assets/lang/lt-LT.json deleted file mode 100644 index bb7401c..0000000 --- a/assets/lang/lt-LT.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "next": "Kitas", - "settings-theme": "ArmCord tema", - "settings-theme-default": "Numatytas", - "settings-theme-native": "Vietinis", - "setup_question1": "Pasirinkite, koki diegimą jūs norėtumėt atlikti:", - "loading_screen_start": "ArmCord 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 ArmCord 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 ArmCord iš naujo.", - "setup_question2": "Pasirinkite pageidaujamą Discord versiją/kanalą:", - "setup_question3": "Ar ArmCord turėtų tvarkyti kliento modifikacijų diegimą?", - "yes": "Taip", - "no": "Ne", - "setup_question4": "Pasirinkite kliento modifikaciją, kurią norite įdiegti:", - "settings-theme-desc1": "ArmCord \"temos\" kontroliuoja programos elgesį ir išvaizdą.", - "settings-theme-desc2": "štai kaip atrodo ArmCord išvaizdos kai pirmą kart paleidžiate. Į tai įeina Discord \n tinkintos pavadinimo juostos perkūrimas ir ArmCord konkretūs stiliai įdėti į Discord.", - "settings-theme-desc3": "naudoja nomatytą pavadinimo juostą iš jūsų OS, kurią dabar naudojate (pvz. Windows 7/10). Funkcijos\n panašios į tikrą Discord programą ant Linux.", - "settings-theme-transparent": "Permatomas (Eksperimentinis)", - "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.", - "settings-tray": "Minimize to tray", - "settings-tray-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-startMinimized": "Start minimized", - "settings-startMinimized-desc": "ArmCord starts in background and remains out of your way.", - "settings-patches": "Automatic Patches", - "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-patches-desk": "Fetches automatic patches that are distributed if release turns out to have bugs after release. Usually\n you don't have to keep this enabled, unless notified in support Discord.", - "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-dynamicIcon": "Dynamic icon", - "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-channel": "Discord channel", - "settings-channel-desc1": "You can use this setting to change current instance of Discord:", - "settings-channel-desc2": "you're probably most familiar with this one. It's the one you see in default Discord\n client!", - "settings-trayIcon-dynamic": "Dynamic", - "settings-channel-desc3": "this is alpha test release of Discord. By using it you gain access to the newest\n features and fixes.", - "settings-channel-desc4": "public test build. Receives features earlier than stable but is a bit older than Canary.", - "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-mod-shelter": "is a new generation client mod built to be essentially bulletproof.", - "settings-prfmMode": "Performance mode", - "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-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 ArmCord 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, ArmCord 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-theme-desc4": "transparent window with native titlebar, you need a compatible theme to run this. Windows only.", - "settings-MultiInstance": "Multi Instance", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of ArmCord.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} 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 deleted file mode 100644 index 1be5aa9..0000000 --- a/assets/lang/nb-NO.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_start": "Starter ArmCord …", - "loading_screen_offline": "Du er uten internett. Starter på nytt om ", - "loading_screen_update": "En ny versjon av ArmCord er tilgjengelig. Oppgrader til siste versjon.", - "setup_question1": "Velkommen til Armcord-oppsettet", - "setup_question2": "Velg din Discor-kanal/instans:", - "yes": "Ja", - "no": "Nei", - "setup_question3": "Skal ArmCord håndtere installasjon av klient-modifikasjoner?", - "setup_offline": "Det ser ut til at du er frakoblet. Koblet til Internett og start ArmCord 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": "ArmCord-drakt", - "settings-theme-default": "Default", - "settings-theme-native": "Native", - "settings-patches": "Automatic Patches", - "settings-invitewebsocket": "discord.gg support", - "settings-prfmMode": "Ytelsesmodus", - "settings-prfmMode-performance": "Performance", - "settings-prfmMode-battery": "Battery", - "settings-none": "None", - "settings-mobileMode": "Mobilmodus", - "settings-theme-desc1": "Draktene endrer systemadferd og utseende.", - "settings-theme-desc2": "ArmCord ser slik ut første gang du starter deg. Her finner du et gjenskapt\n tilpasset tittelfelt og spesifikke ArmCord-stiler som injiseres i Discord..", - "settings-theme-desc3": "Bruker det systemspesifikke tittelfeltet tilhørende operativsystemet du bruker (f.eks Windows 7/10).\n Fungerer mer likt det faktiske Dicrod-programmet på Linux|GNU.", - "settings-csp-desc": "ArmCord 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 ArmCord lukkes som ethvert annet vindu. Ellers vil det være i systemkurven din for senere bruk.", - "settings-channel-desc1": "Du kan bruke denne innstillingen for å endre den nåværende Discord-instansen:", - "settings-patches-desk": "Henter automatiske feilfikser som distribueres hvis utgivelsen viser seg å ha feil etter at den er sluppet.\n Vanligvis trenger ikke dette å forbli påslått, med mindre det varsles i støtte-Discord-en.", - "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-channel-desc2": "Du kjenner antagelig denne best. Det er den som brukes i den forvalgte Discord-\n klienten.", - "settings-channel-desc3": "dette er en alfa-testutgave av Discord. Ved å bruke den får du tilgang til de nyeste\n funksjonene og fiksene.", - "settings-channel-desc4": "Offentlig test-bygg. Får funksjoner tidligere enn den stabile versjonen, men litt senere enn Canary.", - "settings-invitewebsocket-desc": "Når dette er påskrudd støtter ArmCord Discord.gg-lenker, noe som betyr at ArmCord 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-shelter": "er en ny generasjons klient-mod bygget for å være i hovedsak skuddsikker.", - "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 ArmCord 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 ArmCord-velkomstskjermen når du starter opp appen.", - "settings-copyDebugInfo": "Kopier feilsøkingsinformasjon", - "settings-startMinimized-desc": "ArmCord 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-dynamicIcon": "Dynamisk ikon", - "settings-dynamicIcon-desc": "Etter Discords oppførsel på Windows, viser dette antallet uleste meldinger/pinger på ArmCords ikon i stedet for i skuffen.", - "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 ArmCord lukkes som andre vinduer vanligvis gjør, ellers vil den sitte å slappe av\n i skuffen for senere bruk.", - "settings-theme-desc4": "gjennomsiktig vindu med innebygd tittelinje, du trenger et kompatibelt tema for å bruke dette. Kun windows.", - "settings-MultiInstance": "Flerinstans", - "settings-MultiInstance-desc": "Når avskurdd vil du ha muligheten til å starte mange instanser med ArmCord.", - "settings-copyGPUInfo": "Kopier GPU-informasjon", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} 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-NL.json b/assets/lang/nl-NL.json deleted file mode 100644 index 1824805..0000000 --- a/assets/lang/nl-NL.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "setup_question1": "Welkom bij de ArmCord Setup", - "setup_question3": "Moet ArmCord client mods installeren?", - "yes": "Ja", - "no": "Nee", - "setup_offline": "Het lijkt erop alsof je offline bent. Verbind met het internet en herstart ArmCord setup.", - "loading_screen_start": "ArmCord 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 ArmCord 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-patches": "Automatische Patches", - "settings-theme": "ArmCord 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-channel-desc3": "this is alpha test release of Discord. By using it you gain access to the newest\n features and fixes.", - "settings-invitewebsocket-desc": "When enabled ArmCord will support Discord.gg links which means that if you open an invite link in your\n browser, ArmCord will automatically accept the invite. Can be unresponsive at times.", - "settings-theme-desc1": "ArmCord thema's beheren de functionaliteit en het uitzien van de app.", - "settings-theme-desc2": "Dit is hoe ArmCord er uit ziet als je het de eerste keer opstart. Het bevat een recreatie van Discords aangepaste titlebalk en ArmCord specifieke stijlen geïnjecteerd in Discord.", - "settings-theme-desc3": "gebruikt de oorspronkelijke titelbalk van je besturingssysteem (bijvb. Windows 7/10). \nWerkt meer hetzelfde als de orginele Discord app op Linux.", - "settings-csp-desc": "ArmCord 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, ArmCord will close like any other window when closed, otherwise it'll sit back and relax\n in your system tray for later.", - "settings-patches-desk": "Fetches automatic patches that are distributed if release turns out to have bugs after release. Usually\n you don't have to keep this enabled, unless notified in support Discord.", - "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-desc1": "You can use this setting to change current instance of Discord:", - "settings-channel-desc2": "you're probably most familiar with this one. It's the one you see in default Discord\n client!", - "settings-channel-desc4": "public test build. Receives features earlier than stable but is a bit older than Canary.", - "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 ArmCord 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-mod-shelter": "is a new generation client mod built to be essentially bulletproof.", - "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-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": "ArmCord 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-dynamicIcon": "Dynamic icon", - "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-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, 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-desc4": "transparant venster met native titelbalk, je hebt een compatibel thema nodig om dit uit te voeren. Alleen voor Windows.", - "settings-MultiInstance": "Multi Instance", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of ArmCord.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} 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-PL.json b/assets/lang/pl-PL.json deleted file mode 100644 index 2670022..0000000 --- a/assets/lang/pl-PL.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_update": "Nowa wersja ArmCord jest dostępna. Proszę zaktualizować do najnowszej wersji.", - "setup_question2": "Wybierz swój kanał/odmianę Discorda:", - "setup_question3": "Czy ArmCord 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 ArmCord…", - "loading_screen_offline": "Wygląda na to, że jesteś offline. Uruchom ponownie za ", - "setup_question1": "Witaj w konfiguracji ArmCord'a", - "setup_offline": "Wygląda na to, że jesteś offline. Połącz się z Internetem i uruchom ponownie ArmCord.", - "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 ArmCord", - "settings-theme-default": "Domyślny", - "settings-theme-native": "Natywny", - "settings-patches": "Automatyczne łatki", - "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-theme-desc1": "Motywy ArmCord zarządzają zachowanie i wygląd aplikacji.", - "settings-theme-desc2": "tak wygląda ArmCord przy pierwszym uruchomieniu. Zawiera rekreację\n paska tytułowego Discorda oraz specjalne style ArmCorda wstrzyknięte do Discorda.", - "settings-theme-desc3": "używa natywnego paska zadań twojego systemu(np. Windows 7/10). Funkcjonuje\n bliżej do normalnego Discorda na Linuxie.", - "settings-csp-desc": "ArmCord 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, ArmCord zamknie swoje okno jak każda inna aplikacja, jednak gdy jest włączone usiądzie i odpocznie w zasobniku systemowym.", - "settings-patches-desk": "Ściąga automatyczne łatki, które są rozprowadzane jeśli wersja okaże się mieć błędy. Najczęśćiej\n nie musisz mieć tego włączonego, chyba że poproszony/a na Discordzie wsparcia.", - "settings-mobileMode-desc": "Jeśli jesteś na urządzeniu z dotykowym ekranem, ta opcja jest dla ciebie! Aktywuje ona ukryty tryb Discord\n przeznaczony na telefony i tablety. Jedyna większa brakująca funkcja to kanał głosowy. Jest to idealne rozwiązanie dla\n użytkowników PinePhone i podobnych.", - "settings-channel-desc1": "Możesz użyć tej opcji aby zmienić obecny kanał Discorda:", - "settings-channel-desc2": "jesteś najpewniej najbardziej zapoznany z tym. Jest on używany w domyślnym oficjalnym kliencie\n Discorda!", - "settings-channel-desc3": "jest to wersja alpha Discorda. Poprzez używanie jej otrzymujesz dostęp do najnowszych\n funkcji i poprawek.", - "settings-channel-desc4": "publiczny kanał testowania. Dostaje funkcje szybciej niż stable, jednak jest troche starszy od Canary.", - "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-mod-shelter": "to modyfikacja klienta nowej generacji zbudowania do bycia praktycznie kuloodporną.", - "settings-prfmMode-desc": "Tryb wydajności to eksperymentalna funkcja, która może albo zwiększyć responsywność i wydajność\n ArmCorda 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 ArmCorda kiedy uruchamiasz aplikację.", - "settings-copyDebugInfo": "Skopiuj Informacje Debugowania", - "settings-startMinimized": "Uruchamiaj zminimalizowany", - "settings-startMinimized-desc": "ArmCord 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-dynamicIcon": "Dynamiczna ikona", - "settings-dynamicIcon-desc": "Naśladując zachowanie Discorda na systemie Windows, ta opcja pokazuje ilość nieprzeczytanych wiadomości/oznaczeń na ikonie aplikacji ArmCorda, zamiast w trayu.", - "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 ArmCord zamknie się jak każde inne okno po zamknięciu, w przeciwnym razie usiądzie i zrelaksuje się\n w zasobniku systemowym na później.", - "settings-theme-desc4": "przeźroczyste okno z natywnym paskiem zadań, potrzebujesz kompatybilny motyw żeby to działało. Tylko dla Windows'a.", - "settings-MultiInstance": "Wiele instancji", - "settings-MultiInstance-desc": "Kiedy ta opcja jest włączona możliwe jest uruchomienie wielu instancji ArmCord.", - "settings-copyGPUInfo": "Skopiuj informacje o GPU", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} diff --git a/assets/lang/pl.json b/assets/lang/pl.json new file mode 100644 index 0000000..a59af8d --- /dev/null +++ b/assets/lang/pl.json @@ -0,0 +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 deleted file mode 100644 index 295f61d..0000000 --- a/assets/lang/pt-BR.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "no": "Não", - "loading_screen_start": "Iniciando ArmCord…", - "loading_screen_offline": "Você parece estar offline. Por favor, conecte-se à internet e tente novamente.", - "loading_screen_update": "Uma nova versão do ArmCord está disponível. Por favor, atualize para a versão mais recente.", - "setup_question1": "Bem-vindo à configuração do ArmCord", - "setup_offline": "Você parece estar offline. Por favor, conecte-se à internet e reinicie o ArmCord.", - "setup_question2": "Escolha o canal/instância do seu Discord:", - "setup_question3": "O ArmCord 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 ArmCord", - "settings-theme-default": "Padrão", - "settings-theme-native": "Nativo", - "settings-tray": "Minimizar para a Bandeja", - "settings-patches": "Patches automáticos", - "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-channel-desc1": "Você pode usar esta opção para alterar a atual instância do Discord:", - "settings-theme-desc1": "Os \"temas\" do ArmCord gerenciam o comportamento e a aparência de aplicativos.", - "settings-theme-desc2": "esta é a aparência do ArmCord quando você o inicia pela primeira vez. Inclui uma recriação\n personalizada da barra de título do Discord e estilos específicos do ArmCord injetados nele.", - "settings-theme-desc3": "utiliza a barra de título nativa do SO que você está executando no momento (no Windows 7/10). Funções mais\n parecidas com o real aplicativo do Discord no Linux.", - "settings-csp-desc": "ArmCord 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-patches-desk": "Busca patches que são distribuídos se a versão mais recente apresentar bugs. Normalmente\n você não precisa manter isso ativado, precisa ser ligado continuamente (a menos que seja notificado no suporte do Discord).", - "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 ArmCord irá encerrar como qualquer outra janela quando for fechado, caso contrário, permanecerá em repouso na bandeja do seu sistema para mais tarde.", - "settings-channel-desc2": "você provavelmente está mais familiarizado com este. É o que você vê no cliente padrão do\n Discord!", - "settings-channel-desc3": "esta é a versão de teste alfa do Discord. Ao utilizá-la, você obtém acesso aos recursos e correções\n mais recentes.", - "settings-invitewebsocket-desc": "Usa arRPC para dar suporte ao Discord RPC (Rich Presence) com programas locais na sua máquina. Trabalho em andamento.", - "settings-channel-desc4": "canal de teste público. Recebe recursos mais cedo do que o estável, mas é um pouco mais antigo do que o Canary.", - "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-mod-shelter": "é um mod de nova geração feito para ser essencialmente a prova de balas.", - "settings-prfmMode-desc": "O modo de performance é uma função experimental que pode ou melhorar a capacidade de resposta e performance do \n ArmCord, 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 ArmCord quando você abre o aplicativo.", - "settings-copyDebugInfo": "Copiar Informação de Depuração", - "settings-startMinimized": "Iniciar minimizado", - "settings-startMinimized-desc": "ArmCord 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-dynamicIcon": "Ícone dinâmico", - "settings-dynamicIcon-desc": "Seguindo o comportamento do Discord no Windows, isto mostra a contagem de mensagens não lidas/menções no ícone do ArmCord ao invés da bandeja.", - "settings-spellcheck": "Verificaçã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, ArmCord 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-theme-desc4": "janela transparente com titlebar nativa, você precisa de um tema compatível para executar isto. Apenas Windows.", - "settings-MultiInstance": "Multi Instância", - "settings-MultiInstance-desc": "Quando ativado você será capaz de iniciar múltiplas instâncias do ArmCord.", - "settings-copyGPUInfo": "Copiar informação da GPU", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} diff --git a/assets/lang/pt-PT.json b/assets/lang/pt-PT.json deleted file mode 100644 index fe157aa..0000000 --- a/assets/lang/pt-PT.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_offline": "Parece estar offline. Por favor, conecte à internet e tente novamente.", - "settings-channel-desc2": "provavelmente está mais familiarizado com este. É o que vê no cliente padrão do\n Discord!", - "settings-disableAutogain-desc": "Desativa ganho automático.", - "settings-startMinimized": "Iniciar minimizado", - "settings-trayIcon-white-plug-alt": "Plugue Branco Alternativo", - "settings-theme-desc1": "Os \"temas\" do ArmCord gerem o comportamento e a aparência de apps.", - "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-channel-desc4": "canal de teste público. Recebe recursos mais cedo do que o estável, mas é um pouco mais antigo do que o Canary.", - "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-theme-desc3": "utiliza a barra de título nativa do SO que executa no momento (no Windows 7/10). Funções mais\n parecidas com a app real do Discord no Linux.", - "settings-mod-shelter": "é um mod de nova geração feito para ser essencialmente a prova de balas.", - "settings-patches": "Patches automáticos", - "settings-updater": "Verificar atualizações", - "settings-theme": "Tema do ArmCord", - "settings-mintoTray-desc": "Quando desativado, ArmCord 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", - "settings-channel-desc1": "Pode usar esta opção para alterar a atual instância do Discord:", - "setup_question4": "Selecione um mod de cliente que deseja instalar:", - "settings-dynamicIcon-desc": "Seguindo o comportamento do Discord no Windows, isto mostra a contagem de mensagens não lidas/menções no ícone do ArmCord ao invés da bandeja.", - "settings-theme-native": "Nativo", - "settings-themesFolder": "Abrir pasta de temas", - "setup_offline": "Parece estar offline. Por favor, conecte à internet e reinicie o ArmCord.", - "setup_question1": "Bem-vindo à configuração do ArmCord", - "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 ArmCord quando abre a app.", - "setup_question3": "O ArmCord deve lidar com a instalação de mods do cliente?", - "settings-MultiInstance-desc": "Quando ativado será capaz de iniciar múltiplas instâncias do ArmCord.", - "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 ArmCord, 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-patches-desk": "Busca patches que são distribuídos se a versão mais recente apresentar bugs. Normalmente\n não precisa manter isso ativado, precisa ser ligado continuamente (a menos que seja notificado no suporte do Discord).", - "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 ArmCord…", - "settings-theme-desc2": "esta é a aparência do ArmCord quando o inicia pela primeira vez. Inclui uma recriação\n personalizada da barra de título do Discord e estilos específicos do ArmCord injetados nele.", - "setup_question5": "Pretende usar o ícone de programa?", - "settings-invitewebsocket": "Rich Presence (Experimental)", - "settings-save": "Gravar configurações", - "settings-tray-desc": "Quando desativado, o ArmCord 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-channel-desc3": "esta é a versão de teste alfa do Discord. Ao utilizá-la, obtém acesso aos recursos e correções\n mais recentes.", - "settings-theme-desc4": "janela transparente com titlebar nativa, precisa de um tema compatível para executar isto. Apenas Windows.", - "settings-startMinimized-desc": "ArmCord abre em segundo plano sem te incomodar.", - "settings-pluginsFolder": "Abrir pasta de plugins", - "settings-dynamicIcon": "Ícone dinâmico", - "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 ArmCord está disponível. Por favor, atualize à versão mais recente.", - "settings-experimental": "Experimental", - "settings-none": "Nenhum", - "settings-csp-desc": "ArmCord 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" -} diff --git a/assets/lang/pt_BR.json b/assets/lang/pt_BR.json new file mode 100644 index 0000000..4dd2a74 --- /dev/null +++ b/assets/lang/pt_BR.json @@ -0,0 +1,249 @@ +{ + "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.", + "setup_question3": "Legcord deve cuidar da instalação dos mods do cliente?", + "loading_screen_offline": "Você parece estar offline. Reinício em ", + "setup_question4": "Escolha um mod que você deseja instalar:", + "setup_question5": "Você deseja usar o ícone de bandeja?", + "settings-theme-default": "Padrão (Customizado)", + "settings-theme-native": "Nativo", + "settings-theme-overlay": "Sobreposição", + "settings-autoHideMenuBar": "Esconder barra de menu automáticamente", + "settings-autoHideMenuBar-desc": "Esconder barra de menu automáticamente quando não estiver em uso.", + "settings-sleepInBackground": "Descansar em segundo plano", + "settings-sleepInBackground-desc": "Ativa a limitação de recursos do Chromium em segundo plano. Isso pode ajudar com economia de bateria, mas pode quebrar funcionalidade das notificações.", + "settings-transparency-modern": "Moderno", + "settings-transparency-tahoe-warning": "Transparência pode causar perda excessiva de performance em MacOS 26 (Tahoe).", + "settings-venmic-workaround": "Solução alternativa/temporária", + "settings-venmic-workaround-desc": "Ativa ou desativa a solução alternativa para um problema que causa o microfone ser compartilhado, invés do áudio escolhido.", + "settings-venmic-deviceSelect": "Escolha o dispositivo", + "settings-venmic-deviceSelect-desc": "Permitir selecionar um dispositivo de áudio.", + "settings-venmic-granularSelect-desc": "Permitir seleção de entradas de áudio.", + "settings-venmic-onlySpeakers-desc": "Apenas usar alto-falantes para seleção de áudio.", + "settings-theme-desc": "O estilo de janela decide que barra de título Legcord vai usar.", + "settings-popoutPiP": "Elevação de Chamada sempre acima", + "settings-venmic-granularSelect": "Seleção detalhada", + "settings-venmic-ignoreInputMedia-desc": "Ignorar entrada de áudio de fontes de mídia.", + "settings-venmic-onlyDefaultSpeakers": "Apenas alto-falante padrão", + "detectable-fillAllFields": "Por favor, preencha todos os campos antes de adicionar.", + "detectable-missingFields": "Campos ou seleções faltando", + "keybind-delete": "Apagar", + "keybind-add": "Adicionar", + "keybind-jsCode": "Código Javascript", + "keybind-enabled": "Habilitado", + "detectable-enabled": "Habilitado", + "splash-title": "Legcord", + "touchbar-servers": "Servidores", + "contextMenu-searchDuckDuckGo": "Pesquisar com DuckDuckGo", + "contextMenu-searchGoogle": "Pesquisar com Google", + "screenshare-title": "Compartilhar tela", + "screenshare-share": "Compartilhar", + "screenshare-venmicDisabled": "Venmic desabilitado", + "screenshare-selectSource": "Por favor, selecione uma tela ou uma janela", + "games-application": "Aplicativo", + "games-removeFromBlacklist": "Remover", + "games-blacklistedEmpty": "Nenhum jogo na lista-negra.", + "games-blacklisted": "Jogos na lista-negra", + "games-blacklist": "Lista-negra", + "games-lastDetectedEmpty": "Nenhum jogo detectado ainda. Inicie um jogo que possua RichPresence, e aí você vai ver ele aqui.", + "games-lastDetected": "Últimos jogos detectados", + "games-empty": "Nenhum jogo registrado. Adicione um usando o menu de seleção acima.", + "games-noExecutables": "Nenhum executável", + "games-removeConfirmBody": "Esse jogo terá a RichPresence removida. Reinicie para as mudanças terem efeito.", + "games-removeConfirmHeader": "Remover jogo?", + "games-remove": "Remover", + "games-add": "Adicionar", + "games-refreshList": "Atualizar lista", + "games-registeredGames": "Jogos registrados", + "themes-importUrlPlaceholder": "https://raw.githubusercontent.com/... [.tema.css]", + "themes-import": "Importar", + "themes-openThemesFolder": "Abrir pasta de temas", + "themes-importFromFile": "Importar de um arquivo", + "themes-openQuickCss": "Abrir editor de CSS Rápido", + "themes-by": "por", + "themes-open": "Abrir", + "themes-update": "Atualizar", + "themes-edit": "Editar", + "themes-delete": "Apagar", + "themes-bdInstalled": "Tema do BetterDiscord instalado com sucesso!", + "themes-updated": "Tema atualizado com sucesso!", + "themes-success": "Sucesso!", + "detectable-placeholderAliases": "Apelido1, Apelido2", + "detectable-placeholderThemes": "Ação, Aventura", + "detectable-placeholderId": "ex. 1234567890", + "detectable-placeholderName": "ex. Discord", + "detectable-aliases": "Apelidos", + "settings-bounceOnPing": "Agitar na barra de tarefas às notificações", + "settings-bounceOnPing-desc": "Agitar o aplicativo na barra de tarefas quando você receber uma notificação.", + "settings-popoutPiP-desc": "Quando habilitado, a elevação da chamada atual sempre ficará acima de outros elementos.", + "settings-venmic-ignoreInputMedia": "Ignorar mídia de entrada", + "settings-venmic-onlyDefaultSpeakers-desc": "Usar apenas alto-falantes para seleção de áudio.", + "settings-openCustomIconDialog": "Definir ícone de desktop", + "settings-csp-desc": "\"Legcord CSP\" é o nosso sistema que cuida do carregamento de conteúdo customizado dentro do cliente do DIscord. Coisas como modificações e temas dependem desse sistema. Desabilite se quiser se livrar de modificações e estilos customizados.", + "settings-mintoTray": "Funcionar em segundo plano", + "settings-mintoTray-desc": "Quando desabilitado, Legcord será fechado como qualquer outra janela, do contrário, ele funcionará em segundo plano e ficará na bandeja do sistema disponível a qualquer momento.", + "settings-startMinimized": "Abrir minimizado", + "settings-startMinimized-desc": "Legcord inicia em segundo plano e fica fora do seu caminho.", + "settings-useSystemCssEditor": "Usar editor de estilo (CSS) do sistema", + "settings-useSystemCssEditor-desc": "Usar editor de estilo padrão do sistema para editar CSS.", + "settings-MultiInstance": "Múltiplas instâncias", + "settings-MultiInstance-desc": "Quando habilitado, você poderá quantas instâncias do Legcord que você quiser, ao mesmo tempo.", + "settings-mobileMode": "Modo de celular", + "settings-mobileMode-desc": "Se você está em um dispositivo sensível ao toque, essa função é pra você! Ativa a opção oculta do Discord para dispositivos móveis como tablets e celulares. Única função importante que falta é compatibilidade com chat de voz. Essa opção é ideal para\n usuários de PinePhone e outros.", + "settings-spellcheck": "Corretor automático", + "settings-spellcheck-desc": "Ajuda você a corrigir palavras escritas incorretamente sublinhando elas.", + "settings-vaapi": "VAAPI", + "settings-vaapi-desc": "Use VAAPI (aceleração de hardware) para fazer decodificação de vídeo no Linux. Essa opção ajuda a reduzir drásticamente o uso de CPU durante o compartilhamento de tela, mas pode causar problemas em alguns sitemas. Desabilite essa opção caso você expirencie travamentos ou \"tela-preta\" durante compartilhamento de tela.", + "settings-channel": "Canal do Discord", + "settings-channel-desc": "Habilite essa configuração para mudar a instância atual do Discord que o Legcord está usando.", + "settings-bitrateMin": "Birate mínimo", + "settings-bitrateMin-desc": "Bitrate mínimo para compartilhamento de tela.", + "settings-bitrateMax": "Bitrate máximo", + "settings-bitrateMax-desc": "Bitrate máximo para compartilhamento de tela.", + "settings-bitrateTarget": "Bitrate Alvo", + "settings-bitrateTarget-desc": "Bitrate alvo para compartilhamento de tela.", + "settings-invitewebsocket": "Rich Presence", + "settings-invitewebsocket-desc": "Usa arRPC para o funcionamento da Rich Presence do Discord com programas locais da sua máquina.", + "settings-useMacSystemPicker": "Usar o seletor de sistema padrão do macOS", + "settings-useMacSystemPicker-desc": "Usa o compartilhamento de tela padrão do macOS quando possível. Apenas para macOS 15+", + "settings-additionalArguments": "Argumentos adicionais", + "settings-additionalArguments-desc": "Argumentos adicionais são comandos extras que você pode adicionar ao Legcord. Eles podem ser usados para habilitar ou desabilitar funções ou corrigir problemas.", + "settings-mod": "Modificação de Cliente", + "settings-noBundleUpdates": "Sem updates em pacotes", + "settings-noBundleUpdates-desc": "Desabilita updates automáticos para mods deste cliente.", + "settings-hardwareAcceleration": "Aceleração de Hardware", + "settings-hardwareAcceleration-desc": "Aceleração de Hardware usa sua GPU para ajudar no desempenho gráfico. Se você estiver experienciando problemas ou bugs visuais, tente desabilitar essa opção.", + "settings-processScanning": "Escaneamento de processos ativos", + "settings-processScanning-desc": "Habilita o escaneamento de processos para encontrar jogos que estão rodando para melhorar a detecção do RichPresence.", + "settings-windowsLegacyScanning": "Escaneamento antigo do Windows", + "settings-windowsLegacyScanning-desc": "Usa o escaneamento de processos antigo do Windows (prév. v1.1.6). Pode ajudar a compatibilidade de alguns sistemas mas esse método é menos eficiente.", + "settings-scanInterval": "Intervalo de escaneamento (ms)", + "settings-scanInterval-desc": "Configura o quão frequente (em milisegundos) o escaneamento de processos ocorre. Valores menores podem melhorar a rapidez da detecção de processos, mas vão aumentar o uso do processador.", + "settings-blockPowerSavingInVoiceChat": "Impedir economia de bateria em chats de voz", + "settings-blockPowerSavingInVoiceChat-desc": "Impede Legcord de ser suspenso. Mantém o sistema ativo mas permite que a tela seja desligada/descansada.", + "settings-mod-desc1": "Mods do cliente são programas que permitem você customizar sua experiência no Discord. Mods podem mudar a aparência do cliente, modificar comportamentos e até adicionar novas funcionalidades!", + "settings-mod-vencord": "Mod leve, e fácil de usar. Vem com uma loja integrada para plugins.", + "settings-mod-equicord": "Nascido de uma fork de contribuidores do Vencord, traz um cliente rico em plugins.", + "settings-prfmMode": "Modo de performance", + "settings-prfmMode-desc": "Modo de performance é uma funcionalidade experimental do Legcord feita para otimizar responsitividade e performance baseado nas suas nescessidades. Impacto pode variar dependendo da configuração da sua máquina e seu uso, então recomendamos tentar cada modo e escolher um que sirva melhor para você.", + "settings-prfmMode-performance": "Performance", + "settings-prfmMode-battery": "Bateria", + "settings-prfmMode-dynamic": "Dinâmico", + "settings-prfmMode-vaapi": "VAAPI", + "settings-disableAutogain": "Desabilitar ganho automático", + "settings-disableAutogain-desc": "Desabilita ganho automático.", + "settings-disableHttpCache": "Desabilitar cache HTTP", + "settings-disableHttpCache-desc": "Desabilita o cache HTTP do Chromium. Desabilite essa opção se mods não carregarem.", + "settings-trayIcon": "Ícone de bandeja", + "settings-trayIcon-desc": "Escolha um ícone de bandeja.", + "settings-trayIcon-disabled": "Desabilitar aplicativo de bandeja", + "settings-trayIcon-dynamic": "Dinâmico", + "settings-trayIcon-normal": "Ícone do Discord", + "settings-trayIcon-classic": "Ícone clássico do Discord", + "settings-trayIcon-colored-plug": "Tomada colorida", + "settings-trayIcon-white-plug": "Tomada branca", + "settings-trayIcon-white-plug-alt": "Tomada branca (alternativa)", + "settings-trayIcon-black-plug": "Tomada preta", + "settings-trayIcon-black-plug-alt": "Tomada preta (alternativa)", + "settings-advanced": "Zona para usuários avançados", + "settings-pluginsFolder": "Abrir pasta de plugins", + "settings-crashesFolder": "Abrir pasta de crashes nativa", + "settings-themesFolder": "Abrir pasta de temas", + "settings-storageFolder": "Abrir pasta de armazenamento", + "settings-none": "Nenhum", + "settings-save": "Salvar Configurações", + "settings-experimental": "Experimental", + "settings-restart": "Reiniciar Applicativo", + "settings-updater": "Verificar por updates", + "settings-copyGPUInfo": "Copiar informação de GPU", + "settings-skipSplash": "Pular tela de introdução", + "settings-skipSplash-desc": "Pula a janela de introdução do Legcord quando você o inicia.", + "settings-copyDebugInfo": "Copiar informação de debug", + "settings-clearClientModCache": "Limpar o cache de mods do cliente", + "settings-forceNativeCrash": "Forçar crash nativo", + "settings-smoothScroll": "Usar rolamento suave", + "settings-smoothScroll-desc": "Ativa o rolamento suave", + "settings-autoScroll": "Ativar rolamento automático", + "settings-autoScroll-desc": "Ativa o rolamento automático com o clique do meio do mouse (Obs. Seu ambiente desktop ainda pode controlar essa operação com outra ação)", + "settings-quickCss": "CSS Rápido", + "settings-quickCss-desc": "Rapidamente edite o CSS do seu cliente com um editor de texto simples. Mudanças são aplicadas imediatamente depois de salvar o arquivo.", + "settings-category-behaviour": "Comportamento", + "settings-category-debug": "Opções de debug", + "menu-about": "Sobre o Legcord", + "menu-developerTools": "Ferramentas de desenvolvedor", + "menu-openSettings": "Abrir configurações", + "menu-reload": "Recarregar", + "menu-restart": "Reiniciar", + "menu-quit": "Sair", + "menu-edit": "Editar", + "menu-undo": "Desfazer", + "menu-redo": "Refazer", + "menu-cut": "Cortar", + "menu-copy": "Copiar", + "menu-paste": "Colar", + "menu-selectAll": "Selecionar tudo", + "menu-view": "Ver", + "menu-toggleFullscreen": "Ativar/desativar modo de tela cheia", + "menu-zoomIn": "Aumentar zoom", + "menu-zoomOut": "Diminuir zoom", + "menu-resetZoom": "Resetar zoom", + "menu-window": "Janela", + "menu-minimize": "Minimizar", + "menu-close": "Fechar", + "menu-keybind": "Atalhos", + "menu-legcord": "Legcord", + "tray-openLegcord": "Abrir Legcord", + "tray-openSettings": "Abrir configurações", + "tray-restartLegcord": "Reiniciar Legcord", + "tray-quitLegcord": "Fechar Legcord", + "tray-tooltip": "Legcord", + "dialog-openUrl-title": "Você quer abrir esse link?", + "dialog-openUrl-message": "Você deseja abrir {url}?", + "dialog-openUrl-detail": "Detectamos que esse url não usa protocolos normais ded navegador. Isso pode significar que esse url leva à um programa local no seu computador. Por favor, verifique se você o reconhece antes de prosseguir!", + "dialog-openUrl-checkbox": "Lembrar da minha resposta e ignorar esse aviso em sessões futuras", + "dialog-openUrl-yes": "Sim, por favor", + "dialog-openUrl-no": "Não", + "title-unreadMessages": "Você tem mensagens não lidas.", + "title-legcordSuffix": " - Legcord", + "dialog-importTheme-title": "Selecione um tema que você deseja importar", + "dialog-importTheme-button": "Importar", + "dialog-importTheme-discordStyles": "Estilos do Discord", + "dialog-importTheme-allFiles": "Todos os arquivos", + "dialog-customIcon-filters": "Ícones", + "config-corrupted-title": "Opa, algo deu errado.", + "config-corrupted-message": "Legcord detectou que o seu arquivo de configuração está corrompido, por favor, reinicie o aplicativo e coloque novamente suas configurações, caso o erro persista, reporte no nosso servidor do Discord ou na aba de Problemas no Github.", + "setup-welcomeTitle": "Bem-vindo ao Legcord", + "setup-welcomeSubtitle": "Vamos nos preparar para sua configuração perfeita.", + "setup-getStarted": "Começar", + "setup-windowStyle-nativeTitle": "Janela Nativa", + "setup-windowStyle-nativeDesc": "Usar o estilo de janela padrão do sistema", + "setup-windowStyle-customTitle": "Barra de título customizada", + "setup-windowStyle-customDesc": "Usa o design customizado do Legcord para a barra de título", + "setup-chooseWindowStyle": "Escolher estilo da Janela", + "setup-selectAppearance": "Escolher como o Legcord aparece na sua máquina", + "setup-systemTray": "Bandeja do sistema", + "setup-trayChoose": "Escolha se deseja habilitar ou não a ícone na bandeja do sistema", + "setup-trayEnableTitle": "Ativar ícone de bandeja", + "setup-trayEnableDesc": "Mostrar o Legcord na bandeja do sistema", + "setup-trayDisableTitle": "Desabilitar ícone de bandeja", + "setup-trayDisableDesc": "Não mostrar o Legcord na bandeja do sistema", + "setup-finishTitle": "Você está pronto!" +} diff --git a/assets/lang/pt_PT.json b/assets/lang/pt_PT.json new file mode 100644 index 0000000..cc860dc --- /dev/null +++ b/assets/lang/pt_PT.json @@ -0,0 +1,350 @@ +{ + "loading_screen_start": "A iniciar Legcord…", + "setup_question1": "Bem‐vindo à Configuração do Legcord", + "loading_screen_offline": "Você parece estar offline. Reinício em ", + "loading_screen_update": "Uma nova versão do Legcord está disponível. Por favor, atualize para a versão mais recente.", + "setup_offline": "Parece estar offline. Por favor, conecte-se à internet e reinicie o Legcord.", + "setup_question2": "Escolha o canal/instância do seu Discord:", + "setup_question3": "Legcord deve cuidar da instalação dos mods do cliente?", + "yes": "Sim", + "no": "Não", + "next": "Próximo", + "setup_question4": "Escolha um mod que deseja instalar:", + "setup_question5": "Deseja usar o ícone de bandeja?", + "settings-theme": "Estilo de janela", + "settings-theme-desc": "O estilo de janela decide que barra de título Legcord vai usar.", + "settings-theme-default": "Padrão (Customizado)", + "settings-theme-native": "Nativo", + "settings-theme-overlay": "Sobreposição", + "settings-autoHideMenuBar": "Esconder barra de menu automáticamente", + "settings-autoHideMenuBar-desc": "Esconder barra de menu automaticamente quando não estiver em uso.", + "settings-sleepInBackground": "Descansar em segundo plano", + "settings-sleepInBackground-desc": "Ativa a limitação de recursos do Chromium em segundo plano. Isto pode ajudar com economia de pilha, mas pode quebrar funcionalidade das notificações.", + "settings-transparency": "Transparência", + "settings-transparency-desc": "Defina o modo de transparência que o Legcord usa.", + "settings-transparency-universal": "Universal", + "settings-transparency-modern": "Moderno", + "settings-theme-transparent": "Transparente", + "settings-transparency-tahoe-warning": "Transparência pode causar perda excessiva de performance em MacOS 26 (Tahoe).", + "settings-popoutPiP": "Elevação de Chamada sempre acima", + "settings-venmic-workaround": "Solução alternativa/temporária", + "settings-venmic-workaround-desc": "Ativa ou desativa a solução alternativa para um problema que causa o microfone ser partilhado, invés do áudio escolhido.", + "settings-venmic-deviceSelect": "Escolha o dispositivo", + "settings-venmic-deviceSelect-desc": "Permitir selecionar um dispositivo de áudio.", + "settings-venmic-granularSelect": "Seleção detalhada", + "settings-venmic-granularSelect-desc": "Permitir seleção de entradas de áudio.", + "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-ignoreInputMedia-desc": "Ignorar entrada de áudio de fontes de média.", + "settings-venmic-onlySpeakers": "Apenas Alto-falantes", + "settings-venmic-onlySpeakers-desc": "Apenas usar alto-falantes para seleção de áudio.", + "settings-venmic-onlyDefaultSpeakers": "Apenas alto-falante padrão", + "settings-audio": "Áudio", + "settings-audio-desc": "Selecione o método que o Legcord usa para capturar o áudio do seu sistema durante o partilhamento de ecrã.", + "settings-prfmMode": "Modo de desempenho", + "settings-prfmMode-performance": "Desempenho", + "settings-prfmMode-dynamic": "Dinâmico", + "settings-none": "Nenjum", + "settings-save": "Gravar configurações", + "settings-restart": "Reiniciar a app", + "menu-openSettings": "Abrir configurações", + "menu-reload": "Recarregar", + "menu-restart": "Reiniciar", + "menu-quit": "Desistir", + "menu-edit": "Editar", + "menu-undo": "Desfazer", + "menu-redo": "Refazer", + "menu-cut": "Cortar", + "menu-copy": "Copiar", + "menu-view": "Vista", + "menu-window": "Janela", + "menu-minimize": "Minimizar", + "menu-close": "Fechar", + "tray-restartLegcord": "Reiniciar o Legcord", + "dialog-openUrl-yes": "Sim, se faz favor", + "dialog-importTheme-button": "Importar", + "dialog-importTheme-allFiles": "Todos ficheiros", + "setup-next": "Próximo", + "setup-loading": "A carregar...", + "keybind-recording": "A gravar", + "keybind-record": "Gravar", + "keybind-action": "Ação", + "keybind-enabled": "Ativado", + "keybind-jsCode": "Código Javascript", + "keybind-add": "Adicionar", + "keybind-delete": "Apagar", + "detectable-missingFields": "Campos ou seleções faltam", + "detectable-fillAllFields": "Por favor, preencha todos os campos antes de adicionar.", + "detectable-appName": "Nome da app*", + "detectable-appId": "ID da app*", + "detectable-themes": "Temas", + "detectable-enabled": "Ativado", + "detectable-placeholderName": "ex. Discord", + "detectable-placeholderId": "ex. 1234567890", + "detectable-placeholderThemes": "Ação, Aventura", + "detectable-placeholderAliases": "Apelido1, Apelido2", + "themes-success": "Sucesso!", + "themes-updated": "Tema atualizado com sucesso!", + "themes-bdInstalled": "Tema do BetterDiscord instalado com sucesso!", + "themes-delete": "Apagar", + "themes-edit": "Editar", + "themes-update": "Atualizar", + "themes-open": "Abrir", + "themes-by": "por", + "themes-openQuickCss": "Abrir editor de CSS Rápido", + "themes-importFromFile": "Importar de um ficheiro", + "themes-openThemesFolder": "Abrir pasta de temas", + "themes-import": "Importar", + "themes-importUrlPlaceholder": "https://raw.githubusercontent.com/... [.tema.css]", + "games-registeredGames": "Jogos registados", + "games-refreshList": "Atualizar lista", + "games-add": "Adicionar", + "games-remove": "Remover", + "games-removeConfirmHeader": "Remover o jogo?", + "games-removeConfirmBody": "Este jogo terá a RichPresence removida. Reinicie para as mudanças terem efeito.", + "games-noExecutables": "Nenhum executável", + "games-empty": "Nenhum jogo registado. Adicione um usando o menu de seleção acima.", + "games-lastDetected": "Últimos jogos detetados", + "games-lastDetectedEmpty": "Nenhum jogo detetado ainda. Inicie um jogo com rich presence para vê-lo aqui.", + "games-blacklist": "Lista-negra", + "games-blacklisted": "Jogos na lista-negra", + "games-blacklistedEmpty": "Nenhum jogo na lista-negra.", + "games-removeFromBlacklist": "Remover", + "games-application": "Aplicação", + "screenshare-selectSource": "Faça favor selecionar um ecrã ou uma janela", + "screenshare-venmicDisabled": "Venmic desativado", + "screenshare-share": "Partilhar", + "screenshare-title": "Partilhar ecrã", + "contextMenu-searchGoogle": "Pesquisar com Google", + "contextMenu-searchDuckDuckGo": "Pesquisar com DuckDuckGo", + "touchbar-servers": "Servidores", + "splash-title": "Legcord", + "settings-bounceOnPing": "Agitar na barra de tarefas às notificações", + "settings-bounceOnPing-desc": "Agitar a app na barra de tarefas quando receber uma notificação.", + "settings-material-none": "Nenhum", + "settings-popoutPiP-desc": "Quando ativado, a elevação da chamada atual sempre ficará acima de outros elementos.", + "settings-venmic-ignoreInputMedia": "Ignorar média de entrada", + "settings-venmic-onlyDefaultSpeakers-desc": "Usar apenas alto-falantes para seleção de áudio.", + "settings-openCustomIconDialog": "Definir ícone de desktop", + "settings-mintoTray": "Funcionar em segundo plano", + "settings-mintoTray-desc": "Quando desativado, Legcord será fechado como qualquer outra janela, do contrário, ele funcionará em segundo plano e ficará na bandeja do sistema disponível a qualquer momento.", + "settings-startMinimized": "Abrir minimizado", + "settings-startMinimized-desc": "Legcord inicia em segundo plano e fica fora do seu caminho.", + "settings-csp-none": "Nenhum", + "settings-useSystemCssEditor": "Usar editor de estilo (CSS) do sistema", + "settings-useSystemCssEditor-desc": "Usar editor de estilo padrão do sistema para editar CSS.", + "settings-MultiInstance": "Múltiplas instâncias", + "settings-MultiInstance-desc": "Quando ativado, poderá iniciar quantas instâncias do Legcord que quiser, ao mesmo tempo.", + "settings-noBundleUpdates": "Sem updates em pacotes", + "settings-noBundleUpdates-desc": "Desativa updates automáticos para mods deste cliente.", + "settings-hardwareAcceleration": "Aceleração de Hardware", + "settings-hardwareAcceleration-desc": "Aceleração de Hardware usa a sua GPU para ajudar no desempenho gráfico. Se experienciar problemas ou bugs visuais, tente desativar esta opção.", + "settings-processScanning": "Escaneamento de processos ativos", + "settings-processScanning-desc": "Ativa o escaneamento de processos para encontrar jogos que executam para melhorar a detecção do RichPresence.", + "settings-windowsLegacyScanning": "Escaneamento antigo do Windows", + "settings-windowsLegacyScanning-desc": "Usa o escaneamento de processos antigo do Windows (prév. v1.1.6). Pode ajudar a compatibilidade de alguns sistemas mas esse método é menos eficiente.", + "settings-scanInterval": "Intervalo de escaneamento (ms)", + "settings-scanInterval-desc": "Configura o quão frequente (em milisegundos) o escaneamento de processos ocorre. Valores menores podem melhorar a rapidez da detecção de processos, mas vão aumentar o uso do processador.", + "settings-blockPowerSavingInVoiceChat": "Impedir economia de pilha em chats de voz", + "settings-blockPowerSavingInVoiceChat-desc": "Impede Legcord de ser suspenso. Mantém o sistema ativo mas permite que o ecrã seja desligado/descansado.", + "settings-mobileMode": "Modo de telemóvel", + "settings-mobileMode-desc": "Se está num dispositivo sensível ao toque, esta função é para si! Ativa a opção oculta do Discord para dispositivos móveis como tablets e telemóveis. Única função importante que falta é compatibilidade com chat de voz. Esta opção é ideal para\n utilizadores de PinePhone e outros.", + "settings-spellcheck": "Corretor automático", + "settings-spellcheck-desc": "Ajuda a corrigir palavras escritas incorretamente sublinhando-as.", + "settings-vaapi": "VAAPI", + "settings-vaapi-desc": "Use VAAPI (aceleração de hardware) para fazer decodificação de vídeo no Linux. Esta opção ajuda a reduzir drásticamente o uso de CPU durante o compartilhamento de ecrã, mas pode causar problemas em alguns sitemas. Desative esta opção caso expirencie travamentos ou \"ecrã-preto\" enquanto partilhar o ecrã.", + "settings-channel": "Canal do Discord", + "settings-channel-desc": "Ative esta configuração para mudar a instância atual do Discord que o Legcord está a usar.", + "settings-bitrateMin": "Birate mínimo", + "settings-bitrateMin-desc": "Bitrate mínimo para compartilhamento do ecrã.", + "settings-bitrateMax": "Bitrate máximo", + "settings-bitrateMax-desc": "Bitrate máximo para compartilhamento do ecrã.", + "settings-bitrateTarget": "Bitrate Alvo", + "settings-bitrateTarget-desc": "Bitrate alvo para compartilhamento do ecrã.", + "settings-invitewebsocket": "Rich Presence", + "settings-invitewebsocket-desc": "Usa arRPC para a função da Rich Presence do Discord com programas locais da sua máquina.", + "settings-useMacSystemPicker": "Usar o seletor de sistema padrão do macOS", + "settings-useMacSystemPicker-desc": "Usa o partilhamento de ecrã nativo do macOS quando possível. Apenas para macOS 15+", + "settings-additionalArguments": "Argumentos adicionais", + "settings-additionalArguments-desc": "Argumentos adicionais são comandos extras que pode adicionar ao Legcord. Eles podem ser usados para ativar ou desativar funções ou corrigir problemas.", + "settings-mod": "Modificação de Cliente", + "settings-mod-desc1": "Mods do cliente são programas que permitem customizar a sua experiência no Discord. Mods podem mudar a aparência do cliente, modificar comportamentos e até adicionar novas funcionalidades!", + "settings-mod-vencord": "Mod leve e fácil de usar. Vem com uma loja integrada para plugins.", + "settings-mod-equicord": "Nascido de uma fork de contribuidores do Vencord, traz um cliente rico em plugins.", + "settings-prfmMode-desc": "Modo de performance é uma funcionalidade experimental do Legcord feita para otimizar responsitividade e performance baseado nas suas nescessidades. Impacto pode variar dependendo da configuração da sua máquina e o seu uso, então recomendamos tentar cada modo e escolher um que sirva melhor para si.", + "settings-prfmMode-battery": "Pilha", + "settings-prfmMode-vaapi": "VAAPI", + "settings-disableAutogain": "Desativar ganho automático", + "settings-disableAutogain-desc": "Desativa ganho automático.", + "settings-disableHttpCache": "Desativar cache HTTP", + "settings-disableHttpCache-desc": "Desativa o cache HTTP do Chromium. Desative esta opção se mods não carregarem.", + "settings-trayIcon": "Ícone de bandeja", + "settings-trayIcon-desc": "Escolha um ícone de bandeja.", + "settings-trayIcon-disabled": "Desativar a bandeja", + "settings-trayIcon-dynamic": "Dinâmico", + "settings-trayIcon-normal": "Ícone do Discord", + "settings-trayIcon-classic": "Ícone clássico do Discord", + "settings-trayIcon-colored-plug": "Tomada colorida", + "settings-trayIcon-white-plug": "Tomada branca", + "settings-trayIcon-white-plug-alt": "Tomada branca (alternativa)", + "settings-trayIcon-black-plug": "Tomada preta", + "settings-trayIcon-black-plug-alt": "Tomada preta (alternativa)", + "settings-advanced": "Zona para utilizadores avançados", + "settings-pluginsFolder": "Abrir pasta de plugins", + "settings-crashesFolder": "Abrir pasta de crashes nativa", + "settings-themesFolder": "Abrir pasta de temas", + "settings-storageFolder": "Abrir pasta de armazenamento", + "settings-updater": "Verificar por updates", + "settings-skipSplash": "Pular ecrã de introdução", + "settings-skipSplash-desc": "Pula a ecrã de introdução do Legcord quando você o inicia.", + "settings-copyDebugInfo": "Copiar informação de debug", + "settings-copyGPUInfo": "Copiar informação de GPU", + "settings-clearClientModCache": "Limpar o cache de mods do cliente", + "settings-forceNativeCrash": "Forçar crash nativo", + "settings-smoothScroll": "Usar rolamento suave", + "settings-smoothScroll-desc": "Ativa o rolamento suave", + "settings-autoScroll": "Ativar rolamento automático", + "settings-autoScroll-desc": "Ativa o rolamento automático com o clique do meio do rato (Obs. O seu ambiente desktop ainda pode controlar esta operação com outra ação)", + "settings-quickCss": "CSS Rápido", + "settings-quickCss-desc": "Rapidamente edite o CSS do seu cliente com um editor de texto simples. Mudanças são aplicadas imediatamente depois de gravar o ficheiro.", + "settings-category-mods": "Mods", + "settings-category-behaviour": "Comportamento", + "settings-category-debug": "Opções de debug", + "menu-about": "Sobre o Legcord", + "menu-developerTools": "Ferramentas de programador", + "menu-paste": "Colar", + "menu-selectAll": "Selecionar tudo", + "menu-toggleFullscreen": "Ativar/desativar modo de ecrã cheio", + "menu-zoomIn": "Aumentar zoom", + "menu-zoomOut": "Diminuir zoom", + "menu-resetZoom": "Resetar zoom", + "menu-keybind": "Atalhos", + "menu-legcord": "Legcord", + "tray-openLegcord": "Abrir Legcord", + "tray-openSettings": "Abrir Configurações", + "tray-quitLegcord": "Fechar Legcord", + "tray-tooltip": "Legcord", + "dialog-openUrl-title": "Quer abrir esta ligação?", + "dialog-openUrl-message": "Deseja abrir {url}?", + "dialog-openUrl-detail": "Detetamos que este url não usa protocolos normais ded navegador. Isto pode significar que este url leva à um programa local no seu computador. Por favor, verifique se o reconhece antes de prosseguir!", + "dialog-openUrl-checkbox": "Lembrar a minha resposta e ignorar este aviso em sessões futuras", + "dialog-openUrl-no": "Não, não quero", + "title-unreadMessages": "Tem mensagens não lidas.", + "title-legcordSuffix": " - Legcord", + "dialog-importTheme-title": "Selecione um tema que deseja importar", + "dialog-importTheme-discordStyles": "Estilos do Discord", + "dialog-customIcon-filters": "Ícones", + "config-corrupted-title": "Opa, algo deu errado.", + "config-corrupted-message": "Legcord detetou que o seu ficheiro de configuração está corrompido, por favor, reinicie a app e ponha novamente as suas configurações, caso o erro persista, reporte no nosso servidor do Discord ou na guia de Problemas no Github.", + "setup-welcomeTitle": "Bem-vindo ao Legcord", + "setup-welcomeSubtitle": "Vamos nos preparar para a sua configuração perfeita.", + "setup-getStarted": "Começar", + "setup-windowStyle-nativeTitle": "Janela Nativa", + "setup-windowStyle-nativeDesc": "Usar o estilo de janela padrão do sistema", + "setup-windowStyle-customTitle": "Barra de título customizada", + "setup-windowStyle-customDesc": "Usa o design customizado do Legcord para a barra de título", + "setup-chooseWindowStyle": "Escolher estilo da Janela", + "setup-selectAppearance": "Escolher como o Legcord aparece na sua máquina", + "setup-systemTray": "Bandeja do sistema", + "setup-trayChoose": "Escolha se deseja ativar ou não a ícone na bandeja do sistema", + "setup-trayEnableTitle": "Ativar ícone de bandeja", + "setup-trayEnableDesc": "Mostrar o Legcord na bandeja do sistema", + "setup-trayDisableTitle": "Desativar ícone de bandeja", + "setup-trayDisableDesc": "Não mostrar o Legcord na bandeja do sistema", + "setup-finishTitle": "Está pronto!", + "setup-back": "Voltar", + "settings-restartRequired": "Reinicialização necessária", + "settings-theme-legacy": "Legado", + "settings-channel-stable": "Estável", + "keybind-mute": "Silenciar Microfone", + "keybind-runJavascript": "Executar Javascript", + "keybind-global": "Global", + "detectable-aliases": "Apelidos", + "backup-createBackup": "Criar backup", + "backup-restore": "Restaurar", + "backup-includeLegcordConfig": "Configurações", + "backup-confirmBackup": "Exportar", + "backup-cancelledTitle": "Cancelado", + "backup-unknownError": "Algo deu errado.", + "backup-restoreConfirm": "Restaurar", + "backup-restoreCancel": "Cancelar", + "supportBanner-donate": "Doar", + "settings-material": "Material de Janela", + "settings-material-desc": "Define o material de Janela de plano de fundo que o Legcord usa.", + "settings-material-mica": "Mica", + "settings-material-mica-alt": "Mica Alt", + "settings-material-acrylic": "Acrílico", + "settings-csp": "Política de Segurança de Conteúdo", + "settings-csp-desc": "Define o quão estrito a Política de Segurança do Legcord é. CSP estrito fornece melhor segurança mas pode causar problemas de compatibilidade com algumas modificações/temas/plugins de cliente.", + "settings-csp-strict": "Estrito", + "settings-csp-vanilla": "Vanilla", + "settings-firstTimeCrash": "Estamos a preparar tudo por si!", + "settings-firstTimeCrash-desc": "Definições não estão disponíveis num primeiro lançamento. Por favor use o botão abaixo para reiniciar e definições devem estar prontas após reiniciar.", + "settings-automaticClientUpdates": "Atualizações de cliente automáticas", + "settings-automaticClientUpdates-desc": "Desativa atualizações do Legcord automáticas", + "settings-mod-shelter": "Shelter", + "settings-mod-custom": "Personalizado", + "settings-experimental": "Experimental", + "settings-category-lookAndFeel": "Aparência e sensação", + "settings-category-legacy": "Funcionalidades antigas", + "tray-supportServer": "Suportar Servidor Discord", + "setup-linuxTrayWarning": "A funcionalidade da barra de tarefas do sistema podem ter problemas ou comportarem-se diferentemente em sistemas Linux.", + "setup-finishSubtitle": "A sua configuração Legcord está completa e personalizada de acordo com as suas preferências.", + "setup-finishSettingsNote": "Precisa de fazer alterações mais tarde? Encontrará todas estas opções no menu de definições do Discord abaixo do Legcord.", + "setup-launchLegcord": "Lançar Legcord", + "setup-modSelectorTitle": "Escolher o Seu Mod de Cliente", + "setup-modSelectorSubtitle": "O Legcord inclui Shelter como predefinição, mas também pode escolher outro mod de cliente se preferir.", + "setup-vencordTitle": "Vencord", + "setup-vencordDesc": "Mod de cliente com plugins e temas.", + "setup-equicordTitle": "Equicord", + "setup-equicordDesc": "Um fork do Vencord com mais plugins.", + "setup-useShelterOnly": "Usar Apenas Shelter", + "setup-stepOf": "Passo {current} de {total}", + "setup-windowTitle": "Configuração do Legcord", + "settings-restartRequiredBody": "Pode precisar de reiniciar para aplicar estas mudanças.", + "settings-restartLater": "Faço isso mais tarde", + "settings-channel-canary": "Canary", + "settings-channel-ptb": "PTB", + "settings-category-powerManagement": "Gestão de Energia", + "settings-category-arrpc": "arRPC", + "settings-extendedPluginAbilities": "Habilidades de plugin estendidas", + "settings-extendedPluginAbilities-desc": "Permite aos plugins a leitura e escrita de ficheiro no escopo de uma pasta do seu computador (p.ex. para caching de mensagens eliminadas). Apenas ative isto para plugins que confia—eles podem armazenar dados localmente. Dados são armazenados por cada plugin na pasta de armazenamento de plugins do Legcord.", + "settings-audio-loopback": "Loopback", + "settings-audio-loopbackWithMute": "Loopback com mute", + "keybind-addKeybind": "Adicionar um atalho de teclado", + "keybind-accelerator": "Acelerador", + "keybind-invalidCombo": "Esta combinação de teclas é inválida ou não é suportada.", + "keybind-deafen": "Silenciar Áudio", + "keybind-pushToTalk": "Carregar para falar", + "keybind-leaveCall": "Sair da chamada", + "keybind-navigateForward": "Navegar para a frente", + "keybind-navigateBack": "Navegar para trás", + "keybind-openQuickCss": "Abrir Quick CSS", + "keybind-openSettings": "Abrir Definições", + "keybind-globalNote": "Permite-lhe atribuir um atalho de teclado específico que pode ser usado entre diferentes aplicações e programas.", + "detectable-addApp": "Adicionar Aplicação Detetável", + "backup-dialogSave-title": "Guardar cópia de segurança do Legcord", + "backup-dialogOpen-title": "Abrir cópia de segurança do Legcord", + "backup-pageTitle": "Cópia de segurança e restaurar", + "backup-pageSubtitle": "Guardar ou restaurar a sua cópia de segurança Legcord, inclui definições, temas, plugins, e dados de mods—tudo em um ficheiro.", + "backup-modalTitle": "Escolher o que a cópia de segurança contém", + "backup-includeLegcordThemes": "Temas e Quick CSS", + "backup-includeLegcordPlugins": "Extensões Chrome/Armazenamento de Plugin", + "backup-includeVencord": "Dados Vencord (sessão atual)", + "backup-includeEquicord": "Dados Equicord (sessão atual)", + "backup-includeShelter": "Plugins Shelter", + "backup-includeModBundles": "Ficheiros de mod de cliente transferidos (Vencord, Equicord, Shelter, pacotes personalizados)", + "backup-successTitle": "Cópia de segurança guardada", + "backup-successBody": "A sua cópia de segurança foi guardada com sucesso.", + "backup-cancelledBody": "Nenhum ficheiro foi guardado.", + "backup-failedTitle": "Cópia de segurança falhada", + "backup-invalidFile": "Não foi possível ler esse ficheiro de cópia de segurança.", + "backup-restoreConfirmHeader": "Restaurar a partir da cópia de segurança?", + "backup-restoreConfirmBody": "Ficheiros em disco serão substituídos onde esta cópia de segurança contém dados. Poderá ter que reiniciar o Legcord para tudo ser aplicado.", + "backup-restoreDoneTitle": "Restauração completa", + "backup-restoreDoneBody": "Os seus dados foram restaurados. Reinicie o Legcord para que todas as mudanças tomem efeito.", + "supportBanner-title": "Suportar o Projeto", + "supportBanner-subtitle": "Ajude-nos a continuar a desenvolver o Legcord. O seu suporte mantém o projeto vivo e permite-nos introduzir mais funcionalidades." +} diff --git a/assets/lang/ro-RO.json b/assets/lang/ro-RO.json deleted file mode 100644 index 1f05ad5..0000000 --- a/assets/lang/ro-RO.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_start": "Începând ArmCord…", - "settings-theme-default": "Default", - "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 ArmCord 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 ArmCord este disponibilă. Va rugăm sa instalați noua versiune", - "setup_question1": "Bine ați venit la configurarea pentru ArmCord", - "setup_offline": "You appear to be offline. Please connect to the internet and restart ArmCord.", - "setup_question2": "Alegeți versiunea/instanța de Discord:", - "setup_question3": "Ar trebui ca ArmCord 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ă ArmCord", - "settings-theme-desc1": "ArmCord \"themes\" manage apps behaviour and looks.", - "settings-theme-desc2": "Așa arată ArmCord când il pornești pentru prima dată. Include o recreație a titlebar-ul custom de la Discord și styluri specifice ArmCord.", - "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-theme-native": "Native", - "settings-theme-transparent": "Transparent (Experimental)", - "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.", - "settings-tray": "Minimize to tray", - "settings-tray-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-startMinimized": "Start minimized", - "settings-startMinimized-desc": "ArmCord starts in background and remains out of your way.", - "settings-patches": "Automatic Patches", - "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-patches-desk": "Fetches automatic patches that are distributed if release turns out to have bugs after release. Usually\n you don't have to keep this enabled, unless notified in support Discord.", - "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-dynamicIcon": "Dynamic icon", - "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-spellcheck-desc": "Helps you correct misspelled words by highlighting them.", - "settings-channel": "Discord channel", - "settings-channel-desc1": "You can use this setting to change current instance of Discord:", - "settings-channel-desc2": "you're probably most familiar with this one. It's the one you see in default Discord\n client!", - "settings-channel-desc3": "this is alpha test release of Discord. By using it you gain access to the newest\n features and fixes.", - "settings-channel-desc4": "public test build. Receives features earlier than stable but is a bit older than Canary.", - "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-mod-shelter": "is a new generation client mod built to be essentially bulletproof.", - "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 ArmCord 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, 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-desc4": "transparent window with native titlebar, you need a compatible theme to run this. Windows only.", - "settings-MultiInstance": "Multi Instance", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of ArmCord.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} 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-RU.json b/assets/lang/ru-RU.json deleted file mode 100644 index 9ead196..0000000 --- a/assets/lang/ru-RU.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_start": "Запуск ArmCord…", - "loading_screen_offline": "Видимо, вы не в сети. Перезапуск через ", - "loading_screen_update": "Доступна новая версия ArmCord. Пожалуйста, обновитесь до последней версии.", - "setup_question1": "Добро пожаловать на установку ArmCord", - "setup_offline": "Видимо, вы не в сети. Подключитесь к Интернету и перезапустите ArmCord.", - "setup_question2": "Выберите свой канал/экземпляр Discord:", - "setup_question3": "Должен ли ArmCord заниматься установкой клиентских модов?", - "yes": "Да", - "no": "Нет", - "next": "Далее", - "setup_question4": "Выберите клиентский мод, который хотите установить:", - "settings-theme": "Тема ArmCord", - "settings-theme-default": "По умолчанию", - "settings-theme-native": "Системная", - "settings-tray": "Трей", - "settings-patches": "Автоматические патчи", - "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": "ArmCord CSP это наша система, которая управляет загрузкой пользовательского контента в приложение Discord. Такие вещи как\n клиентские моды и темы зависят от неё. Отключите, если хотите избавиться от модов и пользовательских стилей.", - "settings-tray-desc": "Когда вы отключаете ArmCord, он закрывается, как и любое другое приложение. В противном случае он останется отдыхать на панели задач до следующего использования.", - "settings-patches-desk": "Извлекает патчи, распространяемые, если в релизе обнаруживаются ошибки. Обычно\n не нужно постоянно включать (если только вы не уведомлены в службе поддержки Discord).", - "settings-channel-desc1": "Вы можете использовать эту настройку для изменения текущего экземпляра Discord:", - "settings-pluginsFolder": "Открыть папку плагинов", - "settings-themesFolder": "Открыть папку тем", - "settings-storageFolder": "Открыть папку хранилища", - "settings-channel-desc2": "вы, вероятно, наиболее знакомы с ним. Именно его вы видите в стандартном\n клиенте Discord!", - "settings-channel-desc3": "это альфа-тестовый выпуск Discord. Используя его, вы получаете доступ\n к новейшим функциям и исправлениям.", - "settings-theme-desc1": "ArmCord \"темы\" изменят поведение и внешность программы.", - "settings-theme-desc2": "Вот так выглядит ArmCord при первом запуске. Он включает в себя воссоздание\n кастомизируемого заголовка Discord и стилей ArmCord, внедрённых в Discord.", - "settings-theme-desc3": "использует встроенный заголовок окна текущей ОС, которая у вас запущена (например, Windows 7/10). Функционирует как\n в актуальном приложении Discord на Linux.", - "settings-mobileMode-desc": "Если вы пользуетесь устройством с сенсорным экраном, эта функция для вас! Она активирует скрытый мобильный\n режим, предназначенный для телефонов и планшетов. Единственная недостающая функция - поддержка\n голосового чата. Это идеально подходит для пользователей PinePhone и подобных устройств.", - "settings-channel-desc4": "публичная тестовая сборка. Получает функции раньше, чем стабильная, но немного старее, чем Canary.", - "settings-invitewebsocket-desc": "Использует arRPC чтобы поддерживать Discord RPC (Расширенный статус) с локальными программами на вашем компьютере. В разработке.", - "settings-mod-desc1": "Клиентские моды - это программы, которые позволяют вам настроить работу с Discord. Они могут\n изменять внешний вид клиента, изменять поведение или добавлять новые возможности!", - "settings-trayIcon": "Иконка области уведомлений", - "settings-trayIcon-desc": "Установите значок, который будет отображаться в области уведомлений.", - "settings-advanced": "️ Расширенная пользовательская зона", - "settings-restart": "Перезапустить приложение", - "settings-mod-vencord": "легкий и простой в использовании клиентский мод. Имеет встроенный магазин для плагинов.", - "settings-copyDebugInfo": "Скопировать отладочную информацию", - "settings-mod-shelter": "это клиентский мод нового поколения, созданный для того, чтобы быть практически пуленепробиваемым.", - "settings-prfmMode-desc": "Режим производительности - это экспериментальная функция, которая может либо увеличить отзывчивость и производительность\n ArmCord, либо. . . снизить их. Пожалуйста, попробуйте все варианты и посмотрите, какой подходит вам больше всего.", - "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": "Пропускает экран-заставку ArmCord при запуске приложения.", - "settings-startMinimized": "Запуск свернутым", - "settings-startMinimized-desc": "ArmCord запускается в фоновом режиме и не мешает вам.", - "settings-crashesFolder": "Открыть родную папку сбоев", - "settings-forceNativeCrash": "Принудительный сбой", - "settings-disableAutogain": "Отключение автогейна", - "settings-disableAutogain-desc": "Отключает автогейн.", - "settings-theme-transparent": "Прозрачный", - "settings-useLegacyCapturer": "Использование устаревшего устройства захвата", - "settings-useLegacyCapturer-desc": "Использовать устаревший модуль screenshare вместо нового. Если у вас возникли проблемы с общим доступом к экрану, попробуйте включить эту функцию.", - "settings-dynamicIcon": "Динамическая иконка", - "settings-dynamicIcon-desc": "Следуя поведению Discord в Windows, это показывает, что непрочитанные сообщения / пинги рассчитывают на значок ArmCord, а не на его трей.", - "settings-spellcheck": "Проверка орфографии", - "settings-spellcheck-desc": "Помогает исправить неправильно написанные слова, выделяя их.", - "setup_question5": "Вы хотите использовать значок в трее?", - "settings-mintoTray": "Свернуть в трей", - "settings-mintoTray-desc": "При отключении ArmCord будет закрываться как любое другое окно при закрытии, в противном случае он будет сидеть и отдыхать\n в системном трее.", - "settings-theme-desc4": "прозрачное окно с нативной строкой заголовка, вам нужна совместимая тема для этого. Только для Windows.", - "settings-MultiInstance": "Множество Экземпляров", - "settings-MultiInstance-desc": "Когда включено, вы можете запустить множество экземпляров ArmCord.", - "settings-copyGPUInfo": "Копировать информацию о GPU", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} diff --git a/assets/lang/ru.json b/assets/lang/ru.json new file mode 100644 index 0000000..ff9bdca --- /dev/null +++ b/assets/lang/ru.json @@ -0,0 +1,220 @@ +{ + "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": "Похоже, вы не в сети. Перезапуск через ", + "setup_question2": "Выберите свой канал/экземпляр Discord:", + "setup_question3": "Должен ли Legcord заниматься установкой модификаций клиента?", + "setup_question4": "Выберите модификацию клиента, которую хотите установить:", + "setup_question5": "Хотите использовать значок в трее?", + "settings-theme": "Стиль окна", + "settings-theme-desc": "Стиль окна определяет, какой заголовок использует Legcord.", + "settings-theme-default": "По умолчанию (Legcord)", + "settings-theme-native": "Системная", + "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": "Всплывающее окно вызова поверх всех окон", + "settings-popoutPiP-desc": "При включении этой функции всплывающее окно вызова всегда будет отображаться в режиме Поверх всех окон.", + "settings-venmic-deviceSelect": "Выбор устройства", + "settings-venmic-deviceSelect-desc": "Позволяет выбрать аудио устройство.", + "settings-venmic-granularSelect-desc": "Позволить выбрать источник аудиовхода.", + "settings-venmic-ignoreVirtual": "Игнорировать виртуальные устройства", + "settings-venmic-ignoreVirtual-desc": "Игнорировать виртуальные аудиоустройства.", + "settings-venmic-ignoreDevices": "Игнорировать устройства", + "settings-venmic-ignoreDevices-desc": "Игнорировать конкретные аудиоустройства.", + "settings-venmic-ignoreInputMedia-desc": "Игнорировать аудио вход из медиаисточников.", + "settings-venmic-onlySpeakers": "Только динамики", + "settings-venmic-onlySpeakers-desc": "Использовать только динамики для выбора аудиовыхода.", + "settings-audio": "Аудио", + "settings-theme-overlay": "Оверлей", + "settings-material": "Материал фона окна", + "settings-material-desc": "Выберите эффект прозрачности Windows, который будет использовать Legcord.", + "settings-material-mica": "Mica", + "settings-material-mica-alt": "Mica Alt", + "settings-material-acrylic": "Acrylic", + "settings-material-none": "Не использовать", + "settings-venmic-workaround": "Обход", + "settings-audio-desc": "Выберите метод захвата системного аудио во время демонстрации экрана.", + "settings-openCustomIconDialog": "Выберите иконку рабочего стола", + "settings-mintoTray": "Работа в фоне", + "settings-mintoTray-desc": "При выключенной настройке, закрытие окна будет полностью закрывать Legcord, а при включённой, Legcord просто пойдёт отдыхать в ваш системный трей.", + "settings-startMinimized": "Запуск в свёрнутом виде", + "settings-startMinimized-desc": "Legcord всегда будет запускаться в фоне, чтобы не мешать вам.", + "settings-csp": "Политика Защиты Данных (CSP)", + "settings-csp-desc": "Установите строгость защиты данных в Legcord. Строгий режим CSP безопаснее, но может быть несовместим с некоторыми модами/темами/плагинами.", + "settings-csp-strict": "Строгий", + "settings-csp-none": "Не использовать", + "settings-csp-vanilla": "Стандартный", + "settings-useSystemCssEditor": "Использовать системный редактор CSS", + "settings-useSystemCssEditor-desc": "Использовать системный редактор CSS для редактирования CSS в Legcord.", + "settings-MultiInstance": "Много сессий", + "settings-MultiInstance-desc": "При включённой настройке вы сможете начать несколько сессий Legcord одновременно.", + "settings-noBundleUpdates": "Не обновлять пакеты", + "settings-noBundleUpdates-desc": "Отключает автоматическое обновление модов.", + "settings-automaticClientUpdates": "Автообновление клиента", + "settings-automaticClientUpdates-desc": "Отключает автоматическое обновление Legcord.", + "settings-hardwareAcceleration": "Аппаратное ускорение", + "settings-hardwareAcceleration-desc": "Legcord будет использовать ваш GPU для ускорения работы программы. Если вам встречаются визуальные баги, попробуйте выключить эту функцию.", + "settings-mobileMode": "Мобильный режим", + "settings-mobileMode-desc": "Эта функция создана специально для тех, кто использует Legcord на устройствах с сенсорным экраном! Она активирует скрытый мобильный режим Discord, созданный для планшетов и смартфонов. Режим не поддерживает голосовые чаты. Идеально подходит для пользователей PinePhone и других подобных устройств.", + "settings-spellcheck": "Проверка орфографии", + "settings-spellcheck-desc": "Выделяет неправильно написанные слова.", + "settings-vaapi": "VAAPI", + "settings-vaapi-desc": "Использовать VAAPI (Аппаратное ускорение) для декодирования видео на Linux-системах. Значительно уменьшает нагрузку на CPU во время демонстрации экрана, но может вызывать проблемы на некоторых системах. Выключите эту настройку, если вы сталкиваетесь с вылетами или чёрным экраном во время демонстрации.", + "settings-bitrateMin": "Минимальный битрейт", + "settings-bitrateMin-desc": "Минимальный битрейт видео при демонстрации экрана.", + "settings-bitrateMax": "Максимальный битрейт", + "settings-bitrateMax-desc": "Максимальный битрейт видео при демонстрации экрана.", + "settings-mod-shelter": "Shelter", + "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-trayIcon": "Иконка в трее", + "settings-trayIcon-desc": "Установите значок, который будет отображаться в меню трея.", + "settings-advanced": "Только для продвинутых пользователей", + "settings-pluginsFolder": "Открыть папку с плагинами", + "settings-themesFolder": "Открыть папку с темами", + "settings-experimental": "Экспериментальные настройки", + "settings-restart": "Перезапустить приложение", + "settings-updater": "Проверить наличие обновлений", + "settings-skipSplash": "Отключить сплеш", + "settings-skipSplash-desc": "Пропускает экран с логотипом Legcord, появляющийся при запуске приложения.", + "settings-copyDebugInfo": "Копировать данные для отладки", + "settings-copyGPUInfo": "Копировать информацию о GPU", + "settings-clearClientModCache": "Очистить кеш модов", + "settings-forceNativeCrash": "Вызвать принудительный сбой", + "settings-smoothScroll": "Использовать плавный скроллинг", + "settings-smoothScroll-desc": "Включить плавный скроллинг", + "settings-autoScroll": "Разрешить автоматическую прокрутку", + "settings-autoScroll-desc": "Разрешить автоматическую прокрутку при нажатии средней кнопки мыши (Примечание: Эта настройка не имеет приоритета над назначениями клавиш вашей среды рабочего стола)", + "settings-quickCss": "Quick CSS", + "settings-quickCss-desc": "Быстро внесите изменения в ваш CSS в базовом текстовом редакторе. Изменения вступят в силу сразу полсе сохранения файла.", + "settings-category-lookAndFeel": "Внешний вид", + "settings-category-debug": "Отладка", + "menu-about": "Про Legcord", + "menu-developerTools": "Настройки разработчика", + "menu-openSettings": "Открыть настройки", + "menu-reload": "Перезагрузка", + "menu-restart": "Перезапуск", + "menu-cut": "Вырезать", + "menu-copy": "Копировать", + "menu-paste": "Вставить", + "menu-selectAll": "Выбрать всё", + "menu-toggleFullscreen": "Полноэкранный режим", + "menu-zoomIn": "Приблизить", + "menu-zoomOut": "Отдалить", + "menu-resetZoom": "Сбросить приближение", + "menu-window": "Окно", + "menu-minimize": "Свернуть", + "menu-close": "Закрыть", + "menu-legcord": "Legcord", + "tray-openLegcord": "Открыть Legcord", + "tray-openSettings": "Открыть настройки", + "tray-supportServer": "Сервер поддержки в Discord", + "tray-restartLegcord": "Перезапустить Legcord", + "tray-quitLegcord": "Закрыть Legcord", + "tray-tooltip": "Legcord", + "dialog-openUrl-title": "Перейти по ссылке?", + "dialog-openUrl-message": "Перейти по адресу {url}?", + "dialog-openUrl-detail": "Данный url использует нестандартный сетевой протокол. Скорее всего, он пытается запустить локальную программу на вашем устройстве. Прежде чем продолжить, удостоверьтесь, что узнаёте её!", + "dialog-openUrl-checkbox": "Запомнить мой ответ и не предупреждать в дальнейшем", + "dialog-openUrl-yes": "Продолжить", + "dialog-openUrl-no": "Отмена", + "title-unreadMessages": "У вас есть непрочитанные сообщения.", + "title-legcordSuffix": " - Legcord", + "dialog-importTheme-title": "Выберите тему, которую вы хотите импортировать", + "dialog-importTheme-button": "Импортировать", + "dialog-importTheme-allFiles": "Все файлы", + "config-corrupted-title": "Упс, что-то пошло не так!", + "setup-welcomeTitle": "Добро пожаловать в Legcord", + "setup-windowStyle-nativeTitle": "Нативное окно", + "setup-windowStyle-nativeDesc": "Использовать системное оформление окна", + "setup-windowStyle-customTitle": "Кастомный заголовок", + "setup-windowStyle-customDesc": "Использовать кастомный стиль полосы заголовка Legcord", + "setup-chooseWindowStyle": "Выберите оформление окна", + "setup-selectAppearance": "Настройте, как Legcord будет выглядеть на вашем устройстве", + "setup-finishTitle": "Готово!", + "setup-finishSettingsNote": "Хотите что-то поменять? Все эти настройки всегда доступны в настройках Discord в разделе Legcord.", + "setup-launchLegcord": "Запустить Legcord", + "setup-vencordTitle": "Vencord", + "setup-equicordTitle": "Equicord", + "setup-loading": "Загрузка...", + "settings-restartRequired": "Необходим перезапуск", + "settings-restartRequiredBody": "Перезапустите Legcord, чтобы применить внесённые изменения.", + "settings-restartLater": "Перезапущу позже", + "settings-channel-stable": "Stable", + "settings-channel-canary": "Canary", + "settings-channel-ptb": "PTB", + "settings-category-powerManagement": "Энергосбережение", + "settings-category-arrpc": "arRPC", + "settings-extendedPluginAbilities": "Расширенные возможности плагинов", + "settings-extendedPluginAbilities-desc": "Даёт плагинам доступ к чтению и записи файлов в выделенной папке на вашем устройстве (например, для сохранения удалённых сообщений). Не включайте для плагинов, которым не доверяете, и не хотите, чтобы они сохраняли данные на вашем усторйстве. Данные будут сохраняться отдельно для каждого плагина в папке плагинов в файлах Legcord.", + "keybind-invalidCombo": "Данное сочетание клавиш некорректно или не поддерживается.", + "keybind-recording": "Запись", + "keybind-record": "Начать запись", + "keybind-action": "Действие", + "keybind-leaveCall": "Покинуть звонок", + "keybind-add": "Добавить", + "keybind-delete": "Удалить", + "detectable-missingFields": "Пропущено поле", + "detectable-fillAllFields": "Пожалуйста, заполните все поля, чтобы продолжить.", + "detectable-themes": "Темы", + "detectable-placeholderName": "например, Discord", + "detectable-placeholderId": "например, 1234567890", + "themes-updated": "Тема успешно обновлена!", + "themes-importFromFile": "Импортировать из файла", + "themes-openThemesFolder": "Открыть папку с темами", + "themes-import": "Импортировать", + "themes-importUrlPlaceholder": "https://raw.githubusercontent.com/... [.theme.css]", + "screenshare-share": "Поделиться", + "screenshare-title": "Демонстрация экрана", + "contextMenu-searchGoogle": "Поиск в Google", + "contextMenu-searchDuckDuckGo": "Поиск в DuckDuckGo", + "touchbar-servers": "Сервера", + "splash-title": "Legcord", + "backup-dialogSave-title": "Сохранить резервную копию Legcord", + "backup-dialogOpen-title": "Открыть резерную копию Legcord", + "backup-pageTitle": "Резервное копирование", + "backup-pageSubtitle": "Сохранение и восстановление ваших настроек Legcord, включая плагины и настройки модов — всё одним файлом.", + "backup-createBackup": "Создать резервную копию", + "backup-restore": "Восстановить", + "backup-modalTitle": "Выберите, что хотите сохранить", + "backup-includeLegcordConfig": "Настройки", + "backup-includeLegcordThemes": "Темы и Quick CSS", + "backup-includeVencord": "Данные Vencord (текущая сессия)", + "backup-includeEquicord": "Данные Equicord (текущая сессия)", + "backup-includeShelter": "Плагины Shelter", + "backup-unknownError": "Что-то пошло не так.", + "backup-restoreCancel": "Отмена", + "supportBanner-title": "Поддержать Проект", + "supportBanner-subtitle": "Ваша поддержка позволяет нам продолжать разработку Legcord и вводить всё больше и больше новых функций!", + "supportBanner-donate": "Задонатить", + "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-category-behaviour": "Поведение", + "menu-quit": "Выход" +} diff --git a/assets/lang/sk-SK.json b/assets/lang/sk-SK.json deleted file mode 100644 index 7bd7627..0000000 --- a/assets/lang/sk-SK.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_offline": "Zdá sa, že ste offline. Pripojte sa k internetu a skúste to znova.", - "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-mod-shelter": "is a new generation client mod built to be essentially bulletproof.", - "settings-patches": "Automatic Patches", - "settings-updater": "Check for updates", - "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", - "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": "Začiatok 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-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. Windows only.", - "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-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 ArmCord is available. Please update to the latest version.", - "settings-experimental": "Experimental", - "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.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} 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-SE.json b/assets/lang/sv-SE.json deleted file mode 100644 index 0bb1f4a..0000000 --- a/assets/lang/sv-SE.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_start": "Startar ArmCord…", - "loading_screen_offline": "Du verkar vara offline. Starta om i ", - "loading_screen_update": "En ny version av ArmCord är tillgänglig. Var snäll och uppdatera till den senaste versionen.", - "setup_question1": "Välkommen till ArmCord Setup", - "setup_offline": "Du verkar vara offline. Var snäll och anslut till internet och omstarta ArmCord.", - "setup_question2": "Välj din Discord kanal/instans:", - "setup_question3": "Ska ArmCord ta hantera installationen av klientmodifikationer?", - "yes": "Ja", - "no": "Nej", - "next": "Nästa", - "setup_question4": "Välj en klientmodifikation som du vill installera:", - "settings-theme": "ArmCord tema", - "settings-theme-desc1": "ArmCord \"teman\" ändrar på appars beteende och utseende.", - "settings-theme-desc2": "så här ser ArmCord ut när du startar för första gången. Det inkluderar en rekreation av Discords\n custom titelfält och ArmCord specifika stiler injicerade i Discord.", - "settings-theme-desc3": "använder den inbyggda titelfältet på det OS du kör (t.ex Windows 7/10). Fungerar mer\n likt som den riktiga Discord appen på Linux.", - "settings-theme-default": "Standard", - "settings-theme-native": "Inbyggd", - "settings-mod": "Klientmodifikation", - "settings-prfmMode-performance": "Prestanda", - "settings-csp-desc": "ArmCord 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 ArmCord stängas likadant som andra fönster, annar så kommer den hänga i din system tray tills vidare.", - "settings-patches": "Automatiska Patcher", - "settings-patches-desk": "Hämtar automatiska patchar som är distributerade ifall release har bugs efter att ha släppning.\n Du brukar inte behöva ha detta aktiverat, om du inte blir notifierad i support Discorden.", - "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-channel-desc1": "Du kan använda denna inställning för att ändra din nuvarande Discord instans:", - "settings-channel-desc2": "du säkert känner denna mycket väl. Det är den som du ser i standard\n Discordklienten!", - "settings-channel-desc3": "detta är ett alpha test utsläpp av Discord. När du använder det så får du de nyaste\n funktionerna och de nyaste fixarna.", - "settings-channel-desc4": "offentlig test build. Får funktioner tidigare än stable men är lite äldre än Canary.", - "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-mod-shelter": "är en ny generation av klientmodifikationer som är byggd för att vara i princip skottsäker.", - "settings-prfmMode-desc": "Prestandaläget är en experimentell funktion som kan antigen öka responsiviteten eller prestandan i\n ArmCord 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 ArmCord splashskärmen när du startar appen.", - "settings-copyDebugInfo": "Kopiera Debug Info", - "settings-startMinimized": "Kör minimerad", - "settings-startMinimized-desc": "ArmCord 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-dynamicIcon": "Dynamisk ikon", - "settings-dynamicIcon-desc": "Följande Discords beteende på Windows, detta visar olästa meddelanden/pingantal på ArmCords ikon istället för dess systembricka.", - "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-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-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" -} diff --git a/assets/lang/sv.json b/assets/lang/sv.json new file mode 100644 index 0000000..473d228 --- /dev/null +++ b/assets/lang/sv.json @@ -0,0 +1,6 @@ +{ + "loading_screen_start": "Startar Legcord…", + "settings-theme-default": "Standard (Anpassad)", + "settings-theme-native": "Inbyggd", + "settings-theme-overlay": "Överlägg" +} 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-TH.json b/assets/lang/th-TH.json deleted file mode 100644 index 9a5764a..0000000 --- a/assets/lang/th-TH.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_start": "กำลังเริ่มต้น ArmCord…", - "loading_screen_offline": "ดูเหมือนว่าคุณออฟไลน์อยู่ โปรดเชื่อมต่ออินเทอร์เน็ตและลองใหม่อีกครั้ง", - "loading_screen_update": "ArmCord เวอร์ชันใหม่พร้อมใช้งานแล้ว โปรดอัปเดตเป็นเวอร์ชันล่าสุด", - "setup_question1": "เลือกประเภทการติดตั้งที่คุณต้องการ:", - "setup_offline": "ดูเหมือนว่าคุณออฟไลน์อยู่ โปรดเชื่อมต่ออินเทอร์เน็ตและลองเริ่ม ArmCord ใหม่อีกครั้ง", - "setup_question2": "เลือกช่อง/อินสแตนส์ Discord:", - "setup_question3": "ต้องการให้ ArmCord จัดการการติดตั้งมอดของไคลเอนต์หรือไม่?", - "yes": "ใช่", - "no": "ไม่ใช่", - "next": "ถัดไป", - "setup_question4": "เลือกไคลเอนต์มอดที่ต้องการติดตั้ง:", - "settings-prfmMode-battery": "ประหยัดแบตเตอรี่", - "settings-theme": "ธีม ArmCord", - "settings-theme-default": "ค่าเริ่มต้น", - "settings-theme-native": "ดั้งเดิม", - "settings-tray": "ย่อขนาดหน้าต่าง", - "settings-patches": "แพทช์อัตโนมัติ", - "settings-channel": "ช่อง Discord:", - "settings-invitewebsocket": "ใช้ Websocket สำหรับการเชิญ", - "settings-prfmMode": "โหมดประสิทธิภาพ:", - "settings-prfmMode-performance": "ประสิทธิภาพสูงสุด", - "settings-mod": "ไคลแอนต์มอด:", - "settings-none": "ไม่มี", - "settings-save": "บันทึกการตั้งค่า", - "settings-updater": "ตรวจหาการอัปเดต", - "settings-mobileMode": "โหมดมือถือ", - "settings-theme-desc1": "\"ธีม\" ของ ArmCord เป็นการจัดการลักษณะและการทำงานของแอป", - "settings-patches-desk": "Fetches automatic patches that are distributed if release turns out to have bugs after release. Usually\n you don't have to keep this enabled, unless notified in support Discord.", - "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-desc1": "You can use this setting to change current instance of Discord:", - "settings-channel-desc2": "you're probably most familiar with this one. It's the one you see in default Discord\n client!", - "settings-trayIcon": "Tray icon", - "settings-theme-desc2": "นี่คือหน้าตา ArmCord ตอนที่เปิดครั้งแรก เป็นการปรับปรุงจากหน้าตาเดิมของ Discord\n แถบชื่อหน้าต่างและหน้าตาใหม่ ๆ ที่ ArmCord เปลี่ยน Discord", - "settings-theme-desc3": "ใช้แถบชื่อหน้าต่างเริ่มต้นของระบบปฏิบัติการที่กำลังใช้อยู่ (เช่น Windows 7/10) ตัวเลือกคล้ายกันกับ\n แอป Discord ใน Linux", - "settings-csp-desc": "ArmCord CSP คือระบบที่จัดการการโหลดเนื้อหากำหนดเองลงไปในแอป Discord สิ่งอย่างเช่น สิ่งอย่างเช่น\n ไคลแอนต์มอด ธีม ต้องใช้มัน สามารถปิดใช้งานได้หากต้องการปิดมอดและหน้าตากำหนดเอง", - "settings-tray-desc": "เมื่อปิด ArmCord จะปิดเหมือนหน้าตาอื่น ๆ เมื่อปิด ไม่อย่างนั้นมันจะนั่งนิ่ง\n ในถาดระบบภายหลัง", - "settings-channel-desc3": "this is alpha test release of Discord. By using it you gain access to the newest\n features and fixes.", - "settings-channel-desc4": "public test build. Receives features earlier than stable but is a bit older than Canary.", - "settings-invitewebsocket-desc": "When enabled ArmCord will support Discord.gg links which means that if you open an invite link in your\n browser, ArmCord 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-mod-shelter": "is a new generation client mod built to be essentially bulletproof.", - "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-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 ArmCord splash screen when you start up the app.", - "settings-copyDebugInfo": "Copy Debug Info", - "settings-startMinimized": "Start minimized", - "settings-startMinimized-desc": "ArmCord 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-dynamicIcon": "Dynamic icon", - "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-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, 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-desc4": "transparent window with native titlebar, you need a compatible theme to run this. Windows only.", - "settings-MultiInstance": "Multi Instance", - "settings-MultiInstance-desc": "When enabled you'll be able to start up many instances of ArmCord.", - "settings-copyGPUInfo": "Copy GPU Info", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} 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-TR.json b/assets/lang/tr-TR.json deleted file mode 100644 index 0a78415..0000000 --- a/assets/lang/tr-TR.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "setup_question4": "Yüklemek istediğiniz bir istemci modunu seçin:", - "settings-channel": "Discord kanalı", - "settings-prfmMode-performance": "Performans", - "loading_screen_start": "ArmCord Başlatılıyor…", - "loading_screen_offline": "Çevrimdışı görünüyorsunuz. Lütfen internete bağlanın ve tekrar deneyin.", - "loading_screen_update": "ArmCord'un yeni bir sürümü mevcut. Lütfen son sürüme güncelleyin.", - "settings-storageFolder": "Depolama klasörünü aç", - "setup_question1": "ArmCord Kurulumuna Hoş Geldiniz", - "setup_offline": "Çevrimdışı görünüyorsunuz. Lütfen internete bağlanın ve ArmCord'u yeniden başlatın.", - "setup_question2": "Discord türünüzü seçiniz:", - "setup_question3": "ArmCord istemci modlarının kurulumunu yapmalı mı?", - "yes": "Evet", - "no": "Hayır", - "next": "İleri", - "settings-theme": "ArmCord teması", - "settings-theme-desc1": "ArmCord \"temaları\" uygulamaların davranışlarını ve görünümünü yönetir.", - "settings-theme-desc2": "ArmCord'u ilk başlattığında böyle görünüyor. Discord'un yeniden oluşturulmasını içerir \n Discord'a enjekte edilen özel başlık çubuğu ve ArmCord'a özgü stiller.", - "settings-theme-desc3": "çalıştırdığınız işletim sisteminin başlık çubuğunu kullanır (örneğin Windows 7/10). Daha fazla fonksiyon\n Linux'taki normal Discord uygulamasına benzer.", - "settings-theme-default": "Varsayılan", - "settings-theme-native": "Sistem", - "settings-csp-desc": "ArmCord CSP, Discord uygulamasına özel içerik yükleme işlemini yöneten sistemimiz. .Bunun gibi şeyler\n istemci 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": "Devre dışı bırakıldığında, ArmCord diğer pencereleri kapatırken olduğu gibi kapanacaktır aksi takdirde görev çubuğunda çalışmaya devam edecektir.", - "settings-patches": "Otomatik Yamalar", - "settings-patches-desk": "Sürüm yayınlandıktan sonra hatalar ortaya çıkarsa dağıtılan otomatik yamaları getirir. Genellikle\n (destek Discordunda bildirilmediği sürece) bunu etkin tutmak zorunda değilsiniz.", - "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ış\ngizli mobil modunu aktif eder. Olmayan tek büyük özellik sesli sohbet desteği. PinePhone'da ve benzeri cihazlarda\nolan kullanıcılar için ideal.", - "settings-channel-desc1": "Şu an kullanılan Discord örneğini değiştirmek için bu ayarı kullanabilirsiniz:", - "settings-channel-desc2": "Büyük ihtimalle en fazla bununla tanışıksınız. Discord uygulamasını kullanırken gördüğünüz\n şey!", - "settings-channel-desc3": "Bu Discord'un alpha test aşamasındaki sürümü. Bunu kullanarak en yeni\n özellikler ve düzenlemelere erişim kazanıyorsunuz.", - "settings-channel-desc4": "Genel test sürümü. Özelliklere stabil sürümden daha erken ulaşır ancak Canary'den biraz daha eskidir.", - "settings-invitewebsocket": "Rich Presence (Deneysel)", - "settings-invitewebsocket-desc": "arRPC kullanarak Discord RPC (Rich Prescence) özelliğini, bilgisayarınızdaki yerel programlar ile birlikte destekler. Hala üstünde çalışılıyor.", - "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-mod-shelter": "özellikle kurşun geçirmez olmak için tasarlanmış yeni nesil uygulama modudur.", - "settings-prfmMode-desc": "Performans modu, yanıt süresini ve ArmCord'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, ArmCord 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": "ArmCord 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-dynamicIcon": "Dinamik simge", - "settings-dynamicIcon-desc": "Discord'un Windows'taki davranışına benzer şekilde, ArmCord'un tepsisi yerine simgesinde okunmamış mesajları/pingleri gösterir.", - "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": "Tepsiye küçült", - "settings-mintoTray-desc": "Devre dışı bırakıldığında, ArmCord; kapatıldığında diğer pencereler gibi kapanacaktır. Aksi takdirde arkasına yaslanıp keyfine bakacaktır\n sistem tepsinizde sonrası için bekleyerek.", - "settings-theme-desc4": "native başlık çubuğuna sahip şeffaf pencere, bunu çalıştırmak için uyumlu bir temaya ihtiyacınız var. Sadece Windows.", - "settings-MultiInstance": "Çoklu oturum", - "settings-MultiInstance-desc": "Etkinleştirildiğinde ArmCord'un birçok oturum ile başlatabileceksiniz.", - "settings-copyGPUInfo": "GPU Bilgilerini Kopyala", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} diff --git a/assets/lang/tr.json b/assets/lang/tr.json new file mode 100644 index 0000000..38db125 --- /dev/null +++ b/assets/lang/tr.json @@ -0,0 +1,8 @@ +{ + "loading_screen_start": "Legcord başlatılıyor…", + "loading_screen_update": "Legcord’un yeni bir versiyonu var. Lütfen son versiyona güncelleyin.", + "setup_question1": "Legcord kurulumuna hoş geldiniz", + "yes": "Evet", + "no": "Hayır", + "next": "Sonraki" +} diff --git a/assets/lang/uk-UA.json b/assets/lang/uk-UA.json deleted file mode 100644 index 6b0b834..0000000 --- a/assets/lang/uk-UA.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "loading_screen_start": "Запуск ArmCord…", - "loading_screen_offline": "Здається, ви не в мережі. Перезапуск через ", - "settings-channel": "\"Екземпляр\" Discord", - "settings-channel-desc1": "Ви можете використовувати це налаштування щоб обрати екземляр Discord:", - "settings-channel-desc2": "ви, мабуть, найкраще з цим знайомі. Він використовується в стандартному офіційному клієнті\n Discord!", - "settings-channel-desc3": "це альфа-версія Discord. Використовуючи його, ви отримуєте доступ до останніх\n функцій і виправлень.", - "settings-channel-desc4": "збірка публічного тестування. Отримує функції раніше, ніж стабільний, але трохи старший, ніж Canary.", - "settings-invitewebsocket": "Rich Presence (Експерементально)", - "loading_screen_update": "Доступна нова версія ArmCord. Будь ласка, оновіться до останньої версії.", - "setup_question1": "Вітаю у ArmCord", - "setup_offline": "Здається, ви не в мережі. Перевірте підключення до Інтернету та перезавантажте ArmCord.", - "setup_question2": "Оберіть \"екземпляр\" Discord:", - "setup_question3": "Чи має ArmCord займатися встановленням клієнтських модифікацій?", - "yes": "Так", - "no": "Ні", - "next": "Наступне", - "setup_question4": "Оберіть клієнтський мод який ви хочете встановити:", - "settings-theme": "Тема ArmCord", - "settings-theme-desc1": "ArmCord \"теми\" змінять зовнішість програми.", - "settings-theme-desc2": "ось так виглядає ArmCord при першому запуску. Він включає відтворення\n панелі заголовка І інші стилі ArmCord які впровадженні в Discord.", - "settings-theme-desc3": "використовує вбудований заголовок вікна поточної ОС, яка у вас запущена (наприклад, Windows 7/10). Функціонує як\n в актуальному додатку Discord у Linux.", - "settings-theme-default": "Стандартна", - "settings-theme-native": "Нативна", - "settings-theme-transparent": "Прозора", - "settings-csp-desc": "ArmCord CSP це наша система, яка керує завантаженням контенту користувача в додаток Discord. Такі речі як\n клієнтські моди та теми залежать від неї. Відключіть, якщо хочете позбутися модів і стилів користувача.", - "settings-tray": "Трей", - "settings-tray-desc": "Якщо вимкнено, ArmCord закриватиметься, як і будь-яке інше вікно, коли буде закрито, інакше він візме і розслабиться у системному треї.", - "settings-startMinimized": "Запускати ArmCord згорнутим у трей", - "settings-startMinimized-desc": "ArmCord запускається у фоновому режимі та не заважає вам.", - "settings-patches": "Автоматичні патчі", - "settings-useLegacyCapturer": "Використовувати застарілий спосіб захоплення екрану", - "settings-mobileMode-desc": "Якщо ви використовуєте пристрій з тач-скріном ця функція для вас! Ця функція активує\n мобільну версію інтерфейсу. Нажаль, у цьому режимі не працює голосовий чат. Це ідеально підходить для\n користувачів з PinePhone і аналогічних.", - "settings-dynamicIcon": "Динамічна іконка", - "settings-dynamicIcon-desc": "Ця функція показує кількість непрочитанних повідомлень на значку программи.", - "settings-invitewebsocket-desc": "Використовує arRPC для підтримки Discord RPC (Rich Presence) з програмами на вашому комп'ютері. В роботі.", - "settings-useLegacyCapturer-desc": "Використовуйте застарілий спосіб захоплення екрану замість нового. Якщо у вас виникли проблеми із захопленням екрану, спробуйте увімкнути цю функцію.", - "settings-patches-desk": "Оновлює ArmCord якщо будуть знайдені помилки після релізу нової версії. Зазвичай\n вам не треба постійно вмикати цю функцію (якщо не повідомлено в службу підтримки Discord).", - "settings-mobileMode": "Мобільна версія Discord", - "settings-mod": "Клієнтський мод", - "settings-mod-desc1": "Клієнтські модифікації — це програми, які дозволяють налаштовувати ваш досвід з Discord. Вони можуть змінювати зовнішній вигляд,\n поведінку або додати нові функції до Discord!", - "settings-mod-vencord": "легкий і простий у використанні клієнтський мод. Має вбудований магазин для плагінів.", - "settings-mod-shelter": "клієнтська модифікація нового покоління, створений для того, щоб бути практично куленепробивним.", - "settings-prfmMode": "Режим продуктивності", - "settings-prfmMode-desc": "Режим продуктивності – це експериментальна функція, яка може підвищити швидкість реакції та продуктивність\n ArmCord або… змаеншити. Будь ласка, спробуйте кожен варіант і виберіть, який вам підходить найкраще.", - "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": "Пропускає заставку ArmCord під час запуску програми.", - "settings-copyDebugInfo": "Копіювати інформацію про налагодження", - "settings-forceNativeCrash": "Примусовий нативний збій", - "settings-spellcheck": "Перевірка орфографії", - "settings-spellcheck-desc": "Допомагає виправити неправильно написані слова, виділяючи їх.", - "setup_question5": "Ви бажаєте використовувати піктограму в треї?", - "settings-mintoTray": "Згорнути в трей", - "settings-mintoTray-desc": "Коли вимкнено, ArmCord закриється, як і будь-яке інше вікно, інакше він візьме і буде відпочивати\n в системному треї до кращих часів.", - "settings-theme-desc4": "прозоре вікно з рідною панеллю заголовка, вам потрібна сумісна тема, щоб запустити це. Тільки Windows.", - "settings-MultiInstance": "Кілька екземплярів", - "settings-MultiInstance-desc": "Якщо увімкнено, ви зможете запустити багато екземплярів ArmCord.", - "settings-copyGPUInfo": "Скопіювати інформацію про GPU", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll-desc": "Toggle smooth scrolling", - "settings-smoothScroll": "Use smooth scrolling" -} diff --git a/assets/lang/uk.json b/assets/lang/uk.json new file mode 100644 index 0000000..ce6cdf4 --- /dev/null +++ b/assets/lang/uk.json @@ -0,0 +1,141 @@ +{ + "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-transparency-tahoe-warning": "Прозорість може призвести до надмірного лагу на MacOS 26 Tahoe.", + "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": "Параметри налагодження", + "settings-processScanning": "Сканування процесу", + "settings-processScanning-desc": "Увімкнення сканування запущених ігор для покращення виявлення Rich Presence.", + "settings-windowsLegacyScanning": "Сканування застарілих версій Windows", + "settings-windowsLegacyScanning-desc": "Використовує застарілий метод для процесів сканування у Windows (до версії 1.1.6). Може покращити сумісність у деяких системах, але менш ефективний.", + "settings-scanInterval": "Інтервал сканування (мс)", + "settings-scanInterval-desc": "Встановлює частоту (у мілісекундах) сканування процесу. Нижчі значення можуть покращити швидкість виявлення, але можуть збільшити використання процесора." +} diff --git a/assets/lang/zh-Hans.json b/assets/lang/zh-Hans.json deleted file mode 100644 index 425a301..0000000 --- a/assets/lang/zh-Hans.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "settings-theme-default": "默认", - "settings-tray": "托盘", - "settings-patches": "自动安装补丁", - "loading_screen_update": "发现ArmCord新版本。请更新至最新版。", - "loading_screen_start": "正在启动ArmCord…", - "setup_question1": "欢迎进入ArmCord安装向导", - "loading_screen_offline": "您看起来离线了,即将自动重启: ", - "setup_offline": "您看起来离线了。请连接至网络并重启ArmCord。", - "setup_question2": "选择您的Discord频道或实例:", - "settings-updater": "检查更新", - "setup_question3": "需要ArmCord来处理客户端模组的安装吗?", - "yes": "是", - "no": "否", - "next": "下一步", - "setup_question4": "选择您想安装的客户端模组:", - "settings-theme": "ArmCord主题", - "settings-theme-desc1": "ArmCord“主题”管理应用的行为与外观。", - "settings-theme-desc3": "使用您操作系统(如 Windows 7/10)的原生标题栏。\n 与Discord在Linux上运行时的行为类似。", - "settings-theme-desc2": "这将是您初次启动ArmCord时的效果。它包括重新实现的Discord\n 定制标题栏与注入Discord的ArmCord样式。", - "settings-theme-native": "原生", - "settings-csp-desc": "ArmCord CSP是我们用以管理读取加载至 Discord app的定制内容的系统. 诸如\n 客户端模组与主题依赖该系统的支持. 若您想关闭模组与定制内容,请禁用它.", - "settings-tray-desc": "当被禁用时,ArmCord将和其他窗口一样在关闭时退出,否则它将在您的系统托盘里稍稍休憩。", - "settings-patches-desk": "在发行版本的bug被发现并修复后自动安装补丁。\n 通常您不需要启用该项,除非在我们的Discord支持服务器中通知。", - "settings-mobileMode": "移动端模式", - "settings-mobileMode-desc": "如果您正使用触摸屏设备,该功能正适合您!它能启用Discord为手机与平板设计的\n 移动端模式。唯一缺失的主要功能为语音聊天。\n 此功能最适合使用PinePhone或类似设备的用户。", - "settings-channel": "Discord频道", - "settings-channel-desc1": "您可以使用该设定修改当前的Discord实例:", - "settings-channel-desc2": "您可能会对此感到很熟悉,因为它是Discord客户端\n 默认的样子!", - "settings-channel-desc3": "这是Discord的Alpha测试版本。使用该版本将给予您\n 最新的功能与修复。", - "settings-channel-desc4": "公开测试版。接收介于Canary版与稳定版之间的功能更新。", - "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-mod-shelter": "是新一代的客户端模组,以坚不可摧为目标。", - "settings-prfmMode-desc": "性能模式是一种可能增强ArmCord响应速度与表现的实验性功能\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": "启动时跳过ArmCord的启动画面。", - "settings-copyDebugInfo": "复制调试信息", - "settings-startMinimized": "启动时最小化", - "settings-startMinimized-desc": "ArmCord在后台启动,不对您造成影响。", - "settings-crashesFolder": "打开原生崩溃文件夹", - "settings-forceNativeCrash": "强制原生崩溃", - "settings-disableAutogain": "禁用自动增益", - "settings-disableAutogain-desc": "禁用自动增益。", - "settings-theme-transparent": "透明", - "settings-useLegacyCapturer": "使用旧版屏幕捕获", - "settings-useLegacyCapturer-desc": "使用旧版屏幕分享模块替换新版。如果您在分享屏幕时遇到问题,可以尝试启用此选项。", - "settings-dynamicIcon": "动态图标", - "settings-dynamicIcon-desc": "跟随Disocrd在Windows上的行为,在ArmCord的图标上显示未读信息/提及数量,而不是在托盘图标上。", - "settings-spellcheck": "拼写检查", - "settings-spellcheck-desc": "高亮显示拼写错误的词语以便于改正。", - "setup_question5": "您希望使用托盘图标吗?", - "settings-mintoTray": "最小化至托盘", - "settings-mintoTray-desc": "禁用后,ArmCord 将和其他窗口一样在关闭时退出,\n 否则它将在您的系统托盘里稍稍休憩。", - "settings-theme-desc4": "具有原生标题栏的透明窗口,需要兼容的主题。仅限Windows。", - "settings-MultiInstance": "允许多实例", - "settings-MultiInstance-desc": "启用后,您将可以启动多个ArmCord实例。", - "settings-copyGPUInfo": "复制显卡信息", - "settings-prfmMode-vaapi": "VAAPI", - "settings-smoothScroll": "Use smooth scrolling", - "settings-smoothScroll-desc": "Toggle smooth scrolling" -} diff --git a/assets/lang/zh_Hans.json b/assets/lang/zh_Hans.json new file mode 100644 index 0000000..f078935 --- /dev/null +++ b/assets/lang/zh_Hans.json @@ -0,0 +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": "通话窗口弹出时保持置顶" +} 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 @@ +{} diff --git a/assets/macos.png b/assets/macos.png deleted file mode 100644 index f43ff68..0000000 Binary files a/assets/macos.png and /dev/null differ diff --git a/assets/mute-off.png b/assets/mute-off.png new file mode 100644 index 0000000..1f9288c Binary files /dev/null and b/assets/mute-off.png differ diff --git a/assets/mute.png b/assets/mute.png new file mode 100644 index 0000000..40753a6 Binary files /dev/null and b/assets/mute.png differ diff --git a/assets/ping.png b/assets/ping.png deleted file mode 100644 index 1d0762a..0000000 Binary files a/assets/ping.png and /dev/null differ diff --git a/assets/screenshot-1920x1080.png b/assets/screenshot-1920x1080.png deleted file mode 100644 index 46a5d50..0000000 Binary files a/assets/screenshot-1920x1080.png and /dev/null differ diff --git a/assets/screenshots/keybinds.png b/assets/screenshots/keybinds.png new file mode 100644 index 0000000..dfaea1e Binary files /dev/null and b/assets/screenshots/keybinds.png differ diff --git a/assets/screenshots/settings.png b/assets/screenshots/settings.png new file mode 100644 index 0000000..216b34a Binary files /dev/null and b/assets/screenshots/settings.png differ diff --git a/assets/screenshots/shelter.png b/assets/screenshots/shelter.png new file mode 100644 index 0000000..960ebf5 Binary files /dev/null and b/assets/screenshots/shelter.png differ diff --git a/biome.jsonc b/biome.jsonc new file mode 100644 index 0000000..cd57ac3 --- /dev/null +++ b/biome.jsonc @@ -0,0 +1,36 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.4.16/schema.json", + "vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true }, + "files": { + "ignoreUnknown": false, + "includes": ["**", "!**/assets/app/js"] + }, + "formatter": { + "enabled": true, + "useEditorconfig": true, + "formatWithErrors": false, + "indentStyle": "space", + "indentWidth": 4, + "lineEnding": "lf", + "lineWidth": 120, + "attributePosition": "auto", + "bracketSpacing": true + }, + "assist": { "actions": { "source": { "organizeImports": "on" } } }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "complexity": { + "noForEach": "off" + }, + "style": { + "noNonNullAssertion": "off", + "noUselessElse": "off" // NOTE - This rule seems broken + }, + "a11y": { + "useKeyWithClickEvents": "off" + } + } + } +} diff --git a/build/.DS_Store b/build/.DS_Store new file mode 100644 index 0000000..959ea33 Binary files /dev/null and b/build/.DS_Store differ diff --git a/build/appx/Square150x150Logo.png b/build/appx/Square150x150Logo.png index 1b54d95..ad212ed 100644 Binary files a/build/appx/Square150x150Logo.png and b/build/appx/Square150x150Logo.png differ diff --git a/build/appx/Square44x44Logo.png b/build/appx/Square44x44Logo.png index 549e305..2881e91 100644 Binary files a/build/appx/Square44x44Logo.png and b/build/appx/Square44x44Logo.png differ diff --git a/build/appx/StoreLogo.png b/build/appx/StoreLogo.png index 940c594..5f81725 100644 Binary files a/build/appx/StoreLogo.png and b/build/appx/StoreLogo.png differ diff --git a/build/appx/Wide310x150Logo.png b/build/appx/Wide310x150Logo.png index a1e623d..19f1047 100644 Binary files a/build/appx/Wide310x150Logo.png and b/build/appx/Wide310x150Logo.png differ diff --git a/build/entitlements.mac.plist b/build/entitlements.mac.plist new file mode 100644 index 0000000..163da0f --- /dev/null +++ b/build/entitlements.mac.plist @@ -0,0 +1,20 @@ + + + + + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.device.audio-input + + com.apple.security.device.bluetooth + + com.apple.security.device.camera + + + com.apple.security.cs.disable-library-validation + + + \ No newline at end of file diff --git a/build/icon.icns b/build/icon.icns index 428c3c7..08c34b0 100644 Binary files a/build/icon.icns and b/build/icon.icns differ diff --git a/build/icon.ico b/build/icon.ico index dcaf4db..6c0bd58 100644 Binary files a/build/icon.ico and b/build/icon.ico differ diff --git a/build/icon.png b/build/icon.png index 940c594..4ad0ad5 100644 Binary files a/build/icon.png and b/build/icon.png differ diff --git a/build/installer.nsh b/build/installer.nsh deleted file mode 100644 index 06b5934..0000000 --- a/build/installer.nsh +++ /dev/null @@ -1,8 +0,0 @@ -!macro preInit - SetRegView 64 - WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation "$LocalAppData\ArmCord" - WriteRegExpandStr HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation "$LocalAppData\ArmCord" - SetRegView 32 - WriteRegExpandStr HKLM "${INSTALL_REGISTRY_KEY}" InstallLocation "$LocalAppData\ArmCord" - WriteRegExpandStr HKCU "${INSTALL_REGISTRY_KEY}" InstallLocation "$LocalAppData\ArmCord" -!macroend \ No newline at end of file diff --git a/docs/examples/hello-plugin/main.js b/docs/examples/hello-plugin/main.js new file mode 100644 index 0000000..e676944 --- /dev/null +++ b/docs/examples/hello-plugin/main.js @@ -0,0 +1,20 @@ +/** + * Main process entry example. + * Receives api from Legcord plugin manager. + */ +module.exports.activate = (api) => { + api.logger.log("main entry active"); + + // Example: patch BrowserWindow.getTitle globally in main process. + const unpatch = api.patcher.after("getTitle", api.electron.BrowserWindow.prototype, (_args, ret) => { + if (typeof ret === "string" && !ret.endsWith(" [HelloPlugin]")) { + return `${ret} [HelloPlugin]`; + } + return ret; + }); + + api.onCleanup(() => { + unpatch(); + api.logger.log("main entry cleaned up"); + }); +}; diff --git a/docs/examples/hello-plugin/manifest.json b/docs/examples/hello-plugin/manifest.json new file mode 100644 index 0000000..39964fe --- /dev/null +++ b/docs/examples/hello-plugin/manifest.json @@ -0,0 +1,11 @@ +{ + "id": "hello-plugin", + "name": "Hello Plugin", + "version": "1.0.0", + "description": "Example plugin showing main/preload/renderer entries and function patching.", + "author": "Legcord Docs", + "compatibleVersions": ["*"], + "main": "main.js", + "preload": "preload.js", + "renderer": "renderer.js" +} diff --git a/docs/examples/hello-plugin/preload.js b/docs/examples/hello-plugin/preload.js new file mode 100644 index 0000000..d8a7b6d --- /dev/null +++ b/docs/examples/hello-plugin/preload.js @@ -0,0 +1,29 @@ +/** + * Preload entry example. + * Runs in Legcord preload context with access to DOM and plugin API. + */ +module.exports.activate = (api) => { + api.logger.log("preload entry active"); + + // Example: patch document title setter for demonstration. + const descriptor = Object.getOwnPropertyDescriptor(Document.prototype, "title"); + if (!descriptor?.set) return; + + const patchTarget = { setTitle: descriptor.set }; + const unpatch = api.patcher.before("setTitle", patchTarget, (args) => { + if (typeof args[0] === "string" && !args[0].includes("[P]")) { + args[0] = `[P] ${args[0]}`; + } + }); + + Object.defineProperty(document, "title", { + configurable: true, + get: descriptor.get?.bind(document), + set: (value) => patchTarget.setTitle.call(document, value), + }); + + api.onCleanup(() => { + unpatch(); + api.logger.log("preload entry cleaned up"); + }); +}; diff --git a/docs/examples/hello-plugin/renderer.js b/docs/examples/hello-plugin/renderer.js new file mode 100644 index 0000000..3bd3c1a --- /dev/null +++ b/docs/examples/hello-plugin/renderer.js @@ -0,0 +1,18 @@ +/** + * Renderer entry example. + * Runs in the Discord page context. + * + * In renderer entries, expose activate function through module.exports. + */ +module.exports.activate = (api) => { + api.logger.log("renderer entry active"); + + // Example: patch console.log in renderer just to show before/instead/after usage. + const unpatchBefore = api.patcher.before("log", console, (args) => { + args.unshift("[HelloPlugin]"); + }); + + const unpatchAfter = api.patcher.after("log", console, (_args, ret) => ret); + void unpatchBefore; + void unpatchAfter; +}; diff --git a/docs/plugin-system.md b/docs/plugin-system.md new file mode 100644 index 0000000..bfe227c --- /dev/null +++ b/docs/plugin-system.md @@ -0,0 +1,125 @@ +# Legcord Plugin System + +Legcord now supports filesystem plugins loaded from: + +`/plugins//` + +Each plugin can provide separate runtime entries for: + +- `main` (Electron main process) +- `preload` (Legcord preload context) +- `renderer` (Discord page context) + +## Manifest + +Create a `manifest.json` in your plugin folder: + +```json +{ + "id": "example-plugin", + "name": "Example Plugin", + "version": "1.0.0", + "description": "Example plugin with all three targets", + "author": "you", + "compatibleVersions": ["1.3.x"], + "main": "main.js", + "preload": "preload.js", + "renderer": "renderer.js" +} +``` + +Required fields: + +- `id` +- `name` +- `version` + +Optional fields: + +- `description` +- `author` +- `compatibleVersions` +- `main` +- `preload` +- `renderer` + +`compatibleVersions` supports exact versions and `x` wildcard prefixes: + +- `"1.3.0"` (exact) +- `"1.3.x"` (any patch in `1.3`) +- `"*"` (all versions) + +If the running Legcord version does not match, the plugin is marked incompatible and cannot be enabled/loaded. +Plugins are disabled by default until explicitly enabled in the Plugins settings page. + +## Lifecycle + +Main and preload entries can export either: + +- `activate(api)` named export +- default export function + +Renderer entries run as plain script files and can expose: + +- `module.exports.activate = (api) => { ... }` +- `module.exports.default = (api) => { ... }` +- `globalThis.activatePlugin = (api) => { ... }` + +## Plugin Control API + +From `window.legcord.plugins`: + +- `list()` +- `setEnabled(id, enabled)` +- `reload(id)` + +Main-process entries are enabled/disabled live. Preload/renderer entries are loaded on startup/navigation and will reflect enable state on next load. + +## Patcher API (Spitroast-style) + +Plugin APIs include: + +- `api.patcher.before(name, parent, callback, oneTime?)` +- `api.patcher.after(name, parent, callback, oneTime?)` +- `api.patcher.instead(name, parent, callback, oneTime?)` + +Callbacks use the same semantics as Spitroast (`args` mutation/replacement, return value replacement, instead chaining). +The return value is an `unpatch()` function. + +### Example + +```js +export function activate(api) { + const unpatch = api.patcher.before("fetch", window, (args) => { + api.logger.log("fetch called with", args[0]); + }); + + api.onCleanup(() => { + unpatch(); + }); +} +``` + +## Notes + +- Plugin enable state is stored in config under `pluginStates`. +- Plugin folders are scanned from disk at startup. +- Invalid manifests or missing entry files are skipped safely. + +## Full Example Plugin + +A complete example is available at: + +- `docs/examples/hello-plugin/manifest.json` +- `docs/examples/hello-plugin/main.js` +- `docs/examples/hello-plugin/preload.js` +- `docs/examples/hello-plugin/renderer.js` + +To test it: + +1. Copy `docs/examples/hello-plugin` into your runtime plugins directory: + - `/plugins/hello-plugin` +2. Restart Legcord or use the Plugins settings page: + - enable/disable + - reload +3. Open DevTools and watch for `[Plugin:hello-plugin]` logs. diff --git a/electron-builder.ts b/electron-builder.ts new file mode 100644 index 0000000..bd784de --- /dev/null +++ b/electron-builder.ts @@ -0,0 +1,90 @@ +import type { Configuration } from "electron-builder"; + +import { applyAppImageSandboxFix } from "./scripts/build/sandboxFix.mjs"; + +export const config: Configuration = { + appId: "app.legcord.Legcord", + productName: "Legcord", + artifactName: "Legcord-${version}-${os}-${arch}.${ext}", + beforePack: applyAppImageSandboxFix, + protocols: [ + { + name: "Discord", + schemes: ["discord"], + }, + ], + mac: { + category: "public.app-category.social-networking", + darkModeSupport: true, + notarize: true, + extendInfo: { + NSMicrophoneUsageDescription: "Legcord requires access to the microphone to function properly.", + NSCameraUsageDescription: "Legcord requires access to the camera to function properly.", + NSAudioCaptureUsageDescription: + "Legcord requires access to system audio to share sound during screenshare.", + NSCameraUseContinuityCameraDeviceType: true, + "com.apple.security.device.audio-input": true, + "com.apple.security.device.camera": true, + }, + x64ArchFiles: "**/node_modules/koffi/**", + }, + + linux: { + icon: "build/icon.icns", + target: ["AppImage", "deb", "rpm", "tar.gz"], + maintainer: "linux@legcord.app", + category: "Network", + desktop: { + entry: { + StartupWMClass: "legcord", + }, + }, + }, + + nsis: { + oneClick: false, + allowToChangeInstallationDirectory: true, + }, + + appx: { + applicationId: "smartfrigde.Legcord", + identityName: "53758smartfrigde.Legcord", + publisher: "CN=EAB3A6D3-7145-4623-8176-D579F573F339", + publisherDisplayName: "smartfrigde", + backgroundColor: "white", + showNameOnTiles: true, + }, + + snap: { + environment: { ARRPC_NO_PROCESS_SCANNING: "true" }, + allowNativeWayland: true, + executableArgs: ["--no-process-scanning"], + base: "core22", + publish: { + provider: "snapStore", + }, + }, + + deb: { + category: "Network", + icon: "build/icon.icns", + depends: ["libgbm-dev", "libasound2", "libnspr4", "libnss3"], + }, + + files: [ + "!*", + "assets", + "node-modules", + "ts-out", + "dist/venmic-arm64.node", + "dist/venmic-x64.node", + "package.json", + "license.txt", + ], + + electronDownload: { + cache: ".cache", + }, +}; + +export default config; diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index 27235c6..0000000 --- a/eslint.config.js +++ /dev/null @@ -1,48 +0,0 @@ -/* eslint-disable n/no-unpublished-import */ -// @ts-check - -import eslint from "@eslint/js"; -import tseslint from "typescript-eslint"; -import prettier from "eslint-plugin-prettier"; -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 - ...tseslint.configs.recommendedTypeChecked, - ...tseslint.configs.stylisticTypeChecked, - n.configs["flat/recommended"], - { - settings: { - n: { - allowModules: ["electron"], - tryExtensions: [".tsx", ".ts", ".jsx", ".js", ".json", ".node", ".d.ts"] - } - }, - plugins: { - prettier, - n - }, - languageOptions: { - parserOptions: { - project: true, - 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, - "@typescript-eslint/no-unused-vars": [ - 2, - { - argsIgnorePattern: "^_", - varsIgnorePattern: "^_", - caughtErrorsIgnorePattern: "^_" - } - ], - // @ts-expect-error - Don't worry about it - ...prettier.configs.recommended.rules - } - } -); diff --git a/LICENSE b/license.txt similarity index 100% rename from LICENSE rename to license.txt diff --git a/lune.config.js b/lune.config.js new file mode 100644 index 0000000..a6014a4 --- /dev/null +++ b/lune.config.js @@ -0,0 +1,7 @@ +// @ts-check + +import { defineConfig } from "@uwu/lune"; + +export default defineConfig({ + cssModules: true, +}); diff --git a/meta/app.legcord.Legcord.metainfo.xml b/meta/app.legcord.Legcord.metainfo.xml new file mode 100644 index 0000000..ff91d33 --- /dev/null +++ b/meta/app.legcord.Legcord.metainfo.xml @@ -0,0 +1,325 @@ + + + + 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.2.4 + +

What’s New in Legcord v1.2.4 ✨

+
    +
  • 🐧 **Huge streaming performance improvements on Linux**
  • +
+
    +
  • 🔄 **Separate “No Bundle Updates” setting for each client mod**
  • +
+
    +
  • 💾 **Backup & Restore added**
  • +
+
    +
  • 🎮 **Improved macOS game detection**
  • +
+
    +
  • 🛡️ **New CSP options setting**
  • +
+
    +
  • 🪟 **Window material setting added** for supported systems ([https://github.com/Legcord/Legcord/pull/1025](https://github.com/Legcord/Legcord/pull/1025) by @passionvine).
  • +
  • 📦 **OPTIONAL automatic Linux updates added** ([https://github.com/Legcord/Legcord/pull/1027](https://github.com/Legcord/Legcord/pull/1027) by @KarboXXX).
  • +
  • 🎛️ **Support banner popup added**
  • +
+
    +
  • 🖥️ Fixed Linux `StartupWMClass` to `legcord` ([https://github.com/Legcord/Legcord/pull/1021](https://github.com/Legcord/Legcord/pull/1021) by @khancyr).
  • +
  • 📺 Fixed screensharing quality, FPS, and audio ([https://github.com/Legcord/Legcord/pull/1026](https://github.com/Legcord/Legcord/pull/1026) by @KarboXXX).
  • +
  • 🎚️ Fixed scrollbar styling on file preview ([https://github.com/Legcord/Legcord/pull/1024](https://github.com/Legcord/Legcord/pull/1024) by @MahmodZE).
  • +
  • 🔊 Fixed mute toggle sound effect playback ([https://github.com/Legcord/Legcord/pull/1031](https://github.com/Legcord/Legcord/pull/1031) by @psw01).
  • +
  • 🎮 Fixed RPC status not disappearing properly ([https://github.com/Legcord/Legcord/pull/1032](https://github.com/Legcord/Legcord/pull/1032) by @Adrigamer2950).
  • +
  • 🔐 Fixed security prompt appearing with no passkey ([https://github.com/Legcord/Legcord/pull/1033](https://github.com/Legcord/Legcord/pull/1033) by @dequeues).
  • +
  • 🇫🇷 Added missing French translations for settings categories ([https://github.com/Legcord/Legcord/pull/1028](https://github.com/Legcord/Legcord/pull/1028) by @youtsuhodev).
  • +
  • ⌨️ Polished keybinds UI ([https://github.com/Legcord/Legcord/pull/1038](https://github.com/Legcord/Legcord/pull/1038) by @youtsuhodev).
  • +
  • 🎥 Fixed camera/mic device switching not working ([https://github.com/Legcord/Legcord/pull/1051](https://github.com/Legcord/Legcord/pull/1051) by @narasaka).
  • +
  • ⚙️ Fixed settings shortcut behavior ([https://github.com/Legcord/Legcord/pull/1046](https://github.com/Legcord/Legcord/pull/1046) by @KirobotDev).
  • +
  • 📏 Fixed dropdown height limit in Games settings ([https://github.com/Legcord/Legcord/pull/1045](https://github.com/Legcord/Legcord/pull/1045) by @youtsuhodev).
  • +
  • 📐 Fixed dropdown max height calculation ([https://github.com/Legcord/Legcord/pull/1059](https://github.com/Legcord/Legcord/pull/1059) by @MahmodZE).
  • +
  • 🧹 Cleanup of old fix-me notes and code polish ([https://github.com/Legcord/Legcord/pull/1060](https://github.com/Legcord/Legcord/pull/1060) by @KirobotDev).
  • +
  • 📂 Fixed restore zip path traversal issue ([https://github.com/Legcord/Legcord/pull/1061](https://github.com/Legcord/Legcord/pull/1061) by @youtsuhodev).
  • +
  • 🛡️ Added stricter CSP, better permission handling, and mod validation ([https://github.com/Legcord/Legcord/pull/1069](https://github.com/Legcord/Legcord/pull/1069) by @KirobotDev).
  • +
  • Fixed first time setup
  • +
+
+
+ + https://github.com/Legcord/Legcord/releases/tag/v1.2.3 + +

What’s New in Legcord v1.2.3 ✨

+
    +
  • 🐧 **Huge streaming performance improvements on Linux**
  • +
+
    +
  • 🔄 **Separate “No Bundle Updates” setting for each client mod**
  • +
+
    +
  • 💾 **Backup & Restore added**
  • +
+
    +
  • 🎮 **Improved macOS game detection**
  • +
+
    +
  • 🛡️ **New CSP options setting**
  • +
+
    +
  • 🪟 **Window material setting added** for supported systems ([https://github.com/Legcord/Legcord/pull/1025](https://github.com/Legcord/Legcord/pull/1025) by @passionvine).
  • +
  • 📦 **OPTIONAL automatic Linux updates added** ([https://github.com/Legcord/Legcord/pull/1027](https://github.com/Legcord/Legcord/pull/1027) by @KarboXXX).
  • +
  • 🎛️ **Support banner popup added**
  • +
+
    +
  • 🖥️ Fixed Linux `StartupWMClass` to `legcord` ([https://github.com/Legcord/Legcord/pull/1021](https://github.com/Legcord/Legcord/pull/1021) by @khancyr).
  • +
  • 📺 Fixed screensharing quality, FPS, and audio ([https://github.com/Legcord/Legcord/pull/1026](https://github.com/Legcord/Legcord/pull/1026) by @KarboXXX).
  • +
  • 🎚️ Fixed scrollbar styling on file preview ([https://github.com/Legcord/Legcord/pull/1024](https://github.com/Legcord/Legcord/pull/1024) by @MahmodZE).
  • +
  • 🔊 Fixed mute toggle sound effect playback ([https://github.com/Legcord/Legcord/pull/1031](https://github.com/Legcord/Legcord/pull/1031) by @psw01).
  • +
  • 🎮 Fixed RPC status not disappearing properly ([https://github.com/Legcord/Legcord/pull/1032](https://github.com/Legcord/Legcord/pull/1032) by @Adrigamer2950).
  • +
  • 🔐 Fixed security prompt appearing with no passkey ([https://github.com/Legcord/Legcord/pull/1033](https://github.com/Legcord/Legcord/pull/1033) by @dequeues).
  • +
  • 🇫🇷 Added missing French translations for settings categories ([https://github.com/Legcord/Legcord/pull/1028](https://github.com/Legcord/Legcord/pull/1028) by @youtsuhodev).
  • +
  • ⌨️ Polished keybinds UI ([https://github.com/Legcord/Legcord/pull/1038](https://github.com/Legcord/Legcord/pull/1038) by @youtsuhodev).
  • +
  • 🎥 Fixed camera/mic device switching not working ([https://github.com/Legcord/Legcord/pull/1051](https://github.com/Legcord/Legcord/pull/1051) by @narasaka).
  • +
  • ⚙️ Fixed settings shortcut behavior ([https://github.com/Legcord/Legcord/pull/1046](https://github.com/Legcord/Legcord/pull/1046) by @KirobotDev).
  • +
  • 📏 Fixed dropdown height limit in Games settings ([https://github.com/Legcord/Legcord/pull/1045](https://github.com/Legcord/Legcord/pull/1045) by @youtsuhodev).
  • +
  • 📐 Fixed dropdown max height calculation ([https://github.com/Legcord/Legcord/pull/1059](https://github.com/Legcord/Legcord/pull/1059) by @MahmodZE).
  • +
  • 🧹 Cleanup of old fix-me notes and code polish ([https://github.com/Legcord/Legcord/pull/1060](https://github.com/Legcord/Legcord/pull/1060) by @KirobotDev).
  • +
  • 📂 Fixed restore zip path traversal issue ([https://github.com/Legcord/Legcord/pull/1061](https://github.com/Legcord/Legcord/pull/1061) by @youtsuhodev).
  • +
  • 🛡️ Added stricter CSP, better permission handling, and mod validation ([https://github.com/Legcord/Legcord/pull/1069](https://github.com/Legcord/Legcord/pull/1069) by @KirobotDev).
  • +
+
+
+ + https://github.com/Legcord/Legcord/releases/tag/v1.2.2 + +

What’s New in Legcord v1.2.2 ✨

+
    +
  • 🚫 **Game blacklist for arRPC detection**
  • +
+
    +
  • ⚡ **Electron updated** for better stability and compatibility.
  • +
  • 🎨 **Quick CSS toggle added**.
  • +
  • 🪟 Fixed **Windows titlebar duplication** ([https://github.com/Legcord/Legcord/pull/1009](https://github.com/Legcord/Legcord/pull/1009) by @passionvine).
  • +
  • 🧪 **Custom Chromium flags support**
  • +
+
    +
  • 🛠️ Fixed **settings menu version patch** ([https://github.com/Legcord/Legcord/pull/1014](https://github.com/Legcord/Legcord/pull/1014) by @MahmodZE).
  • +
  • 🧹 Fixed various **build warnings** ([https://github.com/Legcord/Legcord/pull/1017](https://github.com/Legcord/Legcord/pull/1017) by @MahmodZE).
  • +
+
+
+ + https://github.com/Legcord/Legcord/releases/tag/v1.2.1 + +

What’s New in Legcord v1.2.1 ✨

+
    +
  • 🧯 Fixed screenshare crashing when opening it up
  • +
+
+
+ + https://github.com/Legcord/Legcord/releases/tag/v1.2.0 + +

What’s New in Legcord v1.2.0 ✨

+
    +
  • 🎮 **Brand-new game detection system**
  • +
+
    +
  • 🧪 **Legcord Games (Beta)**
  • +
+
    +
  • 🎨 **Improved Vencord Quick CSS patch**
  • +
+
    +
  • 🌍 **Localization improvements**
  • +
+
    +
  • 📺 **Stream quality patch updated**
  • +
+
    +
  • ⬇️ Fixed the **“Download Apps” button** incorrectly appearing.
  • +
  • 🪟 **macOS & Windows titlebar styling fixes**.
  • +
  • 🧩 **Extended plugin abilities (optional)**
  • +
+
    +
  • 🎨 Numerous **style updates** to match Discord’s settings revamp and rebrand.
  • +
  • 🎛️ Improved **Touch Bar handling** on macOS.
  • +
  • ⚡ **Settings are now cached**, improving overall performance.
  • +
  • 🔗 **Discord deeplinks support** (`discord://`)
  • +
+
    +
  • 🧯 Fixed arRPC crashing ([https://github.com/Legcord/Legcord/pull/949](https://github.com/Legcord/Legcord/pull/949) by @PONYMODZ)
  • +
  • ▶️ Fixed YouTube adblock issues ([https://github.com/Legcord/Legcord/pull/979](https://github.com/Legcord/Legcord/pull/979) by @Alangopro)
  • +
  • 📖 Updated README with Debian installation instructions ([https://github.com/Legcord/Legcord/pull/972](https://github.com/Legcord/Legcord/pull/972) by @khancyr)
  • +
  • 🧭 Fixed Equicord headerbar button overlap ([https://github.com/Legcord/Legcord/pull/990](https://github.com/Legcord/Legcord/pull/990) by @lbrooney)
  • +
  • 🎨 Updated CSS variable names used on navigation buttons ([https://github.com/Legcord/Legcord/pull/989](https://github.com/Legcord/Legcord/pull/989) by @lbrooney)
  • +
  • 📐 Fixed trailing bar collision with the navigation bar ([https://github.com/Legcord/Legcord/pull/993](https://github.com/Legcord/Legcord/pull/993) by @lbrooney)
  • +
  • 📺 Fixed YouTube embeds in chat and Watch Together activity ([https://github.com/Legcord/Legcord/pull/994](https://github.com/Legcord/Legcord/pull/994) by @MahmodZE)
  • +
  • 🧩 Refactored and redesigned several UI components ([https://github.com/Legcord/Legcord/pull/995](https://github.com/Legcord/Legcord/pull/995) by @MahmodZE)
  • +
  • ⌨️ Improved the keybind maker ([https://github.com/Legcord/Legcord/pull/996](https://github.com/Legcord/Legcord/pull/996) by @MahmodZE)
  • +
  • 🚀 Fixed a launch failure related to global shortcuts ([https://github.com/Legcord/Legcord/pull/1004](https://github.com/Legcord/Legcord/pull/1004) by @MahmodZE)
  • +
  • 🖥️ Fixed an issue where the screenshare picker modal closes on click-outside and wouldn’t reopen ([https://github.com/Legcord/Legcord/pull/1002](https://github.com/Legcord/Legcord/pull/1002) by @MahmodZE)
  • +
+
+
+ + 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 + +
\ No newline at end of file diff --git a/package.json b/package.json index 1584342..1a5c15a 100644 --- a/package.json +++ b/package.json @@ -1,100 +1,72 @@ { - "name": "armcord", - "version": "3.3.0", - "description": "ArmCord is a custom client designed to enhance your Discord experience while keeping everything lightweight.", + "name": "legcord", + "version": "1.3.0", + "description": "Legcord is a custom client designed to enhance your Discord experience while keeping everything lightweight.", "main": "ts-out/main.js", "engines": { - "node": ">=22" + "node": ">=26" }, "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 && node scripts/copyVenmic.ts", + "build:plugins": "lune ci --repoSubDir src/shelter --to ts-out/plugins", + "build": "pnpm build:plugins && rolldown -c rolldown.config.ts && node scripts/copyVenmic.ts", + "start": "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", - "format": "prettier --write src *.json", - "lint": "eslint \"**/*.{ts,tsx,js,jsx}\" .", + "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", - "prepare": "git config --local core.hooksPath .hooks/" + "updateMeta": "node scripts/utils/updateMeta.ts" }, "repository": { "type": "git", - "url": "git+https://github.com/armcord/armcord.git" + "url": "git+https://github.com/Legcord/Legcord.git" }, "author": "smartfrigde", "license": "OSL-3.0", "type": "module", "bugs": { - "url": "https://github.com/armcord/armcord/issues" + "url": "https://github.com/Legcord/Legcord/issues" }, - "homepage": "https://github.com/armcord/armcord#readme", + "homepage": "https://github.com/Legcord/Legcord#readme", "devDependencies": { - "@eslint/js": "^9.4.0", - "@types/eslint__js": "^8.42.3", - "@types/node": "^20.14.2", - "@types/ws": "^8.5.10", - "copyfiles": "^2.4.1", - "electron": "30.1.1", - "electron-builder": "25.0.0-alpha.9", - "eslint": "^9.4.0", - "eslint-plugin-n": "^17.8.1", - "eslint-plugin-prettier": "^5.1.3", - "prettier": "^3.3.1", - "typescript": "^5.4.5", - "typescript-eslint": "^7.12.0" + "@biomejs/biome": "2.4.16", + "@rolldown-plugin/solid": "^0.0.4", + "@rollup/plugin-esm-shim": "^0.1.8", + "@types/adm-zip": "^0.5.8", + "@types/node": "^25.9.1", + "@types/ws": "^8.18.1", + "@uwu/lune": "^1.6.2", + "@uwu/shelter-defs": "^1.5.1", + "@xmldom/xmldom": "^0.9.10", + "app-builder-lib": "^26.8.1", + "babel-preset-solid": "^1.9.12", + "electron": "42.3.3", + "electron-builder": "26.8.1", + "lucide-solid": "^1.16.0", + "rolldown": "1.0.3", + "rollup-plugin-copy": "^3.5.0", + "solid-js": "^1.9.13", + "solid-motionone": "^1.0.4", + "typescript": "^6.0.3", + "xml-formatter": "^3.7.0" }, "dependencies": { - "arrpc": "github:OpenAsar/arrpc#c62ec6a04c8d870530aa6944257fe745f6c59a24", - "cross-fetch": "^4.0.0", - "electron-context-menu": "^4.0.0", + "adm-zip": "^0.5.17", + "arrpc": "github:Legcord/arrpc#efe7589762470d32b9ba10d529be5acc23cd0e19", + "electron-context-menu": "^4.1.2", "electron-is-dev": "^3.0.1", - "extract-zip": "^2.0.1", - "v8-compile-cache": "^2.4.0", - "ws": "^8.17.0" + "electron-updater": "^6.8.3", + "ms": "^2.1.3", + "spitroast": "^2.1.6", + "tslib": "^2.8.1", + "ws": "^8.21.0" }, - "build": { - "snap": { - "allowNativeWayland": false - }, - "nsis": { - "include": "build/installer.nsh", - "allowToChangeInstallationDirectory": true, - "license": "LICENSE", - "oneClick": false - }, - "files": [ - "!*", - "assets", - "node_modules", - "ts-out", - "package.json", - "LICENSE" - ], - "appId": "com.smartfridge.armcord", - "productName": "ArmCord", - "mac": { - "category": "Network" - }, - "linux": { - "icon": "build/icon.icns", - "category": "Network", - "maintainer": "smartfridge@vivaldi.net", - "target": [ - "deb", - "tar.gz", - "rpm", - "AppImage" - ] - }, - "appx": { - "identityName": "53758smartfrigde.ArmCord", - "publisher": "CN=EAB3A6D3-7145-4623-8176-D579F573F339", - "publisherDisplayName": "smartfrigde", - "applicationId": "smartfrigde.ArmCord" - } + "optionalDependencies": { + "@vencord/venmic": "^6.1.0" }, - "packageManager": "pnpm@9.2.0", + "packageManager": "pnpm@11.4.0+sha512.f0febc7e37552ab485494a914241b338e0b3580b93d54ce31f00933015880863129038a1b4ae4e414a0ee63ac35bf21197e990172c4a68256450b5636310968f", "package-manager-strict": false } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 23cbe5f..c64720b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,148 +4,572 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + yauzl: ^3.3.1 + importers: .: dependencies: + adm-zip: + specifier: ^0.5.17 + version: 0.5.17 arrpc: - specifier: github: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) + specifier: github:Legcord/arrpc#efe7589762470d32b9ba10d529be5acc23cd0e19 + version: https://codeload.github.com/Legcord/arrpc/tar.gz/efe7589762470d32b9ba10d529be5acc23cd0e19 electron-context-menu: - specifier: ^4.0.0 - version: 4.0.0 + specifier: ^4.1.2 + version: 4.1.2 electron-is-dev: specifier: ^3.0.1 version: 3.0.1 - extract-zip: - specifier: ^2.0.1 - version: 2.0.1 - v8-compile-cache: - specifier: ^2.4.0 - version: 2.4.0 + electron-updater: + specifier: ^6.8.3 + version: 6.8.3 + ms: + specifier: ^2.1.3 + version: 2.1.3 + spitroast: + specifier: ^2.1.6 + version: 2.1.6 + tslib: + specifier: ^2.8.1 + version: 2.8.1 ws: - specifier: ^8.17.0 - version: 8.17.0 + specifier: ^8.21.0 + version: 8.21.0 devDependencies: - '@eslint/js': - specifier: ^9.4.0 - version: 9.4.0 - '@types/eslint__js': - specifier: ^8.42.3 - version: 8.42.3 + '@biomejs/biome': + specifier: 2.4.16 + version: 2.4.16 + '@rolldown-plugin/solid': + specifier: ^0.0.4 + version: 0.0.4(csstype@3.2.3)(rolldown@1.0.3)(seroval@1.5.4)(solid-js@1.9.13) + '@rollup/plugin-esm-shim': + specifier: ^0.1.8 + version: 0.1.8 + '@types/adm-zip': + specifier: ^0.5.8 + version: 0.5.8 '@types/node': - specifier: ^20.14.2 - version: 20.14.2 + specifier: ^25.9.1 + version: 25.9.1 '@types/ws': - specifier: ^8.5.10 - version: 8.5.10 - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 + specifier: ^8.18.1 + version: 8.18.1 + '@uwu/lune': + specifier: ^1.6.2 + version: 1.6.2 + '@uwu/shelter-defs': + specifier: ^1.5.1 + version: 1.5.1 + '@xmldom/xmldom': + specifier: ^0.9.10 + version: 0.9.10 + app-builder-lib: + specifier: ^26.8.1 + version: 26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1) + babel-preset-solid: + specifier: ^1.9.12 + version: 1.9.12(@babel/core@8.0.0-rc.6)(solid-js@1.9.13) electron: - specifier: 30.1.1 - version: 30.1.1 + specifier: 42.3.3 + version: 42.3.3 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 - eslint-plugin-n: - specifier: ^17.8.1 - version: 17.8.1(eslint@9.4.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) - prettier: - specifier: ^3.3.1 - version: 3.3.1 + specifier: 26.8.1 + version: 26.8.1(electron-builder-squirrel-windows@26.8.1) + lucide-solid: + specifier: ^1.16.0 + version: 1.16.0(solid-js@1.9.13) + rolldown: + specifier: 1.0.3 + version: 1.0.3 + rollup-plugin-copy: + specifier: ^3.5.0 + version: 3.5.0 + solid-js: + specifier: ^1.9.13 + version: 1.9.13 + solid-motionone: + specifier: ^1.0.4 + version: 1.0.4(solid-js@1.9.13) typescript: - specifier: ^5.4.5 - version: 5.4.5 - typescript-eslint: - specifier: ^7.12.0 - version: 7.12.0(eslint@9.4.0)(typescript@5.4.5) + specifier: ^6.0.3 + version: 6.0.3 + xml-formatter: + specifier: ^3.7.0 + version: 3.7.0 + optionalDependencies: + '@vencord/venmic': + specifier: ^6.1.0 + version: 6.1.0 packages: 7zip-bin@5.2.0: resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@8.0.0-rc.6': + resolution: {integrity: sha512-Ru0EdYEptXbJGAGDMsenx+RcelHazuj8spqi7l0geXEPXv0X7qVisqWX+2pMaEZsWhS3Q6Um7oITwhnLe0cHJQ==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@8.0.0-rc.6': + resolution: {integrity: sha512-9ikfbIp7PCtV/mo8NYrzag1TYInVJAKLwpSoA28+3Bl5z1KVYt5ZGvBZD57yJlf/0HsCntlTlHHodu+eMpUffQ==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/core@8.0.0-rc.6': + resolution: {integrity: sha512-89SVbTu7p+M/W052SFC7R5QuQYgypfuO6HmBBbhA/Kzl6gME8Ly2QrVpIegvTxmcQKOzAPIxiEIfNk+Jxd26mw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@8.0.0-rc.6': + resolution: {integrity: sha512-6mIzgVK8DgEzvIapoQwhXTMnnkuE4STQmVv9H03i/tZ2ml8oev3TRvZJgTenK2Bsq0YWNtzOrFdTyNzCMFtjJQ==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@8.0.0-rc.6': + resolution: {integrity: sha512-jqQD45/yUSy63U8zs9hE5FMXS8J1TLAI/NTMx76C6xWO021e13gJACQvuGmEF7syloC39LkkKwhqtAbMku1rwg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@8.0.0-rc.6': + resolution: {integrity: sha512-ZF5FsxE4y7Eb6DiEbsLW3Gz3e73U/Uq3/ZotWf/moxv0DnZziXSMnW/tcXJF8b1mQE8XJnwPNSQOksKcKTz8kQ==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.18.6': + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@8.0.0-rc.6': + resolution: {integrity: sha512-nG5VnyhH3SkrXVMTEIs6DsD6VKLGyiQlJwWki6T1sJRhkA1eX4tkuHUUqpASgDABSf57wGDZGZjGw5SPryVi+Q==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@8.0.0-rc.6': + resolution: {integrity: sha512-sLAjvuIcjzUQJR+CoHwU0JA4i706o71bCJtF+W9sc4KuHK3LCIJCjbKRuzbVn1eubUc66uAEZdBNWSqhLpwp2g==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0-rc.6 + + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@8.0.0-rc.6': + resolution: {integrity: sha512-BCkFy+zN6kXQed3YOT7aJl93NfDSzQc3pBfsvTVPs9gU9X3V0aefEF5kwBT0E+mDWH9QgKaZstYUQN9VdQZT4g==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@8.0.0-rc.6': + resolution: {integrity: sha512-nVJ+1JcCgntv8d78rRo++o2wuODT0Irknx2BF8Np4Ft2CRgjLqIs4qzSZ8b66yGbBdMWGmZBO9WEZv1hhNiSpg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@8.0.0-rc.6': + resolution: {integrity: sha512-uonhzCIL2Vf0xA10g5C0zD5thR7a6XxOSwZAzYfyl8n2zEev5bAB9J4b2oZ7u5YkyqdONfkptl2DesvW2P56Kg==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@8.0.0-rc.6': + resolution: {integrity: sha512-kTTqnw+Ubp1/WGXiIpDcl+WYVGTUVGjrQKswGI9VOamk7eWVf5ZYOcCB+o1UxaaHjs/L+QK7IRPlyP7vg579OQ==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@8.0.0-rc.6': + resolution: {integrity: sha512-rOS8IpdO7mQELkTPlCsTgPejO0bFuZdEDCGQJouYbYf9e1FLTym7Fei2pEjq8q7MWbX0ravcd7QQYKs1TxOuog==} + engines: {node: ^22.18.0 || >=24.11.0} + hasBin: true + + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.29.7': + resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.29.7': + resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.29.7': + resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/template@8.0.0-rc.6': + resolution: {integrity: sha512-CZFjZblLiIUEFghbB3sKs3rpYrwo65rLIklw/gNpwBm326cU6TH/xzvJZlZ+H9HpDi00eDXqNJR8CtEKW3oc/A==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@8.0.0-rc.6': + resolution: {integrity: sha512-/txuBViGaE9gpM8MSGShru1O2Bzp3zb3m/XKZNUsNv2SyNn++lKDDIWkiIQ/345j2FBy7CHiYTZuKhewHWyefw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@babel/types@8.0.0-rc.6': + resolution: {integrity: sha512-p7/ABylAYlexb31wtRdIfH9L9A0Z2T/9H6zAqzqndkY2PLkvNNc580wGhp/gGKN4Sp9sQvSkhc6Oga8/O+wTyw==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@biomejs/biome@2.4.16': + resolution: {integrity: sha512-x9ajFh1zChVybCiM3TN6OD4phAqLgtPZjFrZF+aTMYCPjwBO+k529TX7PPsAqtGNLeV4UgzwQnowEgS7bGmzcA==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.4.16': + resolution: {integrity: sha512-wxPvu4XOA85YJk9ixSWUmq/QBHbid85BISbOAqqBM/5xQpPk9ayjk5375tOlSC0BeCwNSbPFafQBm+vBumXq0A==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.4.16': + resolution: {integrity: sha512-xFCqGPwYusQJp4N4NJLi1XJiZqjwFdjhT+KqtNy+Ug3qgfczqnTa6MSDvxJF6TkuDLoYJItMapz6tAf7kCekFw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.4.16': + resolution: {integrity: sha512-oYxnW0ARfJkr72ezzF2OR8N/rtkgLUQeYtF8cFhVswbknHxtTcmzSsanVJP8yQKnGpGpc2ck6c5zLvHahL6Cbg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-arm64@2.4.16': + resolution: {integrity: sha512-2kFb4//jxfZaP6D+Rj5VkHkxgyD9EoRAVBEQb8PKRv+s4NO2zYNJKXFaJmK1CmhufJOWEfpHKaRbOja7qjmdhQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-linux-x64-musl@2.4.16': + resolution: {integrity: sha512-iHDS+MCM65DPqWGu+ECC3uoALyj2H7F4nVUPxIPjz/PIl94EUu+EDfGZDzFP+NY1EOPVt9NQvwFqq7HdMmowdg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-x64@2.4.16': + resolution: {integrity: sha512-NbcBbi/nJqn5baae6wqRXdS7Gadf2uRpehSh6vMSYpG8OhkXl/Xg8aorWrJ+9VWqAT5ml90alLvorkpMW0nBwQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-win32-arm64@2.4.16': + resolution: {integrity: sha512-0rgImMsNb5v/chhkIFe3wu7PEFClS6RBAYUijGL9UsYN3PanSaoK24HSSuSJb1pYbYYVjzAyZTl3gtjJ84BM8A==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.4.16': + resolution: {integrity: sha512-Kp85jgoBHa05gix6UIRjfCDiUV3w/8VIdZ247VyyO2gEjaw12WEVhdIjlxp/AMzXxqxQwbxNTDVZ3Mwd2RG5rw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + '@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==} + '@electron/asar@3.4.1': + resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} engines: {node: '>=10.12.0'} hasBin: true - '@electron/get@2.0.3': - resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} - engines: {node: '>=12'} + '@electron/fuses@1.8.0': + resolution: {integrity: sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==} + hasBin: true - '@electron/notarize@2.3.0': - resolution: {integrity: sha512-EiTBU0BwE7HZZjAG1fFWQaiQpCuPrVGn7jPss1kUjD6eTTdXXd29RiZqEqkgN7xqt/Pgn4g3I7Saqovanrfj3w==} + '@electron/get@3.1.0': + resolution: {integrity: sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==} + engines: {node: '>=14'} + + '@electron/get@5.0.0': + resolution: {integrity: sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA==} + engines: {node: '>=22.12.0'} + + '@electron/notarize@2.5.0': + resolution: {integrity: sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==} engines: {node: '>= 10.0.0'} - '@electron/osx-sign@1.3.0': - resolution: {integrity: sha512-TEXhxlYSDRr9JWK5nWdOv5MtuUdaZ412uxIIEQ0hLt80o0HYWtQJBlW5QmrQDMtebzATaOjKG9UfCzLyA90zWQ==} + '@electron/osx-sign@1.3.3': + resolution: {integrity: sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==} engines: {node: '>=12.0.0'} hasBin: true - '@electron/rebuild@3.6.0': - resolution: {integrity: sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw==} - engines: {node: '>=12.13.0'} + '@electron/rebuild@4.0.4': + resolution: {integrity: sha512-Rzc39XPdk/+/wBG8MfwAHohXflep0ITUfulb6Rgz3R0NeSB1noE+E9/M/cb8ftCAiyDD9PPhLuuWgE1GaInbKg==} + engines: {node: '>=22.12.0'} hasBin: true - '@electron/universal@2.0.1': - resolution: {integrity: sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==} + '@electron/universal@2.0.3': + resolution: {integrity: sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==} engines: {node: '>=16.4'} - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@electron/windows-sign@1.2.2': + resolution: {integrity: sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==} + engines: {node: '>=14.14'} + hasBin: true - '@eslint-community/regexpp@4.10.1': - resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - '@eslint/config-array@0.15.1': - resolution: {integrity: sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - '@eslint/eslintrc@3.1.0': - resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@eslint/js@9.4.0': - resolution: {integrity: sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/object-schema@2.1.3': - resolution: {integrity: sha512-HAbhAYKfsAC2EkTqve00ibWIZlaU74Z1EHwAjYr4PXF0YU2VEA1zSIKSSpKszRLRWwHzzRZXvK632u+uXzvsvw==} - 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'} - - '@humanwhocodes/retry@0.3.0': - resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} - engines: {node: '>=18.18'} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + '@esbuild/android-arm64@0.17.19': + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.17.19': + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.17.19': + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.17.19': + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.17.19': + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.17.19': + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.17.19': + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.17.19': + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.17.19': + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.17.19': + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.17.19': + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.17.19': + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.17.19': + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.17.19': + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.17.19': + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.17.19': + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.17.19': + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.17.19': + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.17.19': + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.17.19': + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.17.19': + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.17.19': + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@malept/cross-spawn-promise@2.0.0': resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} @@ -155,6 +579,33 @@ packages: resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} engines: {node: '>= 10.0.0'} + '@motionone/animation@10.18.0': + resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==} + + '@motionone/dom@10.18.0': + resolution: {integrity: sha512-bKLP7E0eyO4B2UaHBBN55tnppwRnaE3KFfh3Ps9HhnAkar3Cb69kUCJY9as8LrccVYKgHA+JY5dOQqJLOPhF5A==} + + '@motionone/easing@10.18.0': + resolution: {integrity: sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==} + + '@motionone/generators@10.18.0': + resolution: {integrity: sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==} + + '@motionone/types@10.17.1': + resolution: {integrity: sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==} + + '@motionone/utils@10.18.0': + resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==} + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -167,67 +618,350 @@ 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} + '@oxc-project/types@0.133.0': + resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} - '@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 + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + engines: {node: '>= 10.0.0'} + + '@rolldown-plugin/solid@0.0.4': + resolution: {integrity: sha512-1SfABNnkkVYu+0sSuraZDjaonmylalAvopLN2o2vNTSaJh2q1KioCN+1BCzNgrDgiCa36dbzRz0IOoplyKa9uw==} + engines: {node: '>=22.12.0'} + peerDependencies: + csstype: ^3.1.0 + rolldown: ^1.0.0-rc.12 + seroval: ~1.5.0 + solid-js: '>=1.9.12' + + '@rolldown/binding-android-arm64@1.0.3': + resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} + engines: {node: ^20.19.0 || >=22.12.0} + 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.3': + resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} + engines: {node: ^20.19.0 || >=22.12.0} + 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.3': + resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} + engines: {node: ^20.19.0 || >=22.12.0} + 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.3': + resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} + engines: {node: ^20.19.0 || >=22.12.0} + 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.3': + resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} + engines: {node: ^20.19.0 || >=22.12.0} + 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] + libc: [glibc] + + '@rolldown/binding-linux-arm64-gnu@1.0.3': + resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.1': + resolution: {integrity: sha512-Ey2UxKFL74JuWpdNl9stpV0kxHZIgCWCEUnDnpQ1hcBwO9KwDM5qicLtXfsjozD6vt+xzbrL2D/uTrziYZ7IDQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-arm64-musl@1.0.3': + resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.3': + resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.1': + resolution: {integrity: sha512-a8QP35x/3mggWqCpFtaF3/PbWl5P9QKpP/muk3iMPgzrXto8zPsEl3imsP3EBh4KwanBVHIf8pEkBQ+/7iMTgQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.3': + resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.1': + resolution: {integrity: sha512-uIqKwnkZjTY8FmqGMaSjwtWlCdV88LV9bjdkv+mb7I+BBw+9cJlIQy0P8YnGEOEcnDPis/SiraCpkJ/eHYaSZw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-x64-musl@1.0.3': + resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.3': + resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} + 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.3': + resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} + engines: {node: ^20.19.0 || >=22.12.0} + 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.3': + resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} + engines: {node: ^20.19.0 || >=22.12.0} + 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-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.3': + resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@rollup/plugin-esm-shim@0.1.8': + resolution: {integrity: sha512-xEU0b/BShgDDSPjidhJd4R74J9xZ9jLVtFWNGtsUXyEsdwwwB1a3XOAwwGaNIyUHD6EhxPO21JMfUmJWoMn7SA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} + '@solid-primitives/props@3.2.3': + resolution: {integrity: sha512-XzG6en9gSFwmvbKcATm2BxL63HegZ+BAG5fmHi8jyBppQHcaths7ffz+6vYvwYy3nlgLa20ufJLj7tst+PcHFA==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/refs@1.1.3': + resolution: {integrity: sha512-aam02fjNKpBteewF/UliPSQCVJsIIGOLEWQOh+ll6R/QePzBOOBMcC4G+5jTaO75JuUS1d/14Q1YXT3X0Ow6iA==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/transition-group@1.1.2': + resolution: {integrity: sha512-gnHS0OmcdjeoHN9n7Khu8KNrOlRc8a2weETDt2YT6o1zeW/XtUC6Db3Q9pkMU/9cCKdEmN4b0a/41MKAHRhzWA==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/utils@6.4.0': + resolution: {integrity: sha512-AeGTBg8Wtkh/0s+evyLtP8piQoS4wyqqQaAFs2HJcFMMjYAtUgo+ZPduRXLjPlqKVc2ejeR544oeqpbn8Egn8A==} + peerDependencies: + solid-js: ^1.6.12 + '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + + '@types/adm-zip@0.5.8': + resolution: {integrity: sha512-RVVH7QvZYbN+ihqZ4kX/dMiowf6o+Jk1fNwiSdx0NahBJLU787zkULhGhJM8mf/obmLGmgdMM0bXsQTmyfbR7Q==} '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} - '@types/eslint@8.56.10': - resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} - - '@types/eslint__js@8.42.3': - resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/fs-extra@8.1.5': + resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} '@types/fs-extra@9.0.13': resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} - '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/gensync@1.0.5': + resolution: {integrity: sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==} - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/minimatch@6.0.0': + resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} + deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. - '@types/node@20.14.2': - resolution: {integrity: sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@24.12.4': + resolution: {integrity: sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==} + + '@types/node@25.9.1': + resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} '@types/plist@3.0.5': resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} @@ -235,150 +969,96 @@ packages: '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - '@types/verror@1.10.10': - resolution: {integrity: sha512-l4MM0Jppn18hb9xmM6wwD1uTdShpf9Pn80aXTStnK1C94gtPvJcV2FrDmbOQUAQfJ1cKZHktkQUDwEqaAKXMMg==} + '@types/verror@1.10.11': + resolution: {integrity: sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==} - '@types/ws@8.5.10': - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} '@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==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@uwu/lune@1.6.2': + resolution: {integrity: sha512-0/e1zFGm7pBISyuNvhKMqdg4gEQOpBtf8wdquJaUDqA0enrV55iwMWrrCdJHlfx77K1D8hjnAUGvCXxwFebg5Q==} + hasBin: true - '@typescript-eslint/parser@7.12.0': - resolution: {integrity: sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@uwu/shelter-defs@1.5.1': + resolution: {integrity: sha512-bO3M5SgqEpuNZkjd/LZFtTNNATpmVle5uznVp0QNgi3o1w2ej/ieYmwFK6nBZqnZHd8/4aJN1Njl/JbTnZcY5A==} - '@typescript-eslint/scope-manager@7.12.0': - resolution: {integrity: sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@vencord/venmic@6.1.0': + resolution: {integrity: sha512-YiCtzml/W8tYbGhu3jm5jfbbEnl2slKKARNK0jO+8qV979k9eFnfIRTxvhMN/SWq1h8ZNJdXVwvXpffQwq0RuA==} + engines: {node: '>=14.15'} + os: [linux] - '@typescript-eslint/type-utils@7.12.0': - resolution: {integrity: sha512-lib96tyRtMhLxwauDWUp/uW3FMhLA6D0rJ8T7HmH7x23Gk1Gwwu8UZ94NMXBvOELn6flSPiBrCKlehkiXyaqwA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@7.12.0': - resolution: {integrity: sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/typescript-estree@7.12.0': - resolution: {integrity: sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@7.12.0': - resolution: {integrity: sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ==} - 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==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@xmldom/xmldom@0.8.10': - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} + '@xmldom/xmldom@0.8.13': + resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} engines: {node: '>=10.0.0'} - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + '@xmldom/xmldom@0.9.10': + resolution: {integrity: sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==} + engines: {node: '>=14.6'} - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + abbrev@4.0.0: + resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} + engines: {node: ^20.17.0 || >=22.9.0} - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true + adm-zip@0.5.17: + resolution: {integrity: sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==} + engines: {node: '>=12.0'} + 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'} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} 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==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - app-builder-bin@5.0.0-alpha.3: - resolution: {integrity: sha512-bWTAF50v4ZAVLq6EPZYhaLsFSJLfZz5s9MIeP5k1RkkBsibyJV/Dv6NxfaDO0I++iBmcLKsuzB5E8b1qaeXqew==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} - app-builder-lib@25.0.0-alpha.9: - resolution: {integrity: sha512-rxkOK9QaNVmbB0Al+qA1xN6M6aIB/mMo5s7nrFmRf4p9ZFXuGcaqEBSmOUA1zf4r7pK1IpfOMiV0cS4lvXTZbQ==} + app-builder-bin@5.0.0-alpha.12: + resolution: {integrity: sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==} + + app-builder-lib@26.8.1: + resolution: {integrity: sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==} engines: {node: '>=14.0.0'} peerDependencies: - dmg-builder: 25.0.0-alpha.9 - electron-builder-squirrel-windows: 25.0.0-alpha.9 + dmg-builder: 26.8.1 + electron-builder-squirrel-windows: 26.8.1 - 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'} + aproba@2.1.0: + resolution: {integrity: sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==} are-we-there-yet@3.0.1: resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} @@ -392,9 +1072,9 @@ 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} - version: 3.4.0 + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/efe7589762470d32b9ba10d529be5acc23cd0e19: + resolution: {gitHosted: true, tarball: https://codeload.github.com/Legcord/arrpc/tar.gz/efe7589762470d32b9ba10d529be5acc23cd0e19} + version: 3.5.0 hasBin: true assert-plus@1.0.0: @@ -409,8 +1089,8 @@ packages: resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==} engines: {node: '>=0.12.0'} - async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -419,34 +1099,65 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} + axios@1.16.1: + resolution: {integrity: sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==} + + babel-plugin-jsx-dom-expressions@0.40.7: + resolution: {integrity: sha512-/O6JWUmjv03OI9lL2ry9bUjpD5S3PclM55RRJEyCdcFZ5W2SEA/59d+l2hNsk3gI6kiWRdRPdOtqZmsQzFN1pQ==} + peerDependencies: + '@babel/core': ^7.20.12 + + babel-preset-solid@1.9.12: + resolution: {integrity: sha512-LLqnuKVDlKpyBlMPcH6qEvs/wmS9a+NczppxJ3ryS/c0O5IiSFOIBQi9GzyiGDSbcJpx4Gr87jyFTos1MyEuWg==} + peerDependencies: + '@babel/core': ^7.0.0 + solid-js: ^1.9.12 + peerDependenciesMeta: + solid-js: + optional: true + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + baseline-browser-mapping@2.10.32: + resolution: {integrity: sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==} + engines: {node: '>=6.0.0'} + hasBin: true - bluebird-lst@1.0.9: - resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} - - bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -456,16 +1167,12 @@ 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==} + builder-util-runtime@9.5.1: + resolution: {integrity: sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==} engines: {node: '>=12.0.0'} - 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} + builder-util@26.8.1: + resolution: {integrity: sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==} cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} @@ -475,37 +1182,44 @@ packages: resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} engines: {node: '>=8'} - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + caniuse-lite@1.0.30001793: + resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + chownr@2.0.0: 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==} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + 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'} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} 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'} @@ -514,9 +1228,6 @@ packages: 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'} @@ -524,9 +1235,10 @@ packages: 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'} + cmake-js@7.4.0: + resolution: {integrity: sha512-Lw0JxEHrmk+qNj1n9W9d4IvkDdYTBn7l2BW6XmtLj7WPpIo2shvxUy+YokfjMxAAOELNonQwX3stkPhM5xSC2Q==} + engines: {node: '>= 14.15.0'} + hasBin: true color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -539,6 +1251,9 @@ packages: 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'} @@ -547,57 +1262,47 @@ packages: resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} engines: {node: '>= 6'} + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + 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'} - 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==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - copyfiles@2.4.1: - resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} - hasBin: true + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 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==} + cross-dirname@0.1.0: + resolution: {integrity: sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + date-fns@4.3.0: + resolution: {integrity: sha512-OYcL+3N/jyWbYdFGqoMAhytDgxP9pbYPUUiRCOgn4Fewaadk9l/Wam4Avciiyp2BgkpfQyBV9B+ehnVJych+eQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -609,11 +1314,9 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - 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==} + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} @@ -634,8 +1337,8 @@ packages: delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} detect-node@2.1.0: @@ -648,8 +1351,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@26.8.1: + resolution: {integrity: sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==} dmg-license@1.0.11: resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} @@ -657,39 +1360,33 @@ packages: os: [darwin] hasBin: true - dotenv-expand@11.0.6: - resolution: {integrity: sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==} + dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} 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==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} 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==} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} 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.9: - resolution: {integrity: sha512-IK6r96UPVIQcttJrXJ7Kt4nxQarmlZVsKkqMZQUWPu4Sof5bCe0PEMTIFISvgzo7y4MDdjVsCJ9ljZK19PIKZA==} + electron-builder-squirrel-windows@26.8.1: + resolution: {integrity: sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==} - electron-builder@25.0.0-alpha.9: - resolution: {integrity: sha512-Jy9r/WZglgi7I9jmMCd7RSeSVBeRkiYDrl8cJxHYM4VtyTerL1E7u/mennZO+x7zDf633OVOGmxfk+lPWRSmKA==} + electron-builder@26.8.1: + resolution: {integrity: sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==} engines: {node: '>=14.0.0'} hasBin: true - electron-context-menu@4.0.0: - resolution: {integrity: sha512-eUVj+Z2dNqWi7K2sBZMkODk5kVT08vWWE/uxMTedon5gl1cn05OIG883yYq7GuP6QKJqJGv3mbnGIKEuk3NTXQ==} + electron-context-menu@4.1.2: + resolution: {integrity: sha512-9xYTUV0oRqKL50N9W71IrXNdVRB0LuBp3R1zkUdUc2wfIa2/QZwYYj5RLuO7Tn7ZSLVIaO3X6u+EIBK+cBvzrQ==} engines: {node: '>=18'} electron-dl@4.0.0: @@ -700,53 +1397,78 @@ packages: resolution: {integrity: sha512-8TjjAh8Ec51hUi3o4TaU0mD3GMTOESi866oRNavj9A3IQJ7pmv+MJVmdZBFGw4GFT36X7bkqnuDNYvkQgvyI8Q==} engines: {node: '>=18'} - electron-publish@25.0.0-alpha.9: - resolution: {integrity: sha512-vdqOXtCjrO72sZCB8hfvd8ZTKmUvWMLQ/f78Qe0UH4B+dCShtHnqbUM9Ed1Igsaw0svm2+cW+ce2yVZglr2Z3A==} + electron-publish@26.8.1: + resolution: {integrity: sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==} - electron@30.1.1: - resolution: {integrity: sha512-D9blhgVoNx82Nsbms+ufX/Az/yJAulkrHZh0CM7hL79TvG35mqJFMNjh8GlJSRK42rVGNGyH3NfhS0VRaGCPcw==} - engines: {node: '>= 12.20.55'} + electron-to-chromium@1.5.363: + resolution: {integrity: sha512-VjUKPyWzGnT1fujlkEGC/BvN70Hh70KXtAqcmniXviYlJC/ivcT+BWGPyxWVbJZLfvtKR6dqg1L7T7pgAMBtWA==} + + electron-updater@6.8.3: + resolution: {integrity: sha512-Z6sgw3jgbikWKXei1ENdqFOxBP0WlXg3TtKfz0rgw2vIZFJUyI4pD7ZN7jrkm7EoMK+tcm/qTnPUdqfZukBlBQ==} + + electron-winstaller@5.4.0: + resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} + engines: {node: '>=8.0.0'} + + electron@42.3.3: + resolution: {integrity: sha512-0MwYp9wTb7TrtTalOYqeW+suqd9T/Znstr/nDLKqFGIjHdBZX339guo3mQqTPURRZ/UQmYM4uMpzKpI5wLptfQ==} + engines: {node: '>= 22.12.0'} hasBin: true - emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - - enhanced-resolve@5.17.0: - resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} - engines: {node: '>=10.13.0'} + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + 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==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-goat@4.0.0: @@ -761,77 +1483,8 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-compat-utils@0.5.1: - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.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==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.23.0' - - eslint-plugin-prettier@5.1.3: - resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - - eslint-scope@8.0.1: - resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.0.0: - 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==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - - espree@10.0.1: - resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - 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==} + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} ext-list@2.2.2: resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} @@ -853,66 +1506,61 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - - file-entry-cache@8.0.0: - 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==} + filelist@1.0.6: + resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} 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==} + fs-extra@11.3.5: + resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} engines: {node: '>=14.14'} + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} @@ -928,6 +1576,11 @@ packages: 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==} @@ -936,69 +1589,53 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This package is no longer supported. + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + 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==} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} engines: {node: '>=18'} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} - get-tsconfig@4.7.5: - resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@10.4.1: - resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} - engines: {node: '>=16 || 14 >=14.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 + deprecated: Old versions of glob 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 exorbitant rates) by contacting i@izs.me global-agent@3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} engines: {node: '>=10.0'} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - - globals@15.4.0: - resolution: {integrity: sha512-unnwvMZpv0eDUyjNyh9DH/yxUaRYrEjW/qK4QcdrHg3oO11igUQrCSgODHEqxlKg8v2CD2Sd7UkqqEBoz5U7TQ==} - engines: {node: '>=18'} - globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@10.0.1: + resolution: {integrity: sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==} + engines: {node: '>=8'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} got@11.8.6: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} @@ -1007,8 +1644,10 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} + engines: {node: '>=0.4.7'} + hasBin: true has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -1017,31 +1656,40 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} + hey-listen@1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + 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==} + html-entities@2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} http2-wrapper@1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} @@ -1051,8 +1699,9 @@ packages: 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==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} iconv-corefoundation@1.1.7: resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} @@ -1063,27 +1712,21 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + immutable@5.1.5: + resolution: {integrity: sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==} - imurmurhash@0.1.4: - 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==} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} @@ -1092,13 +1735,16 @@ 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'} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} @@ -1116,61 +1762,60 @@ 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-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-plain-obj@1.1.0: 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'} - - isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + is-plain-object@3.0.1: + resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} + engines: {node: '>=0.10.0'} 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==} + isbinaryfile@5.0.7: + resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} engines: {node: '>= 18.0.0'} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} - jake@10.9.1: - resolution: {integrity: sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==} + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} + + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} engines: {node: '>=10'} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -1178,9 +1823,6 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -1192,59 +1834,108 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + koffi@2.16.2: + resolution: {integrity: sha512-owU0MRwv6xkrVqCd+33uw6BaYppkTRXbO/rVdJNI2dvZG0gzyRhYwW25eWtc5pauwK8TGh3AbkFONSezdykfSA==} + 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'} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] - lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] - lodash.difference@4.5.0: - resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] - lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] - lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} @@ -1254,26 +1945,41 @@ packages: 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} + lucide-solid@1.16.0: + resolution: {integrity: sha512-GNmq56033vcjPnmFYwzji+8wkRZxBhDT1p+dzSI7+DeFQXzitStLovrtiC4l61Kbk7X2R+abIDIYAJM99ONKMQ==} + peerDependencies: + solid-js: ^1.4.7 + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + memory-stream@1.0.0: + resolution: {integrity: sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} @@ -1283,10 +1989,6 @@ packages: 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'} @@ -1295,40 +1997,24 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} engines: {node: '>=10'} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} 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'} @@ -1337,62 +2023,68 @@ packages: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} minizlib@2.1.2: 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@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + 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==} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - node-abi@3.63.0: - resolution: {integrity: sha512-vAszCsOUrUxjGAmdnM/pq7gUgie0IRteCQMX6d4A534fQCR93EJU5qgzBvU6EkFfK27s0T3HEV3BOyJIr7OMYw==} - engines: {node: '>=10'} + node-abi@4.31.0: + resolution: {integrity: sha512-Erq5w/t3syw3s4sDsUaX4QttIdBPsGKTT1DTRsCkTonGggczhlDKm/wDX3o+HPJpQ41EjXCbcmXf0tgr5YZJXw==} + engines: {node: '>=22.12.0'} node-addon-api@1.7.2: resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} - node-api-version@0.2.0: - resolution: {integrity: sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + node-addon-api@8.8.0: + resolution: {integrity: sha512-c5Ko1fZJIJmzhFIkhRN76WTq+fC6tWnGy9CXA0fA+XygsWZmEwG8vmbkNqxMyoaa0Tin4djul49NzdVcJJcjeA==} + engines: {node: ^18 || ^20 || >= 21} - node-gyp@9.4.1: - resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} - engines: {node: ^12.13 || ^14.13 || >=16} + node-api-headers@1.9.0: + resolution: {integrity: sha512-2oNILP4jXwRB4ywnYKjVk1YyJ96n2D4EOVJO6S3oYZ5PtbJrw3Yt9TpAuX3nBLMuzn74rnfGQrv13pS9vC+YiA==} + + node-api-version@0.2.1: + resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} + + node-gyp@12.3.0: + resolution: {integrity: sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true - noms@0.0.0: - resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} + node-releases@2.0.46: + resolution: {integrity: sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==} + engines: {node: '>=18'} - nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + nopt@9.0.0: + resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true normalize-path@3.0.0: @@ -1412,21 +2104,12 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + 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'} @@ -1435,21 +2118,11 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} path-exists@5.0.0: resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} @@ -1463,66 +2136,83 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pe-library@0.4.1: + resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==} + engines: {node: '>=12', npm: '>=6'} + pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pkg-prebuilds@0.2.1: + resolution: {integrity: sha512-FdOlDiRqRL7i9aYzQflhGWCoiJf/8u6Qgzq48gKsRDYejtfjvGb1U5QGSzllcqpNg2a8Swx/9fMgtuVefwU+zw==} + engines: {node: '>= 14.15.0'} + hasBin: true + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + 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'} + plist@3.1.1: + resolution: {integrity: sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==} + engines: {node: '>=10.4.0'} - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - - prettier@3.3.1: - resolution: {integrity: sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg==} - engines: {node: '>=14'} + postject@1.0.0-alpha.6: + resolution: {integrity: sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==} + engines: {node: '>=14.0.0'} hasBin: true - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + proc-log@6.1.0: + resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==} + engines: {node: ^20.17.0 || >=22.9.0} 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==} + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pupa@3.1.0: - resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + pupa@3.3.0: + resolution: {integrity: sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==} engines: {node: '>=12.20'} queue-microtask@1.2.3: @@ -1532,62 +2222,55 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + 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==} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + resedit@1.7.2: + resolution: {integrity: sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==} + engines: {node: '>=12', npm: '>=6'} + resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + 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==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true @@ -1595,33 +2278,63 @@ packages: resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} engines: {node: '>=8.0'} + rolldown@1.0.0-beta.1: + resolution: {integrity: sha512-19B2HoY3zcR7Um+zVDOvV1gQ1d6acUIouCUMGxvlZ/0kTjcMSFr8tuLWmRRYIV7y1mrgPbJRd1cPFVd4p1l8nQ==} + hasBin: true + peerDependencies: + '@babel/runtime': '>=7' + peerDependenciesMeta: + '@babel/runtime': + optional: true + + rolldown@1.0.3: + resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup-plugin-copy@3.5.0: + resolution: {integrity: sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==} + engines: {node: '>=8.3'} + 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==} + sanitize-filename@1.6.4: + resolution: {integrity: sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==} - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + sass@1.100.0: + resolution: {integrity: sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==} + engines: {node: '>=20.19.0'} + hasBin: true + + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} 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 - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.8.1: + resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} engines: {node: '>=10'} hasBin: true @@ -1629,6 +2342,16 @@ packages: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} + seroval-plugins@1.5.4: + resolution: {integrity: sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + + seroval@1.5.4: + resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} + engines: {node: '>=10'} + set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -1643,10 +2366,6 @@ packages: 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'} @@ -1667,13 +2386,16 @@ packages: 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'} + solid-js@1.6.16: + resolution: {integrity: sha512-Ng4CahvLlpGA3BXIMiiMdwhI8WpObZ8gXqm97GCKR4+MpnODs6Pdpco+tmVCY/4ZDFaEKDxz7WRLAAdoXdlY7w==} - socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + solid-js@1.9.13: + resolution: {integrity: sha512-6hJeJMOcEX8ktqjpDoJZEmld3ijvcvWBDtiXBm7f4332SiFN66QeAQI1REQshvyUoISsSeJ4PHDauKYbwao9JQ==} + + solid-motionone@1.0.4: + resolution: {integrity: sha512-aqEjgecoO9raDFznu/dEci7ORSmA26Kjj9J4Cn1Gyr0GZuOVdvsNxdxClTL9J40Aq/uYFx4GLwC8n70fMLHiuA==} + peerDependencies: + solid-js: ^1.8.0 sort-keys-length@1.0.1: resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} @@ -1683,6 +2405,10 @@ packages: resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} engines: {node: '>=0.10.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -1690,13 +2416,15 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + spitroast@2.1.4: + resolution: {integrity: sha512-IA987I3wS8RbrKrgag+NsxLUAttrqONF7UGOL+uQFmLLXlMhZl42LomTAltBQaev0jUXIaRiqShZ3hnJYT7OCQ==} + + spitroast@2.1.6: + resolution: {integrity: sha512-xil2XeVh8WQoBlG8Lm8jT6ifqWGmSgTGq2clRcq2roycb0kg1h4fv5ydoiBId9kIQp4Y12PK/cjVzD8xpWXZvg==} + 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'} @@ -1705,20 +2433,10 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - 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: - 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==} @@ -1726,13 +2444,13 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} sumchecker@3.0.1: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} @@ -1742,90 +2460,83 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} - engines: {node: ^14.18.0 || >=16.0.0} - - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} 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 exorbitant rates) by contacting i@izs.me + + tar@7.5.15: + resolution: {integrity: sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==} + engines: {node: '>=18'} 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==} + temp@0.9.4: + resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} + engines: {node: '>=6.0.0'} - through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + 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==} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} tmp-promise@3.0.3: resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} - tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + tmp@0.2.7: + resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} engines: {node: '>=14.14'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - 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'} - peerDependencies: - typescript: '>=4.2.0' - - tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} - typescript-eslint@7.12.0: - resolution: {integrity: sha512-D6HKNbQcnNu3BaN4HkQCR16tgG8Q2AMUWPgvhrJksOXu+d6ys07yC06ONiV2kcsEfWC22voB6C3PvK2MqlBZ7w==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} - 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} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true - 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} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + + undici@6.26.0: + resolution: {integrity: sha512-4yqz8a3n5HmGTlsbADNtr/dJlhkh/55Rq798G6ibiULcXbDtaLpTl1pvdqcbFfeoj3iSi52lePFM7h9H21cw/A==} + engines: {node: '>=18.17'} + + undici@7.26.0: + resolution: {integrity: sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg==} + engines: {node: '>=20.18.1'} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} @@ -1835,64 +2546,62 @@ packages: 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} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + 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==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + which@6.0.1: + resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} + engines: {node: ^20.17.0 || >=22.9.0} + 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'} + 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'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -1903,66 +2612,395 @@ packages: utf-8-validate: optional: true + xml-formatter@3.7.0: + resolution: {integrity: sha512-+8qTc3zv2UcJ1v9IsSIce37Dl4MQG14Cp7tWrwmy202UaI1wqRukw5QMX1JHsV+DX64yw77EgGsj2s5wGvuMbQ==} + engines: {node: '>= 16'} + + xml-parser-xo@4.1.6: + resolution: {integrity: sha512-mXbSNSM+rIwndoxSwmFa83bOdeP8G/cOGr7XvxA67X7ebCzoAuVez9JYDCDub3zRDNBZxIbfjuXLSsamr7NfwQ==} + engines: {node: '>= 20'} + 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@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + 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'} + 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'} - 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==} + yauzl@3.3.1: + resolution: {integrity: sha512-RNPCUkiE/ZgO4w8i9U5yDQVHaFDdnzaFANElRvpJteCspvmv2VqrRb9lvS6odVD+jqI/zDsxAHJVsafpcheVQQ==} + engines: {node: '>=12'} yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zip-stream@4.1.1: - resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} - engines: {node: '>= 10'} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} snapshots: 7zip-bin@5.2.0: {} + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/code-frame@8.0.0-rc.6': + dependencies: + '@babel/helper-validator-identifier': 8.0.0-rc.6 + js-tokens: 10.0.0 + + '@babel/compat-data@7.29.7': {} + + '@babel/compat-data@8.0.0-rc.6': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@8.0.0-rc.6': + dependencies: + '@babel/code-frame': 8.0.0-rc.6 + '@babel/generator': 8.0.0-rc.6 + '@babel/helper-compilation-targets': 8.0.0-rc.6 + '@babel/helpers': 8.0.0-rc.6 + '@babel/parser': 8.0.0-rc.6 + '@babel/template': 8.0.0-rc.6 + '@babel/traverse': 8.0.0-rc.6 + '@babel/types': 8.0.0-rc.6 + '@types/gensync': 1.0.5 + convert-source-map: 2.0.0 + find-up-simple: 1.0.1 + gensync: 1.0.0-beta.2 + import-meta-resolve: 4.2.0 + json5: 2.2.3 + obug: 2.1.1 + semver: 7.8.1 + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/generator@8.0.0-rc.6': + dependencies: + '@babel/parser': 8.0.0-rc.6 + '@babel/types': 8.0.0-rc.6 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-compilation-targets@8.0.0-rc.6': + dependencies: + '@babel/compat-data': 8.0.0-rc.6 + '@babel/helper-validator-option': 8.0.0-rc.6 + browserslist: 4.28.2 + lru-cache: 7.18.3 + semver: 7.8.1 + + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.7 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-globals@8.0.0-rc.6': {} + + '@babel/helper-member-expression-to-functions@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.18.6': + dependencies: + '@babel/types': 7.29.7 + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@8.0.0-rc.6': + dependencies: + '@babel/traverse': 8.0.0-rc.6 + '@babel/types': 8.0.0-rc.6 + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-plugin-utils@8.0.0-rc.6(@babel/core@8.0.0-rc.6)': + dependencies: + '@babel/core': 8.0.0-rc.6 + + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-string-parser@8.0.0-rc.6': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-identifier@8.0.0-rc.6': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helper-validator-option@8.0.0-rc.6': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/helpers@8.0.0-rc.6': + dependencies: + '@babel/template': 8.0.0-rc.6 + '@babel/types': 8.0.0-rc.6 + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/parser@8.0.0-rc.6': + dependencies: + '@babel/types': 8.0.0-rc.6 + + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@8.0.0-rc.6)': + dependencies: + '@babel/core': 8.0.0-rc.6 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/template@8.0.0-rc.6': + dependencies: + '@babel/code-frame': 8.0.0-rc.6 + '@babel/parser': 8.0.0-rc.6 + '@babel/types': 8.0.0-rc.6 + + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@8.0.0-rc.6': + dependencies: + '@babel/code-frame': 8.0.0-rc.6 + '@babel/generator': 8.0.0-rc.6 + '@babel/helper-globals': 8.0.0-rc.6 + '@babel/parser': 8.0.0-rc.6 + '@babel/template': 8.0.0-rc.6 + '@babel/types': 8.0.0-rc.6 + obug: 2.1.1 + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@babel/types@8.0.0-rc.6': + dependencies: + '@babel/helper-string-parser': 8.0.0-rc.6 + '@babel/helper-validator-identifier': 8.0.0-rc.6 + + '@biomejs/biome@2.4.16': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.4.16 + '@biomejs/cli-darwin-x64': 2.4.16 + '@biomejs/cli-linux-arm64': 2.4.16 + '@biomejs/cli-linux-arm64-musl': 2.4.16 + '@biomejs/cli-linux-x64': 2.4.16 + '@biomejs/cli-linux-x64-musl': 2.4.16 + '@biomejs/cli-win32-arm64': 2.4.16 + '@biomejs/cli-win32-x64': 2.4.16 + + '@biomejs/cli-darwin-arm64@2.4.16': + optional: true + + '@biomejs/cli-darwin-x64@2.4.16': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.4.16': + optional: true + + '@biomejs/cli-linux-arm64@2.4.16': + optional: true + + '@biomejs/cli-linux-x64-musl@2.4.16': + optional: true + + '@biomejs/cli-linux-x64@2.4.16': + optional: true + + '@biomejs/cli-win32-arm64@2.4.16': + optional: true + + '@biomejs/cli-win32-x64@2.4.16': + optional: true + '@develar/schema-utils@2.6.5': dependencies: - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) + ajv: 6.15.0 + ajv-keywords: 3.5.2(ajv@6.15.0) - '@electron/asar@3.2.10': + '@electron/asar@3.4.1': dependencies: commander: 5.1.0 glob: 7.2.3 - minimatch: 3.1.2 + minimatch: 3.1.5 - '@electron/get@2.0.3': + '@electron/fuses@1.8.0': dependencies: - debug: 4.3.5 + chalk: 4.1.2 + fs-extra: 9.1.0 + minimist: 1.2.8 + + '@electron/get@3.1.0': + dependencies: + debug: 4.4.3 env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -1974,118 +3012,239 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/notarize@2.3.0': + '@electron/get@5.0.0': dependencies: - debug: 4.3.5 + debug: 4.4.3 + env-paths: 3.0.0 + graceful-fs: 4.2.11 + progress: 2.0.3 + semver: 7.8.1 + sumchecker: 3.0.1 + optionalDependencies: + undici: 7.26.0 + transitivePeerDependencies: + - supports-color + + '@electron/notarize@2.5.0': + dependencies: + debug: 4.4.3 fs-extra: 9.1.0 promise-retry: 2.0.1 transitivePeerDependencies: - supports-color - '@electron/osx-sign@1.3.0': + '@electron/osx-sign@1.3.3': dependencies: compare-version: 0.1.2 - debug: 4.3.5 + debug: 4.4.3 fs-extra: 10.1.0 isbinaryfile: 4.0.10 minimist: 1.2.8 - plist: 3.1.0 + plist: 3.1.1 transitivePeerDependencies: - supports-color - '@electron/rebuild@3.6.0': + '@electron/rebuild@4.0.4': 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.63.0 - node-api-version: 0.2.0 - node-gyp: 9.4.1 - ora: 5.4.1 + debug: 4.4.3 + node-abi: 4.31.0 + node-api-version: 0.2.1 + node-gyp: 12.3.0 read-binary-file-arch: 1.0.6 - semver: 7.6.2 - tar: 6.2.1 - yargs: 17.7.2 transitivePeerDependencies: - - bluebird - supports-color - '@electron/universal@2.0.1': + '@electron/universal@2.0.3': dependencies: - '@electron/asar': 3.2.10 + '@electron/asar': 3.4.1 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.3.5 + debug: 4.4.3 dir-compare: 4.2.0 - fs-extra: 11.2.0 - minimatch: 9.0.4 - plist: 3.1.0 + fs-extra: 11.3.5 + minimatch: 9.0.9 + plist: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint-community/eslint-utils@4.4.0(eslint@9.4.0)': + '@electron/windows-sign@1.2.2': dependencies: - eslint: 9.4.0 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.10.1': {} - - '@eslint/config-array@0.15.1': - dependencies: - '@eslint/object-schema': 2.1.3 - debug: 4.3.5 - minimatch: 3.1.2 + cross-dirname: 0.1.0 + debug: 4.4.3 + fs-extra: 11.3.5 + minimist: 1.2.8 + postject: 1.0.0-alpha.6 transitivePeerDependencies: - supports-color + optional: true - '@eslint/eslintrc@3.1.0': + '@emnapi/core@1.10.0': dependencies: - ajv: 6.12.6 - debug: 4.3.5 - espree: 10.0.1 - globals: 14.0.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true - '@eslint/js@9.4.0': {} - - '@eslint/object-schema@2.1.3': {} - - '@gar/promisify@1.1.3': {} - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/retry@0.3.0': {} - - '@isaacs/cliui@8.0.2': + '@emnapi/runtime@1.10.0': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/android-arm64@0.17.19': + optional: true + + '@esbuild/android-arm@0.17.19': + optional: true + + '@esbuild/android-x64@0.17.19': + optional: true + + '@esbuild/darwin-arm64@0.17.19': + optional: true + + '@esbuild/darwin-x64@0.17.19': + optional: true + + '@esbuild/freebsd-arm64@0.17.19': + optional: true + + '@esbuild/freebsd-x64@0.17.19': + optional: true + + '@esbuild/linux-arm64@0.17.19': + optional: true + + '@esbuild/linux-arm@0.17.19': + optional: true + + '@esbuild/linux-ia32@0.17.19': + optional: true + + '@esbuild/linux-loong64@0.17.19': + optional: true + + '@esbuild/linux-mips64el@0.17.19': + optional: true + + '@esbuild/linux-ppc64@0.17.19': + optional: true + + '@esbuild/linux-riscv64@0.17.19': + optional: true + + '@esbuild/linux-s390x@0.17.19': + optional: true + + '@esbuild/linux-x64@0.17.19': + optional: true + + '@esbuild/netbsd-x64@0.17.19': + optional: true + + '@esbuild/openbsd-x64@0.17.19': + optional: true + + '@esbuild/sunos-x64@0.17.19': + optional: true + + '@esbuild/win32-arm64@0.17.19': + optional: true + + '@esbuild/win32-ia32@0.17.19': + optional: true + + '@esbuild/win32-x64@0.17.19': + optional: true + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 '@malept/cross-spawn-promise@2.0.0': dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 '@malept/flatpak-bundler@0.4.0': dependencies: - debug: 4.3.5 + debug: 4.4.3 fs-extra: 9.1.0 - lodash: 4.17.21 + lodash: 4.18.1 tmp-promise: 3.0.3 transitivePeerDependencies: - supports-color + '@motionone/animation@10.18.0': + dependencies: + '@motionone/easing': 10.18.0 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.8.1 + + '@motionone/dom@10.18.0': + dependencies: + '@motionone/animation': 10.18.0 + '@motionone/generators': 10.18.0 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + hey-listen: 1.0.8 + tslib: 2.8.1 + + '@motionone/easing@10.18.0': + dependencies: + '@motionone/utils': 10.18.0 + tslib: 2.8.1 + + '@motionone/generators@10.18.0': + dependencies: + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.8.1 + + '@motionone/types@10.17.1': {} + + '@motionone/utils@10.18.0': + dependencies: + '@motionone/types': 10.17.1 + hey-listen: 1.0.8 + tslib: 2.8.1 + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2096,204 +3255,342 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.20.1 - '@npmcli/fs@2.1.2': - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.6.2 + '@oxc-project/types@0.133.0': {} - '@npmcli/move-file@2.0.1': - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - - '@pkgjs/parseargs@0.11.0': + '@parcel/watcher-android-arm64@2.5.6': optional: true - '@pkgr/core@0.1.1': {} + '@parcel/watcher-darwin-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-x64@2.5.6': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.6': + optional: true + + '@parcel/watcher-win32-arm64@2.5.6': + optional: true + + '@parcel/watcher-win32-ia32@2.5.6': + optional: true + + '@parcel/watcher-win32-x64@2.5.6': + optional: true + + '@parcel/watcher@2.5.6': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.4 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 + optional: true + + '@rolldown-plugin/solid@0.0.4(csstype@3.2.3)(rolldown@1.0.3)(seroval@1.5.4)(solid-js@1.9.13)': + dependencies: + '@babel/core': 8.0.0-rc.6 + '@babel/helper-module-imports': 8.0.0-rc.6 + '@babel/helper-plugin-utils': 8.0.0-rc.6(@babel/core@8.0.0-rc.6) + '@babel/helper-validator-option': 8.0.0-rc.6 + '@babel/template': 8.0.0-rc.6 + '@babel/traverse': 8.0.0-rc.6 + '@babel/types': 8.0.0-rc.6 + csstype: 3.2.3 + html-entities: 2.6.0 + parse5: 8.0.1 + rolldown: 1.0.3 + seroval: 1.5.4 + solid-js: 1.9.13 + + '@rolldown/binding-android-arm64@1.0.3': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.1': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.3': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.1': + optional: true + + '@rolldown/binding-darwin-x64@1.0.3': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.1': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.3': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.1': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.1': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.1': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.3': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.1': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.1': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.3': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.3': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.3': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.1': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.3': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.1': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.1': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.3': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@rollup/plugin-esm-shim@0.1.8': + dependencies: + magic-string: 0.30.21 + mlly: 1.8.2 '@sindresorhus/is@4.6.0': {} + '@solid-primitives/props@3.2.3(solid-js@1.9.13)': + dependencies: + '@solid-primitives/utils': 6.4.0(solid-js@1.9.13) + solid-js: 1.9.13 + + '@solid-primitives/refs@1.1.3(solid-js@1.9.13)': + dependencies: + '@solid-primitives/utils': 6.4.0(solid-js@1.9.13) + solid-js: 1.9.13 + + '@solid-primitives/transition-group@1.1.2(solid-js@1.9.13)': + dependencies: + solid-js: 1.9.13 + + '@solid-primitives/utils@6.4.0(solid-js@1.9.13)': + dependencies: + solid-js: 1.9.13 + '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 - '@tootallnate/once@2.0.0': {} + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/adm-zip@0.5.8': + dependencies: + '@types/node': 25.9.1 '@types/cacheable-request@6.0.3': dependencies: - '@types/http-cache-semantics': 4.0.4 + '@types/http-cache-semantics': 4.2.0 '@types/keyv': 3.1.4 - '@types/node': 20.14.2 + '@types/node': 25.9.1 '@types/responselike': 1.0.3 - '@types/debug@4.1.12': + '@types/debug@4.1.13': dependencies: - '@types/ms': 0.7.34 + '@types/ms': 2.1.0 - '@types/eslint@8.56.10': + '@types/fs-extra@8.1.5': dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 - - '@types/eslint__js@8.42.3': - dependencies: - '@types/eslint': 8.56.10 - - '@types/estree@1.0.5': {} + '@types/node': 25.9.1 '@types/fs-extra@9.0.13': dependencies: - '@types/node': 20.14.2 + '@types/node': 25.9.1 - '@types/http-cache-semantics@4.0.4': {} + '@types/gensync@1.0.5': {} - '@types/json-schema@7.0.15': {} + '@types/glob@7.2.0': + dependencies: + '@types/minimatch': 6.0.0 + '@types/node': 25.9.1 + + '@types/http-cache-semantics@4.2.0': {} + + '@types/jsesc@2.5.1': {} '@types/keyv@3.1.4': dependencies: - '@types/node': 20.14.2 + '@types/node': 25.9.1 - '@types/ms@0.7.34': {} - - '@types/node@20.14.2': + '@types/minimatch@6.0.0': dependencies: - undici-types: 5.26.5 + minimatch: 10.2.5 + + '@types/ms@2.1.0': {} + + '@types/node@24.12.4': + dependencies: + undici-types: 7.16.0 + + '@types/node@25.9.1': + dependencies: + undici-types: 7.24.6 '@types/plist@3.0.5': dependencies: - '@types/node': 20.14.2 + '@types/node': 25.9.1 xmlbuilder: 15.1.1 optional: true '@types/responselike@1.0.3': dependencies: - '@types/node': 20.14.2 + '@types/node': 25.9.1 - '@types/verror@1.10.10': + '@types/verror@1.10.11': optional: true - '@types/ws@8.5.10': + '@types/ws@8.18.1': dependencies: - '@types/node': 20.14.2 + '@types/node': 25.9.1 '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.14.2 + '@types/node': 25.9.1 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)': + '@uwu/lune@1.6.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 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 + '@babel/core': 7.29.7 + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) + chokidar: 3.6.0 + date-fns: 4.3.0 + esbuild: 0.17.19 + handlebars: 4.7.9 + lightningcss: 1.32.0 + resolve: 1.22.12 + rolldown: 1.0.0-beta.1 + sass: 1.100.0 + ws: 8.21.0 + transitivePeerDependencies: + - '@babel/runtime' + - bufferutil + - supports-color + - utf-8-validate + + '@uwu/shelter-defs@1.5.1': + dependencies: + idb: 7.1.1 + solid-js: 1.6.16 + spitroast: 2.1.4 + + '@vencord/venmic@6.1.0': + dependencies: + cmake-js: 7.4.0 + node-addon-api: 8.8.0 + pkg-prebuilds: 0.2.1 transitivePeerDependencies: - supports-color + optional: true - '@typescript-eslint/parser@7.12.0(eslint@9.4.0)(typescript@5.4.5)': - 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 - debug: 4.3.5 - eslint: 9.4.0 - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color + '@xmldom/xmldom@0.8.13': {} - '@typescript-eslint/scope-manager@7.12.0': - dependencies: - '@typescript-eslint/types': 7.12.0 - '@typescript-eslint/visitor-keys': 7.12.0 + '@xmldom/xmldom@0.9.10': {} - '@typescript-eslint/type-utils@7.12.0(eslint@9.4.0)(typescript@5.4.5)': - 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) - debug: 4.3.5 - eslint: 9.4.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color + abbrev@4.0.0: {} - '@typescript-eslint/types@7.12.0': {} + acorn@8.16.0: {} - '@typescript-eslint/typescript-estree@7.12.0(typescript@5.4.5)': - dependencies: - '@typescript-eslint/types': 7.12.0 - '@typescript-eslint/visitor-keys': 7.12.0 - 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) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@7.12.0(eslint@9.4.0)(typescript@5.4.5)': - 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 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@7.12.0': - dependencies: - '@typescript-eslint/types': 7.12.0 - eslint-visitor-keys: 3.4.3 - - '@xmldom/xmldom@0.8.10': {} - - abbrev@1.1.1: {} - - acorn-jsx@5.3.2(acorn@8.11.3): - dependencies: - acorn: 8.11.3 - - acorn@8.11.3: {} + adm-zip@0.5.17: {} agent-base@6.0.2: dependencies: - debug: 4.3.5 + debug: 4.4.3 transitivePeerDependencies: - supports-color + optional: true - agentkeepalive@4.5.0: + agent-base@7.1.4: {} + + ajv-keywords@3.5.2(ajv@6.15.0): dependencies: - humanize-ms: 1.2.1 + ajv: 6.15.0 - 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: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -2302,102 +3599,81 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} + ansi-regex@6.2.2: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} - app-builder-bin@5.0.0-alpha.3: {} + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 - 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.12: {} + + app-builder-lib@26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1): 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 + '@electron/asar': 3.4.1 + '@electron/fuses': 1.8.0 + '@electron/get': 3.1.0 + '@electron/notarize': 2.5.0 + '@electron/osx-sign': 1.3.3 + '@electron/rebuild': 4.0.4 + '@electron/universal': 2.0.3 '@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 + builder-util: 26.8.1 + builder-util-runtime: 9.5.1 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) + ci-info: 4.3.1 + debug: 4.4.3 + dmg-builder: 26.8.1(electron-builder-squirrel-windows@26.8.1) + dotenv: 16.6.1 + dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9) - electron-publish: 25.0.0-alpha.9 - form-data: 4.0.0 + electron-builder-squirrel-windows: 26.8.1(dmg-builder@26.8.1) + electron-publish: 26.8.1 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 + isbinaryfile: 5.0.7 + jiti: 2.7.0 + js-yaml: 4.1.1 + json5: 2.2.3 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 + minimatch: 10.2.5 + plist: 3.1.0 + proper-lockfile: 4.1.2 + resedit: 1.7.2 + semver: 7.7.4 + tar: 7.5.15 temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + which: 5.0.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 + aproba@2.1.0: + optional: true are-we-there-yet@3.0.1: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 + optional: true argparse@2.0.1: {} array-union@2.1.0: {} - arrpc@https://codeload.github.com/OpenAsar/arrpc/tar.gz/c62ec6a04c8d870530aa6944257fe745f6c59a24: + arrpc@https://codeload.github.com/Legcord/arrpc/tar.gz/efe7589762470d32b9ba10d529be5acc23cd0e19: dependencies: - ws: 8.17.0 + koffi: 2.16.2 + ws: 8.21.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -2410,44 +3686,77 @@ snapshots: async-exit-hook@2.0.1: {} - async@3.2.5: {} + async@3.2.6: {} asynckit@0.4.0: {} at-least-node@1.0.0: {} + axios@1.16.1(debug@4.4.3): + dependencies: + follow-redirects: 1.16.0(debug@4.4.3) + form-data: 4.0.5 + https-proxy-agent: 5.0.1 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + - supports-color + optional: true + + babel-plugin-jsx-dom-expressions@0.40.7(@babel/core@8.0.0-rc.6): + dependencies: + '@babel/core': 8.0.0-rc.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@8.0.0-rc.6) + '@babel/types': 7.29.7 + html-entities: 2.3.3 + parse5: 7.3.0 + + babel-preset-solid@1.9.12(@babel/core@8.0.0-rc.6)(solid-js@1.9.13): + dependencies: + '@babel/core': 8.0.0-rc.6 + babel-plugin-jsx-dom-expressions: 0.40.7(@babel/core@8.0.0-rc.6) + optionalDependencies: + solid-js: 1.9.13 + balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base64-js@1.5.1: {} - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 + baseline-browser-mapping@2.10.32: {} - bluebird-lst@1.0.9: - dependencies: - bluebird: 3.7.2 - - bluebird@3.7.2: {} + binary-extensions@2.3.0: {} boolean@3.2.0: optional: true - brace-expansion@1.1.11: + brace-expansion@1.1.15: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.1.1: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.32 + caniuse-lite: 1.0.30001793 + electron-to-chromium: 1.5.363 + node-releases: 2.0.46 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + buffer-crc32@0.2.13: {} buffer-from@1.1.2: {} @@ -2456,90 +3765,86 @@ snapshots: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + optional: true - builder-util-runtime@9.2.5-alpha.2: + builder-util-runtime@9.5.1: dependencies: - debug: 4.3.5 - sax: 1.4.1 + debug: 4.4.3 + sax: 1.6.0 transitivePeerDependencies: - supports-color - builder-util@25.0.0-alpha.9: + builder-util@26.8.1: 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 + '@types/debug': 4.1.13 + app-builder-bin: 5.0.0-alpha.12 + builder-util-runtime: 9.5.1 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.5 + cross-spawn: 7.0.6 + debug: 4.4.3 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 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + js-yaml: 4.1.1 + sanitize-filename: 1.6.4 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 - '@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 - cacheable-lookup@5.0.4: {} cacheable-request@7.0.4: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 keyv: 4.5.4 lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 - callsites@3.1.0: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + caniuse-lite@1.0.30001793: {} chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chownr@2.0.0: {} + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + chownr@2.0.0: + optional: true + + chownr@3.0.0: {} chromium-pickle-js@0.2.0: {} - ci-info@3.9.0: {} + ci-info@4.3.1: {} - clean-stack@2.2.0: {} - - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-spinners@2.9.2: {} + ci-info@4.4.0: {} cli-truncate@2.1.0: dependencies: @@ -2550,13 +3855,7 @@ snapshots: cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 - string-width: 7.1.0 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + string-width: 7.2.0 cliui@8.0.1: dependencies: @@ -2568,7 +3867,23 @@ snapshots: dependencies: mimic-response: 1.0.1 - clone@1.0.4: {} + cmake-js@7.4.0: + dependencies: + axios: 1.16.1(debug@4.4.3) + debug: 4.4.3 + fs-extra: 11.3.5 + memory-stream: 1.0.0 + node-api-headers: 1.9.0 + npmlog: 6.0.2 + rc: 1.2.8 + semver: 7.8.1 + tar: 6.2.1 + url-join: 4.0.1 + which: 2.0.2 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + optional: true color-convert@2.0.1: dependencies: @@ -2576,7 +3891,10 @@ snapshots: color-name@1.1.4: {} - color-support@1.1.3: {} + color-support@1.1.3: + optional: true + + colorette@1.4.0: {} combined-stream@1.0.8: dependencies: @@ -2584,89 +3902,59 @@ snapshots: commander@5.1.0: {} - compare-version@0.1.2: {} + commander@9.5.0: + optional: true - 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 + compare-version@0.1.2: {} concat-map@0.0.1: {} - config-file-ts@0.2.6: - dependencies: - glob: 10.4.1 - typescript: 5.4.5 + confbox@0.1.8: {} - config-file-ts@0.2.8-rc1: - dependencies: - glob: 10.4.1 - typescript: 5.4.5 + console-control-strings@1.1.0: + optional: true - 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 + convert-source-map@2.0.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) - transitivePeerDependencies: - - encoding + cross-dirname@0.1.0: + optional: true - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - debug@4.3.5: + csstype@3.2.3: {} + + date-fns@4.3.0: {} + + debug@4.4.3: dependencies: - ms: 2.1.2 + ms: 2.1.3 decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - deep-is@0.1.4: {} - - defaults@1.0.4: - dependencies: - clone: 1.0.4 + deep-extend@0.6.0: + optional: true defer-to-connect@2.0.1: {} define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.2.0 optional: true define-properties@1.2.1: @@ -2678,95 +3966,90 @@ snapshots: delayed-stream@1.0.0: {} - delegates@1.0.0: {} + delegates@1.0.0: + optional: true - detect-libc@2.0.3: {} + detect-libc@2.1.2: {} detect-node@2.1.0: optional: true dir-compare@4.2.0: dependencies: - minimatch: 3.1.2 + minimatch: 3.1.5 p-limit: 3.1.0 dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dmg-builder@25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.9): + dmg-builder@26.8.1(electron-builder-squirrel-windows@26.8.1): 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)) - builder-util: 25.0.0-alpha.9 - builder-util-runtime: 9.2.5-alpha.2 + app-builder-lib: 26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1) + builder-util: 26.8.1 fs-extra: 10.1.0 iconv-lite: 0.6.3 - js-yaml: 4.1.0 + js-yaml: 4.1.1 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 + '@types/verror': 1.10.11 + ajv: 6.15.0 crc: 3.8.0 iconv-corefoundation: 1.1.7 - plist: 3.1.0 + plist: 3.1.1 smart-buffer: 4.2.0 verror: 1.10.1 optional: true - dotenv-expand@11.0.6: + dotenv-expand@11.0.7: dependencies: - dotenv: 16.4.5 + dotenv: 16.6.1 - dotenv-expand@5.1.0: {} + dotenv@16.6.1: {} - dotenv@16.4.5: {} - - dotenv@9.0.2: {} - - eastasianwidth@0.2.0: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 ejs@3.1.10: dependencies: - jake: 10.9.1 + jake: 10.9.4 - electron-builder-squirrel-windows@25.0.0-alpha.9(dmg-builder@25.0.0-alpha.9): + electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1): 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)) - archiver: 5.3.2 - builder-util: 25.0.0-alpha.9 - fs-extra: 10.1.0 + app-builder-lib: 26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1) + builder-util: 26.8.1 + electron-winstaller: 5.4.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@26.8.1(electron-builder-squirrel-windows@26.8.1): 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)) - builder-util: 25.0.0-alpha.9 - builder-util-runtime: 9.2.5-alpha.2 + app-builder-lib: 26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1) + builder-util: 26.8.1 + builder-util-runtime: 9.5.1 chalk: 4.1.2 - dmg-builder: 25.0.0-alpha.9(electron-builder-squirrel-windows@25.0.0-alpha.9) + ci-info: 4.4.0 + dmg-builder: 26.8.1(electron-builder-squirrel-windows@26.8.1) 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.0: + electron-context-menu@4.1.2: dependencies: cli-truncate: 4.0.0 electron-dl: 4.0.0 @@ -2775,178 +4058,134 @@ snapshots: electron-dl@4.0.0: dependencies: ext-name: 5.0.0 - pupa: 3.1.0 + pupa: 3.3.0 unused-filename: 4.0.1 electron-is-dev@3.0.1: {} - electron-publish@25.0.0-alpha.9: + electron-publish@26.8.1: dependencies: '@types/fs-extra': 9.0.13 - builder-util: 25.0.0-alpha.9 - builder-util-runtime: 9.2.5-alpha.2 + builder-util: 26.8.1 + builder-util-runtime: 9.5.1 chalk: 4.1.2 + form-data: 4.0.5 fs-extra: 10.1.0 lazy-val: 1.0.5 mime: 2.6.0 transitivePeerDependencies: - supports-color - electron@30.1.1: + electron-to-chromium@1.5.363: {} + + electron-updater@6.8.3: dependencies: - '@electron/get': 2.0.3 - '@types/node': 20.14.2 + builder-util-runtime: 9.5.1 + fs-extra: 10.1.0 + js-yaml: 4.1.1 + lazy-val: 1.0.5 + lodash.escaperegexp: 4.1.2 + lodash.isequal: 4.5.0 + semver: 7.7.4 + tiny-typed-emitter: 2.1.0 + transitivePeerDependencies: + - supports-color + + electron-winstaller@5.4.0: + dependencies: + '@electron/asar': 3.4.1 + debug: 4.4.3 + fs-extra: 7.0.1 + lodash: 4.18.1 + temp: 0.9.4 + optionalDependencies: + '@electron/windows-sign': 1.2.2 + transitivePeerDependencies: + - supports-color + + electron@42.3.3: + dependencies: + '@electron/get': 5.0.0 + '@types/node': 24.12.4 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color - emoji-regex@10.3.0: {} + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} - - encoding@0.1.13: - dependencies: - iconv-lite: 0.6.3 - optional: true - - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 - enhanced-resolve@5.17.0: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 + entities@6.0.1: {} + + entities@8.0.0: {} env-paths@2.2.1: {} + env-paths@3.0.0: {} + err-code@2.0.3: {} - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - optional: true + es-define-property@1.0.1: {} - es-errors@1.3.0: - optional: true + es-errors@1.3.0: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.3 es6-error@4.1.1: optional: true - escalade@3.1.2: {} + esbuild@0.17.19: + optionalDependencies: + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 + + escalade@3.2.0: {} escape-goat@4.0.0: {} - escape-string-regexp@4.0.0: {} + escape-string-regexp@4.0.0: + optional: true escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.4.0): - dependencies: - eslint: 9.4.0 - semver: 7.6.2 - - eslint-plugin-es-x@7.7.0(eslint@9.4.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-plugin-n@17.8.1(eslint@9.4.0): - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) - enhanced-resolve: 5.17.0 - eslint: 9.4.0 - eslint-plugin-es-x: 7.7.0(eslint@9.4.0) - get-tsconfig: 4.7.5 - globals: 15.4.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): - dependencies: - eslint: 9.4.0 - prettier: 3.3.1 - prettier-linter-helpers: 1.0.0 - synckit: 0.8.8 - optionalDependencies: - '@types/eslint': 8.56.10 - - eslint-scope@8.0.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.0.0: {} - - eslint@9.4.0: - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) - '@eslint-community/regexpp': 4.10.1 - '@eslint/config-array': 0.15.1 - '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.4.0 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.0 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.5 - escape-string-regexp: 4.0.0 - eslint-scope: 8.0.1 - eslint-visitor-keys: 4.0.0 - espree: 10.0.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.1 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@10.0.1: - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 4.0.0 - - esquery@1.5.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - - esutils@2.0.3: {} - - exponential-backoff@3.1.1: {} + exponential-backoff@3.1.3: {} ext-list@2.2.2: dependencies: - mime-db: 1.52.0 + mime-db: 1.54.0 ext-name@5.0.0: dependencies: @@ -2955,9 +4194,9 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.5 + debug: 4.4.3 get-stream: 5.2.0 - yauzl: 2.10.0 + yauzl: 3.3.1 optionalDependencies: '@types/yauzl': 2.10.3 transitivePeerDependencies: @@ -2968,77 +4207,65 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-diff@1.3.0: {} - - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} - fast-levenshtein@2.0.6: {} - - fastq@1.17.1: + fastq@1.20.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 - file-entry-cache@8.0.0: + filelist@1.0.6: dependencies: - flat-cache: 4.0.1 - - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 + minimatch: 5.1.9 fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 + find-up-simple@1.0.1: {} - flat-cache@4.0.1: - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 + follow-redirects@1.16.0(debug@4.4.3): + optionalDependencies: + debug: 4.4.3 + optional: true - flatted@3.3.1: {} - - foreground-child@3.1.1: - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - - form-data@4.0.0: + form-data@4.0.5: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.3 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 + jsonfile: 6.2.1 universalify: 2.0.1 - fs-extra@11.2.0: + fs-extra@11.3.5: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.1 universalify: 2.0.1 + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 @@ -3049,21 +4276,24 @@ snapshots: dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.1 universalify: 2.0.1 fs-minipass@2.1.0: dependencies: minipass: 3.3.6 + optional: true fs.realpath@1.0.0: {} - function-bind@1.1.2: + fsevents@2.3.3: optional: true + function-bind@1.1.2: {} + gauge@4.0.4: dependencies: - aproba: 2.0.0 + aproba: 2.1.0 color-support: 1.1.3 console-control-strings: 1.1.0 has-unicode: 2.0.1 @@ -3071,94 +4301,77 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 + optional: true + + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} - get-east-asian-width@1.2.0: {} + get-east-asian-width@1.6.0: {} - get-intrinsic@1.2.4: + get-intrinsic@1.3.0: dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 es-errors: 1.3.0 + es-object-atoms: 1.1.2 function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - optional: true + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.3 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 get-stream@5.2.0: dependencies: - pump: 3.0.0 - - get-tsconfig@4.7.5: - dependencies: - resolve-pkg-maps: 1.0.0 + pump: 3.0.4 glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob@10.4.1: - dependencies: - foreground-child: 3.1.1 - jackspeak: 3.4.0 - minimatch: 9.0.4 - minipass: 7.1.2 - path-scurry: 1.11.1 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.2 + minimatch: 3.1.5 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 es6-error: 4.1.1 matcher: 3.0.0 roarr: 2.15.4 - semver: 7.6.2 + semver: 7.8.1 serialize-error: 7.0.1 optional: true - globals@14.0.0: {} - - globals@15.4.0: {} - globalthis@1.0.4: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 + gopd: 1.2.0 optional: true - globby@11.1.0: + 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 - ignore: 5.3.1 + fast-glob: 3.3.3 + glob: 7.2.3 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - optional: true + gopd@1.2.0: {} got@11.8.6: dependencies: @@ -3176,39 +4389,51 @@ snapshots: graceful-fs@4.2.11: {} - graphemer@1.4.0: {} + handlebars@4.7.9: + 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: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 optional: true - has-proto@1.0.3: + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + has-unicode@2.0.1: optional: true - has-symbols@1.0.3: - optional: true - - has-unicode@2.0.1: {} - - hasown@2.0.2: + hasown@2.0.3: dependencies: function-bind: 1.1.2 - optional: true + + hey-listen@1.0.8: {} hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 - http-cache-semantics@4.1.1: {} + html-entities@2.3.3: {} - http-proxy-agent@5.0.0: + html-entities@2.6.0: {} + + http-cache-semantics@4.2.0: {} + + http-proxy-agent@7.0.2: dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.5 + agent-base: 7.1.4 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -3220,13 +4445,17 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.5 + debug: 4.4.3 transitivePeerDependencies: - supports-color + optional: true - humanize-ms@1.2.1: + https-proxy-agent@7.0.6: dependencies: - ms: 2.1.3 + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color iconv-corefoundation@1.1.7: dependencies: @@ -3238,20 +4467,16 @@ snapshots: dependencies: safer-buffer: 2.1.2 - ieee754@1.2.1: {} + idb@7.1.1: {} - ignore@5.3.1: {} + ieee754@1.2.1: + optional: true - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 + ignore@5.3.2: {} - imurmurhash@0.1.4: {} + immutable@5.1.5: {} - indent-string@4.0.0: {} - - infer-owner@1.0.4: {} + import-meta-resolve@4.2.0: {} inflight@1.0.6: dependencies: @@ -3260,14 +4485,16 @@ snapshots: inherits@2.0.4: {} - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 + ini@1.3.8: + optional: true - is-ci@3.0.1: + is-binary-path@2.1.0: dependencies: - ci-info: 3.9.0 + binary-extensions: 2.3.0 + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.3 is-extglob@2.1.1: {} @@ -3279,53 +4506,44 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-interactive@1.0.0: {} - - is-lambda@1.0.1: {} - is-number@7.0.0: {} - is-path-inside@3.0.3: {} - is-plain-obj@1.1.0: {} - is-unicode-supported@0.1.0: {} - - isarray@0.0.1: {} - - isarray@1.0.0: {} + is-plain-object@3.0.1: {} isbinaryfile@4.0.10: {} - isbinaryfile@5.0.2: {} + isbinaryfile@5.0.7: {} isexe@2.0.0: {} - jackspeak@3.4.0: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + isexe@3.1.5: {} - jake@10.9.1: - dependencies: - async: 3.2.5 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 + isexe@4.0.0: {} - js-yaml@4.1.0: + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.6 + picocolors: 1.1.1 + + jiti@2.7.0: {} + + js-tokens@10.0.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.1: dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} + jsesc@3.1.0: {} json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} - json-stable-stringify-without-jsonify@1.0.1: {} - json-stringify-safe@5.0.1: optional: true @@ -3335,7 +4553,7 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.1: dependencies: universalify: 2.0.1 optionalDependencies: @@ -3345,43 +4563,70 @@ snapshots: dependencies: json-buffer: 3.0.1 + koffi@2.16.2: {} + lazy-val@1.0.5: {} - lazystream@1.0.1: + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: dependencies: - readable-stream: 2.3.8 + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 + lodash.escaperegexp@4.1.2: {} - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 + lodash.isequal@4.5.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 + lodash@4.18.1: {} lowercase-keys@2.0.0: {} - lru-cache@10.2.2: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 lru-cache@6.0.0: dependencies: @@ -3389,157 +4634,141 @@ snapshots: lru-cache@7.18.3: {} - make-fetch-happen@10.2.1: + lucide-solid@1.16.0(solid-js@1.9.13): 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 + solid-js: 1.9.13 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 matcher@3.0.0: dependencies: escape-string-regexp: 4.0.0 optional: true + math-intrinsics@1.1.0: {} + + memory-stream@1.0.0: + dependencies: + readable-stream: 3.6.2 + optional: true + merge2@1.4.1: {} - micromatch@4.0.7: + micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.1 + picomatch: 2.3.2 mime-db@1.52.0: {} + mime-db@1.54.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: {} - minimatch@3.1.2: + minimatch@10.2.5: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 5.0.6 - minimatch@5.1.6: + minimatch@3.1.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 1.1.15 - minimatch@9.0.4: + minimatch@5.1.9: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.1.1 + + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.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 + optional: true - minipass@5.0.0: {} + minipass@5.0.0: + optional: true - minipass@7.1.2: {} + minipass@7.1.3: {} minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 + optional: true - mkdirp@1.0.4: {} + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 - ms@2.1.2: {} + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mkdirp@1.0.4: + optional: true + + mlly@1.8.2: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 ms@2.1.3: {} - natural-compare@1.4.0: {} + neo-async@2.6.2: {} - negotiator@0.6.3: {} - - node-abi@3.63.0: + node-abi@4.31.0: dependencies: - semver: 7.6.2 + semver: 7.8.1 node-addon-api@1.7.2: optional: true - node-api-version@0.2.0: - dependencies: - semver: 7.6.2 + node-addon-api@7.1.1: + optional: true - node-fetch@2.7.0(encoding@0.1.13): - dependencies: - whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 + node-addon-api@8.8.0: + optional: true - node-gyp@9.4.1: + node-api-headers@1.9.0: + optional: true + + node-api-version@0.2.1: + dependencies: + semver: 7.8.1 + + node-gyp@12.3.0: dependencies: env-paths: 2.2.1 - exponential-backoff: 3.1.1 - glob: 7.2.3 + exponential-backoff: 3.1.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 + nopt: 9.0.0 + proc-log: 6.1.0 + semver: 7.8.1 + tar: 7.5.15 + tinyglobby: 0.2.16 + undici: 6.26.0 + which: 6.0.1 - noms@0.0.0: - dependencies: - inherits: 2.0.4 - readable-stream: 1.0.34 + node-releases@2.0.46: {} - nopt@6.0.0: + nopt@9.0.0: dependencies: - abbrev: 1.1.1 + abbrev: 4.0.0 normalize-path@3.0.0: {} @@ -3551,58 +4780,30 @@ snapshots: console-control-strings: 1.1.0 gauge: 4.0.4 set-blocking: 2.0.0 + optional: true object-keys@1.1.1: optional: true + obug@2.1.1: {} + once@1.4.0: 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 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - 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: dependencies: yocto-queue: 0.1.0 - p-locate@5.0.0: + parse5@7.3.0: dependencies: - p-limit: 3.1.0 + entities: 6.0.1 - p-map@4.0.0: + parse5@8.0.1: dependencies: - aggregate-error: 3.1.0 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - path-exists@4.0.0: {} + entities: 8.0.0 path-exists@5.0.0: {} @@ -3610,50 +4811,76 @@ snapshots: path-key@3.1.1: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.2.2 - minipass: 7.1.2 + path-parse@1.0.7: {} path-type@4.0.0: {} + pathe@2.0.3: {} + + pe-library@0.4.1: {} + pend@1.2.0: {} - picomatch@2.3.1: {} + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + pkg-prebuilds@0.2.1: + dependencies: + yargs: 17.7.2 + optional: true + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 plist@3.1.0: dependencies: - '@xmldom/xmldom': 0.8.10 + '@xmldom/xmldom': 0.8.13 base64-js: 1.5.1 xmlbuilder: 15.1.1 - prelude-ls@1.2.1: {} - - prettier-linter-helpers@1.0.0: + plist@3.1.1: dependencies: - fast-diff: 1.3.0 + '@xmldom/xmldom': 0.9.10 + base64-js: 1.5.1 + xmlbuilder: 15.1.1 - prettier@3.3.1: {} + postject@1.0.0-alpha.6: + dependencies: + commander: 9.5.0 + optional: true - process-nextick-args@2.0.1: {} + proc-log@6.1.0: {} 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: + proper-lockfile@4.1.2: dependencies: - end-of-stream: 1.4.4 + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + + proxy-from-env@2.1.0: + optional: true + + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 once: 1.4.0 punycode@2.3.1: {} - pupa@3.1.0: + pupa@3.3.0: dependencies: escape-goat: 4.0.0 @@ -3661,79 +4888,57 @@ snapshots: quick-lru@5.1.1: {} + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + optional: true + read-binary-file-arch@1.0.6: dependencies: - debug: 4.3.5 + debug: 4.4.3 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 + optional: true - readdir-glob@1.1.3: + readdirp@3.6.0: dependencies: - minimatch: 5.1.6 + picomatch: 2.3.2 + + readdirp@5.0.0: {} require-directory@2.1.1: {} + resedit@1.7.2: + dependencies: + pe-library: 0.4.1 + resolve-alpn@1.2.1: {} - resolve-from@4.0.0: {} - - resolve-pkg-maps@1.0.0: {} + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + 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: {} + reusify@1.1.0: {} - rimraf@3.0.2: + rimraf@2.6.3: dependencies: glob: 7.2.3 @@ -3747,35 +4952,99 @@ snapshots: sprintf-js: 1.1.3 optional: true + rolldown@1.0.0-beta.1: + dependencies: + zod: 3.25.76 + optionalDependencies: + '@rolldown/binding-darwin-arm64': 1.0.0-beta.1 + '@rolldown/binding-darwin-x64': 1.0.0-beta.1 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.1 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.1 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.1 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.1 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.1 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.1 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.1 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.1 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.1 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.1 + + rolldown@1.0.3: + dependencies: + '@oxc-project/types': 0.133.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.3 + '@rolldown/binding-darwin-arm64': 1.0.3 + '@rolldown/binding-darwin-x64': 1.0.3 + '@rolldown/binding-freebsd-x64': 1.0.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 + '@rolldown/binding-linux-arm64-gnu': 1.0.3 + '@rolldown/binding-linux-arm64-musl': 1.0.3 + '@rolldown/binding-linux-ppc64-gnu': 1.0.3 + '@rolldown/binding-linux-s390x-gnu': 1.0.3 + '@rolldown/binding-linux-x64-gnu': 1.0.3 + '@rolldown/binding-linux-x64-musl': 1.0.3 + '@rolldown/binding-openharmony-arm64': 1.0.3 + '@rolldown/binding-wasm32-wasi': 1.0.3 + '@rolldown/binding-win32-arm64-msvc': 1.0.3 + '@rolldown/binding-win32-x64-msvc': 1.0.3 + + 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 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} + safe-buffer@5.2.1: + optional: true safer-buffer@2.1.2: {} - sanitize-filename@1.6.3: + sanitize-filename@1.6.4: dependencies: truncate-utf8-bytes: 1.0.2 - sax@1.4.1: {} + sass@1.100.0: + dependencies: + chokidar: 5.0.0 + immutable: 5.1.5 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.6 + + sax@1.6.0: {} semver-compare@1.0.0: optional: true + semver@5.7.2: {} + semver@6.3.1: {} - semver@7.6.2: {} + semver@7.7.4: {} + + semver@7.8.1: {} serialize-error@7.0.1: dependencies: type-fest: 0.13.1 optional: true - set-blocking@2.0.0: {} + seroval-plugins@1.5.4(seroval@1.5.4): + dependencies: + seroval: 1.5.4 + + seroval@1.5.4: {} + + set-blocking@2.0.0: + optional: true shebang-command@2.0.0: dependencies: @@ -3785,11 +5054,9 @@ snapshots: signal-exit@3.0.7: {} - signal-exit@4.1.0: {} - simple-update-notifier@2.0.0: dependencies: - semver: 7.6.2 + semver: 7.8.1 slash@3.0.0: {} @@ -3802,23 +5069,31 @@ snapshots: slice-ansi@5.0.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 is-fullwidth-code-point: 4.0.0 - smart-buffer@4.2.0: {} + smart-buffer@4.2.0: + optional: true - socks-proxy-agent@7.0.0: + solid-js@1.6.16: dependencies: - agent-base: 6.0.2 - debug: 4.3.5 - socks: 2.8.3 - transitivePeerDependencies: - - supports-color + csstype: 3.2.3 - socks@2.8.3: + solid-js@1.9.13: dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 + csstype: 3.2.3 + seroval: 1.5.4 + seroval-plugins: 1.5.4(seroval@1.5.4) + + solid-motionone@1.0.4(solid-js@1.9.13): + dependencies: + '@motionone/dom': 10.18.0 + '@motionone/utils': 10.18.0 + '@solid-primitives/props': 3.2.3(solid-js@1.9.13) + '@solid-primitives/refs': 1.1.3(solid-js@1.9.13) + '@solid-primitives/transition-group': 1.1.2(solid-js@1.9.13) + csstype: 3.2.3 + solid-js: 1.9.13 sort-keys-length@1.0.1: dependencies: @@ -3828,6 +5103,8 @@ snapshots: dependencies: is-plain-obj: 1.1.0 + source-map-js@1.2.1: {} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -3835,11 +5112,12 @@ snapshots: source-map@0.6.1: {} - sprintf-js@1.1.3: {} + spitroast@2.1.4: {} - ssri@9.0.1: - dependencies: - minipass: 3.3.6 + spitroast@2.1.6: {} + + sprintf-js@1.1.3: + optional: true stat-mode@1.0.0: {} @@ -3849,41 +5127,31 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: + string-width@7.2.0: dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.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 + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 + optional: true strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.2.0: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.2.2 - strip-json-comments@3.1.1: {} + strip-json-comments@2.0.1: + optional: true sumchecker@3.0.1: dependencies: - debug: 4.3.5 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -3891,20 +5159,7 @@ snapshots: dependencies: has-flag: 4.0.0 - synckit@0.8.8: - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.6.3 - - 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 + supports-preserve-symlinks-flag@1.0.0: {} tar@6.2.1: dependencies: @@ -3914,91 +5169,98 @@ snapshots: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 + optional: true + + tar@7.5.15: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.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: + temp@0.9.4: dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 + mkdirp: 0.5.6 + rimraf: 2.6.3 + + tiny-async-pool@1.3.0: + dependencies: + semver: 5.7.2 + + tiny-typed-emitter@2.1.0: {} + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 tmp-promise@3.0.3: dependencies: - tmp: 0.2.3 + tmp: 0.2.7 - tmp@0.2.3: {} + tmp@0.2.7: {} 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.4.5): - dependencies: - typescript: 5.4.5 - - tslib@2.6.3: {} - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 + tslib@2.8.1: {} type-fest@0.13.1: optional: true - typescript-eslint@7.12.0(eslint@9.4.0)(typescript@5.4.5): - 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 - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color + typescript@6.0.3: {} - typescript@5.4.5: {} + ufo@1.6.4: {} - undici-types@5.26.5: {} + uglify-js@3.19.3: + optional: true - unique-filename@2.0.1: - dependencies: - unique-slug: 3.0.0 + undici-types@7.16.0: {} - unique-slug@3.0.0: - dependencies: - imurmurhash: 0.1.4 + undici-types@7.24.6: {} + + undici@6.26.0: {} + + undici@7.26.0: + optional: true universalify@0.1.2: {} universalify@2.0.1: {} - untildify@4.0.0: {} - unused-filename@4.0.1: dependencies: escape-string-regexp: 5.0.0 path-exists: 5.0.0 + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 + url-join@4.0.1: + optional: true + utf8-byte-length@1.0.5: {} - util-deprecate@1.0.2: {} - - v8-compile-cache@2.4.0: {} + util-deprecate@1.0.2: + optional: true verror@1.10.1: dependencies: @@ -4007,26 +5269,24 @@ snapshots: 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: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - which@2.0.2: dependencies: isexe: 2.0.0 + which@5.0.0: + dependencies: + isexe: 3.1.5 + + which@6.0.1: + dependencies: + isexe: 4.0.0 + wide-align@1.1.5: dependencies: string-width: 4.2.3 + optional: true - word-wrap@1.2.5: {} + wordwrap@1.0.0: {} wrap-ansi@7.0.0: dependencies: @@ -4034,57 +5294,43 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - wrappy@1.0.2: {} - ws@8.17.0: {} + ws@8.21.0: {} + + xml-formatter@3.7.0: + dependencies: + xml-parser-xo: 4.1.6 + + xml-parser-xo@4.1.6: {} xmlbuilder@15.1.1: {} - xtend@4.0.2: {} - y18n@5.0.8: {} + yallist@3.1.1: {} + yallist@4.0.0: {} - yargs-parser@20.2.9: {} + yallist@5.0.0: {} 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 + escalade: 3.2.0 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: + yauzl@3.3.1: dependencies: buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 + pend: 1.2.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 + zod@3.25.76: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..729f9f5 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,12 @@ +allowBuilds: + "@parcel/watcher": true + "@vencord/venmic": true + electron-winstaller: true + esbuild: true + koffi: true + +minimumReleaseAgeExclude: + - electron@42.3.3 + +overrides: + yauzl: "^3.3.1" # Electron still can't get their shit together https://github.com/electron/electron/issues/51619 diff --git a/prettier.config.js b/prettier.config.js deleted file mode 100644 index dfabec1..0000000 --- a/prettier.config.js +++ /dev/null @@ -1,17 +0,0 @@ -/** @type {import("prettier").Config} */ -const config = { - printWidth: 120, - tabWidth: 4, - useTabs: false, - semi: true, - singleQuote: false, - quoteProps: "as-needed", - jsxSingleQuote: false, - trailingComma: "none", - bracketSpacing: false, - jsxBracketSameLine: false, - arrowParens: "always", - endOfLine: "auto" -}; - -export default config; diff --git a/rolldown.config.ts b/rolldown.config.ts new file mode 100644 index 0000000..c63609e --- /dev/null +++ b/rolldown.config.ts @@ -0,0 +1,103 @@ +import solid from "@rolldown-plugin/solid"; +import esmShim from "@rollup/plugin-esm-shim"; +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(), + 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", "node:worker_threads"], + plugins: [esmShim()], + }, + { + 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: [solid()], + }, +]); diff --git a/scripts/build/sandboxFix.mjs b/scripts/build/sandboxFix.mjs new file mode 100644 index 0000000..1c118de --- /dev/null +++ b/scripts/build/sandboxFix.mjs @@ -0,0 +1,75 @@ +/* + * 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 fs from "node:fs/promises"; +import path from "node:path"; +import AppImageTarget from "app-builder-lib/out/targets/appimage/AppImageTarget.js"; + +let isApplied = false; + +export async function applyAppImageSandboxFix() { + if (process.platform !== "linux") { + // this fix is only required on linux + return; + } + + if (isApplied) return; + isApplied = true; + + 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 fs.rm(newPath, { + recursive: true, + }); + } catch {} + + console.log("Copying to apply appimage fix", oldPath, newPath); + await fs.cp(oldPath, newPath, { + recursive: true, + }); + args[0] = newPath; + + const executable = path.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 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"); + } + + const ret = await oldBuildMethod.apply(this, args); + + await fs.rm(newPath, { + recursive: true, + }); + + return ret; + }; +} diff --git a/scripts/copyVenmic.ts b/scripts/copyVenmic.ts new file mode 100644 index 0000000..80d8239 --- /dev/null +++ b/scripts/copyVenmic.ts @@ -0,0 +1,19 @@ +import { existsSync, mkdirSync } from "node:fs"; +import { copyFile } from "node:fs/promises"; + +async function copyVenmic() { + if (process.platform !== "linux") return; + if (!existsSync("./dist")) mkdirSync("./dist"); + return Promise.all([ + copyFile( + "./node_modules/@vencord/venmic/prebuilds/venmic-addon-linux-x64/node-napi-v7.node", + "./dist/venmic-x64.node", + ), + copyFile( + "./node_modules/@vencord/venmic/prebuilds/venmic-addon-linux-arm64/node-napi-v7.node", + "./dist/venmic-arm64.node", + ), + ]).catch(() => console.warn("Failed to copy venmic. Building without venmic support")); +} + +await Promise.all([copyVenmic()]); diff --git a/scripts/utils/updateMeta.ts b/scripts/utils/updateMeta.ts new file mode 100644 index 0000000..788dfd8 --- /dev/null +++ b/scripts/utils/updateMeta.ts @@ -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"); diff --git a/src/@types/ModBundle.d.ts b/src/@types/ModBundle.d.ts new file mode 100644 index 0000000..61e8005 --- /dev/null +++ b/src/@types/ModBundle.d.ts @@ -0,0 +1,5 @@ +export interface ModBundle { + js: string; + css?: string; + enabled: boolean; +} diff --git a/src/@types/consts.d.ts b/src/@types/consts.d.ts new file mode 100644 index 0000000..f221dc8 --- /dev/null +++ b/src/@types/consts.d.ts @@ -0,0 +1,16 @@ +import type { ValidMods } from "./settings.js"; + +export interface RepoData { + owner: string; + repo: string; + branch: string; +} + +export type ModData = Record< + ValidMods, + { + repoData: RepoData; + js: string; + css?: string; + } +>; diff --git a/src/@types/cssModules.d.ts b/src/@types/cssModules.d.ts new file mode 100644 index 0000000..e06018a --- /dev/null +++ b/src/@types/cssModules.d.ts @@ -0,0 +1,4 @@ +declare module "*.module.css" { + const classes: Record; + export default classes; +} diff --git a/src/types/i18nStrings.d.ts b/src/@types/i18nStrings.d.ts similarity index 100% rename from src/types/i18nStrings.d.ts rename to src/@types/i18nStrings.d.ts diff --git a/src/@types/keybind.d.ts b/src/@types/keybind.d.ts new file mode 100644 index 0000000..368035a --- /dev/null +++ b/src/@types/keybind.d.ts @@ -0,0 +1,18 @@ +export type KeybindActions = + | "mute" + | "deafen" + | "leaveCall" + | "navigateBack" + | "navigateForward" + | "openQuickCss" + | "pushToTalk" + | "openSettings" + | "runJavascript"; +export interface Keybind { + accelerator: Electron.Accelerator; + action: KeybindActions; + global: boolean; + enabled: boolean; + id: string; + js?: string; +} diff --git a/src/@types/legcordWindow.d.ts b/src/@types/legcordWindow.d.ts new file mode 100644 index 0000000..424c9e4 --- /dev/null +++ b/src/@types/legcordWindow.d.ts @@ -0,0 +1,150 @@ +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"; + +export interface LegcordPluginInfo { + id: string; + name: string; + version: string; + description?: string; + author?: string; + enabled: boolean; + compatible: boolean; + compatibilityMessage?: string; + compatibleVersions: string[]; + hasMain: boolean; + hasPreload: boolean; + hasRenderer: boolean; +} + +export interface LegcordWindow { + window: { + show: () => void; + hide: () => void; + minimize: () => void; + maximize: () => void; + unmaximize: () => void; + quit: () => void; + maximized: () => boolean; + isNormal: () => boolean; + }; + electron: string; + getLang: (toGet: string) => Promise; + version: string; + platform: string; + osRelease: string; + restart: () => void; + translations: string; + settings: { + getConfig: () => Readonly; + setConfig: (object: K, toSet: Settings[K]) => void; + openStorageFolder: () => void; + openThemesFolder: () => void; + openCustomIconDialog: () => void; + copyDebugInfo: () => void; + copyGPUInfo: () => void; + setLang(lang: string): () => void; + addKeybind: (keybind: Keybind) => void; + toggleKeybind: (id: string) => void; + removeKeybind: (id: string) => void; + }; + touchbar: { + setVoiceTouchbar: (state: boolean) => void; + setVoiceState: (mute: boolean, deafen: boolean) => void; + importGuilds: (array: Array) => void; + }; + power: { + setPowerSaving: (state: boolean) => void; + isPowerSavingEnabled: () => boolean; + }; + screenshare: { + 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; + venmicList: () => Promise< + { ok: true; targets: Node[]; hasPipewirePulse: boolean } | { ok: false; isGlibCxxOutdated: boolean } + >; + venmicStop: () => Promise; + }; + themes: { + install: (url: string) => void; + openImportPicker: () => void; + uninstall: (id: string) => void; + set: (id: string, state: boolean) => void; + getThemes: () => Readonly; + openQuickCss: () => void; + edit: (id: string) => void; + folder: (id: string) => void; + importQuickCss: (css: string) => void; + disableQuickCss: () => void; + enableQuickCss: () => void; + }; + rpc: { + listen: (msg: { + activity: { + assets: { large_image: string | null; small_image: string | null }; + application_id: number; + name: string; + }; + }) => void; + getProcessList: () => ProcessInfo[]; + refreshProcessList: () => void; + addDetectable: (e: Game) => void; + removeDetectable: (id: string) => void; + getDetectables: () => GameList; + getBlacklist: () => DetectedGame[]; + blacklistGame: (name: string, id: number) => void; + unblacklistGame: (id: number) => void; + }; + backup: { + save(data: string): Promise<{ ok: true } | { ok: false; error: string }>; + restore(): Promise; + }; + plugins: { + list: () => Promise; + setEnabled: (id: string, enabled: boolean) => Promise<{ ok: boolean }>; + reload: (id: string) => Promise<{ ok: boolean }>; + openFolder: () => void; + }; + /** Plugin storage API. Requires user to enable "Extended plugin abilities" in Legcord settings. */ + fs: { + writeFile: ( + pluginId: string, + relativePath: string, + data: string, + ) => Promise<{ ok: true } | { ok: false; error: string }>; + readFile: ( + pluginId: string, + relativePath: string, + ) => Promise<{ ok: true; data: string } | { ok: false; error: string }>; + }; +} + +export interface DetectedGame { + name: string; + id: number; +} + +export interface LegcordRPC { + lastDetectedGames: DetectedGame[]; + onLastDetectedUpdate: ((list: DetectedGame[]) => void) | null; + listen: (msg: { + activity: { + assets: { large_image: string | null; small_image: string | null }; + application_id: number; + name: string; + }; + }) => void; +} + +declare global { + interface Window { + legcordRPC?: LegcordRPC; + } +} diff --git a/src/@types/settings.d.ts b/src/@types/settings.d.ts new file mode 100644 index 0000000..bc09c56 --- /dev/null +++ b/src/@types/settings.d.ts @@ -0,0 +1,80 @@ +import type { Keybind } from "./keybind.js"; + +export type ValidMods = "vencord" | "equicord" | "custom" | "shelter"; + +export type ValidTrayIcons = + | "dynamic" + | "dsc-tray" + | "clsc-dsc-tray" + | "ac_plug_colored" + | "ac_white_plug" + | "ac_white_plug_hollow" + | "ac_black_plug" + | "ac_black_plug_hollow" + | "disabled"; + +export interface AudioSettings { + workaround: boolean; + deviceSelect: boolean; + granularSelect: boolean; + ignoreVirtual: boolean; + ignoreDevices: boolean; + ignoreInputMedia: boolean; + onlySpeakers: boolean; + onlyDefaultSpeakers: boolean; + loopbackType: "loopback" | "loopbackWithMute"; +} + +export interface Settings { + // Referenced for detecting a broken config. + "0"?: string; + // Only used for external url warning dialog. + ignoreProtocolWarning?: boolean; + customIcon: string; + windowStyle: "default" | "native" | "overlay" | "transparent" | "legacy" | "rebrand"; + channel: "stable" | "ptb" | "canary"; + transparency: "universal" | "modern" | "none"; + windowMaterial: "mica" | "tabbed" | "acrylic" | "none"; + audio: AudioSettings; + csp: "vanilla" | "strict" | "none"; + minimizeToTray: boolean; + multiInstance: boolean; + spellcheck: boolean; + mods: ValidMods[]; + mobileMode: boolean; + skipSplash: boolean; + performanceMode: "battery" | "dynamic" | "performance" | "smoothScreenshare" | "none"; + customJsBundle: RequestInfo | URL | string; + customCssBundle: RequestInfo | URL | string; + startMinimized: boolean; + keybinds: Keybind[]; + hardwareAcceleration: boolean; + useMacSystemPicker: boolean; + inviteWebsocket: boolean; + disableAutogain: boolean; + autoHideMenuBar: boolean; + vaapi: boolean; + blockPowerSavingInVoiceChat: boolean; + disableHttpCache: boolean; + tray: ValidTrayIcons; + doneSetup: boolean; + spellcheckLanguage: string[]; + smoothScroll: boolean; + bounceOnPing: boolean; + popoutPiP: boolean; + sleepInBackground: boolean; + useSystemCssEditor: boolean; + quickCss: boolean; + autoScroll: boolean; + additionalArguments: string; + noBundleUpdates: ValidMods[]; + automaticUpdates: boolean; + overlayButtonColor: string; + processScanning: boolean; + windowsLegacyScanning: boolean; + scanInterval: number; + modCache?: Record; + extendedPluginAbilities: boolean; + supportBannerDismissed: boolean; + pluginStates?: Record; +} diff --git a/src/types/themeManifest.d.ts b/src/@types/themeManifest.d.ts similarity index 80% rename from src/types/themeManifest.d.ts rename to src/@types/themeManifest.d.ts index b27cea5..12ea4ed 100644 --- a/src/types/themeManifest.d.ts +++ b/src/@types/themeManifest.d.ts @@ -1,7 +1,9 @@ export interface ThemeManifest { + id?: string; name: string; author?: string; description?: string; + enabled: boolean; version?: string; invite?: string; authorId?: string; @@ -12,5 +14,5 @@ export interface ThemeManifest { website?: string; source?: string; updateSrc?: string; - supportsArmCordTitlebar?: boolean; + supportsLegcordTitlebar?: boolean; } diff --git a/src/types/windowState.d.ts b/src/@types/windowState.d.ts similarity index 100% rename from src/types/windowState.d.ts rename to src/@types/windowState.d.ts diff --git a/src/common/backup.ts b/src/common/backup.ts new file mode 100644 index 0000000..5880ef8 --- /dev/null +++ b/src/common/backup.ts @@ -0,0 +1,254 @@ +import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs"; +import path from "node:path"; +import AdmZip from "adm-zip"; +import { app } from "electron"; +import type { Settings } from "../@types/settings.js"; +import { setConfigBulk } from "./config.js"; + +export const LEGCORD_BACKUP_VERSION = 1; +export const MANIFEST_ENTRY = "manifest.json"; + +export interface BackupIncludeOptions { + legcordConfig: boolean; + legcordThemesAndQuickCss: boolean; + legcordExtensionPlugins: boolean; + vencordModData: boolean; + equicordModData: boolean; + shelterModData: boolean; + modBundles: boolean; +} + +export interface BackupClientMods { + vencordLocalStorage?: string | null; + equicordLocalStorage?: string | null; + shelter?: { plugins: unknown; enabledPlugins: unknown }; +} + +export interface BackupSavePayload { + includes: BackupIncludeOptions; + clientMods: BackupClientMods; +} + +export interface BackupManifest extends BackupSavePayload { + version: typeof LEGCORD_BACKUP_VERSION; + createdAt: string; + appVersion: string; +} + +export interface BackupPaths { + userDataPath: string; + themesPath: string; + extensionsPath: string; + pluginsPath: string; + pluginStoragePath: string; + quickCssPath: string; + getConfigLocation: () => string; +} + +function walkFiles(absDir: string, zipPrefix: string): Array<{ name: string; data: Buffer }> { + if (!existsSync(absDir)) return []; + const out: Array<{ name: string; data: Buffer }> = []; + function walk(dir: string): void { + for (const name of readdirSync(dir)) { + const full = path.join(dir, name); + if (statSync(full).isDirectory()) { + walk(full); + } else { + const rel = path.relative(absDir, full); + const zipName = path.join(zipPrefix, rel).replace(/\\/g, "/"); + out.push({ name: zipName, data: readFileSync(full) }); + } + } + } + walk(absDir); + return out; +} + +function addFileIfExists(entries: Array<{ name: string; data: Buffer }>, diskPath: string, zipName: string): void { + if (existsSync(diskPath)) { + entries.push({ name: zipName, data: readFileSync(diskPath) }); + } +} + +const BUNDLE_FILES = [ + "vencord.js", + "vencord.css", + "equicord.js", + "equicord.css", + "shelter.js", + "custom.js", + "custom.css", +]; + +export function buildBackupZipBuffer(payload: BackupSavePayload, paths: BackupPaths): Buffer { + const includes = payload.includes; + const clientMods: BackupClientMods = {}; + + if (includes.vencordModData) { + clientMods.vencordLocalStorage = payload.clientMods.vencordLocalStorage ?? null; + } + if (includes.equicordModData) { + clientMods.equicordLocalStorage = payload.clientMods.equicordLocalStorage ?? null; + } + if (includes.shelterModData) { + // @ts-expect-error + clientMods.shelter = payload.clientMods.shelter; + } + + const manifest: BackupManifest = { + version: LEGCORD_BACKUP_VERSION, + createdAt: new Date().toISOString(), + appVersion: app.getVersion(), + includes, + clientMods, + }; + + const entries: Array<{ name: string; data: Buffer }> = [ + { name: MANIFEST_ENTRY, data: Buffer.from(JSON.stringify(manifest, null, 2), "utf-8") }, + ]; + + if (includes.legcordConfig && existsSync(paths.getConfigLocation())) { + addFileIfExists(entries, paths.getConfigLocation(), "data/storage/settings.json"); + } + if (includes.legcordThemesAndQuickCss) { + addFileIfExists(entries, paths.quickCssPath, "data/quickCss.css"); + entries.push(...walkFiles(paths.themesPath, "data/themes")); + } + if (includes.legcordExtensionPlugins) { + entries.push(...walkFiles(paths.extensionsPath, "data/plugins")); + entries.push(...walkFiles(paths.pluginsPath, "data/runtime-plugins")); + entries.push(...walkFiles(paths.pluginStoragePath, "data/plugin-storage")); + } + if (includes.modBundles) { + for (const f of BUNDLE_FILES) { + addFileIfExists(entries, path.join(paths.userDataPath, f), `bundles/${f}`); + } + } + + const zip = new AdmZip(); + for (const e of entries) { + zip.addFile(e.name.replace(/\\/g, "/"), e.data); + } + return zip.toBuffer(); +} + +function writeFileEnsuringDirs(filePath: string, data: Buffer): void { + mkdirSync(path.dirname(filePath), { recursive: true }); + writeFileSync(filePath, data); +} + +/** + * Resolve a path relative to baseDir, rejecting traversal outside baseDir (zip slip). + * `relativePath` uses forward slashes as stored in the archive. + */ +function resolvePathUnderBaseDir(baseDir: string, relativePath: string): string | null { + const base = path.resolve(baseDir); + const resolved = path.resolve(base, relativePath); + const rel = path.relative(base, resolved); + if (rel.startsWith("..") || path.isAbsolute(rel)) { + return null; + } + return resolved; +} + +/** Apply extracted zip entries to disk. Returns client mod blob for the renderer. */ +export function applyBackupFromMap( + map: Map, + paths: BackupPaths, +): { clientMods: BackupClientMods; manifest: BackupManifest } { + const raw = map.get(MANIFEST_ENTRY); + if (!raw) throw new Error("Missing manifest.json"); + const manifest = JSON.parse(raw.toString("utf8")) as BackupManifest; + if (manifest.version !== LEGCORD_BACKUP_VERSION) { + throw new Error(`Unsupported backup version: ${String(manifest.version)}`); + } + + const inc = manifest.includes; + + for (const [name, data] of map) { + if (name === MANIFEST_ENTRY) continue; + + if (name.startsWith("data/storage/")) { + if (!inc.legcordConfig) continue; + const rest = name.slice("data/storage/".length); + if (rest !== "settings.json") continue; + const dest = paths.getConfigLocation(); + mkdirSync(path.dirname(dest), { recursive: true }); + setConfigBulk(JSON.parse(data.toString("utf8")) as Settings); + continue; + } + + if (name === "data/quickCss.css") { + if (!inc.legcordThemesAndQuickCss) continue; + writeFileEnsuringDirs(paths.quickCssPath, data); + continue; + } + + if (name.startsWith("data/themes/")) { + if (!inc.legcordThemesAndQuickCss) continue; + const rest = name.slice("data/themes/".length); + const dest = resolvePathUnderBaseDir(paths.themesPath, rest); + if (!dest) { + console.warn(`[backup] Skipping unsafe zip path (themes): ${name}`); + continue; + } + writeFileEnsuringDirs(dest, data); + continue; + } + + if (name.startsWith("data/plugins/")) { + if (!inc.legcordExtensionPlugins) continue; + const rest = name.slice("data/plugins/".length); + const dest = resolvePathUnderBaseDir(paths.extensionsPath, rest); + if (!dest) { + console.warn(`[backup] Skipping unsafe zip path (plugins): ${name}`); + continue; + } + writeFileEnsuringDirs(dest, data); + continue; + } + + if (name.startsWith("data/runtime-plugins/")) { + if (!inc.legcordExtensionPlugins) continue; + const rest = name.slice("data/runtime-plugins/".length); + const dest = resolvePathUnderBaseDir(paths.pluginsPath, rest); + if (!dest) { + console.warn(`[backup] Skipping unsafe zip path (runtime-plugins): ${name}`); + continue; + } + writeFileEnsuringDirs(dest, data); + continue; + } + + if (name.startsWith("data/plugin-storage/")) { + if (!inc.legcordExtensionPlugins) continue; + const rest = name.slice("data/plugin-storage/".length); + const dest = resolvePathUnderBaseDir(paths.pluginStoragePath, rest); + if (!dest) { + console.warn(`[backup] Skipping unsafe zip path (plugin-storage): ${name}`); + continue; + } + writeFileEnsuringDirs(dest, data); + continue; + } + + if (name.startsWith("bundles/")) { + if (!inc.modBundles) continue; + const rest = name.slice("bundles/".length); + if (!BUNDLE_FILES.includes(rest)) continue; + writeFileEnsuringDirs(path.join(paths.userDataPath, rest), data); + } + } + + return { clientMods: manifest.clientMods, manifest }; +} + +export function readBackupZipToMap(zipBuffer: Buffer): Map { + const zip = new AdmZip(zipBuffer); + const map = new Map(); + for (const entry of zip.getEntries()) { + if (entry.isDirectory) continue; + map.set(entry.entryName.replace(/\\/g, "/"), entry.getData()); + } + return map; +} diff --git a/src/common/blacklistGame.ts b/src/common/blacklistGame.ts new file mode 100644 index 0000000..2af8a75 --- /dev/null +++ b/src/common/blacklistGame.ts @@ -0,0 +1,84 @@ +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import path from "node:path"; +import { app } from "electron"; + +export interface RpcBlacklistEntry { + name: string; + id: number; +} + +let blacklistCache: RpcBlacklistEntry[] | null = null; +let blacklistCacheTime = 0; +const BLACKLIST_CACHE_TTL = 500; + +export function getBlacklistLocation(): string { + const userDataPath = app.getPath("userData"); + const storagePath = path.join(userDataPath, "storage"); + return path.join(storagePath, "blacklist.json"); +} + +function ensureStorageDir(): void { + const loc = getBlacklistLocation(); + const dir = path.dirname(loc); + if (!existsSync(dir)) mkdirSync(dir, { recursive: true }); +} + +function normalizeEntry(g: unknown): RpcBlacklistEntry | null { + if (!g || typeof g !== "object") return null; + const o = g as Record; + const id = Number(o.id); + const name = typeof o.name === "string" ? o.name : ""; + if (Number.isNaN(id) || !name) return null; + return { name, id }; +} + +export function getBlacklist(): RpcBlacklistEntry[] { + const now = Date.now(); + if (blacklistCache !== null && now - blacklistCacheTime < BLACKLIST_CACHE_TTL) { + return blacklistCache; + } + ensureStorageDir(); + const loc = getBlacklistLocation(); + if (!existsSync(loc)) { + blacklistCache = []; + blacklistCacheTime = now; + return blacklistCache; + } + try { + const raw = readFileSync(loc, "utf-8"); + const parsed = JSON.parse(raw); + const list = Array.isArray(parsed) + ? parsed.map(normalizeEntry).filter((e): e is RpcBlacklistEntry => e !== null) + : []; + blacklistCache = list; + blacklistCacheTime = now; + return blacklistCache; + } catch { + blacklistCache = []; + blacklistCacheTime = now; + return blacklistCache; + } +} + +function saveBlacklist(list: RpcBlacklistEntry[]): void { + ensureStorageDir(); + writeFileSync(getBlacklistLocation(), JSON.stringify(list, null, 4), "utf-8"); + blacklistCache = list; + blacklistCacheTime = Date.now(); +} + +export function blacklistGame(name: string, id: number): void { + const list = getBlacklist(); + const entryId = Number(id); + const entryName = String(name); + if (Number.isNaN(entryId) || !entryName) return; + if (list.some((e) => e.id === entryId)) return; + saveBlacklist([...list, { name: entryName, id: entryId }]); +} + +export function unblacklistGame(id: number): void { + const list = getBlacklist(); + const entryId = Number(id); + if (Number.isNaN(entryId)) return; + saveBlacklist(list.filter((e) => e.id !== entryId)); +} diff --git a/src/common/config.ts b/src/common/config.ts index 75758e8..69ac5b7 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -1,137 +1,251 @@ -import {app, dialog} from "electron"; -import path from "path"; -import isDev from "electron-is-dev"; -import fs from "fs"; -import type {Settings} from "../types/settings.d.js"; -import {getWindowStateLocation} from "./windowState.js"; +import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs"; +import { platform } from "node:os"; +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; + +// 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", + bounceOnPing: false, + csp: "none", + minimizeToTray: true, + processScanning: true, + windowsLegacyScanning: false, + scanInterval: 5000, + overlayButtonColor: "#121214", + keybinds: [], + audio: { + workaround: false, + deviceSelect: true, + granularSelect: true, + ignoreVirtual: false, + ignoreDevices: false, + ignoreInputMedia: false, + onlySpeakers: false, + onlyDefaultSpeakers: true, + loopbackType: "loopback", + }, + multiInstance: false, + mods: ["vencord"], + transparency: "none", + windowMaterial: "mica", + spellcheck: true, + hardwareAcceleration: true, + performanceMode: "none", + skipSplash: false, + inviteWebsocket: true, + startMinimized: false, + disableHttpCache: false, + customJsBundle: "https://legcord.app/placeholder.js", + customCssBundle: "https://legcord.app/placeholder.css", + disableAutogain: false, + autoHideMenuBar: true, + blockPowerSavingInVoiceChat: false, + useMacSystemPicker: true, + mobileMode: false, + tray: "dynamic", + doneSetup: false, + popoutPiP: false, + vaapi: platform() === "linux", + spellcheckLanguage: ["en-US"], + sleepInBackground: false, + noBundleUpdates: [], + automaticUpdates: false, + additionalArguments: "", + customIcon: join(import.meta.dirname, "../", "/assets/desktop.png"), + smoothScroll: true, + autoScroll: false, + useSystemCssEditor: false, + extendedPluginAbilities: false, + quickCss: true, + supportBannerDismissed: false, + pluginStates: {}, +}; + +const safeMode: Settings = { + ...defaults, + mods: [], + windowStyle: "native", + csp: "vanilla", + hardwareAcceleration: false, + disableHttpCache: true, + vaapi: false, + additionalArguments: "", + extendedPluginAbilities: false, + quickCss: false, +}; + export function checkForDataFolder(): void { - const dataPath = path.join(path.dirname(app.getPath("exe")), "armcord-data"); - if (fs.existsSync(dataPath) && fs.statSync(dataPath).isDirectory()) { - console.log("Found armcord-data folder. Running in portable mode."); + const dataPath = join(dirname(app.getPath("exe")), "legcord-data"); + if (existsSync(dataPath) && statSync(dataPath).isDirectory()) { + console.log("Found legcord-data folder. Running in portable mode."); app.setPath("userData", dataPath); } - if (path.join(app.getPath("appData"), "ArmCord") && !isDev) { - console.log("Found existing ArmCord folder."); - app.setPath("userData", path.join(app.getPath("appData"), "ArmCord")); - } } export function getConfigLocation(): string { const userDataPath = app.getPath("userData"); - const storagePath = path.join(userDataPath, "/storage/"); + const storagePath = join(userDataPath, "/storage/"); return `${storagePath}settings.json`; } -// REVIEW - If I remember correctly fs doesn't need async. I have adjusted the Promise to reflect so. -// Why touch it when it worked fine? The Async-ness of this function caused headaches in a lot of other places. -// Tested with src/tray.ts - Seems to work great! -// NOTE - Removed getConfigSync(object: K) - Redundant now. + export function getConfig(object: K): Settings[K] { - const rawData = fs.readFileSync(getConfigLocation(), "utf-8"); + 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 { - const rawData = fs.readFileSync(getConfigLocation(), "utf-8"); + const rawData = readFileSync(getConfigLocation(), "utf-8"); const parsed = JSON.parse(rawData) as Settings; parsed[object] = toSet; const toSave = JSON.stringify(parsed, null, 4); - fs.writeFileSync(getConfigLocation(), toSave, "utf-8"); + writeFileSync(getConfigLocation(), toSave, "utf-8"); + + // Performance optimization: Update cache immediately + configCache = parsed; + configCacheTime = Date.now(); } export function setConfigBulk(object: Settings): void { let existingData = {}; try { - const existingDataBuffer = fs.readFileSync(getConfigLocation(), "utf-8"); + const existingDataBuffer = readFileSync(getConfigLocation(), "utf-8"); existingData = JSON.parse(existingDataBuffer.toString()) as Settings; - } catch (error) { + } catch (_error) { // Ignore errors when the file doesn't exist or parsing fails } // Merge the existing data with the new data - const mergedData = {...existingData, ...object}; + const mergedData = { ...existingData, ...object }; // Write the merged data back to the file const toSave = JSON.stringify(mergedData, null, 4); - fs.writeFileSync(getConfigLocation(), toSave, "utf-8"); + 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"); - const storagePath = path.join(userDataPath, "/storage/"); + const storagePath = join(userDataPath, "/storage/"); const settingsFile = `${storagePath}settings.json`; - if (!fs.existsSync(app.getPath("userData"))) { - fs.mkdirSync(app.getPath("userData")); + if (!existsSync(app.getPath("userData"))) { + mkdirSync(app.getPath("userData")); console.log("Created missing user data folder"); } - if (!fs.existsSync(settingsFile)) { - if (!fs.existsSync(storagePath)) { - fs.mkdirSync(storagePath); - console.log("Created missing storage folder"); + try { + if (!existsSync(settingsFile)) { + if (!existsSync(storagePath)) { + mkdirSync(storagePath); + console.log("Created missing storage folder"); + } + console.log("First run of the Legcord. Starting setup."); + setup(); + firstRun = true; + } else if (!getConfig("doneSetup")) { + console.log("First run of the Legcord. Starting setup."); + setup(); + firstRun = true; + } else { + console.log("Legcord has been run before. Skipping setup."); } - console.log("First run of the ArmCord. Starting setup."); - setup(); - firstRun = true; - } else if (getConfig("doneSetup") == false) { - console.log("First run of the ArmCord. Starting setup."); - setup(); - firstRun = true; - } else { - console.log("ArmCord has been run before. Skipping setup."); + } catch { + checkIfConfigIsBroken(); } } export function checkIfConfigIsBroken(): void { try { - const settingsData = fs.readFileSync(getConfigLocation(), "utf-8"); - JSON.parse(settingsData); - console.log("Config is fine"); + 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)[]; + const defaultKeys = Object.keys(defaults) as (keyof Settings)[]; + + const missingKeysInSettings = defaultKeys.filter((key) => !settingsKeys.includes(key)); + configWasFine = missingKeysInSettings.length === 0; + + defaultKeys.forEach((key: keyof Settings) => { + const valueInSettings = settingsObject[key]; + const valueInDefaults = defaults[key]; + if (!valueInSettings || !valueInDefaults) return; + if (typeof valueInDefaults !== typeof valueInSettings) { + console.log( + `Root config ${key} type (${typeof valueInSettings}) differs from default type (${typeof valueInDefaults}). Setting default value...`, + ); + setConfig(key, valueInDefaults); + configWasFine = false; + } + }); + + missingKeysInSettings.forEach((missingKey) => { + 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) { console.error(e); console.log("Detected a corrupted config"); setup(); - dialog.showErrorBox( - "Oops, something went wrong.", - "ArmCord 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 = fs.readFileSync(getWindowStateLocation(), "utf-8"); + const windowData = readFileSync(getWindowStateLocation(), "utf-8"); JSON.parse(windowData); console.log("Window config is fine"); } catch (e) { console.error(e); - fs.writeFileSync(getWindowStateLocation(), "{}", "utf-8"); + writeFileSync(getWindowStateLocation(), "{}", "utf-8"); console.log("Detected a corrupted window config"); } + handleAutomaticUpdates(configCache!); } export function setup(): void { - console.log("Setting up temporary ArmCord settings."); - const defaults: Settings = { - windowStyle: "default", - channel: "stable", - armcordCSP: true, - minimizeToTray: true, - keybinds: [], - multiInstance: false, - mods: "none", - spellcheck: true, - performanceMode: "none", - skipSplash: false, - inviteWebsocket: true, - startMinimized: false, - dynamicIcon: false, - tray: true, - customJsBundle: "https://armcord.app/placeholder.js", - customCssBundle: "https://armcord.app/placeholder.css", - disableAutogain: false, - useLegacyCapturer: false, - mobileMode: false, - trayIcon: "default", - doneSetup: false, - clientName: "ArmCord", - customIcon: path.join(import.meta.dirname, "../", "/assets/desktop.png"), - smoothScroll: true - }; + console.log("Setting up temporary Legcord settings."); setConfigBulk({ - ...defaults + ...defaults, }); } + +export function setFirstRun(value: boolean): void { + firstRun = value; +} + +export function handleAutomaticUpdates(settings: Settings): void { + if (settings.automaticUpdates) { + require("../updater.js"); + } +} diff --git a/src/common/consts.ts b/src/common/consts.ts new file mode 100644 index 0000000..3fcce95 --- /dev/null +++ b/src/common/consts.ts @@ -0,0 +1,38 @@ +import type { ModData } from "../@types/consts.js"; + +export const modData: ModData = { + vencord: { + repoData: { + owner: "vendicated", + repo: "vencord", + branch: "main", + }, + js: "https://github.com/Vendicated/Vencord/releases/download/devbuild/browser.js", + css: "https://github.com/Vendicated/Vencord/releases/download/devbuild/browser.css", + }, + equicord: { + repoData: { + owner: "equicord", + repo: "equicord", + branch: "main", + }, + js: "https://github.com/Equicord/Equicord/releases/download/latest/browser.js", + css: "https://github.com/Equicord/Equicord/releases/download/latest/browser.css", + }, + shelter: { + repoData: { + owner: "uwu", + repo: "shelter-builds", + branch: "main", + }, + js: "https://raw.githubusercontent.com/uwu/shelter-builds/main/shelter.js", + }, + custom: { + repoData: { + owner: "DoNotChange", + repo: "CustomMod", + branch: "DoNotChange", + }, + js: "DoNotChange", + }, +}; diff --git a/src/common/detectables.ts b/src/common/detectables.ts new file mode 100644 index 0000000..75d23e1 --- /dev/null +++ b/src/common/detectables.ts @@ -0,0 +1,34 @@ +import fs from "node:fs"; +import path from "node:path"; +import type { Game, GameList } from "arrpc"; +import { app } from "electron"; +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 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"); + } + 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/common/dom.ts b/src/common/dom.ts index dc24e1a..c9840f6 100644 --- a/src/common/dom.ts +++ b/src/common/dom.ts @@ -1,14 +1,26 @@ -export function addStyle(styleString: string): void { +import type { BrowserWindow } from "electron"; + +export function addStyle(styleUrl: string): void { + const style = document.createElement("link"); + style.rel = "stylesheet"; + style.type = "text/css"; + style.href = styleUrl; + document.head.append(style); +} + +export function addTheme(id: string, styleString: string): void { const style = document.createElement("style"); style.textContent = styleString; + style.id = id; document.head.append(style); } export function addScript(scriptString: string): void { const script = document.createElement("script"); - script.textContent = scriptString; + script.appendChild(document.createTextNode(scriptString)); document.body.append(script); } + export async function injectJS(inject: string): Promise { const js = await (await fetch(`${inject}`)).text(); @@ -18,3 +30,13 @@ export async function injectJS(inject: string): Promise { document.body.appendChild(el); } + +export function navigateTo(passedWindow: BrowserWindow, url: string): void { + // Sanitize: only allow path-like URLs (no protocol, no quotes) + const sanitized = url.replace(/[^a-zA-Z0-9/_\-@.]/g, ""); + console.log(`[legcord deeplink] Navigating to ${sanitized}`); + passedWindow.webContents.executeJavaScript( + `history.pushState({}, null, ${JSON.stringify(sanitized)});window.dispatchEvent(new PopStateEvent("popstate", {}));`, + ); + passedWindow.focus(); +} diff --git a/src/common/flags.ts b/src/common/flags.ts index 4b87581..3231cc1 100644 --- a/src/common/flags.ts +++ b/src/common/flags.ts @@ -1,8 +1,166 @@ -import {app} from "electron"; -import {getConfig} from "./config.js"; +import { readFileSync } from "node:fs"; +import { join } from "node:path"; +import { app, powerMonitor } from "electron"; +import isDev from "electron-is-dev"; +import { getConfig } from "./config.js"; -export let transparency: boolean; -export function injectElectronFlags(): void { +interface Preset { + switches: [string, string?][]; + enableFeatures: string[]; + disableFeatures: string[]; +} + +// Cache for custom flags to avoid repeated file reads +let customFlagsCache: Preset | null = null; + +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 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: [ + ["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"], +}; + +/** + * Load custom flags from JSON file in user data directory (cached after first load) + * Path: + * - Windows: %APPDATA%\legcord\flags.json (typically C:\Users\{username}\AppData\Roaming\legcord\flags.json) + * - macOS: ~/Library/Application Support/legcord/flags.json + * - Linux: ~/.config/legcord/flags.json + * Returns an empty preset if file doesn't exist or is invalid + */ +function loadCustomFlags(): Preset { + // Return cached result to avoid repeated disk reads + if (customFlagsCache !== null) { + return customFlagsCache; + } + + const customPreset: Preset = { + switches: [], + enableFeatures: [], + disableFeatures: [], + }; + + try { + const userDataPath = app.getPath("userData"); + const customFlagsPath = join(userDataPath, "flags.json"); + + try { + const fileContent = readFileSync(customFlagsPath, "utf-8"); + const customFlags = JSON.parse(fileContent); + + // Merge switches + if (Array.isArray(customFlags.switches)) { + customPreset.switches = customFlags.switches; + } + + // Merge enableFeatures + if (Array.isArray(customFlags.enableFeatures)) { + customPreset.enableFeatures = customFlags.enableFeatures; + } + + // Merge disableFeatures + if (Array.isArray(customFlags.disableFeatures)) { + customPreset.disableFeatures = customFlags.disableFeatures; + } + + if (isDev) console.log(`Custom flags loaded from ${customFlagsPath}`); + } catch (fileError) { + if ((fileError as NodeJS.ErrnoException).code === "ENOENT") { + if (isDev) console.log(`Custom flags file not found at ${customFlagsPath}`); + } else if (isDev) { + console.error(`Error reading custom flags file: ${fileError}`); + } + } + } catch (error) { + if (isDev) console.error(`Error loading custom flags: ${error}`); + } + + customFlagsCache = customPreset; + return customPreset; +} + +/** + * Merge a preset with custom flags + * Custom flags will be appended to the preset's arrays + */ +function mergeWithCustomFlags(preset: Preset): Preset { + const customFlags = loadCustomFlags(); + + return { + switches: [...preset.switches, ...customFlags.switches], + enableFeatures: [...preset.enableFeatures, ...customFlags.enableFeatures], + disableFeatures: [...preset.disableFeatures, ...customFlags.disableFeatures], + }; +} + +export function getPreset(): Preset | undefined { // MIT License // Copyright (c) 2022 GooseNest @@ -24,24 +182,36 @@ 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", // 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" - }; + if (getConfig("vaapi")) { + console.log("VAAPI mode enabled"); + mergeWithCustomFlags(vaapi); + } switch (getConfig("performanceMode")) { + case "dynamic": + if (powerMonitor.isOnBatteryPower()) { + console.log("Battery mode enabled"); + return mergeWithCustomFlags(battery); + } else { + console.log("Performance mode enabled"); + return mergeWithCustomFlags(performance); + } case "performance": console.log("Performance mode enabled"); - app.commandLine.appendArgument(presets.performance); - break; + return mergeWithCustomFlags(performance); case "battery": console.log("Battery mode enabled"); - app.commandLine.appendArgument(presets.battery); - break; + return mergeWithCustomFlags(battery); + case "smoothScreenshare": + console.log("Smooth screenshare mode enabled"); + return mergeWithCustomFlags(smoothExperiment); default: console.log("No performance modes set"); } - if (getConfig("windowStyle") == "transparent" && process.platform === "win32") { - transparency = true; - } +} + +/** + * Get the currently applied preset for debugging purposes + */ +export function getCurrentPreset(): Preset | undefined { + return getPreset(); } diff --git a/src/common/keybindActions.ts b/src/common/keybindActions.ts new file mode 100644 index 0000000..6534010 --- /dev/null +++ b/src/common/keybindActions.ts @@ -0,0 +1,136 @@ +import path from "node:path"; +import { app, shell } from "electron"; +import type { Keybind } from "../@types/keybind.js"; +import { mainWindows } from "../discord/window.js"; +import { navigateTo } from "./dom.js"; + +let isAudioEngineEnabled = false; + +export function runAction(keybind: Keybind) { + switch (keybind.action) { + case "mute": + muteToggle(); + break; + case "deafen": + deafenToggle(); + break; + case "pushToTalk": + pushToTalk(); + break; + case "leaveCall": + leaveCall(); + break; + case "navigateBack": + navigateBack(); + break; + case "navigateForward": + navigateForward(); + break; + case "openQuickCss": + openQuickCss(); + break; + case "openSettings": + openSettings(); + break; + case "runJavascript": + if (!keybind.js) break; + runJavascript(keybind.js); + break; + } +} + +function audioEngineCheck() { + if (!isAudioEngineEnabled) { + mainWindows.forEach((window) => { + void window.webContents.executeJavaScript(` + window.shelter.flux.dispatcher.dispatch({"type": "MEDIA_ENGINE_SET_AUDIO_ENABLED","enabled": true,"unmute": true }); + `); + isAudioEngineEnabled = true; + }); + } +} +export function muteToggle() { + console.log("[Keybind action] Mute"); + audioEngineCheck(); + mainWindows.forEach((window) => { + void window.webContents.executeJavaScript(` + window.shelter.flux.dispatcher.dispatch({ + "type": "AUDIO_TOGGLE_SELF_MUTE", + "context": "default", + "syncRemote": true, + "playSoundEffect": true + }) + `); + }); +} + +export function deafenToggle() { + console.log("[Keybind action] Deafen"); + audioEngineCheck(); + mainWindows.forEach((window) => { + void window.webContents.executeJavaScript(` + window.shelter.flux.dispatcher.dispatch({ + "type": "AUDIO_TOGGLE_SELF_DEAF", + "context": "default", + "syncRemote": true + }) + `); + }); +} + +export function leaveCall() { + console.log("[Keybind action] Leave call"); + mainWindows.forEach((window) => { + void window.webContents.executeJavaScript(` + window.shelter.flux.dispatcher.dispatch({ + "type": "VOICE_CHANNEL_SELECT", + "channelId": null, + "currentVoiceChannelId": "", + "video": false, + "stream": false + }) + `); + }); +} + +export function pushToTalk() { + console.log("[Keybind action] Push to talk"); + mainWindows.forEach((window) => { + void window.webContents.executeJavaScript(` + window.shelter.flux.dispatcher.dispatch({ + "type": "PUSH_TO_TALK_STATE_CHANGE", + "isActive": true, + "isPriority": false + }) + `); + }); +} + +function navigateBack() { + mainWindows.forEach((window) => { + window.webContents.navigationHistory.goBack(); + }); +} + +function navigateForward() { + mainWindows.forEach((window) => { + window.webContents.navigationHistory.goForward(); + }); +} + +function openQuickCss() { + void shell.openPath(path.join(app.getPath("userData"), "/quickCss.css")); +} + +function runJavascript(js: string) { + mainWindows.forEach((window) => { + window.webContents.executeJavaScript(js); + }); +} + +export function openSettings() { + // won't load the correct page anyway (will just do /account) cause shelter doesn't hijack discord's routing + mainWindows.forEach((window) => { + navigateTo(window, "/settings/legcord-settings"); + }); +} diff --git a/src/common/lang.ts b/src/common/lang.ts index b222767..d39c80f 100644 --- a/src/common/lang.ts +++ b/src/common/lang.ts @@ -1,7 +1,15 @@ -import {app} from "electron"; -import path from "path"; -import fs from "fs"; -import {i18nStrings} from "../types/i18nStrings"; +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)) { @@ -11,11 +19,21 @@ export function setLang(language: string): void { const parsed = JSON.parse(rawData) as i18nStrings; parsed.lang = language; 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/"); @@ -23,32 +41,102 @@ 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) { + 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[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 ${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"); + const storagePath = path.join(userDataPath, "/storage/"); + const langConfigFile = `${storagePath}lang.json`; + 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`); 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}`); - langPath = path.join(import.meta.dirname, "../", "/assets/lang/en-US.json"); - rawData = fs.readFileSync(langPath, "utf-8"); - parsed = JSON.parse(rawData) as i18nStrings; - return parsed[object]; - } else { - return parsed[object]; + 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]; + } } + + // Update cache + languageCache = parsed; + languageCacheTime = now; + + return parsed; } export function getLangName(): string { - if (language == undefined) { + // 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"); const storagePath = path.join(userDataPath, "/storage/"); @@ -56,12 +144,16 @@ 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) { + if (language.length === 2) { language = `${language}-${language.toUpperCase()}`; } return language; diff --git a/src/common/themes.ts b/src/common/themes.ts new file mode 100644 index 0000000..f776eb5 --- /dev/null +++ b/src/common/themes.ts @@ -0,0 +1,285 @@ +import fs from "node:fs"; +import path from "node:path"; +import { app, type BrowserWindow } from "electron"; +import type { ThemeManifest } from "../@types/themeManifest.js"; +import { mainWindows } from "../discord/window.js"; +import { getConfig } from "./config.js"; + +// Performance optimization: Cache theme manifests to avoid reading on every calll +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) { + const metaReg = /@([^ ]*) (.*)/g; + if (!content.startsWith("/**")) { + throw new Error("Not a manifest."); + } + const manifest: ThemeManifest = { + theme: "src.css", + name: "null", + enabled: false, + }; // Will be defined later + + let match: RegExpExecArray | null; + for (;;) { + match = metaReg.exec(content); + if (match === null) break; + const [, key, value] = match; + if (key === "import") break; + + console.log(key, value); + + switch (key) { + case "name": + manifest.name = value; + break; + + case "description": + manifest.description = value; + break; + + case "version": + manifest.version = value; + break; + + case "author": + manifest.author = value; + break; + + case "invite": + manifest.invite = value; + break; + + case "authorId": + manifest.authorId = value; + break; + + case "authorLink": + manifest.authorLink = value; + break; + + case "updateUrl": + manifest.updateSrc = value; + break; + + case "donate": + manifest.donate = value; + break; + + case "patreon": + manifest.patreon = value; + break; + + case "website": + manifest.website = value; + break; + + case "source": + manifest.source = value; + break; + } + } + + 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)) { + fs.mkdirSync(themesFolder); + console.log("Created missing theme folder"); + } + browserWindow.webContents.on("did-finish-load", () => { + if (getConfig("quickCss")) initQuickCss(browserWindow); // load quick CSS if enabled + 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}`); + installTheme(themePath).then(() => { + fs.unlinkSync(themePath); + }); + } else { + 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)) { + themeFile.enabled = false; + } else { + themeFile.enabled = true; + } + } + if (themeFile.enabled === false) { + console.log(`%cSkipped ${themeFile.name} made by ${themeFile.author}`, "color:red"); + } else { + browserWindow.webContents.send( + "addTheme", + file, + fs.readFileSync(`${themePath}/${themeFile.theme}`, "utf-8"), + ); + console.log(`%cLoaded ${themeFile.name} made by ${themeFile.author}`, "color:red"); + } + } catch (err) { + console.error(err); + } + } + } + }); +} + +export function uninstallTheme(id: string) { + const themePath = path.join(themesFolder, id); + if (fs.existsSync(themePath)) { + fs.rmdirSync(themePath, { recursive: true }); + console.log(`Removed ${id} folder`); + } else if (fs.existsSync(path.join(themesFolder, `${id}-BD`))) { + fs.rmdirSync(path.join(themesFolder, `${id}-BD`), { recursive: true }); + console.log(`Removed ${id} folder`); + } +} + +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; + } + + if (enabled !== manifest.enabled) { + mainWindows.every((passedWindow) => { + if (enabled) { + passedWindow.webContents.send( + "addTheme", + id, + fs.readFileSync(path.join(themesFolder, id, manifest.theme), "utf-8"), + ); + console.log(`[Theme Manager] Loaded ${manifest.name} made by ${manifest.author}`); + } else { + passedWindow.webContents.send("removeTheme", id); + console.log(`[Theme Manager] Removing ${manifest.name} made by ${manifest.author}`); + } + }); + } + 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) { + let code = ""; + let isLinkImport = false; + if (linkOrPath.startsWith("https://") || linkOrPath.startsWith("http://")) { + code = await (await fetch(linkOrPath)).text(); + isLinkImport = true; + } else { + code = fs.readFileSync(linkOrPath, "utf8"); + } + 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`); + } + if (isLinkImport && manifest.updateSrc === undefined) { + manifest.updateSrc = linkOrPath; + } + if (code.includes(".titlebar")) manifest.supportsLegcordTitlebar = true; + else manifest.supportsLegcordTitlebar = false; + fs.writeFileSync(path.join(themePath, "manifest.json"), JSON.stringify(manifest)); + fs.writeFileSync(path.join(themePath, "src.css"), code); +} + +export function initQuickCss(browserWindow: BrowserWindow) { + if (process.argv.includes("--safe-mode")) return; + const quickCssPath = path.join(userDataPath, "/quickCss.css"); + + if (!fs.existsSync(quickCssPath)) { + fs.writeFileSync(quickCssPath, ""); + } + 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) => { + 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); + } + }); +} + +export function disableQuickCss(browserWindow: BrowserWindow) { + // Clean up existing watcher if any + if (quickCssWatcher) { + quickCssWatcher.close(); + quickCssWatcher = null; + } + browserWindow.webContents.send("removeTheme", "legcord-quick-css"); +} diff --git a/src/common/version.ts b/src/common/version.ts index d4e8954..a261367 100644 --- a/src/common/version.ts +++ b/src/common/version.ts @@ -1,4 +1,4 @@ -import {app} from "electron"; +import { app } from "electron"; import isDev from "electron-is-dev"; export function getVersion(): string { diff --git a/src/common/windowState.ts b/src/common/windowState.ts index 9377d98..9ff063b 100644 --- a/src/common/windowState.ts +++ b/src/common/windowState.ts @@ -1,7 +1,13 @@ -import {app} from "electron"; -import path from "path"; -import fs from "fs"; -import {WindowState} from "../types/windowState"; +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(); } -// REVIEW - Similar to getConfig, this seems to return a promise when it has no async. Originally Promise +// 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]; } diff --git a/src/cssEditor/editor.html b/src/cssEditor/editor.html new file mode 100644 index 0000000..246c5f6 --- /dev/null +++ b/src/cssEditor/editor.html @@ -0,0 +1,56 @@ + + + + Legcord Quick CSS Editor + + + + + +
+ + + \ No newline at end of file diff --git a/src/cssEditor/main.ts b/src/cssEditor/main.ts new file mode 100644 index 0000000..c6609cd --- /dev/null +++ b/src/cssEditor/main.ts @@ -0,0 +1,31 @@ +import fs from "node:fs"; +import path from "node:path"; +import { BrowserWindow, ipcMain } from "electron"; + +let cssWindow: BrowserWindow | null = null; + +export function openCssEditor(file: string) { + if (cssWindow?.focus) return cssWindow.focus(); + cssWindow = new BrowserWindow({ + width: 800, + height: 600, + title: `${path.parse(file).base} | CSS Editor`, + webPreferences: { + preload: path.join(import.meta.dirname, "cssEditor", "preload.mjs"), + }, + }); + cssWindow.loadURL(`file://${import.meta.dirname}/html/editor.html`); + + ipcMain.on("editor-setCSS", (_event, css: string) => { + fs.writeFileSync(file, css); + }); + + ipcMain.on("editor-getCSS", (event) => { + event.returnValue = fs.readFileSync(file, "utf-8"); + }); + cssWindow.on("closed", () => { + ipcMain.removeAllListeners("editor-setCSS"); + ipcMain.removeAllListeners("editor-getCSS"); + cssWindow = null; + }); +} diff --git a/src/cssEditor/preload.mts b/src/cssEditor/preload.mts new file mode 100644 index 0000000..58ea998 --- /dev/null +++ b/src/cssEditor/preload.mts @@ -0,0 +1,7 @@ +const { contextBridge, ipcRenderer } = require("electron"); + +console.log("Hello from preload.mts"); +contextBridge.exposeInMainWorld("cssEditor", { + get: ipcRenderer.sendSync("editor-getCSS") as string, + set: (css: string) => ipcRenderer.send("editor-setCSS", css), +}); diff --git a/src/discord/content/css/discord.css b/src/discord/content/css/discord.css deleted file mode 100644 index cf60085..0000000 --- a/src/discord/content/css/discord.css +++ /dev/null @@ -1,46 +0,0 @@ -[customTitlebar] .base-2jDfDU { - border-top-left-radius: 8px; -} -[customTitlebar] .scroller-3X7KbA { - padding: 0; - padding-top: 4px; -} -[customTitlebar] .backdrop-2ByYRN { - top: -30px; - padding-top: 30px; -} -* { - outline: none; -} -[class^="socialLinks-"] + [class^="info-"] { - padding-right: 0; -} -#ac-ver { - text-transform: none; - cursor: pointer; - color: var(--text-muted); -} -#ac-ver:hover { - text-decoration: underline; - color: var(--text-normal); -} - -[data-list-item-id="guildsnav___app-download-button"] { - 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; -} -.container-3jbRo5.info-1hMolH.browserNotice-1u-Y5o:after { - content: "You can modify global keybinds using the keybind maker on the left sidebar"; - visibility: visible; -} diff --git a/src/discord/content/css/inAppSettings.css b/src/discord/content/css/inAppSettings.css deleted file mode 100644 index aafb592..0000000 --- a/src/discord/content/css/inAppSettings.css +++ /dev/null @@ -1,92 +0,0 @@ -/* The Modal (background) */ -.ACsettings-modal { - display: none; - /* Hidden by default */ - position: fixed; - /* Stay in place */ - z-index: 9999; - /* Sit on top */ - padding-top: 100px; - /* Location of the box */ - background-color: var(--background-secondary); - left: 0; - top: 0; - width: 100%; - /* Full width */ - height: 100%; - /* Full height */ - overflow: auto; - /* Enable scroll if needed */ - background-color: rgb(0, 0, 0); - /* Fallback color */ - background-color: rgba(0, 0, 0, 0.4); - /* Black w/ opacity */ -} - -/* Modal Content */ -.ACsettings-modal-content { - position: relative; - margin: auto; - padding: 1rem; - background-color: var(--background-secondary); - border-color: var(--background-floating); - border-style: solid; - border-radius: 10px; - width: 80%; - height: 80%; - box-shadow: - 0 4px 8px 0 rgba(0, 0, 0, 0.2), - 0 6px 20px 0 rgba(0, 0, 0, 0.19); - -webkit-animation-name: animatetop; - -webkit-animation-duration: 0.4s; - animation-name: animatetop; - animation-duration: 0.4s; -} -webview#inAppSettings { - height: 100%; -} -/* Add Animation */ -@-webkit-keyframes animatetop { - from { - top: -300px; - opacity: 0; - } - - to { - top: 0; - opacity: 1; - } -} - -@keyframes animatetop { - from { - top: -300px; - opacity: 0; - } - - to { - top: 0; - opacity: 1; - } -} - -/* The Close Button */ -.close { - color: white; - float: right; - font-size: 28px; - font-weight: bold; - position: absolute; - right: 5%; - top: 5%; - border-radius: 10px; - background: black; - padding: 10px 15px; -} - -.close:hover, -.close:focus { - color: red; - text-decoration: none; - cursor: pointer; -} diff --git a/src/discord/content/css/logos.css b/src/discord/content/css/logos.css deleted file mode 100644 index bccaf2b..0000000 --- a/src/discord/content/css/logos.css +++ /dev/null @@ -1,5 +0,0 @@ -:root { - --wordmark-svg: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDk2IDE0IiB3aWR0aD0iOTYiIGhlaWdodD0iMTQiPjxzdHlsZT4uYXtmaWxsOiM3Mjc2N2R9PC9zdHlsZT48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsYXNzPSJhIiBkPSJtMTUuNiAxMy44aC0zLjdsLTEuMS0yLjdoLTYuMWwtMS4xIDIuN2gtMy42bDUuNi0xMy43aDMuOXptLTgtMTAuNWwtMiA1LjRoNC4yem0xNC45LTMuM2MxLjMgMCAyLjUgMCAzLjYgMC42IDAuOCAwLjUgMS44IDEuNyAxLjggMy4zIDAgMi4zLTEuNyAzLjEtMi4zIDMuNCAxIDAuNSAxLjYgMS45IDEuOSAyLjYgMC40IDAuNyAxIDIgMS40IDIuOGwwLjQgMWgtMy43Yy0wLjMtMC42LTEuNS0zLjMtMS44LTMuOS0wLjktMS43LTEuNi0xLjctMi42LTEuN2gtMC41djUuNmgtMy41di0xMy43em0tMS44IDIuNXYzLjFoMS41YzAuOCAwIDEuMSAwIDEuNC0wLjIgMC41LTAuMyAwLjgtMC44IDAuOC0xLjQgMC0xLjUtMS42LTEuNS0xLjktMS41em0yNSAxMS4yaC0zLjV2LTguNGwtMy43IDQuNGgtMC41bC0zLjYtNC40djguNGgtMy41di0xMy43aDNsNC40IDUuMiA0LjQtNS4yaDN6bTguOS0xMy45YzAuNiAwLjEgMS4zIDAuMiAxLjcgMC4zIDAuMyAwLjEgMC45IDAuNSAxLjIgMC43IDAuNCAwLjMgMC45IDAuOSAxLjIgMS4zIDAuMyAwLjQgMC41IDAuOCAwLjQgMC44IDAgMC4xLTAuNiAwLjQtMi43IDEuMmwtMC40LTAuM2MtMC4yLTAuMi0wLjUtMC41LTAuNy0wLjUtMC4yLTAuMS0wLjctMC4yLTEtMC4yLTAuMyAwLTAuOCAwLjEtMSAwLjMtMC4zIDAuMS0wLjYgMC4zLTAuNyAwLjUtMC4xIDAuMy0wLjEgMS0wLjEgMi45IDAgMi40IDAgMi42IDAuMiAyLjkgMC4xIDAuMiAwLjQgMC41IDAuNiAwLjYgMC4yIDAuMSAwLjcgMC4yIDEgMC4yIDAuMyAwIDAuNy0wLjEgMS0wLjMgMC4yLTAuMSAwLjUtMC4zIDAuNi0wLjUgMC4xLTAuMiAwLjMtMC40IDAuNC0wLjQgMCAwIDAuNyAwLjMgMS41IDAuNyAwLjcgMC40IDEuNCAwLjcgMS40IDAuOCAwIDAtMC4xIDAuMy0wLjMgMC41LTAuMSAwLjItMC40IDAuNi0wLjcgMC45LTAuMyAwLjMtMSAwLjctMS40IDEtMC40IDAuMi0xLjEgMC40LTEuNSAwLjUtMC40IDAuMS0xLjEgMC4xLTEuNSAwLjEtMC41LTAuMS0xLjMtMC4yLTEuNy0wLjQtMC40LTAuMS0xLTAuNS0xLjQtMC43LTAuMy0wLjItMC43LTAuNy0wLjktMS0wLjMtMC4zLTAuNS0wLjgtMC42LTEuMi0wLjItMC40LTAuMi0xLjQtMC4yLTMuOCAwLTIuOCAwLTMuMyAwLjItMy44IDAuMi0wLjQgMC41LTEgMC45LTEuNCAwLjQtMC40IDAuOC0wLjggMS40LTEgMC41LTAuMyAxLjItMC41IDEuNS0wLjYgMC4zLTAuMSAxLTAuMSAxLjYtMC4xem0xMS40IDBjMC44IDAuMSAxLjQgMC4yIDIgMC40IDAuNCAwLjEgMS4xIDAuNCAxLjQgMC43IDAuNCAwLjIgMC45IDAuNiAxLjEgMC45IDAuMiAwLjMgMC41IDAuOSAwLjYgMS4yIDAuMiAwLjUgMC4yIDEuMSAwLjIgMy44IDAgMi43IDAgMy4zLTAuMiAzLjgtMC4xIDAuMy0wLjQgMC44LTAuNiAxLjItMC4yIDAuMy0wLjcgMC43LTEuMSAxLTAuMyAwLjItMSAwLjUtMS40IDAuNy0wLjUgMC4xLTEuMiAwLjItMS44IDAuMy0wLjUgMC0xLjMgMC0xLjgtMC4xLTAuNC0wLjEtMS4yLTAuMy0xLjYtMC41LTAuNC0wLjItMS0wLjYtMS40LTAuOS0wLjMtMC40LTAuNy0wLjktMS4zLTIuMnYtMy4xYy0wLjEtMi44LTAuMS0zLjEgMC4yLTMuOSAwLjItMC42IDAuNC0xIDAuOC0xLjUgMC40LTAuMyAxLTAuOCAxLjQtMS4xIDAuNS0wLjIgMS4yLTAuNSAxLjYtMC41IDAuNC0wLjEgMS4yLTAuMiAxLjktMC4yem0tMiAzLjlsLTAuNCAwLjN2NS42YzAuNyAwLjYgMS4xIDAuOCAxLjUgMC45IDAuNCAwLjEgMC44IDAuMSAxLjMgMCAwLjUtMC4yIDAuOC0wLjMgMS4xLTAuNmwwLjQtMC40YzAtNS40IDAtNS40LTAuNC01LjdxLTAuMy0wLjQtMC45LTAuNmMtMC40LTAuMS0wLjgtMC4yLTEtMC4yLTAuMSAwLTAuNSAwLjEtMC44IDAuMi0wLjMgMC4xLTAuNiAwLjMtMC44IDAuNXptMjEuNC0zLjhoMy4xYzIuNSAwIDMuMiAwIDMuOSAwLjIgMC41IDAuMiAxLjEgMC40IDEuNiAwLjcgMC40IDAuMyAwLjkgMC44IDEuMSAxLjIgMC4zIDAuMyAwLjUgMC44IDAuNiAxIDAuMSAwLjMgMC4yIDEuNyAwLjIgMy4yIDAgMS45IDAgMy4xLTAuMSAzLjctMC4xIDAuNS0wLjMgMS4xLTAuNCAxLjMtMC4xIDAuMy0wLjUgMC43LTAuOCAxLTAuMiAwLjMtMC44IDAuNy0xLjIgMC45LTAuNCAwLjItMS4xIDAuNC0xLjYgMC41LTAuNCAwLTIuMSAwLjEtNi40IDAuMXYtMy40aDIuNmMxLjUgMCAyLjkgMCAzLjEtMC4xIDAuMy0wLjEgMC43LTAuMiAwLjgtMC40IDAuNC0wLjMgMC40LTAuNCAwLjQtMi45IDAtMiAwLTIuNi0wLjItMi45LTAuMS0wLjItMC4zLTAuNS0wLjUtMC42LTAuMy0wLjEtMC44LTAuMS0yLjYtMC4xdjIuNWMwIDEuNS0wLjEgMi43LTAuMSAyLjctMC4xIDAuMS0wLjktMC43LTMuNS0zLjN6bS0xMi4zIDAuMWw3LjIgMC4xIDAuOCAwLjNjMC40IDAuMiAwLjkgMC42IDEuMiAwLjggMC4zIDAuMyAwLjYgMC43IDAuOCAxIDAuMSAwLjQgMC4zIDAuOSAwLjQgMS4zIDAuMSAwLjMgMC4xIDAuOSAwLjEgMS4yIDAgMC4zIDAgMC44LTAuMSAxLjItMC4xIDAuMy0wLjMgMC45LTAuNCAxLjItMC4yIDAuMy0wLjUgMC43LTAuNyAxLTAuMyAwLjItMC42IDAuNS0wLjkgMC42LTAuMiAwLjEtMC40IDAuMi0wLjQgMC4zIDAgMCAwLjggMSAxLjcgMi4yIDAuOSAxLjEgMS43IDIuMSAxLjcgMi4yIDAuMiAwLjEtMC4yIDAuMi00LjMgMC4xbC0xLjUtMmMtMS4xLTEuNS0xLjYtMi4xLTEuOC0yLjEtMC4yLTAuMS0wLjItMC4xLTAuMiA0LjFoLTMuNnptMy42IDYuM2MxLjkgMCAyLjQtMC4xIDIuNy0wLjIgMC4yLTAuMSAwLjUtMC40IDAuNi0wLjZxMC4yLTAuNCAwLjEtMC45YzAtMC4zLTAuMi0wLjYtMC4zLTAuNy0wLjEtMC4yLTAuNC0wLjQtMC42LTAuNC0wLjMtMC4xLTAuOS0wLjItMS41LTAuMmgtMXoiLz48L3N2Zz4="); - --logo-svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1977 596' width='1977' height='596'%3E%3Ctitle%3Earmcord_full_logo-svg%3C/title%3E%3Cstyle%3E .s0 %7B fill: %232c2f33 %7D .s1 %7B fill: %2395a7b3 %7D .s2 %7B fill: %237289da;stroke: %232c2f33;stroke-width: 17;stroke-dasharray: 0 %7D .s3 %7B fill: %2399aab5 %7D .s4 %7B fill: %232c2f33;stroke: %232c2f33;stroke-width: 3.5;stroke-dasharray: 0 %7D .s5 %7B fill: %237289da %7D %3C/style%3E%3Cg id='Arm + Cord'%3E%3Cpath id='Path 0' class='s0' d='m821 0.6c1.9 0.2 10.5 0.8 19 1.4c8.5 0.7 15.9 1.4 16.5 1.8c0.5 0.3 4.8 0.9 9.5 1.3c4.7 0.4 11.4 1.4 15 2.2c3.6 0.8 9.9 2.2 14 3c4.1 0.9 11.5 3 16.5 4.7c4.9 1.7 11.2 4.2 14 5.5c2.7 1.2 7.5 3.4 10.5 4.8c3 1.4 8.4 4.3 12 6.3c3.6 2 10.3 6.2 15 9.3c4.7 3.1 11.9 8.3 16 11.5c4.1 3.3 9.7 8 12.5 10.5c2.8 2.4 10.1 9.7 16.4 16c6.2 6.4 14.8 15.8 19 20.9c4.2 5.1 10.6 13.7 14.4 19c3.7 5.3 10.2 15.3 14.5 22.2c4.3 6.9 10.8 18.6 14.4 26c3.6 7.4 7.7 16.2 9.1 19.5c1.4 3.3 4.1 10 6.1 15c1.9 4.9 3.5 9.4 3.6 10c0 0.5 1.1 4.4 2.5 8.5c1.3 4.1 3.1 10.6 3.9 14.5c0.8 3.8 2.2 9.9 3.1 13.5c0.9 3.6 2.1 10.5 2.6 15.5c0.5 4.9 1.3 16.4 1.7 25.5c0.4 9.1 0.4 19.4 0 23c-0.4 3.6-1 9.4-1.4 13c-0.3 3.6-1.5 10.1-2.6 14.5c-1.1 4.4-2.4 9.6-2.8 11.5c-0.5 1.9-2.5 7.8-4.5 13c-2 5.2-5.7 13.3-8.2 18c-2.6 4.7-5.3 9.8-6.1 11.5c-0.8 1.6-4.9 7.7-9.1 13.5c-4.1 5.8-10 13.2-13.1 16.5c-3 3.3-8.4 8.9-12 12.5c-3.6 3.6-9.8 9.5-13.8 13c-4.1 3.6-8.1 6.9-9 7.4c-1 0.5-1.9 1.2-2.2 1.5c-0.3 0.4-3.7 2.9-7.5 5.7c-3.9 2.9-11.7 8-17.5 11.6c-5.8 3.5-17 9.6-25 13.6c-8 3.9-18.3 8.7-23 10.6c-4.7 1.9-14.1 5.2-21 7.4c-6.9 2.2-15.4 4.7-19 5.5c-3.6 0.9-7.9 1.8-9.5 2.1c-1.7 0.4-6.6 1.3-11 2.1c-4.4 0.9-13.4 2-20 2.6c-7 0.6-19.7 0.8-30.5 0.4c-16.6-0.6-19.9-1-32.5-4.2c-9.1-2.3-15.9-4.6-19.3-6.6c-2.9-1.8-6.4-4.6-7.6-6.2c-1.3-1.7-3.1-5.9-4-9.5c-1.5-5.8-1.6-7.1-0.3-11.5c0.8-2.7 2.2-6.3 3.3-8c1-1.6 3-4 4.4-5.2c1.4-1.2 4.5-3.2 7-4.4c3-1.5 6.3-2.1 10-2.1c3 0 6.8 0.6 8.5 1.2c1.6 0.6 6.8 2 11.5 3.1c6.6 1.6 12.4 2 26 2.2c11.8 0.1 21.4-0.4 29.5-1.6c6.6-0.9 16.3-2.8 21.5-4.1c5.2-1.3 13.8-3.9 19-5.6c5.2-1.8 13.3-4.8 18-6.7c4.7-1.9 13.2-5.9 19-8.7c5.8-2.9 14.3-7.7 19-10.6c4.7-2.9 11.6-7.6 15.5-10.4c3.8-2.7 10.1-7.8 14-11.1c3.8-3.4 10-9.3 13.7-13.1c3.6-3.8 7.8-8.5 9.3-10.4c1.5-1.9 4.6-6.2 7-9.5c2.5-3.3 6.7-10.1 9.4-15c2.7-5 6.3-12.6 8-17c1.6-4.4 4.2-13.6 5.5-20.5c2.1-10.1 2.6-15.4 2.6-27.5c0-8.3-0.4-17.5-1-20.5c-0.5-3-1.7-9.8-2.6-15c-0.9-5.2-2.5-12.7-3.6-16.5c-1-3.9-2.6-9.4-3.4-12.3c-0.8-2.8-3.5-10.5-6-17c-2.5-6.4-7.1-16.9-10.2-23.2c-3.1-6.3-8.2-15.8-11.2-21c-3.1-5.2-8.3-13.3-11.5-18c-3.2-4.7-10-13.7-15-20c-5.1-6.3-14.6-16.7-21.1-23c-6.6-6.4-13.7-12.9-15.9-14.5c-2.2-1.7-4.2-3.2-4.5-3.5c-0.3-0.3-3-2.4-6-4.5c-3-2.2-9.3-6.3-14-9c-4.7-2.8-10.1-5.8-12-6.7c-1.9-0.9-6.2-2.8-9.5-4.3c-3.3-1.4-10.1-3.9-15-5.5c-5-1.6-14.4-4.1-21-5.4c-6.6-1.4-18.1-3.1-25.5-3.7c-8.5-0.7-21.1-0.9-34-0.4c-11.3 0.3-23.4 1-27 1.5c-3.6 0.5-11.5 1.6-17.5 2.5c-6.1 0.8-13 2-15.5 2.4c-2.5 0.5-7.9 1.7-12 2.6c-4.1 0.9-9.3 2-11.5 2.4c-2.2 0.4-7.2 1.7-11 2.8c-3.9 1.2-9.5 2.7-12.5 3.3c-3 0.7-7.3 1.8-9.5 2.5c-2.2 0.7-10.1 3.2-17.5 5.5c-7.4 2.3-16.7 5.4-20.5 6.7c-3.9 1.4-10.8 4-15.5 5.8c-4.7 1.8-14.6 5.6-22 8.5c-7.4 2.9-15.8 6.3-18.5 7.6c-2.8 1.2-9.7 4.3-15.5 6.7c-5.8 2.5-14.8 6.5-20 9c-5.2 2.4-15.1 7.2-22 10.5c-6.9 3.3-14.8 6.9-17.5 8c-2.8 1.1-7.3 3-10 4.2c-2.8 1.2-6.4 2.8-8 3.6c-1.7 0.7-5.3 2.3-8 3.4c-2.8 1.2-7.9 3.2-11.5 4.5c-3.6 1.3-11.7 4.1-18 6.4c-6.3 2.3-14 4.8-17 5.7c-3 0.8-9.3 2.6-14 3.9c-4.7 1.3-11 3.1-14 4c-3 1-6.9 1.9-8.5 2.2c-1.7 0.2-7.5 1.5-13 2.8c-5.5 1.3-15.4 3.5-22 4.9c-6.6 1.4-18.5 3.5-26.5 4.6c-8 1.2-20.1 2.8-27 3.6c-6.9 0.8-17.2 1.9-23 2.4c-5.8 0.5-19.1 1.7-29.5 2.6c-14.4 1.3-33.9 1.8-80.5 2.2c-41 0.2-67.2 0-78.5-0.8c-9.4-0.6-21.1-1.6-26-2.2c-5-0.5-14.2-1.3-20.5-1.8c-6.3-0.5-16.2-1.5-22-2.4c-5.8-0.8-14.1-2-18.5-2.6c-4.4-0.6-9.8-2-12-3c-2.2-1-5.5-3.2-7.3-4.9c-1.7-1.7-4.1-4.9-5.2-7.1c-1.4-2.8-2-6-2-10.5c0-4.1 0.7-8.1 1.8-10.8c1-2.3 3.3-5.7 5-7.5c1.8-1.7 5.1-4.2 7.4-5.5c3.3-1.7 5.9-2.2 11.3-2.1c3.8 0 9.7 0.5 13 1.2c3.3 0.6 11.8 1.8 19 2.6c7.1 0.8 17 2 22 2.5c4.9 0.6 24.5 1.8 43.5 2.7c26.4 1.2 44.7 1.5 78 1c23.9-0.4 53.8-1.3 66.5-2.1c12.6-0.8 29.3-2.1 37-2.9c7.7-0.8 17.1-1.9 21-2.5c3.8-0.6 10.8-1.7 15.5-2.6c4.7-0.9 12.1-2 16.5-2.5c4.4-0.5 10.7-1.7 14-2.6c3.3-0.9 8.5-2 11.5-2.5c3-0.4 8.2-1.5 11.5-2.3c3.3-0.8 10.9-2.8 17-4.5c6-1.6 14.8-4.1 19.5-5.4c4.7-1.4 15.5-4.9 24-8c8.5-3 18.4-6.7 22-8.2c3.6-1.5 7.8-3.3 9.5-4c1.6-0.7 10.2-4.5 19-8.5c8.8-4 20-9.2 25-11.5c4.9-2.3 12.1-5.7 16-7.5c3.8-1.7 14.4-6.3 23.5-10.2c9.1-3.8 19-8 22-9.2c3-1.3 8.9-3.6 13-5.1c4.1-1.5 10.6-4 14.5-5.5c3.8-1.6 14.4-5.3 23.5-8.3c9.1-3 21-6.8 26.5-8.5c5.5-1.8 13.6-4.1 18-5.2c4.4-1.2 13.2-3.4 19.5-5c6.3-1.6 16.9-3.9 23.5-5.1c6.6-1.2 15.1-2.8 19-3.6c3.8-0.7 11-1.8 16-2.3c4.9-0.5 13.3-1.3 18.5-1.9c5.2-0.6 14.7-1.5 21-2c6.3-0.5 13.1-0.7 15-0.5z' /%3E%3Cpath id='ARM' fill-rule='evenodd' class='s1' d='m410.9 428h-71.9l-22.1-53.1h-119.9l-20.1 53.1h-70.8l108.2-268.3h77.4zm-156.9-203.7l-39.3 103.8h82.6zm291-64.5c24.4 0 48.8 0 70.5 13.4c14.1 9.4 35 31.5 35 63.3c0 44.9-34.7 60.6-46.1 66.1c19.3 9.4 32.7 36.6 38.6 50.4c7.5 15.3 18.9 40.5 25.9 55.8l9.1 19.3h-73.6c-5.9-11.8-29.1-64.9-34.6-75.5c-18.1-33.9-31.4-33.9-50.3-33.9h-9.9v109.4h-67.6v-268.3zm-35.4 48.8v61.4h27.9c17.3-0.8 21.7-0.8 28.7-4.8c9.9-5.1 14.6-14.9 14.6-25.9c0-30.7-29.9-30.7-37.4-30.7zm488.5 219.5h-67.6v-164l-72 86.5h-9.8l-72-86.5v164h-67.7v-268.3h59.4l85 101.9l86.1-101.9h58.6z' /%3E%3Cpath id='Path 0' class='s0' d='m1051.7 321.8c0.8 0.4 5.7 6.5 10.7 13.7c5 7.1 10.7 15.6 12.6 19c2 3.3 5.5 8.5 7.8 11.5c2.3 3 4.1 6.4 4.1 7.5c0 1.1-1.8 5.4-4.1 9.5c-2.3 4.1-4.8 8.8-5.6 10.5c-0.8 1.6-4.9 7.7-9.1 13.5c-4.1 5.8-10 13.2-13.1 16.5c-3 3.3-8.4 8.9-12 12.5c-3.6 3.6-9.8 9.5-13.8 13c-4.1 3.6-8.1 6.9-9 7.4c-1 0.5-1.9 1.2-2.2 1.5c-0.3 0.4-3.7 2.9-7.5 5.7c-3.9 2.9-11.7 8-17.5 11.6c-5.8 3.5-17 9.6-25 13.6c-8 3.9-18.3 8.7-23 10.6c-4.7 1.9-14.1 5.2-21 7.4c-6.9 2.2-15.4 4.7-19 5.5c-3.6 0.9-7.9 1.8-9.5 2.1c-1.7 0.4-6.6 1.3-11 2.1c-4.4 0.9-13.4 2-20 2.6c-7 0.6-19.7 0.8-30.5 0.4c-16.6-0.6-19.9-1-32.5-4.2c-9.1-2.3-15.9-4.6-19.3-6.6c-2.9-1.8-6.4-4.6-7.6-6.2c-1.3-1.7-3.1-5.9-4-9.5c-1.5-5.8-1.6-7.1-0.3-11.5c0.8-2.8 2.2-6.3 3.3-8c1-1.6 3-4 4.4-5.2c1.4-1.2 4.5-3.2 7-4.4c3-1.5 6.3-2.1 10-2.1c3 0 6.8 0.6 8.5 1.2c1.6 0.6 6.8 2 11.5 3.1c6.6 1.6 12.4 2 26 2.2c11.8 0.1 21.4-0.4 29.5-1.6c6.6-0.9 16.3-2.8 21.5-4.1c5.2-1.3 13.8-3.9 19-5.6c5.2-1.8 13.3-4.8 18-6.7c4.7-1.9 13.2-5.9 19-8.7c5.8-2.9 14.3-7.7 19-10.6c4.7-2.9 11.6-7.6 15.5-10.4c3.8-2.7 10.1-7.8 14-11.1c3.8-3.4 10-9.3 13.7-13.1c3.6-3.8 7.8-8.5 9.3-10.4c1.5-1.9 4.6-6.2 7-9.5c2.5-3.3 6.7-10.1 9.4-15c2.7-5 6.3-12.6 7.9-17c1.7-4.4 3.8-11.5 4.7-15.7c1.3-6.3 1.8-7.6 3.2-7z' /%3E%3Cg id='Plug'%3E%3Cpath id='Layer' class='s2' d='m647.6 329l63.5 22.6l15.9-36.7l55.2 19c58.9 20.3 92.8 79.8 80.1 139.7l-15.5 41.3c-31.2 56.7-101.4 82.8-163.1 57.4l-57.8-23.8l17.9-41.2l-65.5-26.2c-10.6-4.2-15.1-16.5-10.1-27.3c4.9-10.8 17.4-16.2 28-12l65 25.2l33.6-77.8l-64-23.5c-10.5-3.8-15.1-15.1-10.4-25.2c4.7-10 16.7-15.2 27.2-11.5z' /%3E%3Cpath id='Layer' class='s3' d='m639.7 334.2c1.6 0 17.5 5 35.3 11.3c17.8 6.2 32.5 11.3 32.7 11.4c0.2 0.1-0.8 5.4-2.2 11.8c-1.4 6.4-3.2 12.6-4.1 13.7c-1.2 1.7-7.7-0.3-36-10.6c-23.9-8.7-35.4-13.6-37.2-15.9c-1.4-1.8-2.6-5.1-2.6-7.3c0.1-2.3 0.8-5.4 1.6-7c0.8-1.6 3.3-3.9 5.5-5.1c2.2-1.2 5.4-2.2 7-2.3zm-52.2 113.3c3.1-0.1 18.9 5.2 39.7 13.2c19 7.3 34.7 13.6 34.9 14c0.2 0.4-3.3 6.5-15.9 26.4l-34.1-13.5c-23.2-9.2-35-14.6-36.8-16.9c-1.5-1.9-2.6-5.2-2.6-7.4c0-2.3 0.8-5.6 1.7-7.4c0.9-1.8 3.1-4.4 4.8-5.8c1.7-1.4 5.5-2.6 8.3-2.6z' /%3E%3Cpath id='Line' class='s4' d='m710.5 346.9l8.5 4.1l-19.8 45.8l-8.5-4.5z' /%3E%3Cpath id='Line' class='s4' d='m658.5 466.9l8.5 4.1l-19.8 45.8l-8.5-4.5z' /%3E%3C/g%3E%3C/g%3E%3Cpath id='Path 0' fill-rule='evenodd' class='s5' d='m1171 158.6c12.4 0.5 25.3 2.6 32.7 5.4c6.6 2.5 17.9 8.9 25.1 14.2c7.4 5.5 17.1 15.9 22.5 24.2c5.2 8 9 15.6 8.5 16.9c-0.5 1.4-12.8 7.1-53.7 23.2l-7.3-7.2c-4-3.9-10.5-8.4-14.5-10c-4-1.5-12.4-2.6-18.8-2.5c-6.3 0.1-15.4 2.1-20.3 4.4c-4.8 2.3-10.3 7.2-12.1 10.9c-2.4 4.9-3.3 19.5-3.4 56.9c0 46.8 0.3 50.7 4.9 56.9c2.7 3.6 8.2 8.3 12.2 10.3c4 2 12.1 3.6 18.1 3.6c6 0 15-1.9 19.9-4.2c4.9-2.4 10.7-7.3 12.7-10.9c2.1-3.7 4.8-6.6 6.2-6.6c1.3 0 14.7 5.7 29.7 12.7c15 6.9 27.3 13.7 27.2 15c0 1.4-2.1 5.7-4.5 9.7c-2.4 4-9.3 12.2-15.2 18.2c-5.9 6-17.8 14.4-26.4 18.8c-8.6 4.3-21.7 9.1-29 10.6c-7.3 1.5-21 2.1-30.3 1.3c-9.3-0.7-23.8-3.8-32.2-6.9c-8.5-3.1-20.4-9.5-26.6-14.1c-6.1-4.7-14.8-13.4-19.3-19.4c-4.5-6-9.7-16.3-11.7-23c-2.6-9.1-3.4-27.5-3.4-74.4c0-55.7 0.5-63.7 4.7-75.1c2.6-7.1 9.9-18.5 16.3-25.7c8-8.8 17.1-15.6 28.7-21.2c9.3-4.5 21.8-9.3 27.8-10.5c6-1.3 20.2-1.9 31.5-1.5zm222.7-0.1c15.7 0.6 28 2.6 38.8 6.3c8.6 3 21.4 9.1 28.4 13.6c7 4.6 16.3 13.2 20.6 19.3c4.3 6 9.7 16.1 12 22.3c3.5 9.7 4.1 21.1 4.1 74.4c0 53.3-0.6 64.7-4.1 74.3c-2.3 6.3-7.7 16.3-12 22.4c-4.3 6.1-13.6 14.9-20.6 19.5c-7 4.7-19.8 10.8-28.4 13.6c-8.7 2.7-23.9 5.5-33.9 6.3c-10 0.7-25.8 0-35.1-1.5c-9.4-1.6-23.8-6-32.1-10c-8.3-4-20.3-12-26.7-17.8c-7.1-6.5-14.2-16.5-26-41.5l-0.7-60.5c-0.7-55.3-0.3-61.9 4.2-76.9c3.8-12.4 7.8-19.3 16.7-29c6.6-7.1 18.6-16.3 27.3-20.9c8.5-4.6 22-9.7 30-11.5c8.6-1.9 24-2.9 37.5-2.4zm-39.3 74.7l-6.7 6.7v109c12.8 11.9 20.3 15.7 27.9 17.3c9.2 2 15.3 1.9 25.4-0.5c9.4-2.2 15.6-5.5 21.2-11.2l7.8-8.1c0-104 0-104.1-6-111.3c-4-4.8-10.5-8.6-18.8-10.9c-7-2.1-15.4-3.6-18.7-3.4c-3.4 0.1-10.4 1.4-15.8 2.9c-5.3 1.5-12.7 5.8-16.3 9.5zm417-73.2h60.6c49 0 63.6 0.8 76.8 4.1c10 2.6 22 8 30.9 14c8.7 5.8 17.7 14.6 22.5 21.9c4.4 6.6 9.2 15.9 10.6 20.5c1.5 4.7 3.2 33 3.8 63c0.9 36.9 0.3 59.9-1.7 71.4c-1.6 9.3-5 21-7.6 26c-2.5 5-9.2 13.7-14.9 19.3c-5.6 5.6-16.8 13.1-24.8 16.8c-8 3.7-21.6 7.8-30.3 9.2c-8.6 1.4-40.5 2.5-125.9 2.5v-65.3l51.5-0.1c28.3 0 55.8-1.1 61.1-2.3c5.3-1.3 12.4-5.1 15.8-8.5c6-6.1 6-6.5 6.6-55.8c0.5-40.1-0.1-50.9-3-56.8c-2-4-6.9-8.9-10.9-10.9c-4.8-2.4-14.5-3.6-50.9-3.6l0.1 50.2c0.1 27.7-0.8 51.1-1.8 52.2c-1 1-16.9-13.2-68.5-64.9zm-239.4 2.2l141.4 1.4l14.5 6.8c8 3.8 18.7 10.8 23.8 15.8c5.1 4.9 11.8 13.8 14.8 19.8c3.1 6 6.8 16.6 8.3 23.6c1.5 7 2.7 17.6 2.7 23.6c0 6-1.2 16.6-2.7 23.6c-1.5 7-5 17.6-7.8 23.6c-2.9 6-9.1 14.7-13.8 19.4c-4.8 4.6-12.2 10.1-16.5 12.1c-4.3 2-7.7 4.5-7.7 5.5c0.1 0.9 14.4 20 32 42.3c17.5 22.3 33 42 34.5 43.7c2.1 2.5-5.6 3.1-84.6 2.7l-29.2-40.4c-20.8-28.9-30.7-40.7-34.5-41.1c-5.2-0.6-5.3-0.3-5.3 81.7h-70.2zm70 121.3c38.6 0 48.3-1.1 53.2-3.6c4-2 9.1-7.2 11.2-11.5c2.7-5.4 3.5-10.9 2.5-17.5c-0.8-5.4-3.4-11.8-5.8-14.3c-2.3-2.5-7.8-6-12.1-7.9c-4.6-1.9-16.5-3.3-28.5-3.3h-20.5z' /%3E%3C/svg%3E"); - --discord-wordmark-svg: url("data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDk5IDE5IiB3aWR0aD0iOTkiIGhlaWdodD0iMTkiPgoJPHRpdGxlPmEtc3ZnPC90aXRsZT4KCTxzdHlsZT4KCQkuczAgeyBmaWxsOiAjNzI3NjdkIH0gCgk8L3N0eWxlPgoJPHBhdGggaWQ9IkRpc2NvcmQiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xhc3M9InMwIiBkPSJtMC45IDBjMi4xIDAgNy4zIDAgNy42IDAgMC4yIDAgMC42IDAgMC44IDAuMSAwLjIgMCAwLjYgMC4yIDAuOSAwLjIgMC4yIDAuMSAwLjUgMC4yIDAuNiAwLjIgMC4xIDAgMC41IDAuMyAwLjcgMC4zIDAuMiAwLjIgMC41IDAuMyAwLjYgMC40IDAuMiAwLjIgMC40IDAuNCAwLjcgMC42IDAuMSAwLjEgMC40IDAuNCAwLjUgMC41IDAuMSAwLjIgMC4zIDAuNCAwLjQgMC42IDAgMC4xIDAuMSAwLjQgMC4yIDAuNSAwIDAuMiAwLjIgMC40IDAuMyAwLjYgMCAwLjEgMC4xIDAuNCAwLjEgMC41IDAgMC4zIDAuMiAwLjYgMC4yIDAuOSAwIDAuNCAwIDEuMSAwIDQuMSAwIDIuOSAwIDMuNyAwIDQgMCAwLjEtMC4yIDAuNS0wLjIgMC43IDAgMC4xLTAuMSAwLjQtMC4xIDAuNS0wLjEgMC4zLTAuMyAwLjUtMC4zIDAuNy0wLjEgMC4xLTAuMiAwLjQtMC4yIDAuNS0wLjEgMC4yLTAuNCAwLjMtMC41IDAuNiAwIDAuMS0wLjMgMC40LTAuNiAwLjUtMC4xIDAuMi0wLjMgMC4zLTAuNSAwLjQtMC4xIDAuMi0wLjQgMC4zLTAuNSAwLjMtMC4xIDAuMi0wLjQgMC4zLTAuNSAwLjMtMC4zIDAuMS0wLjUgMC4zLTAuOCAwLjMtMC4xIDAuMS0wLjUgMC4xLTAuNyAwLjItMC4yIDAtMC42IDAtMC43IDAuMi0wLjQgMC0xLjEgMC04IDB2LTQuNGMxLjIgMCA1IDAgNS45IDAgMS4zLTAuMSAxLjUtMC4xIDEuOC0wLjEgMC4xIDAgMC4zLTAuMiAwLjQtMC4yIDAgMCAwLjMtMC4xIDAuNC0wLjMgMC0wLjEgMC4yLTAuMiAwLjItMC40cTAuMi0wLjEgMC4zLTAuN3YtNi44YzAtMC4yLTAuMS0wLjQtMC4xLTAuNC0wLjItMC4yLTAuMy0wLjMtMC4zLTAuNS0wLjEgMC0wLjItMC4xLTAuNC0wLjItMC4xIDAtMC40LTAuMi0wLjUtMC4yLTAuNC0wLjEtMC40LTAuMS0zLjEtMC4xdjcuNGwtNC42LTQuOHptMTUuOSAwLjFoNC40djE4LjVoLTQuNHptOS4yIDEyLjdjMS43IDIuMiA1LjYgMi40IDUuOCAwLjMgMC0xLTEuNi0xLjYtMy0xLjgtMi45LTAuNS01LjUtMi4zLTUuNS01LjkgMC0zLjcgMy4xLTUuNSA2LjQtNS41IDIuMSAwIDQuMiAwLjYgNiAyLjlsLTIuOSAyLjNjLTEuOC0yLTUuMS0xLjktNS4xIDAuMiAwIDAuOSAwLjkgMS41IDIuNCAxLjggMy4xIDAuNSA2LjIgMS43IDYgNi4zLTAuMiAzLjYtMy43IDUuNS02LjkgNS41LTIuMSAwLTQuMy0xLjEtNi0zLjN6bTI0LjggMS45Yy0xLjUgMy00LjEgNC4xLTYuMyA0LjEtMy40IDAtNi45LTItNi45LTYuM3YtNi4zYzAtNC4zIDMuNS02LjMgNy02LjMgMi4xIDAgNC43IDAuOSA2LjEgNC4ybC0zLjYgMS41Yy0xLjItMi4zLTUuMS0xLjgtNS4xIDAuNnY2LjNjMCAyLjIgNCAyLjkgNC45IDAuM3ptMS4yLTguNWMwLTQuMyAzLjYtNi40IDcuMy02LjQgMy42IDAgNy4zIDIuMSA3LjMgNi40djYuM2MwIDQuMi0zLjcgNi4zLTcuMyA2LjMtMy43IDAtNy4zLTIuMS03LjMtNi4zem00LjQgNi4zYzAgMS40IDEuNSAyLjEgMi45IDIuMSAxLjQgMCAyLjktMC43IDIuOS0yLjF2LTYuM2MwLTEuNC0xLjYtMi4xLTMtMi4xLTEuMyAwLTIuOCAwLjctMi44IDIuMXptMTcuNyAwLjNoLTAuOHY1LjloLTQuNHYtMTguNmg3LjFjMy41IDAgNi4zIDEuOCA2LjUgNi4xIDAgMy40LTEuMyA1LjMtMy42IDZsNC45IDYuNWgtNS41em0xLjctNC4yYzIuOCAwIDIuOC00LjIgMC00LjJoLTIuNnY0LjJ6bTguOC04LjZjMi4yIDAgNy4zIDAgNy42IDAgMC4yIDAgMC41IDAgMC44IDAuMSAwLjIgMCAwLjYgMC4yIDAuOSAwLjIgMC4xIDAuMSAwLjUgMC4xIDAuNiAwLjIgMC4yIDAgMC40IDAuMiAwLjcgMC4zIDAuMSAwLjEgMC41IDAuMyAwLjYgMC40IDAuMiAwLjIgMC40IDAuMyAwLjcgMC42IDAuMSAwLjEgMC40IDAuNCAwLjUgMC41IDAgMC4yIDAuMyAwLjQgMC4zIDAuNiAwLjEgMC4xIDAuMiAwLjIgMC4zIDAuNSAwIDAuMiAwLjIgMC40IDAuMiAwLjYgMC4xIDAuMSAwLjEgMC40IDAuMiAwLjUgMCAwLjMgMCAwLjYgMC4yIDAuOCAwIDAuNSAwIDEuMSAwIDQuMiAwIDIuOCAwIDMuNyAwIDMuOS0wLjIgMC4yLTAuMiAwLjUtMC4yIDAuNyAwIDAuMi0wLjEgMC40LTAuMiAwLjYgMCAwLjMtMC4yIDAuNS0wLjMgMC43IDAgMC4xLTAuMSAwLjItMC4yIDAuNSAwIDAuMi0wLjMgMC4zLTAuNCAwLjQtMC4yIDAuMy0wLjQgMC40LTAuNiAwLjYtMC4xIDAuMy0wLjMgMC40LTAuNSAwLjUtMC4xIDAtMC40IDAuMi0wLjUgMC4zLTAuMSAwLTAuNCAwLjEtMC41IDAuMy0wLjMgMC4xLTAuNyAwLjMtMC44IDAuMy0wLjMgMC4xLTAuNSAwLjEtMC44IDAuMS0wLjEgMC4xLTAuNSAwLjEtMC42IDAuMS0wLjQgMC4yLTEuMSAwLjItOCAwLjJ2LTQuNGgyLjFjMS4yIDAgMi43LTAuMiAzLjctMC4yIDEuNCAwIDEuNiAwIDEuOSAwIDAtMC4xIDAuMy0wLjEgMC4zLTAuMSAwLjEtMC4xIDAuMi0wLjEgMC40LTAuM3EwLjItMC4yIDAuNC0wLjQgMC4xLTAuMSAwLjItMC43di03Yy0wLjEtMC4xLTAuMS0wLjMtMC4yLTAuNCAwIDAtMC4yLTAuMS0wLjMtMC4zIDAgMC0wLjEtMC4xLTAuMy0wLjItMC4xIDAtMC40LTAuMi0wLjUtMC4yLTAuNC0wLjEtMC40LTAuMS0zLjEtMC4xdjcuNGwtNC42LTQuOHoiLz4KPC9zdmc+"); -} diff --git a/src/discord/content/css/mobile.css b/src/discord/content/css/mobile.css deleted file mode 100644 index a71ed39..0000000 --- a/src/discord/content/css/mobile.css +++ /dev/null @@ -1,6 +0,0 @@ -[aria-label~="Mute"] { - display: none; -} -[aria-label~="Deafen"] { - display: none; -} diff --git a/src/discord/content/css/screenshare.css b/src/discord/content/css/screenshare.css deleted file mode 100644 index 308c934..0000000 --- a/src/discord/content/css/screenshare.css +++ /dev/null @@ -1,70 +0,0 @@ -.desktop-capturer-selection { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100vh; - background: rgba(30, 30, 30, 0.75); - color: #ffffff; - z-index: 10000000; - display: flex; - align-items: center; - justify-content: center; -} -.desktop-capturer-selection__scroller { - width: 100%; - max-height: 100vh; - overflow-y: auto; -} -.desktop-capturer-selection__list { - max-width: calc(100% - 100px); - margin: 50px; - padding: 0; - display: flex; - flex-wrap: wrap; - list-style: none; - overflow: hidden; - justify-content: center; -} -.desktop-capturer-selection__item { - display: flex; - margin: 4px; -} -.desktop-capturer-selection__btn { - display: flex; - flex-direction: column; - align-items: stretch; - width: 145px; - margin: 0; - border: 0; - border-radius: 3px; - padding: 4px; - background: #2c2f33; - text-align: left; -} -@media (prefers-reduced-motion: no-preference) { -} -.desktop-capturer-selection__btn:hover, -.desktop-capturer-selection__btn:focus { - background: #7289da; - box-shadow: - 0 0 4px rgba(0, 0, 0, 0.45), - 0 0 2px rgba(0, 0, 0, 0.25); - color: #fff; -} -.desktop-capturer-selection__thumbnail { - width: 100%; - height: 81px; - object-fit: cover; -} -.desktop-capturer-selection__name { - margin: 6px 0; - white-space: nowrap; - color: white; - text-overflow: ellipsis; - text-align: center; - overflow: hidden; -} -.desktop-capturer-selection__name--cancel { - margin: auto 0; -} diff --git a/src/discord/content/css/settingsEng.css b/src/discord/content/css/settingsEng.css deleted file mode 100644 index b487cb3..0000000 --- a/src/discord/content/css/settingsEng.css +++ /dev/null @@ -1,30 +0,0 @@ -.acTheme { - height: 15em !important; -} -.acCSP { - height: 10em !important; -} -.acPatches { - height: 10em !important; -} -.acWebsocket { - height: 10em !important; -} -.acMobileMode { - height: 11em !important; -} -.acChannel { - height: 21em !important; -} -.acClientMod { - height: 18em !important; -} -.acCordwood { - height: 8em !important; -} -.acPrfmMode { - height: 10em !important; -} -.acTray { - height: 8em !important; -} diff --git a/src/discord/content/css/titlebar.css b/src/discord/content/css/titlebar.css deleted file mode 100644 index 04b4034..0000000 --- a/src/discord/content/css/titlebar.css +++ /dev/null @@ -1,385 +0,0 @@ -.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; - user-select: none; - -webkit-user-select: none; - position: fixed; - z-index: 99999; -} - -.container-2RRFHK { - padding-top: 30px; - top: -30px; -} - -.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; -} - -/* ArmCord on Linux */ -[armcord-platform="linux"] .container-2RRFHK { - padding-top: 45px; - top: -45px; -} -[armcord-platform="linux"] .titlebar { - height: 45px; - line-height: 45px; -} -[armcord-platform="linux"] .titlebar #window-controls-container { - line-height: 45px; - transform: translateY(-8px); -} -[armcord-platform="linux"] .titlebar #window-controls-container #minimize:hover { - background-color: var(--background-modifier-hover); - transition: 0.2s ease; -} -[armcord-platform="linux"] .titlebar #window-controls-container #maximize:hover { - background-color: var(--background-modifier-hover); - transition: 0.2s ease; -} -[armcord-platform="linux"] .titlebar #window-controls-container #minimize:hover #minimize-icon { - background-color: var(--interactive-hover); - transition: 0.2s ease; -} -[armcord-platform="linux"] .titlebar #window-controls-container #maximize:hover #maximize-icon { - background-color: var(--interactive-hover); - transition: 0.2s ease; -} -[armcord-platform="linux"] .titlebar #window-controls-container #quit:hover { - background-color: var(--brand-experiment-560); - transition: 0.2s ease; -} -[armcord-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%; -} -[armcord-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%; -} -[armcord-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%; -} - -[armcord-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%; -} -[armcord-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%; -} -[armcord-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%; -} -[armcord-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%; -} -[armcord-platform="linux"] .titlebar #window-controls-container #quit:active { - background-color: var(--brand-experiment-600); - transition: 0.1s ease; -} - -/* ArmCord on Windows */ -[armcord-platform="win32"] .titlebar #window-controls-container { - width: 142px; -} -[armcord-platform="win32"] .titlebar #window-controls-container #minimize:hover { - background-color: var(--background-modifier-hover); - transition: 0.2s ease; -} -[armcord-platform="win32"] .titlebar #window-controls-container #maximize:hover { - background-color: var(--background-modifier-hover); - transition: 0.2s ease; -} -[armcord-platform="win32"] .titlebar #window-controls-container #minimize:hover #minimize-icon { - background-color: var(--interactive-hover); - transition: 0.2s ease; -} -[armcord-platform="win32"] .titlebar #window-controls-container #maximize:hover #maximize-icon { - background-color: var(--interactive-hover); - transition: 0.2s ease; -} -[armcord-platform="win32"] .titlebar #window-controls-container #quit:hover { - background-color: #e81123; - transition: 0.2s ease; -} -[armcord-platform="win32"] .titlebar #window-controls-container #quit:hover #quit-icon { - background-color: #ffffff; - transition: 0.1s ease; -} -[armcord-platform="win32"] .titlebar #window-controls-container #minimize { - background-color: transparent; - transition: 0.1s ease; -} -[armcord-platform="win32"] .titlebar #window-controls-container #maximize { - background-color: transparent; - transition: 0.1s ease; -} -[armcord-platform="win32"] .titlebar #window-controls-container #quit { - background-color: transparent; - transition: 0.1s ease; -} -[armcord-platform="win32"] .titlebar #window-controls-container #quit:active { - background-color: #f1707a; - transition: 0.1s ease; -} -[armcord-platform="win32"] .titlebar #window-controls-container #quit:active #quit-icon { - background-color: #000000cc; - transition: 0.1s ease; -} -[armcord-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%; -} -[armcord-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%; -} -[armcord-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%; -} - -[armcord-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%; -} - -/* ArmCord on MacOS (Why would you do this?) */ -[armcord-platform="darwin"] .withFrame-haYltI { - height: 0px !important; -} -[armcord-platform="darwin"] .sidebar-1tnWFu { - border-top-left-radius: 0px !important; -} -[armcord-platform="darwin"] .scroller__3d071 { - padding-top: 35px !important; -} -[armcord-platform="darwin"] .container__037ed { - overflow: unset !important; - padding-top: 48px; - top: -48px; -} -[armcord-platform="darwin"] .titlebar { - height: 48px; - line-height: 48px; - width: 150px !important; -} -[armcord-platform="darwin"] section.theme-dark.container__11d72.themed_b152d4 { - -webkit-app-region: drag; -} -[armcord-platform="darwin"] section.title_b7d661.container__11d72.themed_b152d4 { - -webkit-app-region: drag; -} -[armcord-platform="darwin"] .searchBar_e4ea2a { - -webkit-app-region: drag; -} -[armcord-platform="darwin"] .titlebar #window-controls-container { - float: left; - width: 150px; - height: 60%; - line-height: 45px; - -webkit-app-region: no-drag; - transform: translate(-82px, 4px); -} - -[armcord-platform="darwin"] .titlebar #window-controls-container:hover #minimize #minimize-icon, -[armcord-platform="darwin"] .titlebar #window-controls-container:hover #maximize #maximize-icon, -[armcord-platform="darwin"] .titlebar #window-controls-container:hover #quit #quit-icon { - display: list-item; -} - -[armcord-platform="darwin"][unFocused] .titlebar #window-controls-container #minimize, -[armcord-platform="darwin"][unFocused] .titlebar #window-controls-container #maximize, -[armcord-platform="darwin"][unFocused] .titlebar #window-controls-container #quit { - background-color: #d6d6d5 !important; - pointer-events: none; - transition: background-color 0.1s ease-in; -} - -[armcord-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); -} -[armcord-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); -} -[armcord-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); -} - -[armcord-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); -} -[armcord-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); -} -[armcord-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%; -} -[armcord-platform="darwin"] .titlebar #window-controls-container:hover #maximize:active { - background-color: #13c11e; -} -[armcord-platform="darwin"] .titlebar #window-controls-container:hover #minimize:active { - background-color: #da9e10; -} -[armcord-platform="darwin"] .titlebar #window-controls-container:hover #quit:active { - background-color: #d52735; -} -[armcord-platform="darwin"] .titlebar #window-controls-container #spacer, -[armcord-platform="darwin"] .titlebar #window-controls-container #minimize, -[armcord-platform="darwin"] .titlebar #window-controls-container #maximize, -[armcord-platform="darwin"] .titlebar #window-controls-container #quit { - float: right; - height: 80%; - width: 13%; - text-align: center; - color: transparent; - cursor: default; -} - -[armcord-platform="darwin"] .titlebar #window-controls-container #minimize-icon, -[armcord-platform="darwin"] .titlebar #window-controls-container #maximize-icon, -[armcord-platform="darwin"] .titlebar #window-controls-container #quit-icon { - display: none; -} - -[armcord-platform="darwin"] .titlebar #window-controls-container #spacer { - display: none; -} - -[armcord-platform="darwin"] .window-title { - display: none; -} - -[armcord-platform="linux"] .window-title, -[armcord-platform="win32"] .window-title { - content: var(--wordmark-svg); - height: 10px; - margin-left: initial; - transform: translate(9px, 9.5px); - float: left; - padding: 0; -} - -[wordmark="discord"] .window-title { - content: var(--discord-wordmark-svg); - height: 11.7px; - width: 56px; -} - -.withFrame-haYltI { - height: 30px !important; -} diff --git a/src/discord/content/js/disableAutogain.js b/src/discord/content/js/disableAutogain.js deleted file mode 100644 index f5c7b60..0000000 --- a/src/discord/content/js/disableAutogain.js +++ /dev/null @@ -1,94 +0,0 @@ -// MIT License - -// Copyright (c) 2021 Joseph Watts - -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: - -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// 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. -function setLegacyChromeConstraint(constraint, name, value) { - if (constraint.mandatory && name in constraint.mandatory) { - constraint.mandatory[name] = value; - return; - } - if (constraint.optional) { - const element = constraint.optional.find((opt) => name in opt); - if (element) { - element[name] = value; - return; - } - } - // `mandatory` options throw errors for unknown keys, so avoid that by - // setting it under optional. - if (!constraint.optional) { - constraint.optional = []; - } - constraint.optional.push({[name]: value}); -} -function setConstraint(constraint, name, value) { - if (constraint.advanced) { - const element = constraint.advanced.find((opt) => name in opt); - if (element) { - element[name] = value; - return; - } - } - constraint[name] = value; -} -function disableAutogain(constraints) { - console.log("Automatically unsetting gain!", constraints); - if (constraints?.audio) { - if (typeof constraints.audio !== "object") { - constraints.audio = {}; - } - if (constraints.audio.optional || constraints.audio.mandatory) { - setLegacyChromeConstraint(constraints.audio, "googAutoGainControl", false); - setLegacyChromeConstraint(constraints.audio, "googAutoGainControl2", false); - } else { - setConstraint(constraints.audio, "autoGainControl", false); - } - } -} - -function patchFunction(object, name, createNewFunction) { - if (name in object) { - const original = object[name]; - object[name] = createNewFunction(original); - } -} - -patchFunction(navigator.mediaDevices, "getUserMedia", function (original) { - return function getUserMedia(constraints) { - disableAutogain(constraints); - return original.call(this, constraints); - }; -}); -function patchDeprecatedGetUserMedia(original) { - return function getUserMedia(constraints, success, error) { - disableAutogain(constraints); - return original.call(this, constraints, success, error); - }; -} -patchFunction(navigator, "getUserMedia", patchDeprecatedGetUserMedia); -patchFunction(navigator, "mozGetUserMedia", patchDeprecatedGetUserMedia); -patchFunction(navigator, "webkitGetUserMedia", patchDeprecatedGetUserMedia); -patchFunction(MediaStreamTrack.prototype, "applyConstraints", function (original) { - return function applyConstraints(constraints) { - disableAutogain(constraints); - return original.call(this, constraints); - }; -}); -console.log("Disable Autogain by Joey Watts!", navigator.mediaDevices.getUserMedia); diff --git a/src/discord/content/js/rpc.js b/src/discord/content/js/rpc.js deleted file mode 100644 index c447689..0000000 --- a/src/discord/content/js/rpc.js +++ /dev/null @@ -1,91 +0,0 @@ -(() => { - let Dispatcher, - lookupAsset, - lookupApp, - apps = {}; - - ArmCordRPC.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; - if (!mod?.__esModule) continue; - - for (const prop in mod) { - if (!mod.hasOwnProperty(prop)) continue; - - const candidate = mod[prop]; - if (candidate && candidate.register && candidate.wait) { - Dispatcher = candidate; - break; - } - } - - 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 - }); -})(); diff --git a/src/discord/extensions/csp.ts b/src/discord/extensions/csp.ts index c4b4acf..3a79a46 100644 --- a/src/discord/extensions/csp.ts +++ b/src/discord/extensions/csp.ts @@ -1,29 +1,68 @@ import electron from "electron"; -import {getConfig} from "../../common/config.js"; +import { getConfig } from "../../common/config.js"; -const unrestrictCSP = (): void => { +const LEGCORD_CSP = [ + "default-src 'self'", + "script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https://*.discord.com https://discord.com https://*.githubusercontent.com https://*.github.com", + "style-src 'self' 'unsafe-inline' https://*.discord.com https://discord.com https://fonts.googleapis.com", + "img-src 'self' blob: data: https://*.discord.com https://discord.com https://*.discordapp.com https://cdn.discordapp.com https://*.githubusercontent.com https://*.github.com https://raw.githubusercontent.com", + "font-src 'self' data: https://fonts.gstatic.com", + "connect-src 'self' blob: https://*.discord.com https://discord.com wss://*.discord.com wss://gateway.discord.gg https://*.githubusercontent.com https://*.github.com https://api.github.com", + "media-src 'self' blob: https://*.discord.com https://discord.com", + "worker-src 'self' blob:", + "frame-src 'self' https://*.discord.com https://discord.com https://*.youtube.com https://youtube.com https://*.twitch.tv https://open.spotify.com", +].join("; "); + +function setupStrictCSP() { + console.log("Setting up Strict CSP policy..."); + + electron.session.defaultSession.webRequest.onHeadersReceived( + ( + details: electron.OnHeadersReceivedListenerDetails, + callback: (headersReceivedResponse: electron.HeadersReceivedResponse) => void, + ) => { + const { responseHeaders, resourceType } = details; + if (!responseHeaders) return callback({}); + + if (resourceType === "mainFrame") { + responseHeaders["content-security-policy"] = [LEGCORD_CSP]; + } else if (resourceType === "stylesheet") { + // Fix hosts that don't properly set the css content type, such as + // raw.githubusercontent.com + responseHeaders["content-type"] = ["text/css"]; + } + return callback({ responseHeaders }); + }, + ); +} + +function setupNoCSP() { console.log("Setting up CSP unrestricter..."); - electron.session.defaultSession.webRequest.onHeadersReceived(({responseHeaders, resourceType}, done) => { + electron.session.defaultSession.webRequest.onHeadersReceived(({ responseHeaders, resourceType }, done) => { if (!responseHeaders) return done({}); if (resourceType === "mainFrame") { - delete responseHeaders["content-security-policy"]; + (responseHeaders["content-security-policy"] as unknown) = undefined; } else if (resourceType === "stylesheet") { // Fix hosts that don't properly set the css content type, such as // raw.githubusercontent.com responseHeaders["content-type"] = ["text/css"]; } - - return done({responseHeaders}); + return done({ responseHeaders }); }); -}; +} void electron.app.whenReady().then(() => { - // REVIEW - Awaiting the line above will hang the app. - if (getConfig("armcordCSP")) { - unrestrictCSP(); - } else { - console.log("ArmCord CSP is disabled. The CSP should be managed by a third-party plugin(s)."); + const cspSetting = getConfig("csp") || "none"; // none is the old default when the setting didn't exist, so we default to that for old configs + switch (cspSetting) { + case "strict": + setupStrictCSP(); + break; + case "none": + setupNoCSP(); + break; + default: + console.log("Using vanilla CSP policy."); } }); diff --git a/src/discord/extensions/modloader.ts b/src/discord/extensions/modloader.ts new file mode 100644 index 0000000..1b2684b --- /dev/null +++ b/src/discord/extensions/modloader.ts @@ -0,0 +1,95 @@ +import { writeFileSync } from "node:fs"; +import { join } from "node:path"; +import { app } from "electron"; +import type { RepoData } from "../../@types/consts.js"; +import type { Settings, ValidMods } from "../../@types/settings.js"; +import { getConfig, setConfig } from "../../common/config.js"; +import { modData } from "../../common/consts.js"; + +async function fetchMod(fileName: string, url: string) { + try { + await fetch(url).then(async (contents) => { + const fileContent = await contents.text(); + if (!contents.ok || !fileContent) { + throw new Error("BAD_RESPONSE"); + } + writeFileSync(join(app.getPath("userData"), fileName), fileContent); + }); + } catch (error) { + console.error(error); + console.error(`Something went wrong downloading ${fileName} from ${url} - skipping!`); + } +} + +async function getRef(repoData: RepoData) { + return await fetch( + `https://api.github.com/repos/${repoData.owner}/${repoData.repo}/git/matching-refs/heads/${repoData.branch}`, + ) + .then((response) => response.json()) + .then((data: { object: { sha: string } }[]) => { + return data[0].object.sha; + }); +} + +async function downloadMod(mod: ValidMods) { + console.log(`[Mod Loader]: Downloading ${mod}...`); + const jsUrl = modData[mod].js; + if (!jsUrl || jsUrl === "DoNotChange" || !jsUrl.startsWith("http")) { + console.log(`[Mod Loader]: Skipping ${mod} - no valid URL configured`); + return; + } + await fetchMod(`${mod}.js`, jsUrl); + if (modData[mod].css) { + const cssUrl = modData[mod].css; + if (cssUrl?.startsWith("http")) { + await fetchMod(`${mod}.css`, cssUrl); + } + } +} + +async function cacheCheck(mod: ValidMods) { + let modCache = getConfig("modCache"); + if (!modCache) { + modCache = new Object() as Settings["modCache"]; + } + try { + const latestRef = await getRef(modData[mod].repoData); + // biome-ignore lint/correctness/noConstantCondition: https://github.com/Legcord/Legcord/issues/763 + if (/*latestRef === modCache![mod]*/ false) { + console.log(`[Mod Loader]: ${mod} Cache hit!`); + return; + } else { + downloadMod(mod); + modCache![mod] = latestRef; + setConfig("modCache", modCache); + } + } catch (e) { + downloadMod(mod); + console.error(`[Mod Loader] Failed to compare cache: ${e}`); + } +} + +export async function fetchMods() { + if (typeof getConfig("mods") === "string") { + setConfig("mods", [getConfig("mods") as unknown as ValidMods]); // pre 3.3.2 + } + const rawDisabledUpdates = getConfig("noBundleUpdates"); + const disabledUpdates = Array.isArray(rawDisabledUpdates) + ? rawDisabledUpdates + : rawDisabledUpdates + ? ["shelter", "vencord", "equicord", "custom"] + : []; + if (!Array.isArray(rawDisabledUpdates)) { + setConfig("noBundleUpdates", disabledUpdates as ValidMods[]); + } + if (!disabledUpdates.includes("shelter")) { + await cacheCheck("shelter"); + } + getConfig("mods").forEach(async (mod) => { + if (disabledUpdates.includes(mod)) return; + if (mod === "custom") { + await downloadMod(mod); + } + await cacheCheck(mod); + }); +} diff --git a/src/discord/extensions/mods.ts b/src/discord/extensions/mods.ts deleted file mode 100644 index c30371e..0000000 --- a/src/discord/extensions/mods.ts +++ /dev/null @@ -1,128 +0,0 @@ -import {app, dialog} from "electron"; -import extract from "extract-zip"; -import path from "path"; -import {getConfig} from "../../common/config.js"; -import fs from "fs"; -import {Readable} from "stream"; -import type {ReadableStream} from "stream/web"; -import {finished} from "stream/promises"; -async function updateModBundle(): Promise { - if (getConfig("noBundleUpdates") == undefined || false) { - try { - console.log("Downloading mod bundle"); - const distFolder = `${app.getPath("userData")}/plugins/loader/dist/`; - while (!fs.existsSync(distFolder)) { - //waiting - } - const name: string = getConfig("mods"); - if (name == "custom") { - // aspy fix - const bundle: string = await (await fetch(getConfig("customJsBundle"))).text(); - fs.writeFileSync(`${distFolder}bundle.js`, bundle, "utf-8"); - const css: string = await (await fetch(getConfig("customCssBundle"))).text(); - fs.writeFileSync(`${distFolder}bundle.css`, css, "utf-8"); - } else { - const clientMods = { - vencord: "https://github.com/Vendicated/Vencord/releases/download/devbuild/browser.js", - shelter: "https://raw.githubusercontent.com/uwu/shelter-builds/main/shelter.js" - }; - const clientModsCss = { - vencord: "https://github.com/Vendicated/Vencord/releases/download/devbuild/browser.css", - shelter: "https://armcord.app/placeholder.css" - }; - console.log(clientMods[name as keyof typeof clientMods]); - const bundle: string = await (await fetch(clientMods[name as keyof typeof clientMods])).text(); - fs.writeFileSync(`${distFolder}bundle.js`, bundle, "utf-8"); - const css: string = await (await fetch(clientModsCss[name as keyof typeof clientModsCss])).text(); - fs.writeFileSync(`${distFolder}bundle.css`, css, "utf-8"); - } - } catch (e) { - console.log("[Mod loader] Failed to install mods"); - console.error(e); - dialog.showErrorBox( - "Oops, something went wrong.", - "ArmCord couldn't install mods, please check if you have stable internet connection and restart the app. If this issue persists, report it on the support server/Github issues." - ); - } - } else { - console.log("[Mod loader] Skipping mod bundle update"); - } -} - -export let modInstallState: string; -export function updateModInstallState() { - modInstallState = "modDownload"; - - void updateModBundle(); // REVIEW - Awaiting this will hang the app on the splash - import("./plugin.js"); - - modInstallState = "done"; -} - -export async function installModLoader(): Promise { - if (getConfig("mods") == "none") { - modInstallState = "none"; - fs.rmSync(`${app.getPath("userData")}/plugins/loader`, {recursive: true, force: true}); - - import("./plugin.js"); - console.log("[Mod loader] Skipping"); - - return; - } - - const pluginFolder = `${app.getPath("userData")}/plugins/`; - if (fs.existsSync(`${pluginFolder}loader`) && fs.existsSync(`${pluginFolder}loader/dist/bundle.css`)) { - updateModInstallState(); - return; - } - - try { - fs.rmSync(`${app.getPath("userData")}/plugins/loader`, {recursive: true, force: true}); - modInstallState = "installing"; - - const zipPath = `${app.getPath("temp")}/loader.zip`; - - if (!fs.existsSync(pluginFolder)) { - fs.mkdirSync(pluginFolder); - console.log("[Mod loader] Created missing plugin folder"); - } - - // Add more of these later if needed! - const URLs = [ - "https://armcord.app/loader.zip", - "https://armcord.vercel.app/loader.zip", - "https://raw.githubusercontent.com/ArmCord/website/new/public/loader.zip" - ]; - - // REVIEW - Rewrote this - while (true) { - let completed = false; - await fetch(URLs[0]) - .then(async (loaderZip) => { - const fileStream = fs.createWriteStream(zipPath); - await finished(Readable.fromWeb(loaderZip.body as ReadableStream).pipe(fileStream)).then( - async () => { - await extract(zipPath, {dir: path.join(app.getPath("userData"), "plugins")}).then(() => { - updateModInstallState(); - completed = true; - }); - } - ); - }) - .catch(() => { - console.warn(`[Mod loader] Failed to download. Links left to try: ${URLs.length - 1}`); - URLs.splice(0, 1); - }); - if (completed || URLs.length == 0) { - break; - } - } - } catch (e) { - console.log("[Mod loader] Failed to install modloader"); - console.error(e); - dialog.showErrorBox( - "Oops, something went wrong.", - "ArmCord couldn't install internal mod loader, please check if you have stable internet connection and restart the app. If this issue persists, report it on the support server/Github issues." - ); - } -} diff --git a/src/discord/extensions/plugin.ts b/src/discord/extensions/plugin.ts index 7035177..96489b1 100644 --- a/src/discord/extensions/plugin.ts +++ b/src/discord/extensions/plugin.ts @@ -1,19 +1,26 @@ -import fs from "fs"; -import {app, session} from "electron"; -const userDataPath = app.getPath("userData"); -const pluginFolder = `${userDataPath}/plugins`; -if (!fs.existsSync(pluginFolder)) { - fs.mkdirSync(pluginFolder); - console.log("Created missing plugin folder"); +import { existsSync, mkdirSync, readdirSync } from "node:fs"; +import { platform } from "node:os"; +import { app, session } from "electron"; + +const extensionFolder = `${app.getPath("userData")}/extensions`; + +let prefix = ""; + +if (!existsSync(extensionFolder)) { + mkdirSync(extensionFolder); + console.log("Created missing extensions folder"); } await app.whenReady().then(() => { - fs.readdirSync(pluginFolder).forEach((file) => { + readdirSync(extensionFolder).forEach(async (file) => { try { - const manifest = fs.readFileSync(`${pluginFolder}/${file}/manifest.json`, "utf8"); // NOTE - The below type assertion is just what we need from the chrome manifest - const pluginFile = JSON.parse(manifest) as {name: string; author: string}; - void session.defaultSession.loadExtension(`${pluginFolder}/${file}`); // REVIEW - Awaiting this will cause plugins to not inject - console.log(`[Mod loader] Loaded ${pluginFile.name} made by ${pluginFile.author}`); + if (platform() === "win32") prefix = "file://"; + const manifest = (await import(`${prefix}${extensionFolder}/${file}/manifest.json`, { + with: { type: "json" }, + })) as { name: string; author: string; type: "json" }; + + void session.defaultSession.loadExtension(`${extensionFolder}/${file}`); // NOTE - Awaiting this will cause plugins to not inject + console.log(`[Mod loader] Loaded ${manifest.name} made by ${manifest.author}`); } catch (err) { console.error(err); } diff --git a/src/discord/globalKeybinds.ts b/src/discord/globalKeybinds.ts new file mode 100644 index 0000000..c7b4ba4 --- /dev/null +++ b/src/discord/globalKeybinds.ts @@ -0,0 +1,30 @@ +import { app, globalShortcut } from "electron"; +import type { Keybind } from "../@types/keybind.js"; +import { getConfig } from "../common/config.js"; +import { runAction } from "../common/keybindActions.js"; +import { setMenu } from "./menu.js"; + +export function registerGlobalKeybinds() { + const keybinds = getConfig("keybinds"); + keybinds.forEach((keybind: Keybind) => { + if (keybind.enabled && keybind.global) { + try { + globalShortcut.register(keybind.accelerator, () => { + runAction(keybind); + }); + } catch {} + } + }); +} +app.on("will-quit", () => { + try { + globalShortcut.unregisterAll(); + } catch (_e) {} +}); + +export function refreshGlobalKeybinds() { + console.log("[Keybind Manager] Refreshing keybinds"); + globalShortcut.unregisterAll(); + registerGlobalKeybinds(); + setMenu(); +} diff --git a/src/discord/ipc.ts b/src/discord/ipc.ts index fae7e9f..7a9e5d7 100644 --- a/src/discord/ipc.ts +++ b/src/discord/ipc.ts @@ -1,26 +1,183 @@ -//ipc stuff -import {app, clipboard, desktopCapturer, ipcMain, nativeImage, shell, SourcesOptions} from "electron"; -import {BrowserWindow} from "electron"; - -import os from "os"; -import fs from "fs"; -import path from "path"; -import {mainWindows} from "./window.js"; -import {getConfig, setConfigBulk, getConfigLocation} from "../common/config.js"; -import {setLang, getLang, getLangName} from "../common/lang.js"; -import {getVersion, getDisplayVersion} from "../common/version.js"; -import {customTitlebar} from "../main.js"; -import {createSettingsWindow} from "../settings/main.js"; -import {splashWindow} from "../splash/main.js"; -import {createTManagerWindow} from "../themeManager/main.js"; -import {modInstallState} from "./extensions/mods.js"; -import {Settings} from "../types/settings.d.js"; +import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import type { Game } from "arrpc"; +import { app, type BrowserWindow, 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 { + applyBackupFromMap, + type BackupSavePayload, + buildBackupZipBuffer, + readBackupZipToMap, +} from "../common/backup.js"; +import { + blacklistGame as blacklistGameAdd, + unblacklistGame as blacklistGameRemove, + getBlacklist, +} from "../common/blacklistGame.js"; +import { getConfig, getConfigLocation, setConfig, setConfigBulk } from "../common/config.js"; +import { addDetectable, getDetectables, removeDetectable } from "../common/detectables.js"; +import { getLang, getLangName, getRawLang, setLang } from "../common/lang.js"; +import { disableQuickCss, initQuickCss, installTheme, setThemeEnabled, uninstallTheme } from "../common/themes.js"; +import { getDisplayVersion, getVersion } from "../common/version.js"; +import { openCssEditor } from "../cssEditor/main.js"; +import { getAppliedFlags, handleRestart } from "../main.js"; +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 { getRuntimeEntries, getRuntimeScript, listPlugins, reloadPlugin, setPluginEnabled } from "./plugins/manager.js"; +import { processList, refreshProcessList } from "./rpcProcess.js"; +import { importGuilds, mainTouchBar, setVoiceState, voiceTouchBar } from "./touchbar.js"; const userDataPath = app.getPath("userData"); const storagePath = path.join(userDataPath, "/storage/"); const themesPath = path.join(userDataPath, "/themes/"); +const extensionsPath = path.join(userDataPath, "/extensions/"); const pluginsPath = path.join(userDataPath, "/plugins/"); +const pluginStoragePath = path.join(userDataPath, "/plugin-storage/"); +const quickCssPath = path.join(userDataPath, "/quickCss.css"); + +/** Sanitize plugin id to safe dir name (alphanumeric, dash, underscore only). */ +function sanitizePluginId(pluginId: string): string { + return pluginId.replace(/[^a-zA-Z0-9_-]/g, "").slice(0, 64) || "default"; +} + +/** Resolve relative path for a plugin; returns null if path escapes plugin dir. */ +function resolvePluginFilePath(pluginId: string, relativePath: string): string | null { + const safeId = sanitizePluginId(pluginId); + const baseDir = path.resolve(pluginStoragePath, safeId); + const resolved = path.resolve(baseDir, path.normalize(relativePath)); + const relative = path.relative(baseDir, resolved); + if (relative.startsWith("..") || path.isAbsolute(relative)) return null; + return resolved; +} + +function ifExistsRead(path: string): string | undefined { + if (existsSync(path)) return readFileSync(path, "utf-8"); +} + export function registerIpc(passedWindow: BrowserWindow): void { + ipcMain.handle("getShelterBundle", () => { + return { + js: ifExistsRead(path.join(app.getPath("userData"), "shelter.js")), + enabled: true, + }; + }); + ipcMain.handle("getVencordBundle", () => { + return { + js: ifExistsRead(path.join(app.getPath("userData"), "vencord.js")), + css: ifExistsRead(path.join(app.getPath("userData"), "vencord.css")), + enabled: getConfig("mods").includes("vencord"), + }; + }); + ipcMain.handle("getEquicordBundle", () => { + return { + js: ifExistsRead(path.join(app.getPath("userData"), "equicord.js")), + css: ifExistsRead(path.join(app.getPath("userData"), "equicord.css")), + enabled: getConfig("mods").includes("equicord"), + }; + }); + ipcMain.handle("getCustomBundle", () => { + const enabled = getConfig("mods").includes("custom"); + return { + js: enabled ? ifExistsRead(path.join(app.getPath("userData"), "custom.js")) : undefined, + css: enabled ? ifExistsRead(path.join(app.getPath("userData"), "custom.css")) : undefined, + enabled, + }; + }); + + // theming + ipcMain.on("enableQuickCss", () => { + console.log("Enabling quick CSS"); + initQuickCss(passedWindow); + }); + ipcMain.on("disableQuickCss", () => { + console.log("Disabling quick CSS"); + disableQuickCss(passedWindow); + }); + ipcMain.on("openQuickCss", () => { + if (getConfig("useSystemCssEditor")) { + void shell.openPath(quickCssPath); + } else { + 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); + }); + ipcMain.on("openImportPicker", () => { + dialog + .showOpenDialog({ + title: getLang("dialog-importTheme-title"), + buttonLabel: getLang("dialog-importTheme-button"), + properties: ["openFile", "multiSelections"], + filters: [ + { + name: getLang("dialog-importTheme-discordStyles"), + extensions: ["scss", "css"], + }, + { + name: getLang("dialog-importTheme-allFiles"), + extensions: ["*"], + }, + ], + }) + .then((result) => { + if (result.canceled) return; + for (const file of result.filePaths) { + installTheme(file); + } + }) + .catch((err) => { + console.log(err); + }); + }); + ipcMain.on("setThemeEnabled", (_event, name: string, enabled: boolean) => { + console.log(name, enabled); + setThemeEnabled(name, enabled); + }); + ipcMain.on("editTheme", (_event, id: string) => { + const manifest = JSON.parse(readFileSync(`${themesPath}/${id}/manifest.json`, "utf8")) as ThemeManifest; + if (getConfig("useSystemCssEditor")) { + void shell.openPath(`${themesPath}/${id}/${manifest.theme}`); + } else { + openCssEditor(`${themesPath}/${id}/${manifest.theme}`); + } + }); + ipcMain.on("openThemeFolder", (_event, id: string) => { + void shell.openPath(path.join(themesPath, id)); + }); + ipcMain.on("uninstallTheme", (_event, id: string) => { + uninstallTheme(id); + }); + + ipcMain.handle("installBDTheme", async (_event, link: string) => { + await installTheme(link); + }); + + ipcMain.on("getThemes", (event) => { + const themes = []; + const themeFolders = readdirSync(themesPath); + for (const folder of themeFolders) { + if (existsSync(`${themesPath}/${folder}/manifest.json`)) { + const manifest = JSON.parse( + readFileSync(`${themesPath}/${folder}/manifest.json`, "utf8"), + ) as ThemeManifest; + themes.push({ ...manifest, id: folder }); + } + } + event.returnValue = themes; + }); + ipcMain.on("splashEnd", () => { splashWindow.close(); if (getConfig("startMinimized")) { @@ -29,38 +186,36 @@ export function registerIpc(passedWindow: BrowserWindow): void { passedWindow.show(); } }); - - if (mainWindows.length !== 1) { - return; - } - - ipcMain.on("get-app-path", (event) => { - event.reply("app-path", app.getAppPath()); - }); ipcMain.on("setLang", (_event, lang: string) => { setLang(lang); }); + ipcMain.on("setVoiceTouchbar", (_event, state: boolean) => { + if (state) { + passedWindow.setTouchBar(voiceTouchBar); + } else { + passedWindow.setTouchBar(mainTouchBar); + } + }); + ipcMain.on("importGuilds", (_event, array: Array) => { + importGuilds(array); + }); + ipcMain.on("setVoiceState", (_event, mute: boolean, deafen: boolean) => { + setVoiceState(mute, deafen); + }); + ipcMain.on("getLangSync", (event, toGet: string) => { + event.reply("langString", getLang(toGet)); + }); ipcMain.handle("getLang", (_event, toGet: string) => { return getLang(toGet); }); - ipcMain.on("open-external-link", (_event, href: string) => { - void shell.openExternal(href); + + ipcMain.on("setPowerSaving", (_event, state: boolean) => { + setPowerSaving(state); }); - ipcMain.on("setPing", (_event, pingCount: number) => { - switch (os.platform()) { - case "linux" ?? "macos": - app.setBadgeCount(pingCount); - break; - case "win32": - if (pingCount > 0) { - const image = nativeImage.createFromPath(path.join(import.meta.dirname, "../", `/assets/ping.png`)); - passedWindow.setOverlayIcon(image, "badgeCount"); - } else { - passedWindow.setOverlayIcon(null, "badgeCount"); - } - break; - } + ipcMain.on("isPowerSavingEnabled", (event) => { + event.returnValue = isPowerSavingEnabled(); }); + ipcMain.on("win-maximize", () => { passedWindow.maximize(); }); @@ -85,70 +240,75 @@ export function registerIpc(passedWindow: BrowserWindow): void { ipcMain.on("win-quit", () => { app.quit(); }); - ipcMain.on("win-forceQuit", () => { - app.exit(); - }); ipcMain.on("get-app-version", (event) => { event.returnValue = getVersion(); }); ipcMain.on("displayVersion", (event) => { event.returnValue = getDisplayVersion(); }); - ipcMain.on("modInstallState", (event) => { - event.returnValue = modInstallState; - }); ipcMain.on("restart", () => { - app.relaunch(); - app.exit(); + // workaround electron trying to relaunch from squashfs + handleRestart(); }); - ipcMain.on("saveSettings", (_event, args: Settings) => { - setConfigBulk(args); + ipcMain.on("isDev", (event) => { + event.returnValue = isDev; }); - ipcMain.on("minimizeToTray", (event) => { - event.returnValue = getConfig("minimizeToTray"); + ipcMain.on("dumpFlags", (event) => { + const flags = getAppliedFlags(); + console.log(`=== Chrome Flags === ${JSON.stringify(flags)}`); + event.returnValue = flags; }); - ipcMain.on("channel", (event) => { - event.returnValue = getConfig("channel"); + ipcMain.on("setConfig", (event, key: keyof Settings, value: Settings[keyof Settings]) => { + setConfig(key, value); + event.returnValue = undefined; }); - ipcMain.on("clientmod", (event) => { - event.returnValue = getConfig("mods"); + ipcMain.on("getRpcBlacklist", (event) => { + event.returnValue = getBlacklist(); }); - ipcMain.on("legacyCapturer", (event) => { - event.returnValue = getConfig("useLegacyCapturer"); + ipcMain.on("blacklistGame", (event, name: string, id: number) => { + blacklistGameAdd(name, id); + event.returnValue = undefined; }); - ipcMain.on("trayIcon", (event) => { - event.returnValue = getConfig("trayIcon"); + ipcMain.on("unblacklistGame", (event, id: number) => { + blacklistGameRemove(id); + event.returnValue = undefined; }); - ipcMain.on("disableAutogain", (event) => { - event.returnValue = getConfig("disableAutogain"); + ipcMain.on("addKeybind", (_event, keybind: Keybind) => { + const keybinds = getConfig("keybinds"); + keybinds.push(keybind); + setConfig("keybinds", keybinds); + refreshGlobalKeybinds(); }); - ipcMain.on("titlebar", (event) => { - event.returnValue = customTitlebar; + ipcMain.on("toggleKeybind", (_event, id: string) => { + const keybinds = getConfig("keybinds"); + const keybind = keybinds[keybinds.findIndex((x) => x.id === id)]; + keybind.enabled = !keybind.enabled; + setConfig("keybinds", keybinds); + refreshGlobalKeybinds(); }); - ipcMain.on("mobileMode", (event) => { - event.returnValue = getConfig("mobileMode"); + ipcMain.on("removeKeybind", (_event, id: string) => { + const keybinds = getConfig("keybinds"); + keybinds.splice( + keybinds.findIndex((x) => x.id === id), + 1, + ); + setConfig("keybinds", keybinds); + refreshGlobalKeybinds(); }); - // 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(); + ipcMain.on("getEntireConfig", (event) => { + const rawData = readFileSync(getConfigLocation(), "utf-8"); + event.returnValue = JSON.parse(rawData) as Settings; }); - ipcMain.on("openManagerWindow", () => { - void createTManagerWindow(); + ipcMain.on("getTranslations", (event) => { + event.returnValue = getRawLang(); }); - ipcMain.on("setting-armcordCSP", (event) => { - if (getConfig("armcordCSP")) { - event.returnValue = true; - } else { - event.returnValue = false; - } + ipcMain.on("getConfig", (event, arg: keyof Settings) => { + event.returnValue = getConfig(arg); }); - // NOTE - I assume this would return sources based on the fact that the function only ingests sources - ipcMain.handle("DESKTOP_CAPTURER_GET_SOURCES", (_event, opts: SourcesOptions) => desktopCapturer.getSources(opts)); ipcMain.on("saveSettings", (_event, args: Settings) => { console.log(args); setConfigBulk(args); }); - // REVIEW - The lower 4 functions had await sleep(1000), I'm not sure why. Behavior is same regardless ipcMain.on("openStorageFolder", () => { shell.showItemInFolder(storagePath); }); @@ -156,6 +316,9 @@ export function registerIpc(passedWindow: BrowserWindow): void { shell.showItemInFolder(themesPath); }); ipcMain.on("openPluginsFolder", () => { + shell.showItemInFolder(extensionsPath); + }); + ipcMain.on("openRuntimePluginsFolder", () => { shell.showItemInFolder(pluginsPath); }); ipcMain.on("openCrashesFolder", () => { @@ -167,18 +330,203 @@ export function registerIpc(passedWindow: BrowserWindow): void { ipcMain.on("crash", () => { process.crash(); }); - ipcMain.handle("getSetting", (_event, toGet: keyof Settings) => { - return getConfig(toGet); + ipcMain.on("getOS", (event) => { + event.returnValue = process.platform; + }); + ipcMain.on("getOSRelease", (event) => { + event.returnValue = os.release(); }); ipcMain.on("copyDebugInfo", () => { - const settingsFileContent = fs.readFileSync(getConfigLocation(), "utf-8"); + const settingsFileContent = readFileSync(getConfigLocation(), "utf-8"); clipboard.writeText( - `**OS:** ${os.platform()} ${os.version()}\n**Architecture:** ${os.arch()}\n**ArmCord version:** ${getVersion()}\n**Electron version:** ${ + `**OS:** ${os.platform()} ${os.version()}\n**Architecture:** ${os.arch()}\n**Legcord version:** ${getVersion()}\n**Electron version:** ${ process.versions.electron - }\n\`${settingsFileContent}\`` + }\n\`${settingsFileContent}\``, ); }); ipcMain.on("copyGPUInfo", () => { clipboard.writeText(JSON.stringify(app.getGPUFeatureStatus())); }); + ipcMain.on("openCustomIconDialog", () => { + dialog + .showOpenDialog({ + properties: ["openFile"], + filters: [ + { + name: getLang("dialog-customIcon-filters"), + extensions: ["ico", "png", "icns"], + }, + ], + }) + .then((result) => { + if (result.canceled) return; + console.log(result.filePaths[0]); + setConfig("customIcon", result.filePaths[0]); + }); + }); + ipcMain.on("getConstPaths", (event) => { + event.returnValue = constPaths; + }); + ipcMain.on("getProcessList", (event) => { + event.returnValue = processList; + }); + ipcMain.handle("plugins:list", () => listPlugins()); + ipcMain.handle("plugins:set-enabled", async (_event, pluginId: string, enabled: boolean) => { + if (typeof pluginId !== "string" || typeof enabled !== "boolean") { + return { ok: false }; + } + return { ok: await setPluginEnabled(pluginId, enabled) }; + }); + ipcMain.handle("plugins:reload", async (_event, pluginId: string) => { + if (typeof pluginId !== "string") return { ok: false }; + return { ok: await reloadPlugin(pluginId) }; + }); + ipcMain.handle("plugins:get-runtime-entries", (_event, target: "preload" | "renderer") => { + if (target !== "preload" && target !== "renderer") return []; + return getRuntimeEntries(target); + }); + ipcMain.handle("plugins:get-runtime-script", (_event, pluginId: string, target: "preload" | "renderer") => { + if (typeof pluginId !== "string" || (target !== "preload" && target !== "renderer")) return null; + return getRuntimeScript(pluginId, target); + }); + + // custom detectables control + ipcMain.on("refreshProcessList", () => { + refreshProcessList(); + }); + ipcMain.on("getDetectables", (event) => { + event.returnValue = getDetectables(); + }); + ipcMain.on("addDetectable", (_event, game: Game) => { + addDetectable(game); + }); + ipcMain.on("removeDetectable", (_event, id: string) => { + removeDetectable(id); + }); + + // Plugin storage API (gated by extendedPluginAbilities) + ipcMain.handle( + "pluginWriteFile", + async ( + _event, + pluginId: string, + relativePath: string, + data: string, + ): Promise<{ ok: true } | { ok: false; error: string }> => { + if (!getConfig("extendedPluginAbilities")) { + return { ok: false, error: "EXTENSION_DISABLED" }; + } + if (typeof pluginId !== "string" || typeof relativePath !== "string" || typeof data !== "string") { + return { ok: false, error: "INVALID_ARGS" }; + } + const resolved = resolvePluginFilePath(pluginId, relativePath); + if (!resolved) return { ok: false, error: "INVALID_PATH" }; + try { + mkdirSync(path.dirname(resolved), { recursive: true }); + writeFileSync(resolved, data, "utf-8"); + return { ok: true }; + } catch (err) { + return { + ok: false, + error: err instanceof Error ? err.message : "UNKNOWN", + }; + } + }, + ); + ipcMain.handle( + "pluginReadFile", + async ( + _event, + pluginId: string, + relativePath: string, + ): Promise<{ ok: true; data: string } | { ok: false; error: string }> => { + if (!getConfig("extendedPluginAbilities")) { + return { ok: false, error: "EXTENSION_DISABLED" }; + } + if (typeof pluginId !== "string" || typeof relativePath !== "string") { + return { ok: false, error: "INVALID_ARGS" }; + } + const resolved = resolvePluginFilePath(pluginId, relativePath); + if (!resolved) return { ok: false, error: "INVALID_PATH" }; + try { + if (!existsSync(resolved)) return { ok: false, error: "NOT_FOUND" }; + const data = readFileSync(resolved, "utf-8"); + return { ok: true, data }; + } catch (err) { + return { + ok: false, + error: err instanceof Error ? err.message : "UNKNOWN", + }; + } + }, + ); + + ipcMain.handle( + "backupSave", + async (_event, payloadStr: unknown): Promise<{ ok: true } | { ok: false; error: string }> => { + try { + if (typeof payloadStr !== "string") return { ok: false, error: "INVALID_ARGS" }; + const payload = JSON.parse(payloadStr) as BackupSavePayload; + if (!payload.includes || typeof payload.clientMods !== "object") { + return { ok: false, error: "INVALID_BACKUP" }; + } + const zipBuf = buildBackupZipBuffer(payload, { + userDataPath, + themesPath, + extensionsPath, + pluginsPath, + pluginStoragePath, + quickCssPath, + getConfigLocation, + }); + const result = await dialog.showSaveDialog({ + title: getLang("backup-dialogSave-title"), + defaultPath: path.join( + app.getPath("documents"), + `legcord-backup-${new Date().toISOString().slice(0, 10)}.zip`, + ), + filters: [{ name: "ZIP", extensions: ["zip"] }], + }); + if (result.canceled || !result.filePath) return { ok: false, error: "CANCELLED" }; + let filePath = result.filePath; + if (!filePath.toLowerCase().endsWith(".zip")) filePath += ".zip"; + writeFileSync(filePath, zipBuf); + return { ok: true }; + } catch (err) { + console.error(err); + return { ok: false, error: err instanceof Error ? err.message : "UNKNOWN" }; + } + }, + ); + + ipcMain.handle("backupRestore", async (): Promise => { + try { + const result = await dialog.showOpenDialog({ + title: getLang("backup-dialogOpen-title"), + properties: ["openFile"], + filters: [{ name: "ZIP", extensions: ["zip"] }], + }); + if (result.canceled || !result.filePaths[0]) { + return JSON.stringify({ ok: false, error: "CANCELLED" }); + } + const buf = readFileSync(result.filePaths[0]); + const map = readBackupZipToMap(buf); + const { clientMods } = applyBackupFromMap(map, { + userDataPath, + themesPath, + extensionsPath, + pluginsPath, + pluginStoragePath, + quickCssPath, + getConfigLocation, + }); + return JSON.stringify({ ok: true, clientMods }); + } catch (err) { + console.error(err); + return JSON.stringify({ + ok: false, + error: err instanceof Error ? err.message : "UNKNOWN", + }); + } + }); } diff --git a/src/discord/menu.ts b/src/discord/menu.ts index 41d16a1..7b59d7d 100644 --- a/src/discord/menu.ts +++ b/src/discord/menu.ts @@ -1,84 +1,146 @@ -import {BrowserWindow, Menu, app} from "electron"; -import {mainWindows} from "./window.js"; -import {createSettingsWindow} from "../settings/main.js"; -import {setForceQuit} from "../common/forceQuit.js"; +import { app, BrowserWindow, Menu, type MenuItemConstructorOptions } from "electron"; +import type { Keybind, KeybindActions } from "../@types/keybind.js"; +import { getConfig } from "../common/config.js"; +import { setForceQuit } from "../common/forceQuit.js"; +import { openSettings, 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", + pushToTalk: "keybind-pushToTalk", + leaveCall: "keybind-leaveCall", + navigateForward: "keybind-navigateForward", + navigateBack: "keybind-navigateBack", + runJavascript: "keybind-runJavascript", + openQuickCss: "keybind-openQuickCss", + openSettings: "keybind-openSettings", +}; export function setMenu(): void { - const template: Electron.MenuItemConstructorOptions[] = [ + const keybinds = getConfig("keybinds"); + const keybindSubMenu: { label: string; accelerator: string; click: () => void }[] = []; + keybinds.forEach((keybind: Keybind) => { + if (!keybind.global && keybind.enabled) { + keybindSubMenu.push({ + label: getLang(keybindActionLabels[keybind.action]), + accelerator: keybind.accelerator, + click: () => { + runAction(keybind); + }, + }); + } + }); + + const template: MenuItemConstructorOptions[] = [ { - label: "ArmCord", + label: getLang("menu-legcord"), submenu: [ - {label: "About ArmCord", role: "about"}, //orderFrontStandardAboutPanel - {type: "separator"}, + { label: getLang("menu-about"), role: "about" }, + { type: "separator" }, + { role: "services" }, + { type: "separator" }, { - label: "Developer tools", - accelerator: "CmdOrCtrl+Shift+I", + label: getLang("menu-developerTools"), + accelerator: process.platform === "darwin" ? "Cmd+Option+I" : "Ctrl+Shift+I", click() { BrowserWindow.getFocusedWindow()!.webContents.toggleDevTools(); - } + }, }, { - label: "Open settings", - accelerator: "CmdOrCtrl+Shift+'", + label: getLang("menu-openSettings"), + accelerator: "Cmd+,", click() { - void createSettingsWindow(); - } + mainWindows.forEach((mainWindow) => { + mainWindow.show(); + openSettings(); + }); + }, }, { - label: "Fullscreen", - role: "togglefullscreen" - }, - { - label: "Reload", + label: getLang("menu-reload"), accelerator: "CmdOrCtrl+R", click() { mainWindows.forEach((mainWindow) => { - mainWindow.reload(); + mainWindow.webContents.reloadIgnoringCache(); }); - } + }, }, { - label: "Restart", + label: getLang("menu-restart"), accelerator: "CmdOrCtrl+Shift+R", click() { app.relaunch(); app.exit(); - } + }, }, + { type: "separator" }, + { role: "hide" }, + { role: "hideOthers" }, + { role: "unhide" }, + { type: "separator" }, { - label: "Quit", + label: getLang("menu-quit"), accelerator: "CmdOrCtrl+Q", click() { setForceQuit(true); app.quit(); - } - } - ] + }, + }, + ], }, { - label: "Edit", + label: getLang("menu-edit"), submenu: [ - {label: "Undo", accelerator: "CmdOrCtrl+Z", role: "undo"}, - {label: "Redo", accelerator: "Shift+CmdOrCtrl+Z", role: "redo"}, - {type: "separator"}, - {label: "Cut", accelerator: "CmdOrCtrl+X", role: "cut"}, - {label: "Copy", accelerator: "CmdOrCtrl+C", role: "copy"}, - {label: "Select All", accelerator: "CmdOrCtrl+A", role: "selectAll"} - ] + { + label: getLang("menu-undo"), + accelerator: "CmdOrCtrl+Z", + click() { + BrowserWindow.getFocusedWindow()!.webContents.undo(); + }, + }, + { + label: getLang("menu-redo"), + accelerator: "Shift+CmdOrCtrl+Z", + click() { + BrowserWindow.getFocusedWindow()!.webContents.redo(); + }, + }, + { type: "separator" }, + { 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: "Zoom", + label: getLang("menu-view"), submenu: [ - {label: "Zoom in", accelerator: "CmdOrCtrl+Plus", role: "zoomIn"}, + { + label: getLang("menu-toggleFullscreen"), + role: "togglefullscreen", + }, + { 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"}, - {type: "separator"}, - {label: "Reset zoom", accelerator: "CmdOrCtrl+0", role: "resetZoom"} - ] - } + { label: getLang("menu-zoomIn"), accelerator: "CmdOrCtrl+=", role: "zoomIn", visible: false }, + { label: getLang("menu-zoomOut"), accelerator: "CmdOrCtrl+-", role: "zoomOut" }, + { type: "separator" }, + { label: getLang("menu-resetZoom"), accelerator: "CmdOrCtrl+0", role: "resetZoom" }, + ], + }, + { + label: getLang("menu-window"), + submenu: [ + { label: getLang("menu-minimize"), accelerator: "Cmd+M", role: "minimize" }, + { label: getLang("menu-close"), accelerator: "Cmd+W", role: "close" }, + ], + }, + { + label: getLang("menu-keybind"), + submenu: keybindSubMenu, + }, ]; - Menu.setApplicationMenu(Menu.buildFromTemplate(template)); } diff --git a/src/discord/plugins/manager.ts b/src/discord/plugins/manager.ts new file mode 100644 index 0000000..c2913a9 --- /dev/null +++ b/src/discord/plugins/manager.ts @@ -0,0 +1,310 @@ +import { existsSync, mkdirSync, readdirSync, readFileSync } from "node:fs"; +import path from "node:path"; +import { pathToFileURL } from "node:url"; +import { app, BrowserWindow, dialog, ipcMain, shell } from "electron"; +import { after, before, instead } from "spitroast/dist/index.mjs"; +import { getConfig, setConfig } from "../../common/config.js"; + +type PluginTarget = "main" | "preload" | "renderer"; +type Cleanup = () => void; + +interface PluginManifest { + id: string; + name: string; + version: string; + description?: string; + author?: string; + main?: string; + preload?: string; + renderer?: string; + compatibleVersions?: string[]; +} + +interface PluginRecord { + manifest: PluginManifest; + directory: string; + enabled: boolean; + compatible: boolean; + compatibilityMessage?: string; + loadedMain: boolean; + cleanups: Cleanup[]; +} + +interface PluginMainApi { + id: string; + manifest: PluginManifest; + logger: Pick; + patcher: { + before: typeof before; + after: typeof after; + instead: typeof instead; + }; + electron: { + app: typeof app; + BrowserWindow: typeof BrowserWindow; + ipcMain: typeof ipcMain; + dialog: typeof dialog; + shell: typeof shell; + }; + onCleanup: (cleanup: Cleanup) => void; +} + +const pluginFolder = path.join(app.getPath("userData"), "/plugins"); +const currentLegcordVersion = app.getVersion(); +const records = new Map(); +const VALID_PLUGIN_ID = /^[a-zA-Z0-9._-]{1,64}$/; +const VALID_ENTRY_PATH = /^[^<>:"|?*\0]+$/; + +function getPluginStates() { + const states = getConfig("pluginStates"); + if (states && typeof states === "object") { + return states as Record; + } + return {}; +} + +function setPluginState(pluginId: string, enabled: boolean) { + const states = getPluginStates(); + states[pluginId] = enabled; + setConfig("pluginStates", states); +} + +function getLogPrefix(id: string) { + return `[Plugin:${id}]`; +} + +function parseManifest(pluginDir: string): PluginManifest | null { + const manifestPath = path.join(pluginDir, "manifest.json"); + if (!existsSync(manifestPath)) return null; + try { + const parsed = JSON.parse(readFileSync(manifestPath, "utf-8")) as PluginManifest; + if (!parsed.id || !parsed.name || !parsed.version) return null; + if (!VALID_PLUGIN_ID.test(parsed.id)) { + console.error(`[Plugin Manager] Invalid plugin id "${parsed.id}"`); + return null; + } + if (typeof parsed.name !== "string" || parsed.name.length > 128) { + console.error(`[Plugin Manager] ${parsed.id}: invalid plugin name`); + return null; + } + if (typeof parsed.version !== "string" || parsed.version.length > 64) { + console.error(`[Plugin Manager] ${parsed.id}: invalid plugin version`); + return null; + } + if ( + typeof parsed.main === "undefined" && + typeof parsed.preload === "undefined" && + typeof parsed.renderer === "undefined" + ) { + console.error(`[Plugin Manager] ${parsed.id}: at least one of main/preload/renderer must be defined`); + return null; + } + if ( + (parsed.main && !VALID_ENTRY_PATH.test(parsed.main)) || + (parsed.preload && !VALID_ENTRY_PATH.test(parsed.preload)) || + (parsed.renderer && !VALID_ENTRY_PATH.test(parsed.renderer)) + ) { + console.error(`[Plugin Manager] ${parsed.id}: invalid entry path`); + return null; + } + if ( + typeof parsed.compatibleVersions !== "undefined" && + (!Array.isArray(parsed.compatibleVersions) || + parsed.compatibleVersions.some((version) => typeof version !== "string")) + ) { + console.error(`[Plugin Manager] ${parsed.id}: compatibleVersions must be an array of strings`); + return null; + } + return parsed; + } catch (error) { + console.error(`[Plugin Manager] Failed to parse manifest in ${pluginDir}`, error); + return null; + } +} + +function isCompatibleVersion(versionPattern: string, version: string): boolean { + if (versionPattern === "*" || versionPattern === version) return true; + if (versionPattern.endsWith(".x")) { + const prefix = versionPattern.slice(0, -2); + return version === prefix || version.startsWith(`${prefix}.`); + } + return false; +} + +function getCompatibility(manifest: PluginManifest): { compatible: boolean; message?: string } { + const supported = manifest.compatibleVersions; + if (!supported || supported.length === 0) { + return { compatible: true }; + } + const compatible = supported.some((pattern) => isCompatibleVersion(pattern, currentLegcordVersion)); + if (compatible) return { compatible: true }; + return { + compatible: false, + message: `Incompatible with Legcord ${currentLegcordVersion} (supports: ${supported.join(", ")})`, + }; +} + +function resolvePluginEntry(record: PluginRecord, target: PluginTarget) { + const entry = record.manifest[target]; + if (!entry) return null; + const resolved = path.resolve(record.directory, entry); + const relative = path.relative(record.directory, resolved); + if (relative.startsWith("..") || path.isAbsolute(relative)) return null; + if (!existsSync(resolved)) return null; + return resolved; +} + +async function loadMain(record: PluginRecord) { + if (record.loadedMain) return; + const entry = resolvePluginEntry(record, "main"); + if (!entry) return; + + const loggerPrefix = getLogPrefix(record.manifest.id); + const api: PluginMainApi = { + id: record.manifest.id, + manifest: record.manifest, + logger: { + log: (...args) => console.log(loggerPrefix, ...args), + warn: (...args) => console.warn(loggerPrefix, ...args), + error: (...args) => console.error(loggerPrefix, ...args), + }, + patcher: { + before, + after, + instead, + }, + electron: { + app, + BrowserWindow, + ipcMain, + dialog, + shell, + }, + onCleanup: (cleanup) => { + record.cleanups.push(cleanup); + }, + }; + + const moduleUrl = `${pathToFileURL(entry).href}?v=${Date.now()}`; + const mod = (await import(moduleUrl)) as { + default?: (api: PluginMainApi) => void | Promise; + activate?: (api: PluginMainApi) => void | Promise; + }; + const entrypoint = mod.activate ?? mod.default; + if (typeof entrypoint === "function") { + await entrypoint(api); + } + record.loadedMain = true; +} + +function disableMain(record: PluginRecord) { + if (!record.loadedMain) return; + for (const cleanup of record.cleanups.splice(0)) { + try { + cleanup(); + } catch (error) { + console.error(`[Plugin Manager] Cleanup failed for ${record.manifest.id}`, error); + } + } + record.loadedMain = false; +} + +export async function initializePluginSystem() { + if (!existsSync(pluginFolder)) { + mkdirSync(pluginFolder, { recursive: true }); + } + + const discovered: PluginRecord[] = []; + for (const child of readdirSync(pluginFolder)) { + const full = path.join(pluginFolder, child); + const manifest = parseManifest(full); + if (!manifest) continue; + const state = getPluginStates(); + const enabled = state[manifest.id] ?? false; + const compatibility = getCompatibility(manifest); + discovered.push({ + manifest, + directory: full, + enabled, + compatible: compatibility.compatible, + ...(compatibility.message !== undefined ? { compatibilityMessage: compatibility.message } : {}), + loadedMain: false, + cleanups: [], + }); + } + + records.clear(); + for (const record of discovered) { + records.set(record.manifest.id, record); + } + + for (const record of records.values()) { + if (!record.enabled || !record.compatible) continue; + await loadMain(record); + } +} + +export async function setPluginEnabled(pluginId: string, enabled: boolean) { + const record = records.get(pluginId); + if (!record) return false; + if (enabled && !record.compatible) return false; + setPluginState(pluginId, enabled); + record.enabled = enabled; + if (enabled) { + await loadMain(record); + } else { + disableMain(record); + } + return true; +} + +export async function reloadPlugin(pluginId: string) { + const record = records.get(pluginId); + if (!record) return false; + if (!record.compatible) return false; + disableMain(record); + if (record.enabled) { + await loadMain(record); + } + return true; +} + +export function listPlugins() { + return [...records.values()].map((record) => ({ + id: record.manifest.id, + name: record.manifest.name, + version: record.manifest.version, + description: record.manifest.description, + author: record.manifest.author, + enabled: record.enabled, + compatible: record.compatible, + compatibilityMessage: record.compatibilityMessage, + compatibleVersions: record.manifest.compatibleVersions ?? [], + hasMain: Boolean(record.manifest.main), + hasPreload: Boolean(record.manifest.preload), + hasRenderer: Boolean(record.manifest.renderer), + })); +} + +export function getRuntimeEntries(target: Exclude) { + return [...records.values()] + .filter((record) => record.enabled && record.compatible) + .map((record) => { + const entry = resolvePluginEntry(record, target); + if (!entry) return null; + return { + id: record.manifest.id, + name: record.manifest.name, + path: entry, + }; + }) + .filter((entry): entry is { id: string; name: string; path: string } => entry !== null); +} + +export function getRuntimeScript(pluginId: string, target: Exclude) { + const record = records.get(pluginId); + if (!record?.enabled || !record.compatible) return null; + const entry = resolvePluginEntry(record, target); + if (!entry) return null; + return readFileSync(entry, "utf-8"); +} diff --git a/src/discord/preload/bridge.ts b/src/discord/preload/bridge.ts index 0529d9b..81c492a 100644 --- a/src/discord/preload/bridge.ts +++ b/src/discord/preload/bridge.ts @@ -1,73 +1,159 @@ -import {contextBridge, ipcRenderer, type SourcesOptions} from "electron"; -import {injectTitlebar} from "./titlebar.mjs"; -import type {ArmCordWindow} from "../../types/armcordWindow.d.js"; -const CANCEL_ID = "desktop-capturer-selection__cancel"; -const desktopCapturer = { - getSources: (opts: SourcesOptions) => ipcRenderer.invoke("DESKTOP_CAPTURER_GET_SOURCES", opts) -}; +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"; +import type { ThemeManifest } from "../../@types/themeManifest.js"; +import type { AppliedFlagsOutput } from "../../main.js"; +import type { venmicListObject } from "../venmic.js"; + interface IPCSources { id: string; name: string; thumbnail: HTMLCanvasElement; } -async function getDisplayMediaSelector(): Promise { - const sources = (await desktopCapturer.getSources({ - types: ["screen", "window"] - })) as IPCSources[]; - return `
-
    - ${sources - .map( - ({id, name, thumbnail}) => ` -
  • - -
  • - ` - ) - .join("")} -
  • - -
  • -
-
`; +interface LegcordPluginInfo { + id: string; + name: string; + version: string; + description?: string; + author?: string; + enabled: boolean; + compatible: boolean; + compatibilityMessage?: string; + compatibleVersions: string[]; + hasMain: boolean; + hasPreload: boolean; + hasRenderer: boolean; } -contextBridge.exposeInMainWorld("armcord", { + +contextBridge.exposeInMainWorld("legcord", { window: { show: () => ipcRenderer.send("win-show"), hide: () => ipcRenderer.send("win-hide"), minimize: () => ipcRenderer.send("win-minimize"), - maximize: () => ipcRenderer.send("win-maximize") + 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"), }, - titlebar: { - injectTitlebar: () => injectTitlebar(), - isTitlebar: ipcRenderer.sendSync("titlebar") as boolean + settings: { + getConfig: () => ipcRenderer.sendSync("getEntireConfig") as Settings, + setConfig: (key: string, value: unknown) => ipcRenderer.sendSync("setConfig", key, value), + addKeybind: (keybind: Keybind) => ipcRenderer.send("addKeybind", keybind), + toggleKeybind: (id: string) => ipcRenderer.send("toggleKeybind", id), + removeKeybind: (id: string) => ipcRenderer.send("removeKeybind", id), + openStorageFolder: () => ipcRenderer.send("openStorageFolder"), + setLang: (lang: string) => ipcRenderer.send("setLang", lang), + openThemesFolder: () => ipcRenderer.send("openThemesFolder"), + openCustomIconDialog: () => ipcRenderer.send("openCustomIconDialog"), + copyDebugInfo: () => ipcRenderer.send("copyDebugInfo"), + copyGPUInfo: () => ipcRenderer.send("copyGPUInfo"), + dumpFlags: () => ipcRenderer.sendSync("dumpFlags") as AppliedFlagsOutput, + }, + touchbar: { + setVoiceTouchbar: (state: boolean) => ipcRenderer.send("setVoiceTouchbar", state), + setVoiceState: (mute: boolean, deafen: boolean) => ipcRenderer.send("setVoiceState", mute, deafen), + importGuilds: (guilds: Array) => ipcRenderer.send("importGuilds", guilds), + }, + power: { + setPowerSaving: (state: boolean) => ipcRenderer.send("setPowerSaving", state), + isPowerSavingEnabled: () => ipcRenderer.sendSync("isPowerSavingEnabled"), }, electron: process.versions.electron, - channel: ipcRenderer.sendSync("channel") as string, - setPingCount: (pingCount: number) => ipcRenderer.send("setPing", pingCount), - setTrayIcon: (favicon: string) => ipcRenderer.send("sendTrayIcon", favicon), - getLang: (toGet: string) => - ipcRenderer.invoke("getLang", toGet).then((result) => { + translations: ipcRenderer.sendSync("getTranslations") as string, + getLang: async (toGet: string) => + await ipcRenderer.invoke("getLang", toGet).then((result: string) => { return result as string; }), - getDisplayMediaSelector, + screenshare: { + getSources: ( + callback: (event: Electron.IpcRendererEvent, sources: IPCSources[], ...args: unknown[]) => void, + ) => { + ipcRenderer.on("getSources", callback); + }, + start: (source: string, name: string, audio: boolean) => + ipcRenderer.send("startScreenshare", source, name, audio), + venmicStart: async (include: Node[]) => + await ipcRenderer.invoke("venmicStart", include).then((result: venmicListObject) => { + return result as venmicListObject; + }), + venmicSystemStart: async (exclude: Node[]) => + await ipcRenderer.invoke("venmicSystemStart", exclude).then((result: boolean) => { + return result as boolean; + }), + venmicList: async () => + await ipcRenderer.invoke("venmicList").then((result: undefined) => { + return result as undefined; + }), + venmicStop: async () => + await ipcRenderer.invoke("venmicStop").then((result: undefined) => { + return result as undefined; + }), + }, version: ipcRenderer.sendSync("get-app-version", "app-version") as string, - mods: ipcRenderer.sendSync("clientmod") as string, - openSettingsWindow: () => ipcRenderer.send("openSettingsWindow") -} as ArmCordWindow); -let windowCallback: (arg0: object) => void; -contextBridge.exposeInMainWorld("ArmCordRPC", { - // REVIEW - I don't think this is right - listen: (callback: () => void) => { - windowCallback = callback; - } -}); -ipcRenderer.on("rpc", (_event, data: object) => { - console.log(data); - windowCallback(data); -}); + 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, + uninstall: (id: string) => ipcRenderer.send("uninstallTheme", id), + edit: (id: string) => ipcRenderer.send("editTheme", id), + getThemes: () => ipcRenderer.sendSync("getThemes") as ThemeManifest[], + openImportPicker: () => ipcRenderer.send("openImportPicker"), + 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), + enableQuickCss: () => ipcRenderer.send("enableQuickCss"), + disableQuickCss: () => ipcRenderer.send("disableQuickCss"), + }, + rpc: { + 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[], + getBlacklist: () => ipcRenderer.sendSync("getRpcBlacklist") as { name: string; id: number }[], + blacklistGame: (name: string, id: number) => ipcRenderer.sendSync("blacklistGame", name, id), + unblacklistGame: (id: number) => ipcRenderer.sendSync("unblacklistGame", id), + }, + backup: { + save: (data: string) => + ipcRenderer.invoke("backupSave", data) as Promise<{ ok: true } | { ok: false; error: string }>, + restore: () => ipcRenderer.invoke("backupRestore") as Promise, + }, + plugins: { + list: () => ipcRenderer.invoke("plugins:list") as Promise, + setEnabled: (id: string, enabled: boolean) => + ipcRenderer.invoke("plugins:set-enabled", id, enabled) as Promise<{ ok: boolean }>, + reload: (id: string) => ipcRenderer.invoke("plugins:reload", id) as Promise<{ ok: boolean }>, + openFolder: () => ipcRenderer.send("openRuntimePluginsFolder"), + }, + fs: { + /** + * Write a file in this plugin's scoped storage (e.g. "cache/deleted-messages.json"). + * Only works when the user has enabled "Extended plugin abilities" in Legcord settings. + * @param pluginId - Your plugin id (alphanumeric, dash, underscore only) + * @param relativePath - Path relative to plugin storage (no ".." allowed) + * @returns { ok: true } or { ok: false, error: "EXTENSION_DISABLED" | "INVALID_PATH" | ... } + */ + writeFile: (pluginId: string, relativePath: string, data: string) => + ipcRenderer.invoke("pluginWriteFile", pluginId, relativePath, data) as Promise< + { ok: true } | { ok: false; error: string } + >, + /** + * Read a file from this plugin's scoped storage. + * Only works when the user has enabled "Extended plugin abilities" in Legcord settings. + * @param pluginId - Your plugin id + * @param relativePath - Path relative to plugin storage + * @returns { ok: true, data: string } or { ok: false, error: "EXTENSION_DISABLED" | "NOT_FOUND" | ... } + */ + readFile: (pluginId: string, relativePath: string) => + ipcRenderer.invoke("pluginReadFile", pluginId, relativePath) as Promise< + { ok: true; data: string } | { ok: false; error: string } + >, + }, +} as unknown as LegcordWindow); diff --git a/src/discord/preload/capturer.ts b/src/discord/preload/capturer.ts deleted file mode 100644 index 7216019..0000000 --- a/src/discord/preload/capturer.ts +++ /dev/null @@ -1,54 +0,0 @@ -//Fixed context isolation version https://github.com/getferdi/ferdi/blob/develop/src/webview/screenshare.ts -//original https://github.com/electron/electron/issues/16513#issuecomment-602070250 -import fs from "fs"; -import path from "path"; -import {addScript, addStyle} from "../../common/dom.js"; - -const CANCEL_ID = "desktop-capturer-selection__cancel"; - -const screenShareJS = ` -window.navigator.mediaDevices.getDisplayMedia = () => new Promise(async (resolve, reject) => { - try { - const selectionElem = document.createElement('div'); - selectionElem.classList = ['desktop-capturer-selection']; - selectionElem.innerHTML = await window.armcord.getDisplayMediaSelector(); - document.body.appendChild(selectionElem); - document - .querySelectorAll('.desktop-capturer-selection__btn') - .forEach((button) => { - button.addEventListener('click', async () => { - try { - const id = button.getAttribute('data-id'); - if (id === '${CANCEL_ID}') { - reject(new Error('Cancelled by user')); - } else { - const stream = await window.navigator.mediaDevices.getUserMedia({ - audio: false, - video: { - mandatory: { - chromeMediaSource: 'desktop', - chromeMediaSourceId: id, - }, - }, - }); - resolve(stream); - } - } catch (err) { - reject(err); - } finally { - selectionElem.remove(); - } - }); - }); - } catch (err) { - reject(err); - } -}); -`; - -document.addEventListener("DOMContentLoaded", function () { - addScript(screenShareJS); - const screenshareCss = path.join(import.meta.dirname, "../", "/content/css/screenshare.css"); - addStyle(fs.readFileSync(screenshareCss, "utf8")); - console.log("Capturer injected."); -}); diff --git a/src/discord/preload/mobile.ts b/src/discord/preload/mobile.ts deleted file mode 100644 index 28e3e0b..0000000 --- a/src/discord/preload/mobile.ts +++ /dev/null @@ -1,14 +0,0 @@ -import {addStyle} from "../../common/dom.js"; -import fs from "fs"; -import path from "path"; -export function injectMobileStuff(): void { - document.addEventListener("DOMContentLoaded", function () { - const mobileCSS = path.join(import.meta.dirname, "../", "/content/css/mobile.css"); - addStyle(fs.readFileSync(mobileCSS, "utf8")); - // TO-DO: clicking on the logo, or additional button triggers ESC button to move around the UI quicker - // var logo = document.getElementById("window-title"); - // logo!.addEventListener("click", () => { - // - // }); - }); -} diff --git a/src/discord/preload/mods/custom.mts b/src/discord/preload/mods/custom.mts new file mode 100644 index 0000000..df93878 --- /dev/null +++ b/src/discord/preload/mods/custom.mts @@ -0,0 +1,20 @@ +const { ipcRenderer, webFrame } = require("electron"); + +import type { ModBundle } from "../../../@types/ModBundle.js"; + +async function inject() { + try { + await ipcRenderer.invoke("getCustomBundle").then(async (bundle: ModBundle) => { + if (bundle?.enabled) { + await webFrame.executeJavaScript(bundle.js); + if (bundle.css) { + webFrame.insertCSS(bundle.css); //NOTE - Custom mods might require CSS. + } + } + }); + } catch (error) { + console.error("Custom bundle failed to load!"); + console.error(error); + } +} +inject(); diff --git a/src/discord/preload/mods/equicord.mts b/src/discord/preload/mods/equicord.mts new file mode 100644 index 0000000..4e83788 --- /dev/null +++ b/src/discord/preload/mods/equicord.mts @@ -0,0 +1,18 @@ +const { ipcRenderer, webFrame } = require("electron"); + +import type { ModBundle } from "../../../@types/ModBundle.js"; + +async function inject() { + try { + await ipcRenderer.invoke("getEquicordBundle").then(async (bundle: ModBundle) => { + if (bundle?.enabled) { + await webFrame.executeJavaScript(bundle.js); + webFrame.insertCSS(bundle.css!); //NOTE - Equicord requires CSS. + } + }); + } catch (error) { + console.error("Equicord Failed to load!"); + console.error(error); + } +} +inject(); diff --git a/src/discord/preload/mods/shelter.mts b/src/discord/preload/mods/shelter.mts new file mode 100644 index 0000000..90a2d54 --- /dev/null +++ b/src/discord/preload/mods/shelter.mts @@ -0,0 +1,32 @@ +const { ipcRenderer, webFrame } = require("electron"); + +import type { ModBundle } from "../../../@types/ModBundle.js"; + +const requiredPlugins: Record }]> = { + "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: {} }], + "legcord-titlebar": ["legcord://plugins/titlebar/", { isVisible: false, allowedActions: {} }], +}; +if (process.platform === "darwin") { + requiredPlugins["legcord-touchbar"] = [ + "legcord://plugins/touchbar/", + { isVisible: true, allowedActions: { toggle: true } }, + ]; +} +async function inject() { + try { + await ipcRenderer.invoke("getShelterBundle").then(async (bundle: ModBundle) => { + if (bundle?.enabled) { + await webFrame.executeJavaScript(`(()=>{ + const SHELTER_INJECTOR_PLUGINS = ${JSON.stringify(requiredPlugins)}; + ${bundle.js} + })()`); + } + }); + } catch (e) { + console.error(e); + } +} +inject(); diff --git a/src/discord/preload/mods/vencord.mts b/src/discord/preload/mods/vencord.mts new file mode 100644 index 0000000..1612c9f --- /dev/null +++ b/src/discord/preload/mods/vencord.mts @@ -0,0 +1,18 @@ +const { ipcRenderer, webFrame } = require("electron"); + +import type { ModBundle } from "../../../@types/ModBundle.js"; + +async function inject() { + try { + await ipcRenderer.invoke("getVencordBundle").then(async (bundle: ModBundle) => { + if (bundle?.enabled) { + await webFrame.executeJavaScript(bundle.js); + webFrame.insertCSS(bundle.css!); //NOTE - Vencord requires CSS. + } + }); + } catch (error) { + console.error("Vencord Failed to load!"); + console.error(error); + } +} +inject(); diff --git a/src/discord/preload/newTitlebar.mts b/src/discord/preload/newTitlebar.mts new file mode 100644 index 0000000..cf079eb --- /dev/null +++ b/src/discord/preload/newTitlebar.mts @@ -0,0 +1,32 @@ +const { ipcRenderer } = require("electron"); + +import { addStyle } from "../../common/dom.js"; +import { sleep } from "../../common/sleep.js"; + +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"); + 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; + } + }); +} diff --git a/src/discord/preload/optimizer.ts b/src/discord/preload/optimizer.ts index c1a58a7..770524a 100644 --- a/src/discord/preload/optimizer.ts +++ b/src/discord/preload/optimizer.ts @@ -1,13 +1,13 @@ type OptimizableFunction = (child: T) => T; const optimize = (orig: OptimizableFunction) => { - return function (this: Element, ...args: [Element]) { - if (typeof args[0]?.className === "string" && args[0].className.indexOf("activity") !== -1) { - // @ts-expect-error - // FIXME - return setTimeout(() => orig.apply(this, args), 100); + return function (this: Element, ...args: [Element]): T | number { + if (typeof args[0]?.className === "string" && args[0].className.includes("activity")) { + // fix by xql.dev <@1356430365774053448> + setTimeout(() => orig.apply(this, args as unknown as [T]), 100); + return args[0] as unknown as T; } - // @ts-expect-error - // FIXME - return orig.apply(this, args); + return orig.apply(this, args as unknown as [T]); } as unknown as OptimizableFunction; }; diff --git a/src/discord/preload/patches.mts b/src/discord/preload/patches.mts new file mode 100644 index 0000000..025cf17 --- /dev/null +++ b/src/discord/preload/patches.mts @@ -0,0 +1,209 @@ +import { addScript, addStyle, injectJS } from "../../common/dom.js"; +import { sleep } from "../../common/sleep.js"; + +const { ipcRenderer } = require("electron"); +const version = ipcRenderer.sendSync("displayVersion") as string; + +{ + const script = document.createElement("script"); + script.textContent = `if (window.PublicKeyCredential) { + try { + Object.defineProperty(PublicKeyCredential, "isConditionalMediationAvailable", { + value: async () => false, writable: true, configurable: true + }); + Object.defineProperty(PublicKeyCredential, "getClientCapabilities", { + value: async () => ({}), writable: true, configurable: true + }); + } catch {} +}`; + + if (document.documentElement) { + document.documentElement.prepend(script); + } else { + const observer = new MutationObserver(() => { + if (document.documentElement) { + observer.disconnect(); + document.documentElement.prepend(script); + } + }); + observer.observe(document, { childList: true }); + } +} + +// Fix: Chromium on macOS ignores video deviceId when passed as an "ideal" constraint +// (plain string), always returning the first camera. Discord passes deviceId this way. +// This patch promotes "ideal" to "exact", stops active tracks before switching so macOS +// releases the hardware, and falls back to the original behavior if "exact" fails. +// Injected into the page context because contextIsolation is enabled. +// See: https://github.com/electron/electron/issues/44502 +// Stopping prior audio streams on every new getUserMedia breaks Discord on Windows/Linux +// (multiple object-shaped audio requests); keep that behavior only on darwin. +{ + const stopPrevAudioStreams = process.platform === "darwin"; + const cameraFixScript = document.createElement("script"); + cameraFixScript.textContent = `(function() { + var legcordStopPrevAudioStreams = ${stopPrevAudioStreams}; + var _origGUM = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices); + var _activeVideoStreams = []; + var _activeAudioStreams = []; + + function stopTrackedStreams(list, kind) { + for (var i = 0; i < list.length; i++) { + var stream = list[i].deref(); + if (stream) { + var tracks = kind === "video" ? stream.getVideoTracks() : stream.getAudioTracks(); + for (var j = 0; j < tracks.length; j++) { + if (tracks[j].readyState === "live") tracks[j].stop(); + } + } + } + list.length = 0; + } + + function trackStream(stream) { + var ref = new WeakRef(stream); + if (stream.getVideoTracks().length > 0) _activeVideoStreams.push(ref); + if (legcordStopPrevAudioStreams && stream.getAudioTracks().length > 0) _activeAudioStreams.push(ref); + } + + navigator.mediaDevices.getUserMedia = async function(constraints) { + var hasVideo = constraints && constraints.video && typeof constraints.video !== "boolean"; + var hasAudio = constraints && constraints.audio && typeof constraints.audio !== "boolean"; + + // Release previous hardware when new request comes in for the same kind (audio: darwin only) + if (hasVideo && _activeVideoStreams.length > 0) stopTrackedStreams(_activeVideoStreams, "video"); + if (legcordStopPrevAudioStreams && hasAudio && _activeAudioStreams.length > 0) stopTrackedStreams(_activeAudioStreams, "audio"); + + var hasStringVideoDeviceId = hasVideo && typeof constraints.video.deviceId === "string"; + if (!hasStringVideoDeviceId) { + var stream = await _origGUM(constraints); + trackStream(stream); + return stream; + } + + // Promote video "ideal" (plain string) to "exact" to force device selection + var requestedId = constraints.video.deviceId; + var modified = Object.assign({}, constraints); + modified.video = Object.assign({}, constraints.video, { + deviceId: { exact: requestedId } + }); + + // Retry with exponential backoff — first attempt is immediate, subsequent + // attempts double the delay (50, 100, 200, 400...) until the device is released. + var MAX_RETRIES = 5; + var lastErr; + var delay = 50; + for (var i = 0; i < MAX_RETRIES; i++) { + if (i > 0) { + await new Promise(function(r) { setTimeout(r, delay); }); + delay *= 2; + } + try { + var stream = await _origGUM(modified); + trackStream(stream); + return stream; + } catch(e) { + lastErr = e; + if (e.name === "NotReadableError") continue; + break; + } + } + + // All retries exhausted or non-retryable error — fall back to original ideal constraint + if (lastErr) { + console.warn("[Legcord] Exact deviceId failed, falling back to ideal:", lastErr.name, lastErr.message); + } + var fallbackStream = await _origGUM(constraints); + trackStream(fallbackStream); + return fallbackStream; + }; +})();`; + + if (document.documentElement) { + document.documentElement.prepend(cameraFixScript); + } else { + const fixObserver = new MutationObserver(() => { + if (document.documentElement) { + fixObserver.disconnect(); + document.documentElement.prepend(cameraFixScript); + } + }); + fixObserver.observe(document, { childList: true }); + } +} + +export async function getVirtmic() { + try { + const devices = await navigator.mediaDevices.enumerateDevices(); + const audioDevice = devices.find(({ label }) => label === "vencord-screen-share"); + return audioDevice?.deviceId; + } catch (_error) { + return null; + } +} + +async function load() { + await sleep(5000).then(() => { + const original = navigator.mediaDevices.getDisplayMedia; + navigator.mediaDevices.getDisplayMedia = async function (opts) { + const stream = await original.call(this, opts); + const id = await getVirtmic(); + + if (id) { + const audio = await navigator.mediaDevices.getUserMedia({ + audio: { + deviceId: { + exact: id, + }, + autoGainControl: false, + echoCancellation: false, + noiseSuppression: false, + }, + }); + audio.getAudioTracks().forEach((t) => stream.addTrack(t)); + } + + return stream; + }; + + // dirty hack to make clicking notifications focus Legcord + addScript(` + (() => { + const originalSetter = Object.getOwnPropertyDescriptor(Notification.prototype, "onclick").set; + Object.defineProperty(Notification.prototype, "onclick", { + set(onClick) { + originalSetter.call(this, function() { + onClick.apply(this, arguments); + legcord.window.show(); + }) + }, + configurable: true + }); + })(); + `); + addScript(` + shelter.plugins.removePlugin("armcord-settings") + shelter.plugins.removePlugin("armcord-screenshare") + `); + if (ipcRenderer.sendSync("getConfig", "disableAutogain")) { + injectJS("legcord://assets/js/disableAutogain.js"); + } + addStyle("legcord://assets/css/discord.css"); + }); + injectJS("legcord://assets/js/patchVencordQuickCSS.js"); + // Settings info version injection + const observer = new MutationObserver(() => { + if (document.body.querySelector("#ac-ver")) return; + + const info = document.body.querySelector('[class*="sidebar"] [class*="compactInfo"]'); + const host = info?.parentElement; + if (!host || !/(stable|ptb|canary) \d+|Electron|Chromium/i.test(host.textContent)) return; + + const el = host.querySelector("span")!.cloneNode() as HTMLSpanElement; + el.id = "ac-ver"; + el.textContent = `Legcord Version: ${version}`; + info.after(el); + }); + observer.observe(document.body, { childList: true, subtree: true }); +} +load(); diff --git a/src/discord/preload/plugins.mts b/src/discord/preload/plugins.mts new file mode 100644 index 0000000..4be0f75 --- /dev/null +++ b/src/discord/preload/plugins.mts @@ -0,0 +1,185 @@ +const { ipcRenderer, webFrame } = require("electron"); +const { after, before, instead } = require("spitroast/dist/index.js"); + +type RuntimeEntry = { + id: string; + name: string; + path: string; +}; + +const cleanupMap = new Map void>>(); + +function addCleanup(pluginId: string, cleanup: () => void) { + const current = cleanupMap.get(pluginId) ?? []; + current.push(cleanup); + cleanupMap.set(pluginId, current); +} + +function clearCleanup(pluginId: string) { + const cleanups = cleanupMap.get(pluginId); + if (!cleanups) return; + for (const cleanup of cleanups.splice(0)) { + try { + cleanup(); + } catch (error) { + console.error(`[Plugin:${pluginId}] cleanup failed`, error); + } + } +} + +function createApi(pluginId: string, pluginName: string) { + const loggerPrefix = `[Plugin:${pluginId}]`; + return { + id: pluginId, + name: pluginName, + logger: { + log: (...args: unknown[]) => console.log(loggerPrefix, ...args), + warn: (...args: unknown[]) => console.warn(loggerPrefix, ...args), + error: (...args: unknown[]) => console.error(loggerPrefix, ...args), + }, + patcher: { + before: (...args: Parameters) => { + const unpatch = before(...args); + addCleanup(pluginId, unpatch); + return unpatch; + }, + after: (...args: Parameters) => { + const unpatch = after(...args); + addCleanup(pluginId, unpatch); + return unpatch; + }, + instead: (...args: Parameters) => { + const unpatch = instead(...args); + addCleanup(pluginId, unpatch); + return unpatch; + }, + }, + onCleanup: (cleanup: () => void) => addCleanup(pluginId, cleanup), + }; +} + +async function executePreloadPluginSource(_pluginId: string, source: string, api: ReturnType) { + const runner = new Function( + "api", + ` +const mod = { exports: {} }; +const module = mod; +const exports = mod.exports; +${source} +const activate = mod.exports.activate ?? mod.exports.default ?? globalThis.activatePlugin; +if (typeof activate === "function") { + return activate(api); +} +`, + ) as (api: ReturnType) => unknown; + await Promise.resolve(runner(api)); +} + +async function loadPreloadPlugins() { + const entries = (await ipcRenderer.invoke("plugins:get-runtime-entries", "preload")) as RuntimeEntry[]; + for (const entry of entries) { + clearCleanup(entry.id); + try { + const source = (await ipcRenderer.invoke("plugins:get-runtime-script", entry.id, "preload")) as + | string + | null; + if (!source) continue; + await executePreloadPluginSource(entry.id, source, createApi(entry.id, entry.name)); + } catch (error) { + console.error(`[Plugin:${entry.id}] preload entry failed`, error); + } + } +} + +function getRendererBootstrap(pluginId: string, pluginName: string, source: string) { + return ` +(() => { + const g = globalThis; + const stores = g.__legcordPluginPatches ?? (g.__legcordPluginPatches = new WeakMap()); + const unpatchAll = () => { g.__legcordPluginPatches = new WeakMap(); }; + const patch = (type, name, parent, callback, oneTime = false) => { + if (!parent || typeof parent[name] !== "function") throw new Error(\`Cannot patch \${String(name)}\`); + const original = parent[name]; + let bucket = stores.get(original); + if (!bucket) { + bucket = { o: original, b: new Map(), i: new Map(), a: new Map(), c: [] }; + const proxy = new Proxy(original, { + apply(_target, thisArg, argArray) { + let args = [...argArray]; + for (const hook of bucket.b.values()) { + const next = hook.call(thisArg, args); + if (Array.isArray(next)) args = next; + } + const callOriginal = (...inner) => Reflect.apply(original, thisArg, inner); + let ret = [...bucket.i.values()].reduceRight((prev, cur) => (...inner) => cur.call(thisArg, inner, prev), callOriginal)(...args); + for (const hook of bucket.a.values()) ret = hook.call(thisArg, args, ret) ?? ret; + for (const cleanup of bucket.c) cleanup(); + bucket.c.length = 0; + return ret; + } + }); + stores.set(proxy, bucket); + parent[name] = proxy; + bucket.proxy = proxy; + bucket.name = name; + bucket.parent = parent; + } + const hookId = Symbol("hook"); + const remove = () => { + const map = type === "b" ? bucket.b : type === "i" ? bucket.i : bucket.a; + if (!map.delete(hookId)) return false; + if (bucket.b.size || bucket.i.size || bucket.a.size) return true; + bucket.parent[bucket.name] = bucket.o; + stores.delete(bucket.proxy); + return true; + }; + if (oneTime) bucket.c.push(remove); + (type === "b" ? bucket.b : type === "i" ? bucket.i : bucket.a).set(hookId, callback); + return remove; + }; + const api = { + id: "${pluginId}", + name: "${pluginName}", + logger: { + log: (...args) => console.log("[Plugin:${pluginId}]", ...args), + warn: (...args) => console.warn("[Plugin:${pluginId}]", ...args), + error: (...args) => console.error("[Plugin:${pluginId}]", ...args), + }, + patcher: { + before: (name, parent, cb, once) => patch("b", name, parent, cb, once), + instead: (name, parent, cb, once) => patch("i", name, parent, cb, once), + after: (name, parent, cb, once) => patch("a", name, parent, cb, once), + unpatchAll + } + }; + const mod = { exports: {} }; + const module = mod; + const exports = mod.exports; + ${source} + const activate = mod.exports.activate ?? mod.exports.default ?? g.activatePlugin; + if (typeof activate === "function") activate(api); +})(); +//# sourceURL=legcord-plugin-renderer-${pluginId}.js +`; +} + +async function loadRendererPlugins() { + const entries = (await ipcRenderer.invoke("plugins:get-runtime-entries", "renderer")) as RuntimeEntry[]; + for (const entry of entries) { + try { + const source = (await ipcRenderer.invoke("plugins:get-runtime-script", entry.id, "renderer")) as + | string + | null; + if (!source) continue; + const bootstrap = getRendererBootstrap(entry.id, entry.name, source); + await webFrame.executeJavaScript(bootstrap); + } catch (error) { + console.error(`[Plugin:${entry.id}] renderer entry failed`, error); + } + } +} + +void (async () => { + await loadPreloadPlugins(); + await loadRendererPlugins(); +})(); diff --git a/src/discord/preload/preload.mts b/src/discord/preload/preload.mts index 2553635..bfcbef7 100644 --- a/src/discord/preload/preload.mts +++ b/src/discord/preload/preload.mts @@ -1,119 +1,19 @@ +import type { LegcordWindow } from "../../@types/legcordWindow.js"; import "./bridge.js"; -import "./optimizer.js"; -import "./settings.js"; -import {ipcRenderer} from "electron"; -import fs from "fs"; -import path from "path"; -import {injectMobileStuff} from "./mobile.js"; -import {injectTitlebar} from "./titlebar.mjs"; -import {injectSettings} from "./settings.js"; -import {addStyle, addScript} from "../../common/dom.js"; -import {sleep} from "../../common/sleep.js"; -import type {ArmCordWindow} from "../../types/armcordWindow.d.js"; +import "./mods/shelter.mjs"; +import "./mods/vencord.mjs"; +import "./mods/equicord.mjs"; +import "./mods/custom.mjs"; +import "./plugins.mjs"; +import "./patches.mjs"; +import "./newTitlebar.mjs"; +import "./titlebar.mjs"; +import "./themes.js"; +console.log("Legcord"); window.localStorage.setItem("hideNag", "true"); - -if (ipcRenderer.sendSync("legacyCapturer")) { - console.warn("Using legacy capturer module"); - import("./capturer.js"); -} - -const version = ipcRenderer.sendSync("displayVersion") as string; -function updateLang(): void { - const value = `; ${document.cookie}`; - const parts = value.split(`; locale=`); - if (parts.length === 2) ipcRenderer.send("setLang", parts.pop()?.split(";").shift()); -} - declare global { interface Window { - armcord: ArmCordWindow; + legcord: LegcordWindow; } } - -console.log(`ArmCord ${version}`); -ipcRenderer.on("themeLoader", (_event, message: string) => { - addStyle(message); -}); - -if (ipcRenderer.sendSync("titlebar")) { - injectTitlebar(); -} -if (ipcRenderer.sendSync("mobileMode")) { - injectMobileStuff(); -} -await sleep(5000).then(() => { - // dirty hack to make clicking notifications focus ArmCord - addScript(` - (() => { - const originalSetter = Object.getOwnPropertyDescriptor(Notification.prototype, "onclick").set; - Object.defineProperty(Notification.prototype, "onclick", { - set(onClick) { - originalSetter.call(this, function() { - onClick.apply(this, arguments); - armcord.window.show(); - }) - }, - configurable: true - }); - })(); - `); - 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, "../", "/content/js/rpc.js"), "utf8")); - const cssPath = path.join(import.meta.dirname, "../", "/content/css/discord.css"); - addStyle(fs.readFileSync(cssPath, "utf8")); - updateLang(); -}); - -// Settings info version injection -setInterval(() => { - addScript(` - if (document.getElementById("ACsettingsModal") == null) { - var html = '×
'; - const elem = document.createElement("div"); - elem.id = "ACsettingsModal"; - elem.classList.add("ACsettings-modal"); - elem.innerHTML = html; - document.getElementById("app-mount").prepend(elem); - document.getElementById("closeSettings").addEventListener("click", () => { - document.getElementById("webviewSettingsContainer").innerHTML = ""; - document.getElementById("ACsettingsModal").style.display = "none"; - }); - } - `); - const host = document.querySelector('[class*="sidebar"] [class*="info"]'); - if (!host || host.querySelector("#ac-ver")) { - return; - } - const el = host.firstElementChild!.cloneNode() as HTMLSpanElement; - el.id = "ac-ver"; - el.textContent = `ArmCord Version: ${version}`; - el.onclick = () => ipcRenderer.send("openSettingsWindow"); - host.append(el); - let advanced = document - .querySelector('[class*="socialLinks"]') - ?.parentElement?.querySelector( - '[class*="header"] + [class*="item"] + [class*="item"] + [class*="item"] + [class*="item"] + [class*="item"] + [class*="item"] + [class*="item"] + [class*="item"] + [class*="item"]' - ); - if (!advanced) return; - if (advanced.nextSibling instanceof Element && advanced.nextSibling.className.includes("item")) { - advanced = advanced.nextSibling; - } - const acSettings = advanced.cloneNode(true) as HTMLElement; - const tManager = advanced.cloneNode(true) as HTMLElement; - const fQuit = advanced.cloneNode(true) as HTMLElement; - acSettings.textContent = "ArmCord Settings"; - acSettings.id = "acSettings"; - acSettings.onclick = () => injectSettings(); - tManager.textContent = "Themes"; - tManager.id = "acThemes"; - tManager.onclick = () => ipcRenderer.send("openManagerWindow"); - fQuit.textContent = "Force Quit"; - fQuit.id = "acForceQuit"; - fQuit.onclick = () => ipcRenderer.send("win-forceQuit"); - advanced.insertAdjacentElement("afterend", acSettings); - advanced.insertAdjacentElement("afterend", tManager); - advanced.insertAdjacentElement("afterend", fQuit); -}, 1000); diff --git a/src/discord/preload/settings.ts b/src/discord/preload/settings.ts deleted file mode 100644 index 8059ba4..0000000 --- a/src/discord/preload/settings.ts +++ /dev/null @@ -1,31 +0,0 @@ -import path from "path"; -import fs from "fs"; -import {addStyle} from "../../common/dom.js"; - -const webview = ``; - -export function injectSettings() { - document.getElementById("webviewSettingsContainer")!.innerHTML = webview; - document.getElementById("ACsettingsModal")!.style.display = "block"; -} - -document.addEventListener("DOMContentLoaded", function (_event) { - const settingsCssPath = path.join(import.meta.dirname, "../", "/content/css/inAppSettings.css"); - addStyle(fs.readFileSync(settingsCssPath, "utf8")); - const webview = document.querySelector("webview")!; - webview.addEventListener("console-message", (e) => { - console.log("Settings page logged a message:", e as Electron.ConsoleMessageEvent); - }); -}); diff --git a/src/discord/preload/themes.ts b/src/discord/preload/themes.ts new file mode 100644 index 0000000..b5c7ad5 --- /dev/null +++ b/src/discord/preload/themes.ts @@ -0,0 +1,11 @@ +import { addTheme } from "../../common/dom.js"; + +const { ipcRenderer } = require("electron"); + +ipcRenderer.on("addTheme", (_event: unknown, name: string, css: string) => { + if (document.getElementById(name)) return; + addTheme(name, css); +}); +ipcRenderer.on("removeTheme", (_event: unknown, name: string) => { + document.getElementById(name)!.remove(); +}); diff --git a/src/discord/preload/titlebar.mts b/src/discord/preload/titlebar.mts index 48a759f..b31d48b 100644 --- a/src/discord/preload/titlebar.mts +++ b/src/discord/preload/titlebar.mts @@ -1,12 +1,9 @@ -import {ipcRenderer} from "electron"; -import {addStyle} from "../../common/dom.js"; -import fs from "fs"; -import path from "path"; -import os from "os"; -export function injectTitlebar(): void { - window.onload = function () { - const elem = document.createElement("div"); - elem.innerHTML = `