Activity map: click stat to lock track color mode, hover still previews
This commit is contained in:
@@ -179,6 +179,18 @@
|
|||||||
|
|
||||||
type ColorMode = 'default' | 'speed' | 'hr' | 'power' | 'elevation' | 'cadence';
|
type ColorMode = 'default' | 'speed' | 'hr' | 'power' | 'elevation' | 'cadence';
|
||||||
let colorMode: ColorMode = 'default';
|
let colorMode: ColorMode = 'default';
|
||||||
|
let stickyMode: ColorMode | null = null;
|
||||||
|
|
||||||
|
function handleStatClick(cm: ColorMode | null) {
|
||||||
|
if (!cm) return;
|
||||||
|
if (stickyMode === cm) {
|
||||||
|
stickyMode = null;
|
||||||
|
colorMode = 'default';
|
||||||
|
} else {
|
||||||
|
stickyMode = cm;
|
||||||
|
colorMode = cm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Per-metric: is there data AND a GPS track to colour?
|
// Per-metric: is there data AND a GPS track to colour?
|
||||||
$: hasSpeedTrack = !!trackUrl && !!timeseries?.speed_kmh?.some(v => v != null);
|
$: hasSpeedTrack = !!trackUrl && !!timeseries?.speed_kmh?.some(v => v != null);
|
||||||
@@ -427,12 +439,18 @@
|
|||||||
s.key === 'elevation' && hasElevTrack ? 'elevation' :
|
s.key === 'elevation' && hasElevTrack ? 'elevation' :
|
||||||
s.key === 'cadence' && hasCadenceTrack ? 'cadence' : null}
|
s.key === 'cadence' && hasCadenceTrack ? 'cadence' : null}
|
||||||
<div
|
<div
|
||||||
class="bg-zinc-900 px-4 py-3 transition-colors"
|
class="bg-zinc-900 px-4 py-3 transition-colors relative"
|
||||||
class:hover:bg-zinc-800={cm !== null}
|
class:hover:bg-zinc-800={cm !== null}
|
||||||
class:cursor-default={cm !== null}
|
class:cursor-pointer={cm !== null}
|
||||||
role="none"
|
class:ring-1={cm !== null && stickyMode === cm}
|
||||||
|
class:ring-inset={cm !== null && stickyMode === cm}
|
||||||
|
class:ring-white/25={cm !== null && stickyMode === cm}
|
||||||
|
role={cm ? 'button' : 'none'}
|
||||||
|
tabindex={cm ? 0 : -1}
|
||||||
on:mouseenter={() => { if (cm) colorMode = cm; }}
|
on:mouseenter={() => { if (cm) colorMode = cm; }}
|
||||||
on:mouseleave={() => colorMode = 'default'}
|
on:mouseleave={() => { colorMode = stickyMode ?? 'default'; }}
|
||||||
|
on:click={() => handleStatClick(cm)}
|
||||||
|
on:keydown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); handleStatClick(cm); } }}
|
||||||
>
|
>
|
||||||
<p class="text-2xl font-bold text-white">{s.value}</p>
|
<p class="text-2xl font-bold text-white">{s.value}</p>
|
||||||
<p class="text-xs text-zinc-500">{s.label}</p>
|
<p class="text-xs text-zinc-500">{s.label}</p>
|
||||||
|
|||||||
Reference in New Issue
Block a user