{workout.name || (lang === 'en' ? 'Workout' : 'Training')} - Bocken {#if completionData}

{t('workout_complete', lang)}

{#if completionData.prs.length > 0}
{completionData.prs.length}
{/if}

{completionData.name}

{#if offlineQueued}

{t('workout_saved_offline', lang)}

{/if}
{formatDuration(completionData.durationMin)} {t('duration', lang)}
{#if completionData.totalTonnage > 0}
{completionData.totalTonnage >= 1000 ? `${(completionData.totalTonnage / 1000).toFixed(1)}t` : `${Math.round(completionData.totalTonnage)} kg`} {t('tonnage', lang)}
{/if} {#if completionData.totalDistance > 0}
{completionData.totalDistance.toFixed(1)} km {t('distance', lang)}
{/if} {#if completionData.kcalResult}
{completionData.kcalResult.kcal} ± {completionData.kcalResult.kcal - completionData.kcalResult.lower} kcal {t('est_kcal', lang)}
{/if}
{#if completionData.prs.length > 0}

{t('personal_records', lang)}

{#each completionData.prs as pr}
{getExerciseById(pr.exerciseId, lang)?.localName ?? pr.exerciseId} {pr.type}: {pr.value}
{/each}
{/if}

{t('exercises_heading', lang)}

{#each completionData.exerciseSummaries as ex}
{getExerciseById(ex.exerciseId, lang)?.localName ?? ex.exerciseId} {ex.sets} {ex.sets !== 1 ? t('sets', lang) : t('set', lang)}
{#if ex.isCardio} {#if ex.distance > 0} {ex.distance.toFixed(1)} km {/if} {#if ex.duration > 0} {ex.duration} min {/if} {#if ex.pace > 0} {formatPace(ex.pace)} {t('avg', lang)} {/if} {:else} {#if ex.tonnage > 0} {ex.tonnage >= 1000 ? `${(ex.tonnage / 1000).toFixed(1)}t` : `${Math.round(ex.tonnage)} kg`} {t('volume', lang)} {/if} {#if ex.bestWeight > 0} Top: {ex.bestWeight} kg {/if} {#if ex.bestEst1rm > 0} e1RM: {ex.bestEst1rm} kg {/if} {/if}
{/each}
{#if templateDiffs.length > 0}
{#if templateUpdateStatus === 'done'}
{t('template_updated', lang)}
{:else}

{t('update_template', lang)}

{t('template_diff_desc', lang)}

{#each templateDiffs as diff}
{diff.name}
{#each diff.newSets as set, i} {@const old = diff.oldSets[i]}
{#if old} {old.weight ?? '—'} kg × {old.reps ?? '—'} {/if} {set.weight ?? '—'} kg × {set.reps ?? '—'}
{/each} {#if diff.newSets.length > diff.oldSets.length}
+{diff.newSets.length - diff.oldSets.length} {diff.newSets.length - diff.oldSets.length > 1 ? t('new_sets_added', lang) : t('new_set_added', lang)}
{/if}
{/each}
{/if}
{/if}
{:else if workout.active && workout.mode === 'gps'}
{#if gpsStarted}
{gps.distance.toFixed(2)} km
{formatElapsed(workout.elapsedSeconds)} time
{#if gps.currentPace > 0}
{Math.floor(gps.currentPace)}:{Math.round((gps.currentPace % 1) * 60).toString().padStart(2, '0')} /km
{/if}
{#if vgEnabled}
Voice: every {vgTriggerValue} {vgTriggerType === 'distance' ? 'km' : 'min'}
{/if}
{#if workout.paused} {/if}
{:else}
{#if showActivityPicker}
{#each GPS_ACTIVITIES as act (act.id)} {/each}
{/if} {#if showAudioPanel}
{#if !gps.hasTtsEngine()}
No text-to-speech engine installed.
{:else} {#if vgEnabled}
Announce every
Metrics
{#each availableMetrics as m (m.id)} {/each}
Language
{/if} {/if}
{/if} {/if}
{:else if workout.active}
{ nameEditing = true; }} onblur={() => { nameEditing = false; workout.name = nameInput; }} onkeydown={(e) => { if (e.key === 'Enter') e.target.blur(); }} placeholder={t('workout_name_placeholder', lang)} /> {#if gps.available && hasCardioExercise()}
{#if gpsToggling}
{t('initializing_gps', lang) ?? 'Initializing GPS…'}
{/if} {#if !useGps} {#if vgShowPanel}
{#if !gps.hasTtsEngine()}
No text-to-speech engine installed.
{:else} {#if vgEnabled}
Announce every
Metrics
{#each availableMetrics as m (m.id)} {/each}
Language
{/if} {/if}
{/if} {/if} {#if useGps}
{gps.distance.toFixed(2)} km {#if gps.currentPace > 0} {Math.floor(gps.currentPace)}:{Math.round((gps.currentPace % 1) * 60).toString().padStart(2, '0')} /km {/if} {gps.track.length} pts
{#if vgEnabled}
Voice: every {vgTriggerValue} {vgTriggerType === 'distance' ? 'km' : 'min'}
{/if}
{/if}
{/if} {#each workout.exercises as ex, exIdx (exIdx)}
workout.adjustRestTimer(delta)} onRestSkip={cancelRest} onUpdate={(setIdx, d) => workout.updateSet(exIdx, setIdx, d)} onToggleComplete={(setIdx) => { workout.toggleSetComplete(exIdx, setIdx); if (ex.sets[setIdx]?.completed) { workout.startRestTimer(ex.restTime, exIdx, setIdx); } }} onRemove={(setIdx) => workout.removeSet(exIdx, setIdx)} />
{/each}
{formatElapsed(workout.elapsedSeconds)}
{/if} {#if showPicker} showPicker = false} /> {/if}