@akhatmirzo/ui

DatePicker

Sana va sanalar oralig'ini tanlash: qo'lda yozish, o'zbekcha kalendar, tayyor variantlar.

Yakshanba — dam olish kuni

Import

import { Calendar, DatePicker, DateRangePicker } from '@akhatmirzo/ui';

Uchta komponent bitta kalendar ustida qurilgan:

KomponentVazifasi
DatePickerBitta sana: Input ko'rinishidagi maydon + Popover'da kalendar
DateRangePickerSanalar oralig'i: tugma-trigger + ikki oylik kalendar
CalendarPopover'siz kalendar — sahifaga yoki o'z oynangizga joylashtiriladi

Qachon ishlatish

  • Aniq kun kerak bo'lsa — yetkazish sanasi, uchrashuv, muddat. Faqat oy yoki yil kerak bo'lsa, oddiy Select yetarli.
  • Tug'ilgan sana kabi uzoq sanalar uchun ham DatePicker qulay: sanani klaviaturada yozib qo'yish mumkin, kalendar sarlavhasi bosilsa oy va yil tanlanadi.
  • Hisobot davri, ta'til, filtrlar — DateRangePicker. Tayyor variantlar (presets) eng ko'p ishlatiladigan oraliqlarni bir bosishda beradi.
  • Cheklovlarni oldindan bering: minDate, maxDate, disabledDates. Foydalanuvchi tanlab bo'lmaydigan kunni ko'radi, lekin bosa olmaydi — keyin xato chiqargandan ko'ra yaxshi.
  • Label uchun maydonni Field ichiga qo'ying — id, aria-describedby va xato holati avtomatik ulanadi.

Qo'lda yozish

Maydonga to'g'ridan-to'g'ri yozish mumkin: __.__.____ niqobi nuqtalarni o'zi qo'yadi, oxirgi raqam kiritilganda sana tekshiriladi. Mavjud bo'lmagan sana (31.02.2026) — invalid, cheklovga tushmaydigan sana — unavailable xatosi. Xato turini onErrorChange orqali olasiz.

Sinab ko'ring: 31022026

Qiymat: null

Xato matni bitta joyda

Standart holatda DatePicker xatoni o'zi, maydon ostida ko'rsatadi. Agar Field ga error berilgan bo'lsa (yoki invalid), ichki xato qatori yashiriladi — ikki qator xato chiqmasligi uchun. Bu xatti-harakatni showError bilan majburan yoqish yoki o'chirish mumkin.

Niqob faqat raqamli shablonlarda ishlaydi (dd.MM.yyyy, MM/dd/yyyy). format="d MMMM yyyy" kabi so'zli shablonda maydon oddiy matn sifatida tahlil qilinadi.

Oy va yilni tanlash

Kalendar sarlavhasini ("Oktabr 2026") bosing — oylar, keyin yillar ko'rinishiga o'tiladi. Bu tug'ilgan sana kabi uzoq sanalarga tez yetib borish uchun. minDate va maxDate dan tashqaridagi oylar va yillar o'chirilgan bo'ladi.

Sarlavhani bosing — oy va yilni tanlash

Tayyor variantlar

presets — kalendar ostidagi tezkor tugmalar. true bersangiz: "Bugun", "Ertaga", "Bir haftadan keyin". O'zingizniki uchun DatePreset[] bering:

import { DatePicker, type DatePreset } from '@akhatmirzo/ui';

const presets: DatePreset[] = [
  {
    label: '3 kundan keyin',
    date: (today) => new Date(today.getFullYear(), today.getMonth(), today.getDate() + 3),
  },
  { label: 'Yangi yil', date: new Date(2027, 0, 1) },
];

<DatePicker presets={presets} />;

Agar variant sanasi cheklovga tushmasa (masalan, yakshanba yopiq), eng yaqin ruxsat etilgan keyingi kun tanlanadi (31 kungacha qidiriladi).

O'lchamlar

sm, md, lg — 32, 40 va 48px. Balandliklar Input bilan bir xil.

Holatlar

disabled, readOnly, xato va boshqa format. readOnly maydonda kalendar ochilmaydi.

Sanani tanlang

d MMMM yyyy

DateRangePicker

Oraliq ikkinchi kun bosilganda tasdiqlanadi. Birinchi kundan keyin kursor bilan yurganingizda oraliq oldindan ko'rinadi. Kompyuterda ikki oy, telefonda bitta oy ko'rsatiladi. presets uchun standart variantlar: "Bugun", "Oxirgi 7 kun", "Shu oy", "O'tgan oy".

16 Okt – 22 Okt 2026

