Carousel
Carousel trình bày một chuỗi nội dung theo từng slide, điều hướng bằng nút trước / sau, chấm chỉ mục, ảnh thu nhỏ hoặc phím mũi tên.
Import
Cài từ npm, chép mã nguồn vào dự án bằng @yugen-ui/cli hoặc shadcn CLI, hoặc import thẳng khi làm việc trong repo này.
// npm install yugen-uiimport { Carousel, CarouselViewport, CarouselCard, CarouselNavContainer, CarouselThumbnails, CarouselThumbnail,} from "yugen-ui";Biến thể
Mỗi ô là một mẫu độc lập: hover để Copy, hoặc bấm Code để xem mã nguồn.
Peek & vòng lặp
slidesPerView={1.15} lộ 15% slide kế, gap="medium" giãn khoảng cách; loop quay vòng ở hai đầu.
Autoplay có tiến độ
Chấm đang chọn dài ra và đầy dần theo autoplayInterval; rê chuột / focus vào slide hoặc ẩn tab là tạm dừng.
Ảnh thu nhỏ
CarouselThumbnails thay cho chấm: tablist ảnh nhỏ, tự cuộn tới ảnh đang chọn; đặt aria-label từng ảnh.
Cách dùng
- Đặt aria-label cho Carousel; mỗi slide tự có nhãn “Slide x / n”, thumbnail nên có aria-label riêng.
- Giữ 3–6 slide cùng loại; dùng slidesPerView lẻ (1.15, 2.5) để gợi ý còn nội dung phía sau.
- Khi bật autoplay, luôn hiện nút tạm dừng (CarouselNavContainer showAutoplayToggle).
- Không đặt thông tin quan trọng duy nhất trong slide ẩn.
- Không bật autoplay mặc định cho nội dung cần đọc kỹ.
- Không dùng cả chấm và thumbnail cho cùng một Carousel.
Props
| Prop · Kiểu | Mặc định | Mô tả |
|---|---|---|
| loopboolean | Mặc định: false | Quay vòng ở hai đầu. Tên cũ circular đã lỗi thời (bỏ ở 1.0). |
| slidesPerViewnumber | Mặc định: — | Số slide thấy cùng lúc; số lẻ để lộ slide kế (1.15, 2.5). Bỏ trống = 100%. |
| gap"none" | "extra-small" | "small" | "medium" | "large" | "extra-large" | Mặc định: "small" | Khoảng cách giữa các slide (token spacing). Tên ngắn cũ "XS" … "XL" đã lỗi thời (bỏ ở 1.0). |
| autoplay / defaultAutoplay / onAutoplayChangeboolean / boolean / (value) => void | Mặc định: — / false | Tự chạy (controlled / uncontrolled). defaultAutoplay bị bỏ qua khi prefers-reduced-motion. |
| autoplayIntervalnumber | Mặc định: 4000 | Thời gian mỗi slide (ms); tiến độ hiện trong chấm / thumbnail đang chọn. |
| activeIndex / defaultActiveIndex / onActiveIndexChangenumber / number / (index: number) => void | Mặc định: — / 0 | Slide hiện tại, đếm từ 0 (controlled / uncontrolled); gọi khi slide hiện tại thay đổi. |
| CarouselCard | Mặc định: — | basis-full mặc định; basis-4/5 hoặc basis-1/2 khi không dùng slidesPerView. |
| CarouselNavContainer | Mặc định: false | Hiện nút bật / tắt tự chạy. Tên cũ autoplay đã lỗi thời (bỏ ở 1.0). |
| CarouselNavContainer | Mặc định: "Previous slide" / "Next slide" | aria-label cho nút điều hướng. Tên cũ prevLabel đã lỗi thời (bỏ ở 1.0). |
| CarouselThumbnails / CarouselThumbnailHTMLAttributes / ButtonHTMLAttributes | Mặc định: — | Tablist ảnh thu nhỏ; mỗi CarouselThumbnail ứng với slide cùng vị trí. |
Messages
Chữ có sẵn của component: nhãn, aria-label, thông báo cho trình đọc màn hình.
Mặc định là tiếng Anh. Đổi qua prop messages của YugenProvider, theo namespace bên dưới; messagesVi chứa bản tiếng Việt. Xem Ngôn ngữ giao diện.
messages.carousel
| Khoá · Kiểu | Mặc định (tiếng Anh) | messagesVi |
|---|---|---|
| slide(index: number, count: number) => string Tên từng slide / chấm / thumbnail và thông báo slide hiện tại; | Mặc định (tiếng Anh)(index, count) => `Slide ${index} of ${count}` | messagesVi(index, count) => `Slide ${index} / ${count}` |
| roleDescriptionstring aria-roledescription của vùng carousel. | Mặc định (tiếng Anh)"carousel" | messagesVi"carousel" |
| slideRoleDescriptionstring aria-roledescription của từng slide. | Mặc định (tiếng Anh)"slide" | messagesVi"slide" |
| previousstring aria-label nút slide trước. | Mặc định (tiếng Anh)"Previous slide" | messagesVi"Slide trước" |
| nextstring aria-label nút slide sau. | Mặc định (tiếng Anh)"Next slide" | messagesVi"Slide tiếp theo" |
| autoplaystring aria-label nút bật / tắt tự chạy. | Mặc định (tiếng Anh)"Autoplay" | messagesVi"Tự động chạy" |
| chooseSlidestring aria-label dãy chấm / thumbnail (tablist). | Mặc định (tiếng Anh)"Choose slide" | messagesVi"Chọn slide" |