Commit Graph

184 Commits

Author SHA1 Message Date
bilalgursen
4d30dd1305 feat(sohbet): liste revizyonu sohbete taşındı — soru formu ve yapısal kural
Eski revizyon kutusu kaldırıldı: serbest metin modele gidiyor, sıra ve havuz
koddan belirlendiği için "ilk 5 X ilinden olsun" gibi isteklerin karşılığı
yoktu. Danışman artık belirsiz isteği soru formuyla (soru_sor → shadcn
Questionnaire, proje diline çevrildi) netleştirir, sonra liste_revize ile
yapısal kural verir: il/alan/tip farkı, "ilk N" ölçütü, çıkar/ekle,
iskelet (lib/revizyon-kurali.ts). Kurallar havuz, seçim ve sırada koddan
uygulanır; "ilk N" ölçütünün ili/alanı süzgece kendiliğinden eklenir.

- chat_messages.meta sütunu (göç 0006): form, form cevabı ve revizyon sonucu
  kayıttan geri kurulur; form cevabı kredi harcamaz.
- Akış korumaları: form açılınca başka araç yok, revizyonda zaman aşımı uzar,
  "yeniden kurdum" beyanı araçsızsa düzeltme notu.
- /listem "Revize et" sohbeti odaklar; başarılı revizyonda liste yenilenir.
- /dev/sohbet senaryosu, DESIGN.md §4.20 notu ve §4.33.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 17:12:53 +03:00
bilalgursen
3c995402c6 feat(ui): Arc bileşenleri, landing bölümleri ve bildirim yığını
Sonner/vaul yerine kendi bildirim yığını ve alt sayfa; çip grubu, kart
destesi, kaydırma eylemi, yazı dönüşümü, bölme tutamacı; landing'e program
duvarı, süzülen haplar ve veri akışı; yaylar tek dosyada (lib/hareket.ts).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 17:12:53 +03:00
bilalgursen
bc920f6111 feat(ui): Arc kayan vurgulu seçim hapları ve sayı rulosu
- SecimHaplari: tema seçici (kapsül) ve puan türü çipleri (hero + CTA formu);
  seçili vurgu layoutId ile seçenekten seçeneğe kayar.
- SayiRulo: değişen sayılar (listem rozeti, çekmece ve durum satırı sayacı,
  kredi hapları, dilim tablosu sayacı, giriş yeniden gönder sayacı, kaydet
  bandı, üst şerit geri sayımı) rulo gibi döner; @number-flow/react kaldırıldı.
- DESIGN.md §4.21–4.22, components.json @uiarc kaydı.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 19:40:30 +03:00
bilalgursen
a3cb058a3b feat: update app.db and BACKLOG.md with new decisions and adjustments
All checks were successful
Deploy / deploy (push) Successful in 7m45s
- Updated the app.db file to reflect recent changes in the application state.
- Modified BACKLOG.md to include new entries regarding the removal of certain wizard steps, adjustments to priority chips, and the introduction of special quota conditions for candidates.
- Added details on the decision to link priority chips to data sources and clarified the implications for user experience and data handling.
2026-10-06 17:17:49 +03:00
bilalgursen
c0696e2cbc refactor: remove unused netler API and program-netleri component
- Deleted the netler API route and the associated program-netleri component as they are no longer needed in the application. This cleanup helps streamline the codebase and improve maintainability.
2026-10-06 17:17:43 +03:00
bilalgursen
ea3728a7ec feat(dev): /dev/sohbet — danışman sohbeti arayüzü senaryolarla oynatılır
All checks were successful
Deploy / deploy (push) Successful in 6m43s
Model, oturum ve kredi harcamadan sohbet arayüzünü denemek için yalnız
geliştirmede açılan sayfa (üretimde 404, noindex). Beş hazır senaryo: tek
araç, art arda araçlar, düzeltme notu, akış hatası, uzun geçmiş.

- SohbetClient'a denemeTransport prop'u: verilirse /api/soru yerine
  önceden yazılmış akış oynar; üretim yüzeyleri bunu vermez.
- @shadcn/helpers/ai-sdk sahte taşıyıcı için eklendi; dinamik import
  NODE_ENV dalında kaldığından üretim paketine girmez.
- cagri.ts: kullanılmayan OpenAI tip import'u kaldırıldı.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 15:15:01 +03:00
bilalgursen
78ad84922a feat(tema): açık / koyu / sistem teması
All checks were successful
Deploy / deploy (push) Successful in 6m23s
- TemaSaglayici (next-themes) + alt bilgide TemaSecici
- globals.css: .dark bloğunda palet token'ları çevrilir; bileşenlere
  dark: sınıfı yazılmaz
- yüzeyler bg-white → bg-card, koyu haplar text-slate-50, SVG'lerde
  sabit renk yerine değişken
