Commit Graph

264 Commits

Author SHA1 Message Date
bilalgursen
2099f20ed1 feat(tasarim): form alanları hap, CTA bandı tek kaynak, masonry piksel zemin, çekmeceler §4.10
- Input/Select/Textarea: shadcn'in ince varsayılanı yerine üst çubuk
  haplarıyla aynı kalıp (h-12, rounded-full, slate-200, 16 px; md:text-sm
  yok); kullanım yerleri yalnız yerleşim sınıfı taşır. DESIGN.md §4.6
  tam sınıf dizisi; denetime ince-form-alani (hata) ve ham-input (uyarı)
- CtaBandi (mavi zemin + piksel doku) tek kaynak: /sonuc iki panel, katalog
  altı kart, "Kendi Listem" çekmecesi altı. Ana sayfa kapanışı koyu
  PikselCtaYuzeyi + 24'lük piksel liste kreatifiyle kalır (Bilal: "orası
  bayağı iyiydi"); yazılıp silinen satır kaldırıldı
- PixelMasonry: CTA arka planları büyüklü küçüklü, hafif kaymış kareler;
  eşit ızgaralı PixelField kaldırıldı
- Çekmece başlığındaki 12×2 piksel liste kaldırıldı (çok dolu); sayı +
  ilerleme çubuğu + risk dağılımı geri geldi
- "Saniyede gör" çekmecesi §4.10 düzeninde: ortalı DrawerTitle + bağlam,
  rozet ve çizgili "neler alacaksın" listesi yok; kapı modalındaki iki
  rozet kalktı; denetime modal-rozet (hata)
- Kapı panelinde 3 px odak halkası kırpılmıyor (px-px → p-1)
- Liste satırı: üniversite adı + tür/il/süre adın altında tek akan satır,
  telefonda text-xs (SATIR_ALT_GRUP); katalog listelerinde ad kendi
  satırında (SATIR_GRUP space-y-2). Ölçüm 375 px canlı bölüm sayfası:
  satır yüksekliğini metin değil alt alta iki 44 px düğme belirliyor

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 12:08:24 +03:00
bilalgursen
4d3bebab76 feat(tasarim): katalog sayfası alt CTA kartı funnel yüzeyinde (piksel liste)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 02:14:04 +03:00
bilalgursen
71e6389131 feat(tasarim): funnel CTA'ları arama kartı dilinde, 24'lük piksel liste kreatifi
- PikselCtaYuzeyi: koyu slate-950 yüzey, yazılıp silinen satırlar, tek
  turuncu CTA (arama penceresindeki kartın dili); ana sayfa kapanışı ve
  /sonuc'taki iki panelde köşeye kümelenen PixelField'in yerine
- PikselListe: 24 kare = 24 tercih; kendini kurar (5 hayal · 13 dengeli ·
  6 güvenli), imlece tepki verir, CTA'ya gelince tamamı dolar, dokunmada
  nabız; hareketi azalt'ta durağan; renk hep metinle
- Liste çekmecesi: ilerleme çubuğunun yerinde öğrencinin kendi listesi
  pikselde (her kare o tercihin riski); başlık yan yana dizildi, liste
  alanı 150 → 234 px (375 px ölçümü)
- Funnel metinleri src/lib/funnel-metinleri.ts'e taşındı

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 02:12:45 +03:00
bilalgursen
96b1516e35 fix(tasarim): karşılaştırma tablosu kaymıyor; çekmecede tek çarpı; bildirimler eski hâlinde
- Ana sayfa karşılaştırması telefonda/tablette yana kayıyordu: lg altında
  özellik başına satır + üç sütun, sütun adları yapışık (96/128 px, ölçüldü);
  lg'de tablo, taşma yok
- Liste çekmecesinde kapatma çarpısı ile satır çıkarma çarpısı aynı
  görünüyordu: satırda çerçevesiz "−" (CircleMinus)
- Bildirim (toast) görünümündeki değişiklik geri alındı (uyumsuzdu)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 02:05:47 +03:00
bilalgursen
97e57aafa1 fix(tasarim): geniş ekranda tek satırlık liste satırı dikeyde ortalı
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 01:48:17 +03:00
bilalgursen
1a176dd085 feat(tasarim): geniş ekranda liste satırları ince
- Tür/il/süre satırı sm'den itibaren adla aynı satırda (SATIR_GRUP)
- lg'de hücre dolgusu bir kademe az, satır düğmeleri 36 px (§8)
- 1280 px ölçüm: bölüm listesi 83 → 61 px; /sonuc 68 px (uzun adda 92)
- Telefonda değişiklik yok (44 px düğme, alt alta düzen)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 01:45:03 +03:00
bilalgursen
939da13012 fix(ux): /listem telefonda yana taşıyordu; başlık yer söylüyor; kaydet bandı
- /listem ve üretim ekranındaki ızgaranın telefonda sütun tanımı yoktu;
  en geniş çocuk sayfayı 434 px'e itiyordu (375 px'te yatay kaydırma).
  grid-cols-[minmax(0,1fr)] ile düzeldi (ölçüldü: 375)
- /listem h1: pazarlama cümlesi yerine "Tercih listen" + "24 tercih:
  5 hayal · 13 dengeli · 6 güvenli"; paketsizde eski cümle alt satırda
- Başlık düğmeleri 44 px, hover tek turuncu
- "Listen yalnızca bu tarayıcıda" bandı telefonda başlığı kelime kelime
  kırıyordu: metin üstte, düğme altta tam genişlik; kanonik çarpı

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 01:36:11 +03:00
bilalgursen
ad086c3eca feat(ux): anlamsal yapı ve metin — içeriğe geç linki, sıralama yok sayfası
- Site geneli "İçeriğe geç" linki (klavyede ilk durak, WCAG 2.4.1)
- Sıralama yok sayfası: "Geçerli bir sıralama gerekli" yerine "Önce
  sıralamanı gir" ve ne işe yaradığı; CTA ok sonda, 48 px
