# 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. | `` 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.**