Stat.vue 1.62 KB
<script setup>
/** 看板指标卡。值已格式化,组件不做格式化;tone 由调用方按样本量决定。 */

defineProps({
  /** 指标名。 */
  label: { type: String, required: true },
  /** 已经格式化好的值。组件不做格式化 —— 千分位、¥、ms 的规则在页面侧。 */
  value: { type: [String, Number], required: true },
  /** 语义色。默认不染色。 */
  tone: {
    type: String,
    default: 'neutral',
    validator: (v) => ['neutral', 'success', 'warning', 'danger'].includes(v),
  },
})
</script>

<template>
  <div :class="['drama-stat', `is-${tone}`]">
    <span class="drama-stat__label">{{ label }}</span>
    <span class="drama-stat__value">{{ value }}</span>
  </div>
</template>

<style scoped>
.drama-stat {
  display: flex;
  flex-direction: column;
  gap: var(--drama-space-xs);
  padding: var(--drama-space-lg);
  background-color: var(--drama-color-surface-alt);
  border-radius: var(--drama-radius-md);
}

.drama-stat__label {
  color: var(--drama-color-text-muted);
  font-size: var(--drama-font-size-xs);
  line-height: var(--drama-line-height-tight);
}

.drama-stat__value {
  color: var(--drama-color-text);
  font-family: var(--drama-font-family-mono);
  font-size: var(--drama-font-size-lg);
  font-weight: var(--drama-font-weight-medium);
  line-height: var(--drama-line-height-tight);
  font-variant-numeric: tabular-nums;
}

.drama-stat.is-success .drama-stat__value {
  color: var(--drama-color-success);
}

.drama-stat.is-warning .drama-stat__value {
  color: var(--drama-color-warning);
}

.drama-stat.is-danger .drama-stat__value {
  color: var(--drama-color-danger);
}
</style>