- Rapor satırı aç/kapa düğmesi açtığı bölgeye bağlandı (aria-controls)
- Liste hazırlanırken "sayfayı kapatma" uyarısı 12 px griden okunur
  boya; bekleme metinleri "…" ile; başlık iri
- /sonuc başlığında dengeli satır kırılımı (text-balance)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 01:31:20 +03:00
bilalgursen
aef4adc90b feat(ux): listeden silme geri alınabilir; better-ui skill'i eklendi
- Çekmecede "Listeyi temizle" ve satır çıkarma (düğme ve kaydırma)
  anında siliyordu, geri dönüş yoktu. Artık 8 sn "Geri al" bildirimi;
  çıkanlar eski sıralarına döner, arada eklenenler korunur
- Çekmece kaydırması sayfaya taşmıyor (overscroll-contain)
- .claude/skills/better-ui: Jakub Krehel'in UI cilası skill'i (ui-skills.com);
  başına DESIGN.md önceliği ve çakışan iki değer notu eklendi

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 01:29:51 +03:00
bilalgursen
169080df9d feat(ux): sihirbaz adımları adlandı; Emil Kowalski ilkeleriyle hareket inceltmesi
- Adım göstergesi: Alan · Şehir · Öncelik; dolum transform ile soldan,
  güçlü ease-out 300 ms; adım değişimi ekran okuyucuya duyurulur
- Çekmecede "Listen tamam" satırı @starting-style ile küçük giriş
  (scale 0.95 + opaklık); hareketi azalt'ta yalnız opaklık
