Ders 20 / 25
Rozet ve Etiketler
Rozet ve etiketin belirtimi, sayı rozetinin erişilebilir adının kurulması, durum renklerinin kontrast denetimi ve renk bilgisi olmadan ayırt edilebilirliğin bağıl parlaklıkla hesaplanması.
İçindekiler
Boş ve hata durumları bir ekranın tamamını kaplayan bildirimlerdi. Aynı bilgi çoğu zaman çok daha küçük bir yüzeyde taşınır: satırın yanındaki tek sözcüklük bir işaret, düğmenin köşesindeki bir sayı, kaydın türünü bildiren bir etiket.
Küçük yüzey iki tuzağı birlikte barındırır. Birincisi, bilginin yalnız renkte kalması; ikincisi, erişilebilir adın yalnız sayıdan ibaret olması. Bu ders ikisini de ölçülebilir bir denetime bağlar.
Ne Çözer, Ne Zaman Kullanılmaz
Rozet (badge), başka bir ögeye iliştirilen küçük durum ya da sayı işaretidir. İki türü vardır: durum rozeti kaydın hâlini bildirir (“Gecikti”), sayı rozeti bir miktarı bildirir (bildirim sayısı).
Etiket (tag), bir kaydın sınıflandırmasını gösteren, çoğu zaman kaldırılabilen işarettir. Süzgeç panelinde uygulanmış ölçütleri gösteren etiketler bu türdendir.
Ayrım işlevseldir: rozet iliştirildiği ögeyi niteler ve kendi başına etkileşimli değildir; etiket kendi başına bir nesnedir ve kaldırılabilir.
Kullanılmayacak durumlar:
- Rozet, kritik bilginin tek taşıyıcısı olamaz. “Gecikti” bilgisi yalnız rozette duruyorsa, rozeti göremeyen kullanıcı için o bilgi yoktur; aynı bilgi kaydın ayrıntı görünümünde de bulunmalıdır.
- Rozet tıklanabilir yapılmaz. Tıklanabilir bir işaret düğmedir ve düğme sözleşmesine uymak zorundadır; rozet görünümünde bir düğme, hedef boyutu eşiğini de kaçırır.
- Etiket, kaldırma denetimi olmadan kaldırılabilir gösterilmez. Üzerinde çarpı işareti bulunan bir etiket klavyeyle kaldırılamıyorsa yanıltıcıdır.
Yerel Öge Önce, ARIA Sonra
Rozetin işaretlemede ayrılmış bir karşılığı yoktur; kurulum ada ve metne dayanır.
| Parça | Kaynak |
|---|---|
| Durum rozeti | Metin taşıyan bir öge; anlam metnin kendisindedir, ek rol gerekmez |
| Sayı rozeti | Sayı, iliştirildiği denetimin adının içine yazılır |
| Sayının değişmesi | Denetimin yanındaki kibar bölge bildirir, rozet bildirmez |
| Kaldırılabilir etiket | Metin bir öge, kaldırma düğmesi ayrı bir düğme |
| Kaldırma düğmesinin adı | “X etiketini kaldır” — etiket metnini içerir |
Sayı rozetinin kurulumu en çok yanlış yapılan yerdir. “3” yazan bir rozet, düğmenin yanına ayrı bir düğüm olarak konduğunda erişilebilir ağaçta bağlamsız bir sayı olarak durur. Doğru kurulum, sayıyı düğmenin adına katmaktır: “Bildirimler, 3 okunmamış”. Görsel rozet ayrıca ağaçtan gizlenir, çünkü bilgisi zaten adın içindedir.
Kısaltılmış sayılar ayrı bir kural ister. Ekranda “99+” yazan bir rozetin adında gerçek sayı bulunmalıdır; görsel kısaltma bir yer kısıtıdır, bilgi kısıtı değil.
Klavye Sözleşmesi
Rozet odak almaz ve sekme sırasında yer tutmaz. Etiketin kaldırma düğmesi ise tam bir düğmedir:
| Tuş | Davranış |
|---|---|
| Sekme | Kaldırma düğmesine sırayla ulaşılır |
| Giriş / boşluk | Etiketi kaldırır |
| Kaldırma sonrası odak | Bir sonraki etikete; son etiket kaldırıldıysa etiket listesinin kabına |
Son maddede Kip Pencereler dersindeki dönüş noktası kuralının bir başka biçimi görünür: odaklı öge kaldırıldığında odağın nereye gideceği belirtimin parçasıdır. Belirlenmediğinde odak belgenin başına düşer ve kullanıcı süzgeç panelindeki yerini kaybeder.
Etiket kaldırıldığında sonuç sayısı değişir; bu değişim kibar bölgeden bildirilir.
Renk Yeterli Bir Kanal Değildir
Durum rozetlerinin rengi bir kısayoldur ve kısayolun sınırı hesaplanabilir. İki ölçüm gerekir: rozetin kendi kontrastı, ve rozetlerin birbirine karşı ayırt edilebilirliği. İkincisi renk bilgisi kullanılamadığında geriye ne kaldığını gösterir.
// rozet.mjs — rozet renklerinin kontrasti, parlaklik cakismasi ve ikinci kanal denetimi const ayir = (hex) => [1, 3, 5].map((i) => parseInt(hex.slice(i, i + 2), 16) / 255); const dogrusal = (k) => (k <= 0.04045 ? k / 12.92 : ((k + 0.055) / 1.055) ** 2.4); const parlaklik = (hex) => { const [r, g, b] = ayir(hex).map(dogrusal); return 0.2126 * r + 0.7152 * g + 0.0722 * b; }; const oran = (a, b) => { const [x, y] = [parlaklik(a), parlaklik(b)].sort((p, q) => q - p); return (x + 0.05) / (y + 0.05); }; const YUZEY = "#F4F4F5"; // kayit kartinin yuzeyi const ROZET = [ { ad: "odunc alinabilir", zemin: "#2E7D32", metin: "#FFFFFF", etiket: "Mevcut", simge: true }, { ad: "rezerve", zemin: "#B26A00", metin: "#FFFFFF", etiket: "Rezerve", simge: true }, { ad: "iade gecikti", zemin: "#C62828", metin: "#FFFFFF", etiket: "Gecikti", simge: true }, { ad: "kayip", zemin: "#616161", metin: "#FFFFFF", etiket: "Kayıp", simge: false }, { ad: "yeni kayit", zemin: "#1565C0", metin: "#FFFFFF", etiket: null, simge: false }, ]; console.log("rozet zemin bagil parlaklik metin/zemin zemin/yuzey 1.4.3 1.4.11"); for (const r of ROZET) { const mz = oran(r.metin, r.zemin), zy = oran(r.zemin, YUZEY); console.log( `${r.ad.padEnd(17)} ${r.zemin} ${parlaklik(r.zemin).toFixed(4).padStart(15)} ` + `${(mz.toFixed(2) + ":1").padStart(12)} ${(zy.toFixed(2) + ":1").padStart(12)} ` + `${(mz >= 4.5 ? "gecer" : "KALIR").padStart(6)} ${(zy >= 3 ? "gecer" : "KALIR").padStart(7)}`, ); } // --- Parlaklik cakismasi: renk bilgisi kullanilamadiginda rozetler ayirt edilebilir mi? // Iki rozetin birbirine karsi kontrast orani 1'e yakinsa, renksiz kanalda ozdeslesirler. console.log("\nrozetler arasi kontrast orani (renk bilgisi olmadan ayirt edilebilirlik)"); console.log(" " + ROZET.map((r) => r.ad.slice(0, 8).padStart(9)).join("")); const cakisan = []; for (const a of ROZET) { let satir = a.ad.padEnd(18); for (const b of ROZET) { const o = oran(a.zemin, b.zemin); satir += o.toFixed(2).padStart(9); if (a !== b && o < 1.5 && ROZET.indexOf(a) < ROZET.indexOf(b)) cakisan.push([a.ad, b.ad, o]); } console.log(satir); } console.log("\nrenksiz kanalda ayirt edilemeyen cift (esik 1.5:1):"); for (const [a, b, o] of cakisan) console.log(` ${a} / ${b}: ${o.toFixed(2)}:1`); if (!cakisan.length) console.log(" yok"); // --- Ikinci kanal denetimi --------------------------------------------------- // Durum, renk disinda en az bir kanalda daha tasinmali: metin ya da bicim. console.log("\nrozet metin simge ikinci kanal"); for (const r of ROZET) { const kanal = [r.etiket ? "metin" : null, r.simge ? "simge" : null].filter(Boolean); console.log(`${r.ad.padEnd(17)} ${(r.etiket ? "var" : "—").padStart(5)} ${(r.simge ? "var" : "—").padStart(6)} ` + `${kanal.length ? kanal.join(" + ") : "YOK — durum yalniz renkte"}`); } // --- Sayi rozetinin erisilebilir adi ---------------------------------------- const AD_ORNEK = [ { gorunen: "3", ad: "3" }, { gorunen: "3", ad: "Bildirimler" }, { gorunen: "3", ad: "Bildirimler, 3 okunmamış" }, { gorunen: "99+", ad: "Bildirimler, 128 okunmamış" }, ]; console.log("\ngorunen erisilebilir ad sayi var baglam var yeterli"); for (const a of AD_ORNEK) { const sayiVar = /\d/.test(a.ad); const baglamVar = /[A-Za-zÇĞİÖŞÜçğıöşü]{3,}/.test(a.ad); console.log(`${a.gorunen.padEnd(8)} ${a.ad.padEnd(30)} ${(sayiVar ? "evet" : "hayir").padStart(8)} ` + `${(baglamVar ? "evet" : "hayir").padStart(11)} ${sayiVar && baglamVar ? "evet" : "HAYIR"}`); }
rozet zemin bagil parlaklik metin/zemin zemin/yuzey 1.4.3 1.4.11
odunc alinabilir #2E7D32 0.1548 5.13:1 4.66:1 gecer gecer
rezerve #B26A00 0.1977 4.24:1 3.86:1 KALIR gecer
iade gecikti #C62828 0.1368 5.62:1 5.11:1 gecer gecer
kayip #616161 0.1195 6.19:1 5.63:1 gecer gecer
yeni kayit #1565C0 0.1327 5.75:1 5.23:1 gecer gecer
rozetler arasi kontrast orani (renk bilgisi olmadan ayirt edilebilirlik)
odunc al rezerve iade gec kayip yeni kay
odunc alinabilir 1.00 1.21 1.10 1.21 1.12
rezerve 1.21 1.00 1.33 1.46 1.36
iade gecikti 1.10 1.33 1.00 1.10 1.02
kayip 1.21 1.46 1.10 1.00 1.08
yeni kayit 1.12 1.36 1.02 1.08 1.00
renksiz kanalda ayirt edilemeyen cift (esik 1.5:1):
odunc alinabilir / rezerve: 1.21:1
odunc alinabilir / iade gecikti: 1.10:1
odunc alinabilir / kayip: 1.21:1
odunc alinabilir / yeni kayit: 1.12:1
rezerve / iade gecikti: 1.33:1
rezerve / kayip: 1.46:1
rezerve / yeni kayit: 1.36:1
iade gecikti / kayip: 1.10:1
iade gecikti / yeni kayit: 1.02:1
kayip / yeni kayit: 1.08:1
rozet metin simge ikinci kanal
odunc alinabilir var var metin + simge
rezerve var var metin + simge
iade gecikti var var metin + simge
kayip var — metin
yeni kayit — — YOK — durum yalniz renkte
gorunen erisilebilir ad sayi var baglam var yeterli
3 3 evet hayir HAYIR
3 Bildirimler hayir evet HAYIR
3 Bildirimler, 3 okunmamış evet evet evet
99+ Bildirimler, 128 okunmamış evet evet evet
Birinci tablo beklenen denetimi yapıyor ve bir kusur buluyor: turuncu rozetin beyaz metne karşı oranı 4.24:1, yani metin eşiğinin altında. Aynı renk metin dışı eşiği (3:1) karşılıyor. Bu, renk sisteminde sık görülen bir tuzaktır — turuncu, kırmızıyla yeşilin arasında bir parlaklığa oturur ve beyaz metni taşımaya yetmez. Çözüm rengi koyulaştırmak ya da metni koyu yazmaktır.
İkinci tablo dersin asıl bulgusudur. Beş rozet renginin onu çiftinin tamamı, renk bilgisi olmadan birbirinden ayırt edilemez. En kötü çift 1.02:1 ile “iade gecikti” ve “yeni kayıt”; kırmızı ile mavi, bağıl parlaklıkları neredeyse eşit olduğu için renksiz kanalda aynı gri tona düşer. En iyi çift bile 1.46:1’de kalır ve seçilen 1.5:1 eşiğini geçmez.
Bu sonuç bir tasarım hatası değildir. Renk paleti, İşlevsel Renkler dersindeki gibi rollere göre seçilmiştir ve her biri kendi zemininde eşikleri karşılar. Kanıtlanan şey daha temeldir: durum renkleri birbirinden ayırt edilecek biçimde seçilemez. Beş rolün beşini birden yeterli parlaklık aralığıyla ayırmak, renkleri kullanılamayacak kadar açık ve koyu uçlara itmek demektir. Bu yüzden 1.4.1 ölçütü rengi bilgi taşıyıcı olarak kullanmayı yasaklamaz; tek taşıyıcı olarak kullanmayı yasaklar.
Üçüncü tablo ikinci kanalın denetimidir. Beş rozetin üçü hem metin hem simge taşıyor, biri yalnız metin, biri hiçbiri. “Yeni kayıt” rozeti yalnız renkli bir noktadır ve bilgisi renkten başka hiçbir kanalda bulunmaz — denetim bunu doğrudan yakalıyor. Yalnız metin taşıyan “kayıp” rozeti yeterlidir; simge zorunlu değildir, ikinci kanalın bir tanesi yeter.
Son tablo sayı rozetinin adını sınıyor. “3” adı sayıyı taşır ama neyin üçü olduğunu söylemez; “Bildirimler” adı bağlamı taşır ama sayıyı düşürür. İkisini birleştiren ad her iki denetimi de geçer. Dördüncü satır kısaltma kuralını gösteriyor: ekranda “99+” yazarken adda gerçek sayı durur.
Ölçülebilir Kısıtlar
1.4.1 Rengin Kullanımı. Renk, bilgiyi ileten tek görsel araç olamaz. Denetimin karşılığı yukarıdaki ikinci kanal tablosudur.
1.4.3 Kontrast (En Az). Rozet metni zeminine karşı 4.5:1; büyük metin sayılan boyutlarda 3:1. Rozet metni küçük olduğu için pratikte hep 4.5:1 aranır.
1.4.11 Metin Dışı Kontrast. Rozetin zemini, üzerine oturduğu yüzeye karşı 3:1 karşılamalıdır; rozetin sınırı belirsizse rozetin kendisi görülemez.
2.5.8 Hedef Boyutu (En Az). Etiketin kaldırma düğmesi 24 x 24 piksellik alana genişletilir. Etiketler yan yana dizildiğinde iki kaldırma düğmesi arasındaki uzaklık da bu eşiği bozmamalıdır.
1.4.4 Metnin Yeniden Boyutlandırılması. Rozet metni iki katına çıktığında rozet büyümeli, metni kırpmamalıdır. Sabit genişlikli daire biçiminde bir sayı rozeti bu eşikte sayıyı keser.
4.1.3 Durum İletileri. Rozetteki sayının değişmesi bir durum iletisidir ve rozetin kendisinden değil kibar bölgeden bildirilir.
Sık Yapılan Hata ve Nasıl Anlaşılır
Rozet ayrı bir düğüm olarak okunuyor. Düğmenin yanındaki “3”, bağlamsız bir sayı olarak bildirilir. Anlaşılması: düğmenin ad alanında sayının bulunup bulunmadığına bakmak.
Durum yalnız renkli bir noktayla gösteriliyor. Anlaşılması: ekranı renksiz düşünmek yetmez, ölçmek gerekir — durum renklerinin ikili kontrast oranlarını hesaplamak ve 1.5:1’in altındaki çiftleri saymak.
Etiket kaldırma düğmesinin adı “kaldır”. Beş etiketin beşinde de aynı ad görünür ve hangi etiketin kaldırılacağı anlaşılmaz. Anlaşılması: bağlantı ve düğme düzleminde aynı adın kaç kez tekrarlandığını saymak; Ekran Okuyucu Deneyimi dersindeki “aynı metin farklı hedef” kusurunun düğme karşılığıdır.
Sayı rozeti sıfırken de duruyor. Boş bir rozet, olmayan bir bilgiyi ekranda tutar. Anlaşılması: sayı sıfırlandığında rozetin kaldırılıp kaldırılmadığına bakmak.
Özet
- Rozet iliştirildiği ögeyi niteler ve etkileşimli değildir; etiket kendi başına bir nesnedir ve kaldırma düğmesi tam bir düğmedir.
- Sayı rozetinin bilgisi iliştirildiği denetimin adına yazılır; görsel rozet ağaçtan gizlenir ve ekrandaki kısaltma adda açılır.
- Rozet metni 4.5:1, rozet zemini yüzeye karşı 3:1 eşiğini karşılamalıdır; turuncu zemin ölçümde 4.24:1 ile metin eşiğini kaçırdı.
- Durum renkleri birbirinden ayırt edilecek biçimde seçilemez: beş rengin on çiftinin tamamı renksiz kanalda 1.5:1 eşiğinin altında kalır, en yakın çift 1.02:1’dir.
- Bu yüzden her durum rozetinin ikinci bir kanalı olmalıdır — metin ya da simge; birinin bulunması yeterlidir, ikisi birden zorunlu değildir.
- Etiket kaldırıldığında odağın nereye gideceği ve sonuç sayısının nasıl bildirileceği belirtimin parçasıdır.
Sonraki Adım
Bu konudaki yedi kalıbın hepsinde son karar metne düştü. Bildirimin süresi metnin kelime sayısından hesaplandı, hata iletisinin yeterliliği kurtarma yolunu yazıp yazmamasına bağlandı, rozetin ikinci kanalı çoğu zaman bir sözcük oldu. Metin, bileşen belirtiminin son alanı değil; belirtimin kendisini taşıyan malzeme.
Sıradaki konu bu malzemeyi sisteme çevirir. Önce arayüz metnini denetlenebilir kurallara bağlar — ses tonu, uzunluk ve terim tutarlılığı ölçülebilir hâle gelir. Sonra hata iletisi yazımını, yerelleştirme kısıtlarını, sağdan sola düzeni ve bölgesel alan gerekliliklerini ele alır. İlk ders, aynı kavramın arayüzde kaç ayrı sözcükle anıldığını sayarak başlar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.