Files
runners-calendar/FRONTEND_PLAN.md
Anton f74ce6ed88
Some checks failed
CI / build-and-test (pull_request) Has been cancelled
docs: fix README dev/production commands, update FRONTEND_PLAN status, remove broken links
- README: separate dev (npm run dev) and production (npm run build && npm start) steps

- FRONTEND_PLAN: mark backend-dependency-task as completed (finishPlace already in API)

- Remove dead references to missing agent-frontend-ui-instructions.md from PLAN.md and FRONTEND_PLAN.md

Made-with: Cursor
2026-04-07 17:51:02 +03:00

100 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: Frontend implementation plan
overview: Собрать минималистичный frontend для календаря забегов по UI-инструкции, строго в рамках текущего API-контракта.
todos:
- id: frontend-structure
content: Подготовить структуру frontend, роутинг, базовые layout-компоненты и дизайн-токены на CSS variables + BEM
status: completed
- id: api-contract-layer
content: Реализовать типизированный API-клиент и слой нормализации/обработки ошибок по контракту backend-api-for-frontend.md
status: completed
- id: dashboard-and-calendar
content: Собрать Dashboard, списки будущих/прошедших стартов и базовые карточки по минималистичному UI-гайду
status: completed
- id: race-details-and-metrics
content: Реализовать экран карточки старта, вычисление темпа на фронте и отображение completed-метрик
status: completed
- id: pr-and-comparison
content: Сделать блок PR и сравнение стартов с fallback для отсутствующего поля place
status: completed
- id: backend-dependency-task
content: "Расширение API полем finishPlace: миграция 002, маппер, DTO, фронтенд-интеграция — выполнено"
status: completed
isProject: false
---
# План frontend части Calendar Run
## Исходные опоры
- UI и UX принципы: минимализм, воздух, акцент на данных, спокойная палитра, быстрые сценарии (дизайн-токены в `frontend/src/styles/tokens.css`).
- Продуктовые ограничения и структура экранов сверяем с [d:\vaka.pro\calendar_run\PLAN.md](d:/vaka.pro/calendar_run/PLAN.md).
- Интеграционный контракт берём из [d:\vaka.pro\calendar_run\docs\backend-api-for-frontend.md](d:/vaka.pro/calendar_run/docs/backend-api-for-frontend.md).
- Общий контекст запуска/окружения — [d:\vaka.pro\calendar_run\README.md](d:/vaka.pro/calendar_run/README.md) и [d:\vaka.pro\calendar_run\docs\backend.md](d:/vaka.pro/calendar_run/docs/backend.md).
## Границы версии (V1)
- Только frontend + интеграция с текущим API.
- Статус `зарегистрирован` трактуется как UI-вариант `planned` (без изменения backend-контракта).
- Для completed-забегов обязательно показываем `темп`; считаем на фронте из `finishTime` и `distanceKm`.
- Для completed-забегов поле `место` (`finishPlace`) доступно в API (миграция 002, маппер, DTO); фронтенд отображает его в карточке и таблице сравнения.
## Архитектура frontend
- Базовая структура: `frontend/src/app`, `frontend/src/pages`, `frontend/src/components`, `frontend/src/api`, `frontend/src/features`, `frontend/src/lib`, `frontend/src/styles`.
- Дизайн-система на CSS variables: токены цвета/типографики/отступов/радиусов, единые состояния (`success`, `warning`, `error`).
- БЭМ для всех UI-блоков и модификаторов (`block`, `block__element`, `block--modifier`).
- Единый слой API-клиента:
- `GET /races`, `GET /races/:id`, `POST /races`, `PATCH /races/:id`, `DELETE /races/:id` (если используется UI-сценарием).
- Типы `Race`, `RaceStatus`, DTO для POST/PATCH.
- Централизованный маппинг ошибок API (`validation_error`, `not_found`, `database_unavailable`, `conflict`) в UX-сообщения.
## Экранная модель и сценарии
- Dashboard:
- `Ближайший старт`, `Последний результат`, `Личный рекорд`, `Сезон`.
- CTA к календарю и добавлению старта.
- Календарь стартов:
- Переключение `Будущие` / `Прошедшие`.
- Карточка старта: `title`, `date`, `distanceKm`, статус-лейбл.
- Карточка старта:
- Базовые поля + `finishTime`, вычисляемый `pace`, `finishPlace`, `notes`.
- PR блок:
- Дистанции: 5K, 10K, 21.1, 42.2 (согласно UI-инструкции).
- Расчёт по completed-забегам с валидным `finishTime`.
- Сравнение стартов (ключевая фича):
- Таблица/карточки по годам с `time`, `pace`, `finishPlace`.
- Если `finishPlace` не заполнено — graceful-degradation: колонка в состоянии «нет данных».
## UX и визуальные требования
- Визуальная система: светлый фон, белые карточки, один акцентный цвет, без кислотных сочетаний.
- Иерархия типографики: H1/H2/body/caption, крупные числовые метрики.
- Минимум визуального шума, 23 клика на частые действия.
- Консистентные состояния загрузки/ошибок/пустых данных.
- A11y-базис: фокус-стили, клавиатурная навигация, контраст, корректная разметка интерактивных элементов.
## Зависимая задача (выполнена)
- Поле `finishPlace` добавлено в модель `Race`: миграция `002_finish_place_and_registered_status.sql`, маппер `race.ts`, DTO, API-документация.
- Frontend-типы, карточка и блок сравнения используют `finishPlace`.
## Порядок реализации
1. Подготовить каркас frontend и дизайн-токены (BEM + CSS variables).
2. Реализовать API-клиент и типы данных с обработкой ошибок.
3. Собрать Dashboard и календарные списки (будущие/прошедшие).
4. Реализовать карточку старта с вычислением `pace` на клиенте.
5. Реализовать PR и блок сравнения стартов с fallback для `place`.
6. Добавить состояния пустых данных/ошибок/загрузки и а11y-полировку.
## Definition of Done для frontend
- Все ключевые экраны из UI-инструкции доступны и консистентны визуально.
- API-интеграция работает по текущему контракту без локальных обходов хранилища.
- `pace` считается корректно для completed-забегов.
- `registered` не ломает модель: визуально интерпретируется в рамках `planned`.
- `finishPlace` интегрирован; при отсутствии значения — безопасный fallback в UI.