Files
ipam_control/docs/changes/041-favicon/PLAN.md
T

26 lines
2.6 KiB
Markdown
Raw Normal View History

# 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`: `<link rel="icon" href="favicon.svg" type="image/svg+xml">`.
Старые браузеры, которые не понимают 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`).
- Визуально — пользователь: иконка во вкладке совпадает с логотипом в шапке.