Erişilebilirlik

Tüm seçici bileşenleri, yerleşik erişilebilirlik desteğiyle birlikte gelir. Klavye navigasyonu, ARIA nitelikleri ve odak yönetimi, her varyantta — Styled, Tailwind v3/v4 ve Headless — kutudan çıktığı gibi çalışır.

Standart kullanım için ek bir yapılandırma gerekmez. Bu sayfa, özel kullanıcı arayüzlerinde kalıpları denetleyebilmeniz, genişletebilmeniz veya çoğaltabilmeniz için nelerin dahil edildiğini belgeler.

Klavye Navigasyonu

Takvim Seçiciler

TuşEylem
ArrowLeftOdaklanmayı önceki güne taşı
ArrowRightOdaklanmayı sonraki güne taşı
ArrowUpOdaklanmayı önceki haftaya taşı (aynı haftanın günü)
ArrowDownOdaklanmayı sonraki haftaya taşı (aynı haftanın günü)
Enter / SpaceOdaklanılan günü seç
EscapeDeğişiklikleri iptal et ve açılır pencereyi kapat
TabSonraki odaklanılabilir öğeye git (tarayıcı varsayılanı)

Devre dışı bırakılmış tarih atlama: Ok tuşlarıyla gezinirken, devre dışı bırakılmış tarihler otomatik olarak atlanır. Seçici, bir sonraki etkin tarihi bulmak için hareket yönünde 365 güne kadar arama yapar.

Otomatik ay kaydırma: Klavye odağı farklı bir aydaki bir güne geçtiğinde, takvim görünümü o ayı gösterecek şekilde güncellenir.

Zaman Seçici

TuşEylem
EscapeDeğişiklikleri iptal et ve açılır pencereyi kapat

Zaman seçimi, tıklama/dokunma etkileşimli bir kaydırma tekerleği arayüzü kullanır. Kaydırma sütunları, hassas değer seçimi için scroll-snap kullanır.

ARIA Nitelikleri

Her etkileşimli öğe uygun ARIA rollerine ve niteliklerine sahiptir:

Açılır Pencere & Kapsayıcı

ÖğeNitelikDeğer
Açılır pencere kapsayıcısırole"dialog"
Satır içi kapsayıcırole"group"
Kapsayıcıaria-labelYerel ayardan gelen yer tutucu metin
Kapsayıcıaria-activedescendantMevcut odaklanmış gün hücresinin ID’si

Tetikleyici Düğme

NitelikDeğer
aria-expandedtrue açılır pencere açıkken
aria-haspopup"dialog"

Takvim Izgarası

ÖğeNitelikDeğer
Izgara sarmalayıcırole"grid"
Hafta satırırole"row"
Hafta günü başlık hücresirole"columnheader"
Gün hücresirole"gridcell"
Gün hücresiaria-selectedSeçildiğinde true
Gün hücresiaria-currentHücre bugün olduğunda "date"
Gün hücresiaria-labelBiçimlendirilmiş tarih dizesi (ör. "2026-03-04")
Gün hücresidisabledDevre dışı bırakılmış tarihlerde ayarlanır (yerel HTML niteliği)
ÖğeNitelikDeğer
Önceki ay düğmesiaria-label"Önceki ay" (locale.prevMonthLabel’dan)
Sonraki ay düğmesiaria-label"Sonraki ay" (locale.nextMonthLabel’dan)
Ay açılır menüsüaria-label"Ay seç" (locale.selectMonthLabel’dan)
Yıl açılır menüsüaria-label"Yıl seç" (locale.selectYearLabel’dan)

Zaman Sütunları

ÖğeNitelikDeğer
Saat sütunurole"listbox"
Saat sütunuaria-orientation"vertical"
Saat sütunuaria-label"Saatler" (locale.hourLabel’dan)
Dakika sütunurole"listbox"
Dakika sütunuaria-orientation"vertical"
Dakika sütunuaria-label"Dakikalar" (locale.minuteLabel’dan)
Saniye sütunurole"listbox"
Saniye sütunuaria-orientation"vertical"
Saniye sütunuaria-label"Saniyeler" (locale.secondLabel’dan)
Zaman öğesirole"option" (dolgu öğeleri: "presentation")
Zaman öğesiaria-selectedöğe mevcut değer olduğunda true
Dönem değiştiriciaria-labelMevcut dönem + ”, AM/PM değiştir”
Temizle düğmesiaria-label"Temizle" (locale.clear’dan)

Tüm etiket dizeleri yerel ayar sistemi aracılığıyla özelleştirilebilir.

Odak Yönetimi

Gezici Tabindex

Takvim ızgarası gezici tabindex modelini kullanır:

  • Yalnızca o an odaklanmış gün hücresi tabIndex={0}’a sahiptir (sekmeyle gezilebilir).
  • Diğer tüm gün hücreleri tabIndex={-1}’e sahiptir (sekmeyle gezilemez, ancak ok tuşlarıyla odaklanılabilir).
  • Bu, Tab tuşunun odağı takvim ızgarasının dışına (sonraki kontrole) taşıdığı ve ok tuşlarının odağı ızgara içinde hareket ettirdiği anlamına gelir.

Açılır Pencere Odak Yakalama

Açılır pencere modu, @floating-ui/react’ten FloatingFocusManager’ı şu amaçlarla kullanır:

  • Açıkken odağı açılır pencere içinde yakalar.
  • Açılır pencere kapandığında odağı tetikleyici düğmeye döndürür.
  • Sekme ile açılır pencereden arka plan içeriğine geçilmesini engeller.

Yerel Öğeler

Ay ve yıl seçimi, doğası gereği klavyeyle erişilebilir olan yerel <select> öğelerini kullanır. Gün hücreleri, uygun devre dışı bırakma durumlarıyla yerel <button> öğelerini kullanır.

WCAG 2.1 Uyumluluğu

Aşağıdaki WCAG 2.1 başarı ölçütleri ele alınmıştır:

ÖlçütSeviyeNasıl Ele Alındığı
1.3.1 Bilgi ve İlişkilerAAnlamsal HTML — <button>, <select>, grid/gridcell rolleri
2.1.1 KlavyeATüm işlevselliğe klavye üzerinden erişilebilir (ok tuşları, Enter, Escape)
2.4.3 Odak SırasıAMantıksal sekme sırası; açılır pencere odak yöneticisi kullanır
2.4.7 Görünür OdakAATüm etkileşimli öğelerde :focus-visible dış çizgisi (2px solid primary)
4.1.2 İsim, Rol, DeğerATüm etkileşimli öğelerin aria-label veya metin içeriği aracılığıyla erişilebilir adları vardır
📝 Note

Stil paketleri (Styled, Tailwind v3/v4) varsayılan olarak görünür odak göstergeleri içerir. Headless paketiyle özel bir kullanıcı arayüzü oluşturursanız, kendi odak stillerinizi sağlamanız gerekir.

Headless: Erişilebilir Özel Arayüzler Oluşturma

Headless paketini doğrudan kullanıyorsanız, özel kullanıcı arayüzünüzün şunları içerdiğinden emin olun:

1. Klavye işleyicisini uygula

Ok tuşuyla gezinmenin çalışması için handleKeyDown’u açılır pencere kapsayıcınıza geçirin:

const { handleKeyDown, ... } = useDatePicker({ value, onChange });
<div onKeyDown={handleKeyDown}>
{/* calendar grid */}
</div>

2. Gün hücrelerinde doğru tabIndex’i ayarla

getDayProps()’tan gelen isFocused bayrağını kullanın:

const dayProps = getDayProps(date);
<button
role="gridcell"
tabIndex={dayProps.isFocused ? 0 : -1}
aria-selected={dayProps.isSelected}
aria-current={dayProps.isToday ? "date" : undefined}
aria-label={locale.formatDate(date)}
>
{dayProps.day}
</button>;

3. Izgaranıza ARIA rolleri ekleyin

<div role="grid" aria-label={locale.placeholder}>
<div role="row">
{locale.weekdays.map((wd) => (
<div key={wd} role="columnheader">
{wd}
</div>
))}
</div>
{calendar.weeks.map((week, i) => (
<div key={i} role="row">
{/* day cells with role="gridcell" */}
</div>
))}
</div>

Tam bir kılavuz için Özel Kullanıcı Arayüzü Oluşturma bölümüne bakın.