Calendar

گرید تاریخ برای انتخاب تکی، بازه یا چندتایی، روی react-day-picker ساخته شده. پیش‌فرض تقویم میلادی است؛ با calendar="jalali" به گاه‌شماری شمسی (با نام ماه و ارقام فارسی) سوییچ می‌کند، بدون اینکه API انتخاب تاریخ تغییر کند، مقدار selected/onSelect همیشه یک Date جاوااسکریپت استاندارد است.

ری‌اکت ۱۹ و Next.js با پیاده‌سازی دسترس‌پذیری داخلی دیگویو ۳ با Composition API و Reka UISvelte ۵ با runes و Bits UIانگولار با signals و Angular CDK

این کامپوننت فعلاً برای ۱ فریم‌ورک از ۴ فریم‌ورک آماده است.

شمسی (جلالی)

میلادی

این نمونه هنوز برای Vue پورت نشده است؛ آنچه می‌بینید نسخهٔ ری‌اکت است.

این نمونه هنوز برای Svelte پورت نشده است؛ آنچه می‌بینید نسخهٔ ری‌اکت است.

این نمونه هنوز برای Angular پورت نشده است؛ آنچه می‌بینید نسخهٔ ری‌اکت است.

نصب

با CLI اختصاصی dig-ui کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگی‌ها و فایل‌ها خودکار اضافه می‌شوند.

نصب سریع با لینک سخت و دیسک مشترکپکیج‌منیجر پیش‌فرض Node.jsYarn نسخهٔ ۲ به بالا (Berry)رانتایم و پکیج‌منیجر Bun
pnpm dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/calendar.json
npx dig-ui@latest add https://design-system-tau-green.vercel.app/r/calendar.json
yarn dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/calendar.json
bunx --bun dig-ui@latest add https://design-system-tau-green.vercel.app/r/calendar.json

این کامپوننت هنوز برای Vue پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Reka UI در دست کار است.

این کامپوننت هنوز برای Svelte پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Bits UI در دست کار است.

این کامپوننت هنوز برای Angular پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Angular CDK در دست کار است.

استفاده

import { Calendar } from "@/components/ui/calendar"

<Calendar mode="single" selected={date} onSelect={setDate} />

این کامپوننت هنوز برای Vue پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Reka UI در دست کار است.

این کامپوننت هنوز برای Svelte پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Bits UI در دست کار است.

این کامپوننت هنوز برای Angular پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Angular CDK در دست کار است.

ترکیب اجزا

Calendar پوششی روی DayPicker است و دو حالت رندر دارد: calendar="gregorian" (پیش‌فرض) از react-day-picker خود کتابخانه استفاده می‌کند و calendar="jalali" از زیرمسیر react-day-picker/persian که همان گرید را با محاسبات تقویم شمسی می‌کشد. کلاس‌های هر دو حالت مشترک است، پس ظاهر یکسان می‌ماند و فقط اعداد روزها و نام ماه‌ها عوض می‌شود. برای ساخت فیلد تاریخ، Calendar را داخل PopoverContent بگذارید و دکمهٔ باز کننده مقدار انتخاب‌شده را نشان بدهد (نمونهٔ Date Field پایین). سرصفحه به‌طور پیش‌فرض حالت panel دارد: نام ماه و سال دکمه‌اند و با کلیک، فهرست ماه‌ها یا سال‌ها جای شبکهٔ روزها می‌نشیند؛ با دکمهٔ بازگشت یا انتخاب یک مورد، به تقویم برمی‌گردید. در نمایش چندماهه، هر ماه سرصفحهٔ خودش را دارد و کلیک روی هرکدام همان ماه را هدف می‌گیرد. شبکه به اندازهٔ خودِ ماه سطر می‌گیرد (معمولاً پنج سطر) و خانه‌ها مربع‌اند، پس قاب تقویم هم تقریباً مربع می‌ماند نه کشیده. اگر قاب کاملاً ثابت لازم دارید، مثلاً پاپ‌اوری که نباید با عوض شدن ماه بپرد، fixedWeeks را true کنید تا همیشه شش سطر بکشد. روزهای ماه قبل و بعد کم‌رنگ‌تر و نازک‌تر رندر می‌شوند تا با روزهای همین ماه اشتباه نشوند، و روزهای تعطیل قرمزند: پیش‌فرض جمعه‌ها، به‌علاوهٔ هر چه به prop به نام holidays بدهید. در نمایش چندماهه هم ماه‌ها همیشه کنار هم می‌نشینند و کادر به اندازهٔ مجموعشان بزرگ می‌شود.

