28 lines
1.5 KiB
Markdown
28 lines
1.5 KiB
Markdown
# Product Context — Strava Frontend
|
|
|
|
## Why the project exists
|
|
|
|
A cycling social platform where users upload workout files (FIT/GPX), and the community sees a feed of rides with performance charts and maps. The frontend is the only user-facing surface.
|
|
|
|
## Target user
|
|
|
|
Cyclists (Russian-speaking first). They expect:
|
|
|
|
- A fast-loading feed (`Feed.vue` at `/explore`) of public workouts.
|
|
- Rich workout detail: map with route line, charts of speed/power/heart rate/elevation, attachments (photos).
|
|
- Simple auth (login/signup/recover) and profile preferences (name, avatar, password reset, 2FA flag).
|
|
|
|
## UX principles
|
|
|
|
- Russian-first UI; i18n infrastructure exists for `br`, `cn`, `es`, `gb`, `ir`, `ru` locales in `src/i18n/locales/`.
|
|
- Responsive layout via Vuestic `va-app-layout` + custom sidebar/navbar (`src/components/`).
|
|
- Lazy-loaded routes for performance; GTM analytics enabled via env vars.
|
|
- Default avatar is an inline base64 placeholder in `useUserStore` when no avatar attachment is uploaded.
|
|
|
|
## Key user flows
|
|
|
|
- Login → `localStorage` gets `token`, `user`, `profile`, `attachments` → router guard-free navigation (no global guard; 401 responses redirect to login).
|
|
- Upload workout: pick file → backend parses FIT/GPX → `workout_item` page renders data.
|
|
- Public workout: shareable `public/workouts/:id` route without auth (SSR-rendered for SEO).
|
|
- Search visibility: SSR pages with JSON-LD structured data, sitemap.xml, robots.txt — indexed by Yandex/Google.
|