Restyle to a clean, flat look and rename brand to SCOPENET

- Brand is now SCOPENET everywhere (defaults, UI, installer, docs)
- Launcher: solid backgrounds (no animated orbs/grain), flat Play button
  without gradient/shine/glow, quieter rail with a simple active
  indicator, smaller type scale, Inter as default font, glass off by
  default, restyled sliders
- Panel: same flat treatment; live preview mirrors the new launcher
- New flat scope-reticle logo and app icons
- Calmer default palette
- Fix: lock the shared cargo cache in the Docker build (amd64/arm64 raced)
- Fix: Windows-only clippy lint in sys.rs

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011ARcGWxLx21FwXJ3yfGriS
This commit is contained in:
Claude committed 2026-09-28 05:30:19 +00:00
1 parent 214aa6ad19
commit 1b1bb984bc
69 files changed
+378 -426

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "scopenet-core"
description = "Minecraft install / launch engine used by the ScopeNet launcher (and meta lookups in the panel)"
description = "Minecraft install / launch engine used by the SCOPENET launcher (and meta lookups in the panel)"
version.workspace = true
edition.workspace = true
+1 -1
View File
@@ -13,7 +13,7 @@ use std::sync::Arc;
use std::time::{Duration, Instant};
use tokio::io::AsyncWriteExt;
pub const USER_AGENT: &str = concat!("ScopeNet-Launcher/", env!("CARGO_PKG_VERSION"), " (+https://github.com/scopeddlol/SCOPENET-MC)");
pub const USER_AGENT: &str = concat!("SCOPENET-Launcher/", env!("CARGO_PKG_VERSION"), " (+https://github.com/scopeddlol/SCOPENET-MC)");
pub fn client() -> reqwest::Client {
reqwest::Client::builder()
+2 -2
View File
@@ -346,7 +346,7 @@ mod tests {
resolution: Some((1280, 720)),
fullscreen: false,
join_server: join.then(|| ("play.example.net".to_string(), 25565)),
version_label: "ScopeNet".into(),
version_label: "SCOPENET".into(),
launcher_name: "scopenet".into(),
launcher_version: "0.1.0".into(),
}
@@ -368,7 +368,7 @@ mod tests {
assert!(a.contains("--width 1280 --height 720"));
assert!(a.contains("--quickPlayMultiplayer play.example.net:25565"));
assert!(!a.contains("--server"));
assert!(a.contains("--versionType ScopeNet"));
assert!(a.contains("--versionType SCOPENET"));
assert!(a.contains("-Djava.library.path=/n"));
}
+1 -1
View File
@@ -1,4 +1,4 @@
//! ScopeNet launcher engine.
//! SCOPENET launcher engine.
//!
//! The Tauri app is a thin UI shell around this crate: everything that
//! downloads, installs or launches Minecraft lives here so it can be unit
+3 -3
View File
@@ -76,9 +76,9 @@ mod tests {
fn upserts_without_losing_player_servers() {
let dir = tempfile::tempdir().unwrap();
upsert(dir.path(), "Friend", "friend.net").unwrap();
upsert(dir.path(), "ScopeNet", "play.scopenet.gg").unwrap();
upsert(dir.path(), "ScopeNet SMP", "play.scopenet.gg").unwrap();
assert_eq!(names(dir.path()), vec![("ScopeNet SMP".into(), "play.scopenet.gg".into()), ("Friend".into(), "friend.net".into())]);
upsert(dir.path(), "SCOPENET", "play.scopenet.gg").unwrap();
upsert(dir.path(), "SCOPENET SMP", "play.scopenet.gg").unwrap();
assert_eq!(names(dir.path()), vec![("SCOPENET SMP".into(), "play.scopenet.gg".into()), ("Friend".into(), "friend.net".into())]);
assert_eq!(format_address("a.b", 25565), "a.b");
assert_eq!(format_address("a.b", 25570), "a.b:25570");
}
+1 -1
View File
@@ -11,7 +11,7 @@ fn imp() -> Option<u64> {
let mut status: MEMORYSTATUSEX = unsafe { std::mem::zeroed() };
status.dwLength = std::mem::size_of::<MEMORYSTATUSEX>() as u32;
let ok = unsafe { GlobalMemoryStatusEx(&mut status) };
(ok != 0).then(|| status.ullTotalPhys / 1024 / 1024)
(ok != 0).then_some(status.ullTotalPhys / 1024 / 1024)
}
#[cfg(target_os = "linux")]
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "scopenet-shared"
description = "Types shared between the ScopeNet launcher and admin panel"
description = "Types shared between the SCOPENET launcher and admin panel"
version.workspace = true
edition.workspace = true
+17 -17
View File
@@ -1,4 +1,4 @@
//! Wire types shared by the ScopeNet launcher and the admin panel.
//! Wire types shared by the SCOPENET launcher and the admin panel.
//!
//! Everything the panel sends to the launcher is described here, so both
//! sides always agree on the JSON shape.
@@ -39,19 +39,19 @@ pub struct Branding {
impl Default for Branding {
fn default() -> Self {
Self {
name: "ScopeNet".into(),
name: "SCOPENET".into(),
tagline: "Your worlds, one click away.".into(),
logo_url: None,
icon_url: None,
background: Background::default(),
colors: Palette::default(),
font: "Outfit".into(),
radius: 14,
glass: true,
version_label: "ScopeNet".into(),
font: "Inter".into(),
radius: 10,
glass: false,
version_label: "SCOPENET".into(),
news: vec![NewsItem {
id: "welcome".into(),
title: "Welcome to ScopeNet".into(),
title: "Welcome to SCOPENET".into(),
body: "Your admin can customise this launcher from the panel: colours, news, instances and more.".into(),
image_url: None,
link: None,
@@ -80,7 +80,7 @@ pub struct Background {
impl Default for Background {
fn default() -> Self {
Self { kind: "gradient".into(), url: None, blur: 0, dim: 45 }
Self { kind: "gradient".into(), url: None, blur: 0, dim: 55 }
}
}
@@ -100,14 +100,14 @@ pub struct Palette {
impl Default for Palette {
fn default() -> Self {
Self {
accent: "#7c5cff".into(),
accent_2: "#22d3ee".into(),
background: "#0b0d17".into(),
surface: "#141828".into(),
text: "#eef0ff".into(),
muted: "#8b90b3".into(),
success: "#34d399".into(),
danger: "#f43f5e".into(),
accent: "#6d6af5".into(),
accent_2: "#8b88f8".into(),
background: "#0d0e12".into(),
surface: "#16181e".into(),
text: "#ecedf1".into(),
muted: "#8b8f9a".into(),
success: "#3fb97c".into(),
danger: "#e5484d".into(),
}
}
}
@@ -396,7 +396,7 @@ mod tests {
#[test]
fn manifest_roundtrip_with_defaults() {
let m: LauncherManifest = serde_json::from_str("{}").unwrap();
assert_eq!(m.branding.name, "ScopeNet");
assert_eq!(m.branding.name, "SCOPENET");
let loader: Loader = serde_json::from_str("\"neoforge\"").unwrap();
assert_eq!(loader, Loader::NeoForge);
}