jws-frontend/src/components/StatCardComponent.vue

176 lines
3.3 KiB
Vue
Raw Normal View History

<script setup lang="ts">
import { Icon } from '@iconify/vue/dist/iconify.js';
const props = withDefaults(
defineProps<{
branch: {
2024-10-07 16:58:45 +07:00
hidden?: boolean;
icon: string;
count: number;
label: string;
2024-07-05 16:29:06 +07:00
color:
| 'pink'
| 'purple'
| 'green'
| 'orange'
2024-11-07 14:20:50 +07:00
| 'dark-orange'
2024-07-05 16:29:06 +07:00
| 'cyan'
| 'yellow'
2025-01-22 14:03:14 +07:00
| 'light-yellow'
2024-07-05 16:29:06 +07:00
| 'red'
2024-09-06 11:35:08 +07:00
| 'magenta'
| 'blue'
| 'lime'
| 'light-purple'
| 'light-green'
| 'gray';
}[];
dark?: boolean;
textSize?: string;
2024-04-23 14:43:00 +07:00
labelI18n?: boolean;
}>(),
{
2024-04-23 14:43:00 +07:00
labelI18n: false,
textSize: '12px',
},
);
</script>
<template>
2024-07-04 14:27:35 +07:00
<div class="row no-wrap" style="gap: var(--size-4)" :class="{ dark }">
2024-07-04 13:16:19 +07:00
<div
2024-10-07 16:58:45 +07:00
v-for="v in branch.filter((v) => !v.hidden)"
2024-07-04 14:44:52 +07:00
class="no-padding stat-card"
2024-04-23 14:20:08 +07:00
:class="{ [`stat-card__${v.color}`]: true }"
2024-07-04 11:00:03 +07:00
:key="v.label"
>
2024-07-04 13:16:19 +07:00
<div class="stat-card__content row items-center q-pa-sm">
<div class="col-4 text-center">
2025-01-22 14:03:14 +07:00
<q-avatar size="lg" style="background-color: hsla(0 0% 100% /0.2)">
<Icon :icon="v.icon" width="24px" />
</q-avatar>
</div>
<div class="col-6 justify-center column">
<div
class="col-6 ellipsis text-bold text-caption"
style="width: 100%"
>
<span :style="`font-size: ${textSize}`">
{{ labelI18n ? $t(v.label) : v.label }}
</span>
<q-tooltip
anchor="top middle"
self="bottom middle"
:offset="[10, 10]"
>
{{ labelI18n ? $t(v.label) : v.label }}
</q-tooltip>
</div>
<div class="col-6">{{ v.count }}</div>
</div>
</div>
2024-07-04 13:16:19 +07:00
</div>
</div>
</template>
<style scoped>
2024-04-23 14:20:08 +07:00
.stat-card {
2024-07-04 13:16:19 +07:00
border-radius: var(--radius-2);
overflow: hidden;
2024-07-04 14:44:52 +07:00
box-shadow: var(--shadow-2);
2024-04-23 14:20:08 +07:00
}
.stat-card__content {
z-index: 2;
color: hsla(var(--gray-0-hsl) / 1);
background: hsla(var(--_color) / 1);
height: 100%;
2024-07-03 14:16:33 +07:00
min-width: 200px;
}
2024-04-23 14:20:08 +07:00
.stat-card__purple {
--_color: var(--violet-11-hsl);
}
2024-04-23 14:20:08 +07:00
.stat-card__pink {
--_color: var(--pink-6-hsl);
}
2024-04-11 09:43:09 +07:00
2024-04-23 14:20:08 +07:00
.stat-card__green {
--_color: var(--teal-10-hsl);
2024-04-23 13:03:12 +07:00
}
2024-07-05 16:29:06 +07:00
.stat-card__cyan {
--_color: var(--cyan-7-hsl);
}
.stat-card__red {
--_color: var(--red-6-hsl);
}
.stat-card__yellow {
--_color: var(--orange-4-hsl);
}
2025-01-22 14:03:14 +07:00
.stat-card__light-yellow {
--_color: var(--yellow-6-hsl);
}
.stat-card__orange {
--_color: var(--orange-5-hsl);
}
2024-11-07 14:20:50 +07:00
.stat-card__dark-orange {
--_color: var(--orange-10-hsl);
}
2024-07-05 16:29:06 +07:00
.stat-card__magenta {
--_color: var(--pink-8-hsl);
}
.stat-card__lime {
--_color: var(--jungle-8-hsl);
}
.stat-card__light-green {
--_color: var(--green-8-hsl);
}
.stat-card__light-purple {
--_color: var(--purple-7-hsl);
}
2024-09-06 11:35:08 +07:00
.stat-card__blue {
--_color: var(--blue-6-hsl);
}
.stat-card__gray {
--_color: var(--gray-6-hsl);
}
2024-04-23 14:20:08 +07:00
.dark .stat-card__purple {
--_color: var(--violet-10-hsl);
2024-04-11 09:43:09 +07:00
}
2024-04-23 13:03:12 +07:00
2024-04-23 14:20:08 +07:00
.dark .stat-card__green {
--_color: var(--teal-8-hsl);
2024-04-23 13:03:12 +07:00
}
.dark .stat-card__orange {
2024-07-04 15:22:59 +07:00
--_color: var(--orange-6-hsl);
}
2024-07-05 16:29:06 +07:00
2024-11-07 14:20:50 +07:00
.dark.stat-card__dark-orange {
--_color: var(--orange-11-hsl);
}
2024-07-05 16:29:06 +07:00
.dark .stat-card__magenta {
--_color: var(--pink-7-hsl);
}
2024-09-06 11:35:08 +07:00
.dark .stat-card__blue {
--_color: var(--blue-10-hsl);
}
</style>