Initial commit

This commit is contained in:
2024-09-01 06:20:49 +03:00
parent bd61f5d591
commit 9263c396a1
81 changed files with 1494 additions and 1521 deletions

View File

@@ -1,59 +0,0 @@
name: 🎮 Modrinth App bug
description: Report an issue in the Modrinth Launcher.
labels: [bug, app]
body:
- type: checkboxes
attributes:
label: Please confirm the following.
options:
- label: I checked the [existing issues](https://github.com/modrinth/code/issues) for duplicate problems
required: true
- label: I have tried resolving the issue using the [support portal](https://support.modrinth.com)
required: true
- label: I have ensured my Modrinth App installation is up to date
required: true
- type: input
id: version
attributes:
label: What version of the Modrinth App are you using?
description: Find this in ⚙️ Settings (bottom right) -> About -> App version.
validations:
required: true
- type: dropdown
id: oses
attributes:
label: What operating systems are you seeing the problem on?
multiple: true
options:
- Windows
- MacOS
- Linux
- type: textarea
attributes:
label: Describe the bug
description: A clear and concise description of what the bug is. Include screenshots if applicable.
validations:
required: true
- type: textarea
attributes:
label: Steps to reproduce
description: Steps to reproduce the behavior.
placeholder: |
1. Go to '...'
2. Click on '...'
3. Scroll down to '...'
4. See error
validations:
required: false
- type: textarea
attributes:
label: Expected behavior
description: A clear and concise description of what you expected to happen.
validations:
required: false
- type: textarea
attributes:
label: Additional context
description: Add any other context about the problem here.
validations:
required: false

View File

@@ -1,52 +0,0 @@
name: 🌐 Website bug (modrinth.com)
description: Report an issue on the Modrinth website.
labels: [bug, frontend]
body:
- type: checkboxes
attributes:
label: Please confirm the following.
options:
- label: I checked the [existing issues](https://github.com/modrinth/code/issues) for duplicate problems
required: true
- label: I have tried resolving the issue using the [support portal](https://support.modrinth.com)
required: true
- type: dropdown
id: browsers
attributes:
label: What browsers are you seeing the problem on?
multiple: true
options:
- Chrome (including Arc, Brave, Opera, Vivaldi)
- Microsoft Edge
- Firefox
- Safari
- Other (please specify)
- type: textarea
attributes:
label: Describe the bug
description: A clear and concise description of what the bug is. Include screenshots if applicable.
validations:
required: false
- type: textarea
attributes:
label: Steps to reproduce
description: Steps to reproduce the behavior.
placeholder: |
1. Go to '...'
2. Click on '...'
3. Scroll down to '...'
4. See error
validations:
required: false
- type: textarea
attributes:
label: Expected behavior
description: A clear and concise description of what you expected to happen.
validations:
required: false
- type: textarea
attributes:
label: Additional context
description: Add any other context about the problem here.
validations:
required: false

View File

@@ -1,41 +0,0 @@
name: 🛠️ API issue (api.modrinth.com)
description: Report an issue regarding the Modrinth API.
labels: [bug, api]
body:
- type: checkboxes
attributes:
label: Please confirm the following.
options:
- label: I checked the [existing issues](https://github.com/modrinth/code/issues) for duplicate problems
required: true
- label: I have tried resolving the issue using the [support portal](https://support.modrinth.com)
required: true
- type: textarea
attributes:
label: Describe the bug
description: A clear and concise description of what the bug is. Include screenshots if applicable.
validations:
required: false
- type: textarea
attributes:
label: Steps to reproduce
description: Steps to reproduce the behavior.
placeholder: |
1. Go to '...'
2. Click on '...'
3. Scroll down to '...'
4. See error
validations:
required: false
- type: textarea
attributes:
label: Expected behavior
description: A clear and concise description of what you expected to happen.
validations:
required: false
- type: textarea
attributes:
label: Additional context
description: Add any other context about the problem here.
validations:
required: false

View File

@@ -1,46 +0,0 @@
name: 💡 Feature Request
description: Suggest an idea
labels: [enhancement]
body:
- type: checkboxes
attributes:
label: Please confirm the following.
options:
- label: I checked the [existing issues](https://github.com/modrinth/code/issues) for duplicate feature requests
required: true
- label: I have checked that this feature request is not on our [roadmap](https://roadmap.modrinth.com)
required: true
- type: dropdown
id: projects
attributes:
label: What parts of Modrinth is your feature request related too?
multiple: true
options:
- App
- Website
- API
- type: textarea
attributes:
label: Is your suggested feature related to a problem? Please describe.
description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
validations:
required: false
- type: textarea
attributes:
label: Describe the solution you'd like
description: A clear and concise description of what you want to happen.
validations:
required: false
- type: textarea
attributes:
label: Describe alternatives you've considered
description: A clear and concise description of any alternative solutions or features you've considered.
validations:
required: false
- type: textarea
attributes:
label: Additional context
description: Add any other context or screenshots about the suggested enhancement here.
validations:
required: false

View File

@@ -1,9 +1,10 @@
name: 'Modrinth App build' name: 'AstralRinth App build'
on: on:
push: push:
branches: branches:
- main - feature*
tags: tags:
- 'build*'
- 'v*' - 'v*'
paths: paths:
- .github/workflows/app-release.yml - .github/workflows/app-release.yml
@@ -21,7 +22,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
platform: [macos-latest, windows-latest, ubuntu-22.04] platform: [macos-latest, windows-latest, ubuntu-latest]
runs-on: ${{ matrix.platform }} runs-on: ${{ matrix.platform }}
@@ -105,13 +106,6 @@ jobs:
if: startsWith(matrix.platform, 'macos') if: startsWith(matrix.platform, 'macos')
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}

View File

@@ -1,70 +0,0 @@
name: CI
on:
push:
branches: ["main"]
pull_request:
types: [opened, synchronize]
merge_group:
types: [ checks_requested ]
jobs:
build:
name: Build, Test, and Lint
runs-on: ubuntu-22.04
steps:
- name: Check out code
uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Cache turbo build setup
uses: actions/cache@v4
with:
path: .turbo
key: ${{ runner.os }}-turbo-${{ github.sha }}
restore-keys: |
${{ runner.os }}-turbo-
- name: Install build dependencies
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
- name: Setup Node.JS environment
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install pnpm via corepack
shell: bash
run: |
corepack enable
corepack prepare --activate
- name: Get pnpm store directory
id: pnpm-cache
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
- uses: actions/cache@v4
name: Setup pnpm cache
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm install
- name: Build
run: pnpm build
- name: Lint
run: pnpm lint
- name: Test
run: pnpm test

View File

@@ -1,28 +0,0 @@
name: Deploy frontend
on: push
jobs:
wait:
if: github.repository_owner == 'modrinth'
runs-on: ubuntu-latest
permissions:
contents: read
deployments: write
steps:
- name: Cloudflare Pages deployment
uses: WalshyDev/cf-pages-await@v1
with:
apiToken: ${{ secrets.CF_API_TOKEN }}
accountId: '9ddae624c98677d68d93df6e524a6061'
project: 'frontend'
githubToken: ${{ secrets.GITHUB_TOKEN }}
commitHash: ${{ steps.push-changes.outputs.commit-hash }}
- name: Purge cache
if: github.ref == 'refs/heads/prod'
run: |
curl -X POST \
-H "Authorization: Bearer ${{ secrets.CF_API_TOKEN }}" \
-H "Content-Type: application/json" \
--data '{"hosts": ["modrinth.com", "www.modrinth.com"]}' \
https://api.cloudflare.com/client/v4/zones/e39df17b9c4ef44cbce2646346ee6d33/purge_cache

318
Cargo.lock generated
View File

@@ -17,6 +17,12 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "adler2"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
[[package]] [[package]]
name = "aes" name = "aes"
version = "0.8.4" version = "0.8.4"
@@ -248,7 +254,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -283,7 +289,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -373,7 +379,7 @@ dependencies = [
"cc", "cc",
"cfg-if", "cfg-if",
"libc", "libc",
"miniz_oxide", "miniz_oxide 0.7.4",
"object", "object",
"rustc-demangle", "rustc-demangle",
] ]
@@ -494,9 +500,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
[[package]] [[package]]
name = "bytemuck" name = "bytemuck"
version = "1.17.0" version = "1.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fd4c6dcc3b0aea2f5c0b4b82c2b15fe39ddbc76041a310848f4706edf76bb31" checksum = "773d90827bc3feecfb67fab12e24de0749aad83c74b9504ecde46237b5cd24e2"
[[package]] [[package]]
name = "byteorder" name = "byteorder"
@@ -603,9 +609,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.1.13" version = "1.1.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72db2f7947ecee9b03b510377e8bb9077afa27176fdbff55c51027e976fdcc48" checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6"
dependencies = [ dependencies = [
"jobserver", "jobserver",
"libc", "libc",
@@ -1008,7 +1014,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [ dependencies = [
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1018,7 +1024,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f"
dependencies = [ dependencies = [
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1055,7 +1061,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"strsim", "strsim",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1066,7 +1072,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
dependencies = [ dependencies = [
"darling_core", "darling_core",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1136,7 +1142,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1149,7 +1155,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"rustc_version", "rustc_version",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1232,7 +1238,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1255,7 +1261,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1411,7 +1417,7 @@ checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1474,9 +1480,9 @@ dependencies = [
[[package]] [[package]]
name = "fastrand" name = "fastrand"
version = "2.1.0" version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6"
[[package]] [[package]]
name = "fdeflate" name = "fdeflate"
@@ -1509,9 +1515,9 @@ dependencies = [
[[package]] [[package]]
name = "filetime" name = "filetime"
version = "0.2.24" version = "0.2.25"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf401df4a4e3872c4fe8151134cf483738e74b67fc934d6532c882b3d24a4550" checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"libc", "libc",
@@ -1521,12 +1527,12 @@ dependencies = [
[[package]] [[package]]
name = "flate2" name = "flate2"
version = "1.0.31" version = "1.0.33"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920" checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253"
dependencies = [ dependencies = [
"crc32fast", "crc32fast",
"miniz_oxide", "miniz_oxide 0.8.0",
] ]
[[package]] [[package]]
@@ -1582,7 +1588,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1705,7 +1711,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -1974,7 +1980,7 @@ dependencies = [
"proc-macro-error", "proc-macro-error",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -2064,14 +2070,14 @@ dependencies = [
"proc-macro-error", "proc-macro-error",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
name = "h2" name = "h2"
version = "0.4.5" version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205"
dependencies = [ dependencies = [
"atomic-waker", "atomic-waker",
"bytes", "bytes",
@@ -2079,7 +2085,7 @@ dependencies = [
"futures-core", "futures-core",
"futures-sink", "futures-sink",
"http", "http",
"indexmap 2.4.0", "indexmap 2.5.0",
"slab", "slab",
"tokio", "tokio",
"tokio-util", "tokio-util",
@@ -2364,9 +2370,9 @@ dependencies = [
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.4.0" version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown 0.14.5", "hashbrown 0.14.5",
@@ -2644,9 +2650,9 @@ dependencies = [
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.156" version = "0.2.158"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a5f43f184355eefb8d17fc948dbecf6c13be3c141f20d834ae842193a448c72a" checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
[[package]] [[package]]
name = "libdbus-sys" name = "libdbus-sys"
@@ -2687,9 +2693,9 @@ dependencies = [
[[package]] [[package]]
name = "libsqlite3-sys" name = "libsqlite3-sys"
version = "0.28.0" version = "0.30.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149"
dependencies = [ dependencies = [
"cc", "cc",
"pkg-config", "pkg-config",
@@ -2816,9 +2822,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]] [[package]]
name = "minisign-verify" name = "minisign-verify"
version = "0.2.1" version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "933dca44d65cdd53b355d0b73d380a2ff5da71f87f036053188bf1eab6a19881" checksum = "a05b5d0594e0cb1ad8cee3373018d2b84e25905dc75b2468114cc9a8e86cfc20"
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
@@ -2830,6 +2836,15 @@ dependencies = [
"simd-adler32", "simd-adler32",
] ]
[[package]]
name = "miniz_oxide"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1"
dependencies = [
"adler2",
]
[[package]] [[package]]
name = "mio" name = "mio"
version = "0.8.11" version = "0.8.11"
@@ -2856,9 +2871,9 @@ dependencies = [
[[package]] [[package]]
name = "muda" name = "muda"
version = "0.14.0" version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86c410a9d21523a819e84881603fbc00331c8001eb899964952046671deddb9c" checksum = "ba8ac4080fb1e097c2c22acae467e46e4da72d941f02e82b67a87a2a89fa38b1"
dependencies = [ dependencies = [
"cocoa 0.26.0", "cocoa 0.26.0",
"crossbeam-channel", "crossbeam-channel",
@@ -3103,10 +3118,10 @@ version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56"
dependencies = [ dependencies = [
"proc-macro-crate 3.1.0", "proc-macro-crate 3.2.0",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -3256,9 +3271,9 @@ dependencies = [
[[package]] [[package]]
name = "object" name = "object"
version = "0.36.3" version = "0.36.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]
@@ -3316,7 +3331,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -3620,7 +3635,7 @@ dependencies = [
"phf_shared 0.11.2", "phf_shared 0.11.2",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -3667,7 +3682,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -3727,7 +3742,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"indexmap 2.4.0", "indexmap 2.5.0",
"quick-xml", "quick-xml",
"serde", "serde",
"time", "time",
@@ -3743,7 +3758,7 @@ dependencies = [
"crc32fast", "crc32fast",
"fdeflate", "fdeflate",
"flate2", "flate2",
"miniz_oxide", "miniz_oxide 0.7.4",
] ]
[[package]] [[package]]
@@ -3818,11 +3833,11 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro-crate" name = "proc-macro-crate"
version = "3.1.0" version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b"
dependencies = [ dependencies = [
"toml_edit 0.21.1", "toml_edit 0.22.20",
] ]
[[package]] [[package]]
@@ -3923,9 +3938,9 @@ dependencies = [
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.36" version = "1.0.37"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
@@ -4063,9 +4078,9 @@ dependencies = [
[[package]] [[package]]
name = "redox_users" name = "redox_users"
version = "0.4.5" version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43"
dependencies = [ dependencies = [
"getrandom 0.2.15", "getrandom 0.2.15",
"libredox", "libredox",
@@ -4118,9 +4133,9 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
[[package]] [[package]]
name = "reqwest" name = "reqwest"
version = "0.12.5" version = "0.12.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63"
dependencies = [ dependencies = [
"async-compression", "async-compression",
"base64 0.22.1", "base64 0.22.1",
@@ -4164,7 +4179,7 @@ dependencies = [
"wasm-streams", "wasm-streams",
"web-sys", "web-sys",
"webpki-roots", "webpki-roots",
"winreg", "windows-registry",
] ]
[[package]] [[package]]
@@ -4267,18 +4282,18 @@ checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152"
[[package]] [[package]]
name = "rustc_version" name = "rustc_version"
version = "0.4.0" version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
dependencies = [ dependencies = [
"semver", "semver",
] ]
[[package]] [[package]]
name = "rustix" name = "rustix"
version = "0.38.34" version = "0.38.35"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.6.0",
"errno", "errno",
@@ -4319,9 +4334,9 @@ checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0"
[[package]] [[package]]
name = "rustls-webpki" name = "rustls-webpki"
version = "0.102.6" version = "0.102.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" checksum = "84678086bd54edf2b415183ed7a94d0efb049f1b646a33e22a36f3794be6ae56"
dependencies = [ dependencies = [
"ring", "ring",
"rustls-pki-types", "rustls-pki-types",
@@ -4381,7 +4396,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"serde_derive_internals", "serde_derive_internals",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -4464,9 +4479,9 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.208" version = "1.0.209"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2" checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
@@ -4484,13 +4499,13 @@ dependencies = [
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.208" version = "1.0.209"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -4501,7 +4516,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -4517,9 +4532,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.125" version = "1.0.127"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed" checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad"
dependencies = [ dependencies = [
"itoa 1.0.11", "itoa 1.0.11",
"memchr", "memchr",
@@ -4535,7 +4550,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -4569,7 +4584,7 @@ dependencies = [
"chrono", "chrono",
"hex", "hex",
"indexmap 1.9.3", "indexmap 1.9.3",
"indexmap 2.4.0", "indexmap 2.5.0",
"serde", "serde",
"serde_derive", "serde_derive",
"serde_json", "serde_json",
@@ -4586,7 +4601,7 @@ dependencies = [
"darling", "darling",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -4813,9 +4828,9 @@ dependencies = [
[[package]] [[package]]
name = "sqlx" name = "sqlx"
version = "0.8.0" version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27144619c6e5802f1380337a209d2ac1c431002dd74c6e60aebff3c506dc4f0c" checksum = "fcfa89bea9500db4a0d038513d7a060566bfc51d46d1c014847049a45cce85e8"
dependencies = [ dependencies = [
"sqlx-core", "sqlx-core",
"sqlx-macros", "sqlx-macros",
@@ -4826,9 +4841,9 @@ dependencies = [
[[package]] [[package]]
name = "sqlx-core" name = "sqlx-core"
version = "0.8.0" version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a999083c1af5b5d6c071d34a708a19ba3e02106ad82ef7bbd69f5e48266b613b" checksum = "d06e2f2bd861719b1f3f0c7dbe1d80c30bf59e76cf019f07d9014ed7eefb8e08"
dependencies = [ dependencies = [
"atoi", "atoi",
"byteorder", "byteorder",
@@ -4845,7 +4860,7 @@ dependencies = [
"hashbrown 0.14.5", "hashbrown 0.14.5",
"hashlink", "hashlink",
"hex", "hex",
"indexmap 2.4.0", "indexmap 2.5.0",
"log", "log",
"memchr", "memchr",
"once_cell", "once_cell",
@@ -4865,22 +4880,22 @@ dependencies = [
[[package]] [[package]]
name = "sqlx-macros" name = "sqlx-macros"
version = "0.8.0" version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a23217eb7d86c584b8cbe0337b9eacf12ab76fe7673c513141ec42565698bb88" checksum = "2f998a9defdbd48ed005a89362bd40dd2117502f15294f61c8d47034107dbbdc"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"sqlx-core", "sqlx-core",
"sqlx-macros-core", "sqlx-macros-core",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
name = "sqlx-macros-core" name = "sqlx-macros-core"
version = "0.8.0" version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a099220ae541c5db479c6424bdf1b200987934033c2584f79a0e1693601e776" checksum = "3d100558134176a2629d46cec0c8891ba0be8910f7896abfdb75ef4ab6f4e7ce"
dependencies = [ dependencies = [
"dotenvy", "dotenvy",
"either", "either",
@@ -4896,7 +4911,7 @@ dependencies = [
"sqlx-mysql", "sqlx-mysql",
"sqlx-postgres", "sqlx-postgres",
"sqlx-sqlite", "sqlx-sqlite",
"syn 2.0.74", "syn 2.0.77",
"tempfile", "tempfile",
"tokio", "tokio",
"url", "url",
@@ -4904,9 +4919,9 @@ dependencies = [
[[package]] [[package]]
name = "sqlx-mysql" name = "sqlx-mysql"
version = "0.8.0" version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5afe4c38a9b417b6a9a5eeffe7235d0a106716495536e7727d1c7f4b1ff3eba6" checksum = "936cac0ab331b14cb3921c62156d913e4c15b74fb6ec0f3146bd4ef6e4fb3c12"
dependencies = [ dependencies = [
"atoi", "atoi",
"base64 0.22.1", "base64 0.22.1",
@@ -4946,9 +4961,9 @@ dependencies = [
[[package]] [[package]]
name = "sqlx-postgres" name = "sqlx-postgres"
version = "0.8.0" version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1dbb157e65f10dbe01f729339c06d239120221c9ad9fa0ba8408c4cc18ecf21" checksum = "9734dbce698c67ecf67c442f768a5e90a49b2a4d61a9f1d59f73874bd4cf0710"
dependencies = [ dependencies = [
"atoi", "atoi",
"base64 0.22.1", "base64 0.22.1",
@@ -4984,9 +4999,9 @@ dependencies = [
[[package]] [[package]]
name = "sqlx-sqlite" name = "sqlx-sqlite"
version = "0.8.0" version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b2cdd83c008a622d94499c0006d8ee5f821f36c89b7d625c900e5dc30b5c5ee" checksum = "a75b419c3c1b1697833dd927bdc4c6545a620bc1bbafabd44e1efbe9afcd337e"
dependencies = [ dependencies = [
"atoi", "atoi",
"flume", "flume",
@@ -5099,9 +5114,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.74" version = "2.0.77"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fceb41e3d546d0bd83421d3409b1460cc7444cd389341a4c880fe7a042cb3d7" checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -5113,6 +5128,9 @@ name = "sync_wrapper"
version = "1.0.1" version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
dependencies = [
"futures-core",
]
[[package]] [[package]]
name = "sys-info" name = "sys-info"
@@ -5150,20 +5168,20 @@ dependencies = [
[[package]] [[package]]
name = "system-configuration" name = "system-configuration"
version = "0.5.1" version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 2.6.0",
"core-foundation 0.9.4", "core-foundation 0.9.4",
"system-configuration-sys", "system-configuration-sys",
] ]
[[package]] [[package]]
name = "system-configuration-sys" name = "system-configuration-sys"
version = "0.5.0" version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
dependencies = [ dependencies = [
"core-foundation-sys", "core-foundation-sys",
"libc", "libc",
@@ -5223,13 +5241,13 @@ dependencies = [
[[package]] [[package]]
name = "tao-macros" name = "tao-macros"
version = "0.1.2" version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec114582505d158b669b136e6851f85840c109819d77c42bb7c0709f727d18c2" checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 1.0.109", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -5341,7 +5359,7 @@ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
"sha2", "sha2",
"syn 2.0.74", "syn 2.0.77",
"tauri-utils", "tauri-utils",
"thiserror", "thiserror",
"time", "time",
@@ -5359,7 +5377,7 @@ dependencies = [
"heck 0.5.0", "heck 0.5.0",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
"tauri-codegen", "tauri-codegen",
"tauri-utils", "tauri-utils",
] ]
@@ -5383,9 +5401,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-deep-link" name = "tauri-plugin-deep-link"
version = "2.0.0-rc.1" version = "2.0.0-rc.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c8e169df47aa4892184c812cc9753a486328835d38d2269a4b062179698a242" checksum = "a6b5660955c91ab25365613295788ce840c4e07b810e65436720b1a194cc72c2"
dependencies = [ dependencies = [
"dunce", "dunce",
"log", "log",
@@ -5403,9 +5421,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-dialog" name = "tauri-plugin-dialog"
version = "2.0.0-rc.1" version = "2.0.0-rc.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcf99017391fdc40b6c8ae0dae8d970cc8151a8177d48b8805f320f52cac0e3c" checksum = "aa8bd381f75c47687f41fb603f67fdd99a1af377da22d03d8fb959d2481845c1"
dependencies = [ dependencies = [
"dunce", "dunce",
"log", "log",
@@ -5417,13 +5435,14 @@ dependencies = [
"tauri-plugin", "tauri-plugin",
"tauri-plugin-fs", "tauri-plugin-fs",
"thiserror", "thiserror",
"url",
] ]
[[package]] [[package]]
name = "tauri-plugin-fs" name = "tauri-plugin-fs"
version = "2.0.0-rc.0" version = "2.0.0-rc.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5df6b25b1f2b7b61565e66c4dbee9eb39e5635d2a763206e380e07cc3f601a67" checksum = "694a746b0e0c1d318198fabf4957800c42fb4b705e866e0eed7ec21476ef88db"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"glob", "glob",
@@ -5440,9 +5459,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-os" name = "tauri-plugin-os"
version = "2.0.0-rc.0" version = "2.0.0-rc.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6b54cfeb26356822d3be3db4282041b03552f573a694b6b28aded7d95c62a039" checksum = "ebc4ee761edd532fce2232453e9c8e0f7d9c0b6fe125c4b90b3eb4362ee84224"
dependencies = [ dependencies = [
"gethostname", "gethostname",
"log", "log",
@@ -5458,9 +5477,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-shell" name = "tauri-plugin-shell"
version = "2.0.0-rc.2" version = "2.0.0-rc.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46315cccdbc7686bfb9f17e4aab757e5bb50118bc42e52784cae3917c59ac4d7" checksum = "e83800ddf78b820172efb5ed7310344e8e4f97fd30cd8237a3f20c12a79eb136"
dependencies = [ dependencies = [
"encoding_rs", "encoding_rs",
"log", "log",
@@ -5494,9 +5513,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-updater" name = "tauri-plugin-updater"
version = "2.0.0-rc.1" version = "2.0.0-rc.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8dfd104b50e1c17998fc131edd21ced948a9605bac7eb6827f94e099a644f924" checksum = "f7048854b4271f3bc58ee850f0582f8d9bb0190118afa8397f36fc260daaa68b"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"dirs", "dirs",
@@ -5523,9 +5542,9 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-window-state" name = "tauri-plugin-window-state"
version = "2.0.0-rc.1" version = "2.0.0-rc.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb6839228cbd225b95681c766cc51113e9dad62c4b3f6ebb102234413ba85ee2" checksum = "ba56bcec4b7a1601cf3136c9a3a98f77036b7e1a67564788c5ccd051035d028a"
dependencies = [ dependencies = [
"bitflags 2.6.0", "bitflags 2.6.0",
"log", "log",
@@ -5781,7 +5800,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -5851,9 +5870,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]] [[package]]
name = "tokio" name = "tokio"
version = "1.39.3" version = "1.40.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998"
dependencies = [ dependencies = [
"backtrace", "backtrace",
"bytes", "bytes",
@@ -5876,7 +5895,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -5964,7 +5983,7 @@ version = "0.19.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
dependencies = [ dependencies = [
"indexmap 2.4.0", "indexmap 2.5.0",
"serde", "serde",
"serde_spanned", "serde_spanned",
"toml_datetime", "toml_datetime",
@@ -5977,18 +5996,7 @@ version = "0.20.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81"
dependencies = [ dependencies = [
"indexmap 2.4.0", "indexmap 2.5.0",
"toml_datetime",
"winnow 0.5.40",
]
[[package]]
name = "toml_edit"
version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
dependencies = [
"indexmap 2.4.0",
"toml_datetime", "toml_datetime",
"winnow 0.5.40", "winnow 0.5.40",
] ]
@@ -5999,7 +6007,7 @@ version = "0.22.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d"
dependencies = [ dependencies = [
"indexmap 2.4.0", "indexmap 2.5.0",
"serde", "serde",
"serde_spanned", "serde_spanned",
"toml_datetime", "toml_datetime",
@@ -6053,7 +6061,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -6246,9 +6254,9 @@ dependencies = [
[[package]] [[package]]
name = "unicode-properties" name = "unicode-properties"
version = "0.1.1" version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524"
[[package]] [[package]]
name = "unicode-segmentation" name = "unicode-segmentation"
@@ -6449,7 +6457,7 @@ dependencies = [
"once_cell", "once_cell",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@@ -6483,7 +6491,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@@ -6580,9 +6588,9 @@ dependencies = [
[[package]] [[package]]
name = "webpki-roots" name = "webpki-roots"
version = "0.26.3" version = "0.26.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" checksum = "0bd24728e5af82c6c4ec1b66ac4844bdf8156257fccda846ec58b42cd0cdbe6a"
dependencies = [ dependencies = [
"rustls-pki-types", "rustls-pki-types",
] ]
@@ -6609,7 +6617,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -6771,7 +6779,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -6782,7 +6790,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -7192,10 +7200,10 @@ version = "4.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e"
dependencies = [ dependencies = [
"proc-macro-crate 3.1.0", "proc-macro-crate 3.2.0",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
"zvariant_utils", "zvariant_utils",
] ]
@@ -7228,7 +7236,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]
[[package]] [[package]]
@@ -7267,7 +7275,7 @@ dependencies = [
"crc32fast", "crc32fast",
"crossbeam-utils", "crossbeam-utils",
"displaydoc", "displaydoc",
"indexmap 2.4.0", "indexmap 2.5.0",
"memchr", "memchr",
"thiserror", "thiserror",
] ]
@@ -7339,10 +7347,10 @@ version = "4.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449"
dependencies = [ dependencies = [
"proc-macro-crate 3.1.0", "proc-macro-crate 3.2.0",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
"zvariant_utils", "zvariant_utils",
] ]
@@ -7354,5 +7362,5 @@ checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.74", "syn 2.0.77",
] ]

View File

@@ -1,39 +1,64 @@
# ![Modrinth Monorepo Cover](/.github/assets/monorepo_cover.png) ![ar_logo](https://github.com/DIDIRUS4/AstralRinth/assets/77334306/43d4acb0-546c-4dff-834d-83fb2ba6ad6f)
![Issues](https://img.shields.io/github/issues-raw/Modrinth/code?color=c78aff&label=issues&style=for-the-badge) # AR • Theseus core Empowering Your Minecraft Adventure with AstralRinth • Fork of Modrinth
![Pull Requests](https://img.shields.io/github/issues-pr-raw/Modrinth/code?color=c78aff&label=PRs&style=for-the-badge) Welcome to AR • Fork of Modrinth, the ultimate game launcher designed to enhance your Minecraft experience through the Modrinth platform and their API. Whether you're a command-line connoisseur, a graphical interface enthusiast, or a developer integrating Modrinth projects, Theseus core is your gateway to a new level of Minecraft gaming.
![Contributors](https://img.shields.io/github/contributors/Modrinth/code?color=c78aff&label=contributors&style=for-the-badge)
![Lines](https://img.shields.io/endpoint?url=https://ghloc.vercel.app/api/modrinth/code/badge?style=flat&logoColor=white&color=c78aff&style=for-the-badge)
![Commit Activity](https://img.shields.io/github/commit-activity/m/Modrinth/code?color=c78aff&label=commits&style=for-the-badge)
![Last Commit](https://img.shields.io/github/last-commit/Modrinth/code?color=c78aff&label=last%20commit&style=for-the-badge)
## Modrinth Monorepo # AR • About software 🌌
Introducing AstralRinth, a specialized variant of Theseus dedicated to implementing offline authorization for an even more flexible and user-centric Minecraft Modrinth experience. Roam the Minecraft realms without the constraints of online authentication, thanks to AstralRinth.
Welcome to the Modrinth Monorepo, the primary codebase for the Modrinth web interface and app. It contains ![Lines](https://img.shields.io/endpoint?url=https://ghloc.vercel.app/api/modrinth/olympus/badge?logoColor=white&color=black&label=) lines of code and has ![Contributors](https://img.shields.io/github/contributors/Modrinth/code?color=black&label=) contributors! For seekers of a visually intuitive experience, Theseus-GUI delivers a sleek and user-friendly interface to explore, manage, and play Minecraft with Modrinth projects. Uncover the full potential of Modrinth effortlessly with Theseus-GUI.
If you're not a developer and you've stumbled upon this repository, you can access the web interface on the [Modrinth website](https://modrinth.com) and download the latest release of the app [here](https://modrinth.com/app). # AR • Unlocking Minecraft's Boundless Horizon
## Development Dive into the extraordinary world of AstralRinth, a fork of the original project with a unique focus on providing a free trial experience for Minecraft, all without the need for a license. Currently boasting:
This repository contains two primary packages. For detailed development information, please refer to their respective READMEs: # Install instructions
- To install our application, you need to download a file for your operating system from our available releases or development builds • [Download variants here](https://github.com/DIDIRUS4/AstralRinth/releases)
- After you have downloaded the required executable file or archive, then open it
- [Web Interface](apps/frontend/README.md) ### Available file extensions (Also used in Auto-updater)
- [Desktop App](apps/app/README.md) - `.msi` format for Windows OS system _(Supported popular latest versions of Microsoft Windows)_
- `.dmg` format for MacOS system _(Works on Macos Ventura / Sonoma, but it should be works on older OS builds)_
- `.deb` format for Linux OS systems _(Since there are quite a few distributions, we do not guarantee
## Contributing ### Additional information about installation subject
- Builds in releases that are signed with the prefix `DEV_BUILD__{name when building the project}` means that this build is for development and may contain errors, we recommend downloading the archives. `zip`, as they are the final versions.
- Auto-updating takes place through parsing special versions from releases, so we also distribute clean types of `.msi, .dmg and .deb`
We welcome contributions! Before submitting any contributions, please read our [contributing guidelines](https://support.modrinth.com/en/articles/8802215-contributing-to-modrinth). ## Features
### Featured enhancement in AR
- AstralRinth offers a range of authorization options, giving users the flexibility to log in with valid licenses or even a pirate account without auth credentials breaks (_Unlike MultiMC Cracked and similar software_). Experience Minecraft on your terms, breaking free from traditional licensing constraints (_Popular in Russian Federation_).
### Easy to use
- Using the launcher is intuitive, any user can figure it out.
### Update notifies
- We have implemented notifications about the release of new updates on our Github. The launcher can also download them for you and try to install them.
### Additional Enhancements in AR:
- Custom .SVG vectors for a personalized touch.
- Improved compatibility for both pirate and licensed accounts.
- Beautiful Discord RPC with random messages while playing, along with an in-game timer and AFK counter.
- Forced disabling of statistics collection (modrinch metrics) with a hard patch from AstralRinth, ensuring it remains deactivated regardless of the configuration setting.
- Removal of advertisements from all launcher categories.
- Visual fixes and enhancements for an improved user experience.
- Optimization of packages (archives).
- Automatic updates, facilitating the seamless download of the latest version.
- And more...
## Getting Started
To begin your AstralRinth adventure, follow these steps:
1. **Download your OS version in releases** • [Download variants here](https://github.com/DIDIRUS4/AstralRinth/releases)
If you plan to fork this repository for your own purposes, please review our [copying guidelines](COPYING.md). 2. **Select Your Language:** Choose between available languages in settings by configuring your language preferences.
## Security 3. **Authentication:** Enjoy the freedom to log in using a valid license or, for testing purposes, explore AstralRinth with a pirate account.
If you discover a security vulnerability within our codebase, please follow our [responsible disclosure guidelines](https://modrinth.com/legal/security). 4. **Launch Minecraft:** Fire up Minecraft through AstralRinth and explore the vast landscapes and adventures that await you.
# Disclaimer
**Notice:**
- AstralRinth is a project intended for experimentation and educational purposes only. It does not endorse or support piracy, and users are encouraged to obtain valid licenses for a fully-supported Minecraft experience.
## Support - Users are reminded to respect licensing agreements and support the developers of Minecraft.
If you need help with the Modrinth web interface or app, please visit our [support page](https://support.modrinth.com). For general inquiries, you can also join our [Discord server](https://discord.modrinth.com). # Support our Project (Crypto Wallets)
- BTC (Telegram): 15aYoq3eSop2qKt5YMyB6YrmhScccJVNKp
## License - USDT TRC20 (Telegram): TGwr98NV8c9iJweaDXX3CEthn3sYmMJiDR
- TONCOIN (Telegram): UQDO0i-91bIlf1MdRM1iNOTITdsFpApDa1adX7xDpMptiJqq
All packages in this repository are licensed under their respective licenses. Refer to the LICENSE file in each package for more information. - TONCOIN Space (Telegram): UQCG0a2fm5YzKzIm6E8M3_CqBQ5Q1RT95MU60c9UPjKn_NEN

View File

@@ -1,7 +1,8 @@
{ {
"name": "@modrinth/app-frontend", "name": "@modrinth/app-frontend",
"private": true, "private": true,
"version": "0.8.5", "version": "0.8.501",
"development_build": true,
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",

View File

@@ -8,7 +8,7 @@ import {
PlusIcon, PlusIcon,
SettingsIcon, SettingsIcon,
XIcon, XIcon,
DownloadIcon, // DownloadIcon,
} from '@modrinth/assets' } from '@modrinth/assets'
import { Button, Notifications } from '@modrinth/ui' import { Button, Notifications } from '@modrinth/ui'
import { useLoading, useTheming } from '@/store/state' import { useLoading, useTheming } from '@/store/state'
@@ -24,7 +24,7 @@ import { handleError, useNotifications } from '@/store/notifications.js'
import { command_listener, warning_listener } from '@/helpers/events.js' import { command_listener, warning_listener } from '@/helpers/events.js'
import { MinimizeIcon, MaximizeIcon } from '@/assets/icons' import { MinimizeIcon, MaximizeIcon } from '@/assets/icons'
import { type } from '@tauri-apps/plugin-os' import { type } from '@tauri-apps/plugin-os'
import { isDev, getOS, restartApp } from '@/helpers/utils.js' import { isDev, getOS } from '@/helpers/utils.js'
import { initAnalytics, debugAnalytics, optOutAnalytics, trackEvent } from '@/helpers/analytics' import { initAnalytics, debugAnalytics, optOutAnalytics, trackEvent } from '@/helpers/analytics'
import { getCurrentWindow } from '@tauri-apps/api/window' import { getCurrentWindow } from '@tauri-apps/api/window'
import { getVersion } from '@tauri-apps/api/app' import { getVersion } from '@tauri-apps/api/app'
@@ -42,7 +42,7 @@ import { get_opening_command, initialize_state } from '@/helpers/state'
import { saveWindowState, StateFlags } from '@tauri-apps/plugin-window-state' import { saveWindowState, StateFlags } from '@tauri-apps/plugin-window-state'
import { renderString } from '@modrinth/utils' import { renderString } from '@modrinth/utils'
import { useFetch } from '@/helpers/fetch.js' import { useFetch } from '@/helpers/fetch.js'
import { check } from '@tauri-apps/plugin-updater' // import { check } from '@tauri-apps/plugin-updater'
const themeStore = useTheming() const themeStore = useTheming()
@@ -99,6 +99,7 @@ async function setupApp() {
initAnalytics() initAnalytics()
if (!telemetry) { if (!telemetry) {
console.info("[AstralRinth] Telemetry disabled by default (Hard patched in code).")
optOutAnalytics() optOutAnalytics()
} }
if (dev) debugAnalytics() if (dev) debugAnalytics()
@@ -121,18 +122,18 @@ async function setupApp() {
}), }),
) )
useFetch( // useFetch(
`https://api.modrinth.com/appCriticalAnnouncement.json?version=${version}`, // `https://api.modrinth.com/appCriticalAnnouncement.json?version=${version}`,
'criticalAnnouncements', // 'criticalAnnouncements',
true, // true,
).then((res) => { // ).then((res) => {
if (res && res.header && res.body) { // if (res && res.header && res.body) {
criticalErrorMessage.value = res // criticalErrorMessage.value = res
} // }
}) // })
get_opening_command().then(handleCommand) get_opening_command().then(handleCommand)
checkUpdates() // checkUpdates()
} }
const stateFailed = ref(false) const stateFailed = ref(false)
@@ -243,19 +244,19 @@ async function handleCommand(e) {
} }
} }
const updateAvailable = ref(false) // const updateAvailable = ref(false)
async function checkUpdates() { // async function checkUpdates() {
const update = await check() // const update = await check()
console.log(update) // console.log(update)
updateAvailable.value = !!update // updateAvailable.value = !!update
setTimeout( // setTimeout(
() => { // () => {
checkUpdates() // checkUpdates()
}, // },
5 * 1000 * 60, // 5 * 1000 * 60,
) // )
} // }
</script> </script>
<template> <template>
@@ -289,14 +290,14 @@ async function checkUpdates() {
</div> </div>
</div> </div>
<div class="settings pages-list"> <div class="settings pages-list">
<button <!-- <button
v-if="updateAvailable" v-if="updateAvailable"
v-tooltip="'Install update'" v-tooltip="'Install update'"
class="btn btn-outline btn-primary icon-only collapsed-button" class="btn btn-outline btn-primary icon-only collapsed-button"
@click="restartApp()" @click="restartApp()"
> >
<DownloadIcon /> <DownloadIcon />
</button> </button> -->
<Button <Button
v-tooltip="'Create profile'" v-tooltip="'Create profile'"
class="sleek-primary collapsed-button" class="sleek-primary collapsed-button"

View File

@@ -12,3 +12,6 @@ export { default as NewInstanceImage } from './new-instance.svg'
export { default as MenuIcon } from './menu.svg' export { default as MenuIcon } from './menu.svg'
export { default as BugIcon } from './bug.svg' export { default as BugIcon } from './bug.svg'
export { default as ChatIcon } from './messages-square.svg' export { default as ChatIcon } from './messages-square.svg'
export { default as Pirate } from './pirate.svg'
export { default as Microsoft } from './microsoft.svg'
export { default as PirateShip } from './pirate-ship.svg'

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="10mm" height="10mm" viewBox="0 0 10 10" version="1.1" id="svg26662" inkscape:version="1.2.2 (732a01da63, 2022-12-09)" sodipodi:docname="lic.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview id="namedview26664" pagecolor="#505050" bordercolor="#eeeeee" borderopacity="1" inkscape:showpageshadow="0" inkscape:pageopacity="0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#505050" inkscape:document-units="mm" showgrid="false" inkscape:zoom="14.638496" inkscape:cx="17.112414" inkscape:cy="34.258984" inkscape:window-width="1488" inkscape:window-height="1230" inkscape:window-x="2794" inkscape:window-y="123" inkscape:window-maximized="0" inkscape:current-layer="layer1" />
<defs id="defs26659" />
<g inkscape:label="Слой 1" inkscape:groupmode="layer" id="layer1">
<g id="g26657" transform="matrix(3.9940568,0,0,3.954914,-1082.6556,16143.384)">
<path id="path26649" style="fill:#05a6f0;fill-opacity:1;stroke-width:0.18168;stroke-miterlimit:5.8;paint-order:fill markers stroke" d="m 271.06666,-4080.4646 v 0.8986 c 0,0.1289 0.0997,0.2334 0.22634,0.2398 h 0.91261 v -1.1384 z" />
<path id="path26651" style="fill:#ffba08;fill-opacity:1;stroke-width:0.18168;stroke-miterlimit:5.8;paint-order:fill markers stroke" d="m 272.43195,-4080.4646 v 1.1384 h 0.89917 0.0124 c 0.12669,-0.01 0.22686,-0.1109 0.22686,-0.2398 v -0.8986 z" />
<path id="path26653" style="fill:#e25127;fill-opacity:1;stroke-width:0.18168;stroke-miterlimit:5.8;paint-order:fill markers stroke" d="m 271.3054,-4081.8547 c -0.13246,0 -0.23874,0.1073 -0.23874,0.2403 v 0.8955 h 1.13895 v -1.1358 z" />
<path id="path26655" style="fill:#81bc06;fill-opacity:1;stroke:none;stroke-width:0.184849;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:5.8;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" d="m 272.43195,-4081.8547 v 1.1358 h 1.13843 v -0.8955 c 0,-0.133 -0.1068,-0.2403 -0.23926,-0.2403 z" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<svg height="800px" width="800px" version="1.1" id="Layer_1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 511.672 511.672" xml:space="preserve">
<path style="fill:#ED5564;" d="M227.674,44.901c0,0,0.047-0.031,0.141-0.109c-0.031,0.031-3.342,2.437-9.088,3.514
c-7.745,1.437-16.208-0.109-25.14-4.591c-31.386-15.771-68.175-0.968-69.721-0.344l0.016,0.062c-3.88,1.593-6.621,5.403-6.621,9.869
c0,5.887,4.771,10.649,10.657,10.649c1.694,0,3.295-0.406,4.716-1.109c4.466-1.624,30.816-10.416,51.381-0.078
c10.954,5.497,20.706,7.371,28.919,7.371c17.028,0,27.42-8.073,28.044-8.573L227.674,44.901z"/>
<g>
<path style="fill:#7F4545;" d="M234.514,31.973c-5.887,0-10.657,4.778-10.657,10.665v351.704h21.322V42.638
C245.179,36.751,240.401,31.973,234.514,31.973z"/>
<path style="fill:#7F4545;" d="M511.672,319.655c0-5.887-4.777-10.665-10.648-10.665c-1.031,0-2.016,0.156-2.951,0.422l0,0
l-0.234,0.062l0,0l-108.213,31.073l5.871,20.487l108.463-31.137l0,0C508.408,328.618,511.672,324.512,511.672,319.655z"/>
</g>
<path style="fill:#A85D5D;" d="M10.689,308.99l99.725,33.385c0,0,39.116,41.239,124.1,41.239c85,0,106.611-29.138,106.611-29.138
l85.258-24.484c9.588,160.21-122.656,149.561-122.656,149.561H115.294c-86.171-5.996-73.633-88.568-73.633-88.568l-13.187-9.728
l-4.208-18.021L0,351.635L10.689,308.99z"/>
<path style="fill:#965353;" d="M426.664,335.317c-5.871,132.337-122.938,122.905-122.938,122.905H115.294
c-57.409-3.981-71.001-41.973-73.68-66.879c-0.765,5.84-9.205,82.432,73.68,88.209h188.433
C303.727,479.553,433.004,489.968,426.664,335.317z"/>
<g>
<path style="fill:#434A54;" d="M277.166,415.594c0,5.887,4.763,10.649,10.649,10.649c5.888,0,10.649-4.763,10.649-10.649
s-4.762-10.665-10.649-10.665C281.929,404.929,277.166,409.707,277.166,415.594z"/>
<path style="fill:#434A54;" d="M234.514,415.594c0,5.887,4.778,10.649,10.665,10.649s10.657-4.763,10.657-10.649
s-4.77-10.665-10.657-10.665S234.514,409.707,234.514,415.594z"/>
<path style="fill:#434A54;" d="M191.877,415.594c0,5.887,4.771,10.649,10.657,10.649s10.665-4.763,10.665-10.649
s-4.778-10.665-10.665-10.665S191.877,409.707,191.877,415.594z"/>
<path style="fill:#434A54;" d="M149.24,415.594c0,5.887,4.771,10.649,10.657,10.649s10.657-4.763,10.657-10.649
s-4.771-10.665-10.657-10.665S149.24,409.707,149.24,415.594z"/>
<path style="fill:#434A54;" d="M99.569,330.305C114.942,207.719,74.616,95.869,74.616,95.869h260.169
c80.105,93.783,24.953,234.561,24.953,234.561C262.832,285.849,99.569,330.305,99.569,330.305z"/>
</g>
<g style="opacity:0.1;">
<path style="fill:#FFFFFF;" d="M334.785,95.869h-21.314c69.206,81.026,37.445,197.147,27.529,227.222
c6.434,2.123,12.695,4.56,18.738,7.339C359.738,330.43,414.891,189.652,334.785,95.869z"/>
</g>
<path style="fill:#E6E9ED;" d="M170.555,196.477c0-35.321,28.638-63.959,63.959-63.959c35.329,0,63.951,28.638,63.951,63.959
c0,18.941-8.213,35.961-21.299,47.672v26.952h-85.289v-26.952C178.792,232.438,170.555,215.418,170.555,196.477z"/>
<g>
<path style="fill:#434A54;" d="M250.503,196.477c0,5.887,4.778,10.665,10.665,10.665c5.888,0,10.658-4.778,10.658-10.665
s-4.771-10.665-10.658-10.665C255.282,185.812,250.503,190.59,250.503,196.477z"/>
<path style="fill:#434A54;" d="M197.21,196.477c0,5.887,4.771,10.665,10.657,10.665s10.657-4.778,10.657-10.665
s-4.771-10.665-10.657-10.665S197.21,190.59,197.21,196.477z"/>
</g>
<g>
<path style="fill:#CCD1D9;" d="M277.166,271.085c-0.016-5.871-4.777-10.649-10.673-10.649c-5.887,0-10.657,4.778-10.657,10.665
h21.33V271.085z"/>
<path style="fill:#CCD1D9;" d="M255.836,271.085c0-5.871-4.77-10.649-10.657-10.649s-10.665,4.778-10.665,10.665h21.322V271.085z" />
<path style="fill:#CCD1D9;" d="M234.514,271.085c0-5.871-4.771-10.649-10.657-10.649s-10.657,4.778-10.657,10.665h21.314V271.085z" />
<path style="fill:#CCD1D9;" d="M213.199,271.085c-0.008-5.871-4.778-10.649-10.665-10.649s-10.657,4.778-10.657,10.665h21.322
L213.199,271.085L213.199,271.085z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="10mm" height="10mm" viewBox="0 0 10 10" version="1.1" id="svg26662" inkscape:version="1.2.2 (732a01da63, 2022-12-09)" sodipodi:docname="pir.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview id="namedview26664" pagecolor="#505050" bordercolor="#eeeeee" borderopacity="1" inkscape:showpageshadow="0" inkscape:pageopacity="0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#505050" inkscape:document-units="mm" showgrid="false" inkscape:zoom="10.35098" inkscape:cx="16.375261" inkscape:cy="42.073312" inkscape:window-width="1488" inkscape:window-height="1230" inkscape:window-x="2794" inkscape:window-y="123" inkscape:window-maximized="0" inkscape:current-layer="layer1" />
<defs id="defs26659" />
<g inkscape:label="Слой 1" inkscape:groupmode="layer" id="layer1">
<path id="path26647" style="fill:#e7f9fb;fill-opacity:1;stroke:none;stroke-width:0.734686;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:5.8;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" d="M 0.953646,0 C 0.4245958,0 0,0.42377 0,0.950056 V 9.051658 C 0,9.577943 0.4245958,9.9999995 0.953646,9.9999995 H 9.044545 C 9.573595,9.9999995 10,9.577943 10,9.051658 V 0.950056 C 10,0.42377 9.573595,0 9.044545,0 Z m 4.0319653,0.680202 c 0.7122257,0 1.1971907,0.171336 1.6235677,0.587681 C 7.149602,1.795597 7.303455,2.529484 7.076165,3.503527 6.954393,4.024672 6.743646,4.411034 6.384675,4.767983 6.046182,5.105514 5.7597,5.274565 5.369942,5.364516 4.7470347,5.510152 4.177518,5.313116 3.618915,4.763985 3.260174,4.411034 3.0504322,4.028385 2.9274247,3.503527 2.6985267,2.5272 2.8504547,1.797596 3.392573,1.267883 3.8051351,0.866387 4.2970505,0.680202 4.9856113,0.680202 Z M 4.1253339,2.785916 C 3.7727965,2.786202 3.5578276,2.980097 3.5578276,3.29821 c 0,0.197035 0.074385,0.320683 0.2711164,0.455467 C 4.0618628,3.91359 4.4444125,3.833637 4.5886441,3.596619 4.6788251,3.450984 4.6839941,3.154002 4.6001321,3.01265 4.5082281,2.855593 4.3583101,2.784203 4.1277751,2.784203 Z m 1.7295441,0 c -0.20506,0 -0.404923,0.09423 -0.493868,0.26557 C 5.226026,3.311345 5.34091,3.641452 5.60714,3.779948 5.859588,3.90845 6.185962,3.822778 6.372268,3.574345 6.463308,3.45441 6.469338,3.164568 6.383758,3.033211 6.273759,2.864731 6.062581,2.784774 5.85752,2.784774 Z M 1.8659927,5.307119 c 0.00862,-5.71e-4 0.020104,0 0.03073,0 0.2179844,2.86e-4 0.5876389,0.16848 1.6846262,0.695051 C 4.3488321,6.369399 4.9972712,6.669808 5.018122,6.669808 5.038222,6.669237 5.68049,6.371113 6.440564,6.008738 7.200522,5.64465 7.88377,5.323396 7.958155,5.323396 8.14742,5.283416 8.403142,5.409066 8.509492,5.577544 8.663431,5.82598 8.604552,6.167795 8.374795,6.361404 8.316205,6.409954 6.898963,7.091579 5.226428,7.875439 2.6791977,9.069933 2.1554033,9.312944 1.9972712,9.312944 c -0.2153996,0 -0.2679571,0 -0.3915391,-0.114223 C 1.3150575,8.936006 1.3506989,8.509952 1.6827021,8.264656 1.7519171,8.213256 2.1996325,7.990519 2.6777048,7.764356 3.1557197,7.54162 3.5582872,7.334304 3.5756915,7.334304 c 0.01436,0 -0.3826933,-0.217025 -0.8872167,-0.448042 C 2.1839513,6.654959 1.7142365,6.421657 1.646802,6.369971 1.4819495,6.24718 1.4026824,6.080128 1.4026824,5.863103 c 0,-0.219881 0.09535,-0.394643 0.2731268,-0.491448 0.063758,-0.03141 0.1203366,-0.05711 0.1901261,-0.06282 z M 7.094115,7.62329 7.661622,7.905994 c 0.784456,0.383506 0.930354,0.522573 0.930354,0.881807 0,0.219881 -0.105403,0.397498 -0.280307,0.480311 -0.151641,0.06568 -0.331859,0.06853 -0.513628,0 C 7.59815,9.193862 5.819639,8.388875 5.788334,8.354036 c -0.01436,0 0.273414,-0.182758 0.639363,-0.378651 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -1,68 +1,89 @@
<template> <template>
<div <div v-if="mode !== 'isolated'" ref="button" v-tooltip.right="'Minecraft accounts'" class="button-base avatar-button"
v-if="mode !== 'isolated'" :class="{ expanded: mode === 'expanded' }" @click="toggleMenu">
ref="button" <Avatar :size="mode === 'expanded' ? 'xs' : 'sm'" :src="selectedAccount
v-tooltip.right="'Minecraft accounts'" ? `https://mc-heads.net/avatar/${selectedAccount.username}/128`
class="button-base avatar-button" : 'https://launcher-files.modrinth.com/assets/steve_head.png'
:class="{ expanded: mode === 'expanded' }" " />
@click="toggleMenu"
>
<Avatar
:size="mode === 'expanded' ? 'xs' : 'sm'"
:src="
selectedAccount
? `https://mc-heads.net/avatar/${selectedAccount.id}/128`
: 'https://launcher-files.modrinth.com/assets/steve_head.png'
"
/>
</div> </div>
<transition name="fade"> <transition name="fade">
<Card <Card v-if="showCard || mode === 'isolated'" ref="card" class="account-card"
v-if="showCard || mode === 'isolated'" :class="{ expanded: mode === 'expanded', isolated: mode === 'isolated' }">
ref="card"
class="account-card"
:class="{ expanded: mode === 'expanded', isolated: mode === 'isolated' }"
>
<div v-if="selectedAccount" class="selected account"> <div v-if="selectedAccount" class="selected account">
<Avatar size="xs" :src="`https://mc-heads.net/avatar/${selectedAccount.id}/128`" /> <Avatar size="xs" :src="`https://mc-heads.net/avatar/${selectedAccount.username}/128`" />
<div> <div>
<h4>{{ selectedAccount.username }}</h4> <h4>
<component :is="getAccountType(selectedAccount)" class="vector-icon" /> {{ selectedAccount.username }}
</h4>
<p>Selected</p> <p>Selected</p>
</div> </div>
<Button v-tooltip="'Log out'" icon-only color="raised" @click="logout(selectedAccount.id)"> <Button v-tooltip="'Log out'" icon-only color="raised" @click="logout(selectedAccount.id)">
<TrashIcon /> <TrashIcon />
</Button> </Button>
</div> </div>
<div v-else class="logged-out account"> <div v-else class="login-section account">
<h4>Not signed in</h4> <h4>Not signed in</h4>
<Button v-tooltip="'Log in'" icon-only color="primary" @click="login()"> <Button v-tooltip="'Log in'" icon-only @click="login()">
<LogInIcon /> <MicrosoftIcon />
</Button>
<Button v-tooltip="'Add offline'" icon-only @click="tryOfflineLogin()">
<PirateIcon />
</Button> </Button>
</div> </div>
<div v-if="displayAccounts.length > 0" class="account-group"> <div v-if="displayAccounts.length > 0" class="account-group">
<div v-for="account in displayAccounts" :key="account.id" class="account-row"> <div v-for="account in displayAccounts" :key="account.id" class="account-row">
<Button class="option account" @click="setAccount(account)"> <Button class="option account" @click="setAccount(account)">
<Avatar :src="`https://mc-heads.net/avatar/${account.id}/128`" class="icon" /> <Avatar :src="`https://mc-heads.net/avatar/${account.username}/128`" class="icon" />
<p>{{ account.username }}</p> <p class="account-type">
<component :is="getAccountType(account)" class="vector-icon" />
{{ account.username }}
</p>
</Button> </Button>
<Button v-tooltip="'Log out'" icon-only @click="logout(account.id)"> <Button v-tooltip="'Log out'" icon-only @click="logout(account.id)">
<TrashIcon /> <TrashIcon />
</Button> </Button>
</div> </div>
</div> </div>
<Button v-if="accounts.length > 0" @click="login()"> <div v-if="accounts.length > 0" class="login-section account centered">
<PlusIcon /> <Button v-tooltip="'Log in'" icon-only @click="login()">
Add account <MicrosoftIcon />
</Button> </Button>
<Button v-tooltip="'Add offline'" icon-only @click="tryOfflineLogin()">
<PirateIcon />
</Button>
</div>
</Card> </Card>
</transition> </transition>
<ModalWrapper ref="loginOfflineModal" class="modal" header="Offline auth">
<div class="modal-body">
<div class="label">Offline account</div>
<input type="text" v-model="playerName" placeholder="Provide offline player name" />
<Button icon-only color="secondary" @click="offlineLoginFinally()">
Continue
</Button>
</div>
</ModalWrapper>
<ModalWrapper ref="loginErrorModal" class="modal" header="Error while proceed">
<div class="modal-body">
<div class="label">Error occurred while adding offline account</div>
<Button color="primary" @click="retryOfflineLogin()">
Try again
</Button>
</div>
</ModalWrapper>
<ModalWrapper ref="unexpectedErrorModal" class="modal" header="Ошибка">
<div class="modal-body">
<div class="label">Unexcepted error</div>
</div>
</ModalWrapper>
</template> </template>
<script setup> <script setup>
import { PlusIcon, TrashIcon, LogInIcon } from '@modrinth/assets' import { PlusIcon, TrashIcon, LogInIcon, PirateIcon as Offline, MicrosoftIcon as License, MicrosoftIcon, PirateIcon } from '@modrinth/assets'
import { Avatar, Button, Card } from '@modrinth/ui' import { Avatar, Button, Card } from '@modrinth/ui'
import { ref, computed, onMounted, onBeforeUnmount, onUnmounted } from 'vue' import { ref, computed, onMounted, onBeforeUnmount, onUnmounted } from 'vue'
import { import {
offline_login,
users, users,
remove_user, remove_user,
set_default_user, set_default_user,
@@ -73,7 +94,7 @@ import { handleError } from '@/store/state.js'
import { trackEvent } from '@/helpers/analytics' import { trackEvent } from '@/helpers/analytics'
import { process_listener } from '@/helpers/events' import { process_listener } from '@/helpers/events'
import { handleSevereError } from '@/store/error.js' import { handleSevereError } from '@/store/error.js'
import { show_ads_window, hide_ads_window } from '@/helpers/ads.js' import ModalWrapper from './modal/ModalWrapper.vue'
defineProps({ defineProps({
mode: { mode: {
@@ -87,6 +108,46 @@ const emit = defineEmits(['change'])
const accounts = ref({}) const accounts = ref({})
const defaultUser = ref() const defaultUser = ref()
const loginOfflineModal = ref(null)
const loginErrorModal = ref(null)
const unexpectedErrorModal = ref(null)
const playerName = ref('')
async function tryOfflineLogin() { // Patched
loginOfflineModal.value.show()
}
async function offlineLoginFinally() { // Patched
let name = playerName.value
if (name.length > 1 && name.length < 20 && name !== '') {
const loggedIn = await offline_login(name).catch(handleError)
loginOfflineModal.value.hide()
if (loggedIn) {
await setAccount(loggedIn)
await refreshValues()
} else {
unexpectedErrorModal.value.show()
}
playerName.value = ''
} else {
playerName.value = ''
loginOfflineModal.value.hide()
loginErrorModal.value.show()
}
}
function retryOfflineLogin() { // Patched
loginErrorModal.value.hide()
tryOfflineLogin()
}
function getAccountType(account) { // Patched
if (account.access_token != "null" && account.access_token != null && account.access_token != "") {
return License
} else {
return Offline
}
}
async function refreshValues() { async function refreshValues() {
defaultUser.value = await get_default_user().catch(handleError) defaultUser.value = await get_default_user().catch(handleError)
@@ -151,13 +212,8 @@ const handleClickOutside = (event) => {
function toggleMenu(override = true) { function toggleMenu(override = true) {
if (showCard.value || !override) { if (showCard.value || !override) {
if (showCard.value) {
show_ads_window()
}
showCard.value = false showCard.value = false
} else { } else {
hide_ads_window()
showCard.value = true showCard.value = true
} }
} }
@@ -189,12 +245,18 @@ onUnmounted(() => {
gap: 1rem; gap: 1rem;
} }
.logged-out { .login-section {
background: var(--color-bg); background: var(--color-bg);
border-radius: var(--radius-lg); border-radius: var(--radius-lg);
gap: 1rem; gap: 1rem;
} }
.vector-icon {
width: 12px;
height: 12px;
}
.account { .account {
width: max-content; width: max-content;
display: flex; display: flex;
@@ -255,6 +317,12 @@ onUnmounted(() => {
font-weight: bolder; font-weight: bolder;
} }
.centered {
display: flex;
gap: 1rem;
margin: auto;
}
.account-group { .account-group {
width: 100%; width: 100%;
display: flex; display: flex;

View File

@@ -1,21 +1,13 @@
<template> <template>
<transition name="fade"> <transition name="fade">
<div <div v-show="shown" ref="contextMenu" class="context-menu" :style="{
v-show="shown" left: left,
ref="contextMenu" top: top,
class="context-menu" }">
:style="{
left: left,
top: top,
}"
>
<div v-for="(option, index) in options" :key="index" @click.stop="optionClicked(option.name)"> <div v-for="(option, index) in options" :key="index" @click.stop="optionClicked(option.name)">
<hr v-if="option.type === 'divider'" class="divider" /> <hr v-if="option.type === 'divider'" class="divider" />
<div <div v-else-if="!(isLinkedData(item) && option.name === `add_content`)" class="item clickable"
v-else-if="!(isLinkedData(item) && option.name === `add_content`)" :class="[option.color ?? 'base']">
class="item clickable"
:class="[option.color ?? 'base']"
>
<slot :name="option.name" /> <slot :name="option.name" />
</div> </div>
</div> </div>
@@ -25,7 +17,6 @@
<script setup> <script setup>
import { onBeforeUnmount, onMounted, ref } from 'vue' import { onBeforeUnmount, onMounted, ref } from 'vue'
import { show_ads_window, hide_ads_window } from '@/helpers/ads.js'
const emit = defineEmits(['menu-closed', 'option-clicked']) const emit = defineEmits(['menu-closed', 'option-clicked'])
@@ -38,7 +29,6 @@ const shown = ref(false)
defineExpose({ defineExpose({
showMenu: (event, passedItem, passedOptions) => { showMenu: (event, passedItem, passedOptions) => {
hide_ads_window()
item.value = passedItem item.value = passedItem
options.value = passedOptions options.value = passedOptions
@@ -71,9 +61,6 @@ const isLinkedData = (item) => {
} }
const hideContextMenu = () => { const hideContextMenu = () => {
if (shown.value) {
show_ads_window()
}
shown.value = false shown.value = false
emit('menu-closed') emit('menu-closed')
} }

View File

@@ -1,121 +0,0 @@
<script setup>
import { ref, onMounted, onUnmounted } from 'vue'
import { get as getCreds } from '@/helpers/mr_auth.js'
import { handleError } from '@/store/notifications.js'
import { get_user } from '@/helpers/cache.js'
import { ChevronRightIcon } from '@modrinth/assets'
import { init_ads_window } from '@/helpers/ads.js'
import { listen } from '@tauri-apps/api/event'
const showAd = ref(true)
defineExpose({
scroll() {
updateAdPosition()
},
})
const creds = await getCreds().catch(handleError)
if (creds && creds.user_id) {
const user = await get_user(creds.user_id).catch(handleError)
const MIDAS_BITFLAG = 1 << 0
if (user && (user.badges & MIDAS_BITFLAG) === MIDAS_BITFLAG) {
showAd.value = false
}
}
const adsWrapper = ref(null)
let resizeObserver
let scrollHandler
let intersectionObserver
let mutationObserver
onMounted(() => {
if (showAd.value) {
updateAdPosition(true)
resizeObserver = new ResizeObserver(() => updateAdPosition())
resizeObserver.observe(adsWrapper.value)
intersectionObserver = new IntersectionObserver(() => updateAdPosition())
intersectionObserver.observe(adsWrapper.value)
mutationObserver = new MutationObserver(() => updateAdPosition())
mutationObserver.observe(adsWrapper.value, { attributes: true, childList: true, subtree: true })
// Add scroll event listener
scrollHandler = () => {
requestAnimationFrame(() => updateAdPosition())
}
window.addEventListener('scroll', scrollHandler, { passive: true })
}
})
function updateAdPosition(overrideShown = false) {
if (adsWrapper.value) {
const rect = adsWrapper.value.getBoundingClientRect()
let y = rect.top + window.scrollY
let height = rect.bottom - rect.top
// Prevent ad from overlaying the app bar
if (y <= 52) {
y = 52
height = rect.bottom - 52
if (height < 0) {
height = 0
y = -1000
}
}
init_ads_window(rect.left + window.scrollX, y, rect.right - rect.left, height, overrideShown)
}
}
const unlisten = await listen('ads-scroll', (event) => {
if (adsWrapper.value) {
adsWrapper.value.parentNode.scrollTop += event.payload.scroll
updateAdPosition()
}
})
onUnmounted(() => {
if (resizeObserver) {
resizeObserver.disconnect()
}
if (intersectionObserver) {
intersectionObserver.disconnect()
}
if (mutationObserver) {
mutationObserver.disconnect()
}
if (scrollHandler) {
window.removeEventListener('scroll', scrollHandler)
}
unlisten()
})
</script>
<template>
<div
v-if="showAd"
ref="adsWrapper"
class="ad-parent relative mb-3 flex w-full justify-center rounded-2xl bg-bg-raised cursor-pointer"
>
<div class="flex max-h-[250px] min-h-[250px] min-w-[300px] max-w-[300px] flex-col gap-4 p-6">
<p class="m-0 text-2xl font-bold text-contrast">90% of ad revenue goes to creators</p>
<a
href="https://modrinth.com/plus"
class="mt-auto items-center gap-1 text-purple hover:underline"
>
<span>
Support creators and Modrinth ad-free with
<span class="font-bold">Modrinth+</span>
</span>
<ChevronRightIcon class="relative top-[3px] h-5 w-5" />
</a>
</div>
</div>
</template>

View File

@@ -4,13 +4,8 @@
<ChatIcon /> <ChatIcon />
<span> Get support </span> <span> Get support </span>
</a> </a>
<Button <Button v-if="currentLoadingBars.length > 0" ref="infoButton" icon-only class="icon-button show-card-icon"
v-if="currentLoadingBars.length > 0" @click="toggleCard()">
ref="infoButton"
icon-only
class="icon-button show-card-icon"
@click="toggleCard()"
>
<DownloadIcon /> <DownloadIcon />
</Button> </Button>
<div v-if="offline" class="status"> <div v-if="offline" class="status">
@@ -25,33 +20,19 @@
<router-link :to="`/instance/${encodeURIComponent(selectedProcess.profile.path)}`"> <router-link :to="`/instance/${encodeURIComponent(selectedProcess.profile.path)}`">
{{ selectedProcess.profile.name }} {{ selectedProcess.profile.name }}
</router-link> </router-link>
<div <div v-if="currentProcesses.length > 1" class="arrow button-base" :class="{ rotate: showProfiles }"
v-if="currentProcesses.length > 1" @click="toggleProfiles()">
class="arrow button-base"
:class="{ rotate: showProfiles }"
@click="toggleProfiles()"
>
<DropdownIcon /> <DropdownIcon />
</div> </div>
</div> </div>
<Button <Button v-tooltip="'Stop instance'" icon-only class="icon-button stop" @click="stop(selectedProcess)">
v-tooltip="'Stop instance'"
icon-only
class="icon-button stop"
@click="stop(selectedProcess)"
>
<StopCircleIcon /> <StopCircleIcon />
</Button> </Button>
<Button v-tooltip="'View logs'" icon-only class="icon-button" @click="goToTerminal()"> <Button v-tooltip="'View logs'" icon-only class="icon-button" @click="goToTerminal()">
<TerminalSquareIcon /> <TerminalSquareIcon />
</Button> </Button>
<Button <Button v-if="currentLoadingBars.length > 0" ref="infoButton" icon-only class="icon-button show-card-icon"
v-if="currentLoadingBars.length > 0" @click="toggleCard()">
ref="infoButton"
icon-only
class="icon-button show-card-icon"
@click="toggleCard()"
>
<DownloadIcon /> <DownloadIcon />
</Button> </Button>
</div> </div>
@@ -59,6 +40,40 @@
<span class="circle stopped" /> <span class="circle stopped" />
<span class="running-text"> No instances running </span> <span class="running-text"> No instances running </span>
</div> </div>
<div v-if="updateState">
<a>
<Button class="download" :disabled="installState" @click="confirmUpdating(), getRemote(false, false)">
<DownloadIcon />
{{
installState
? "Downloading new update..."
: "Download new update"
}}
</Button>
</a>
</div>
<ModalWrapper ref="confirmUpdate" :has-to-type="false" header="Request to update the AstralRinth launcher">
<div class="modal-body">
<div class="markdown-body">
<p>
Before updating, make sure that you have saved all running instances and made a backup copy of the instances
that are valuable to you. Remember that the authors of the product are not responsible for the breakdown of
your files, so you should always make copies of them and keep them in a safe place.
</p>
</div>
<span>Version on remote server <p id="releaseData" class="cosmic inline-fix"></p></span>
<span>Version on local device
<p class="cosmic inline-fix">v{{ version }}</p>
</span>
<div class="button-group push-right">
<Button class="download-modal" @click="confirmUpdate.hide()">
Decline</Button>
<Button class="download-modal" @click="approvedUpdating()">
Accept
</Button>
</div>
</div>
</ModalWrapper>
</div> </div>
<transition name="download"> <transition name="download">
<Card v-if="showCard === true && currentLoadingBars.length > 0" ref="card" class="info-card"> <Card v-if="showCard === true && currentLoadingBars.length > 0" ref="card" class="info-card">
@@ -74,32 +89,14 @@
</Card> </Card>
</transition> </transition>
<transition name="download"> <transition name="download">
<Card <Card v-if="showProfiles === true && currentProcesses.length > 0" ref="profiles" class="profile-card">
v-if="showProfiles === true && currentProcesses.length > 0" <Button v-for="process in currentProcesses" :key="process.uuid" class="profile-button"
ref="profiles" @click="selectProcess(process)">
class="profile-card"
>
<Button
v-for="process in currentProcesses"
:key="process.uuid"
class="profile-button"
@click="selectProcess(process)"
>
<div class="text"><span class="circle running" /> {{ process.profile.name }}</div> <div class="text"><span class="circle running" /> {{ process.profile.name }}</div>
<Button <Button v-tooltip="'Stop instance'" icon-only class="icon-button stop" @click.stop="stop(process)">
v-tooltip="'Stop instance'"
icon-only
class="icon-button stop"
@click.stop="stop(process)"
>
<StopCircleIcon /> <StopCircleIcon />
</Button> </Button>
<Button <Button v-tooltip="'View logs'" icon-only class="icon-button" @click.stop="goToTerminal(process.profile.path)">
v-tooltip="'View logs'"
icon-only
class="icon-button"
@click.stop="goToTerminal(process.profile.path)"
>
<TerminalSquareIcon /> <TerminalSquareIcon />
</Button> </Button>
</Button> </Button>
@@ -120,6 +117,23 @@ import { handleError } from '@/store/notifications.js'
import { ChatIcon } from '@/assets/icons' import { ChatIcon } from '@/assets/icons'
import { get_many } from '@/helpers/profile.js' import { get_many } from '@/helpers/profile.js'
import { trackEvent } from '@/helpers/analytics' import { trackEvent } from '@/helpers/analytics'
import { version } from '../../../package.json'
import { installState, getRemote, updateState } from '@/helpers/update.js'
import ModalWrapper from './modal/ModalWrapper.vue'
const confirmUpdate = ref(null)
const confirmUpdating = async () => {
confirmUpdate.value.show()
}
const approvedUpdating = async () => {
confirmUpdate.value.hide()
await getRemote(true, true)
}
await getRemote(true, false)
const router = useRouter() const router = useRouter()
const card = ref(null) const card = ref(null)
@@ -277,6 +291,101 @@ onBeforeUnmount(() => {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.inline-fix {
display: inline-flex;
margin-top: -2rem;
margin-bottom: -2rem;
//margin-left: 0.3rem;
}
.cosmic {
color: #3e8cde;
text-decoration: none;
text-shadow:
0 0 4px rgba(79, 173, 255, 0.5),
0 0 8px rgba(14, 98, 204, 0.5),
0 0 12px rgba(122, 31, 199, 0.5);
transition: color 0.35s ease;
}
.markdown-body {
:deep(table) {
width: auto;
}
:deep(hr),
:deep(h1),
:deep(h2) {
max-width: max(60rem, 90%);
}
:deep(ul),
:deep(ol) {
margin-left: 2rem;
}
}
.modal-body {
display: flex;
flex-direction: column;
gap: 1rem;
padding: var(--gap-lg);
text-align: left;
.button-group {
display: flex;
justify-content: flex-end;
gap: 0.5rem;
}
strong {
color: var(--color-contrast);
}
}
.download {
color: #3e8cde;
border-radius: var(--radius-md);
border: 1px solid var(--color-button-bg);
// padding: var(--gap-sm) var(--gap-lg);
background-color: rgba(0, 0, 0, 0);
text-decoration: none;
text-shadow:
0 0 4px rgba(79, 173, 255, 0.5),
0 0 8px rgba(14, 98, 204, 0.5),
0 0 12px rgba(122, 31, 199, 0.5);
transition: color 0.35s ease;
display: flex;
flex-direction: row;
align-items: center;
gap: 0.5rem;
}
.download:hover,
.download:focus,
.download:active {
color: #10fae5;
text-shadow: #26065e;
}
.download-modal {
color: #3e8cde;
padding: var(--gap-sm) var(--gap-lg);
text-decoration: none;
text-shadow:
0 0 4px rgba(79, 173, 255, 0.5),
0 0 8px rgba(14, 98, 204, 0.5),
0 0 12px rgba(122, 31, 199, 0.5);
transition: color 0.35s ease;
}
.download-modal:hover,
.download-modal:focus,
.download-modal:active {
color: #10fae5;
text-shadow: #26065e;
}
.action-groups { .action-groups {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@@ -288,6 +397,7 @@ onBeforeUnmount(() => {
transition: transform 0.2s ease-in-out; transition: transform 0.2s ease-in-out;
display: flex; display: flex;
align-items: center; align-items: center;
&.rotate { &.rotate {
transform: rotate(180deg); transform: rotate(180deg);
} }
@@ -309,8 +419,10 @@ onBeforeUnmount(() => {
gap: var(--gap-xs); gap: var(--gap-xs);
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
-webkit-user-select: none; /* Safari */ -webkit-user-select: none;
-ms-user-select: none; /* IE 10 and IE 11 */ /* Safari */
-ms-user-select: none;
/* IE 10 and IE 11 */
user-select: none; user-select: none;
&.clickable:hover { &.clickable:hover {

View File

@@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue' import { ref } from 'vue'
import { ConfirmModal } from '@modrinth/ui' import { ConfirmModal } from '@modrinth/ui'
import { show_ads_window, hide_ads_window } from '@/helpers/ads.js'
import { useTheming } from '@/store/theme.js' import { useTheming } from '@/store/theme.js'
const themeStore = useTheming() const themeStore = useTheming()
@@ -36,7 +36,6 @@ const modal = ref(null)
defineExpose({ defineExpose({
show: () => { show: () => {
hide_ads_window()
modal.value.show() modal.value.show()
}, },
hide: () => { hide: () => {
@@ -45,25 +44,13 @@ defineExpose({
}, },
}) })
function onModalHide() {
show_ads_window()
}
function proceed() { function proceed() {
emit('proceed') emit('proceed')
} }
</script> </script>
<template> <template>
<ConfirmModal <ConfirmModal ref="modal" :confirmation-text="confirmationText" :has-to-type="hasToType" :title="title"
ref="modal" :description="description" :proceed-label="proceedLabel" :on-hide="onModalHide"
:confirmation-text="confirmationText" :noblur="!themeStore.advancedRendering" @proceed="proceed" />
:has-to-type="hasToType"
:title="title"
:description="description"
:proceed-label="proceedLabel"
:on-hide="onModalHide"
:noblur="!themeStore.advancedRendering"
@proceed="proceed"
/>
</template> </template>

View File

@@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue' import { ref } from 'vue'
import { Modal } from '@modrinth/ui' import { Modal } from '@modrinth/ui'
import { show_ads_window, hide_ads_window } from '@/helpers/ads.js'
import { useTheming } from '@/store/theme.js' import { useTheming } from '@/store/theme.js'
const themeStore = useTheming() const themeStore = useTheming()
@@ -18,7 +18,7 @@ const props = defineProps({
onHide: { onHide: {
type: Function, type: Function,
default() { default() {
return () => {} return () => { }
}, },
}, },
}) })
@@ -27,7 +27,6 @@ const modal = ref(null)
defineExpose({ defineExpose({
show: () => { show: () => {
hide_ads_window()
modal.value.show() modal.value.show()
}, },
hide: () => { hide: () => {
@@ -37,7 +36,6 @@ defineExpose({
}) })
function onModalHide() { function onModalHide() {
show_ads_window()
props.onHide() props.onHide()
} }
</script> </script>

View File

@@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue' import { ref } from 'vue'
import { ShareModal } from '@modrinth/ui' import { ShareModal } from '@modrinth/ui'
import { show_ads_window, hide_ads_window } from '@/helpers/ads.js'
import { useTheming } from '@/store/theme.js' import { useTheming } from '@/store/theme.js'
const themeStore = useTheming() const themeStore = useTheming()
@@ -33,7 +33,6 @@ const modal = ref(null)
defineExpose({ defineExpose({
show: (passedContent) => { show: (passedContent) => {
hide_ads_window()
modal.value.show(passedContent) modal.value.show(passedContent)
}, },
hide: () => { hide: () => {
@@ -41,21 +40,9 @@ defineExpose({
modal.value.hide() modal.value.hide()
}, },
}) })
function onModalHide() {
show_ads_window()
}
</script> </script>
<template> <template>
<ShareModal <ShareModal ref="modal" :header="header" :share-title="shareTitle" :share-text="shareText" :link="link"
ref="modal" :open-in-new-tab="openInNewTab" :on-hide="onModalHide" :noblur="!themeStore.advancedRendering" />
:header="header"
:share-title="shareTitle"
:share-text="shareText"
:link="link"
:open-in-new-tab="openInNewTab"
:on-hide="onModalHide"
:noblur="!themeStore.advancedRendering"
/>
</template> </template>

View File

@@ -1,13 +0,0 @@
import { invoke } from '@tauri-apps/api/core'
export async function init_ads_window(x, y, width, height, overrideShown = false) {
return await invoke('plugin:ads|init_ads_window', { x, y, width, height, overrideShown })
}
export async function show_ads_window() {
return await invoke('plugin:ads|show_ads_window')
}
export async function hide_ads_window(reset) {
return await invoke('plugin:ads|hide_ads_window', { reset })
}

View File

@@ -13,6 +13,10 @@ import { invoke } from '@tauri-apps/api/core'
// await authenticate_await_completion() // await authenticate_await_completion()
// } // }
export async function offline_login(name) {
return await invoke('plugin:auth|offline_login', { name: name })
}
/** /**
* Authenticate a user with Hydra - part 1. * Authenticate a user with Hydra - part 1.
* This begins the authentication flow quasi-synchronously. * This begins the authentication flow quasi-synchronously.

View File

@@ -0,0 +1,176 @@
import { ref } from 'vue'
import { version } from '../../package.json'
import { getArtifact, getOS } from '@/helpers/utils.js'
export const allowState = ref(false)
export const installState = ref(false)
export const updateState = ref(false)
export const latestBetaCommitTruncatedSha = ref('')
export const latestBetaCommitLink = ref('')
export const launcherUrl = 'https://www.astralium.su/get/ar'
const os = ref('')
const releaseLink = `https://api.github.com/repos/DIDIRUS4/AstralRinth/releases/latest`
const branchesLink = `https://api.github.com/repos/DIDIRUS4/AstralRinth/branches`
const failedFetch = [`Failed to fetch remote releases:`, `Failed to fetch remote commits:`]
const localVersion = `v${version}`
const betaBranch = `beta` // Github repository beta branch
const osNames = ['macos', 'windows', 'linux']
const macExtension = `.dmg` // MacOS file type for download
const windowsExtension = `.msi` // Windows file type for download
const blacklistedBuilds = [
`dev`,
`nightly`,
`dirty`,
`dirty-dev`,
`dirty-nightly`,
`dirty_dev`,
`dirty_nightly`,
] // This is blacklisted builds for download. For example, file.startsWith('dev') is not allowed.
/**
* Asynchronously fetches branches and their latest commit information from the specified URLs.
*
* @return {Promise<void>} This function does not return anything directly but updates the latestBetaCommitTruncatedSha and latestBetaCommitLink values.
*/
export async function getBranches() {
fetch(branchesLink)
.then(async (response) => {
if (response.ok) {
response.json().then((data) => {
const branches = data.map((branch) => branch)
branches.forEach((branch) => {
fetch(branch.commit.url).then(async (data) => {
if (data.ok) {
data.json().then((data) => {
const truncatedSha = data.sha.slice(0, 7)
const commitLink = data.html_url
if (branch.name.toLowerCase() == betaBranch) {
latestBetaCommitTruncatedSha.value = truncatedSha
latestBetaCommitLink.value = commitLink
}
})
} else {
throw new Error(data.status)
}
})
})
})
} else {
throw new Error(response.status)
}
})
.catch((error) => {
latestBetaCommitTruncatedSha.value = error.message
latestBetaCommitLink.value = undefined
console.error(failedFetch[1], error)
})
}
/**
* Asynchronous function to get remote data and handle updates and downloads.
*
* @param {boolean} elementIdBool - Indicates whether to disable an element ID.
* @param {boolean} downloadArtifactBool - Indicates whether to download an artifact.
*/
export async function getRemote(elementIdBool, downloadArtifactBool) {
fetch(releaseLink)
.then((response) => {
if (!response.ok) {
throw new Error(response.status)
}
return response.json()
})
.then(async (data) => {
os.value = await getOS()
const latestRelease = data.name
let remoteVersion = undefined
if (!elementIdBool) {
const releaseData = document.getElementById('releaseData')
if (releaseData == null) {
console.error('Release data element not found.')
return false
}
releaseData.textContent = latestRelease
remoteVersion = `${releaseData.textContent}`
} else {
remoteVersion = latestRelease
}
if (osNames.includes(os.value.toLowerCase())) {
if (remoteVersion.startsWith(localVersion)) {
updateState.value = false
allowState.value = false
} else {
updateState.value = true
allowState.value = true
}
} else {
updateState.value = false
allowState.value = false
}
console.log('Update available state is', updateState.value)
console.log('Remote version is', remoteVersion)
console.log('Local version is', localVersion)
console.log('Operating System is', os.value)
if (downloadArtifactBool) {
installState.value = true
const builds = data.assets
const fileName = getInstaller(getExtension(), builds)
if (fileName != null) {
await getArtifact(fileName[1], fileName[0], os.value, true)
}
installState.value = false
}
})
.catch((error) => {
console.error(failedFetch[0], error)
if (!elementIdBool) {
const errorData = document.getElementById('releaseData')
if (errorData) {
errorData.textContent = `${error.message}`
}
updateState.value = false
allowState.value = false
installState.value = false
}
})
}
/**
* Retrieves the installer for a specific operating system.
*
* @param {string} osExtension - The file extension of the installer.
* @param {Array} builds - The list of builds.
* @return {Array|null} An array containing the installer name and URL if found, or null if not found.
*/
function getInstaller(osExtension, builds) {
for (let i of builds) {
let blacklistedItem = false
blacklistedBuilds.forEach((item) => {
if (i.name.startsWith(item)) {
return (blacklistedItem = true)
}
})
if (i.name.endsWith(osExtension) && !blacklistedItem) {
console.log(i.browser_download_url)
return [i.name, i.browser_download_url]
}
}
return null
}
/**
* A function to get the extension based on the operating system.
*
* @return {string} The extension based on the operating system.
*/
function getExtension() {
if (os.value.toLowerCase() == osNames[0]) {
return macExtension
} else if (os.value.toLowerCase() == osNames[1]) {
return windowsExtension
}
return null
}

View File

@@ -10,6 +10,11 @@ export async function getOS() {
return await invoke('plugin:utils|get_os') return await invoke('plugin:utils|get_os')
} }
export async function getArtifact(downloadurl, filename, ostype, autoupdatesupported) {
console.log('Downloading build', downloadurl, filename, ostype, autoupdatesupported)
return await invoke('plugin:utils|get_artifact', { downloadurl, filename, ostype, autoupdatesupported })
}
export async function openPath(path) { export async function openPath(path) {
return await invoke('plugin:utils|open_path', { path }) return await invoke('plugin:utils|open_path', { path })
} }

View File

@@ -22,7 +22,6 @@ import { get as getInstance, get_projects as getInstanceProjects } from '@/helpe
import { convertFileSrc } from '@tauri-apps/api/core' import { convertFileSrc } from '@tauri-apps/api/core'
import { get_search_results } from '@/helpers/cache.js' import { get_search_results } from '@/helpers/cache.js'
import { debounce } from '@/helpers/utils.js' import { debounce } from '@/helpers/utils.js'
import PromotionWrapper from '@/components/ui/PromotionWrapper.vue'
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
@@ -529,7 +528,6 @@ const isModProject = computed(() => ['modpack', 'mod'].includes(projectType.valu
<template> <template>
<div ref="searchWrapper" class="search-container"> <div ref="searchWrapper" class="search-container">
<aside class="filter-panel" @scroll="$refs.promo.scroll()"> <aside class="filter-panel" @scroll="$refs.promo.scroll()">
<PromotionWrapper ref="promo" />
<Card v-if="instanceContext" class="small-instance"> <Card v-if="instanceContext" class="small-instance">
<router-link :to="`/instance/${encodeURIComponent(instanceContext.path)}`" class="instance"> <router-link :to="`/instance/${encodeURIComponent(instanceContext.path)}`" class="instance">
<Avatar <Avatar

View File

@@ -1,5 +1,5 @@
<script setup> <script setup>
import { ref, onMounted, onUnmounted, computed } from 'vue' import { ref, onUnmounted, computed } from 'vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import RowDisplay from '@/components/RowDisplay.vue' import RowDisplay from '@/components/RowDisplay.vue'
import { list } from '@/helpers/profile.js' import { list } from '@/helpers/profile.js'
@@ -8,11 +8,6 @@ import { useBreadcrumbs } from '@/store/breadcrumbs'
import { handleError } from '@/store/notifications.js' import { handleError } from '@/store/notifications.js'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { get_search_results } from '@/helpers/cache.js' import { get_search_results } from '@/helpers/cache.js'
import { hide_ads_window } from '@/helpers/ads.js'
onMounted(() => {
hide_ads_window(true)
})
const featuredModpacks = ref({}) const featuredModpacks = ref({})
const featuredMods = ref({}) const featuredMods = ref({})
@@ -105,31 +100,27 @@ onUnmounted(() => {
<template> <template>
<div class="page-container"> <div class="page-container">
<RowDisplay <RowDisplay v-if="total > 0" :instances="[
v-if="total > 0" {
:instances="[ label: 'Jump back in',
{ route: '/library',
label: 'Jump back in', instances: recentInstances,
route: '/library', instance: true,
instances: recentInstances, downloaded: true,
instance: true, },
downloaded: true, {
}, label: 'Popular packs',
{ route: '/browse/modpack',
label: 'Popular packs', instances: featuredModpacks,
route: '/browse/modpack', downloaded: false,
instances: featuredModpacks, },
downloaded: false, {
}, label: 'Popular mods',
{ route: '/browse/mod',
label: 'Popular mods', instances: featuredMods,
route: '/browse/mod', downloaded: false,
instances: featuredMods, },
downloaded: false, ]" :can-paginate="true" />
},
]"
:can-paginate="true"
/>
</div> </div>
</template> </template>

View File

@@ -1,5 +1,5 @@
<script setup> <script setup>
import { onMounted, onUnmounted, ref, shallowRef } from 'vue' import { onUnmounted, ref, shallowRef } from 'vue'
import GridDisplay from '@/components/GridDisplay.vue' import GridDisplay from '@/components/GridDisplay.vue'
import { list } from '@/helpers/profile.js' import { list } from '@/helpers/profile.js'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
@@ -10,11 +10,6 @@ import { Button } from '@modrinth/ui'
import { PlusIcon } from '@modrinth/assets' import { PlusIcon } from '@modrinth/assets'
import InstanceCreationModal from '@/components/ui/InstanceCreationModal.vue' import InstanceCreationModal from '@/components/ui/InstanceCreationModal.vue'
import { NewInstanceImage } from '@/assets/icons' import { NewInstanceImage } from '@/assets/icons'
import { hide_ads_window } from '@/helpers/ads.js'
onMounted(() => {
hide_ads_window(true)
})
const route = useRoute() const route = useRoute()
const breadcrumbs = useBreadcrumbs() const breadcrumbs = useBreadcrumbs()

View File

@@ -1,6 +1,6 @@
<script setup> <script setup>
import { ref, watch, onMounted } from 'vue' import { ref, watch } from 'vue'
import { LogOutIcon, LogInIcon, BoxIcon, FolderSearchIcon, TrashIcon } from '@modrinth/assets' import { LogOutIcon, LogInIcon, BoxIcon, FolderSearchIcon, TrashIcon, PirateShipIcon, UpdatedIcon } from '@modrinth/assets'
import { Card, Slider, DropdownSelect, Toggle, Button } from '@modrinth/ui' import { Card, Slider, DropdownSelect, Toggle, Button } from '@modrinth/ui'
import { handleError, useTheming } from '@/store/state' import { handleError, useTheming } from '@/store/state'
import { get, set } from '@/helpers/settings' import { get, set } from '@/helpers/settings'
@@ -8,24 +8,27 @@ import { get_java_versions, get_max_memory, set_java_version } from '@/helpers/j
import { get as getCreds, logout } from '@/helpers/mr_auth.js' import { get as getCreds, logout } from '@/helpers/mr_auth.js'
import JavaSelector from '@/components/ui/JavaSelector.vue' import JavaSelector from '@/components/ui/JavaSelector.vue'
import ModrinthLoginScreen from '@/components/ui/tutorial/ModrinthLoginScreen.vue' import ModrinthLoginScreen from '@/components/ui/tutorial/ModrinthLoginScreen.vue'
import { optOutAnalytics, optInAnalytics } from '@/helpers/analytics' import { optOutAnalytics } from '@/helpers/analytics'
import { open } from '@tauri-apps/plugin-dialog' import { open } from '@tauri-apps/plugin-dialog'
import { getOS } from '@/helpers/utils.js' import { getOS } from '@/helpers/utils.js'
import { getVersion } from '@tauri-apps/api/app' // import { getVersion } from '@tauri-apps/api/app'
import { get_user, purge_cache_types } from '@/helpers/cache.js' import { get_user, purge_cache_types } from '@/helpers/cache.js'
import { hide_ads_window } from '@/helpers/ads.js'
import ConfirmModalWrapper from '@/components/ui/modal/ConfirmModalWrapper.vue' import ConfirmModalWrapper from '@/components/ui/modal/ConfirmModalWrapper.vue'
onMounted(() => { import { version, development_build } from '../../package.json'
hide_ads_window() import {
}) getRemote,
getBranches,
launcherUrl,
latestBetaCommitLink,
latestBetaCommitTruncatedSha,
} from '@/helpers/update.js'
const pageOptions = ['Home', 'Library'] const pageOptions = ['Home', 'Library']
const themeStore = useTheming() const themeStore = useTheming()
const version = await getVersion()
const accessSettings = async () => { const accessSettings = async () => {
const settings = await get() const settings = await get()
@@ -51,7 +54,7 @@ watch(
const setSettings = JSON.parse(JSON.stringify(newSettings)) const setSettings = JSON.parse(JSON.stringify(newSettings))
if (setSettings.telemetry) { if (setSettings.telemetry) {
optInAnalytics() // optInAnalytics()
} else { } else {
optOutAnalytics() optOutAnalytics()
} }
@@ -147,6 +150,9 @@ async function purgeCache() {
'search_results', 'search_results',
]).catch(handleError) ]).catch(handleError)
} }
await getRemote(false, false)
await getBranches()
</script> </script>
<template> <template>
@@ -175,14 +181,9 @@ async function purgeCache() {
Sign in Sign in
</button> </button>
</div> </div>
<ConfirmModalWrapper <ConfirmModalWrapper ref="purgeCacheConfirmModal" title="Are you sure you want to purge the cache?"
ref="purgeCacheConfirmModal"
title="Are you sure you want to purge the cache?"
description="If you proceed, your entire cache will be purged. This may slow down the app temporarily." description="If you proceed, your entire cache will be purged. This may slow down the app temporarily."
:has-to-type="false" :has-to-type="false" proceed-label="Purge cache" @proceed="purgeCache" />
proceed-label="Purge cache"
@proceed="purgeCache"
/>
<div class="adjacent-input"> <div class="adjacent-input">
<label for="purge-cache"> <label for="purge-cache">
<span class="label__title">App cache</span> <span class="label__title">App cache</span>
@@ -225,20 +226,12 @@ async function purgeCache() {
<span class="label__title">Color theme</span> <span class="label__title">Color theme</span>
<span class="label__description">Change the global launcher color theme.</span> <span class="label__description">Change the global launcher color theme.</span>
</label> </label>
<DropdownSelect <DropdownSelect id="theme" name="Theme dropdown" :options="themeStore.themeOptions"
id="theme" :default-value="settings.theme" :model-value="settings.theme" class="theme-dropdown" @change="(e) => {
name="Theme dropdown"
:options="themeStore.themeOptions"
:default-value="settings.theme"
:model-value="settings.theme"
class="theme-dropdown"
@change="
(e) => {
themeStore.setThemeState(e.option.toLowerCase()) themeStore.setThemeState(e.option.toLowerCase())
settings.theme = themeStore.selectedTheme settings.theme = themeStore.selectedTheme
} }
" " />
/>
</div> </div>
<div class="adjacent-input"> <div class="adjacent-input">
<label for="advanced-rendering"> <label for="advanced-rendering">
@@ -248,70 +241,45 @@ async function purgeCache() {
without hardware-accelerated rendering. without hardware-accelerated rendering.
</span> </span>
</label> </label>
<Toggle <Toggle id="advanced-rendering" :model-value="themeStore.advancedRendering"
id="advanced-rendering" :checked="themeStore.advancedRendering" @update:model-value="(e) => {
:model-value="themeStore.advancedRendering"
:checked="themeStore.advancedRendering"
@update:model-value="
(e) => {
themeStore.advancedRendering = e themeStore.advancedRendering = e
settings.advanced_rendering = themeStore.advancedRendering settings.advanced_rendering = themeStore.advancedRendering
} }
" " />
/>
</div> </div>
<div class="adjacent-input"> <div class="adjacent-input">
<label for="minimize-launcher"> <label for="minimize-launcher">
<span class="label__title">Minimize launcher</span> <span class="label__title">Minimize launcher</span>
<span class="label__description" <span class="label__description">Minimize the launcher when a Minecraft process starts.</span>
>Minimize the launcher when a Minecraft process starts.</span
>
</label> </label>
<Toggle <Toggle id="minimize-launcher" :model-value="settings.hide_on_process_start"
id="minimize-launcher" :checked="settings.hide_on_process_start" @update:model-value="(e) => {
:model-value="settings.hide_on_process_start"
:checked="settings.hide_on_process_start"
@update:model-value="
(e) => {
settings.hide_on_process_start = e settings.hide_on_process_start = e
} }
" " />
/>
</div> </div>
<div v-if="getOS() != 'MacOS'" class="adjacent-input"> <div v-if="getOS() != 'MacOS'" class="adjacent-input">
<label for="native-decorations"> <label for="native-decorations">
<span class="label__title">Native decorations</span> <span class="label__title">Native decorations</span>
<span class="label__description">Use system window frame (app restart required).</span> <span class="label__description">Use system window frame (app restart required).</span>
</label> </label>
<Toggle <Toggle id="native-decorations" :model-value="settings.native_decorations"
id="native-decorations" :checked="settings.native_decorations" @update:model-value="(e) => {
:model-value="settings.native_decorations"
:checked="settings.native_decorations"
@update:model-value="
(e) => {
settings.native_decorations = e settings.native_decorations = e
} }
" " />
/>
</div> </div>
<div class="adjacent-input"> <div class="adjacent-input">
<label for="opening-page"> <label for="opening-page">
<span class="label__title">Default landing page</span> <span class="label__title">Default landing page</span>
<span class="label__description">Change the page to which the launcher opens on.</span> <span class="label__description">Change the page to which the launcher opens on.</span>
</label> </label>
<DropdownSelect <DropdownSelect id="opening-page" name="Opening page dropdown" :options="pageOptions"
id="opening-page" :default-value="settings.default_page" :model-value="settings.default_page" class="opening-page" @change="(e) => {
name="Opening page dropdown"
:options="pageOptions"
:default-value="settings.default_page"
:model-value="settings.default_page"
class="opening-page"
@change="
(e) => {
settings.default_page = e.option settings.default_page = e.option
} }
" " />
/>
</div> </div>
</Card> </Card>
<Card> <Card>
@@ -330,13 +298,7 @@ async function purgeCache() {
effect) effect)
</span> </span>
</label> </label>
<Slider <Slider id="max-downloads" v-model="settings.max_concurrent_downloads" :min="1" :max="10" :step="1" />
id="max-downloads"
v-model="settings.max_concurrent_downloads"
:min="1"
:max="10"
:step="1"
/>
</div> </div>
<div class="adjacent-input"> <div class="adjacent-input">
@@ -348,13 +310,7 @@ async function purgeCache() {
effect) effect)
</span> </span>
</label> </label>
<Slider <Slider id="max-writes" v-model="settings.max_concurrent_writes" :min="1" :max="50" :step="1" />
id="max-writes"
v-model="settings.max_concurrent_writes"
:min="1"
:max="50"
:step="1"
/>
</div> </div>
</Card> </Card>
<Card> <Card>
@@ -367,21 +323,16 @@ async function purgeCache() {
<label for="opt-out-analytics"> <label for="opt-out-analytics">
<span class="label__title">Telemetry</span> <span class="label__title">Telemetry</span>
<span class="label__description"> <span class="label__description">
Modrinth collects anonymized analytics and usage data to improve our user experience and (Always disabled by AstralRinth) • Modrinth collects anonymized analytics and usage data to improve our user experience and
customize your experience. By disabling this option, you opt out and your data will no customize your experience. By disabling this option, you opt out and your data will no
longer be collected. longer be collected.
</span> </span>
</label> </label>
<Toggle <Toggle id="opt-out-analytics" :model-value="settings.telemetry" :disabled="!settings.telemetry" :checked="settings.telemetry"
id="opt-out-analytics" @update:model-value="(e) => {
:model-value="settings.telemetry"
:checked="settings.telemetry"
@update:model-value="
(e) => {
settings.telemetry = e settings.telemetry = e
} }
" " />
/>
</div> </div>
<div class="adjacent-input"> <div class="adjacent-input">
<label for="disable-discord-rpc"> <label for="disable-discord-rpc">
@@ -393,11 +344,7 @@ async function purgeCache() {
mods. (app restart required to take effect) mods. (app restart required to take effect)
</span> </span>
</label> </label>
<Toggle <Toggle id="disable-discord-rpc" v-model="settings.discord_rpc" :checked="settings.discord_rpc" />
id="disable-discord-rpc"
v-model="settings.discord_rpc"
:checked="settings.discord_rpc"
/>
</div> </div>
</Card> </Card>
<Card> <Card>
@@ -410,36 +357,20 @@ async function purgeCache() {
<label :for="'java-' + version"> <label :for="'java-' + version">
<span class="label__title">Java {{ version }} location</span> <span class="label__title">Java {{ version }} location</span>
</label> </label>
<JavaSelector <JavaSelector :id="'java-selector-' + version" v-model="javaVersions[version]" :version="version"
:id="'java-selector-' + version" @update:model-value="updateJavaVersion" />
v-model="javaVersions[version]"
:version="version"
@update:model-value="updateJavaVersion"
/>
</template> </template>
<hr class="card-divider" /> <hr class="card-divider" />
<label for="java-args"> <label for="java-args">
<span class="label__title">Java arguments</span> <span class="label__title">Java arguments</span>
</label> </label>
<input <input id="java-args" v-model="settings.launchArgs" autocomplete="off" type="text" class="installation-input"
id="java-args" placeholder="Enter java arguments..." />
v-model="settings.launchArgs"
autocomplete="off"
type="text"
class="installation-input"
placeholder="Enter java arguments..."
/>
<label for="env-vars"> <label for="env-vars">
<span class="label__title">Environmental variables</span> <span class="label__title">Environmental variables</span>
</label> </label>
<input <input id="env-vars" v-model="settings.envVars" autocomplete="off" type="text" class="installation-input"
id="env-vars" placeholder="Enter environmental variables..." />
v-model="settings.envVars"
autocomplete="off"
type="text"
class="installation-input"
placeholder="Enter environmental variables..."
/>
<hr class="card-divider" /> <hr class="card-divider" />
<div class="adjacent-input"> <div class="adjacent-input">
<label for="max-memory"> <label for="max-memory">
@@ -448,14 +379,7 @@ async function purgeCache() {
The memory allocated to each instance when it is ran. The memory allocated to each instance when it is ran.
</span> </span>
</label> </label>
<Slider <Slider id="max-memory" v-model="settings.memory.maximum" :min="8" :max="maxMemory" :step="64" unit="mb" />
id="max-memory"
v-model="settings.memory.maximum"
:min="8"
:max="maxMemory"
:step="64"
unit="mb"
/>
</div> </div>
</Card> </Card>
<Card> <Card>
@@ -469,39 +393,24 @@ async function purgeCache() {
<span class="label__title">Pre launch</span> <span class="label__title">Pre launch</span>
<span class="label__description"> Ran before the instance is launched. </span> <span class="label__description"> Ran before the instance is launched. </span>
</label> </label>
<input <input id="pre-launch" v-model="settings.hooks.pre_launch" autocomplete="off" type="text"
id="pre-launch" placeholder="Enter pre-launch command..." />
v-model="settings.hooks.pre_launch"
autocomplete="off"
type="text"
placeholder="Enter pre-launch command..."
/>
</div> </div>
<div class="adjacent-input"> <div class="adjacent-input">
<label for="wrapper"> <label for="wrapper">
<span class="label__title">Wrapper</span> <span class="label__title">Wrapper</span>
<span class="label__description"> Wrapper command for launching Minecraft. </span> <span class="label__description"> Wrapper command for launching Minecraft. </span>
</label> </label>
<input <input id="wrapper" v-model="settings.hooks.wrapper" autocomplete="off" type="text"
id="wrapper" placeholder="Enter wrapper command..." />
v-model="settings.hooks.wrapper"
autocomplete="off"
type="text"
placeholder="Enter wrapper command..."
/>
</div> </div>
<div class="adjacent-input"> <div class="adjacent-input">
<label for="post-exit"> <label for="post-exit">
<span class="label__title">Post exit</span> <span class="label__title">Post exit</span>
<span class="label__description"> Ran after the game closes. </span> <span class="label__description"> Ran after the game closes. </span>
</label> </label>
<input <input id="post-exit" v-model="settings.hooks.post_exit" autocomplete="off" type="text"
id="post-exit" placeholder="Enter post-exit command..." />
v-model="settings.hooks.post_exit"
autocomplete="off"
type="text"
placeholder="Enter post-exit command..."
/>
</div> </div>
</Card> </Card>
<Card> <Card>
@@ -517,58 +426,71 @@ async function purgeCache() {
Overwrites the options.txt file to start in full screen when launched. Overwrites the options.txt file to start in full screen when launched.
</span> </span>
</label> </label>
<Toggle <Toggle id="fullscreen" :model-value="settings.force_fullscreen" :checked="settings.force_fullscreen"
id="fullscreen" @update:model-value="(e) => {
:model-value="settings.force_fullscreen"
:checked="settings.force_fullscreen"
@update:model-value="
(e) => {
settings.force_fullscreen = e settings.force_fullscreen = e
} }
" " />
/>
</div> </div>
<div class="adjacent-input"> <div class="adjacent-input">
<label for="width"> <label for="width">
<span class="label__title">Width</span> <span class="label__title">Width</span>
<span class="label__description"> The width of the game window when launched. </span> <span class="label__description"> The width of the game window when launched. </span>
</label> </label>
<input <input id="width" v-model="settings.game_resolution[0]" :disabled="settings.force_fullscreen" autocomplete="off"
id="width" type="number" placeholder="Enter width..." />
v-model="settings.game_resolution[0]"
:disabled="settings.force_fullscreen"
autocomplete="off"
type="number"
placeholder="Enter width..."
/>
</div> </div>
<div class="adjacent-input"> <div class="adjacent-input">
<label for="height"> <label for="height">
<span class="label__title">Height</span> <span class="label__title">Height</span>
<span class="label__description"> The height of the game window when launched. </span> <span class="label__description"> The height of the game window when launched. </span>
</label> </label>
<input <input id="height" v-model="settings.game_resolution[1]" :disabled="settings.force_fullscreen"
id="height" autocomplete="off" type="number" class="input" placeholder="Enter height..." />
v-model="settings.game_resolution[1]"
:disabled="settings.force_fullscreen"
autocomplete="off"
type="number"
class="input"
placeholder="Enter height..."
/>
</div> </div>
</Card> </Card>
<Card> <Card>
<div class="label"> <div class="label inline-fix">
<h3> <h3>
<span class="label__title size-card-header">About</span> <span class="label__title size-card-header in"
> About
<p v-if="development_build" class="development option">
You are using a development version, there may be errors.
</p>
</span>
</h3> </h3>
</div> </div>
<div> <div>
<label> <label>
<span class="label__title">App version</span> <span class="label__title inl">AstralRinth <PirateShipIcon /> Version • {{ version }}</span>
<span class="label__description">Modrinth App v{{ version }} </span>
<span class="label__description"
>Latest beta commit •
<a class="github" :href="latestBetaCommitLink">{{
latestBetaCommitTruncatedSha
}}</a></span
>
<span class="label__description"
>All latest versions always published on GitHub
<a class="github" :href="launcherUrl">Our GitHub repository</a></span
>
<span class="label__title">Update Checker</span>
<span class="label__description"
>Version on remote server •
<p id="releaseData" class="cosmic inline-fix"></p>
</span>
<span class="label__description"
>Version on local device •
<p class="cosmic inline-fix">v{{ version }}</p></span
>
</label> </label>
<div class="inline-item-group">
<Button icon-only @click="getRemote(false, false), getBranches()">
<UpdatedIcon /> Check for updates
</Button>
</div>
</div> </div>
</Card> </Card>
</div> </div>
@@ -606,4 +528,112 @@ async function purgeCache() {
} }
} }
} }
.development {
color: #ff6a00;
text-decoration: none;
text-shadow:
0 0 4px rgba(79, 173, 255, 0.5),
0 0 8px rgba(14, 98, 204, 0.5),
0 0 12px rgba(122, 31, 199, 0.5);
transition: color 1.5s ease;
}
.development:hover,
.development:focus,
.development:active {
color: #4800d3;
text-shadow: #801313;
}
.cosmic {
color: #3e8cde;
text-decoration: none;
text-shadow:
0 0 4px rgba(79, 173, 255, 0.5),
0 0 8px rgba(14, 98, 204, 0.5),
0 0 12px rgba(122, 31, 199, 0.5);
transition: color 0.35s ease;
}
.cosmic:hover,
.cosmic:focus,
.cosmic:active {
color: #10fae5;
text-shadow: #26065e;
}
.download {
color: #3e8cde;
border: none;
padding: var(--gap-sm) var(--gap-lg);
//background-color: rgba(0, 0, 0, 0.0);
text-decoration: none;
text-shadow:
0 0 4px rgba(79, 173, 255, 0.5),
0 0 8px rgba(14, 98, 204, 0.5),
0 0 12px rgba(122, 31, 199, 0.5);
transition: color 0.35s ease;
}
.download:hover,
.download:focus,
.download:active {
color: #10fae5;
text-shadow: #26065e;
}
a.github {
color: #3e8cde;
text-decoration: none;
text-shadow:
0 0 4px rgba(79, 173, 255, 0.5),
0 0 8px rgba(14, 98, 204, 0.5),
0 0 12px rgba(122, 31, 199, 0.5);
transition: color 0.35s ease;
}
a.github:hover,
a.github:focus,
a.github:active {
color: #10fae5;
text-shadow: #26065e;
}
.inline-item-group {
display: inline-flex;
gap: 0.25rem;
}
.inline-fix {
display: inline-flex;
margin-top: -2rem;
margin-bottom: -2rem;
}
.download-modal {
color: #3e8cde;
padding: var(--gap-sm) var(--gap-lg);
text-decoration: none;
text-shadow:
0 0 4px rgba(79, 173, 255, 0.5),
0 0 8px rgba(14, 98, 204, 0.5),
0 0 12px rgba(122, 31, 199, 0.5);
transition: color 0.35s ease;
}
.download-modal:hover,
.download-modal:focus,
.download-modal:active {
color: #10fae5;
text-shadow: #26065e;
}
.option {
background: var(--color-bg);
border-radius: var(--radius-lg);
width: auto;
display: inline-flex;
align-items: center;
margin-top: auto;
margin-left: 0.5rem;
font-size: 1rem;
padding: 0.5rem;
}
</style> </style>

View File

@@ -61,7 +61,6 @@
</RouterLink> </RouterLink>
</div> </div>
</Card> </Card>
<PromotionWrapper ref="promo" class="mt-4" />
</div> </div>
<div class="content"> <div class="content">
<RouterView v-slot="{ Component }"> <RouterView v-slot="{ Component }">
@@ -136,7 +135,6 @@ import { convertFileSrc } from '@tauri-apps/api/core'
import { handleSevereError } from '@/store/error.js' import { handleSevereError } from '@/store/error.js'
import { get_project, get_version_many } from '@/helpers/cache.js' import { get_project, get_version_many } from '@/helpers/cache.js'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import PromotionWrapper from '@/components/ui/PromotionWrapper.vue'
const route = useRoute() const route = useRoute()

View File

@@ -62,7 +62,6 @@
</a> </a>
</div> </div>
</Card> </Card>
<PromotionWrapper ref="promo" />
<Card class="sidebar-card"> <Card class="sidebar-card">
<div class="stats"> <div class="stats">
<div class="stat"> <div class="stat">
@@ -262,7 +261,6 @@ import { convertFileSrc } from '@tauri-apps/api/core'
import ContextMenu from '@/components/ui/ContextMenu.vue' import ContextMenu from '@/components/ui/ContextMenu.vue'
import { install as installVersion } from '@/store/install.js' import { install as installVersion } from '@/store/install.js'
import { get_project, get_project_many, get_team, get_version_many } from '@/helpers/cache.js' import { get_project, get_project_many, get_team, get_version_many } from '@/helpers/cache.js'
import PromotionWrapper from '@/components/ui/PromotionWrapper.vue'
dayjs.extend(relativeTime) dayjs.extend(relativeTime)

View File

@@ -6,11 +6,11 @@
<array> <array>
<dict> <dict>
<key>CFBundleURLName</key> <key>CFBundleURLName</key>
<string>ModrinthApp</string> <string>AstralRinthApp</string>
<key>CFBundleURLSchemes</key> <key>CFBundleURLSchemes</key>
<array> <array>
<string>modrinth</string> <string>astralrinth</string>
<string>modrinthscheme</string> <string>astralrinthscheme</string>
</array> </array>
</dict> </dict>
</array> </array>

View File

@@ -12,6 +12,7 @@ fn main() {
"auth", "auth",
InlinedPlugin::new() InlinedPlugin::new()
.commands(&[ .commands(&[
"offline_login",
"login", "login",
"remove_user", "remove_user",
"get_default_user", "get_default_user",
@@ -206,6 +207,7 @@ fn main() {
"utils", "utils",
InlinedPlugin::new() InlinedPlugin::new()
.commands(&[ .commands(&[
"get_artifact",
"get_os", "get_os",
"should_disable_mouseover", "should_disable_mouseover",
"highlight_in_folder", "highlight_in_folder",
@@ -217,19 +219,6 @@ fn main() {
.default_permission( .default_permission(
DefaultPermissionRule::AllowAllCommands, DefaultPermissionRule::AllowAllCommands,
), ),
)
.plugin(
"ads",
InlinedPlugin::new()
.commands(&[
"init_ads_window",
"hide_ads_window",
"scroll_ads_window",
"show_ads_window",
])
.default_permission(
DefaultPermissionRule::AllowAllCommands,
),
), ),
) )
.expect("Failed to run tauri-build"); .expect("Failed to run tauri-build");

View File

@@ -1,15 +0,0 @@
{
"identifier": "ads",
"description": "",
"local": false,
"remote": {
"urls": ["https://modrinth.com/*", "http://localhost:3000/*"]
},
"webviews": [
"ads-window"
],
"permissions": [
"shell:allow-open",
"ads:default"
]
}

View File

@@ -35,7 +35,6 @@
"cache:default", "cache:default",
"settings:default", "settings:default",
"tags:default", "tags:default",
"utils:default", "utils:default"
"ads:default"
] ]
} }

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"ads":{"identifier":"ads","description":"","remote":{"urls":["https://modrinth.com/*","http://localhost:3000/*"]},"local":false,"webviews":["ads-window"],"permissions":["shell:allow-open","ads:default"]},"core":{"identifier":"core","description":"","local":true,"windows":["main"],"permissions":["core:default","core:path:default","core:event:default","core:window:default","core:app:default","core:resources:default","core:menu:default","core:tray:default","core:window:allow-create","core:window:allow-maximize","core:window:allow-toggle-maximize","core:window:allow-unmaximize","core:window:allow-minimize","core:window:allow-unminimize","core:window:allow-show","core:window:allow-hide","core:window:allow-close","core:window:allow-set-decorations","core:window:allow-start-dragging","core:webview:allow-set-webview-zoom"]},"plugins":{"identifier":"plugins","description":"","local":true,"windows":["main"],"permissions":["dialog:allow-open","dialog:allow-confirm","shell:allow-open","os:allow-platform","os:allow-version","os:allow-os-type","os:allow-family","os:allow-arch","os:allow-exe-extension","os:allow-locale","os:allow-hostname","deep-link:default","window-state:default","window-state:allow-restore-state","window-state:allow-save-window-state","auth:default","import:default","jre:default","logs:default","metadata:default","mr-auth:default","profile-create:default","pack:default","process:default","profile:default","cache:default","settings:default","tags:default","utils:default","ads:default"]},"updater":{"identifier":"updater","description":"","local":true,"windows":["main"],"permissions":["updater:default"]}} {"core":{"identifier":"core","description":"","local":true,"windows":["main"],"permissions":["core:default","core:path:default","core:event:default","core:window:default","core:app:default","core:resources:default","core:menu:default","core:tray:default","core:window:allow-create","core:window:allow-maximize","core:window:allow-toggle-maximize","core:window:allow-unmaximize","core:window:allow-minimize","core:window:allow-unminimize","core:window:allow-show","core:window:allow-hide","core:window:allow-close","core:window:allow-set-decorations","core:window:allow-start-dragging","core:webview:allow-set-webview-zoom"]},"plugins":{"identifier":"plugins","description":"","local":true,"windows":["main"],"permissions":["dialog:allow-open","dialog:allow-confirm","shell:allow-open","os:allow-platform","os:allow-version","os:allow-os-type","os:allow-family","os:allow-arch","os:allow-exe-extension","os:allow-locale","os:allow-hostname","deep-link:default","window-state:default","window-state:allow-restore-state","window-state:allow-save-window-state","auth:default","import:default","jre:default","logs:default","metadata:default","mr-auth:default","profile-create:default","pack:default","process:default","profile:default","cache:default","settings:default","tags:default","utils:default"]},"updater":{"identifier":"updater","description":"","local":true,"windows":["main"],"permissions":["updater:default"]}}

View File

@@ -299,69 +299,6 @@
}, },
"Identifier": { "Identifier": {
"oneOf": [ "oneOf": [
{
"description": "ads:default -> Default plugin permissions.",
"type": "string",
"enum": [
"ads:default"
]
},
{
"description": "ads:allow-hide-ads-window -> Enables the hide_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:allow-hide-ads-window"
]
},
{
"description": "ads:allow-init-ads-window -> Enables the init_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:allow-init-ads-window"
]
},
{
"description": "ads:allow-scroll-ads-window -> Enables the scroll_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:allow-scroll-ads-window"
]
},
{
"description": "ads:allow-show-ads-window -> Enables the show_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:allow-show-ads-window"
]
},
{
"description": "ads:deny-hide-ads-window -> Denies the hide_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:deny-hide-ads-window"
]
},
{
"description": "ads:deny-init-ads-window -> Denies the init_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:deny-init-ads-window"
]
},
{
"description": "ads:deny-scroll-ads-window -> Denies the scroll_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:deny-scroll-ads-window"
]
},
{
"description": "ads:deny-show-ads-window -> Denies the show_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:deny-show-ads-window"
]
},
{ {
"description": "auth:default -> Default plugin permissions.", "description": "auth:default -> Default plugin permissions.",
"type": "string", "type": "string",
@@ -390,6 +327,13 @@
"auth:allow-login" "auth:allow-login"
] ]
}, },
{
"description": "auth:allow-offline-login -> Enables the offline_login command without any pre-configured scope.",
"type": "string",
"enum": [
"auth:allow-offline-login"
]
},
{ {
"description": "auth:allow-remove-user -> Enables the remove_user command without any pre-configured scope.", "description": "auth:allow-remove-user -> Enables the remove_user command without any pre-configured scope.",
"type": "string", "type": "string",
@@ -425,6 +369,13 @@
"auth:deny-login" "auth:deny-login"
] ]
}, },
{
"description": "auth:deny-offline-login -> Denies the offline_login command without any pre-configured scope.",
"type": "string",
"enum": [
"auth:deny-offline-login"
]
},
{ {
"description": "auth:deny-remove-user -> Denies the remove_user command without any pre-configured scope.", "description": "auth:deny-remove-user -> Denies the remove_user command without any pre-configured scope.",
"type": "string", "type": "string",
@@ -3988,6 +3939,13 @@
"utils:default" "utils:default"
] ]
}, },
{
"description": "utils:allow-get-artifact -> Enables the get_artifact command without any pre-configured scope.",
"type": "string",
"enum": [
"utils:allow-get-artifact"
]
},
{ {
"description": "utils:allow-get-opening-command -> Enables the get_opening_command command without any pre-configured scope.", "description": "utils:allow-get-opening-command -> Enables the get_opening_command command without any pre-configured scope.",
"type": "string", "type": "string",
@@ -4037,6 +3995,13 @@
"utils:allow-show-launcher-logs-folder" "utils:allow-show-launcher-logs-folder"
] ]
}, },
{
"description": "utils:deny-get-artifact -> Denies the get_artifact command without any pre-configured scope.",
"type": "string",
"enum": [
"utils:deny-get-artifact"
]
},
{ {
"description": "utils:deny-get-opening-command -> Denies the get_opening_command command without any pre-configured scope.", "description": "utils:deny-get-opening-command -> Denies the get_opening_command command without any pre-configured scope.",
"type": "string", "type": "string",

View File

@@ -299,69 +299,6 @@
}, },
"Identifier": { "Identifier": {
"oneOf": [ "oneOf": [
{
"description": "ads:default -> Default plugin permissions.",
"type": "string",
"enum": [
"ads:default"
]
},
{
"description": "ads:allow-hide-ads-window -> Enables the hide_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:allow-hide-ads-window"
]
},
{
"description": "ads:allow-init-ads-window -> Enables the init_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:allow-init-ads-window"
]
},
{
"description": "ads:allow-scroll-ads-window -> Enables the scroll_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:allow-scroll-ads-window"
]
},
{
"description": "ads:allow-show-ads-window -> Enables the show_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:allow-show-ads-window"
]
},
{
"description": "ads:deny-hide-ads-window -> Denies the hide_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:deny-hide-ads-window"
]
},
{
"description": "ads:deny-init-ads-window -> Denies the init_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:deny-init-ads-window"
]
},
{
"description": "ads:deny-scroll-ads-window -> Denies the scroll_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:deny-scroll-ads-window"
]
},
{
"description": "ads:deny-show-ads-window -> Denies the show_ads_window command without any pre-configured scope.",
"type": "string",
"enum": [
"ads:deny-show-ads-window"
]
},
{ {
"description": "auth:default -> Default plugin permissions.", "description": "auth:default -> Default plugin permissions.",
"type": "string", "type": "string",
@@ -390,6 +327,13 @@
"auth:allow-login" "auth:allow-login"
] ]
}, },
{
"description": "auth:allow-offline-login -> Enables the offline_login command without any pre-configured scope.",
"type": "string",
"enum": [
"auth:allow-offline-login"
]
},
{ {
"description": "auth:allow-remove-user -> Enables the remove_user command without any pre-configured scope.", "description": "auth:allow-remove-user -> Enables the remove_user command without any pre-configured scope.",
"type": "string", "type": "string",
@@ -425,6 +369,13 @@
"auth:deny-login" "auth:deny-login"
] ]
}, },
{
"description": "auth:deny-offline-login -> Denies the offline_login command without any pre-configured scope.",
"type": "string",
"enum": [
"auth:deny-offline-login"
]
},
{ {
"description": "auth:deny-remove-user -> Denies the remove_user command without any pre-configured scope.", "description": "auth:deny-remove-user -> Denies the remove_user command without any pre-configured scope.",
"type": "string", "type": "string",
@@ -3988,6 +3939,13 @@
"utils:default" "utils:default"
] ]
}, },
{
"description": "utils:allow-get-artifact -> Enables the get_artifact command without any pre-configured scope.",
"type": "string",
"enum": [
"utils:allow-get-artifact"
]
},
{ {
"description": "utils:allow-get-opening-command -> Enables the get_opening_command command without any pre-configured scope.", "description": "utils:allow-get-opening-command -> Enables the get_opening_command command without any pre-configured scope.",
"type": "string", "type": "string",
@@ -4037,6 +3995,13 @@
"utils:allow-show-launcher-logs-folder" "utils:allow-show-launcher-logs-folder"
] ]
}, },
{
"description": "utils:deny-get-artifact -> Denies the get_artifact command without any pre-configured scope.",
"type": "string",
"enum": [
"utils:deny-get-artifact"
]
},
{ {
"description": "utils:deny-get-opening-command -> Denies the get_opening_command command without any pre-configured scope.", "description": "utils:deny-get-opening-command -> Denies the get_opening_command command without any pre-configured scope.",
"type": "string", "type": "string",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 34 KiB

BIN
apps/app/icons/icon (1).png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 401 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

View File

@@ -1,20 +0,0 @@
if (!window.modrinthClickListener) {
window.modrinthClickListener = true
document.addEventListener('click', function (e) {
let target = e.target
while (target != null) {
if (target.matches('a')) {
e.preventDefault()
if (target.href) {
window.top.postMessage({ modrinthOpenUrl: target.href }, 'https://modrinth.com')
}
break
}
target = target.parentElement
}
})
}
window.open = (url, target, features) => {
window.top.postMessage({ modrinthOpenUrl: url }, 'https://modrinth.com')
}

View File

@@ -1,143 +0,0 @@
use serde::Serialize;
use tauri::plugin::TauriPlugin;
use tauri::{Emitter, LogicalPosition, LogicalSize, Manager, Runtime};
use tokio::sync::RwLock;
pub struct AdsState {
pub shown: bool,
pub size: Option<LogicalSize<f32>>,
pub position: Option<LogicalPosition<f32>>,
}
pub fn init<R: Runtime>() -> TauriPlugin<R> {
tauri::plugin::Builder::<R>::new("ads")
.setup(|app, _api| {
app.manage(RwLock::new(AdsState {
shown: true,
size: None,
position: None,
}));
Ok(())
})
.invoke_handler(tauri::generate_handler![
init_ads_window,
hide_ads_window,
scroll_ads_window,
show_ads_window,
])
.build()
}
#[tauri::command]
#[cfg(not(target_os = "linux"))]
pub async fn init_ads_window<R: Runtime>(
app: tauri::AppHandle<R>,
x: f32,
y: f32,
width: f32,
height: f32,
override_shown: bool,
) -> crate::api::Result<()> {
use tauri::WebviewUrl;
const LINK_SCRIPT: &str = include_str!("ads-init.js");
let state = app.state::<RwLock<AdsState>>();
let mut state = state.write().await;
state.size = Some(LogicalSize::new(width, height));
state.position = Some(LogicalPosition::new(x, y));
if override_shown {
state.shown = true;
}
if let Some(webview) = app.webviews().get("ads-window") {
if state.shown {
let _ = webview.set_position(LogicalPosition::new(x, y));
let _ = webview.set_size(LogicalSize::new(width, height));
}
} else if let Some(window) = app.get_window("main") {
let _ = window.add_child(
tauri::webview::WebviewBuilder::new(
"ads-window",
WebviewUrl::External(
"https://modrinth.com/wrapper/app-ads".parse().unwrap(),
),
)
.initialization_script(LINK_SCRIPT)
.user_agent("ModrinthApp Ads Webview")
.zoom_hotkeys_enabled(false)
.transparent(true),
if state.shown {
LogicalPosition::new(x, y)
} else {
LogicalPosition::new(-1000.0, -1000.0)
},
LogicalSize::new(width, height),
);
}
Ok(())
}
// TODO: make ads work on linux
#[tauri::command]
#[cfg(target_os = "linux")]
pub async fn init_ads_window() {}
#[tauri::command]
pub async fn show_ads_window<R: Runtime>(
app: tauri::AppHandle<R>,
) -> crate::api::Result<()> {
if let Some(webview) = app.webviews().get("ads-window") {
let state = app.state::<RwLock<AdsState>>();
let mut state = state.write().await;
state.shown = true;
if let Some(size) = state.size {
let _ = webview.set_size(size);
}
if let Some(position) = state.position {
let _ = webview.set_position(position);
}
}
Ok(())
}
#[tauri::command]
pub async fn hide_ads_window<R: Runtime>(
app: tauri::AppHandle<R>,
reset: Option<bool>,
) -> crate::api::Result<()> {
if let Some(webview) = app.webviews().get("ads-window") {
let state = app.state::<RwLock<AdsState>>();
let mut state = state.write().await;
state.shown = false;
if reset.unwrap_or(false) {
state.size = None;
state.position = None;
}
let _ = webview.set_position(LogicalPosition::new(-1000, -1000));
}
Ok(())
}
#[derive(Serialize, Clone)]
struct ScrollEvent {
scroll: f32,
}
#[tauri::command]
pub async fn scroll_ads_window<R: Runtime>(
app: tauri::AppHandle<R>,
scroll: f32,
) -> crate::api::Result<()> {
let _ = app.emit("ads-scroll", ScrollEvent { scroll });
Ok(())
}

View File

@@ -7,6 +7,7 @@ use theseus::prelude::*;
pub fn init<R: Runtime>() -> TauriPlugin<R> { pub fn init<R: Runtime>() -> TauriPlugin<R> {
tauri::plugin::Builder::<R>::new("auth") tauri::plugin::Builder::<R>::new("auth")
.invoke_handler(tauri::generate_handler![ .invoke_handler(tauri::generate_handler![
offline_login,
login, login,
remove_user, remove_user,
get_default_user, get_default_user,
@@ -16,6 +17,14 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
.build() .build()
} }
/// Create new offline user
/// This is custom function from Astralium Org.
#[tauri::command]
pub async fn offline_login(name: &str) -> Result<Credentials> {
let credentials = minecraft_auth::offline_auth(name).await?;
Ok(credentials)
}
/// Authenticate a user with Hydra - part 1 /// Authenticate a user with Hydra - part 1
/// This begins the authentication flow quasi-synchronously, returning a URL to visit (that the user will sign in at) /// This begins the authentication flow quasi-synchronously, returning a URL to visit (that the user will sign in at)
#[tauri::command] #[tauri::command]

View File

@@ -16,7 +16,6 @@ pub mod settings;
pub mod tags; pub mod tags;
pub mod utils; pub mod utils;
pub mod ads;
pub mod cache; pub mod cache;
pub type Result<T> = std::result::Result<T, TheseusSerializableError>; pub type Result<T> = std::result::Result<T, TheseusSerializableError>;

View File

@@ -11,6 +11,7 @@ use std::path::PathBuf;
pub fn init<R: tauri::Runtime>() -> tauri::plugin::TauriPlugin<R> { pub fn init<R: tauri::Runtime>() -> tauri::plugin::TauriPlugin<R> {
tauri::plugin::Builder::new("utils") tauri::plugin::Builder::new("utils")
.invoke_handler(tauri::generate_handler![ .invoke_handler(tauri::generate_handler![
get_artifact,
get_os, get_os,
should_disable_mouseover, should_disable_mouseover,
highlight_in_folder, highlight_in_folder,
@@ -22,6 +23,12 @@ pub fn init<R: tauri::Runtime>() -> tauri::plugin::TauriPlugin<R> {
.build() .build()
} }
#[tauri::command]
pub async fn get_artifact(downloadurl: &str, filename: &str, ostype: &str, autoupdatesupported: bool) -> Result<()> {
theseus::download::init_download(downloadurl, filename, ostype, autoupdatesupported).await;
Ok(())
}
/// Gets OS /// Gets OS
#[tauri::command] #[tauri::command]
pub fn get_os() -> OS { pub fn get_os() -> OS {

View File

@@ -27,61 +27,61 @@ extern crate objc;
async fn initialize_state(app: tauri::AppHandle) -> api::Result<()> { async fn initialize_state(app: tauri::AppHandle) -> api::Result<()> {
theseus::EventState::init(app.clone()).await?; theseus::EventState::init(app.clone()).await?;
#[cfg(feature = "updater")] // #[cfg(feature = "updater")]
{ // {
use tauri_plugin_updater::UpdaterExt; // use tauri_plugin_updater::UpdaterExt;
let updater = app.updater_builder().build()?; // let updater = app.updater_builder().build()?;
let update_fut = updater.check(); // let update_fut = updater.check();
State::init().await?; // State::init().await?;
let check_bar = theseus::init_loading( // let check_bar = theseus::init_loading(
theseus::LoadingBarType::CheckingForUpdates, // theseus::LoadingBarType::CheckingForUpdates,
1.0, // 1.0,
"Checking for updates...", // "Checking for updates...",
) // )
.await?; // .await?;
let update = update_fut.await; // let update = update_fut.await;
drop(check_bar); // drop(check_bar);
if let Some(update) = update.ok().flatten() { // if let Some(update) = update.ok().flatten() {
tracing::info!("Update found: {:?}", update.download_url); // tracing::info!("Update found: {:?}", update.download_url);
let loader_bar_id = theseus::init_loading( // let loader_bar_id = theseus::init_loading(
theseus::LoadingBarType::LauncherUpdate { // theseus::LoadingBarType::LauncherUpdate {
version: update.version.clone(), // version: update.version.clone(),
current_version: update.current_version.clone(), // current_version: update.current_version.clone(),
}, // },
1.0, // 1.0,
"Updating Modrinth App...", // "Updating Modrinth App...",
) // )
.await?; // .await?;
// 100 MiB // // 100 MiB
const DEFAULT_CONTENT_LENGTH: u64 = 1024 * 1024 * 100; // const DEFAULT_CONTENT_LENGTH: u64 = 1024 * 1024 * 100;
update // update
.download_and_install( // .download_and_install(
|chunk_length, content_length| { // |chunk_length, content_length| {
let _ = theseus::emit_loading( // let _ = theseus::emit_loading(
&loader_bar_id, // &loader_bar_id,
(chunk_length as f64) // (chunk_length as f64)
/ (content_length // / (content_length
.unwrap_or(DEFAULT_CONTENT_LENGTH) // .unwrap_or(DEFAULT_CONTENT_LENGTH)
as f64), // as f64),
None, // None,
); // );
}, // },
|| {}, // || {},
) // )
.await?; // .await?;
app.restart(); // app.restart();
} // }
} // }
#[cfg(not(feature = "updater"))] #[cfg(not(feature = "updater"))]
{ {
@@ -259,7 +259,6 @@ fn main() {
.plugin(api::tags::init()) .plugin(api::tags::init())
.plugin(api::utils::init()) .plugin(api::utils::init())
.plugin(api::cache::init()) .plugin(api::cache::init())
.plugin(api::ads::init())
.invoke_handler(tauri::generate_handler![ .invoke_handler(tauri::generate_handler![
initialize_state, initialize_state,
is_dev, is_dev,

View File

@@ -7,7 +7,7 @@
}, },
"app": { "app": {
"security": { "security": {
"capabilities": ["ads", "core", "plugins", "updater"] "capabilities": ["core", "plugins", "updater"]
} }
}, },
"plugins": { "plugins": {

View File

@@ -47,9 +47,9 @@
} }
] ]
}, },
"productName": "Modrinth App", "productName": "AstralRinth App",
"version": "0.8.5", "version": "0.8.5",
"identifier": "ModrinthApp", "identifier": "AstralRinth",
"plugins": { "plugins": {
"deep-link": { "deep-link": {
"desktop": { "desktop": {
@@ -68,7 +68,7 @@
"fullscreen": false, "fullscreen": false,
"height": 800, "height": 800,
"resizable": true, "resizable": true,
"title": "Modrinth App", "title": "AstralRinth",
"width": 1280, "width": 1280,
"minHeight": 750, "minHeight": 750,
"minWidth": 1100, "minWidth": 1100,
@@ -86,10 +86,10 @@
], ],
"enable": true "enable": true
}, },
"capabilities": ["ads", "core", "plugins"], "capabilities": ["core", "plugins"],
"csp": { "csp": {
"default-src": "'self' customprotocol: asset:", "default-src": "'self' customprotocol: asset:",
"connect-src": "ipc: http://ipc.localhost https://modrinth.com https://*.modrinth.com https://*.posthog.com https://*.sentry.io https://*.cloudflare.com https://api.mclo.gs https://cmp.inmobi.com", "connect-src": "https://api.github.com ipc: http://ipc.localhost https://modrinth.com https://*.modrinth.com https://*.posthog.com https://*.sentry.io https://*.cloudflare.com https://api.mclo.gs https://cmp.inmobi.com",
"font-src": [ "font-src": [
"https://cdn-raw.modrinth.com/fonts/inter/" "https://cdn-raw.modrinth.com/fonts/inter/"
], ],

View File

@@ -7,7 +7,7 @@
"fullscreen": false, "fullscreen": false,
"height": 800, "height": 800,
"resizable": true, "resizable": true,
"title": "Modrinth App", "title": "AstralRinth",
"width": 1280, "width": 1280,
"minHeight": 700, "minHeight": 700,
"minWidth": 1100, "minWidth": 1100,

View File

@@ -4,13 +4,13 @@ CREATE TABLE settings (
max_concurrent_downloads INTEGER NOT NULL DEFAULT 10, max_concurrent_downloads INTEGER NOT NULL DEFAULT 10,
max_concurrent_writes INTEGER NOT NULL DEFAULT 10, max_concurrent_writes INTEGER NOT NULL DEFAULT 10,
theme TEXT NOT NULL DEFAULT 'dark', theme TEXT NOT NULL DEFAULT 'oled',
default_page TEXT NOT NULL DEFAULT 'home', default_page TEXT NOT NULL DEFAULT 'home',
collapsed_navigation INTEGER NOT NULL DEFAULT TRUE, collapsed_navigation INTEGER NOT NULL DEFAULT TRUE,
advanced_rendering INTEGER NOT NULL DEFAULT TRUE, advanced_rendering INTEGER NOT NULL DEFAULT TRUE,
native_decorations INTEGER NOT NULL DEFAULT FALSE, native_decorations INTEGER NOT NULL DEFAULT FALSE,
telemetry INTEGER NOT NULL DEFAULT TRUE, telemetry INTEGER NOT NULL DEFAULT FALSE,
discord_rpc INTEGER NOT NULL DEFAULT TRUE, discord_rpc INTEGER NOT NULL DEFAULT TRUE,
developer_mode INTEGER NOT NULL DEFAULT FALSE, developer_mode INTEGER NOT NULL DEFAULT FALSE,

View File

@@ -0,0 +1,55 @@
use std::process::exit;
use reqwest;
use tokio::fs::File as AsyncFile;
use tokio::io::AsyncWriteExt;
use tokio::process::Command;
async fn download_file(download_url: &str, local_filename: &str, os_type: &str, auto_update_supported: bool) -> Result<(), Box<dyn std::error::Error>> {
let download_dir = dirs::download_dir().ok_or("[download_file] • Failed to determine download directory")?;
let full_path = download_dir.join(local_filename);
let response = reqwest::get(download_url).await?;
let bytes = response.bytes().await?;
let mut dest_file = AsyncFile::create(&full_path).await?;
dest_file.write_all(&bytes).await?;
println!("[download_file] • File downloaded to: {:?}", full_path);
if auto_update_supported {
let status;
if os_type.to_lowercase() == "Windows".to_lowercase() {
status = Command::new("explorer")
.arg(download_dir.display().to_string())
.status()
.await
.expect("[download_file] • Failed to open downloads folder");
} else if os_type.to_lowercase() == "MacOS".to_lowercase() {
status = Command::new("open")
.arg(full_path.to_str().unwrap_or_default())
.status()
.await
.expect("[download_file] • Failed to execute command");
} else {
status = Command::new(".")
.arg(full_path.to_str().unwrap_or_default())
.status()
.await
.expect("[download_file] • Failed to execute command");
}
if status.success() {
println!("[download_file] • File opened successfully!");
} else {
eprintln!("[download_file] • Failed to open the file. Exit code: {:?}", status.code());
}
}
Ok(())
}
pub async fn init_download(download_url: &str, local_filename: &str, os_type: &str, auto_update_supported: bool) {
println!("[init_download] • Initialize downloading from • {:?}", download_url);
println!("[init_download] • Save local file name • {:?}", local_filename);
if let Err(e) = download_file(download_url, local_filename, os_type, auto_update_supported).await {
eprintln!("[init_download] • An error occurred! Failed to download the file: {}", e);
} else {
println!("[init_download] • Code finishes without errors.");
exit(0)
}
}

View File

@@ -20,6 +20,14 @@ pub async fn finish_login(
crate::state::login_finish(code, flow, &state.pool).await crate::state::login_finish(code, flow, &state.pool).await
} }
#[tracing::instrument]
pub async fn offline_auth(
name: &str
) -> crate::Result<Credentials> {
let state = State::get().await?;
crate::state::offline_auth(name, &state.pool).await
}
#[tracing::instrument] #[tracing::instrument]
pub async fn get_default_user() -> crate::Result<Option<uuid::Uuid>> { pub async fn get_default_user() -> crate::Result<Option<uuid::Uuid>> {
let state = State::get().await?; let state = State::get().await?;

View File

@@ -11,6 +11,7 @@ pub mod process;
pub mod profile; pub mod profile;
pub mod settings; pub mod settings;
pub mod tags; pub mod tags;
pub mod download;
pub mod data { pub mod data {
pub use crate::state::{ pub use crate::state::{

View File

@@ -16,6 +16,7 @@ use chrono::Utc;
use daedalus as d; use daedalus as d;
use daedalus::minecraft::{RuleAction, VersionInfo}; use daedalus::minecraft::{RuleAction, VersionInfo};
use daedalus::modded::LoaderVersion; use daedalus::modded::LoaderVersion;
use rand::seq::SliceRandom;
use st::Profile; use st::Profile;
use std::collections::HashMap; use std::collections::HashMap;
use tokio::process::Command; use tokio::process::Command;
@@ -24,6 +25,8 @@ mod args;
pub mod download; pub mod download;
use crate::state::ACTIVE_STATE;
// All nones -> disallowed // All nones -> disallowed
// 1+ true -> allowed // 1+ true -> allowed
// 1+ false -> disallowed // 1+ false -> disallowed
@@ -672,10 +675,11 @@ pub async fn launch_minecraft(
} }
} }
let _ = state let selected_phrase = ACTIVE_STATE.choose(&mut rand::thread_rng()).unwrap();
.discord_rpc let _ = state
.set_activity(&format!("Playing {}", profile.name), true) .discord_rpc
.await; .set_activity(&format!("{} {}", selected_phrase, profile.name), true)
.await;
// Create Minecraft child by inserting it into the state // Create Minecraft child by inserting it into the state
// This also spawns the process and prepares the subsequent processes // This also spawns the process and prepares the subsequent processes

View File

@@ -24,7 +24,7 @@ impl DirectoryInfo {
// init() is not needed for this function // init() is not needed for this function
pub fn get_initial_settings_dir() -> Option<PathBuf> { pub fn get_initial_settings_dir() -> Option<PathBuf> {
Self::env_path("THESEUS_CONFIG_DIR") Self::env_path("THESEUS_CONFIG_DIR")
.or_else(|| Some(dirs::data_dir()?.join("ModrinthApp"))) .or_else(|| Some(dirs::data_dir()?.join("AstralRinthApp")))
} }
/// Get all paths needed for Theseus to operate properly /// Get all paths needed for Theseus to operate properly

View File

@@ -1,12 +1,17 @@
use std::sync::{atomic::AtomicBool, Arc}; use std::{
sync::{atomic::AtomicBool, Arc},
time::{SystemTime, UNIX_EPOCH},
};
use discord_rich_presence::{ use discord_rich_presence::{
activity::{Activity, Assets}, activity::{Activity, Assets, Timestamps},
DiscordIpc, DiscordIpcClient, DiscordIpc, DiscordIpcClient,
}; };
use rand::seq::SliceRandom;
use tokio::sync::RwLock; use tokio::sync::RwLock;
use crate::state::Profile; // use crate::state::Profile;
use crate::util::utils;
use crate::State; use crate::State;
pub struct DiscordGuard { pub struct DiscordGuard {
@@ -14,12 +19,29 @@ pub struct DiscordGuard {
connected: Arc<AtomicBool>, connected: Arc<AtomicBool>,
} }
pub(crate) const ACTIVE_STATE: [&str; 6] = [
"Explores",
"Travels with",
"Pirating",
"Investigating the",
"Engaged in",
"Conducting",
];
pub(crate) const INACTIVE_STATE: [&str; 6] = [
"Idling...",
"Waiting for the pirate team...",
"Taking a break...",
"Resting...",
"On standby...",
"In a holding pattern...",
];
impl DiscordGuard { impl DiscordGuard {
/// Initialize discord IPC client, and attempt to connect to it /// Initialize discord IPC client, and attempt to connect to it
/// If it fails, it will still return a DiscordGuard, but the client will be unconnected /// If it fails, it will still return a DiscordGuard, but the client will be unconnected
pub fn init() -> crate::Result<DiscordGuard> { pub fn init() -> crate::Result<DiscordGuard> {
let dipc = let dipc =
DiscordIpcClient::new("1123683254248148992").map_err(|e| { DiscordIpcClient::new("1190718475832918136").map_err(|e| {
crate::ErrorKind::OtherError(format!( crate::ErrorKind::OtherError(format!(
"Could not create Discord client {}", "Could not create Discord client {}",
e, e,
@@ -77,11 +99,32 @@ impl DiscordGuard {
return Ok(()); return Ok(());
} }
let activity = Activity::new().state(msg).assets( // let activity = Activity::new().state(msg).assets(
Assets::new() // Assets::new()
.large_image("modrinth_simple") // .large_image("modrinth_simple")
.large_text("Modrinth Logo"), // .large_text("Modrinth Logo"),
); // );
let launcher =
utils::read_package_json().expect("Failed to read package.json");
let build_info = format!("AR • v{}", launcher.version);
let build_download = "https://astralium.su/get/ar";
let time = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Failed to get system time")
.as_secs() as i64;
let activity = Activity::new()
.state(msg)
.assets(
Assets::new()
.large_image("astralrinth_logo")
.large_text(&build_info)
.small_image("astralrinth_logo")
.small_text(&build_download),
)
.timestamps(Timestamps::new().start(time));
// Attempt to set the activity // Attempt to set the activity
// If the existing connection fails, attempt to reconnect and try again // If the existing connection fails, attempt to reconnect and try again
@@ -167,20 +210,10 @@ impl DiscordGuard {
return self.clear_activity(true).await; return self.clear_activity(true).await;
} }
let running_profiles = state.process_manager.get_all(); let selected_phrase =
if let Some(existing_child) = running_profiles.first() { INACTIVE_STATE.choose(&mut rand::thread_rng()).unwrap();
let prof = self.set_activity(&format!("{}", selected_phrase), reconnect_if_fail)
Profile::get(&existing_child.profile_path, &state.pool).await?; .await?;
if let Some(prof) = prof {
self.set_activity(
&format!("Playing {}", prof.name),
reconnect_if_fail,
)
.await?;
}
} else {
self.set_activity("Idling...", reconnect_if_fail).await?;
}
Ok(()) Ok(())
} }
} }

View File

@@ -197,6 +197,29 @@ pub async fn login_finish(
Ok(credentials) Ok(credentials)
} }
#[tracing::instrument]
pub async fn offline_auth(
name: &str,
exec: impl sqlx::Executor<'_, Database = sqlx::Sqlite> + Copy,
) -> crate::Result<Credentials> {
let random_uuid = Uuid::new_v4();
let access_token = "null".to_string();
let refresh_token = "null".to_string();
let credentials = Credentials {
id: random_uuid,
username: name.to_string(),
access_token: access_token,
refresh_token: refresh_token,
expires: Utc::now() + Duration::days(365 * 99),
active: true,
};
credentials.upsert(exec).await?;
Ok(credentials)
}
#[derive(Serialize, Deserialize, Clone, Debug)] #[derive(Serialize, Deserialize, Clone, Debug)]
pub struct Credentials { pub struct Credentials {
pub id: Uuid, pub id: Uuid,

View File

@@ -3,6 +3,7 @@ pub mod fetch;
pub mod io; pub mod io;
pub mod jre; pub mod jre;
pub mod platform; pub mod platform;
pub mod utils;
/// Wrap a builder which uses a mut reference into one which outputs an owned value /// Wrap a builder which uses a mut reference into one which outputs an owned value
macro_rules! wrap_ref_builder { macro_rules! wrap_ref_builder {

View File

@@ -0,0 +1,18 @@
use serde::{Deserialize, Serialize};
use tokio::io;
const PACKAGE_JSON_CONTENT: &str =
include_str!("../../../../apps/app-frontend/package.json");
#[derive(Serialize, Deserialize)]
pub struct Launcher {
pub version: String,
pub development_build: bool,
}
pub fn read_package_json() -> io::Result<Launcher> {
// Deserialize the content of package.json into a Launcher struct
let launcher: Launcher = serde_json::from_str(PACKAGE_JSON_CONTENT)?;
Ok(launcher)
}

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="10mm" height="10mm" viewBox="0 0 10 10" version="1.1" id="svg26662" inkscape:version="1.2.2 (732a01da63, 2022-12-09)" sodipodi:docname="lic.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview id="namedview26664" pagecolor="#505050" bordercolor="#eeeeee" borderopacity="1" inkscape:showpageshadow="0" inkscape:pageopacity="0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#505050" inkscape:document-units="mm" showgrid="false" inkscape:zoom="14.638496" inkscape:cx="17.112414" inkscape:cy="34.258984" inkscape:window-width="1488" inkscape:window-height="1230" inkscape:window-x="2794" inkscape:window-y="123" inkscape:window-maximized="0" inkscape:current-layer="layer1" />
<defs id="defs26659" />
<g inkscape:label="Слой 1" inkscape:groupmode="layer" id="layer1">
<g id="g26657" transform="matrix(3.9940568,0,0,3.954914,-1082.6556,16143.384)">
<path id="path26649" style="fill:#05a6f0;fill-opacity:1;stroke-width:0.18168;stroke-miterlimit:5.8;paint-order:fill markers stroke" d="m 271.06666,-4080.4646 v 0.8986 c 0,0.1289 0.0997,0.2334 0.22634,0.2398 h 0.91261 v -1.1384 z" />
<path id="path26651" style="fill:#ffba08;fill-opacity:1;stroke-width:0.18168;stroke-miterlimit:5.8;paint-order:fill markers stroke" d="m 272.43195,-4080.4646 v 1.1384 h 0.89917 0.0124 c 0.12669,-0.01 0.22686,-0.1109 0.22686,-0.2398 v -0.8986 z" />
<path id="path26653" style="fill:#e25127;fill-opacity:1;stroke-width:0.18168;stroke-miterlimit:5.8;paint-order:fill markers stroke" d="m 271.3054,-4081.8547 c -0.13246,0 -0.23874,0.1073 -0.23874,0.2403 v 0.8955 h 1.13895 v -1.1358 z" />
<path id="path26655" style="fill:#81bc06;fill-opacity:1;stroke:none;stroke-width:0.184849;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:5.8;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" d="m 272.43195,-4081.8547 v 1.1358 h 1.13843 v -0.8955 c 0,-0.133 -0.1068,-0.2403 -0.23926,-0.2403 z" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<svg height="800px" width="800px" version="1.1" id="Layer_1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 511.672 511.672" xml:space="preserve">
<path style="fill:#ED5564;" d="M227.674,44.901c0,0,0.047-0.031,0.141-0.109c-0.031,0.031-3.342,2.437-9.088,3.514
c-7.745,1.437-16.208-0.109-25.14-4.591c-31.386-15.771-68.175-0.968-69.721-0.344l0.016,0.062c-3.88,1.593-6.621,5.403-6.621,9.869
c0,5.887,4.771,10.649,10.657,10.649c1.694,0,3.295-0.406,4.716-1.109c4.466-1.624,30.816-10.416,51.381-0.078
c10.954,5.497,20.706,7.371,28.919,7.371c17.028,0,27.42-8.073,28.044-8.573L227.674,44.901z"/>
<g>
<path style="fill:#7F4545;" d="M234.514,31.973c-5.887,0-10.657,4.778-10.657,10.665v351.704h21.322V42.638
C245.179,36.751,240.401,31.973,234.514,31.973z"/>
<path style="fill:#7F4545;" d="M511.672,319.655c0-5.887-4.777-10.665-10.648-10.665c-1.031,0-2.016,0.156-2.951,0.422l0,0
l-0.234,0.062l0,0l-108.213,31.073l5.871,20.487l108.463-31.137l0,0C508.408,328.618,511.672,324.512,511.672,319.655z"/>
</g>
<path style="fill:#A85D5D;" d="M10.689,308.99l99.725,33.385c0,0,39.116,41.239,124.1,41.239c85,0,106.611-29.138,106.611-29.138
l85.258-24.484c9.588,160.21-122.656,149.561-122.656,149.561H115.294c-86.171-5.996-73.633-88.568-73.633-88.568l-13.187-9.728
l-4.208-18.021L0,351.635L10.689,308.99z"/>
<path style="fill:#965353;" d="M426.664,335.317c-5.871,132.337-122.938,122.905-122.938,122.905H115.294
c-57.409-3.981-71.001-41.973-73.68-66.879c-0.765,5.84-9.205,82.432,73.68,88.209h188.433
C303.727,479.553,433.004,489.968,426.664,335.317z"/>
<g>
<path style="fill:#434A54;" d="M277.166,415.594c0,5.887,4.763,10.649,10.649,10.649c5.888,0,10.649-4.763,10.649-10.649
s-4.762-10.665-10.649-10.665C281.929,404.929,277.166,409.707,277.166,415.594z"/>
<path style="fill:#434A54;" d="M234.514,415.594c0,5.887,4.778,10.649,10.665,10.649s10.657-4.763,10.657-10.649
s-4.77-10.665-10.657-10.665S234.514,409.707,234.514,415.594z"/>
<path style="fill:#434A54;" d="M191.877,415.594c0,5.887,4.771,10.649,10.657,10.649s10.665-4.763,10.665-10.649
s-4.778-10.665-10.665-10.665S191.877,409.707,191.877,415.594z"/>
<path style="fill:#434A54;" d="M149.24,415.594c0,5.887,4.771,10.649,10.657,10.649s10.657-4.763,10.657-10.649
s-4.771-10.665-10.657-10.665S149.24,409.707,149.24,415.594z"/>
<path style="fill:#434A54;" d="M99.569,330.305C114.942,207.719,74.616,95.869,74.616,95.869h260.169
c80.105,93.783,24.953,234.561,24.953,234.561C262.832,285.849,99.569,330.305,99.569,330.305z"/>
</g>
<g style="opacity:0.1;">
<path style="fill:#FFFFFF;" d="M334.785,95.869h-21.314c69.206,81.026,37.445,197.147,27.529,227.222
c6.434,2.123,12.695,4.56,18.738,7.339C359.738,330.43,414.891,189.652,334.785,95.869z"/>
</g>
<path style="fill:#E6E9ED;" d="M170.555,196.477c0-35.321,28.638-63.959,63.959-63.959c35.329,0,63.951,28.638,63.951,63.959
c0,18.941-8.213,35.961-21.299,47.672v26.952h-85.289v-26.952C178.792,232.438,170.555,215.418,170.555,196.477z"/>
<g>
<path style="fill:#434A54;" d="M250.503,196.477c0,5.887,4.778,10.665,10.665,10.665c5.888,0,10.658-4.778,10.658-10.665
s-4.771-10.665-10.658-10.665C255.282,185.812,250.503,190.59,250.503,196.477z"/>
<path style="fill:#434A54;" d="M197.21,196.477c0,5.887,4.771,10.665,10.657,10.665s10.657-4.778,10.657-10.665
s-4.771-10.665-10.657-10.665S197.21,190.59,197.21,196.477z"/>
</g>
<g>
<path style="fill:#CCD1D9;" d="M277.166,271.085c-0.016-5.871-4.777-10.649-10.673-10.649c-5.887,0-10.657,4.778-10.657,10.665
h21.33V271.085z"/>
<path style="fill:#CCD1D9;" d="M255.836,271.085c0-5.871-4.77-10.649-10.657-10.649s-10.665,4.778-10.665,10.665h21.322V271.085z" />
<path style="fill:#CCD1D9;" d="M234.514,271.085c0-5.871-4.771-10.649-10.657-10.649s-10.657,4.778-10.657,10.665h21.314V271.085z" />
<path style="fill:#CCD1D9;" d="M213.199,271.085c-0.008-5.871-4.778-10.649-10.665-10.649s-10.657,4.778-10.657,10.665h21.322
L213.199,271.085L213.199,271.085z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="10mm" height="10mm" viewBox="0 0 10 10" version="1.1" id="svg26662" inkscape:version="1.2.2 (732a01da63, 2022-12-09)" sodipodi:docname="pir.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview id="namedview26664" pagecolor="#505050" bordercolor="#eeeeee" borderopacity="1" inkscape:showpageshadow="0" inkscape:pageopacity="0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#505050" inkscape:document-units="mm" showgrid="false" inkscape:zoom="10.35098" inkscape:cx="16.375261" inkscape:cy="42.073312" inkscape:window-width="1488" inkscape:window-height="1230" inkscape:window-x="2794" inkscape:window-y="123" inkscape:window-maximized="0" inkscape:current-layer="layer1" />
<defs id="defs26659" />
<g inkscape:label="Слой 1" inkscape:groupmode="layer" id="layer1">
<path id="path26647" style="fill:#e7f9fb;fill-opacity:1;stroke:none;stroke-width:0.734686;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:5.8;stroke-dasharray:none;stroke-opacity:1;paint-order:normal" d="M 0.953646,0 C 0.4245958,0 0,0.42377 0,0.950056 V 9.051658 C 0,9.577943 0.4245958,9.9999995 0.953646,9.9999995 H 9.044545 C 9.573595,9.9999995 10,9.577943 10,9.051658 V 0.950056 C 10,0.42377 9.573595,0 9.044545,0 Z m 4.0319653,0.680202 c 0.7122257,0 1.1971907,0.171336 1.6235677,0.587681 C 7.149602,1.795597 7.303455,2.529484 7.076165,3.503527 6.954393,4.024672 6.743646,4.411034 6.384675,4.767983 6.046182,5.105514 5.7597,5.274565 5.369942,5.364516 4.7470347,5.510152 4.177518,5.313116 3.618915,4.763985 3.260174,4.411034 3.0504322,4.028385 2.9274247,3.503527 2.6985267,2.5272 2.8504547,1.797596 3.392573,1.267883 3.8051351,0.866387 4.2970505,0.680202 4.9856113,0.680202 Z M 4.1253339,2.785916 C 3.7727965,2.786202 3.5578276,2.980097 3.5578276,3.29821 c 0,0.197035 0.074385,0.320683 0.2711164,0.455467 C 4.0618628,3.91359 4.4444125,3.833637 4.5886441,3.596619 4.6788251,3.450984 4.6839941,3.154002 4.6001321,3.01265 4.5082281,2.855593 4.3583101,2.784203 4.1277751,2.784203 Z m 1.7295441,0 c -0.20506,0 -0.404923,0.09423 -0.493868,0.26557 C 5.226026,3.311345 5.34091,3.641452 5.60714,3.779948 5.859588,3.90845 6.185962,3.822778 6.372268,3.574345 6.463308,3.45441 6.469338,3.164568 6.383758,3.033211 6.273759,2.864731 6.062581,2.784774 5.85752,2.784774 Z M 1.8659927,5.307119 c 0.00862,-5.71e-4 0.020104,0 0.03073,0 0.2179844,2.86e-4 0.5876389,0.16848 1.6846262,0.695051 C 4.3488321,6.369399 4.9972712,6.669808 5.018122,6.669808 5.038222,6.669237 5.68049,6.371113 6.440564,6.008738 7.200522,5.64465 7.88377,5.323396 7.958155,5.323396 8.14742,5.283416 8.403142,5.409066 8.509492,5.577544 8.663431,5.82598 8.604552,6.167795 8.374795,6.361404 8.316205,6.409954 6.898963,7.091579 5.226428,7.875439 2.6791977,9.069933 2.1554033,9.312944 1.9972712,9.312944 c -0.2153996,0 -0.2679571,0 -0.3915391,-0.114223 C 1.3150575,8.936006 1.3506989,8.509952 1.6827021,8.264656 1.7519171,8.213256 2.1996325,7.990519 2.6777048,7.764356 3.1557197,7.54162 3.5582872,7.334304 3.5756915,7.334304 c 0.01436,0 -0.3826933,-0.217025 -0.8872167,-0.448042 C 2.1839513,6.654959 1.7142365,6.421657 1.646802,6.369971 1.4819495,6.24718 1.4026824,6.080128 1.4026824,5.863103 c 0,-0.219881 0.09535,-0.394643 0.2731268,-0.491448 0.063758,-0.03141 0.1203366,-0.05711 0.1901261,-0.06282 z M 7.094115,7.62329 7.661622,7.905994 c 0.784456,0.383506 0.930354,0.522573 0.930354,0.881807 0,0.219881 -0.105403,0.397498 -0.280307,0.480311 -0.151641,0.06568 -0.331859,0.06853 -0.513628,0 C 7.59815,9.193862 5.819639,8.388875 5.788334,8.354036 c -0.01436,0 0.273414,-0.182758 0.639363,-0.378651 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -175,6 +175,18 @@ import _Heading3Icon from './icons/heading-3.svg?component'
import './omorphia.scss' import './omorphia.scss'
// AstralRinth Icons
import _PirateIcon from './icons/pirate.svg?component'
import _MicrosoftIcon from './icons/microsoft.svg?component'
import _PirateShipIcon from './icons/pirate-ship.svg?component'
// AstralRinth Exports
export const PirateIcon = _PirateIcon
export const MicrosoftIcon = _MicrosoftIcon
export const PirateShipIcon = _PirateShipIcon
export const ModrinthIcon = _ModrinthIcon export const ModrinthIcon = _ModrinthIcon
export const FourOhFourNotFound = _FourOhFourNotFound export const FourOhFourNotFound = _FourOhFourNotFound
export const ModrinthPlusIcon = _ModrinthPlusIcon export const ModrinthPlusIcon = _ModrinthPlusIcon

160
pnpm-lock.yaml generated
View File

@@ -76,7 +76,7 @@ importers:
version: 1.11.11 version: 1.11.11
floating-vue: floating-vue:
specifier: ^5.2.2 specifier: ^5.2.2
version: 5.2.2(@nuxt/kit@3.12.3)(vue@3.4.31(typescript@5.5.3)) version: 5.2.2(@nuxt/kit@3.12.3(magicast@0.3.4)(rollup@4.18.0))(vue@3.4.31(typescript@5.5.3))
ofetch: ofetch:
specifier: ^1.3.4 specifier: ^1.3.4
version: 1.3.4 version: 1.3.4
@@ -337,7 +337,7 @@ importers:
version: 1.11.11 version: 1.11.11
floating-vue: floating-vue:
specifier: 2.0.0-beta.24 specifier: 2.0.0-beta.24
version: 2.0.0-beta.24(@nuxt/kit@3.12.3(rollup@3.29.4))(vue@3.4.31(typescript@5.5.3)) version: 2.0.0-beta.24(@nuxt/kit@3.12.3(magicast@0.3.4)(rollup@3.29.4))(vue@3.4.31(typescript@5.5.3))
highlight.js: highlight.js:
specifier: ^11.9.0 specifier: ^11.9.0
version: 11.9.0 version: 11.9.0
@@ -365,7 +365,7 @@ importers:
version: 6.2.12(@vue/compiler-core@3.4.31)(vue@3.4.31(typescript@5.5.3)) version: 6.2.12(@vue/compiler-core@3.4.31)(vue@3.4.31(typescript@5.5.3))
'@vintl/unplugin': '@vintl/unplugin':
specifier: ^1.5.1 specifier: ^1.5.1
version: 1.5.2(@vue/compiler-core@3.4.31)(rollup@3.29.4)(vite@4.5.3)(vue@3.4.31(typescript@5.5.3))(webpack@5.92.1) version: 1.5.2(@vue/compiler-core@3.4.31)(rollup@3.29.4)(vite@4.5.3(@types/node@22.5.1)(sass@1.77.6)(terser@5.31.6))(vue@3.4.31(typescript@5.5.3))(webpack@5.92.1)
'@vintl/vintl': '@vintl/vintl':
specifier: ^4.4.1 specifier: ^4.4.1
version: 4.4.1(typescript@5.5.3)(vue@3.4.31(typescript@5.5.3)) version: 4.4.1(typescript@5.5.3)(vue@3.4.31(typescript@5.5.3))
@@ -2109,6 +2109,9 @@ packages:
'@types/eslint@9.6.0': '@types/eslint@9.6.0':
resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==}
'@types/eslint@9.6.1':
resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
'@types/estree@1.0.5': '@types/estree@1.0.5':
resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
@@ -2148,6 +2151,9 @@ packages:
'@types/node@22.4.1': '@types/node@22.4.1':
resolution: {integrity: sha512-1tbpb9325+gPnKK0dMm+/LMriX0vKxf6RnB0SZUqfyVkQ4fMgUSySqhxE/y8Jvs4NyF1yHzTfG9KlnkIODxPKg==} resolution: {integrity: sha512-1tbpb9325+gPnKK0dMm+/LMriX0vKxf6RnB0SZUqfyVkQ4fMgUSySqhxE/y8Jvs4NyF1yHzTfG9KlnkIODxPKg==}
'@types/node@22.5.1':
resolution: {integrity: sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw==}
'@types/normalize-package-data@2.4.4': '@types/normalize-package-data@2.4.4':
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
@@ -2791,8 +2797,8 @@ packages:
caniuse-lite@1.0.30001642: caniuse-lite@1.0.30001642:
resolution: {integrity: sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==} resolution: {integrity: sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==}
caniuse-lite@1.0.30001651: caniuse-lite@1.0.30001655:
resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} resolution: {integrity: sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==}
chalk@2.4.2: chalk@2.4.2:
resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
@@ -3204,8 +3210,8 @@ packages:
electron-to-chromium@1.4.829: electron-to-chromium@1.4.829:
resolution: {integrity: sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==} resolution: {integrity: sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==}
electron-to-chromium@1.5.11: electron-to-chromium@1.5.13:
resolution: {integrity: sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew==} resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==}
emoji-regex@8.0.0: emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
@@ -4921,6 +4927,10 @@ packages:
resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
postcss@8.4.42:
resolution: {integrity: sha512-hywKUQB9Ra4dR1mGhldy5Aj1X3MWDSIA1cEi+Uy0CjheLvP6Ual5RlwMCh8i/X121yEDLDIKBsrCQ8ba3FDMfQ==}
engines: {node: ^10 || ^12 || >=14}
posthog-js@1.158.2: posthog-js@1.158.2:
resolution: {integrity: sha512-ovb7GHHRNDf6vmuL+8lbDukewzDzQlLZXg3d475hrfHSBgidYeTxtLGtoBcUz4x6558BLDFjnSip+f3m4rV9LA==} resolution: {integrity: sha512-ovb7GHHRNDf6vmuL+8lbDukewzDzQlLZXg3d475hrfHSBgidYeTxtLGtoBcUz4x6558BLDFjnSip+f3m4rV9LA==}
@@ -5665,8 +5675,8 @@ packages:
undici-types@5.26.5: undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
undici-types@6.19.6: undici-types@6.19.8:
resolution: {integrity: sha512-e/vggGopEfTKSvj4ihnOLTsqhrKRN3LeO6qSN/GxohhuRv8qH9bNQ4B8W7e/vFL+0XTnmHPB4/kegunZGA4Org==} resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
undici@5.28.4: undici@5.28.4:
resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==}
@@ -7098,9 +7108,9 @@ snapshots:
- supports-color - supports-color
- utf-8-validate - utf-8-validate
'@nuxt/kit@3.12.3': '@nuxt/kit@3.12.3(magicast@0.3.4)(rollup@3.29.4)':
dependencies: dependencies:
'@nuxt/schema': 3.12.3 '@nuxt/schema': 3.12.3(rollup@3.29.4)
c12: 1.11.1(magicast@0.3.4) c12: 1.11.1(magicast@0.3.4)
consola: 3.2.3 consola: 3.2.3
defu: 6.1.4 defu: 6.1.4
@@ -7118,7 +7128,7 @@ snapshots:
semver: 7.6.2 semver: 7.6.2
ufo: 1.5.3 ufo: 1.5.3
unctx: 2.3.1 unctx: 2.3.1
unimport: 3.7.2 unimport: 3.7.2(rollup@3.29.4)
untyped: 1.4.2 untyped: 1.4.2
transitivePeerDependencies: transitivePeerDependencies:
- magicast - magicast
@@ -7153,53 +7163,6 @@ snapshots:
- rollup - rollup
- supports-color - supports-color
'@nuxt/kit@3.12.3(rollup@3.29.4)':
dependencies:
'@nuxt/schema': 3.12.3(rollup@3.29.4)
c12: 1.11.1(magicast@0.3.4)
consola: 3.2.3
defu: 6.1.4
destr: 2.0.3
globby: 14.0.2
hash-sum: 2.0.0
ignore: 5.3.1
jiti: 1.21.6
klona: 2.0.6
knitwork: 1.1.0
mlly: 1.7.1
pathe: 1.1.2
pkg-types: 1.1.3
scule: 1.3.0
semver: 7.6.2
ufo: 1.5.3
unctx: 2.3.1
unimport: 3.7.2(rollup@3.29.4)
untyped: 1.4.2
transitivePeerDependencies:
- magicast
- rollup
- supports-color
optional: true
'@nuxt/schema@3.12.3':
dependencies:
compatx: 0.1.8
consola: 3.2.3
defu: 6.1.4
hookable: 5.5.3
pathe: 1.1.2
pkg-types: 1.1.3
scule: 1.3.0
std-env: 3.7.0
ufo: 1.5.3
uncrypto: 0.1.3
unimport: 3.7.2
untyped: 1.4.2
transitivePeerDependencies:
- rollup
- supports-color
optional: true
'@nuxt/schema@3.12.3(rollup@3.29.4)': '@nuxt/schema@3.12.3(rollup@3.29.4)':
dependencies: dependencies:
compatx: 0.1.8 compatx: 0.1.8
@@ -7904,7 +7867,7 @@ snapshots:
'@types/eslint-scope@3.7.7': '@types/eslint-scope@3.7.7':
dependencies: dependencies:
'@types/eslint': 9.6.0 '@types/eslint': 9.6.1
'@types/estree': 1.0.5 '@types/estree': 1.0.5
optional: true optional: true
@@ -7914,6 +7877,12 @@ snapshots:
'@types/json-schema': 7.0.15 '@types/json-schema': 7.0.15
optional: true optional: true
'@types/eslint@9.6.1':
dependencies:
'@types/estree': 1.0.5
'@types/json-schema': 7.0.15
optional: true
'@types/estree@1.0.5': {} '@types/estree@1.0.5': {}
'@types/fs-extra@9.0.13': '@types/fs-extra@9.0.13':
@@ -7951,7 +7920,12 @@ snapshots:
'@types/node@22.4.1': '@types/node@22.4.1':
dependencies: dependencies:
undici-types: 6.19.6 undici-types: 6.19.8
optional: true
'@types/node@22.5.1':
dependencies:
undici-types: 6.19.8
optional: true optional: true
'@types/normalize-package-data@2.4.4': {} '@types/normalize-package-data@2.4.4': {}
@@ -8220,7 +8194,7 @@ snapshots:
- vue - vue
- webpack - webpack
'@vintl/unplugin@1.5.2(@vue/compiler-core@3.4.31)(rollup@3.29.4)(vite@4.5.3)(vue@3.4.31(typescript@5.5.3))(webpack@5.92.1)': '@vintl/unplugin@1.5.2(@vue/compiler-core@3.4.31)(rollup@3.29.4)(vite@4.5.3(@types/node@22.5.1)(sass@1.77.6)(terser@5.31.6))(vue@3.4.31(typescript@5.5.3))(webpack@5.92.1)':
dependencies: dependencies:
'@formatjs/cli-lib': 6.4.2(@vue/compiler-core@3.4.31)(vue@3.4.31(typescript@5.5.3)) '@formatjs/cli-lib': 6.4.2(@vue/compiler-core@3.4.31)(vue@3.4.31(typescript@5.5.3))
'@formatjs/icu-messageformat-parser': 2.7.8 '@formatjs/icu-messageformat-parser': 2.7.8
@@ -8231,7 +8205,7 @@ snapshots:
unplugin: 1.11.0 unplugin: 1.11.0
optionalDependencies: optionalDependencies:
rollup: 3.29.4 rollup: 3.29.4
vite: 4.5.3 vite: 4.5.3(@types/node@22.5.1)(sass@1.77.6)(terser@5.31.6)
webpack: 5.92.1 webpack: 5.92.1
transitivePeerDependencies: transitivePeerDependencies:
- '@glimmer/env' - '@glimmer/env'
@@ -8816,8 +8790,8 @@ snapshots:
browserslist@4.23.3: browserslist@4.23.3:
dependencies: dependencies:
caniuse-lite: 1.0.30001651 caniuse-lite: 1.0.30001655
electron-to-chromium: 1.5.11 electron-to-chromium: 1.5.13
node-releases: 2.0.18 node-releases: 2.0.18
update-browserslist-db: 1.1.0(browserslist@4.23.3) update-browserslist-db: 1.1.0(browserslist@4.23.3)
optional: true optional: true
@@ -8885,7 +8859,7 @@ snapshots:
caniuse-lite@1.0.30001642: {} caniuse-lite@1.0.30001642: {}
caniuse-lite@1.0.30001651: caniuse-lite@1.0.30001655:
optional: true optional: true
chalk@2.4.2: chalk@2.4.2:
@@ -9248,7 +9222,7 @@ snapshots:
electron-to-chromium@1.4.829: {} electron-to-chromium@1.4.829: {}
electron-to-chromium@1.5.11: electron-to-chromium@1.5.13:
optional: true optional: true
emoji-regex@8.0.0: {} emoji-regex@8.0.0: {}
@@ -9478,7 +9452,7 @@ snapshots:
eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0))(eslint-plugin-n@15.7.0(eslint@8.57.0))(eslint-plugin-promise@6.4.0(eslint@8.57.0))(eslint@8.57.0): eslint-config-standard@17.1.0(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0))(eslint-plugin-n@15.7.0(eslint@8.57.0))(eslint-plugin-promise@6.4.0(eslint@8.57.0))(eslint@8.57.0):
dependencies: dependencies:
eslint: 8.57.0 eslint: 8.57.0
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)
eslint-plugin-n: 15.7.0(eslint@8.57.0) eslint-plugin-n: 15.7.0(eslint@8.57.0)
eslint-plugin-promise: 6.4.0(eslint@8.57.0) eslint-plugin-promise: 6.4.0(eslint@8.57.0)
@@ -9500,7 +9474,7 @@ snapshots:
debug: 4.3.5 debug: 4.3.5
enhanced-resolve: 5.17.0 enhanced-resolve: 5.17.0
eslint: 8.57.0 eslint: 8.57.0
eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0)
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)
fast-glob: 3.3.2 fast-glob: 3.3.2
get-tsconfig: 4.7.5 get-tsconfig: 4.7.5
@@ -9512,13 +9486,12 @@ snapshots:
- eslint-import-resolver-webpack - eslint-import-resolver-webpack
- supports-color - supports-color
eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0):
dependencies: dependencies:
debug: 3.2.7 debug: 3.2.7
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.3) '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.3)
eslint: 8.57.0 eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint-plugin-import@2.29.1)(eslint@8.57.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -9899,21 +9872,21 @@ snapshots:
vue: 3.4.31(typescript@5.5.3) vue: 3.4.31(typescript@5.5.3)
vue-resize: 2.0.0-alpha.1(vue@3.4.31(typescript@5.5.3)) vue-resize: 2.0.0-alpha.1(vue@3.4.31(typescript@5.5.3))
floating-vue@2.0.0-beta.24(@nuxt/kit@3.12.3(rollup@3.29.4))(vue@3.4.31(typescript@5.5.3)): floating-vue@2.0.0-beta.24(@nuxt/kit@3.12.3(magicast@0.3.4)(rollup@3.29.4))(vue@3.4.31(typescript@5.5.3)):
dependencies: dependencies:
'@floating-ui/dom': 1.1.1 '@floating-ui/dom': 1.1.1
vue: 3.4.31(typescript@5.5.3) vue: 3.4.31(typescript@5.5.3)
vue-resize: 2.0.0-alpha.1(vue@3.4.31(typescript@5.5.3)) vue-resize: 2.0.0-alpha.1(vue@3.4.31(typescript@5.5.3))
optionalDependencies: optionalDependencies:
'@nuxt/kit': 3.12.3(rollup@3.29.4) '@nuxt/kit': 3.12.3(magicast@0.3.4)(rollup@3.29.4)
floating-vue@5.2.2(@nuxt/kit@3.12.3)(vue@3.4.31(typescript@5.5.3)): floating-vue@5.2.2(@nuxt/kit@3.12.3(magicast@0.3.4)(rollup@4.18.0))(vue@3.4.31(typescript@5.5.3)):
dependencies: dependencies:
'@floating-ui/dom': 1.1.1 '@floating-ui/dom': 1.1.1
vue: 3.4.31(typescript@5.5.3) vue: 3.4.31(typescript@5.5.3)
vue-resize: 2.0.0-alpha.1(vue@3.4.31(typescript@5.5.3)) vue-resize: 2.0.0-alpha.1(vue@3.4.31(typescript@5.5.3))
optionalDependencies: optionalDependencies:
'@nuxt/kit': 3.12.3 '@nuxt/kit': 3.12.3(magicast@0.3.4)(rollup@4.18.0)
for-each@0.3.3: for-each@0.3.3:
dependencies: dependencies:
@@ -10394,7 +10367,7 @@ snapshots:
jest-worker@27.5.1: jest-worker@27.5.1:
dependencies: dependencies:
'@types/node': 20.14.11 '@types/node': 22.5.1
merge-stream: 2.0.0 merge-stream: 2.0.0
supports-color: 8.1.1 supports-color: 8.1.1
optional: true optional: true
@@ -11348,6 +11321,13 @@ snapshots:
picocolors: 1.0.1 picocolors: 1.0.1
source-map-js: 1.2.0 source-map-js: 1.2.0
postcss@8.4.42:
dependencies:
nanoid: 3.3.7
picocolors: 1.0.1
source-map-js: 1.2.0
optional: true
posthog-js@1.158.2: posthog-js@1.158.2:
dependencies: dependencies:
fflate: 0.4.8 fflate: 0.4.8
@@ -12113,7 +12093,7 @@ snapshots:
undici-types@5.26.5: {} undici-types@5.26.5: {}
undici-types@6.19.6: undici-types@6.19.8:
optional: true optional: true
undici@5.28.4: undici@5.28.4:
@@ -12137,25 +12117,6 @@ snapshots:
unicorn-magic@0.1.0: {} unicorn-magic@0.1.0: {}
unimport@3.7.2:
dependencies:
'@rollup/pluginutils': 5.1.0(rollup@4.18.0)
acorn: 8.12.1
escape-string-regexp: 5.0.0
estree-walker: 3.0.3
fast-glob: 3.3.2
local-pkg: 0.5.0
magic-string: 0.30.10
mlly: 1.7.1
pathe: 1.1.2
pkg-types: 1.1.3
scule: 1.3.0
strip-literal: 2.1.0
unplugin: 1.11.0
transitivePeerDependencies:
- rollup
optional: true
unimport@3.7.2(rollup@3.29.4): unimport@3.7.2(rollup@3.29.4):
dependencies: dependencies:
'@rollup/pluginutils': 5.1.0(rollup@3.29.4) '@rollup/pluginutils': 5.1.0(rollup@3.29.4)
@@ -12384,13 +12345,16 @@ snapshots:
svgo: 3.3.2 svgo: 3.3.2
vue: 3.4.31(typescript@5.5.3) vue: 3.4.31(typescript@5.5.3)
vite@4.5.3: vite@4.5.3(@types/node@22.5.1)(sass@1.77.6)(terser@5.31.6):
dependencies: dependencies:
esbuild: 0.18.20 esbuild: 0.18.20
postcss: 8.4.41 postcss: 8.4.42
rollup: 3.29.4 rollup: 3.29.4
optionalDependencies: optionalDependencies:
'@types/node': 22.5.1
fsevents: 2.3.3 fsevents: 2.3.3
sass: 1.77.6
terser: 5.31.6
optional: true optional: true
vite@5.3.3(@types/node@20.14.9)(sass@1.77.6)(terser@5.31.6): vite@5.3.3(@types/node@20.14.9)(sass@1.77.6)(terser@5.31.6):