Some checks failed
CI / build-and-test (pull_request) Has been cancelled
- 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
7.4 KiB
7.4 KiB
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\docs\backend-api-for-frontend.md.
- Общий контекст запуска/окружения — d:\vaka.pro\calendar_run\README.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, крупные числовые метрики.
- Минимум визуального шума, 2–3 клика на частые действия.
- Консистентные состояния загрузки/ошибок/пустых данных.
- A11y-базис: фокус-стили, клавиатурная навигация, контраст, корректная разметка интерактивных элементов.
Зависимая задача (выполнена)
- Поле
finishPlaceдобавлено в модельRace: миграция002_finish_place_and_registered_status.sql, мапперrace.ts, DTO, API-документация. - Frontend-типы, карточка и блок сравнения используют
finishPlace.
Порядок реализации
- Подготовить каркас frontend и дизайн-токены (BEM + CSS variables).
- Реализовать API-клиент и типы данных с обработкой ошибок.
- Собрать Dashboard и календарные списки (будущие/прошедшие).
- Реализовать карточку старта с вычислением
paceна клиенте. - Реализовать PR и блок сравнения стартов с fallback для
place. - Добавить состояния пустых данных/ошибок/загрузки и а11y-полировку.
Definition of Done для frontend
- Все ключевые экраны из UI-инструкции доступны и консистентны визуально.
- API-интеграция работает по текущему контракту без локальных обходов хранилища.
paceсчитается корректно для completed-забегов.registeredне ломает модель: визуально интерпретируется в рамкахplanned.finishPlaceинтегрирован; при отсутствии значения — безопасный fallback в UI.