Files
kolaytercih/docs/gece-vardiyasi/2026-09-22/02-tasarim.md
bilalgursen a42a1a9920
All checks were successful
Deploy / deploy (push) Successful in 17s
docs(ekip): 22-23 Eylül vardiya raporları, BACKLOG/KARARLAR/PROTOKOL güncellemeleri
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 11:43:11 +03:00

32 KiB
Raw Blame History

02 — Tasarım: çıkarma turu (gece vardiyası 2026-09-22, Tur 1)

Yöntem: yalnız kod okuması (AGENTS.md gereği tarayıcı/dev sunucusu açılmadı). Piksel yükseklikleri koddan çıkarımdır, ölçülmemiştir; "kaç ekran boyu" rakamları 390×844 varsayımıyla tahmindir ve öyle işaretlidir. Kontrast değerleri token'lardan hesaplanmıştır (hesap §7'de). Analitik raporu (01-analitik.md) bu rapor yazılırken klasörde yoktu → Rybbit rakamlarıyla eşleştirme yapılamadı; her bulgu "kural" (AGENTS.md/WCAG) ya da "varsayım" olarak işaretlendi. Yapay zekâ mühendisinin raporu (04-liste-maliyet-ve-oneriler.md) yazım sırasında geldi ve iki bulguyu bağımsız olarak doğruluyor — çapraz kontrol §8'de. Kod değiştirilmedi.


Özet — 5 madde

  1. Akış kolay; ekranlar kalabalık. Sihirbaz 3 adım, ödül tek sayfa — iskelet doğru. Sorun iskelette değil, her ekranın kendi işine ek olarak bir de "ürünü anlatma" işi üstlenmesinde. Beş ekranın dördü tek cümlelik "bu ekranın işi ne?" testini geçemiyor.
  2. En pahalı gürültü ilk ekranlarda. /sonuc'un ilk ekranının ~%20'si, içine hiçbir şey eklenmemiş boş gri harita yer tutucusu (manuel-harita.tsx:69-80). Üstünde her sayfada duran sezon bandı (site-top-banner.tsx) şu an geri sayım bile göstermiyor — sadece "takvim açıklanınca burada başlar" diyen bir cümle.
  3. Aynı vaat arka arkaya iki kez satılıyor. /sonuc'ta girişsiz kullanıcı aynı /giris adresine giden iki büyük paneli üst üste görüyor (tadimlik-satiri.tsx:178 ve sihirbaz-cagri-karti.tsx:307). /listem'de paketsiz kullanıcıya beş ayrı /paket girişi var.
  4. 24'lük liste boğmuyor; kilitli 21 satırın tekrarı boğuyor. Detaylar akordeonun arkasında — doğru. Ama kilitli her satır tek tek açılıp aynı satış kutusunu 21 kez gösteriyor (rapor-listesi.tsx:306-323). Tek paywall yeter.
  5. İki kural ihlali açık ve mobil kullanıcıyı vuruyor. (a) /sonuc tablosunda risk yalnız renkli nokta (program-tablosu.tsx:306-314, metin etiketi hiç yok) ve /listem'de etiket sm altında sr-only (rapor-listesi.tsx:267) → AGENTS.md risk dili kuralı, trafiğin ~%90'ı mobil. (b) /giris başlığı sonsuz döngüde yazı animasyonu ve prefers-reduced-motion hiç okunmuyor → WCAG 2.2.2 (A).

1. Ekran ekran: sayım ve "bu ekranın işi ne?" testi

Sayım kuralı: bilgi bloğu = ayrı kart/panel/tablo/bant · CTA = tıklanınca akışı ilerleten buton/link (navbar hariç) · açıklama cümlesi = başlık dışı, okunması beklenen tam cümle · rozet = SectionEyebrow ya da pill görünümlü etiket.

