Spinner.vue 1.15 KB
<script setup>
/**
 * Spinner —— 加载指示器。用 currentColor 画,跟着上下文文字颜色走。
 *
 * @typedef {'sm'|'md'|'lg'} SpinnerSize
 */

defineProps({
  /** @type {import('vue').PropType<SpinnerSize>} 尺寸。 */
  size: { type: String, default: 'md' },
  /** 无障碍标签(读屏播报的加载文案)。 */
  label: { type: String, default: 'Loading' },
})
</script>

<template>
  <span
    class="drama-spinner"
    :class="`drama-spinner--${size}`"
    role="status"
    :aria-label="label"
  />
</template>

<style scoped>
.drama-spinner {
  display: inline-block;
  border: 2px solid currentColor;
  border-top-color: transparent;
  border-radius: var(--drama-radius-full);
  color: var(--drama-color-primary);
  animation: drama-spinner-spin 0.6s linear infinite;
}

.drama-spinner--sm {
  width: var(--drama-space-md);
  height: var(--drama-space-md);
}

.drama-spinner--md {
  width: var(--drama-space-lg);
  height: var(--drama-space-lg);
}

.drama-spinner--lg {
  width: var(--drama-space-2xl);
  height: var(--drama-space-2xl);
  border-width: 3px;
}

@keyframes drama-spinner-spin {
  to {
    transform: rotate(360deg);
  }
}
</style>