{#if loading}

Loading…

{:else if error}

{error}

{:else if !athlete}

No athlete profile yet.

{#if editEnabled} {/if}
{:else}
{#if editEnabled} {/if}
{#if activeTab === 'power'} {#if athlete.power_curve.all_time}
{:else}

No power data found. Make sure your activities include power meter data.

{/if} {:else if activeTab === 'records'} {:else if activeTab === 'segments'}
{#if rescanMsg}{rescanMsg}{/if}
{#if segmentsLoading}

Loading…

{:else if segmentSummary.length === 0}

No segment efforts yet. Use "Rescan all activities" to detect efforts from existing activities.

{:else}
{#each segmentSummary as row (row.segment.id)} toggleSegment(row.segment.id)} role="button" tabindex="0" on:keydown={e => e.key === 'Enter' && toggleSegment(row.segment.id)} > {#if expandedId === row.segment.id} {/if} {/each}
Segment Best time Efforts
{#if row.segment.sport} {sportIcon(row.segment.sport as any)} {/if} {row.segment.name}
{formatElapsed(row.best_elapsed_s)} {row.effort_count} {expandedId === row.segment.id ? '▲' : '▼'}
{#if loadingEfforts[row.segment.id]}

Loading…

{:else} {@const efforts = effortsBySegment[row.segment.id] ?? []} {@const pr = efforts.length ? Math.min(...efforts.map(e => e.elapsed_s)) : 0}
{#each efforts as e (e.activity_id + e.started_at)} {@const delta = e.elapsed_s - pr} {@const isPR = delta === 0} {/each}
{new Date(e.started_at).toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' })} {formatElapsed(e.elapsed_s)} {#if isPR}PR{:else}+{delta < 60 ? `${delta}s` : `${Math.floor(delta/60)}m${(delta%60).toString().padStart(2,'0')}s`}{/if}
{/if}
{/if} {:else if activeTab === 'nerd'}

Year over year

{:else if activeTab === 'explore'}
{:else if activeTab === 'profile'}

Key numbers

{#if athlete.max_hr}
Max HR {athlete.max_hr} bpm
{/if} {#if athlete.ftp_w}
FTP {athlete.ftp_w} W
{/if} {#if !athlete.max_hr && !athlete.ftp_w}

Set athlete.max_hr and athlete.ftp_w in your config, or use Edit profile.

{/if}
{#if athlete.hr_zones}

HR Zones

{#each athlete.hr_zones as _zone, i}
Z{i + 1} {fmtHrZone(athlete.hr_zones!, i)}
{/each}
{/if} {#if athlete.power_zones}

Power Zones

{#each athlete.power_zones as _zone, i}
Z{i + 1} {fmtZone(athlete.power_zones!, i)}
{/each}
{/if}
{/if} {/if} {#if drawerOpen && editEnabled} drawerOpen = false} on:saved={onSaved} /> {/if}