- DESIGN.md §2.3 + tasarim-denetim kuralları (yuzey-beyaz,
  koyu-hap-beyaz-yazi, dark-sinif), AGENTS.md karanlık mod bölümü
- docs: koyu tema denetimi raporu

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 10:20:02 +03:00
bilalgursen
3e599a5411 style(danisman): sohbet yüzeyleri bg-white → bg-card (main'deki commit'lenmemiş koyu tema düzeltmesi dala taşındı)
main çalışma ağacındaki aynı 6 satırlık değişiklik fast-forward merge'ü
engelliyordu; içerik birebir buraya alındı.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 09:01:22 +03:00
bilalgursen
da8d303ea4 fix(liste): başka programa ait gerekçe (il/üniversite çelişkisi) şablona düşsün [KARAR]
Kök neden 3 (04-eval-sonuclari): 888 gerekçenin 7'si başka programa aitti
(ör. Erzurum'daki programa "sanayi şehri Konya'da").

- liste-denetim.ts: yerCeliskisi — veri tabanındaki il ve üniversite
  adlarından sözlük. Bulunma ekiyle ("Konya'da") anılan il programın ili
  değilse, ya da anılan il ne programın ne adayın seçtiği/oturduğu ilse,
  ya da anılan üniversite satırınki değilse çelişki. "İzmir'e yakın"
  (adayın ili), üniversite adındaki il, "Kıbrıs'ta" (KKTC şehirleri),
  İTÜ/ODTÜ gibi kısaltmalar ve bölge/ilçe adları ("Ege", "Çankaya") ihlal
  değil.
- rapor.ts: çelişkili gerekçe koddan şablona düşer (ek model çağrısı yok).
- /meraklisina şeması ve 4. bölüm anlatımı (AGENTS.md senkronu): yapay
  zekânın seçimi ve gerekçeleri kodla denetlenir; eksik satır havuzdan
  tamamlanır, vaat içeren ya da başka programı anlatan gerekçenin yerine
  standart açıklama yazılır; yapay zekâ zamanında yanıt vermezse liste aynı
  havuzdan kurallarla kurulur. Havuz dışına çıkamama kuralı değişmedi. Bu
  metin önceki iki commit'in (3128b01, 8462894) davranışını da kapsar.

Kanıt: taban koşusunun 888 gerekçesi üzerinde çevrimdışı — 7 gerçek
çelişkinin 7'si yakalandı, yanlış alarm 0 (eval'in 2 yanlış alarmı dahil).
Canlı koşular: il çelişkisi 7 → 0 (iki koşuda 1 ve 0 gerekçe şablona düştü).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 08:49:41 +03:00
bilalgursen
1d970ec8a7 docs(havuz): B4 — gevşetme sırası anlatımı koda eşitlendi (profil → alan → il) [KARAR]
Kod her zaman önce alanı, sonra ili gevşetiyordu (il korunur, aynı ildeki
alan dışı programlarla dolar); fonksiyon yorumu, /meraklisina şeması,
4. bölüm anlatımı ve aria-label ise "önce il, sonra alan" diyordu.
KARARLAR.md'de sıra için karar yok; davranış DEĞİŞMEDİ, yalnız anlatım
koda eşitlendi (AGENTS.md şema senkronu). Hangi sıranın doğru olması
gerektiği raporda [BİLAL] sorusu.

Kanıt: p01 (Eskişehir), p06 (İzmir), a15 (Kilis) — il korunur, alan
gevşer; 40 profilde bu commit öncesi/sonrası havuz birebir aynı.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 01:17:23 +03:00
bilalgursen
0a11b15304 fix(havuz): B2 — başarı sırası barajını geçemeyen adaya o bölüm önerilmesin [KARAR]
Havuz yalnız taban sırasına bakıyordu; hayal dilimi "adayın üstünde
kapanan her şey" olduğu için barajın hemen dışındaki adaya tam da
yazamayacağı bölümler düşüyordu (52.000 sıralı adaya tıp, 310.000'e
mühendislik). Kaynak uydurma tablo değil: program_ozellik.min_basari_sirasi
(YÖK Atlas API, 2026 kılavuzu; katalogdaki "baraj … sıra" satırı ve
danışmanın tercihBaraji alanı da aynı kolonu okur). db.havuzAdaylari artık
min_basari_sirasi < adayın sırası olan programları SQL'de çıkarır; barajı
boş program süzülmez.

Kanıt (havuzdaki baraj dışı program, önce → sonra): a04 4 → 0, a06 11 → 0,
a08 11 → 0, p03 17 → 0; 40 profilin hepsinde 0. a07 (SÖZ 310.000, eğitim):
alandaki programların tamamı barajlı olduğu için alan artık gerçekten
gevşiyor (24 hayal → 5/13/6).

Bilinen sınır: kolon bazı barajlı bölümlerde boş (ör. 16 tıp, 11 hukuk
satırı) — veri işi, raporda.

