init
30
.SRCINFO
|
|
@ -1,30 +0,0 @@
|
|||
pkgbase = emerald-legacy-launcher
|
||||
pkgdesc = FOSS, cross-platform launcher for Minecraft Legacy Console Edition
|
||||
pkgver = 1.0.0
|
||||
pkgrel = 1
|
||||
url = https://github.com/Emerald-Legacy-Launcher/Emerald-Legacy-Launcher
|
||||
arch = x86_64
|
||||
license = GPL-3.0
|
||||
makedepends = git
|
||||
makedepends = openssl
|
||||
makedepends = appmenu-gtk-module
|
||||
makedepends = libappindicator-gtk3
|
||||
makedepends = librsvg
|
||||
makedepends = cargo
|
||||
makedepends = pnpm
|
||||
makedepends = nodejs
|
||||
depends = cairo
|
||||
depends = desktop-file-utils
|
||||
depends = gdk-pixbuf2
|
||||
depends = glib2
|
||||
depends = gtk3
|
||||
depends = hicolor-icon-theme
|
||||
depends = libsoup
|
||||
depends = pango
|
||||
depends = webkit2gtk-4.1
|
||||
optdepends = discord: Discord RPC support
|
||||
provides = emerald-legacy-launcher
|
||||
source = emerald-legacy-launcher::git+https://github.com/Emerald-Legacy-Launcher/Emerald-Legacy-Launcher#branch=main
|
||||
sha256sums = SKIP
|
||||
|
||||
pkgname = emerald-legacy-launcher
|
||||
313
.github/workflows/experimental.yml
vendored
|
|
@ -1,313 +0,0 @@
|
|||
name: "experimental"
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build-goldmapper:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: install mingw toolchain
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 10
|
||||
- name: setup node
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: lts/*
|
||||
cache: "pnpm"
|
||||
- name: build GoldMapper
|
||||
run: |
|
||||
pnpm install
|
||||
pnpm goldmapper
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: goldmapper
|
||||
path: |
|
||||
src-tauri/resources/GoldMapperLib.dll
|
||||
src-tauri/resources/GoldMapperLauncher.exe
|
||||
src-tauri/resources/SDL2.dll
|
||||
|
||||
build-tauri:
|
||||
needs: [build-goldmapper]
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- platform: "macos-latest"
|
||||
args: "--target aarch64-apple-darwin"
|
||||
artifact-name: macos-aarch64
|
||||
- platform: "macos-latest"
|
||||
args: "--target x86_64-apple-darwin"
|
||||
artifact-name: macos-x86_64
|
||||
- platform: "ubuntu-24.04"
|
||||
args: "--bundles deb,rpm"
|
||||
artifact-name: linux
|
||||
- platform: "ubuntu-24.04-arm"
|
||||
args: "--target aarch64-unknown-linux-gnu --bundles deb,rpm"
|
||||
artifact-name: linux-arm64
|
||||
- platform: "windows-latest"
|
||||
args: ""
|
||||
artifact-name: windows
|
||||
|
||||
runs-on: ${{ matrix.platform }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- name: install dependencies (ubuntu only)
|
||||
if: startsWith(matrix.platform, 'ubuntu')
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf libudev-dev
|
||||
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 10
|
||||
- name: setup node
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: lts/*
|
||||
cache: "pnpm"
|
||||
|
||||
- name: download GoldMapper
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: goldmapper
|
||||
path: src-tauri/resources
|
||||
|
||||
- name: install Rust stable
|
||||
uses: dtolnay/rust-toolchain@stable
|
||||
with:
|
||||
targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || matrix.platform == 'ubuntu-24.04-arm' && 'aarch64-unknown-linux-gnu' || '' }}
|
||||
|
||||
- name: Rust cache
|
||||
uses: swatinem/rust-cache@v2
|
||||
with:
|
||||
workspaces: "./src-tauri -> target"
|
||||
|
||||
- name: install frontend dependencies
|
||||
run: pnpm install
|
||||
|
||||
- name: build Tauri app
|
||||
run: pnpm tauri build ${{ matrix.args }}
|
||||
env:
|
||||
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
|
||||
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
|
||||
|
||||
- name: run macOS postbuild
|
||||
run: pnpm post-build:macos
|
||||
if: matrix.platform == 'macos-latest'
|
||||
|
||||
- name: Create PKG with post-install script (macOS only)
|
||||
if: matrix.platform == 'macos-latest'
|
||||
run: |
|
||||
mkdir -p pkg_temp/scripts
|
||||
cp scripts/postinstall.sh pkg_temp/scripts/
|
||||
MACOS_BUNDLE_DIR=$(find src-tauri/target -path "*/release/bundle/macos" -type d | head -n 1)
|
||||
APP_PATH=$(find "$MACOS_BUNDLE_DIR" -name "*.app" -type d | head -n 1)
|
||||
if [ -z "$APP_PATH" ]; then
|
||||
echo "No .app found in $MACOS_BUNDLE_DIR"
|
||||
exit 1
|
||||
fi
|
||||
APP_NAME=$(basename "$APP_PATH")
|
||||
pkgbuild --root "$APP_PATH/.." \
|
||||
--install-location /Applications \
|
||||
--scripts pkg_temp/scripts \
|
||||
--identifier "com.emerald.legacy" \
|
||||
--version "1.0.0" \
|
||||
"Emerald-Legacy-Launcher.pkg"
|
||||
mv "Emerald-Legacy-Launcher.pkg" "$MACOS_BUNDLE_DIR/"
|
||||
|
||||
- name: upload build artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ matrix.artifact-name }}
|
||||
path: |
|
||||
src-tauri/target/**/release/bundle/**/*
|
||||
|
||||
build-flatpak:
|
||||
needs: [build-goldmapper]
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: bilelmoussaoui/flatpak-github-actions:freedesktop-23.08
|
||||
options: --privileged
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: download GoldMapper
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: goldmapper
|
||||
path: src-tauri/resources
|
||||
- name: sleep for 10 seconds
|
||||
run: sleep 10
|
||||
- uses: flatpak/flatpak-github-actions/flatpak-builder@v6
|
||||
with:
|
||||
bundle: Emerald.Legacy.Launcher.flatpak
|
||||
manifest-path: flatpak/io.github.Emerald_Legacy_Launcher.Emerald_Legacy_Launcher.yml
|
||||
cache-key: flatpak-builder-${{ github.sha }}
|
||||
- name: upload flatpak artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: flatpak
|
||||
path: Emerald.Legacy.Launcher.flatpak
|
||||
|
||||
build-appimage:
|
||||
needs: [build-goldmapper]
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: archlinux:latest
|
||||
steps:
|
||||
- name: Bootstrap keyring and git
|
||||
run: |
|
||||
pacman -Syu --noconfirm archlinux-keyring
|
||||
pacman -S --noconfirm --needed git
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
src-tauri/target
|
||||
node_modules
|
||||
/var/cache/pacman/pkg
|
||||
key: arch-${{ hashFiles('src-tauri/Cargo.lock', 'pnpm-lock.yaml') }}
|
||||
restore-keys: arch-
|
||||
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
pacman -S --noconfirm --needed \
|
||||
base-devel wget zsync nodejs patchelf \
|
||||
cargo cargo-tauri \
|
||||
gtk3 libayatana-appindicator webkit2gtk-4.1 glib-networking librsvg \
|
||||
xorg-server-xvfb
|
||||
|
||||
- name: download GoldMapper
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: goldmapper
|
||||
path: src-tauri/resources
|
||||
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 10
|
||||
|
||||
- name: Build deb with tauri
|
||||
run: |
|
||||
pnpm install
|
||||
cargo-tauri build --bundles deb --config '{"bundle":{"createUpdaterArtifacts":false},"build":{"beforeBuildCommand":"pnpm build"}}'
|
||||
|
||||
- name: Extract deb into /usr
|
||||
run: |
|
||||
cd src-tauri/target/release/bundle/deb
|
||||
ar x ./*.deb
|
||||
tar -xf data.tar.*
|
||||
cp -a usr/. /usr/
|
||||
|
||||
- name: Build AppImage
|
||||
run: |
|
||||
cd pkg/AppImage
|
||||
chmod +x ./AppImage.sh
|
||||
./AppImage.sh
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: appimage
|
||||
path: pkg/AppImage/dist/*.AppImage
|
||||
|
||||
build-android:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [build-goldmapper]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 10
|
||||
- name: setup node
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: lts/*
|
||||
cache: "pnpm"
|
||||
|
||||
- name: download GoldMapper
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: goldmapper
|
||||
path: src-tauri/resources
|
||||
|
||||
- name: setup Java 17
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: "17"
|
||||
|
||||
- name: setup Android SDK
|
||||
uses: android-actions/setup-android@v4
|
||||
- name: install Android SDK components
|
||||
run: |
|
||||
sdkmanager --install "platforms;android-36" "build-tools;36.0.0" "ndk;28.2.13676358"
|
||||
yes | sdkmanager --licenses
|
||||
sudo apt-get install -y glslang-tools
|
||||
|
||||
- name: install Rust stable with android target
|
||||
uses: dtolnay/rust-toolchain@stable
|
||||
with:
|
||||
targets: aarch64-linux-android
|
||||
|
||||
- name: Rust cache
|
||||
uses: swatinem/rust-cache@v2
|
||||
with:
|
||||
workspaces: "./src-tauri -> target"
|
||||
|
||||
- name: install frontend dependencies
|
||||
run: pnpm install
|
||||
|
||||
- name: download android bundled assets
|
||||
run: pnpm android:assets
|
||||
|
||||
- name: restore gradle wrapper jar
|
||||
run: |
|
||||
VER=$(sed -n 's/.*gradle-\([0-9][0-9.]*\)-bin\.zip.*/\1/p' src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties)
|
||||
curl -fL -o src-tauri/gen/android/gradle/wrapper/gradle-wrapper.jar \
|
||||
"https://raw.githubusercontent.com/gradle/gradle/v${VER}/gradle/wrapper/gradle-wrapper.jar"
|
||||
|
||||
- name: set up android signing keystore
|
||||
env:
|
||||
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
|
||||
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
|
||||
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
|
||||
run: |
|
||||
printf '%s' "$ANDROID_KEYSTORE_BASE64" | base64 -d > src-tauri/gen/android/app/release.keystore
|
||||
cat > src-tauri/gen/android/app/key.properties <<EOF
|
||||
keyAlias=$ANDROID_KEY_ALIAS
|
||||
keyPassword=$ANDROID_KEYSTORE_PASSWORD
|
||||
storeFile=release.keystore
|
||||
storePassword=$ANDROID_KEYSTORE_PASSWORD
|
||||
EOF
|
||||
|
||||
- name: build Android APK
|
||||
env:
|
||||
ANDROID_NDK_HOME: ${{ env.ANDROID_HOME }}/ndk/28.2.13676358
|
||||
NDK_HOME: ${{ env.ANDROID_HOME }}/ndk/28.2.13676358
|
||||
run: npx tauri android build --target aarch64
|
||||
- name: upload APK
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: android-apk
|
||||
path: src-tauri/gen/android/app/build/outputs/apk/universal/release/*.apk
|
||||
42
.github/workflows/nix.yml
vendored
|
|
@ -1,42 +0,0 @@
|
|||
name: Nix
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
id-token: write
|
||||
|
||||
concurrency:
|
||||
group: nix-${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: DeterminateSystems/nix-installer-action@main
|
||||
|
||||
- uses: DeterminateSystems/magic-nix-cache-action@main
|
||||
|
||||
- name: Build stable package
|
||||
run: nix build .#emerald-legacy-launcher --print-build-logs
|
||||
|
||||
- name: Build git package
|
||||
run: nix build .#emerald-legacy-launcher-git --out-link result-git --print-build-logs
|
||||
|
||||
- name: Flake check
|
||||
run: nix flake check --print-build-logs
|
||||
|
||||
- name: Verify outputs
|
||||
run: |
|
||||
test -x ./result/bin/emerald-legacy-launcher
|
||||
test -x ./result-git/bin/emerald-legacy-launcher
|
||||
nix path-info -Sh ./result ./result-git
|
||||
ls -la ./result/bin/
|
||||
ls -la ./result-git/bin/
|
||||
ls -la ./result/share/applications/ || true
|
||||
318
.github/workflows/publish.yml
vendored
|
|
@ -1,318 +0,0 @@
|
|||
name: "publish"
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
get-version:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
version: ${{ steps.version.outputs.version }}
|
||||
body: ${{ steps.version.outputs.body }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- id: version
|
||||
run: |
|
||||
echo "version=$(jq -r .version package.json)" >> $GITHUB_OUTPUT
|
||||
echo "body<<EOF" >> "$GITHUB_OUTPUT"
|
||||
cat RELEASE_NOTES.md >> "$GITHUB_OUTPUT"
|
||||
echo "EOF" >> "$GITHUB_OUTPUT"
|
||||
|
||||
build-goldmapper:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: install mingw toolchain
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 10
|
||||
- name: setup node
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: lts/*
|
||||
cache: "pnpm"
|
||||
- name: build GoldMapper
|
||||
run: |
|
||||
pnpm install
|
||||
pnpm goldmapper
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: goldmapper
|
||||
path: |
|
||||
src-tauri/resources/GoldMapperLib.dll
|
||||
src-tauri/resources/GoldMapperLauncher.exe
|
||||
src-tauri/resources/SDL2.dll
|
||||
|
||||
publish-tauri:
|
||||
needs: [get-version, build-goldmapper]
|
||||
permissions:
|
||||
contents: write
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- platform: "macos-latest"
|
||||
args: "--target aarch64-apple-darwin"
|
||||
- platform: "macos-latest"
|
||||
args: "--target x86_64-apple-darwin"
|
||||
- platform: "ubuntu-24.04"
|
||||
args: "--bundles deb,rpm"
|
||||
- platform: "ubuntu-24.04-arm"
|
||||
args: "--target aarch64-unknown-linux-gnu --bundles deb,rpm"
|
||||
- platform: "windows-latest"
|
||||
args: ""
|
||||
|
||||
runs-on: ${{ matrix.platform }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- name: install dependencies (ubuntu only)
|
||||
if: startsWith(matrix.platform, 'ubuntu')
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf libudev-dev
|
||||
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 10
|
||||
- name: setup node
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: lts/*
|
||||
cache: "pnpm"
|
||||
|
||||
- name: download GoldMapper
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: goldmapper
|
||||
path: src-tauri/resources
|
||||
|
||||
- name: install Rust stable
|
||||
uses: dtolnay/rust-toolchain@stable
|
||||
with:
|
||||
targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || matrix.platform == 'ubuntu-24.04-arm' && 'aarch64-unknown-linux-gnu' || '' }}
|
||||
|
||||
- name: Rust cache
|
||||
uses: swatinem/rust-cache@v2
|
||||
with:
|
||||
workspaces: "./src-tauri -> target"
|
||||
|
||||
- name: install frontend dependencies
|
||||
run: pnpm install
|
||||
- uses: tauri-apps/tauri-action@v0
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
|
||||
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
|
||||
with:
|
||||
tagName: v__VERSION__
|
||||
releaseName: "Emerald v__VERSION__"
|
||||
releaseBody: ${{ needs.get-version.outputs.body }}
|
||||
releaseDraft: true
|
||||
prerelease: false
|
||||
uploadUpdaterJson: true
|
||||
args: ${{ matrix.args }}
|
||||
|
||||
build-appimage:
|
||||
needs: [build-goldmapper]
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: archlinux:latest
|
||||
steps:
|
||||
- name: Bootstrap keyring and git
|
||||
run: |
|
||||
pacman -Syu --noconfirm archlinux-keyring
|
||||
pacman -S --noconfirm --needed git
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
src-tauri/target
|
||||
node_modules
|
||||
/var/cache/pacman/pkg
|
||||
key: arch-${{ hashFiles('src-tauri/Cargo.lock', 'pnpm-lock.yaml') }}
|
||||
restore-keys: arch-
|
||||
|
||||
- name: Install build dependencies
|
||||
run: |
|
||||
pacman -S --noconfirm --needed \
|
||||
base-devel wget zsync nodejs patchelf \
|
||||
cargo cargo-tauri \
|
||||
gtk3 libayatana-appindicator webkit2gtk-4.1 glib-networking librsvg \
|
||||
xorg-server-xvfb
|
||||
|
||||
- name: download GoldMapper
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: goldmapper
|
||||
path: src-tauri/resources
|
||||
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 10
|
||||
|
||||
- name: Build deb with tauri
|
||||
run: |
|
||||
pnpm install
|
||||
cargo-tauri build --bundles deb --config '{"bundle":{"createUpdaterArtifacts":false},"build":{"beforeBuildCommand":"pnpm build"}}'
|
||||
|
||||
- name: Extract deb into /usr
|
||||
run: |
|
||||
cd src-tauri/target/release/bundle/deb
|
||||
ar x ./*.deb
|
||||
tar -xf data.tar.*
|
||||
cp -a usr/. /usr/
|
||||
|
||||
- name: Build AppImage
|
||||
run: |
|
||||
cd pkg/AppImage
|
||||
chmod +x ./AppImage.sh
|
||||
./AppImage.sh
|
||||
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: appimage
|
||||
path: pkg/AppImage/dist/*.AppImage* #neo: *.AppImage* because .zsync as well
|
||||
|
||||
build-android:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [build-goldmapper]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
version: 10
|
||||
- name: setup node
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: lts/*
|
||||
cache: "pnpm"
|
||||
|
||||
- name: download GoldMapper
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: goldmapper
|
||||
path: src-tauri/resources
|
||||
|
||||
- name: setup Java 17
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: "17"
|
||||
|
||||
- name: setup Android SDK
|
||||
uses: android-actions/setup-android@v4
|
||||
|
||||
- name: install Android SDK components
|
||||
run: |
|
||||
sdkmanager --install "platforms;android-36" "build-tools;36.0.0" "ndk;28.2.13676358"
|
||||
yes | sdkmanager --licenses
|
||||
sudo apt-get install -y glslang-tools
|
||||
|
||||
- name: install Rust stable with android target
|
||||
uses: dtolnay/rust-toolchain@stable
|
||||
with:
|
||||
targets: aarch64-linux-android
|
||||
|
||||
- name: Rust cache
|
||||
uses: swatinem/rust-cache@v2
|
||||
with:
|
||||
workspaces: "./src-tauri -> target"
|
||||
|
||||
- name: install frontend dependencies
|
||||
run: pnpm install
|
||||
|
||||
- name: download android bundled assets
|
||||
run: pnpm android:assets
|
||||
|
||||
- name: restore gradle wrapper jar
|
||||
run: |
|
||||
VER=$(sed -n 's/.*gradle-\([0-9][0-9.]*\)-bin\.zip.*/\1/p' src-tauri/gen/android/gradle/wrapper/gradle-wrapper.properties)
|
||||
curl -fL -o src-tauri/gen/android/gradle/wrapper/gradle-wrapper.jar \
|
||||
"https://raw.githubusercontent.com/gradle/gradle/v${VER}/gradle/wrapper/gradle-wrapper.jar"
|
||||
|
||||
- name: set up android signing keystore
|
||||
env:
|
||||
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
|
||||
ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
|
||||
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
|
||||
run: |
|
||||
printf '%s' "$ANDROID_KEYSTORE_BASE64" | base64 -d > src-tauri/gen/android/app/release.keystore
|
||||
cat > src-tauri/gen/android/app/key.properties <<EOF
|
||||
keyAlias=$ANDROID_KEY_ALIAS
|
||||
keyPassword=$ANDROID_KEYSTORE_PASSWORD
|
||||
storeFile=release.keystore
|
||||
storePassword=$ANDROID_KEYSTORE_PASSWORD
|
||||
EOF
|
||||
|
||||
- name: build Android APK
|
||||
env:
|
||||
ANDROID_NDK_HOME: ${{ env.ANDROID_HOME }}/ndk/28.2.13676358
|
||||
NDK_HOME: ${{ env.ANDROID_HOME }}/ndk/28.2.13676358
|
||||
run: npx tauri android build --target aarch64
|
||||
|
||||
- name: upload APK
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: android-apk
|
||||
path: src-tauri/gen/android/app/build/outputs/apk/universal/release/*.apk
|
||||
|
||||
publish-flatpak:
|
||||
needs: [get-version, build-goldmapper, build-appimage, build-android]
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
container:
|
||||
image: bilelmoussaoui/flatpak-github-actions:freedesktop-23.08
|
||||
options: --privileged
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: download GoldMapper
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: goldmapper
|
||||
path: src-tauri/resources
|
||||
- name: sleep for 20 seconds
|
||||
run: sleep 20
|
||||
- uses: flatpak/flatpak-github-actions/flatpak-builder@v6
|
||||
with:
|
||||
bundle: emerald.flatpak
|
||||
manifest-path: flatpak/io.github.Emerald_Legacy_Launcher.Emerald_Legacy_Launcher.yml
|
||||
cache-key: flatpak-builder-${{ github.sha }}
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: appimage
|
||||
path: appimage
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: android-apk
|
||||
path: android
|
||||
- uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
body: ${{ needs.get-version.outputs.body }}
|
||||
tag_name: v${{ needs.get-version.outputs.version }}
|
||||
files: |
|
||||
emerald.flatpak
|
||||
appimage/*.AppImage*
|
||||
android/*.apk
|
||||
draft: true
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
47
.github/workflows/update-homebrew-stable.yml
vendored
|
|
@ -1,47 +0,0 @@
|
|||
name: Update Homebrew Cask (Stable)
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
update-cask:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: main
|
||||
|
||||
- name: Download release assets and update homebrew files
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
TAG="${{ github.event.release.tag_name }}"
|
||||
VERSION="${TAG#v}"
|
||||
echo "Processing tag $TAG (version: $VERSION)"
|
||||
|
||||
mkdir -p dist
|
||||
# Download the Intel dmg, Apple Silicon dmg, and Linux AppImage
|
||||
gh release download "$TAG" --dir dist --pattern "*_x64.dmg" --pattern "*_aarch64.dmg" --pattern "*_amd64.AppImage" -R "${{ github.repository }}"
|
||||
ls -l dist
|
||||
|
||||
# Calculate hashes
|
||||
INTEL_HASH=$(sha256sum dist/*_x64.dmg | cut -d' ' -f1)
|
||||
ARM_HASH=$(sha256sum dist/*_aarch64.dmg | cut -d' ' -f1)
|
||||
LINUX_HASH=$(sha256sum dist/*_amd64.AppImage | cut -d' ' -f1)
|
||||
|
||||
echo "Intel SHA: $INTEL_HASH"
|
||||
echo "ARM SHA: $ARM_HASH"
|
||||
echo "Linux SHA: $LINUX_HASH"
|
||||
|
||||
python3 scripts/update-homebrew.py --type stable --version "$VERSION" --intel-hash "$INTEL_HASH" --arm-hash "$ARM_HASH" --linux-hash "$LINUX_HASH"
|
||||
|
||||
- name: Commit and push changes
|
||||
run: |
|
||||
git config --global user.name "github-actions[bot]"
|
||||
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||
git add Casks/ Formula/
|
||||
git diff --quiet && git diff --staged --quiet || (git commit -m "chore: update stable Homebrew casks/formula [skip ci]" && git push origin main)
|
||||
41
.github/workflows/update-nix-stable.yml
vendored
|
|
@ -1,41 +0,0 @@
|
|||
name: Update Nix Flake (Stable)
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
update-flake:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: main
|
||||
|
||||
- uses: DeterminateSystems/nix-installer-action@main
|
||||
|
||||
- name: Prefetch release source and update flake.nix
|
||||
run: |
|
||||
TAG="${{ github.event.release.tag_name }}"
|
||||
VERSION="${TAG#v}"
|
||||
echo "Processing tag $TAG (version: $VERSION)"
|
||||
|
||||
BASE32_HASH=$(nix-prefetch-url --unpack \
|
||||
"https://github.com/LCE-Hub/LCE-Emerald-Launcher/archive/refs/tags/${TAG}.tar.gz")
|
||||
SRC_HASH=$(nix hash to-sri --type sha256 "$BASE32_HASH")
|
||||
|
||||
echo "stableSrcHash: $SRC_HASH"
|
||||
python3 scripts/update-nix-stable.py --version "$VERSION" --src-hash "$SRC_HASH"
|
||||
|
||||
- name: Commit and push changes
|
||||
run: |
|
||||
git config --global user.name "github-actions[bot]"
|
||||
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||
git add flake.nix
|
||||
git diff --quiet && git diff --staged --quiet || (
|
||||
git commit -m "chore: update Nix stable pin to ${{ github.event.release.tag_name }} [skip ci]" &&
|
||||
git push origin main
|
||||
)
|
||||
45
.gitignore
vendored
|
|
@ -1,17 +1,10 @@
|
|||
# Rust
|
||||
/src-tauri/target/
|
||||
/src-tauri/tests
|
||||
|
||||
# Node
|
||||
/node_modules/
|
||||
/dist/
|
||||
/npm-debug.log*
|
||||
/yarn-debug.log*
|
||||
/yarn-error.log*
|
||||
/lerna-debug.log*
|
||||
/.pnpm-debug.log*
|
||||
|
||||
# Editor directories and files
|
||||
/build/
|
||||
/build-*/
|
||||
/cmake-build-*/
|
||||
/out/
|
||||
compile_commands.json
|
||||
.cache/
|
||||
/old
|
||||
.vscode*
|
||||
.idea*
|
||||
*.suo
|
||||
|
|
@ -19,29 +12,13 @@
|
|||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
||||
# System files
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Nix
|
||||
/result
|
||||
/result-*
|
||||
|
||||
# Log files
|
||||
*.log
|
||||
|
||||
/build-flatpak
|
||||
/.flatpak-builder
|
||||
/*.flatpak
|
||||
/emerald-repo
|
||||
/ignore/*
|
||||
|
||||
# GoldMapper binaries (generated by pnpm goldmapper)
|
||||
/src-tauri/resources/GoldMapperLib.dll
|
||||
/src-tauri/resources/GoldMapperLauncher.exe
|
||||
|
||||
# Android bundled runtime assets (too large for GitHub; must be present in the working tree)
|
||||
/src-tauri/gen/android/app/src/main/assets/imagefs.tar.zst
|
||||
/src-tauri/gen/android/app/src/main/assets/proton-*.tar.zst
|
||||
/resources/GoldMapperLib.dll
|
||||
/resources/GoldMapperLauncher.exe
|
||||
#/src-tauri/gen/android/app/src/main/assets/imagefs.tar.zst
|
||||
#/src-tauri/gen/android/app/src/main/assets/proton-*.tar.zst
|
||||
|
||||
|
|
|
|||
3
.gitmodules
vendored
|
|
@ -7,3 +7,6 @@
|
|||
[submodule "GoldMapper"]
|
||||
path = GoldMapper
|
||||
url = https://github.com/LCE-Hub/GoldMapper
|
||||
[submodule "src/discord_ipc_cpp"]
|
||||
path = src/discord_ipc_cpp
|
||||
url = https://github.com/LCE-Hub/discordipc
|
||||
48
BUILDING.md
|
|
@ -1,48 +0,0 @@
|
|||
# Building Emerald Launcher
|
||||
## Requirements
|
||||
|
||||
- Node.js (and NPM)
|
||||
- Rust
|
||||
- WebKit2GTK-4.1 (GNU/Linux only)
|
||||
- WebKit (macOS only, preinstalled)
|
||||
- Microsoft Edge WebView2 Runtime (Windows only)
|
||||
- PNPM (optional, but recommended)
|
||||
- Windows, GNU/Linux or a macOS system.
|
||||
|
||||
## Building
|
||||
|
||||
```sh
|
||||
pnpm install # or npm
|
||||
pnpm tauri build # or npm
|
||||
```
|
||||
|
||||
## macOS ARM Fix
|
||||
|
||||
If you encounter "application is damaged" error on macOS ARM, the build process now includes automatic fixes. If manual intervention is needed:
|
||||
|
||||
```sh
|
||||
# Remove quarantine attributes
|
||||
xattr -cr /path/to/Emerald\ Legacy\ Launcher.app
|
||||
|
||||
# Apply ad-hoc signature
|
||||
codesign --force --deep --sign - "/path/to/Emerald\ Legacy\ Launcher.app"
|
||||
```
|
||||
|
||||
## Flatpak
|
||||
|
||||
```sh
|
||||
pnpm flatpak # or npm
|
||||
```
|
||||
|
||||
## Gentoo
|
||||
|
||||
A Portage overlay lives in [`gentoo/`](gentoo/). See the GNU/Linux installation section in [README.md](README.md).
|
||||
|
||||
## Android
|
||||
|
||||
Building Emerald on Android is pretty easy,
|
||||
|
||||
```sh
|
||||
pnpm android:assets #neo: fetches the rootfs and proton11
|
||||
pnpm tauri android build -t aarch64
|
||||
```
|
||||
27
CMakeLists.txt
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
cmake_minimum_required(VERSION 3.24)
|
||||
project(EmeraldLegacyLauncher
|
||||
VERSION 2.0.0
|
||||
DESCRIPTION "LCE Emerald Launcher" #neo: very descriptive ikr
|
||||
LANGUAGES CXX
|
||||
)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
option(EMERALD_USE_SYSTEM_DEPS "Prefer system-installed dependencies over FetchContent" ON)
|
||||
option(EMERALD_WARNINGS_AS_ERRORS "Treat compiler warnings as errors" OFF)
|
||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||
set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type" FORCE)
|
||||
endif()
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
||||
include(cmake/Dependencies.cmake)
|
||||
include(cmake/CompilerWarnings.cmake)
|
||||
set(EMERALD_RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/resources")
|
||||
set(EMERALD_PUBLIC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/public")
|
||||
set(EMERALD_UI_DOCS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/UiDocs")
|
||||
add_subdirectory(src)
|
||||
target_compile_definitions(emerald_core PUBLIC
|
||||
EMERALD_VERSION_TEXT="v${CMAKE_PROJECT_VERSION}")
|
||||
target_compile_definitions(emerald_core PUBLIC
|
||||
EMERALD_VERSION="${CMAKE_PROJECT_VERSION}")
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
# Contributing to LCE Emerald Launcher
|
||||
|
||||
Thank you for considering contributing to Emerald! We appreciate all types of contributions, including bug fixes, new features, and documentation improvements.
|
||||
|
||||
Before you start contributing, please take a moment to review the guidelines outlined here. This ensures a smooth collaboration and helps maintain the project's quality.
|
||||
|
||||
## Note
|
||||
This file is a modified copy of the [4JCraft CONTRIBUTING.md](https://github.com/4jcraft/4jcraft/blob/dev/CONTRIBUTING.md) file. I felt the need to credit them lol
|
||||
|
||||
## How to Contribute
|
||||
|
||||
There are several ways you can contribute:
|
||||
|
||||
- **Report Bugs:** If you find a bug, please open an issue to describe the problem.
|
||||
- **Feature Requests:** If you have an idea for a new feature, feel free to suggest it by opening an issue.
|
||||
- **Submit Code:** If you want to contribute code, fork the repository, create a new branch, and submit a pull request.
|
||||
|
||||
Make sure to follow the guidelines below when submitting code or issues.
|
||||
|
||||
## Submitting code
|
||||
|
||||
If you are submitting a pull request to this repository, here are some guidelines to keep in mind.
|
||||
|
||||
### Test your changes.
|
||||
|
||||
Please run the game and make sure your code runs as expected before marking a pull request ready for review.
|
||||
|
||||
### Keep scope to a minimum.
|
||||
|
||||
Pull requests should ideally do one thing in one place. Avoiding opening massive pull requests that change multiple components of the launcher. These are often not reviewable and result in unmanageable conflicts with other active PRs.
|
||||
|
||||
### Use common sense with commits.
|
||||
|
||||
Commit names should clearly describe what was changed in the commit. [Conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) are generally appreciated, but by no means required. Similar to pull requests, commits should ideally be limited in scope and easy to track over time.
|
||||
|
||||
### Try to fix the cause, not the effect.
|
||||
|
||||
If you are fixing a bug, avoid submitting "hacks" that attempt to patch the effects of the bug rather than the root cause.
|
||||
|
||||
> Exceptions to this rule may apply depending on the severity of the bug, provided that the code is clearly commented as a hack with a relevant `// <your-username>:` comment.
|
||||
|
||||
### Don't submit code written by AI.
|
||||
|
||||
Submitting code to this repository authored by generative AI tools (LLMs, agentic coding tools, etc...) is strictly forbidden. Pull requests that are clearly vibe-coded or written by an LLM will be closed.
|
||||
|
||||
> **Rationale:** Contributors are expected to both fully understand the code that they write **and** have the necessary skills to *maintain it*. Opening PRs containing code that you did not write yourself more often than not fails to meet either of these expectations, therefore it is disallowed.
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
cask "lce-emerald-launcher" do
|
||||
version "1.6.1"
|
||||
sha256 intel: "dd86c3f63088585f71ab94acd7c3e3ec0b535fc06ef71e7770741e08fe60782f",
|
||||
arm: "e2e6c50a5b0b847ed7c857ab8a4ae421fa8666096f3c9fa8bb216f21639dcfd2"
|
||||
|
||||
url "https://github.com/LCE-Hub/LCE-Emerald-Launcher/releases/download/v#{version}/LCE.Emerald.Launcher_#{version}_#{arch}.dmg"
|
||||
name "LCE Emerald Launcher"
|
||||
desc "Minecraft Legacy Console Edition Launcher"
|
||||
homepage "https://github.com/LCE-Hub/LCE-Emerald-Launcher"
|
||||
|
||||
app "LCE Emerald Launcher/LCE Emerald Launcher.app"
|
||||
|
||||
zap trash: [
|
||||
"~/Library/Application Support/com.emerald.legacy",
|
||||
"~/Library/Preferences/com.emerald.legacy.plist",
|
||||
"~/Library/Saved Application State/com.emerald.legacy.savedState",
|
||||
]
|
||||
end
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
class LceEmeraldLauncher < Formula
|
||||
desc "Minecraft Legacy Console Edition Launcher"
|
||||
homepage "https://github.com/LCE-Hub/LCE-Emerald-Launcher-cask"
|
||||
url "https://github.com/LCE-Hub/LCE-Emerald-Launcher/releases/download/v#{version}/LCE.Emerald.Launcher_#{version}_amd64.AppImage"
|
||||
sha256 "3f135df96014e6bf83ced13a89ba2ec4599532104e60aea97c45d1d246de62f2"
|
||||
version "1.6.1"
|
||||
license "GPL-3.0-only"
|
||||
|
||||
depends_on :linux
|
||||
|
||||
def install
|
||||
# Rename and install the AppImage
|
||||
bin.install "LCE.Emerald.Launcher_#{version}_amd64.AppImage" => "lce-emerald-launcher"
|
||||
end
|
||||
|
||||
test do
|
||||
assert_predicate bin/"lce-emerald-launcher", :exist?
|
||||
end
|
||||
end
|
||||
|
|
@ -1,3 +1,6 @@
|
|||
> [!IMPORTANT]
|
||||
> This branch is for **Project Radium**, a rewrite of the Emerald Launcher in C++ with SDL3 and it's own UI system.
|
||||
|
||||
<div align="center">
|
||||
<img height="150" src="https://raw.githubusercontent.com/LCE-Hub/LCE-Emerald-Launcher/refs/heads/main/public/images/icon.png" alt="LCE Emerald Launcher Logo">
|
||||
<h1>LCE Emerald Launcher</h1>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 2.1 MiB |
|
|
@ -1,25 +0,0 @@
|
|||

|
||||
|
||||
- Fix title bar and panorama not showing on setup
|
||||
- **Partnership with LapboardMC!**
|
||||
- **Removed LCEOnline Client, LCEOnline functionality is built into Emerald**
|
||||
- Fix audio skipping bug on Windows
|
||||
- Gentoo, Nix flakes and Homebrew support
|
||||
- **Xbox 360, PS3 and Java -> LCE world importing support (beta!)**
|
||||
- Proper Discord RPC shutdown
|
||||
- Remove click effects when disabling animations
|
||||
- **FULL Android Port powered by our own DiamondRuntime for running the game!**
|
||||
- Fix neoLegacy downloading issue
|
||||
- **A lot of UI polish (thanks piebot!)**
|
||||
- Add 2 default capes
|
||||
- Add more default skins
|
||||
- **Emerald Arguments.Schema support!**
|
||||
- **Partnership with Amythest LCE**
|
||||
- Fix Slim skins rendering in-launcher
|
||||
- Randomize splash texts
|
||||
- **Partnership with Project Lost Legacy (soon!)**
|
||||
- Add Player Head to Discord RPC
|
||||
- Make skin face inwards instead of outwards
|
||||
- Game crash log viewer support!
|
||||
- **Intel macOS support**
|
||||
- And more that I forgot!
|
||||
49
UiDocs/Common/Buttons.xml
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
<ui xmlns="emerald" version="1">
|
||||
<style>
|
||||
.button {
|
||||
border-image: url(/images/Button_Background.png) 13 13 13 13 fill / 13px;
|
||||
border-width: 12px;
|
||||
color: #e6f2e6;
|
||||
font-size: 20px;
|
||||
}
|
||||
.button:hover {
|
||||
border-image: url(/images/button_highlighted.png) 13 13 13 13 fill / 13px;
|
||||
border-width: 12px;
|
||||
color: #ffff55;
|
||||
}
|
||||
|
||||
.button-wrapper { width: 100%;}
|
||||
.main-button {
|
||||
width: 90%;
|
||||
height: 44px;
|
||||
font-size: 20px;
|
||||
color: #ffffff;
|
||||
text-shadow: #3f3f3f 2px 2px;
|
||||
border-image: url(/images/Button_Background.png) 13 13 13 13 fill / 13px;
|
||||
border-width: 12px;
|
||||
}
|
||||
.main-button:hover {
|
||||
border-image: url(/images/button_highlighted.png) 13 13 13 13 fill / 13px;
|
||||
color: #ffff55;
|
||||
}
|
||||
.main-button.disabled {
|
||||
opacity: 0.5;
|
||||
color: #808080;
|
||||
}
|
||||
.main-button-danger { color: #ff5555; }
|
||||
.main-button-danger:hover { color: #ff8080; }
|
||||
</style>
|
||||
<template name="MenuButton">
|
||||
<button class="button" onclick="{{action}}">
|
||||
<label class="buttonlabel" text="{{label}}"/>
|
||||
</button>
|
||||
</template>
|
||||
|
||||
<template name="HomeButton">
|
||||
<column class="button-wrapper" align="center">
|
||||
<button class="main-button {{extraclasses}}" onclick="{{action}}" align="center">
|
||||
<label class="main-button-label" text="{{label}}"/>
|
||||
</button>
|
||||
</column>
|
||||
</template>
|
||||
</ui>
|
||||
15
UiDocs/Common/Slider.xml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
<ui xmlns="emerald" version="1">
|
||||
<style>
|
||||
.slider {
|
||||
width: 600px;
|
||||
height: 42px;
|
||||
font-size: 18px;
|
||||
color: #ffffff;
|
||||
background-image: /images/Button_Background2.png;
|
||||
}
|
||||
.slider:hover {color: #ffff55;}
|
||||
</style>
|
||||
<template name="Slider">
|
||||
<slider class="slider" label="{{label}}" value="{{value}}" onchange="{{onchange}}" width="600px" height="42px"/>
|
||||
</template>
|
||||
</ui>
|
||||
12
UiDocs/Common/TextInput.xml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<ui xmlns="emerald" version="1">
|
||||
<style>
|
||||
.settings-text {
|
||||
width: 600px;
|
||||
font-size: 18px;
|
||||
color: #ffffff;
|
||||
}
|
||||
</style>
|
||||
<template name="TextInput">
|
||||
<textinput class="textinput" label="{{label}}" value="{{value}}" onsubmit="{{onsubmit}}" multiline="{{multiline}}" width="600px"/>
|
||||
</template>
|
||||
</ui>
|
||||
5
UiDocs/Common/TitleImage.xml
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<ui xmlns="emerald" version="1">
|
||||
<template name="TitleImage">
|
||||
<image src="{{titleImage}}" width="560px" height="140px" align="center" fit="contain"/>
|
||||
</template>
|
||||
</ui>
|
||||
160
UiDocs/Credits.xml
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
<ui xmlns="emerald" version="1">
|
||||
<style>
|
||||
.credits-back {
|
||||
background-image: /images/Layout_Button_Bmp.png;
|
||||
font-size: 20px;
|
||||
color: #ffffff;
|
||||
text-shadow: #3f3f3f 1px 1px;
|
||||
}
|
||||
.credits-back:hover {
|
||||
background-image: /images/Layout_Button_Over.png;
|
||||
color: #FFFF55;
|
||||
}
|
||||
.credit-logo {
|
||||
width: 827.475px;
|
||||
height: 80px;
|
||||
}
|
||||
.credit-cat {
|
||||
font-size: 30px;
|
||||
line-height: 36px;
|
||||
letter-spacing: 0.75px;
|
||||
font-weight: bold;
|
||||
text-shadow: #000000 2px 2px;
|
||||
}
|
||||
.credit-cat-icon {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
}
|
||||
.credit-team { color: #50C878; }
|
||||
.credit-lce { color: #9B59B6; }
|
||||
.credit-thanks { color: #FFD700; }
|
||||
.credit-sub {
|
||||
font-size: 24px;
|
||||
line-height: 32px;
|
||||
letter-spacing: 1.2px;
|
||||
color: #ffffffE6;
|
||||
text-shadow: #3f3f3f 1px 1px;
|
||||
}
|
||||
.credit-booster { color: #FF69B4; }
|
||||
.credit-sub-icon {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
.credit-role {
|
||||
font-size: 18px;
|
||||
line-height: 28px;
|
||||
letter-spacing: 0.9px;
|
||||
color: #ffffffB3;
|
||||
text-shadow: #3f3f3f 1px 1px;
|
||||
}
|
||||
.credit-member {
|
||||
font-size: 24px;
|
||||
line-height: 32px;
|
||||
color: #e2cc4c;
|
||||
text-shadow: #000000 2px 2px;
|
||||
}
|
||||
.credit-project {
|
||||
font-size: 18px;
|
||||
line-height: 28px;
|
||||
letter-spacing: 0.9px;
|
||||
color: #ffffff99;
|
||||
text-shadow: #3f3f3f 1px 1px;
|
||||
}
|
||||
.credit-subrole {
|
||||
font-size: 16px;
|
||||
line-height: 24px;
|
||||
letter-spacing: 0.8px;
|
||||
color: #ffffff80;
|
||||
text-shadow: #3f3f3f 1px 1px;
|
||||
}
|
||||
.credit-member-slim {
|
||||
font-size: 20px;
|
||||
line-height: 28px;
|
||||
color: #e2cc4c;
|
||||
text-shadow: #000000 2px 2px;
|
||||
}
|
||||
.credit-badge {
|
||||
width: 256px;
|
||||
padding: 12px;
|
||||
background: #ffffff;
|
||||
}
|
||||
.credit-badge-image {
|
||||
width: 232px;
|
||||
height: 232px;
|
||||
}
|
||||
.credit-disclaimer {
|
||||
font-size: 14px;
|
||||
line-height: 20px;
|
||||
letter-spacing: 0.35px;
|
||||
color: #ffffff99;
|
||||
text-shadow: #3f3f3f 1px 1px;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
<view id="credits">
|
||||
<tooltip icon="A">Select</tooltip>
|
||||
<tooltip icon="B">Back</tooltip>
|
||||
<scroll width="1280px" height="720px" autoscroll="60" autoscroll-from="50" autoscroll-to="-200">
|
||||
<column gap="32">
|
||||
<image class="credit-logo" src="/images/emerald_launcher.png" margin-top="80" align="center"/>
|
||||
<column foreach="{{credits}}" gap="32" as="cat">
|
||||
<column align="center">
|
||||
<column class="credit-category" align="center" gap="24">
|
||||
<row align="center" gap="12">
|
||||
<image class="credit-cat-icon" src="{{cat.icon}}" fit="contain" align="center" if="{{cat.icon}}"/>
|
||||
<label class="credit-cat {{cat.class}}" text="{{cat.category}}" align="center"/>
|
||||
</row>
|
||||
<column foreach="{{cat.subcategories}}" gap="16" as="sub">
|
||||
<column align="center" gap="12">
|
||||
<row align="center" gap="12">
|
||||
<image class="credit-sub-icon" src="{{sub.icon}}" fit="contain" align="center" if="{{sub.icon}}"/>
|
||||
<label class="credit-sub {{sub.class}}" text="{{sub.name}}" align="center"/>
|
||||
</row>
|
||||
<column align="center" gap="8">
|
||||
<column foreach="{{sub.roles}}" gap="8" as="role">
|
||||
<column align="center" gap="8">
|
||||
<label class="credit-role" text="{{role.role}}" if="{{role.role}}" align="center"/>
|
||||
<column foreach="{{role.members}}" gap="8" as="member">
|
||||
<label class="credit-member" text="{{member.name}}" onclick="open:{{member.url}}" align="center"/>
|
||||
</column>
|
||||
</column>
|
||||
</column>
|
||||
<column if="{{sub.subprojects}}" align="center" margin-top="16">
|
||||
<column foreach="{{sub.subprojects}}" gap="12" as="project">
|
||||
<column class="credit-project" align="center" gap="8">
|
||||
<label class="credit-project" text="{{project.name}}" align="center"/>
|
||||
<column foreach="{{project.roles}}" gap="8" as="srole">
|
||||
<column align="center" gap="8">
|
||||
<label class="credit-subrole" text="{{srole.role}}" if="{{srole.role}}" align="center"/>
|
||||
<column foreach="{{srole.members}}" gap="8" as="member">
|
||||
<label class="credit-member-slim" text="{{member.name}}" onclick="open:{{member.url}}" align="center"/>
|
||||
</column>
|
||||
</column>
|
||||
</column>
|
||||
</column>
|
||||
</column>
|
||||
</column>
|
||||
</column>
|
||||
</column>
|
||||
</column>
|
||||
</column>
|
||||
</column>
|
||||
</column>
|
||||
<row align="center" gap="24" margin-top="48">
|
||||
<column class="credit-badge" align="center">
|
||||
<image class="credit-badge-image" src="/images/LCE Team.png" fit="contain"/>
|
||||
</column>
|
||||
<column class="credit-badge" align="center">
|
||||
<image class="credit-badge-image" src="/images/emerald_block.png" fit="contain"/>
|
||||
</column>
|
||||
</row>
|
||||
<column align="center" margin-top="32" margin-bottom="80">
|
||||
<label class="credit-disclaimer" width="1280px" text="MINECRAFT IS A TRADEMARK OF MOJANG SYNERGIES AB. THIS PROJECT IS NOT AFFILIATED WITH, ENDORSED BY, SPONSORED BY, OR SPECIFICALLY APPROVED BY MOJANG, MICROSOFT, OR 4J STUDIOS."/>
|
||||
</column>
|
||||
</column>
|
||||
</scroll>
|
||||
<button class="credits-back" style="position:absolute;left:40px;top:628px" height="40px" padding="16" onclick="go:home">
|
||||
<label text="{{t:credits.backToMenu}}"/>
|
||||
</button>
|
||||
</view>
|
||||
</ui>
|
||||
36
UiDocs/Home.xml
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
<ui xmlns="emerald" version="1">
|
||||
<import href="Common/Buttons.xml"/>
|
||||
<import href="Common/TitleImage.xml"/>
|
||||
<style>
|
||||
.home-container { width: 540px; gap: 12px; }
|
||||
.buttons {width: 100%; gap: 12px; }
|
||||
.divider { width: 192px; height: 3px; background: #a0a0a0; opacity: 0.6; align: center; }
|
||||
.social-row { gap: 32px; align: center; }
|
||||
.social-icon { width: 64px; height: 64px; }
|
||||
.spacer { height: 18px; }
|
||||
</style>
|
||||
<view id="home">
|
||||
<tooltip icon="A">Select</tooltip>
|
||||
<column width="1280px" height="720px" align="center" justify="center" padding="40">
|
||||
<use template="TitleImage"/>
|
||||
<column height="50px"/>
|
||||
<column class="home-container" align="center">
|
||||
<column class="buttons" align="center">
|
||||
<use if="{{showPlay}}" template="HomeButton" action="versions.launch:{{profile}}" label="{{t:home.playGame}}"/>
|
||||
<use if="{{showStop}}" template="HomeButton" extraclasses="main-button-danger" action="versions.stop:{{profile}}" label="{{t:home.stopGame}}"/>
|
||||
<use template="HomeButton" action="go:settings" label="{{t:home.helpAndOptions}}"/>
|
||||
<use template="HomeButton" action="go:versions" label="{{t:home.versions}}"/>
|
||||
<use template="HomeButton" action="quit" label="{{t:home.workshop}}"/> <!--neo: TODO-->
|
||||
<use template="HomeButton" action="quit" label="{{t:home.developerTools}}"/> <!--neo: TODO-->
|
||||
</column>
|
||||
<column class="spacer"/>
|
||||
<column class="divider"/>
|
||||
<column class="spacer"/>
|
||||
<row class="social-row">
|
||||
<image class="social-icon" src="/images/discord.png"/>
|
||||
<image class="social-icon" src="/images/github.png"/>
|
||||
</row>
|
||||
</column>
|
||||
</column>
|
||||
</view>
|
||||
</ui>
|
||||
218
UiDocs/Settings.xml
Normal file
|
|
@ -0,0 +1,218 @@
|
|||
<ui xmlns="emerald" version="1">
|
||||
<import href="Common/TitleImage.xml"/>
|
||||
<import href="Common/Slider.xml"/>
|
||||
<import href="Common/TextInput.xml"/>
|
||||
<style>
|
||||
.settings-root { align: center; }
|
||||
.settings-main-btn {
|
||||
width: 480px;
|
||||
height: 42px;
|
||||
font-size: 20px;
|
||||
color: #ffffff;
|
||||
text-shadow: #3f3f3f 2px 2px;
|
||||
border-image: url(/images/Button_Background.png) 13 13 13 13 fill / 13px;
|
||||
border-width: 12px;
|
||||
}
|
||||
.settings-main-btn:hover {
|
||||
border-image: url(/images/button_highlighted.png) 13 13 13 13 fill / 13px;
|
||||
color: #ffff55;
|
||||
}
|
||||
.settings-main-label {
|
||||
color: #ffffff;
|
||||
font-size: 20px;
|
||||
text-shadow: #3f3f3f 2px 2px;
|
||||
}
|
||||
.settings-main-label:hover { color: #ffff55; }
|
||||
.settings-panel-bg {
|
||||
border-image: url("/images/options_background.png") 4 fill;
|
||||
border-width: 12px;
|
||||
}
|
||||
.settings-row-btn {
|
||||
width: 600px;
|
||||
height: 42px;
|
||||
font-size: 20px;
|
||||
color: #333333;
|
||||
border-image: url(/images/Button_Background.png) 13 13 13 13 fill / 13px;
|
||||
border-width: 12px;
|
||||
}
|
||||
.settings-row-btn:hover {
|
||||
border-image: url(/images/button_highlighted.png) 13 13 13 13 fill / 13px;
|
||||
color: #ffff55;
|
||||
}
|
||||
|
||||
.settings-toggle {
|
||||
width: 600px;
|
||||
height: 42px;
|
||||
font-size: 20px;
|
||||
color: #333333;
|
||||
border-width: 12px;
|
||||
}
|
||||
.settings-toggle:hover {
|
||||
color: #ffff55;
|
||||
}
|
||||
|
||||
.settings-row-btn.settings-cat {
|
||||
font-size: 23px;
|
||||
color: #ffffff;
|
||||
border-image: url(/images/Button_Background.png) 13 13 13 13 fill / 13px;
|
||||
border-width: 12px;
|
||||
}
|
||||
.settings-row-btn.settings-cat:hover { color: #ffff55; }
|
||||
.settings-row-btn.row-red { color: #ff5555; }
|
||||
.settings-row-btn.row-red:hover { color: #ff8080; }
|
||||
.settings-row-label {
|
||||
color: #ffffff;
|
||||
font-size: 20px;
|
||||
}
|
||||
.settings-row-label:hover { color: #ffff55; }
|
||||
.settings-checkbox-base:hover {
|
||||
background-image: /images/checkbox_highlighted.png;
|
||||
}
|
||||
.settings-checkmark {
|
||||
position: absolute;
|
||||
left: 1px;
|
||||
top: -3px;
|
||||
width: 26px;
|
||||
height: 26px;
|
||||
}
|
||||
|
||||
.backdrop { background: rgba(0, 0, 0, 0.8); }
|
||||
.modal-frame {
|
||||
border-image: url(/images/frame_background.png) 13 13 13 13 fill / 13px;
|
||||
border-width: 12px;
|
||||
font-size: 18px;
|
||||
}
|
||||
.modal-title { color: #ffff55; font-size: 22px; }
|
||||
.modal-desc { color: #aaaaaa; font-size: 13px; }
|
||||
.modal-btn {
|
||||
width: 140px;
|
||||
height: 40px;
|
||||
font-size: 18px;
|
||||
color: #ffffff;
|
||||
border-image: url(/images/Button_Background.png) 13 13 13 13 fill / 13px;
|
||||
border-width: 12px;
|
||||
}
|
||||
.modal-btn:hover {
|
||||
border-image: url(/images/button_highlighted.png) 13 13 13 13 fill / 13px;
|
||||
color: #ffff55;
|
||||
}
|
||||
</style>
|
||||
<view id="settings">
|
||||
<tooltip icon="A">Select</tooltip>
|
||||
<tooltip icon="B">Back</tooltip>
|
||||
<column class="settings-root" align="center" width="100%" height="100%" padding="40">
|
||||
<use template="TitleImage"/>
|
||||
<column height="40px" />
|
||||
<column if="{{mainLayout}}" align="center" gap="8" width="100%" height="100%">
|
||||
<column id="settings-main-list" foreach="{{items}}" as="item" gap="6" align="center" width="480px">
|
||||
<button if="{{item.isButton}}" class="settings-main-btn {{item.rowClass}}" onclick="{{item.onclick}}" width="480px" height="42px">
|
||||
<label class="settings-main-label" text="{{item.label}}"/>
|
||||
</button>
|
||||
<row if="{{item.isToggle}}" class="settings-main-btn" onclick="{{item.onclick}}" width="480px" height="42px" gap="0">
|
||||
<label class="settings-main-label" text="{{item.label}}" flex="1" align="center"/>
|
||||
<image src="{{item.checkSrc}}" width="24px" height="24px" align="center"/>
|
||||
</row>
|
||||
</column>
|
||||
</column>
|
||||
<column if="{{panelLayout}}" class="settings-panel-bg" align="center">
|
||||
<scroll width="600px" max-height="520px">
|
||||
<column id="settings-panel-rows" foreach="{{items}}" as="item" gap="4" align="center" width="600px">
|
||||
<button if="{{item.isButton}}" class="settings-row-btn {{item.rowClass}}" onclick="{{item.onclick}}" width="600px" height="42px">
|
||||
<label class="settings-row-label" text="{{item.label}}"/>
|
||||
</button>
|
||||
<row if="{{item.isToggle}}" class="settings-toggle" onclick="{{item.onclick}}" width="600px" height="42px" gap="0">
|
||||
<row class="settings-checkbox" width="24px" height="24px">
|
||||
<image class="settings-checkbox-base" src="/images/checkbox.png" width="24px" height="24px" align="center"/>
|
||||
<image if="{{item.checked}}" class="settings-checkmark" src="/images/check.png"/>
|
||||
</row>
|
||||
<column width="4px"/>
|
||||
<label text="{{item.label}}" flex="1" align="center"/>
|
||||
</row>
|
||||
<use template="Slider" if="{{item.isSlider}}" label="{{item.label}}" value="{{item.value}}" onchange="{{item.onchange}}"/>
|
||||
<use template="TextInput" if="{{item.isText}}" label="{{item.label}}" value="{{item.value}}" onsubmit="{{item.onsubmit}}"/>
|
||||
</column>
|
||||
</scroll>
|
||||
</column>
|
||||
<column class="backdrop" if="{{argsModal}}" style="position:absolute;left:0px;top:0px;width:1280px;height:720px" onclick="settings.modal.cancel">
|
||||
<column class="modal-frame" style="position:absolute;left:440px;top:180px;width:400px" align="center" gap="8">
|
||||
<label class="modal-title" text="{{t:settings.extraLaunchArgs}}"/>
|
||||
<label class="modal-desc" text="{{extraArgsDesc}}"/>
|
||||
<use template="TextInput" value="{{argsValue}}" width="360px"/>
|
||||
<row align="center" gap="20">
|
||||
<button class="modal-btn" onclick="settings.modal.cancel">
|
||||
<label text="{{cancelLabel}}"/>
|
||||
</button>
|
||||
<button class="modal-btn" onclick="settings.modal.save:args">
|
||||
<label text="{{saveLabel}}"/>
|
||||
</button>
|
||||
</row>
|
||||
</column>
|
||||
</column>
|
||||
<column class="backdrop" if="{{prefixModal}}" style="position:absolute;left:0px;top:0px;width:1280px;height:720px" onclick="settings.modal.cancel">
|
||||
<column class="modal-frame" style="position:absolute;left:440px;top:180px;width:400px" align="center" gap="8">
|
||||
<label class="modal-title" text="{{t:settings.launchPrefix}}"/>
|
||||
<label class="modal-desc" text="{{launchPrefixDesc}}"/>
|
||||
<use template="TextInput" value="{{prefixValue}}"/>
|
||||
<row align="center" gap="20">
|
||||
<button class="modal-btn" onclick="settings.modal.cancel">
|
||||
<label text="{{cancelLabel}}"/>
|
||||
</button>
|
||||
<button class="modal-btn" onclick="settings.modal.save:prefix">
|
||||
<label text="{{saveLabel}}"/>
|
||||
</button>
|
||||
</row>
|
||||
</column>
|
||||
</column>
|
||||
|
||||
<column class="backdrop" if="{{envModal}}" style="position:absolute;left:0px;top:0px;width:1280px;height:720px" onclick="settings.modal.cancel">
|
||||
<column class="modal-frame" style="position:absolute;left:440px;top:150px;width:400px" align="center" gap="8">
|
||||
<label class="modal-title" text="{{t:settings.launchEnvVars}}"/>
|
||||
<label class="modal-desc" text="{{launchEnvVarsDesc}}"/>
|
||||
<use template="TextInput" value="{{envValue}}" multiline="true"/>
|
||||
<row align="center" gap="20">
|
||||
<button class="modal-btn" onclick="settings.modal.cancel">
|
||||
<label text="{{cancelLabel}}"/>
|
||||
</button>
|
||||
<button class="modal-btn" onclick="settings.modal.save:envVars">
|
||||
<label text="{{saveLabel}}"/>
|
||||
</button>
|
||||
</row>
|
||||
</column>
|
||||
</column>
|
||||
|
||||
<column class="backdrop" if="{{resetModal}}" style="position:absolute;left:0px;top:0px;width:1280px;height:720px" onclick="settings.reset:cancel">
|
||||
<column class="modal-frame" style="position:absolute;left:440px;top:220px;width:400px" align="center" gap="8">
|
||||
<label class="modal-title" text="{{t:settings.reset.title}}"/>
|
||||
<label class="modal-desc" text="{{t:settings.reset.confirm}}"/>
|
||||
<row align="center" gap="20">
|
||||
<button class="modal-btn" onclick="settings.reset:cancel">
|
||||
<label text="{{cancelLabel}}"/>
|
||||
</button>
|
||||
<button class="modal-btn" onclick="settings.reset:ok">
|
||||
<label text="{{okLabel}}"/>
|
||||
</button>
|
||||
</row>
|
||||
</column>
|
||||
</column>
|
||||
|
||||
<column class="backdrop" if="{{resetFinalModal}}" style="position:absolute;left:0px;top:0px;width:1280px;height:720px" onclick="settings.reset:cancel">
|
||||
<column class="modal-frame" style="position:absolute;left:440px;top:150px;width:400px" align="center" gap="8">
|
||||
<label class="modal-title" text="{{t:settings.reset.confirmTitle}}"/>
|
||||
<label class="modal-desc" text="{{t:settings.reset.clearAllSettings}}"/>
|
||||
<label class="modal-desc" text="{{t:settings.reset.resetUsername}}"/>
|
||||
<label class="modal-desc" text="{{t:settings.reset.showSetupAgain}}"/>
|
||||
<label class="modal-desc" text="{{t:settings.reset.requireReconfiguration}}"/>
|
||||
<label class="modal-desc" text="{{t:settings.reset.cannotBeUndone}}"/>
|
||||
<row align="center" gap="20">
|
||||
<button class="modal-btn" onclick="settings.reset:cancel">
|
||||
<label text="{{cancelLabel}}"/>
|
||||
</button>
|
||||
<button class="modal-btn" onclick="settings.reset:final">
|
||||
<label text="{{okLabel}}"/>
|
||||
</button>
|
||||
</row>
|
||||
</column>
|
||||
</column>
|
||||
</column>
|
||||
</view>
|
||||
</ui>
|
||||
142
UiDocs/Versions.xml
Normal file
|
|
@ -0,0 +1,142 @@
|
|||
<ui xmlns="emerald" version="1">
|
||||
<import href="Common/Buttons.xml"/>
|
||||
<import href="Common/TitleImage.xml"/>
|
||||
<style>
|
||||
.options-bg {
|
||||
border-image: url(/images/options_background.png) 4 fill / 12px;
|
||||
border-width: 12px;
|
||||
}
|
||||
.version-recess {
|
||||
border-image: url(/images/versionrecess.png) 12 30 30 12 fill / 12px 30px 30px 12px;
|
||||
border-width: 12px;
|
||||
}
|
||||
.edition-row {
|
||||
padding: 0;
|
||||
gap: 12px;
|
||||
border-image: url(/images/Button_Background.png) 13 13 13 13 fill / 13px;
|
||||
border-width: 12px;
|
||||
color: #ffffff;
|
||||
}
|
||||
.edition-row:hover {
|
||||
border-image: url(/images/button_highlighted.png) 13 13 13 13 fill / 13px;
|
||||
}
|
||||
.selected {
|
||||
border-image: url(/images/button_highlighted.png) 13 13 13 13 fill / 13px;
|
||||
color: #ffff55;
|
||||
}
|
||||
.edition-logo {
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
}
|
||||
.edition-name {
|
||||
font-size: 20px;
|
||||
text-shadow: #3f3f3f 1px 1px;
|
||||
}
|
||||
.badge-custom {
|
||||
font-size: 10px;
|
||||
padding: 1.5px;
|
||||
background: #777777;
|
||||
color: #222222;
|
||||
}
|
||||
.action-btn {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
background-image: /images/checkbox.png;
|
||||
padding: 4px;
|
||||
}
|
||||
.action-btn:hover {
|
||||
background-image: /images/checkbox_highlighted.png;
|
||||
}
|
||||
.action-icon {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
.download-percent {
|
||||
font-size: 12px;
|
||||
color: #ffff55;
|
||||
text-shadow: #000000 1px 1px;
|
||||
}
|
||||
.play-btn {
|
||||
width: 96px;
|
||||
height: 40px;
|
||||
font-size: 16px;
|
||||
color: #ffffff;
|
||||
border-image: url(/images/Button_Background.png) 13 13 13 13 fill / 13px;
|
||||
border-width: 12px;
|
||||
}
|
||||
.play-btn:hover {
|
||||
border-image: url(/images/button_highlighted.png) 13 13 13 13 fill / 13px;
|
||||
color: #ffff55;
|
||||
}
|
||||
.stop-btn { color: #ff5555; }
|
||||
.game-error {
|
||||
color: #ff5555;
|
||||
font-size: 16px;
|
||||
text-shadow: #000000 1px 1px;
|
||||
}
|
||||
.backdrop { background: rgba(0, 0, 0, 0.8); }
|
||||
.modal-frame {
|
||||
border-image: url(/images/frame_background.png) 13 13 13 13 fill / 13px;
|
||||
border-width: 12px;
|
||||
font-size: 18px;
|
||||
}
|
||||
.modal-title { color: #ffff55; font-size: 22px; }
|
||||
.modal-btn {
|
||||
width: 140px;
|
||||
height: 40px;
|
||||
font-size: 18px;
|
||||
color: #ffffff;
|
||||
border-image: url(/images/Button_Background.png) 13 13 13 13 fill / 13px;
|
||||
border-width: 12px;
|
||||
}
|
||||
.modal-btn:hover {
|
||||
border-image: url(/images/button_highlighted.png) 13 13 13 13 fill / 13px;
|
||||
color: #ffff55;
|
||||
}
|
||||
.log-text {
|
||||
width: 760px;
|
||||
height: 360px;
|
||||
font-size: 14px;
|
||||
color: #e6f2e6;
|
||||
}
|
||||
|
||||
</style>
|
||||
<template name="EditionRow">
|
||||
<row class="edition-row {{rowClass}}" onclick="versions.select:{{id}}" align="stretch">
|
||||
<image class="edition-logo" src="{{logo}}" fit="contain" align="center" />
|
||||
<column gap="4" align="center" flex="1">
|
||||
<row gap="8" align="start">
|
||||
<label class="edition-name" text="{{name}}" />
|
||||
</row>
|
||||
</column>
|
||||
<row gap="8" align="center">
|
||||
<label if="{{downloading}}" class="download-percent" text="{{downloadPercentText}}%" />
|
||||
<button if="{{showInstall}}" class="action-btn" onclick="versions.install:{{id}}">
|
||||
<image class="action-icon" src="/images/Download_Icon.png" />
|
||||
</button>
|
||||
<button if="{{downloading}}" class="action-btn" onclick="versions.cancel:{{id}}">
|
||||
<image class="action-icon" src="/images/Trash_Bin_Icon.png" />
|
||||
</button>
|
||||
<button class="action-btn" onclick="versions.settings:{{id}}">
|
||||
<image class="action-icon" src="/images/gear.png" />
|
||||
</button>
|
||||
</row>
|
||||
</row>
|
||||
</template>
|
||||
<view id="versions">
|
||||
<tooltip icon="A">Select</tooltip>
|
||||
<tooltip icon="B">Back</tooltip>
|
||||
<tooltip icon="X">Install</tooltip>
|
||||
<column width="1280px" height="720px" align="center" padding="40">
|
||||
<use template="TitleImage"/>
|
||||
<column height="40px"/>
|
||||
<column class="options-bg" padding="4" width="1024px" height="372px" align="center">
|
||||
<scroll class="version-recess" width="100%" height="100%" id="edition-list">
|
||||
<column gap="4" width="97.9%" foreach="{{editions}}" as="edition">
|
||||
<use template="EditionRow" id="{{edition.id}}" name="{{edition.name}}" logo="{{edition.logo}}" notInstalled="{{edition.notInstalled}}" showInstall="{{edition.showInstall}}" showPlay="{{edition.showPlay}}" showStop="{{edition.showStop}}" downloading="{{edition.downloading}}" downloadPercentText="{{edition.downloadPercentText}}" rowClass="{{edition.rowClass}}" />
|
||||
</column>
|
||||
</scroll>
|
||||
</column>
|
||||
</column>
|
||||
</view>
|
||||
</ui>
|
||||
|
Before Width: | Height: | Size: 681 KiB |
546
bun.lock
|
|
@ -1,546 +0,0 @@
|
|||
{
|
||||
"lockfileVersion": 1,
|
||||
"workspaces": {
|
||||
"": {
|
||||
"name": "emerald-legacy-launcher",
|
||||
"dependencies": {
|
||||
"@tailwindcss/vite": "^4.2.1",
|
||||
"@tauri-apps/api": "^2.10.1",
|
||||
"@tauri-apps/plugin-opener": "^2.5.3",
|
||||
"framer-motion": "^12.36.0",
|
||||
"path": "^0.12.7",
|
||||
"react": "^19.1.0",
|
||||
"react-dom": "^19.1.0",
|
||||
"react-router-dom": "^7.13.1",
|
||||
"tauri-plugin-drpc": "^1.0.3",
|
||||
"tauri-plugin-gamepad-api": "^0.0.5",
|
||||
"three": "^0.183.2",
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tauri-apps/cli": "^2.10.1",
|
||||
"@types/react": "^19.1.8",
|
||||
"@types/react-dom": "^19.1.6",
|
||||
"@types/three": "^0.183.1",
|
||||
"@vitejs/plugin-react": "^4.6.0",
|
||||
"autoprefixer": "^10.4.27",
|
||||
"postcss": "^8.5.8",
|
||||
"tailwindcss": "^3.4.19",
|
||||
"typescript": "~5.8.3",
|
||||
"vite": "^7.0.4",
|
||||
},
|
||||
},
|
||||
},
|
||||
"packages": {
|
||||
"@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
|
||||
|
||||
"@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="],
|
||||
|
||||
"@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="],
|
||||
|
||||
"@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="],
|
||||
|
||||
"@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="],
|
||||
|
||||
"@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="],
|
||||
|
||||
"@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="],
|
||||
|
||||
"@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="],
|
||||
|
||||
"@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="],
|
||||
|
||||
"@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="],
|
||||
|
||||
"@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
|
||||
|
||||
"@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],
|
||||
|
||||
"@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="],
|
||||
|
||||
"@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="],
|
||||
|
||||
"@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" } }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="],
|
||||
|
||||
"@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="],
|
||||
|
||||
"@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="],
|
||||
|
||||
"@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="],
|
||||
|
||||
"@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="],
|
||||
|
||||
"@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="],
|
||||
|
||||
"@dimforge/rapier3d-compat": ["@dimforge/rapier3d-compat@0.12.0", "", {}, "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow=="],
|
||||
|
||||
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="],
|
||||
|
||||
"@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="],
|
||||
|
||||
"@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="],
|
||||
|
||||
"@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="],
|
||||
|
||||
"@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="],
|
||||
|
||||
"@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="],
|
||||
|
||||
"@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="],
|
||||
|
||||
"@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="],
|
||||
|
||||
"@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="],
|
||||
|
||||
"@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="],
|
||||
|
||||
"@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="],
|
||||
|
||||
"@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="],
|
||||
|
||||
"@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="],
|
||||
|
||||
"@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="],
|
||||
|
||||
"@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="],
|
||||
|
||||
"@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="],
|
||||
|
||||
"@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="],
|
||||
|
||||
"@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="],
|
||||
|
||||
"@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="],
|
||||
|
||||
"@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="],
|
||||
|
||||
"@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="],
|
||||
|
||||
"@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="],
|
||||
|
||||
"@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="],
|
||||
|
||||
"@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="],
|
||||
|
||||
"@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="],
|
||||
|
||||
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="],
|
||||
|
||||
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
|
||||
|
||||
"@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
|
||||
|
||||
"@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
|
||||
|
||||
"@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
|
||||
|
||||
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
|
||||
|
||||
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
|
||||
|
||||
"@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
|
||||
|
||||
"@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
|
||||
|
||||
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="],
|
||||
|
||||
"@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.59.0", "", { "os": "android", "cpu": "arm" }, "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg=="],
|
||||
|
||||
"@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.59.0", "", { "os": "android", "cpu": "arm64" }, "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q=="],
|
||||
|
||||
"@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.59.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg=="],
|
||||
|
||||
"@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.59.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w=="],
|
||||
|
||||
"@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.59.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA=="],
|
||||
|
||||
"@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.59.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg=="],
|
||||
|
||||
"@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw=="],
|
||||
|
||||
"@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA=="],
|
||||
|
||||
"@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA=="],
|
||||
|
||||
"@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA=="],
|
||||
|
||||
"@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg=="],
|
||||
|
||||
"@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q=="],
|
||||
|
||||
"@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA=="],
|
||||
|
||||
"@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA=="],
|
||||
|
||||
"@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg=="],
|
||||
|
||||
"@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg=="],
|
||||
|
||||
"@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.59.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w=="],
|
||||
|
||||
"@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg=="],
|
||||
|
||||
"@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg=="],
|
||||
|
||||
"@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.59.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ=="],
|
||||
|
||||
"@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.59.0", "", { "os": "none", "cpu": "arm64" }, "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA=="],
|
||||
|
||||
"@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.59.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A=="],
|
||||
|
||||
"@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.59.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA=="],
|
||||
|
||||
"@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA=="],
|
||||
|
||||
"@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA=="],
|
||||
|
||||
"@tailwindcss/node": ["@tailwindcss/node@4.2.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.31.1", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.1" } }, "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg=="],
|
||||
|
||||
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.1", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.2.1", "@tailwindcss/oxide-darwin-arm64": "4.2.1", "@tailwindcss/oxide-darwin-x64": "4.2.1", "@tailwindcss/oxide-freebsd-x64": "4.2.1", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", "@tailwindcss/oxide-linux-x64-musl": "4.2.1", "@tailwindcss/oxide-wasm32-wasi": "4.2.1", "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" } }, "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw=="],
|
||||
|
||||
"@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.1", "", { "os": "android", "cpu": "arm64" }, "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg=="],
|
||||
|
||||
"@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw=="],
|
||||
|
||||
"@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw=="],
|
||||
|
||||
"@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA=="],
|
||||
|
||||
"@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw=="],
|
||||
|
||||
"@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ=="],
|
||||
|
||||
"@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ=="],
|
||||
|
||||
"@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g=="],
|
||||
|
||||
"@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.1", "", { "os": "linux", "cpu": "x64" }, "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g=="],
|
||||
|
||||
"@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.1", "", { "cpu": "none" }, "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q=="],
|
||||
|
||||
"@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA=="],
|
||||
|
||||
"@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.1", "", { "os": "win32", "cpu": "x64" }, "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ=="],
|
||||
|
||||
"@tailwindcss/vite": ["@tailwindcss/vite@4.2.1", "", { "dependencies": { "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "tailwindcss": "4.2.1" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w=="],
|
||||
|
||||
"@tauri-apps/api": ["@tauri-apps/api@2.10.1", "", {}, "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw=="],
|
||||
|
||||
"@tauri-apps/cli": ["@tauri-apps/cli@2.10.1", "", { "optionalDependencies": { "@tauri-apps/cli-darwin-arm64": "2.10.1", "@tauri-apps/cli-darwin-x64": "2.10.1", "@tauri-apps/cli-linux-arm-gnueabihf": "2.10.1", "@tauri-apps/cli-linux-arm64-gnu": "2.10.1", "@tauri-apps/cli-linux-arm64-musl": "2.10.1", "@tauri-apps/cli-linux-riscv64-gnu": "2.10.1", "@tauri-apps/cli-linux-x64-gnu": "2.10.1", "@tauri-apps/cli-linux-x64-musl": "2.10.1", "@tauri-apps/cli-win32-arm64-msvc": "2.10.1", "@tauri-apps/cli-win32-ia32-msvc": "2.10.1", "@tauri-apps/cli-win32-x64-msvc": "2.10.1" }, "bin": { "tauri": "tauri.js" } }, "sha512-jQNGF/5quwORdZSSLtTluyKQ+o6SMa/AUICfhf4egCGFdMHqWssApVgYSbg+jmrZoc8e1DscNvjTnXtlHLS11g=="],
|
||||
|
||||
"@tauri-apps/cli-darwin-arm64": ["@tauri-apps/cli-darwin-arm64@2.10.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Z2OjCXiZ+fbYZy7PmP3WRnOpM9+Fy+oonKDEmUE6MwN4IGaYqgceTjwHucc/kEEYZos5GICve35f7ZiizgqEnQ=="],
|
||||
|
||||
"@tauri-apps/cli-darwin-x64": ["@tauri-apps/cli-darwin-x64@2.10.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-V/irQVvjPMGOTQqNj55PnQPVuH4VJP8vZCN7ajnj+ZS8Kom1tEM2hR3qbbIRoS3dBKs5mbG8yg1WC+97dq17Pw=="],
|
||||
|
||||
"@tauri-apps/cli-linux-arm-gnueabihf": ["@tauri-apps/cli-linux-arm-gnueabihf@2.10.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Hyzwsb4VnCWKGfTw+wSt15Z2pLw2f0JdFBfq2vHBOBhvg7oi6uhKiF87hmbXOBXUZaGkyRDkCHsdzJcIfoJC2w=="],
|
||||
|
||||
"@tauri-apps/cli-linux-arm64-gnu": ["@tauri-apps/cli-linux-arm64-gnu@2.10.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-OyOYs2t5GkBIvyWjA1+h4CZxTcdz1OZPCWAPz5DYEfB0cnWHERTnQ/SLayQzncrT0kwRoSfSz9KxenkyJoTelA=="],
|
||||
|
||||
"@tauri-apps/cli-linux-arm64-musl": ["@tauri-apps/cli-linux-arm64-musl@2.10.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-MIj78PDDGjkg3NqGptDOGgfXks7SYJwhiMh8SBoZS+vfdz7yP5jN18bNaLnDhsVIPARcAhE1TlsZe/8Yxo2zqg=="],
|
||||
|
||||
"@tauri-apps/cli-linux-riscv64-gnu": ["@tauri-apps/cli-linux-riscv64-gnu@2.10.1", "", { "os": "linux", "cpu": "none" }, "sha512-X0lvOVUg8PCVaoEtEAnpxmnkwlE1gcMDTqfhbefICKDnOTJ5Est3qL0SrWxizDackIOKBcvtpejrSiVpuJI1kw=="],
|
||||
|
||||
"@tauri-apps/cli-linux-x64-gnu": ["@tauri-apps/cli-linux-x64-gnu@2.10.1", "", { "os": "linux", "cpu": "x64" }, "sha512-2/12bEzsJS9fAKybxgicCDFxYD1WEI9kO+tlDwX5znWG2GwMBaiWcmhGlZ8fi+DMe9CXlcVarMTYc0L3REIRxw=="],
|
||||
|
||||
"@tauri-apps/cli-linux-x64-musl": ["@tauri-apps/cli-linux-x64-musl@2.10.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Y8J0ZzswPz50UcGOFuXGEMrxbjwKSPgXftx5qnkuMs2rmwQB5ssvLb6tn54wDSYxe7S6vlLob9vt0VKuNOaCIQ=="],
|
||||
|
||||
"@tauri-apps/cli-win32-arm64-msvc": ["@tauri-apps/cli-win32-arm64-msvc@2.10.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-iSt5B86jHYAPJa/IlYw++SXtFPGnWtFJriHn7X0NFBVunF6zu9+/zOn8OgqIWSl8RgzhLGXQEEtGBdR4wzpVgg=="],
|
||||
|
||||
"@tauri-apps/cli-win32-ia32-msvc": ["@tauri-apps/cli-win32-ia32-msvc@2.10.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-gXyxgEzsFegmnWywYU5pEBURkcFN/Oo45EAwvZrHMh+zUSEAvO5E8TXsgPADYm31d1u7OQU3O3HsYfVBf2moHw=="],
|
||||
|
||||
"@tauri-apps/cli-win32-x64-msvc": ["@tauri-apps/cli-win32-x64-msvc@2.10.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6Cn7YpPFwzChy0ERz6djKEmUehWrYlM+xTaNzGPgZocw3BD7OfwfWHKVWxXzdjEW2KfKkHddfdxK1XXTYqBRLg=="],
|
||||
|
||||
"@tauri-apps/plugin-opener": ["@tauri-apps/plugin-opener@2.5.3", "", { "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "sha512-CCcUltXMOfUEArbf3db3kCE7Ggy1ExBEBl51Ko2ODJ6GDYHRp1nSNlQm5uNCFY5k7/ufaK5Ib3Du/Zir19IYQQ=="],
|
||||
|
||||
"@tweenjs/tween.js": ["@tweenjs/tween.js@23.1.3", "", {}, "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA=="],
|
||||
|
||||
"@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
|
||||
|
||||
"@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="],
|
||||
|
||||
"@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="],
|
||||
|
||||
"@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="],
|
||||
|
||||
"@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
|
||||
|
||||
"@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="],
|
||||
|
||||
"@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="],
|
||||
|
||||
"@types/stats.js": ["@types/stats.js@0.17.4", "", {}, "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA=="],
|
||||
|
||||
"@types/three": ["@types/three@0.183.1", "", { "dependencies": { "@dimforge/rapier3d-compat": "~0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", "@types/webxr": ">=0.5.17", "@webgpu/types": "*", "fflate": "~0.8.2", "meshoptimizer": "~1.0.1" } }, "sha512-f2Pu5Hrepfgavttdye3PsH5RWyY/AvdZQwIVhrc4uNtvF7nOWJacQKcoVJn0S4f0yYbmAE6AR+ve7xDcuYtMGw=="],
|
||||
|
||||
"@types/webxr": ["@types/webxr@0.5.24", "", {}, "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg=="],
|
||||
|
||||
"@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="],
|
||||
|
||||
"@webgpu/types": ["@webgpu/types@0.1.69", "", {}, "sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ=="],
|
||||
|
||||
"any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
|
||||
|
||||
"anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
|
||||
|
||||
"arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="],
|
||||
|
||||
"autoprefixer": ["autoprefixer@10.4.27", "", { "dependencies": { "browserslist": "^4.28.1", "caniuse-lite": "^1.0.30001774", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": "bin/autoprefixer" }, "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA=="],
|
||||
|
||||
"baseline-browser-mapping": ["baseline-browser-mapping@2.10.0", "", { "bin": "dist/cli.cjs" }, "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA=="],
|
||||
|
||||
"binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
|
||||
|
||||
"braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
|
||||
|
||||
"browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": "cli.js" }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="],
|
||||
|
||||
"camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="],
|
||||
|
||||
"caniuse-lite": ["caniuse-lite@1.0.30001778", "", {}, "sha512-PN7uxFL+ExFJO61aVmP1aIEG4i9whQd4eoSCebav62UwDyp5OHh06zN4jqKSMePVgxHifCw1QJxdRkA1Pisekg=="],
|
||||
|
||||
"chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
|
||||
|
||||
"commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
|
||||
|
||||
"convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
|
||||
|
||||
"cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
|
||||
|
||||
"cssesc": ["cssesc@3.0.0", "", { "bin": "bin/cssesc" }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
|
||||
|
||||
"csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
|
||||
|
||||
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
|
||||
|
||||
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
|
||||
|
||||
"didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="],
|
||||
|
||||
"dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="],
|
||||
|
||||
"electron-to-chromium": ["electron-to-chromium@1.5.313", "", {}, "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA=="],
|
||||
|
||||
"enhanced-resolve": ["enhanced-resolve@5.20.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ=="],
|
||||
|
||||
"esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": "bin/esbuild" }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="],
|
||||
|
||||
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
|
||||
|
||||
"fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
|
||||
|
||||
"fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
|
||||
|
||||
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
|
||||
|
||||
"fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="],
|
||||
|
||||
"fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
|
||||
|
||||
"fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="],
|
||||
|
||||
"framer-motion": ["framer-motion@12.36.0", "", { "dependencies": { "motion-dom": "^12.36.0", "motion-utils": "^12.36.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-4PqYHAT7gev0ke0wos+PyrcFxI0HScjm3asgU8nSYa8YzJFuwgIvdj3/s3ZaxLq0bUSboIn19A2WS/MHwLCvfw=="],
|
||||
|
||||
"fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
|
||||
|
||||
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
|
||||
|
||||
"gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
|
||||
|
||||
"glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
|
||||
|
||||
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
|
||||
|
||||
"hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
|
||||
|
||||
"inherits": ["inherits@2.0.3", "", {}, "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="],
|
||||
|
||||
"is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="],
|
||||
|
||||
"is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
|
||||
|
||||
"is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
|
||||
|
||||
"is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
|
||||
|
||||
"is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
|
||||
|
||||
"jiti": ["jiti@1.21.7", "", { "bin": "bin/jiti.js" }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="],
|
||||
|
||||
"js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
|
||||
|
||||
"jsesc": ["jsesc@3.1.0", "", { "bin": "bin/jsesc" }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
|
||||
|
||||
"json5": ["json5@2.2.3", "", { "bin": "lib/cli.js" }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
|
||||
|
||||
"lightningcss": ["lightningcss@1.31.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.31.1", "lightningcss-darwin-arm64": "1.31.1", "lightningcss-darwin-x64": "1.31.1", "lightningcss-freebsd-x64": "1.31.1", "lightningcss-linux-arm-gnueabihf": "1.31.1", "lightningcss-linux-arm64-gnu": "1.31.1", "lightningcss-linux-arm64-musl": "1.31.1", "lightningcss-linux-x64-gnu": "1.31.1", "lightningcss-linux-x64-musl": "1.31.1", "lightningcss-win32-arm64-msvc": "1.31.1", "lightningcss-win32-x64-msvc": "1.31.1" } }, "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ=="],
|
||||
|
||||
"lightningcss-android-arm64": ["lightningcss-android-arm64@1.31.1", "", { "os": "android", "cpu": "arm64" }, "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg=="],
|
||||
|
||||
"lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.31.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg=="],
|
||||
|
||||
"lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.31.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA=="],
|
||||
|
||||
"lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.31.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A=="],
|
||||
|
||||
"lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.31.1", "", { "os": "linux", "cpu": "arm" }, "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g=="],
|
||||
|
||||
"lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg=="],
|
||||
|
||||
"lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.31.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg=="],
|
||||
|
||||
"lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA=="],
|
||||
|
||||
"lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.31.1", "", { "os": "linux", "cpu": "x64" }, "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA=="],
|
||||
|
||||
"lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.31.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w=="],
|
||||
|
||||
"lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="],
|
||||
|
||||
"lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
|
||||
|
||||
"lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
|
||||
|
||||
"lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
|
||||
|
||||
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
|
||||
|
||||
"merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
|
||||
|
||||
"meshoptimizer": ["meshoptimizer@1.0.1", "", {}, "sha512-Vix+QlA1YYT3FwmBBZ+49cE5y/b+pRrcXKqGpS5ouh33d3lSp2PoTpCw19E0cKDFWalembrHnIaZetf27a+W2g=="],
|
||||
|
||||
"micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
|
||||
|
||||
"motion-dom": ["motion-dom@12.36.0", "", { "dependencies": { "motion-utils": "^12.36.0" } }, "sha512-Ep1pq8P88rGJ75om8lTCA13zqd7ywPGwCqwuWwin6BKc0hMLkVfcS6qKlRqEo2+t0DwoUcgGJfXwaiFn4AOcQA=="],
|
||||
|
||||
"motion-utils": ["motion-utils@12.36.0", "", {}, "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg=="],
|
||||
|
||||
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
||||
|
||||
"mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
|
||||
|
||||
"nanoid": ["nanoid@3.3.11", "", { "bin": "bin/nanoid.cjs" }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
|
||||
|
||||
"node-releases": ["node-releases@2.0.36", "", {}, "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA=="],
|
||||
|
||||
"normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
|
||||
|
||||
"object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
|
||||
|
||||
"object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="],
|
||||
|
||||
"path": ["path@0.12.7", "", { "dependencies": { "process": "^0.11.1", "util": "^0.10.3" } }, "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q=="],
|
||||
|
||||
"path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
|
||||
|
||||
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
|
||||
|
||||
"picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
|
||||
|
||||
"pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="],
|
||||
|
||||
"pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="],
|
||||
|
||||
"postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="],
|
||||
|
||||
"postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="],
|
||||
|
||||
"postcss-js": ["postcss-js@4.1.0", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw=="],
|
||||
|
||||
"postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="],
|
||||
|
||||
"postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="],
|
||||
|
||||
"postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="],
|
||||
|
||||
"postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="],
|
||||
|
||||
"process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="],
|
||||
|
||||
"queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
|
||||
|
||||
"react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="],
|
||||
|
||||
"react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="],
|
||||
|
||||
"react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="],
|
||||
|
||||
"react-router": ["react-router@7.13.1", "", { "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-td+xP4X2/6BJvZoX6xw++A2DdEi++YypA69bJUV5oVvqf6/9/9nNlD70YO1e9d3MyamJEBQFEzk6mbfDYbqrSA=="],
|
||||
|
||||
"react-router-dom": ["react-router-dom@7.13.1", "", { "dependencies": { "react-router": "7.13.1" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-UJnV3Rxc5TgUPJt2KJpo1Jpy0OKQr0AjgbZzBFjaPJcFOb2Y8jA5H3LT8HUJAiRLlWrEXWHbF1Z4SCZaQjWDHw=="],
|
||||
|
||||
"read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="],
|
||||
|
||||
"readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
|
||||
|
||||
"resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": "bin/resolve" }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="],
|
||||
|
||||
"reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
|
||||
|
||||
"rollup": ["rollup@4.59.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.59.0", "@rollup/rollup-android-arm64": "4.59.0", "@rollup/rollup-darwin-arm64": "4.59.0", "@rollup/rollup-darwin-x64": "4.59.0", "@rollup/rollup-freebsd-arm64": "4.59.0", "@rollup/rollup-freebsd-x64": "4.59.0", "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", "@rollup/rollup-linux-arm-musleabihf": "4.59.0", "@rollup/rollup-linux-arm64-gnu": "4.59.0", "@rollup/rollup-linux-arm64-musl": "4.59.0", "@rollup/rollup-linux-loong64-gnu": "4.59.0", "@rollup/rollup-linux-loong64-musl": "4.59.0", "@rollup/rollup-linux-ppc64-gnu": "4.59.0", "@rollup/rollup-linux-ppc64-musl": "4.59.0", "@rollup/rollup-linux-riscv64-gnu": "4.59.0", "@rollup/rollup-linux-riscv64-musl": "4.59.0", "@rollup/rollup-linux-s390x-gnu": "4.59.0", "@rollup/rollup-linux-x64-gnu": "4.59.0", "@rollup/rollup-linux-x64-musl": "4.59.0", "@rollup/rollup-openbsd-x64": "4.59.0", "@rollup/rollup-openharmony-arm64": "4.59.0", "@rollup/rollup-win32-arm64-msvc": "4.59.0", "@rollup/rollup-win32-ia32-msvc": "4.59.0", "@rollup/rollup-win32-x64-gnu": "4.59.0", "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg=="],
|
||||
|
||||
"run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
|
||||
|
||||
"scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
|
||||
|
||||
"semver": ["semver@6.3.1", "", { "bin": "bin/semver.js" }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
|
||||
|
||||
"set-cookie-parser": ["set-cookie-parser@2.7.2", "", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="],
|
||||
|
||||
"source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
|
||||
|
||||
"sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="],
|
||||
|
||||
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
|
||||
|
||||
"tailwindcss": ["tailwindcss@3.4.19", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ=="],
|
||||
|
||||
"tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="],
|
||||
|
||||
"tauri-plugin-drpc": ["tauri-plugin-drpc@1.0.3", "", { "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-vl5dXhjKbl7+Nf9veW12usdmIUtZXwEf91SzxQPZlbRRJ/sjizbbQlnkUTtx6baJuGzz0KXXgP9xUhF39BdiXQ=="],
|
||||
|
||||
"tauri-plugin-gamepad-api": ["tauri-plugin-gamepad-api@0.0.5", "", { "dependencies": { "@tauri-apps/api": "2.1.1", "tslib": "^2.1.0" } }, "sha512-WO0xwXmPr4PMe9HzljKUbTkGv7J6ur2Df/OuEPsxBeSA5QPffAJR3N32M4pM4yW72D9Vt19XplPnHHDVATVMSw=="],
|
||||
|
||||
"thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
|
||||
|
||||
"thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
|
||||
|
||||
"three": ["three@0.183.2", "", {}, "sha512-di3BsL2FEQ1PA7Hcvn4fyJOlxRRgFYBpMTcyOgkwJIaDOdJMebEFPA+t98EvjuljDx4hNulAGwF6KIjtwI5jgQ=="],
|
||||
|
||||
"tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
|
||||
|
||||
"to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
|
||||
|
||||
"ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
|
||||
|
||||
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
||||
|
||||
"typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
|
||||
|
||||
"update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": "cli.js" }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="],
|
||||
|
||||
"util": ["util@0.10.4", "", { "dependencies": { "inherits": "2.0.3" } }, "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A=="],
|
||||
|
||||
"util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
|
||||
|
||||
"vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": "bin/vite.js" }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="],
|
||||
|
||||
"yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
|
||||
|
||||
"@tailwindcss/node/jiti": ["jiti@2.6.1", "", { "bin": "lib/jiti-cli.mjs" }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
|
||||
|
||||
"@tailwindcss/node/tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="],
|
||||
|
||||
"@tailwindcss/vite/tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="],
|
||||
|
||||
"anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
||||
|
||||
"chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
|
||||
|
||||
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
|
||||
|
||||
"micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
||||
|
||||
"readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
||||
|
||||
"tauri-plugin-gamepad-api/@tauri-apps/api": ["@tauri-apps/api@2.1.1", "", {}, "sha512-fzUfFFKo4lknXGJq8qrCidkUcKcH2UHhfaaCNt4GzgzGaW2iS26uFOg4tS3H4P8D6ZEeUxtiD5z0nwFF0UN30A=="],
|
||||
}
|
||||
}
|
||||
29
cmake/CompilerWarnings.cmake
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
function(emerald_apply_warnings target)
|
||||
if(MSVC)
|
||||
target_compile_options(${target} PRIVATE /W4 /permissive-)
|
||||
if(EMERALD_WARNINGS_AS_ERRORS)
|
||||
target_compile_options(${target} PRIVATE /WX)
|
||||
endif()
|
||||
return()
|
||||
endif()
|
||||
|
||||
target_compile_options(${target} PRIVATE
|
||||
-Wall
|
||||
-Wextra
|
||||
-Wpedantic
|
||||
-Wshadow
|
||||
-Wconversion
|
||||
-Wsign-conversion
|
||||
-Wnon-virtual-dtor
|
||||
-Wold-style-cast
|
||||
-Wcast-align
|
||||
-Wunused
|
||||
-Woverloaded-virtual
|
||||
-Wnull-dereference
|
||||
-Wdouble-promotion
|
||||
-Wformat=2
|
||||
)
|
||||
if(EMERALD_WARNINGS_AS_ERRORS)
|
||||
target_compile_options(${target} PRIVATE -Werror)
|
||||
endif()
|
||||
endfunction()
|
||||
135
cmake/Dependencies.cmake
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
include(FetchContent)
|
||||
set(EMERALD_PC_MODULES CURL::libcurl Archive::libarchive)
|
||||
if(EMERALD_USE_SYSTEM_DEPS)
|
||||
find_package(CURL QUIET)
|
||||
find_package(PkgConfig QUIET)
|
||||
if(PkgConfig_FOUND)
|
||||
pkg_check_modules(EMERALD_ARCHIVE IMPORTED_TARGET libarchive)
|
||||
endif()
|
||||
elseif()
|
||||
message(FATAL_ERROR "libcurl/libarchive system deps required")
|
||||
endif()
|
||||
function(emerald_find_sdl3)
|
||||
if(EMERALD_USE_SYSTEM_DEPS)
|
||||
find_package(SDL3 3.2 CONFIG QUIET)
|
||||
if(SDL3_FOUND)
|
||||
message(STATUS "Using system SDL3 ${SDL3_VERSION}")
|
||||
return()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
FetchContent_Declare(SDL3
|
||||
GIT_REPOSITORY https://github.com/libsdl-org/SDL.git
|
||||
GIT_TAG release-3.2.30
|
||||
GIT_SHALLOW TRUE
|
||||
EXCLUDE_FROM_ALL
|
||||
)
|
||||
FetchContent_MakeAvailable(SDL3)
|
||||
message(STATUS "SDL3 fetched from source")
|
||||
endfunction()
|
||||
function(emerald_find_sdl3_ttf)
|
||||
if(EMERALD_USE_SYSTEM_DEPS)
|
||||
find_package(SDL3_ttf CONFIG QUIET)
|
||||
if(SDL3_ttf_FOUND)
|
||||
message(STATUS "Using system SDL3_ttf ${SDL3_ttf_VERSION}")
|
||||
return()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
FetchContent_Declare(SDL3_ttf
|
||||
GIT_REPOSITORY https://github.com/libsdl-org/SDL_ttf.git
|
||||
GIT_TAG release-3.2.2
|
||||
GIT_SHALLOW TRUE
|
||||
EXCLUDE_FROM_ALL
|
||||
)
|
||||
FetchContent_MakeAvailable(SDL3_ttf)
|
||||
message(STATUS "SDL3_ttf fetched from source")
|
||||
endfunction()
|
||||
|
||||
function(emerald_find_pugixml)
|
||||
if(EMERALD_USE_SYSTEM_DEPS)
|
||||
find_package(pugixml CONFIG QUIET)
|
||||
if(pugixml_FOUND)
|
||||
message(STATUS "Using system pugixml ${pugixml_VERSION}")
|
||||
return()
|
||||
endif()
|
||||
endif()
|
||||
FetchContent_Declare(pugixml
|
||||
GIT_REPOSITORY https://github.com/zeux/pugixml.git
|
||||
GIT_TAG v1.15
|
||||
GIT_SHALLOW TRUE
|
||||
EXCLUDE_FROM_ALL
|
||||
)
|
||||
set(BUILD_TESTS OFF CACHE BOOL "" FORCE)
|
||||
FetchContent_MakeAvailable(pugixml)
|
||||
message(STATUS "pugixml fetched from source")
|
||||
endfunction()
|
||||
function(emerald_find_stb)
|
||||
if(EMERALD_USE_SYSTEM_DEPS AND EXISTS "${EMERALD_SYSTEM_STB_DIR}/stb_image.h")
|
||||
message(STATUS "Using system stb headers")
|
||||
return()
|
||||
endif()
|
||||
|
||||
FetchContent_Declare(stb
|
||||
GIT_REPOSITORY https://github.com/nothings/stb.git
|
||||
GIT_TAG master
|
||||
GIT_SHALLOW TRUE
|
||||
EXCLUDE_FROM_ALL
|
||||
)
|
||||
FetchContent_MakeAvailable(stb)
|
||||
message(STATUS "stb fetched from source")
|
||||
endfunction()
|
||||
function(emerald_find_miniaudio)
|
||||
if(EMERALD_USE_SYSTEM_DEPS)
|
||||
find_path(EMERALD_MINIAUDIO_INCLUDE_DIR NAMES miniaudio.h)
|
||||
if(EMERALD_MINIAUDIO_INCLUDE_DIR)
|
||||
message(STATUS "Using system miniaudio (${EMERALD_MINIAUDIO_INCLUDE_DIR})")
|
||||
return()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
FetchContent_Declare(miniaudio
|
||||
GIT_REPOSITORY https://github.com/mackron/miniaudio.git
|
||||
GIT_TAG 0.11.25
|
||||
GIT_SHALLOW TRUE
|
||||
SOURCE_SUBDIR cmake/emerald-miniaudio-no-subdir
|
||||
EXCLUDE_FROM_ALL
|
||||
)
|
||||
FetchContent_MakeAvailable(miniaudio)
|
||||
set(EMERALD_MINIAUDIO_INCLUDE_DIR "${miniaudio_SOURCE_DIR}" CACHE PATH "miniaudio include directory" FORCE)
|
||||
message(STATUS "miniaudio fetched from source")
|
||||
endfunction()
|
||||
function(emerald_find_json)
|
||||
if(EMERALD_USE_SYSTEM_DEPS)
|
||||
find_package(nlohmann_json 3.11 CONFIG QUIET)
|
||||
if(nlohmann_json_FOUND)
|
||||
message(STATUS "Using system nlohmann_json")
|
||||
return()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
FetchContent_Declare(nlohmann_json
|
||||
URL https://github.com/nlohmann/json/releases/download/v3.11.3/json.tar.xz
|
||||
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
|
||||
EXCLUDE_FROM_ALL
|
||||
)
|
||||
FetchContent_MakeAvailable(nlohmann_json)
|
||||
message(STATUS "nlohmann_json fetched from source")
|
||||
endfunction()
|
||||
set(EMERALD_SYSTEM_STB_DIR "/usr/include/stb")
|
||||
emerald_find_sdl3()
|
||||
emerald_find_sdl3_ttf()
|
||||
emerald_find_json()
|
||||
emerald_find_pugixml()
|
||||
emerald_find_stb()
|
||||
emerald_find_miniaudio()
|
||||
if(NOT WIN32)
|
||||
find_package(SQLite3 REQUIRED)
|
||||
endif()
|
||||
|
||||
add_library(emerald_stb INTERFACE)
|
||||
if(EXISTS "${EMERALD_SYSTEM_STB_DIR}/stb_image.h")
|
||||
target_include_directories(emerald_stb SYSTEM INTERFACE "${EMERALD_SYSTEM_STB_DIR}")
|
||||
else()
|
||||
target_include_directories(emerald_stb SYSTEM INTERFACE "${stb_SOURCE_DIR}")
|
||||
endif()
|
||||
27
flake.lock
|
|
@ -1,27 +0,0 @@
|
|||
{
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1784120854,
|
||||
"narHash": "sha256-KesHgItiZPgGX740axSiQLcIQ8D24MDqNpkKYWIek8k=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "753cc8a3a87467296ddd1fa93f0cc3e81120ee46",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
107
flake.nix
|
|
@ -1,107 +0,0 @@
|
|||
{
|
||||
description = "LCE Emerald Launcher — FOSS cross-platform launcher for Minecraft Legacy Console Edition";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
};
|
||||
|
||||
outputs =
|
||||
{ self, nixpkgs }:
|
||||
let
|
||||
inherit (nixpkgs) lib;
|
||||
systems = [
|
||||
"x86_64-linux"
|
||||
"aarch64-linux"
|
||||
"x86_64-darwin"
|
||||
"aarch64-darwin"
|
||||
];
|
||||
forAllSystems = lib.genAttrs systems;
|
||||
pkgsFor =
|
||||
system:
|
||||
import nixpkgs {
|
||||
inherit system;
|
||||
overlays = [ self.overlays.default ];
|
||||
};
|
||||
|
||||
# Bump these together when packaging a new upstream stable release.
|
||||
stableVersion = "1.6.0";
|
||||
stableSrcHash = "sha256-VlqBCZa42MLmJ1nUNlH7PIcLp/X7mBLCS/hm/ISiHNA=";
|
||||
in
|
||||
{
|
||||
overlays.default = final: _prev: {
|
||||
emerald-legacy-launcher = final.callPackage ./nix/package.nix {
|
||||
version = stableVersion;
|
||||
src = final.fetchFromGitHub {
|
||||
owner = "LCE-Hub";
|
||||
repo = "LCE-Emerald-Launcher";
|
||||
rev = "v${stableVersion}";
|
||||
hash = stableSrcHash;
|
||||
};
|
||||
};
|
||||
|
||||
emerald-legacy-launcher-git = final.callPackage ./nix/package.nix {
|
||||
version = "unstable-${self.shortRev or self.dirtyShortRev or "dirty"}";
|
||||
src = self;
|
||||
};
|
||||
};
|
||||
|
||||
packages = forAllSystems (
|
||||
system:
|
||||
let
|
||||
pkgs = pkgsFor system;
|
||||
in
|
||||
{
|
||||
default = pkgs.emerald-legacy-launcher;
|
||||
emerald-legacy-launcher = pkgs.emerald-legacy-launcher;
|
||||
emerald-legacy-launcher-git = pkgs.emerald-legacy-launcher-git;
|
||||
}
|
||||
);
|
||||
|
||||
apps = forAllSystems (system: {
|
||||
default = {
|
||||
type = "app";
|
||||
program = lib.getExe self.packages.${system}.default;
|
||||
};
|
||||
emerald-legacy-launcher-git = {
|
||||
type = "app";
|
||||
program = lib.getExe self.packages.${system}.emerald-legacy-launcher-git;
|
||||
};
|
||||
});
|
||||
|
||||
checks = forAllSystems (system: {
|
||||
package = self.packages.${system}.default;
|
||||
package-git = self.packages.${system}.emerald-legacy-launcher-git;
|
||||
});
|
||||
|
||||
devShells = forAllSystems (
|
||||
system:
|
||||
let
|
||||
pkgs = pkgsFor system;
|
||||
in
|
||||
{
|
||||
default = pkgs.mkShell {
|
||||
inputsFrom = [ pkgs.emerald-legacy-launcher-git ];
|
||||
packages = with pkgs; [
|
||||
cargo
|
||||
rustc
|
||||
rustfmt
|
||||
clippy
|
||||
cargo-tauri
|
||||
nodejs
|
||||
pnpm_10
|
||||
unzip
|
||||
libarchive
|
||||
python3
|
||||
pkg-config
|
||||
];
|
||||
shellHook = ''
|
||||
echo "Emerald Legacy Launcher dev shell"
|
||||
echo " pnpm install && pnpm tauri dev"
|
||||
'';
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
formatter = forAllSystems (system: (pkgsFor system).nixfmt);
|
||||
};
|
||||
}
|
||||
|
|
@ -12,7 +12,7 @@
|
|||
<url type="homepage">https://github.com</url>
|
||||
<developer_name>Emerald Team</developer_name>
|
||||
<releases>
|
||||
<release version="1.6.0" date="2026-03-19">
|
||||
<release version="2.0.0" date="2026-03-19">
|
||||
<description>
|
||||
<p>Latest stable release of the Emerald Legacy Launcher.</p>
|
||||
</description>
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
DIST emerald-legacy-launcher-1.5.1.tar.gz 18500442 BLAKE2B 365d9dd36ee6fddb90625719b599c8fc492eba4ce0fb8926c953f2a7d7f4987bf77d91de6a140a489534ba61e8a71bf9e65d8e015a35af31bccb84ca3a023178 SHA512 c713ef81e56d55d7135fa4228f875822a3eee38ace86d8d28a59a8b4afeff28844bf698e9902eb66075b425a0fb71ae72969ae1fe99ce185a005b5f42a4dccc8
|
||||
|
|
@ -1,79 +0,0 @@
|
|||
# Copyright 2026 Gentoo Authors
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
|
||||
EAPI=8
|
||||
|
||||
inherit desktop xdg
|
||||
|
||||
DESCRIPTION="FOSS cross-platform launcher for Minecraft Legacy Console Edition"
|
||||
HOMEPAGE="https://github.com/LCE-Hub/LCE-Emerald-Launcher"
|
||||
SRC_URI="https://github.com/LCE-Hub/LCE-Emerald-Launcher/archive/refs/tags/v${PV}.tar.gz -> ${P}.tar.gz"
|
||||
S="${WORKDIR}/LCE-Emerald-Launcher-${PV}"
|
||||
|
||||
LICENSE="GPL-3"
|
||||
SLOT="0"
|
||||
KEYWORDS="~amd64"
|
||||
|
||||
# Cargo crates and npm packages are fetched at build time.
|
||||
RESTRICT="network-sandbox"
|
||||
|
||||
RDEPEND="
|
||||
dev-libs/glib:2
|
||||
dev-libs/libayatana-appindicator
|
||||
dev-libs/openssl:=
|
||||
net-libs/libsoup:3.0
|
||||
net-libs/webkit-gtk:4.1
|
||||
x11-libs/cairo
|
||||
x11-libs/gdk-pixbuf:2
|
||||
x11-libs/gtk+:3
|
||||
x11-libs/pango
|
||||
"
|
||||
DEPEND="${RDEPEND}"
|
||||
BDEPEND="
|
||||
|| (
|
||||
>=dev-lang/rust-1.77.0:*
|
||||
>=dev-lang/rust-bin-1.77.0:*
|
||||
)
|
||||
net-libs/nodejs[npm]
|
||||
virtual/pkgconfig
|
||||
"
|
||||
|
||||
# Rust binaries ignore *FLAGS from make.conf.
|
||||
QA_FLAGS_IGNORED="usr/bin/emerald-legacy-launcher"
|
||||
|
||||
src_prepare() {
|
||||
default
|
||||
|
||||
# Disable updater artifact signing (no Tauri signing key in distro builds).
|
||||
sed -i \
|
||||
-e 's/"createUpdaterArtifacts": true/"createUpdaterArtifacts": false/' \
|
||||
src-tauri/tauri.conf.json || die
|
||||
}
|
||||
|
||||
src_compile() {
|
||||
local -x CI=true
|
||||
local -x npm_config_audit=false
|
||||
local -x npm_config_fund=false
|
||||
local -x npm_config_update_notifier=false
|
||||
|
||||
npm install || die "npm install failed"
|
||||
npm run tauri -- build --no-bundle || die "tauri build failed"
|
||||
}
|
||||
|
||||
src_install() {
|
||||
dobin src-tauri/target/release/emerald-legacy-launcher
|
||||
|
||||
newicon -s 32 src-tauri/icons/32x32.png emerald-legacy-launcher.png
|
||||
newicon -s 64 src-tauri/icons/64x64.png emerald-legacy-launcher.png
|
||||
newicon -s 128 src-tauri/icons/128x128.png emerald-legacy-launcher.png
|
||||
newicon -s 256 src-tauri/icons/128x128@2x.png emerald-legacy-launcher.png
|
||||
newicon -s 512 src-tauri/icons/icon.png emerald-legacy-launcher.png
|
||||
|
||||
domenu "${FILESDIR}"/emerald-legacy-launcher.desktop
|
||||
|
||||
insinto /usr/share/metainfo
|
||||
newins flatpak/io.github.Emerald_Legacy_Launcher.Emerald_Legacy_Launcher.metainfo.xml \
|
||||
io.github.Emerald_Legacy_Launcher.Emerald_Legacy_Launcher.metainfo.xml
|
||||
|
||||
dodoc README.md LICENSE
|
||||
}
|
||||
|
|
@ -1,79 +0,0 @@
|
|||
# Copyright 2026 Gentoo Authors
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
|
||||
EAPI=8
|
||||
|
||||
inherit desktop git-r3 xdg
|
||||
|
||||
DESCRIPTION="FOSS cross-platform launcher for Minecraft Legacy Console Edition"
|
||||
HOMEPAGE="https://github.com/LCE-Hub/LCE-Emerald-Launcher"
|
||||
EGIT_REPO_URI="https://github.com/LCE-Hub/LCE-Emerald-Launcher.git"
|
||||
|
||||
LICENSE="GPL-3"
|
||||
SLOT="0"
|
||||
PROPERTIES="live"
|
||||
|
||||
# Cargo crates and npm packages are fetched at build time.
|
||||
RESTRICT="network-sandbox"
|
||||
|
||||
RDEPEND="
|
||||
dev-libs/glib:2
|
||||
dev-libs/libayatana-appindicator
|
||||
dev-libs/openssl:=
|
||||
net-libs/libsoup:3.0
|
||||
net-libs/webkit-gtk:4.1
|
||||
x11-libs/cairo
|
||||
x11-libs/gdk-pixbuf:2
|
||||
x11-libs/gtk+:3
|
||||
x11-libs/pango
|
||||
"
|
||||
DEPEND="${RDEPEND}"
|
||||
BDEPEND="
|
||||
|| (
|
||||
>=dev-lang/rust-1.77.0:*
|
||||
>=dev-lang/rust-bin-1.77.0:*
|
||||
)
|
||||
net-libs/nodejs[npm]
|
||||
virtual/pkgconfig
|
||||
"
|
||||
|
||||
# Rust binaries ignore *FLAGS from make.conf.
|
||||
QA_FLAGS_IGNORED="usr/bin/emerald-legacy-launcher"
|
||||
|
||||
src_prepare() {
|
||||
default
|
||||
|
||||
# Prefer npm for the frontend build; disable updater artifact signing
|
||||
# (no Tauri signing key in distro builds).
|
||||
sed -i \
|
||||
-e 's/"createUpdaterArtifacts": true/"createUpdaterArtifacts": false/' \
|
||||
src-tauri/tauri.conf.json || die
|
||||
}
|
||||
|
||||
src_compile() {
|
||||
local -x CI=true
|
||||
local -x npm_config_audit=false
|
||||
local -x npm_config_fund=false
|
||||
local -x npm_config_update_notifier=false
|
||||
|
||||
npm install || die "npm install failed"
|
||||
npm run tauri -- build --no-bundle || die "tauri build failed"
|
||||
}
|
||||
|
||||
src_install() {
|
||||
dobin src-tauri/target/release/emerald-legacy-launcher
|
||||
|
||||
newicon -s 32 src-tauri/icons/32x32.png emerald-legacy-launcher.png
|
||||
newicon -s 64 src-tauri/icons/64x64.png emerald-legacy-launcher.png
|
||||
newicon -s 128 src-tauri/icons/128x128.png emerald-legacy-launcher.png
|
||||
newicon -s 256 src-tauri/icons/128x128@2x.png emerald-legacy-launcher.png
|
||||
newicon -s 512 src-tauri/icons/icon.png emerald-legacy-launcher.png
|
||||
|
||||
domenu "${FILESDIR}"/emerald-legacy-launcher.desktop
|
||||
|
||||
insinto /usr/share/metainfo
|
||||
newins flatpak/io.github.Emerald_Legacy_Launcher.Emerald_Legacy_Launcher.metainfo.xml \
|
||||
io.github.Emerald_Legacy_Launcher.Emerald_Legacy_Launcher.metainfo.xml
|
||||
|
||||
dodoc README.md LICENSE
|
||||
}
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
[Desktop Entry]
|
||||
Name=LCE Emerald Launcher
|
||||
Comment=FOSS cross-platform launcher for Minecraft Legacy Console Edition
|
||||
Exec=emerald-legacy-launcher %u
|
||||
Icon=emerald-legacy-launcher
|
||||
Type=Application
|
||||
Categories=Game;
|
||||
MimeType=x-scheme-handler/emerald;x-scheme-handler/emeraldlauncher;x-scheme-handler/discord-1482504445152460871;
|
||||
StartupNotify=true
|
||||
StartupWMClass=emerald-legacy-launcher
|
||||
Terminal=false
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
|
||||
<pkgmetadata>
|
||||
<upstream>
|
||||
<remote-id type="github">LCE-Hub/LCE-Emerald-Launcher</remote-id>
|
||||
<bugs-to>https://github.com/LCE-Hub/LCE-Emerald-Launcher/issues</bugs-to>
|
||||
</upstream>
|
||||
<longdescription lang="en">
|
||||
LCE Emerald Launcher is a FOSS cross-platform Tauri launcher for
|
||||
Minecraft Legacy Console Edition. It installs community builds,
|
||||
manages versions, skins, and workshop content, and launches the game
|
||||
via Wine/Proton on Linux.
|
||||
</longdescription>
|
||||
</pkgmetadata>
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
masters = gentoo
|
||||
thin-manifests = true
|
||||
sign-manifests = false
|
||||
|
|
@ -1 +0,0 @@
|
|||
emerald-legacy-launcher
|
||||
24
index.html
|
|
@ -1,24 +0,0 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<script>
|
||||
if (/Android/i.test(navigator.userAgent)) {
|
||||
document.documentElement.classList.add("is-android");
|
||||
document
|
||||
.querySelector('meta[name="viewport"]')
|
||||
.setAttribute("content", "width=1280");
|
||||
}
|
||||
</script>
|
||||
<link rel="preload" href="/fonts/Mojangles.ttf" as="font" type="font/truetype" crossorigin>
|
||||
<link rel="preload" href="/images/MenuTitle.png" as="image">
|
||||
<title>Emerald Legacy Launcher</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/main.tsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
135
nix/package.nix
|
|
@ -1,135 +0,0 @@
|
|||
{
|
||||
lib,
|
||||
stdenv,
|
||||
rustPlatform,
|
||||
cargo-tauri,
|
||||
nodejs,
|
||||
pkg-config,
|
||||
pnpm_10,
|
||||
fetchPnpmDeps,
|
||||
pnpmConfigHook,
|
||||
wrapGAppsHook4,
|
||||
openssl,
|
||||
webkitgtk_4_1,
|
||||
glib-networking,
|
||||
libayatana-appindicator,
|
||||
librsvg,
|
||||
udev,
|
||||
version ? "1.5.1",
|
||||
src ? null,
|
||||
}:
|
||||
|
||||
# Disable updater artifact signing — Nix builds have no Tauri signing key.
|
||||
let
|
||||
tauriConfOverride = builtins.toFile "tauri-nix.conf.json" ''
|
||||
{
|
||||
"bundle": {
|
||||
"createUpdaterArtifacts": false
|
||||
}
|
||||
}
|
||||
'';
|
||||
|
||||
defaultSrc = lib.cleanSourceWith {
|
||||
src = ../.;
|
||||
filter =
|
||||
path: _type:
|
||||
let
|
||||
baseName = baseNameOf path;
|
||||
in
|
||||
!(builtins.elem baseName [
|
||||
".git"
|
||||
"node_modules"
|
||||
"target"
|
||||
"dist"
|
||||
"build-flatpak"
|
||||
"emerald-repo"
|
||||
"result"
|
||||
"result-dev"
|
||||
]);
|
||||
};
|
||||
in
|
||||
rustPlatform.buildRustPackage (finalAttrs: {
|
||||
pname = "emerald-legacy-launcher";
|
||||
inherit version;
|
||||
|
||||
src = if src != null then src else defaultSrc;
|
||||
|
||||
cargoRoot = "src-tauri";
|
||||
buildAndTestSubdir = finalAttrs.cargoRoot;
|
||||
|
||||
cargoHash = "sha256-tSbFyle2eQ5Dw9fTXloIepOZU1UxhkF6/KZBRXehm4w=";
|
||||
|
||||
pnpmDeps = fetchPnpmDeps {
|
||||
inherit (finalAttrs) pname version src;
|
||||
pnpm = pnpm_10;
|
||||
fetcherVersion = 3;
|
||||
hash = "sha256-6na8YlSTkdnSse8DQjBnTBpfmKSYj3+1FLWVyyfUx1g=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
cargo-tauri.hook
|
||||
nodejs
|
||||
pkg-config
|
||||
pnpmConfigHook
|
||||
pnpm_10
|
||||
]
|
||||
++ lib.optionals stdenv.hostPlatform.isLinux [ wrapGAppsHook4 ];
|
||||
|
||||
buildInputs = [
|
||||
openssl
|
||||
]
|
||||
++ lib.optionals stdenv.hostPlatform.isLinux [
|
||||
glib-networking
|
||||
libayatana-appindicator
|
||||
librsvg
|
||||
udev
|
||||
webkitgtk_4_1
|
||||
];
|
||||
|
||||
tauriBuildFlags = [
|
||||
"-c"
|
||||
tauriConfOverride
|
||||
];
|
||||
|
||||
postPatch = lib.optionalString stdenv.hostPlatform.isLinux ''
|
||||
substituteInPlace "$cargoDepsCopy"/*/libappindicator-sys-*/src/lib.rs \
|
||||
--replace-fail "libayatana-appindicator3.so.1" \
|
||||
"${libayatana-appindicator}/lib/libayatana-appindicator3.so.1"
|
||||
'';
|
||||
|
||||
# Prefer the project's pnpm frontend build over the npm beforeBuildCommand.
|
||||
preBuild = ''
|
||||
substituteInPlace src-tauri/tauri.conf.json \
|
||||
--replace-fail '"beforeBuildCommand": "npm run build"' \
|
||||
'"beforeBuildCommand": "pnpm run build"'
|
||||
'';
|
||||
|
||||
preFixup = lib.optionalString stdenv.hostPlatform.isLinux ''
|
||||
gappsWrapperArgs+=(
|
||||
--prefix LD_LIBRARY_PATH : ${
|
||||
lib.makeLibraryPath [
|
||||
libayatana-appindicator
|
||||
udev
|
||||
]
|
||||
}
|
||||
)
|
||||
'';
|
||||
|
||||
doCheck = false;
|
||||
|
||||
env = {
|
||||
CI = "true";
|
||||
};
|
||||
|
||||
meta = {
|
||||
description = "FOSS cross-platform launcher for Minecraft Legacy Console Edition";
|
||||
homepage = "https://github.com/LCE-Hub/LCE-Emerald-Launcher";
|
||||
changelog = lib.mkIf (!(lib.hasPrefix "unstable-" version)) (
|
||||
"https://github.com/LCE-Hub/LCE-Emerald-Launcher/releases/tag/v${version}"
|
||||
);
|
||||
license = lib.licenses.gpl3Only;
|
||||
mainProgram = "emerald-legacy-launcher";
|
||||
platforms = lib.platforms.linux ++ lib.platforms.darwin;
|
||||
maintainers = [ ];
|
||||
};
|
||||
})
|
||||
4741
package-lock.json
generated
55
package.json
|
|
@ -1,55 +0,0 @@
|
|||
{
|
||||
"name": "emerald-legacy-launcher",
|
||||
"private": true,
|
||||
"version": "1.6.1",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "tsc && vite build",
|
||||
"preview": "vite preview",
|
||||
"tauri": "tauri",
|
||||
"tauri:build": "tauri build && pnpm run post-build:macos",
|
||||
"post-build:macos": "bash src-tauri/scripts/post-build-macos.sh",
|
||||
"android:assets": "node scripts/download-android-assets.mjs",
|
||||
"flatpak": "flatpak-builder --user --install-deps-from=flathub --repo=emerald-repo --force-clean build-flatpak flatpak/io.github.Emerald_Legacy_Launcher.Emerald_Legacy_Launcher.yml && flatpak build-bundle emerald-repo emerald.flatpak io.github.Emerald_Legacy_Launcher.Emerald_Legacy_Launcher",
|
||||
"goldmapper": "node scripts/build-goldmapper.mjs"
|
||||
},
|
||||
"dependencies": {
|
||||
"@tauri-apps/api": "^2",
|
||||
"@tauri-apps/plugin-deep-link": "~2.4.9",
|
||||
"@tauri-apps/plugin-opener": "^2",
|
||||
"@tauri-apps/plugin-process": "~2.3.1",
|
||||
"@tauri-apps/plugin-updater": "~2.10.1",
|
||||
"framer-motion": "^12.36.0",
|
||||
"i18next": "^26.4.0",
|
||||
"i18next-browser-languagedetector": "^8.2.1",
|
||||
"pako": "^2.1.0",
|
||||
"qrcode": "^1.5.4",
|
||||
"react": "^19.1.0",
|
||||
"react-dom": "^19.1.0",
|
||||
"react-i18next": "^17.0.12",
|
||||
"react-markdown": "^10.1.0",
|
||||
"rehype-raw": "^7.0.0",
|
||||
"rehype-sanitize": "^6.0.0",
|
||||
"remark-gfm": "^4.0.1",
|
||||
"three": "^0.183.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/postcss": "^4.2.1",
|
||||
"@tailwindcss/vite": "^4.2.1",
|
||||
"@tauri-apps/cli": "^2",
|
||||
"@types/pako": "^2.0.4",
|
||||
"@types/qrcode": "^1.5.6",
|
||||
"@types/react": "^19.1.8",
|
||||
"@types/react-dom": "^19.1.6",
|
||||
"@types/three": "^0.183.1",
|
||||
"@vitejs/plugin-react": "^4.6.0",
|
||||
"autoprefixer": "^10.4.27",
|
||||
"postcss": "^8.5.8",
|
||||
"tailwindcss": "^4.2.1",
|
||||
"tauri-plugin-drpc": "^1.0.3",
|
||||
"tauri-plugin-gamepad-api": "^0.0.5",
|
||||
"typescript": "~5.8.3",
|
||||
"vite": "^7.0.4"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
#!/bin/sh
|
||||
#neo: credits: https://github.com/cjonas1999/OverBind/blob/master/pkg/AppImage/AppImage.sh
|
||||
set -eu
|
||||
ARCH="$(uname -m)"
|
||||
SHARUN_REPO="https://raw.githubusercontent.com/pkgforge-dev/Anylinux-AppImages"
|
||||
_commits_json=$(mktemp)
|
||||
wget -qO "$_commits_json" \
|
||||
"https://api.github.com/repos/pkgforge-dev/Anylinux-AppImages/commits?path=useful-tools/&per_page=100"
|
||||
|
||||
STABLE_SHA=$(node -e "
|
||||
const data = JSON.parse(require('fs').readFileSync('$_commits_json', 'utf8'));
|
||||
const now = Date.now(), h24 = 864e5;
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
const t = new Date(data[i].commit.committer.date).getTime();
|
||||
if (now - t < h24) continue;
|
||||
const prev = data[i - 1];
|
||||
if (!prev || new Date(prev.commit.committer.date).getTime() - t >= h24) {
|
||||
process.stdout.write(data[i].sha);
|
||||
process.exit(0);
|
||||
}
|
||||
}
|
||||
process.stderr.write('No settled commit found in last 100 commits\n');
|
||||
process.exit(1);
|
||||
")
|
||||
rm -f "$_commits_json"
|
||||
echo "Pinning sharun scripts to settled commit $STABLE_SHA"
|
||||
SHARUN="$SHARUN_REPO/$STABLE_SHA/useful-tools/quick-sharun.sh"
|
||||
DEBLOATED_PKGS="$SHARUN_REPO/$STABLE_SHA/useful-tools/get-debloated-pkgs.sh"
|
||||
#export UPINFO="gh-releases-zsync|${GITHUB_REPOSITORY%/*}|${GITHUB_REPOSITORY#*/}|latest|*$ARCH.AppImage.zsync"
|
||||
export OUTNAME=Emerald-Legacy-Launcher-anylinux-"$ARCH".AppImage
|
||||
export DESKTOP="/usr/share/applications/LCE Emerald Launcher.desktop"
|
||||
export ICON=/usr/share/icons/hicolor/256x256@2/apps/emerald-legacy-launcher.png
|
||||
export DEPLOY_OPENGL=1
|
||||
rm -rf AppDir dist appinfo
|
||||
wget --retry-connrefused --tries=30 "$DEBLOATED_PKGS" -O ./get-debloated-pkgs
|
||||
wget --retry-connrefused --tries=30 "$SHARUN" -O ./quick-sharun
|
||||
chmod +x ./quick-sharun ./get-debloated-pkgs
|
||||
./get-debloated-pkgs --add-common --prefer-nano
|
||||
./quick-sharun \
|
||||
/usr/bin/emerald-legacy-launcher \
|
||||
/usr/lib/libayatana-appindicator*.so*
|
||||
|
||||
mkdir -p "AppDir/usr/lib"
|
||||
cp -r "/usr/lib/LCE Emerald Launcher" "AppDir/usr/lib/"
|
||||
./quick-sharun --make-appimage
|
||||
mkdir -p ./dist
|
||||
mv -v ./*.AppImage* ./dist
|
||||
echo "All Done!"
|
||||
3136
pnpm-lock.yaml
|
|
@ -1,2 +0,0 @@
|
|||
onlyBuiltDependencies:
|
||||
- esbuild
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
export default {
|
||||
plugins: {
|
||||
'@tailwindcss/postcss': {},
|
||||
},
|
||||
}
|
||||
|
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 28 KiB |
BIN
public/images/tooltips/Durango/A.png
Normal file
|
After Width: | Height: | Size: 191 B |
BIN
public/images/tooltips/Durango/A_BG_S.png
Normal file
|
After Width: | Height: | Size: 330 B |
BIN
public/images/tooltips/Durango/B.png
Normal file
|
After Width: | Height: | Size: 174 B |
BIN
public/images/tooltips/Durango/BG.png
Normal file
|
After Width: | Height: | Size: 283 B |
BIN
public/images/tooltips/Durango/B_BG_S.png
Normal file
|
After Width: | Height: | Size: 340 B |
BIN
public/images/tooltips/Durango/X.png
Normal file
|
After Width: | Height: | Size: 169 B |
BIN
public/images/tooltips/Durango/X_BG_S.png
Normal file
|
After Width: | Height: | Size: 318 B |
BIN
public/music/Moog City 2.ogg
Normal file
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 117 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 74 KiB |
|
|
@ -141,6 +141,8 @@
|
|||
},
|
||||
"versions": {
|
||||
"title": "Versions",
|
||||
"play": "Play",
|
||||
"stop": "Stop",
|
||||
"custom": "Custom",
|
||||
"updateAvailable": "Update Available!",
|
||||
"repair": "Repair",
|
||||
|
|
@ -141,6 +141,8 @@
|
|||
},
|
||||
"versions": {
|
||||
"title": "Versions",
|
||||
"play": "Jouer",
|
||||
"stop": "Arrêter",
|
||||
"custom": "Modifié",
|
||||
"updateAvailable": "Mise à jour disponible!",
|
||||
"repair": "Réparer",
|
||||
|
|
@ -141,6 +141,8 @@
|
|||
},
|
||||
"versions": {
|
||||
"title": "Версии",
|
||||
"play": "Играть",
|
||||
"stop": "Остановить",
|
||||
"custom": "Кастомные",
|
||||
"updateAvailable": "Доступно обновление!",
|
||||
"repair": "Ремонт",
|
||||
|
|
@ -1,76 +0,0 @@
|
|||
import { spawnSync } from "node:child_process";
|
||||
import { existsSync, copyFileSync, mkdirSync, readdirSync } from "node:fs";
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
const SCRIPT_DIR = path.dirname(fileURLToPath(import.meta.url));
|
||||
const ROOT_DIR = path.resolve(SCRIPT_DIR, "..");
|
||||
const GOLDMAPPER_DIR = path.join(ROOT_DIR, "GoldMapper");
|
||||
const BUILD_DIR = path.join(GOLDMAPPER_DIR, "build");
|
||||
const RESOURCES_DIR = path.join(ROOT_DIR, "src-tauri", "resources");
|
||||
const TOOLCHAIN_MINGW = path.join(SCRIPT_DIR, "toolchain-mingw.cmake");
|
||||
const IS_WINDOWS = process.platform === "win32";
|
||||
function run(cmd, args, cwd) {
|
||||
console.log(`> ${cmd} ${args.join(" ")}`);
|
||||
const res = spawnSync(cmd, args, {
|
||||
cwd,
|
||||
stdio: "inherit",
|
||||
shell: IS_WINDOWS,
|
||||
});
|
||||
if (res.status !== 0) {
|
||||
process.exit(res.status ?? 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
!existsSync(
|
||||
path.join(GOLDMAPPER_DIR, "third_party", "minhook", "include", "MinHook.h"),
|
||||
)
|
||||
) {
|
||||
console.log("Initializing minhook submodule...");
|
||||
run(
|
||||
"git",
|
||||
["-C", GOLDMAPPER_DIR, "submodule", "update", "--init", "--recursive"],
|
||||
ROOT_DIR,
|
||||
);
|
||||
}
|
||||
|
||||
console.log("Configuring GoldMapper...");
|
||||
const configureArgs = ["-B", BUILD_DIR, "-DCMAKE_BUILD_TYPE=Release"];
|
||||
if (!IS_WINDOWS) {
|
||||
configureArgs.push("-DCMAKE_TOOLCHAIN_FILE=" + TOOLCHAIN_MINGW);
|
||||
}
|
||||
configureArgs.push(GOLDMAPPER_DIR);
|
||||
run("cmake", configureArgs, ROOT_DIR);
|
||||
console.log("Building GoldMapper...");
|
||||
run("cmake", ["--build", BUILD_DIR, "--config", "Release"], ROOT_DIR);
|
||||
console.log("Copying binaries to resources...");
|
||||
mkdirSync(RESOURCES_DIR, { recursive: true });
|
||||
const outputs = [
|
||||
{
|
||||
source: "GoldMapperLib.dll",
|
||||
names: ["GoldMapperLib.dll", "libGoldMapperLib.dll"], //neo: dont ask me vro idk why it does that
|
||||
},
|
||||
{ source: "GoldMapperLauncher.exe", names: ["GoldMapperLauncher.exe"] },
|
||||
];
|
||||
|
||||
for (const entry of outputs) {
|
||||
const dir = entry.dir ?? BUILD_DIR;
|
||||
const file = path.join(dir, entry.source);
|
||||
if (existsSync(file)) {
|
||||
copyFileSync(file, path.join(RESOURCES_DIR, entry.source));
|
||||
continue;
|
||||
}
|
||||
const candidate = readdirSync(dir).find((f) =>
|
||||
entry.names.some((n) => f.toLowerCase() === n.toLowerCase()),
|
||||
);
|
||||
if (!candidate) {
|
||||
console.error(`Missing build output: ${entry.source}`);
|
||||
process.exit(1);
|
||||
}
|
||||
copyFileSync(
|
||||
path.join(dir, candidate),
|
||||
path.join(RESOURCES_DIR, entry.source),
|
||||
);
|
||||
}
|
||||
|
||||
console.log("GoldMapper build complete.");
|
||||
|
|
@ -1,109 +0,0 @@
|
|||
#!/usr/bin/env node
|
||||
import {
|
||||
createWriteStream,
|
||||
createReadStream,
|
||||
existsSync,
|
||||
unlinkSync,
|
||||
} from "node:fs";
|
||||
import { mkdir, rename } from "node:fs/promises";
|
||||
import { createHash } from "node:crypto";
|
||||
import { Readable } from "node:stream";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import path from "node:path";
|
||||
const RELEASE_TAG = "android-assets-v1";
|
||||
const REPO = "LCE-Hub/LCE-Emerald-Launcher";
|
||||
const ASSET_DIR = fileURLToPath(
|
||||
new URL("../src-tauri/gen/android/app/src/main/assets/", import.meta.url),
|
||||
);
|
||||
|
||||
const ASSETS = [
|
||||
{
|
||||
file: "imagefs.tar.zst",
|
||||
sha256: "7838756e6a05c91afff68f4bf12aa2780f815877753f8dd354e203e99b9caf8a",
|
||||
},
|
||||
{
|
||||
file: "proton-11.0-arm64ec.tar.zst",
|
||||
sha256: "ceb768396c2d44256518f94ae236f0c1f40738cf050a52e990e2fef67ff161df",
|
||||
},
|
||||
];
|
||||
|
||||
function sha256File(file) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const hash = createHash("sha256");
|
||||
const stream = createReadStream(file);
|
||||
stream.on("data", (chunk) => hash.update(chunk));
|
||||
stream.on("end", () => resolve(hash.digest("hex")));
|
||||
stream.on("error", reject);
|
||||
});
|
||||
}
|
||||
|
||||
async function download(url, dest) {
|
||||
const res = await fetch(url, { redirect: "follow" });
|
||||
if (!res.ok) {
|
||||
throw new Error(`HTTP ${res.status} ${res.statusText} for ${url}`);
|
||||
}
|
||||
|
||||
if (!res.body) {
|
||||
throw new Error(`no response body for ${url}`);
|
||||
}
|
||||
|
||||
const fileStream = createWriteStream(dest);
|
||||
await new Promise((resolve, reject) => {
|
||||
const body = Readable.fromWeb(res.body);
|
||||
body.pipe(fileStream);
|
||||
body.on("error", reject);
|
||||
fileStream.on("finish", resolve);
|
||||
fileStream.on("error", reject);
|
||||
});
|
||||
}
|
||||
|
||||
let failed = false;
|
||||
for (const asset of ASSETS) {
|
||||
const target = path.join(ASSET_DIR, asset.file);
|
||||
if (existsSync(target)) {
|
||||
const actual = await sha256File(target);
|
||||
if (actual === asset.sha256) {
|
||||
console.log(`okay ${asset.file} (up to date)`);
|
||||
continue;
|
||||
}
|
||||
|
||||
console.error(
|
||||
`error ${asset.file}: sha256 mismatch (expected ${asset.sha256}, got ${actual}); delete it and rerun`,
|
||||
);
|
||||
|
||||
failed = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
const url = `https://github.com/${REPO}/releases/download/${RELEASE_TAG}/${asset.file}`;
|
||||
console.log(`get ${asset.file} <- ${url}`);
|
||||
await mkdir(path.dirname(target), { recursive: true });
|
||||
const tmp = target + ".part";
|
||||
try {
|
||||
await download(url, tmp);
|
||||
const actual = await sha256File(tmp);
|
||||
if (actual !== asset.sha256) {
|
||||
console.error(
|
||||
`error ${asset.file}: downloaded sha256 mismatch (expected ${asset.sha256}, got ${actual})`,
|
||||
);
|
||||
|
||||
failed = true;
|
||||
if (existsSync(tmp)) {
|
||||
unlinkSync(tmp);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
await rename(tmp, target);
|
||||
console.log(`okay ${asset.file} (downloaded)`);
|
||||
} catch (error) {
|
||||
console.error(`error ${asset.file}: ${error.message}`);
|
||||
failed = true;
|
||||
if (existsSync(tmp)) {
|
||||
unlinkSync(tmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
process.exit(failed ? 1 : 0);
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Fix macOS quarantine issue for ARM builds fuck apple man
|
||||
# This script removes quarantine attributes from the built app
|
||||
|
||||
set -e
|
||||
|
||||
APP_PATH="$1"
|
||||
BUNDLE_ID="com.emerald.legacy"
|
||||
|
||||
if [ -z "$APP_PATH" ]; then
|
||||
echo "Usage: $0 <path-to-app-bundle>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -d "$APP_PATH" ]; then
|
||||
echo "Error: App bundle not found at $APP_PATH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Fixing macOS quarantine for: $APP_PATH"
|
||||
|
||||
# Remove quarantine attributes
|
||||
xattr -cr "$APP_PATH"
|
||||
|
||||
# Add basic code signing (ad-hoc signature)
|
||||
codesign --force --deep --sign - "$APP_PATH" 2>/dev/null || {
|
||||
echo "Warning: Code signing failed, but quarantine removal should work"
|
||||
}
|
||||
|
||||
echo "macOS quarantine fix completed"
|
||||
echo "The app should now launch without 'damaged' error"
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Post-install script for PKG installer
|
||||
# Automatically removes quarantine attributes from the installed app
|
||||
|
||||
APP_PATH="$2/Applications/Emerald Legacy Launcher.app"
|
||||
|
||||
echo "Removing quarantine attributes from Emerald Legacy Launcher..."
|
||||
|
||||
if [ -d "$APP_PATH" ]; then
|
||||
xattr -cr "$APP_PATH"
|
||||
echo "Quarantine attributes removed successfully."
|
||||
exit 0
|
||||
else
|
||||
echo "Warning: App not found at expected location: $APP_PATH"
|
||||
exit 1
|
||||
fi
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
set(CMAKE_SYSTEM_NAME Windows)
|
||||
set(CMAKE_SYSTEM_PROCESSOR x86_64)
|
||||
set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
|
||||
set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
|
||||
set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
|
||||
|
|
@ -1,81 +0,0 @@
|
|||
import argparse
|
||||
import re
|
||||
import os
|
||||
|
||||
def update_stable(version, intel_hash, arm_hash, linux_hash):
|
||||
cask_path = "Casks/lce-emerald-launcher.rb"
|
||||
formula_path = "Formula/lce-emerald-launcher.rb"
|
||||
|
||||
# Update Cask
|
||||
if os.path.exists(cask_path):
|
||||
with open(cask_path, 'r') as f:
|
||||
content = f.read()
|
||||
|
||||
# Replace version
|
||||
content = re.sub(r'^\s*version\s+"[^"]+"', f' version "{version}"', content, flags=re.MULTILINE)
|
||||
# Replace sha256 block
|
||||
content = re.sub(r'sha256\s+intel:\s+"[a-f0-9]+",\r?\n\s+arm:\s+"[a-f0-9]+"',
|
||||
f'sha256 intel: "{intel_hash}",\n arm: "{arm_hash}"',
|
||||
content)
|
||||
|
||||
with open(cask_path, 'w') as f:
|
||||
f.write(content)
|
||||
print(f"Updated {cask_path}")
|
||||
else:
|
||||
print(f"Error: {cask_path} not found")
|
||||
|
||||
# Update Formula
|
||||
if os.path.exists(formula_path):
|
||||
with open(formula_path, 'r') as f:
|
||||
content = f.read()
|
||||
|
||||
# Replace version
|
||||
content = re.sub(r'^\s*version\s+"[^"]+"', f' version "{version}"', content, flags=re.MULTILINE)
|
||||
# Replace sha256
|
||||
content = re.sub(r'^\s*sha256\s+"[a-f0-9]+"', f' sha256 "{linux_hash}"', content, flags=re.MULTILINE)
|
||||
|
||||
with open(formula_path, 'w') as f:
|
||||
f.write(content)
|
||||
print(f"Updated {formula_path}")
|
||||
else:
|
||||
print(f"Error: {formula_path} not found")
|
||||
|
||||
def update_experimental(version, intel_hash, arm_hash):
|
||||
cask_path = "Casks/lce-emerald-launcher-experimental.rb"
|
||||
|
||||
if os.path.exists(cask_path):
|
||||
with open(cask_path, 'r') as f:
|
||||
content = f.read()
|
||||
|
||||
# Replace version
|
||||
content = re.sub(r'^\s*version\s+"[^"]+"', f' version "{version}"', content, flags=re.MULTILINE)
|
||||
# Replace sha256 block
|
||||
content = re.sub(r'sha256\s+intel:\s+"[a-f0-9]+",\r?\n\s+arm:\s+"[a-f0-9]+"',
|
||||
f'sha256 intel: "{intel_hash}",\n arm: "{arm_hash}"',
|
||||
content)
|
||||
|
||||
with open(cask_path, 'w') as f:
|
||||
f.write(content)
|
||||
print(f"Updated {cask_path}")
|
||||
else:
|
||||
print(f"Error: {cask_path} not found")
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Update Homebrew Formula/Cask files")
|
||||
parser.add_argument("--type", choices=["stable" ], required=True)
|
||||
parser.add_argument("--version", required=True)
|
||||
parser.add_argument("--intel-hash", required=True)
|
||||
parser.add_argument("--arm-hash", required=True)
|
||||
parser.add_argument("--linux-hash")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.type == "stable":
|
||||
if not args.linux_hash:
|
||||
raise ValueError("--linux-hash is required for stable update")
|
||||
update_stable(args.version, args.intel_hash, args.arm_hash, args.linux_hash)
|
||||
elif args.type == "experimental":
|
||||
update_experimental(args.version, args.intel_hash, args.arm_hash)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
import argparse
|
||||
import re
|
||||
import sys
|
||||
|
||||
|
||||
def update_flake(version: str, src_hash: str) -> None:
|
||||
path = "flake.nix"
|
||||
with open(path, "r", encoding="utf-8") as f:
|
||||
content = f.read()
|
||||
|
||||
new_content, n_version = re.subn(
|
||||
r'stableVersion = "[^"]*";',
|
||||
f'stableVersion = "{version}";',
|
||||
content,
|
||||
count=1,
|
||||
)
|
||||
new_content, n_hash = re.subn(
|
||||
r'stableSrcHash = "[^"]*";',
|
||||
f'stableSrcHash = "{src_hash}";',
|
||||
new_content,
|
||||
count=1,
|
||||
)
|
||||
|
||||
if n_version != 1 or n_hash != 1:
|
||||
print(
|
||||
f"Error: expected to update stableVersion and stableSrcHash once each "
|
||||
f"(got version={n_version}, hash={n_hash})",
|
||||
file=sys.stderr,
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
with open(path, "w", encoding="utf-8") as f:
|
||||
f.write(new_content)
|
||||
|
||||
print(f"Updated {path}: stableVersion={version} stableSrcHash={src_hash}")
|
||||
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Update flake.nix stableVersion and stableSrcHash"
|
||||
)
|
||||
parser.add_argument("--version", required=True, help="Stable version without v prefix")
|
||||
parser.add_argument("--src-hash", required=True, help="SRI sha256 of the release source")
|
||||
args = parser.parse_args()
|
||||
update_flake(args.version, args.src_hash)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
7
src-tauri/.gitignore
vendored
|
|
@ -1,7 +0,0 @@
|
|||
# Generated by Cargo
|
||||
# will have compiled files and executables
|
||||
/target/
|
||||
|
||||
# Generated by Tauri
|
||||
# will have schema files for capabilities auto-completion
|
||||
/gen/schemas
|
||||
7130
src-tauri/Cargo.lock
generated
|
|
@ -1,54 +0,0 @@
|
|||
[package]
|
||||
name = "emerald-legacy-launcher"
|
||||
version = "1.6.1"
|
||||
description = "A FOSS, cross-platform launcher for Minecraft Legacy Edition"
|
||||
authors = ["Emerald Team"]
|
||||
edition = "2024"
|
||||
|
||||
[lib]
|
||||
name = "emerald_lib"
|
||||
crate-type = ["staticlib", "cdylib", "rlib"]
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "2", features = [] }
|
||||
|
||||
[dependencies]
|
||||
tauri = { version = "2", features = ["protocol-asset", "tray-icon", "image-png"] }
|
||||
tauri-plugin-opener = "2"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
tauri-plugin-gamepad = "0.0.5"
|
||||
reqwest = { version = "0.11", default-features = false, features = ["stream", "json", "rustls-tls-webpki-roots", "socks"] }
|
||||
tokio = { version = "1", features = ["full"] }
|
||||
futures-util = "0.3"
|
||||
tokio-util = { version = "0.7.18", features = ["rt"] }
|
||||
base64 = "0.21"
|
||||
tokio-tungstenite = { version = "0.21", default-features = false, features = ["connect", "rustls-tls-webpki-roots"] }
|
||||
url = "2"
|
||||
rand = "0.8"
|
||||
http = "1"
|
||||
libc = "0.2"
|
||||
image = "0.24"
|
||||
steam_shortcuts_util = "1.1.8"
|
||||
tauri-plugin-process = "2"
|
||||
byteorder = "1"
|
||||
flate2 = "1"
|
||||
once_cell = "1"
|
||||
lzxd = "0.2.6"
|
||||
uuid = { version = "1", features = ["v4"] }
|
||||
tauri-plugin-deep-link = "2"
|
||||
|
||||
[target.'cfg(target_os = "android")'.dependencies]
|
||||
wry = { version = "0.54", default-features = false }
|
||||
jni = "0.21"
|
||||
|
||||
[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies]
|
||||
tauri-plugin-updater = "2"
|
||||
tauri-plugin-drpc = "*"
|
||||
tauri-plugin-single-instance = "2"
|
||||
rfd = "0.15"
|
||||
|
||||
#neo: enable portable appimages. revert back to crates.io once the PR is merged
|
||||
#[patch.crates-io]
|
||||
#tauri = { git = "https://github.com/tauri-apps/tauri", branch = "feat/truly-portable-appimage" }
|
||||
#end neo
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
fn main() {
|
||||
tauri_build::build();
|
||||
}
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
{
|
||||
"identifier": "default",
|
||||
"description": "Default permissions",
|
||||
"platforms": ["windows", "linux", "macOS"],
|
||||
"windows": ["main"],
|
||||
"permissions": [
|
||||
"core:default",
|
||||
"core:app:default",
|
||||
"core:event:default",
|
||||
"core:image:default",
|
||||
"core:menu:default",
|
||||
"core:path:default",
|
||||
"core:resources:default",
|
||||
"core:tray:default",
|
||||
"core:webview:default",
|
||||
"core:webview:allow-create-webview-window",
|
||||
"core:window:default",
|
||||
"core:window:allow-set-decorations",
|
||||
"core:window:allow-is-fullscreen",
|
||||
"core:window:allow-minimize",
|
||||
"core:window:allow-toggle-maximize",
|
||||
"core:window:allow-close",
|
||||
"opener:default",
|
||||
"gamepad:default",
|
||||
"drpc:default",
|
||||
"updater:default",
|
||||
{
|
||||
"identifier": "opener:allow-open-path",
|
||||
"allow": [
|
||||
{
|
||||
"path": "**"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"identifier": "opener:allow-reveal-item-in-dir",
|
||||
"allow": [
|
||||
{
|
||||
"path": "**"
|
||||
}
|
||||
]
|
||||
},
|
||||
"process:default",
|
||||
"deep-link:default",
|
||||
"core:window:allow-start-dragging"
|
||||
]
|
||||
}
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"identifier": "desktop-capability",
|
||||
"platforms": ["macOS", "windows", "linux"],
|
||||
"windows": ["main"],
|
||||
"permissions": [
|
||||
"updater:default",
|
||||
"process:default",
|
||||
"deep-link:default",
|
||||
"core:window:allow-start-dragging"
|
||||
]
|
||||
}
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
{
|
||||
"identifier": "mobile-capability",
|
||||
"description": "Mobile permissions",
|
||||
"platforms": ["android", "iOS"],
|
||||
"windows": ["main"],
|
||||
"permissions": [
|
||||
"core:default",
|
||||
"core:app:default",
|
||||
"core:event:default",
|
||||
"core:image:default",
|
||||
"core:path:default",
|
||||
"core:resources:default",
|
||||
"core:webview:default",
|
||||
"core:webview:allow-create-webview-window",
|
||||
"core:window:default",
|
||||
"opener:default",
|
||||
{
|
||||
"identifier": "opener:allow-open-path",
|
||||
"allow": [
|
||||
{
|
||||
"path": "**"
|
||||
}
|
||||
]
|
||||
},
|
||||
"gamepad:default",
|
||||
"process:default",
|
||||
"deep-link:default"
|
||||
]
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = false
|
||||
insert_final_newline = false
|
||||
20
src-tauri/gen/android/.gitignore
vendored
|
|
@ -1,20 +0,0 @@
|
|||
*.iml
|
||||
.gradle
|
||||
/local.properties
|
||||
/.idea/caches
|
||||
/.idea/libraries
|
||||
/.idea/modules.xml
|
||||
/.idea/workspace.xml
|
||||
/.idea/navEditor.xml
|
||||
/.idea/assetWizardSettings.xml
|
||||
.DS_Store
|
||||
build
|
||||
/captures
|
||||
.externalNativeBuild
|
||||
.cxx
|
||||
local.properties
|
||||
key.properties
|
||||
release.keystore
|
||||
|
||||
/.tauri
|
||||
/tauri.settings.gradle
|
||||
6
src-tauri/gen/android/app/.gitignore
vendored
|
|
@ -1,6 +0,0 @@
|
|||
/src/main/**/generated
|
||||
/src/main/jniLibs/**/*.so
|
||||
/src/main/assets/tauri.conf.json
|
||||
/tauri.build.gradle.kts
|
||||
/proguard-tauri.pro
|
||||
/tauri.properties
|
||||
|
|
@ -1,93 +0,0 @@
|
|||
import java.util.Properties
|
||||
|
||||
plugins {
|
||||
id("com.android.application")
|
||||
id("org.jetbrains.kotlin.android")
|
||||
id("rust")
|
||||
}
|
||||
|
||||
val tauriProperties = Properties().apply {
|
||||
val propFile = file("tauri.properties")
|
||||
if (propFile.exists()) {
|
||||
propFile.inputStream().use { load(it) }
|
||||
}
|
||||
}
|
||||
|
||||
val keystoreProperties = Properties().apply {
|
||||
val propFile = file("key.properties")
|
||||
if (propFile.exists()) {
|
||||
propFile.inputStream().use { load(it) }
|
||||
}
|
||||
}
|
||||
|
||||
android {
|
||||
signingConfigs {
|
||||
create("release") {
|
||||
keyAlias = keystoreProperties.getProperty("keyAlias")
|
||||
keyPassword = keystoreProperties.getProperty("keyPassword")
|
||||
storeFile = file(keystoreProperties.getProperty("storeFile"))
|
||||
storePassword = keystoreProperties.getProperty("storePassword")
|
||||
}
|
||||
}
|
||||
compileSdk = 36
|
||||
namespace = "com.emerald.legacy"
|
||||
defaultConfig {
|
||||
manifestPlaceholders["usesCleartextTraffic"] = "false"
|
||||
applicationId = "com.emerald.legacy"
|
||||
minSdk = 26
|
||||
targetSdk = 28
|
||||
versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt()
|
||||
versionName = tauriProperties.getProperty("tauri.android.versionName", "1.0")
|
||||
}
|
||||
buildTypes {
|
||||
getByName("debug") {
|
||||
manifestPlaceholders["usesCleartextTraffic"] = "true"
|
||||
isDebuggable = true
|
||||
isJniDebuggable = true
|
||||
isMinifyEnabled = false
|
||||
packaging { jniLibs.keepDebugSymbols.add("*/arm64-v8a/*.so")
|
||||
jniLibs.keepDebugSymbols.add("*/armeabi-v7a/*.so")
|
||||
jniLibs.keepDebugSymbols.add("*/x86/*.so")
|
||||
jniLibs.keepDebugSymbols.add("*/x86_64/*.so")
|
||||
}
|
||||
}
|
||||
getByName("release") {
|
||||
signingConfig = signingConfigs.getByName("release")
|
||||
isMinifyEnabled = true
|
||||
proguardFiles(
|
||||
*fileTree(".") { include("**/*.pro") }
|
||||
.plus(getDefaultProguardFile("proguard-android-optimize.txt"))
|
||||
.toList().toTypedArray()
|
||||
)
|
||||
}
|
||||
}
|
||||
kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
buildFeatures {
|
||||
buildConfig = true
|
||||
}
|
||||
lint {
|
||||
disable += "ExpiredTargetSdkVersion"
|
||||
}
|
||||
packaging {
|
||||
resources.excludes += "lib/*/jni/**"
|
||||
}
|
||||
}
|
||||
|
||||
rust {
|
||||
rootDirRel = "../../../"
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(project(":diamondruntime"))
|
||||
implementation("androidx.webkit:webkit:1.14.0")
|
||||
implementation("androidx.appcompat:appcompat:1.7.1")
|
||||
implementation("androidx.activity:activity-ktx:1.10.1")
|
||||
implementation("com.google.android.material:material:1.12.0")
|
||||
testImplementation("junit:junit:4.13.2")
|
||||
androidTestImplementation("androidx.test.ext:junit:1.1.4")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0")
|
||||
}
|
||||
|
||||
apply(from = "tauri.build.gradle.kts")
|
||||
19
src-tauri/gen/android/app/proguard-rules.pro
vendored
|
|
@ -1,19 +0,0 @@
|
|||
-keep class dev.lcehub.emerald.** { *; }
|
||||
-keepclassmembers class dev.lcehub.emerald.** { *; }
|
||||
-dontwarn dev.lcehub.emerald.**
|
||||
-keep class com.github.luben.zstd.** { *; }
|
||||
-keepclassmembers class com.github.luben.zstd.** { *; }
|
||||
-dontwarn com.github.luben.zstd.**
|
||||
-keep class com.emerald.legacy.TauriActivity {
|
||||
public <methods>;
|
||||
public <fields>;
|
||||
}
|
||||
-keep class com.emerald.legacy.MainActivity {
|
||||
public <methods>;
|
||||
}
|
||||
|
||||
-dontwarn com.android.org.conscrypt.SSLParametersImpl
|
||||
-dontwarn org.apache.harmony.xnet.provider.jsse.SSLParametersImpl
|
||||
-dontwarn org.bouncycastle.jsse.BCSSLParameters
|
||||
-dontwarn org.bouncycastle.jsse.BCSSLSocket
|
||||
-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
|
||||
<!-- AndroidTV support -->
|
||||
<uses-feature android:name="android.software.leanback" android:required="false" />
|
||||
|
||||
<application
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@style/Theme.emerald_legacy_launcher"
|
||||
android:extractNativeLibs="true"
|
||||
android:usesCleartextTraffic="${usesCleartextTraffic}"
|
||||
tools:replace="android:label,android:theme">
|
||||
<activity
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode"
|
||||
android:launchMode="singleTask"
|
||||
android:screenOrientation="sensorLandscape"
|
||||
android:label="@string/main_activity_title"
|
||||
android:name=".MainActivity"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<!-- AndroidTV support -->
|
||||
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
|
||||
</intent-filter>
|
||||
<!-- DEEP LINK PLUGIN. AUTO-GENERATED. DO NOT REMOVE. -->
|
||||
|
||||
<!-- DEEP LINK PLUGIN. AUTO-GENERATED. DO NOT REMOVE. -->
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".LceAuthActivity"
|
||||
android:exported="false"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" />
|
||||
|
||||
<provider
|
||||
android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="${applicationId}.fileprovider"
|
||||
android:exported="false"
|
||||
android:grantUriPermissions="true"
|
||||
tools:replace="android:authorities">
|
||||
<meta-data
|
||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||
android:resource="@xml/file_paths" />
|
||||
</provider>
|
||||
</application>
|
||||
</manifest>
|
||||
|
|
@ -1,124 +0,0 @@
|
|||
package com.emerald.legacy
|
||||
|
||||
import android.content.Intent
|
||||
import android.graphics.Bitmap
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.os.Message
|
||||
import android.view.Gravity
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.webkit.WebResourceRequest
|
||||
import android.webkit.WebSettings
|
||||
import android.webkit.WebView
|
||||
import android.webkit.WebViewClient
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.ProgressBar
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
|
||||
class LceAuthActivity : AppCompatActivity() {
|
||||
private lateinit var webView: WebView
|
||||
private lateinit var progressBar: ProgressBar
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
val authUrl = intent.getStringExtra("authUrl")
|
||||
?: "https://mclegacyedition.xyz/internal/auth?appId=emerald_launcher"
|
||||
|
||||
progressBar = ProgressBar(this).apply {
|
||||
layoutParams = FrameLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
)
|
||||
}
|
||||
|
||||
webView = WebView(this).apply {
|
||||
settings.javaScriptEnabled = true
|
||||
settings.domStorageEnabled = true
|
||||
settings.databaseEnabled = true
|
||||
settings.loadWithOverviewMode = true
|
||||
settings.useWideViewPort = true
|
||||
settings.setSupportMultipleWindows(true)
|
||||
settings.javaScriptCanOpenWindowsAutomatically = true
|
||||
webViewClient = object : WebViewClient() {
|
||||
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean = handleAuthUrl(url)
|
||||
override fun shouldOverrideUrlLoading(
|
||||
view: WebView,
|
||||
request: WebResourceRequest
|
||||
): Boolean = handleAuthUrl(request.url.toString())
|
||||
|
||||
override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {
|
||||
handleAuthUrl(url)
|
||||
}
|
||||
|
||||
override fun onPageFinished(view: WebView, url: String) {
|
||||
progressBar.visibility = View.GONE
|
||||
}
|
||||
}
|
||||
webChromeClient = object : android.webkit.WebChromeClient() {
|
||||
override fun onCreateWindow(
|
||||
view: WebView,
|
||||
isDialog: Boolean,
|
||||
isUserGesture: Boolean,
|
||||
resultMsg: Message
|
||||
): Boolean {
|
||||
val transport = resultMsg.obj as WebView.WebViewTransport
|
||||
transport.webView = webView
|
||||
resultMsg.sendToTarget()
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val root = FrameLayout(this)
|
||||
root.addView(
|
||||
webView,
|
||||
FrameLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
)
|
||||
val progressFrame = FrameLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
)
|
||||
progressFrame.gravity = Gravity.CENTER
|
||||
root.addView(progressBar, progressFrame)
|
||||
setContentView(root)
|
||||
webView.loadUrl(authUrl)
|
||||
}
|
||||
|
||||
private fun handleAuthUrl(url: String): Boolean {
|
||||
val uri = try {
|
||||
Uri.parse(url)
|
||||
} catch (e: Exception) {
|
||||
return false
|
||||
}
|
||||
if (uri.scheme == "emerald" && uri.host == "lceonline") {
|
||||
val token = uri.getQueryParameter("token")
|
||||
if (token != null) {
|
||||
setResult(RESULT_OK, Intent().putExtra("lceAuthToken", token))
|
||||
} else {
|
||||
setResult(RESULT_CANCELED)
|
||||
}
|
||||
finish()
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
@Deprecated("Deprecated in Java")
|
||||
override fun onBackPressed() {
|
||||
if (webView.canGoBack()) {
|
||||
webView.goBack()
|
||||
} else {
|
||||
setResult(RESULT_CANCELED)
|
||||
super.onBackPressed()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
(webView.parent as? ViewGroup)?.removeView(webView)
|
||||
webView.destroy()
|
||||
super.onDestroy()
|
||||
}
|
||||
}
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
package com.emerald.legacy
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import androidx.activity.result.ActivityResult
|
||||
import app.tauri.annotation.ActivityCallback
|
||||
import app.tauri.annotation.Command
|
||||
import app.tauri.annotation.TauriPlugin
|
||||
import app.tauri.plugin.Invoke
|
||||
import app.tauri.plugin.Plugin
|
||||
|
||||
@TauriPlugin
|
||||
class LceAuthPlugin(private val activity: Activity) : Plugin(activity) {
|
||||
@Command
|
||||
fun startAuth(invoke: Invoke) {
|
||||
val intent = Intent(activity, LceAuthActivity::class.java)
|
||||
intent.putExtra(
|
||||
"authUrl",
|
||||
"https://mclegacyedition.xyz/internal/auth?appId=emerald_launcher"
|
||||
)
|
||||
startActivityForResult(invoke, intent, "authResult")
|
||||
}
|
||||
|
||||
@ActivityCallback
|
||||
fun authResult(invoke: Invoke, result: ActivityResult) {
|
||||
val token = if (result.resultCode == Activity.RESULT_OK) {
|
||||
result.data?.getStringExtra("lceAuthToken")
|
||||
} else {
|
||||
null
|
||||
}
|
||||
if (!token.isNullOrEmpty()) {
|
||||
invoke.resolveObject(token)
|
||||
} else {
|
||||
invoke.reject("Authentication cancelled or failed")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
package com.emerald.legacy
|
||||
|
||||
import android.os.Bundle
|
||||
import android.webkit.WebView
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
import androidx.core.view.WindowCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.core.view.WindowInsetsControllerCompat
|
||||
|
||||
class MainActivity : TauriActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
enableEdgeToEdge()
|
||||
super.onCreate(savedInstanceState)
|
||||
WindowCompat.getInsetsController(window, window.decorView).apply {
|
||||
systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
|
||||
hide(WindowInsetsCompat.Type.statusBars() or WindowInsetsCompat.Type.navigationBars())
|
||||
}
|
||||
}
|
||||
|
||||
override fun onWebViewCreate(webView: WebView) {
|
||||
super.onWebViewCreate(webView)
|
||||
webView.settings.useWideViewPort = true
|
||||
webView.settings.loadWithOverviewMode = true
|
||||
webView.settings.setSupportZoom(false)
|
||||
webView.settings.builtInZoomControls = false
|
||||
webView.settings.displayZoomControls = false
|
||||
}
|
||||
}
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:endX="85.84757"
|
||||
android:endY="92.4963"
|
||||
android:startX="42.9492"
|
||||
android:startY="49.59793"
|
||||
android:type="linear">
|
||||
<item
|
||||
android:color="#44000000"
|
||||
android:offset="0.0" />
|
||||
<item
|
||||
android:color="#00000000"
|
||||
android:offset="1.0" />
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:fillType="nonZero"
|
||||
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
|
||||
android:strokeWidth="1"
|
||||
android:strokeColor="#00000000" />
|
||||
</vector>
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<path
|
||||
android:fillColor="#00591C"
|
||||
android:pathData="M0,0h108v108h-108z" />
|
||||
</vector>
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".MainActivity">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Hello World!"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintLeft_toLeftOf="parent"
|
||||
app:layout_constraintRight_toRightOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
Before Width: | Height: | Size: 4 KiB |
|
Before Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 4 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |