Fixed up sensor cards

This commit is contained in:
2026-06-24 23:32:45 -04:00
parent 8bece21ddb
commit 08319ce277
12 changed files with 717 additions and 139 deletions
+46 -71
View File
@@ -1,20 +1,10 @@
<script setup lang="ts">
import Loading from '@/components/Loading.vue';
import {onMounted, ref} from 'vue';
import {inject, onMounted, ref} from 'vue';
import {api} from '../services/api';
const data = ref<any>();
function dir(deg: number) {
if(deg > 22.5 && deg <= 67.5) return 'NE';
if(deg > 67.5 && deg <= 112.5) return 'E';
if(deg > 112.5 && deg <= 157.5) return 'SE';
if(deg > 157.5 && deg <= 202.5) return 'S';
if(deg > 202.5 && deg <= 247.5) return 'SW';
if(deg > 247.5 && deg <= 292.5) return 'W';
if(deg > 292.5 && deg <= 337.5) return 'NW';
return 'N';
}
const openGraph = inject<(key: string) => void>('openGraph');
onMounted(async () => {
data.value = await api.current();
@@ -32,93 +22,57 @@ onMounted(async () => {
flex-direction: column;
gap: 12px;
}
.today-header {
display: flex;
align-items: center;
gap: 12px;
}
.today-icon {
width: 52px;
height: 52px;
object-fit: contain;
flex-shrink: 0;
}
.today-title {
flex: 1;
min-width: 0;
}
.today-date {
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--text-muted);
}
.today-label {
font-size: 12px;
font-weight: 600;
color: var(--text-muted);
}
.hi-lo {
display: flex;
gap: 8px;
font-size: 15px;
font-weight: 600;
margin-top: 2px;
.hi { color: var(--text); }
.lo { color: var(--text-muted); font-weight: 400; }
}
.divider {
height: 1px;
background: var(--border);
}
.stat-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(90px, 1fr));
gap: 10px;
}
.stat {
display: flex;
flex-direction: column;
gap: 2px;
cursor: pointer;
border-radius: 8px;
padding: 4px 6px;
margin: -4px -6px;
transition: background 0.15s;
&:hover { background: var(--hover); }
}
.stat-label {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--text-muted);
}
.stat-value {
font-size: 14px;
font-weight: 600;
color: var(--text);
}
.stat-sub {
font-size: 11px;
color: var(--text-muted);
}
.section-label {
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--text-muted);
margin-bottom: -4px;
}
</style>
<template>
@@ -150,34 +104,55 @@ onMounted(async () => {
<div class="divider" />
<div class="stat-grid">
<div class="stat">
<span class="stat-label">Precipitation</span>
<div class="stat" @click="openGraph?.('heat_index')">
<span class="stat-label">Feels Like</span>
<div v-if="!data" class="w-100 pos-rel br-2 overflow-hidden" style="height: 1.75em"><Loading/></div>
<span v-else class="stat-value">{{ data.raining == 'False' ? (data.precipitation_chance + '%') : (data.percipitation > 0 ? data.precipitation.toFixed(1) + 'mm' : 'Spitting')}}</span>
<span v-else class="stat-value">{{ ~~(data.heat_index) }}°C</span>
</div>
<div class="stat">
<div class="stat" @click="openGraph?.('humidity')">
<span class="stat-label">Humidity</span>
<div v-if="!data" class="w-100 pos-rel br-2 overflow-hidden" style="height: 1.75em"><Loading/></div>
<span v-else class="stat-value">{{ Math.round(data.humidity) }}%</span>
<span v-else class="stat-value">{{ Math.round(data.humidity) }}% <span class="fg-muted">({{ data.humidity_abs.toFixed(2) }})</span></span>
</div>
<div class="stat">
<span class="stat-label">Wind</span>
<div class="stat" @click="openGraph?.('clouds')">
<span class="stat-label">Cloud Cover</span>
<div v-if="!data" class="w-100 pos-rel br-2 overflow-hidden" style="height: 1.75em"><Loading/></div>
<span v-else class="stat-value">{{ data.wind_gusts }} Kph <span class="fg-muted">({{ dir(data.wind_direction) }})</span></span>
<span v-else class="stat-value">{{ Math.round(data.clouds) }}%</span>
</div>
<div class="stat">
<span class="stat-label">Clouds</span>
<div v-if="!data" class="w-100 pos-rel br-2 overflow-hidden" style="height: 1.75em"><Loading/></div>
<span v-else class="stat-value">{{ Math.round(data.clouds) }}%</span></div>
<div class="stat">
<div class="stat" @click="openGraph?.('air_quality')">
<span class="stat-label">Air Quality</span>
<div v-if="!data" class="w-100 pos-rel br-2 overflow-hidden" style="height: 1.75em"><Loading/></div>
<span v-else class="stat-value">{{ data.air_quality }} <span class="fg-muted">({{data.air_quality_label}})</span></span>
<span v-else class="stat-value">{{ data.air_quality }} <span class="fg-muted">({{ data.air_quality_label }})</span></span>
</div>
<div class="stat">
<span class="stat-label">UV index</span>
<div class="stat" @click="openGraph?.('air_quality_ohms')">
<span class="stat-label">Gas Resistance</span>
<div v-if="!data" class="w-100 pos-rel br-2 overflow-hidden" style="height: 1.75em"><Loading/></div>
<span v-else class="stat-value">{{ data.uv_index.toFixed(1) }} <span class="fg-muted">({{data.uv_index_label}})</span></span>
<span v-else class="stat-value">{{ data.air_quality_ohms }} <span class="fg-muted">Ω</span></span>
</div>
<div class="stat" @click="openGraph?.('visibility')">
<span class="stat-label">Visibility</span>
<div v-if="!data" class="w-100 pos-rel br-2 overflow-hidden" style="height: 1.75em"><Loading/></div>
<span v-else class="stat-value">{{ data.visibility?.toFixed(1) }} km</span>
</div>
</div>
<div class="divider" />
<div class="stat-grid">
<div class="stat" @click="openGraph?.('pressure_hpa')">
<span class="stat-label">Pressure</span>
<div v-if="!data" class="w-100 pos-rel br-2 overflow-hidden" style="height: 1.75em"><Loading/></div>
<span v-else class="stat-value">{{ data.pressure_hpa?.toFixed(1) }} <span class="fg-muted">({{ (data.pressure_rate > 0 ? '+' : '') + data.pressure_rate }})</span></span>
</div>
<div class="stat" @click="openGraph?.('pressure_slp')">
<span class="stat-label">Sea Level</span>
<div v-if="!data" class="w-100 pos-rel br-2 overflow-hidden" style="height: 1.75em"><Loading/></div>
<span v-else class="stat-value">{{ data.pressure_slp?.toFixed(1) }} <span class="fg-muted">({{ data.pressure_trend }})</span></span>
</div>
<div class="stat" @click="openGraph?.('vapor_pressure_deficit')">
<span class="stat-label">VPD KPA</span>
<div v-if="!data" class="w-100 pos-rel br-2 overflow-hidden" style="height: 1.75em"><Loading/></div>
<span v-else class="stat-value">{{ data.vapor_pressure_deficit?.toFixed(2) }}</span>
</div>
</div>
</div>