/meraklisina şeması (aday havuzu düğümü), 4. bölüm anlatımı, aria-label
ve figcaption aynı kuralla güncellendi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 01:17:01 +03:00
bilalgursen
22ac604233 fix(havuz): B8 — KKTC uyruklu ve M.T.O.K. kontenjan satırları havuza girmesin [KARAR]
YÖK Atlas özel kontenjanları ayrı program satırı olarak veriyor; adında
"(KKTC Uyruklu)" ya da "(M.T.O.K.)" geçen, taban sırası olan 118 satır
herkesin aday havuzuna giriyordu (p02'de 54 programın 7'si). Sihirbaz
uyruk ya da lise türü sormadığı için bu satırlar herkese önerilemez.
Kural tek yerde ve export'lu: rapor-havuzu.ts → ozelKontenjanSatiriMi().

Kanıt (havuzdaki özel kontenjan satırı, önce → sonra): p02 7 → 0,
p14 6 → 0, p05 4 → 0, p09 3 → 0, a09 3 → 0; 40 profilin hepsinde 0.
Gevşetme basamağı ve liste uzunluğu hiçbir profilde değişmedi.

/meraklisina şeması (aday havuzu düğümü), 4. bölüm anlatımı, aria-label
ve figcaption aynı kuralla güncellendi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 01:15:46 +03:00
bilalgursen
497b0247a0 fix(havuz): B5 — gevşeyen filtreye uyan programlar havuzda kalsın [KARAR]
İl gevşeyince havuz baştan, ilsiz kuruluyordu; seçili ildeki programlar
sıraya en yakın 20'ye giremezse listeden tamamen düşüyordu (Kayseri 1/60,
Trabzon 0/25) — prompt ise "seçili illere öncelik ver" diyordu. Artık
gevşetmenin her basamağında seçime uyan programlar önce alınır, boşluk
sıraya en yakın diğer programlarla dolar. Aynı kural alan ve danışman
profili gevşediğinde de geçerli (tek yardımcı: oncelikliBirlestir). Kırpma
sonrası havuz yine dilim sırasında, dilim içinde yakından uzağa dizilir.

Kanıt (havuzda seçili ildeki program, önce → sonra): p12 Kayseri 1 → 9,
p13 Trabzon 0 → 4, b06 Düzce 2 → 10, a09 Konya 2 → 3. Gevşetme basamağı ve
liste uzunluğu hiçbir profilde değişmedi.

/meraklisina şeması, 4. bölüm anlatımı ve aria-label aynı kuralla
güncellendi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 01:15:01 +03:00
bilalgursen
3c3183b9bc fix(danisman): M1 (5) — bağlantı kopunca istemci "iade edildi" demesin
Sunucu, istemci kopsa da cevabı üretip kaydeder ve kredi harcanmış kalır
(bilerek: kopmada iade, cevabı okuyup bağlantıyı kesene bedava cevap olurdu).
İstemci metni buna göre düzeltildi; görsel değişiklik yok.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 01:06:56 +03:00
bilalgursen
1191f16916 fix(danisman): M2 (6) — 100 mesajı aşan geçmişte en yeni 100 dönsün
sohbetGecmisiGetir yeniden eskiye sıralayıp 100 alır, sonra çevirir; aynı
saniyedeki soru-cevap sırası rowid ile korunur. GET /api/soru da aynı
sorguyu kullanır (iki kopya vardı).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 01:04:42 +03:00
bilalgursen
b935158d3c Danışman sohbeti AI SDK'ya taşındı; dört yeni araç
- Sunucu: elle yazılmış araç döngüsü yerine streamText + UI mesaj akışı
  (src/lib/ai/sohbet-akisi.ts). Kredi düşme/iade, bedelsiz profil onayı,
  mesaj kaydı ve Jev çıktı denetimi aynı davranışla korunur.
- İstemci: sohbet-client useChat kullanır; araç çalışırken balonun altında
  durum satırı görünür. Kayıtlı geçmiş düz metin kalır.
- Sağlayıcı aynı tek kapı (AI_BASE_URL / AI_API_KEY), openai-compatible.
- Yeni araçlar: bolum_ozeti, il_ozeti, rehber_ara, tercih_takvimi.
- Kalkan davranış: sağlayıcı araç çağrısını reddedince düz sohbete düşme.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 00:36:27 +03:00
bilalgursen
6564ec8948 Danışman araçları, TÜİK mezun istihdamı ve Jev çıktı denetimi
- Danışman: program_netleri, program_karsilastir ve bolum_istihdam araçları;
  program_ara'ya devlet/vakıf, öğretim türü ve sıralama parametreleri;
  program_detay'a trend cümlesi; bozuk araç argümanı modele hata döner.