دسترس‌پذیری

  • گرید با role و aria-label مناسب برای ناوبری صفحه‌کلید ساخته شده؛ Tab به داخل جدول می‌رود و کلیدهای جهت‌نما بین روزها حرکت می‌کنند.
  • فلش‌های ماه قبل/بعد جهت‌آگاه‌اند: در چیدمان rtl فلش راست به ماه قبل و فلش چپ به ماه بعد می‌رود؛ با تغییر dir به ltr خودکار برعکس می‌شود.
  • روزهای غیرفعال (disabled) هم از ناوبری کیبورد و هم از انتخاب موس/لمس کنار گذاشته می‌شوند؛ برای توضیح دلیل غیرفعال بودن (مثلاً روزهای تعطیل) یک راهنمای متنی جدا از خودِ تقویم بگذارید.
  • وقتی Calendar داخل Popover است، فوکوس هنگام باز شدن به گرید می‌رود و با Escape به دکمهٔ باز کننده برمی‌گردد؛ رفتار همان چیزی است که در صفحهٔ Popover مستند شده.
  • قرمزیِ روزهای تعطیل فقط نشانهٔ دیداری است؛ اگر تعطیل بودن روی تصمیم کاربر اثر دارد، همان اطلاعات را در متن کنار تقویم یا در aria-label روز هم بیاورید.
  • نام ماه و سال در سرصفحه دکمه‌اند و با Tab و Enter هم باز می‌شوند؛ در فهرست ماه و سال، مورد فعال با aria-current مشخص است و دکمهٔ بازگشت برچسب دارد.

مرجع API

Calendar

ویژگینوعپیش‌فرضتوضیح
calendar"gregorian" | "jalali""gregorian"گاه‌شماری گرید؛ jalali نام ماه و اعداد را شمسی می‌کند.
mode"single" | "multiple" | "range""single"نوع انتخاب.
selected / onSelectDate | Date[] | DateRangeمقدار انتخاب‌شده و رویداد تغییر آن؛ شکلش به mode بستگی دارد.
disabledMatcher | Matcher[]روزهای غیرقابل‌انتخاب (تابع، بازه، dayOfWeek، آرایهٔ تاریخ).
defaultMonthDateماهی که هنگام باز شدن نشان داده می‌شود؛ اگر ندهید، ماه امروز.
startMonth / endMonthDateکران‌های ناوبری؛ در حالت کشویی بازهٔ سال‌های فهرست را هم تعیین می‌کنند.
numberOfMonthsnumber1تعداد ماه‌هایی که کنار هم نشان داده می‌شود.
showOutsideDaysbooleantrueنمایش روزهای ماه قبل و بعد در خانه‌های خالی.
showWeekNumberbooleanfalseستون شمارهٔ هفته در ابتدای شبکه.
dir"rtl" | "ltr"calendar === "jalali" ? "rtl" : "ltr"جهت گرید و فلش‌های ناوبری ماه؛ پیش‌فرض خودش را از calendar می‌گیرد (شمسی راست‌به‌چپ، میلادی چپ‌به‌راست) مگر صریح بدهید.
captionLayout"panel" | "label" | "dropdown" | "dropdown-months" | "dropdown-years""panel"panel یعنی نام ماه و سال دکمه‌اند و فهرستشان جای تقویم می‌آید؛ label فقط متن است و dropdown* منوی بومی مرورگر.
fixedWeeksbooleanfalseبا true همیشه شش سطر می‌کشد تا ارتفاع قاب با عوض شدن ماه نپرد؛ پیش‌فرض سطرهای واقعی ماه است تا تقویم کوتاه‌تر بماند.
holidaysMatcher | Matcher[]روزهای تعطیل رسمی؛ قرمز می‌شوند ولی قابل انتخاب می‌مانند. برای بستنشان از disabled استفاده کنید.
weekendnumber[] | false[5]روزهای آخر هفته که قرمز می‌شوند (۰ یکشنبه تا ۶ شنبه)؛ پیش‌فرض جمعه. با false خاموش می‌شود.
buttonVariantButtonProps["variant"]"ghost"واریانت دکمه‌های قبلی/بعدی ماه.
className / classNamesstring / Partial<ClassNames>کلاس ریشه، و بازنویسی کلاس هر بخش داخلی (month، weekday، day، today و…).

CalendarDayButton

دکمهٔ یک روز. اگر خواستید محتوای خانه را عوض کنید، مثلاً نقطهٔ رویداد زیر عدد، همین را با prop به نام components جایگزین کنید.

ویژگینوعپیش‌فرضتوضیح
dayCalendarDayشیء روز؛ day.date همان تاریخ استاندارد جاوااسکریپت است.
modifiersModifiersوضعیت روز: selected، today، outside، disabled، range_start، range_middle و range_end.

این کامپوننت هنوز برای Vue پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Reka UI در دست کار است.

این کامپوننت هنوز برای Svelte پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Bits UI در دست کار است.

این کامپوننت هنوز برای Angular پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک روی Angular CDK در دست کار است.