Yugen UI

Calendar

Calendar hiển thị lưới ngày theo tháng để chọn một ngày, nhiều ngày hoặc một khoảng ngày.

Dựng trên react-day-picker v10 với giao diện Fluent: ô ngày 32px bo 4px, hôm nay chữ brand đậm kèm vạch dưới, ngày chọn nền brand, khoảng giữa tint brand-background-2. Mặc định tiếng Việt, tuần bắt đầu Thứ Hai; nhận mọi prop của DayPicker (mode, selected, onSelect, disabled, numberOfMonths…).
Tháng Mười Một 2026

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.

TSX
// npm install yugen-uiimport { Calendar } 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.

Tháng Mười Một 2026

Chọn khoảng

mode="range": ngày đầu / cuối nền brand, khoảng giữa tint brand.

Tháng Mười Một 2026
Số ngày làm việc đã chọn: 0

Nhiều ngày & ngày bị khoá

mode="multiple"; disabled={{ dayOfWeek: [0, 6] }} khoá cuối tuần.

Cách dùng

Nên
  • Dùng Calendar trực tiếp khi lịch là nội dung chính (đặt lịch, chọn khoảng nghỉ).
  • Khoá ngày không hợp lệ bằng disabled thay vì báo lỗi sau khi chọn.
Không nên
  • Không dùng Calendar để nhập ngày sinh xa hiện tại — cho phép gõ hoặc dùng dropdown năm (captionLayout="dropdown").
  • Không hiển thị quá 2 tháng cạnh nhau trên màn hình hẹp.

Props

Prop · KiểuMặc địnhMô tả
mode"single" | "multiple" | "range"Mặc định: —Kiểu chọn.
selected / onSelectDate | Date[] | DateRangeMặc định: —Giá trị theo mode.
requiredbooleanMặc định: falseBấm lại ngày đã chọn không bỏ chọn.
min / maxnumberMặc định: —Số ngày ít nhất / nhiều nhất (multiple), số đêm (range).
disabled / hiddenCalendarMatcher | CalendarMatcher[]Mặc định: —Ngày bị khoá / bị ẩn: Date, Date[], DateRange, { before }, { after }, { dayOfWeek }, hàm (date) => boolean.
modifiers / modifiersClassNamesRecord<string, CalendarMatcher> / Record<string, string>Mặc định: —Nhóm ngày có tên và class cho từng nhóm, vd. { booked: [...] } và { booked: "line-through" }.
month / defaultMonth / onMonthChangeDate / Date / (month: Date) => voidMặc định: —Tháng đang hiện.
startMonth / endMonthDateMặc định: —Giới hạn điều hướng tháng.
numberOfMonthsnumberMặc định: 1Số tháng hiển thị.
captionLayout"label" | "dropdown" | "dropdown-months" | "dropdown-years"Mặc định: "label"Tiêu đề tháng hay hộp chọn tháng / năm.
showOutsideDaysbooleanMặc định: trueHiện ngày của tháng trước / sau (foreground-4).
weekStartsOn0 | 1 | 2 | 3 | 4 | 5 | 6Mặc định: —Ngày đầu tuần (0 = Chủ nhật); mặc định theo locale.
localeCalendarLocaleMặc định: —Locale date-fns, nhập từ react-day-picker/locale; mặc định lấy từ messages.calendar.locale.
timeZonestringMặc định: —Múi giờ IANA, vd. "Asia/Ho_Chi_Minh".
excludeDisabled / resetOnSelectbooleanMặc định: —range: không vắt qua ngày bị khoá / bấm sau khi đủ khoảng thì bắt đầu khoảng mới.
navLayout / hideNavigation / disableNavigation / pagedNavigation / reverseMonths / reverseYears"around" | "after" / booleanMặc định: —Vị trí và hành vi của nút điều hướng tháng.
fixedWeeks / showWeekNumber / ISOWeek / firstWeekContainsDate / hideWeekdays / todayboolean / 1 | 4 / DateMặc định: —Lưới ngày: luôn 6 tuần, số tuần, tuần ISO, tuần đầu năm, ẩn tên thứ, ngày được đánh dấu là hôm nay.
autoFocus / footer / dir / role / id / title / langboolean / ReactNode / stringMặc định: —Focus khi mở, chân lịch, hướng đọc và thuộc tính HTML.
classNames / components / formatters / labelsreact-day-pickerMặc định: —Đã ngừng hỗ trợ: prop của react-day-picker, vẫn được chuyển tiếp nhưng có cảnh báo khi dev và bị bỏ ở 1.0 (#371).

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.calendar

Khoá · KiểuMặc định (tiếng Anh)messagesVi
localeCalendarLocale | undefined

Locale của react-day-picker: tên tháng / thứ, nhãn trợ năng của nút và ô ngày, ngày đầu tuần. Prop locale của Calendar vẫn ưu tiên hơn. undefined dùng locale en-US có sẵn trong react-day-picker.

Mặc định (tiếng Anh)undefinedmessagesVivi