55 Commits
Author SHA1 Message Date
admin01 408e50db6c Update chess/server.js 2026-08-23 18:39:12 +00:00
admin01 2aaf442bd2 Update chess/package.json 2026-08-23 18:38:50 +00:00
admin01 6f079faa48 Update chess/package-lock.json 2026-08-23 18:38:25 +00:00
admin01 76de66ca6c Update chess/public/js/ai.js 2026-08-23 07:42:19 +00:00
admin01 eef730e030 Update chess/public/index.html 2026-08-23 07:37:29 +00:00
admin01 adca2464f8 Update chess/public/styles.css 2026-08-23 07:36:35 +00:00
admin01 a5d1608741 Update package.json 2026-08-23 07:21:04 +00:00
admin01 81edf106ed Update server.js 2026-08-23 07:20:17 +00:00
admin01 7f6bfa34e2 Update chess/public/js/app.js 2026-08-23 07:19:12 +00:00
admin01 1b46099218 Update chess/shared/chess-engine.js 2026-08-23 07:17:16 +00:00
admin01 cd0c0f30ba Update chess/public/index.html 2026-08-23 07:15:23 +00:00
admin01 d67496fb19 Update chess/public/js/ai.js 2026-08-23 06:53:40 +00:00
admin01 e852d0eea4 Update chess/shared/chess-engine.js 2026-08-23 06:50:00 +00:00
admin01 e8e55e5aae Update package.json 2026-08-23 06:46:18 +00:00
admin01 6c2cb35a2a Delete chess_party_fixed.zip 2026-08-23 06:43:27 +00:00
admin01 069cae780c Update server.js 2026-08-23 06:43:20 +00:00
admin01 bbcd70d00f Update chess/public/js/app.js 2026-08-23 06:42:17 +00:00
admin01 7e469bd660 Update chess/public/styles.css 2026-08-23 06:41:16 +00:00
admin01 786620c168 Update chess/public/index.html 2026-08-23 06:39:51 +00:00
admin01 52edd18b3e Update chess/public/index.html 2026-08-22 19:00:53 +00:00
admin01 299f47b1b3 Update chess/public/styles.css 2026-08-22 19:00:17 +00:00
admin01 d0e0e3274a Update chess/public/js/app.js 2026-08-22 18:59:37 +00:00
admin01 d38ae7cbe6 Update chess/shared/chess-engine.js 2026-08-22 18:57:39 +00:00
admin01 7c94426848 Update package.json 2026-08-22 18:56:58 +00:00
admin01 1fbdd1317c Update server.js 2026-08-22 18:56:03 +00:00
admin01 1f41362338 Upload files to "/" 2026-08-22 18:54:41 +00:00
admin01 2dfea24f42 Update chess/public/styles.css 2026-08-22 18:21:04 +00:00
admin01 039b64f9e5 Update chess/public/js/app.js 2026-08-22 18:20:15 +00:00
admin01 6ed96533b0 Update chess/public/js/app.js 2026-08-22 18:14:17 +00:00
admin01 8dcc964d04 Update chess/public/js/app.js 2026-08-22 18:08:35 +00:00
admin01 226ad23f7b Update chess/public/js/app.js 2026-08-22 17:51:45 +00:00
admin01 5f75752b26 Update server.js 2026-08-22 17:49:23 +00:00
admin01 5e57feb66f Update chess/public/index.html 2026-08-22 17:47:08 +00:00
admin01 4e6e2fc9e2 Update chess/public/styles.css 2026-08-22 17:46:20 +00:00
admin01 e6e57a3cc0 Add server.js 2026-08-22 17:41:22 +00:00
admin01 0720bcc229 Add package.json 2026-08-22 17:40:44 +00:00
admin01 093b4ac46f Add package-lock.json 2026-08-22 17:40:02 +00:00
admin01 3b02071fe7 Add chess/shared/chess-engine.js 2026-08-22 17:39:10 +00:00
admin01 728da46b10 Add chess/public/js/app.js 2026-08-22 17:37:25 +00:00
admin01 328fe6b417 Add chess/public/js/ai.js 2026-08-22 17:36:51 +00:00
admin01 0aba79015d Delete chess/public/js 2026-08-22 17:36:17 +00:00
admin01 3d7bfd1797 Add chess/public/js 2026-08-22 17:36:04 +00:00
admin01 debf3bbc68 Add chess/public/styles.css 2026-08-22 17:35:26 +00:00
admin01 1d87e4539b Add chess/public/index.html 2026-08-22 17:34:34 +00:00
admin01 11a1b0cb41 Delete chess/public 2026-08-22 17:32:52 +00:00
admin01 83500d2d86 Add chess/public 2026-08-22 17:30:18 +00:00
admin01 da311edec3 Delete batch.zip 2026-08-22 17:03:06 +00:00
admin01 34606b50cc Upload files to "/" 2026-08-22 17:02:45 +00:00
admin01 0a8475d245 Delete directory 'public' 2026-08-22 17:00:37 +00:00
admin01 52ce4ab42a Add public/404.html 2026-08-22 16:55:44 +00:00
admin01 ff02d54bab Delete radiowebview.html 2026-08-22 16:53:45 +00:00
admin01 555d0b2005 Update radiowebview.html 2026-08-22 16:45:58 +00:00
admin01 bef651fa5d Merge pull request 'Radio managment' (#1) from radio into main
Reviewed-on: #1
2026-08-22 16:37:48 +00:00
admin01 1db3fee220 Delete 404example 2026-08-22 16:34:37 +00:00
admin01 7df9a0436a Add radio.webview 2026-08-22 16:33:49 +00:00
9 changed files with 9076 additions and 304 deletions
-304
View File
@@ -1,304 +0,0 @@
<!DOCTYPE html>
<html lang="ru" data-theme="neutral">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<!-- FAVICON -->
<link rel="icon" type="image/png" href="https://staticonline.duckdns.org/api/public/dl/ВАШ_FAVICON?inline=true">
<link rel="shortcut icon" href="https://staticonline.duckdns.org/api/public/dl/ВАШ_FAVICON?inline=true">
<title>404</title>
<style>
:root {
--bg: #12121a;
--card-bg: rgba(26, 26, 36, 0.75);
--text: #e0e0e0;
--sub: #a0a0b0;
--accent-blue: #7aa2f7;
--accent-pink: #c084fc;
--border: rgba(255, 255, 255, 0.12);
--input-bg: rgba(18, 18, 26, 0.85);
--mono: 'Courier New', 'Consolas', 'Liberation Mono', monospace;
--font: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
--radius: 6px;
--transition: 0.2s ease;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
html { font-size: 16px; background: var(--bg); -webkit-font-smoothing: antialiased; }
body {
font-family: var(--font);
min-height: 100dvh;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
color: var(--text);
position: relative;
background: url('https://staticonline.duckdns.org/api/public/dl/K_naZzYv?inline=true') center/cover no-repeat fixed;
}
body::before {
content: '';
position: fixed;
inset: 0;
background: rgba(10, 10, 20, 0.55);
z-index: 0;
pointer-events: none;
}
.card {
position: relative;
z-index: 1;
background: var(--card-bg);
border: 1px solid var(--border);
border-radius: var(--radius);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
padding: 2.8rem 2.2rem;
text-align: center;
width: 100%;
max-width: 500px;
backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(14px);
animation: cardIn 0.6s cubic-bezier(0.22, 0.61, 0.36, 1);
}
@keyframes cardIn {
from { opacity: 0; transform: translateY(20px) scale(0.96); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
.code-block { display: flex; align-items: center; justify-content: center; gap: 0.3rem; margin-bottom: 0.5rem; }
.digit {
font-family: var(--mono);
font-size: 6rem;
font-weight: 700;
line-height: 1;
color: var(--text);
text-shadow: 0 0 12px rgba(122, 162, 247, 0.4);
animation: gentleFloat 4s ease-in-out infinite;
}
.digit:nth-child(2) { animation-delay: 0.2s; color: var(--accent-blue); text-shadow: 0 0 16px rgba(122, 162, 247, 0.6); }
.digit:nth-child(3) { animation-delay: 0.4s; color: var(--accent-pink); text-shadow: 0 0 16px rgba(192, 132, 252, 0.6); }
@keyframes gentleFloat {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-4px); }
}
.divider-dot { width: 10px; height: 10px; background: var(--accent-blue); border-radius: 50%; opacity: 0.5; }
.divider-dot:nth-child(4) { background: var(--accent-pink); }
.title { font-family: var(--mono); font-size: 1.2rem; margin-bottom: 0.5rem; letter-spacing: 0.05em; text-transform: uppercase; }
.desc { font-size: 0.85rem; color: var(--sub); max-width: 380px; margin: 0 auto 1.8rem; line-height: 1.6; }
.search-section { text-align: left; }
.search-label {
font-family: var(--mono);
font-size: 0.65rem;
color: var(--accent-blue);
display: block;
margin: 0 0 8px 4px;
text-transform: uppercase;
letter-spacing: 0.08em;
opacity: 0.9;
}
.search-box {
display: flex;
background: var(--input-bg);
border-radius: var(--radius);
padding: 3px 3px 3px 14px;
border: 1px solid var(--border);
transition: var(--transition);
}
.search-box:focus-within { border-color: var(--accent-blue); box-shadow: 0 0 0 2px rgba(122, 162, 247, 0.2); }
.search-box input {
flex: 1;
background: transparent;
border: none;
padding: 0.55rem 0;
font-size: 0.8rem;
outline: none;
color: var(--text);
font-family: var(--mono);
min-width: 0;
}
.search-box input::placeholder { color: var(--sub); opacity: 0.6; }
.search-box button {
display: flex;
align-items: center;
gap: 5px;
background: rgba(122, 162, 247, 0.1);
color: var(--accent-blue);
border: 1px solid var(--accent-blue);
border-radius: var(--radius);
padding: 0.5rem 1.2rem;
font: 500 0.75rem var(--mono);
cursor: pointer;
transition: var(--transition);
letter-spacing: 0.05em;
text-transform: uppercase;
}
.search-box button:hover { background: rgba(122, 162, 247, 0.2); box-shadow: 0 0 12px rgba(122, 162, 247, 0.3); color: #fff; }
.toast {
position: fixed;
bottom: 28px;
left: 50%;
transform: translate(-50%, 10px);
background: var(--card-bg);
color: var(--accent-blue);
padding: 10px 24px;
border: 1px solid var(--border);
border-radius: var(--radius);
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
font-size: 0.72rem;
z-index: 9999;
pointer-events: none;
max-width: 90vw;
text-align: center;
transition: opacity 0.3s ease, transform 0.3s ease;
opacity: 0;
font-family: var(--mono);
letter-spacing: 0.04em;
text-transform: uppercase;
backdrop-filter: blur(4px);
}
.toast.show { opacity: 1; transform: translate(-50%, 0); }
.shake { animation: shake 0.4s ease; }
@keyframes shake {
0%, 100% { transform: translateX(0); }
20% { transform: translateX(-5px); }
40% { transform: translateX(5px); }
60% { transform: translateX(-4px); }
80% { transform: translateX(3px); }
}
@media (max-width: 520px) {
.card { padding: 2rem 1rem; }
.digit { font-size: 4rem; }
.search-box button { padding: 0.45rem 0.8rem; font-size: 0.7rem; }
}
@media (max-width: 380px) {
.digit { font-size: 3rem; }
.title { font-size: 1rem; }
.desc { font-size: 0.75rem; }
}
</style>
</head>
<body>
<div class="card">
<div class="code-block">
<span class="digit">4</span>
<span class="divider-dot"></span>
<span class="digit">0</span>
<span class="divider-dot"></span>
<span class="digit">4</span>
</div>
<h1 class="title" id="titleText">Страница не найдена</h1>
<p class="desc" id="descText">Похоже, этой страницы больше нет или она перемещена. Проверьте адрес или воспользуйтесь поиском.</p>
<div class="search-section">
<span class="search-label" id="searchLabel">✦ Поиск через SearXNG</span>
<!-- Заменено на форму для нативной поддержки клавиши Enter -->
<form class="search-box" id="searchForm">
<input type="text" id="searchInput" placeholder="Введите запрос..." autocomplete="off">
<button type="submit" id="searchBtn">
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8"></circle>
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
</svg>
<span id="searchBtnLabel">Найти</span>
</button>
</form>
</div>
</div>
<div class="toast" id="toast"></div>
<script>
(function () {
const SEARXNG_BASE = 'https://searx.be/search?q=';
const browserLang = (navigator.language || 'en').split('-')[0];
const lang = ['ru', 'en', 'lt', 'es'].includes(browserLang) ? browserLang : 'ru';
const translations = {
ru: { title: 'Страница не найдена', desc: 'Похоже, этой страницы больше нет или она перемещена. Проверьте адрес или воспользуйтесь поиском.', searchLabel: '✦ Поиск через SearXNG', searchPlaceholder: 'Введите запрос...', searchBtn: 'Найти', empty: 'Введите поисковый запрос' },
en: { title: 'Page not found', desc: 'This page seems to be missing or moved. Double-check the URL or use the search.', searchLabel: '✦ Search via SearXNG', searchPlaceholder: 'Enter your query...', searchBtn: 'Search', empty: 'Enter a search query' },
lt: { title: 'Puslapis nerastas', desc: 'Atrodo, šio puslapio nebėra arba jis perkeltas. Patikrinkite adresą arba naudokitės paieška.', searchLabel: '✦ Paieška per SearXNG', searchPlaceholder: 'Įveskite užklausą...', searchBtn: 'Ieškoti', empty: 'Įveskite paieškos užklausą' },
es: { title: 'Página no encontrada', desc: 'Esta página parece haber desaparecido o haberse movido. Verifica la URL o usa la búsqueda.', searchLabel: '✦ Buscar con SearXNG', searchPlaceholder: 'Ingresa tu búsqueda...', searchBtn: 'Buscar', empty: 'Ingresa una búsqueda' }
};
const t = translations[lang] || translations.ru;
// Кэшируем DOM-элементы
const els = {
title: document.getElementById('titleText'),
desc: document.getElementById('descText'),
label: document.getElementById('searchLabel'),
input: document.getElementById('searchInput'),
btnLabel: document.getElementById('searchBtnLabel'),
form: document.getElementById('searchForm'),
toast: document.getElementById('toast')
};
// Применяем переводы
els.title.textContent = t.title;
els.desc.textContent = t.desc;
els.label.textContent = t.searchLabel;
els.input.placeholder = t.searchPlaceholder;
els.btnLabel.textContent = t.searchBtn;
let toastTimer;
function showToast(message, duration = 2400) {
els.toast.textContent = message;
els.toast.classList.add('show');
clearTimeout(toastTimer);
toastTimer = setTimeout(() => els.toast.classList.remove('show'), duration);
}
// Обработчик отправки формы (обрабатывает и клик по кнопке, и Enter)
els.form.addEventListener('submit', (e) => {
e.preventDefault();
const query = els.input.value.trim();
if (!query) {
els.input.focus();
// Перезапуск анимации
els.input.classList.remove('shake');
void els.input.offsetWidth; // Магия для перерисовки (reflow)
els.input.classList.add('shake');
showToast(t.empty);
return;
}
window.open(SEARXNG_BASE + encodeURIComponent(query), '_blank');
});
})();
</script>
</body>
</html>
+12
View File
@@ -0,0 +1,12 @@
{
"name": "college-chess-party",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "college-chess-party",
"version": "1.0.0"
}
}
}
+17
View File
@@ -0,0 +1,17 @@
{
"name": "chess-party",
"version": "2.0.0",
"private": true,
"type": "module",
"description": "Chess Party — AI and multiplayer chess",
"scripts": {
"start": "node server.js",
"dev": "node --watch server.js"
},
"engines": {
"node": ">=18.0.0"
},
"dependencies": {
"express": "^4.21.2"
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1313
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff