@@ -247,7 +247,7 @@ Production-логи структурированы в JSON и не содерж
- нет пользовательских аккаунтов, OCR, Telegram-бота и уведомлений о клёве;
- community-источники автоматически включают в активность только полные наблюдения с подтверждёнными external-ID алиасами; fallback alias по имени ещё не используется автопубликацией. Неполные наблюдения видны в «Полевых сигналах», но не влияют на индекс;
- offset pagination рассчитана на пилотные объёмы, не на бесконечную ленту;
- прежний локальный Lighthouse показывал LCP 9,3 с; после него hero уменьшен с 1,6 МБ до 71 КБ и получил высокий приоритет загрузки, повторный production-замер выполняется после размещения;
- локальный Lighthouse production-сборки 12 сентября показал performance 100, LCP 1,66 с, CLS 0,023 и TBT 9 мс; это лабораторный baseline, полевой INP и серверные метрики появятся после размещения;
- один сервер остаётся точкой отказа, поэтому обязательны внешний backup и мониторинг;
- текущий публичный DNS/TLS не подтверждён, см. [статус развёртывания](docs/deployment-status.md).
.eyebrow,.overline{text-transform:uppercase;letter-spacing:.14em;font-size:12px;font-weight:750;color:#657673}.eyebrow{display:flex;align-items:center;gap:10px}.eyebrowb{display:grid;place-items:center;min-width:41px;height:25px;padding:08px;border:1pxsolid#9aaa9f;border-radius:20px;color:var(--deep);letter-spacing:.05em}.intro{padding:74px042px;display:grid;grid-template-columns:.92fr1.08fr;align-items:end;gap:70px}.introh1,.records-heroh1,.form-heroh1,.spot-heroh1{margin:18px022px;font:400clamp(58px,6.3vw,102px)/.87Georgia,"Times New Roman",serif;letter-spacing:-.065em}.introh1em,.records-heroh1em,.form-heroh1em{color:#497074;font-weight:400}.intro-copy>p{font-size:18px;line-height:1.55;color:#586a68;max-width:560px}.lake-card{position:relative;border-radius:18px;overflow:hidden;height:326px;box-shadow:024px70px#173c3f24}.lake-cardimg{width:100%;height:100%;object-fit:cover;display:block}.lake-card:after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,transparent35%,#041c20d9)}.lake-overlay{position:absolute;z-index:2;inset:auto24px22px26px;display:flex;justify-content:space-between;align-items:end;color:#fff}.lake-overlay.overline{color:#d2dedb;display:block;margin-bottom:7px}.lake-overlaystrong{font:40021pxGeorgia,serif}.pulse-orb{width:45px;height:45px;border:1pxsolid#ffffff7d;border-radius:50%;display:grid;place-items:center}.pulse-orbspan{width:9px;height:9px;border-radius:50%;background:var(--lime);box-shadow:0008px#c9f45b25}
Пункты выполняются сверху вниз, небольшими связанными коммитами.
### Брендинг и визуальная идентичность
- [x] **B01 · Иерархия имени.** RF4 Spotter — единое имя продукта в UI, metadata, manifest и документации; «Ни хвоста, ни чешуи» — поддерживающий слоган. Обновлены wordmark в header/footer и подпись выпуска.
- [x] **B02 · Дизайн-токены.** Добавлены семантические роли поверхностей, текста, границ, фокуса, success/warning/danger и всех источников. На токены переведены паспорта данных, status-карточки, skeleton и focus; контрастные пары зафиксированы в brand system.
- [ ] **B04 · Компонентная подпись.** Унифицировать заголовки секций, CTA, карточки, плашки источников, состояния качества и пустые экраны на публичных и admin-страницах.
- [ ] **B05 · Motion-система.** Оставить только смысловые микроанимации поклёвки/пульса/перехода, задать общие длительности и полностью поддержать reduced motion.
- [ ] **B06 · Brand QA.** Проверить favicon, maskable icons, manifest, OG 1200×630, светлый/тёмный фон, 16/32 px и mobile/desktop screenshots; записать правила в [brand-system.md](brand-system.md).
- [ ] **Q01 · Документы источников.** Приложить или дать устойчивые ссылки на первичные разрешения RF4DB, RF4-STAT, RF4MAP и RF4 Posts; для каждого зафиксировать атрибуцию, точный production-лимит, срок хранения и процедуру удаления.
- [ ] **Q02 · Управляемое удаление источника.** Добавить обнаружение изменённых/удалённых опубликованных записей без отдельного частого обхода: статус, журнал решения и безопасное исключение из активности после проверки.
- [ ] **Q03 · Целостность ссылок.** Проверять исходные ссылки только во время разрешённого планового обращения к площадке, разделяя `missing`, `temporary_error` и `blocked`; не создавать дополнительный сетевой цикл.
- [x] **Q04 · Состояния ожидания.** Асинхронные admin-очереди получили каркасные карточки, `aria-busy`, очистку при ошибке и поддержку `prefers-reduced-motion`. Публичные страницы остаются SSR и не показывают искусственный skeleton; форма уже блокирует повторную отправку и сообщает «Отправка…».
- [x] **Q05 · Базовая визуальная матрица.** Главная проверена в браузере на 320/390/768/1280 px, ключевые public-маршруты — на 320 px; удалён корневой `min-width`, создававший горизонтальный scroll. Добавлен E2E-контракт для `/`, records, report, waterbodies, status и видимого skip-link. Ширина 320 px также покрывает reflow, эквивалентный 200% zoom для окна 640 px. Расширенная матрица наполненных/длинных/error-состояний остаётся постоянной частью приёмки UI, а не отдельным блокером.
- [] **Q06 · Performance baseline.**Повторить Lighthouse на production-сборке после оптимизации hero; записать LCP/CLS/INP и бюджет в документацию.
- [x] **Q06 · Performance baseline.**На локальной production-сборке после оптимизации hero: performance 100, LCP 1,66 с, FCP 1,15 с, CLS 0,023, TBT 9 мс. Устранены найденные Lighthouse проблемы контраста и accessible name; методика и бюджеты записаны в [performance-baseline.md](performance-baseline.md). Полевой INP измеряется только после запуска.
- [ ] **Q07 · Нагрузочная методика.** Подготовить воспроизводимый сценарий измерения p95 для activity, records, staging и moderation без объявления результатов до запуска на целевом сервере.
- [ ] **Q08 · Политика MinIO.** Ограничить app credentials одним bucket и добавить безопасную автоматическую проверку policy; root credentials оставить только bootstrap-задаче.
- [ ] **Q09 · Release-процедура.** Разделить миграционный/release-шаг и запуск приложения либо документировать выбранную стратегию отката; проверить upgrade с предыдущей ревизии на копии данных.
**RF4 Spotter** — имя продукта и основная подпись во всех интерфейсах, metadata, manifest и социальных карточках. **«Ни хвоста, ни чешуи»** — эмоциональный слоган сообщества; он не заменяет имя и всегда визуально вторичен.
Характер: полевой журнал современного рыболова — точный, спокойный, немного экспедиционный. Интерфейс не имитирует игровой клиент и не обещает гарантированный клёв.
## Визуальные роли
- Тёмная вода (`deep`, `teal`) — навигация, ключевые панели и высокий информационный вес.
- Бумага (`paper`, `white`) — рабочая поверхность и длинное чтение.
- Лайм (`lime`) — активное действие, свежий сигнал и фокус; не декоративная заливка больших площадей.
- Оранжевый — приманка и тёплый акцент, но не системный статус ошибки.
- Антиква Georgia — крупные редакционные заголовки и числа; Inter/system sans — управление, подписи и данные.
Семантические CSS-токены отделяют роль от оттенка: `--surface*`, `--text*`, `--border*`, `--focus`, `--success*`, `--warning*`, `--danger*` и `--source-*`. Компонент не должен вводить новый системный зелёный, жёлтый или красный без отдельной смысловой роли. Основной текст на светлой поверхности использует `--text`, вторичный — `--text-muted`; `--text-subtle` допустим только для крупного или вспомогательного текста, прошедшего WCAG AA.
## Фирменные мотивы
- Крючок — знак бренда и favicon.
- Поплавок — индекс активности и состояние ожидания.
- Леска — время и последовательность наблюдений.
- Рябь — свежесть или обновление, только в спокойной анимации.
- Координатная сетка/радар — точка, но не ложная карта водоёма.
- Силуэт рыбы — различение сущностей каталога, не фоновый орнамент каждой секции.
Один блок использует один главный мотив. Источник и качество всегда передаются текстом вместе с цветом. Декор не должен конкурировать с координатами, весом, свежестью и provenance.
Матрица применения:
| Мотив | Где используется | Где не используется |
|---|---|---|
| Крючок | знак RF4 Spotter, favicon | статусы и кнопки действий |
| Поплавок | индекс активности, ожидание и пустое состояние | ошибка, источник, координаты |
| Рябь | живой пульс свежих данных | неполные и устаревшие записи |
| Радар/сетка | точные координаты | фон карточек без координат |
| Силуэт рыбы | каталог и карточка вида | общий орнамент страницы |
Неполные данные получают тёплую верхнюю полевую метку и текстовый статус. Ошибка не изображается «мёртвым поплавком»: она передаётся системным danger-состоянием и понятным действием пользователя.
## План внедрения
Рабочие статусы B01–B06 ведутся в [ROADMAP.md](ROADMAP.md). После каждого пакета выполняются Astro check/build и адресная визуальная проверка 320/390/768/1280 px. Новые bitmap-иллюстрации не добавляются, пока существующие SVG/CSS-мотивы решают задачу без лишнего веса.
Последняя проверка: 12 сентября 2026. Lighthouse 13.4.1 запускался локально против Astro SSR production-сборки, с доступным локальным API и стандартным mobile throttling. Это лабораторная проверка кода, а не прогноз скорости production-сервера.
| Метрика | Результат | Бюджет открытой альфы |
|---|---:|---:|
| Performance | 100 | ≥ 85 |
| FCP | 1,15 с | ≤ 2,0 с |
| LCP | 1,66 с | ≤ 2,5 с |
| CLS | 0,023 | ≤ 0,10 |
| TBT | 9 мс | ≤ 200 мс |
| Accessibility | 96 до правок контраста/name | 100 при повторной проверке |
Команда:
```bash
npm --prefix apps/web run build
HOST=127.0.0.1 PORT=4321 API_INTERNAL_URL=http://127.0.0.1:8000 npm --prefix apps/web run start
npm --prefix apps/web run audit:lighthouse
```
Lighthouse не измеряет полевой INP. После развёртывания следует собрать реальные Web Vitals без cookies и персональных идентификаторов, повторить mobile/desktop Lighthouse через публичный TLS и записать медиану минимум трёх запусков. Не менять изображения, кэш или SSR по одному нестабильному прогону.
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.