diff --git a/README.md b/README.md index 0ef361a..6b26fd8 100644 --- a/README.md +++ b/README.md @@ -210,6 +210,10 @@ https://evilfox.win/ Некоторые AV (Bkav, Microsoft Wacapew/Wacatac, Ikarus Trojan.WinGo.Agent, Google, Trapmine) часто помечают **любые** неподписанные Go-бинарники с сетью и сменой системного прокси. +В 2.0.0: +- новый интерфейс (connect-first), обновлённая иконка и типографика; +- чище UX: протокол-бейдж, сворачиваемые сервисные действия, статус-карточка. + В 1.9.0: - VLESS / VMess / Trojan через официальный Xray-core (кнопка «Установить cores»). diff --git a/assets/navis-icon.png b/assets/navis-icon.png index c011784..1390b91 100644 Binary files a/assets/navis-icon.png and b/assets/navis-icon.png differ diff --git a/assets/navis.ico b/assets/navis.ico index 9cd0fc4..91dfecc 100644 Binary files a/assets/navis.ico and b/assets/navis.ico differ diff --git a/cmd/vpnapp/main_windows.go b/cmd/vpnapp/main_windows.go index 22cd3ab..d06fa2e 100644 --- a/cmd/vpnapp/main_windows.go +++ b/cmd/vpnapp/main_windows.go @@ -107,9 +107,9 @@ func main() { AutoFocus: true, DataPath: dataPath, WindowOptions: webview2.WindowOptions{ - Title: "Navis", - Width: 520, - Height: 860, + Title: "Navis 2", + Width: 500, + Height: 820, Center: true, IconId: 1, }, @@ -124,7 +124,7 @@ func main() { }() applyWindowIcon(w.Window()) - w.SetSize(520, 860, webview2.HintNone) + w.SetSize(500, 820, webview2.HintNone) mustBind(w, "getState", a.getState) mustBind(w, "connect", a.connect) diff --git a/dist/navis-release/Navis.exe b/dist/navis-release/Navis.exe index ed86355..9d38986 100644 Binary files a/dist/navis-release/Navis.exe and b/dist/navis-release/Navis.exe differ diff --git a/dist/navis-release/darwin-amd64/Navis b/dist/navis-release/darwin-amd64/Navis index 5b0f393..deb878d 100644 Binary files a/dist/navis-release/darwin-amd64/Navis and b/dist/navis-release/darwin-amd64/Navis differ diff --git a/dist/navis-release/darwin-arm64/Navis b/dist/navis-release/darwin-arm64/Navis index 520364d..7d2ad20 100644 Binary files a/dist/navis-release/darwin-arm64/Navis and b/dist/navis-release/darwin-arm64/Navis differ diff --git a/dist/navis-release/update.json b/dist/navis-release/update.json index 980cd12..1337e54 100644 --- a/dist/navis-release/update.json +++ b/dist/navis-release/update.json @@ -1,28 +1,28 @@ { - "version": "1.9.0", - "notes": "VLESS / VMess / Trojan через Xray-core; нажмите «Установить cores»", + "version": "2.0.0", + "notes": "Navis 2.0: новый интерфейс, иконка и UX (connect-first)", "platform": "windows-amd64", "os": "windows", "arch": "amd64", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", - "sha256": "bd78ead7711b23a25b1a30278ec381bd762b595e91c4c00f7370c62d785740f7", + "sha256": "aec3a8614383c0676137ee580ff3752881feb3405189b4fa3482aa3d8a758012", "mandatory": false, "platforms": { "windows-amd64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", - "sha256": "bd78ead7711b23a25b1a30278ec381bd762b595e91c4c00f7370c62d785740f7", + "sha256": "aec3a8614383c0676137ee580ff3752881feb3405189b4fa3482aa3d8a758012", "os": "windows", "arch": "amd64" }, "darwin-arm64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis", - "sha256": "237962c24fb875f3dd2a5ecfad0db5d6837cefb6b691860a3e1d6f0e721f8449", + "sha256": "f86c20342b6ffa7cdea900de67a8ce3eb28ffffae2b209b45dbe13078361606c", "os": "darwin", "arch": "arm64" }, "darwin-amd64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis", - "sha256": "91430bb85df68b3816d9cc643b1bdc3d022410473c4f87f4d8573bb99259ba45", + "sha256": "1c9abd8f7d496fa71e86a93b459e95121d0da11298b7c8c7de8671009cf6f716", "os": "darwin", "arch": "amd64" } diff --git a/dist/update.json b/dist/update.json index 980cd12..1337e54 100644 --- a/dist/update.json +++ b/dist/update.json @@ -1,28 +1,28 @@ { - "version": "1.9.0", - "notes": "VLESS / VMess / Trojan через Xray-core; нажмите «Установить cores»", + "version": "2.0.0", + "notes": "Navis 2.0: новый интерфейс, иконка и UX (connect-first)", "platform": "windows-amd64", "os": "windows", "arch": "amd64", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", - "sha256": "bd78ead7711b23a25b1a30278ec381bd762b595e91c4c00f7370c62d785740f7", + "sha256": "aec3a8614383c0676137ee580ff3752881feb3405189b4fa3482aa3d8a758012", "mandatory": false, "platforms": { "windows-amd64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", - "sha256": "bd78ead7711b23a25b1a30278ec381bd762b595e91c4c00f7370c62d785740f7", + "sha256": "aec3a8614383c0676137ee580ff3752881feb3405189b4fa3482aa3d8a758012", "os": "windows", "arch": "amd64" }, "darwin-arm64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis", - "sha256": "237962c24fb875f3dd2a5ecfad0db5d6837cefb6b691860a3e1d6f0e721f8449", + "sha256": "f86c20342b6ffa7cdea900de67a8ce3eb28ffffae2b209b45dbe13078361606c", "os": "darwin", "arch": "arm64" }, "darwin-amd64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis", - "sha256": "91430bb85df68b3816d9cc643b1bdc3d022410473c4f87f4d8573bb99259ba45", + "sha256": "1c9abd8f7d496fa71e86a93b459e95121d0da11298b7c8c7de8671009cf6f716", "os": "darwin", "arch": "amd64" } diff --git a/internal/appui/index.html b/internal/appui/index.html index 23cd613..32c6679 100644 --- a/internal/appui/index.html +++ b/internal/appui/index.html @@ -6,273 +6,456 @@ Navis - + @@ -342,51 +563,78 @@ -
+
-

