qa1145's picture
Upload 1245 files
8ede856 verified
<template>
<v-card elevation="1" class="stat-card message-card">
<v-card-text>
<div class="d-flex align-start">
<div class="icon-wrapper">
<v-icon icon="mdi-message-text-outline" size="24"></v-icon>
</div>
<div class="stat-content">
<div class="stat-title">{{ t('stats.totalMessage.title') }}</div>
<div class="stat-value-wrapper">
<h2 class="stat-value">{{ formattedCount }}</h2>
<v-chip v-if="stat.daily_increase" class="trend-chip" size="x-small" color="success">
+{{ stat.daily_increase }}
</v-chip>
</div>
<div class="stat-subtitle">{{ t('stats.totalMessage.subtitle') }}</div>
</div>
</div>
</v-card-text>
</v-card>
</template>
<script>
import { useModuleI18n } from '@/i18n/composables';
export default {
name: 'TotalMessage',
props: ['stat'],
setup() {
const { tm: t } = useModuleI18n('features/dashboard');
return { t };
},
computed: {
formattedCount() {
const count = this.stat?.message_count;
return count ? count.toLocaleString() : '0';
}
}
};
</script>
<style scoped>
.stat-card {
height: 100%;
transition: transform 0.2s, box-shadow 0.2s;
overflow: hidden;
}
.stat-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08) !important;
}
.message-card {
background-color: #5e35b1;
color: white;
}
.icon-wrapper {
display: flex;
align-items: center;
justify-content: center;
width: 48px;
height: 48px;
border-radius: 8px;
margin-right: 16px;
background: rgba(255, 255, 255, 0.2);
}
.stat-content {
flex: 1;
}
.stat-title {
font-size: 14px;
font-weight: 500;
opacity: 0.9;
margin-bottom: 4px;
}
.stat-value-wrapper {
display: flex;
align-items: baseline;
margin-bottom: 4px;
}
.stat-value {
font-size: 32px;
font-weight: 600;
line-height: 1.2;
margin-right: 8px;
}
.trend-chip {
font-weight: 600;
}
.stat-subtitle {
font-size: 12px;
opacity: 0.7;
}
</style>