Badge.vue 2.33 KB
<script setup>
/**
 * Badge —— 状态标签(启用/停用、ok/error/aborted、冷却中……)。文案经 slot 注入。
 * 五个 variant 各自映射到一个语义色 token,底色由该色 mix 出来,不引入新色值。
 *
 * @typedef {'neutral'|'success'|'danger'|'warning'|'info'} BadgeVariant
 * @typedef {'sm'|'md'} BadgeSize
 */

defineProps({
  /** @type {import('vue').PropType<BadgeVariant>} 语义变体。 */
  variant: { type: String, default: 'neutral' },
  /** @type {import('vue').PropType<BadgeSize>} 尺寸。 */
  size: { type: String, default: 'md' },
})
</script>

<template>
  <span
    class="drama-badge"
    :class="[`drama-badge--${variant}`, `drama-badge--${size}`]"
  >
    <slot />
  </span>
</template>

<style scoped>
.drama-badge {
  display: inline-flex;
  align-items: center;
  gap: var(--drama-space-xs);
  border: 1px solid transparent;
  border-radius: var(--drama-radius-full);
  font-family: var(--drama-font-family-body);
  font-weight: var(--drama-font-weight-medium);
  line-height: 1;
  white-space: nowrap;
}

.drama-badge--sm {
  padding: var(--drama-space-xs) var(--drama-space-sm);
  font-size: var(--drama-font-size-xs);
}

.drama-badge--md {
  padding: var(--drama-space-xs) var(--drama-space-md);
  font-size: var(--drama-font-size-sm);
}

.drama-badge--neutral {
  background-color: var(--drama-color-surface-alt);
  border-color: var(--drama-color-border);
  color: var(--drama-color-text-muted);
}

.drama-badge--success {
  background-color: color-mix(in srgb, var(--drama-color-success) 16%, transparent);
  border-color: color-mix(in srgb, var(--drama-color-success) 45%, transparent);
  color: var(--drama-color-success);
}

.drama-badge--danger {
  background-color: color-mix(in srgb, var(--drama-color-danger) 16%, transparent);
  border-color: color-mix(in srgb, var(--drama-color-danger) 45%, transparent);
  color: var(--drama-color-danger);
}

.drama-badge--warning {
  background-color: color-mix(in srgb, var(--drama-color-warning) 16%, transparent);
  border-color: color-mix(in srgb, var(--drama-color-warning) 45%, transparent);
  color: var(--drama-color-warning);
}

.drama-badge--info {
  background-color: color-mix(in srgb, var(--drama-color-info) 16%, transparent);
  border-color: color-mix(in srgb, var(--drama-color-info) 45%, transparent);
  color: var(--drama-color-info);
}
</style>