${maneuverIcon}
${distance}
${instruction}
${this.formatDistance(this.state.distanceRemaining)} remaining
•
${this.formatDuration(this.state.timeRemaining)}
${this.state.isOffRoute ? html`
Off route - recalculating...
` : ''}
`;
}
// ─── Formatting Utilities ───────────────────────────────────────────────────
/**
* Format distance for display
*/
private formatDistance(meters: number): string {
if (meters < 1000) {
return `${Math.round(meters)} m`;
}
return `${(meters / 1000).toFixed(1)} km`;
}
/**
* Format duration for display
*/
private formatDuration(seconds: number): string {
if (seconds < 60) {
return `${Math.round(seconds)} sec`;
}
if (seconds < 3600) {
return `${Math.round(seconds / 60)} min`;
}
const hours = Math.floor(seconds / 3600);
const mins = Math.round((seconds % 3600) / 60);
return mins > 0 ? `${hours} hr ${mins} min` : `${hours} hr`;
}
/**
* Get maneuver icon
*/
private getManeuverIcon(type?: string, modifier?: string): string {
if (!type) return '➡';
const icons: Record