- Dilim sekmesindeki kayan hapta sekme kaldırıldı (bounce 0, 0.35 sn)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 01:27:11 +03:00
bilalgursen
e29a0ceb9a feat(ux): liste çekmecesinde denge ve tamamlanma
- Listenin risk dağılımı metinle ("Az riskli 20 · Güvenli 4")
- 24/24'te "Listen tamam" satırı; durum satırı ekran okuyucuya duyurulur
- Riskleri bilinen 6+ tercihli listede güvenli yoksa tek cümlelik ipucu

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 01:25:26 +03:00
bilalgursen
f4df52000b feat(ux): /sonuc'a tek cümlelik cevap, liste durumu ve kilometre taşları
- Sayfanın h1'i yoktu: "Sıralamanla açılan programlar" + "85.000.
  sıradasın (Sayısal). 4.760 program sana açık" başlığı en üstte;
  tadımlık altında (375 px'te hâlâ ilk ekranda, 474 px)
- Başlık altında liste durumu: boşsa + ipucu, doluysa "Listende 3/24
  program · 21 yer kaldı" düğmesi çekmeceyi açar
- + ile ilk programda ve 24/24'te tek seferlik sakin onay; liste
  doluyken ne yapılacağını söyleyen mesaj
- Bildirimler 16 px başlık, okunur açıklama, sitenin köşesiyle
- Başlık ve tablo aynı sorguyu React cache ile paylaşıyor

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 01:23:20 +03:00
bilalgursen
3500bb3745 feat(tasarim): kalan küçük ekranlar (rehber, sıralama, üniversite listesi)
- Türkiye sıralaması satırı §4.15: ad sarar, 16 px; satır hover'ı
  turuncu; Cal Sans sırada tabular-nums kalktı
- Rehber yol satırı 14 px ve turuncu hover; üniversite dizini hover
- Logo monogramı 10 → 12 px; arama kartındaki elle hex → slate-950
- Denetim: satırın tamamı link olduğunda group-hover mavi ad çifti de
  istisna sayılıyor

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 01:07:19 +03:00
bilalgursen
7dff241eb6 feat(tasarim): ana sayfa ve her sayfadaki ortak parçalar dile göre
- Landing kartlarının hover'ı tek turuncu (§4.4)
- Güven bandında sayı üstte ve iri, etiket altında (§1.1)
- "Dürüstlük notu", alt bilgi başlıkları, arama penceresi başlıkları
  büyük harften çıktı; 10-11 px yazılar 12 px'e
- Alt bilgi linklerinin hover'ı turuncu

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 01:05:56 +03:00
bilalgursen
aa0a03cda9 feat(tasarim): sihirbaz adımları "şişko ve sade" dile göre
- Çipler 44 px (il çipleri 40 px), yarı kalın, hover tek turuncu,
  basınca küçülür; seçili il çipleri turuncu yerine mavi (tek turuncu
  ekranın CTA'sında)
- Büyük harfli minik etiketler ve 10 px sayaçlar kalktı; başlıklar 20 px
- İl arama kutusu 44 px, 16 px yazı (iOS yakınlaştırmasın)
- 3. adım 375 px'te pencereden taşıyordu: öncelikler telefonda iki
  sütun, alt düğmeler h-11 (ölçüm: 771 → 740 px, kaydırmasız)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 01:03:06 +03:00
bilalgursen
309fb73a34 feat(tasarim): rapor listesi ve tadımlık satırı "şişko ve sade" dile göre
- Risk etiketi src/components/risk-etiketi.tsx'e çıkarıldı; /sonuc,
  çekmece ve rapor listesi oradan kullanıyor
- Rapor satırı §4.15: ad sarar, üniversite adı ayrı satırda, telefonda
  risk + taban sıra adın altında, logo gizli (satır 214 → 152 px),
  aç/kapa düğmesi 44 px, hover tek turuncu
- Açılan ayrıntı: 16 px metin, 14 px koyu etiket, rounded-xl iç kutular
- Tadımlık satırı aynı satır düzenine geçti
- Tercih değişti penceresi, liste gövdesi ve yazdırma sayfasında
  10-11 px / büyük harfli etiketler kalktı

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 00:57:27 +03:00
bilalgursen
73943b0954 feat(tasarim): liste çekmecesi "şişko ve sade" dile göre
- Başlık ortalı (§4.10), çarpı ve temizle düğmesi kanonik size-9
- Satırlar çerçevesiz liste satırı; ad sarar, üniversite adı ayrı
  satırda, risk etiketi metin + renkle adın altında, çıkar düğmesi 44 px
- Alt bant telefonda alt alta: başlık üç satıra kırılıp listenin yerini
  yiyordu (liste 232 → 279 px, 375 px ölçümü)
- 10-11 px yazılar ve mavi hover'lar kalktı; navbar sayaç rozeti 12 px

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 00:48:57 +03:00
bilalgursen
f02494ef78 feat(tasarim): /sonuc program tablosu "şişko ve sade" dile göre
- Liste satırı sınıfları src/components/liste-satiri.ts'e çıkarıldı;
  üniversite, bölüm ve /sonuc tabloları oradan okuyor
- /sonuc satırı: ad sarar, üniversite adı ayrı satırda ve düzgün
  harfle, telefonda risk + taban sıra adın altında, 44 px butonlar,
  "boş kaldı" 12 px altından çıktı
- Dilim sekmeleri 375 px'te taşıyordu (418 px); telefonda üç eşit hap
- Tercih kapısında büyük harfli etiketler SectionEyebrow'a, harita
  şeridinde 10 px yazılar 12 px'e

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 00:44:59 +03:00
bilalgursen
5b51fd16e0 feat(tasarim): bölüm sayfası "şişko ve sade" dile göre
- Başlık bloğu lg altında ortalı, kimlik hapları (düzey + puan türü),
  dört özet kartı (Program, Devlet, Vakıf, En iyi sıralama), piksel ayraç
- OzetKart src/components/ozet-kart.tsx'e çıkarıldı; üniversite ve bölüm
  sayfası oradan kullanıyor. 6-7 haneli sayı birimle kısalıyor (ölçüldü)
- Program listesi §4.15: ad sarar, varyant ayrı satırda, 44 px butonlar,
  telefonda taban sıra adın altında, butonlar alt alta
- Sayfalama 44 px, telefonda tek satır; hover'lar tek turuncu
- Denetim: kanonik liste satırı adının mavi hover'ı artık uyarı vermiyor

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 00:39:21 +03:00
bilalgursen
6a9af19ef2 feat(tasarim): üniversite sayfası "şişko ve sade" dile göre baştan, DESIGN.md know-how'ı
Üniversite sayfası (canlı referans ekran /universite/ankara-universitesi):
- Program listesi: ad kesilmez/sarar, telefonda taban sıra alt satıra iner,
  satır butonları 44 px, tür çipi okunur boyda
- Başlık bloğu lg altında ortalı (logo başlığın üstünde), kimlik hapları
  (Devlet/Ankara) navbar ölçüsünde, ikon + metin
- Harita yanında 4 özet kartı (OzetKart): sayı solda iri, ikon sağda;
  4. kart URAP Türkiye sırası + piksel sıra şeridi (PixelSira)
- Akademik göstergeler (URAP + YÖK İstatistik) sayfadan "Akademik
  göstergeler ›" satırının açtığı alt sayfaya taşındı: kartsız, ortalı,
  masonry gösterge kareleri, tek ekrana sığar
- Hover tek turuncu (orange-500); liste satırı adı mavi kalır
- Üst çubuk başlık geçişi (NavBaslik): h1 kaydırılınca üst çubukta logo +
  ad belirir; bölüm sayfasında da (yalnız ad)

Tasarım dili:
- DESIGN.md: temel his (§1.1), hover kuralı (§2.1), yazı alt sınırları,
  yeni tek kaynak parçalar (§4.8–4.15), lg altı ortala (§5.2), reddedilen
  denemeler (§7), ölç-tahmin-etme ve tuzaklar (§9)
- Denetim: gösterge karesi renk istisnası (bg-indigo-500, bg-green-600) ve
  site taraması için dört uyarı (minik-yazi, buyuk-harf-etiket, mavi-hover,
  iri-sayi-tabular)

Not: universite-icerik.tsx'teki akademik göstergeler bölümü (URAP/YÖK
kartları) Bilal'in commit'lenmemiş işiydi; tasarım değişiklikleriyle aynı
dosyada iç içe olduğu için bu commit'e girdi.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 00:01:41 +03:00
bilalgursen
5df0af0d38 feat(katalog): YÖK İstatistik öğrenci/öğretim üyesi verisi ve Türkiye sıralaması sayfası
- src/lib/yok-istatistik.ts (scripts/yok-istatistik-uret.py ile üretilir):
  üniversite başına örgün öğrenci ve öğretim üyesi, öğrenci/üye oranı ve
  Türkiye medyanı; katalog detayına `istatistik` alanı
- /universite-siralamasi: URAP Türkiye sıralaması sayfası (URAP logosu ve
  zorunlu urapcenter.org atfıyla), sitemap'e eklendi
2026-09-24 00:01:41 +03:00
bilalgursen
22accb1241 fix(sonuc,liste): tadımlık listesi olanda tablonun altına iner, çekmecede risk etiketi metinle
- /sonuc: kayıtlı listesi olan ziyaretçide harita ile ekleme tablosu arasına
  tadımlık CTA'sı girmez, tablonun altına iner (karar sunucudaki liste sayısı
  çerezinden, hidrasyonda zıplamaz)
