diff --git a/index.html b/index.html
index 5619624..2e020f5 100644
--- a/index.html
+++ b/index.html
@@ -20,6 +20,7 @@
--shadow: 0 20px 60px rgba(0, 0, 0, 0.36);
--upload: #a78bfa;
--warning: #f59e0b;
+ --danger: #ef4444;
}
[data-theme="light"] {
@@ -194,6 +195,17 @@
box-shadow: 0 14px 34px var(--accent-soft);
}
+ .server-card:disabled {
+ cursor: not-allowed;
+ opacity: 0.62;
+ transform: none;
+ box-shadow: var(--shadow);
+ }
+
+ .server-card:disabled:hover {
+ border-color: var(--border);
+ }
+
.flag {
display: grid;
place-items: center;
@@ -245,6 +257,11 @@
white-space: nowrap;
}
+ .ping.is-offline {
+ color: var(--danger);
+ font-weight: 800;
+ }
+
.pill {
display: inline-flex;
align-items: center;
@@ -729,13 +746,20 @@
elements.serverGrid.innerHTML = "";
servers.forEach((server) => {
+ const ping = pingResults.get(server.id);
+ const isCheckingPing = !pingResults.has(server.id);
+ const isOffline = ping === null;
const button = document.createElement("button");
button.type = "button";
+ button.disabled = isOffline;
button.className = `server-card${server.id === selectedServerId ? " is-selected" : ""}`;
button.addEventListener("click", () => selectServer(server.id));
- const ping = pingResults.get(server.id);
- const pingText = ping == null ? "пинг: --" : `пинг: ${Math.round(ping)} мс`;
+ const pingText = isCheckingPing
+ ? "проверка..."
+ : isOffline
+ ? "нет ответа"
+ : `пинг: ${Math.round(ping)} мс`;
const flagContent = server.flagUrl
? `
`
: (server.countryCode || "--").toUpperCase();
@@ -746,7 +770,7 @@
${escapeHtml(server.name)}
${escapeHtml(server.country)} · ${escapeHtml(server.address)}
- ${pingText}
+ ${pingText}
`;
elements.serverGrid.appendChild(button);
@@ -766,6 +790,8 @@
}
function selectServer(serverId) {
+ if (pingResults.get(serverId) === null) return;
+
selectedServerId = serverId;
localStorage.setItem("selected-server-id", serverId);
renderServers();
@@ -778,9 +804,19 @@
function updateSelectedServerText() {
const server = getSelectedServer();
- elements.targetServerText.textContent = server
- ? `Тест будет запущен через ${server.name} (${server.country}).`
- : "Выберите сервер для теста.";
+ if (!server) {
+ elements.targetServerText.textContent = "Выберите сервер для теста.";
+ return;
+ }
+
+ if (pingResults.get(server.id) === null) {
+ elements.targetServerText.textContent =
+ `${server.name} не отвечает. Выберите другой сервер.`;
+ return;
+ }
+
+ elements.targetServerText.textContent =
+ `Тест будет запущен через ${server.name} (${server.country}).`;
}
async function refreshAllPings() {
@@ -794,9 +830,27 @@
renderServers();
}),
);
+ ensureSelectableServer();
+ renderServers();
+ updateSelectedServerText();
elements.refreshPingBtn.disabled = false;
}
+ function ensureSelectableServer() {
+ if (selectedServerId && pingResults.get(selectedServerId) !== null) {
+ return;
+ }
+
+ const firstOnlineServer = servers.find((server) => pingResults.get(server.id) !== null);
+ selectedServerId = firstOnlineServer?.id || null;
+
+ if (selectedServerId) {
+ localStorage.setItem("selected-server-id", selectedServerId);
+ } else {
+ localStorage.removeItem("selected-server-id");
+ }
+ }
+
async function measurePing(server) {
const attempts = 3;
const values = [];
@@ -1153,6 +1207,12 @@
return;
}
+ if (pingResults.get(server.id) === null) {
+ elements.serverStatus.textContent =
+ "Выбранный сервер не отвечает. Запуск теста отключен.";
+ return;
+ }
+
elements.startBtn.disabled = true;
resetMetrics();