# Сервисный портал AegisOne — Единый стиль
> Этот документ ОБЯЗАН прочитать каждый AI-агент перед изменением шаблонов/CSS сервисного портала.
---
## 1. Структура страницы
Каждая страница наследует `page.html` и реализует блок `page_content`.
### Порядок элементов в правой части (main):
```
page.html main-header:
left: h1 (заголовок) + breadcrumb
right: page_actions block + дата {{ now }}
page_content:
1. div.card — основной контент
├── div.card-header — заголовок + кнопка действия
├── div.filter-bar — фильтры (если нужны)
└── div.table-wrap > table — таблица данных
2. div.modal-overlay#modal-xxx — модалка создания/редактирования
3. div.modal-overlay#confirm-delete-xxx — модалка подтверждения удаления
```
### Card Header:
```html
```
---
## 2. Модалки
### Единые CSS-классы
| Класс | Назначение |
|-------|-----------|
| `.modal-overlay` | Затемнённый фон (position: fixed, z-index: 200) |
| `.modal-overlay.open` | Показать модалку (display: flex) |
| `.modal` | Контейнер модалки (фон, рамка, скругление) |
| `.modal-close` | Кнопка закрытия (✕) в правом верхнем углу |
| `.form-actions` | Блок кнопок внизу модалки (display: flex, gap: 10px) |
### Открытие/закрытие
```javascript
// Открыть
document.getElementById('modal-xxx').classList.add('open');
// Закрыть
document.getElementById('modal-xxx').classList.remove('open');
// Или изнутри кнопки
this.closest('.modal-overlay').classList.remove('open');
```
**ЗАПРЕЩЕНО:** использовать `style.display = 'flex'` / `style.display = 'none'`
### Модалка создания/редактирования (стандарт)
```html
```
### Модалка подтверждения удаления (единый шаблон)
**ЗАПРЕЩЕНЫ:** `confirm()`, `alert()`, `prompt()` — только кастомные модалки!
```html
Удалить [объект]?
будет удалён навсегда.
Это действие нельзя отменить.
```
### Порядок кнопок в модалках
```
[ Действие (btn-danger / btn-primary) ] [ Отмена (btn) ]
слева справа
```
---
## 3. Кнопки
### Иконки
| Иконка | Назначение | CSS-класс |
|--------|-----------|-----------|
| `+` | Создание (перед текстом) | `btn btn-primary btn-sm` |
| `✎` | Редактирование | `btn btn-secondary btn-sm` |
| `✕` | Удаление | `btn btn-danger btn-sm` |
| `✓` | Завершение/включение | `btn btn-success btn-sm` |
| `🗑` | Удаление (только в карточках) | `btn btn-danger btn-sm` |
### CSS-классы кнопок
| Класс | Назначение |
|-------|-----------|
| `.btn` | Базовая кнопка |
| `.btn-primary` | Основное действие (синий) |
| `.btn-secondary` | Вторичное действие (серый) |
| `.btn-danger` | Удаление/опасное действие (красный) |
| `.btn-success` | Успех/завершение (зелёный) |
| `.btn-warning` | Предупреждение (жёлтый) |
| `.btn-sm` | Маленький размер |
### Таблицы — колонка действий
```html
|
|
```
---
## 4. Уведомления
### Показ уведомлений
```javascript
showNotification('Текст уведомления', 'success'); // зелёное
showNotification('Текст уведомления', 'error'); // красное
showNotification('Текст уведомления', 'warning'); // жёлтое
showNotification('Текст уведомления', 'info'); // синее
```
**ЗАПРЕЩЕНЫ:** `alert()`, `prompt()`, `confirm()` — только `showNotification()` и кастомные модалки!
---
## 5. Фильтры
```html
```
---
## 6. Таблицы
```html
| Колонка 1 |
Колонка 2 |
|
{% for item in items %}
| {{ item.field }} |
{{ item.field2 }} |
|
{% endfor %}
```
---
## 7. Страницы с JS-рендерингом
Для страниц, где данные загружаются через `fetch()` (bot_consent, bot_dialogues, bot_kb, bot_tickets, bot_unknown, charts):
- Таблица рендерится через `renderXxx(data)` в JavaScript
- Фильтрация через `filterXxx()` на клиенте
- Модалки подтверждения удаления — те же HTML-шаблоны
---
## 8. Чек-лист перед коммитом
- [ ] Нет `confirm()`, `alert()`, `prompt()` в коде
- [ ] Модалки открываются через `classList.add('open')`
- [ ] Модалки закрываются через `classList.remove('open')`
- [ ] Кнопки удаления: `✕` (btn-danger)
- [ ] Кнопки редактирования: `✎` (btn-secondary)
- [ ] Порядок кнопок в модалках: Действие → Отмена
- [ ] Уведомления через `showNotification()`
- [ ] CSS-классы модалок: `.modal-overlay` / `.modal`