Prototip notu — Varyant D2 “Cep Kokpiti”. D’nin tezi aynen duruyor: ana sayfa bir akış değil, bir hub. D2’nin eklediği tek şey ölçülmüş bir olgu — yerel sorguların %90,4’ü telefondan geliyor, yani kokpit masaüstünün küçültülmüşü değil telefonun kendisi için kurulmalı. İmza da oraya taşındı: gün çizgisi sayfayı terk etmiyor. Kokpit ekrandan çıkınca çizgi üst şeride büzülüyor, saat ve sıradaki işaretle birlikte seninle geliyor. D’de imza kokpitle birlikte kayboluyordu, yani sayfanın %90’ında yoktu.
Uygulama hissi — alınan desenler: basışta (bırakışta değil) geri bildirim; cam üst şerit ve alt çubuk, altından içerik akıyor; menü onu açan düğmeden doğuyor ve aynı yoldan kapanıyor; alt çubukta tek gösterge sekmeden sekmeye kayıyor ve kaydırdıkça hangi bölümde olduğunu söylüyor; sayfalar arası geçişte çubuk yanıp sönmüyor. Reddedilenler ve sebepleri: alttan açılan tabaka (geri tuşunu bozar) · çekerek yenileme · kaydırma jesti · iskelet ekran · service worker (bayat önbellek nöbetçi eczanede yanlış eczane gösterir) · bölümlü denetim (içeriği bir denetimin arkasına saklar, oysa bu sayfanın tezi “hepsi tek ekranda”) · titreşim (iOS Safari desteklemiyor, yalnız Android’de çalışan geri bildirim tutarsızdır).
JavaScript nerede gerçekten gerekli (tez korundu, sınırı ölçüldü): dört yerde. 1) iOS Safari, belgede dokunma dinleyicisi yoksa :active’i uygulamaz — tek satır boş dinleyici olmadan “basışta geri bildirim” tüm iPhone’larda sessizce ölü olurdu. 2) kokpit şeridi: “kokpit ekrandan çıktı mı” sorusunun CSS karşılığı yok. 3) sekme izleme. 4) saat. Tek IntersectionObserver kurulumu 2 ve 3’ü birlikte görüyor. Buna karşılık D’nin 13 panosundaki kaydırma açılımı kaldırıldı: bilgi taşımıyordu, gizleme-gözcü-emniyet ağı zincirinin bir halkası koparsa sayfanın yarısı boş kalıyordu ve telefonda kaydırma bütçesi yiyordu. Kalan tek orkestre edilmiş an kokpitte.
Reklam — envanter 3’ten 8’e çıktı, görüntülü reklam sayısı 3’te sabit kaldı. Artış sayıdan değil tür değişikliğinden geliyor: 5 yeni alan, içeriğin kendi biçiminde sponsorlu liste satırı. Yerleşim kuralı istisnasız: reklam yalnız iki kuşak arasına girer, bir kuşağın ya da panonun içine asla. Ölçüldü: yoğunluk %5,04 (375 px), %5,16 (390 px), %7,70 (1440 px) — kendi tavanımız %12, sektör tavanı %30. İlk ekranda 0 reklam; iki reklam arası en az 1.054 px (eşik 600). Yapışkan reklam yok: gerekçe artık politika değil, alt gezinme çubuğunun yanındaki reklam yanlış tıklama üretir ve o parayı ödeyen kişi patronun sahada yüz yüze görüştüğü esnaftır. Sponsorlu satır ticari listelere konur (ulaşım, yeme-içme, seri ilan, emlak, iş ilanı); kamu kurumları, muhtarlar, dernekler, acil numaralar, haber ve vefat ilanları güven listeleridir, oraya konmaz. Ölçüler artık bize ait: birim bir liste satırı (52 px), şerit 2 birim, blok 5 birim.
Kuşak sırası değişti: Bugün → Rehber + Yeme-içme → Gündem → Kamu → İlanlar → Keşfet. D’de sattığımız şey dördüncü sıradaydı ve üstünde duran İlanlar hem tamamen maket hem de bu ilçede üç portalı öldüren sıranın birincisi. Menü grupları da aynı sıraya çekildi — menü sayfayla çelişemez.
Gerçek veri: 2.938 kayıt, 17 iş kolu, 108 alt dal, 31 mahalle, işletme adları, telefonlar, kamu kurumları, dernekler, muhtar adları ve numaraları, keşfet başlıkları, nöbetçi eczane (13.08.2026 ölçümü). Kaynak: _veri/temiz_20260813.csv ve _icerik/mahalleler/.
Maket veri: hava durumu, namaz vakitleri, semt pazarı, minibüs ve İDO sefer saatleri, haber başlıkları, vefat ilanları, seri ilan, emlak, iş ilanları. Hepsi ekranda maket damgası taşıyor. Sefer saatleri ve vefat ilanları gerçek kaynağa bağlanmadan canlıya çıkmaz.
Yazı tipi: Plus Jakarta Sans, bulink.de ile aynı aile (patron kararı). İki alt küme gömülü — latin ve latin-ext; Türkçe ş ğ İ ile ₺ işareti yalnız latin-ext’te var, ikisi de yüklenmezse Türkçe düşer. Glifler denetlendi: ç ş ğ ü ö ı İ Ç Ş Ğ Ü Ö ₺ › · — × ₺ tam, boş kutu yok. Ok karakteri (U+2192) bu ailede yok; hiçbir yerde metin olarak kullanılmadı — oklar Phosphor ikonu.
Renk — P4 “Cadde”: tek kaynak _staging/tasarim_20260815/paletler.py (kod p4); dosyada palet dışı hiçbir hex yok, türetilenler aynı dosyanın uzerine() işleviyle hesaplandı. Renk kategoriyi değil aileyi taşır: yeme-içme kırmızı, esnaf lacivert, alışveriş mor, gezi-kültür-kamu deniz mavisi, sağlık yeşil, aile iddiası olmayan panolar nötr. Kehribar ayrılmış durum rengidir ve yalnız “menüsü fiyatıyla yayında” kademesinde geçer — sayfada bir kez, sayacı şu an sıfır.
Izgarada aile ritmi: akış düzeninde aileler dikey okunur; ızgarada dağılıp kaybolurdu. Bu yüzden ritim yatay kuruldu — her kuşak tek aile. Tek istisna envanter kuşağı: rehber ızgarası beş aileyi bir arada gösterir, sistemin künyesi orasıdır. Nöbetçi eczane ve acil numaralar sağlık ailesindedir; kırmızı bu sistemde yeme-içme demek, aciliyet için ikinci kez kullanılsaydı renk hem kimlik hem durum taşırdı.
Ölçülen renk dozu (yöntem: HSV doygunluk>0,18, 5×5 erozyon — palet ölçümüyle aynı işlev): ızgara bölgesi kromatik yüzey %8,89 (390 px) ve %7,49 (1440 px). 3 px raydan dolu aile bandına geçilmeden önce bu sayı %0,10’du: “en yüksek doz” iddiası ızgarada görünmüyordu.
İkon: Phosphor, yerel yazı tipi dosyasından SVG yoluna çıkarıldı, satır içi sprite olarak gömüldü. CDN yok, emoji yok.
Ölçüm — iki yol birden koşuldu ve farkları var. Enjekte ölçüm (tarayıcı içinde, hesaplanmış değerler): kontrast eşiği altında metin 0, en düşük oran 5,31; 44 px altı dokunma hedefi 0; yatay taşma 0; 300 ms üstü geçiş 0; saydamlıkla düşen metin 0. Statik dosya taraması aynı sayfada 49 “dar dolgu” bulgusu verdi — tarayıcıda hesaplanmış dolgu okunduğunda gerçek değer 7 px 8 px çıktı ve gerçekten sıfır dolgulu satır sayısı 0’dı: araç padding-block kısayolunu okuyamıyor. Buna karşılık tarayıcıda çizilmiş sayfayı tarayan yol iki gerçek kusur buldu: sponsorlu satırın etiketi 11 px tabanının altındaydı (10,5 px) ve aynı satırın metni tonlu zeminine sıfır boşlukla yapışıyordu — ikisini de kendi ölçümüm kaçırmıştı, çünkü onda punto tabanı ve dolgu kuralı hiç yoktu. Sonuç: statik dosya taramasına güvenilmez, çizilmiş sayfa taraması ile kendi ölçümün birbirini tamamlar.
Kapıların kendi sınavı. Yedi bilinen kusur sayfaya kasten enjekte edildi ve her birinin ilgili kapıyı kırmızı yakıp yakmadığına bakıldı; ilk turda bir kapı kör çıktı: content-visibility denetimi “contain-intrinsic-size yok mu” diye none arıyordu, oysa değer ayarlanmadığında tarayıcı auto none döndürüyor — karşılaştırma her zaman geçiyordu, yani kapı hiçbir eksiği yakalayamazdı ve gerçek ögelerde doğru cevabı yanlış sebeple veriyordu. Düzeltildikten sonra 7 mutantın 7’si yakalandı. Ayrıca dokunma aralığı kapısı ilk yazımda dikey dizili liste satırlarını kusur sayıyordu; muafiyet önce “görünüm genişliğinin %60’ı” diye yazıldı, 1440 px’te çöktü (ızgara panoları daraltıyor) ve orana değil geometriye bağlandı: aynı sol kenar + aynı genişlik + dikey dizilim.
Sayısal kapı yeşilken gözle bulunanlar. Dört kusur yalnız ekrana bakınca çıktı: (1) vakit hücresi “Yatsı 21.44” derken gün çizgisi “Sıradaki Öğle 13.19” diyordu — aynı olgunun iki rakamı; üçü de artık tek kaynaktan besleniyor. (2) kokpit şeridi logonun ve menü düğmesinin altına giriyordu (“L0.14” diye okunuyordu); konumlar kabuk ögelerinin gerçek sınırlarından türetildi. (3) gün çizgisi etiket satırında üç ayrı şey yığılıyordu, “04.00–24.00” aralığı atıldı — eksenin iki ucunda zaten İmsak ve Yatsı var. (4) 1440 px’te kabuk ögeleri 1.188 px’e sığmıyordu (~1.259 px gerekiyordu), gezinti bağlantısı iki satıra sarıyordu.