26 lines
2.6 KiB
Markdown
26 lines
2.6 KiB
Markdown
# 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`).
|
|||
|
|
- Визуально — пользователь: иконка во вкладке совпадает с логотипом в шапке.
|