Ekran Blok CTA Açıklama cümlesi Rozet Tahmini boy (390px) Tek işi var mı?
Ana sayfa (app/page.tsx) 8 (hero, sorun, nasıl, istatistik+dürüstlük, karşılaştırma, fiyat, SSS, kapanış) 6 (hero submit, Meraklısına, Paketi incele, +kredi, kapanış CTA, SSS içi yok) ~28 6 SectionEyebrow + "Meraklısına" turuncu pill + 5 puan türü çipi ~8 ekran (koddan çıkarım) ❌ İki iş: "sıralamanı al" + "ürünü sat".
Sihirbaz modal (sihirbaz-adimlar.tsx) 1 panel, 3 adım 2 (Geri/Devam) 4 (adım başına 1, 3. adımda 2) Adım 1'de ~10 kategori çipi, adım 2'de ≤81 il çipi, adım 3'te ~10 çip modal, max-h-92dvh ⚠️ Adım 1-2 tek iş; adım 3'ün iki işi var (üni tipi + öncelikler).
/sonuc (girişsiz, hazir=1) 5 (boş harita, tablo, tadımlık, hazır panel, dipnot) 4 (dilim sekmeleri sayılmadı: Daha fazla, tadımlık→giriş, hazır panel→giriş, satır içi +×20) ~12 1 SectionEyebrow + 3 dilim sekmesi + satır başına Devlet/Vakıf rozeti ~4,3 ekran ❌ Üç iş: "ücretsiz tabloyu göster" + "AI'ı tanıt" + "giriş yaptır".
/listem (paketsiz) 6 (harita, başlık+aksiyon, uyarı kutuları, 24'lük liste, sohbet, paket kartı) 5 ayrı /paket girişi + Tercihlerimi düzenle + sohbet gönder ~14 Satır başına Devlet/Vakıf + "Pakette" kilidi ×21 ~4,6 ekran ❌ İki iş: "listeni göster" + "paketi sat".
/paket 4 (başlık bloğu, paket kartı, top-up kartı, yasal dipnot) 2-3 (Paketi al / Giriş yap, top-up CTA'sı, İade koşulları) ~9 1 SectionEyebrow ~2 ekran ❌ İki iş: "ikna et" + "tahsil et". Buraya gelen zaten ikna olmuş.

Tek işi olmayan ekranlarda hangisi çıkmalı:

  • Ana sayfa → satış tarafı kalır (SEO/soğuk trafik oraya iniyor), ama hero ile fiyat arasındaki üç bölüm (Sorun, Nasıl çalışır içindeki istatistik+dürüstlük kartı, Karşılaştırma) toplam ~4 ekran. Kesilecek olan "Sorun" bölümü: üç kart da adayın zaten bildiği şeyi anlatıyor ve akışı ilerletmiyor.
  • Sihirbaz adım 3 → "Öncelikler" çıkmalı. Kod kendi söylüyor: "listeyi daraltmaz" (sihirbaz-adimlar.tsx:487-490) ve /meraklisina şemasında bu adım hiç yok (huni-semasi.tsx:18: "3. adım · Devlet / Vakıf"). Yani ürünün resmî belgesi ile ekran zaten uyuşmuyor.
  • /sonuc → "AI'ı tanıt" ile "giriş yaptır" aynı şey; ikisinden biri gider (bkz. K3).
  • /listem → "paketi sat" kalır ama tek yüzeyde: satır içi kilit kartı. Diğer dördü gürültü.
  • /paket → "ikna et" tarafı küçülür: H1 rakip kıyası yerine ne aldığını söylemeli.

2. Beş kesin kesim

Sıra fayda/riske göre. Hepsi [KARAR] düzeyinde, K5 hariç (o ürün kararı).

K1 — Sezon dışında üst bandı hiç çizme · risk: düşük

src/components/site-top-banner.tsx:91-177 · src/lib/sezon.ts:76 (takvim-belirsiz metni) Bugün (22 Eyl 2026) SEZON_TAKVIMI[2027] = null → bant geri sayım göstermiyor, yerine 92 karakterlik bir cümle yazıyor: "2026 yerleştirme verileri yüklendi — 2027 tercih takvimi açıklanınca geri sayım burada başlar." 390px'te iki satıra sarıyor. Ne siler: asama === "takvim-belirsiz" iken bandın tamamı (return null). Neyi kaybederiz: "verimiz taze" sinyali — ama aynı bilgi ana sayfa hero'sunda (app/page.tsx:243-254) ve her katalog sayfasının VeriKaynagi satırında zaten var, tarihiyle birlikte. Neden kabul edilebilir: Aksiyonsuz, her sayfada tekrarlayan, hiçbir yere götürmeyen bir bant. Takvim açıklandığı an kendiliğinden geri gelir (tek kaynak sezon.ts, ek iş yok). Kazanç: Her sayfanın ilk ekranından ~70-80px + bir cümlelik okuma yükü (koddan çıkarım).

K2 — /sonuc'un boş harita yer tutucusunu kaldır · risk: düşük

src/features/liste/components/manuel-harita.tsx:69-80 Liste boşken aspect-[1050/447] gri kutu çiziliyor: 390px'te ~152px. Sayfaya yeni gelen herkesin listesi boş, yani bu kutu her zaman ilk ekranın içinde ve içinde "tablodan + ile ekledikçe üniversiteler haritada belirir" yazıyor. Ne siler: liste.length === 0 dalındaki tüm blok → return null. Neyi kaybederiz: (a) "+ ne işe yarar" ipucu, (b) ilk eklemede CLS önleyen yer rezervi. Neden kabul edilebilir: (a) ipucunun yeri buton değil, + butonunun kendi title'ı ve profilsiz eklemede çıkan toast — ikisi de zaten var (program-ekle-butonu.tsx:105-110, 69-88). (b) CLS bedeli yalnız ilk eklemede bir kez ödenir ve harita tablonun üstünde değil altında da durabilir; bugünkü maliyet her ziyaretçide, her oturumda. Kazanç: /sonuc ilk ekranında tablo ~152px yukarı çıkar → ilk ekranda 5 yerine ~7 program satırı.

K3 — /sonuc'ta iki giriş panelinden birini kaldır · risk: düşük-orta

src/features/rapor/components/tadimlik-satiri.tsx:114-192 (panel A) · src/features/sihirbaz/components/sihirbaz-cagri-karti.tsx:287-325 (panel B) Hero sihirbazını bitirip girişsiz gelen kullanıcı (?hazir=1) tabloyu geçtikten sonra art arda iki tam genişlik panel görüyor; ikisinin de CTA'sı aynı /giris adresine gidiyor ve ikisi de aynı şeyi vadediyor:

  • A: "24 satırın tamamı için giriş yap — 5 deneme kredin hazır" + "Kredi kartı gerekmez · Google ya da e-posta ile 30 saniyede"
  • B: "5 deneme kredinle Yapay Zeka listeni kur — giriş yap" + birebir aynı mikro-kopya. Ne siler: ?hazir=1 dalında B paneli (girisBekliyor dalı) hiç render edilmez; A paneli (tadımlık) kalır — çünkü A gösterir, B yalnız anlatır. A zaten ürünün gerçek satır formatını (RaporSatirDetayi, tek kaynak) canlı gösteriyor. Neyi kaybederiz: B'deki "(üretim 3 kredi, kalan 2 kredinle danışmana soru sorarsın)" kredi açıklaması ve hazir_panel_goruntulendi ölçümü. Neden kabul edilebilir: Kredi açıklaması /giris kartında zaten tekrar ediliyor (giris-karti.tsx:52-66). Ölçüm A'ya taşınır (tadimlik_goruntulendi zaten var). Uyarı: Tadımlık havuzu boşsa TadimlikBolumu hiç render edilmiyor (tadimlik-bolumu.tsx:20-21) — o durumda B geri gelmeli, yoksa girişsiz kullanıcı CTA'sız kalır. Yani kesim koşullu: "A varsa B yok".

K4 — Kilitli satırların tek tek açılmasını kapat · risk: düşük

src/features/rapor/components/rapor-listesi.tsx:306-323 (kilitli detay) · :280-296 (chevron butonu) Paketsiz kullanıcının 24 satırının 21'i kilitli. Her biri tıklanabilir, her biri açılınca aynı kesik çizgili kutuyu gösteriyor: "Yapay Zeka karar desteği / Bu bölümün neden listende olduğunu ve sıralamana özel yerleşme riskini paketle gör." Yani aynı satış cümlesi tek sayfada 21 kez. Ne siler: analizKilitli satırlarda chevron butonu ve satır onClick'i (satır artık tıklanamaz), :306-323 kilitli detay bloğu. Neyi kaybederiz: Kilitli satırdan da "Haritada gör" kısayolu (:334-343). Neden kabul edilebilir: Satır zaten Lock ikonu + "Pakette" etiketiyle durumunu söylüyor (:256-260); açılınca öğrenen yeni bir şey yok. "Haritada gör" 21 satırda kaybolur ama açık 3 satırda ve haritanın kendisinde (pin → satır köprüsü) duruyor. Paywall mesajı tek yerde kalır: satır 4'teki kilit kartı. Kazanç: Öğrenci 21 kere "bir şey mi var?" diye tıklayıp aynı reklamı okumuyor; kilitli satır tıklanamaz olduğu an dürüstleşiyor.

K5 — Sihirbaz 3. adımdan "Öncelikler"i çıkar · risk: orta · ürün onayı gerekir

src/features/sihirbaz/components/sihirbaz-adimlar.tsx:472-491 · sabit: sihirbaz-sabitler.ts:10-18 3. adım bugün iki karar istiyor: üniversite tipi (3 çip) + öncelikler (7 çip, çoklu seçim). Öncelikler "listeyi daraltmaz" — yalnız prompt'a bir satır olarak giriyor (sihirbaz-sabitler.ts:182-184). Ve ürünün resmî akış belgesinde (huni-semasi.tsx) bu adım hiç yok. Ne siler: 7 çip + 2 açıklama satırı + oncelikler alanı (tip/doğrulama/prompt/fark hesabı geriye uyumlu bırakılır: eski profillerde dolu kalabilir, yeni akışta boş dizi). Neyi kaybederiz: AI gerekçelerinin kişisel tonu ("iş bulma kolaylığı" vurgusu), tercihFarki'nda bir karşılaştırma boyutu, danismaninBildikleri listesinde bir satır (listem-govde.tsx:129-131). Neden kabul edilebilir: Son adımda "hayatta senin için ne önemli?" diye sormak, bir liste kurma akışının en yorucu sorusu — hem soyut hem geri dönüşsüz hissettiriyor, hem de çıktıyı somut olarak değiştirmiyor. Adım 3 tek soruya (Devlet mi, vakıf mı?) inerse sihirbaz üç adımda üç soru olur. Not: Bu kesim /meraklisina şemasını değiştirmez (şema zaten öncelikleri anlatmıyor); tersine şemayla ekranı hizalar.


3. Silinebilecekler listesi (K1-K5 dışı)

⬇️ = riski düşük, tek başına alınabilir.

# Dosya:satır Ne siler Neyi kaybederiz Neden kabul edilebilir
S1 ⬇️ paket-satinal.tsx:104-119, 189-196 Paketi olmayan kullanıcıda top-up kartının tamamı "Kredi bitti mi?" başlığı ve açıklaması Kart paketsize zaten satmıyor; girişsizde ikinci, rakip bir CTA ("Önce giriş yap"), girişlide "önce paket gerekir" diyen bir paragraf. Ödeme ekranında satılmayan bir ürünün kartı duruyor.
S2 ⬇️ sohbet-client.tsx:536-548 Paketsiz kullanıcıda "Son N kredin — … kredi yükleyip kaldığın yerden devam edersin" satırı Kredi uyarısı (sayaç kart başlığında zaten var, :350-357) Yanlış bilgi: paketsiz kullanıcı /paket'te kredi yükleyemiyor (paket-satinal.tsx:189-196). Ekran "kredi yükle" diyor, gidilen sayfa "yükleyemezsin" diyor.
S3 ⬇️ app/page.tsx:300-336 (Sorun bölümü) Ana sayfadaki 3 kartlık "Tercih dönemi neden bu kadar stresli?" bölümü ~1 ekranlık empati anlatısı Akışı ilerletmiyor, tek CTA'sı yok, adayın zaten bildiğini söylüyor. Ana sayfayı ~8 ekrandan ~7'ye indirir.
S4 ⬇️ app/page.tsx:207-223 "Meraklısına" turuncu pill'i hero'dan değil, SSS'in altına taşı (ya da sil) Şeffaflık köprüsü SectionEyebrow'un tam yanında, farklı bir pill dili (turuncu, ArrowUpRight) duruyor — rozet tek kaynağıyla çelişiyor (AGENTS.md). Meraklısına, merak eden için; akışın 3. bölümünde dikkat çalıyor.
S5 ⬇️ listem-govde.tsx:353-357 (rapor-listesi.tsx:353-357) "Programlar ve ham veriler ücretsiz" yeşil satırı Bir güven cümlesi Aynı sayfada aynı şey 4 farklı cümleyle söyleniyor: H1 (:187), bu satır, kilit kartı (:276-281), paket kartı başlığı (:329-331). Biri yeter; en net olanı kilit kartındaki.
S6 ⬇️ listem-govde.tsx:184-188 Paketsiz H1'i "Veriyi ücretsiz incele. Kararı Yapay Zeka ile netleştir." → "24 tercihlik listen" Bir satış cümlesi H1 sayfanın işini söylemeli; bugün reklam sloganı. Başlık hiyerarşisi + "ekranın tek işi" kuralı.
S7 app/layout.tsx:95 (pb-28) Her sayfanın altındaki sabit 112px boşluk → koşullu hale getir Yüzen banner çakışma payı KaydetBanner yalnız girişsiz + ≥3 seçimli kullanıcıda çıkıyor (kaydet-banner.tsx:47); geri kalan herkes her sayfada 112px ölü alan kaydırıyor. Orta iş: sınıf, banner'ın görünürlüğüne bağlanmalı.
S8 giris-baslik.tsx:6-38 /giris H1'indeki sonsuz döngülü yazı animasyonu 6 slogan Ekranın tek işi e-posta almak; başlık sürekli oynuyor ve prefers-reduced-motion okunmuyor (typing-animation.tsx'te hiç geçmiyor) → WCAG 2.2.2 (A) "Pause, Stop, Hide". Bkz. §7.

4. Mobil (390px)

Tümü koddan çıkarım; Bilal'in gözle doğrulaması gereken liste en altta.

Sabit krom maliyeti: üst bant (sezon dışı, 2 satır) ~72px + başlık lg altında iki satır (site-header.tsx:12, flex-wrap) ~100px + mt-4 → ilk ekranın ~%21'i (844px varsayımıyla) içerik görmeden gidiyor. K1 bunun ~70px'ini geri verir.

Ekran Tahmini boy İlk ekranda CTA var mı?
Ana sayfa ~6.900px ≈ 8,2 ekran ✅ Var. Hero min-h-[calc(100svh-5.5rem)] + justify-center → puan türü çipleri, sıralama alanı ve "Yapay Zeka listemi kur" birlikte görünüyor. Akışın en sağlam ekranı.
/sonuc (girişsiz) ~3.650px ≈ 4,3 ekran ❌ Yok. İlk ekran: bant + başlık + boş gri harita kutusu + ~5 tablo satırı. Ana aksiyon (AI listesi) ~2,4 ekran aşağıda. K2 bunu ~7 satıra çıkarır ama CTA yine de yukarı gelmez.
/listem (paketsiz) ~3.900px ≈ 4,6 ekran ⚠️ Kısmen: harita + H1 + "Tercihlerimi düzenle" görünüyor; satın alma CTA'sı ~1,2 ekran aşağıda (satır 4).
/paket ~1.720px ≈ 2 ekran ⚠️ 844px'te "Paketi al" tam katlamada; 667px'te (iPhone SE) katlamanın altında. S1 (top-up kartını gizle) bunu düzeltmez; H1 bloğunu kısaltmak düzeltir.
Sihirbaz modalı max-h-[92dvh], iç kaydırma ✅ "Devam" alt çubukta sabit değil, panelin sonunda; adım 2'de il listesi max-h-56 ile kendi içinde kaydırılıyor → modal boyu patlamıyor. İyi çözülmüş.

Yatay taşma / sıkışma riskleri:

  • kaydet-banner.tsx:61 — tek satırlık flex (ikon 40px + metin + "Giriş yap, kaydet" butonu + çarpı), sm: kırılımı yok. 390px'te metne ~70-80px kalıyor → başlık kelimesi kelimesine sarıyor, buton eziliyor. Mobilde dikey dizilim gerekiyor.
  • program-tablosu.tsx / rapor-listesi.tsx — program adı truncate, üniversite adı truncate: uzun Türkçe adlarda ("İstanbul Medeniyet Üniversitesi", "Elektrik-Elektronik Mühendisliği (İngilizce)") mobilde satırın çoğu üç noktaya gidiyor. Taşma yok ama bilgi yok. title var, mobilde işe yaramıyor. Öneri: mobilde program adına 2 satır izni (line-clamp-2), üniversite satırı tek satır kalsın.
  • app/page.tsx:427-467 karşılaştırma tablosu overflow-x-auto içinde 4 sütun → 390px'te yatay kaydırma gerektiriyor; kaydırılabilir olduğuna dair görsel ipucu (gölge/fade) yok.
  • vh tuzağı yok: hero svh kullanıyor (app/page.tsx:230), modal dvh — doğru.
  • Sabit alt çubuk × klavye çakışması yok (sabit alt çubuk yalnız KaydetBanner, form yok).

5. 24'lük liste ekranı — boğuyor mu?

Hayır, yapı doğru. Boğan üç şey var, üçü de tekrardan geliyor.

Doğru olanlar (değiştirme):

  • Detay (gerekçe + risk notu + trend) varsayılan kapalı, satır tıklanınca açılıyor (rapor-listesi.tsx:300). Yani 24 satır aynı anda 72 metin bloğu değil, 24 satır gösteriyor.
  • /sonuc ham tablosu ile /listem raporu aynı satır dilini paylaşıyor (aynı sütunlar, aynı düzen) — öğrenci ikinci ekranda yeniden öğrenmiyor. Bu iyi ve korunmalı.
  • Uyarılar (kapsam.uyarlandi, tekIl) listenin üstünde ve koşullu — her zaman görünmüyorlar.

Boğan üçü:

  1. Kilitli 21 satırın tekrarı → K4.
  2. Aynı "ücretsiz/ücretli sınırı" mesajının 4 kez tekrarı → S5 + S6.
  3. 5 ayrı /paket girişi (listem-govde.tsx:288, :369, sohbet-client.tsx:351, :538, :546, ayrıca user-nav.tsx:64). Tek ekranda beş kapı, "kaç kere soracaksınız" hissi üretiyor. Kalması önerilen: satır içi kilit kartı (bağlamda, satırın tam orada) + sohbet başlığındaki kredi pill'i (aksiyon değil, durum göstergesi). Gidecek: sağdaki büyük paket kartı (:323-386) ile S2.

Öğrenci 24 satırı nasıl okuyor (varsayım — ölçümle doğrulanmalı): sırayla değil, tanıdık ada göre. Satırda öne çıkan tek şey program adı; tercih numarası (1-24) gri bir daire, dilim (hayal/dengeli/güvenli) ise satırda hiç görünmüyor — yalnız detay açılınca çıkıyor (rapor-listesi.tsx:81-88). Oysa listenin tüm değeri o dağılımda. Sadeleştirme önerisi (tek değişiklik): satırlar arasına dilim ayracı koy — "Hayal (1-5)", "Dengeli (6-18)", "Güvenli (19-24)" gibi 3 ince başlık satırı. Yeni bileşen değil, /sonuc tablosundaki DILIMLER etiketleri + ikonlarıyla aynı dil (program-tablosu.tsx:45-74), etiket tek kaynağı DILIM_ETIKET. Böylece 24 satır 3 okunur gruba iner ve "neden bu sırada?" sorusu satır açmadan cevaplanır. (Bu bir ekleme değil sınıflandırma: kaldırılan 21 kilitli detay kutusunun yerine geliyor.)

Kilitli satırlar dürüst mü? Kısmen.

  • ✅ Dürüst: program adı, üniversite, taban sıra ve trend kilitli satırlarda da gerçekten açık — vaat ("Program adları ve taban verileri her zaman ücretsiz", :278-280) tutuluyor.
  • ❌ Hayal kırıklığı üreten: (a) kilitli satırın açılabilir görünmesi ama hep aynı reklamı vermesi (K4); (b) mobilde kilidin karşılığı yalnız bir Lock ikonu — "Pakette" yazısı sm altında sr-only (:259), yani 390px'te sütun sessiz; (c) ilk 3 satırın açık olduğu satırlara bakmadan anlaşılmıyor: kilit kartı satır 4'te belirene kadar öğrenci kaçının açık olduğunu bilmiyor. Liste başlığında tek cümle ("İlk 3 tercihin analizi açık") bu belirsizliği bedava kapatır.

6. URAP genel sıralaması nasıl girer?

Kural olarak kabul edilenler: (1) atıf aktif link olacak ve tek sabit adres olacak: https://newtr.urapcenter.org/Rankings/2025-2026/GENEL-SIRALAMASI-2025 — Bilal'e gelen izin böyle diyor, güncellemeler otomatik yansısın diye. (2) Tablo yığını yok. (3) Renk yok: URAP sırası risk dili değildir, yeşil/kırmızı boyanmaz. (4) Yeni bileşen icat edilmez.

Nereye girmez (baştan reddedilenler): /sonuc tablosu ve /listem 24'lük liste satırları. URAP üniversite göstergesi, satırlar program satırı; 24 satıra bir sütun daha eklemek tam olarak istemediğimiz şey. Ayrıca aynı üniversite listede 3 kez geçerse aynı sayı 3 kez tekrarlanır.

Alternatif A — mevcut istatistik ızgarasında takas (ÖNERİLEN) src/features/katalog/components/universite-icerik.tsx:290-331 — sayfada zaten 4 kartlık bir metrik ızgarası var. URAP yeni bir kutu açmaz; "Tür" kartının yerine geçer.

/universite/[slug] — 390px

┌──────────────────────────────────────┐
│           [Türkiye haritası]         │   col-span-2 (mevcut)
└──────────────────────────────────────┘
┌──────────────────┐┌──────────────────┐
│ PROGRAM          ││ FAKÜLTE / BİRİM  │   (mevcut)
│ 312              ││ 24               │
└──────────────────┘└──────────────────┘
┌──────────────────┐┌──────────────────┐
│ URAP TÜRKİYE     ││ EN İYİ SIRALAMA  │   ← "Tür" kartının yerine
│ 18 / 183         ││ 1.240            │
│ 2025-2026        ││                  │
└──────────────────┘└──────────────────┘

… tablo …

Kaynak: YÖK Atlas 2026 yerleştirme sonuçları. Son güncelleme: 21 Eylül 2026.
Genel sıralama: URAP Türkiye 2025-2026 (urapcenter.org).   ← atıf, mevcut satırın devamı
                                           └ aktif link

Neden bu:

  • Kart sayısı artmıyor. Izgara 4 kart kalıyor, lg şablonu (grid-cols-[1fr_1fr_1.35fr] grid-rows-2, harita col-start-3 row-span-2) hiç değişmiyor — 5. kart bu şablonu kırardı.
  • "Tür" gitmeli çünkü üç yerde daha var: özet paragrafta, tablodaki her program satırının Devlet/Vakıf rozetinde ve /sonuc filtresinde. Tek başına bir metrik kartını hak etmiyor.
  • 18 / 183 biçimi tek sayının bağlamını taşıyor. "18." tek başına iyi mi kötü mü belli değil; payda öğrencinin kendi kafasında ölçeklemesini sağlıyor. Alt satırda dönem (2025-2026), çünkü sayfadaki diğer tüm sayılar YKS yılına ait — karışmasın.
  • Atıf ekranı kirletmiyor: VeriKaynagi (veri-kaynagi.tsx:18-31) zaten sayfanın tek "kaynak" satırı ve tablonun altında duruyor. URAP cümlesi oraya bir cümle olarak ekleniyor, yeni kutu yok. Aktif link şartı karşılanıyor, görünürlük sayfa altında kalıyor.
  • Boş durum: URAP'ta olmayan üniversitede (vakıf MYO'lar, KKTC, yeni kurulanlar) kart hiç çizilmez ve "Tür" kartı yerinde kalır. Yani ızgara her zaman 4 hücre, hiçbir sayfada "—" gösterilmiyor. Veri kapsamı docs/ekip-raporlari/2026-09-21/06-uni-veri.md:62'ye göre ~%95 ad eşleşmesi.