- TÜİK Yükseköğretim İstihdam Göstergeleri 2025: bölüm bazında istihdam
  oranı, ilk işi bulma süresi ve kazanç grubu (src/lib/bolum-istihdam.ts,
  üretici scripts/tuik-istihdam-uret.py, kaynak Excel'ler data/kaynak/).
- Bölüm sayfasında "Mezun istihdamı" ayrıntı satırı ve alt sayfası;
  AkademikAyrinti başlık/ikon alır.
- Jev (TypeSafe AI) ile danışman cevabında garanti/olasılık dili denetimi;
  ihlalde cevabın sonuna düzeltme notu. Anahtar yoksa denetim atlanır.
- /gizlilik: TypeSafe AI (ABD) sağlayıcı satırı. KARARLAR.md: 5 Ekim kaydı.
- Üç katalog dosyasındaki bg-white → bg-card değişiklikleri de bu commit'te.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-05 00:15:05 +03:00
bilalgursen
ab0b3a047f Piksel harita ve logo animasyonu iyileştirmeleri
All checks were successful
Deploy / deploy (push) Successful in 7m52s
Şehir/Türkiye piksel haritası görünüme girince oynar; animasyonlu-mark,
console-asr, use-pixel-heat ve cta-sira-form güncellendi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 14:09:44 +03:00
bilalgursen
9c02b810e7 Akademik göstergeler çekmecesine açılış koreografisi
Some checks failed
Deploy / deploy (push) Has been cancelled
Kareler önce logonun üç karesi gibi belirir, sonra yerlerine büyür;
içerik satır satır netleşir. Hareketi azalt'ta yalnız kısa belirme.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 13:56:42 +03:00
bilalgursen
bfbb7741ae Merge branch 'gece/p2-olcum' into main
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 13:39:44 +03:00
bilalgursen
70423853f3 feat(danisman): profil onayı kredi harcamaz; yapay zekâ sağlayıcı adresi .env'den (AI_BASE_URL/AI_API_KEY)
- Bilal kararı (26 Eyl 2026): 'kaydedeyim mi?' sorusuna kısa evet/hayır
  cevabı bedelsiz. Sunucu son danışman mesajında onay ibaresini arar,
  mesaj ≤40 karakter ve evet/hayır kalıbıyla başlıyorsa kredi düşmez,
  ledger'a yazılmaz, iade yolu atlanır; X-Kredi-Dusuldu başlığıyla istemci
  bakiyeyi buna göre günceller. Gerçek soru içeren 'evet ama …' bedava geçmez.
- Bilal kararı: model Türkiye'de barındırılacak. client.ts baseURL ve
  anahtar AI_BASE_URL/AI_API_KEY'den okunur (OPENROUTER_* geriye uyumlu);
  sağlayıcı değişince kod değil .env değişir, /gizlilik aynı commit'te.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-25 10:44:44 +03:00
bilalgursen
5a04db7e4b feat(liste): danışman profili havuzu süzer (önce profil gevşetilir) + KVKK metin düzeltmeleri
- db.ts OzellikSuzgeci (dil, yalnız örgün, yalnız burslu, ücret üst sınırı)
  program_ozellik alt sorgusuyla; tablo yoksa süzgeç yok.
- rapor-havuzu: profilSuzgeci (ev ili + km → il listesi; sihirbazda il
  seçiliyse km uygulanmaz); havuz 24'ün altına düşerse gevşetme sırası
  profil → il → kategori. rapor.ts prompt'a 'danışmana söylediği tercihler'
  ve profil gevşetme notu; rapor-actions profili okuyup geçirir.
- /meraklisina şeması (huni-semasi SEMA + aria-label + figcaption) ve 4.
  bölüm metni yeni adım ve gevşetme sırasıyla eşitlendi (AGENTS.md kuralı).
- /api/soru: profil kaydı öncesi 'kaydedeyim mi?' onayı (PROFIL_ONAY_SOR).
- Gizlilik metni kodla eşitlendi: OpenRouter→DeepSeek (Anthropic değil),
  profil satırı, amaç+hukuki sebep, saklama süreleri, md. 11 hakları,
  18 yaş altı notu; unvan/adres ve aktarım dayanağı TODO. Giriş kartı:
  koşullar 'kabul', gizlilik 'okudum'. Sohbet girişine kişisel bilgi uyarısı.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-25 01:23:14 +03:00
bilalgursen
aa2051732d feat(danisman): araç kullanımı — program_ara/program_detay/universite_profili sorgu araçları + kapalı listeli profil (profil_guncelle)
- src/lib/ai/araclar.ts: OpenAI uyumlu 4 araç; sorgu araçları yalnız okur
  (yokatlas.db + program_ozellik + YÖK İstatistik + URAP), sayı uydurma yok.
  profil_guncelle yalnız 7 tanımlı alanı yazar (evIl, maxKm, ucretUst, burs,
  dil, ogretimTuru, kampus); sağlık/din/gelir/cinsiyet şemada yok (KVKK §8).
  Profil süzgeci sonucu sıfırlarsa profilsiz tekrar denenip modele söylenir.
- src/lib/ai/cagri.ts: sohbetAkisiAraclarla — stream'de tool_calls biriktirme,
  en fazla 4 tur, son tur araç kapalı; sağlayıcı reddederse düz sohbete düşer.
- src/lib/danisman-profil.ts (saf şema + metinler), danisman-profil-db.ts,
  drizzle 0005 danisman_profil tablosu, /api/soru/profil GET+DELETE.
- /api/soru: profil prompt'a girer, araç kuralları eklendi.
- Sohbet başlığı altında 'Kaydettiklerim' çipleri (tek tıkla sil); listem
  sayfası profili sunucudan indirir. Analitiğe yalnız alan adı gider.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-25 01:13:58 +03:00
bilalgursen
05402f96f6 feat(universite): kadın/erkek oranı öğrenci karesinde (YÖK İstatistik 2025-26, örgün ön lisans+lisans)
Üniversite sayfasındaki 'Örgün öğrenci' karesine '%54 kadın · %46 erkek'
satırı eklendi; kaynak notu üniversite düzeyi olduğunu ve bölüm bazında
veri olmadığını söyler. Filtre ya da öncelik değil, bilgi satırı.
Üretim betiği E/K sütunlarını okur; kadinYuzdesi() yardımcı eklendi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-25 00:55:02 +03:00
bilalgursen
988b9d5ce0 fix(tasarim): netler paneli alt sayfa + §4.15 tablo; ok düğmesinde gölge ve hover rengi yok
All checks were successful
Deploy / deploy (push) Successful in 5m3s
- "Son yerleşenin netleri" ortada açılan Dialog ve text-xs hücreli tabloydu;
  şimdi Drawer (kap/çarpı cta-sira-form çekmecesiyle birebir), ortalı başlık
  + bağlam cümlesi, SATIR_BASLIK başlıklar, text-sm hücreler, en yeni yıl koyu,
  "Yerleşme puanı" satırı ayrılmış (DESIGN.md §4.10, §4.15, yeni §4.19).
- Denetim: tablo-minik-yazi (hata) — TableCell/TableHead içinde text-xs yasak;
  §9.5 bitirmeden listesine ayrıntı paneli/tablo/buton kontrolü eklendi.
- Kayıtlı-sıra ok düğmesi: shadow-lg kaldırıldı (§6), hover'da renk değişmiyor
  (orange-600 iri yüzeyde kırmızımsı okunuyordu); hover scale + ok kayması.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 18:46:32 +03:00
bilalgursen
67371c929d fix(tasarim): şehir haritası odak kutusu harita sınırlarına kenetlenir
All checks were successful
Deploy / deploy (push) Successful in 4m57s
Telefonda dik kutu haritadan uzun olunca ülke haritasının altı kesiliyor,
şehir işareti metnin arkasına kayıyordu (Lefkoşa, 375 px). Kutu haritadan
küçükse harita içinde kalır, büyükse harita kutunun içinde kalır.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 18:33:08 +03:00
bilalgursen
5497810cf3 fix(tasarim): kayıtlı-sıra satırı telefonda iki satır — başlık üstte, kupa+sayı ile ok yan yana
All checks were successful
Deploy / deploy (push) Successful in 4m53s
Üç satırlı blok formun yüksekliğini aşıp overflow-hidden kapta üstten
kırpılıyordu (Bilal, 24 Eyl 2026: "mobilde düzgün değil"). Telefonda başlık
text-lg, kupa kutusu ve ok 48 px; sm'den 56 px; lg'de tek satır değişmedi.
DESIGN.md §10.9 güncellendi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 18:21:17 +03:00
bilalgursen
24d4bea32c feat(geo): llms.txt, RSS, IndexNow, Article yazar/görsel, bölüm sayfasına veri özeti, vakıf bursu yazısı
All checks were successful
Deploy / deploy (push) Successful in 6m16s
GEO araştırması (docs/arastirma/2026-09-24-geo-seo) Dalga 1-2 uygulaması:
- /llms.txt ve /feed.xml route'ları (getAllRehberler'den otomatik), head'de RSS linki
- Article JSON-LD: author, image, mainEntityOfPage, publisher logo; görünür 'Yazan' satırı
- robots: ClaudeBot ayrı grupta Crawl-delay 1
- scripts/indexnow.ts (pnpm indexnow) + public anahtar dosyası
- bölüm sayfası açılışı veriden üretilen özgü cümleler (il/program/tür/kontenjan, taban aralığı, yıllık yön)
- ana sayfa fiyat iddiasına kaynak; iki yazıda 23.000 -> 21.000+; beş yazıya 'Kısa cevap' açılışı
- yeni yazı: vakif-universitesi-bursu-kesilir-mi (ÖSYM 2026 kılavuzu + YÖK ücret esasları)
- YAYIN-KUYRUGU: IndexNow adımı ve aylık AI görünürlük rutini

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 17:42:29 +03:00
bilalgursen
9d90436027 fix(tasarim): kayıtlı-sıra satırında yazısız 56 px yuvarlak ok düğmesi; bandın tamamı tıklanabilir
All checks were successful
Deploy / deploy (push) Successful in 4m50s
Bilal (24 Eyl 2026): "buton cılız kaldı, yazılı bir buton olmasın". Turuncu
yuvarlak ok (aria-label + title), hover'da ok kayar, gerilmiş link bandı
kaplar. DESIGN.md §10.9 güncellendi (§4.1 metin+ok kuralının bilinçli istisnası).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 16:16:56 +03:00
bilalgursen
a43c045828 feat(katalog+tasarim): devlet/vakıf tür sayfaları, tür çipleri link; kayıtlı-sıra satırı şişko ve sade
All checks were successful
Deploy / deploy (push) Successful in 5m1s
- /universiteler/devlet ve /universiteler/vakif: şehir sayfası iskeleti,
  haritada bu türden üniversitesi olan her il turuncu (yakınlaşma yok), üç
  özet kartı, şehir çipleri (sayfa içi çapa), şehir şehir §4.15 satırları,
  öteki türe geçiş hapı; metadata + sitemap.
