Initial commit: JustAMessenger v0.1.0
Серверная часть (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 — спецификация протокола
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
<!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>
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "JustAMessenger",
|
||||
"short_name": "JAM",
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"background_color": "#313338",
|
||||
"theme_color": "#5865F2",
|
||||
"description": "Lightweight Decentralized Messenger",
|
||||
"icons": [
|
||||
{
|
||||
"src": "icons/Icon-192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "icons/Icon-512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user