trails/openspec/changes/activity-stats/tasks.md
Ullrich Schäfer 26b59b9c95
openspec: propose journal route/activity detail catch-up changes
Three OpenSpec proposals to bring the journal's route/activity detail and feed
closer to best-in-class outdoor apps, in the order we'll implement them:

- activity-sport-type: nullable sport enum on activities (hike/walk/run/
  ride/gravel/mtb/ski/other), set on create or normalized on import,
  shown as a badge + feed verb, federated as a Note PropertyValue.
- activity-stats: one reusable StatRow + canonical metric set, sport-aware
  avg pace/speed, moving-vs-elapsed time. Derive-only, no schema change.
- journal-elevation-profile: elevation profile chart + chart<->map
  "active distance" hover/click sync on the read-only detail pages.

All three validate with `openspec validate --strict`. Specs only; no code.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 13:56:24 +02:00

1.6 KiB

1. Helpers

  • 1.1 Add a pure movingTime(gpx) helper to @trails-cool/gpx (sum inter-point intervals, exclude sub-threshold/stationary segments, max-gap guard); unit-test against fixtures with and without trackpoint times.
  • 1.2 Add a deriveRate({ distance, time, sportType }) helper returning { kind: "pace" | "speed", value } with the sport→kind rule and speed default.
  • 1.3 Add a formatStat helper (distance/elevation/time/speed/pace) routing labels + units through i18n.

2. Component

  • 2.1 Build the shared StatRow (ordered { value, label, unit } items; value-prominent layout; no data fetching).
  • 2.2 Define the canonical headline order as a single exported constant the surfaces draw from.

3. Adopt across surfaces

  • 3.1 Activity detail: replace the hand-rolled stats block with StatRow (full set incl. pace/speed + moving/elapsed).
  • 3.2 Route detail: adopt StatRow (distance, ascent, descent; no time/pace).
  • 3.3 Feed card: adopt StatRow compact subset (distance · time · pace/speed); expose the needed fields in the feed loader.
  • 3.4 Profile activity list: adopt StatRow compact subset.

4. i18n

  • 4.1 Add journal.stats.* keys (labels + unit suffixes for distance, elevation, time, speed, pace) to en + de.

5. Tests & checks

  • 5.1 Unit: movingTime (with/without timestamps; moving ≤ elapsed), deriveRate (pace/speed/default), formatStat.
  • 5.2 Component: StatRow renders ordered items; subset preserves order.
  • 5.3 pnpm typecheck && pnpm lint && pnpm test && pnpm test:e2e green.