- TurCipi tek kaynak: devlet/vakıf çipi tür sayfasına link (sonuç, listem,
  tadımlık, bölüm, şehir/tür satırları); üniversite sayfası tür hapı ve
  /universiteler başlıkları da link. UniSatirlari ortak dosyada: ad, tür ve
  il ayrı linkler.
- Kompakt profilli satır (DESIGN.md §10.9): iri kupa kutusu + text-3xl/4xl
  sıra, text-xl/2xl başlık, 48 px buton; telefonda alt alta, lg'de tek satır.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 15:53:54 +03:00
bilalgursen
a0e94bc024 fix(tasarim): şehir sayfasındaki üniversiteler §4.15 liste satırı — 48 px logo, iri ad, tür çipi
All checks were successful
Deploy / deploy (push) Successful in 4m49s
- UniSatirlari: kenarlıklı liste, satırın tamamı üniversite sayfasına link,
  SATIR_AD_DUZ ad (hover mavi, §2.1 istisnası), SATIR_META içinde tür çipi +
  program sayısı (+ ana il farklıysa il), sağda kayan ok, active:scale-[0.99].
  İki sütunlu kompakt UniLinkleri /universiteler dizininde kaldı.
- DESIGN.md §4.17 güncellendi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 15:41:20 +03:00
bilalgursen
6690d3b779 fix(tasarim): üniversite haritası dört kartın arkasına sarkar; yakınlaşma sıçramasız yay, mask rampaları uzun
All checks were successful
Deploy / deploy (push) Successful in 4m51s
- Özet ızgarası relative isolate; konum haritası absolute katman (-inset-x-4
  -inset-y-8) olarak ızgaranın tamamını kaplar, üçüncü sütun yalnız yer tutar.
  lg'de sağdan sola, telefonda üst satırdan aşağı uzun rampalı mask.