- Liste çekmecesi: risk noktası tek başına değil RISK_ETIKET metniyle
- Sıralama formu: kompakt başlık düzeni
2026-09-24 00:01:40 +03:00
bilalgursen
ec002d7cfc chore(tasarim): denetim uyarıları kapatıldı, bulgu ajanları sonnet'e alındı, skill eval seti
All checks were successful
Deploy / deploy (push) Successful in 5m43s
- giris-form / odeme-sonuc-karti: emoji yerine lucide ikon ya da düz metin (DESIGN.md §4.7)
- tasarim-denetim: rehber kapak görseli hex kuralından muaf (OG ile ortak sabit palet)
- analitik, seo-geo, marka, rehber-editoru, qa-muhendisi: model: sonnet (kod yazmayan,
  bulgu üreten ajanlar); QA'da deneme bütçesi (en fazla iki e-posta servisi, üç deneme,
  yeniden üretim yalnızca şüpheli sonuçta)
- kolaytercih-tasarim/evals.md: skill kapalı/açık karşılaştırması için üç istek + kontrol listesi

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-23 16:49:22 +03:00
bilalgursen
dc7861737b feat(tasarim): görsel dilin tek kaynağı DESIGN.md, proje skill'i ve tasarım denetim betiği
All checks were successful
Deploy / deploy (push) Successful in 5m33s
- docs/tasarim/DESIGN.md: 9 bölümlük görsel dil belgesi (renk rolleri, tipografi,
  tek kaynak bileşenlerin sınıf dizileri, yerleşim, yap/yapma, brief şablonu)
- kolaytercih-tasarim skill'i: UI işinde tetiklenir, belgeye götürür, örnek verir;
  tasarimci ve yazilimci ajanlarına skills: ile önyüklenir
- scripts/tasarim-denetim.ts: 13 kural (Badge, CTA'da Sparkles, palet dışı ton,
  gradyan metin, parlama, hareket spam'i, çarpı, font); pnpm lint'e bağlandı
- ui-ux-pro-max genel kataloğu skills'ten .agents/skills-devre-disi/ altına taşındı
- AGENTS.md: DESIGN.md kuralı; rozet sınıfı koda göre düzeltildi (font-bricolage yoktu)
- arama-funnel-karti: palet dışı text-cyan-300 → text-orange-500

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-23 14:44:35 +03:00
bilalgursen
826d9ffbcb Merge branch 'gece/0922-olcum' into is/0923-birlesik 2026-09-23 11:33:51 +03:00
bilalgursen
060e6534c9 Merge branch 'gece/0922-risk-etiketi' into is/0923-birlesik 2026-09-23 11:33:51 +03:00
bilalgursen
e33ef4231f Merge branch 'is/0923-harita-ustte' into is/0923-birlesik 2026-09-23 11:27:46 +03:00
bilalgursen
e8434dc054 feat(universite): tür, ızgaraya değil H1'in altındaki kimlik çipine döndü
Izgara 5 karta çıkamıyor: lg:grid-cols-[1fr_1fr_1.35fr] + lg:grid-rows-2
şablonunda harita 3. sütunu iki satır kaplıyor, kartlara tam 4 hücre kalıyor.
Tür zaten bir metrik değil kategori; sitenin geri kalanında (program tablosu,
rapor listesi, tadımlık, bölüm listesi) başlığın altında çip olarak yaşıyor,
detay sayfası bunu taşımayan tek yüzeydi.

- Tür çipi H1'in altına girdi; sınıf seti program-tablosu.tsx:329-333'ten
  birebir kopya (yeni varyant yok). Sayfalama sayfalarında da yazar.
- URAP'ı olmayan 31 sayfada ızgaranın 4. hücresi "Tür" yerine "Toplam
  kontenjan" oldu; toplam kontenjanı 0 olan üniversite yok, o hücrede "—"
  çıkmıyor.
- UNITUR_ETIKET bileşenin içinden src/lib/unitur.ts'e çıktı (DILIM_ETIKET'in
  lib/risk.ts'te durması gibi tek kaynak) ve bölüm listesi rozetleri de buna
  bağlandı: "Kktc" → "KKTC", "Vakıf Myo" → "Vakıf MYO".
- Özet cümledeki "…, devlet üniversitesi, …" telafisi kalıyor: tür bir kez
  taranabilir çip, bir kez okunabilir cümle olarak geçiyor.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 11:14:54 +03:00
bilalgursen
ea4b30a842 fix(sonuc): harita en üste çıkar, liste sayısı çerezi kaymayı sıfırlar
Manuel listenin haritası /sonuc'ta tablonun altından sayfanın en üstüne
alındı: listesini kurmuş ziyaretçi ekranda önce kendi listesini görür.
Liste boşken harita DOM'a hiç girmez — yer tutucu da çizilmez, tadımlık
main'in ilk çocuğu kalır ve first:mt-0 çalışmayı sürdürür. Yani ürünü ilk
kez gören ziyaretçide sayfa sırası hiç değişmiyor.

Çerez neden gerekti: manuel liste localStorage'ta yaşıyor, store'un sunucu
snapshot'ı her zaman boş liste dönüyor. Harita yukarıdayken kayıtlı liste
ancak hidrasyondan sonra okunabildiği için harita sonradan belirip sayfayı
itiyordu (mobilde ~146 px, masaüstünde ~368 px; CLS ~0,13 / ~0,35). Client
artık listenin yalnızca UZUNLUĞUNU kolaytercih.liste-sayi çerezine aynalıyor
(kişisel veri ya da program kimliği yok, öznitelikleri kolaytercih.profil ile
birebir aynı); sunucu bunu okuyup haritaya ilk boyada tam ölçülü yer ayırıyor,
chunk inince kutunun yalnızca içi doluyor. Çerez hidrasyona kadar geçerli:
store okunduktan sonra tek doğru kaynak listenin kendisi, böylece bayat çerez
ya da çekmeceden boşaltılan liste durumunda boş harita ekranda kalmıyor.

Yanında: harita iskeletine motion-reduce:animate-none (artık katlamanın
üstünde, durdurulamaz nabız gösterilmemeli), yurt dışı şeridine sabit
yükseklikli loading yer tutucu (ssr:false + loading'siz dynamic, yoktan
beliren ~104 px). Kararın tersini belgeleyen üç yorum bloğu da güncellendi.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 10:58:53 +03:00
bilalgursen
fa7f228822 Merge branch 'gece/0922-urap' into is/0923-uni-tur 2026-09-23 10:49:40 +03:00
bilalgursen
4c756c41fd fix(universite): üniversite türü özet paragrafın ilk virgülüne döndü
Dün gece bu dalda URAP sırası "Tür" kartının yerini alırken devlet/vakıf
bilgisi URAP'ta yer alan 198 üniversite sayfasından tamamen düştü — gerekçe
"bilgi sayfanın başka yerinde zaten var" idi, doğrulandı ki değil
(bogazici-universitesi.html'de "Devlet" 0 kez, koc-universitesi.html'de
"Vakıf" 0 kez geçiyordu). Bu commit o bilgi kaybının telafisi.

Telafi özet paragrafın ilk virgülünde duruyor: "… (İstanbul), devlet
üniversitesi; 2026 YKS yerleştirme sonuçlarına göre …". Yeni kutu, yeni
bileşen, yeni rozet yok; ızgara 4 kart kalıyor.

Metin `trBaslikDuzeni` ile değil, dünkü commit'te eklenen `UNITUR_ETIKET`
haritasıyla üretiliyor; harita cümle biçimini de taşıyacak şekilde
genişletildi (kart etiketi + cümle öbeği tek kaynakta). `trBaslikDuzeni`
tr-TR küçültmesi yaptığı için 6 `unitur` değerinin 4'ünde bozuk metin
üretiyordu ("Kktc", "Yurtdısı Kamu"). Haritada olmayan ya da NULL bir
değerde öbek hiç yazılmaz, cümlede kopuk virgül kalmaz.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 10:01:41 +03:00
bilalgursen
0e689e60bb fix(katalog): "Tür" kartı ham DB değerini okunur Türkçeyle gösterir
Denetim O3: P2 üç kurumun `unitur`'ünü düzeltince (DEVLET → KKTC /
YURTDISI KAMU) ve P3 "Tür" kartını yalnız URAP dışındaki 31 kurumda
bırakınca, `trBaslikDuzeni`nin tr-TR küçültmesi ("I" → "ı") ekrana
Türkçede olmayan kelimeler bastı: "YURTDISI KAMU" → "Yurtdısı Kamu"
(6 sayfa), "KKTC" → "Kktc" (16 sayfa). Dün bu sayfalar "Devlet"
diyordu; yani kullanıcıya görünen bir gerileme.

