diff --git a/src/lib/components/ElevationChart.svelte b/src/lib/components/ElevationChart.svelte index 44ebc62..7f5d93e 100644 --- a/src/lib/components/ElevationChart.svelte +++ b/src/lib/components/ElevationChart.svelte @@ -1,10 +1,13 @@ - -
- - diff --git a/src/lib/components/SpeedChart.svelte b/src/lib/components/SpeedChart.svelte index 47c3732..e8c3918 100644 --- a/src/lib/components/SpeedChart.svelte +++ b/src/lib/components/SpeedChart.svelte @@ -3,10 +3,13 @@ let { timed, + hoverD = null, onhover, onselect }: { timed: { d: number; t: number }[]; + /** shared hover distance controlled by the page, so charts stay in sync */ + hoverD?: number | null; onhover?: (d: number | null) => void; onselect?: (d: number) => void; } = $props(); @@ -82,21 +85,23 @@ : '' ); - let hover = $state<{ d: number; v: number } | null>(null); - - function onmove(event: PointerEvent) { - const rect = (event.currentTarget as SVGRectElement).getBoundingClientRect(); - const frac = Math.min(1, Math.max(0, (event.clientX - rect.left) / rect.width)); - const target = frac * totalDist; + // snap the shared hover distance to this chart's nearest point + const hover = $derived.by(() => { + if (hoverD === null || series.length === 0) return null; let lo = 0; let hi = series.length - 1; while (hi - lo > 1) { const mid = (lo + hi) >> 1; - if (series[mid].d < target) lo = mid; + if (series[mid].d < hoverD) lo = mid; else hi = mid; } - hover = target - series[lo].d < series[hi].d - target ? series[lo] : series[hi]; - onhover?.(hover.d); + return hoverD - series[lo].d < series[hi].d - hoverD ? series[lo] : series[hi]; + }); + + function onmove(event: PointerEvent) { + const rect = (event.currentTarget as SVGRectElement).getBoundingClientRect(); + const frac = Math.min(1, Math.max(0, (event.clientX - rect.left) / rect.width)); + onhover?.(frac * totalDist); } const tooltipLeft = $derived(hover ? Math.min(Math.max(x(hover.d), 70), width - 70) : 0); @@ -144,10 +149,7 @@ fill="transparent" onpointermove={onmove} onclick={() => hover && onselect?.(hover.d)} - onpointerleave={() => { - hover = null; - onhover?.(null); - }} + onpointerleave={() => onhover?.(null)} /> {#if hover} diff --git a/src/lib/map-state.svelte.ts b/src/lib/map-state.svelte.ts index 2881978..3255b52 100644 --- a/src/lib/map-state.svelte.ts +++ b/src/lib/map-state.svelte.ts @@ -13,6 +13,7 @@ let detailTrack = $state- {a.username} · {fmtDate(a.date)} · - {a.type} -
-+ {a.username} · {fmtDate( + a.date, + )} · + {a.type} +
+