Navis

-

NaiveProxy · Hysteria 2 · несколько серверов

+
+

Navis

+ 2.0 +
+

Быстрый клиент · Naive · Hy2 · AWG · Xray

-
+ -
- - Отключено -
- - -
- - - -
- -
-
- - +
+
+
+ + Отключено +
+ протокол
-
- - +
+
-
- -
- - +

Выберите профиль и нажмите Подключить

+
+ +
+
Сервер
+ +
+ + + +
+ +
+
+ + +
+
+ + +
+
+ +
+ + +
+
+ +
+ Системный прокси +
-
- Hysteria 2 · BBR / Salamander / маскировка +
+ +
+ +
+ Hysteria 2 · BBR / obfuscation
@@ -421,10 +669,10 @@
- +
- +
@@ -441,30 +689,24 @@
-
- Системный прокси Windows - -
- -
- - +
+ Сервис · пинг, cores, обновления
- -
-
+
+ +
+
+
+

Загрузка…

-

Безопасное подключение

-

На любом устройстве — защита данных, стабильность и приватность. Демо-ключ от 30₽.

- +

Нужен доступ?

+

Ключи и тарифы на evilfox.win — демо от 30₽.

+

Navis

@@ -480,7 +722,7 @@
- +
@@ -515,6 +757,9 @@ const verLabel = $("verLabel"); const subUrl = $("subUrl"); const subBtn = $("subBtn"); + const hero = $("hero"); + const protoChip = $("protoChip"); + const heroHint = $("heroHint"); const SHOP_URL = "https://evilfox.win/"; function readHy2() { @@ -579,10 +824,25 @@ function setMeta(text, kind) { meta.textContent = text || ""; - meta.style.color = kind === "err" ? "var(--danger)" : kind === "ok" ? "var(--accent)" : "var(--muted)"; + meta.classList.remove("ok", "err"); + if (kind === "ok") meta.classList.add("ok"); + if (kind === "err") meta.classList.add("err"); if (kind === "ok" || kind === "err") metaHoldUntil = Date.now() + 8000; } + function detectProtoLabel(state, active) { + const p = (state.protocol || active.protocol || "").toLowerCase(); + const link = (typeof state.proxy === "string" ? state.proxy : (active.proxy || "")).trim().toLowerCase(); + if (p) return p; + if (link.startsWith("vless://")) return "vless"; + if (link.startsWith("vmess://")) return "vmess"; + if (link.startsWith("trojan://")) return "trojan"; + if (link.startsWith("hysteria2://") || link.startsWith("hy2://")) return "hysteria2"; + if (link.startsWith("awg://") || link.includes("[interface]")) return "awg"; + if (link.startsWith("naive") || link.startsWith("https://") || link.startsWith("quic://")) return "naive"; + return "протокол"; + } + function fillProfiles(list, active) { profiles = list || []; const cur = profile.value; @@ -590,7 +850,8 @@ profiles.forEach((p) => { const opt = document.createElement("option"); opt.value = p.name; - opt.textContent = (p.protocol ? ("[" + p.protocol + "] ") : "") + (p.host ? (p.name + " · " + p.host) : p.name); + const proto = p.protocol ? String(p.protocol).toUpperCase() : ""; + opt.textContent = (proto ? (proto + " · ") : "") + (p.host ? (p.name + " · " + p.host) : p.name); profile.appendChild(opt); }); const want = active || cur || (profiles[0] && profiles[0].name); @@ -611,6 +872,9 @@ row.appendChild(right); pingList.appendChild(row); }); + if ((pings || []).length && $("toolsBox") && !$("toolsBox").open) { + $("toolsBox").open = true; + } } function renderUpdate(u, version) { @@ -632,6 +896,7 @@ const syncForm = opts && opts.syncForm; connected = !!state.connected; dot.classList.toggle("on", connected); + hero.classList.toggle("on", connected); statusText.textContent = connected ? ("Подключено" + (state.profile ? " · " + state.profile : "")) : "Отключено"; @@ -671,16 +936,26 @@ if (syncForm) dirty = false; } + const active = (state.profiles || []).find((p) => p.name === profile.value) || {}; + const label = detectProtoLabel(state, active); + protoChip.textContent = label; + protoChip.classList.toggle("active", !!state.connected || label !== "протокол"); + const hy2 = (label === "hysteria2" || label === "hy2"); + if ($("hy2Box")) $("hy2Box").style.display = hy2 ? "" : "none"; + let detail = ""; if (connected) { const parts = []; if (state.http_proxy) parts.push("HTTP " + state.http_proxy); if (state.socks_proxy) parts.push("SOCKS " + state.socks_proxy); - detail = parts.join(" · "); + detail = parts.join(" · ") || "Туннель активен"; + heroHint.textContent = detail; } else if (state.core_ready === false) { - detail = "Сначала установите cores (naive / hy2 / xray)"; + detail = "Сначала установите cores в разделе «Сервис»"; + heroHint.textContent = "Нужны cores для выбранного протокола"; } else { - detail = "Вставьте ссылку: naive / hy2 / vless / vmess / trojan / awg"; + detail = "Готово к подключению"; + heroHint.textContent = "Выберите профиль и нажмите Подключить"; } if (!busy && Date.now() > metaHoldUntil) { setMeta(detail, state.core_ready === false ? "err" : ""); @@ -751,7 +1026,7 @@ try { setMeta("Скачивание official cores…"); const path = await installCore(); - setMeta("Cores: " + path, "ok"); + setMeta("Cores готовы: " + path, "ok"); } catch (e) { setMeta(String(e), "err"); } })); @@ -772,6 +1047,9 @@ $("newName").focus(); }); $("cancelNew").addEventListener("click", () => modal.classList.remove("open")); + modal.addEventListener("click", (e) => { + if (e.target === modal) modal.classList.remove("open"); + }); $("createNew").addEventListener("click", () => withBusy(async () => { try { const n = $("newName").value.trim(); diff --git a/internal/update/update.go b/internal/update/update.go index cd4ed1a..fad645e 100644 --- a/internal/update/update.go +++ b/internal/update/update.go @@ -17,7 +17,7 @@ import ( ) // CurrentVersion is the shipped client version. -const CurrentVersion = "1.9.0" +const CurrentVersion = "2.0.0" // DefaultManifestURL is the update feed (hosted in the project git repo). const DefaultManifestURL = "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/update.json" diff --git a/server/update.json b/server/update.json index 980cd12..1337e54 100644 --- a/server/update.json +++ b/server/update.json @@ -1,28 +1,28 @@ { - "version": "1.9.0", - "notes": "VLESS / VMess / Trojan через Xray-core; нажмите «Установить cores»", + "version": "2.0.0", + "notes": "Navis 2.0: новый интерфейс, иконка и UX (connect-first)", "platform": "windows-amd64", "os": "windows", "arch": "amd64", "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", - "sha256": "bd78ead7711b23a25b1a30278ec381bd762b595e91c4c00f7370c62d785740f7", + "sha256": "aec3a8614383c0676137ee580ff3752881feb3405189b4fa3482aa3d8a758012", "mandatory": false, "platforms": { "windows-amd64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/Navis.exe", - "sha256": "bd78ead7711b23a25b1a30278ec381bd762b595e91c4c00f7370c62d785740f7", + "sha256": "aec3a8614383c0676137ee580ff3752881feb3405189b4fa3482aa3d8a758012", "os": "windows", "arch": "amd64" }, "darwin-arm64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-arm64/Navis", - "sha256": "237962c24fb875f3dd2a5ecfad0db5d6837cefb6b691860a3e1d6f0e721f8449", + "sha256": "f86c20342b6ffa7cdea900de67a8ce3eb28ffffae2b209b45dbe13078361606c", "os": "darwin", "arch": "arm64" }, "darwin-amd64": { "url": "https://git.evilfox.cc/test2/navi/raw/branch/main/dist/navis-release/darwin-amd64/Navis", - "sha256": "91430bb85df68b3816d9cc643b1bdc3d022410473c4f87f4d8573bb99259ba45", + "sha256": "1c9abd8f7d496fa71e86a93b459e95121d0da11298b7c8c7de8671009cf6f716", "os": "darwin", "arch": "amd64" } diff --git a/versioninfo.json b/versioninfo.json index b1e9fc0..f9dd0e8 100644 --- a/versioninfo.json +++ b/versioninfo.json @@ -1,7 +1,7 @@ { "FixedFileInfo": { - "FileVersion": { "Major": 1, "Minor": 9, "Patch": 0, "Build": 0 }, - "ProductVersion": { "Major": 1, "Minor": 9, "Patch": 0, "Build": 0 }, + "FileVersion": { "Major": 2, "Minor": 0, "Patch": 0, "Build": 0 }, + "ProductVersion": { "Major": 2, "Minor": 0, "Patch": 0, "Build": 0 }, "FileFlagsMask": "3f", "FileFlags": "00", "FileOS": "40004", @@ -10,13 +10,13 @@ }, "StringFileInfo": { "CompanyName": "EvilFox", - "FileDescription": "Navis VPN client (Naive / Hy2 / AWG / VLESS / VMess / Trojan)", - "FileVersion": "1.9.0.0", + "FileDescription": "Navis 2 — VPN client (Naive / Hy2 / AWG / VLESS / VMess / Trojan)", + "FileVersion": "2.0.0.0", "InternalName": "Navis", "LegalCopyright": "Copyright (c) EvilFox", "OriginalFilename": "Navis.exe", "ProductName": "Navis", - "ProductVersion": "1.9.0.0", + "ProductVersion": "2.0.0.0", "Comments": "Open-source VPN/proxy client. https://evilfox.win/" }, "VarFileInfo": {