Karta özel bir görüntüleme haritası (UNITUR_ETIKET) eklendi:
Devlet / Vakıf / Vakıf MYO / KKTC / Yurt dışı (kamu) / Yurt dışı (vakıf).
Haritada olmayan bir değer için mevcut davranış (`trBaslikDuzeni`) yedek
kalır. `src/lib/slug.ts`'teki `trBaslikDuzeni`ye dokunulmadı — il
adlarında da kullanılıyor ve oradaki davranışı doğru.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:49:15 +03:00
bilalgursen
58f4dc221b fix(olcum): huninin paydası ile payı aynı birimde olsun
Denetim Y1: `sihirbaz_adim{1}` `olayBirKez` ile oturum başına tekildi,
`{2}`/`{3}` ise her ileri geçişte atılıyor. Sihirbazı ikinci kez açan
öğrencide (ör. /sonuc'ta "Tercihlerini güncelle") payda 1'de kalıp pay 2
olduğu için 1→2 geçiş oranı %200 görünüyordu. `olayBirKez` → `olay`;
mount zaten "sihirbaz bir kez açıldı"ya eşit, 1→2→1→2 gezinmesi unmount
etmediği için tekrar düşmez.

Kodun kendi yazılı kuralı bunu zaten söylüyordu (lib/analitik.ts:22-24,
`liste_uretim_basladi`): aynı oturumdaki ikinci deneme de sayılmalı,
yoksa payda başarıdan küçük kalır.

KABUL KRİTERİ DÜZELTMESİ: CEO kararı P4/(1) "sihirbaz açılışında tam bir
kez düşer, 1→2→1→2 gidip gelmede tekrar düşmez" diyordu. Denetim bu
kriterin mevcut olay sözleşmesiyle çeliştiğini gösterdi; geçerli kriter
artık "her sihirbaz AÇILIŞINDA bir kez düşer" — oturum içindeki ikinci
açılış da sayılır. 1→2→1→2 gezinmesinde tekrar düşmeme şartı korunuyor.

SERİ KIRILMASI (ikinci, daha önce yazılmamıştı): `paket_goruntulendi`
allowlist'i 3'ten 13 değere çıktığı için tekilleştirme anahtarı çeşitlendi
— olayın oturum başına atılabilme tavanı 4'ten 14'e çıktı ve "diger"
kovası artık yalnız gerçekten bilinmeyen yüzeyleri taşıyor. Bu tarihten
önceki/sonraki toplamlar karşılaştırılamaz. Kod değişmedi, yalnız dosyaya
not düşüldü.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:48:24 +03:00
bilalgursen
493267122f feat(universite): "Tür" kartının yerine URAP Türkiye sırası
/universite/[slug] metrik ızgarasında takas: URAP listesinde olan
üniversitede "Tür" kartının yerini "URAP TÜRKİYE · 18 / 198 ·
2025-2026" alır, olmayan 31 kurumda "Tür" yerinde kalır. Kart sayısı
4'te kalıyor, lg ızgara şablonu değişmiyor, yeni bileşen yok, hiçbir
sayfada "—" ya da delik yok. Payda kartın içinde: "18." tek başına
yanıltır.

Tablonun altına AYRI ikinci kaynak satırı eklendi; VeriKaynagi
kullanılmadı ve kopyalanmadı, çünkü o satır YÖK Atlas'ın yerleştirme
yılına ve son güncelleme tarihine bağlı — URAP'ın dönemi başka.
Satırda metodoloji uyarısı da var: URAP akademik yayın ve araştırma
performansını ölçer, eğitim kalitesini ya da iş bulma oranını ölçmez.
URAP listesinde olmayan üniversitede eksiklik gizlenmiyor, nedeni tek
cümleyle yazılıyor (KKTC/yurt dışı ile MYO/yeni için ayrı cümle).

URAP'ın yayımlama izni "urapcenter.org adresine aktif bağlantı/atıf
vermek" şartına bağlıdır. Kaynak satırındaki bağlantı bu yüzden gerçek
bir <a href>: adres URAP_KAYNAK_URL sabitinden, target="_blank",
rel="noopener", nofollow YOK. Sıranın göründüğü ekran ile atıfın
göründüğü ekran aynı sayfadır; URAP sayısı yalnız ilk sayfada
gösterildiği için kaynak satırı da yalnız ilk sayfada çiziliyor.

Renk yok, rozet yok; URAP risk dili değildir. /universiteler hub'ında
URAP'a göre sıralama/filtre eklenmedi. URAP 24'lük listeye, /sonuc
tablosuna ve LLM prompt'una girmiyor — dokunulan dosya kümesi bunu
zaten dışlıyor.

veri-kalite.ts'e 5 URAP kontrolü (dosyanın en sonunda, tek satırlık
çağrıyla): (1) her URAP slug'ı bir üniversite sayfasına bağlı —
eşleşmeyen sessizce düşmüyor, adıyla listeleniyor; (2) kayıt sayısı =
URAP_TOPLAM; (3) sıralar 1..N tekrarsız ve boşluksuz; (4) puanlar
sıraya göre azalan; (5) kapsama boşluğu — URAP dışında kalan 150+
programlı bir Türkiye üniversitesi varsa UYARI (ad değişikliği
işareti). Beşi de geçiyor, boşluk 31 kurum.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:21:36 +03:00
bilalgursen
68cb69e458 feat(universite): URAP Türkiye 2025-2026 sıralaması veri sabiti
198 üniversitenin genel sıralaması, /universite/[slug] sayfa slug'ına
anahtarlanmış tek seferlik sabit (uni-koordinatlar.ts deseni). Yeni DB
dosyası, tablo, göç, cron ya da çekme betiği yok: 198 satır × 2 alan
için SQLite'ın hiçbir faydası olmazdı.