onValueChange faqat to'liq oraliq (from va to ikkalasi bor) bilan yoki tozalanganda null bilan chaqiriladi — yarim tanlangan oraliq tashqariga chiqmaydi.

O'z variantlaringiz va forma

DateRangePreset da range — obyekt yoki today ni oladigan funksiya. name bersangiz, formaga ikkita yashirin maydon qo'shiladi: ${name}From va ${name}To (yyyy-MM-dd).

Yakshanbalar yopiq

Qo'lda yozish faqat DatePicker'da

DateRangePicker ning trigger'i — tugma, unga matn yozilmaydi. Klaviatura bilan Enter, Space yoki ↓ bosing — kalendar ochiladi va fokus darhol kunga o'tadi.

Calendar

Kalendarni Popover'siz, to'g'ridan-to'g'ri sahifada ishlatish mumkin — masalan bron qilish sahifasida. mode="range" bilan oraliq tanlanadi.

Oktabr 2026
22 Oktabr 2026, Payshanba
Oktabr 2026
Noyabr 2026
Oraliq tanlandi

Props

DatePicker

Qolgan <input> atributlarini (name, id, placeholder, required, readOnly, disabled, aria-* ...) va ref ni qabul qiladi. className — ildiz elementga, inputClassName — ichki <input> ga. name berilsa, forma uchun yashirin maydon qo'shiladi (yyyy-MM-dd).

