Chuyển tới nội dung

Pro đang mở bán trước. Cài đặt mở từ tháng 1/2027. Xem Pro

Component

Spinner

Một cung quay cho thấy việc đang chạy khi không biết lượng: đang tải một danh sách, đang kiểm tra một giá trị. Tên được trình đọc màn hình đọc và không bao giờ hiện.

  • npm: 2 trực tiếp, 3 tổng
  • registry: 2 trực tiếp, 2 tổng

Xem trước

Đang tải

Props

  • size
  • tone
import { Spinner } from "@/components/ui/spinner"

<Spinner label="Đang tải" />

Cách dùng

Khi nào dùng

  • Cho thấy việc đang chạy khi không biết độ dài: đang tải bình luận, đang kiểm tra một giá trị.
  • Một vùng nhỏ hoặc một control đang chờ, đúng chỗ kết quả sẽ hiện.

Khi nào không dùng

  • Việc đã biết lượng, như một lần tải lên. Dùng Progress.
  • Một trang hoặc danh sách mà bạn biết bố cục trong lúc tải. Dùng Skeleton.

Biến thể

size

sm (16px) trong control sm và md; md (20px) trong control lg; lg (24px) khi đứng một mình trong vùng đang tải.

  • Đang tải

    sm

  • Đang tải

    mdmặc định

  • Đang tải

    lg

import { Spinner } from "@/components/ui/spinner"

<Spinner size="sm" label="Đang tải" />
<Spinner label="Đang tải" />
<Spinner size="lg" label="Đang tải" />

tone

secondary trên surface; accent khi spinner là thứ chính trên màn hình; current lấy màu chữ xung quanh, như label bên trong một Button.

  • Đang tải

    secondarymặc định

  • Đang tải

    accent

  • Đang tải

    current

import { Spinner } from "@/components/ui/spinner"

<Spinner label="Đang tải" />
<Spinner tone="accent" label="Đang tải" />
<Spinner tone="current" label="Đang tải" />

Ví dụ

Đang tải một danh sách

Đang tải bình luận
import { Spinner } from "@/components/ui/spinner"

<div className="flex items-center gap-sm text-sm text-text-secondary">
  <Spinner size="sm" label="Đang tải bình luận" />
  <span aria-hidden="true">Đang tải bình luận</span>
</div>

Đứng một mình

lg và accent khi spinner là thứ duy nhất trong vùng.

Đang tải bảng điều khiển
import { Spinner } from "@/components/ui/spinner"

<Spinner size="lg" tone="accent" label="Đang tải bảng điều khiển" />

Nên và không nên

Nên

  • Đặt tên việc đang tải trong label: Đang tải bình luận.
  • Đặt spinner ở chỗ nội dung sẽ xuất hiện, để mắt đã ở đó khi nội dung tới.
  • Dùng tone current bên trong control, để nó lấy màu chữ của control.

Không nên

  • Đừng dùng khi biết lượng việc, như một lần tải lên. Dùng Progress.
  • Đừng dùng cho cả trang hoặc danh sách mà bạn biết bố cục. Dùng Skeleton.
  • Đừng hiện nhiều spinner cho một việc.

Props

TênKiểuGiá trịMặc địnhMô tả
sizeenumsm | md | lgmdsm (16px) trong control sm và md; md (20px) trong control lg; lg (24px) khi đứng một mình trong vùng đang tải.
toneenumsecondary | accent | currentsecondarysecondary trên surface; accent khi spinner là thứ chính trên màn hình; current lấy màu chữ xung quanh, như label bên trong một Button.
labelstring-LoadingViệc gì đang tải, cho trình đọc màn hình: Đang tải bình luận. Không bao giờ hiện.

Cấu tạo

PhầnMô tả
rootHộp inline cỡ icon, dùng màu icon.
iconTabler Loader2: 16px (sm), 20px (md) hoặc 24px (lg). Nó quay khi có motion-safe.
labelChữ giấu khỏi mắt, đặt tên việc đang tải.

Khả năng truy cập

Role: status

  • Root là một vùng status, và label (mặc định Đang tải) là chữ giấu khỏi mắt của vùng. Đặt tên việc đang tải: Đang tải bình luận.
  • Cung chỉ để trang trí (aria-hidden); label mang nghĩa.
  • Nó chỉ quay khi người dùng cho phép chuyển động. Dưới prefers-reduced-motion thì đứng yên, và label vẫn nói việc đang xảy ra.
  • Gỡ spinner khi việc xong, và chỉ chuyển focus tới kết quả nếu người dùng đã yêu cầu việc đó.

Cài đặt

npx werewolf-ui add spinner

Chạy npx werewolf-ui init một lần trong app trước khi thêm component. Init cài token, thêm CSS import và luật cho agent. Add cài component này cùng các dependency và giữ nguyên theme của bạn. Xem Cài đặt để biết yêu cầu và cách cài qua registry.