096c4d0a2d
Серверная часть (Go): - WebSocket сервер с бинарным протоколом - XChaCha20-Poly1305 шифрование - zstd сжатие с дедупликацией (64KB чанки) - SQLite хранилище (WAL режим) - Управление гильдиями, каналами, ролями - Федерация между серверами (ed25519) - REST API + WebSocket endpoints Клиентская часть (Flutter): - Material Design 3 тёмная тема (Discord-like) - WebSocket соединение с сервером - Экраны: сплэш, логин, домашний, гильдии, чат - Модели: пользователи, гильдии, каналы, сообщения, роли - Сервисы: соединение, API, криптография, тема - Виджеты: иконки гильдий, сообщения, ввод чата - Web сборка (PWA) Документация: - AGENTS.md — контекст для ИИ ассистентов - docs/protocol.md — спецификация протокола
63 lines
2.2 KiB
HTML
63 lines
2.2 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
|
|
<title>JustAMessenger</title>
|
|
<link rel="manifest" href="manifest.json">
|
|
<style>
|
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
body { background: #313338; color: #F2F3F5; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; overflow: hidden; }
|
|
#loading {
|
|
display: flex; flex-direction: column; align-items: center; justify-content: center;
|
|
height: 100vh; width: 100vw;
|
|
}
|
|
.jam-logo {
|
|
width: 80px; height: 80px; background: #5865F2; border-radius: 20px;
|
|
display: flex; align-items: center; justify-content: center;
|
|
font-size: 32px; font-weight: 800; color: white; letter-spacing: 2px;
|
|
box-shadow: 0 0 40px rgba(88, 101, 242, 0.4);
|
|
margin-bottom: 24px;
|
|
}
|
|
.spinner {
|
|
width: 32px; height: 32px; border: 3px solid #3F4147;
|
|
border-top-color: #5865F2; border-radius: 50%;
|
|
animation: spin 0.8s linear infinite; margin-top: 16px;
|
|
}
|
|
@keyframes spin { to { transform: rotate(360deg); } }
|
|
.subtitle { color: #80848E; font-size: 14px; margin-top: 8px; }
|
|
.version { color: #5865F2; font-size: 12px; margin-top: 24px; }
|
|
flutter-view { height: 100vh; width: 100vw; }
|
|
</style>
|
|
<script>
|
|
if ('serviceWorker' in navigator) {
|
|
window.addEventListener('load', () => {
|
|
navigator.serviceWorker.register('/flutter_service_worker.js');
|
|
});
|
|
}
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<div id="loading">
|
|
<div class="jam-logo">JAM</div>
|
|
<div class="spinner"></div>
|
|
<div class="subtitle">JustAMessenger</div>
|
|
<div class="version">v0.1.0</div>
|
|
</div>
|
|
<script src="flutter.js" defer></script>
|
|
<script>
|
|
window.addEventListener('load', function() {
|
|
const loading = document.getElementById('loading');
|
|
_flutter.loader.loadEntryPoint({
|
|
onEntryPointLoaded: function(engineInitializer) {
|
|
loading.style.display = 'none';
|
|
engineInitializer.initializeEngine().then(function(appRunner) {
|
|
appRunner.runApp();
|
|
});
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|