mirror of
https://github.com/KevinMidboe/hivemonitor.git
synced 2025-10-29 17:40:25 +00:00
Display tiles for showing a summarized view on first modal tab
This commit is contained in:
71
src/lib/components/Display.svelte
Normal file
71
src/lib/components/Display.svelte
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
let expand: boolean;
|
||||||
|
|
||||||
|
const toggle = () => (expand = !expand);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class={`display ${expand ? 'expanded' : ''}`}
|
||||||
|
on:click={toggle}
|
||||||
|
on:keyup={(e) => e?.code === 'Enter' && toggle()}
|
||||||
|
role="button"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<div class="icon">
|
||||||
|
<slot name="icon" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<b class="title"><slot name="title" /></b>
|
||||||
|
|
||||||
|
<span class="value"><slot name="value" /></span>
|
||||||
|
|
||||||
|
{#if $$slots.change != null}
|
||||||
|
<span class="change"><slot name="change" /></span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{#if expand}
|
||||||
|
<div class="expanded">
|
||||||
|
<p>
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut
|
||||||
|
labore et dolore magna aliqua. Ut enim ad minim veniam.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.display {
|
||||||
|
padding: 1rem;
|
||||||
|
width: calc(100% - 2rem);
|
||||||
|
// border: 2px solid var(--highlight);
|
||||||
|
background-color: var(--highlight);
|
||||||
|
border-radius: 1rem;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 1s ease;
|
||||||
|
user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
|
||||||
|
> * {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 0.66rem;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
:last-child {
|
||||||
|
margin-bottom: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
width: 1.5rem;
|
||||||
|
height: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.value {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.change {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
18
src/lib/components/displays/BatteryDisplay.svelte
Normal file
18
src/lib/components/displays/BatteryDisplay.svelte
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import Display from "$lib/components/Display.svelte";
|
||||||
|
import BatteryIcon from "$lib/icons/Battery.svelte";
|
||||||
|
import { formatBattery } from "$lib/telemetryFormatters";
|
||||||
|
|
||||||
|
export let battery: string | undefined = undefined;
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Display>
|
||||||
|
<BatteryIcon slot="icon" />
|
||||||
|
|
||||||
|
<span slot="title">Battery</span>
|
||||||
|
<span slot="value">{ formatBattery(battery) }% remaining</span>
|
||||||
|
</Display>
|
||||||
|
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
</style>
|
||||||
20
src/lib/components/displays/HumidityDisplay.svelte
Normal file
20
src/lib/components/displays/HumidityDisplay.svelte
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import Display from "$lib/components/Display.svelte";
|
||||||
|
import HumidityIcon from "$lib/icons/humidity.svelte";
|
||||||
|
import { formatHumidity } from "$lib/telemetryFormatters";
|
||||||
|
|
||||||
|
export let humidity: string | undefined = undefined
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Display>
|
||||||
|
<HumidityIcon slot="icon" />
|
||||||
|
|
||||||
|
<span slot="title">Humidity</span>
|
||||||
|
<span slot="value">{ formatHumidity(humidity) }%</span>
|
||||||
|
<span slot="change">Min 24 - Max 48</span>
|
||||||
|
</Display>
|
||||||
|
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
|
||||||
|
</style>
|
||||||
18
src/lib/components/displays/QueenDisplay.svelte
Normal file
18
src/lib/components/displays/QueenDisplay.svelte
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import Display from "$lib/components/Display.svelte";
|
||||||
|
import CrownIcon from "$lib/icons/crown.svelte";
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Display>
|
||||||
|
<CrownIcon slot="icon" />
|
||||||
|
|
||||||
|
<span slot="title">Resident Queen</span>
|
||||||
|
<span slot="value">Elisabeth</span>
|
||||||
|
<span slot="change">Age 453 days</span>
|
||||||
|
</Display>
|
||||||
|
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
|
||||||
|
</style>
|
||||||
33
src/lib/components/displays/SyncDisplay.svelte
Normal file
33
src/lib/components/displays/SyncDisplay.svelte
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import Display from "$lib/components/Display.svelte";
|
||||||
|
import SyncIcon from "$lib/icons/Sync.svelte";
|
||||||
|
import { diffTime } from "$lib/telemetryFormatters";
|
||||||
|
|
||||||
|
export let date: string | undefined = undefined
|
||||||
|
|
||||||
|
let interval: number;
|
||||||
|
let sinceUpdate: number;
|
||||||
|
|
||||||
|
function resetInterval() {
|
||||||
|
if (interval) clearInterval(interval);
|
||||||
|
|
||||||
|
interval = setInterval(() => (sinceUpdate = Math.floor(sinceUpdate + 1)), 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
$: {
|
||||||
|
sinceUpdate = diffTime(date);
|
||||||
|
resetInterval()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Display>
|
||||||
|
<SyncIcon slot="icon" />
|
||||||
|
|
||||||
|
<span slot="title">Last synced</span>
|
||||||
|
<span slot="value">{ sinceUpdate }s ago</span>
|
||||||
|
</Display>
|
||||||
|
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
|
||||||
|
</style>
|
||||||
22
src/lib/components/displays/TemperatureDisplay.svelte
Normal file
22
src/lib/components/displays/TemperatureDisplay.svelte
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import Display from "$lib/components/Display.svelte";
|
||||||
|
import ThermometerIcon from "$lib/icons/thermometer.svelte";
|
||||||
|
import { formatTemperature } from "$lib/telemetryFormatters";
|
||||||
|
|
||||||
|
export let temperature: string | undefined = undefined
|
||||||
|
export let change: string | null = '';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Display>
|
||||||
|
<ThermometerIcon slot="icon" />
|
||||||
|
|
||||||
|
<span slot="title">Temperature</span>
|
||||||
|
<span slot="value">{ formatTemperature(temperature) }°C</span>
|
||||||
|
|
||||||
|
<span slot="change">{change}</span>
|
||||||
|
</Display>
|
||||||
|
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
|
||||||
|
</style>
|
||||||
19
src/lib/components/displays/WeightDisplay.svelte
Normal file
19
src/lib/components/displays/WeightDisplay.svelte
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import Display from "$lib/components/Display.svelte";
|
||||||
|
import WeightIcon from "$lib/icons/weight.svelte";
|
||||||
|
import { formatWeight } from "$lib/telemetryFormatters";
|
||||||
|
|
||||||
|
export let weight: string | undefined = undefined
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Display>
|
||||||
|
<WeightIcon slot="icon" />
|
||||||
|
|
||||||
|
<span slot="title">Weight</span>
|
||||||
|
<span slot="value">{ formatWeight(weight) }kg</span>
|
||||||
|
<span slot="change">Min 22.4 - Max 24.4</span>
|
||||||
|
</Display>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
|
||||||
|
</style>
|
||||||
Reference in New Issue
Block a user