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 — спецификация протокола
75 lines
2.5 KiB
Dart
75 lines
2.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
class ThemeService {
|
|
static const Color primary = Color(0xFF5865F2);
|
|
static const Color success = Color(0xFF3BA55D);
|
|
static const Color danger = Color(0xFFED4245);
|
|
static const Color warning = Color(0xFFFAA81A);
|
|
static const Color surfacePrimary = Color(0xFF313338);
|
|
static const Color surfaceSecondary = Color(0xFF2B2D31);
|
|
static const Color surfaceTertiary = Color(0xFF1E1F22);
|
|
static const Color textPrimary = Color(0xFFF2F3F5);
|
|
static const Color textSecondary = Color(0xFFB5BAC1);
|
|
static const Color textMuted = Color(0xFF80848E);
|
|
static const Color backgroundPrimary = Color(0xFF313338);
|
|
static const Color backgroundSecondary = Color(0xFF2B2D31);
|
|
static const Color backgroundTertiary = Color(0xFF1E1F22);
|
|
|
|
static ThemeData get darkTheme {
|
|
return ThemeData(
|
|
brightness: Brightness.dark,
|
|
scaffoldBackgroundColor: const Color(0xFF313338),
|
|
primaryColor: primary,
|
|
colorScheme: const ColorScheme.dark(
|
|
primary: primary,
|
|
secondary: success,
|
|
surface: surfacePrimary,
|
|
error: danger,
|
|
),
|
|
appBarTheme: const AppBarTheme(
|
|
backgroundColor: surfaceSecondary,
|
|
elevation: 0,
|
|
centerTitle: true,
|
|
titleTextStyle: TextStyle(
|
|
color: textPrimary,
|
|
fontSize: 16,
|
|
fontWeight: FontWeight.w600,
|
|
),
|
|
iconTheme: IconThemeData(color: textPrimary),
|
|
),
|
|
bottomNavigationBarTheme: const BottomNavigationBarThemeData(
|
|
backgroundColor: surfaceSecondary,
|
|
selectedItemColor: primary,
|
|
unselectedItemColor: textMuted,
|
|
),
|
|
cardTheme: CardTheme(
|
|
color: surfaceSecondary,
|
|
elevation: 0,
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(8),
|
|
),
|
|
),
|
|
inputDecorationTheme: InputDecorationTheme(
|
|
filled: true,
|
|
fillColor: surfaceTertiary,
|
|
border: OutlineInputBorder(
|
|
borderRadius: BorderRadius.circular(8),
|
|
borderSide: BorderSide.none,
|
|
),
|
|
hintStyle: const TextStyle(color: textMuted),
|
|
contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
|
|
),
|
|
dividerTheme: const DividerThemeData(
|
|
color: Color(0xFF3F4147),
|
|
thickness: 1,
|
|
),
|
|
snackBarTheme: SnackBarThemeData(
|
|
backgroundColor: surfaceTertiary,
|
|
behavior: SnackBarBehavior.floating,
|
|
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
|
|
),
|
|
useMaterial3: true,
|
|
);
|
|
}
|
|
}
|