diff --git a/README.md b/README.md index 5ffce43..9280413 100644 --- a/README.md +++ b/README.md @@ -212,6 +212,7 @@ docker compose -p ipam_control_006 up -d --build && venv/bin/python -m pytest -q | 038 | Тёмная тема UI | [план](docs/changes/038-dark-theme/PLAN.md) · [итог](docs/changes/038-dark-theme/SUMMARY.md) | | 039 | Статус устройства и сведения об устройстве в списке адресов префикса | [план](docs/changes/039-device-status/PLAN.md) · [итог](docs/changes/039-device-status/SUMMARY.md) | | 040 | Название в UI: «IPAM Manager» | [план](docs/changes/040-brand-name/PLAN.md) · [итог](docs/changes/040-brand-name/SUMMARY.md) | +| 041 | Favicon из логотипа бренда | [план](docs/changes/041-favicon/PLAN.md) · [итог](docs/changes/041-favicon/SUMMARY.md) | ## Отчёты ревью - [Ревью кодовой базы](docs/reviews/2026-09-26-codebase-review.md) (находки → изменения 011–023) diff --git a/docs/changes/039-device-status/SUMMARY.md b/docs/changes/039-device-status/SUMMARY.md index c7c874e..1e9fb1e 100644 --- a/docs/changes/039-device-status/SUMMARY.md +++ b/docs/changes/039-device-status/SUMMARY.md @@ -15,12 +15,11 @@ | `README.md` | Модель данных (устройства), «Интерфейс», миграции `0001`–`0016`, строка 039 | ## Проверки +- `pytest -q` — 17 passed, включая `test_device_status_on_address` (прогон после изменения 041, когда учётная запись `admin` снова включена). - Миграция 0016 применена, `alembic check` чисто, откат до 0015 и повторный upgrade — без ошибок; 3 существующих устройства — `active`. - Статус в API — строка (`"maintenance"`), не представление enum (проверено сериализацией `AddressOut`). - `node --check`, `py_compile`, `import app.main` — чисто; стенд пересобран (`--force-recreate`), healthy, отдаёт новый `app.js`. - Новых литеральных цветов в `app.js` нет (бейджи — существующие классы, тёмная тема не затронута). ## Не проверено -- **`pytest` не прогнан**, в том числе новый `test_device_status_on_address`: учётная запись `admin` из `.env` (фикстура `client`) - отключена пользователем `tstark` через UI (13:58). Решение о её включении или других учётных данных для тестов — за пользователем. - UI — ручная проверка пользователя. diff --git a/docs/changes/041-favicon/PLAN.md b/docs/changes/041-favicon/PLAN.md new file mode 100644 index 0000000..7a0866e --- /dev/null +++ b/docs/changes/041-favicon/PLAN.md @@ -0,0 +1,26 @@ +# Favicon из логотипа бренда (изменение 041) + +## Context +У приложения нет favicon: во вкладке браузера стандартная иконка. Нужен favicon в едином стиле с логотипом бренда в шапке — +`.brand-logo`: скруглённый квадрат 28×28, радиус 8, фон `--primary` (`#2450c8`), в центре белая иконка «глобус» 16×16 (`I.globe` в `web/app.js`). + +## Изменения +- `web/favicon.svg` (новый): тот же рисунок в `viewBox="0 0 32 32"`: + - `rect` 32×32, `rx≈9` (пропорция 8/28), заливка `#2450c8`; + - по центру контуры глобуса из `I.globe`: `circle r=9` и три `path`, масштаб ≈1.1 от 24-пиксельного `viewBox` иконки через `transform`; + - `stroke="#fff"`, `stroke-width` как у иконки (1.8), скруглённые концы. + Цвета заданы литералами: favicon живёт вне CSS страницы, токены к нему не применяются. Фон одинаковый в обеих темах, + как у логотипа в шапке: у него `--primary` светлее в тёмной теме, но для вкладки браузера достаточно фирменного синего. +- `web/index.html`: ``. + Старые браузеры, которые не понимают SVG и запрашивают `/favicon.ico`, сейчас получают 404 — это приемлемо, ICO не делаем. +- Проверить, что статическая раздача (`RevalidatedStatic` в `app/main.py`) отдаёт `.svg` с `Content-Type: image/svg+xml`. + Файлы `web/` уже раздаются из корня, отдельный маршрут не нужен. +- `README.md`: строка 041 в истории. + +## Исполнение +Код — агент на Sonnet, он же пересобирает стенд с `--force-recreate`. Моя часть — ревью и проверка, после неё — прогон `pytest` для 039 +(учётная запись `admin` снова включена пользователем). + +## Проверка +- `curl -sI /favicon.svg` → 200, `image/svg+xml`; SVG валиден (`xmllint --noout` или Python `xml.etree`). +- Визуально — пользователь: иконка во вкладке совпадает с логотипом в шапке. diff --git a/docs/changes/041-favicon/SUMMARY.md b/docs/changes/041-favicon/SUMMARY.md new file mode 100644 index 0000000..e9c509e --- /dev/null +++ b/docs/changes/041-favicon/SUMMARY.md @@ -0,0 +1,17 @@ +# Итог: favicon из логотипа бренда (изменение 041) + +План: `PLAN.md`. Во вкладке браузера теперь та же иконка, что у логотипа в шапке: синий скруглённый квадрат с белым глобусом. + +## Что сделано +| Файл | Изменение | +|---|---| +| `web/favicon.svg` (новый) | `viewBox 0 0 32 32`: `rect rx=9` `#2450c8`; контуры глобуса из `I.globe` без изменений координат, `translate(6.857,6.857) scale(0.7619)` — пропорции `.brand-logo` (иконка 16 в квадрате 28), увеличенные до 32 | +| `web/index.html` | `` | +| `README.md` | Строка 041 в истории | + +`app/main.py` не менялся: статика уже отдаёт `.svg` как `image/svg+xml`. + +## Проверки +- SVG валиден (`xml.etree`); `/favicon.svg` → 200 `image/svg+xml` напрямую и через Caddy (`rxipam.rxmsk.ru`); `index.html` стенда содержит `rel="icon"`. +- `pytest -q` — 17 passed. +- Вид во вкладке — пользователь. diff --git a/web/favicon.svg b/web/favicon.svg new file mode 100644 index 0000000..87a4264 --- /dev/null +++ b/web/favicon.svg @@ -0,0 +1,10 @@ + diff --git a/web/index.html b/web/index.html index beea7d5..83f8d0e 100644 --- a/web/index.html +++ b/web/index.html @@ -5,6 +5,7 @@