14 yeni rehber yazısı (hepsi editör denetiminden geçti, 46 yazıda 829 iç link tarandı, 0 kırık hedef; 180+ DB rakamı yazıların kendi filtreleriyle yeniden koşuldu): taban-siralamalari-alti-yilda-nasil-degisti · kac-net-ile-hangi-bolum · siralama-bandlari-hangi-kapilar-acilir · ayni-bolum-farkli-universite-siralama-farki · hangi-bolumlerin-kontenjani-azaldi · yeni-acilan-bolumler-nasil-degerlendirilir · bilgisayar-mi-yazilim-muhendisligi-mi · kktc-universiteleri-okunur-mu · yapay-zekaya-tercih-sordum-guvenilir-mi · ek-madde-1-puanim-yetiyor-mu · universitede-ilk-hafta-ders-kaydi-muafiyet-kayit-dondurma · yks-2027-takvimi · rehber-ogretmenler-icin-veri-kaynaklari · bolumumu-sevmedim-hangi-kapilar-var İki canlı yazı düzeltildi: - veliler-icin-tercih-rehberi: veli diliyle kapanış; altındaki "sıralamanı gir" kutusu artık veliye ölü uç değil - bos-kontenjanlar-ne-anlatiyor: "birkaç yüz kişilik fark" aslında ~9 bin (ÖSYM 265.356 ↔ bizim 256.532); payda açıklaması tersti — ek kontenjan paydaya girseydi oran düşerdi. guncelleme alanı eklendi (sitemap lastmod). Kurallar (AGENTS.md): - Yayın sonrası arama motoru bildirimi: URL denetimi yalnız canlıda 200 dönen adrese; kota sayacı; mülk/hesap notu; sitemap grep kuralı - Yıkıcı git komutları yasak: reset/checkout --/restore/clean/stash - Tarayıcı açma: tasarımcı ve UX gerekli gördüğünde açabilir (yetenek için .claude/agents/tasarimci.md'ye tarayıcı araçları eklendi) docs/gece-vardiyasi/2026-09-22/ — 34 rapor: CEO kararları ve kapanış turu, marka/ödeme analizi, sıfır ödeme teşhisi, SEO konu planı, veri kalitesi, editör denetimi, CTO şartnamesi, yazılımcı ve güvenlik raporları, SABAH-OZETI. docs/ekip/YAYIN-KUYRUGU.md — Search Console bildirim kuyruğu. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
238 lines
23 KiB
Markdown
238 lines
23 KiB
Markdown
# 36 — Tasarımcı: navbar taşması + G1 merge öncesi denetimi
|
||
|
||
Tarih: 22 Eylül 2026 · Rol: `tasarimci` · Taban: `main` `9bd448b`
|
||
İşaret: **[D]** doğrulandı (canlı HTML / font metriği / hesap) · **[Ç]** koddan çıkarım · **[BİLAL]** karar Bilal'in
|
||
|
||
---
|
||
|
||
## Özet (5 madde)
|
||
|
||
1. **Navbar taşmasının kök nedeni tek satır değil, bir yapısal varsayım:** orta alan `absolute` olduğu için flex onu göremiyor, sağ küme `shrink-0` olduğu için çekilmiyor — çakışma sessiz. Tetikleyici ise `xl:inline`: **`max-w-6xl` konteyneri 1152 px'te kilitlendiği için `xl` (1280 px) hiç yeni yer açmıyor, ama o noktada ~229 px etiket geri geliyor.** [D, hesap aşağıda]
|
||
2. **P4 (`cb22faf`) dört ayrı genişlikte kırılma üretti:** ≥1280 px'te orta alanla çakışma (−28 … −220 px), 1024–1151 px'te dar bir bantta çakışma (−48 px), ve **640–1023 px'te header'ın 2 satırdan 3 satıra çıkması** (tasarımın kendi yorumu "lg altında 2 satır" diyor, `site-header.tsx:11`). 375 px'te de sınırda taşıyor.
|
||
3. **Önerilen düzeltme 2 satır:** `user-nav.tsx:59` ve `listem-butonu.tsx:39`'daki etiket span'lerinden **hem `xl:inline` hem `sm:inline`** kalkar. Bu etiketler yalnızca sığmadıkları iki bantta görünüyor. Kalan tek açık 1024–1151 bandı için ikinci, tek satırlık bir seçenek aşağıda.
|
||
4. **G1 merge edilebilir — ama bir düzeltmeyle.** Boş harita `null` olunca **hidrasyon CLS'i doğdu**: kayıtlı manuel listesi olan kullanıcıda sunucu 0 px, hidrasyondan sonra ~368 px harita sayfanın **tepesine** giriyor ve tadımlık + tablo aşağı kayıyor. Eski placeholder tam da bunu engelliyordu. G1 raporunda bu yok.
|
||
5. **Metinde bir artık kaldı:** buton "24 satırın tamamı" iddiasından arındırıldı ama **iki eleman yukarıdaki paragraf aynı vaadi sürdürüyor** — `tadimlik-satiri.tsx:135` "24 tercihlik listenin **her satırı** bu formatta kurulur". Maske girişsiz kullanıcıya 3 satır açıyor (`rapor-maske.ts:12`).
|
||
|
||
---
|
||
|
||
# İŞ 1 · Navbar taşması
|
||
|
||
## Yöntem — neden koddan yetinmedim, ne yaptım
|
||
|
||
Kural değişikliği geldi (tarayıcı serbest), ama bu oturumun araç setinde tarayıcı/önizleme aracı yok (`Bash`, `Read`, `Write`, `Edit`, `Skill`). `preview_stop` da çağıramıyorum, dolayısıyla açık sunucu bırakmadım. Onun yerine iki gerçek ölçüm yaptım:
|
||
|
||
1. **Canlı sunucu HTML'i çekildi** (`curl https://kolaytercih.com`, 392 KB) — navbar markup'ı `main` ile birebir aynı [D]. **Ama girişsiz ziyaretçide "Yapay Zeka Listem" pill'i HTML'de hiç yok** (`grep -c` → 0); yalnızca "Giriş yap" var. Pill sadece girişli kullanıcıda render ediliyor (`user-nav.tsx:40-76`), giriş yapmam ise yasak. **Yani taşmayı canlıda gözle göremem — Bilal kendi oturumunda görüyor.**
|
||
*Düzeltme notu: orkestratörün "canlıda `Yapay Zeka listemi kur` etiketi duruyor" bilgisi yanlış; o dize navbar'ın değil hero formunun submit butonunun metni (`hero-form.tsx:194`). Navbar etiketi `Yapay Zeka Listem`.*
|
||
2. **Gerçek font metriğiyle ölçüm.** Tahmin yerine `src/fonts/og/ClarityCity-SemiBold.ttf` ve Bricolage `.woff` dosyalarının `hmtx`/`cmap` tablolarını ayrıştırıp her dizenin ilerleme genişliğini hesapladım [D]. Aşağıdaki piksellerin hepsi bu ölçümden gelir, yuvarlama dışında tahmin yok.
|
||
|
||
| Dize | Boyut | Genişlik |
|
||
|---|---|---|
|
||
| `Yapay Zeka Listem` | 14 px / 600 | **129,7 px** |
|
||
| `Kendi Listem` | 14 px / 600 | 89,4 px |
|
||
| `Sıralamanı gir` | 16 px | 107,8 px |
|
||
| `Nasıl çalışır?` | 16 px | 96,9 px |
|
||
| `KolayTercih` (Bricolage) | 30 px | 168,6 px (tracking-tighter ile 152,1) |
|
||
|
||
## Kök neden — üç katman
|
||
|
||
**(a) Orta alan akışın dışında.** `katalog-arama.tsx:270` → `absolute left-1/2 -translate-x-1/2 … lg:flex`. Konteyner `site-header.tsx:12`'de `relative`. Absolute eleman flex satırında yer kaplamaz, dolayısıyla sağ küme büyüdükçe **flex hiçbir şey fark etmez**; taşma yerine sessiz çakışma olur. Üstelik boyama sırası gereği (CSS 2.1 Ek E, adım 8 > adım 7) konumlanmış `<nav>` statik pill'lerin **üstüne** boyanır — yani koyu "Ara" butonu "Yapay Zeka Listem" pill'inin sol ucunu kapatır. (`Kendi Listem` butonu `relative` olduğu için tersine, o nav'ın üstüne çıkar — `listem-butonu.tsx:35`.) Bilal'in gördüğü "üstüne çıkıyor" tam olarak bu.
|
||
|
||
**(b) Asıl tetikleyici: `xl` yeni yer açmıyor.** Konteyner `max-w-6xl` = **1152 px**. Yani viewport 1152'yi geçtikten sonra içerik genişliği **artık büyümüyor**. Ama `user-nav.tsx:59` ve `listem-butonu.tsx:39`, `lg:hidden xl:inline` deseniyle **1280 px'te iki etiketi birden geri getiriyor (+229 px)**. 1280 px'te kazanılan yer: **0 px.** Bu desen daha baştan tutarsız.
|
||
|
||
**(c) P4'ün eklediği yük.** `cb22faf` sağ kümeye lg–xl bandında +66 px, xl+ bandında +204 px ekledi. Sınır zaten dardı; bu onu geçirdi.
|
||
|
||
## Genişlik genişlik — ne oluyor
|
||
|
||
Geometri: konteyner genişliği `Wd = min(viewport, 1152)`; orta `<nav>`'ın merkezi `Wd/2`; sağ kümenin sağ kenarı `Wd − 16`. **BOŞLUK = küme sol kenarı − nav sağ kenarı**; negatif = çakışma. [D, hesap]
|
||
|
||
Ölçülen parça genişlikleri: orta nav **profilsiz 480 px** / **profilli 357 px**; sağ küme **lg–xl 304 px** (liste dolu) / **xl+ 540 px** (liste dolu).
|
||
|
||
### 375 px (mobil) — orta nav gizli, ama satır taşıyor
|
||
| Durum | Logo | Sağ küme | Toplam | Sığan | Sonuç |
|
||
|---|---|---|---|---|---|
|
||
| Liste dolu, 3 haneli kredi | 123 | 225,3 | **356,5** | 351 | **Satır-2'ye taşar → 3 satırlık header** |
|
||
| Liste boş | 123 | 153,3 | 284,5 | 351 | Tek satır OK |
|
||
|
||
Sınırda (5,5 px). 3 satıra çıkınca yapışkan header ≈ **140 px** — 667 px'lik iPhone SE ekranının **%21'i kalıcı olarak gidiyor**. P4 öncesi bu durum yoktu (küme 179 px idi).
|
||
|
||
### 768 px (tablet) — en kötü bant
|
||
| Durum | Logo | Sağ küme | Toplam | Sığan | Sonuç |
|
||
|---|---|---|---|---|---|
|
||
| Liste dolu | 196 | **582,8** | 790,9 | 736 | **Satır-2'ye taşar → 3 satırlık header (~176 px)** |
|
||
| Liste boş | 196 | 391,4 | 599,5 | 736 | Tek satır OK |
|
||
|
||
Sebep: `sm:inline` etiketleri 640 px'te açıyor ve `lg:hidden` 1024'e kadar kapatmıyor — yani **640–1023 px arası etiketler açık, ama yer yok**. 640 px'te liste boşken bile pay sadece 8,5 px. P4 öncesi küme 379 px idi, rahat sığıyordu.
|
||
|
||
### 1024 px
|
||
| Profil | Liste | nav sağ | küme sol | BOŞLUK |
|
||
|---|---|---|---|---|
|
||
| yok | dolu | 752 | 703 | **−48 px ÇAKIŞMA** |
|
||
| yok | boş | 752 | 798 | +46 |
|
||
| var | dolu | 690 | 703 | +13 (çok dar) |
|
||
| var | boş | 690 | 798 | +107 |
|
||
|
||
### 1280 px (ve tüm üstü — 1440, 1920 aynı, konteyner 1152'de sabit)
|
||
| Profil | Liste | nav sağ | küme sol | BOŞLUK |
|
||
|---|---|---|---|---|
|
||
| yok | boş | 816 | 788 | **−28 px ÇAKIŞMA** ← *Bilal'in gördüğü en olası hâl* |
|
||
| yok | dolu | 816 | 596 | **−220 px ÇAKIŞMA** |
|
||
| var | dolu | 754 | 596 | **−158 px ÇAKIŞMA** |
|
||
| var | boş | 754 | 788 | +33 |
|
||
|
||
**Kırılmanın başladığı nokta: tam olarak 1280 px** (`xl` sınırı). 1152–1279 arası sorunsuz, 1280'de bir anda −28 … −220 px. Konteyner büyümediği için **daha geniş ekran hiçbir şeyi düzeltmiyor** — 1920 px'te de aynı çakışma sürüyor.
|
||
|
||
## Düzeltme
|
||
|
||
### Önerilen — Alternatif 1 (en küçük, tek amaçlı, `[KARAR]`)
|
||
|
||
**Etiket span'leri her genişlikte gizli kalır; ikon + `aria-label` anlamı taşır.**
|
||
|
||
- `src/features/kullanici/components/user-nav.tsx:59`
|
||
`className="hidden sm:inline lg:hidden xl:inline"` → **`className="hidden"`** (ya da span tümden silinir; `aria-label="Yapay Zeka Listem"` ve `title` satır 52-53'te zaten var)
|
||
- `src/features/liste/components/listem-butonu.tsx:39`
|
||
aynı değişiklik (`aria-label` satır 33'te var)
|
||
|
||
Sonuç [D, hesap]: 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 ✔.
|
||
Kalan tek açık: **1024–1151 px, profilsiz + liste dolu → −48 … −1 px**.
|
||
|
||
**Bedeli dürüstçe:** P4'ün amacı keşfedilebilirlikti ("girişli 14 oturumun 7'si `/listem`'i hiç görmedi"). İkona indirince o kazanç zayıflar. Ama ölçüm şunu söylüyor: **1152 px'lik konteynerde, 480 px'lik ortalanmış bir nav'ın yanında sağ kümeye kalan bütçe ~304 px** — bu tam olarak dört ikon-pill eder, bir etiket bile fazladır. Etiketi korumanın yolu navbar'dan **bir şey çıkarmaktır**, daraltmak değil.
|
||
|
||
### Alternatif 2 (1 satır daha, 1024–1151 bandını da kapatır) — `[BİLAL]`
|
||
|
||
Alternatif 1 + `katalog-arama.tsx:310-314` → `Nasıl çalışır?` linkine `hidden xl:block`.
|
||
Orta nav profilsiz 480 → 339 px'e iner; 1024 px'te boşluk −48 → **+22 px** olur, her bant temizlenir [D, hesap].
|
||
`[BİLAL]` çünkü bu bir navigasyon/IA kararı: "Nasıl çalışır?" dar masaüstünde kaybolur. (Not: bu link yalnızca profilsiz durumda render ediliyor — yani tam da çakışan durumda.)
|
||
|
||
**Karşılaştırma:** Alt-1 tek başına Bilal'in gördüğü her şeyi çözer ve karar gerektirmez. Alt-2 kalan %10'u da kapatır ama bir menü öğesini dar masaüstünden düşürür. **Alt-1'i şimdi uygula, Alt-2'yi Bilal'e sor.**
|
||
|
||
### Yapılmaması gerekenler (değerlendirildi, elendi)
|
||
- `max-w-6xl` → `max-w-7xl`: 1280 px'te bile çakışma −156 px kalıyor. Çözmüyor.
|
||
- Orta nav'ı absolute'tan çıkarıp flex öğesi yapmak: doğru yapı ama nav'ın optik ortalanmasını bozar ve nav'ın butonları kısalmaya uygun değil — **navbar yeniden tasarımı, şimdi değil.**
|
||
- Etiket metnini kısaltmak: `[BİLAL]` gerektirir ve yetmez — `Yapay Zeka Listem` 129,7 px, 0'a inse bile xl bandındaki `Kendi Listem` (89,4 px) tek başına taşırmaya devam eder.
|
||
|
||
## Navbar'da ayrıca bulunan (P4 ile ilgisiz, küçük)
|
||
|
||
| Yer | Kural/sorun | Etki | Düzeltme | Büyüklük |
|
||
|---|---|---|---|---|
|
||
| `user-nav.tsx:63-74` | Kredi link'inin erişilebilir adı **"12"** (salt sayı). İçerikten gelen ad `title`'ı ezer; `Coins` `aria-hidden`, "kredi" span'i `lg:hidden` | Ekran okuyucu "12, bağlantı" diyor — nereye gittiği belirsiz | `aria-label="12 kredin var — kredi yükle"` ekle | XS |
|
||
| Tüm pill'ler, <640 px | Dokunma hedefi `h-9` = **36 px** (< 44 px) | Dar ekranda ıskalama | `sm` altında `h-11` ya da dokunma alanı genişletme | S |
|
||
|
||
---
|
||
|
||
# İŞ 2 · G1 (`funnel/sonuc-ilk-ekran`) merge öncesi tasarım denetimi
|
||
|
||
Diff okundu (`git diff 9bd448b..funnel/sonuc-ilk-ekran`, 6 dosya / 61+ 39−). Dal değiştirilmedi, çalışma ağacına dokunulmadı.
|
||
|
||
## HÜKÜM
|
||
|
||
> ### Şu bir düzeltmeyle merge edilebilir.
|
||
> **Engelleyici:** B1 (hidrasyon CLS'i). Tek dosya, tek satırlık yer değişikliği.
|
||
> **Aynı commit'e alınması güçlü önerilen:** B2 (paragraftaki artık vaat) — G1'in kendi amacı bu.
|
||
> Geri kalan her şey (hiyerarşi, mobil, AGENTS.md kuralları, CTA dili) **temiz.**
|
||
|
||
## Neyi doğruladım — temiz çıkanlar
|
||
|
||
- **CTA ok deseni ✔** `tadimlik-satiri.tsx:204` → metin önce, sonunda `<ArrowRight className="size-4" aria-hidden />`. `Sparkles` yok (dosyada hiç import edilmemiş).
|
||
- **`SectionEyebrow` ✔** `tadimlik-satiri.tsx:129` kanonik bileşeni kullanıyor, elle pill yok.
|
||
- **Kapatma çarpısı:** G1 hiçbir modal'a dokunmuyor — konu dışı ✔.
|
||
- **Risk dili ✔** `RaporSatirDetayi` (`rapor-listesi.tsx:60`) renk noktasının yanında `DILIM_ETIKET`/`RISK_ETIKET` metnini basıyor; renk tek başına anlam taşımıyor. G1 dokunmadı.
|
||
- **`first:mt-0` mantığı doğru [Ç]** JSX yorumları DOM düğümü üretmez; `ManuelHarita` `null` dönünce `<section>` gerçekten `main`'in ilk element çocuğu olur, `:first-child` eşleşir. Harita göründüğünde `mt-16` geri gelir. Doğru kurulmuş.
|
||
- **Mobil 375 px'te tadımlık kartı taşmıyor ✔** dış sarmalayıcı `flex-wrap` + `min-w-0`; program adı `truncate`; sıralama geçmişi `hidden md:inline-flex` ile mobilde düşüyor; CTA `w-full sm:w-auto` ve `h-11` = **44 px dokunma hedefi ✔**. Uzun üniversite adı yatay kaydırma üretmiyor.
|
||
|
||
## İlk ekran hiyerarşisi — yeni sıra mantıklı, bir uyarıyla
|
||
|
||
Yeni sıra: `ManuelHarita` (boşsa yok) → `TadimlikBolumu` → `SonucProgramTablosu` → `SonucSihirbazi` → dipnot.
|
||
|
||
- **Girişsiz + liste boş (ana hedef kitle):** kullanıcı ilk olarak tadımlığı görüyor. Doğru karar — ödeme öncesi gösterilebilen tek gerçek önizleme bu ve eskiden ~2.200 px aşağıdaydı.
|
||
- **Girişli kullanıcı:** `TadimlikBolumu` `null` döner (`tadimlik-bolumu.tsx:19`). Liste de boşsa `<main>`'in ilk çocuğu doğrudan tablo olur — **başlıksız, girişsiz, bağlamsız bir tablo**. Bu G1'in getirdiği bir bozulma değil (önce de öyleydi) ama boş harita gidince **daha çıplak** kaldı. A3 (`/sonuc` `<h1>`) bunu kapatacak; G1'i bloke etmez.
|
||
- Mobilde tadımlığın giriş bloğu (rozet + 2 satırlık h2 + 3 satırlık paragraf) **~195 px** yer tutuyor; 667 px'lik ekranda kartın yalnızca üst ~300 px'i görünüyor, CTA katlanın çok altında. Kabul edilebilir ama iyileştirilebilir — aşağıda Ö1.
|
||
|
||
## Erişilebilirlik — `<h1>` durumu
|
||
|
||
**Canlı `/sonuc` sunucu HTML'i çekildi [D]:** `<h1>` sayısı **0**, `<h2>` sayısı **5**. İlk üç h2 arama modalının içindeki `text-xs uppercase` etiketleri ("Popüler Bölümler", "Keşfet", "Rehberden").
|
||
|
||
- **G1 bunu değiştirmedi** (kapsam dışı bırakılmış, CTO şartnamesi açıkça yazıyor) ve **sorunu büyütmedi**: tadımlık h2'si zaten sayfadaki tek gerçek içerik başlığıydı, sadece yukarı taşındı. Belge sırasındaki başlık sayısı ve seviyeleri aynı kaldı.
|
||
- Küçük bir **iyileşme** bile var: başlık sırası artık görsel sırayla uyumlu (tadımlık h2 → sihirbaz h2), eskiden tersti.
|
||
- **A3 (`a11y/sonuc-h1`, `24-ceo-kapanis.md` §A) zaten kuyrukta.** G1'i bunun için bekletmeye gerek yok, ama **A3 merge edilirken `<h1>`'in tadımlığın h2'sinin ÜSTÜNE** konması gerekir — yoksa sayfa h2 ile açılır.
|
||
|
||
## BULGULAR
|
||
|
||
### B1 — ENGELLEYİCİ · Hidrasyon CLS'i: harita sayfanın tepesine sonradan giriyor
|
||
|
||
**Yer:** `manuel-harita.tsx:71` (`if (liste.length === 0) return null;`) + `sonuc/page.tsx:103` (sıradaki ilk eleman)
|
||
|
||
**Kural/sorun:** `useManuelListe` sunucu snapshot'ı olarak **her zaman boş liste** döner (`liste-store.ts:86` → `() => BOS_LISTE`); localStorage ilk client abonesinde okunuyor (`liste-store.ts:49-52, 72`). Yani **kayıtlı listesi olan her dönüş ziyaretçisinde**: sunucu 0 px yer ayırır → hidrasyondan sonra harita belirir → **tadımlık ve tablo aşağı itilir**.
|
||
|
||
**Kayma miktarı [D, hesap]:** `main` = `max-w-4xl px-4` → içerik 864 px; `aspect-[1050/447]` → **367,8 px** (375 px'te 146 px). Bu, `<main>`'in **ilk** çocuğunda olduğu için altındaki her şey kayıyor — impact fraction ~1. CLS eşiğini (0,1) rahatlıkla aşar.
|
||
|
||
**Eski kod tam da bunu engelliyordu:** silinen placeholder `aspect-[1050/447]` ile yeri **sunucuda** rezerve ediyordu; hidrasyonda gerçek harita aynı orana oturuyordu → kayma ~0. `TercihHaritasiLazy`'nin kendi `HaritaIskeleti`'si (`tercih-haritasi-lazy.tsx:10-17`) yalnızca **chunk** gecikmesini karşılar, `null` → görünür geçişini karşılamaz.
|
||
|
||
**Kullanıcıya etkisi:** Dönen kullanıcı sayfayı açıyor, tadımlığı okumaya başlıyor, saniyeler içinde metin 368 px aşağı kayıyor; tıklamak istediği yerde başka bir şey oluyor.
|
||
|
||
**Not:** CEO §3 G1-b'de onaylanan takas "**ilk `+` tıklamasında** haritanın belirmesi" — yani **kullanıcının kendi eylemi**. Sayfa yüklenirken kendiliğinden gelen kayma o onayın kapsamında değil ve G1 raporunda hiç geçmiyor.
|
||
|
||
**Önerilen düzeltme (en küçüğü):** `sonuc/page.tsx`'te **`<ManuelHarita />`'yı `<SonucProgramTablosu>`'nun ALTINA al** (satır 103'ten satır 128'in hemen öncesine). Gerekçe iki yönlü: (a) hidrasyonda gelen harita artık yalnızca sihirbaz + dipnotu iter, ikisi de katlanın altında → CLS ihmal edilebilir; (b) harita zaten tablodan kurulan listenin görselleştirmesi, tablodan **sonra** gelmesi bilgi mimarisi olarak da doğru. `first:mt-0` o zaman her durumda geçerli olur ve daha da sağlamlaşır.
|
||
**Büyüklük: XS** (tek JSX bloğunun yeri). Alternatif (yer rezervi için çerez mirror'ı) over-engineering — önerilmiyor.
|
||
|
||
### B2 — YÜKSEK · Butondan kaldırılan vaat paragrafta duruyor
|
||
|
||
**Yer:** `tadimlik-satiri.tsx:134-136`
|
||
> "Sıralamana uygun bir programın gerekçesi, yerleşme riski ve taban trendi — 24 tercihlik listenin **her satırı bu formatta kurulur**."
|
||
|
||
**Kural/sorun:** `2373a9a` butondan "24 satırın tamamı" iddiasını kaldırdı, ama iki eleman yukarıdaki paragraf aynı vaadi başka kelimelerle sürdürüyor. Maske girişsiz/paketsiz kullanıcıya **3 satır** açıyor (`rapor-maske.ts:12` `ACIK_SATIR = 3`); kalan 21 satırın gerekçe/risk/trend metni `SAHTE_*` sabitleriyle değiştiriliyor. Öğrenci bu cümleyi "24 satırın hepsini bu ayrıntıda göreceğim" diye okur.
|
||
|
||
**Kullanıcıya etkisi:** G1'in tam olarak kapatmak istediği beklenti açığı, kaldırdığı yerin 40 px yukarısında açık kalıyor. Girişten sonra 21 maskeli satır görmek, buton metninin düzeltilmesinden daha güçlü bir hayal kırıklığı.
|
||
|
||
**Önerilen düzeltme:** son cümleciği teslim edilene çek — ör. "— listendeki her satır bu formatta kurulur, ilk üçünü hemen açıyoruz." Sayı `"use client"` dosyaya import edilemiyor (`rapor-maske.ts` `server-only`, CTO Özet #4), bu yüzden **sayısız da yazılabilir**: "— listendeki satırlar bu formatta kurulur." **Sayı yazılacaksa `[BİLAL]`**, çünkü `3` elle yazılırsa tek kaynak kuralı bozulur.
|
||
**Büyüklük: XS** (tek cümle). `[BİLAL]` — marka/vaat metni.
|
||
|
||
### B3 — ORTA · Suspense fallback'i gerçek düzenle aynı genişlikte değil
|
||
|
||
**Yer:** `sonuc/page.tsx:47` (`max-w-6xl px-4 py-10`) ↔ `:99` (`max-w-4xl px-4 py-12`)
|
||
|
||
**Kural/sorun:** Fallback konteyneri **1152 px**, gerçek içerik **896 px**. `cookies()` sayfayı dinamik yaptığı için bu fallback gerçekten görülüyor. Çözüldüğü anda içerik 256 px daralıyor ve yeniden ortalanıyor → yatay + dikey kayma, her `/sonuc` yüklemesinde.
|
||
|
||
**G1 ile ilişkisi:** G1 fallback'e dokunmadı ve CTO "yanlışlığı artmıyor" dedi — doğru. Hatta **yapısal olarak iyileşti**: fallback'in `pill + başlık + alt satır` iskeleti artık gerçekten sayfanın tepesindeki `SectionEyebrow + h2 + p` ile eşleşiyor (eskiden tepede harita vardı, eşleşmiyordu). Ama genişlik ve hizalama (fallback sola, gerçek içerik `items-center text-center`) hâlâ uyumsuz.
|
||
|
||
**Önerilen düzeltme:** `max-w-6xl` → `max-w-4xl`, `py-10` → `py-12`, iskeletler `mx-auto` ile ortalanır. **Büyüklük: XS.** G1'i bloke etmez — ayrı bir commit ya da A3 dalıyla birlikte gidebilir.
|
||
|
||
### B4 — DÜŞÜK · "Giriş sonrası liste hemen üretilir" kredisiz kullanıcıda tutmuyor
|
||
|
||
**Yer:** `tadimlik-satiri.tsx:188-189`
|
||
|
||
Tadımlık yalnızca girişsiz kullanıcıya render ediliyor, ama girişsiz ≠ yeni kullanıcı: **çıkış yapmış, kredisi tükenmiş** bir kayıtlı kullanıcı da bu CTA'yı görür. `/listem?uret=1` o durumda üretemez. Cümle "hemen üretilir" diye koşulsuz vaat ediyor.
|
||
|
||
**Etki:** dar bir kitle, ama vaat tutmadığında tam huninin ortasında.
|
||
**Öneri:** ya cümle yumuşatılır ("Giriş sonrası liste üretimi başlar") ya da `/listem`'in kredisiz hata durumunun ne dediği QA'da doğrulanır. **Büyüklük: XS.** Bu paket için **engelleyici değil**.
|
||
|
||
## G1'in doğru yaptıkları (kayda geçsin)
|
||
|
||
- `listemUretHref`'in tek kaynağa taşınması (`sihirbaz-sabitler.ts:181`) + `uret=1` sıra sözleşmesinin doküman olarak oraya yazılması: iyi iş, ilerideki sessiz kırılmaları önler.
|
||
- `IZINLI_KAYNAKLAR`'a `"tadimlik"` eklenmesi (`uretim-basladi-olayi.tsx:33`) — ölçüm sessizce `bilinmiyor`a düşmüyor.
|
||
- Seri kırılması notunun kodun yanına yazılması (`tadimlik-satiri.tsx:100-106`). Doğru refleks.
|
||
- CTA hedefinin `/sonuc` yerine `/listem?uret=1` olması: girişten sonra kullanıcıyı başladığı yere geri atmak yerine sonuca götürüyor. Huni açısından doğru.
|
||
|
||
---
|
||
|
||
# İŞ 3 · CEO'nun reddettiği iki UX kararına görüş
|
||
|
||
**R3 (mobil yapışkan alt çubuk) — katılıyorum, hem de gerekçesinden daha güçlü bir sebeple.** CEO "95 ziyaret/hafta, ekran alanı yiyen over-engineering" diyor; ben buna şunu eklerim: bu üründe yapışkan alt çubuk **şu anda aktif olarak zararlı olurdu**, çünkü `/sonuc` zaten `sticky top-4` bir header taşıyor ve İş 1'de ölçtüğüm gibi o header 375 px'te 3 satıra çıkıp ~140 px (ekranın %21'i) yiyebiliyor; buna bir de alt çubuk eklenirse mobil okuma alanı ~%30 azalır, üstelik sanal klavye açıldığında `position: fixed` alt çubukların iOS Safari'de içeriğin üstüne binmesi klasik bir tuzaktır. Çözülmesi gereken şey CTA'nın görünürlüğü değil, header'ın şişkinliği. **R4 (`/paket` girişsiz birincil CTA'sının fiyata çevrilmesi) — karara katılıyorum, gerekçesine kısmen.** "Veri yok, T4'e bağlandı" doğru bir disiplin ve fiyatı erken göstermenin dönüşümü düşürebileceği de doğru. Ama şunu kayda geçiriyorum: bu bir A/B sorusu değil, bir **dürüstlük** sorusu — kullanıcı ödeme fiiline kaç adım kala fiyatı öğrendiğini bilmiyorsa, öğrendiği anda geri dönüyor ve bunu "fiyat yüksek" diye değil "kandırıldım" diye yapıyor. T4 eşiği (`/odeme`'yi 30 kişi görsün) bir payda üretir ama **o paydanın kendisi fiyatın geç gösterilmesinden etkileniyor** — yani ölçüm, ölçmek istediği şeyin içinden geçiyor. Kararı değiştirmiyorum; T4 açıldığında bakılacak metriğin "`/paket` → `/odeme` geçişi" değil "**`/odeme`'yi gördükten sonra terk oranı**" olmasını öneriyorum, çünkü fiyat şokunu yalnızca o gösterir.
|
||
|
||
---
|
||
|
||
## Bilal'in gözle kontrol etmesi gereken ekranlar
|
||
|
||
Görsel doğrulama bende yapılamadı (araç setinde tarayıcı yok + pill yalnızca girişli render ediliyor, giriş yasak). Şu beş ekran:
|
||
|
||
1. **Navbar, kendi girişli oturununda, 1280 px ve üstü** — "Yapay Zeka Listem" pill'inin sol ucunun ortadaki koyu "Ara" butonunun altında kalıp kalmadığı. (Bulgumun ana kanıtı bu.)
|
||
2. **Navbar, 768 px** (tablet / tarayıcıyı yarım ekran) girişli + manuel listede en az 1 program — header'ın **3 satıra** çıkıp çıkmadığı.
|
||
3. **Navbar, 375 px** girişli + liste dolu + 3 haneli kredi bakiyesi — aynı 3 satır kontrolü (sınırda, 5 px).
|
||
4. **`/sonuc`, merge sonrası, kayıtlı manuel listesi olan bir oturumda** — sayfa açıldıktan ~1 sn sonra haritanın gelip tadımlığı aşağı itip itmediği (B1). *Bunu merge öncesi göremeyiz; G1 canlıda yok.*
|
||
5. **`/sonuc`, girişsiz, 375 px** — tadımlık kartının CTA'sına ulaşmak için kaç ekran kaydırmak gerektiği (Ö1 kararı buna bağlı).
|
||
|
||
## Bilal'den istenen (3 madde)
|
||
|
||
1. **Navbar düzeltmesi için onay:** Alternatif 1'i (iki etiket span'i her genişlikte gizli) yazılımcıya verelim mi, yoksa Alternatif 2'yi de (`Nasıl çalışır?` yalnız ≥1280) ekleyip 1024–1151 bandını da kapatalım mı? **~3 dk.**
|
||
2. **G1'in B1 düzeltmesi:** `<ManuelHarita />`'yı tablonun altına almak — dalın 7. commit'i olarak yazılsın mı, yoksa merge edilip ayrı mı gitsin? **~2 dk.**
|
||
3. **B2 metni `[BİLAL]`:** `tadimlik-satiri.tsx:135`'teki "24 tercihlik listenin her satırı bu formatta kurulur" cümlesi ne olsun — sayısız mı ("listendeki satırlar bu formatta kurulur"), yoksa açıkça "ilk üçü hemen açılır" mı? **~3 dk.**
|