Commit Graph

19 Commits

Author SHA1 Message Date
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
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
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
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
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
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
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
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
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
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
ceeb70375d feat(veri): bileşenler yılsız Program'a ve veri-yillari sözlüğüne geçti (P-B b)
- SiraSerisi = { siraGecmisi, ilkYil? }; yardımcılar dizinin kendi son iki
  elemanıyla çalışır, yıl ilkYil + indeks. raporSiraSerisi diziyi doldurmaz:
  5 elemanlı eski raporlar 2024→2025 trendini göstermeye devam eder.
- Tablo başlıkları "Son ${VERI_YIL_SAYISI} yıl"; rapor listesi başlığı kaydın
  kendi pencere uzunluğunu söyler (eski rapor: 5).
- siraYiliEtiketi SON_YIL/ONCEKI_YIL'dan; bölüm/üniversite sayfa metinleri ve
  metadata SON_YIL, TERCIH_YILI, BASLIK_YILI sözlüğünden.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 17:00:39 +03:00
bilalgursen
ce6871d623 refactor: güncellenmiş profil çerezi ile sonuç sayfası yönlendirmeleri
Some checks failed
Deploy / deploy (push) Has been cancelled
Profil çerezinin SSR'da kullanılmasını sağlayarak, sonuç sayfasındaki yönlendirmeleri güncelledik. Artık profil bilgileri URL parametreleri yerine çerezden alınarak işleniyor. Ayrıca, profil çerezi olmayan kullanıcılar için yönlendirme mantığı iyileştirildi. Çeşitli bileşenlerdeki URL oluşturma fonksiyonları güncellenerek, profil bilgileri çerezden okunacak şekilde düzenlendi. Bu değişiklikler, kullanıcı deneyimini artırmayı ve daha tutarlı bir veri akışı sağlamayı hedefliyor.
2026-08-09 03:31:42 +03:00
bilalgursen
14f9b622b0 feat: tadımlık havuzuna üniversite tipi boyutu
Tadımlık satırı batch üretildiği için sihirbazdaki devlet/vakıf seçimini
bilmiyor, vakıf seçen kullanıcıya devlet örneği gösteriyordu. Havuz
anahtarı kova×tür×kategori×tip'e genişledi (migration 0001; mevcut
satırlar tip='genel'). Üretim scripti tip varyantlarını uniturGrubu
filtresiyle seçer; tadimlikSec tip verildiğinde kategori→genel fallback'i
korur ama tip fallback'i YAPMAZ — uygun satır yoksa bileşen gizlenir,
yanlış tipte örnek asla gösterilmez. Client profildeki tipi de gönderir ve
SSR "genel" satırı tipe uymuyorsa fetch bitene kadar gizler.

Not: prod app.db volume'de — `pnpm tadimlik` prod DB'ye karşı ayrıca
koşulmalı.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 00:12:25 +03:00
bilalgursen
fbd184e2be refactor: rapor feature'ı — listem, yazdır, sohbet ve actions taşındı (Faz 8)
- app/sonuc/actions.ts → features/rapor/rapor-actions.ts birebir taşındı
  (kredi harcama/iade idempotency yolları bayt bayt aynı, yalnızca import
  yolları değişti); liste-uretici/revizyon-kutusu action'ı doğrudan import
  ediyor
- lib/rapor-kaydi.ts rapor-queries.ts'e emildi: kullanicininRaporu aynı tek
  okuma kapısı; listem sayfasındaki inline drizzle sorgusu sohbetGecmisiGetir
  oldu; tadimlikSec re-export'u eklendi
- listem-govde, sohbet-client, revizyon-kutusu, liste-uretici, listem-bos-cta,
  rapor-listesi, tadimlik-satiri, yazdir-butonu features/rapor/components/'a
- Yeni async ListemIcerik (verifySession + maskeleme + bosDurum dalı içeride;
  çift await searchParams kalktı) ve RaporYazdir (3 redirect + yazdırılabilir
  belge); skeleton'lar eski loading.tsx geometrileriyle aynı dosyada
- /listem ve /rapor/yazdir senkron: searchParams.then() + sayfada Suspense;
  maxDuration=300 ve metadata sayfada kaldı; iki loading.tsx silindi
- Davranış değişikliği yok; /api/soru el değmedi

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 01:39:33 +03:00