Eşleşme 198/198; URAP'ın yazımı bizim DB yazımımızla birebir aynı,
takma ad tablosu gerekmedi. Sıralar 1..198 kesintisiz ve tekrarsız,
puanlar sıraya göre azalan (veri-kalite kontrolleriyle doğrulanıyor).

URAP'ın yayımlama izni "urapcenter.org adresine aktif bağlantı/atıf
vermek" şartına bağlıdır: URAP sayısının göründüğü her yüzeyde, aynı
ekranda, URAP_KAYNAK_URL'ye çıkan gerçek bir <a href> (rel="noopener",
yeni sekme, nofollow YOK) bulunmak zorundadır. Link konulamayan bir
yüzeyde (ör. OG görseli) URAP sayısı hiç gösterilmez. Şart dosyanın
başındaki yorumda da yazılıdır.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:21:20 +03:00
bilalgursen
26893ce7cf feat(olcum): sihirbazın 1. adımı ve kaynaksız /paket linkleri ölçülür
(a) `sihirbaz_adim{adim:1}` artık sihirbaz modalı açıldığında atılıyor.
Bugüne kadar olay yalnız `adimaGit`in ileri geçişinde atılıyordu; modal
zaten 1. adımda açıldığı için 1. adım hiç "geçilmiyor", dolayısıyla hiç
sayılmıyordu ve huninin paydası `sira_girildi`den türetilmek zorunda
kalıyordu. Mount effect'i + `olayBirKez` ile tam bir kez düşüyor:
1→2→1→2 gezinmesi bileşeni unmount etmediği için tekrar tetiklemiyor,
sessionStorage tekilleştirmesi de aynı sekmede ikinci açılışı sayıyor.

SERİ KIRILMASI: bu değişikliğin canlıya çıktığı tarihten ÖNCEKİ
`sihirbaz_adim` serisinin paydası farklıdır — o dönemde `adim:1` hiç
atılmadı, seri yalnız 2 ve 3'ten oluşuyor. Öncesi ve sonrası
karşılaştırılamaz; huni okumalarında kırılma tarihi dipnot edilmeli.
Aynı desen `program_eklendi` için 21 Eylül'de uygulanmıştı.

(b) Kaynaksız 10 `/paket` linkine tekil `?kaynak=` eklendi; sitedeki 14
`/paket` linkinin 14'ünde artık kaynak var. Değerler mevcut şemayla
(`kilit`, `kredi_bitti`, `nav`) aynı dilde: fiyat_paket, fiyat_kredi,
kosullar, tercih_degisti, tercih_degisti_yetersiz, danisman_rozet,
danisman_kredi_bitti, danisman_kredi_az, odeme_geri, odeme_hata.

`paket-gorunum-olayi.tsx`'teki `KAYNAKLAR` allowlist'i de genişletildi:
listede olmayan her değer `"diger"`e düştüğü için, genişletilmeseydi 10
yeni kaynağın tamamı tek kovada toplanır ve ölçüm deliği kapanmazdı
(bağımlılık kapanışı — dosya şartnamenin listesinde yoktu, raporda
sapma olarak yazıldı).

Görsel değişiklik yok; yeni olay adı ya da yeni ölçüm yüzeyi eklenmedi.
Doğrulama: `next typegen` + `tsc --noEmit` + `lint` temiz.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:17:21 +03:00
bilalgursen
2dbc8b5039 fix(erisilebilirlik): risk göstergesinin adı satırda yazılı dursun
/sonuc program tablosunda risk yalnız renkli bir noktaydı (aria-hidden,
görünür metin yok); /listem'de etiket vardı ama sm altında sr-only idi.
Trafiğin büyük kısmı mobil olduğu için gerçek kullanıcı yalnız rengi
görüyordu. AGENTS.md: "kırmızı/sarı/yeşil her zaman metin etiketiyle
birlikte, renk tek başına anlam taşımaz."

- program-tablosu: nokta + RISK_ETIKET[risk] kalıbı rapor-listesi'nden
  birebir kopyalandı; boş kalan ilk sütun başlığı "Risk" oldu.
- rapor-listesi: risk etiketindeki sr-only sm:not-sr-only kaldırıldı.

