From 6d530c9d9730b0716059a5c6de1bde54eace8072 Mon Sep 17 00:00:00 2001 From: Admin Date: Tue, 13 Oct 2026 19:52:03 +0400 Subject: [PATCH] style(web): standardize all web templates to clean light minimalist theme --- web/static/css/matrix.css | 400 +------------------------ web/templates/base.html | 75 ++++- web/templates/broadcast.html | 42 +-- web/templates/dashboard.html | 112 ++++--- web/templates/digest_settings.html | 162 +++++----- web/templates/digests.html | 457 ++++++++++++++--------------- web/templates/emails.html | 301 ++++++++++--------- web/templates/export.html | 117 ++++---- web/templates/files.html | 104 ++++--- web/templates/infra.html | 169 ++++++----- web/templates/phones.html | 200 ++++++------- web/templates/scheduled_posts.html | 8 +- web/templates/sudrf.html | 102 +++---- web/templates/users.html | 136 +++++---- 14 files changed, 1068 insertions(+), 1317 deletions(-) diff --git a/web/static/css/matrix.css b/web/static/css/matrix.css index 314d147..5d6f0e2 100644 --- a/web/static/css/matrix.css +++ b/web/static/css/matrix.css @@ -1,389 +1,21 @@ -/* GLASSMORPHISM DARK UI FOR DOMOVOY WEB PANEL */ -@import url('https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap'); - +/* CLEAN MINIMALIST THEME FOR DOMOVOY WEB PANEL */ :root { - --bg-main: #06060c; - --bg-gradient: radial-gradient(circle at 50% 0%, #150f30 0%, #06060c 80%); - --panel-bg: rgba(18, 18, 29, 0.45); - --panel-bg-hover: rgba(26, 26, 42, 0.6); - --panel-border: rgba(255, 255, 255, 0.08); - --panel-border-hover: rgba(255, 255, 255, 0.15); - - --color-primary: #8a2be2; - --color-primary-glow: rgba(138, 43, 226, 0.35); - --color-success: #00ffcc; - --color-success-glow: rgba(0, 255, 204, 0.25); - --color-warning: #ffb300; - --color-warning-glow: rgba(255, 179, 0, 0.25); - --color-danger: #ff2d55; - --color-danger-glow: rgba(255, 45, 85, 0.25); - --color-info: #00bfff; - --color-info-glow: rgba(0, 191, 255, 0.25); - - --color-text-main: #f5f5f7; - --color-text-muted: #8e8e93; - --color-text-dark: #3a3a3c; - - --font-main: 'Outfit', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; - --font-mono: 'JetBrains Mono', monospace; - - --shadow-neon: 0 8px 32px 0 rgba(0, 0, 0, 0.4), 0 0 16px 0 var(--color-primary-glow); - --transition-smooth: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); + --bg-main: #f4f4f4; + --bg-panel: #ffffff; + --bg-header: #ece9d8; + --border-color: #707680; + --border-light: #cccccc; + --text-main: #111111; + --text-muted: #555555; + --link-color: #0000cc; + --link-hover: #cc0000; + --badge-bg: #e8e8e8; } body { - background-color: var(--bg-main) !important; - background-image: var(--bg-gradient) !important; - background-attachment: fixed !important; - color: var(--color-text-main) !important; - font-family: var(--font-main) !important; - min-height: 100vh; - overflow-x: hidden; - line-height: 1.5; + background-color: var(--bg-main); + color: var(--text-main); + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 13px; + line-height: 1.45; } - -/* Сайдбар */ -.sidebar { - background: rgba(10, 10, 18, 0.3) !important; - backdrop-filter: blur(20px) !important; - -webkit-backdrop-filter: blur(20px) !important; - border-right: 1px solid var(--panel-border) !important; - box-shadow: 4px 0 24px rgba(0, 0, 0, 0.3) !important; -} - -.sidebar .nav-link { - color: var(--color-text-muted) !important; - border-left: 3px solid transparent !important; - transition: var(--transition-smooth) !important; - padding: 0.75rem 1.5rem !important; - font-weight: 500 !important; - text-transform: uppercase !important; - font-family: var(--font-main) !important; - letter-spacing: 0.5px !important; -} - -.sidebar .nav-link:hover { - color: var(--color-text-main) !important; - background: rgba(255, 255, 255, 0.03) !important; - border-left-color: rgba(255, 255, 255, 0.2) !important; -} - -.sidebar .nav-link.active { - color: var(--color-success) !important; - background: rgba(0, 255, 204, 0.05) !important; - border-left-color: var(--color-success) !important; - text-shadow: 0 0 10px var(--color-success-glow) !important; -} - -.sidebar .nav-link i, .sidebar .nav-link bi { - margin-right: 0.5rem !important; - font-size: 1.1rem !important; -} - -/* Карточки */ -.card { - background: var(--panel-bg) !important; - backdrop-filter: blur(12px) !important; - -webkit-backdrop-filter: blur(12px) !important; - border: 1px solid var(--panel-border) !important; - border-radius: 16px !important; - transition: var(--transition-smooth) !important; - color: var(--color-text-main) !important; - overflow: hidden !important; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15) !important; -} - -.card:hover { - background: var(--panel-bg-hover) !important; - border-color: var(--panel-border-hover) !important; - box-shadow: 0 8px 30px rgba(0, 0, 0, 0.4) !important; - transform: translateY(-2px) !important; -} - -.card-header { - background: rgba(255, 255, 255, 0.02) !important; - border-bottom: 1px solid var(--panel-border) !important; - font-weight: 600 !important; - text-transform: uppercase !important; - letter-spacing: 0.5px !important; - padding: 1rem 1.25rem !important; - color: var(--color-text-main) !important; -} - -.card-body { - padding: 1.25rem !important; -} - -/* Переопределение старых рамок и фонов */ -.border-success, .border-warning, .border-cyan, .border-danger { - border-color: var(--panel-border) !important; -} - -.card.border-success:hover, .card.border-warning:hover, .card.border-cyan:hover { - border-color: var(--panel-border-hover) !important; -} - -.card.border-danger { - border-color: rgba(255, 45, 85, 0.3) !important; -} - -.card.border-danger:hover { - border-color: var(--color-danger) !important; - box-shadow: 0 8px 30px rgba(255, 45, 85, 0.15) !important; -} - -/* Таблицы */ -.table { - color: var(--color-text-main) !important; - background-color: transparent !important; -} - -.table > :not(caption) > * > * { - background-color: transparent !important; - color: var(--color-text-main) !important; - border-bottom: 1px solid var(--panel-border) !important; -} - -.table > thead > tr > th { - color: var(--color-text-muted) !important; - font-weight: 600 !important; - text-transform: uppercase !important; - font-size: 0.8rem !important; - letter-spacing: 0.5px !important; - border-bottom: 2px solid var(--panel-border) !important; -} - -.table-hover tbody tr:hover td { - background-color: rgba(255, 255, 255, 0.02) !important; - color: var(--color-text-main) !important; -} - -/* Кнопки */ -.btn { - border-radius: 8px !important; - font-weight: 500 !important; - transition: var(--transition-smooth) !important; - text-transform: uppercase !important; - letter-spacing: 0.5px !important; -} - -.btn-matrix, .btn-outline-success { - background-color: transparent !important; - border: 1px solid var(--color-success) !important; - color: var(--color-success) !important; -} - -.btn-matrix:hover, .btn-outline-success:hover, .btn-outline-success:active, .btn-outline-success:focus { - background-color: var(--color-success) !important; - color: #000 !important; - border-color: var(--color-success) !important; - box-shadow: 0 0 15px var(--color-success-glow) !important; -} - -.btn-outline-primary { - border-color: var(--color-primary) !important; - color: var(--color-text-main) !important; -} - -.btn-outline-primary:hover { - background-color: var(--color-primary) !important; - color: var(--color-text-main) !important; - box-shadow: 0 0 15px var(--color-primary-glow) !important; -} - -.btn-outline-danger { - border-color: var(--color-danger) !important; - color: var(--color-danger) !important; - background-color: transparent !important; -} - -.btn-outline-danger:hover { - background-color: var(--color-danger) !important; - color: #fff !important; - box-shadow: 0 0 15px var(--color-danger-glow) !important; -} - -.btn-outline-warning { - border-color: var(--color-warning) !important; - color: var(--color-warning) !important; - background-color: transparent !important; -} - -.btn-outline-warning:hover { - background-color: var(--color-warning) !important; - color: #000 !important; - box-shadow: 0 0 15px var(--color-warning-glow) !important; -} - -.btn-outline-info { - border-color: var(--color-info) !important; - color: var(--color-info) !important; - background-color: transparent !important; -} - -.btn-outline-info:hover { - background-color: var(--color-info) !important; - color: #000 !important; - box-shadow: 0 0 15px var(--color-info-glow) !important; -} - -/* Формы */ -.form-control, .form-select { - background-color: rgba(255, 255, 255, 0.03) !important; - border: 1px solid var(--panel-border) !important; - color: var(--color-text-main) !important; - border-radius: 8px !important; - transition: var(--transition-smooth) !important; -} - -.form-control:focus, .form-select:focus { - background-color: rgba(255, 255, 255, 0.05) !important; - border-color: var(--color-primary) !important; - color: var(--color-text-main) !important; - box-shadow: 0 0 8px var(--color-primary-glow) !important; -} - -.form-control::placeholder { - color: var(--color-text-muted) !important; - opacity: 0.6 !important; -} - -.bg-black { - background-color: rgba(10, 10, 15, 0.5) !important; - border: 1px solid var(--panel-border) !important; -} - -/* Ссылки */ -a { - color: var(--color-success); - text-decoration: none; - transition: var(--transition-smooth); -} - -a:hover { - color: #fff; - text-shadow: 0 0 8px var(--color-success-glow); -} - -/* Баджи */ -.badge { - border-radius: 6px !important; - font-weight: 500 !important; - padding: 0.4em 0.6em !important; -} - -.bg-success { - background-color: rgba(0, 255, 204, 0.15) !important; - color: var(--color-success) !important; - border: 1px solid var(--color-success) !important; -} - -.bg-danger { - background-color: rgba(255, 45, 85, 0.15) !important; - color: var(--color-danger) !important; - border: 1px solid var(--color-danger) !important; -} - -.bg-warning { - background-color: rgba(255, 179, 0, 0.15) !important; - color: var(--color-warning) !important; - border: 1px solid var(--color-warning) !important; -} - -.bg-info { - background-color: rgba(0, 191, 255, 0.15) !important; - color: var(--color-info) !important; - border: 1px solid var(--color-info) !important; -} - -/* Утилиты и кастомный контент */ -hr { - border-color: var(--panel-border) !important; - opacity: 0.5 !important; -} - -pre, code { - font-family: var(--font-mono) !important; -} - -/* Кастомный Scrollbar */ -::-webkit-scrollbar { - width: 6px; - height: 6px; -} - -::-webkit-scrollbar-track { - background: rgba(10, 10, 15, 0.5); -} - -::-webkit-scrollbar-thumb { - background: rgba(255, 255, 255, 0.08); - border-radius: 3px; -} - -::-webkit-scrollbar-thumb:hover { - background: rgba(255, 255, 255, 0.15); -} - -/* Дополнения для соответствия Swarm Dashboard */ -.glass-panel { - background: var(--panel-bg) !important; - backdrop-filter: blur(12px) !important; - -webkit-backdrop-filter: blur(12px) !important; - border: 1px solid var(--panel-border) !important; - border-radius: 16px !important; - padding: 24px !important; - transition: var(--transition-smooth) !important; -} - -.glass-panel:hover { - background: var(--panel-bg-hover) !important; - border-color: var(--panel-border-hover) !important; - box-shadow: 0 8px 30px rgba(0, 0, 0, 0.4) !important; -} - -@keyframes neonPulseSuccess { - 0%, 100% { box-shadow: 0 0 8px var(--color-success-glow); } - 50% { box-shadow: 0 0 18px rgba(0, 255, 204, 0.6); } -} - -@keyframes neonPulseDanger { - 0%, 100% { box-shadow: 0 0 8px var(--color-danger-glow); } - 50% { box-shadow: 0 0 18px rgba(255, 45, 85, 0.6); } -} - -@keyframes neonPulsePrimary { - 0%, 100% { box-shadow: 0 0 8px var(--color-primary-glow); } - 50% { box-shadow: 0 0 18px rgba(138, 43, 226, 0.6); } -} - -.glow-success { - animation: neonPulseSuccess 3s infinite alternate !important; -} - -.glow-danger { - animation: neonPulseDanger 3s infinite alternate !important; -} - -.glow-primary { - animation: neonPulsePrimary 3s infinite alternate !important; -} - -.text-gradient { - background: linear-gradient(135deg, #fff 0%, var(--color-text-muted) 100%) !important; - -webkit-background-clip: text !important; - -webkit-text-fill-color: transparent !important; -} - -.text-gradient-neon { - background: linear-gradient(135deg, #00ffcc 0%, #8a2be2 100%) !important; - -webkit-background-clip: text !important; - -webkit-text-fill-color: transparent !important; -} - -.flex-center { - display: flex !important; - align-items: center !important; - justify-content: center !important; -} - diff --git a/web/templates/base.html b/web/templates/base.html index dd3aae8..86298d0 100644 --- a/web/templates/base.html +++ b/web/templates/base.html @@ -182,6 +182,7 @@ border: 1px solid var(--border-light); padding: 2px 4px; font-size: 12px; + color: #111111; } pre { padding: 8px; @@ -190,14 +191,80 @@ .badge-status { display: inline-block; - padding: 2px 5px; + padding: 2px 6px; border: 1px solid var(--border-color); background-color: var(--badge-bg); font-size: 11px; + font-weight: bold; + } + .badge-success { background-color: #e2f0d9 !important; border-color: #70ad47 !important; color: #385723 !important; } + .badge-warning { background-color: #fff2cc !important; border-color: #ffc000 !important; color: #806000 !important; } + .badge-danger { background-color: #fce4d6 !important; border-color: #ed7d31 !important; color: #c65911 !important; } + .badge-info { background-color: #e6f2ff !important; border-color: #66a3ff !important; color: #004080 !important; } + + /* Глобальные переопределения Bootstrap и утилит для светлого стиля */ + .card, .panel { + background-color: var(--bg-panel) !important; + border: 1px solid var(--border-color) !important; + border-radius: 0 !important; + box-shadow: none !important; + color: var(--text-main) !important; + } + .card-header, .panel-header { + background-color: var(--bg-header) !important; + border-bottom: 1px solid var(--border-color) !important; + color: var(--text-main) !important; + font-weight: bold !important; + border-radius: 0 !important; + } + .bg-black, .bg-dark { + background-color: #ffffff !important; + color: var(--text-main) !important; + border-color: var(--border-color) !important; + } + .text-white { + color: var(--text-main) !important; + } + .text-matrix, .text-cyan, .text-success, .text-info { + color: var(--text-main) !important; + } + .btn-matrix { + background-color: #e8e8e8 !important; + color: #000000 !important; + border: 1px solid var(--border-color) !important; + border-radius: 0 !important; + font-family: inherit !important; + font-size: 12px !important; + box-shadow: none !important; + text-shadow: none !important; + } + .btn-matrix:hover { + background-color: #d8d8d8 !important; + color: #000000 !important; + } + input, select, textarea, .form-control, .form-select { + background-color: #ffffff !important; + color: var(--text-main) !important; + border: 1px solid var(--border-color) !important; + border-radius: 0 !important; + font-family: inherit !important; + font-size: 12px !important; + box-shadow: none !important; + } + input:focus, select:focus, textarea:focus, .form-control:focus, .form-select:focus { + background-color: #ffffff !important; + color: var(--text-main) !important; + border-color: #0000cc !important; + box-shadow: none !important; + outline: none !important; + } + h1, h2, h3, h4, h5, h6 { + color: var(--text-main) !important; + text-shadow: none !important; + } + .shadow, .shadow-sm, .shadow-lg, .shadow-danger { + box-shadow: none !important; } - .badge-success { background-color: #e2f0d9; border-color: #70ad47; color: #385723; } - .badge-warning { background-color: #fff2cc; border-color: #ffc000; color: #806000; } - .badge-danger { background-color: #fce4d6; border-color: #ed7d31; color: #c65911; } {% block extra_style %}{% endblock %} diff --git a/web/templates/broadcast.html b/web/templates/broadcast.html index c8908da..17252cd 100644 --- a/web/templates/broadcast.html +++ b/web/templates/broadcast.html @@ -7,24 +7,24 @@ {% block extra_style %} {% endblock %} @@ -76,8 +76,8 @@
- - {% for a in artifacts if a.file_type == 'photo' %} @@ -87,8 +87,8 @@
- - {% for a in artifacts if a.file_type == 'document' %} diff --git a/web/templates/dashboard.html b/web/templates/dashboard.html index b0cc514..cc1842a 100644 --- a/web/templates/dashboard.html +++ b/web/templates/dashboard.html @@ -1,38 +1,41 @@ {% extends "base.html" %} -{% block title %}LKM37 Dashboard{% endblock %} +{% block title %}Дашборд - МКД ЛенКом 37{% endblock %} {% block nav_dashboard %}active{% endblock %} {% block content %} -
+
-

- >_ ТЕРМИНАЛ_УПРАВЛЕНИЯ_ЛКМ37 -

+

Панель управления МКД ЛенКом 37

+
Сводные показатели системы и текущий статус сервисов
-
+
+
ЖИЛЬЦЫ
- -
СУБЪЕКТЫ
-

{{ users_count }}

+ +
Всего зарегистрировано
+
{{ users_count }}
-
+
+
ВЕРИФИКАЦИЯ
- -
ВЕРИФИКАЦИЯ
-

{{ pending_count }}

+ +
Заявок на проверку
+
{{ pending_count }}
{% if pending_count > 0 %} - ТРЕБУЕТ ВНИМАНИЯ +
+ ТРЕБУЕТ ВНИМАНИЯ +
{% endif %}
@@ -40,54 +43,79 @@
-
+
+
ОБЪЯВЛЕНИЯ
- -
МАРКЕТ
-

{{ active_ads }}

+ +
Активные публикации
+
{{ active_ads }}
-
+
+
СООБЩЕНИЯ
- -
СООБЩЕНИЯ
-

{{ messages_count }}

+ +
Активность чата
+
{{ messages_count }}
-
+
-
-
СИСТЕМНЫЙ_СТАТУС
+
+
СИСТЕМНЫЙ СТАТУС
-
- [OK] Database: PostgreSQL (Synology NAS)
- [OK] Telegram: @lkmthreeseven_bot
- [OK] Proxy: Active (127.0.0.1:10808)
- [OK] Node: {{ username }}@server
-
- [INFO] Всего верифицировано: {{ verified_count }} жильцов.
- [INFO] Активных опросов: {{ active_polls }}
- [INFO] Предстоящих событий: {{ upcoming_events }} -
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
База данных:PostgreSQL (Synology NAS 192.168.10.105:5433) OK
Telegram-бот:@lkmthreeseven_bot (DomovoyKontrolBot) ONLINE
Юридический модуль:Google NotebookLM (аккаунт corteskelsey814, 14 источников) READY
Текущий узел:{{ username }}@DockerServer (192.168.10.116)
Верифицировано жильцов:{{ verified_count }} чел.
Активных опросов:{{ active_polls }}
Предстоящих событий:{{ upcoming_events }}
-
-
БЫСТРЫЕ_ДЕЙСТВИЯ
-
- НОВАЯ РАССЫЛКА - ПРОВЕРИТЬ ЗАЯВКИ -
- +
+
ДЕЙСТВИЯ
+
diff --git a/web/templates/digest_settings.html b/web/templates/digest_settings.html index 95dc6d9..248fd84 100644 --- a/web/templates/digest_settings.html +++ b/web/templates/digest_settings.html @@ -1,108 +1,98 @@ {% extends "base.html" %} -{% block title %}Настройки дайджеста - Домовой Бот{% endblock %} - -{% block nav_digest_settings %}active{% endblock %} - -{% block extra_style %} - -{% endblock %} +{% block title %}Настройки дайджеста - МКД ЛенКом 37{% endblock %} +{% block nav_digests %}active{% endblock %} {% block content %} -
-
- ← Назад к дайджестам -

⚙️ Настройки дайджеста

+
+
+

Настройки генерации дайджеста

+
Конфигурация автоматического сбора событий и публикации
+ +
-
-

📅 Расписание

-
- -
- - +
+
+
+
РАСПИСАНИЕ И АВТОМАТИЗАЦИЯ
+
+
+ + +
-
- - +
+ +
+
+
РАЗДЕЛЫ ДАЙДЖЕСТА
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
-
-

📊 Содержимое дайджеста

-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - +
+
+
РЕЖИМ ПУБЛИКАЦИИ
+
+
+ + +
+
+ + +
+
+ + +
+
-
-

📬 Отправка

-
- - -
-
- - -
-
- - -
+
+
- -
-{% endblock %} -{% block extra_script %} {% endblock %} diff --git a/web/templates/digests.html b/web/templates/digests.html index 8f24c71..fd9a2c5 100644 --- a/web/templates/digests.html +++ b/web/templates/digests.html @@ -1,275 +1,250 @@ {% extends "base.html" %} -{% block title %}Еженедельные дайджесты - Домовой Бот{% endblock %} - +{% block title %}Еженедельные дайджесты - МКД ЛенКом 37{% endblock %} {% block nav_digests %}active{% endblock %} -{% block extra_style %} -* { margin: 0; padding: 0; box-sizing: border-box; } -{% endblock %} - {% block content %} - - - -
-
- ← На главную -

📰 Еженедельные дайджесты

-

Утверждение, редактирование и архив

-
+
+
+

Еженедельные дайджесты дома

+
Утверждение проектов, ручная корректировка и архив публикаций
+
+
+ +
+
-
- - -
+
+ + +
-
- {% if pending_digests|length > 0 %} - {% for digest in pending_digests %} -
-

📰 Дайджест #{{ digest.week_number }}/{{ digest.year }}

-
- Период: {{ digest.period_label }} | Создан: {{ digest.created_at }} | Статус: {{ digest.status_emoji }} {{ digest.status }} -
-
{{ digest.digest_text }}
-
- - - - -
+ +
+ {% if pending_digests|length > 0 %} + {% for digest in pending_digests %} +
+
+ Дайджест #{{ digest.week_number }}/{{ digest.year }} (Период: {{ digest.period_label }}) + {{ digest.status_emoji }} {{ digest.status.upper() }} +
+
+
Создан: {{ digest.created_at }}
+
{{ digest.digest_text }}
+
+ + + +
- {% endfor %} - {% else %} -
-

📭 Нет ожидающих утверждения дайджестов

-

Следующий дайджест будет сгенерирован в воскресенье в 09:00

- -
- {% endif %} -
- -
- {% if archive_digests|length > 0 %} - - - - - - - - - - - - {% for digest in archive_digests %} - - - - - - - - {% endfor %} - -
НеделяПериодСтатусОтправленДействия
#{{ digest.week_number }}/{{ digest.year }}{{ digest.period_label }}{{ digest.status_emoji }} {{ digest.status }}{{ digest.sent_at }} - -
- {% else %} -
-

📚 Архив пуст

-

Здесь будут отображаться все дайджесты

- {% endif %}
-
+ {% endfor %} + {% else %} +
+
+
Нет дайджестов, ожидающих утверждения
+
Автоматическая генерация запускается по расписанию каждое воскресенье в 19:00
+
+ {% endif %} +
- -