55 lines
1.1 KiB
Vue
55 lines
1.1 KiB
Vue
<template>
|
|
<div class="root">
|
|
<div class="mb-2 label" :class="labelClass">{{ label }}</div>
|
|
<slot>
|
|
<h3 class="value m-0 d-block d-sm-flex align-items-baseline" :class="valueClass">
|
|
<AnimatedNumber v-if="valueFmt" :to="value" :format="valueFmt" />
|
|
<span v-else>{{ value }}</span>
|
|
<div v-if="extraValue" class="extraValue ms-0 ms-sm-1 text-nowrap">
|
|
{{ extraValue }}
|
|
</div>
|
|
</h3>
|
|
</slot>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import AnimatedNumber from "./AnimatedNumber.vue";
|
|
|
|
export default {
|
|
name: "LabelAndValue",
|
|
components: { AnimatedNumber },
|
|
props: {
|
|
label: String,
|
|
value: [Number, String],
|
|
valueFmt: Function,
|
|
extraValue: String,
|
|
align: { type: String, default: "center" },
|
|
},
|
|
computed: {
|
|
labelClass() {
|
|
return `text-${this.align}`;
|
|
},
|
|
valueClass() {
|
|
return `justify-content-${this.align}`;
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
<style scoped>
|
|
.root {
|
|
margin-bottom: 1rem;
|
|
}
|
|
.label {
|
|
text-transform: uppercase;
|
|
color: var(--evcc-gray);
|
|
font-size: 14px;
|
|
}
|
|
.value {
|
|
font-size: 18px;
|
|
}
|
|
.extraValue {
|
|
color: var(--evcc-gray);
|
|
font-size: 14px;
|
|
}
|
|
</style>
|