diff --git a/peakup-frontend/src/components/dashboard/LastWorkoutCard.tsx b/peakup-frontend/src/components/dashboard/LastWorkoutCard.tsx index 4e6bf31..fbea625 100644 --- a/peakup-frontend/src/components/dashboard/LastWorkoutCard.tsx +++ b/peakup-frontend/src/components/dashboard/LastWorkoutCard.tsx @@ -49,6 +49,7 @@ function ActivityRouteMap({ const sliderMax = Math.max(points.length - 1, 0) const boundedIdx = Math.min(sliderIdx, sliderMax) + const totalDistanceM = timeSeries.length > 0 ? (timeSeries[timeSeries.length - 1]?.distanceM ?? 0) : 0 useEffect(() => { if (!containerRef.current || points.length === 0) return @@ -111,11 +112,12 @@ function ActivityRouteMap({
{pointInfo && (At Point
+At Point
+Moving Time · Distance
+Moving Time · Distance
{formatDuration(activity.movingTimeS)}
• @@ -258,12 +285,14 @@ export function LastWorkoutCard({{label}
{value}
{unit && {unit}}
+ {trend != null &&
{sub}
}{title}
{subtitle}
@@ -253,14 +268,14 @@ function DayCard({ className={[ 'border rounded-sm p-3 min-h-[90px]', today - ? 'bg-zinc-50 border-l-2 border-l-orange-500 border-t-zinc-200 border-r-zinc-200 border-b-zinc-200' - : 'bg-white border-zinc-200', + ? 'bg-orange-50 shadow-md border-t-zinc-200 border-r-zinc-200 border-b-zinc-200 border-l-4 border-l-orange-400' + : 'bg-white border-zinc-200 shadow-sm', ].join(' ')} >{format(day, 'EEE d')} @@ -430,13 +445,24 @@ export function Dashboard({athleteId}: { athleteId: number }) { const ctlLoadData = loadData.slice(loadData.findIndex(d => d.ctl !== null)) + const nonNullCtlData = loadData.filter((d) => d.ctl !== null) + const prevCtlEntry = nonNullCtlData.length >= 2 ? nonNullCtlData[nonNullCtlData.length - 2] : null + const currentCtlEntry = nonNullCtlData.length >= 1 ? nonNullCtlData[nonNullCtlData.length - 1] : null + const ctlTrend = currentCtlEntry?.ctl != null && prevCtlEntry?.ctl != null + ? currentCtlEntry.ctl - prevCtlEntry.ctl + : null + const atlTrend = currentCtlEntry?.atl != null && prevCtlEntry?.atl != null + ? currentCtlEntry.atl - prevCtlEntry.atl + : null + const tsbTrend = ctlTrend != null && atlTrend != null ? ctlTrend - atlTrend : null + const ctlValues = ctlLoadData.map(d => d.ctl).filter((v): v is number => v !== null) const ctlDomain: [number, number] | ['auto', 'auto'] = ctlValues.length ? [Math.floor(Math.min(...ctlValues) * 0.9), Math.ceil(Math.max(...ctlValues) * 1.1)] : ['auto', 'auto'] return ( -
Training Goals @@ -475,7 +501,7 @@ export function Dashboard({athleteId}: { athleteId: number }) {
{selectedActivityId !== null && selectedActivity !== lastWorkout
@@ -520,45 +546,47 @@ export function Dashboard({athleteId}: { athleteId: number }) {
)}
{/* ── Section 3: This Week's Training ────────────────────────────────── */}
-
- This Week's Training
-
+
Daily Breakdown
- Fitness State
-
+ Fitness State
+
Weekly Training Load (TSS)
Fitness, Fatigue & Form (CTL / ATL / TSB)