|
<script lang="ts"> |
|
import { onMount } from 'svelte'; |
|
import { getOrCreateGameState } from '$lib/db/gameState'; |
|
import type { GameState } from '$lib/db/schema'; |
|
|
|
let gameState: GameState | null = $state(null); |
|
|
|
|
|
const progressColor = $derived(getProgressColor(gameState?.progressPoints || 0)); |
|
|
|
function getProgressColor(points: number): string { |
|
const progress = points / 1000; |
|
if (progress < 0.2) return '#4caf50'; |
|
if (progress < 0.4) return '#ffc107'; |
|
if (progress < 0.6) return '#ff9800'; |
|
if (progress < 0.8) return '#f44336'; |
|
return '#9c27b0'; |
|
} |
|
|
|
onMount(async () => { |
|
|
|
gameState = await getOrCreateGameState(); |
|
|
|
|
|
const interval = setInterval(async () => { |
|
gameState = await getOrCreateGameState(); |
|
}, 5000); |
|
|
|
return () => clearInterval(interval); |
|
}); |
|
</script> |
|
|
|
{#if gameState} |
|
<div class="progress-container"> |
|
<div class="progress-bar"> |
|
<div class="progress-fill" style="width: {(gameState.progressPoints / 1000) * 100}%; background-color: {progressColor}"></div> |
|
</div> |
|
<span class="progress-stats">π₯ {gameState.trainersDefeated} π· {gameState.picletsCapured}</span> |
|
</div> |
|
{/if} |
|
|
|
<style> |
|
.progress-container { |
|
display: flex; |
|
align-items: center; |
|
gap: 0.75rem; |
|
padding: 0.4rem 1rem; |
|
padding-top: env(safe-area-inset-top); |
|
background: white; |
|
border-bottom: 1px solid #f0f0f0; |
|
} |
|
|
|
@media (max-width: 768px) { |
|
.progress-container { |
|
padding: 0.3rem 1rem; |
|
padding-top: env(safe-area-inset-top); |
|
} |
|
} |
|
|
|
.progress-bar { |
|
margin-top: 5px; |
|
flex: 1; |
|
background: #f0f0f0; |
|
height: 6px; |
|
border-radius: 3px; |
|
overflow: hidden; |
|
} |
|
|
|
.progress-fill { |
|
height: 100%; |
|
transition: width 0.8s ease; |
|
} |
|
|
|
.progress-stats { |
|
font-size: 0.875rem; |
|
color: #666; |
|
font-weight: 500; |
|
white-space: nowrap; |
|
} |
|
</style> |