Alternatif B — H1 altı özet cümlesine göm universite-icerik.tsx:261-283'teki özet paragrafın ilk cümlesine:

"Boğaziçi Üniversitesi (İstanbul), URAP 2025-2026 Türkiye genel sıralamasında 5.; 2026 YKS yerleştirme sonuçlarına göre 312 programda öğrenci aldı…"

Artısı: sıfır yeni eleman, sıfır düzen değişikliği, en ucuz iş. Eksisi: taranabilir değil. Bilal'in niyeti "öğrenci kolayca görsün"; paragraf ortasındaki sayı gözle taranmaz, mobilde 7 satırlık metnin içinde kaybolur. Ayrıca atıf linki cümlenin ortasında durmak zorunda kalır (kaynak satırında değil) → okuma akışını böler.

Öneri: A. B yalnızca A'nın veri hattı hazır olmadan bir şey yayımlamak gerekirse geçici çözüm olur.

Tasarımın veri tarafına koyduğu şart (veri-muhendisi'ne): gereken tek alan urap_tr_sira (06-uni-veri.md:165 şemasında zaten var) artı sıralamadaki toplam üniversite sayısı (payda). Payda olmadan A alternatifi anlamını kaybeder. "Geçen yıla göre değişim" (Tablo 11) bu sürüme girmesin — ikinci bir sayı, ikinci bir okuma yükü.

Ayrıca [BİLAL] / ürün uyarısı: 06-uni-veri.md 8 göstergelik bir ilk sürüm öneriyor. Bu gece "çıkarma" gecesiyse: 8 gösterge = 8 kutu = tam olarak istemediğimiz tablo yığını. Öneri, URAP'ın tek başına ve takas yoluyla girmesi; kalan 7 gösterge ancak ızgara büyütülmeden, yine takasla ya da tablo altındaki tek bir satırda toplanarak değerlendirilsin.


7. Kural ihlalleri (kesimden bağımsız, düzeltilmeli)

# Dosya:satır Kural Kullanıcıya etkisi Düzeltme Büyüklük
R1 program-tablosu.tsx:306-314 AGENTS.md risk dili — "kırmızı/sarı/yeşil her zaman metin etiketiyle" /sonuc tablosunda risk yalnız renkli nokta, aria-hidden, metin etiketi hiç yok. Renk körü ve ekran okuyucu kullanıcısı için satır risksiz görünüyor. Dünkü vardiyada yan bulgu olarak not düşülmüş, kimse almamış. rapor-listesi.tsx:262-270 kalıbını kopyala (nokta + RISK_ETIKET[risk]) S
R2 rapor-listesi.tsx:259, 267 Aynı kural + mobil öncelik Etiket sm altında sr-only → 390px'te gören kullanıcı yalnız rengi görüyor. Trafiğin ~%90'ı mobil. sr-only sm:not-sr-only → her zaman görünür; sığmıyorsa tek harfli değil, kısaltılmış tam etiket S
R3 giris-baslik.tsx:26-38 + components/ui/typing-animation.tsx (dosyada prefers-reduced-motion hiç geçmiyor) WCAG 2.2.2 (A) "Pause, Stop, Hide" + prefers-reduced-motion Giriş sayfasının H1'i sonsuz döngüde yazılıp siliniyor; durdurulamıyor, hareket azaltma ayarı yok sayılıyor. Vestibüler duyarlılık + dikkat dağıtma; ekranın tek işi form doldurmak. S8 (kaldır) ya da en az: useReducedMotion() ile tek sabit metne düş S
R4 sihirbaz-cagri-karti.tsx:322 (text-white/70 · bg-primary) WCAG 1.4.3 kontrast Hesaplanan oran 2,57:1 (gereken 4,5:1). "Kredi kartı gerekmez · Google ya da e-posta ile 30 saniyede" — tam da tereddüdü kıran cümle, okunmuyor. text-white/70 → text-white (oranı 3,68:1'e çıkarır; tam uyum için zemin koyulaşmalı — [BİLAL], palet) S
R5 sihirbaz-cagri-karti.tsx:301, 337 (text-white/90 · bg-primary) WCAG 1.4.3 3,26:1. Panel gövde metinleri. aynı S
R6 site-top-banner.tsx:120 (opacity-85, text-xs) WCAG 1.4.3 Beyaz üstü --primary zaten 3,68:1; %85 opaklıkla ~3,0:1. Bandın en uzun cümlesi. K1 zaten bandı kaldırıyor; sezon içinde opaklık kalksın S
R7 48 kullanım, ör. sihirbaz-adimlar.tsx:228, 381, 406, 442, 473 · program-tablosu.tsx:217, 278 WCAG 1.4.3 text-slate-400 (#94A3B8) beyaz üstünde 2,57:1, bg-slate-50 üstünde 2,45:1. Sihirbazın "Adım 1/3" göstergesi, alan başlıkları ("ÜNİVERSİTE TİPİ", "SENİN İÇİN ÖNEMLİ OLAN"), tablo sayaçları okunmuyor. Metin taşıyan yerlerde text-slate-400 → text-slate-500 (4,76:1 ✅). Yalnız ikon/dekor kalabilir. M (sistemik)
R8 sihirbaz-cagri-karti.tsx:284 AGENTS.md CTA deseni "Listeni gör" butonunda sondaki ArrowRight yok; sitenin diğer tüm funnel CTA'larında var. <ArrowRight className="size-4" aria-hidden /> ekle XS
R9 app/page.tsx:209-220 AGENTS.md rozet tek kaynağı SectionEyebrow'un tam yanında elle yazılmış turuncu pill duruyor; aynı yerde iki farklı rozet dili. S4 (taşı/sil) ya da SectionEyebrow + link S
R10 sihirbaz-adimlar.tsx:319 (size-5 = 20px), kaydet-banner.tsx:102 (p-1 + size-4 ≈ 24px), sohbet-client.tsx:344 (size-7 = 28px) WCAG 2.5.8 (AA) 24px · ürün hedefi 44px İl aramasını temizleme, banner'ı kapatma, sohbeti temizleme — hepsi parmakla ıskalanıyor. size-9/size-11'e çıkar (dialog kapatma çarpısının kanonik size-9 seti zaten var) S
R11 program-tablosu.tsx:391, 398 Tek kaynak / ölü sınıf ProgramEkleButonu tabanı size-11 min-h-11 min-w-11; buradan className="size-8 min-h-8 min-w-8" geçiliyor ama cn()/tailwind-merge yok (program-ekle-butonu.tsx:112 düz şablon) → iki sınıf birden DOM'da, hangisinin kazandığı CSS sırasına kalmış. Ana akışın en kritik butonu (+) belirsiz boyutta. Ya override'ı kaldır (44px kalsın) ya da cn() kullan; ikisi birden olmasın S

8. Çapraz kontrol — 04-liste-maliyet-ve-oneriler.md (yapay zekâ mühendisi)

Rybbit rakamı gelmedi, ama iki bulgum bağımsız bir kaynakla kanıtlandı:

  • K5 (Öncelikler çıksın) → destekleniyor. O raporun 1. maddesi: "Yapay zekâ listeyi kurmuyor, listeyi dolduruyor… hangi dilimde olacağını, satırların sırasını, risk ve trend cümlelerini kod belirliyor." Yani "Öncelikler" çiplerinin listenin yapısına etkisi yok; etkisi yalnız satır başına yazılan tek gerekçe cümlesinin tonunda. Ekranda 7 çip + 2 açıklama satırı karşılığında alınan şey bu kadar.
  • §5 kilitli satır bulgusu → destekleniyor ve büyüyor. O raporun 4. maddesi kilitli 21 satırı ürün/fiyat açısından da sorunlu buluyor ("teaser doğru ama teaser'ı deneme kredisiyle ücretlendirmek yanlış"). Benim tarafım yalnız görünüş: aynı satış kutusunun 21 kez tekrarı (K4). İkisi aynı yerde buluşuyor — kilitli satır deneyimi bu gecenin en çok kanıtlı düzeltme alanı.
  • Varsayım olarak kalanlar (ölçümsüz): /sonuc'ta iki panelden hangisinin daha çok tıklandığı (K3 hangisinin kalacağını rakam belirlemeli), ana sayfadaki "Sorun" bölümünün kaydırma derinliği (S3), öğrencinin 24 satırı nasıl okuduğu (§5).

Bilal'in gözle kontrol etmesi gerekenler

Tarayıcıyı açmadım; bu listeyi telefonda (390px civarı) açıp bakman yeterli:

  1. /sonuc, girişsiz, yeni sekmede — üstteki boş gri kutu (K2) ve ilk ekranda kaç program satırı göründüğü. Aşağı in: art arda iki turuncu/lacivert giriş paneli (K3) gerçekten üst üste mi?
  2. /listem, paketsiz hesapla — 4. satırdaki kilit kartından sonra kilitli satırlardan birine dokun (K4): aynı kutu mu geliyor? Kaç kere /paket'e giden bir şey sayıyorsun?
  3. /listem ve /sonuc risk sütunu telefonda — nokta var, yazı var mı? (R1/R2)
  4. /giris sayfası — başlıktaki yazı animasyonu ne kadar sürüyor, duruyor mu? (R3/S8)
  5. /paket iPhone SE boyutunda (667px) — "Paketi al" butonu kaydırmadan görünüyor mu?
  6. Sezon bandı — bugün ne yazıyor, kaç satır kaplıyor? (K1)

Bilal'den istenen

  1. K1-K4'e onay (sezon bandı sezon dışında yok · /sonuc boş harita kutusu yok · /sonuc'ta iki giriş panelinden biri yok · kilitli satırlar tek tek açılmıyor) — dördü de geri alınabilir, hepsi ayrı commit olur. ~5 dk okuma.
  2. K5 ürün kararı: sihirbazın 3. adımından "Öncelikler" 7 çipi kalksın mı? Listeyi daraltmıyor ve /meraklisina şemasında zaten yok; kalkarsa sihirbaz üç adımda üç soru olur. ~3 dk.
  3. URAP için A alternatifine onay (üniversite sayfasındaki "Tür" kartı → "URAP Türkiye 18/183" takası, atıf VeriKaynagi satırına aktif link olarak) ve 06-uni-veri.md'deki 8 göstergenin hepsinin birden kutu almaması kararı. ~5 dk.