From 9992e42eff9842b14aec53594f066c980d83d16c Mon Sep 17 00:00:00 2001 From: bits Date: Tue, 28 Apr 2026 04:34:03 +0300 Subject: [PATCH] Fix sum stuff --- .gitignore | 1 - RLIdentity.dll | Bin 0 -> 155648 bytes src-tauri/Cargo.lock | 2 + src-tauri/Cargo.toml | 2 +- src-tauri/src/lib.rs | 293 +++++++------- src/App.css | 920 +++++++++++++++++++++++++++++++------------ src/App.tsx | 735 +++++++++++++++++----------------- 7 files changed, 1184 insertions(+), 769 deletions(-) create mode 100644 RLIdentity.dll diff --git a/.gitignore b/.gitignore index 3592807..9b75ad2 100644 --- a/.gitignore +++ b/.gitignore @@ -60,7 +60,6 @@ Release/ *.o *.lib *.a -*.dll *.so *.dylib *.exe diff --git a/RLIdentity.dll b/RLIdentity.dll new file mode 100644 index 0000000000000000000000000000000000000000..c3b05b15971fb1f0c438c9dcbe0ddf85efd7c745 GIT binary patch literal 155648 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

J( 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, } -#[tauri::command] -fn minimize_to_tray(window: WebviewWindow) { - let _ = window.hide(); +// global state for optimization +struct AppState { + client: Client, + app_data: PathBuf, } -#[tauri::command] -fn get_hwid() -> String { - // Simple HWID using Windows UUID - let output = Command::new("wmic") - .args(["csproduct", "get", "uuid"]) - .output() - .ok(); - - if let Some(out) = output { - let s = String::from_utf8_lossy(&out.stdout); - let lines: Vec<&str> = s.lines().collect(); - if lines.len() >= 2 { - return lines[1].trim().to_string(); - } - } - "UNKNOWN-HWID".to_string() -} +// --- helpers --- -fn get_last_epic_id() -> String { - if let Some(mut path) = dirs::data_dir() { - path.push("RLidentity"); - path.push("last_epic_id.txt"); - - if let Ok(content) = fs::read_to_string(path) { - let trimmed = content.trim(); - if trimmed.len() == 32 { - return trimmed.to_string(); - } +async fn get_last_epic_id(base_path: &Path) -> String { + let path = base_path.join("last_epic_id.txt"); + if let Ok(content) = fs::read_to_string(path).await { + let trimmed = content.trim(); + if trimmed.len() == 32 { + return trimmed.to_string(); } } "".to_string() } -#[tauri::command] -async fn validate_key(key: String, hwid: String) -> Result { - let epic_id = get_last_epic_id(); - // Added epicId query parameter to the URL - let url = format!( - "https://api.rlidentity.me/keys/{}?hwid={}&epicId={}", - key, hwid, epic_id - ); - - let client = reqwest::Client::builder() - .danger_accept_invalid_certs(true) - .build() - .map_err(|e| format!("Client Error: {}", e))?; - - println!("[LOG] Connecting to: {}", url); - println!("[LOG] Sending Epic ID: {}", epic_id); +// --- commands --- - let res = client.get(&url) +#[tauri::command] +fn get_hwid() -> String { + // direct registry query for speed + let output = Command::new("reg") + .args(["query", r"HKLM\SOFTWARE\Microsoft\Cryptography", "/v", "MachineGuid"]) + .output(); + + if let Ok(out) = output { + let s = String::from_utf8_lossy(&out.stdout); + if let Some(guid) = s.split_whitespace().last() { + if guid.len() == 36 && guid.contains('-') { + return guid.to_string(); + } + } + } + "UNKNOWN-HWID".to_string() +} + + + +#[tauri::command] +async fn validate_key( + key: String, + hwid: String, + state: State<'_, AppState> +) -> Result { + let epic_id = get_last_epic_id(&state.app_data).await; + let url = format!("https://api.rlidentity.me/keys/{}?hwid={}&epicId={}", key, hwid, epic_id); + + let res = state.client.get(&url) .send() .await - .map_err(|e| { - let err_msg = format!("Network Error: {}. Is the server on 443?", e); - println!("[ERROR] {}", err_msg); - err_msg - })?; + .map_err(|e| format!("network error: {}", e))?; - println!("[LOG] HTTP Status: {}", res.status()); - - let json: serde_json::Value = res.json().await.map_err(|e| { - let err_msg = format!("JSON Parse Error: {}", e); - println!("[ERROR] {}", err_msg); - err_msg - })?; + let json: serde_json::Value = res.json().await.map_err(|e| format!("json error: {}", e))?; - println!("[LOG] Server Payload: {:?}", json); - let status = json.get("status").and_then(|v| v.as_str()).unwrap_or("unknown").to_string(); - let user = json.get("user").map(|u| UserInfo { - userId: u.get("userId").and_then(|v| { - v.as_str().map(|s| s.to_string()).or_else(|| v.as_i64().map(|n| n.to_string())) - }), + userId: u.get("userId").and_then(|v| v.as_str().map(|s| s.to_string()).or_else(|| v.as_i64().map(|n| n.to_string()))), discordId: u.get("discordId").and_then(|v| v.as_str()).map(|s| s.to_string()), epicId: u.get("epicId").and_then(|v| v.as_str()).map(|s| s.to_string()), username: u.get("username").and_then(|v| v.as_str()).map(|s| s.to_string()), @@ -120,18 +103,70 @@ async fn validate_key(key: String, hwid: String) -> Result Result<(), String> { - let mut path = dirs::data_dir().ok_or("Could not find AppData")?; - path.push("RLidentity"); - fs::create_dir_all(&path).map_err(|e| e.to_string())?; - path.push("config.json"); +async fn inject_dll(state: State<'_, AppState>) -> Result { + let injector_path = state.app_data.join("injector.exe"); + let dll_path = state.app_data.join("RLIdentity.dll"); + + let mut s = System::new_all(); + s.refresh_processes(); + if s.processes_by_exact_name("RocketLeague.exe").next().is_none() { + return Err("rocket league is not running".into()); + } - let json = serde_json::json!({ - "spoofedName": name, - "platform": platform - }); + if !injector_path.exists() || !dll_path.exists() { + return Err("files missing, wait for update".into()); + } - fs::write(path, serde_json::to_string_pretty(&json).unwrap()).map_err(|e| e.to_string())?; + let output = Command::new(injector_path) + .arg("RocketLeague.exe") + .arg(dll_path) + .output() + .map_err(|e| format!("exec failed: {}", e))?; + + if output.status.success() { + Ok("injected".into()) + } else { + Err("injection failed".into()) + } +} + +#[tauri::command] +async fn download_assets(state: State<'_, AppState>) -> Result<(), String> { + fs::create_dir_all(&state.app_data).await.map_err(|e| e.to_string())?; + + // in a real scenario, you'd fetch these hashes from your api first + let assets = [ + ( + "injector.exe", + "https://git.rlidentity.me/bits/RLidentity/src/branch/dll/injector.exe", + "EXPECTED_SHA256_HASH_HERE" + ), + ( + "RLIdentity.dll", + "https://git.rlidentity.me/.../RLIdentity.dll", + "EXPECTED_SHA256_HASH_HERE" + ), + ]; + + for (name, url, expected_hash) in assets { + let file_path = state.app_data.join(name); + + // download + let res = state.client.get(url).send().await.map_err(|e| e.to_string())?; + let bytes = res.bytes().await.map_err(|e| e.to_string())?; + + // verify integrity (signature check) + let mut hasher = Sha256::new(); + hasher.update(&bytes); + let actual_hash = hex::encode(hasher.finalize()); + + if actual_hash != expected_hash { + return Err(format!("integrity check failed for {}: hash mismatch", name)); + } + + // only write if the "signature" (hash) is correct + fs::write(file_path, bytes).await.map_err(|e| e.to_string())?; + } Ok(()) } @@ -144,74 +179,26 @@ async fn check_status() -> Status { } #[tauri::command] -async fn download_assets() -> Result<(), String> { - let mut path = dirs::data_dir().ok_or("Could not find AppData")?; - path.push("RLidentity"); - fs::create_dir_all(&path).map_err(|e| e.to_string())?; - - let client = reqwest::Client::new(); - let assets = [ - ("injector.exe", "https://git.rlidentity.me/bits/RLidentity/raw/branch/dll/injector.exe"), - ("RLIdentity.dll", "https://git.rlidentity.me/bits/RLidentity/raw/branch/dll/RLIdentity.dll"), - ]; - - for (name, url) in assets { - let mut file_path = path.clone(); - file_path.push(name); - - let response = client.get(url).send().await.map_err(|e| e.to_string())?; - let bytes = response.bytes().await.map_err(|e| e.to_string())?; - fs::write(file_path, bytes).map_err(|e| e.to_string())?; - } - Ok(()) +fn minimize_to_tray(window: WebviewWindow) { + let _ = window.hide(); } -#[tauri::command] -async fn inject_dll(_discordId: Option) -> Result { - let mut base_path = dirs::data_dir().ok_or("Could not find AppData")?; - base_path.push("RLidentity"); - - let injector_path = base_path.join("injector.exe"); - let dll_path = base_path.join("RLIdentity.dll"); - - let mut s = System::new_all(); - s.refresh_processes(); - if s.processes_by_exact_name("RocketLeague.exe").next().is_none() { - return Err("Rocket League is not running!".into()); - } - - if !injector_path.exists() || !dll_path.exists() { - return Err("Required files missing. Please wait for update to finish.".into()); - } - - // Run the injector and capture FULL output - let output = Command::new(injector_path) - .arg("RocketLeague.exe") - .arg(dll_path) - .output() - .map_err(|e| format!("Execution failed: {}", e))?; - - let stdout = String::from_utf8_lossy(&output.stdout).to_string(); - let stderr = String::from_utf8_lossy(&output.stderr).to_string(); - - let full_log = format!("STDOUT:\n{}\n\nSTDERR:\n{}", stdout, stderr); - println!("[LOG] Injector results:\n{}", full_log); - - if output.status.success() { - Ok(format!("Successfully injected!\n\n{}", stdout)) - } else { - Err(format!("Injection failed!\n\n{}", full_log)) - } -} +// --- main --- pub fn run() { tauri::Builder::default() + .manage(AppState { + client: Client::builder() + .danger_accept_invalid_certs(false) + .build() + .unwrap(), + app_data: dirs::data_dir().unwrap().join("RLidentity"), + }) .plugin(tauri_plugin_opener::init()) .plugin(tauri_plugin_process::init()) .plugin(tauri_plugin_updater::Builder::new().build()) .invoke_handler(tauri::generate_handler![ minimize_to_tray, - save_config, inject_dll, validate_key, check_status, @@ -219,41 +206,31 @@ pub fn run() { download_assets ]) .setup(|app| { - let icon_bytes = include_bytes!("../icons/32x32.png"); - let icon = tauri::image::Image::from_bytes(icon_bytes)?; - let window = app.get_webview_window("main").unwrap(); - window.set_icon(icon.clone())?; - + #[cfg(target_os = "windows")] apply_acrylic(&window, Some((18, 18, 18, 125))).ok(); let handle = app.handle().clone(); let tray_menu = tauri::menu::Menu::with_items(app, &[ - &tauri::menu::MenuItem::with_id(app, "tray_quit", "Quit", true, None::<&str>)?, + &tauri::menu::MenuItem::with_id(app, "quit", "Quit", true, None::<&str>)?, ])?; - tauri::tray::TrayIconBuilder::new() - .icon(icon) + let _ = tauri::tray::TrayIconBuilder::new() + .icon(app.default_window_icon().unwrap().clone()) .menu(&tray_menu) .on_menu_event(move |_app, event| { - if event.id().as_ref() == "tray_quit" { handle.exit(0); } + if event.id().as_ref() == "quit" { handle.exit(0); } }) .on_tray_icon_event(|tray, event| { - if let tauri::tray::TrayIconEvent::Click { - button: tauri::tray::MouseButton::Left, - .. - } = event { - let app = tray.app_handle(); - if let Some(window) = app.get_webview_window("main") { - let _ = window.show(); - let _ = window.set_focus(); - } + if let tauri::tray::TrayIconEvent::Click { button: tauri::tray::MouseButton::Left, .. } = event { + let _ = tray.app_handle().get_webview_window("main").unwrap().show(); } }) .build(app)?; + Ok(()) }) .run(tauri::generate_context!()) .expect("error while running tauri application"); -} +} \ No newline at end of file diff --git a/src/App.css b/src/App.css index e0148e8..3754eb0 100644 --- a/src/App.css +++ b/src/App.css @@ -1,23 +1,190 @@ -/* --- Premium dark + neon purple glassmorphism theme (RLidentity) --- */ +/* ───────────────────────────────────────────────────────────────────────────── + RLidentity — Theme system + UI + Accent colors use --accent-rgb and --accent-light-rgb so every rgba() + call picks up the active theme automatically. +───────────────────────────────────────────────────────────────────────────── */ -:root { +/* ── Phantom (default) — deep purple, mysterious ── */ +:root, +[data-theme="phantom"] { color-scheme: dark; + + --accent: #a855f7; + --accent-mid: #7c3aed; + --accent-light: #c084fc; + --accent-rgb: 168, 85, 247; + --accent-mid-rgb: 124, 58, 237; + --accent-light-rgb: 192, 132, 252; + --bg0: #07060b; --bg1: #0b0620; - --purple0: #a855f7; - --purple1: #7c3aed; - --purple2: #c084fc; + --red0: #ff3333; --red1: #cc0000; - --glass: rgba(168, 85, 247, 0.10); - --glass-2: rgba(168, 85, 247, 0.14); - --glass-red: rgba(255, 51, 51, 0.15); - --glass-red-2: rgba(255, 51, 51, 0.25); - --stroke: rgba(192, 132, 252, 0.28); - --stroke-2: rgba(168, 85, 247, 0.38); - --stroke-red: rgba(255, 85, 85, 0.45); - --text: rgba(245, 243, 255, 0.92); - --muted: rgba(245, 243, 255, 0.62); + + --glass: rgba(var(--accent-rgb), 0.10); + --glass-2: rgba(var(--accent-rgb), 0.14); + --stroke: rgba(var(--accent-light-rgb), 0.28); + --stroke-2: rgba(var(--accent-rgb), 0.38); + --text: rgba(245, 243, 255, 0.92); + --muted: rgba(245, 243, 255, 0.62); +} + +/* ── Glacier — icy cold cyan on pitch black ── */ +[data-theme="glacier"] { + --accent: #38bdf8; + --accent-mid: #0284c7; + --accent-light: #bae6fd; + --accent-rgb: 56, 189, 248; + --accent-mid-rgb: 2, 132, 199; + --accent-light-rgb: 186, 230, 253; + + --bg0: #020c14; + --bg1: #030f1c; + + --red0: #ff3333; + --red1: #cc0000; + + --glass: rgba(var(--accent-rgb), 0.08); + --glass-2: rgba(var(--accent-rgb), 0.12); + --stroke: rgba(var(--accent-light-rgb), 0.22); + --stroke-2: rgba(var(--accent-rgb), 0.35); + --text: rgba(224, 242, 254, 0.93); + --muted: rgba(186, 230, 253, 0.55); +} + +/* ── Inferno — molten orange, aggressive heat ── */ +[data-theme="inferno"] { + --accent: #f97316; + --accent-mid: #c2410c; + --accent-light: #fdba74; + --accent-rgb: 249, 115, 22; + --accent-mid-rgb: 194, 65, 12; + --accent-light-rgb: 253, 186, 116; + + --bg0: #0f0602; + --bg1: #190800; + + --red0: #ff3333; + --red1: #cc0000; + + --glass: rgba(var(--accent-rgb), 0.09); + --glass-2: rgba(var(--accent-rgb), 0.13); + --stroke: rgba(var(--accent-light-rgb), 0.25); + --stroke-2: rgba(var(--accent-rgb), 0.40); + --text: rgba(255, 247, 237, 0.93); + --muted: rgba(253, 186, 116, 0.55); +} + +/* ── Matrix — terminal acid green on near-black ── */ +[data-theme="matrix"] { + --accent: #00ff41; + --accent-mid: #00b32d; + --accent-light: #69ff87; + --accent-rgb: 0, 255, 65; + --accent-mid-rgb: 0, 179, 45; + --accent-light-rgb: 105, 255, 135; + + --bg0: #010a03; + --bg1: #010d04; + + --red0: #ff3333; + --red1: #cc0000; + + --glass: rgba(var(--accent-rgb), 0.06); + --glass-2: rgba(var(--accent-rgb), 0.09); + --stroke: rgba(var(--accent-rgb), 0.20); + --stroke-2: rgba(var(--accent-rgb), 0.32); + --text: rgba(220, 255, 225, 0.92); + --muted: rgba(105, 255, 135, 0.50); +} + +/* ── Synthwave — hot pink on deep purple-black ── */ +[data-theme="synthwave"] { + --accent: #f72585; + --accent-mid: #7209b7; + --accent-light: #ff6eb4; + --accent-rgb: 247, 37, 133; + --accent-mid-rgb: 114, 9, 183; + --accent-light-rgb: 255, 110, 180; + + --bg0: #0d0614; + --bg1: #120519; + + --red0: #ff3333; + --red1: #cc0000; + + --glass: rgba(var(--accent-rgb), 0.09); + --glass-2: rgba(var(--accent-rgb), 0.13); + --stroke: rgba(var(--accent-light-rgb), 0.25); + --stroke-2: rgba(var(--accent-rgb), 0.38); + --text: rgba(255, 236, 245, 0.93); + --muted: rgba(255, 110, 180, 0.55); +} + +/* ── Eclipse — rich gold, luxury dark ── */ +[data-theme="eclipse"] { + --accent: #fbbf24; + --accent-mid: #92400e; + --accent-light: #fde68a; + --accent-rgb: 251, 191, 36; + --accent-mid-rgb: 146, 64, 14; + --accent-light-rgb: 253, 230, 138; + + --bg0: #0c0900; + --bg1: #120c00; + + --red0: #ff3333; + --red1: #cc0000; + + --glass: rgba(var(--accent-rgb), 0.07); + --glass-2: rgba(var(--accent-rgb), 0.11); + --stroke: rgba(var(--accent-light-rgb), 0.22); + --stroke-2: rgba(var(--accent-rgb), 0.35); + --text: rgba(255, 251, 235, 0.93); + --muted: rgba(253, 230, 138, 0.55); +} + +/* Matrix gets a stronger, tighter glow — green on black pops differently */ +[data-theme="matrix"] .neon-ring::before { + opacity: 1; + filter: blur(6px); +} + +[data-theme="matrix"] .btn-primary { + color: #000; + font-family: "Courier New", Courier, monospace; + letter-spacing: 0.08em; +} + +[data-theme="matrix"] .neon-text, +[data-theme="matrix"] .neon-text-soft { + font-family: "Courier New", Courier, monospace; + letter-spacing: 0.04em; +} + +/* Synthwave gets a dual-color glow on the ring */ +[data-theme="synthwave"] .neon-ring::before { + background: + radial-gradient(120px 80px at 15% 10%, rgba(247, 37, 133, 0.45), transparent 55%), + radial-gradient(100px 70px at 85% 90%, rgba(114, 9, 183, 0.35), transparent 55%); +} + +/* Inferno gets a warm bottom glow */ +[data-theme="inferno"] .neon-ring::before { + background: radial-gradient(160px 100px at 80% 90%, rgba(249, 115, 22, 0.40), transparent 60%); +} + +/* Eclipse gets a golden shimmer at the top */ +[data-theme="eclipse"] .neon-ring::before { + background: radial-gradient(180px 80px at 50% 0%, rgba(251, 191, 36, 0.38), transparent 65%); + filter: blur(8px); +} + +*, +*::before, +*::after { + box-sizing: border-box; } html, @@ -29,132 +196,58 @@ body, body { margin: 0; font-family: - ui-sans-serif, - system-ui, - -apple-system, - "Segoe UI", - Roboto, - Helvetica, - Arial, - "Apple Color Emoji", - "Segoe UI Emoji"; + ui-sans-serif, system-ui, -apple-system, + "Segoe UI", Roboto, Helvetica, Arial, + "Apple Color Emoji", "Segoe UI Emoji"; letter-spacing: 0.01em; - background: radial-gradient(1200px 700px at 50% 20%, rgba(168, 85, 247, 0.18), transparent 55%), - radial-gradient(900px 600px at 20% 80%, rgba(124, 58, 237, 0.14), transparent 50%), - linear-gradient(180deg, var(--bg0), var(--bg1)); + background: + radial-gradient(1200px 700px at 50% 20%, rgba(var(--accent-rgb), 0.18), transparent 55%), + radial-gradient(900px 600px at 20% 80%, rgba(var(--accent-mid-rgb), 0.14), transparent 50%), + linear-gradient(180deg, var(--bg0), var(--bg1)); color: var(--text); overflow: hidden; + transition: background 0.4s ease; } body.revoked-bg { - background: radial-gradient(1200px 700px at 50% 20%, rgba(255, 51, 51, 0.25), transparent 55%), + background: + radial-gradient(1200px 700px at 50% 20%, rgba(255, 51, 51, 0.25), transparent 55%), radial-gradient(900px 600px at 20% 80%, rgba(204, 0, 0, 0.20), transparent 50%), linear-gradient(180deg, #1a0505, #0a0000); } -.setting-row { - display: flex; - align-items: center; - justify-content: space-between; - gap: 14px; - padding: 10px 6px; -} - -.setting-text { - display: grid; - gap: 4px; - min-width: 0; -} - -.setting-title { - font-weight: 800; - color: rgba(245, 243, 255, 0.88); - letter-spacing: 0.01em; -} - -.setting-sub { - font-size: 12px; - color: rgba(245, 243, 255, 0.62); - line-height: 1.4; -} - -.switch { - position: relative; - width: 46px; - height: 28px; - flex: 0 0 auto; -} - -.switch input { - position: absolute; - inset: 0; - opacity: 0; - cursor: pointer; -} - -.switch-ui { - position: absolute; - inset: 0; - border-radius: 999px; - background: rgba(10, 8, 18, 0.35); - border: 1px solid rgba(192, 132, 252, 0.28); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04); -} - -.switch-ui::after { - content: ""; - position: absolute; - top: 50%; - left: 4px; - width: 20px; - height: 20px; - transform: translateY(-50%); - border-radius: 999px; - background: linear-gradient(135deg, rgba(245, 243, 255, 0.9), rgba(192, 132, 252, 0.55)); - box-shadow: - 0 8px 18px rgba(0, 0, 0, 0.35), - 0 0 14px rgba(168, 85, 247, 0.18); -} - -.switch input:checked + .switch-ui { - background: rgba(168, 85, 247, 0.18); - border-color: rgba(192, 132, 252, 0.55); - box-shadow: - 0 0 0 4px rgba(168, 85, 247, 0.10), - 0 0 18px rgba(168, 85, 247, 0.14), - inset 0 1px 0 rgba(255, 255, 255, 0.05); -} - -.switch input:checked + .switch-ui::after { - left: 22px; -} - +/* ───────────────────────────────────────────────────────────────────────────── + Aurora background layer +───────────────────────────────────────────────────────────────────────────── */ .bg-aurora { position: fixed; inset: -20%; background: - radial-gradient(600px 400px at 30% 30%, rgba(168, 85, 247, 0.12), transparent 60%), - radial-gradient(700px 500px at 70% 60%, rgba(124, 58, 237, 0.10), transparent 60%), - radial-gradient(900px 700px at 50% 50%, rgba(192, 132, 252, 0.06), transparent 65%); + radial-gradient(600px 400px at 30% 30%, rgba(var(--accent-rgb), 0.12), transparent 60%), + radial-gradient(700px 500px at 70% 60%, rgba(var(--accent-mid-rgb), 0.10), transparent 60%), + radial-gradient(900px 700px at 50% 50%, rgba(var(--accent-light-rgb), 0.06), transparent 65%); filter: blur(12px); opacity: 0.9; animation: float 10s ease-in-out infinite; pointer-events: none; + transition: background 0.4s ease; } .revoked-aurora { - background: - radial-gradient(600px 400px at 30% 30%, rgba(255, 51, 51, 0.20), transparent 60%), - radial-gradient(700px 500px at 70% 60%, rgba(204, 0, 0, 0.15), transparent 60%), - radial-gradient(900px 700px at 50% 50%, rgba(255, 85, 85, 0.12), transparent 65%); + background: + radial-gradient(600px 400px at 30% 30%, rgba(255, 51, 51, 0.20), transparent 60%), + radial-gradient(700px 500px at 70% 60%, rgba(204, 0, 0, 0.15), transparent 60%), + radial-gradient(900px 700px at 50% 50%, rgba(255, 85, 85, 0.12), transparent 65%); } @keyframes float { 0%, 100% { transform: translate3d(0, 0, 0) scale(1); } - 50% { transform: translate3d(0, -10px, 0) scale(1.02); } + 50% { transform: translate3d(0, -10px, 0) scale(1.02); } } -/* --- App Shell --- */ +/* ───────────────────────────────────────────────────────────────────────────── + App shell +───────────────────────────────────────────────────────────────────────────── */ .app-shell { height: 100%; display: flex; @@ -164,12 +257,12 @@ body.revoked-bg { padding: 20px; } -/* --- Titlebar --- */ +/* ───────────────────────────────────────────────────────────────────────────── + Titlebar +───────────────────────────────────────────────────────────────────────────── */ .window-titlebar { position: fixed; - top: 0; - left: 0; - right: 0; + top: 0; left: 0; right: 0; height: 48px; display: flex; align-items: center; @@ -193,14 +286,31 @@ body.revoked-bg { width: 24px; height: 24px; object-fit: contain; - filter: drop-shadow(0 0 8px rgba(168, 85, 247, 0.25)); + filter: drop-shadow(0 0 8px rgba(var(--accent-rgb), 0.35)); +} + +.titlebar-text { + display: grid; + gap: 2px; +} + +.app-name { + font-weight: 900; + font-size: 13px; + letter-spacing: 0.05em; +} + +.app-slogan { + font-size: 11px; + color: var(--muted); + line-height: 1.3; } .titlebar-app-name { font-weight: 900; font-size: 14px; letter-spacing: 0.05em; - color: rgba(245, 243, 255, 0.92); + color: var(--text); } .titlebar-controls-wrap { @@ -219,7 +329,7 @@ body.revoked-bg { .tb-action { appearance: none; - border: 1px solid rgba(192, 132, 252, 0.22); + border: 1px solid rgba(var(--accent-light-rgb), 0.22); background: rgba(10, 8, 18, 0.22); color: rgba(245, 243, 255, 0.82); border-radius: 10px; @@ -227,18 +337,17 @@ body.revoked-bg { cursor: pointer; font-weight: 800; font-size: 12px; + transition: border-color 0.2s, background 0.2s; } -.tb-divider { - width: 1px; - height: 18px; - background: rgba(255, 255, 255, 0.10); - margin: 0 4px; +.tb-action:hover { + border-color: rgba(var(--accent-light-rgb), 0.45); + background: rgba(var(--accent-rgb), 0.12); } .win-btn { appearance: none; - border: 1px solid rgba(192, 132, 252, 0.20); + border: 1px solid rgba(var(--accent-light-rgb), 0.20); background: rgba(10, 8, 18, 0.28); color: rgba(245, 243, 255, 0.82); border-radius: 10px; @@ -246,9 +355,16 @@ body.revoked-bg { cursor: pointer; line-height: 1; font-weight: 800; + transition: background 0.2s; } -/* --- Welcome Section --- */ +.win-btn:hover { + background: rgba(255, 255, 255, 0.06); +} + +/* ───────────────────────────────────────────────────────────────────────────── + Welcome section +───────────────────────────────────────────────────────────────────────────── */ .welcome-section { text-align: center; margin-bottom: 24px; @@ -266,16 +382,18 @@ body.revoked-bg { display: inline-block; margin-top: 8px; padding: 4px 12px; - background: rgba(168, 85, 247, 0.15); - border: 1px solid rgba(192, 132, 252, 0.3); + background: rgba(var(--accent-rgb), 0.15); + border: 1px solid rgba(var(--accent-light-rgb), 0.30); border-radius: 99px; font-size: 11px; font-weight: 700; - color: var(--purple2); + color: var(--accent-light); letter-spacing: 0.05em; } -/* --- Main Card --- */ +/* ───────────────────────────────────────────────────────────────────────────── + Panel & cards +───────────────────────────────────────────────────────────────────────────── */ .panel-wrap { width: min(520px, 94vw); position: relative; @@ -287,7 +405,17 @@ body.revoked-bg { border: 1px solid rgba(255, 255, 255, 0.08); backdrop-filter: blur(18px); box-shadow: 0 18px 60px rgba(0, 0, 0, 0.55); - overflow: hidden; + /* overflow: visible so dropdowns inside modals aren't clipped */ + overflow: visible; +} + +/* Clip the card bg without clipping absolute children */ +.glass-card::after { + content: ""; + position: absolute; + inset: 0; + border-radius: 22px; + pointer-events: none; } .neon-ring { position: relative; } @@ -296,112 +424,114 @@ body.revoked-bg { position: absolute; inset: -2px; border-radius: 24px; - background: radial-gradient(140px 90px at 20% 10%, rgba(192, 132, 252, 0.35), transparent 60%); + background: radial-gradient(140px 90px at 20% 10%, rgba(var(--accent-light-rgb), 0.35), transparent 60%); filter: blur(10px); opacity: 0.85; z-index: -1; + transition: background 0.4s ease; } -.card-header { padding: 26px 26px 10px; text-align: center; } -.headline { margin: 0; font-weight: 800; font-size: 26px; } -.neon-text { color: #fff; text-shadow: 0 0 10px rgba(168, 85, 247, 0.4); } +.card-header { + padding: 26px 26px 10px; + text-align: center; +} -.form-stack { padding: 10px 26px 20px; display: grid; gap: 16px; } -.label { font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted); margin-bottom: 4px; display: block; } +.headline { + margin: 0; + font-weight: 800; + font-size: 26px; +} + +.neon-text { + color: #fff; + text-shadow: 0 0 12px rgba(var(--accent-rgb), 0.50); + transition: text-shadow 0.4s ease; +} + +.neon-text-soft { + text-shadow: 0 0 8px rgba(var(--accent-rgb), 0.40); + transition: text-shadow 0.4s ease; +} + +/* ───────────────────────────────────────────────────────────────────────────── + Form elements +───────────────────────────────────────────────────────────────────────────── */ +.form-stack { + padding: 10px 26px 20px; + display: grid; + gap: 16px; +} + +.field { display: grid; gap: 6px; } + +.label { + font-size: 11px; + letter-spacing: 0.14em; + text-transform: uppercase; + color: var(--muted); + display: block; +} .glass-input { border-radius: 14px; background: rgba(10, 8, 18, 0.42); - border: 1px solid rgba(192, 132, 252, 0.18); - overflow: visible; + border: 1px solid rgba(var(--accent-light-rgb), 0.18); + transition: border-color 0.2s; } -.custom-dropdown-wrap { - position: relative; - width: 140px; +.glass-input:focus-within { + border-color: rgba(var(--accent-rgb), 0.45); } -.dropdown-trigger { +.input { width: 100%; - display: flex; - align-items: center; - justify-content: space-between; - padding: 10px 14px; - cursor: pointer; - color: var(--text); - font-weight: 700; - font-size: 14px; - background: rgba(10, 8, 18, 0.42); - border: 1px solid rgba(192, 132, 252, 0.18); - border-radius: 14px; -} - -.dropdown-arrow { - font-size: 10px; - opacity: 0.6; -} - -.dropdown-menu { - position: absolute; - top: calc(100% + 8px); - left: 0; - right: 0; - z-index: 100; - display: flex; - flex-direction: column; - padding: 6px; - background: rgba(15, 12, 30, 0.95); - backdrop-filter: blur(20px); - border-radius: 16px; - border: 1px solid rgba(192, 132, 252, 0.3); - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5); - animation: slideUp 0.2s ease-out forwards; -} - -.dropdown-item { - appearance: none; + padding: 12px 14px; + border: 0; + outline: none; background: transparent; - border: none; - padding: 10px 12px; - text-align: left; - color: rgba(245, 243, 255, 0.8); + color: var(--text); + font-size: 14px; + display: block; +} + +/* ───────────────────────────────────────────────────────────────────────────── + Buttons +───────────────────────────────────────────────────────────────────────────── */ +.btn { + border-radius: 14px; + padding: 12px 14px; font-weight: 700; - font-size: 13px; - border-radius: 10px; cursor: pointer; - transition: all 0.2s ease; + border: 1px solid transparent; + font-family: inherit; + font-size: 14px; + transition: + transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), + box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1), + filter 0.2s ease, + background 0.3s ease, + border-color 0.3s ease; } -.dropdown-item:hover { - background: rgba(168, 85, 247, 0.15); - color: #fff; -} - -.dropdown-item.active { - background: rgba(168, 85, 247, 0.25); - color: var(--purple2); -} - -.input { width: 100%; padding: 12px 14px; border: 0; outline: none; background: transparent; color: var(--text); font-size: 14px; } - -.btn { border-radius: 14px; padding: 12px 14px; font-weight: 700; cursor: pointer; border: 1px solid transparent; } .btn-primary { - background: linear-gradient(135deg, var(--purple0), var(--purple1), var(--purple2), var(--purple0)); + background: linear-gradient(135deg, var(--accent), var(--accent-mid), var(--accent-light), var(--accent)); background-size: 300% 300%; color: #000; width: 100%; - position: relative; - overflow: hidden; - box-shadow: 0 0 20px rgba(168, 85, 247, 0.4); + box-shadow: 0 0 20px rgba(var(--accent-rgb), 0.4); animation: gradientFlow 4s ease infinite, pulseGlow 2s ease-in-out infinite; } -.btn-primary:hover { +.btn-primary:hover:not(:disabled) { transform: translateY(-2px) scale(1.02); - box-shadow: 0 0 35px rgba(168, 85, 247, 0.7); + box-shadow: 0 0 35px rgba(var(--accent-rgb), 0.7); filter: brightness(1.1); } +.btn-primary:active:not(:disabled) { + transform: translateY(0) scale(0.99); +} + .btn-primary:disabled { background: rgba(255, 255, 255, 0.05); color: rgba(255, 255, 255, 0.2); @@ -412,54 +542,352 @@ body.revoked-bg { } @keyframes gradientFlow { - 0% { background-position: 0% 50%; } - 50% { background-position: 100% 50%; } + 0% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } @keyframes pulseGlow { - 0%, 100% { box-shadow: 0 0 15px rgba(168, 85, 247, 0.4), inset 0 0 10px rgba(255, 255, 255, 0.1); } - 50% { box-shadow: 0 0 35px rgba(168, 85, 247, 0.8), inset 0 0 20px rgba(255, 255, 255, 0.2); } + 0%, 100% { box-shadow: 0 0 15px rgba(var(--accent-rgb), 0.4), inset 0 0 10px rgba(255,255,255,0.10); } + 50% { box-shadow: 0 0 35px rgba(var(--accent-rgb), 0.8), inset 0 0 20px rgba(255,255,255,0.20); } +} + +.btn-secondary, +.btn-tertiary { + background: rgba(10, 8, 18, 0.35); + border-color: rgba(var(--accent-light-rgb), 0.28); + color: #fff; +} + +.btn-secondary:hover, +.btn-tertiary:hover { + background: rgba(var(--accent-rgb), 0.10); + border-color: rgba(var(--accent-light-rgb), 0.45); +} + +/* Two-column grid row */ +.btn-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px; +} + +/* Vertical stack (replaces the broken inline flexDirection hack) */ +.btn-stack { + display: flex; + flex-direction: column; + gap: 10px; + margin-top: 14px; +} + +/* ───────────────────────────────────────────────────────────────────────────── + Status bar +───────────────────────────────────────────────────────────────────────────── */ +.status-bar { + padding: 14px; + display: flex; + justify-content: center; + gap: 20px; + border-top: 1px solid rgba(255, 255, 255, 0.05); +} + +.status-item { + display: flex; + align-items: center; + gap: 6px; + font-size: 12px; } -.btn-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } -.btn-secondary, .btn-tertiary { background: rgba(10, 8, 18, 0.35); border-color: rgba(192, 132, 252, 0.28); color: #fff; } -.status-bar { padding: 14px; display: flex; justify-content: center; gap: 20px; border-top: 1px solid rgba(255, 255, 255, 0.05); } -.status-item { display: flex; align-items: center; gap: 6px; font-size: 12px; } .status-label { color: var(--muted); } -/* --- Modals --- */ -.modal-overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.7); display: grid; place-items: center; z-index: 80; backdrop-filter: blur(4px); } -.modal { width: min(440px, 94vw); padding: 20px; } -.modal-title { margin: 0 0 16px; font-size: 20px; } - -/* --- Tutorials --- */ -.tutorial-overlay { position: fixed; inset: 0; z-index: 100; pointer-events: none; } -.tutorial-overlay * { pointer-events: auto; } -.tutorial-spotlight { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.75); backdrop-filter: blur(2px); z-index: 101; transition: all 0.5s ease; } - -/* Spotlight Positions */ -.tutorial-spotlight.step-0 { clip-path: polygon(0% 0%, 0% 100%, 26px 100%, 26px 225px, calc(100% - 26px) 225px, calc(100% - 26px) 305px, 26px 305px, 26px 100%, 100% 100%, 100% 0%); } -.tutorial-spotlight.step-1 { clip-path: polygon(0% 0%, 0% 100%, 26px 100%, 26px 315px, calc(100% - 26px) 315px, calc(100% - 26px) 375px, 26px 375px, 26px 100%, 100% 100%, 100% 0%); } -.tutorial-spotlight.step-2 { clip-path: polygon(0% 0%, 0% 100%, calc(100% - 240px) 100%, calc(100% - 240px) 5px, calc(100% - 165px) 5px, calc(100% - 165px) 45px, calc(100% - 240px) 45px, calc(100% - 240px) 100%, 100% 100%, 100% 0%); } -.tutorial-spotlight.step-3 { clip-path: none; } - -.tutorial-card { position: absolute; width: 300px; padding: 20px; z-index: 105; transition: all 0.5s ease; box-shadow: 0 0 40px rgba(168, 85, 247, 0.3); } -.tutorial-card.step-0 { top: 315px; left: 50%; transform: translateX(-50%); } -.tutorial-card.step-1 { top: 385px; left: 50%; transform: translateX(-50%); } -.tutorial-card.step-2 { top: 55px; right: 10px; } -.tutorial-card.step-3 { top: 50%; left: 50%; transform: translate(-50%, -50%); } - -#step-username, #step-inject, #step-settings { position: relative; z-index: 102; } - -/* Global Smooth Transitions */ -button, input, select, .glass-card, .modal-overlay, .switch-ui { - transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; +.status-active { + color: var(--accent-light); + text-shadow: 0 0 6px rgba(var(--accent-rgb), 0.5); } -.neon-text-soft { text-shadow: 0 0 8px rgba(168, 85, 247, 0.35); } +/* ───────────────────────────────────────────────────────────────────────────── + Modals +───────────────────────────────────────────────────────────────────────────── */ +.modal-overlay { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.70); + display: grid; + place-items: center; + z-index: 80; + backdrop-filter: blur(4px); + animation: fadeIn 0.15s ease; +} +@keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } +} + +.modal { + width: min(440px, 94vw); + padding: 20px; + animation: slideUp 0.2s ease-out; +} + +.modal-title { + margin: 0 0 16px; + font-size: 20px; + font-weight: 800; +} + +.modal-p { + margin: 0 0 14px; + color: var(--muted); + font-size: 14px; + line-height: 1.6; +} + +/* ───────────────────────────────────────────────────────────────────────────── + Settings rows +───────────────────────────────────────────────────────────────────────────── */ +.setting-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 14px; + padding: 10px 6px; + border-bottom: 1px solid rgba(255, 255, 255, 0.04); +} + +.setting-row:last-of-type { border-bottom: none; } + +.setting-text { + display: grid; + gap: 3px; + min-width: 0; +} + +.setting-title { + font-weight: 800; + color: rgba(245, 243, 255, 0.88); + letter-spacing: 0.01em; + font-size: 14px; +} + +.setting-sub { + font-size: 12px; + color: var(--muted); + line-height: 1.4; +} + +/* ───────────────────────────────────────────────────────────────────────────── + Toggle switch +───────────────────────────────────────────────────────────────────────────── */ +.switch { + position: relative; + width: 46px; + height: 28px; + flex: 0 0 auto; +} + +.switch input { + position: absolute; + inset: 0; + opacity: 0; + cursor: pointer; +} + +.switch-ui { + position: absolute; + inset: 0; + border-radius: 999px; + background: rgba(10, 8, 18, 0.35); + border: 1px solid rgba(var(--accent-light-rgb), 0.28); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04); + transition: background 0.25s, border-color 0.25s, box-shadow 0.25s; +} + +.switch-ui::after { + content: ""; + position: absolute; + top: 50%; + left: 4px; + width: 20px; + height: 20px; + transform: translateY(-50%); + border-radius: 999px; + background: linear-gradient(135deg, rgba(245, 243, 255, 0.9), rgba(var(--accent-light-rgb), 0.55)); + box-shadow: 0 8px 18px rgba(0,0,0,0.35), 0 0 14px rgba(var(--accent-rgb), 0.18); + transition: left 0.25s cubic-bezier(0.4, 0, 0.2, 1); +} + +.switch input:checked + .switch-ui { + background: rgba(var(--accent-rgb), 0.18); + border-color: rgba(var(--accent-light-rgb), 0.55); + box-shadow: + 0 0 0 4px rgba(var(--accent-rgb), 0.10), + 0 0 18px rgba(var(--accent-rgb), 0.14), + inset 0 1px 0 rgba(255,255,255,0.05); +} + +.switch input:checked + .switch-ui::after { + left: 22px; +} + +/* ───────────────────────────────────────────────────────────────────────────── + Dropdown +───────────────────────────────────────────────────────────────────────────── */ +.custom-dropdown-wrap { + position: relative; + width: 140px; + /* ensure dropdown can overflow parent modal */ + z-index: 10; +} + +.dropdown-trigger { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + padding: 9px 13px; + cursor: pointer; + color: var(--text); + font-weight: 700; + font-size: 14px; + background: rgba(10, 8, 18, 0.42); + border: 1px solid rgba(var(--accent-light-rgb), 0.22); + border-radius: 12px; + font-family: inherit; + transition: border-color 0.2s; +} + +.dropdown-trigger:hover { + border-color: rgba(var(--accent-light-rgb), 0.42); +} + +.dropdown-arrow { + font-size: 10px; + opacity: 0.6; +} + +.dropdown-menu { + position: absolute; + top: calc(100% + 6px); + left: 0; + right: 0; + z-index: 200; + display: flex; + flex-direction: column; + padding: 6px; + background: rgba(15, 12, 30, 0.97); + backdrop-filter: blur(20px); + border-radius: 14px; + border: 1px solid rgba(var(--accent-light-rgb), 0.30); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.6); + animation: slideUp 0.15s ease-out forwards; +} + +.dropdown-item { + appearance: none; + background: transparent; + border: none; + padding: 9px 12px; + text-align: left; + color: rgba(245, 243, 255, 0.8); + font-weight: 700; + font-size: 13px; + border-radius: 10px; + cursor: pointer; + font-family: inherit; + transition: background 0.15s, color 0.15s; +} + +.dropdown-item:hover { + background: rgba(var(--accent-rgb), 0.15); + color: #fff; +} + +.dropdown-item.active { + background: rgba(var(--accent-rgb), 0.25); + color: var(--accent-light); +} + +/* ───────────────────────────────────────────────────────────────────────────── + Theme swatch picker +───────────────────────────────────────────────────────────────────────────── */ +.theme-swatches { + display: flex; + gap: 8px; + align-items: center; +} + +.theme-swatch { + width: 24px; + height: 24px; + border-radius: 50%; + border: 2px solid transparent; + background: var(--swatch-color); + cursor: pointer; + padding: 0; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.4); + transition: transform 0.15s, border-color 0.15s, box-shadow 0.15s; + flex: 0 0 auto; +} + +.theme-swatch:hover { + transform: scale(1.2); + box-shadow: 0 0 12px var(--swatch-color); +} + +.theme-swatch.active { + border-color: #fff; + transform: scale(1.2); + box-shadow: 0 0 14px var(--swatch-color); +} + +/* ───────────────────────────────────────────────────────────────────────────── + Credits +───────────────────────────────────────────────────────────────────────────── */ +.credits-grid { + display: grid; + gap: 12px; + padding: 16px; + margin-bottom: 0; +} + +.credit-row { + display: flex; + justify-content: space-between; + align-items: center; + font-size: 13px; +} + +.credit-role { color: var(--muted); } +.credit-name { color: var(--text); font-weight: 600; } + +.credit-divider { + border: none; + border-top: 1px solid rgba(255, 255, 255, 0.08); + margin: 4px 0; +} + +/* ───────────────────────────────────────────────────────────────────────────── + Revoked card variant +───────────────────────────────────────────────────────────────────────────── */ +.glass-card.revoked { + background: linear-gradient(180deg, rgba(255, 51, 51, 0.12), rgba(255, 51, 51, 0.06)); + border-color: rgba(255, 85, 85, 0.25); +} + +.glass-card.revoked .neon-ring::before { + background: radial-gradient(140px 90px at 20% 10%, rgba(255, 85, 85, 0.4), transparent 60%); +} + +.neon-text.red { + text-shadow: 0 0 12px rgba(255, 51, 51, 0.6); + color: var(--red0); +} + +/* ───────────────────────────────────────────────────────────────────────────── + Animations +───────────────────────────────────────────────────────────────────────────── */ @keyframes slideUp { - from { opacity: 0; transform: translateY(20px); } - to { opacity: 1; transform: translateY(0); } -} + from { opacity: 0; transform: translateY(14px); } + to { opacity: 1; transform: translateY(0); } +} \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 68f3ed4..e6c24e2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,15 +1,15 @@ import { useMemo, useState, useEffect } from "react"; type Status = - | "ready" - | "saved successfully" - | "injection started" - | "validating key..." - | "invalid key" - | "injecting..." - | "RL Running" - | "RL Closed" - | string; + | "ready" + | "saved successfully" + | "injection started" + | "validating key..." + | "invalid key" + | "injecting..." + | "RL Running" + | "RL Closed" + | string; interface UserInfo { userId: string | null; @@ -25,12 +25,24 @@ interface KeyValidationResponse { user: UserInfo | null; } +const THEMES = [ + { id: "phantom", label: "Phantom", color: "#a855f7" }, + { id: "glacier", label: "Glacier", color: "#38bdf8" }, + { id: "inferno", label: "Inferno", color: "#f97316" }, + { id: "matrix", label: "Matrix", color: "#00ff41" }, + { id: "synthwave", label: "Synthwave", color: "#f72585" }, + { id: "eclipse", label: "Eclipse", color: "#fbbf24" }, +] as const; + +type ThemeId = typeof THEMES[number]["id"]; + const LS_KEYS = { spoofed: "rlidentity.spoofedUsername", apiKey: "rlidentity.apiKey", minimizeToTray: "rlidentity.minimizeToTray", platform: "rlidentity.platform", autoInject: "rlidentity.autoInject", + theme: "rlidentity.theme", } as const; const GITHUB_URL = "https://git.rlidentity.me/bits/rlidentity"; @@ -56,7 +68,6 @@ async function tryInvoke(cmd: string, args?: Record) { async function openUrl(url: string) { const fallback = () => window.open(url, "_blank", "noopener,noreferrer"); if (!isTauriRuntime()) return fallback(); - try { const mod: any = await import("@tauri-apps/plugin-opener"); if (typeof mod.openUrl === "function") { @@ -70,30 +81,35 @@ async function openUrl(url: string) { } export default function App() { - const initialApiKey = useMemo(() => localStorage.getItem(LS_KEYS.apiKey) ?? "", []); - const initialSpoofed = useMemo(() => localStorage.getItem(LS_KEYS.spoofed) ?? "", []); - const initialMinToTray = useMemo(() => localStorage.getItem(LS_KEYS.minimizeToTray) === "true", []); - const initialPlatform = useMemo(() => localStorage.getItem(LS_KEYS.platform) ?? "Epic", []); + const initialApiKey = useMemo(() => localStorage.getItem(LS_KEYS.apiKey) ?? "", []); + const initialSpoofed = useMemo(() => localStorage.getItem(LS_KEYS.spoofed) ?? "", []); + const initialMinToTray = useMemo(() => localStorage.getItem(LS_KEYS.minimizeToTray) === "true", []); + const initialPlatform = useMemo(() => localStorage.getItem(LS_KEYS.platform) ?? "Epic", []); const initialAutoInject = useMemo(() => localStorage.getItem(LS_KEYS.autoInject) === "true", []); + const initialTheme = useMemo(() => (localStorage.getItem(LS_KEYS.theme) ?? "phantom") as ThemeId, []); - const [apiKey, setApiKey] = useState(initialApiKey); + const [apiKey, setApiKey] = useState(initialApiKey); const [spoofedUsername, setSpoofedUsername] = useState(initialSpoofed); - const [isAuthorized, setIsAuthorized] = useState(false); - const [isRevoked, setIsRevoked] = useState(false); - const [userData, setUserData] = useState(null); - - const [status, setStatus] = useState("ready"); - const [rlStatus, setRlStatus] = useState("Checking..."); - const [settingsOpen, setSettingsOpen] = useState(false); - const [logsOpen, setLogsOpen] = useState(false); - const [lastLog, setLastLog] = useState(""); + const [isAuthorized, setIsAuthorized] = useState(false); + const [isRevoked, setIsRevoked] = useState(false); + const [userData, setUserData] = useState(null); + + const [status, setStatus] = useState("ready"); + const [rlStatus, setRlStatus] = useState("Checking..."); + const [settingsOpen, setSettingsOpen] = useState(false); + const [logsOpen, setLogsOpen] = useState(false); + const [lastLog, setLastLog] = useState(""); const [minimizeToTray, setMinimizeToTray] = useState(initialMinToTray); - const [platform, setPlatform] = useState(initialPlatform); - const [autoInject, setAutoInject] = useState(initialAutoInject); + const [platform, setPlatform] = useState(initialPlatform); + const [autoInject, setAutoInject] = useState(initialAutoInject); const [platformPickerOpen, setPlatformPickerOpen] = useState(false); - - // Easter Egg State - const [debugOpen, setDebugOpen] = useState(false); + const [theme, setTheme] = useState(initialTheme); + + // Update modal + const [pendingUpdate, setPendingUpdate] = useState<{ version: string; install: () => Promise } | null>(null); + + // Easter egg + const [debugOpen, setDebugOpen] = useState(false); const [logoClicks, setLogoClicks] = useState(0); const handleLogoClick = (e: React.MouseEvent) => { @@ -112,29 +128,25 @@ export default function App() { return () => clearTimeout(timer); }, [logoClicks]); - // Tutorial State - const [tutorialStep, setTutorialStep] = useState(-1); - - // Startup Authorization & Update Check + // Apply theme useEffect(() => { - if (initialApiKey) { - authorize(initialApiKey); - } + document.documentElement.setAttribute("data-theme", theme); + localStorage.setItem(LS_KEYS.theme, theme); + }, [theme]); + + // Startup + useEffect(() => { + if (initialApiKey) authorize(initialApiKey); syncAssetsAndCheckUpdates(); }, []); async function syncAssetsAndCheckUpdates() { if (!isTauriRuntime()) return; - - // 1. Download DLL and Injector try { await tryInvoke("download_assets"); - console.log("Assets synced successfully"); } catch (e) { console.error("Failed to sync assets:", e); } - - // 2. Check for App updates checkForUpdates(); } @@ -144,89 +156,72 @@ export default function App() { const { check } = await import("@tauri-apps/plugin-updater"); const update = await check(); if (update) { - console.log(`Update available: ${update.version}`); - const confirmed = window.confirm(`A new version (${update.version}) is available. Would you like to update?`); - if (confirmed) { - setStatus("Updating..."); - await update.downloadAndInstall(); - // The app will restart automatically after install on some platforms, - // or we might need to relaunch. Tauri v2 updater usually handles this. - const { relaunch } = await import("@tauri-apps/plugin-process"); - await relaunch(); - } + setPendingUpdate({ + version: update.version, + install: async () => { + setStatus("Updating..."); + await update.downloadAndInstall(); + const { relaunch } = await import("@tauri-apps/plugin-process"); + await relaunch(); + }, + }); } } catch (e) { console.error("Failed to check for updates:", e); } } - // Sync revoked background to body + // Revoked bg useEffect(() => { - if (isRevoked) { - document.body.classList.add('revoked-bg'); - } else { - document.body.classList.remove('revoked-bg'); - } + document.body.classList.toggle("revoked-bg", isRevoked); }, [isRevoked]); - // Poll for Rocket League status & Auto Inject + // Poll RL status + auto-inject useEffect(() => { if (!isAuthorized || isRevoked) return; const interval = setInterval(async () => { - try { - const res = await tryInvoke<{is_running: boolean}>("check_status"); - if (res) { - const wasRunning = rlStatus === "RL Running"; - const isRunning = res.is_running; - setRlStatus(isRunning ? "RL Running" : "RL Closed"); - - // Auto Inject Logic: if it just started running and autoInject is on - if (!wasRunning && isRunning && autoInject) { - inject(); - } - } - } catch (e) { - console.error(e); + try { + const res = await tryInvoke<{ is_running: boolean }>("check_status"); + if (res) { + const wasRunning = rlStatus === "RL Running"; + const isRunning = res.is_running; + setRlStatus(isRunning ? "RL Running" : "RL Closed"); + if (!wasRunning && isRunning && autoInject) inject(); } + } catch (e) { + console.error(e); + } }, 2000); return () => clearInterval(interval); }, [isAuthorized, isRevoked, rlStatus, autoInject]); async function authorize(keyToTry: string) { - if (!keyToTry.trim()) { - setStatus("Please enter a key"); - return; - } + if (!keyToTry.trim()) { setStatus("Please enter a key"); return; } setStatus("validating key..."); setIsRevoked(false); try { - const hwid = await tryInvoke("get_hwid") || "UNKNOWN-HWID"; - const res = await tryInvoke("validate_key", { key: keyToTry.trim(), hwid }); - - if (res && res.status === "valid") { - localStorage.setItem(LS_KEYS.apiKey, keyToTry.trim()); - setUserData(res.user); - setIsAuthorized(true); - setIsRevoked(false); - setStatus("ready"); - - // Check for tutorial - if (res.user?.logins === 0) { - setTutorialStep(0); - } - } else if (res && res.status === "revoked") { - setIsRevoked(true); - setIsAuthorized(false); - setStatus("Error: Key Revoked"); - } else if (res && res.status === "invalid_hwid") { - setStatus("Error: Key locked to another PC"); - setIsAuthorized(false); - } else { - setStatus("Error: Invalid key"); - setIsAuthorized(false); - } - } catch (e) { - setStatus("Network Error: Check connection"); + const hwid = await tryInvoke("get_hwid") || "UNKNOWN-HWID"; + const res = await tryInvoke("validate_key", { key: keyToTry.trim(), hwid }); + + if (res?.status === "valid") { + localStorage.setItem(LS_KEYS.apiKey, keyToTry.trim()); + setUserData(res.user); + setIsAuthorized(true); + setIsRevoked(false); + setStatus("ready"); + } else if (res?.status === "revoked") { + setIsRevoked(true); + setIsAuthorized(false); + setStatus("Error: Key Revoked"); + } else if (res?.status === "invalid_hwid") { + setStatus("Error: Key locked to another PC"); + setIsAuthorized(false); + } else { + setStatus("Error: Invalid key"); + setIsAuthorized(false); + } + } catch { + setStatus("Network Error: Check connection"); } } @@ -234,25 +229,25 @@ export default function App() { localStorage.setItem(LS_KEYS.spoofed, spoofedUsername.trim()); localStorage.setItem(LS_KEYS.platform, platform); try { - await tryInvoke("save_config", { name: spoofedUsername.trim(), platform }); - setStatus("saved successfully"); - window.setTimeout(() => setStatus("ready"), 1400); + await tryInvoke("save_config", { name: spoofedUsername.trim(), platform }); + setStatus("saved successfully"); + window.setTimeout(() => setStatus("ready"), 1400); } catch (e) { - setStatus("Save error: " + String(e)); + setStatus("Save error: " + String(e)); } } async function inject() { setStatus("injecting..."); try { - const res = await tryInvoke("inject_dll", { discordId: userData?.discordId }); - setLastLog(res || "Successfully Injected!"); - setStatus("Successfully Injected!"); - window.setTimeout(() => setStatus("ready"), 1400); + const res = await tryInvoke("inject_dll", { discordId: userData?.discordId }); + setLastLog(res || "Successfully Injected!"); + setStatus("Successfully Injected!"); + window.setTimeout(() => setStatus("ready"), 1400); } catch (e) { - setStatus("Injection Failed!"); - setLastLog(String(e)); - setLogsOpen(true); + setStatus("Injection Failed!"); + setLastLog(String(e)); + setLogsOpen(true); } } @@ -260,7 +255,7 @@ export default function App() { setMinimizeToTray(next); localStorage.setItem(LS_KEYS.minimizeToTray, String(next)); } - + function toggleAutoInject(next: boolean) { setAutoInject(next); localStorage.setItem(LS_KEYS.autoInject, String(next)); @@ -271,7 +266,7 @@ export default function App() { if (minimizeToTray) { await tryInvoke("minimize_to_tray"); } else { - await tryWindowApi((w) => w.minimize()); + await tryWindowApi(w => w.minimize()); } } @@ -280,41 +275,51 @@ export default function App() { window.location.reload(); }; - const tutorialSteps = [ - { title: "Welcome to RLidentity", text: "Let's show you around. First, enter your spoofed username here.", target: "input" }, - { title: "Injection", text: "Once Rocket League is running, click Inject to start. Or enable Auto-Inject in settings!", target: "btn-primary" }, - { title: "Settings", text: "Customize your experience here. Change your platform or toggle Auto-Injection.", target: "tb-action" }, - { title: "All Set!", text: "You're ready to win. Happy gaming!", target: "none" } - ]; + const closeAllModals = () => { + setSettingsOpen(false); + setLogsOpen(false); + setDebugOpen(false); + }; + const isModalOpen = settingsOpen || logsOpen || debugOpen; + + // ── Auth screen ─────────────────────────────────────────────────────────── if (!isAuthorized) { return (

- @@ -349,234 +357,235 @@ export default function App() { ); } + // ── Main app ────────────────────────────────────────────────────────────── return ( -
-