Tarih seçici date picker
bilinen diğer adları date picker · takvim seçici · tarih alanı
Böyle diyorsan: "takvim açılan kutu" · "tarih seçme takvimi" → bunun adı tarih seçici.
Mini takvim açarak tarih seçtiren alan.
Tarih seçici, bir takvim açarak tarih seçtirir. Görünürde basit, gerçekte bu sözlüğün en zor parçalarından biridir; çünkü üç ayrı sorunu birden çözmek zorundadır: biçim (05/06 hangisi gün?), kısıt (geçmiş günler, kapalı günler, aralıklar) ve klavye (takvimde ok tuşlarıyla gezinme, ay değiştirme, kapanma). Tarayıcının yerleşik seçicisi bunların hepsini bedava verir ama stili neredeyse hiç değiştirilemez; özel takvim yazmak ise APG'nin kip pencere kalıbını doğru uygulamayı gerektirir. En sık yapılan hata, elle yazmaya yarım izin vermektir: kullanıcı yazabiliyor ama biçim serbestse, yarım serbestlik yarım doğrulama demektir.
Kapsam: Bu madde tek tarih seçimini kapsar. Tarih ARALIĞI seçimi aynı kalıbın iki uçlu hâlidir ve ek kurallar getirir (başlangıç bitişi geçemez); saat seçimi ise ayrı bir parçadır.
Yapıştır, sonuna belirtiyi ekle — ajana klasik hata kalıplarını önden verir.
- 1Giriş alanı
readonly input + 📅Seçimin yazıldığı kutu ve takvimi açan tetik. İyi pratik: ya elle yazmaya tam izin ver ya tamamen kilitle — yarım serbestlik, yarım doğrulama demektir.
- 2Ay gezinme başlığı
‹ Ağustos 2026 ›Aylar arasında dolaşma; başlık 'takvimde neredeyim' sorusunun cevabıdır. Min/max tarih aralığının dışına gezinme kapatılır.
- 3Gün ızgarası
7 sütunlu gridGün-adı başlıklarıyla hizalı 28-31 hücre; ayın ilk günü DOĞRU sütunda başlamalı (haftanın ilk günü ülkeye göre değişir — TR'de pazartesi).
- 4Kapalı günler
disabledSeçilemez tarihler: geçmiş, dolu, hafta sonu... Soluk + tıklanamaz görünür; mümkünse SEBEBİ de anlaşılır olur.
- 5Durum işaretleri
bugün ○ / seçili ●Bugün halkalı, seçili dolu — ikisi aynı gün bile olsa ayrı dil konuşur; kullanıcı 'bugün' ile 'seçtiğim' i karıştırmaz.
- AKapalı
readonly input + 📅Seçim yazılı, takvim gizli. Biçim belirsiz bırakılmaz: '05.06.2026' yerine tercihen '5 Haziran 2026' yaz — 05/06 dünyanın yarısında Haziran'ın beşi, yarısında Mayıs'ın altısıdır.
- BAçık
dialog + odak tuzağıTakvim görünür. Kip pencere kuralları geçerlidir: odak içeride kalır, Escape kapatır, kapanınca odak tetiğe DÖNER.
- CSeçili gün
aria-selectedSeçim işaretli. Bugün ile seçili gün AYRI işaretlenmeli; ikisini aynı göstermek en sık yapılan görsel hatadır.
- DKapalı günler
disabled + sebepGeçmiş, dolu ya da tatil günleri. Neden seçilemediği yazılmazsa kullanıcı sistemin bozuk olduğunu düşünür.
- EElle yazılıyor
input + ayrıştırmaKullanıcı klavyeden yazıyor. Ya tam izin ver ve esnek ayrıştır ya da tamamen kilitle; arada kalmak hem yazdırıp hem reddeden bir alan üretir.
| HTML | <input type="date"> | tarayıcının hazır seçicisi — stili sınırlı ama bedava |
| react-day-picker | DayPicker (locale, disabled) | esnek takvim; TR locale + kapalı-gün kuralları |
| shadcn/ui | Calendar | react-day-picker'ın hazır giydirmesi |
| date-fns / dayjs | locale: tr | gün-ay adları ve format |
- Klavyeyle tarih girilebilmeli. Yalnız fareyle takvimden seçilebilen alan, klavye kullanıcısı için kapalı kapıdır — özellikle uzak tarihlerde (doğum günü) takvimde gezinmek işkencedir.
- Açılan takvim bir kip penceredir: odak içeride tuzaklanır, Escape kapatır, kapanınca odak tetiğe geri döner (APG kip pencere kalıbı).
- Takvimde ok tuşları günler arasında gezmeli, PageUp/PageDown ay değiştirmeli; seçili gün ekran okuyucuya tam olarak duyurulmalı ('5 Haziran 2026, Cuma').
- Biçim beklentisini yaz. Yardım satırında 'GG.AA.YYYY' gibi bir örnek olmadan kullanıcı tahmin eder ve hata alır.
- Kapalı günün sebebini söyle: 'geçmiş tarih' ile 'kontenjan dolu' aynı görünmemeli.
Kip pencereden farkı. Açılan takvim aslında bir kip penceredir ve onun bütün kurallarına uymak zorundadır: odak tuzağı, Escape ile kapanma, kapanınca odağın tetiğe dönmesi. Fark amaçtadır — kip pencere genel bir kap, tarih seçici o kabın içinde çalışan özel bir araçtır. Bu yüzden tarih seçici yazarken kip pencere kalıbını yeniden keşfetmeye çalışma, uygula.
Metin kutusundan farkı. Yerleşik <input type="date"> hem metin kutusu hem takvimdir: tarayıcı biçimi, doğrulamayı ve seçiciyi kendi verir. Stili değiştiremediğin için özel takvim yazarsan bu üçünü de sen üstlenirsin. Karar şu: tasarım özgürlüğü mü, bedava doğruluk mu — ikisi aynı anda mümkün değil.
- standartMDN — input type="date" ↗
Yerleşik seçicinin davranışı, biçim ve stil sınırları.
- birincilW3C — ARIA APG, Modal Dialog kalıbı ↗
Açılan takvimin uyması gereken odak ve klavye kuralları.
- standartW3C — WCAG 2.2, Labels or Instructions (3.3.2) ↗
Biçim beklentisinin önceden söylenmesi şartı.
Kip pencere modal / dialogMetin kutusu inputForm alanı form field