Yeni bileşen/sabit/olay yok; etiket metninin tek kaynağı src/lib/risk.ts
içindeki RISK_ETIKET ve o dosyaya dokunulmadı.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:16:06 +03:00
c5769e2fbb Merge pull request 'fix(kredi): paketliden liste ve revizyon kredisi düşmez' (#6) from odeme/paket-vaadi into main
All checks were successful
Deploy / deploy (push) Successful in 9m49s
Reviewed-on: #6
2026-09-22 23:34:43 +03:00
2d7b65c77a Merge pull request 'fix(sonuc): ilk ekran ödeme öncesi tek gerçek önizlemeyi gösterir' (#5) from funnel/sonuc-ilk-ekran into main
Some checks failed
Deploy / deploy (push) Has been cancelled
Reviewed-on: #5
2026-09-22 23:33:57 +03:00
bilalgursen
e3519a50cc [Bilal] content(tadimlik): paragraf maskenin gerçeğini söyler
Buton "24 satırın tamamı" iddiasından arındırılmıştı (2373a9a) ama iki
eleman yukarıdaki paragraf aynı vaadi sürdürüyordu: "24 tercihlik
listenin her satırı bu formatta kurulur". Maske girişsiz/paketsiz
kullanıcıya 3 satır açıyor (rapor-maske.ts:12 ACIK_SATIR), kalan 21'in
gerekçe/risk/trend metni maskeli geliyor.

Cümleye "ilk üçü hemen açılır" eklendi — sayı yazıldı, bulanıklaştırma
ve garanti dili yok. "3" elle yazıldığı için (ACIK_SATIR `server-only`,
bu dosya "use client") tek kaynak bağı koda yorum olarak iliştirildi.

Bulgu: 36-tasarimci-g1-ve-navbar.md B2. Metin yönü Bilal'in.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 23:21:31 +03:00
bilalgursen
e9126650c3 fix(sonuc): harita tablonun altına alınır — hidrasyon kayması kapanır
Liste store'unun sunucu snapshot'ı her zaman boş liste döner
(liste-store.ts:86), kayıtlı manuel liste ancak hidrasyondan sonra
okunur. Harita sayfanın tepesindeyken kayıtlı listesi olan dönüş
ziyaretçisinde ~368 px yüksekliğinde sonradan beliriyor ve tadımlık ile
tabloyu aşağı itiyordu; main'in ilk çocuğu olduğu için impact fraction
~1, CLS eşiğinin çok üstü. Silinen placeholder bunu yeri sunucuda
rezerve ederek engelliyordu.

Harita tablonun altına alındı: sonradan belirdiğinde yalnızca sihirbaz
ile dipnotu iter, ikisi de katlanın altında. Bilgi mimarisi olarak da
doğru sıra — harita, tablodan kurulan listenin görselleştirmesi.

Yeni sıra: tadımlık → tablo → harita → sihirbaz → dipnot.
Sıraya bağlı stiller yeni sıraya göre doğrulandı: tadımlığın
first:mt-0'ı artık her durumda geçerli (üstünde kardeş kalmadı), harita
kendi mt-16'sını alıyor (tablo section'ı ve sihirbaz kartlarıyla aynı
ritim — eskiden üst boşluğu main'in py-12'sinden geliyordu).

Bulgu: 36-tasarimci-g1-ve-navbar.md B1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 23:20:34 +03:00
bilalgursen
9abfdf4aa9 fix(navbar): pill etiketleri her genişlikte gizli — çakışma kapanır
Konteyner max-w-6xl = 1152 px'te kilitli; xl (1280 px) içeriğe yeni yer
açmıyor ama eski görünürlük deseni tam orada iki etiketi birden geri
getiriyordu (+229 px). Orta nav absolute (katalog-arama.tsx:270), sağ küme
shrink-0 — flex çakışmayı göremiyor, koyu "Ara" butonu pill'in üstüne
boyanıyor (konumlanmış eleman statik elemanın üstünde).

user-nav.tsx ve listem-butonu.tsx etiket span'lerinden hem xl hem sm
görünürlük sınıfları kaldırıldı; anlamı ikon + aria-label + title taşıyor
(ikisi de yerinde, erişilebilirlik değişmedi).

Tasarımcı ölçümü (36-tasarimci-g1-ve-navbar.md, gerçek font metriği):
375 px → 284,5/351 tek satır · 768 px → 555,8/736 tek satır ·
1280+ → boşluk +15,5 … +110 px, çakışma yok.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 23:17:28 +03:00
bilalgursen
43b6ceca3e fix(listem): fark modalı paketliye kredi bedeli göstermez
Sunucu artık paketliden kredi düşmüyor; arayüz hâlâ "3 kredi düşer" ve
"Listemi güncelle — 3 kredi" diyordu. raporKredi prop'u paketliye 0
iner, modal tek `ucretsiz` bayrağıyla üç metin yerini buna bağlar.
Kredi mantığı (krediYeter, KrediYetersiz dalı) olduğu gibi kalır.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 06:07:01 +03:00
bilalgursen
4acfd27ab1 fix(kredi): paketliden liste ve revizyon kredisi düşmez
/paket "liste ve revizyon dâhil" diyor, kod her üretimde 3 kredi
düşüyordu. Tek `maliyet = user.hasPaket ? 0 : RAPOR_KREDI` değişkeni
harcama, iade ve dönen bakiye satırlarını birden kapatıyor.

spendCredits/grantCredits çağrıları bilerek duruyor: ledger'daki
UNIQUE(reason, ref_id) üretimin tek idempotency çapası ve DUPLICATE
dalındaki "önceki deneme başarısızdı" çıkarımı refund satırının
varlığına dayanıyor. İade tutarı da koşullu — yoksa harcaması 0 olan
paketli her başarısız denemede bedava 3 kredi kazanırdı.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 06:06:52 +03:00
bilalgursen
d2e11908ba [Bilal] content(tadimlik): CTA'nın yeni vaadi
ÖNERİ — tek başına düşürülebilir (git reset --hard HEAD~1). Bir önceki
commit yalnız yanlış iddiayı kaldırdı ve kendi başına tutarlı; bu commit
CTA'ya yeni bir cümle öneriyor, karar Bilal'in.

Buton: "Giriş yap ve listeni oluştur" -> "Kendi listemi oluştur"
Alt satır: "· Giriş sonrası liste hemen üretilir" eklenir.

Sayı YOK ve bilerek: ACIK_SATIR (rapor-maske.ts, server-only) ve
DENEME_KREDISI (credits.ts, appdb import ediyor) bu "use client" dosyaya
import edilemez; elle "3"/"5" yazmak tek kaynak kuralını bozar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 02:21:15 +03:00
bilalgursen
2373a9a526 content(tadimlik): teslim edilmeyen "24 satırın tamamı" iddiası kalkar
Maske girişsiz kullanıcıya 24 satırın tamamını değil yalnız ilk birkaçının
analizini açıyor (rapor-maske.ts); "5 deneme kredin hazır" da butonun
götürdüğü yerin sözü değil. Buton metni yeni vaat eklemeden yanlış olanı
bırakıyor: "Giriş yap ve listeni oluştur". Kanonik sağ ok yerinde duruyor.

Üstteki "Bu, 24 satırlık Yapay Zeka listenden yalnızca bir örnek." cümlesi
doğru olduğu için değişmedi — üretilen liste gerçekten 24 satır.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 02:20:57 +03:00
bilalgursen
72ef3b8669 fix(tadimlik): CTA girişten dönüşte üretimi başlatır
Tadımlık CTA'sının giriş callback'i sonucHref() yerine
listemUretHref("tadimlik") — kullanıcı /sonuc'a geri bırakılmak yerine
üretimin koştuğu /listem'e iner, liste ek tık olmadan başlar.
"tadimlik" IZINLI_KAYNAKLAR'a eklendi, yoksa ölçüm "bilinmiyor"a düşerdi.

Ayrıca tadimlik_goruntulendi'nin üstüne seri kırılması notu: olay bugüne
kadar sayfanın ~2.200 px altında yaşıyordu, bundan sonra ilk ekranda —
iki dönem karşılaştırılamaz.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 02:18:45 +03:00
bilalgursen
5311459073 refactor(sihirbaz): listemUretHref tek kaynağa taşınır
Yerel fonksiyon sihirbaz-sabitler.ts'e (sonucHref'in yanına) taşındı ve
export edildi; `uret=1` parametre sırası sözleşmesinin yorumu da onunla
gitti. Davranış birebir aynı — tadımlık CTA'sı da aynı hedefi kullanacağı
için literal kopyanın dördüncü kez çoğalması engellendi.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 02:18:22 +03:00
bilalgursen
552d5ce5f1 fix(sonuc): tadımlık tablonun üstüne alınır
Yeni sıra: ManuelHarita -> TadimlikBolumu -> SonucProgramTablosu. Tadımlık
ödeme öncesi gösterebildiğimiz tek gerçek önizleme; tablonun ~1.500 px
altında değil ilk ekranda durmalı. Props ve bileşen içleri değişmedi.

Tadımlık <section>'ına first:mt-0: harita boş durumda null döndüğü için bu
bölüm main'in ilk DOM çocuğu olabiliyor, main'in py-12'si yeterli.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 02:17:57 +03:00
bilalgursen
daa232c3c1 fix(sonuc): boş harita ilk ekranı işgal etmez
Manuel liste boşken ManuelHarita placeholder yerine null döner. Boş gri
alan /sonuc'un ilk ekranını kaplıyordu; ödeme öncesi ilk ekranda durması
gereken şey tadımlık. İlk "+" ile liste dolunca harita kendiliğinden
belirir, il geometrisi yine ancak o anda iner.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 02:17:29 +03:00