- Yakınlaşma ease-out yerine spring bounce 0 (0,6 s gecikme, 1,6 s): sert
  başlangıç gitti. Şehir yüzeyi mask'ları da uzatıldı.
- DESIGN.md §4.17 güncellendi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 15:37:10 +03:00
bilalgursen
c60e3ab409 fix(tasarim): şehir haritası kartı arka plan gibi kaplar, kenarlar erir; pikseller azaldı
All checks were successful
Deploy / deploy (push) Successful in 4m34s
- Izgara 72 → 56 sütun, serpinti kaldırıldı (Bilal: "piksel detaylarını azalt").
- Harita `doldur` (slice) ile SehirYuzeyi kartını kaplar, metin üstünde; iki
  katlı mask ile hiçbir kenarda kesik kare kalmaz (Bilal: "canvas net bir
  şekilde kesiliyor"). Telefonda altta, lg'de sağ yarıda belirir.
- Yakınlaşma kutusu kabın oranında kurulur, il `odakHiza` ile kabın istenen
  noktasına gelir (şehir sayfası: lg sağ orta, telefon alt orta; konum kartı orta).
- usePixelHeat meet/slice + ortalama ofsetini hesaba katar.
- Üniversite konum kartı: kartı doldurur, radyal erime.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 15:10:44 +03:00
bilalgursen
6e057aa0f5 feat(tasarim): şehir haritası yüklenince ile doğru yakınlaşır
- viewBox 0,7 s gecikmeyle 1,1 s güçlü ease-out ile ilin çevresindeki kutuya
  kayar (en çok 2,4 kat; ülke haritasında şehir işaretine 1,8 kat); kutu SVG
  oranında ve harita dışına taşmaz. Hareketi azalt: doğrudan odak.
- usePixelHeat viewBox'ı her taramada canlı okur; yakınlaşmış haritada da
  imleç doğru kareyi ısıtır (hero davranışı değişmez).
- DESIGN.md §4.17 yakınlaşma notu.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 15:02:28 +03:00
bilalgursen
eefac56659 feat(tasarim): şehir sayfasına hero dilinde piksel harita; üniversite konum kartı da aynı harita
All checks were successful
Deploy / deploy (push) Successful in 4m39s
- scripts/il-izgara-uret.ts → src/lib/il-izgara-verisi.ts: 81 il ve 7 ülke
  kontürü hero'nun dot-matrix ızgarasına (72×31) rasterize; küçük iller 2×2 garanti.
- SehirPikselHaritasi: iri kareler, altı opaklık, kıyı serpintisi, usePixelHeat
  ısı fırçası; bulunulan il iri turuncu karelerle sırayla belirir (kt-piksel-belir)
  ve nabız atar; KKTC/yurt dışında şehir merkezinde 2×2 iri kare.
- Şehir sayfası başlığı beyaz piksel dokulu yüzeyde (SehirYuzeyi), harita sağda/altta.
- UniversiteKonumHaritasi düz SVG yerine aynı piksel haritayı kullanır.
- DESIGN.md §4.12/§4.17/§10.8 güncellendi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 14:56:11 +03:00
bilalgursen
259534fa9c feat(katalog+tasarim): şehir adları her yerde link; piksel yüzeylere beyaz ton
- ilSayfaHref: üniversite sayfası il hapı, /universiteler listesi, bölüm /
  sonuç / listem / tadımlık satırlarındaki il metası şehir sayfasına gider.
- Şehir kümeleri tüm (üniversite, il) çiftlerinden: DB'deki her il değerinin
  sayfası var (ODTÜ Ankara + KKTC); dev'de eski globalThis önbelleğine dayanıklı.
- PikselZemin ton="acik", CtaBandi/CtaSiraForm ton="beyaz": /universiteler
  altı ve /meraklisina kapanışı beyaz, diğer bantlar mavi (dönüşümlü).
- ilUlkeHaritasi: il değerinden ülke haritası + şehir konumu.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 14:56:11 +03:00
bilalgursen
be170fc28a feat(tasarim): /meraklisina kapanış kartı piksel dokulu CTA bandı; DESIGN.md §4.17 şehir çipleri
- DemoKapanisCta beyaz kutudan CtaBandi'ye (seed 29), buton kanonik turuncu CTA.
- DESIGN.md: §4.17 SehirCipleri + şehir sayfası düzeni; CtaBandi kullanım
  yerlerine meraklısına kapanışı eklendi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 14:19:10 +03:00
bilalgursen
d8a28b7c3a feat(katalog): şehre göre üniversiteler — /universiteler/[il] sayfaları ve şehir çipleri
- Veri: getAllIller/getIlBySlug (üniversite en çok programının olduğu ile
  sayılır; ili boş olan hiçbir şehre girmez; tireli yurt dışı adlar baş harfli).
- /universiteler: "Şehre göre" çip satırı (2+ üniversiteli 28 şehir) +
  "Tüm şehirler" A–Z üç sütunlu liste (#tum-sehirler).
- /universiteler/[il]: 92 statik şehir sayfası — katalog detay düzeni, il ve
  üniversite sayısı hapları, kompakt sıra satırı, devlet/vakıf/KKTC-yurt dışı
  öbekleri, diğer şehir çipleri, CTA bandı; metadata + breadcrumb JSON-LD.
- SehirCipleri: sihirbaz il çipiyle aynı kalıp, aktif şehir mavi dolu.
- Sitemap'e şehir sayfaları eklendi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 14:19:09 +03:00
bilalgursen
4b28b353ee feat(tasarim): katalog üstü kayıtlı-sıra satırı ve "listen hazır" paneli piksel dokulu CTA bandı
- CtaSiraForm kompakt: kayıtlı sıralamalı hâl CtaBandi kompakt kabuğuyla
  birebir (bg-primary, beyaz yazı, PikselZemin); form hâli beyaz kalır.
  İç boşluk ve saydam kenarlıkla iki hâlin kutusu aynı (CLS yok); telefondaki
  süs piksel ayracı kaldırıldı.
- /sonuc "24 tercihlik listen hazır": beyaz kart yerine CtaBandi (seed 23),
  buton sonda ArrowRight, telefonda tam genişlik.
- DESIGN.md §10.8: CtaBandi kullanım yerleri ve "piksel konmaz" listesi güncellendi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 14:03:28 +03:00
bilalgursen
b11c2c9d45 fix(icerik+metin): 24 Eyl raporunun "bu hafta" işleri — yanlış sayı, vaat cümleleri, üç kural hatası, meslek lisesi ek puanı, sohbette kriz kuralı
All checks were successful
Deploy / deploy (push) Successful in 4m41s
Site metni (rapor 31 §4.3):
- "23.000+ lisans programı" → DB sayımıyla "21.000+ lisans ve önlisans"
  (12.239 + 9.254); sayı tek kaynaktan (veri-kapsami.ts).
- Hero "48 saatlik panikle seçme" → "Tercih listeni gerçek veriyle kur,
  panikle değil"; "Yapay zekâ veriyi tarasın" → resmî veri taransın, YZ
  yalnızca havuzdan seçer; "boşta kalmanın en yaygın sebebi" ve "ihtimalini
  en aza indiririz" iddiaları kaldırıldı; paket sayfasında "insan danışmanın
  işini / aynı işi" dili bırakıldı.

Rehber (rapor 32 §4, 06, 07, 12):
- yerlesemedim: "ekte tabanlar gevşer" hatası düzeltildi (dolu programda
  eşik ilk turun en küçük puanı, Ek Yerleştirme Kılavuzu 1.2); ek listeye
  yerleşince OBP'nin yarıya indiği uyarısı ve kaynaklar eklendi.
- kyk-burs-mu-kredi-mi: "bir öğretim yılı kaybı" maddesi yorumsuz, "KYGM'ye
  sor"; kısmi zamanlı çalışma (2547 md.46), kamu/özel burs ayrımı ve TEV'in
  2026 duyurusu eklendi.
- yatay-gecis-cap-yandal: şemada Ek Madde-1 ve ÇAP kutuları yeşilden sarıya
  (hak ≠ kabul); ÇAP 70 + ilk %20, yandal 65 eşikleri; kontenjan %30/90;
  28 Şubat 2026 "baraj 90" yalnızca açık/uzaktan → örgün; kaynaklar eklendi.
- obp: meslek lisesi ek puanı bölümü (OBP × 0,06, Tablo 6C, lisansta yok,
  yarıya inme, sınavsız geçiş yok). ozel-kosullu: "sınavsız" ifadesi
  M.T.O.K. ve ek puanla düzeltildi.

Danışman sohbeti (rapor 06, 40 §3.2): umutsuzluk / kendine zarar dilinde
tercih konusunu bırakıp yardım almaya yönlendiren güvenlik kuralı; bu dil
artık "tercih dışı" diye reddedilmiyor.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 12:50:51 +03:00
bilalgursen
613d9e012a fix(tasarim): piksel zemin yalnız CTA yüzeylerinde, kabın ölçüsüne göre, küçük kare yok
Bilal (24 Eyl 2026): ana sayfa CTA'sında doku hiç görünmüyordu, bazı
kartlarda çok azdı; sonra "çok fazla piksel, küçük olanlar hiç olmasın"
ve "/sonuc'taki kartın arkasına da piksel koymuşsun; pikseller CTA'larda
olacak sadece".

- Kök neden: PixelMasonry sabit 420×120 çizimi kaplayacak şekilde
  ölçekleniyordu; yüksek kartlarda görünen kısım boş banda düşüyordu.
  Artık kabın gerçek ölçüsüne göre üretiliyor (ResizeObserver), yalnız
  kenar çerçevesinde, orta boş; `haric` verilen öğenin (24'lük piksel
  tablosu) çevresi her genişlikte boş. Sunucuda boş, ölçülünce belirir.
- Küçük (tek hücre) kare yok: 4×4 makro hücrede 2–4 hücrelik kareler,
  iri olan seyrek ve silik. Ölçüm: kapanış kartı 1280 px'te 58 kare
  (tabloya binen 0), 375 px'te 27 kare.
- Beyaz içerik kartlarından zemin geri alındı (tadımlık, /listem üretim
  ve kilit kartları, boş durum, sıralama-yok, meraklısına, paket kartları,
  kaydet bandı, katalog üstü kompakt satır, /sonuc "listen hazır").
  Kalanlar: CtaBandi, PikselCtaYuzeyi, arama penceresi kartı.
  PikselZemin'in açık tonu kaldırıldı. DESIGN.md §10.8 güncellendi.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 12:38:47 +03:00
bilalgursen
09c6868089 feat(tasarim): her CTA benzeri yüzeyin arkasında masonry piksel zemin (PikselZemin)
Bilal'in isteği (24 Eyl 2026): piksel arka planı her CTA benzeri kısmın
arkasında, büyüklü küçüklü masonry. Tek kaynak PikselZemin (açık kartta
silik mavi, koyu/mavi yüzeyde beyaz); CtaBandi ve PikselCtaYuzeyi de
onu kullanır. Eklenen yüzeyler: /sonuc "listen hazır" kartı, /listem
dört üretim kartı + boş durum + kilit kartı, tadımlık kartı, sıralama-yok
sayfası, meraklısına kapanış kartı, ana sayfa ve /paket ana paket kartı,
kaydet bandı, katalog üstü kompakt satır, arama penceresi kartı.
Kapsam dışı (form, durum kartı, modal düğmesi, 404) DESIGN.md §10.8'de.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 12:16:54 +03:00
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