| | |
| | | <template> |
| | | <div class="kpi-card" :class="{ 'is-alert': alert, 'is-demo': demo }"> |
| | | <div class="kpi-card__label"> |
| | | <span>{{ label }}</span> |
| | | <el-tag v-if="demo" class="kpi-card__badge" type="info" effect="plain" size="small">演示</el-tag> |
| | | </div> |
| | | <div class="kpi-card" :class="{ 'is-alert': alert }"> |
| | | <div class="kpi-card__label" :title="label">{{ label }}</div> |
| | | <div class="kpi-card__value"> |
| | | <cl-number :value="numeric" :fixed="fixed" type="amount" :suffix="suffix" /> |
| | | </div> |
| | | <div v-if="hint" class="kpi-card__hint">{{ hint }}</div> |
| | | <div class="kpi-card__hint" :title="hint || ''">{{ hint || '\u00A0' }}</div> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | fixed?: number; |
| | | hint?: string; |
| | | alert?: boolean; |
| | | /** @deprecated 首页不再展示演示标识,保留 prop 以免调用方报错 */ |
| | | demo?: boolean; |
| | | }>(); |
| | | |
| | |
| | | |
| | | <style lang="scss" scoped> |
| | | .kpi-card { |
| | | padding: 14px 16px; |
| | | box-sizing: border-box; |
| | | display: flex; |
| | | flex-direction: column; |
| | | width: 100%; |
| | | height: 112px; |
| | | padding: 12px 14px; |
| | | border-radius: 12px; |
| | | border: 1px solid var(--el-border-color-extra-light); |
| | | background: var(--el-bg-color); |
| | | color: var(--el-text-color-primary); |
| | | min-height: 96px; |
| | | overflow: hidden; |
| | | |
| | | &__label { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 6px; |
| | | flex-shrink: 0; |
| | | height: 20px; |
| | | line-height: 20px; |
| | | font-size: 13px; |
| | | color: var(--el-text-color-secondary); |
| | | } |
| | | |
| | | &__badge { |
| | | transform: scale(0.92); |
| | | white-space: nowrap; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | } |
| | | |
| | | &__value { |
| | | margin-top: 8px; |
| | | font-size: 26px; |
| | | flex: 1; |
| | | display: flex; |
| | | align-items: center; |
| | | min-height: 0; |
| | | margin: 4px 0; |
| | | font-size: 24px; |
| | | font-weight: 700; |
| | | line-height: 1.2; |
| | | line-height: 1.15; |
| | | color: var(--el-text-color-primary); |
| | | overflow: hidden; |
| | | |
| | | :deep(.cl-number) { |
| | | width: 100%; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | :deep(.cl-number__suffix) { |
| | | margin-left: 4px; |
| | |
| | | } |
| | | |
| | | &__hint { |
| | | margin-top: 8px; |
| | | flex-shrink: 0; |
| | | height: 18px; |
| | | line-height: 18px; |
| | | font-size: 12px; |
| | | color: var(--el-text-color-secondary); |
| | | white-space: nowrap; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | } |
| | | |
| | | &.is-alert { |
| | |
| | | .kpi-card__value { |
| | | color: var(--el-color-danger); |
| | | } |
| | | } |
| | | |
| | | &.is-demo:not(.is-alert) { |
| | | border-style: dashed; |
| | | } |
| | | } |
| | | </style> |