PropTipStandartTavsif
valueDate | null—Tanlangan sana (boshqariladigan)
defaultValueDate | null—Boshlang'ich qiymat
onValueChange(value: Date | null) => void—Sana tanlanganda, to'g'ri yozilganda yoki tozalanganda
formatstring'dd.MM.yyyy'Ko'rsatish va yozish shabloni (core formatDate tokenlari)
minDateDate—Eng erta ruxsat etilgan sana
maxDateDate—Eng kech ruxsat etilgan sana
disabledDates(date: Date) => boolean—true qaytarsa — kunni tanlab bo'lmaydi
presetsboolean | DatePreset[]—Kalendar ostidagi tayyor variantlar
size'sm' | 'md' | 'lg''md'Balandlik
invalidboolean—Xato holati (Field ichida error bo'lsa avtomatik)
clearablebooleanfalseQiymat bo'lsa ✕ tugmasi
openboolean—Kalendar ochiqmi (boshqariladigan)
defaultOpenbooleanfalse
onOpenChange(open: boolean) => void—
todayDate—Bugungi sana (standart — new Date())
numberOfMonthsnumber1Ko'rsatiladigan oylar
onErrorChange(error: DatePickerError | null) => void—Yozilgan matn xatosi o'zgarganda: 'invalid' yoki 'unavailable'
showErrorboolean—Ichki xato matni. Standart — tashqi xato bo'lmasa ko'rinadi
labelsDatePickerLabels—Matnlar (pastda)
inputClassNamestring—Ichki <input> klassi
contentClassNamestring—Popover paneli klassi

DateRangePicker

Qolgan <button> atributlarini qabul qiladi (trigger'ga). className — ildizga, triggerClassName — tugmaga.

PropTipStandartTavsif
valueDateRangeValue | null—{ from, to } (boshqariladigan)
defaultValueDateRangeValue | null—
onValueChange(value: DateRangeValue | null) => void—Faqat to'liq oraliq yoki tozalanganda null bilan
formatstring'dd.MM.yyyy'
minDateDate—
maxDateDate—
disabledDates(date: Date) => boolean—
presetsboolean | DateRangePreset[]—true — Bugun, Oxirgi 7 kun, Shu oy, O'tgan oy
numberOfMonths1 | 2—Standart — 2, telefonda (< 640px) 1
size'sm' | 'md' | 'lg''md'
invalidboolean—
clearablebooleanfalse
openboolean—
defaultOpenbooleanfalse
onOpenChange(open: boolean) => void—
todayDate—
namestring—Forma uchun `${name}From` va `${name}To` yashirin maydonlari
labelsDateRangePickerLabels—
triggerClassNamestring—
contentClassNamestring—

Calendar

Qolgan <div> atributlarini qabul qiladi. mode ga qarab value turi o'zgaradi.

PropTipStandartTavsif
mode'single' | 'range''single'Bitta sana yoki oraliq
valueDate | null / DateRangeValue | null—single / range
defaultValueDate | null / DateRangeValue | null—
onValueChange(value: Date | null) => void / (value: DateRangeValue) => void—
minDateDate—
maxDateDate—
disabledDates(date: Date) => boolean—
numberOfMonthsnumber1
monthDate—Ko'rsatilayotgan oy (boshqariladigan)
defaultMonthDate—
onMonthChange(month: Date) => void—
view'days' | 'months' | 'years'—Ko'rinish (boshqariladigan)
defaultView'days' | 'months' | 'years''days'
onViewChange(view: CalendarView) => void—
todayDate—
showOutsideDaysboolean—Qo'shni oylar kunlari. Standart — bitta oyda true, bir nechtasida false
autoFocusbooleanfalseTanlangan (yoki bugungi) kunga fokus
footerReactNode—Kalendar ostidagi kontent
labelsCalendarLabels—

Tiplar

interface DateRangeValue {
  from: Date | null;
  to: Date | null; // null — oraliq hali tugallanmagan
}

interface DatePreset {
  label: string;
  date: Date | ((today: Date) => Date);
}

interface DateRangePreset {
  label: string;
  range: DateRangeValue | ((today: Date) => DateRangeValue);
}

isDateSelectable(date, { minDate, maxDate, disabledDates }) ham eksport qilinadi — o'z validatsiyangizda xuddi shu qoidani ishlatish uchun.

Matnlar (labels)

Barcha matnlar o'zbekcha standart qiymatga ega. Boshqa tilga o'tkazish uchun kerakli kalitlarni bering — qolganlari standartda qoladi:

<DatePicker
  labels={{
    placeholder: 'dd.mm.yyyy',
    openCalendar: 'Open calendar',
    clear: 'Clear',
    invalidDate: 'Invalid date',
    months: ['January', 'February' /* ... */],
    weekdaysShort: ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'],
  }}
/>

CalendarLabels: previousMonth, nextMonth, previousYear, nextYear, previousYears, nextYears, chooseMonth, chooseYear, monthsGrid, yearsGrid, navigation, today, selected, months, monthsShort, weekdays, weekdaysShort (hafta dushanbadan). DatePickerLabels bularga qo'shimcha: placeholder, openCalendar, calendar, clear, presets, invalidDate, unavailableDate, today, tomorrow, inAWeek. DateRangePickerLabels: placeholder, calendar, clear, presets, pickEnd, separator, today, last7Days, thisMonth, lastMonth.

Data atributlari

AtributElementQiymat
data-sizemaydon konteynerism · md · lg
data-statemaydon konteyneriopen · closed
data-invalidmaydon konteynerixato bo'lganda mavjud
data-disabledmaydon konteyneridisabled bo'lganda mavjud
data-readonlyDatePicker maydonireadOnly bo'lganda mavjud

Klaviatura

TugmaHarakat
↓ (maydon/trigger)Kalendarni ochadi va fokusni kunga o'tkazadi
Enter (maydonda)Yozilgan sanani tekshiradi va tasdiqlaydi
← →±1 kun
↑ ↓±1 hafta
PageUp / PageDown±1 oy (Shift bilan — ±1 yil)
Home / EndHafta boshi / oxiri
Enter / SpaceKunni tanlash
EscKalendarni yopadi; oy/yil ko'rinishida — kunlarga qaytaradi

Oy va yil to'rida: strelkalar bilan yuriladi (↑ ↓ — bir qator), Home / End — birinchi va oxirgi element.

Accessibility

  • Maydon — oddiy <input type="text">: aria-haspopup="dialog", aria-expanded va ochiq paytda aria-controls kalendar paneliga ishora qiladi. Raqamli shablonda mobil klaviatura raqamli bo'ladi (inputMode="numeric").
  • Kalendar paneli aria-label="Kalendar" bilan nomlangan; ochilganda fokus maydonda qoladi, ↓ yoki kalendar tugmasi bilan kunga o'tadi. Yopilganda fokus maydonga qaytadi.
  • Xato aria-invalid bilan belgilanadi, xato matni aria-describedby orqali maydonga bog'langan va aria-live="polite" hududida e'lon qilinadi.
  • Kun tugmalari ekran o'quvchi uchun to'liq nom oladi: bugungi kunga "Bugun", tanlanganiga "tanlangan" qo'shiladi. Tanlab bo'lmaydigan kunlar xira va ustidan chizilgan — bosilmaydi.
  • Oy va yil to'rlari — role="group", har bir katakda to'liq aria-label, joriy oy/yil aria-current bilan belgilangan.
  • DateRangePicker: birinchi kun tanlangach "Tugash sanasini tanlang" matni aria-live hududida e'lon qilinadi; tayyor variant tugmalarida aria-pressed bor.
  • Ikonkalar aria-hidden; "Kalendarni ochish" va "Tozalash" tugmalarida aria-label bor.

Sahifada